diff --git a/generated/googleapis/lib/abusiveexperiencereport/v1.dart b/generated/googleapis/lib/abusiveexperiencereport/v1.dart
index e2d2844..79564f8 100644
--- a/generated/googleapis/lib/abusiveexperiencereport/v1.dart
+++ b/generated/googleapis/lib/abusiveexperiencereport/v1.dart
@@ -97,7 +97,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SiteSummaryResponse.fromJson(data));
+    return _response.then(
+      (data) => SiteSummaryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -145,7 +148,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ViolatingSitesResponse.fromJson(data));
+    return _response.then(
+      (data) => ViolatingSitesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -252,8 +258,8 @@
   ViolatingSitesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('violatingSites')) {
       violatingSites = (_json['violatingSites'] as core.List)
-          .map<SiteSummaryResponse>(
-              (value) => SiteSummaryResponse.fromJson(value))
+          .map<SiteSummaryResponse>((value) => SiteSummaryResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart b/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart
index 56e39d4..a4be633 100644
--- a/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart
+++ b/generated/googleapis/lib/acceleratedmobilepageurl/v1.dart
@@ -95,7 +95,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchGetAmpUrlsResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetAmpUrlsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -255,12 +258,14 @@
   BatchGetAmpUrlsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('ampUrls')) {
       ampUrls = (_json['ampUrls'] as core.List)
-          .map<AmpUrl>((value) => AmpUrl.fromJson(value))
+          .map<AmpUrl>((value) =>
+              AmpUrl.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('urlErrors')) {
       urlErrors = (_json['urlErrors'] as core.List)
-          .map<AmpUrlError>((value) => AmpUrlError.fromJson(value))
+          .map<AmpUrlError>((value) => AmpUrlError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/accessapproval/v1.dart b/generated/googleapis/lib/accessapproval/v1.dart
index af74905..d95914d 100644
--- a/generated/googleapis/lib/accessapproval/v1.dart
+++ b/generated/googleapis/lib/accessapproval/v1.dart
@@ -109,7 +109,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the settings associated with a project, folder, or organization.
@@ -158,7 +160,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessApprovalSettings.fromJson(data));
+    return _response.then(
+      (data) => AccessApprovalSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the settings associated with a project, folder, or organization.
@@ -230,7 +235,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessApprovalSettings.fromJson(data));
+    return _response.then(
+      (data) => AccessApprovalSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -294,7 +302,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Dismisses a request. Returns the updated ApprovalRequest. NOTE: This does
@@ -353,7 +364,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an approval request. Returns NOT_FOUND if the request does not exist.
@@ -402,7 +416,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists approval requests associated with a project, folder, or
@@ -479,8 +496,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListApprovalRequestsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListApprovalRequestsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -543,7 +562,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the settings associated with a project, folder, or organization.
@@ -592,7 +613,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessApprovalSettings.fromJson(data));
+    return _response.then(
+      (data) => AccessApprovalSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the settings associated with a project, folder, or organization.
@@ -664,7 +688,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessApprovalSettings.fromJson(data));
+    return _response.then(
+      (data) => AccessApprovalSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -728,7 +755,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Dismisses a request. Returns the updated ApprovalRequest. NOTE: This does
@@ -787,7 +817,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an approval request. Returns NOT_FOUND if the request does not exist.
@@ -836,7 +869,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists approval requests associated with a project, folder, or
@@ -913,8 +949,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListApprovalRequestsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListApprovalRequestsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -977,7 +1015,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the settings associated with a project, folder, or organization.
@@ -1026,7 +1066,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessApprovalSettings.fromJson(data));
+    return _response.then(
+      (data) => AccessApprovalSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the settings associated with a project, folder, or organization.
@@ -1098,7 +1141,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessApprovalSettings.fromJson(data));
+    return _response.then(
+      (data) => AccessApprovalSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1162,7 +1208,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Dismisses a request. Returns the updated ApprovalRequest. NOTE: This does
@@ -1221,7 +1270,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an approval request. Returns NOT_FOUND if the request does not exist.
@@ -1270,7 +1322,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApprovalRequest.fromJson(data));
+    return _response.then(
+      (data) =>
+          ApprovalRequest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists approval requests associated with a project, folder, or
@@ -1347,8 +1402,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListApprovalRequestsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListApprovalRequestsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1392,7 +1449,8 @@
     }
     if (_json.containsKey('enrolledServices')) {
       enrolledServices = (_json['enrolledServices'] as core.List)
-          .map<EnrolledService>((value) => EnrolledService.fromJson(value))
+          .map<EnrolledService>((value) => EnrolledService.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -1553,10 +1611,12 @@
 
   ApprovalRequest.fromJson(core.Map _json) {
     if (_json.containsKey('approve')) {
-      approve = ApproveDecision.fromJson(_json['approve']);
+      approve = ApproveDecision.fromJson(
+          _json['approve'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dismiss')) {
-      dismiss = DismissDecision.fromJson(_json['dismiss']);
+      dismiss = DismissDecision.fromJson(
+          _json['dismiss'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1568,18 +1628,20 @@
       requestedExpiration = _json['requestedExpiration'] as core.String;
     }
     if (_json.containsKey('requestedLocations')) {
-      requestedLocations =
-          AccessLocations.fromJson(_json['requestedLocations']);
+      requestedLocations = AccessLocations.fromJson(
+          _json['requestedLocations'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestedReason')) {
-      requestedReason = AccessReason.fromJson(_json['requestedReason']);
+      requestedReason = AccessReason.fromJson(
+          _json['requestedReason'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestedResourceName')) {
       requestedResourceName = _json['requestedResourceName'] as core.String;
     }
     if (_json.containsKey('requestedResourceProperties')) {
-      requestedResourceProperties =
-          ResourceProperties.fromJson(_json['requestedResourceProperties']);
+      requestedResourceProperties = ResourceProperties.fromJson(
+          _json['requestedResourceProperties']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1799,7 +1861,8 @@
   ListApprovalRequestsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('approvalRequests')) {
       approvalRequests = (_json['approvalRequests'] as core.List)
-          .map<ApprovalRequest>((value) => ApprovalRequest.fromJson(value))
+          .map<ApprovalRequest>((value) => ApprovalRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
diff --git a/generated/googleapis/lib/accesscontextmanager/v1.dart b/generated/googleapis/lib/accesscontextmanager/v1.dart
index 9bfe2f9..f8245a9 100644
--- a/generated/googleapis/lib/accesscontextmanager/v1.dart
+++ b/generated/googleapis/lib/accesscontextmanager/v1.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete an AccessPolicy by resource name. The longrunning Operation will
@@ -163,7 +165,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get an AccessPolicy by name.
@@ -213,7 +217,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessPolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccessPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all AccessPolicies under a container.
@@ -276,7 +283,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAccessPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAccessPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an AccessPolicy. The longrunning Operation from this RPC will have
@@ -342,7 +352,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -410,7 +422,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete an Access Level by resource name. The longrunning operation from
@@ -462,7 +476,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get an Access Level by resource name.
@@ -529,7 +545,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessLevel.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccessLevel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all Access Levels for an access policy.
@@ -608,7 +627,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAccessLevelsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAccessLevelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an Access Level. The longrunning operation from this RPC will have
@@ -676,7 +698,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replace all existing Access Levels in an Access Policy with the Access
@@ -742,7 +766,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -818,7 +844,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a Service Perimeter. The longrunning operation from this RPC will
@@ -879,7 +907,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a Service Perimeter by resource name. The longrunning operation
@@ -931,7 +961,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a Service Perimeter by resource name.
@@ -981,7 +1013,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServicePerimeter.fromJson(data));
+    return _response.then(
+      (data) => ServicePerimeter.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all Service Perimeters for an access policy.
@@ -1047,8 +1082,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListServicePerimetersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicePerimetersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a Service Perimeter. The longrunning operation from this RPC will
@@ -1116,7 +1153,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replace all existing Service Perimeters in an Access Policy with the
@@ -1181,7 +1220,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1250,7 +1291,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -1302,7 +1345,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1353,7 +1398,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1428,7 +1475,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1505,7 +1555,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GcpUserAccessBinding. Completion of this long-running operation
@@ -1558,7 +1610,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the GcpUserAccessBinding with the given name.
@@ -1609,7 +1663,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GcpUserAccessBinding.fromJson(data));
+    return _response.then(
+      (data) => GcpUserAccessBinding.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GcpUserAccessBindings for a Google Cloud organization.
@@ -1676,8 +1733,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListGcpUserAccessBindingsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGcpUserAccessBindingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GcpUserAccessBinding. Completion of this long-running operation
@@ -1748,7 +1807,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1778,10 +1839,12 @@
 
   AccessLevel.fromJson(core.Map _json) {
     if (_json.containsKey('basic')) {
-      basic = BasicLevel.fromJson(_json['basic']);
+      basic = BasicLevel.fromJson(
+          _json['basic'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('custom')) {
-      custom = CustomLevel.fromJson(_json['custom']);
+      custom = CustomLevel.fromJson(
+          _json['custom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -1898,7 +1961,8 @@
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1968,7 +2032,8 @@
   CommitServicePerimetersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('servicePerimeters')) {
       servicePerimeters = (_json['servicePerimeters'] as core.List)
-          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(value))
+          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2028,7 +2093,8 @@
 
   Condition.fromJson(core.Map _json) {
     if (_json.containsKey('devicePolicy')) {
-      devicePolicy = DevicePolicy.fromJson(_json['devicePolicy']);
+      devicePolicy = DevicePolicy.fromJson(
+          _json['devicePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ipSubnetworks')) {
       ipSubnetworks = (_json['ipSubnetworks'] as core.List)
@@ -2090,7 +2156,8 @@
 
   CustomLevel.fromJson(core.Map _json) {
     if (_json.containsKey('expr')) {
-      expr = Expr.fromJson(_json['expr']);
+      expr =
+          Expr.fromJson(_json['expr'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2150,7 +2217,8 @@
     }
     if (_json.containsKey('osConstraints')) {
       osConstraints = (_json['osConstraints'] as core.List)
-          .map<OsConstraint>((value) => OsConstraint.fromJson(value))
+          .map<OsConstraint>((value) => OsConstraint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requireAdminApproval')) {
@@ -2345,7 +2413,8 @@
   ListAccessLevelsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accessLevels')) {
       accessLevels = (_json['accessLevels'] as core.List)
-          .map<AccessLevel>((value) => AccessLevel.fromJson(value))
+          .map<AccessLevel>((value) => AccessLevel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2380,7 +2449,8 @@
   ListAccessPoliciesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accessPolicies')) {
       accessPolicies = (_json['accessPolicies'] as core.List)
-          .map<AccessPolicy>((value) => AccessPolicy.fromJson(value))
+          .map<AccessPolicy>((value) => AccessPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2414,8 +2484,8 @@
   ListGcpUserAccessBindingsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('gcpUserAccessBindings')) {
       gcpUserAccessBindings = (_json['gcpUserAccessBindings'] as core.List)
-          .map<GcpUserAccessBinding>(
-              (value) => GcpUserAccessBinding.fromJson(value))
+          .map<GcpUserAccessBinding>((value) => GcpUserAccessBinding.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2452,7 +2522,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2486,7 +2557,8 @@
     }
     if (_json.containsKey('servicePerimeters')) {
       servicePerimeters = (_json['servicePerimeters'] as core.List)
-          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(value))
+          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2548,11 +2620,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2560,7 +2634,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2660,7 +2735,8 @@
   ReplaceAccessLevelsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('accessLevels')) {
       accessLevels = (_json['accessLevels'] as core.List)
-          .map<AccessLevel>((value) => AccessLevel.fromJson(value))
+          .map<AccessLevel>((value) => AccessLevel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -2692,7 +2768,8 @@
   ReplaceAccessLevelsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accessLevels')) {
       accessLevels = (_json['accessLevels'] as core.List)
-          .map<AccessLevel>((value) => AccessLevel.fromJson(value))
+          .map<AccessLevel>((value) => AccessLevel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2730,7 +2807,8 @@
     }
     if (_json.containsKey('servicePerimeters')) {
       servicePerimeters = (_json['servicePerimeters'] as core.List)
-          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(value))
+          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2759,7 +2837,8 @@
   ReplaceServicePerimetersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('servicePerimeters')) {
       servicePerimeters = (_json['servicePerimeters'] as core.List)
-          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(value))
+          .map<ServicePerimeter>((value) => ServicePerimeter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2843,10 +2922,12 @@
       perimeterType = _json['perimeterType'] as core.String;
     }
     if (_json.containsKey('spec')) {
-      spec = ServicePerimeterConfig.fromJson(_json['spec']);
+      spec = ServicePerimeterConfig.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = ServicePerimeterConfig.fromJson(_json['status']);
+      status = ServicePerimeterConfig.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -2928,8 +3009,9 @@
           .toList();
     }
     if (_json.containsKey('vpcAccessibleServices')) {
-      vpcAccessibleServices =
-          VpcAccessibleServices.fromJson(_json['vpcAccessibleServices']);
+      vpcAccessibleServices = VpcAccessibleServices.fromJson(
+          _json['vpcAccessibleServices']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2983,7 +3065,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/adexchangebuyer/v1_3.dart b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
index 9e74b9a..2e43774 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_3.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_3.dart
@@ -106,7 +106,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the authenticated user's list of accounts.
@@ -148,7 +150,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsList.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccountsList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account. This method supports patch semantics.
@@ -202,7 +207,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account.
@@ -256,7 +263,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -310,7 +319,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BillingInfo.fromJson(data));
+    return _response.then(
+      (data) =>
+          BillingInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of billing information for all accounts of the
@@ -353,7 +365,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BillingInfoList.fromJson(data));
+    return _response.then(
+      (data) =>
+          BillingInfoList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -417,7 +432,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Budget.fromJson(data));
+    return _response.then(
+      (data) => Budget.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the budget amount for the budget of the adgroup specified by the
@@ -482,7 +499,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Budget.fromJson(data));
+    return _response.then(
+      (data) => Budget.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the budget amount for the budget of the adgroup specified by the
@@ -546,7 +565,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Budget.fromJson(data));
+    return _response.then(
+      (data) => Budget.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -610,7 +631,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submit a new creative.
@@ -658,7 +681,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of the authenticated user's active creatives. A creative
@@ -742,7 +767,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativesList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativesList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -796,7 +824,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DirectDeal.fromJson(data));
+    return _response.then(
+      (data) =>
+          DirectDeal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the authenticated user's list of direct deals.
@@ -838,7 +869,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DirectDealsList.fromJson(data));
+    return _response.then(
+      (data) =>
+          DirectDealsList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -926,7 +960,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PerformanceReportList.fromJson(data));
+    return _response.then(
+      (data) => PerformanceReportList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -990,7 +1027,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a specific pretargeting configuration
@@ -1047,7 +1086,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new pretargeting configuration.
@@ -1101,7 +1143,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of the authenticated user's pretargeting configurations.
@@ -1149,7 +1194,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfigList.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfigList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing pretargeting config. This method supports patch
@@ -1213,7 +1261,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing pretargeting config.
@@ -1276,7 +1327,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1361,8 +1415,8 @@
   Account.fromJson(core.Map _json) {
     if (_json.containsKey('bidderLocation')) {
       bidderLocation = (_json['bidderLocation'] as core.List)
-          .map<AccountBidderLocation>(
-              (value) => AccountBidderLocation.fromJson(value))
+          .map<AccountBidderLocation>((value) => AccountBidderLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cookieMatchingNid')) {
@@ -1433,7 +1487,8 @@
   AccountsList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1520,7 +1575,8 @@
   BillingInfoList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<BillingInfo>((value) => BillingInfo.fromJson(value))
+          .map<BillingInfo>((value) => BillingInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1770,8 +1826,9 @@
     }
     if (_json.containsKey('reasons')) {
       reasons = (_json['reasons'] as core.List)
-          .map<CreativeFilteringReasonsReasons>(
-              (value) => CreativeFilteringReasonsReasons.fromJson(value))
+          .map<CreativeFilteringReasonsReasons>((value) =>
+              CreativeFilteringReasonsReasons.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1934,7 +1991,8 @@
       advertiser = _json['advertiser'] as core.String;
     }
     if (_json.containsKey('appIcon')) {
-      appIcon = CreativeNativeAdAppIcon.fromJson(_json['appIcon']);
+      appIcon = CreativeNativeAdAppIcon.fromJson(
+          _json['appIcon'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('body')) {
       body = _json['body'] as core.String;
@@ -1949,7 +2007,8 @@
       headline = _json['headline'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = CreativeNativeAdImage.fromJson(_json['image']);
+      image = CreativeNativeAdImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('impressionTrackingUrl')) {
       impressionTrackingUrl = (_json['impressionTrackingUrl'] as core.List)
@@ -1957,7 +2016,8 @@
           .toList();
     }
     if (_json.containsKey('logo')) {
-      logo = CreativeNativeAdLogo.fromJson(_json['logo']);
+      logo = CreativeNativeAdLogo.fromJson(
+          _json['logo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('price')) {
       price = _json['price'] as core.String;
@@ -2107,7 +2167,8 @@
     }
     if (_json.containsKey('adTechnologyProviders')) {
       adTechnologyProviders = CreativeAdTechnologyProviders.fromJson(
-          _json['adTechnologyProviders']);
+          _json['adTechnologyProviders']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('advertiserId')) {
       advertiserId = (_json['advertiserId'] as core.List)
@@ -2139,19 +2200,20 @@
     }
     if (_json.containsKey('corrections')) {
       corrections = (_json['corrections'] as core.List)
-          .map<CreativeCorrections>(
-              (value) => CreativeCorrections.fromJson(value))
+          .map<CreativeCorrections>((value) => CreativeCorrections.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('disapprovalReasons')) {
       disapprovalReasons = (_json['disapprovalReasons'] as core.List)
-          .map<CreativeDisapprovalReasons>(
-              (value) => CreativeDisapprovalReasons.fromJson(value))
+          .map<CreativeDisapprovalReasons>((value) =>
+              CreativeDisapprovalReasons.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('filteringReasons')) {
-      filteringReasons =
-          CreativeFilteringReasons.fromJson(_json['filteringReasons']);
+      filteringReasons = CreativeFilteringReasons.fromJson(
+          _json['filteringReasons'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -2165,7 +2227,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('nativeAd')) {
-      nativeAd = CreativeNativeAd.fromJson(_json['nativeAd']);
+      nativeAd = CreativeNativeAd.fromJson(
+          _json['nativeAd'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productCategories')) {
       productCategories = (_json['productCategories'] as core.List)
@@ -2303,7 +2366,8 @@
   CreativesList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Creative>((value) => Creative.fromJson(value))
+          .map<Creative>((value) =>
+              Creative.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2503,7 +2567,8 @@
   DirectDealsList.fromJson(core.Map _json) {
     if (_json.containsKey('directDeals')) {
       directDeals = (_json['directDeals'] as core.List)
-          .map<DirectDeal>((value) => DirectDeal.fromJson(value))
+          .map<DirectDeal>((value) =>
+              DirectDeal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2787,7 +2852,8 @@
     }
     if (_json.containsKey('performanceReport')) {
       performanceReport = (_json['performanceReport'] as core.List)
-          .map<PerformanceReport>((value) => PerformanceReport.fromJson(value))
+          .map<PerformanceReport>((value) => PerformanceReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3009,8 +3075,9 @@
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<PretargetingConfigDimensions>(
-              (value) => PretargetingConfigDimensions.fromJson(value))
+          .map<PretargetingConfigDimensions>((value) =>
+              PretargetingConfigDimensions.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('excludedContentLabels')) {
@@ -3025,8 +3092,9 @@
     }
     if (_json.containsKey('excludedPlacements')) {
       excludedPlacements = (_json['excludedPlacements'] as core.List)
-          .map<PretargetingConfigExcludedPlacements>(
-              (value) => PretargetingConfigExcludedPlacements.fromJson(value))
+          .map<PretargetingConfigExcludedPlacements>((value) =>
+              PretargetingConfigExcludedPlacements.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('excludedUserLists')) {
@@ -3076,8 +3144,9 @@
     }
     if (_json.containsKey('placements')) {
       placements = (_json['placements'] as core.List)
-          .map<PretargetingConfigPlacements>(
-              (value) => PretargetingConfigPlacements.fromJson(value))
+          .map<PretargetingConfigPlacements>((value) =>
+              PretargetingConfigPlacements.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('platforms')) {
@@ -3199,8 +3268,8 @@
   PretargetingConfigList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PretargetingConfig>(
-              (value) => PretargetingConfig.fromJson(value))
+          .map<PretargetingConfig>((value) => PretargetingConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/adexchangebuyer/v1_4.dart b/generated/googleapis/lib/adexchangebuyer/v1_4.dart
index 2489aa5..2cadeae 100644
--- a/generated/googleapis/lib/adexchangebuyer/v1_4.dart
+++ b/generated/googleapis/lib/adexchangebuyer/v1_4.dart
@@ -114,7 +114,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the authenticated user's list of accounts.
@@ -156,7 +158,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsList.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccountsList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account. This method supports patch semantics.
@@ -219,7 +224,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account.
@@ -282,7 +289,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -336,7 +345,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BillingInfo.fromJson(data));
+    return _response.then(
+      (data) =>
+          BillingInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of billing information for all accounts of the
@@ -379,7 +391,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BillingInfoList.fromJson(data));
+    return _response.then(
+      (data) =>
+          BillingInfoList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -443,7 +458,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Budget.fromJson(data));
+    return _response.then(
+      (data) => Budget.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the budget amount for the budget of the adgroup specified by the
@@ -508,7 +525,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Budget.fromJson(data));
+    return _response.then(
+      (data) => Budget.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the budget amount for the budget of the adgroup specified by the
@@ -572,7 +591,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Budget.fromJson(data));
+    return _response.then(
+      (data) => Budget.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -643,7 +664,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the status for a single creative. A creative will be available 30-40
@@ -701,7 +724,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submit a new creative.
@@ -749,7 +774,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of the authenticated user's active creatives. A creative
@@ -851,7 +878,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativesList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativesList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the external deal ids associated with the creative.
@@ -909,7 +939,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeDealIds.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeDealIds.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Remove a deal id associated with the creative.
@@ -974,7 +1007,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -1037,7 +1072,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeleteOrderDealsResponse.fromJson(data));
+    return _response.then(
+      (data) => DeleteOrderDealsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Add new deals for the specified proposal
@@ -1093,7 +1131,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AddOrderDealsResponse.fromJson(data));
+    return _response.then(
+      (data) => AddOrderDealsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all the deals for a given proposal
@@ -1149,7 +1190,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetOrderDealsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetOrderDealsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replaces all the deals in the proposal with the passed in deals
@@ -1205,7 +1249,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EditAllOrderDealsResponse.fromJson(data));
+    return _response.then(
+      (data) => EditAllOrderDealsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1268,7 +1315,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AddOrderNotesResponse.fromJson(data));
+    return _response.then(
+      (data) => AddOrderNotesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get all the notes associated with a proposal
@@ -1326,7 +1376,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetOrderNotesResponse.fromJson(data));
+    return _response.then(
+      (data) => GetOrderNotesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1389,7 +1442,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -1477,7 +1532,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PerformanceReportList.fromJson(data));
+    return _response.then(
+      (data) => PerformanceReportList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1541,7 +1599,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a specific pretargeting configuration
@@ -1598,7 +1658,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new pretargeting configuration.
@@ -1652,7 +1715,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of the authenticated user's pretargeting configurations.
@@ -1700,7 +1766,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfigList.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfigList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing pretargeting config. This method supports patch
@@ -1764,7 +1833,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing pretargeting config.
@@ -1827,7 +1899,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PretargetingConfig.fromJson(data));
+    return _response.then(
+      (data) => PretargetingConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1881,7 +1956,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the requested product.
@@ -1929,7 +2006,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetOffersResponse.fromJson(data));
+    return _response.then(
+      (data) => GetOffersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1983,7 +2063,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Proposal.fromJson(data));
+    return _response.then(
+      (data) => Proposal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create the given list of proposals
@@ -2031,7 +2113,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreateOrdersResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateOrdersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the given proposal. This method supports patch semantics.
@@ -2113,7 +2198,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Proposal.fromJson(data));
+    return _response.then(
+      (data) => Proposal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Search for proposals using pql query
@@ -2161,7 +2248,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetOrdersResponse.fromJson(data));
+    return _response.then(
+      (data) => GetOrdersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the given proposal to indicate that setup has been completed.
@@ -2211,7 +2301,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Update the given proposal
@@ -2293,7 +2385,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Proposal.fromJson(data));
+    return _response.then(
+      (data) => Proposal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2349,8 +2443,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetPublisherProfilesByAccountIdResponse.fromJson(data));
+    return _response.then(
+      (data) => GetPublisherProfilesByAccountIdResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2465,8 +2561,8 @@
     }
     if (_json.containsKey('bidderLocation')) {
       bidderLocation = (_json['bidderLocation'] as core.List)
-          .map<AccountBidderLocation>(
-              (value) => AccountBidderLocation.fromJson(value))
+          .map<AccountBidderLocation>((value) => AccountBidderLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cookieMatchingNid')) {
@@ -2541,7 +2637,8 @@
   AccountsList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2576,7 +2673,8 @@
   AddOrderDealsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deals')) {
       deals = (_json['deals'] as core.List)
-          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(value))
+          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('proposalRevisionNumber')) {
@@ -2614,7 +2712,8 @@
   AddOrderDealsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deals')) {
       deals = (_json['deals'] as core.List)
-          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(value))
+          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('proposalRevisionNumber')) {
@@ -2643,7 +2742,8 @@
   AddOrderNotesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('notes')) {
       notes = (_json['notes'] as core.List)
-          .map<MarketplaceNote>((value) => MarketplaceNote.fromJson(value))
+          .map<MarketplaceNote>((value) => MarketplaceNote.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2665,7 +2765,8 @@
   AddOrderNotesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('notes')) {
       notes = (_json['notes'] as core.List)
-          .map<MarketplaceNote>((value) => MarketplaceNote.fromJson(value))
+          .map<MarketplaceNote>((value) => MarketplaceNote.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2746,7 +2847,8 @@
   BillingInfoList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<BillingInfo>((value) => BillingInfo.fromJson(value))
+          .map<BillingInfo>((value) => BillingInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2898,7 +3000,8 @@
   CreateOrdersRequest.fromJson(core.Map _json) {
     if (_json.containsKey('proposals')) {
       proposals = (_json['proposals'] as core.List)
-          .map<Proposal>((value) => Proposal.fromJson(value))
+          .map<Proposal>((value) =>
+              Proposal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webPropertyCode')) {
@@ -2927,7 +3030,8 @@
   CreateOrdersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('proposals')) {
       proposals = (_json['proposals'] as core.List)
-          .map<Proposal>((value) => Proposal.fromJson(value))
+          .map<Proposal>((value) =>
+              Proposal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3060,8 +3164,9 @@
   CreativeCorrections.fromJson(core.Map _json) {
     if (_json.containsKey('contexts')) {
       contexts = (_json['contexts'] as core.List)
-          .map<CreativeCorrectionsContexts>(
-              (value) => CreativeCorrectionsContexts.fromJson(value))
+          .map<CreativeCorrectionsContexts>((value) =>
+              CreativeCorrectionsContexts.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('details')) {
@@ -3138,8 +3243,9 @@
     }
     if (_json.containsKey('reasons')) {
       reasons = (_json['reasons'] as core.List)
-          .map<CreativeFilteringReasonsReasons>(
-              (value) => CreativeFilteringReasonsReasons.fromJson(value))
+          .map<CreativeFilteringReasonsReasons>((value) =>
+              CreativeFilteringReasonsReasons.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3310,7 +3416,8 @@
       advertiser = _json['advertiser'] as core.String;
     }
     if (_json.containsKey('appIcon')) {
-      appIcon = CreativeNativeAdAppIcon.fromJson(_json['appIcon']);
+      appIcon = CreativeNativeAdAppIcon.fromJson(
+          _json['appIcon'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('body')) {
       body = _json['body'] as core.String;
@@ -3328,7 +3435,8 @@
       headline = _json['headline'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = CreativeNativeAdImage.fromJson(_json['image']);
+      image = CreativeNativeAdImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('impressionTrackingUrl')) {
       impressionTrackingUrl = (_json['impressionTrackingUrl'] as core.List)
@@ -3336,7 +3444,8 @@
           .toList();
     }
     if (_json.containsKey('logo')) {
-      logo = CreativeNativeAdLogo.fromJson(_json['logo']);
+      logo = CreativeNativeAdLogo.fromJson(
+          _json['logo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('price')) {
       price = _json['price'] as core.String;
@@ -3505,14 +3614,16 @@
   CreativeServingRestrictions.fromJson(core.Map _json) {
     if (_json.containsKey('contexts')) {
       contexts = (_json['contexts'] as core.List)
-          .map<CreativeServingRestrictionsContexts>(
-              (value) => CreativeServingRestrictionsContexts.fromJson(value))
+          .map<CreativeServingRestrictionsContexts>((value) =>
+              CreativeServingRestrictionsContexts.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('disapprovalReasons')) {
       disapprovalReasons = (_json['disapprovalReasons'] as core.List)
           .map<CreativeServingRestrictionsDisapprovalReasons>((value) =>
-              CreativeServingRestrictionsDisapprovalReasons.fromJson(value))
+              CreativeServingRestrictionsDisapprovalReasons.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reason')) {
@@ -3687,7 +3798,8 @@
     }
     if (_json.containsKey('adTechnologyProviders')) {
       adTechnologyProviders = CreativeAdTechnologyProviders.fromJson(
-          _json['adTechnologyProviders']);
+          _json['adTechnologyProviders']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('advertiserId')) {
       advertiserId = (_json['advertiserId'] as core.List)
@@ -3719,8 +3831,8 @@
     }
     if (_json.containsKey('corrections')) {
       corrections = (_json['corrections'] as core.List)
-          .map<CreativeCorrections>(
-              (value) => CreativeCorrections.fromJson(value))
+          .map<CreativeCorrections>((value) => CreativeCorrections.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creativeStatusIdentityType')) {
@@ -3736,8 +3848,8 @@
           .toList();
     }
     if (_json.containsKey('filteringReasons')) {
-      filteringReasons =
-          CreativeFilteringReasons.fromJson(_json['filteringReasons']);
+      filteringReasons = CreativeFilteringReasons.fromJson(
+          _json['filteringReasons'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('height')) {
       height = _json['height'] as core.int;
@@ -3756,7 +3868,8 @@
           .toList();
     }
     if (_json.containsKey('nativeAd')) {
-      nativeAd = CreativeNativeAd.fromJson(_json['nativeAd']);
+      nativeAd = CreativeNativeAd.fromJson(
+          _json['nativeAd'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('openAuctionStatus')) {
       openAuctionStatus = _json['openAuctionStatus'] as core.String;
@@ -3778,8 +3891,9 @@
     }
     if (_json.containsKey('servingRestrictions')) {
       servingRestrictions = (_json['servingRestrictions'] as core.List)
-          .map<CreativeServingRestrictions>(
-              (value) => CreativeServingRestrictions.fromJson(value))
+          .map<CreativeServingRestrictions>((value) =>
+              CreativeServingRestrictions.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('vendorType')) {
@@ -3954,8 +4068,9 @@
   CreativeDealIds.fromJson(core.Map _json) {
     if (_json.containsKey('dealStatuses')) {
       dealStatuses = (_json['dealStatuses'] as core.List)
-          .map<CreativeDealIdsDealStatuses>(
-              (value) => CreativeDealIdsDealStatuses.fromJson(value))
+          .map<CreativeDealIdsDealStatuses>((value) =>
+              CreativeDealIdsDealStatuses.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3995,7 +4110,8 @@
   CreativesList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Creative>((value) => Creative.fromJson(value))
+          .map<Creative>((value) =>
+              Creative.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4038,8 +4154,8 @@
       alcoholAdsAllowed = _json['alcoholAdsAllowed'] as core.bool;
     }
     if (_json.containsKey('dealPauseStatus')) {
-      dealPauseStatus =
-          DealServingMetadataDealPauseStatus.fromJson(_json['dealPauseStatus']);
+      dealPauseStatus = DealServingMetadataDealPauseStatus.fromJson(
+          _json['dealPauseStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4158,7 +4274,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('estimatedGrossSpend')) {
-      estimatedGrossSpend = Price.fromJson(_json['estimatedGrossSpend']);
+      estimatedGrossSpend = Price.fromJson(
+          _json['estimatedGrossSpend'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('estimatedImpressionsPerDay')) {
       estimatedImpressionsPerDay =
@@ -4166,20 +4283,24 @@
     }
     if (_json.containsKey('guaranteedFixedPriceTerms')) {
       guaranteedFixedPriceTerms = DealTermsGuaranteedFixedPriceTerms.fromJson(
-          _json['guaranteedFixedPriceTerms']);
+          _json['guaranteedFixedPriceTerms']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nonGuaranteedAuctionTerms')) {
       nonGuaranteedAuctionTerms = DealTermsNonGuaranteedAuctionTerms.fromJson(
-          _json['nonGuaranteedAuctionTerms']);
+          _json['nonGuaranteedAuctionTerms']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nonGuaranteedFixedPriceTerms')) {
       nonGuaranteedFixedPriceTerms =
           DealTermsNonGuaranteedFixedPriceTerms.fromJson(
-              _json['nonGuaranteedFixedPriceTerms']);
+              _json['nonGuaranteedFixedPriceTerms']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rubiconNonGuaranteedTerms')) {
       rubiconNonGuaranteedTerms = DealTermsRubiconNonGuaranteedTerms.fromJson(
-          _json['rubiconNonGuaranteedTerms']);
+          _json['rubiconNonGuaranteedTerms']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sellerTimeZone')) {
       sellerTimeZone = _json['sellerTimeZone'] as core.String;
@@ -4248,11 +4369,12 @@
   DealTermsGuaranteedFixedPriceTerms.fromJson(core.Map _json) {
     if (_json.containsKey('billingInfo')) {
       billingInfo = DealTermsGuaranteedFixedPriceTermsBillingInfo.fromJson(
-          _json['billingInfo']);
+          _json['billingInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fixedPrices')) {
       fixedPrices = (_json['fixedPrices'] as core.List)
-          .map<PricePerBuyer>((value) => PricePerBuyer.fromJson(value))
+          .map<PricePerBuyer>((value) => PricePerBuyer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('guaranteedImpressions')) {
@@ -4324,7 +4446,8 @@
           _json['originalContractedQuantity'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4363,7 +4486,8 @@
     }
     if (_json.containsKey('reservePricePerBuyers')) {
       reservePricePerBuyers = (_json['reservePricePerBuyers'] as core.List)
-          .map<PricePerBuyer>((value) => PricePerBuyer.fromJson(value))
+          .map<PricePerBuyer>((value) => PricePerBuyer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4390,7 +4514,8 @@
   DealTermsNonGuaranteedFixedPriceTerms.fromJson(core.Map _json) {
     if (_json.containsKey('fixedPrices')) {
       fixedPrices = (_json['fixedPrices'] as core.List)
-          .map<PricePerBuyer>((value) => PricePerBuyer.fromJson(value))
+          .map<PricePerBuyer>((value) => PricePerBuyer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4416,10 +4541,12 @@
 
   DealTermsRubiconNonGuaranteedTerms.fromJson(core.Map _json) {
     if (_json.containsKey('priorityPrice')) {
-      priorityPrice = Price.fromJson(_json['priorityPrice']);
+      priorityPrice = Price.fromJson(
+          _json['priorityPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('standardPrice')) {
-      standardPrice = Price.fromJson(_json['standardPrice']);
+      standardPrice = Price.fromJson(
+          _json['standardPrice'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4488,7 +4615,8 @@
   DeleteOrderDealsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deals')) {
       deals = (_json['deals'] as core.List)
-          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(value))
+          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('proposalRevisionNumber')) {
@@ -4524,8 +4652,9 @@
     }
     if (_json.containsKey('frequencyCaps')) {
       frequencyCaps = (_json['frequencyCaps'] as core.List)
-          .map<DeliveryControlFrequencyCap>(
-              (value) => DeliveryControlFrequencyCap.fromJson(value))
+          .map<DeliveryControlFrequencyCap>((value) =>
+              DeliveryControlFrequencyCap.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4595,8 +4724,9 @@
     }
     if (_json.containsKey('dimensionValues')) {
       dimensionValues = (_json['dimensionValues'] as core.List)
-          .map<DimensionDimensionValue>(
-              (value) => DimensionDimensionValue.fromJson(value))
+          .map<DimensionDimensionValue>((value) =>
+              DimensionDimensionValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4687,11 +4817,13 @@
   EditAllOrderDealsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deals')) {
       deals = (_json['deals'] as core.List)
-          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(value))
+          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('proposal')) {
-      proposal = Proposal.fromJson(_json['proposal']);
+      proposal = Proposal.fromJson(
+          _json['proposal'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('proposalRevisionNumber')) {
       proposalRevisionNumber = _json['proposalRevisionNumber'] as core.String;
@@ -4731,7 +4863,8 @@
   EditAllOrderDealsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deals')) {
       deals = (_json['deals'] as core.List)
-          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(value))
+          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('orderRevisionNumber')) {
@@ -4760,7 +4893,8 @@
   GetOffersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('products')) {
       products = (_json['products'] as core.List)
-          .map<Product>((value) => Product.fromJson(value))
+          .map<Product>((value) =>
+              Product.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4783,7 +4917,8 @@
   GetOrderDealsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deals')) {
       deals = (_json['deals'] as core.List)
-          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(value))
+          .map<MarketplaceDeal>((value) => MarketplaceDeal.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4809,7 +4944,8 @@
   GetOrderNotesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('notes')) {
       notes = (_json['notes'] as core.List)
-          .map<MarketplaceNote>((value) => MarketplaceNote.fromJson(value))
+          .map<MarketplaceNote>((value) => MarketplaceNote.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4832,7 +4968,8 @@
   GetOrdersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('proposals')) {
       proposals = (_json['proposals'] as core.List)
-          .map<Proposal>((value) => Proposal.fromJson(value))
+          .map<Proposal>((value) =>
+              Proposal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4855,8 +4992,9 @@
   GetPublisherProfilesByAccountIdResponse.fromJson(core.Map _json) {
     if (_json.containsKey('profiles')) {
       profiles = (_json['profiles'] as core.List)
-          .map<PublisherProfileApiProto>(
-              (value) => PublisherProfileApiProto.fromJson(value))
+          .map<PublisherProfileApiProto>((value) =>
+              PublisherProfileApiProto.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4965,7 +5103,8 @@
 
   MarketplaceDeal.fromJson(core.Map _json) {
     if (_json.containsKey('buyerPrivateData')) {
-      buyerPrivateData = PrivateData.fromJson(_json['buyerPrivateData']);
+      buyerPrivateData = PrivateData.fromJson(
+          _json['buyerPrivateData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimeMs')) {
       creationTimeMs = _json['creationTimeMs'] as core.String;
@@ -4982,11 +5121,12 @@
       dealId = _json['dealId'] as core.String;
     }
     if (_json.containsKey('dealServingMetadata')) {
-      dealServingMetadata =
-          DealServingMetadata.fromJson(_json['dealServingMetadata']);
+      dealServingMetadata = DealServingMetadata.fromJson(
+          _json['dealServingMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deliveryControl')) {
-      deliveryControl = DeliveryControl.fromJson(_json['deliveryControl']);
+      deliveryControl = DeliveryControl.fromJson(
+          _json['deliveryControl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('externalDealId')) {
       externalDealId = _json['externalDealId'] as core.String;
@@ -5033,20 +5173,22 @@
     }
     if (_json.containsKey('sellerContacts')) {
       sellerContacts = (_json['sellerContacts'] as core.List)
-          .map<ContactInformation>(
-              (value) => ContactInformation.fromJson(value))
+          .map<ContactInformation>((value) => ContactInformation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sharedTargetings')) {
       sharedTargetings = (_json['sharedTargetings'] as core.List)
-          .map<SharedTargeting>((value) => SharedTargeting.fromJson(value))
+          .map<SharedTargeting>((value) => SharedTargeting.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('syndicationProduct')) {
       syndicationProduct = _json['syndicationProduct'] as core.String;
     }
     if (_json.containsKey('terms')) {
-      terms = DealTerms.fromJson(_json['terms']);
+      terms = DealTerms.fromJson(
+          _json['terms'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webPropertyCode')) {
       webPropertyCode = _json['webPropertyCode'] as core.String;
@@ -5152,10 +5294,12 @@
 
   MarketplaceDealParty.fromJson(core.Map _json) {
     if (_json.containsKey('buyer')) {
-      buyer = Buyer.fromJson(_json['buyer']);
+      buyer =
+          Buyer.fromJson(_json['buyer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('seller')) {
-      seller = Seller.fromJson(_json['seller']);
+      seller = Seller.fromJson(
+          _json['seller'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5195,7 +5339,8 @@
     }
     if (_json.containsKey('deprecatedMarketplaceDealParty')) {
       deprecatedMarketplaceDealParty = MarketplaceDealParty.fromJson(
-          _json['deprecatedMarketplaceDealParty']);
+          _json['deprecatedMarketplaceDealParty']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('label')) {
       label = _json['label'] as core.String;
@@ -5600,7 +5745,8 @@
     }
     if (_json.containsKey('performanceReport')) {
       performanceReport = (_json['performanceReport'] as core.List)
-          .map<PerformanceReport>((value) => PerformanceReport.fromJson(value))
+          .map<PerformanceReport>((value) => PerformanceReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5879,8 +6025,9 @@
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<PretargetingConfigDimensions>(
-              (value) => PretargetingConfigDimensions.fromJson(value))
+          .map<PretargetingConfigDimensions>((value) =>
+              PretargetingConfigDimensions.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('excludedContentLabels')) {
@@ -5895,8 +6042,9 @@
     }
     if (_json.containsKey('excludedPlacements')) {
       excludedPlacements = (_json['excludedPlacements'] as core.List)
-          .map<PretargetingConfigExcludedPlacements>(
-              (value) => PretargetingConfigExcludedPlacements.fromJson(value))
+          .map<PretargetingConfigExcludedPlacements>((value) =>
+              PretargetingConfigExcludedPlacements.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('excludedUserLists')) {
@@ -5949,8 +6097,9 @@
     }
     if (_json.containsKey('placements')) {
       placements = (_json['placements'] as core.List)
-          .map<PretargetingConfigPlacements>(
-              (value) => PretargetingConfigPlacements.fromJson(value))
+          .map<PretargetingConfigPlacements>((value) =>
+              PretargetingConfigPlacements.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('platforms')) {
@@ -5987,8 +6136,9 @@
     }
     if (_json.containsKey('videoPlayerSizes')) {
       videoPlayerSizes = (_json['videoPlayerSizes'] as core.List)
-          .map<PretargetingConfigVideoPlayerSizes>(
-              (value) => PretargetingConfigVideoPlayerSizes.fromJson(value))
+          .map<PretargetingConfigVideoPlayerSizes>((value) =>
+              PretargetingConfigVideoPlayerSizes.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6094,8 +6244,8 @@
   PretargetingConfigList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PretargetingConfig>(
-              (value) => PretargetingConfig.fromJson(value))
+          .map<PretargetingConfig>((value) => PretargetingConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6190,13 +6340,16 @@
       auctionTier = _json['auctionTier'] as core.String;
     }
     if (_json.containsKey('billedBuyer')) {
-      billedBuyer = Buyer.fromJson(_json['billedBuyer']);
+      billedBuyer = Buyer.fromJson(
+          _json['billedBuyer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('buyer')) {
-      buyer = Buyer.fromJson(_json['buyer']);
+      buyer =
+          Buyer.fromJson(_json['buyer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6369,25 +6522,28 @@
 
   Product.fromJson(core.Map _json) {
     if (_json.containsKey('billedBuyer')) {
-      billedBuyer = Buyer.fromJson(_json['billedBuyer']);
+      billedBuyer = Buyer.fromJson(
+          _json['billedBuyer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('buyer')) {
-      buyer = Buyer.fromJson(_json['buyer']);
+      buyer =
+          Buyer.fromJson(_json['buyer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimeMs')) {
       creationTimeMs = _json['creationTimeMs'] as core.String;
     }
     if (_json.containsKey('creatorContacts')) {
       creatorContacts = (_json['creatorContacts'] as core.List)
-          .map<ContactInformation>(
-              (value) => ContactInformation.fromJson(value))
+          .map<ContactInformation>((value) => ContactInformation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creatorRole')) {
       creatorRole = _json['creatorRole'] as core.String;
     }
     if (_json.containsKey('deliveryControl')) {
-      deliveryControl = DeliveryControl.fromJson(_json['deliveryControl']);
+      deliveryControl = DeliveryControl.fromJson(
+          _json['deliveryControl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('flightEndTimeMs')) {
       flightEndTimeMs = _json['flightEndTimeMs'] as core.String;
@@ -6406,7 +6562,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<MarketplaceLabel>((value) => MarketplaceLabel.fromJson(value))
+          .map<MarketplaceLabel>((value) => MarketplaceLabel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lastUpdateTimeMs')) {
@@ -6433,17 +6590,20 @@
     }
     if (_json.containsKey('publisherProvidedForecast')) {
       publisherProvidedForecast = PublisherProvidedForecast.fromJson(
-          _json['publisherProvidedForecast']);
+          _json['publisherProvidedForecast']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('revisionNumber')) {
       revisionNumber = _json['revisionNumber'] as core.String;
     }
     if (_json.containsKey('seller')) {
-      seller = Seller.fromJson(_json['seller']);
+      seller = Seller.fromJson(
+          _json['seller'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sharedTargetings')) {
       sharedTargetings = (_json['sharedTargetings'] as core.List)
-          .map<SharedTargeting>((value) => SharedTargeting.fromJson(value))
+          .map<SharedTargeting>((value) => SharedTargeting.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
@@ -6453,7 +6613,8 @@
       syndicationProduct = _json['syndicationProduct'] as core.String;
     }
     if (_json.containsKey('terms')) {
-      terms = DealTerms.fromJson(_json['terms']);
+      terms = DealTerms.fromJson(
+          _json['terms'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webPropertyCode')) {
       webPropertyCode = _json['webPropertyCode'] as core.String;
@@ -6640,19 +6801,22 @@
 
   Proposal.fromJson(core.Map _json) {
     if (_json.containsKey('billedBuyer')) {
-      billedBuyer = Buyer.fromJson(_json['billedBuyer']);
+      billedBuyer = Buyer.fromJson(
+          _json['billedBuyer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('buyer')) {
-      buyer = Buyer.fromJson(_json['buyer']);
+      buyer =
+          Buyer.fromJson(_json['buyer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('buyerContacts')) {
       buyerContacts = (_json['buyerContacts'] as core.List)
-          .map<ContactInformation>(
-              (value) => ContactInformation.fromJson(value))
+          .map<ContactInformation>((value) => ContactInformation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('buyerPrivateData')) {
-      buyerPrivateData = PrivateData.fromJson(_json['buyerPrivateData']);
+      buyerPrivateData = PrivateData.fromJson(
+          _json['buyerPrivateData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dbmAdvertiserIds')) {
       dbmAdvertiserIds = (_json['dbmAdvertiserIds'] as core.List)
@@ -6679,7 +6843,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<MarketplaceLabel>((value) => MarketplaceLabel.fromJson(value))
+          .map<MarketplaceLabel>((value) => MarketplaceLabel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lastUpdaterOrCommentorRole')) {
@@ -6711,12 +6876,13 @@
       revisionTimeMs = _json['revisionTimeMs'] as core.String;
     }
     if (_json.containsKey('seller')) {
-      seller = Seller.fromJson(_json['seller']);
+      seller = Seller.fromJson(
+          _json['seller'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sellerContacts')) {
       sellerContacts = (_json['sellerContacts'] as core.List)
-          .map<ContactInformation>(
-              (value) => ContactInformation.fromJson(value))
+          .map<ContactInformation>((value) => ContactInformation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6927,7 +7093,8 @@
     }
     if (_json.containsKey('publisherApps')) {
       publisherApps = (_json['publisherApps'] as core.List)
-          .map<MobileApplication>((value) => MobileApplication.fromJson(value))
+          .map<MobileApplication>((value) => MobileApplication.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('publisherDomains')) {
@@ -6940,7 +7107,8 @@
     }
     if (_json.containsKey('publisherProvidedForecast')) {
       publisherProvidedForecast = PublisherProvidedForecast.fromJson(
-          _json['publisherProvidedForecast']);
+          _json['publisherProvidedForecast']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rateCardInfoLink')) {
       rateCardInfoLink = _json['rateCardInfoLink'] as core.String;
@@ -6949,7 +7117,8 @@
       samplePageLink = _json['samplePageLink'] as core.String;
     }
     if (_json.containsKey('seller')) {
-      seller = Seller.fromJson(_json['seller']);
+      seller = Seller.fromJson(
+          _json['seller'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -7056,7 +7225,8 @@
   PublisherProvidedForecast.fromJson(core.Map _json) {
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('weeklyImpressions')) {
@@ -7130,12 +7300,14 @@
   SharedTargeting.fromJson(core.Map _json) {
     if (_json.containsKey('exclusions')) {
       exclusions = (_json['exclusions'] as core.List)
-          .map<TargetingValue>((value) => TargetingValue.fromJson(value))
+          .map<TargetingValue>((value) => TargetingValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inclusions')) {
       inclusions = (_json['inclusions'] as core.List)
-          .map<TargetingValue>((value) => TargetingValue.fromJson(value))
+          .map<TargetingValue>((value) => TargetingValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('key')) {
@@ -7179,20 +7351,23 @@
 
   TargetingValue.fromJson(core.Map _json) {
     if (_json.containsKey('creativeSizeValue')) {
-      creativeSizeValue =
-          TargetingValueCreativeSize.fromJson(_json['creativeSizeValue']);
+      creativeSizeValue = TargetingValueCreativeSize.fromJson(
+          _json['creativeSizeValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dayPartTargetingValue')) {
       dayPartTargetingValue = TargetingValueDayPartTargeting.fromJson(
-          _json['dayPartTargetingValue']);
+          _json['dayPartTargetingValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('demogAgeCriteriaValue')) {
       demogAgeCriteriaValue = TargetingValueDemogAgeCriteria.fromJson(
-          _json['demogAgeCriteriaValue']);
+          _json['demogAgeCriteriaValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('demogGenderCriteriaValue')) {
       demogGenderCriteriaValue = TargetingValueDemogGenderCriteria.fromJson(
-          _json['demogGenderCriteriaValue']);
+          _json['demogGenderCriteriaValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('longValue')) {
       longValue = _json['longValue'] as core.String;
@@ -7200,7 +7375,8 @@
     if (_json.containsKey('requestPlatformTargetingValue')) {
       requestPlatformTargetingValue =
           TargetingValueRequestPlatformTargeting.fromJson(
-              _json['requestPlatformTargetingValue']);
+              _json['requestPlatformTargetingValue']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stringValue')) {
       stringValue = _json['stringValue'] as core.String;
@@ -7266,8 +7442,8 @@
     }
     if (_json.containsKey('companionSizes')) {
       companionSizes = (_json['companionSizes'] as core.List)
-          .map<TargetingValueSize>(
-              (value) => TargetingValueSize.fromJson(value))
+          .map<TargetingValueSize>((value) => TargetingValueSize.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creativeSizeType')) {
@@ -7277,7 +7453,8 @@
       nativeTemplate = _json['nativeTemplate'] as core.String;
     }
     if (_json.containsKey('size')) {
-      size = TargetingValueSize.fromJson(_json['size']);
+      size = TargetingValueSize.fromJson(
+          _json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skippableAdType')) {
       skippableAdType = _json['skippableAdType'] as core.String;
@@ -7318,8 +7495,9 @@
   TargetingValueDayPartTargeting.fromJson(core.Map _json) {
     if (_json.containsKey('dayParts')) {
       dayParts = (_json['dayParts'] as core.List)
-          .map<TargetingValueDayPartTargetingDayPart>(
-              (value) => TargetingValueDayPartTargetingDayPart.fromJson(value))
+          .map<TargetingValueDayPartTargetingDayPart>((value) =>
+              TargetingValueDayPartTargetingDayPart.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeZoneType')) {
@@ -7503,7 +7681,8 @@
       externalDealId = _json['externalDealId'] as core.String;
     }
     if (_json.containsKey('note')) {
-      note = MarketplaceNote.fromJson(_json['note']);
+      note = MarketplaceNote.fromJson(
+          _json['note'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('proposalRevisionNumber')) {
       proposalRevisionNumber = _json['proposalRevisionNumber'] as core.String;
diff --git a/generated/googleapis/lib/adexperiencereport/v1.dart b/generated/googleapis/lib/adexperiencereport/v1.dart
index ff00c73..548d52e 100644
--- a/generated/googleapis/lib/adexperiencereport/v1.dart
+++ b/generated/googleapis/lib/adexperiencereport/v1.dart
@@ -97,7 +97,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SiteSummaryResponse.fromJson(data));
+    return _response.then(
+      (data) => SiteSummaryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -146,7 +149,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ViolatingSitesResponse.fromJson(data));
+    return _response.then(
+      (data) => ViolatingSitesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -264,10 +270,12 @@
 
   SiteSummaryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('desktopSummary')) {
-      desktopSummary = PlatformSummary.fromJson(_json['desktopSummary']);
+      desktopSummary = PlatformSummary.fromJson(
+          _json['desktopSummary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mobileSummary')) {
-      mobileSummary = PlatformSummary.fromJson(_json['mobileSummary']);
+      mobileSummary = PlatformSummary.fromJson(
+          _json['mobileSummary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reviewedSite')) {
       reviewedSite = _json['reviewedSite'] as core.String;
@@ -299,8 +307,8 @@
   ViolatingSitesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('violatingSites')) {
       violatingSites = (_json['violatingSites'] as core.List)
-          .map<SiteSummaryResponse>(
-              (value) => SiteSummaryResponse.fromJson(value))
+          .map<SiteSummaryResponse>((value) => SiteSummaryResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/admin/datatransfer_v1.dart b/generated/googleapis/lib/admin/datatransfer_v1.dart
index 806100d..c479cda 100644
--- a/generated/googleapis/lib/admin/datatransfer_v1.dart
+++ b/generated/googleapis/lib/admin/datatransfer_v1.dart
@@ -106,7 +106,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Application.fromJson(data));
+    return _response.then(
+      (data) =>
+          Application.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the applications available for data transfer for a customer.
@@ -167,7 +170,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApplicationsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ApplicationsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -223,7 +229,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataTransfer.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataTransfer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a data transfer request.
@@ -271,7 +280,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataTransfer.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataTransfer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the transfers for a customer by source user, destination user, or
@@ -351,7 +363,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataTransfersListResponse.fromJson(data));
+    return _response.then(
+      (data) => DataTransfersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -394,8 +409,9 @@
     }
     if (_json.containsKey('transferParams')) {
       transferParams = (_json['transferParams'] as core.List)
-          .map<ApplicationTransferParam>(
-              (value) => ApplicationTransferParam.fromJson(value))
+          .map<ApplicationTransferParam>((value) =>
+              ApplicationTransferParam.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -443,8 +459,9 @@
     if (_json.containsKey('applicationTransferParams')) {
       applicationTransferParams =
           (_json['applicationTransferParams'] as core.List)
-              .map<ApplicationTransferParam>(
-                  (value) => ApplicationTransferParam.fromJson(value))
+              .map<ApplicationTransferParam>((value) =>
+                  ApplicationTransferParam.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('applicationTransferStatus')) {
@@ -526,7 +543,8 @@
   ApplicationsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('applications')) {
       applications = (_json['applications'] as core.List)
-          .map<Application>((value) => Application.fromJson(value))
+          .map<Application>((value) => Application.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -597,8 +615,9 @@
     if (_json.containsKey('applicationDataTransfers')) {
       applicationDataTransfers =
           (_json['applicationDataTransfers'] as core.List)
-              .map<ApplicationDataTransfer>(
-                  (value) => ApplicationDataTransfer.fromJson(value))
+              .map<ApplicationDataTransfer>((value) =>
+                  ApplicationDataTransfer.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('etag')) {
@@ -678,7 +697,8 @@
   DataTransfersListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dataTransfers')) {
       dataTransfers = (_json['dataTransfers'] as core.List)
-          .map<DataTransfer>((value) => DataTransfer.fromJson(value))
+          .map<DataTransfer>((value) => DataTransfer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
diff --git a/generated/googleapis/lib/admin/directory_v1.dart b/generated/googleapis/lib/admin/directory_v1.dart
index eae109b..54de2c4 100644
--- a/generated/googleapis/lib/admin/directory_v1.dart
+++ b/generated/googleapis/lib/admin/directory_v1.dart
@@ -238,7 +238,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Get information about an ASP issued by a user.
@@ -296,7 +298,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Asp.fromJson(data));
+    return _response.then(
+      (data) => Asp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List the ASPs issued by a user.
@@ -347,7 +351,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Asps.fromJson(data));
+    return _response.then(
+      (data) => Asps.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -401,7 +407,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -471,7 +479,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve Chrome OS Device
@@ -539,7 +549,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChromeOsDevice.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChromeOsDevice.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve all Chrome OS Devices of a customer (paginated)
@@ -652,7 +665,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChromeOsDevices.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChromeOsDevices.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Move or insert multiple Chrome OS Devices to organizational unit
@@ -715,7 +731,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Patch Chrome OS Device
@@ -789,7 +807,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChromeOsDevice.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChromeOsDevice.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update Chrome OS Device
@@ -863,7 +884,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChromeOsDevice.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChromeOsDevice.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -918,7 +942,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Customer.fromJson(data));
+    return _response.then(
+      (data) => Customer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch Customers via Apiary Patch Orchestration
@@ -973,7 +999,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Customer.fromJson(data));
+    return _response.then(
+      (data) => Customer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a customer.
@@ -1028,7 +1056,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Customer.fromJson(data));
+    return _response.then(
+      (data) => Customer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1091,7 +1121,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a domain alias of the customer.
@@ -1148,7 +1180,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainAlias.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainAlias.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a domain alias of the customer.
@@ -1204,7 +1239,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainAlias.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainAlias.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the domain aliases of the customer.
@@ -1261,7 +1299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainAliases.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainAliases.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1324,7 +1365,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a domain of the customer.
@@ -1381,7 +1424,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Domains.fromJson(data));
+    return _response.then(
+      (data) => Domains.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a domain of the customer.
@@ -1437,7 +1482,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Domains.fromJson(data));
+    return _response.then(
+      (data) => Domains.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the domains of the customer.
@@ -1487,7 +1534,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Domains2.fromJson(data));
+    return _response.then(
+      (data) => Domains2.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1544,7 +1593,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve Group
@@ -1593,7 +1644,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create Group
@@ -1641,7 +1694,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve all groups of a domain or of a user given a userKey (paginated)
@@ -1747,7 +1802,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Groups.fromJson(data));
+    return _response.then(
+      (data) => Groups.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch Groups via Apiary Patch Orchestration
@@ -1803,7 +1860,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update Group
@@ -1859,7 +1918,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1922,7 +1983,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Add a alias for the group
@@ -1978,7 +2041,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Alias.fromJson(data));
+    return _response.then(
+      (data) => Alias.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all aliases for a group
@@ -2028,7 +2093,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Aliases.fromJson(data));
+    return _response.then(
+      (data) => Aliases.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2091,7 +2158,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve Group Member
@@ -2148,7 +2217,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Member.fromJson(data));
+    return _response.then(
+      (data) => Member.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Checks whether the given user is a member of the group. Membership can be
@@ -2208,7 +2279,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MembersHasMember.fromJson(data));
+    return _response.then(
+      (data) => MembersHasMember.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Add user to the specified group.
@@ -2264,7 +2338,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Member.fromJson(data));
+    return _response.then(
+      (data) => Member.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve all members in a group (paginated)
@@ -2342,7 +2418,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Members.fromJson(data));
+    return _response.then(
+      (data) => Members.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch Member via Apiary Patch Orchestration
@@ -2407,7 +2485,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Member.fromJson(data));
+    return _response.then(
+      (data) => Member.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update membership of a user in the specified group.
@@ -2472,7 +2552,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Member.fromJson(data));
+    return _response.then(
+      (data) => Member.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2542,7 +2624,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Delete Mobile Device
@@ -2599,7 +2683,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve Mobile Device
@@ -2667,7 +2753,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MobileDevice.fromJson(data));
+    return _response.then(
+      (data) =>
+          MobileDevice.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve all Mobile Devices of a customer (paginated)
@@ -2776,7 +2865,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MobileDevices.fromJson(data));
+    return _response.then(
+      (data) =>
+          MobileDevices.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2840,7 +2932,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve organizational unit
@@ -2898,7 +2992,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgUnit.fromJson(data));
+    return _response.then(
+      (data) => OrgUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Add organizational unit
@@ -2954,7 +3050,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgUnit.fromJson(data));
+    return _response.then(
+      (data) => OrgUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve all organizational units
@@ -3021,7 +3119,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgUnits.fromJson(data));
+    return _response.then(
+      (data) => OrgUnits.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch organization unit via Apiary Patch Orchestration
@@ -3085,7 +3185,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgUnit.fromJson(data));
+    return _response.then(
+      (data) => OrgUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update organizational unit
@@ -3149,7 +3251,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgUnit.fromJson(data));
+    return _response.then(
+      (data) => OrgUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3205,7 +3309,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Privileges.fromJson(data));
+    return _response.then(
+      (data) =>
+          Privileges.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3284,7 +3391,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a building.
@@ -3343,7 +3452,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Building.fromJson(data));
+    return _response.then(
+      (data) => Building.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a building.
@@ -3416,7 +3527,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Building.fromJson(data));
+    return _response.then(
+      (data) => Building.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of buildings for an account.
@@ -3481,7 +3594,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Buildings.fromJson(data));
+    return _response.then(
+      (data) => Buildings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a building via Apiary Patch Orchestration.
@@ -3561,7 +3676,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Building.fromJson(data));
+    return _response.then(
+      (data) => Building.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a building.
@@ -3641,7 +3758,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Building.fromJson(data));
+    return _response.then(
+      (data) => Building.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3707,7 +3826,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a calendar resource.
@@ -3766,7 +3887,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarResource.fromJson(data));
+    return _response.then(
+      (data) => CalendarResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a calendar resource.
@@ -3824,7 +3948,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarResource.fromJson(data));
+    return _response.then(
+      (data) => CalendarResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of calendar resources for an account.
@@ -3915,7 +4042,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarResources.fromJson(data));
+    return _response.then(
+      (data) => CalendarResources.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a calendar resource via Apiary Patch Orchestration.
@@ -3980,7 +4110,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarResource.fromJson(data));
+    return _response.then(
+      (data) => CalendarResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a calendar resource. This method supports patch semantics, meaning
@@ -4047,7 +4180,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarResource.fromJson(data));
+    return _response.then(
+      (data) => CalendarResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4113,7 +4249,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a feature.
@@ -4172,7 +4310,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Feature.fromJson(data));
+    return _response.then(
+      (data) => Feature.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a feature.
@@ -4230,7 +4370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Feature.fromJson(data));
+    return _response.then(
+      (data) => Feature.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of features for an account.
@@ -4295,7 +4437,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Features.fromJson(data));
+    return _response.then(
+      (data) => Features.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a feature via Apiary Patch Orchestration.
@@ -4360,7 +4504,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Feature.fromJson(data));
+    return _response.then(
+      (data) => Feature.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Renames a feature.
@@ -4426,7 +4572,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Updates a feature.
@@ -4491,7 +4639,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Feature.fromJson(data));
+    return _response.then(
+      (data) => Feature.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4554,7 +4704,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve a role assignment.
@@ -4611,7 +4763,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RoleAssignment.fromJson(data));
+    return _response.then(
+      (data) =>
+          RoleAssignment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a role assignment.
@@ -4667,7 +4822,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RoleAssignment.fromJson(data));
+    return _response.then(
+      (data) =>
+          RoleAssignment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a paginated list of all roleAssignments.
@@ -4745,7 +4903,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RoleAssignments.fromJson(data));
+    return _response.then(
+      (data) =>
+          RoleAssignments.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4808,7 +4969,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a role.
@@ -4865,7 +5028,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a role.
@@ -4921,7 +5086,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a paginated list of all the roles in a domain.
@@ -4984,7 +5151,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Roles.fromJson(data));
+    return _response.then(
+      (data) => Roles.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch role via Apiary Patch Orchestration
@@ -5047,7 +5216,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a role.
@@ -5110,7 +5281,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5173,7 +5346,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve schema
@@ -5230,7 +5405,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Schema.fromJson(data));
+    return _response.then(
+      (data) => Schema.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create schema.
@@ -5286,7 +5463,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Schema.fromJson(data));
+    return _response.then(
+      (data) => Schema.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve all schemas for a customer
@@ -5336,7 +5515,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Schemas.fromJson(data));
+    return _response.then(
+      (data) => Schemas.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch Schema via Apiary Patch Orchestration
@@ -5399,7 +5580,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Schema.fromJson(data));
+    return _response.then(
+      (data) => Schema.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update schema
@@ -5462,7 +5645,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Schema.fromJson(data));
+    return _response.then(
+      (data) => Schema.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5526,7 +5711,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Get information about an access token issued by a user.
@@ -5584,7 +5771,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Token.fromJson(data));
+    return _response.then(
+      (data) => Token.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the set of tokens specified user has issued to 3rd party
@@ -5636,7 +5825,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tokens.fromJson(data));
+    return _response.then(
+      (data) => Tokens.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5694,7 +5885,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -5752,7 +5945,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// retrieve user
@@ -5831,7 +6026,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// create user.
@@ -5879,7 +6076,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve either deleted users or all users in a domain (paginated)
@@ -6014,7 +6213,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Users.fromJson(data));
+    return _response.then(
+      (data) => Users.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// change admin status of a user
@@ -6070,7 +6271,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Patch Users via Apiary Patch Orchestration
@@ -6126,7 +6329,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sign a user out of all web and device sessions and reset their sign-in
@@ -6179,7 +6384,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Undelete a deleted user
@@ -6235,7 +6442,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// update user
@@ -6291,7 +6500,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Watch for changes in users list
@@ -6445,7 +6656,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6508,7 +6721,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Add a alias for the user
@@ -6564,7 +6779,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Alias.fromJson(data));
+    return _response.then(
+      (data) => Alias.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all aliases for a user
@@ -6614,7 +6831,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Aliases.fromJson(data));
+    return _response.then(
+      (data) => Aliases.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Watch for changes in users list
@@ -6680,7 +6899,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6736,7 +6957,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieve photo of a user
@@ -6786,7 +7009,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserPhoto.fromJson(data));
+    return _response.then(
+      (data) => UserPhoto.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch Photo via Apiary Patch Orchestration
@@ -6842,7 +7067,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserPhoto.fromJson(data));
+    return _response.then(
+      (data) => UserPhoto.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Add a photo for the user
@@ -6898,7 +7125,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserPhoto.fromJson(data));
+    return _response.then(
+      (data) => UserPhoto.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6955,7 +7184,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Invalidate the current backup verification codes for the user.
@@ -7005,7 +7236,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns the current set of valid backup verification codes for the
@@ -7057,7 +7290,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VerificationCodes.fromJson(data));
+    return _response.then(
+      (data) => VerificationCodes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7252,7 +7488,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Asp>((value) => Asp.fromJson(value))
+          .map<Asp>((value) =>
+              Asp.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7311,7 +7548,8 @@
 
   Building.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = BuildingAddress.fromJson(_json['address']);
+      address = BuildingAddress.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('buildingId')) {
       buildingId = _json['buildingId'] as core.String;
@@ -7320,7 +7558,8 @@
       buildingName = _json['buildingName'] as core.String;
     }
     if (_json.containsKey('coordinates')) {
-      coordinates = BuildingCoordinates.fromJson(_json['coordinates']);
+      coordinates = BuildingCoordinates.fromJson(
+          _json['coordinates'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -7501,7 +7740,8 @@
   Buildings.fromJson(core.Map _json) {
     if (_json.containsKey('buildings')) {
       buildings = (_json['buildings'] as core.List)
-          .map<Building>((value) => Building.fromJson(value))
+          .map<Building>((value) =>
+              Building.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -7713,7 +7953,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CalendarResource>((value) => CalendarResource.fromJson(value))
+          .map<CalendarResource>((value) => CalendarResource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7795,7 +8036,8 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.String, core.String>(
-          _json['params'].cast<core.String, core.String>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('payload')) {
@@ -7927,7 +8169,8 @@
     if (_json.containsKey('cpuTemperatureInfo')) {
       cpuTemperatureInfo = (_json['cpuTemperatureInfo'] as core.List)
           .map<ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo>((value) =>
-              ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo.fromJson(value))
+              ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cpuUtilizationPercentageInfo')) {
@@ -8054,7 +8297,8 @@
     if (_json.containsKey('volumeInfo')) {
       volumeInfo = (_json['volumeInfo'] as core.List)
           .map<ChromeOsDeviceDiskVolumeReportsVolumeInfo>((value) =>
-              ChromeOsDeviceDiskVolumeReportsVolumeInfo.fromJson(value))
+              ChromeOsDeviceDiskVolumeReportsVolumeInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8356,8 +8600,9 @@
   ChromeOsDevice.fromJson(core.Map _json) {
     if (_json.containsKey('activeTimeRanges')) {
       activeTimeRanges = (_json['activeTimeRanges'] as core.List)
-          .map<ChromeOsDeviceActiveTimeRanges>(
-              (value) => ChromeOsDeviceActiveTimeRanges.fromJson(value))
+          .map<ChromeOsDeviceActiveTimeRanges>((value) =>
+              ChromeOsDeviceActiveTimeRanges.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('annotatedAssetId')) {
@@ -8377,14 +8622,16 @@
     }
     if (_json.containsKey('cpuStatusReports')) {
       cpuStatusReports = (_json['cpuStatusReports'] as core.List)
-          .map<ChromeOsDeviceCpuStatusReports>(
-              (value) => ChromeOsDeviceCpuStatusReports.fromJson(value))
+          .map<ChromeOsDeviceCpuStatusReports>((value) =>
+              ChromeOsDeviceCpuStatusReports.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deviceFiles')) {
       deviceFiles = (_json['deviceFiles'] as core.List)
-          .map<ChromeOsDeviceDeviceFiles>(
-              (value) => ChromeOsDeviceDeviceFiles.fromJson(value))
+          .map<ChromeOsDeviceDeviceFiles>((value) =>
+              ChromeOsDeviceDeviceFiles.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deviceId')) {
@@ -8392,8 +8639,9 @@
     }
     if (_json.containsKey('diskVolumeReports')) {
       diskVolumeReports = (_json['diskVolumeReports'] as core.List)
-          .map<ChromeOsDeviceDiskVolumeReports>(
-              (value) => ChromeOsDeviceDiskVolumeReports.fromJson(value))
+          .map<ChromeOsDeviceDiskVolumeReports>((value) =>
+              ChromeOsDeviceDiskVolumeReports.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dockMacAddress')) {
@@ -8420,8 +8668,9 @@
     }
     if (_json.containsKey('lastKnownNetwork')) {
       lastKnownNetwork = (_json['lastKnownNetwork'] as core.List)
-          .map<ChromeOsDeviceLastKnownNetwork>(
-              (value) => ChromeOsDeviceLastKnownNetwork.fromJson(value))
+          .map<ChromeOsDeviceLastKnownNetwork>((value) =>
+              ChromeOsDeviceLastKnownNetwork.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lastSync')) {
@@ -8456,8 +8705,9 @@
     }
     if (_json.containsKey('recentUsers')) {
       recentUsers = (_json['recentUsers'] as core.List)
-          .map<ChromeOsDeviceRecentUsers>(
-              (value) => ChromeOsDeviceRecentUsers.fromJson(value))
+          .map<ChromeOsDeviceRecentUsers>((value) =>
+              ChromeOsDeviceRecentUsers.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serialNumber')) {
@@ -8472,16 +8722,17 @@
     }
     if (_json.containsKey('systemRamFreeReports')) {
       systemRamFreeReports = (_json['systemRamFreeReports'] as core.List)
-          .map<ChromeOsDeviceSystemRamFreeReports>(
-              (value) => ChromeOsDeviceSystemRamFreeReports.fromJson(value))
+          .map<ChromeOsDeviceSystemRamFreeReports>((value) =>
+              ChromeOsDeviceSystemRamFreeReports.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('systemRamTotal')) {
       systemRamTotal = _json['systemRamTotal'] as core.String;
     }
     if (_json.containsKey('tpmVersionInfo')) {
-      tpmVersionInfo =
-          ChromeOsDeviceTpmVersionInfo.fromJson(_json['tpmVersionInfo']);
+      tpmVersionInfo = ChromeOsDeviceTpmVersionInfo.fromJson(
+          _json['tpmVersionInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('willAutoRenew')) {
       willAutoRenew = _json['willAutoRenew'] as core.bool;
@@ -8658,7 +8909,8 @@
   ChromeOsDevices.fromJson(core.Map _json) {
     if (_json.containsKey('chromeosdevices')) {
       chromeosdevices = (_json['chromeosdevices'] as core.List)
-          .map<ChromeOsDevice>((value) => ChromeOsDevice.fromJson(value))
+          .map<ChromeOsDevice>((value) => ChromeOsDevice.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -8776,7 +9028,8 @@
       phoneNumber = _json['phoneNumber'] as core.String;
     }
     if (_json.containsKey('postalAddress')) {
-      postalAddress = CustomerPostalAddress.fromJson(_json['postalAddress']);
+      postalAddress = CustomerPostalAddress.fromJson(
+          _json['postalAddress'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8998,7 +9251,8 @@
   DomainAliases.fromJson(core.Map _json) {
     if (_json.containsKey('domainAliases')) {
       domainAliases = (_json['domainAliases'] as core.List)
-          .map<DomainAlias>((value) => DomainAlias.fromJson(value))
+          .map<DomainAlias>((value) => DomainAlias.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -9055,7 +9309,8 @@
     }
     if (_json.containsKey('domainAliases')) {
       domainAliases = (_json['domainAliases'] as core.List)
-          .map<DomainAlias>((value) => DomainAlias.fromJson(value))
+          .map<DomainAlias>((value) => DomainAlias.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('domainName')) {
@@ -9118,7 +9373,8 @@
   Domains2.fromJson(core.Map _json) {
     if (_json.containsKey('domains')) {
       domains = (_json['domains'] as core.List)
-          .map<Domains>((value) => Domains.fromJson(value))
+          .map<Domains>((value) =>
+              Domains.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -9194,7 +9450,8 @@
 
   FeatureInstance.fromJson(core.Map _json) {
     if (_json.containsKey('feature')) {
-      feature = Feature.fromJson(_json['feature']);
+      feature = Feature.fromJson(
+          _json['feature'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9251,7 +9508,8 @@
     }
     if (_json.containsKey('features')) {
       features = (_json['features'] as core.List)
-          .map<Feature>((value) => Feature.fromJson(value))
+          .map<Feature>((value) =>
+              Feature.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9413,7 +9671,8 @@
     }
     if (_json.containsKey('groups')) {
       groups = (_json['groups'] as core.List)
-          .map<Group>((value) => Group.fromJson(value))
+          .map<Group>((value) =>
+              Group.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9552,7 +9811,8 @@
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
-          .map<Member>((value) => Member.fromJson(value))
+          .map<Member>((value) =>
+              Member.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -9792,8 +10052,9 @@
     }
     if (_json.containsKey('applications')) {
       applications = (_json['applications'] as core.List)
-          .map<MobileDeviceApplications>(
-              (value) => MobileDeviceApplications.fromJson(value))
+          .map<MobileDeviceApplications>((value) =>
+              MobileDeviceApplications.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('basebandVersion')) {
@@ -10091,7 +10352,8 @@
     }
     if (_json.containsKey('mobiledevices')) {
       mobiledevices = (_json['mobiledevices'] as core.List)
-          .map<MobileDevice>((value) => MobileDevice.fromJson(value))
+          .map<MobileDevice>((value) => MobileDevice.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -10240,7 +10502,8 @@
     }
     if (_json.containsKey('organizationUnits')) {
       organizationUnits = (_json['organizationUnits'] as core.List)
-          .map<OrgUnit>((value) => OrgUnit.fromJson(value))
+          .map<OrgUnit>((value) =>
+              OrgUnit.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10291,7 +10554,8 @@
   Privilege.fromJson(core.Map _json) {
     if (_json.containsKey('childPrivileges')) {
       childPrivileges = (_json['childPrivileges'] as core.List)
-          .map<Privilege>((value) => Privilege.fromJson(value))
+          .map<Privilege>((value) =>
+              Privilege.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -10360,7 +10624,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Privilege>((value) => Privilege.fromJson(value))
+          .map<Privilege>((value) =>
+              Privilege.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10465,8 +10730,8 @@
     }
     if (_json.containsKey('rolePrivileges')) {
       rolePrivileges = (_json['rolePrivileges'] as core.List)
-          .map<RoleRolePrivileges>(
-              (value) => RoleRolePrivileges.fromJson(value))
+          .map<RoleRolePrivileges>((value) => RoleRolePrivileges.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10600,7 +10865,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<RoleAssignment>((value) => RoleAssignment.fromJson(value))
+          .map<RoleAssignment>((value) => RoleAssignment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10648,7 +10914,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Role>((value) => Role.fromJson(value))
+          .map<Role>((value) =>
+              Role.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10711,7 +10978,8 @@
     }
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<SchemaFieldSpec>((value) => SchemaFieldSpec.fromJson(value))
+          .map<SchemaFieldSpec>((value) => SchemaFieldSpec.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10853,7 +11121,7 @@
     }
     if (_json.containsKey('numericIndexingSpec')) {
       numericIndexingSpec = SchemaFieldSpecNumericIndexingSpec.fromJson(
-          _json['numericIndexingSpec']);
+          _json['numericIndexingSpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readAccessType')) {
       readAccessType = _json['readAccessType'] as core.String;
@@ -10921,7 +11189,8 @@
     }
     if (_json.containsKey('schemas')) {
       schemas = (_json['schemas'] as core.List)
-          .map<Schema>((value) => Schema.fromJson(value))
+          .map<Schema>((value) =>
+              Schema.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11055,7 +11324,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Token>((value) => Token.fromJson(value))
+          .map<Token>((value) =>
+              Token.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11318,8 +11588,10 @@
     }
     if (_json.containsKey('customSchemas')) {
       customSchemas = commons.mapMap<core.Map, UserCustomProperties>(
-          _json['customSchemas'].cast<core.String, core.Map>(),
-          (core.Map item) => UserCustomProperties.fromJson(item));
+          (_json['customSchemas'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => UserCustomProperties.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('customerId')) {
       customerId = _json['customerId'] as core.String;
@@ -11387,7 +11659,8 @@
       locations = _json['locations'] as core.Object;
     }
     if (_json.containsKey('name')) {
-      name = UserName.fromJson(_json['name']);
+      name = UserName.fromJson(
+          _json['name'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nonEditableAliases')) {
       nonEditableAliases = (_json['nonEditableAliases'] as core.List)
@@ -12788,7 +13061,8 @@
     }
     if (_json.containsKey('users')) {
       users = (_json['users'] as core.List)
-          .map<User>((value) => User.fromJson(value))
+          .map<User>((value) =>
+              User.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12890,7 +13164,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<VerificationCode>((value) => VerificationCode.fromJson(value))
+          .map<VerificationCode>((value) => VerificationCode.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/admin/reports_v1.dart b/generated/googleapis/lib/admin/reports_v1.dart
index b0c270f..2293c92 100644
--- a/generated/googleapis/lib/admin/reports_v1.dart
+++ b/generated/googleapis/lib/admin/reports_v1.dart
@@ -306,7 +306,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Activities.fromJson(data));
+    return _response.then(
+      (data) =>
+          Activities.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Start receiving notifications for account activities. For more
@@ -554,7 +557,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -608,7 +613,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -708,7 +715,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UsageReports.fromJson(data));
+    return _response.then(
+      (data) =>
+          UsageReports.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -864,7 +874,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UsageReports.fromJson(data));
+    return _response.then(
+      (data) =>
+          UsageReports.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1016,7 +1029,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UsageReports.fromJson(data));
+    return _response.then(
+      (data) =>
+          UsageReports.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1044,7 +1060,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Activity>((value) => Activity.fromJson(value))
+          .map<Activity>((value) =>
+              Activity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1138,7 +1155,8 @@
   ActivityEventsParametersMessageValue.fromJson(core.Map _json) {
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<NestedParameter>((value) => NestedParameter.fromJson(value))
+          .map<NestedParameter>((value) => NestedParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1161,7 +1179,8 @@
   ActivityEventsParametersMultiMessageValue.fromJson(core.Map _json) {
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<NestedParameter>((value) => NestedParameter.fromJson(value))
+          .map<NestedParameter>((value) => NestedParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1213,8 +1232,8 @@
       intValue = _json['intValue'] as core.String;
     }
     if (_json.containsKey('messageValue')) {
-      messageValue =
-          ActivityEventsParametersMessageValue.fromJson(_json['messageValue']);
+      messageValue = ActivityEventsParametersMessageValue.fromJson(
+          _json['messageValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('multiIntValue')) {
       multiIntValue = (_json['multiIntValue'] as core.List)
@@ -1224,7 +1243,8 @@
     if (_json.containsKey('multiMessageValue')) {
       multiMessageValue = (_json['multiMessageValue'] as core.List)
           .map<ActivityEventsParametersMultiMessageValue>((value) =>
-              ActivityEventsParametersMultiMessageValue.fromJson(value))
+              ActivityEventsParametersMultiMessageValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('multiValue')) {
@@ -1303,8 +1323,9 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<ActivityEventsParameters>(
-              (value) => ActivityEventsParameters.fromJson(value))
+          .map<ActivityEventsParameters>((value) =>
+              ActivityEventsParameters.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -1410,18 +1431,21 @@
 
   Activity.fromJson(core.Map _json) {
     if (_json.containsKey('actor')) {
-      actor = ActivityActor.fromJson(_json['actor']);
+      actor = ActivityActor.fromJson(
+          _json['actor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('events')) {
       events = (_json['events'] as core.List)
-          .map<ActivityEvents>((value) => ActivityEvents.fromJson(value))
+          .map<ActivityEvents>((value) => ActivityEvents.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
-      id = ActivityId.fromJson(_json['id']);
+      id = ActivityId.fromJson(
+          _json['id'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ipAddress')) {
       ipAddress = _json['ipAddress'] as core.String;
@@ -1514,7 +1538,8 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.String, core.String>(
-          _json['params'].cast<core.String, core.String>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('payload')) {
@@ -1752,7 +1777,8 @@
       msgValue = (_json['msgValue'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -1815,7 +1841,8 @@
       date = _json['date'] as core.String;
     }
     if (_json.containsKey('entity')) {
-      entity = UsageReportEntity.fromJson(_json['entity']);
+      entity = UsageReportEntity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -1825,8 +1852,8 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<UsageReportParameters>(
-              (value) => UsageReportParameters.fromJson(value))
+          .map<UsageReportParameters>((value) => UsageReportParameters.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1906,8 +1933,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<UsageReportsWarningsData>(
-              (value) => UsageReportsWarningsData.fromJson(value))
+          .map<UsageReportsWarningsData>((value) =>
+              UsageReportsWarningsData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -1964,13 +1992,14 @@
     }
     if (_json.containsKey('usageReports')) {
       usageReports = (_json['usageReports'] as core.List)
-          .map<UsageReport>((value) => UsageReport.fromJson(value))
+          .map<UsageReport>((value) => UsageReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<UsageReportsWarnings>(
-              (value) => UsageReportsWarnings.fromJson(value))
+          .map<UsageReportsWarnings>((value) => UsageReportsWarnings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/admob/v1.dart b/generated/googleapis/lib/admob/v1.dart
index 15d5544..28cca25 100644
--- a/generated/googleapis/lib/admob/v1.dart
+++ b/generated/googleapis/lib/admob/v1.dart
@@ -105,7 +105,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PublisherAccount.fromJson(data));
+    return _response.then(
+      (data) => PublisherAccount.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the AdMob publisher account accessible with the client credential.
@@ -163,8 +166,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListPublisherAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPublisherAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -230,8 +235,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GenerateMediationReportResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateMediationReportResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -297,8 +304,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GenerateNetworkReportResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateNetworkReportResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -367,10 +376,12 @@
 
   DateRange.fromJson(core.Map _json) {
     if (_json.containsKey('endDate')) {
-      endDate = Date.fromJson(_json['endDate']);
+      endDate = Date.fromJson(
+          _json['endDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startDate')) {
-      startDate = Date.fromJson(_json['startDate']);
+      startDate = Date.fromJson(
+          _json['startDate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -395,7 +406,8 @@
 
   GenerateMediationReportRequest.fromJson(core.Map _json) {
     if (_json.containsKey('reportSpec')) {
-      reportSpec = MediationReportSpec.fromJson(_json['reportSpec']);
+      reportSpec = MediationReportSpec.fromJson(
+          _json['reportSpec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -434,13 +446,16 @@
 
   GenerateMediationReportResponse.fromJson(core.Map _json) {
     if (_json.containsKey('footer')) {
-      footer = ReportFooter.fromJson(_json['footer']);
+      footer = ReportFooter.fromJson(
+          _json['footer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('header')) {
-      header = ReportHeader.fromJson(_json['header']);
+      header = ReportHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('row')) {
-      row = ReportRow.fromJson(_json['row']);
+      row = ReportRow.fromJson(
+          _json['row'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -468,7 +483,8 @@
 
   GenerateNetworkReportRequest.fromJson(core.Map _json) {
     if (_json.containsKey('reportSpec')) {
-      reportSpec = NetworkReportSpec.fromJson(_json['reportSpec']);
+      reportSpec = NetworkReportSpec.fromJson(
+          _json['reportSpec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -507,13 +523,16 @@
 
   GenerateNetworkReportResponse.fromJson(core.Map _json) {
     if (_json.containsKey('footer')) {
-      footer = ReportFooter.fromJson(_json['footer']);
+      footer = ReportFooter.fromJson(
+          _json['footer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('header')) {
-      header = ReportHeader.fromJson(_json['header']);
+      header = ReportHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('row')) {
-      row = ReportRow.fromJson(_json['row']);
+      row = ReportRow.fromJson(
+          _json['row'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -546,7 +565,8 @@
   ListPublisherAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
       account = (_json['account'] as core.List)
-          .map<PublisherAccount>((value) => PublisherAccount.fromJson(value))
+          .map<PublisherAccount>((value) => PublisherAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -656,12 +676,14 @@
 
   MediationReportSpec.fromJson(core.Map _json) {
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<MediationReportSpecDimensionFilter>(
-              (value) => MediationReportSpecDimensionFilter.fromJson(value))
+          .map<MediationReportSpecDimensionFilter>((value) =>
+              MediationReportSpecDimensionFilter.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
@@ -670,8 +692,8 @@
           .toList();
     }
     if (_json.containsKey('localizationSettings')) {
-      localizationSettings =
-          LocalizationSettings.fromJson(_json['localizationSettings']);
+      localizationSettings = LocalizationSettings.fromJson(
+          _json['localizationSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxReportRows')) {
       maxReportRows = _json['maxReportRows'] as core.int;
@@ -683,8 +705,9 @@
     }
     if (_json.containsKey('sortConditions')) {
       sortConditions = (_json['sortConditions'] as core.List)
-          .map<MediationReportSpecSortCondition>(
-              (value) => MediationReportSpecSortCondition.fromJson(value))
+          .map<MediationReportSpecSortCondition>((value) =>
+              MediationReportSpecSortCondition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeZone')) {
@@ -766,7 +789,8 @@
       dimension = _json['dimension'] as core.String;
     }
     if (_json.containsKey('matchesAny')) {
-      matchesAny = StringList.fromJson(_json['matchesAny']);
+      matchesAny = StringList.fromJson(
+          _json['matchesAny'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -934,12 +958,14 @@
 
   NetworkReportSpec.fromJson(core.Map _json) {
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<NetworkReportSpecDimensionFilter>(
-              (value) => NetworkReportSpecDimensionFilter.fromJson(value))
+          .map<NetworkReportSpecDimensionFilter>((value) =>
+              NetworkReportSpecDimensionFilter.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
@@ -948,8 +974,8 @@
           .toList();
     }
     if (_json.containsKey('localizationSettings')) {
-      localizationSettings =
-          LocalizationSettings.fromJson(_json['localizationSettings']);
+      localizationSettings = LocalizationSettings.fromJson(
+          _json['localizationSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxReportRows')) {
       maxReportRows = _json['maxReportRows'] as core.int;
@@ -961,8 +987,9 @@
     }
     if (_json.containsKey('sortConditions')) {
       sortConditions = (_json['sortConditions'] as core.List)
-          .map<NetworkReportSpecSortCondition>(
-              (value) => NetworkReportSpecSortCondition.fromJson(value))
+          .map<NetworkReportSpecSortCondition>((value) =>
+              NetworkReportSpecSortCondition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeZone')) {
@@ -1043,7 +1070,8 @@
       dimension = _json['dimension'] as core.String;
     }
     if (_json.containsKey('matchesAny')) {
-      matchesAny = StringList.fromJson(_json['matchesAny']);
+      matchesAny = StringList.fromJson(
+          _json['matchesAny'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1230,7 +1258,8 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<ReportWarning>((value) => ReportWarning.fromJson(value))
+          .map<ReportWarning>((value) => ReportWarning.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1266,11 +1295,12 @@
 
   ReportHeader.fromJson(core.Map _json) {
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('localizationSettings')) {
-      localizationSettings =
-          LocalizationSettings.fromJson(_json['localizationSettings']);
+      localizationSettings = LocalizationSettings.fromJson(
+          _json['localizationSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reportingTimeZone')) {
       reportingTimeZone = _json['reportingTimeZone'] as core.String;
@@ -1307,13 +1337,17 @@
   ReportRow.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionValues')) {
       dimensionValues = commons.mapMap<core.Map, ReportRowDimensionValue>(
-          _json['dimensionValues'].cast<core.String, core.Map>(),
-          (core.Map item) => ReportRowDimensionValue.fromJson(item));
+          (_json['dimensionValues'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ReportRowDimensionValue.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('metricValues')) {
       metricValues = commons.mapMap<core.Map, ReportRowMetricValue>(
-          _json['metricValues'].cast<core.String, core.Map>(),
-          (core.Map item) => ReportRowMetricValue.fromJson(item));
+          (_json['metricValues'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ReportRowMetricValue.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
diff --git a/generated/googleapis/lib/adsense/v1_4.dart b/generated/googleapis/lib/adsense/v1_4.dart
index ee26f8e..edb77a5 100644
--- a/generated/googleapis/lib/adsense/v1_4.dart
+++ b/generated/googleapis/lib/adsense/v1_4.dart
@@ -140,7 +140,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all accounts available to this AdSense account.
@@ -198,7 +200,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Accounts.fromJson(data));
+    return _response.then(
+      (data) => Accounts.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -269,7 +273,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdCode.fromJson(data));
+    return _response.then(
+      (data) => AdCode.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all ad clients in the specified account.
@@ -335,7 +341,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdClients.fromJson(data));
+    return _response.then(
+      (data) => AdClients.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -410,7 +418,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnit.fromJson(data));
+    return _response.then(
+      (data) => AdUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get ad code for the specified ad unit.
@@ -476,7 +486,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdCode.fromJson(data));
+    return _response.then(
+      (data) => AdCode.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all ad units in the specified ad client for the specified account.
@@ -556,7 +568,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnits.fromJson(data));
+    return _response.then(
+      (data) => AdUnits.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -645,7 +659,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -709,7 +726,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// List the alerts for the specified AdSense account.
@@ -766,7 +785,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Alerts.fromJson(data));
+    return _response.then(
+      (data) => Alerts.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -842,7 +863,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all custom channels in the specified ad client for the specified
@@ -917,7 +941,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1012,7 +1039,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnits.fromJson(data));
+    return _response.then(
+      (data) => AdUnits.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1068,7 +1097,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Payments.fromJson(data));
+    return _response.then(
+      (data) => Payments.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1230,8 +1261,10 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response
-          .then((data) => AdsenseReportsGenerateResponse.fromJson(data));
+      return _response.then(
+        (data) => AdsenseReportsGenerateResponse.fromJson(
+            data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -1321,8 +1354,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AdsenseReportsGenerateResponse.fromJson(data));
+    return _response.then(
+      (data) => AdsenseReportsGenerateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all saved reports in the specified AdSense account.
@@ -1388,7 +1423,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedReports.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedReports.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1452,7 +1490,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedAdStyle.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedAdStyle.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all saved ad styles in the specified account.
@@ -1518,7 +1559,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedAdStyles.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedAdStyles.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1600,7 +1644,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          UrlChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1664,7 +1711,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdClients.fromJson(data));
+    return _response.then(
+      (data) => AdClients.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1730,7 +1779,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnit.fromJson(data));
+    return _response.then(
+      (data) => AdUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get ad code for the specified ad unit.
@@ -1788,7 +1839,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdCode.fromJson(data));
+    return _response.then(
+      (data) => AdCode.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all ad units in the specified ad client for this AdSense account.
@@ -1860,7 +1913,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnits.fromJson(data));
+    return _response.then(
+      (data) => AdUnits.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1941,7 +1996,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1995,7 +2053,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// List the alerts for this AdSense account.
@@ -2045,7 +2105,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Alerts.fromJson(data));
+    return _response.then(
+      (data) => Alerts.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2111,7 +2173,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all custom channels in the specified ad client for this AdSense
@@ -2178,7 +2243,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2265,7 +2333,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnits.fromJson(data));
+    return _response.then(
+      (data) => AdUnits.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2325,7 +2395,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Metadata.fromJson(data));
+    return _response.then(
+      (data) => Metadata.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2373,7 +2445,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Metadata.fromJson(data));
+    return _response.then(
+      (data) => Metadata.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2421,7 +2495,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Payments.fromJson(data));
+    return _response.then(
+      (data) => Payments.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2581,8 +2657,10 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response
-          .then((data) => AdsenseReportsGenerateResponse.fromJson(data));
+      return _response.then(
+        (data) => AdsenseReportsGenerateResponse.fromJson(
+            data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -2662,8 +2740,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AdsenseReportsGenerateResponse.fromJson(data));
+    return _response.then(
+      (data) => AdsenseReportsGenerateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all saved reports in this AdSense account.
@@ -2721,7 +2801,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedReports.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedReports.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2775,7 +2858,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedAdStyle.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedAdStyle.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all saved ad styles in the user's account.
@@ -2833,7 +2919,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedAdStyles.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedAdStyles.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2905,7 +2994,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          UrlChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2950,7 +3042,8 @@
     }
     if (_json.containsKey('subAccounts')) {
       subAccounts = (_json['subAccounts'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timezone')) {
@@ -3008,7 +3101,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3117,7 +3211,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AdClient>((value) => AdClient.fromJson(value))
+          .map<AdClient>((value) =>
+              AdClient.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3304,13 +3399,15 @@
 
   AdStyle.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
-      colors = AdStyleColors.fromJson(_json['colors']);
+      colors = AdStyleColors.fromJson(
+          _json['colors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('corners')) {
       corners = _json['corners'] as core.String;
     }
     if (_json.containsKey('font')) {
-      font = AdStyleFont.fromJson(_json['font']);
+      font = AdStyleFont.fromJson(
+          _json['font'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -3391,8 +3488,8 @@
 
   AdUnitContentAdsSettings.fromJson(core.Map _json) {
     if (_json.containsKey('backupOption')) {
-      backupOption =
-          AdUnitContentAdsSettingsBackupOption.fromJson(_json['backupOption']);
+      backupOption = AdUnitContentAdsSettingsBackupOption.fromJson(
+          _json['backupOption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('size')) {
       size = _json['size'] as core.String;
@@ -3564,15 +3661,16 @@
       code = _json['code'] as core.String;
     }
     if (_json.containsKey('contentAdsSettings')) {
-      contentAdsSettings =
-          AdUnitContentAdsSettings.fromJson(_json['contentAdsSettings']);
+      contentAdsSettings = AdUnitContentAdsSettings.fromJson(
+          _json['contentAdsSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customStyle')) {
-      customStyle = AdStyle.fromJson(_json['customStyle']);
+      customStyle = AdStyle.fromJson(
+          _json['customStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('feedAdsSettings')) {
-      feedAdsSettings =
-          AdUnitFeedAdsSettings.fromJson(_json['feedAdsSettings']);
+      feedAdsSettings = AdUnitFeedAdsSettings.fromJson(
+          _json['feedAdsSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -3582,7 +3680,8 @@
     }
     if (_json.containsKey('mobileContentAdsSettings')) {
       mobileContentAdsSettings = AdUnitMobileContentAdsSettings.fromJson(
-          _json['mobileContentAdsSettings']);
+          _json['mobileContentAdsSettings']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3653,7 +3752,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AdUnit>((value) => AdUnit.fromJson(value))
+          .map<AdUnit>((value) =>
+              AdUnit.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3772,8 +3872,9 @@
     }
     if (_json.containsKey('headers')) {
       headers = (_json['headers'] as core.List)
-          .map<AdsenseReportsGenerateResponseHeaders>(
-              (value) => AdsenseReportsGenerateResponseHeaders.fromJson(value))
+          .map<AdsenseReportsGenerateResponseHeaders>((value) =>
+              AdsenseReportsGenerateResponseHeaders.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3918,7 +4019,8 @@
   Alerts.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Alert>((value) => Alert.fromJson(value))
+          .map<Alert>((value) =>
+              Alert.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4026,8 +4128,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('targetingInfo')) {
-      targetingInfo =
-          CustomChannelTargetingInfo.fromJson(_json['targetingInfo']);
+      targetingInfo = CustomChannelTargetingInfo.fromJson(
+          _json['targetingInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4074,7 +4176,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CustomChannel>((value) => CustomChannel.fromJson(value))
+          .map<CustomChannel>((value) => CustomChannel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4114,8 +4217,9 @@
   Metadata.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ReportingMetadataEntry>(
-              (value) => ReportingMetadataEntry.fromJson(value))
+          .map<ReportingMetadataEntry>((value) =>
+              ReportingMetadataEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4207,7 +4311,8 @@
   Payments.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Payment>((value) => Payment.fromJson(value))
+          .map<Payment>((value) =>
+              Payment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4342,7 +4447,8 @@
 
   SavedAdStyle.fromJson(core.Map _json) {
     if (_json.containsKey('adStyle')) {
-      adStyle = AdStyle.fromJson(_json['adStyle']);
+      adStyle = AdStyle.fromJson(
+          _json['adStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -4395,7 +4501,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SavedAdStyle>((value) => SavedAdStyle.fromJson(value))
+          .map<SavedAdStyle>((value) => SavedAdStyle.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4485,7 +4592,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SavedReport>((value) => SavedReport.fromJson(value))
+          .map<SavedReport>((value) => SavedReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4577,7 +4685,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<UrlChannel>((value) => UrlChannel.fromJson(value))
+          .map<UrlChannel>((value) =>
+              UrlChannel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/adsensehost/v4_1.dart b/generated/googleapis/lib/adsensehost/v4_1.dart
index 6d75471..50c517a 100644
--- a/generated/googleapis/lib/adsensehost/v4_1.dart
+++ b/generated/googleapis/lib/adsensehost/v4_1.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List hosted accounts associated with this AdSense account by ad client id.
@@ -160,7 +162,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Accounts.fromJson(data));
+    return _response.then(
+      (data) => Accounts.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -225,7 +229,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdClient.fromJson(data));
+    return _response.then(
+      (data) => AdClient.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all hosted ad clients in the specified hosted account.
@@ -291,7 +297,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdClients.fromJson(data));
+    return _response.then(
+      (data) => AdClients.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -362,7 +370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnit.fromJson(data));
+    return _response.then(
+      (data) => AdUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the specified host ad unit in this AdSense account.
@@ -427,7 +437,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnit.fromJson(data));
+    return _response.then(
+      (data) => AdUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get ad code for the specified ad unit, attaching the specified host custom
@@ -500,7 +512,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdCode.fromJson(data));
+    return _response.then(
+      (data) => AdCode.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Insert the supplied ad unit into the specified publisher AdSense account.
@@ -564,7 +578,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnit.fromJson(data));
+    return _response.then(
+      (data) => AdUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all ad units in the specified publisher's AdSense account.
@@ -644,7 +660,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnits.fromJson(data));
+    return _response.then(
+      (data) => AdUnits.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the supplied ad unit in the specified publisher AdSense account.
@@ -716,7 +734,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnit.fromJson(data));
+    return _response.then(
+      (data) => AdUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the supplied ad unit in the specified publisher AdSense account.
@@ -780,7 +800,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdUnit.fromJson(data));
+    return _response.then(
+      (data) => AdUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -909,7 +931,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -963,7 +987,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdClient.fromJson(data));
+    return _response.then(
+      (data) => AdClient.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all host ad clients in this AdSense account.
@@ -1021,7 +1047,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdClients.fromJson(data));
+    return _response.then(
+      (data) => AdClients.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1105,7 +1133,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssociationSession.fromJson(data));
+    return _response.then(
+      (data) => AssociationSession.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Verify an association session after the association callback returns from
@@ -1155,7 +1186,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssociationSession.fromJson(data));
+    return _response.then(
+      (data) => AssociationSession.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1218,7 +1252,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a specific custom channel from the host AdSense account.
@@ -1275,7 +1312,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Add a new custom channel to the host AdSense account.
@@ -1331,7 +1371,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all host custom channels in this AdSense account.
@@ -1397,7 +1440,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a custom channel in the host AdSense account. This method supports
@@ -1461,7 +1507,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a custom channel in the host AdSense account.
@@ -1517,7 +1566,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1639,7 +1691,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1702,7 +1756,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          UrlChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Add a new URL channel to the host AdSense account.
@@ -1758,7 +1815,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlChannel.fromJson(data));
+    return _response.then(
+      (data) =>
+          UrlChannel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all host URL channels in the host AdSense account.
@@ -1824,7 +1884,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlChannels.fromJson(data));
+    return _response.then(
+      (data) =>
+          UrlChannels.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1894,7 +1957,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1997,7 +2061,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AdClient>((value) => AdClient.fromJson(value))
+          .map<AdClient>((value) =>
+              AdClient.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2166,13 +2231,15 @@
 
   AdStyle.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
-      colors = AdStyleColors.fromJson(_json['colors']);
+      colors = AdStyleColors.fromJson(
+          _json['colors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('corners')) {
       corners = _json['corners'] as core.String;
     }
     if (_json.containsKey('font')) {
-      font = AdStyleFont.fromJson(_json['font']);
+      font = AdStyleFont.fromJson(
+          _json['font'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -2256,8 +2323,8 @@
 
   AdUnitContentAdsSettings.fromJson(core.Map _json) {
     if (_json.containsKey('backupOption')) {
-      backupOption =
-          AdUnitContentAdsSettingsBackupOption.fromJson(_json['backupOption']);
+      backupOption = AdUnitContentAdsSettingsBackupOption.fromJson(
+          _json['backupOption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('size')) {
       size = _json['size'] as core.String;
@@ -2373,11 +2440,12 @@
       code = _json['code'] as core.String;
     }
     if (_json.containsKey('contentAdsSettings')) {
-      contentAdsSettings =
-          AdUnitContentAdsSettings.fromJson(_json['contentAdsSettings']);
+      contentAdsSettings = AdUnitContentAdsSettings.fromJson(
+          _json['contentAdsSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customStyle')) {
-      customStyle = AdStyle.fromJson(_json['customStyle']);
+      customStyle = AdStyle.fromJson(
+          _json['customStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -2387,7 +2455,8 @@
     }
     if (_json.containsKey('mobileContentAdsSettings')) {
       mobileContentAdsSettings = AdUnitMobileContentAdsSettings.fromJson(
-          _json['mobileContentAdsSettings']);
+          _json['mobileContentAdsSettings']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2449,7 +2518,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AdUnit>((value) => AdUnit.fromJson(value))
+          .map<AdUnit>((value) =>
+              AdUnit.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2650,7 +2720,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CustomChannel>((value) => CustomChannel.fromJson(value))
+          .map<CustomChannel>((value) => CustomChannel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2760,7 +2831,8 @@
     }
     if (_json.containsKey('headers')) {
       headers = (_json['headers'] as core.List)
-          .map<ReportHeaders>((value) => ReportHeaders.fromJson(value))
+          .map<ReportHeaders>((value) => ReportHeaders.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2878,7 +2950,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<UrlChannel>((value) => UrlChannel.fromJson(value))
+          .map<UrlChannel>((value) =>
+              UrlChannel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/analytics/v3.dart b/generated/googleapis/lib/analytics/v3.dart
index 46b9fae..82879c6 100644
--- a/generated/googleapis/lib/analytics/v3.dart
+++ b/generated/googleapis/lib/analytics/v3.dart
@@ -251,7 +251,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GaData.fromJson(data));
+    return _response.then(
+      (data) => GaData.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -389,7 +391,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => McfData.fromJson(data));
+    return _response.then(
+      (data) => McfData.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -485,7 +489,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RealtimeData.fromJson(data));
+    return _response.then(
+      (data) =>
+          RealtimeData.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -596,7 +603,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountSummaries.fromJson(data));
+    return _response.then(
+      (data) => AccountSummaries.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -660,7 +670,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Adds a new user to the given account.
@@ -716,7 +728,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists account-user links for a given account.
@@ -781,7 +796,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLinks.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLinks.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates permissions for an existing user on the given account.
@@ -844,7 +862,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -907,7 +928,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Accounts.fromJson(data));
+    return _response.then(
+      (data) => Accounts.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -962,7 +985,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HashClientIdResponse.fromJson(data));
+    return _response.then(
+      (data) => HashClientIdResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1044,7 +1070,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomDataSources.fromJson(data));
+    return _response.then(
+      (data) => CustomDataSources.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1116,7 +1145,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomDimension.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomDimension.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new custom dimension.
@@ -1180,7 +1212,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomDimension.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomDimension.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists custom dimensions to which the user has access.
@@ -1252,7 +1287,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomDimensions.fromJson(data));
+    return _response.then(
+      (data) => CustomDimensions.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing custom dimension. This method supports patch
@@ -1335,7 +1373,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomDimension.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomDimension.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing custom dimension.
@@ -1417,7 +1458,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomDimension.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomDimension.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1489,7 +1533,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomMetric.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomMetric.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new custom metric.
@@ -1553,7 +1600,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomMetric.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomMetric.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists custom metrics to which the user has access.
@@ -1625,7 +1675,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomMetrics.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomMetrics.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing custom metric. This method supports patch semantics.
@@ -1706,7 +1759,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomMetric.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomMetric.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing custom metric.
@@ -1787,7 +1843,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomMetric.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomMetric.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1867,7 +1926,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns an experiment to which the user has access.
@@ -1940,7 +2001,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Experiment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Experiment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new experiment.
@@ -2012,7 +2076,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Experiment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Experiment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists experiments to which the user has access.
@@ -2095,7 +2162,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Experiments.fromJson(data));
+    return _response.then(
+      (data) =>
+          Experiments.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an existing experiment. This method supports patch semantics.
@@ -2174,7 +2244,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Experiment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Experiment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an existing experiment.
@@ -2253,7 +2326,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Experiment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Experiment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2317,7 +2393,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filter.fromJson(data));
+    return _response.then(
+      (data) => Filter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns filters to which the user has access.
@@ -2374,7 +2452,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filter.fromJson(data));
+    return _response.then(
+      (data) => Filter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new filter.
@@ -2430,7 +2510,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filter.fromJson(data));
+    return _response.then(
+      (data) => Filter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all filters for an account
@@ -2494,7 +2576,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filters.fromJson(data));
+    return _response.then(
+      (data) => Filters.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing filter. This method supports patch semantics.
@@ -2557,7 +2641,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filter.fromJson(data));
+    return _response.then(
+      (data) => Filter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing filter.
@@ -2620,7 +2706,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filter.fromJson(data));
+    return _response.then(
+      (data) => Filter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2699,7 +2787,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Goal.fromJson(data));
+    return _response.then(
+      (data) => Goal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new goal.
@@ -2771,7 +2861,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Goal.fromJson(data));
+    return _response.then(
+      (data) => Goal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists goals to which the user has access.
@@ -2856,7 +2948,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Goals.fromJson(data));
+    return _response.then(
+      (data) => Goals.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing goal. This method supports patch semantics.
@@ -2935,7 +3029,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Goal.fromJson(data));
+    return _response.then(
+      (data) => Goal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing goal.
@@ -3014,7 +3110,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Goal.fromJson(data));
+    return _response.then(
+      (data) => Goal.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3099,7 +3197,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns a single profile filter link.
@@ -3176,7 +3276,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProfileFilterLink.fromJson(data));
+    return _response.then(
+      (data) => ProfileFilterLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new profile filter link.
@@ -3251,7 +3354,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProfileFilterLink.fromJson(data));
+    return _response.then(
+      (data) => ProfileFilterLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all profile filter links for a profile.
@@ -3336,7 +3442,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProfileFilterLinks.fromJson(data));
+    return _response.then(
+      (data) => ProfileFilterLinks.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an existing profile filter link. This method supports patch
@@ -3420,7 +3529,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProfileFilterLink.fromJson(data));
+    return _response.then(
+      (data) => ProfileFilterLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an existing profile filter link.
@@ -3503,7 +3615,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProfileFilterLink.fromJson(data));
+    return _response.then(
+      (data) => ProfileFilterLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3583,7 +3698,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Adds a new user to the given view (profile).
@@ -3655,7 +3772,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists profile-user links for a given view (profile).
@@ -3740,7 +3860,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLinks.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLinks.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates permissions for an existing user on the given view (profile).
@@ -3819,7 +3942,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3891,7 +4017,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a view (profile) to which the user has access.
@@ -3959,7 +4087,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new view (profile).
@@ -4023,7 +4153,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists views (profiles) to which the user has access.
@@ -4099,7 +4231,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profiles.fromJson(data));
+    return _response.then(
+      (data) => Profiles.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing view (profile). This method supports patch semantics.
@@ -4170,7 +4304,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing view (profile).
@@ -4241,7 +4377,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4314,7 +4452,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a remarketing audience to which the user has access.
@@ -4380,7 +4520,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingAudience.fromJson(data));
+    return _response.then(
+      (data) => RemarketingAudience.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new remarketing audience.
@@ -4445,7 +4588,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingAudience.fromJson(data));
+    return _response.then(
+      (data) => RemarketingAudience.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists remarketing audiences to which the user has access.
@@ -4524,7 +4670,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingAudiences.fromJson(data));
+    return _response.then(
+      (data) => RemarketingAudiences.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing remarketing audience. This method supports patch
@@ -4597,7 +4746,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingAudience.fromJson(data));
+    return _response.then(
+      (data) => RemarketingAudience.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing remarketing audience.
@@ -4669,7 +4821,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingAudience.fromJson(data));
+    return _response.then(
+      (data) => RemarketingAudience.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4732,7 +4887,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Segments.fromJson(data));
+    return _response.then(
+      (data) => Segments.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4812,7 +4969,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns a single unsampled report.
@@ -4885,7 +5044,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UnsampledReport.fromJson(data));
+    return _response.then(
+      (data) =>
+          UnsampledReport.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new unsampled report.
@@ -4957,7 +5119,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UnsampledReport.fromJson(data));
+    return _response.then(
+      (data) =>
+          UnsampledReport.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists unsampled reports to which the user has access.
@@ -5041,7 +5206,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UnsampledReports.fromJson(data));
+    return _response.then(
+      (data) => UnsampledReports.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5124,7 +5292,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// List uploads to which the user has access.
@@ -5201,7 +5371,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Upload.fromJson(data));
+    return _response.then(
+      (data) => Upload.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List uploads to which the user has access.
@@ -5283,7 +5455,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Uploads.fromJson(data));
+    return _response.then(
+      (data) => Uploads.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Upload data for a custom data source.
@@ -5381,7 +5555,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Upload.fromJson(data));
+    return _response.then(
+      (data) => Upload.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5454,7 +5630,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns a web property-Google Ads link to which the user has access.
@@ -5520,7 +5698,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityAdWordsLink.fromJson(data));
+    return _response.then(
+      (data) => EntityAdWordsLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a webProperty-Google Ads link.
@@ -5584,7 +5765,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityAdWordsLink.fromJson(data));
+    return _response.then(
+      (data) => EntityAdWordsLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists webProperty-Google Ads links for a given web property.
@@ -5658,7 +5842,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityAdWordsLinks.fromJson(data));
+    return _response.then(
+      (data) => EntityAdWordsLinks.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing webProperty-Google Ads link. This method supports
@@ -5731,7 +5918,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityAdWordsLink.fromJson(data));
+    return _response.then(
+      (data) => EntityAdWordsLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing webProperty-Google Ads link.
@@ -5803,7 +5993,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityAdWordsLink.fromJson(data));
+    return _response.then(
+      (data) => EntityAdWordsLink.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5869,7 +6062,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Webproperty.fromJson(data));
+    return _response.then(
+      (data) =>
+          Webproperty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new property if the account has fewer than 20 properties. Web
@@ -5927,7 +6123,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Webproperty.fromJson(data));
+    return _response.then(
+      (data) =>
+          Webproperty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists web properties to which the user has access.
@@ -5993,7 +6192,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Webproperties.fromJson(data));
+    return _response.then(
+      (data) =>
+          Webproperties.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing web property. This method supports patch semantics.
@@ -6056,7 +6258,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Webproperty.fromJson(data));
+    return _response.then(
+      (data) =>
+          Webproperty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing web property.
@@ -6119,7 +6324,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Webproperty.fromJson(data));
+    return _response.then(
+      (data) =>
+          Webproperty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6191,7 +6399,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Adds a new user to the given web property.
@@ -6255,7 +6465,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists webProperty-user links for a given web property.
@@ -6330,7 +6543,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLinks.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLinks.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates permissions for an existing user on the given web property.
@@ -6401,7 +6617,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntityUserLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          EntityUserLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6467,7 +6686,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Columns.fromJson(data));
+    return _response.then(
+      (data) => Columns.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6521,7 +6742,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountTicket.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccountTicket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Provision account.
@@ -6569,7 +6793,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountTreeResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountTreeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6633,7 +6860,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserDeletionRequest.fromJson(data));
+    return _response.then(
+      (data) => UserDeletionRequest.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6728,7 +6958,8 @@
 
   Account.fromJson(core.Map _json) {
     if (_json.containsKey('childLink')) {
-      childLink = AccountChildLink.fromJson(_json['childLink']);
+      childLink = AccountChildLink.fromJson(
+          _json['childLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = core.DateTime.parse(_json['created'] as core.String);
@@ -6743,7 +6974,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('permissions')) {
-      permissions = AccountPermissions.fromJson(_json['permissions']);
+      permissions = AccountPermissions.fromJson(
+          _json['permissions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -6876,7 +7108,8 @@
   AccountSummaries.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AccountSummary>((value) => AccountSummary.fromJson(value))
+          .map<AccountSummary>((value) => AccountSummary.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -6967,8 +7200,8 @@
     }
     if (_json.containsKey('webProperties')) {
       webProperties = (_json['webProperties'] as core.List)
-          .map<WebPropertySummary>(
-              (value) => WebPropertySummary.fromJson(value))
+          .map<WebPropertySummary>((value) => WebPropertySummary.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7022,7 +7255,8 @@
 
   AccountTicket.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
-      account = Account.fromJson(_json['account']);
+      account = Account.fromJson(
+          _json['account'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -7031,13 +7265,15 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('profile')) {
-      profile = Profile.fromJson(_json['profile']);
+      profile = Profile.fromJson(
+          _json['profile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('redirectUri')) {
       redirectUri = _json['redirectUri'] as core.String;
     }
     if (_json.containsKey('webproperty')) {
-      webproperty = Webproperty.fromJson(_json['webproperty']);
+      webproperty = Webproperty.fromJson(
+          _json['webproperty'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7146,16 +7382,19 @@
 
   AccountTreeResponse.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
-      account = Account.fromJson(_json['account']);
+      account = Account.fromJson(
+          _json['account'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('profile')) {
-      profile = Profile.fromJson(_json['profile']);
+      profile = Profile.fromJson(
+          _json['profile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webproperty')) {
-      webproperty = Webproperty.fromJson(_json['webproperty']);
+      webproperty = Webproperty.fromJson(
+          _json['webproperty'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7216,7 +7455,8 @@
   Accounts.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -7353,7 +7593,8 @@
   Column.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
       attributes = commons.mapMap<core.String, core.String>(
-          _json['attributes'].cast<core.String, core.String>(),
+          (_json['attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('id')) {
@@ -7410,7 +7651,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Column>((value) => Column.fromJson(value))
+          .map<Column>((value) =>
+              Column.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7560,7 +7802,8 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('childLink')) {
-      childLink = CustomDataSourceChildLink.fromJson(_json['childLink']);
+      childLink = CustomDataSourceChildLink.fromJson(
+          _json['childLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = core.DateTime.parse(_json['created'] as core.String);
@@ -7581,7 +7824,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = CustomDataSourceParentLink.fromJson(_json['parentLink']);
+      parentLink = CustomDataSourceParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('profilesLinked')) {
       profilesLinked = (_json['profilesLinked'] as core.List)
@@ -7702,7 +7946,8 @@
   CustomDataSources.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CustomDataSource>((value) => CustomDataSource.fromJson(value))
+          .map<CustomDataSource>((value) => CustomDataSource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -7855,7 +8100,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = CustomDimensionParentLink.fromJson(_json['parentLink']);
+      parentLink = CustomDimensionParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scope')) {
       scope = _json['scope'] as core.String;
@@ -7951,7 +8197,8 @@
   CustomDimensions.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CustomDimension>((value) => CustomDimension.fromJson(value))
+          .map<CustomDimension>((value) => CustomDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -8119,7 +8366,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = CustomMetricParentLink.fromJson(_json['parentLink']);
+      parentLink = CustomMetricParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scope')) {
       scope = _json['scope'] as core.String;
@@ -8227,7 +8475,8 @@
   CustomMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CustomMetric>((value) => CustomMetric.fromJson(value))
+          .map<CustomMetric>((value) => CustomMetric.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -8291,7 +8540,8 @@
 
   EntityAdWordsLinkEntity.fromJson(core.Map _json) {
     if (_json.containsKey('webPropertyRef')) {
-      webPropertyRef = WebPropertyRef.fromJson(_json['webPropertyRef']);
+      webPropertyRef = WebPropertyRef.fromJson(
+          _json['webPropertyRef'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8333,11 +8583,13 @@
   EntityAdWordsLink.fromJson(core.Map _json) {
     if (_json.containsKey('adWordsAccounts')) {
       adWordsAccounts = (_json['adWordsAccounts'] as core.List)
-          .map<AdWordsAccount>((value) => AdWordsAccount.fromJson(value))
+          .map<AdWordsAccount>((value) => AdWordsAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entity')) {
-      entity = EntityAdWordsLinkEntity.fromJson(_json['entity']);
+      entity = EntityAdWordsLinkEntity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -8420,7 +8672,8 @@
   EntityAdWordsLinks.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<EntityAdWordsLink>((value) => EntityAdWordsLink.fromJson(value))
+          .map<EntityAdWordsLink>((value) => EntityAdWordsLink.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -8486,13 +8739,16 @@
 
   EntityUserLinkEntity.fromJson(core.Map _json) {
     if (_json.containsKey('accountRef')) {
-      accountRef = AccountRef.fromJson(_json['accountRef']);
+      accountRef = AccountRef.fromJson(
+          _json['accountRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('profileRef')) {
-      profileRef = ProfileRef.fromJson(_json['profileRef']);
+      profileRef = ProfileRef.fromJson(
+          _json['profileRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webPropertyRef')) {
-      webPropertyRef = WebPropertyRef.fromJson(_json['webPropertyRef']);
+      webPropertyRef = WebPropertyRef.fromJson(
+          _json['webPropertyRef'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8577,7 +8833,8 @@
 
   EntityUserLink.fromJson(core.Map _json) {
     if (_json.containsKey('entity')) {
-      entity = EntityUserLinkEntity.fromJson(_json['entity']);
+      entity = EntityUserLinkEntity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -8586,13 +8843,15 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('permissions')) {
-      permissions = EntityUserLinkPermissions.fromJson(_json['permissions']);
+      permissions = EntityUserLinkPermissions.fromJson(
+          _json['permissions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('userRef')) {
-      userRef = UserRef.fromJson(_json['userRef']);
+      userRef = UserRef.fromJson(
+          _json['userRef'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8654,7 +8913,8 @@
   EntityUserLinks.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<EntityUserLink>((value) => EntityUserLink.fromJson(value))
+          .map<EntityUserLink>((value) => EntityUserLink.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -8983,7 +9243,8 @@
       optimizationType = _json['optimizationType'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = ExperimentParentLink.fromJson(_json['parentLink']);
+      parentLink = ExperimentParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('profileId')) {
       profileId = _json['profileId'] as core.String;
@@ -9018,8 +9279,8 @@
     }
     if (_json.containsKey('variations')) {
       variations = (_json['variations'] as core.List)
-          .map<ExperimentVariations>(
-              (value) => ExperimentVariations.fromJson(value))
+          .map<ExperimentVariations>((value) => ExperimentVariations.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webPropertyId')) {
@@ -9162,7 +9423,8 @@
   Experiments.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Experiment>((value) => Experiment.fromJson(value))
+          .map<Experiment>((value) =>
+              Experiment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -9563,37 +9825,41 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('advancedDetails')) {
-      advancedDetails =
-          FilterAdvancedDetails.fromJson(_json['advancedDetails']);
+      advancedDetails = FilterAdvancedDetails.fromJson(
+          _json['advancedDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('excludeDetails')) {
-      excludeDetails = FilterExpression.fromJson(_json['excludeDetails']);
+      excludeDetails = FilterExpression.fromJson(
+          _json['excludeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('includeDetails')) {
-      includeDetails = FilterExpression.fromJson(_json['includeDetails']);
+      includeDetails = FilterExpression.fromJson(
+          _json['includeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lowercaseDetails')) {
-      lowercaseDetails =
-          FilterLowercaseDetails.fromJson(_json['lowercaseDetails']);
+      lowercaseDetails = FilterLowercaseDetails.fromJson(
+          _json['lowercaseDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = FilterParentLink.fromJson(_json['parentLink']);
+      parentLink = FilterParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchAndReplaceDetails')) {
       searchAndReplaceDetails = FilterSearchAndReplaceDetails.fromJson(
-          _json['searchAndReplaceDetails']);
+          _json['searchAndReplaceDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -9605,8 +9871,8 @@
       updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('uppercaseDetails')) {
-      uppercaseDetails =
-          FilterUppercaseDetails.fromJson(_json['uppercaseDetails']);
+      uppercaseDetails = FilterUppercaseDetails.fromJson(
+          _json['uppercaseDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9913,7 +10179,8 @@
   Filters.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Filter>((value) => Filter.fromJson(value))
+          .map<Filter>((value) =>
+              Filter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -10072,8 +10339,8 @@
   GaDataDataTableRows.fromJson(core.Map _json) {
     if (_json.containsKey('c')) {
       c = (_json['c'] as core.List)
-          .map<GaDataDataTableRowsC>(
-              (value) => GaDataDataTableRowsC.fromJson(value))
+          .map<GaDataDataTableRowsC>((value) => GaDataDataTableRowsC.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10096,14 +10363,14 @@
   GaDataDataTable.fromJson(core.Map _json) {
     if (_json.containsKey('cols')) {
       cols = (_json['cols'] as core.List)
-          .map<GaDataDataTableCols>(
-              (value) => GaDataDataTableCols.fromJson(value))
+          .map<GaDataDataTableCols>((value) => GaDataDataTableCols.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<GaDataDataTableRows>(
-              (value) => GaDataDataTableRows.fromJson(value))
+          .map<GaDataDataTableRows>((value) => GaDataDataTableRows.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10370,8 +10637,8 @@
   GaData.fromJson(core.Map _json) {
     if (_json.containsKey('columnHeaders')) {
       columnHeaders = (_json['columnHeaders'] as core.List)
-          .map<GaDataColumnHeaders>(
-              (value) => GaDataColumnHeaders.fromJson(value))
+          .map<GaDataColumnHeaders>((value) => GaDataColumnHeaders.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('containsSampledData')) {
@@ -10381,7 +10648,8 @@
       dataLastRefreshed = _json['dataLastRefreshed'] as core.String;
     }
     if (_json.containsKey('dataTable')) {
-      dataTable = GaDataDataTable.fromJson(_json['dataTable']);
+      dataTable = GaDataDataTable.fromJson(
+          _json['dataTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -10399,10 +10667,12 @@
       previousLink = _json['previousLink'] as core.String;
     }
     if (_json.containsKey('profileInfo')) {
-      profileInfo = GaDataProfileInfo.fromJson(_json['profileInfo']);
+      profileInfo = GaDataProfileInfo.fromJson(
+          _json['profileInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = GaDataQuery.fromJson(_json['query']);
+      query = GaDataQuery.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
@@ -10425,7 +10695,8 @@
     }
     if (_json.containsKey('totalsForAllResults')) {
       totalsForAllResults = commons.mapMap<core.String, core.String>(
-          _json['totalsForAllResults'].cast<core.String, core.String>(),
+          (_json['totalsForAllResults'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -10560,8 +10831,9 @@
   GoalEventDetails.fromJson(core.Map _json) {
     if (_json.containsKey('eventConditions')) {
       eventConditions = (_json['eventConditions'] as core.List)
-          .map<GoalEventDetailsEventConditions>(
-              (value) => GoalEventDetailsEventConditions.fromJson(value))
+          .map<GoalEventDetailsEventConditions>((value) =>
+              GoalEventDetailsEventConditions.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('useEventValue')) {
@@ -10685,8 +10957,9 @@
     }
     if (_json.containsKey('steps')) {
       steps = (_json['steps'] as core.List)
-          .map<GoalUrlDestinationDetailsSteps>(
-              (value) => GoalUrlDestinationDetailsSteps.fromJson(value))
+          .map<GoalUrlDestinationDetailsSteps>((value) =>
+              GoalUrlDestinationDetailsSteps.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('url')) {
@@ -10849,7 +11122,8 @@
       created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('eventDetails')) {
-      eventDetails = GoalEventDetails.fromJson(_json['eventDetails']);
+      eventDetails = GoalEventDetails.fromJson(
+          _json['eventDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -10864,7 +11138,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = GoalParentLink.fromJson(_json['parentLink']);
+      parentLink = GoalParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('profileId')) {
       profileId = _json['profileId'] as core.String;
@@ -10879,19 +11154,21 @@
       updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('urlDestinationDetails')) {
-      urlDestinationDetails =
-          GoalUrlDestinationDetails.fromJson(_json['urlDestinationDetails']);
+      urlDestinationDetails = GoalUrlDestinationDetails.fromJson(
+          _json['urlDestinationDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = (_json['value'] as core.num).toDouble();
     }
     if (_json.containsKey('visitNumPagesDetails')) {
-      visitNumPagesDetails =
-          GoalVisitNumPagesDetails.fromJson(_json['visitNumPagesDetails']);
+      visitNumPagesDetails = GoalVisitNumPagesDetails.fromJson(
+          _json['visitNumPagesDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitTimeOnSiteDetails')) {
-      visitTimeOnSiteDetails =
-          GoalVisitTimeOnSiteDetails.fromJson(_json['visitTimeOnSiteDetails']);
+      visitTimeOnSiteDetails = GoalVisitTimeOnSiteDetails.fromJson(
+          _json['visitTimeOnSiteDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webPropertyId')) {
       webPropertyId = _json['webPropertyId'] as core.String;
@@ -10996,7 +11273,8 @@
   Goals.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Goal>((value) => Goal.fromJson(value))
+          .map<Goal>((value) =>
+              Goal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -11570,8 +11848,9 @@
   McfDataRows.fromJson(core.Map _json) {
     if (_json.containsKey('conversionPathValue')) {
       conversionPathValue = (_json['conversionPathValue'] as core.List)
-          .map<McfDataRowsConversionPathValue>(
-              (value) => McfDataRowsConversionPathValue.fromJson(value))
+          .map<McfDataRowsConversionPathValue>((value) =>
+              McfDataRowsConversionPathValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('primitiveValue')) {
@@ -11654,8 +11933,8 @@
   McfData.fromJson(core.Map _json) {
     if (_json.containsKey('columnHeaders')) {
       columnHeaders = (_json['columnHeaders'] as core.List)
-          .map<McfDataColumnHeaders>(
-              (value) => McfDataColumnHeaders.fromJson(value))
+          .map<McfDataColumnHeaders>((value) => McfDataColumnHeaders.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('containsSampledData')) {
@@ -11677,15 +11956,18 @@
       previousLink = _json['previousLink'] as core.String;
     }
     if (_json.containsKey('profileInfo')) {
-      profileInfo = McfDataProfileInfo.fromJson(_json['profileInfo']);
+      profileInfo = McfDataProfileInfo.fromJson(
+          _json['profileInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = McfDataQuery.fromJson(_json['query']);
+      query = McfDataQuery.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
           .map<core.List<McfDataRows>>((value) => (value as core.List)
-              .map<McfDataRows>((value) => McfDataRows.fromJson(value))
+              .map<McfDataRows>((value) => McfDataRows.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
               .toList())
           .toList();
     }
@@ -11703,7 +11985,8 @@
     }
     if (_json.containsKey('totalsForAllResults')) {
       totalsForAllResults = commons.mapMap<core.String, core.String>(
-          _json['totalsForAllResults'].cast<core.String, core.String>(),
+          (_json['totalsForAllResults'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -11955,7 +12238,8 @@
       botFilteringEnabled = _json['botFilteringEnabled'] as core.bool;
     }
     if (_json.containsKey('childLink')) {
-      childLink = ProfileChildLink.fromJson(_json['childLink']);
+      childLink = ProfileChildLink.fromJson(
+          _json['childLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = core.DateTime.parse(_json['created'] as core.String);
@@ -11989,10 +12273,12 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = ProfileParentLink.fromJson(_json['parentLink']);
+      parentLink = ProfileParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('permissions')) {
-      permissions = ProfilePermissions.fromJson(_json['permissions']);
+      permissions = ProfilePermissions.fromJson(
+          _json['permissions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -12152,7 +12438,8 @@
 
   ProfileFilterLink.fromJson(core.Map _json) {
     if (_json.containsKey('filterRef')) {
-      filterRef = FilterRef.fromJson(_json['filterRef']);
+      filterRef = FilterRef.fromJson(
+          _json['filterRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -12161,7 +12448,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('profileRef')) {
-      profileRef = ProfileRef.fromJson(_json['profileRef']);
+      profileRef = ProfileRef.fromJson(
+          _json['profileRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rank')) {
       rank = _json['rank'] as core.int;
@@ -12233,7 +12521,8 @@
   ProfileFilterLinks.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ProfileFilterLink>((value) => ProfileFilterLink.fromJson(value))
+          .map<ProfileFilterLink>((value) => ProfileFilterLink.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -12463,7 +12752,8 @@
   Profiles.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Profile>((value) => Profile.fromJson(value))
+          .map<Profile>((value) =>
+              Profile.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -12740,8 +13030,9 @@
   RealtimeData.fromJson(core.Map _json) {
     if (_json.containsKey('columnHeaders')) {
       columnHeaders = (_json['columnHeaders'] as core.List)
-          .map<RealtimeDataColumnHeaders>(
-              (value) => RealtimeDataColumnHeaders.fromJson(value))
+          .map<RealtimeDataColumnHeaders>((value) =>
+              RealtimeDataColumnHeaders.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -12751,10 +13042,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('profileInfo')) {
-      profileInfo = RealtimeDataProfileInfo.fromJson(_json['profileInfo']);
+      profileInfo = RealtimeDataProfileInfo.fromJson(
+          _json['profileInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = RealtimeDataQuery.fromJson(_json['query']);
+      query = RealtimeDataQuery.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
@@ -12771,7 +13064,8 @@
     }
     if (_json.containsKey('totalsForAllResults')) {
       totalsForAllResults = commons.mapMap<core.String, core.String>(
-          _json['totalsForAllResults'].cast<core.String, core.String>(),
+          (_json['totalsForAllResults'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -12820,8 +13114,8 @@
 
   RemarketingAudienceAudienceDefinition.fromJson(core.Map _json) {
     if (_json.containsKey('includeConditions')) {
-      includeConditions =
-          IncludeConditions.fromJson(_json['includeConditions']);
+      includeConditions = IncludeConditions.fromJson(
+          _json['includeConditions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12883,11 +13177,12 @@
     if (_json.containsKey('excludeConditions')) {
       excludeConditions =
           RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions
-              .fromJson(_json['excludeConditions']);
+              .fromJson(_json['excludeConditions']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('includeConditions')) {
-      includeConditions =
-          IncludeConditions.fromJson(_json['includeConditions']);
+      includeConditions = IncludeConditions.fromJson(
+          _json['includeConditions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12960,7 +13255,7 @@
     }
     if (_json.containsKey('audienceDefinition')) {
       audienceDefinition = RemarketingAudienceAudienceDefinition.fromJson(
-          _json['audienceDefinition']);
+          _json['audienceDefinition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('audienceType')) {
       audienceType = _json['audienceType'] as core.String;
@@ -12982,8 +13277,8 @@
     }
     if (_json.containsKey('linkedAdAccounts')) {
       linkedAdAccounts = (_json['linkedAdAccounts'] as core.List)
-          .map<LinkedForeignAccount>(
-              (value) => LinkedForeignAccount.fromJson(value))
+          .map<LinkedForeignAccount>((value) => LinkedForeignAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('linkedViews')) {
@@ -12997,7 +13292,8 @@
     if (_json.containsKey('stateBasedAudienceDefinition')) {
       stateBasedAudienceDefinition =
           RemarketingAudienceStateBasedAudienceDefinition.fromJson(
-              _json['stateBasedAudienceDefinition']);
+              _json['stateBasedAudienceDefinition']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updated')) {
       updated = core.DateTime.parse(_json['updated'] as core.String);
@@ -13095,8 +13391,8 @@
   RemarketingAudiences.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<RemarketingAudience>(
-              (value) => RemarketingAudience.fromJson(value))
+          .map<RemarketingAudience>((value) => RemarketingAudience.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -13284,7 +13580,8 @@
   Segments.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Segment>((value) => Segment.fromJson(value))
+          .map<Segment>((value) =>
+              Segment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -13466,7 +13763,8 @@
     if (_json.containsKey('cloudStorageDownloadDetails')) {
       cloudStorageDownloadDetails =
           UnsampledReportCloudStorageDownloadDetails.fromJson(
-              _json['cloudStorageDownloadDetails']);
+              _json['cloudStorageDownloadDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = core.DateTime.parse(_json['created'] as core.String);
@@ -13479,7 +13777,7 @@
     }
     if (_json.containsKey('driveDownloadDetails')) {
       driveDownloadDetails = UnsampledReportDriveDownloadDetails.fromJson(
-          _json['driveDownloadDetails']);
+          _json['driveDownloadDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('end-date')) {
       end_date = _json['end-date'] as core.String;
@@ -13625,7 +13923,8 @@
   UnsampledReports.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<UnsampledReport>((value) => UnsampledReport.fromJson(value))
+          .map<UnsampledReport>((value) => UnsampledReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -13795,7 +14094,8 @@
   Uploads.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Upload>((value) => Upload.fromJson(value))
+          .map<Upload>((value) =>
+              Upload.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -13908,7 +14208,8 @@
       firebaseProjectId = _json['firebaseProjectId'] as core.String;
     }
     if (_json.containsKey('id')) {
-      id = UserDeletionRequestId.fromJson(_json['id']);
+      id = UserDeletionRequestId.fromJson(
+          _json['id'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -14097,7 +14398,8 @@
     }
     if (_json.containsKey('profiles')) {
       profiles = (_json['profiles'] as core.List)
-          .map<ProfileSummary>((value) => ProfileSummary.fromJson(value))
+          .map<ProfileSummary>((value) => ProfileSummary.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('starred')) {
@@ -14176,7 +14478,8 @@
   Webproperties.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Webproperty>((value) => Webproperty.fromJson(value))
+          .map<Webproperty>((value) => Webproperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsPerPage')) {
@@ -14396,7 +14699,8 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('childLink')) {
-      childLink = WebpropertyChildLink.fromJson(_json['childLink']);
+      childLink = WebpropertyChildLink.fromJson(
+          _json['childLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = core.DateTime.parse(_json['created'] as core.String);
@@ -14430,10 +14734,12 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parentLink')) {
-      parentLink = WebpropertyParentLink.fromJson(_json['parentLink']);
+      parentLink = WebpropertyParentLink.fromJson(
+          _json['parentLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('permissions')) {
-      permissions = WebpropertyPermissions.fromJson(_json['permissions']);
+      permissions = WebpropertyPermissions.fromJson(
+          _json['permissions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('profileCount')) {
       profileCount = _json['profileCount'] as core.int;
diff --git a/generated/googleapis/lib/analyticsreporting/v4.dart b/generated/googleapis/lib/analyticsreporting/v4.dart
index d1a5bc9..1b4fc56 100644
--- a/generated/googleapis/lib/analyticsreporting/v4.dart
+++ b/generated/googleapis/lib/analyticsreporting/v4.dart
@@ -102,7 +102,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetReportsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetReportsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -156,7 +159,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchUserActivityResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchUserActivityResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -261,7 +267,8 @@
       activityType = _json['activityType'] as core.String;
     }
     if (_json.containsKey('appview')) {
-      appview = ScreenviewData.fromJson(_json['appview']);
+      appview = ScreenviewData.fromJson(
+          _json['appview'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('campaign')) {
       campaign = _json['campaign'] as core.String;
@@ -271,17 +278,21 @@
     }
     if (_json.containsKey('customDimension')) {
       customDimension = (_json['customDimension'] as core.List)
-          .map<CustomDimension>((value) => CustomDimension.fromJson(value))
+          .map<CustomDimension>((value) => CustomDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('ecommerce')) {
-      ecommerce = EcommerceData.fromJson(_json['ecommerce']);
+      ecommerce = EcommerceData.fromJson(
+          _json['ecommerce'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('event')) {
-      event = EventData.fromJson(_json['event']);
+      event = EventData.fromJson(
+          _json['event'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('goals')) {
-      goals = GoalSetData.fromJson(_json['goals']);
+      goals = GoalSetData.fromJson(
+          _json['goals'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hostname')) {
       hostname = _json['hostname'] as core.String;
@@ -296,7 +307,8 @@
       medium = _json['medium'] as core.String;
     }
     if (_json.containsKey('pageview')) {
-      pageview = PageviewData.fromJson(_json['pageview']);
+      pageview = PageviewData.fromJson(
+          _json['pageview'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('source')) {
       source = _json['source'] as core.String;
@@ -389,7 +401,8 @@
 
   Cohort.fromJson(core.Map _json) {
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -449,7 +462,8 @@
   CohortGroup.fromJson(core.Map _json) {
     if (_json.containsKey('cohorts')) {
       cohorts = (_json['cohorts'] as core.List)
-          .map<Cohort>((value) => Cohort.fromJson(value))
+          .map<Cohort>((value) =>
+              Cohort.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lifetimeValue')) {
@@ -486,7 +500,8 @@
           .toList();
     }
     if (_json.containsKey('metricHeader')) {
-      metricHeader = MetricHeader.fromJson(_json['metricHeader']);
+      metricHeader = MetricHeader.fromJson(
+          _json['metricHeader'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -581,7 +596,8 @@
   DateRangeValues.fromJson(core.Map _json) {
     if (_json.containsKey('pivotValueRegions')) {
       pivotValueRegions = (_json['pivotValueRegions'] as core.List)
-          .map<PivotValueRegion>((value) => PivotValueRegion.fromJson(value))
+          .map<PivotValueRegion>((value) => PivotValueRegion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('values')) {
@@ -770,7 +786,8 @@
   DimensionFilterClause.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<DimensionFilter>((value) => DimensionFilter.fromJson(value))
+          .map<DimensionFilter>((value) => DimensionFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operator')) {
@@ -809,10 +826,12 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('sessionSegment')) {
-      sessionSegment = SegmentDefinition.fromJson(_json['sessionSegment']);
+      sessionSegment = SegmentDefinition.fromJson(
+          _json['sessionSegment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userSegment')) {
-      userSegment = SegmentDefinition.fromJson(_json['userSegment']);
+      userSegment = SegmentDefinition.fromJson(
+          _json['userSegment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -872,11 +891,13 @@
     }
     if (_json.containsKey('products')) {
       products = (_json['products'] as core.List)
-          .map<ProductData>((value) => ProductData.fromJson(value))
+          .map<ProductData>((value) => ProductData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('transaction')) {
-      transaction = TransactionData.fromJson(_json['transaction']);
+      transaction = TransactionData.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -978,7 +999,8 @@
   GetReportsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('reportRequests')) {
       reportRequests = (_json['reportRequests'] as core.List)
-          .map<ReportRequest>((value) => ReportRequest.fromJson(value))
+          .map<ReportRequest>((value) => ReportRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('useResourceQuotas')) {
@@ -1020,12 +1042,14 @@
     }
     if (_json.containsKey('reports')) {
       reports = (_json['reports'] as core.List)
-          .map<Report>((value) => Report.fromJson(value))
+          .map<Report>((value) =>
+              Report.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resourceQuotasRemaining')) {
-      resourceQuotasRemaining =
-          ResourceQuotasRemaining.fromJson(_json['resourceQuotasRemaining']);
+      resourceQuotasRemaining = ResourceQuotasRemaining.fromJson(
+          _json['resourceQuotasRemaining']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1139,7 +1163,8 @@
   GoalSetData.fromJson(core.Map _json) {
     if (_json.containsKey('goals')) {
       goals = (_json['goals'] as core.List)
-          .map<GoalData>((value) => GoalData.fromJson(value))
+          .map<GoalData>((value) =>
+              GoalData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1299,7 +1324,8 @@
   MetricFilterClause.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<MetricFilter>((value) => MetricFilter.fromJson(value))
+          .map<MetricFilter>((value) => MetricFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operator')) {
@@ -1332,12 +1358,14 @@
   MetricHeader.fromJson(core.Map _json) {
     if (_json.containsKey('metricHeaderEntries')) {
       metricHeaderEntries = (_json['metricHeaderEntries'] as core.List)
-          .map<MetricHeaderEntry>((value) => MetricHeaderEntry.fromJson(value))
+          .map<MetricHeaderEntry>((value) => MetricHeaderEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pivotHeaders')) {
       pivotHeaders = (_json['pivotHeaders'] as core.List)
-          .map<PivotHeader>((value) => PivotHeader.fromJson(value))
+          .map<PivotHeader>((value) => PivotHeader.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1405,8 +1433,8 @@
   OrFiltersForSegment.fromJson(core.Map _json) {
     if (_json.containsKey('segmentFilterClauses')) {
       segmentFilterClauses = (_json['segmentFilterClauses'] as core.List)
-          .map<SegmentFilterClause>(
-              (value) => SegmentFilterClause.fromJson(value))
+          .map<SegmentFilterClause>((value) => SegmentFilterClause.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1562,13 +1590,14 @@
   Pivot.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionFilterClauses')) {
       dimensionFilterClauses = (_json['dimensionFilterClauses'] as core.List)
-          .map<DimensionFilterClause>(
-              (value) => DimensionFilterClause.fromJson(value))
+          .map<DimensionFilterClause>((value) => DimensionFilterClause.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxGroupCount')) {
@@ -1576,7 +1605,8 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startGroup')) {
@@ -1619,7 +1649,8 @@
   PivotHeader.fromJson(core.Map _json) {
     if (_json.containsKey('pivotHeaderEntries')) {
       pivotHeaderEntries = (_json['pivotHeaderEntries'] as core.List)
-          .map<PivotHeaderEntry>((value) => PivotHeaderEntry.fromJson(value))
+          .map<PivotHeaderEntry>((value) => PivotHeaderEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalPivotGroupsCount')) {
@@ -1666,7 +1697,8 @@
           .toList();
     }
     if (_json.containsKey('metric')) {
-      metric = MetricHeaderEntry.fromJson(_json['metric']);
+      metric = MetricHeaderEntry.fromJson(
+          _json['metric'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1774,10 +1806,12 @@
 
   Report.fromJson(core.Map _json) {
     if (_json.containsKey('columnHeader')) {
-      columnHeader = ColumnHeader.fromJson(_json['columnHeader']);
+      columnHeader = ColumnHeader.fromJson(
+          _json['columnHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('data')) {
-      data = ReportData.fromJson(_json['data']);
+      data = ReportData.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -1861,12 +1895,14 @@
     }
     if (_json.containsKey('maximums')) {
       maximums = (_json['maximums'] as core.List)
-          .map<DateRangeValues>((value) => DateRangeValues.fromJson(value))
+          .map<DateRangeValues>((value) => DateRangeValues.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('minimums')) {
       minimums = (_json['minimums'] as core.List)
-          .map<DateRangeValues>((value) => DateRangeValues.fromJson(value))
+          .map<DateRangeValues>((value) => DateRangeValues.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rowCount')) {
@@ -1874,7 +1910,8 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<ReportRow>((value) => ReportRow.fromJson(value))
+          .map<ReportRow>((value) =>
+              ReportRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('samplesReadCounts')) {
@@ -1889,7 +1926,8 @@
     }
     if (_json.containsKey('totals')) {
       totals = (_json['totals'] as core.List)
-          .map<DateRangeValues>((value) => DateRangeValues.fromJson(value))
+          .map<DateRangeValues>((value) => DateRangeValues.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2046,22 +2084,25 @@
 
   ReportRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cohortGroup')) {
-      cohortGroup = CohortGroup.fromJson(_json['cohortGroup']);
+      cohortGroup = CohortGroup.fromJson(
+          _json['cohortGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dateRanges')) {
       dateRanges = (_json['dateRanges'] as core.List)
-          .map<DateRange>((value) => DateRange.fromJson(value))
+          .map<DateRange>((value) =>
+              DateRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensionFilterClauses')) {
       dimensionFilterClauses = (_json['dimensionFilterClauses'] as core.List)
-          .map<DimensionFilterClause>(
-              (value) => DimensionFilterClause.fromJson(value))
+          .map<DimensionFilterClause>((value) => DimensionFilterClause.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('filtersExpression')) {
@@ -2078,18 +2119,20 @@
     }
     if (_json.containsKey('metricFilterClauses')) {
       metricFilterClauses = (_json['metricFilterClauses'] as core.List)
-          .map<MetricFilterClause>(
-              (value) => MetricFilterClause.fromJson(value))
+          .map<MetricFilterClause>((value) => MetricFilterClause.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('orderBys')) {
       orderBys = (_json['orderBys'] as core.List)
-          .map<OrderBy>((value) => OrderBy.fromJson(value))
+          .map<OrderBy>((value) =>
+              OrderBy.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageSize')) {
@@ -2100,7 +2143,8 @@
     }
     if (_json.containsKey('pivots')) {
       pivots = (_json['pivots'] as core.List)
-          .map<Pivot>((value) => Pivot.fromJson(value))
+          .map<Pivot>((value) =>
+              Pivot.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('samplingLevel')) {
@@ -2108,7 +2152,8 @@
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
-          .map<Segment>((value) => Segment.fromJson(value))
+          .map<Segment>((value) =>
+              Segment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('viewId')) {
@@ -2193,7 +2238,8 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<DateRangeValues>((value) => DateRangeValues.fromJson(value))
+          .map<DateRangeValues>((value) => DateRangeValues.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2336,7 +2382,8 @@
           .toList();
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageSize')) {
       pageSize = _json['pageSize'] as core.int;
@@ -2345,7 +2392,8 @@
       pageToken = _json['pageToken'] as core.String;
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('viewId')) {
       viewId = _json['viewId'] as core.String;
@@ -2407,8 +2455,8 @@
     }
     if (_json.containsKey('sessions')) {
       sessions = (_json['sessions'] as core.List)
-          .map<UserActivitySession>(
-              (value) => UserActivitySession.fromJson(value))
+          .map<UserActivitySession>((value) => UserActivitySession.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalRows')) {
@@ -2448,7 +2496,8 @@
 
   Segment.fromJson(core.Map _json) {
     if (_json.containsKey('dynamicSegment')) {
-      dynamicSegment = DynamicSegment.fromJson(_json['dynamicSegment']);
+      dynamicSegment = DynamicSegment.fromJson(
+          _json['dynamicSegment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segmentId')) {
       segmentId = _json['segmentId'] as core.String;
@@ -2479,7 +2528,8 @@
   SegmentDefinition.fromJson(core.Map _json) {
     if (_json.containsKey('segmentFilters')) {
       segmentFilters = (_json['segmentFilters'] as core.List)
-          .map<SegmentFilter>((value) => SegmentFilter.fromJson(value))
+          .map<SegmentFilter>((value) => SegmentFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2619,10 +2669,12 @@
       not = _json['not'] as core.bool;
     }
     if (_json.containsKey('sequenceSegment')) {
-      sequenceSegment = SequenceSegment.fromJson(_json['sequenceSegment']);
+      sequenceSegment = SequenceSegment.fromJson(
+          _json['sequenceSegment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('simpleSegment')) {
-      simpleSegment = SimpleSegment.fromJson(_json['simpleSegment']);
+      simpleSegment = SimpleSegment.fromJson(
+          _json['simpleSegment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2657,11 +2709,12 @@
 
   SegmentFilterClause.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionFilter')) {
-      dimensionFilter =
-          SegmentDimensionFilter.fromJson(_json['dimensionFilter']);
+      dimensionFilter = SegmentDimensionFilter.fromJson(
+          _json['dimensionFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricFilter')) {
-      metricFilter = SegmentMetricFilter.fromJson(_json['metricFilter']);
+      metricFilter = SegmentMetricFilter.fromJson(
+          _json['metricFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('not')) {
       not = _json['not'] as core.bool;
@@ -2789,8 +2842,8 @@
     }
     if (_json.containsKey('orFiltersForSegment')) {
       orFiltersForSegment = (_json['orFiltersForSegment'] as core.List)
-          .map<OrFiltersForSegment>(
-              (value) => OrFiltersForSegment.fromJson(value))
+          .map<OrFiltersForSegment>((value) => OrFiltersForSegment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2828,8 +2881,8 @@
     }
     if (_json.containsKey('segmentSequenceSteps')) {
       segmentSequenceSteps = (_json['segmentSequenceSteps'] as core.List)
-          .map<SegmentSequenceStep>(
-              (value) => SegmentSequenceStep.fromJson(value))
+          .map<SegmentSequenceStep>((value) => SegmentSequenceStep.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2859,8 +2912,8 @@
   SimpleSegment.fromJson(core.Map _json) {
     if (_json.containsKey('orFiltersForSegment')) {
       orFiltersForSegment = (_json['orFiltersForSegment'] as core.List)
-          .map<OrFiltersForSegment>(
-              (value) => OrFiltersForSegment.fromJson(value))
+          .map<OrFiltersForSegment>((value) => OrFiltersForSegment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2994,7 +3047,8 @@
   UserActivitySession.fromJson(core.Map _json) {
     if (_json.containsKey('activities')) {
       activities = (_json['activities'] as core.List)
-          .map<Activity>((value) => Activity.fromJson(value))
+          .map<Activity>((value) =>
+              Activity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dataSource')) {
diff --git a/generated/googleapis/lib/androiddeviceprovisioning/v1.dart b/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
index e6a3edb..d50b6ab 100644
--- a/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
+++ b/generated/googleapis/lib/androiddeviceprovisioning/v1.dart
@@ -110,8 +110,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CustomerListCustomersResponse.fromJson(data));
+    return _response.then(
+      (data) => CustomerListCustomersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -177,7 +179,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Configuration.fromJson(data));
+    return _response.then(
+      (data) =>
+          Configuration.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an unused configuration. The API call fails if the customer has
@@ -229,7 +234,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a configuration.
@@ -279,7 +286,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Configuration.fromJson(data));
+    return _response.then(
+      (data) =>
+          Configuration.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a customer's configurations.
@@ -331,8 +341,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CustomerListConfigurationsResponse.fromJson(data));
+    return _response.then(
+      (data) => CustomerListConfigurationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a configuration's field values.
@@ -399,7 +411,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Configuration.fromJson(data));
+    return _response.then(
+      (data) =>
+          Configuration.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -467,7 +482,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a device.
@@ -517,7 +534,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a customer's devices.
@@ -581,7 +600,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomerListDevicesResponse.fromJson(data));
+    return _response.then(
+      (data) => CustomerListDevicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a configuration from device.
@@ -639,7 +661,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unclaims a device from a customer and removes it from zero-touch
@@ -699,7 +723,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -756,7 +782,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomerListDpcsResponse.fromJson(data));
+    return _response.then(
+      (data) => CustomerListDpcsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -813,7 +842,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -894,7 +925,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Company.fromJson(data));
+    return _response.then(
+      (data) => Company.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the customers that are enrolled to the reseller identified by the
@@ -961,7 +994,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCustomersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCustomersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1026,7 +1062,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ClaimDeviceResponse.fromJson(data));
+    return _response.then(
+      (data) => ClaimDeviceResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Claims a batch of devices for a customer asynchronously. Adds the devices
@@ -1085,7 +1124,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finds devices by hardware identifiers, such as IMEI.
@@ -1142,8 +1183,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => FindDevicesByDeviceIdentifierResponse.fromJson(data));
+    return _response.then(
+      (data) => FindDevicesByDeviceIdentifierResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finds devices claimed for customers. The results only contain devices
@@ -1203,7 +1246,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FindDevicesByOwnerResponse.fromJson(data));
+    return _response.then(
+      (data) => FindDevicesByOwnerResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a device.
@@ -1253,7 +1299,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates reseller metadata associated with the device.
@@ -1320,7 +1368,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeviceMetadata.fromJson(data));
+    return _response.then(
+      (data) =>
+          DeviceMetadata.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unclaims a device from a customer and removes it from zero-touch
@@ -1378,7 +1429,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unclaims a batch of devices for a customer asynchronously. Removes the
@@ -1437,7 +1490,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the reseller metadata attached to a batch of devices. This method
@@ -1497,7 +1552,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1570,7 +1627,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListVendorsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListVendorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1641,7 +1701,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListVendorCustomersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListVendorCustomersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1670,10 +1733,12 @@
       customerId = _json['customerId'] as core.String;
     }
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceMetadata')) {
-      deviceMetadata = DeviceMetadata.fromJson(_json['deviceMetadata']);
+      deviceMetadata = DeviceMetadata.fromJson(
+          _json['deviceMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sectionType')) {
       sectionType = _json['sectionType'] as core.String;
@@ -1742,7 +1807,8 @@
   ClaimDevicesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('claims')) {
       claims = (_json['claims'] as core.List)
-          .map<PartnerClaim>((value) => PartnerClaim.fromJson(value))
+          .map<PartnerClaim>((value) => PartnerClaim.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1987,7 +2053,8 @@
 
   CreateCustomerRequest.fromJson(core.Map _json) {
     if (_json.containsKey('customer')) {
-      customer = Company.fromJson(_json['customer']);
+      customer = Company.fromJson(
+          _json['customer'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2016,7 +2083,8 @@
       configuration = _json['configuration'] as core.String;
     }
     if (_json.containsKey('device')) {
-      device = DeviceReference.fromJson(_json['device']);
+      device = DeviceReference.fromJson(
+          _json['device'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2042,7 +2110,8 @@
   CustomerListConfigurationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('configurations')) {
       configurations = (_json['configurations'] as core.List)
-          .map<Configuration>((value) => Configuration.fromJson(value))
+          .map<Configuration>((value) => Configuration.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2071,7 +2140,8 @@
   CustomerListCustomersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('customers')) {
       customers = (_json['customers'] as core.List)
-          .map<Company>((value) => Company.fromJson(value))
+          .map<Company>((value) =>
+              Company.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2105,7 +2175,8 @@
   CustomerListDevicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<Device>((value) => Device.fromJson(value))
+          .map<Device>((value) =>
+              Device.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2136,7 +2207,8 @@
   CustomerListDpcsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dpcs')) {
       dpcs = (_json['dpcs'] as core.List)
-          .map<Dpc>((value) => Dpc.fromJson(value))
+          .map<Dpc>((value) =>
+              Dpc.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2159,7 +2231,8 @@
 
   CustomerRemoveConfigurationRequest.fromJson(core.Map _json) {
     if (_json.containsKey('device')) {
-      device = DeviceReference.fromJson(_json['device']);
+      device = DeviceReference.fromJson(
+          _json['device'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2181,7 +2254,8 @@
 
   CustomerUnclaimDeviceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('device')) {
-      device = DeviceReference.fromJson(_json['device']);
+      device = DeviceReference.fromJson(
+          _json['device'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2227,7 +2301,8 @@
   Device.fromJson(core.Map _json) {
     if (_json.containsKey('claims')) {
       claims = (_json['claims'] as core.List)
-          .map<DeviceClaim>((value) => DeviceClaim.fromJson(value))
+          .map<DeviceClaim>((value) => DeviceClaim.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('configuration')) {
@@ -2237,10 +2312,12 @@
       deviceId = _json['deviceId'] as core.String;
     }
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceMetadata')) {
-      deviceMetadata = DeviceMetadata.fromJson(_json['deviceMetadata']);
+      deviceMetadata = DeviceMetadata.fromJson(
+          _json['deviceMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2415,7 +2492,8 @@
   DeviceMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = commons.mapMap<core.String, core.String>(
-          _json['entries'].cast<core.String, core.String>(),
+          (_json['entries'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -2450,7 +2528,8 @@
       deviceId = _json['deviceId'] as core.String;
     }
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2537,8 +2616,8 @@
   DevicesLongRunningOperationResponse.fromJson(core.Map _json) {
     if (_json.containsKey('perDeviceStatus')) {
       perDeviceStatus = (_json['perDeviceStatus'] as core.List)
-          .map<OperationPerDevice>(
-              (value) => OperationPerDevice.fromJson(value))
+          .map<OperationPerDevice>((value) => OperationPerDevice.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('successCount')) {
@@ -2643,7 +2722,8 @@
 
   FindDevicesByDeviceIdentifierRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('limit')) {
       limit = _json['limit'] as core.String;
@@ -2685,7 +2765,8 @@
   FindDevicesByDeviceIdentifierResponse.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<Device>((value) => Device.fromJson(value))
+          .map<Device>((value) =>
+              Device.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2784,7 +2865,8 @@
   FindDevicesByOwnerResponse.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<Device>((value) => Device.fromJson(value))
+          .map<Device>((value) =>
+              Device.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2827,7 +2909,8 @@
   ListCustomersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('customers')) {
       customers = (_json['customers'] as core.List)
-          .map<Company>((value) => Company.fromJson(value))
+          .map<Company>((value) =>
+              Company.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2870,7 +2953,8 @@
   ListVendorCustomersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('customers')) {
       customers = (_json['customers'] as core.List)
-          .map<Company>((value) => Company.fromJson(value))
+          .map<Company>((value) =>
+              Company.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2920,7 +3004,8 @@
     }
     if (_json.containsKey('vendors')) {
       vendors = (_json['vendors'] as core.List)
-          .map<Company>((value) => Company.fromJson(value))
+          .map<Company>((value) =>
+              Company.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2982,11 +3067,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2994,7 +3081,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3039,17 +3127,20 @@
 
   OperationPerDevice.fromJson(core.Map _json) {
     if (_json.containsKey('claim')) {
-      claim = PartnerClaim.fromJson(_json['claim']);
+      claim = PartnerClaim.fromJson(
+          _json['claim'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('result')) {
-      result = PerDeviceStatusInBatch.fromJson(_json['result']);
+      result = PerDeviceStatusInBatch.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unclaim')) {
-      unclaim = PartnerUnclaim.fromJson(_json['unclaim']);
+      unclaim = PartnerUnclaim.fromJson(
+          _json['unclaim'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMetadata')) {
-      updateMetadata =
-          UpdateMetadataArguments.fromJson(_json['updateMetadata']);
+      updateMetadata = UpdateMetadataArguments.fromJson(
+          _json['updateMetadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3096,10 +3187,12 @@
       customerId = _json['customerId'] as core.String;
     }
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceMetadata')) {
-      deviceMetadata = DeviceMetadata.fromJson(_json['deviceMetadata']);
+      deviceMetadata = DeviceMetadata.fromJson(
+          _json['deviceMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sectionType')) {
       sectionType = _json['sectionType'] as core.String;
@@ -3153,7 +3246,8 @@
       deviceId = _json['deviceId'] as core.String;
     }
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sectionType')) {
       sectionType = _json['sectionType'] as core.String;
@@ -3281,7 +3375,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3334,7 +3429,8 @@
       deviceId = _json['deviceId'] as core.String;
     }
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sectionType')) {
       sectionType = _json['sectionType'] as core.String;
@@ -3378,7 +3474,8 @@
   UnclaimDevicesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('unclaims')) {
       unclaims = (_json['unclaims'] as core.List)
-          .map<PartnerUnclaim>((value) => PartnerUnclaim.fromJson(value))
+          .map<PartnerUnclaim>((value) => PartnerUnclaim.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3402,8 +3499,9 @@
   UpdateDeviceMetadataInBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('updates')) {
       updates = (_json['updates'] as core.List)
-          .map<UpdateMetadataArguments>(
-              (value) => UpdateMetadataArguments.fromJson(value))
+          .map<UpdateMetadataArguments>((value) =>
+              UpdateMetadataArguments.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3426,7 +3524,8 @@
 
   UpdateDeviceMetadataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deviceMetadata')) {
-      deviceMetadata = DeviceMetadata.fromJson(_json['deviceMetadata']);
+      deviceMetadata = DeviceMetadata.fromJson(
+          _json['deviceMetadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3457,10 +3556,12 @@
       deviceId = _json['deviceId'] as core.String;
     }
     if (_json.containsKey('deviceIdentifier')) {
-      deviceIdentifier = DeviceIdentifier.fromJson(_json['deviceIdentifier']);
+      deviceIdentifier = DeviceIdentifier.fromJson(
+          _json['deviceIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceMetadata')) {
-      deviceMetadata = DeviceMetadata.fromJson(_json['deviceMetadata']);
+      deviceMetadata = DeviceMetadata.fromJson(
+          _json['deviceMetadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/androidenterprise/v1.dart b/generated/googleapis/lib/androidenterprise/v1.dart
index 1e8bcc8..b76c25d 100644
--- a/generated/googleapis/lib/androidenterprise/v1.dart
+++ b/generated/googleapis/lib/androidenterprise/v1.dart
@@ -143,7 +143,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves the details of a device.
@@ -208,7 +210,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves whether a device's access to Google services is enabled or
@@ -278,7 +282,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeviceState.fromJson(data));
+    return _response.then(
+      (data) =>
+          DeviceState.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the IDs of all of a user's devices.
@@ -336,7 +343,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DevicesListResponse.fromJson(data));
+    return _response.then(
+      (data) => DevicesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets whether a device's access to Google services is enabled or disabled.
@@ -412,7 +422,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeviceState.fromJson(data));
+    return _response.then(
+      (data) =>
+          DeviceState.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the device policy
@@ -491,7 +504,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -548,7 +563,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Completes the signup flow, by specifying the Completion token and
@@ -605,7 +622,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Enterprise.fromJson(data));
+    return _response.then(
+      (data) =>
+          Enterprise.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a unique token to access an embeddable UI. To generate a web UI,
@@ -664,7 +684,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdministratorWebToken.fromJson(data));
+    return _response.then(
+      (data) => AdministratorWebToken.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enrolls an enterprise with the calling EMM.
@@ -720,7 +743,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Enterprise.fromJson(data));
+    return _response.then(
+      (data) =>
+          Enterprise.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Generates a sign-up URL.
@@ -775,7 +801,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SignupInfo.fromJson(data));
+    return _response.then(
+      (data) =>
+          SignupInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the name and domain of an enterprise.
@@ -824,7 +853,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Enterprise.fromJson(data));
+    return _response.then(
+      (data) =>
+          Enterprise.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a service account and credentials. The service account can be
@@ -898,7 +930,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServiceAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the store layout for the enterprise. If the store layout has not
@@ -949,7 +984,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StoreLayout.fromJson(data));
+    return _response.then(
+      (data) =>
+          StoreLayout.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up an enterprise by domain name. This is only supported for
@@ -1003,7 +1041,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EnterprisesListResponse.fromJson(data));
+    return _response.then(
+      (data) => EnterprisesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Pulls and returns a notification set for the enterprises associated with
@@ -1075,7 +1116,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationSet.fromJson(data));
+    return _response.then(
+      (data) =>
+          NotificationSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sends a test notification to validate the EMM integration with the Google
@@ -1128,7 +1172,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => EnterprisesSendTestPushNotificationResponse.fromJson(data));
+      (data) => EnterprisesSendTestPushNotificationResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the account that will be used to authenticate to the API as the
@@ -1185,7 +1231,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EnterpriseAccount.fromJson(data));
+    return _response.then(
+      (data) => EnterpriseAccount.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the store layout for the enterprise. By default, storeLayoutType is
@@ -1247,7 +1296,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StoreLayout.fromJson(data));
+    return _response.then(
+      (data) =>
+          StoreLayout.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unenrolls an enterprise from the calling EMM.
@@ -1297,7 +1349,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -1369,7 +1423,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves details of an entitlement.
@@ -1435,7 +1491,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Entitlement.fromJson(data));
+    return _response.then(
+      (data) =>
+          Entitlement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all entitlements for the specified user. Only the ID is set.
@@ -1493,7 +1552,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EntitlementsListResponse.fromJson(data));
+    return _response.then(
+      (data) => EntitlementsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds or updates an entitlement to an app for a user.
@@ -1574,7 +1636,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Entitlement.fromJson(data));
+    return _response.then(
+      (data) =>
+          Entitlement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1638,7 +1703,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GroupLicense.fromJson(data));
+    return _response.then(
+      (data) =>
+          GroupLicense.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves IDs of all products for which the enterprise has a group
@@ -1689,7 +1757,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GroupLicensesListResponse.fromJson(data));
+    return _response.then(
+      (data) => GroupLicensesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1756,8 +1827,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GroupLicenseUsersListResponse.fromJson(data));
+    return _response.then(
+      (data) => GroupLicenseUsersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1838,7 +1911,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves details of an installation of an app on a device.
@@ -1912,7 +1987,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Install.fromJson(data));
+    return _response.then(
+      (data) => Install.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the details of all apps installed on the specified device.
@@ -1978,7 +2055,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstallsListResponse.fromJson(data));
+    return _response.then(
+      (data) => InstallsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Requests to install the latest version of an app to a device. If the app
@@ -2060,7 +2140,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Install.fromJson(data));
+    return _response.then(
+      (data) => Install.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2143,7 +2225,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves details of a per-device managed configuration.
@@ -2218,7 +2302,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedConfiguration.fromJson(data));
+    return _response.then(
+      (data) => ManagedConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the per-device managed configurations for the specified device.
@@ -2286,7 +2373,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ManagedConfigurationsForDeviceListResponse.fromJson(data));
+      (data) => ManagedConfigurationsForDeviceListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds or updates a per-device managed configuration for an app for the
@@ -2368,7 +2457,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedConfiguration.fromJson(data));
+    return _response.then(
+      (data) => ManagedConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2443,7 +2535,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves details of a per-user managed configuration for an app for the
@@ -2511,7 +2605,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedConfiguration.fromJson(data));
+    return _response.then(
+      (data) => ManagedConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the per-user managed configurations for the specified user. Only
@@ -2571,7 +2668,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ManagedConfigurationsForUserListResponse.fromJson(data));
+      (data) => ManagedConfigurationsForUserListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds or updates the managed configuration settings for an app for the
@@ -2649,7 +2748,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedConfiguration.fromJson(data));
+    return _response.then(
+      (data) => ManagedConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2716,7 +2818,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ManagedConfigurationsSettingsListResponse.fromJson(data));
+      (data) => ManagedConfigurationsSettingsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2779,7 +2883,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2853,7 +2960,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Generates a URL that can be rendered in an iframe to display the
@@ -2925,8 +3034,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ProductsGenerateApprovalUrlResponse.fromJson(data));
+    return _response.then(
+      (data) => ProductsGenerateApprovalUrlResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves details of a product for display to an enterprise admin.
@@ -2990,7 +3101,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the schema that defines the configurable properties for this
@@ -3060,7 +3173,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppRestrictionsSchema.fromJson(data));
+    return _response.then(
+      (data) => AppRestrictionsSchema.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the Android app permissions required by this app.
@@ -3118,7 +3234,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductPermissions.fromJson(data));
+    return _response.then(
+      (data) => ProductPermissions.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finds approved products that match a query, or all approved products if
@@ -3208,7 +3327,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ProductsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unapproves the specified product (and the relevant app permissions, if
@@ -3267,7 +3389,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -3334,7 +3458,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Generates new credentials for the service account associated with this
@@ -3394,7 +3520,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccountKey.fromJson(data));
+    return _response.then(
+      (data) => ServiceAccountKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all active credentials for the service account associated with this
@@ -3448,8 +3577,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ServiceAccountKeysListResponse.fromJson(data));
+    return _response.then(
+      (data) => ServiceAccountKeysListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3521,7 +3652,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves details of a cluster.
@@ -3586,7 +3719,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StoreCluster.fromJson(data));
+    return _response.then(
+      (data) =>
+          StoreCluster.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new cluster in a page.
@@ -3650,7 +3786,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StoreCluster.fromJson(data));
+    return _response.then(
+      (data) =>
+          StoreCluster.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the details of all clusters on the specified page.
@@ -3708,8 +3847,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => StoreLayoutClustersListResponse.fromJson(data));
+    return _response.then(
+      (data) => StoreLayoutClustersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a cluster.
@@ -3780,7 +3921,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StoreCluster.fromJson(data));
+    return _response.then(
+      (data) =>
+          StoreCluster.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3844,7 +3988,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves details of a store page.
@@ -3901,7 +4047,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StorePage.fromJson(data));
+    return _response.then(
+      (data) => StorePage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new store page.
@@ -3957,7 +4105,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StorePage.fromJson(data));
+    return _response.then(
+      (data) => StorePage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the details of all pages in the store.
@@ -4007,8 +4157,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => StoreLayoutPagesListResponse.fromJson(data));
+    return _response.then(
+      (data) => StoreLayoutPagesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the content of a store page.
@@ -4071,7 +4223,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StorePage.fromJson(data));
+    return _response.then(
+      (data) => StorePage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4134,7 +4288,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Generates an authentication token which the device policy client can use
@@ -4196,7 +4352,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AuthenticationToken.fromJson(data));
+    return _response.then(
+      (data) => AuthenticationToken.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a user's details.
@@ -4253,7 +4412,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the set of products a user is entitled to access.
@@ -4311,7 +4472,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductSet.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProductSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new EMM-managed user. The Users resource passed in the body of
@@ -4371,7 +4535,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up a user by primary email address. This is only supported for
@@ -4431,7 +4597,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UsersListResponse.fromJson(data));
+    return _response.then(
+      (data) => UsersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Revokes access to all devices currently provisioned to the user. The user
@@ -4491,7 +4660,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Modifies the set of products that a user is entitled to access (referred
@@ -4558,7 +4729,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductSet.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProductSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the details of an EMM-managed user. Can be used with EMM-managed
@@ -4624,7 +4798,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4687,7 +4863,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets an existing web app.
@@ -4744,7 +4922,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebApp.fromJson(data));
+    return _response.then(
+      (data) => WebApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new web app for the enterprise.
@@ -4800,7 +4980,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebApp.fromJson(data));
+    return _response.then(
+      (data) => WebApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the details of all web apps for a given enterprise.
@@ -4850,7 +5032,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebAppsListResponse.fromJson(data));
+    return _response.then(
+      (data) => WebAppsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing web app.
@@ -4913,7 +5098,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebApp.fromJson(data));
+    return _response.then(
+      (data) => WebApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4995,7 +5182,8 @@
     if (_json.containsKey('managedConfigurations')) {
       managedConfigurations =
           AdministratorWebTokenSpecManagedConfigurations.fromJson(
-              _json['managedConfigurations']);
+              _json['managedConfigurations']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parent')) {
       parent = _json['parent'] as core.String;
@@ -5006,19 +5194,20 @@
           .toList();
     }
     if (_json.containsKey('playSearch')) {
-      playSearch =
-          AdministratorWebTokenSpecPlaySearch.fromJson(_json['playSearch']);
+      playSearch = AdministratorWebTokenSpecPlaySearch.fromJson(
+          _json['playSearch'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('privateApps')) {
-      privateApps =
-          AdministratorWebTokenSpecPrivateApps.fromJson(_json['privateApps']);
+      privateApps = AdministratorWebTokenSpecPrivateApps.fromJson(
+          _json['privateApps'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('storeBuilder')) {
-      storeBuilder =
-          AdministratorWebTokenSpecStoreBuilder.fromJson(_json['storeBuilder']);
+      storeBuilder = AdministratorWebTokenSpecStoreBuilder.fromJson(
+          _json['storeBuilder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webApps')) {
-      webApps = AdministratorWebTokenSpecWebApps.fromJson(_json['webApps']);
+      webApps = AdministratorWebTokenSpecWebApps.fromJson(
+          _json['webApps'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5180,8 +5369,9 @@
     }
     if (_json.containsKey('restrictions')) {
       restrictions = (_json['restrictions'] as core.List)
-          .map<AppRestrictionsSchemaRestriction>(
-              (value) => AppRestrictionsSchemaRestriction.fromJson(value))
+          .map<AppRestrictionsSchemaRestriction>((value) =>
+              AppRestrictionsSchemaRestriction.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5276,7 +5466,7 @@
   AppRestrictionsSchemaRestriction.fromJson(core.Map _json) {
     if (_json.containsKey('defaultValue')) {
       defaultValue = AppRestrictionsSchemaRestrictionRestrictionValue.fromJson(
-          _json['defaultValue']);
+          _json['defaultValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -5296,8 +5486,9 @@
     }
     if (_json.containsKey('nestedRestriction')) {
       nestedRestriction = (_json['nestedRestriction'] as core.List)
-          .map<AppRestrictionsSchemaRestriction>(
-              (value) => AppRestrictionsSchemaRestriction.fromJson(value))
+          .map<AppRestrictionsSchemaRestriction>((value) =>
+              AppRestrictionsSchemaRestriction.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('restrictionType')) {
@@ -5425,7 +5616,8 @@
   AppState.fromJson(core.Map _json) {
     if (_json.containsKey('keyedAppState')) {
       keyedAppState = (_json['keyedAppState'] as core.List)
-          .map<KeyedAppState>((value) => KeyedAppState.fromJson(value))
+          .map<KeyedAppState>((value) => KeyedAppState.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('packageName')) {
@@ -5676,8 +5868,8 @@
   AutoInstallPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('autoInstallConstraint')) {
       autoInstallConstraint = (_json['autoInstallConstraint'] as core.List)
-          .map<AutoInstallConstraint>(
-              (value) => AutoInstallConstraint.fromJson(value))
+          .map<AutoInstallConstraint>((value) => AutoInstallConstraint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('autoInstallMode')) {
@@ -5729,7 +5921,8 @@
     }
     if (_json.containsKey('variableSet')) {
       variableSet = (_json['variableSet'] as core.List)
-          .map<VariableSet>((value) => VariableSet.fromJson(value))
+          .map<VariableSet>((value) => VariableSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5787,10 +5980,12 @@
       managementType = _json['managementType'] as core.String;
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('report')) {
-      report = DeviceReport.fromJson(_json['report']);
+      report = DeviceReport.fromJson(
+          _json['report'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5828,7 +6023,8 @@
   DeviceReport.fromJson(core.Map _json) {
     if (_json.containsKey('appState')) {
       appState = (_json['appState'] as core.List)
-          .map<AppState>((value) => AppState.fromJson(value))
+          .map<AppState>((value) =>
+              AppState.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lastUpdatedTimestampMillis')) {
@@ -5868,7 +6064,8 @@
       deviceId = _json['deviceId'] as core.String;
     }
     if (_json.containsKey('report')) {
-      report = DeviceReport.fromJson(_json['report']);
+      report = DeviceReport.fromJson(
+          _json['report'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userId')) {
       userId = _json['userId'] as core.String;
@@ -5928,7 +6125,8 @@
   DevicesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('device')) {
       device = (_json['device'] as core.List)
-          .map<Device>((value) => Device.fromJson(value))
+          .map<Device>((value) =>
+              Device.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5973,7 +6171,8 @@
   Enterprise.fromJson(core.Map _json) {
     if (_json.containsKey('administrator')) {
       administrator = (_json['administrator'] as core.List)
-          .map<Administrator>((value) => Administrator.fromJson(value))
+          .map<Administrator>((value) => Administrator.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -6038,7 +6237,8 @@
   EnterprisesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('enterprise')) {
       enterprise = (_json['enterprise'] as core.List)
-          .map<Enterprise>((value) => Enterprise.fromJson(value))
+          .map<Enterprise>((value) =>
+              Enterprise.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6150,7 +6350,8 @@
   EntitlementsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entitlement')) {
       entitlement = (_json['entitlement'] as core.List)
-          .map<Entitlement>((value) => Entitlement.fromJson(value))
+          .map<Entitlement>((value) => Entitlement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6283,7 +6484,8 @@
   GroupLicenseUsersListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('user')) {
       user = (_json['user'] as core.List)
-          .map<User>((value) => User.fromJson(value))
+          .map<User>((value) =>
+              User.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6306,7 +6508,8 @@
   GroupLicensesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('groupLicense')) {
       groupLicense = (_json['groupLicense'] as core.List)
-          .map<GroupLicense>((value) => GroupLicense.fromJson(value))
+          .map<GroupLicense>((value) => GroupLicense.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6462,7 +6665,8 @@
   InstallsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('install')) {
       install = (_json['install'] as core.List)
-          .map<Install>((value) => Install.fromJson(value))
+          .map<Install>((value) =>
+              Install.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6635,15 +6839,17 @@
 
   ManagedConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('configurationVariables')) {
-      configurationVariables =
-          ConfigurationVariables.fromJson(_json['configurationVariables']);
+      configurationVariables = ConfigurationVariables.fromJson(
+          _json['configurationVariables']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('managedProperty')) {
       managedProperty = (_json['managedProperty'] as core.List)
-          .map<ManagedProperty>((value) => ManagedProperty.fromJson(value))
+          .map<ManagedProperty>((value) => ManagedProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productId')) {
@@ -6678,11 +6884,11 @@
 
   ManagedConfigurationsForDeviceListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('managedConfigurationForDevice')) {
-      managedConfigurationForDevice =
-          (_json['managedConfigurationForDevice'] as core.List)
-              .map<ManagedConfiguration>(
-                  (value) => ManagedConfiguration.fromJson(value))
-              .toList();
+      managedConfigurationForDevice = (_json['managedConfigurationForDevice']
+              as core.List)
+          .map<ManagedConfiguration>((value) => ManagedConfiguration.fromJson(
+              value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
   }
 
@@ -6704,11 +6910,11 @@
 
   ManagedConfigurationsForUserListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('managedConfigurationForUser')) {
-      managedConfigurationForUser =
-          (_json['managedConfigurationForUser'] as core.List)
-              .map<ManagedConfiguration>(
-                  (value) => ManagedConfiguration.fromJson(value))
-              .toList();
+      managedConfigurationForUser = (_json['managedConfigurationForUser']
+              as core.List)
+          .map<ManagedConfiguration>((value) => ManagedConfiguration.fromJson(
+              value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
   }
 
@@ -6778,8 +6984,9 @@
     if (_json.containsKey('managedConfigurationsSettings')) {
       managedConfigurationsSettings =
           (_json['managedConfigurationsSettings'] as core.List)
-              .map<ManagedConfigurationsSettings>(
-                  (value) => ManagedConfigurationsSettings.fromJson(value))
+              .map<ManagedConfigurationsSettings>((value) =>
+                  ManagedConfigurationsSettings.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -6836,12 +7043,13 @@
       valueBool = _json['valueBool'] as core.bool;
     }
     if (_json.containsKey('valueBundle')) {
-      valueBundle = ManagedPropertyBundle.fromJson(_json['valueBundle']);
+      valueBundle = ManagedPropertyBundle.fromJson(
+          _json['valueBundle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('valueBundleArray')) {
       valueBundleArray = (_json['valueBundleArray'] as core.List)
-          .map<ManagedPropertyBundle>(
-              (value) => ManagedPropertyBundle.fromJson(value))
+          .map<ManagedPropertyBundle>((value) => ManagedPropertyBundle.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('valueInteger')) {
@@ -6895,7 +7103,8 @@
   ManagedPropertyBundle.fromJson(core.Map _json) {
     if (_json.containsKey('managedProperty')) {
       managedProperty = (_json['managedProperty'] as core.List)
-          .map<ManagedProperty>((value) => ManagedProperty.fromJson(value))
+          .map<ManagedProperty>((value) => ManagedProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7071,39 +7280,44 @@
     if (_json.containsKey('appRestrictionsSchemaChangeEvent')) {
       appRestrictionsSchemaChangeEvent =
           AppRestrictionsSchemaChangeEvent.fromJson(
-              _json['appRestrictionsSchemaChangeEvent']);
+              _json['appRestrictionsSchemaChangeEvent']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appUpdateEvent')) {
-      appUpdateEvent = AppUpdateEvent.fromJson(_json['appUpdateEvent']);
+      appUpdateEvent = AppUpdateEvent.fromJson(
+          _json['appUpdateEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceReportUpdateEvent')) {
-      deviceReportUpdateEvent =
-          DeviceReportUpdateEvent.fromJson(_json['deviceReportUpdateEvent']);
+      deviceReportUpdateEvent = DeviceReportUpdateEvent.fromJson(
+          _json['deviceReportUpdateEvent']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enterpriseId')) {
       enterpriseId = _json['enterpriseId'] as core.String;
     }
     if (_json.containsKey('installFailureEvent')) {
-      installFailureEvent =
-          InstallFailureEvent.fromJson(_json['installFailureEvent']);
+      installFailureEvent = InstallFailureEvent.fromJson(
+          _json['installFailureEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('newDeviceEvent')) {
-      newDeviceEvent = NewDeviceEvent.fromJson(_json['newDeviceEvent']);
+      newDeviceEvent = NewDeviceEvent.fromJson(
+          _json['newDeviceEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('newPermissionsEvent')) {
-      newPermissionsEvent =
-          NewPermissionsEvent.fromJson(_json['newPermissionsEvent']);
+      newPermissionsEvent = NewPermissionsEvent.fromJson(
+          _json['newPermissionsEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('notificationType')) {
       notificationType = _json['notificationType'] as core.String;
     }
     if (_json.containsKey('productApprovalEvent')) {
-      productApprovalEvent =
-          ProductApprovalEvent.fromJson(_json['productApprovalEvent']);
+      productApprovalEvent = ProductApprovalEvent.fromJson(
+          _json['productApprovalEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productAvailabilityChangeEvent')) {
       productAvailabilityChangeEvent = ProductAvailabilityChangeEvent.fromJson(
-          _json['productAvailabilityChangeEvent']);
+          _json['productAvailabilityChangeEvent']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampMillis')) {
       timestampMillis = _json['timestampMillis'] as core.String;
@@ -7168,7 +7382,8 @@
   NotificationSet.fromJson(core.Map _json) {
     if (_json.containsKey('notification')) {
       notification = (_json['notification'] as core.List)
-          .map<Notification>((value) => Notification.fromJson(value))
+          .map<Notification>((value) => Notification.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('notificationSetId')) {
@@ -7337,8 +7552,8 @@
       deviceReportPolicy = _json['deviceReportPolicy'] as core.String;
     }
     if (_json.containsKey('maintenanceWindow')) {
-      maintenanceWindow =
-          MaintenanceWindow.fromJson(_json['maintenanceWindow']);
+      maintenanceWindow = MaintenanceWindow.fromJson(
+          _json['maintenanceWindow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productAvailabilityPolicy')) {
       productAvailabilityPolicy =
@@ -7346,7 +7561,8 @@
     }
     if (_json.containsKey('productPolicy')) {
       productPolicy = (_json['productPolicy'] as core.List)
-          .map<ProductPolicy>((value) => ProductPolicy.fromJson(value))
+          .map<ProductPolicy>((value) => ProductPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7488,12 +7704,14 @@
   Product.fromJson(core.Map _json) {
     if (_json.containsKey('appTracks')) {
       appTracks = (_json['appTracks'] as core.List)
-          .map<TrackInfo>((value) => TrackInfo.fromJson(value))
+          .map<TrackInfo>((value) =>
+              TrackInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('appVersion')) {
       appVersion = (_json['appVersion'] as core.List)
-          .map<AppVersion>((value) => AppVersion.fromJson(value))
+          .map<AppVersion>((value) =>
+              AppVersion.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('authorName')) {
@@ -7541,7 +7759,8 @@
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<ProductPermission>((value) => ProductPermission.fromJson(value))
+          .map<ProductPermission>((value) => ProductPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productId')) {
@@ -7562,8 +7781,8 @@
           .toList();
     }
     if (_json.containsKey('signingCertificate')) {
-      signingCertificate =
-          ProductSigningCertificate.fromJson(_json['signingCertificate']);
+      signingCertificate = ProductSigningCertificate.fromJson(
+          _json['signingCertificate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('smallIconUrl')) {
       smallIconUrl = _json['smallIconUrl'] as core.String;
@@ -7783,7 +8002,8 @@
   ProductPermissions.fromJson(core.Map _json) {
     if (_json.containsKey('permission')) {
       permission = (_json['permission'] as core.List)
-          .map<ProductPermission>((value) => ProductPermission.fromJson(value))
+          .map<ProductPermission>((value) => ProductPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productId')) {
@@ -7826,12 +8046,12 @@
 
   ProductPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('autoInstallPolicy')) {
-      autoInstallPolicy =
-          AutoInstallPolicy.fromJson(_json['autoInstallPolicy']);
+      autoInstallPolicy = AutoInstallPolicy.fromJson(
+          _json['autoInstallPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('managedConfiguration')) {
-      managedConfiguration =
-          ManagedConfiguration.fromJson(_json['managedConfiguration']);
+      managedConfiguration = ManagedConfiguration.fromJson(
+          _json['managedConfiguration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productId')) {
       productId = _json['productId'] as core.String;
@@ -7918,7 +8138,8 @@
     }
     if (_json.containsKey('productVisibility')) {
       productVisibility = (_json['productVisibility'] as core.List)
-          .map<ProductVisibility>((value) => ProductVisibility.fromJson(value))
+          .map<ProductVisibility>((value) => ProductVisibility.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8044,7 +8265,8 @@
 
   ProductsApproveRequest.fromJson(core.Map _json) {
     if (_json.containsKey('approvalUrlInfo')) {
-      approvalUrlInfo = ApprovalUrlInfo.fromJson(_json['approvalUrlInfo']);
+      approvalUrlInfo = ApprovalUrlInfo.fromJson(
+          _json['approvalUrlInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('approvedPermissions')) {
       approvedPermissions = _json['approvedPermissions'] as core.String;
@@ -8106,15 +8328,18 @@
 
   ProductsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('product')) {
       product = (_json['product'] as core.List)
-          .map<Product>((value) => Product.fromJson(value))
+          .map<Product>((value) =>
+              Product.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8147,7 +8372,8 @@
 
   ServiceAccount.fromJson(core.Map _json) {
     if (_json.containsKey('key')) {
-      key = ServiceAccountKey.fromJson(_json['key']);
+      key = ServiceAccountKey.fromJson(
+          _json['key'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8237,7 +8463,8 @@
   ServiceAccountKeysListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('serviceAccountKey')) {
       serviceAccountKey = (_json['serviceAccountKey'] as core.List)
-          .map<ServiceAccountKey>((value) => ServiceAccountKey.fromJson(value))
+          .map<ServiceAccountKey>((value) => ServiceAccountKey.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8327,7 +8554,8 @@
     }
     if (_json.containsKey('name')) {
       name = (_json['name'] as core.List)
-          .map<LocalizedText>((value) => LocalizedText.fromJson(value))
+          .map<LocalizedText>((value) => LocalizedText.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('orderInPage')) {
@@ -8408,7 +8636,8 @@
   StoreLayoutClustersListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('cluster')) {
       cluster = (_json['cluster'] as core.List)
-          .map<StoreCluster>((value) => StoreCluster.fromJson(value))
+          .map<StoreCluster>((value) => StoreCluster.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8431,7 +8660,8 @@
   StoreLayoutPagesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('page')) {
       page = (_json['page'] as core.List)
-          .map<StorePage>((value) => StorePage.fromJson(value))
+          .map<StorePage>((value) =>
+              StorePage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8476,7 +8706,8 @@
     }
     if (_json.containsKey('name')) {
       name = (_json['name'] as core.List)
-          .map<LocalizedText>((value) => LocalizedText.fromJson(value))
+          .map<LocalizedText>((value) => LocalizedText.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8671,7 +8902,8 @@
   UsersListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('user')) {
       user = (_json['user'] as core.List)
-          .map<User>((value) => User.fromJson(value))
+          .map<User>((value) =>
+              User.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8778,7 +9010,8 @@
     }
     if (_json.containsKey('icons')) {
       icons = (_json['icons'] as core.List)
-          .map<WebAppIcon>((value) => WebAppIcon.fromJson(value))
+          .map<WebAppIcon>((value) =>
+              WebAppIcon.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('isPublished')) {
@@ -8859,7 +9092,8 @@
   WebAppsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('webApp')) {
       webApp = (_json['webApp'] as core.List)
-          .map<WebApp>((value) => WebApp.fromJson(value))
+          .map<WebApp>((value) =>
+              WebApp.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/androidmanagement/v1.dart b/generated/googleapis/lib/androidmanagement/v1.dart
index 38b92e4..ecee59c 100644
--- a/generated/googleapis/lib/androidmanagement/v1.dart
+++ b/generated/googleapis/lib/androidmanagement/v1.dart
@@ -133,7 +133,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Enterprise.fromJson(data));
+    return _response.then(
+      (data) =>
+          Enterprise.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an enterprise.
@@ -183,7 +186,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Enterprise.fromJson(data));
+    return _response.then(
+      (data) =>
+          Enterprise.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an enterprise.
@@ -246,7 +252,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Enterprise.fromJson(data));
+    return _response.then(
+      (data) =>
+          Enterprise.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -311,7 +320,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Application.fromJson(data));
+    return _response.then(
+      (data) =>
+          Application.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -385,7 +397,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a device.
@@ -435,7 +449,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Issues a command to a device. The Operation resource returned contains a
@@ -495,7 +511,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists devices for a given enterprise.
@@ -560,7 +578,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDevicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDevicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a device.
@@ -623,7 +644,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -688,7 +711,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -741,7 +766,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -793,7 +820,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -868,7 +897,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -933,7 +965,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EnrollmentToken.fromJson(data));
+    return _response.then(
+      (data) =>
+          EnrollmentToken.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an enrollment token. This operation invalidates the token,
@@ -984,7 +1019,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1042,7 +1079,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a policy.
@@ -1092,7 +1131,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists policies for a given enterprise.
@@ -1157,7 +1198,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates or creates a policy.
@@ -1220,7 +1264,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1284,7 +1330,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebApp.fromJson(data));
+    return _response.then(
+      (data) => WebApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a web app.
@@ -1334,7 +1382,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a web app.
@@ -1384,7 +1434,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebApp.fromJson(data));
+    return _response.then(
+      (data) => WebApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists web apps for a given enterprise.
@@ -1449,7 +1501,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListWebAppsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListWebAppsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a web app.
@@ -1512,7 +1567,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebApp.fromJson(data));
+    return _response.then(
+      (data) => WebApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1577,7 +1634,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebToken.fromJson(data));
+    return _response.then(
+      (data) => WebToken.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1643,7 +1702,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SignupUrl.fromJson(data));
+    return _response.then(
+      (data) => SignupUrl.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1796,12 +1857,14 @@
   Application.fromJson(core.Map _json) {
     if (_json.containsKey('appTracks')) {
       appTracks = (_json['appTracks'] as core.List)
-          .map<AppTrackInfo>((value) => AppTrackInfo.fromJson(value))
+          .map<AppTrackInfo>((value) => AppTrackInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('managedProperties')) {
       managedProperties = (_json['managedProperties'] as core.List)
-          .map<ManagedProperty>((value) => ManagedProperty.fromJson(value))
+          .map<ManagedProperty>((value) => ManagedProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -1809,8 +1872,8 @@
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<ApplicationPermission>(
-              (value) => ApplicationPermission.fromJson(value))
+          .map<ApplicationPermission>((value) => ApplicationPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -2056,12 +2119,14 @@
     }
     if (_json.containsKey('managedConfiguration')) {
       managedConfiguration = commons.mapMap<core.Object, core.Object>(
-          _json['managedConfiguration'].cast<core.String, core.Object>(),
+          (_json['managedConfiguration'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('managedConfigurationTemplate')) {
       managedConfigurationTemplate = ManagedConfigurationTemplate.fromJson(
-          _json['managedConfigurationTemplate']);
+          _json['managedConfigurationTemplate']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minimumVersionCode')) {
       minimumVersionCode = _json['minimumVersionCode'] as core.int;
@@ -2071,7 +2136,8 @@
     }
     if (_json.containsKey('permissionGrants')) {
       permissionGrants = (_json['permissionGrants'] as core.List)
-          .map<PermissionGrant>((value) => PermissionGrant.fromJson(value))
+          .map<PermissionGrant>((value) => PermissionGrant.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2184,7 +2250,8 @@
     }
     if (_json.containsKey('events')) {
       events = (_json['events'] as core.List)
-          .map<ApplicationEvent>((value) => ApplicationEvent.fromJson(value))
+          .map<ApplicationEvent>((value) => ApplicationEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('installerPackageName')) {
@@ -2192,7 +2259,8 @@
     }
     if (_json.containsKey('keyedAppStates')) {
       keyedAppStates = (_json['keyedAppStates'] as core.List)
-          .map<KeyedAppState>((value) => KeyedAppState.fromJson(value))
+          .map<KeyedAppState>((value) => KeyedAppState.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('packageName')) {
@@ -2503,15 +2571,16 @@
 
   ComplianceRule.fromJson(core.Map _json) {
     if (_json.containsKey('apiLevelCondition')) {
-      apiLevelCondition =
-          ApiLevelCondition.fromJson(_json['apiLevelCondition']);
+      apiLevelCondition = ApiLevelCondition.fromJson(
+          _json['apiLevelCondition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('disableApps')) {
       disableApps = _json['disableApps'] as core.bool;
     }
     if (_json.containsKey('nonComplianceDetailCondition')) {
       nonComplianceDetailCondition = NonComplianceDetailCondition.fromJson(
-          _json['nonComplianceDetailCondition']);
+          _json['nonComplianceDetailCondition']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('packageNamesToDisable')) {
       packageNamesToDisable = (_json['packageNamesToDisable'] as core.List)
@@ -2759,7 +2828,8 @@
     }
     if (_json.containsKey('applicationReports')) {
       applicationReports = (_json['applicationReports'] as core.List)
-          .map<ApplicationReport>((value) => ApplicationReport.fromJson(value))
+          .map<ApplicationReport>((value) => ApplicationReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('appliedPolicyName')) {
@@ -2772,14 +2842,17 @@
       appliedState = _json['appliedState'] as core.String;
     }
     if (_json.containsKey('deviceSettings')) {
-      deviceSettings = DeviceSettings.fromJson(_json['deviceSettings']);
+      deviceSettings = DeviceSettings.fromJson(
+          _json['deviceSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('disabledReason')) {
-      disabledReason = UserFacingMessage.fromJson(_json['disabledReason']);
+      disabledReason = UserFacingMessage.fromJson(
+          _json['disabledReason'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displays')) {
       displays = (_json['displays'] as core.List)
-          .map<Display>((value) => Display.fromJson(value))
+          .map<Display>((value) =>
+              Display.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('enrollmentTime')) {
@@ -2792,11 +2865,13 @@
       enrollmentTokenName = _json['enrollmentTokenName'] as core.String;
     }
     if (_json.containsKey('hardwareInfo')) {
-      hardwareInfo = HardwareInfo.fromJson(_json['hardwareInfo']);
+      hardwareInfo = HardwareInfo.fromJson(
+          _json['hardwareInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hardwareStatusSamples')) {
       hardwareStatusSamples = (_json['hardwareStatusSamples'] as core.List)
-          .map<HardwareStatus>((value) => HardwareStatus.fromJson(value))
+          .map<HardwareStatus>((value) => HardwareStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lastPolicyComplianceReportTime')) {
@@ -2814,22 +2889,25 @@
     }
     if (_json.containsKey('memoryEvents')) {
       memoryEvents = (_json['memoryEvents'] as core.List)
-          .map<MemoryEvent>((value) => MemoryEvent.fromJson(value))
+          .map<MemoryEvent>((value) => MemoryEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('memoryInfo')) {
-      memoryInfo = MemoryInfo.fromJson(_json['memoryInfo']);
+      memoryInfo = MemoryInfo.fromJson(
+          _json['memoryInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('networkInfo')) {
-      networkInfo = NetworkInfo.fromJson(_json['networkInfo']);
+      networkInfo = NetworkInfo.fromJson(
+          _json['networkInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nonComplianceDetails')) {
       nonComplianceDetails = (_json['nonComplianceDetails'] as core.List)
-          .map<NonComplianceDetail>(
-              (value) => NonComplianceDetail.fromJson(value))
+          .map<NonComplianceDetail>((value) => NonComplianceDetail.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('ownership')) {
@@ -2843,8 +2921,8 @@
     }
     if (_json.containsKey('powerManagementEvents')) {
       powerManagementEvents = (_json['powerManagementEvents'] as core.List)
-          .map<PowerManagementEvent>(
-              (value) => PowerManagementEvent.fromJson(value))
+          .map<PowerManagementEvent>((value) => PowerManagementEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('previousDeviceNames')) {
@@ -2853,21 +2931,25 @@
           .toList();
     }
     if (_json.containsKey('securityPosture')) {
-      securityPosture = SecurityPosture.fromJson(_json['securityPosture']);
+      securityPosture = SecurityPosture.fromJson(
+          _json['securityPosture'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareInfo')) {
-      softwareInfo = SoftwareInfo.fromJson(_json['softwareInfo']);
+      softwareInfo = SoftwareInfo.fromJson(
+          _json['softwareInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('systemProperties')) {
       systemProperties = commons.mapMap<core.String, core.String>(
-          _json['systemProperties'].cast<core.String, core.String>(),
+          (_json['systemProperties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userName')) {
       userName = _json['userName'] as core.String;
@@ -3272,7 +3354,8 @@
       qrCode = _json['qrCode'] as core.String;
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -3369,7 +3452,8 @@
       enterpriseDisplayName = _json['enterpriseDisplayName'] as core.String;
     }
     if (_json.containsKey('logo')) {
-      logo = ExternalData.fromJson(_json['logo']);
+      logo = ExternalData.fromJson(
+          _json['logo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3382,13 +3466,14 @@
     }
     if (_json.containsKey('signinDetails')) {
       signinDetails = (_json['signinDetails'] as core.List)
-          .map<SigninDetail>((value) => SigninDetail.fromJson(value))
+          .map<SigninDetail>((value) => SigninDetail.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('termsAndConditions')) {
       termsAndConditions = (_json['termsAndConditions'] as core.List)
-          .map<TermsAndConditions>(
-              (value) => TermsAndConditions.fromJson(value))
+          .map<TermsAndConditions>((value) => TermsAndConditions.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3490,10 +3575,12 @@
 
   FreezePeriod.fromJson(core.Map _json) {
     if (_json.containsKey('endDate')) {
-      endDate = Date.fromJson(_json['endDate']);
+      endDate = Date.fromJson(
+          _json['endDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startDate')) {
-      startDate = Date.fromJson(_json['startDate']);
+      startDate = Date.fromJson(
+          _json['startDate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3987,7 +4074,8 @@
   ListDevicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<Device>((value) => Device.fromJson(value))
+          .map<Device>((value) =>
+              Device.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4023,7 +4111,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4056,7 +4145,8 @@
     }
     if (_json.containsKey('policies')) {
       policies = (_json['policies'] as core.List)
-          .map<Policy>((value) => Policy.fromJson(value))
+          .map<Policy>((value) =>
+              Policy.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4089,7 +4179,8 @@
     }
     if (_json.containsKey('webApps')) {
       webApps = (_json['webApps'] as core.List)
-          .map<WebApp>((value) => WebApp.fromJson(value))
+          .map<WebApp>((value) =>
+              WebApp.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4121,7 +4212,9 @@
   ManagedConfigurationTemplate.fromJson(core.Map _json) {
     if (_json.containsKey('configurationVariables')) {
       configurationVariables = commons.mapMap<core.String, core.String>(
-          _json['configurationVariables'].cast<core.String, core.String>(),
+          (_json['configurationVariables']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('templateId')) {
@@ -4194,8 +4287,8 @@
     }
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ManagedPropertyEntry>(
-              (value) => ManagedPropertyEntry.fromJson(value))
+          .map<ManagedPropertyEntry>((value) => ManagedPropertyEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('key')) {
@@ -4203,7 +4296,8 @@
     }
     if (_json.containsKey('nestedProperties')) {
       nestedProperties = (_json['nestedProperties'] as core.List)
-          .map<ManagedProperty>((value) => ManagedProperty.fromJson(value))
+          .map<ManagedProperty>((value) => ManagedProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -4645,11 +4739,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4657,7 +4753,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -5062,8 +5159,9 @@
     }
     if (_json.containsKey('personalApplications')) {
       personalApplications = (_json['personalApplications'] as core.List)
-          .map<PersonalApplicationPolicy>(
-              (value) => PersonalApplicationPolicy.fromJson(value))
+          .map<PersonalApplicationPolicy>((value) =>
+              PersonalApplicationPolicy.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('personalPlayStoreMode')) {
@@ -5475,11 +5573,12 @@
     }
     if (_json.containsKey('advancedSecurityOverrides')) {
       advancedSecurityOverrides = AdvancedSecurityOverrides.fromJson(
-          _json['advancedSecurityOverrides']);
+          _json['advancedSecurityOverrides']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('alwaysOnVpnPackage')) {
-      alwaysOnVpnPackage =
-          AlwaysOnVpnPackage.fromJson(_json['alwaysOnVpnPackage']);
+      alwaysOnVpnPackage = AlwaysOnVpnPackage.fromJson(
+          _json['alwaysOnVpnPackage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('androidDevicePolicyTracks')) {
       androidDevicePolicyTracks =
@@ -5492,7 +5591,8 @@
     }
     if (_json.containsKey('applications')) {
       applications = (_json['applications'] as core.List)
-          .map<ApplicationPolicy>((value) => ApplicationPolicy.fromJson(value))
+          .map<ApplicationPolicy>((value) => ApplicationPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('autoTimeRequired')) {
@@ -5520,13 +5620,14 @@
     }
     if (_json.containsKey('choosePrivateKeyRules')) {
       choosePrivateKeyRules = (_json['choosePrivateKeyRules'] as core.List)
-          .map<ChoosePrivateKeyRule>(
-              (value) => ChoosePrivateKeyRule.fromJson(value))
+          .map<ChoosePrivateKeyRule>((value) => ChoosePrivateKeyRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('complianceRules')) {
       complianceRules = (_json['complianceRules'] as core.List)
-          .map<ComplianceRule>((value) => ComplianceRule.fromJson(value))
+          .map<ComplianceRule>((value) => ComplianceRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('createWindowsDisabled')) {
@@ -5546,8 +5647,9 @@
       defaultPermissionPolicy = _json['defaultPermissionPolicy'] as core.String;
     }
     if (_json.containsKey('deviceOwnerLockScreenInfo')) {
-      deviceOwnerLockScreenInfo =
-          UserFacingMessage.fromJson(_json['deviceOwnerLockScreenInfo']);
+      deviceOwnerLockScreenInfo = UserFacingMessage.fromJson(
+          _json['deviceOwnerLockScreenInfo']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encryptionPolicy')) {
       encryptionPolicy = _json['encryptionPolicy'] as core.String;
@@ -5587,15 +5689,15 @@
           _json['kioskCustomLauncherEnabled'] as core.bool;
     }
     if (_json.containsKey('kioskCustomization')) {
-      kioskCustomization =
-          KioskCustomization.fromJson(_json['kioskCustomization']);
+      kioskCustomization = KioskCustomization.fromJson(
+          _json['kioskCustomization'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationMode')) {
       locationMode = _json['locationMode'] as core.String;
     }
     if (_json.containsKey('longSupportMessage')) {
-      longSupportMessage =
-          UserFacingMessage.fromJson(_json['longSupportMessage']);
+      longSupportMessage = UserFacingMessage.fromJson(
+          _json['longSupportMessage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maximumTimeToLock')) {
       maximumTimeToLock = _json['maximumTimeToLock'] as core.String;
@@ -5626,7 +5728,9 @@
     }
     if (_json.containsKey('openNetworkConfiguration')) {
       openNetworkConfiguration = commons.mapMap<core.Object, core.Object>(
-          _json['openNetworkConfiguration'].cast<core.String, core.Object>(),
+          (_json['openNetworkConfiguration']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('outgoingBeamDisabled')) {
@@ -5637,45 +5741,50 @@
     }
     if (_json.containsKey('passwordPolicies')) {
       passwordPolicies = (_json['passwordPolicies'] as core.List)
-          .map<PasswordRequirements>(
-              (value) => PasswordRequirements.fromJson(value))
+          .map<PasswordRequirements>((value) => PasswordRequirements.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('passwordRequirements')) {
-      passwordRequirements =
-          PasswordRequirements.fromJson(_json['passwordRequirements']);
+      passwordRequirements = PasswordRequirements.fromJson(
+          _json['passwordRequirements'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('permissionGrants')) {
       permissionGrants = (_json['permissionGrants'] as core.List)
-          .map<PermissionGrant>((value) => PermissionGrant.fromJson(value))
+          .map<PermissionGrant>((value) => PermissionGrant.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('permittedAccessibilityServices')) {
-      permittedAccessibilityServices =
-          PackageNameList.fromJson(_json['permittedAccessibilityServices']);
+      permittedAccessibilityServices = PackageNameList.fromJson(
+          _json['permittedAccessibilityServices']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('permittedInputMethods')) {
-      permittedInputMethods =
-          PackageNameList.fromJson(_json['permittedInputMethods']);
+      permittedInputMethods = PackageNameList.fromJson(
+          _json['permittedInputMethods']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('persistentPreferredActivities')) {
       persistentPreferredActivities =
           (_json['persistentPreferredActivities'] as core.List)
-              .map<PersistentPreferredActivity>(
-                  (value) => PersistentPreferredActivity.fromJson(value))
+              .map<PersistentPreferredActivity>((value) =>
+                  PersistentPreferredActivity.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('personalUsagePolicies')) {
-      personalUsagePolicies =
-          PersonalUsagePolicies.fromJson(_json['personalUsagePolicies']);
+      personalUsagePolicies = PersonalUsagePolicies.fromJson(
+          _json['personalUsagePolicies']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('playStoreMode')) {
       playStoreMode = _json['playStoreMode'] as core.String;
     }
     if (_json.containsKey('policyEnforcementRules')) {
       policyEnforcementRules = (_json['policyEnforcementRules'] as core.List)
-          .map<PolicyEnforcementRule>(
-              (value) => PolicyEnforcementRule.fromJson(value))
+          .map<PolicyEnforcementRule>((value) => PolicyEnforcementRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('privateKeySelectionEnabled')) {
@@ -5683,8 +5792,9 @@
           _json['privateKeySelectionEnabled'] as core.bool;
     }
     if (_json.containsKey('recommendedGlobalProxy')) {
-      recommendedGlobalProxy =
-          ProxyInfo.fromJson(_json['recommendedGlobalProxy']);
+      recommendedGlobalProxy = ProxyInfo.fromJson(
+          _json['recommendedGlobalProxy']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('removeUserDisabled')) {
       removeUserDisabled = _json['removeUserDisabled'] as core.bool;
@@ -5703,15 +5813,16 @@
     }
     if (_json.containsKey('setupActions')) {
       setupActions = (_json['setupActions'] as core.List)
-          .map<SetupAction>((value) => SetupAction.fromJson(value))
+          .map<SetupAction>((value) => SetupAction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shareLocationDisabled')) {
       shareLocationDisabled = _json['shareLocationDisabled'] as core.bool;
     }
     if (_json.containsKey('shortSupportMessage')) {
-      shortSupportMessage =
-          UserFacingMessage.fromJson(_json['shortSupportMessage']);
+      shortSupportMessage = UserFacingMessage.fromJson(
+          _json['shortSupportMessage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skipFirstUseHintsEnabled')) {
       skipFirstUseHintsEnabled = _json['skipFirstUseHintsEnabled'] as core.bool;
@@ -5723,8 +5834,9 @@
       statusBarDisabled = _json['statusBarDisabled'] as core.bool;
     }
     if (_json.containsKey('statusReportingSettings')) {
-      statusReportingSettings =
-          StatusReportingSettings.fromJson(_json['statusReportingSettings']);
+      statusReportingSettings = StatusReportingSettings.fromJson(
+          _json['statusReportingSettings']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stayOnPluggedModes')) {
       stayOnPluggedModes = (_json['stayOnPluggedModes'] as core.List)
@@ -5732,7 +5844,8 @@
           .toList();
     }
     if (_json.containsKey('systemUpdate')) {
-      systemUpdate = SystemUpdate.fromJson(_json['systemUpdate']);
+      systemUpdate = SystemUpdate.fromJson(
+          _json['systemUpdate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tetheringConfigDisabled')) {
       tetheringConfigDisabled = _json['tetheringConfigDisabled'] as core.bool;
@@ -6045,13 +6158,15 @@
 
   PolicyEnforcementRule.fromJson(core.Map _json) {
     if (_json.containsKey('blockAction')) {
-      blockAction = BlockAction.fromJson(_json['blockAction']);
+      blockAction = BlockAction.fromJson(
+          _json['blockAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('settingName')) {
       settingName = _json['settingName'] as core.String;
     }
     if (_json.containsKey('wipeAction')) {
-      wipeAction = WipeAction.fromJson(_json['wipeAction']);
+      wipeAction = WipeAction.fromJson(
+          _json['wipeAction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6091,7 +6206,8 @@
   PostureDetail.fromJson(core.Map _json) {
     if (_json.containsKey('advice')) {
       advice = (_json['advice'] as core.List)
-          .map<UserFacingMessage>((value) => UserFacingMessage.fromJson(value))
+          .map<UserFacingMessage>((value) => UserFacingMessage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('securityRisk')) {
@@ -6240,7 +6356,8 @@
     }
     if (_json.containsKey('postureDetails')) {
       postureDetails = (_json['postureDetails'] as core.List)
-          .map<PostureDetail>((value) => PostureDetail.fromJson(value))
+          .map<PostureDetail>((value) => PostureDetail.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6273,13 +6390,16 @@
 
   SetupAction.fromJson(core.Map _json) {
     if (_json.containsKey('description')) {
-      description = UserFacingMessage.fromJson(_json['description']);
+      description = UserFacingMessage.fromJson(
+          _json['description'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('launchApp')) {
-      launchApp = LaunchAppAction.fromJson(_json['launchApp']);
+      launchApp = LaunchAppAction.fromJson(
+          _json['launchApp'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
-      title = UserFacingMessage.fromJson(_json['title']);
+      title = UserFacingMessage.fromJson(
+          _json['title'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6476,7 +6596,8 @@
       securityPatchLevel = _json['securityPatchLevel'] as core.String;
     }
     if (_json.containsKey('systemUpdateInfo')) {
-      systemUpdateInfo = SystemUpdateInfo.fromJson(_json['systemUpdateInfo']);
+      systemUpdateInfo = SystemUpdateInfo.fromJson(
+          _json['systemUpdateInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6551,7 +6672,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -6616,7 +6738,8 @@
   StatusReportingSettings.fromJson(core.Map _json) {
     if (_json.containsKey('applicationReportingSettings')) {
       applicationReportingSettings = ApplicationReportingSettings.fromJson(
-          _json['applicationReportingSettings']);
+          _json['applicationReportingSettings']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('applicationReportsEnabled')) {
       applicationReportsEnabled =
@@ -6728,7 +6851,8 @@
     }
     if (_json.containsKey('freezePeriods')) {
       freezePeriods = (_json['freezePeriods'] as core.List)
-          .map<FreezePeriod>((value) => FreezePeriod.fromJson(value))
+          .map<FreezePeriod>((value) => FreezePeriod.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startMinutes')) {
@@ -6815,10 +6939,12 @@
 
   TermsAndConditions.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
-      content = UserFacingMessage.fromJson(_json['content']);
+      content = UserFacingMessage.fromJson(
+          _json['content'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('header')) {
-      header = UserFacingMessage.fromJson(_json['header']);
+      header = UserFacingMessage.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6881,7 +7007,8 @@
     }
     if (_json.containsKey('localizedMessages')) {
       localizedMessages = commons.mapMap<core.String, core.String>(
-          _json['localizedMessages'].cast<core.String, core.String>(),
+          (_json['localizedMessages'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -6942,7 +7069,8 @@
     }
     if (_json.containsKey('icons')) {
       icons = (_json['icons'] as core.List)
-          .map<WebAppIcon>((value) => WebAppIcon.fromJson(value))
+          .map<WebAppIcon>((value) =>
+              WebAppIcon.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
diff --git a/generated/googleapis/lib/androidpublisher/v3.dart b/generated/googleapis/lib/androidpublisher/v3.dart
index ff93f32..ebdf750 100644
--- a/generated/googleapis/lib/androidpublisher/v3.dart
+++ b/generated/googleapis/lib/androidpublisher/v3.dart
@@ -135,7 +135,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppEdit.fromJson(data));
+    return _response.then(
+      (data) => AppEdit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an app edit.
@@ -192,7 +194,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets an app edit.
@@ -249,7 +253,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppEdit.fromJson(data));
+    return _response.then(
+      (data) => AppEdit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new edit for an app.
@@ -305,7 +311,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppEdit.fromJson(data));
+    return _response.then(
+      (data) => AppEdit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Validates an app edit.
@@ -363,7 +371,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppEdit.fromJson(data));
+    return _response.then(
+      (data) => AppEdit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -436,8 +446,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ApksAddExternallyHostedResponse.fromJson(data));
+    return _response.then(
+      (data) => ApksAddExternallyHostedResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all current APKs of the app and edit.
@@ -495,7 +507,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApksListResponse.fromJson(data));
+    return _response.then(
+      (data) => ApksListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Uploads an APK and adds to the current edit.
@@ -578,7 +593,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Apk.fromJson(data));
+    return _response.then(
+      (data) => Apk.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -642,7 +659,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BundlesListResponse.fromJson(data));
+    return _response.then(
+      (data) => BundlesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Uploads a new Android App Bundle to this edit. If you are using the Google
@@ -740,7 +760,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bundle.fromJson(data));
+    return _response.then(
+      (data) => Bundle.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -857,8 +879,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => DeobfuscationFilesUploadResponse.fromJson(data));
+    return _response.then(
+      (data) => DeobfuscationFilesUploadResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -922,7 +946,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppDetails.fromJson(data));
+    return _response.then(
+      (data) =>
+          AppDetails.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches details of an app.
@@ -986,7 +1013,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppDetails.fromJson(data));
+    return _response.then(
+      (data) =>
+          AppDetails.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates details of an app.
@@ -1050,7 +1080,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppDetails.fromJson(data));
+    return _response.then(
+      (data) =>
+          AppDetails.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1136,7 +1169,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ExpansionFile.fromJson(data));
+    return _response.then(
+      (data) =>
+          ExpansionFile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the APK's expansion file configuration to reference another APK's
@@ -1222,7 +1258,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ExpansionFile.fromJson(data));
+    return _response.then(
+      (data) =>
+          ExpansionFile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the APK's expansion file configuration to reference another APK's
@@ -1308,7 +1347,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ExpansionFile.fromJson(data));
+    return _response.then(
+      (data) =>
+          ExpansionFile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Uploads a new expansion file and attaches to the specified APK.
@@ -1418,8 +1460,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ExpansionFilesUploadResponse.fromJson(data));
+    return _response.then(
+      (data) => ExpansionFilesUploadResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1518,7 +1562,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Deletes all images for the specified language and image type. Returns an
@@ -1605,7 +1651,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImagesDeleteAllResponse.fromJson(data));
+    return _response.then(
+      (data) => ImagesDeleteAllResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all images. The response may be empty.
@@ -1691,7 +1740,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImagesListResponse.fromJson(data));
+    return _response.then(
+      (data) => ImagesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Uploads an image of the specified language and image type, and adds to the
@@ -1808,7 +1860,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImagesUploadResponse.fromJson(data));
+    return _response.then(
+      (data) => ImagesUploadResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1880,7 +1935,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Deletes all store listings.
@@ -1938,7 +1995,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a localized store listing.
@@ -2004,7 +2063,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Listing.fromJson(data));
+    return _response.then(
+      (data) => Listing.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all localized store listings.
@@ -2062,7 +2123,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListingsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ListingsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a localized store listing.
@@ -2134,7 +2198,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Listing.fromJson(data));
+    return _response.then(
+      (data) => Listing.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates or updates a localized store listing.
@@ -2206,7 +2272,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Listing.fromJson(data));
+    return _response.then(
+      (data) => Listing.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2277,7 +2345,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Testers.fromJson(data));
+    return _response.then(
+      (data) => Testers.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches testers.
@@ -2348,7 +2418,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Testers.fromJson(data));
+    return _response.then(
+      (data) => Testers.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates testers.
@@ -2419,7 +2491,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Testers.fromJson(data));
+    return _response.then(
+      (data) => Testers.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2490,7 +2564,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Track.fromJson(data));
+    return _response.then(
+      (data) => Track.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all tracks.
@@ -2548,7 +2624,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TracksListResponse.fromJson(data));
+    return _response.then(
+      (data) => TracksListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a track.
@@ -2619,7 +2698,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Track.fromJson(data));
+    return _response.then(
+      (data) => Track.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a track.
@@ -2690,7 +2771,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Track.fromJson(data));
+    return _response.then(
+      (data) => Track.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2753,7 +2836,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets an in-app product, which can be a managed product or a subscription.
@@ -2810,7 +2895,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InAppProduct.fromJson(data));
+    return _response.then(
+      (data) =>
+          InAppProduct.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an in-app product (i.e. a managed product or a subscriptions).
@@ -2877,7 +2965,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InAppProduct.fromJson(data));
+    return _response.then(
+      (data) =>
+          InAppProduct.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all in-app products - both managed products and subscriptions.
@@ -2945,7 +3036,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InappproductsListResponse.fromJson(data));
+    return _response.then(
+      (data) => InappproductsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches an in-app product (i.e. a managed product or a subscriptions).
@@ -3019,7 +3113,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InAppProduct.fromJson(data));
+    return _response.then(
+      (data) =>
+          InAppProduct.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an in-app product (i.e. a managed product or a subscriptions).
@@ -3093,7 +3190,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InAppProduct.fromJson(data));
+    return _response.then(
+      (data) =>
+          InAppProduct.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3177,7 +3277,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InternalAppSharingArtifact.fromJson(data));
+    return _response.then(
+      (data) => InternalAppSharingArtifact.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Uploads an app bundle to internal app sharing. If you are using the Google
@@ -3254,7 +3357,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InternalAppSharingArtifact.fromJson(data));
+    return _response.then(
+      (data) => InternalAppSharingArtifact.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3330,7 +3436,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -3425,7 +3533,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Checks the purchase and consumption status of an inapp item.
@@ -3493,7 +3603,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductPurchase.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProductPurchase.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3575,7 +3688,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Cancels a user's subscription purchase. The subscription remains valid
@@ -3636,7 +3751,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Defers a user's subscription purchase until a specified future expiration
@@ -3712,8 +3829,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SubscriptionPurchasesDeferResponse.fromJson(data));
+    return _response.then(
+      (data) => SubscriptionPurchasesDeferResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Checks whether a user's subscription purchase is valid and returns its
@@ -3782,7 +3901,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SubscriptionPurchase.fromJson(data));
+    return _response.then(
+      (data) => SubscriptionPurchase.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Refunds a user's subscription purchase, but the subscription remains valid
@@ -3852,7 +3974,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Refunds and immediately revokes a user's subscription purchase. Access to
@@ -3923,7 +4047,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -4038,7 +4164,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VoidedPurchasesListResponse.fromJson(data));
+    return _response.then(
+      (data) => VoidedPurchasesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4107,7 +4236,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Review.fromJson(data));
+    return _response.then(
+      (data) => Review.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all reviews.
@@ -4181,7 +4312,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReviewsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ReviewsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replies to a single review, or updates an existing reply.
@@ -4245,7 +4379,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReviewsReplyResponse.fromJson(data));
+    return _response.then(
+      (data) => ReviewsReplyResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4326,7 +4463,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variant.fromJson(data));
+    return _response.then(
+      (data) => Variant.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Downloads a previously created system APK which is suitable for inclusion
@@ -4400,7 +4539,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => null);
+      return _response.then(
+        (data) => null,
+      );
     } else {
       return _response;
     }
@@ -4468,7 +4609,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variant.fromJson(data));
+    return _response.then(
+      (data) => Variant.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of previously created system APK variants.
@@ -4526,7 +4669,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SystemApksListResponse.fromJson(data));
+    return _response.then(
+      (data) => SystemApksListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4542,7 +4688,8 @@
 
   Apk.fromJson(core.Map _json) {
     if (_json.containsKey('binary')) {
-      binary = ApkBinary.fromJson(_json['binary']);
+      binary = ApkBinary.fromJson(
+          _json['binary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('versionCode')) {
       versionCode = _json['versionCode'] as core.int;
@@ -4603,8 +4750,8 @@
 
   ApksAddExternallyHostedRequest.fromJson(core.Map _json) {
     if (_json.containsKey('externallyHostedApk')) {
-      externallyHostedApk =
-          ExternallyHostedApk.fromJson(_json['externallyHostedApk']);
+      externallyHostedApk = ExternallyHostedApk.fromJson(
+          _json['externallyHostedApk'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4626,8 +4773,8 @@
 
   ApksAddExternallyHostedResponse.fromJson(core.Map _json) {
     if (_json.containsKey('externallyHostedApk')) {
-      externallyHostedApk =
-          ExternallyHostedApk.fromJson(_json['externallyHostedApk']);
+      externallyHostedApk = ExternallyHostedApk.fromJson(
+          _json['externallyHostedApk'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4653,7 +4800,8 @@
   ApksListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('apks')) {
       apks = (_json['apks'] as core.List)
-          .map<Apk>((value) => Apk.fromJson(value))
+          .map<Apk>((value) =>
+              Apk.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4810,7 +4958,8 @@
   BundlesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('bundles')) {
       bundles = (_json['bundles'] as core.List)
-          .map<Bundle>((value) => Bundle.fromJson(value))
+          .map<Bundle>((value) =>
+              Bundle.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4842,10 +4991,12 @@
 
   Comment.fromJson(core.Map _json) {
     if (_json.containsKey('developerComment')) {
-      developerComment = DeveloperComment.fromJson(_json['developerComment']);
+      developerComment = DeveloperComment.fromJson(
+          _json['developerComment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userComment')) {
-      userComment = UserComment.fromJson(_json['userComment']);
+      userComment = UserComment.fromJson(
+          _json['userComment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4931,8 +5082,8 @@
 
   DeobfuscationFilesUploadResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deobfuscationFile')) {
-      deobfuscationFile =
-          DeobfuscationFile.fromJson(_json['deobfuscationFile']);
+      deobfuscationFile = DeobfuscationFile.fromJson(
+          _json['deobfuscationFile'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4957,7 +5108,8 @@
 
   DeveloperComment.fromJson(core.Map _json) {
     if (_json.containsKey('lastModified')) {
-      lastModified = Timestamp.fromJson(_json['lastModified']);
+      lastModified = Timestamp.fromJson(
+          _json['lastModified'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -5176,7 +5328,8 @@
 
   ExpansionFilesUploadResponse.fromJson(core.Map _json) {
     if (_json.containsKey('expansionFile')) {
-      expansionFile = ExpansionFile.fromJson(_json['expansionFile']);
+      expansionFile = ExpansionFile.fromJson(
+          _json['expansionFile'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5288,7 +5441,8 @@
     }
     if (_json.containsKey('usesPermissions')) {
       usesPermissions = (_json['usesPermissions'] as core.List)
-          .map<UsesPermission>((value) => UsesPermission.fromJson(value))
+          .map<UsesPermission>((value) => UsesPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('versionCode')) {
@@ -5410,7 +5564,8 @@
   ImagesDeleteAllResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deleted')) {
       deleted = (_json['deleted'] as core.List)
-          .map<Image>((value) => Image.fromJson(value))
+          .map<Image>((value) =>
+              Image.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5434,7 +5589,8 @@
   ImagesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('images')) {
       images = (_json['images'] as core.List)
-          .map<Image>((value) => Image.fromJson(value))
+          .map<Image>((value) =>
+              Image.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5457,7 +5613,8 @@
 
   ImagesUploadResponse.fromJson(core.Map _json) {
     if (_json.containsKey('image')) {
-      image = Image.fromJson(_json['image']);
+      image =
+          Image.fromJson(_json['image'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5532,23 +5689,28 @@
       defaultLanguage = _json['defaultLanguage'] as core.String;
     }
     if (_json.containsKey('defaultPrice')) {
-      defaultPrice = Price.fromJson(_json['defaultPrice']);
+      defaultPrice = Price.fromJson(
+          _json['defaultPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gracePeriod')) {
       gracePeriod = _json['gracePeriod'] as core.String;
     }
     if (_json.containsKey('listings')) {
       listings = commons.mapMap<core.Map, InAppProductListing>(
-          _json['listings'].cast<core.String, core.Map>(),
-          (core.Map item) => InAppProductListing.fromJson(item));
+          (_json['listings'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => InAppProductListing.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('packageName')) {
       packageName = _json['packageName'] as core.String;
     }
     if (_json.containsKey('prices')) {
       prices = commons.mapMap<core.Map, Price>(
-          _json['prices'].cast<core.String, core.Map>(),
-          (core.Map item) => Price.fromJson(item));
+          (_json['prices'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Price.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('purchaseType')) {
       purchaseType = _json['purchaseType'] as core.String;
@@ -5671,17 +5833,20 @@
   InappproductsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('inappproduct')) {
       inappproduct = (_json['inappproduct'] as core.List)
-          .map<InAppProduct>((value) => InAppProduct.fromJson(value))
+          .map<InAppProduct>((value) => InAppProduct.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5882,7 +6047,8 @@
     }
     if (_json.containsKey('listings')) {
       listings = (_json['listings'] as core.List)
-          .map<Listing>((value) => Listing.fromJson(value))
+          .map<Listing>((value) =>
+              Listing.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6207,7 +6373,8 @@
     }
     if (_json.containsKey('comments')) {
       comments = (_json['comments'] as core.List)
-          .map<Comment>((value) => Comment.fromJson(value))
+          .map<Comment>((value) =>
+              Comment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reviewId')) {
@@ -6242,7 +6409,8 @@
 
   ReviewReplyResult.fromJson(core.Map _json) {
     if (_json.containsKey('lastEdited')) {
-      lastEdited = Timestamp.fromJson(_json['lastEdited']);
+      lastEdited = Timestamp.fromJson(
+          _json['lastEdited'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replyText')) {
       replyText = _json['replyText'] as core.String;
@@ -6276,15 +6444,18 @@
 
   ReviewsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reviews')) {
       reviews = (_json['reviews'] as core.List)
-          .map<Review>((value) => Review.fromJson(value))
+          .map<Review>((value) =>
+              Review.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6335,7 +6506,8 @@
 
   ReviewsReplyResponse.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = ReviewReplyResult.fromJson(_json['result']);
+      result = ReviewReplyResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6442,7 +6614,8 @@
 
   SubscriptionPriceChange.fromJson(core.Map _json) {
     if (_json.containsKey('newPrice')) {
-      newPrice = Price.fromJson(_json['newPrice']);
+      newPrice = Price.fromJson(
+          _json['newPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.int;
@@ -6625,8 +6798,8 @@
       cancelReason = _json['cancelReason'] as core.int;
     }
     if (_json.containsKey('cancelSurveyResult')) {
-      cancelSurveyResult =
-          SubscriptionCancelSurveyResult.fromJson(_json['cancelSurveyResult']);
+      cancelSurveyResult = SubscriptionCancelSurveyResult.fromJson(
+          _json['cancelSurveyResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('countryCode')) {
       countryCode = _json['countryCode'] as core.String;
@@ -6650,8 +6823,9 @@
       givenName = _json['givenName'] as core.String;
     }
     if (_json.containsKey('introductoryPriceInfo')) {
-      introductoryPriceInfo =
-          IntroductoryPriceInfo.fromJson(_json['introductoryPriceInfo']);
+      introductoryPriceInfo = IntroductoryPriceInfo.fromJson(
+          _json['introductoryPriceInfo']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -6677,7 +6851,8 @@
       priceAmountMicros = _json['priceAmountMicros'] as core.String;
     }
     if (_json.containsKey('priceChange')) {
-      priceChange = SubscriptionPriceChange.fromJson(_json['priceChange']);
+      priceChange = SubscriptionPriceChange.fromJson(
+          _json['priceChange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('priceCurrencyCode')) {
       priceCurrencyCode = _json['priceCurrencyCode'] as core.String;
@@ -6830,7 +7005,8 @@
 
   SubscriptionPurchasesDeferRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deferralInfo')) {
-      deferralInfo = SubscriptionDeferralInfo.fromJson(_json['deferralInfo']);
+      deferralInfo = SubscriptionDeferralInfo.fromJson(
+          _json['deferralInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6875,7 +7051,8 @@
   SystemApksListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('variants')) {
       variants = (_json['variants'] as core.List)
-          .map<Variant>((value) => Variant.fromJson(value))
+          .map<Variant>((value) =>
+              Variant.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6999,7 +7176,8 @@
   Track.fromJson(core.Map _json) {
     if (_json.containsKey('releases')) {
       releases = (_json['releases'] as core.List)
-          .map<TrackRelease>((value) => TrackRelease.fromJson(value))
+          .map<TrackRelease>((value) => TrackRelease.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('track')) {
@@ -7064,7 +7242,8 @@
 
   TrackRelease.fromJson(core.Map _json) {
     if (_json.containsKey('countryTargeting')) {
-      countryTargeting = CountryTargeting.fromJson(_json['countryTargeting']);
+      countryTargeting = CountryTargeting.fromJson(
+          _json['countryTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inAppUpdatePriority')) {
       inAppUpdatePriority = _json['inAppUpdatePriority'] as core.int;
@@ -7074,7 +7253,8 @@
     }
     if (_json.containsKey('releaseNotes')) {
       releaseNotes = (_json['releaseNotes'] as core.List)
-          .map<LocalizedText>((value) => LocalizedText.fromJson(value))
+          .map<LocalizedText>((value) => LocalizedText.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('status')) {
@@ -7134,7 +7314,8 @@
     }
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
-          .map<Track>((value) => Track.fromJson(value))
+          .map<Track>((value) =>
+              Track.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7213,10 +7394,12 @@
       device = _json['device'] as core.String;
     }
     if (_json.containsKey('deviceMetadata')) {
-      deviceMetadata = DeviceMetadata.fromJson(_json['deviceMetadata']);
+      deviceMetadata = DeviceMetadata.fromJson(
+          _json['deviceMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastModified')) {
-      lastModified = Timestamp.fromJson(_json['lastModified']);
+      lastModified = Timestamp.fromJson(
+          _json['lastModified'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('originalText')) {
       originalText = _json['originalText'] as core.String;
@@ -7324,7 +7507,8 @@
 
   Variant.fromJson(core.Map _json) {
     if (_json.containsKey('deviceSpec')) {
-      deviceSpec = DeviceSpec.fromJson(_json['deviceSpec']);
+      deviceSpec = DeviceSpec.fromJson(
+          _json['deviceSpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('variantId')) {
       variantId = _json['variantId'] as core.int;
@@ -7442,14 +7626,17 @@
 
   VoidedPurchasesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('voidedPurchases')) {
       voidedPurchases = (_json['voidedPurchases'] as core.List)
-          .map<VoidedPurchase>((value) => VoidedPurchase.fromJson(value))
+          .map<VoidedPurchase>((value) => VoidedPurchase.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/apigee/v1.dart b/generated/googleapis/lib/apigee/v1.dart
index cfed191..0e1a168 100644
--- a/generated/googleapis/lib/apigee/v1.dart
+++ b/generated/googleapis/lib/apigee/v1.dart
@@ -117,7 +117,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListHybridIssuersResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListHybridIssuersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -209,7 +211,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the profile for an Apigee organization. See [Understanding
@@ -260,8 +265,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Organization.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Organization.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the deployed ingress configuration for an organization.
@@ -328,8 +335,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1IngressConfig.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1IngressConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the service accounts with the permissions required to allow the
@@ -395,8 +404,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1SyncAuthorization.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1SyncAuthorization.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the Apigee organizations and associated GCP projects that you have
@@ -449,7 +460,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListOrganizationsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListOrganizationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the permissions required to allow the Synchronizer to download
@@ -516,8 +529,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1SyncAuthorization.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1SyncAuthorization.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the properties for an Apigee organization. No other fields in the
@@ -574,8 +589,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Organization.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Organization.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -650,8 +667,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Datastore.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Datastore.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a Datastore from an org.
@@ -702,7 +721,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a Datastore
@@ -753,8 +775,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Datastore.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Datastore.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List Datastores
@@ -814,7 +838,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDatastoresResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDatastoresResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Test if Datastore configuration is correct. This includes checking if
@@ -875,7 +901,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1TestDatastoreResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1TestDatastoreResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a Datastore
@@ -932,8 +960,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Datastore.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Datastore.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1009,8 +1039,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attributes.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attributes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an API product in an organization. You create API products after
@@ -1085,8 +1117,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiProduct.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProduct.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an API product from an organization. Deleting an API product
@@ -1143,8 +1177,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiProduct.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProduct.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets configuration details for an API product. The API product name
@@ -1198,8 +1234,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiProduct.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProduct.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all API product names for an organization. Filter the list by
@@ -1290,7 +1328,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListApiProductsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListApiProductsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing API product. You must include all required values,
@@ -1351,8 +1391,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiProduct.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProduct.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1410,8 +1452,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the value of an API product attribute.
@@ -1462,8 +1506,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of all API product attributes.
@@ -1515,8 +1561,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attributes.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attributes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the value of an API product attribute. Limitations are: OAuth
@@ -1579,8 +1627,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1687,8 +1737,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiProxyRevision.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProxyRevision.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an API proxy and all associated endpoints, policies, resources,
@@ -1739,7 +1791,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1ApiProxy.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProxy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an API proxy including a list of existing revisions.
@@ -1789,7 +1844,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1ApiProxy.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProxy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the names of all API proxies in an organization. The names returned
@@ -1856,7 +1914,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListApiProxiesResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListApiProxiesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1916,7 +1976,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1982,8 +2044,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1KeyValueMap.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1KeyValueMap.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a key value map in an api proxy.
@@ -2034,8 +2098,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1KeyValueMap.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1KeyValueMap.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2098,8 +2164,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiProxyRevision.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProxyRevision.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an API proxy revision. To download the API proxy configuration bundle
@@ -2165,7 +2233,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing API proxy revision by uploading the API proxy
@@ -2234,8 +2305,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiProxyRevision.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiProxyRevision.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2297,7 +2370,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2354,7 +2429,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1App.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1App.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists IDs of apps within an organization that have the specified app
@@ -2465,8 +2543,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ListAppsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ListAppsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2535,7 +2615,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2615,8 +2697,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attributes.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attributes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a developer. Once created, the developer can register an app and
@@ -2677,8 +2761,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Developer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Developer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a developer. All apps and API keys associated with the developer
@@ -2736,8 +2822,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Developer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Developer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the developer details, including the developer's name, email
@@ -2797,8 +2885,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Developer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Developer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all developers in an organization by email address. By default, the
@@ -2896,7 +2986,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListOfDevelopersResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListOfDevelopersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the status of a developer. Valid values are `active` or `inactive`. A
@@ -2960,7 +3052,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a developer. This API replaces the existing developer details with
@@ -3025,8 +3120,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Developer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Developer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3098,8 +3195,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attributes.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attributes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an app associated with a developer. This API associates the
@@ -3160,8 +3259,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperApp.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperApp.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a developer app. **Note**: The delete operation is asynchronous.
@@ -3216,8 +3317,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperApp.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperApp.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Manages access to a developer app by enabling you to: * Approve or revoke
@@ -3305,8 +3408,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperApp.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperApp.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the details for a developer app.
@@ -3376,8 +3481,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperApp.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperApp.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all apps created by a developer in an Apigee organization.
@@ -3466,7 +3573,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeveloperAppsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeveloperAppsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the details for a developer app. In addition, you can add an API
@@ -3533,8 +3642,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperApp.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperApp.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3593,8 +3704,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a developer app attribute.
@@ -3646,8 +3759,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of all developer app attributes.
@@ -3701,8 +3816,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attributes.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attributes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a developer app attribute. **Note**: OAuth access tokens and Key
@@ -3765,8 +3882,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3846,8 +3965,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an app's consumer key and removes all API products associated with
@@ -3905,8 +4026,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns details for a consumer key for a developer app, including the key
@@ -3959,8 +4082,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the scope of an app. This API replaces the existing scopes with
@@ -4023,8 +4148,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds an API product to a developer app key, enabling the app that holds
@@ -4095,8 +4222,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4159,8 +4288,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Approve or revoke an app's consumer key. After a consumer key is approved,
@@ -4224,7 +4355,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4301,8 +4435,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4361,8 +4497,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the value of the specified developer attribute.
@@ -4414,8 +4552,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of all developer attributes.
@@ -4468,8 +4608,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attributes.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attributes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a developer attribute. **Note**: OAuth access tokens and Key
@@ -4532,8 +4674,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Attribute.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Attribute.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4607,7 +4751,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an environment group.
@@ -4657,7 +4804,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an environment group.
@@ -4707,8 +4857,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1EnvironmentGroup.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1EnvironmentGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all environment groups.
@@ -4773,8 +4925,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudApigeeV1ListEnvironmentGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ListEnvironmentGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an environment group.
@@ -4836,7 +4990,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4901,7 +5058,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an environment group attachment.
@@ -4953,7 +5113,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an environment group attachment.
@@ -5006,7 +5169,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(data));
+      (data) => GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all attachments of an environment group.
@@ -5074,9 +5239,11 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse.fromJson(
-            data));
+    return _response.then(
+      (data) =>
+          GoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse.fromJson(
+              data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5178,7 +5345,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an environment from an organization.
@@ -5228,7 +5398,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets environment details.
@@ -5278,8 +5451,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Environment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Environment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the debug mask singleton resource for an environment.
@@ -5330,8 +5505,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DebugMask.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DebugMask.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the deployed configuration for an environment.
@@ -5383,8 +5560,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1EnvironmentConfig.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1EnvironmentConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the IAM policy on an environment. For more information, see [Manage
@@ -5455,7 +5634,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleIamV1Policy.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1Policy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the IAM policy on an environment, if the policy already exists it
@@ -5519,7 +5701,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleIamV1Policy.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1Policy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a subscription for the environment's Pub/Sub topic. The server
@@ -5572,8 +5757,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Subscription.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Subscription.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Tests the permissions of a user on an environment, and returns a subset of
@@ -5635,8 +5822,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleIamV1TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a subscription for the environment's Pub/Sub topic.
@@ -5694,7 +5883,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing environment. When updating properties, you must pass
@@ -5754,8 +5946,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Environment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Environment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the debug mask singleton resource for an environment.
@@ -5826,8 +6020,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DebugMask.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DebugMask.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing environment. When updating properties, you must pass
@@ -5887,8 +6083,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Environment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Environment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5970,7 +6168,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Schema.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Schema.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6039,7 +6240,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Export.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Export.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details and status of an analytics export job. If the export job
@@ -6092,7 +6296,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Export.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Export.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the details and status of all analytics export jobs belonging to the
@@ -6145,8 +6352,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ListExportsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ListExportsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6220,7 +6429,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6325,8 +6536,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Deployment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Deployment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the deployment of an API proxy revision and actual state reported by
@@ -6380,8 +6593,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Deployment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Deployment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeploys an API proxy revision from an environment. For a request path
@@ -6453,7 +6668,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6532,8 +6750,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DebugSession.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DebugSession.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the data from a debug session. This does not cancel the debug
@@ -6587,7 +6807,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a debug session.
@@ -6639,8 +6862,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1DebugSession.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1DebugSession.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists debug sessions that are currently active in the given API Proxy
@@ -6710,7 +6935,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDebugSessionsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDebugSessionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6771,7 +6998,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1DebugSessionTransaction.fromJson(data));
+      (data) => GoogleCloudApigeeV1DebugSessionTransaction.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6854,7 +7083,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1DeploymentChangeReport.fromJson(data));
+      (data) => GoogleCloudApigeeV1DeploymentChangeReport.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Generates a report for a dry run analysis of an UndeployApiProxy request
@@ -6921,7 +7152,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1DeploymentChangeReport.fromJson(data));
+      (data) => GoogleCloudApigeeV1DeploymentChangeReport.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6979,7 +7212,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7049,7 +7285,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7114,7 +7352,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1FlowHook.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1FlowHook.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Detaches a shared flow from a flow hook.
@@ -7165,7 +7406,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1FlowHook.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1FlowHook.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the name of the shared flow attached to the specified flow hook.
@@ -7218,7 +7462,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1FlowHook.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1FlowHook.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7296,7 +7543,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Keystore.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Keystore.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a keystore or truststore.
@@ -7347,7 +7597,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Keystore.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Keystore.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a keystore or truststore.
@@ -7398,7 +7651,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Keystore.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Keystore.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7510,7 +7766,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Alias.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Alias.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Generates a PKCS #10 Certificate Signing Request for the private key in an
@@ -7562,7 +7821,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an alias.
@@ -7613,7 +7875,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Alias.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Alias.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an alias.
@@ -7664,7 +7929,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Alias.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Alias.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the certificate from an alias in PEM-encoded form.
@@ -7716,7 +7984,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the certificate in an alias.
@@ -7788,7 +8059,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Alias.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Alias.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7854,8 +8128,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1KeyValueMap.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1KeyValueMap.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a key value map in an environment.
@@ -7906,8 +8182,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1KeyValueMap.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1KeyValueMap.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8078,8 +8356,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1OptimizedStats.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1OptimizedStats.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8146,8 +8426,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1AsyncQuery.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1AsyncQuery.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get query status If the query is still in progress, the `state` is set to
@@ -8200,8 +8482,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1AsyncQuery.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1AsyncQuery.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// After the query is completed, use this API to retrieve the results. If the
@@ -8257,7 +8541,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Return a list of Asynchronous Queries
@@ -8350,7 +8637,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListAsyncQueriesResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListAsyncQueriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8416,8 +8705,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Reference.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Reference.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Reference from an environment. Returns the deleted Reference
@@ -8469,8 +8760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Reference.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Reference.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a Reference resource.
@@ -8521,8 +8814,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Reference.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Reference.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing Reference. Note that this operation has PUT semantics;
@@ -8581,8 +8876,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Reference.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Reference.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8664,8 +8961,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ResourceFile.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ResourceFile.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a resource file. For more information about resource files, see
@@ -8734,8 +9033,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ResourceFile.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ResourceFile.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the contents of a resource file. For more information about resource
@@ -8804,7 +9105,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all resource files. For more information about resource files, see
@@ -8864,8 +9168,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudApigeeV1ListEnvironmentResourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ListEnvironmentResourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all resource files. For more information about resource files, see
@@ -8927,8 +9233,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudApigeeV1ListEnvironmentResourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ListEnvironmentResourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a resource file. Specify the `Content-Type` as
@@ -9005,8 +9313,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ResourceFile.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ResourceFile.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9081,7 +9391,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9163,8 +9475,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Deployment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Deployment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the deployment of a shared flow revision and actual state reported by
@@ -9218,8 +9532,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1Deployment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Deployment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeploys a shared flow revision from an environment. For a request path
@@ -9277,7 +9593,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9449,7 +9768,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Stats.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Stats.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9522,8 +9844,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1TargetServer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1TargetServer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a TargetServer from an environment. Returns the deleted
@@ -9576,8 +9900,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1TargetServer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1TargetServer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a TargetServer resource.
@@ -9629,8 +9955,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1TargetServer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1TargetServer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing TargetServer. Note that this operation has PUT
@@ -9690,8 +10018,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1TargetServer.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1TargetServer.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9760,7 +10090,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an Apigee runtime instance. The instance stops serving requests
@@ -9812,7 +10145,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details for an Apigee runtime instance. **Note:** Not supported
@@ -9863,7 +10199,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudApigeeV1Instance.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1Instance.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Apigee runtime instances for the organization. **Note:** Not
@@ -9929,7 +10268,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListInstancesResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reports the latest status for a runtime instance.
@@ -9988,8 +10329,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudApigeeV1ReportInstanceStatusResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ReportInstanceStatusResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10055,7 +10398,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an attachment. **Note:** Not supported for Apigee hybrid.
@@ -10107,7 +10453,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an attachment. **Note:** Not supported for Apigee hybrid.
@@ -10159,8 +10508,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1InstanceAttachment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1InstanceAttachment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all attachments to an instance. **Note:** Not supported for Apigee
@@ -10227,8 +10578,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudApigeeV1ListInstanceAttachmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ListInstanceAttachmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10293,8 +10646,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1KeyValueMap.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1KeyValueMap.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a key value map in an organization.
@@ -10344,8 +10699,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1KeyValueMap.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1KeyValueMap.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10403,7 +10760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -10479,8 +10839,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleLongrunningListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10551,8 +10913,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1CustomReport.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1CustomReport.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an existing custom report definition
@@ -10603,7 +10967,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1DeleteCustomReportResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1DeleteCustomReportResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve a custom report definition.
@@ -10653,8 +11019,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1CustomReport.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1CustomReport.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Return a list of Custom Reports
@@ -10712,7 +11080,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListCustomReportsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListCustomReportsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an existing custom report definition
@@ -10768,8 +11138,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1CustomReport.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1CustomReport.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10856,8 +11228,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1SharedFlowRevision.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1SharedFlowRevision.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a shared flow and all it's revisions. The shared flow must be
@@ -10908,8 +11282,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1SharedFlow.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1SharedFlow.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a shared flow by name, including a list of its revisions.
@@ -10959,8 +11335,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1SharedFlow.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1SharedFlow.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all shared flows in the organization.
@@ -11027,7 +11405,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListSharedFlowsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListSharedFlowsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11088,7 +11468,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11151,8 +11533,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1SharedFlowRevision.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1SharedFlowRevision.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a revision of a shared flow. If `format=bundle` is passed, it instead
@@ -11213,7 +11597,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a shared flow revision. This operation is only allowed on
@@ -11283,8 +11670,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1SharedFlowRevision.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1SharedFlowRevision.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11347,7 +11736,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11422,8 +11813,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiCategory.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiCategory.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a category from the portal.
@@ -11475,8 +11868,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiResponseWrapper.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiResponseWrapper.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a category on the portal.
@@ -11528,8 +11923,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiCategory.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiCategory.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the categories on the portal.
@@ -11582,7 +11979,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudApigeeV1ListApiCategoriesResponse.fromJson(data));
+      (data) => GoogleCloudApigeeV1ListApiCategoriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a category on the portal.
@@ -11640,8 +12039,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudApigeeV1ApiCategory.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudApigeeV1ApiCategory.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11706,7 +12107,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11761,7 +12165,8 @@
       extensions = (_json['extensions'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -11791,13 +12196,16 @@
 
   GoogleCloudApigeeV1Access.fromJson(core.Map _json) {
     if (_json.containsKey('Get')) {
-      Get = GoogleCloudApigeeV1AccessGet.fromJson(_json['Get']);
+      Get = GoogleCloudApigeeV1AccessGet.fromJson(
+          _json['Get'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('Remove')) {
-      Remove = GoogleCloudApigeeV1AccessRemove.fromJson(_json['Remove']);
+      Remove = GoogleCloudApigeeV1AccessRemove.fromJson(
+          _json['Remove'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('Set')) {
-      Set = GoogleCloudApigeeV1AccessSet.fromJson(_json['Set']);
+      Set = GoogleCloudApigeeV1AccessSet.fromJson(
+          _json['Set'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11933,7 +12341,8 @@
       alias = _json['alias'] as core.String;
     }
     if (_json.containsKey('certsInfo')) {
-      certsInfo = GoogleCloudApigeeV1Certificate.fromJson(_json['certsInfo']);
+      certsInfo = GoogleCloudApigeeV1Certificate.fromJson(
+          _json['certsInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -12021,7 +12430,8 @@
 
   GoogleCloudApigeeV1ApiCategory.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
-      data = GoogleCloudApigeeV1ApiCategoryData.fromJson(_json['data']);
+      data = GoogleCloudApigeeV1ApiCategoryData.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errorCode')) {
       errorCode = _json['errorCode'] as core.String;
@@ -12230,8 +12640,9 @@
     }
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('createdAt')) {
@@ -12255,8 +12666,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('operationGroup')) {
-      operationGroup =
-          GoogleCloudApigeeV1OperationGroup.fromJson(_json['operationGroup']);
+      operationGroup = GoogleCloudApigeeV1OperationGroup.fromJson(
+          _json['operationGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('proxies')) {
       proxies = (_json['proxies'] as core.List)
@@ -12381,7 +12792,8 @@
       latestRevisionId = _json['latestRevisionId'] as core.String;
     }
     if (_json.containsKey('metaData')) {
-      metaData = GoogleCloudApigeeV1EntityMetadata.fromJson(_json['metaData']);
+      metaData = GoogleCloudApigeeV1EntityMetadata.fromJson(
+          _json['metaData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -12505,7 +12917,7 @@
     }
     if (_json.containsKey('configurationVersion')) {
       configurationVersion = GoogleCloudApigeeV1ConfigVersion.fromJson(
-          _json['configurationVersion']);
+          _json['configurationVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contextInfo')) {
       contextInfo = _json['contextInfo'] as core.String;
@@ -12521,7 +12933,9 @@
     }
     if (_json.containsKey('entityMetaDataAsProperties')) {
       entityMetaDataAsProperties = commons.mapMap<core.String, core.String>(
-          _json['entityMetaDataAsProperties'].cast<core.String, core.String>(),
+          (_json['entityMetaDataAsProperties']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lastModifiedAt')) {
@@ -12546,8 +12960,8 @@
           .toList();
     }
     if (_json.containsKey('resourceFiles')) {
-      resourceFiles =
-          GoogleCloudApigeeV1ResourceFiles.fromJson(_json['resourceFiles']);
+      resourceFiles = GoogleCloudApigeeV1ResourceFiles.fromJson(
+          _json['resourceFiles'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
@@ -12760,8 +13174,9 @@
   GoogleCloudApigeeV1App.fromJson(core.Map _json) {
     if (_json.containsKey('apiProducts')) {
       apiProducts = (_json['apiProducts'] as core.List)
-          .map<GoogleCloudApigeeV1ApiProductRef>(
-              (value) => GoogleCloudApigeeV1ApiProductRef.fromJson(value))
+          .map<GoogleCloudApigeeV1ApiProductRef>((value) =>
+              GoogleCloudApigeeV1ApiProductRef.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('appId')) {
@@ -12769,8 +13184,9 @@
     }
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('callbackUrl')) {
@@ -12784,8 +13200,9 @@
     }
     if (_json.containsKey('credentials')) {
       credentials = (_json['credentials'] as core.List)
-          .map<GoogleCloudApigeeV1Credential>(
-              (value) => GoogleCloudApigeeV1Credential.fromJson(value))
+          .map<GoogleCloudApigeeV1Credential>((value) =>
+              GoogleCloudApigeeV1Credential.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('developerId')) {
@@ -12911,14 +13328,15 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('queryParams')) {
-      queryParams =
-          GoogleCloudApigeeV1QueryMetadata.fromJson(_json['queryParams']);
+      queryParams = GoogleCloudApigeeV1QueryMetadata.fromJson(
+          _json['queryParams'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reportDefinitionId')) {
       reportDefinitionId = _json['reportDefinitionId'] as core.String;
     }
     if (_json.containsKey('result')) {
-      result = GoogleCloudApigeeV1AsyncQueryResult.fromJson(_json['result']);
+      result = GoogleCloudApigeeV1AsyncQueryResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resultFileSize')) {
       resultFileSize = _json['resultFileSize'] as core.String;
@@ -13050,8 +13468,9 @@
   GoogleCloudApigeeV1Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('attribute')) {
       attribute = (_json['attribute'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13189,8 +13608,9 @@
   GoogleCloudApigeeV1Certificate.fromJson(core.Map _json) {
     if (_json.containsKey('certInfo')) {
       certInfo = (_json['certInfo'] as core.List)
-          .map<GoogleCloudApigeeV1CertInfo>(
-              (value) => GoogleCloudApigeeV1CertInfo.fromJson(value))
+          .map<GoogleCloudApigeeV1CertInfo>((value) =>
+              GoogleCloudApigeeV1CertInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13294,14 +13714,16 @@
   GoogleCloudApigeeV1Credential.fromJson(core.Map _json) {
     if (_json.containsKey('apiProducts')) {
       apiProducts = (_json['apiProducts'] as core.List)
-          .map<GoogleCloudApigeeV1ApiProductRef>(
-              (value) => GoogleCloudApigeeV1ApiProductRef.fromJson(value))
+          .map<GoogleCloudApigeeV1ApiProductRef>((value) =>
+              GoogleCloudApigeeV1ApiProductRef.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('consumerKey')) {
@@ -13472,8 +13894,9 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<GoogleCloudApigeeV1CustomReportMetric>(
-              (value) => GoogleCloudApigeeV1CustomReportMetric.fromJson(value))
+          .map<GoogleCloudApigeeV1CustomReportMetric>((value) =>
+              GoogleCloudApigeeV1CustomReportMetric.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -13487,8 +13910,9 @@
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<GoogleCloudApigeeV1ReportProperty>(
-              (value) => GoogleCloudApigeeV1ReportProperty.fromJson(value))
+          .map<GoogleCloudApigeeV1ReportProperty>((value) =>
+              GoogleCloudApigeeV1ReportProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sortByCols')) {
@@ -13693,8 +14117,8 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('datastoreConfig')) {
-      datastoreConfig =
-          GoogleCloudApigeeV1DatastoreConfig.fromJson(_json['datastoreConfig']);
+      datastoreConfig = GoogleCloudApigeeV1DatastoreConfig.fromJson(
+          _json['datastoreConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -13884,7 +14308,8 @@
     }
     if (_json.containsKey('namespaces')) {
       namespaces = commons.mapMap<core.String, core.String>(
-          _json['namespaces'].cast<core.String, core.String>(),
+          (_json['namespaces'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('requestJSONPaths')) {
@@ -14040,8 +14465,9 @@
     }
     if (_json.containsKey('point')) {
       point = (_json['point'] as core.List)
-          .map<GoogleCloudApigeeV1Point>(
-              (value) => GoogleCloudApigeeV1Point.fromJson(value))
+          .map<GoogleCloudApigeeV1Point>((value) =>
+              GoogleCloudApigeeV1Point.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14137,19 +14563,22 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<GoogleRpcStatus>((value) => GoogleRpcStatus.fromJson(value))
+          .map<GoogleRpcStatus>((value) => GoogleRpcStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
           .map<GoogleCloudApigeeV1InstanceDeploymentStatus>((value) =>
-              GoogleCloudApigeeV1InstanceDeploymentStatus.fromJson(value))
+              GoogleCloudApigeeV1InstanceDeploymentStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pods')) {
       pods = (_json['pods'] as core.List)
-          .map<GoogleCloudApigeeV1PodStatus>(
-              (value) => GoogleCloudApigeeV1PodStatus.fromJson(value))
+          .map<GoogleCloudApigeeV1PodStatus>((value) =>
+              GoogleCloudApigeeV1PodStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('revision')) {
@@ -14160,7 +14589,7 @@
           .map<GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict>(
               (value) =>
                   GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
@@ -14234,7 +14663,7 @@
       routingChanges = (_json['routingChanges'] as core.List)
           .map<GoogleCloudApigeeV1DeploymentChangeReportRoutingChange>(
               (value) => GoogleCloudApigeeV1DeploymentChangeReportRoutingChange
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('routingConflicts')) {
@@ -14242,12 +14671,12 @@
           .map<GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict>(
               (value) =>
                   GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('validationErrors')) {
-      validationErrors =
-          GoogleRpcPreconditionFailure.fromJson(_json['validationErrors']);
+      validationErrors = GoogleRpcPreconditionFailure.fromJson(
+          _json['validationErrors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14302,7 +14731,7 @@
     if (_json.containsKey('fromDeployment')) {
       fromDeployment =
           GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment.fromJson(
-              _json['fromDeployment']);
+              _json['fromDeployment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shouldSequenceRollout')) {
       shouldSequenceRollout = _json['shouldSequenceRollout'] as core.bool;
@@ -14310,7 +14739,7 @@
     if (_json.containsKey('toDeployment')) {
       toDeployment =
           GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment.fromJson(
-              _json['toDeployment']);
+              _json['toDeployment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14355,7 +14784,8 @@
     if (_json.containsKey('conflictingDeployment')) {
       conflictingDeployment =
           GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment.fromJson(
-              _json['conflictingDeployment']);
+              _json['conflictingDeployment']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -14457,7 +14887,8 @@
   GoogleCloudApigeeV1DeploymentConfig.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
       attributes = commons.mapMap<core.String, core.String>(
-          _json['attributes'].cast<core.String, core.String>(),
+          (_json['attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('basePath')) {
@@ -14567,8 +14998,9 @@
     }
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('companies')) {
@@ -14717,8 +15149,9 @@
     }
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('callbackUrl')) {
@@ -14729,8 +15162,9 @@
     }
     if (_json.containsKey('credentials')) {
       credentials = (_json['credentials'] as core.List)
-          .map<GoogleCloudApigeeV1Credential>(
-              (value) => GoogleCloudApigeeV1Credential.fromJson(value))
+          .map<GoogleCloudApigeeV1Credential>((value) =>
+              GoogleCloudApigeeV1Credential.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('developerId')) {
@@ -14843,8 +15277,9 @@
     }
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('consumerKey')) {
@@ -14912,8 +15347,9 @@
   GoogleCloudApigeeV1DimensionMetric.fromJson(core.Map _json) {
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<GoogleCloudApigeeV1Metric>(
-              (value) => GoogleCloudApigeeV1Metric.fromJson(value))
+          .map<GoogleCloudApigeeV1Metric>((value) =>
+              GoogleCloudApigeeV1Metric.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -15016,7 +15452,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = GoogleCloudApigeeV1Properties.fromJson(_json['properties']);
+      properties = GoogleCloudApigeeV1Properties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15110,34 +15547,40 @@
     }
     if (_json.containsKey('dataCollectors')) {
       dataCollectors = (_json['dataCollectors'] as core.List)
-          .map<GoogleCloudApigeeV1DataCollectorConfig>(
-              (value) => GoogleCloudApigeeV1DataCollectorConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1DataCollectorConfig>((value) =>
+              GoogleCloudApigeeV1DataCollectorConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('debugMask')) {
-      debugMask = GoogleCloudApigeeV1DebugMask.fromJson(_json['debugMask']);
+      debugMask = GoogleCloudApigeeV1DebugMask.fromJson(
+          _json['debugMask'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deployments')) {
       deployments = (_json['deployments'] as core.List)
-          .map<GoogleCloudApigeeV1DeploymentConfig>(
-              (value) => GoogleCloudApigeeV1DeploymentConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1DeploymentConfig>((value) =>
+              GoogleCloudApigeeV1DeploymentConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('featureFlags')) {
       featureFlags = commons.mapMap<core.String, core.String>(
-          _json['featureFlags'].cast<core.String, core.String>(),
+          (_json['featureFlags'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('flowhooks')) {
       flowhooks = (_json['flowhooks'] as core.List)
-          .map<GoogleCloudApigeeV1FlowHookConfig>(
-              (value) => GoogleCloudApigeeV1FlowHookConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1FlowHookConfig>((value) =>
+              GoogleCloudApigeeV1FlowHookConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('keystores')) {
       keystores = (_json['keystores'] as core.List)
-          .map<GoogleCloudApigeeV1KeystoreConfig>(
-              (value) => GoogleCloudApigeeV1KeystoreConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1KeystoreConfig>((value) =>
+              GoogleCloudApigeeV1KeystoreConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -15151,14 +15594,16 @@
     }
     if (_json.containsKey('resourceReferences')) {
       resourceReferences = (_json['resourceReferences'] as core.List)
-          .map<GoogleCloudApigeeV1ReferenceConfig>(
-              (value) => GoogleCloudApigeeV1ReferenceConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1ReferenceConfig>((value) =>
+              GoogleCloudApigeeV1ReferenceConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<GoogleCloudApigeeV1ResourceConfig>(
-              (value) => GoogleCloudApigeeV1ResourceConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1ResourceConfig>((value) =>
+              GoogleCloudApigeeV1ResourceConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('revisionId')) {
@@ -15169,13 +15614,14 @@
     }
     if (_json.containsKey('targets')) {
       targets = (_json['targets'] as core.List)
-          .map<GoogleCloudApigeeV1TargetServerConfig>(
-              (value) => GoogleCloudApigeeV1TargetServerConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1TargetServerConfig>((value) =>
+              GoogleCloudApigeeV1TargetServerConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('traceConfig')) {
-      traceConfig =
-          GoogleCloudApigeeV1RuntimeTraceConfig.fromJson(_json['traceConfig']);
+      traceConfig = GoogleCloudApigeeV1RuntimeTraceConfig.fromJson(
+          _json['traceConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uid')) {
       uid = _json['uid'] as core.String;
@@ -15377,8 +15823,9 @@
     }
     if (_json.containsKey('routingRules')) {
       routingRules = (_json['routingRules'] as core.List)
-          .map<GoogleCloudApigeeV1RoutingRule>(
-              (value) => GoogleCloudApigeeV1RoutingRule.fromJson(value))
+          .map<GoogleCloudApigeeV1RoutingRule>((value) =>
+              GoogleCloudApigeeV1RoutingRule.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('uid')) {
@@ -15543,7 +15990,8 @@
       datastoreName = _json['datastoreName'] as core.String;
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = GoogleCloudApigeeV1DateRange.fromJson(_json['dateRange']);
+      dateRange = GoogleCloudApigeeV1DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -15717,7 +16165,8 @@
     if (_json.containsKey('environmentGroups')) {
       environmentGroups = (_json['environmentGroups'] as core.List)
           .map<GoogleCloudApigeeV1EnvironmentGroupConfig>((value) =>
-              GoogleCloudApigeeV1EnvironmentGroupConfig.fromJson(value))
+              GoogleCloudApigeeV1EnvironmentGroupConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -15932,7 +16381,7 @@
           .map<GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision>(
               (value) =>
                   GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deployedRoutes')) {
@@ -15940,7 +16389,7 @@
           .map<GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute>(
               (value) =>
                   GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('instance')) {
@@ -16157,8 +16606,9 @@
   GoogleCloudApigeeV1KeystoreConfig.fromJson(core.Map _json) {
     if (_json.containsKey('aliases')) {
       aliases = (_json['aliases'] as core.List)
-          .map<GoogleCloudApigeeV1AliasRevisionConfig>(
-              (value) => GoogleCloudApigeeV1AliasRevisionConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1AliasRevisionConfig>((value) =>
+              GoogleCloudApigeeV1AliasRevisionConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -16200,8 +16650,9 @@
   GoogleCloudApigeeV1ListApiCategoriesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<GoogleCloudApigeeV1ApiCategoryData>(
-              (value) => GoogleCloudApigeeV1ApiCategoryData.fromJson(value))
+          .map<GoogleCloudApigeeV1ApiCategoryData>((value) =>
+              GoogleCloudApigeeV1ApiCategoryData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('errorCode')) {
@@ -16248,8 +16699,9 @@
   GoogleCloudApigeeV1ListApiProductsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('apiProduct')) {
       apiProduct = (_json['apiProduct'] as core.List)
-          .map<GoogleCloudApigeeV1ApiProduct>(
-              (value) => GoogleCloudApigeeV1ApiProduct.fromJson(value))
+          .map<GoogleCloudApigeeV1ApiProduct>((value) =>
+              GoogleCloudApigeeV1ApiProduct.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16271,8 +16723,9 @@
   GoogleCloudApigeeV1ListApiProxiesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('proxies')) {
       proxies = (_json['proxies'] as core.List)
-          .map<GoogleCloudApigeeV1ApiProxy>(
-              (value) => GoogleCloudApigeeV1ApiProxy.fromJson(value))
+          .map<GoogleCloudApigeeV1ApiProxy>((value) =>
+              GoogleCloudApigeeV1ApiProxy.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16294,8 +16747,9 @@
   GoogleCloudApigeeV1ListAppsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('app')) {
       app = (_json['app'] as core.List)
-          .map<GoogleCloudApigeeV1App>(
-              (value) => GoogleCloudApigeeV1App.fromJson(value))
+          .map<GoogleCloudApigeeV1App>((value) =>
+              GoogleCloudApigeeV1App.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16319,8 +16773,9 @@
   GoogleCloudApigeeV1ListAsyncQueriesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('queries')) {
       queries = (_json['queries'] as core.List)
-          .map<GoogleCloudApigeeV1AsyncQuery>(
-              (value) => GoogleCloudApigeeV1AsyncQuery.fromJson(value))
+          .map<GoogleCloudApigeeV1AsyncQuery>((value) =>
+              GoogleCloudApigeeV1AsyncQuery.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16343,8 +16798,9 @@
   GoogleCloudApigeeV1ListCustomReportsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('qualifier')) {
       qualifier = (_json['qualifier'] as core.List)
-          .map<GoogleCloudApigeeV1CustomReport>(
-              (value) => GoogleCloudApigeeV1CustomReport.fromJson(value))
+          .map<GoogleCloudApigeeV1CustomReport>((value) =>
+              GoogleCloudApigeeV1CustomReport.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16368,8 +16824,9 @@
   GoogleCloudApigeeV1ListDatastoresResponse.fromJson(core.Map _json) {
     if (_json.containsKey('datastores')) {
       datastores = (_json['datastores'] as core.List)
-          .map<GoogleCloudApigeeV1Datastore>(
-              (value) => GoogleCloudApigeeV1Datastore.fromJson(value))
+          .map<GoogleCloudApigeeV1Datastore>((value) =>
+              GoogleCloudApigeeV1Datastore.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16400,8 +16857,9 @@
     }
     if (_json.containsKey('sessions')) {
       sessions = (_json['sessions'] as core.List)
-          .map<GoogleCloudApigeeV1Session>(
-              (value) => GoogleCloudApigeeV1Session.fromJson(value))
+          .map<GoogleCloudApigeeV1Session>((value) =>
+              GoogleCloudApigeeV1Session.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16427,8 +16885,9 @@
   GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deployments')) {
       deployments = (_json['deployments'] as core.List)
-          .map<GoogleCloudApigeeV1Deployment>(
-              (value) => GoogleCloudApigeeV1Deployment.fromJson(value))
+          .map<GoogleCloudApigeeV1Deployment>((value) =>
+              GoogleCloudApigeeV1Deployment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16452,8 +16911,9 @@
   GoogleCloudApigeeV1ListDeveloperAppsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('app')) {
       app = (_json['app'] as core.List)
-          .map<GoogleCloudApigeeV1DeveloperApp>(
-              (value) => GoogleCloudApigeeV1DeveloperApp.fromJson(value))
+          .map<GoogleCloudApigeeV1DeveloperApp>((value) =>
+              GoogleCloudApigeeV1DeveloperApp.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16485,7 +16945,8 @@
       environmentGroupAttachments =
           (_json['environmentGroupAttachments'] as core.List)
               .map<GoogleCloudApigeeV1EnvironmentGroupAttachment>((value) =>
-                  GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(value))
+                  GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -16520,8 +16981,9 @@
   GoogleCloudApigeeV1ListEnvironmentGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('environmentGroups')) {
       environmentGroups = (_json['environmentGroups'] as core.List)
-          .map<GoogleCloudApigeeV1EnvironmentGroup>(
-              (value) => GoogleCloudApigeeV1EnvironmentGroup.fromJson(value))
+          .map<GoogleCloudApigeeV1EnvironmentGroup>((value) =>
+              GoogleCloudApigeeV1EnvironmentGroup.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -16552,8 +17014,9 @@
   GoogleCloudApigeeV1ListEnvironmentResourcesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('resourceFile')) {
       resourceFile = (_json['resourceFile'] as core.List)
-          .map<GoogleCloudApigeeV1ResourceFile>(
-              (value) => GoogleCloudApigeeV1ResourceFile.fromJson(value))
+          .map<GoogleCloudApigeeV1ResourceFile>((value) =>
+              GoogleCloudApigeeV1ResourceFile.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16578,8 +17041,9 @@
   GoogleCloudApigeeV1ListExportsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('exports')) {
       exports = (_json['exports'] as core.List)
-          .map<GoogleCloudApigeeV1Export>(
-              (value) => GoogleCloudApigeeV1Export.fromJson(value))
+          .map<GoogleCloudApigeeV1Export>((value) =>
+              GoogleCloudApigeeV1Export.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16603,7 +17067,8 @@
     if (_json.containsKey('issuers')) {
       issuers = (_json['issuers'] as core.List)
           .map<GoogleCloudApigeeV1ServiceIssuersMapping>((value) =>
-              GoogleCloudApigeeV1ServiceIssuersMapping.fromJson(value))
+              GoogleCloudApigeeV1ServiceIssuersMapping.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16631,8 +17096,9 @@
   GoogleCloudApigeeV1ListInstanceAttachmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('attachments')) {
       attachments = (_json['attachments'] as core.List)
-          .map<GoogleCloudApigeeV1InstanceAttachment>(
-              (value) => GoogleCloudApigeeV1InstanceAttachment.fromJson(value))
+          .map<GoogleCloudApigeeV1InstanceAttachment>((value) =>
+              GoogleCloudApigeeV1InstanceAttachment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -16667,8 +17133,9 @@
   GoogleCloudApigeeV1ListInstancesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<GoogleCloudApigeeV1Instance>(
-              (value) => GoogleCloudApigeeV1Instance.fromJson(value))
+          .map<GoogleCloudApigeeV1Instance>((value) =>
+              GoogleCloudApigeeV1Instance.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -16697,8 +17164,9 @@
   GoogleCloudApigeeV1ListOfDevelopersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('developer')) {
       developer = (_json['developer'] as core.List)
-          .map<GoogleCloudApigeeV1Developer>(
-              (value) => GoogleCloudApigeeV1Developer.fromJson(value))
+          .map<GoogleCloudApigeeV1Developer>((value) =>
+              GoogleCloudApigeeV1Developer.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16722,7 +17190,8 @@
     if (_json.containsKey('organizations')) {
       organizations = (_json['organizations'] as core.List)
           .map<GoogleCloudApigeeV1OrganizationProjectMapping>((value) =>
-              GoogleCloudApigeeV1OrganizationProjectMapping.fromJson(value))
+              GoogleCloudApigeeV1OrganizationProjectMapping.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16745,8 +17214,9 @@
   GoogleCloudApigeeV1ListSharedFlowsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('sharedFlows')) {
       sharedFlows = (_json['sharedFlows'] as core.List)
-          .map<GoogleCloudApigeeV1SharedFlow>(
-              (value) => GoogleCloudApigeeV1SharedFlow.fromJson(value))
+          .map<GoogleCloudApigeeV1SharedFlow>((value) =>
+              GoogleCloudApigeeV1SharedFlow.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16904,18 +17374,21 @@
     }
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleCloudApigeeV1Operation>(
-              (value) => GoogleCloudApigeeV1Operation.fromJson(value))
+          .map<GoogleCloudApigeeV1Operation>((value) =>
+              GoogleCloudApigeeV1Operation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('quota')) {
-      quota = GoogleCloudApigeeV1Quota.fromJson(_json['quota']);
+      quota = GoogleCloudApigeeV1Quota.fromJson(
+          _json['quota'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16960,8 +17433,9 @@
     }
     if (_json.containsKey('operationConfigs')) {
       operationConfigs = (_json['operationConfigs'] as core.List)
-          .map<GoogleCloudApigeeV1OperationConfig>(
-              (value) => GoogleCloudApigeeV1OperationConfig.fromJson(value))
+          .map<GoogleCloudApigeeV1OperationConfig>((value) =>
+              GoogleCloudApigeeV1OperationConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17046,8 +17520,8 @@
 
   GoogleCloudApigeeV1OptimizedStats.fromJson(core.Map _json) {
     if (_json.containsKey('Response')) {
-      Response =
-          GoogleCloudApigeeV1OptimizedStatsResponse.fromJson(_json['Response']);
+      Response = GoogleCloudApigeeV1OptimizedStatsResponse.fromJson(
+          _json['Response'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17118,13 +17592,15 @@
           .toList();
     }
     if (_json.containsKey('metaData')) {
-      metaData = GoogleCloudApigeeV1Metadata.fromJson(_json['metaData']);
+      metaData = GoogleCloudApigeeV1Metadata.fromJson(
+          _json['metaData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resultTruncated')) {
       resultTruncated = _json['resultTruncated'] as core.bool;
     }
     if (_json.containsKey('stats')) {
-      stats = GoogleCloudApigeeV1OptimizedStatsNode.fromJson(_json['stats']);
+      stats = GoogleCloudApigeeV1OptimizedStatsNode.fromJson(
+          _json['stats'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17274,7 +17750,8 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = GoogleCloudApigeeV1Properties.fromJson(_json['properties']);
+      properties = GoogleCloudApigeeV1Properties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('runtimeType')) {
       runtimeType_ = _json['runtimeType'] as core.String;
@@ -17495,8 +17972,9 @@
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<GoogleCloudApigeeV1Result>(
-              (value) => GoogleCloudApigeeV1Result.fromJson(value))
+          .map<GoogleCloudApigeeV1Result>((value) =>
+              GoogleCloudApigeeV1Result.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17524,8 +18002,9 @@
   GoogleCloudApigeeV1Properties.fromJson(core.Map _json) {
     if (_json.containsKey('property')) {
       property = (_json['property'] as core.List)
-          .map<GoogleCloudApigeeV1Property>(
-              (value) => GoogleCloudApigeeV1Property.fromJson(value))
+          .map<GoogleCloudApigeeV1Property>((value) =>
+              GoogleCloudApigeeV1Property.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17692,8 +18171,9 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<GoogleCloudApigeeV1QueryMetric>(
-              (value) => GoogleCloudApigeeV1QueryMetric.fromJson(value))
+          .map<GoogleCloudApigeeV1QueryMetric>((value) =>
+              GoogleCloudApigeeV1QueryMetric.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -18037,8 +18517,9 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<GoogleCloudApigeeV1ResourceStatus>(
-              (value) => GoogleCloudApigeeV1ResourceStatus.fromJson(value))
+          .map<GoogleCloudApigeeV1ResourceStatus>((value) =>
+              GoogleCloudApigeeV1ResourceStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18087,8 +18568,9 @@
     }
     if (_json.containsKey('value')) {
       value = (_json['value'] as core.List)
-          .map<GoogleCloudApigeeV1Attribute>(
-              (value) => GoogleCloudApigeeV1Attribute.fromJson(value))
+          .map<GoogleCloudApigeeV1Attribute>((value) =>
+              GoogleCloudApigeeV1Attribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18178,8 +18660,9 @@
   GoogleCloudApigeeV1ResourceFiles.fromJson(core.Map _json) {
     if (_json.containsKey('resourceFile')) {
       resourceFile = (_json['resourceFile'] as core.List)
-          .map<GoogleCloudApigeeV1ResourceFile>(
-              (value) => GoogleCloudApigeeV1ResourceFile.fromJson(value))
+          .map<GoogleCloudApigeeV1ResourceFile>((value) =>
+              GoogleCloudApigeeV1ResourceFile.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18221,8 +18704,9 @@
     }
     if (_json.containsKey('revisions')) {
       revisions = (_json['revisions'] as core.List)
-          .map<GoogleCloudApigeeV1RevisionStatus>(
-              (value) => GoogleCloudApigeeV1RevisionStatus.fromJson(value))
+          .map<GoogleCloudApigeeV1RevisionStatus>((value) =>
+              GoogleCloudApigeeV1RevisionStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalReplicas')) {
@@ -18310,8 +18794,9 @@
     }
     if (_json.containsKey('accessList')) {
       accessList = (_json['accessList'] as core.List)
-          .map<GoogleCloudApigeeV1Access>(
-              (value) => GoogleCloudApigeeV1Access.fromJson(value))
+          .map<GoogleCloudApigeeV1Access>((value) =>
+              GoogleCloudApigeeV1Access.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('content')) {
@@ -18319,12 +18804,14 @@
     }
     if (_json.containsKey('headers')) {
       headers = (_json['headers'] as core.List)
-          .map<GoogleCloudApigeeV1Property>(
-              (value) => GoogleCloudApigeeV1Property.fromJson(value))
+          .map<GoogleCloudApigeeV1Property>((value) =>
+              GoogleCloudApigeeV1Property.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('properties')) {
-      properties = GoogleCloudApigeeV1Properties.fromJson(_json['properties']);
+      properties = GoogleCloudApigeeV1Properties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reasonPhrase')) {
       reasonPhrase = _json['reasonPhrase'] as core.String;
@@ -18398,8 +18885,9 @@
   GoogleCloudApigeeV1RevisionStatus.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<GoogleCloudApigeeV1UpdateError>(
-              (value) => GoogleCloudApigeeV1UpdateError.fromJson(value))
+          .map<GoogleCloudApigeeV1UpdateError>((value) =>
+              GoogleCloudApigeeV1UpdateError.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('jsonSpec')) {
@@ -18549,7 +19037,8 @@
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
           .map<GoogleCloudApigeeV1RuntimeTraceConfigOverride>((value) =>
-              GoogleCloudApigeeV1RuntimeTraceConfigOverride.fromJson(value))
+              GoogleCloudApigeeV1RuntimeTraceConfigOverride.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('revisionCreateTime')) {
@@ -18560,7 +19049,7 @@
     }
     if (_json.containsKey('samplingConfig')) {
       samplingConfig = GoogleCloudApigeeV1RuntimeTraceSamplingConfig.fromJson(
-          _json['samplingConfig']);
+          _json['samplingConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -18633,7 +19122,7 @@
     }
     if (_json.containsKey('samplingConfig')) {
       samplingConfig = GoogleCloudApigeeV1RuntimeTraceSamplingConfig.fromJson(
-          _json['samplingConfig']);
+          _json['samplingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uid')) {
       uid = _json['uid'] as core.String;
@@ -18710,7 +19199,7 @@
           .map<GoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange>(
               (value) =>
                   GoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('responseCodes')) {
@@ -18801,8 +19290,9 @@
   GoogleCloudApigeeV1Schema.fromJson(core.Map _json) {
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<GoogleCloudApigeeV1SchemaSchemaElement>(
-              (value) => GoogleCloudApigeeV1SchemaSchemaElement.fromJson(value))
+          .map<GoogleCloudApigeeV1SchemaSchemaElement>((value) =>
+              GoogleCloudApigeeV1SchemaSchemaElement.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('meta')) {
@@ -18812,8 +19302,9 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<GoogleCloudApigeeV1SchemaSchemaElement>(
-              (value) => GoogleCloudApigeeV1SchemaSchemaElement.fromJson(value))
+          .map<GoogleCloudApigeeV1SchemaSchemaElement>((value) =>
+              GoogleCloudApigeeV1SchemaSchemaElement.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18849,8 +19340,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties =
-          GoogleCloudApigeeV1SchemaSchemaProperty.fromJson(_json['properties']);
+      properties = GoogleCloudApigeeV1SchemaSchemaProperty.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -18991,7 +19482,8 @@
       latestRevisionId = _json['latestRevisionId'] as core.String;
     }
     if (_json.containsKey('metaData')) {
-      metaData = GoogleCloudApigeeV1EntityMetadata.fromJson(_json['metaData']);
+      metaData = GoogleCloudApigeeV1EntityMetadata.fromJson(
+          _json['metaData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -19076,7 +19568,7 @@
   GoogleCloudApigeeV1SharedFlowRevision.fromJson(core.Map _json) {
     if (_json.containsKey('configurationVersion')) {
       configurationVersion = GoogleCloudApigeeV1ConfigVersion.fromJson(
-          _json['configurationVersion']);
+          _json['configurationVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contextInfo')) {
       contextInfo = _json['contextInfo'] as core.String;
@@ -19092,7 +19584,9 @@
     }
     if (_json.containsKey('entityMetaDataAsProperties')) {
       entityMetaDataAsProperties = commons.mapMap<core.String, core.String>(
-          _json['entityMetaDataAsProperties'].cast<core.String, core.String>(),
+          (_json['entityMetaDataAsProperties']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lastModifiedAt')) {
@@ -19107,8 +19601,8 @@
           .toList();
     }
     if (_json.containsKey('resourceFiles')) {
-      resourceFiles =
-          GoogleCloudApigeeV1ResourceFiles.fromJson(_json['resourceFiles']);
+      resourceFiles = GoogleCloudApigeeV1ResourceFiles.fromJson(
+          _json['resourceFiles'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
@@ -19190,11 +19684,13 @@
     if (_json.containsKey('environments')) {
       environments = (_json['environments'] as core.List)
           .map<GoogleCloudApigeeV1StatsEnvironmentStats>((value) =>
-              GoogleCloudApigeeV1StatsEnvironmentStats.fromJson(value))
+              GoogleCloudApigeeV1StatsEnvironmentStats.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metaData')) {
-      metaData = GoogleCloudApigeeV1Metadata.fromJson(_json['metaData']);
+      metaData = GoogleCloudApigeeV1Metadata.fromJson(
+          _json['metaData'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -19236,14 +19732,16 @@
   GoogleCloudApigeeV1StatsEnvironmentStats.fromJson(core.Map _json) {
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<GoogleCloudApigeeV1DimensionMetric>(
-              (value) => GoogleCloudApigeeV1DimensionMetric.fromJson(value))
+          .map<GoogleCloudApigeeV1DimensionMetric>((value) =>
+              GoogleCloudApigeeV1DimensionMetric.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<GoogleCloudApigeeV1Metric>(
-              (value) => GoogleCloudApigeeV1Metric.fromJson(value))
+          .map<GoogleCloudApigeeV1Metric>((value) =>
+              GoogleCloudApigeeV1Metric.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -19393,7 +19891,8 @@
       port = _json['port'] as core.int;
     }
     if (_json.containsKey('sSLInfo')) {
-      sSLInfo = GoogleCloudApigeeV1TlsInfo.fromJson(_json['sSLInfo']);
+      sSLInfo = GoogleCloudApigeeV1TlsInfo.fromJson(
+          _json['sSLInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -19448,7 +19947,8 @@
       port = _json['port'] as core.int;
     }
     if (_json.containsKey('tlsInfo')) {
-      tlsInfo = GoogleCloudApigeeV1TlsInfoConfig.fromJson(_json['tlsInfo']);
+      tlsInfo = GoogleCloudApigeeV1TlsInfoConfig.fromJson(
+          _json['tlsInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -19552,8 +20052,8 @@
       clientAuthEnabled = _json['clientAuthEnabled'] as core.bool;
     }
     if (_json.containsKey('commonName')) {
-      commonName =
-          GoogleCloudApigeeV1TlsInfoCommonName.fromJson(_json['commonName']);
+      commonName = GoogleCloudApigeeV1TlsInfoCommonName.fromJson(
+          _json['commonName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enabled')) {
       enabled = _json['enabled'] as core.bool;
@@ -19688,8 +20188,8 @@
       clientAuthEnabled = _json['clientAuthEnabled'] as core.bool;
     }
     if (_json.containsKey('commonName')) {
-      commonName =
-          GoogleCloudApigeeV1CommonNameConfig.fromJson(_json['commonName']);
+      commonName = GoogleCloudApigeeV1CommonNameConfig.fromJson(
+          _json['commonName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enabled')) {
       enabled = _json['enabled'] as core.bool;
@@ -19702,7 +20202,7 @@
     }
     if (_json.containsKey('keyAliasReference')) {
       keyAliasReference = GoogleCloudApigeeV1KeyAliasReference.fromJson(
-          _json['keyAliasReference']);
+          _json['keyAliasReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protocols')) {
       protocols = (_json['protocols'] as core.List)
@@ -19908,8 +20408,9 @@
   GoogleIamV1AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<GoogleIamV1AuditLogConfig>(
-              (value) => GoogleIamV1AuditLogConfig.fromJson(value))
+          .map<GoogleIamV1AuditLogConfig>((value) =>
+              GoogleIamV1AuditLogConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -20023,7 +20524,8 @@
 
   GoogleIamV1Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = GoogleTypeExpr.fromJson(_json['condition']);
+      condition = GoogleTypeExpr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -20129,14 +20631,15 @@
   GoogleIamV1Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<GoogleIamV1AuditConfig>(
-              (value) => GoogleIamV1AuditConfig.fromJson(value))
+          .map<GoogleIamV1AuditConfig>((value) =>
+              GoogleIamV1AuditConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<GoogleIamV1Binding>(
-              (value) => GoogleIamV1Binding.fromJson(value))
+          .map<GoogleIamV1Binding>((value) => GoogleIamV1Binding.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -20183,7 +20686,8 @@
 
   GoogleIamV1SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = GoogleIamV1Policy.fromJson(_json['policy']);
+      policy = GoogleIamV1Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -20270,8 +20774,9 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleLongrunningOperation>(
-              (value) => GoogleLongrunningOperation.fromJson(value))
+          .map<GoogleLongrunningOperation>((value) =>
+              GoogleLongrunningOperation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20332,11 +20837,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -20344,7 +20851,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -20400,8 +20908,9 @@
   GoogleRpcPreconditionFailure.fromJson(core.Map _json) {
     if (_json.containsKey('violations')) {
       violations = (_json['violations'] as core.List)
-          .map<GoogleRpcPreconditionFailureViolation>(
-              (value) => GoogleRpcPreconditionFailureViolation.fromJson(value))
+          .map<GoogleRpcPreconditionFailureViolation>((value) =>
+              GoogleRpcPreconditionFailureViolation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20493,7 +21002,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/appengine/v1.dart b/generated/googleapis/lib/appengine/v1.dart
index 3340a69..38b8dc5 100644
--- a/generated/googleapis/lib/appengine/v1.dart
+++ b/generated/googleapis/lib/appengine/v1.dart
@@ -124,7 +124,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about an application.
@@ -173,7 +175,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Application.fromJson(data));
+    return _response.then(
+      (data) =>
+          Application.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified Application resource. You can update the following
@@ -237,7 +242,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Recreates the required App Engine features for the specified App Engine
@@ -301,7 +308,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -365,7 +374,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AuthorizedCertificate.fromJson(data));
+    return _response.then(
+      (data) => AuthorizedCertificate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified SSL certificate.
@@ -425,7 +437,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified SSL certificate.
@@ -497,7 +511,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AuthorizedCertificate.fromJson(data));
+    return _response.then(
+      (data) => AuthorizedCertificate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all SSL certificates the user is authorized to administer.
@@ -572,8 +589,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAuthorizedCertificatesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAuthorizedCertificatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified SSL certificate. To renew a certificate and maintain
@@ -651,7 +670,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AuthorizedCertificate.fromJson(data));
+    return _response.then(
+      (data) => AuthorizedCertificate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -721,8 +743,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAuthorizedDomainsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAuthorizedDomainsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -805,7 +829,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified domain mapping. A user must be authorized to
@@ -865,7 +891,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified domain mapping.
@@ -923,7 +951,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainMapping.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainMapping.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the domain mappings on an application.
@@ -986,7 +1017,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDomainMappingsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDomainMappingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified domain mapping. To map an SSL certificate to a
@@ -1059,7 +1093,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1135,8 +1171,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchUpdateIngressRulesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchUpdateIngressRulesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a firewall rule for the application.
@@ -1193,7 +1231,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FirewallRule.fromJson(data));
+    return _response.then(
+      (data) =>
+          FirewallRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified firewall rule.
@@ -1251,7 +1292,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified firewall rule.
@@ -1309,7 +1352,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FirewallRule.fromJson(data));
+    return _response.then(
+      (data) =>
+          FirewallRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the firewall rules of an application.
@@ -1380,7 +1426,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListIngressRulesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListIngressRulesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified firewall rule.
@@ -1450,7 +1499,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FirewallRule.fromJson(data));
+    return _response.then(
+      (data) =>
+          FirewallRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1513,7 +1565,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -1580,7 +1634,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1645,7 +1702,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1720,7 +1779,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1787,7 +1849,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the current configuration of the specified service.
@@ -1845,7 +1909,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the services in the application.
@@ -1906,7 +1972,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the configuration of the specified service.
@@ -1994,7 +2063,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2069,7 +2140,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an existing Version resource.
@@ -2135,7 +2208,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified Version resource. By default, only a BASIC_VIEW will be
@@ -2214,7 +2289,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Version.fromJson(data));
+    return _response.then(
+      (data) => Version.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the versions of a service.
@@ -2297,7 +2374,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified Version resource. You can specify the following
@@ -2406,7 +2486,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2499,7 +2581,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stops a running instance.The instance might be automatically recreated
@@ -2583,7 +2667,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets instance information.
@@ -2657,7 +2743,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Instance.fromJson(data));
+    return _response.then(
+      (data) => Instance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the instances of a version.Tip: To aggregate details about instances
@@ -2738,7 +2826,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInstancesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2947,17 +3038,20 @@
     }
     if (_json.containsKey('dispatchRules')) {
       dispatchRules = (_json['dispatchRules'] as core.List)
-          .map<UrlDispatchRule>((value) => UrlDispatchRule.fromJson(value))
+          .map<UrlDispatchRule>((value) => UrlDispatchRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('featureSettings')) {
-      featureSettings = FeatureSettings.fromJson(_json['featureSettings']);
+      featureSettings = FeatureSettings.fromJson(
+          _json['featureSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gcrDomain')) {
       gcrDomain = _json['gcrDomain'] as core.String;
     }
     if (_json.containsKey('iap')) {
-      iap = IdentityAwareProxy.fromJson(_json['iap']);
+      iap = IdentityAwareProxy.fromJson(
+          _json['iap'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -3076,8 +3170,8 @@
 
   AuthorizedCertificate.fromJson(core.Map _json) {
     if (_json.containsKey('certificateRawData')) {
-      certificateRawData =
-          CertificateRawData.fromJson(_json['certificateRawData']);
+      certificateRawData = CertificateRawData.fromJson(
+          _json['certificateRawData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -3097,8 +3191,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('managedCertificate')) {
-      managedCertificate =
-          ManagedCertificate.fromJson(_json['managedCertificate']);
+      managedCertificate = ManagedCertificate.fromJson(
+          _json['managedCertificate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3240,10 +3334,12 @@
       coolDownPeriod = _json['coolDownPeriod'] as core.String;
     }
     if (_json.containsKey('cpuUtilization')) {
-      cpuUtilization = CpuUtilization.fromJson(_json['cpuUtilization']);
+      cpuUtilization = CpuUtilization.fromJson(
+          _json['cpuUtilization'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diskUtilization')) {
-      diskUtilization = DiskUtilization.fromJson(_json['diskUtilization']);
+      diskUtilization = DiskUtilization.fromJson(
+          _json['diskUtilization'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxConcurrentRequests')) {
       maxConcurrentRequests = _json['maxConcurrentRequests'] as core.int;
@@ -3267,16 +3363,17 @@
       minTotalInstances = _json['minTotalInstances'] as core.int;
     }
     if (_json.containsKey('networkUtilization')) {
-      networkUtilization =
-          NetworkUtilization.fromJson(_json['networkUtilization']);
+      networkUtilization = NetworkUtilization.fromJson(
+          _json['networkUtilization'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestUtilization')) {
-      requestUtilization =
-          RequestUtilization.fromJson(_json['requestUtilization']);
+      requestUtilization = RequestUtilization.fromJson(
+          _json['requestUtilization'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('standardSchedulerSettings')) {
       standardSchedulerSettings = StandardSchedulerSettings.fromJson(
-          _json['standardSchedulerSettings']);
+          _json['standardSchedulerSettings']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3370,7 +3467,8 @@
   BatchUpdateIngressRulesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('ingressRules')) {
       ingressRules = (_json['ingressRules'] as core.List)
-          .map<FirewallRule>((value) => FirewallRule.fromJson(value))
+          .map<FirewallRule>((value) => FirewallRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3395,7 +3493,8 @@
   BatchUpdateIngressRulesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('ingressRules')) {
       ingressRules = (_json['ingressRules'] as core.List)
-          .map<FirewallRule>((value) => FirewallRule.fromJson(value))
+          .map<FirewallRule>((value) => FirewallRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3663,19 +3762,23 @@
 
   Deployment.fromJson(core.Map _json) {
     if (_json.containsKey('cloudBuildOptions')) {
-      cloudBuildOptions =
-          CloudBuildOptions.fromJson(_json['cloudBuildOptions']);
+      cloudBuildOptions = CloudBuildOptions.fromJson(
+          _json['cloudBuildOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('container')) {
-      container = ContainerInfo.fromJson(_json['container']);
+      container = ContainerInfo.fromJson(
+          _json['container'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('files')) {
       files = commons.mapMap<core.Map, FileInfo>(
-          _json['files'].cast<core.String, core.Map>(),
-          (core.Map item) => FileInfo.fromJson(item));
+          (_json['files'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              FileInfo.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('zip')) {
-      zip = ZipInfo.fromJson(_json['zip']);
+      zip =
+          ZipInfo.fromJson(_json['zip'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3779,11 +3882,13 @@
     }
     if (_json.containsKey('resourceRecords')) {
       resourceRecords = (_json['resourceRecords'] as core.List)
-          .map<ResourceRecord>((value) => ResourceRecord.fromJson(value))
+          .map<ResourceRecord>((value) => ResourceRecord.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sslSettings')) {
-      sslSettings = SslSettings.fromJson(_json['sslSettings']);
+      sslSettings = SslSettings.fromJson(
+          _json['sslSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4461,8 +4566,8 @@
   ListAuthorizedCertificatesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('certificates')) {
       certificates = (_json['certificates'] as core.List)
-          .map<AuthorizedCertificate>(
-              (value) => AuthorizedCertificate.fromJson(value))
+          .map<AuthorizedCertificate>((value) => AuthorizedCertificate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4496,7 +4601,8 @@
   ListAuthorizedDomainsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('domains')) {
       domains = (_json['domains'] as core.List)
-          .map<AuthorizedDomain>((value) => AuthorizedDomain.fromJson(value))
+          .map<AuthorizedDomain>((value) => AuthorizedDomain.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4529,7 +4635,8 @@
   ListDomainMappingsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('domainMappings')) {
       domainMappings = (_json['domainMappings'] as core.List)
-          .map<DomainMapping>((value) => DomainMapping.fromJson(value))
+          .map<DomainMapping>((value) => DomainMapping.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4563,7 +4670,8 @@
   ListIngressRulesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('ingressRules')) {
       ingressRules = (_json['ingressRules'] as core.List)
-          .map<FirewallRule>((value) => FirewallRule.fromJson(value))
+          .map<FirewallRule>((value) => FirewallRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4597,7 +4705,8 @@
   ListInstancesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4630,7 +4739,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4666,7 +4776,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4699,7 +4810,8 @@
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<Service>((value) => Service.fromJson(value))
+          .map<Service>((value) =>
+              Service.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4732,7 +4844,8 @@
     }
     if (_json.containsKey('versions')) {
       versions = (_json['versions'] as core.List)
-          .map<Version>((value) => Version.fromJson(value))
+          .map<Version>((value) =>
+              Version.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4861,7 +4974,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -4869,7 +4983,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -5222,11 +5337,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -5234,7 +5351,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -5292,8 +5410,9 @@
 
   OperationMetadataV1.fromJson(core.Map _json) {
     if (_json.containsKey('createVersionMetadata')) {
-      createVersionMetadata =
-          CreateVersionMetadataV1.fromJson(_json['createVersionMetadata']);
+      createVersionMetadata = CreateVersionMetadataV1.fromJson(
+          _json['createVersionMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -5382,8 +5501,9 @@
 
   OperationMetadataV1Alpha.fromJson(core.Map _json) {
     if (_json.containsKey('createVersionMetadata')) {
-      createVersionMetadata =
-          CreateVersionMetadataV1Alpha.fromJson(_json['createVersionMetadata']);
+      createVersionMetadata = CreateVersionMetadataV1Alpha.fromJson(
+          _json['createVersionMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -5472,8 +5592,9 @@
 
   OperationMetadataV1Beta.fromJson(core.Map _json) {
     if (_json.containsKey('createVersionMetadata')) {
-      createVersionMetadata =
-          CreateVersionMetadataV1Beta.fromJson(_json['createVersionMetadata']);
+      createVersionMetadata = CreateVersionMetadataV1Beta.fromJson(
+          _json['createVersionMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -5739,7 +5860,8 @@
     }
     if (_json.containsKey('volumes')) {
       volumes = (_json['volumes'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5819,10 +5941,12 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('networkSettings')) {
-      networkSettings = NetworkSettings.fromJson(_json['networkSettings']);
+      networkSettings = NetworkSettings.fromJson(
+          _json['networkSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('split')) {
-      split = TrafficSplit.fromJson(_json['split']);
+      split = TrafficSplit.fromJson(
+          _json['split'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6007,7 +6131,8 @@
     }
     if (_json.containsKey('httpHeaders')) {
       httpHeaders = commons.mapMap<core.String, core.String>(
-          _json['httpHeaders'].cast<core.String, core.String>(),
+          (_json['httpHeaders'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('mimeType')) {
@@ -6083,7 +6208,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -6140,7 +6266,8 @@
   TrafficSplit.fromJson(core.Map _json) {
     if (_json.containsKey('allocations')) {
       allocations = commons.mapMap<core.num, core.double>(
-          _json['allocations'].cast<core.String, core.num>(),
+          (_json['allocations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.num>(),
           (core.num item) => (item as core.num).toDouble());
     }
     if (_json.containsKey('shardBy')) {
@@ -6281,7 +6408,8 @@
 
   UrlMap.fromJson(core.Map _json) {
     if (_json.containsKey('apiEndpoint')) {
-      apiEndpoint = ApiEndpointHandler.fromJson(_json['apiEndpoint']);
+      apiEndpoint = ApiEndpointHandler.fromJson(
+          _json['apiEndpoint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('authFailAction')) {
       authFailAction = _json['authFailAction'] as core.String;
@@ -6294,13 +6422,15 @@
           _json['redirectHttpResponseCode'] as core.String;
     }
     if (_json.containsKey('script')) {
-      script = ScriptHandler.fromJson(_json['script']);
+      script = ScriptHandler.fromJson(
+          _json['script'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('securityLevel')) {
       securityLevel = _json['securityLevel'] as core.String;
     }
     if (_json.containsKey('staticFiles')) {
-      staticFiles = StaticFilesHandler.fromJson(_json['staticFiles']);
+      staticFiles = StaticFilesHandler.fromJson(
+          _json['staticFiles'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('urlRegex')) {
       urlRegex = _json['urlRegex'] as core.String;
@@ -6513,22 +6643,27 @@
 
   Version.fromJson(core.Map _json) {
     if (_json.containsKey('apiConfig')) {
-      apiConfig = ApiConfigHandler.fromJson(_json['apiConfig']);
+      apiConfig = ApiConfigHandler.fromJson(
+          _json['apiConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('automaticScaling')) {
-      automaticScaling = AutomaticScaling.fromJson(_json['automaticScaling']);
+      automaticScaling = AutomaticScaling.fromJson(
+          _json['automaticScaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('basicScaling')) {
-      basicScaling = BasicScaling.fromJson(_json['basicScaling']);
+      basicScaling = BasicScaling.fromJson(
+          _json['basicScaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('betaSettings')) {
       betaSettings = commons.mapMap<core.String, core.String>(
-          _json['betaSettings'].cast<core.String, core.String>(),
+          (_json['betaSettings'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('buildEnvVariables')) {
       buildEnvVariables = commons.mapMap<core.String, core.String>(
-          _json['buildEnvVariables'].cast<core.String, core.String>(),
+          (_json['buildEnvVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('createTime')) {
@@ -6541,38 +6676,44 @@
       defaultExpiration = _json['defaultExpiration'] as core.String;
     }
     if (_json.containsKey('deployment')) {
-      deployment = Deployment.fromJson(_json['deployment']);
+      deployment = Deployment.fromJson(
+          _json['deployment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diskUsageBytes')) {
       diskUsageBytes = _json['diskUsageBytes'] as core.String;
     }
     if (_json.containsKey('endpointsApiService')) {
-      endpointsApiService =
-          EndpointsApiService.fromJson(_json['endpointsApiService']);
+      endpointsApiService = EndpointsApiService.fromJson(
+          _json['endpointsApiService'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entrypoint')) {
-      entrypoint = Entrypoint.fromJson(_json['entrypoint']);
+      entrypoint = Entrypoint.fromJson(
+          _json['entrypoint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('env')) {
       env = _json['env'] as core.String;
     }
     if (_json.containsKey('envVariables')) {
       envVariables = commons.mapMap<core.String, core.String>(
-          _json['envVariables'].cast<core.String, core.String>(),
+          (_json['envVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('errorHandlers')) {
       errorHandlers = (_json['errorHandlers'] as core.List)
-          .map<ErrorHandler>((value) => ErrorHandler.fromJson(value))
+          .map<ErrorHandler>((value) => ErrorHandler.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('handlers')) {
       handlers = (_json['handlers'] as core.List)
-          .map<UrlMap>((value) => UrlMap.fromJson(value))
+          .map<UrlMap>((value) =>
+              UrlMap.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('healthCheck')) {
-      healthCheck = HealthCheck.fromJson(_json['healthCheck']);
+      healthCheck = HealthCheck.fromJson(
+          _json['healthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -6587,29 +6728,35 @@
     }
     if (_json.containsKey('libraries')) {
       libraries = (_json['libraries'] as core.List)
-          .map<Library>((value) => Library.fromJson(value))
+          .map<Library>((value) =>
+              Library.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('livenessCheck')) {
-      livenessCheck = LivenessCheck.fromJson(_json['livenessCheck']);
+      livenessCheck = LivenessCheck.fromJson(
+          _json['livenessCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('manualScaling')) {
-      manualScaling = ManualScaling.fromJson(_json['manualScaling']);
+      manualScaling = ManualScaling.fromJson(
+          _json['manualScaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('network')) {
-      network = Network.fromJson(_json['network']);
+      network = Network.fromJson(
+          _json['network'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nobuildFilesRegex')) {
       nobuildFilesRegex = _json['nobuildFilesRegex'] as core.String;
     }
     if (_json.containsKey('readinessCheck')) {
-      readinessCheck = ReadinessCheck.fromJson(_json['readinessCheck']);
+      readinessCheck = ReadinessCheck.fromJson(
+          _json['readinessCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resources')) {
-      resources = Resources.fromJson(_json['resources']);
+      resources = Resources.fromJson(
+          _json['resources'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('runtime')) {
       runtime = _json['runtime'] as core.String;
@@ -6637,8 +6784,8 @@
       vm = _json['vm'] as core.bool;
     }
     if (_json.containsKey('vpcAccessConnector')) {
-      vpcAccessConnector =
-          VpcAccessConnector.fromJson(_json['vpcAccessConnector']);
+      vpcAccessConnector = VpcAccessConnector.fromJson(
+          _json['vpcAccessConnector'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zones')) {
       zones = (_json['zones'] as core.List)
diff --git a/generated/googleapis/lib/bigquery/v2.dart b/generated/googleapis/lib/bigquery/v2.dart
index 6ae62b0..88d451e 100644
--- a/generated/googleapis/lib/bigquery/v2.dart
+++ b/generated/googleapis/lib/bigquery/v2.dart
@@ -158,7 +158,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns the dataset specified by datasetID.
@@ -215,7 +217,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new empty dataset.
@@ -270,7 +274,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all datasets in the specified project to which you have been granted
@@ -349,7 +355,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DatasetList.fromJson(data));
+    return _response.then(
+      (data) =>
+          DatasetList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates information in an existing dataset. The update method replaces the
@@ -415,7 +424,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates information in an existing dataset. The update method replaces the
@@ -480,7 +491,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -554,7 +567,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => JobCancelResponse.fromJson(data));
+    return _response.then(
+      (data) => JobCancelResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about a specific job. Job information is available for
@@ -621,7 +637,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the results of a query job.
@@ -713,7 +731,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetQueryResultsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetQueryResultsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts a new asynchronous job. Requires the Can View project role.
@@ -789,7 +810,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all jobs that you started in the specified project. Job information
@@ -899,7 +922,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => JobList.fromJson(data));
+    return _response.then(
+      (data) => JobList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs a BigQuery SQL query synchronously and returns query results if the
@@ -955,7 +980,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => QueryResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          QueryResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1029,7 +1057,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified model resource by model ID.
@@ -1097,7 +1127,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Model.fromJson(data));
+    return _response.then(
+      (data) => Model.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all models in the specified dataset. Requires the READER dataset
@@ -1173,7 +1205,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListModelsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListModelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch specific fields in the specified model.
@@ -1247,7 +1282,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Model.fromJson(data));
+    return _response.then(
+      (data) => Model.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1304,7 +1341,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetServiceAccountResponse.fromJson(data));
+    return _response.then(
+      (data) => GetServiceAccountResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all projects to which you have been granted any project role.
@@ -1359,7 +1399,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProjectList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProjectList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1433,7 +1476,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified routine resource by routine ID.
@@ -1508,7 +1553,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Routine.fromJson(data));
+    return _response.then(
+      (data) => Routine.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new routine in the dataset.
@@ -1574,7 +1621,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Routine.fromJson(data));
+    return _response.then(
+      (data) => Routine.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all routines in the specified dataset. Requires the READER dataset
@@ -1669,7 +1718,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRoutinesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRoutinesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates information in an existing routine. The update method replaces the
@@ -1744,7 +1796,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Routine.fromJson(data));
+    return _response.then(
+      (data) => Routine.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1823,7 +1877,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TableDataInsertAllResponse.fromJson(data));
+    return _response.then(
+      (data) => TableDataInsertAllResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves table data from a specified set of rows. Requires the READER
@@ -1916,7 +1973,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TableDataList.fromJson(data));
+    return _response.then(
+      (data) =>
+          TableDataList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1988,7 +2048,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified table resource by table ID. This method does not return
@@ -2062,7 +2124,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Table.fromJson(data));
+    return _response.then(
+      (data) => Table.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -2120,7 +2184,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new, empty table in the dataset.
@@ -2184,7 +2250,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Table.fromJson(data));
+    return _response.then(
+      (data) => Table.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all tables in the specified dataset. Requires the READER dataset
@@ -2256,7 +2324,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TableList.fromJson(data));
+    return _response.then(
+      (data) => TableList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates information in an existing table. The update method replaces the
@@ -2330,7 +2400,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Table.fromJson(data));
+    return _response.then(
+      (data) => Table.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -2389,7 +2461,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -2451,7 +2525,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates information in an existing table. The update method replaces the
@@ -2524,7 +2601,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Table.fromJson(data));
+    return _response.then(
+      (data) => Table.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2650,7 +2729,8 @@
       argumentKind = _json['argumentKind'] as core.String;
     }
     if (_json.containsKey('dataType')) {
-      dataType = StandardSqlDataType.fromJson(_json['dataType']);
+      dataType = StandardSqlDataType.fromJson(
+          _json['dataType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mode')) {
       mode = _json['mode'] as core.String;
@@ -2794,15 +2874,16 @@
   ArimaForecastingMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('arimaFittingMetrics')) {
       arimaFittingMetrics = (_json['arimaFittingMetrics'] as core.List)
-          .map<ArimaFittingMetrics>(
-              (value) => ArimaFittingMetrics.fromJson(value))
+          .map<ArimaFittingMetrics>((value) => ArimaFittingMetrics.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('arimaSingleModelForecastingMetrics')) {
       arimaSingleModelForecastingMetrics =
           (_json['arimaSingleModelForecastingMetrics'] as core.List)
-              .map<ArimaSingleModelForecastingMetrics>(
-                  (value) => ArimaSingleModelForecastingMetrics.fromJson(value))
+              .map<ArimaSingleModelForecastingMetrics>((value) =>
+                  ArimaSingleModelForecastingMetrics.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('hasDrift')) {
@@ -2812,7 +2893,8 @@
     }
     if (_json.containsKey('nonSeasonalOrder')) {
       nonSeasonalOrder = (_json['nonSeasonalOrder'] as core.List)
-          .map<ArimaOrder>((value) => ArimaOrder.fromJson(value))
+          .map<ArimaOrder>((value) =>
+              ArimaOrder.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('seasonalPeriods')) {
@@ -2882,18 +2964,19 @@
 
   ArimaModelInfo.fromJson(core.Map _json) {
     if (_json.containsKey('arimaCoefficients')) {
-      arimaCoefficients =
-          ArimaCoefficients.fromJson(_json['arimaCoefficients']);
+      arimaCoefficients = ArimaCoefficients.fromJson(
+          _json['arimaCoefficients'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('arimaFittingMetrics')) {
-      arimaFittingMetrics =
-          ArimaFittingMetrics.fromJson(_json['arimaFittingMetrics']);
+      arimaFittingMetrics = ArimaFittingMetrics.fromJson(
+          _json['arimaFittingMetrics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hasDrift')) {
       hasDrift = _json['hasDrift'] as core.bool;
     }
     if (_json.containsKey('nonSeasonalOrder')) {
-      nonSeasonalOrder = ArimaOrder.fromJson(_json['nonSeasonalOrder']);
+      nonSeasonalOrder = ArimaOrder.fromJson(
+          _json['nonSeasonalOrder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('seasonalPeriods')) {
       seasonalPeriods = (_json['seasonalPeriods'] as core.List)
@@ -2985,7 +3068,8 @@
   ArimaResult.fromJson(core.Map _json) {
     if (_json.containsKey('arimaModelInfo')) {
       arimaModelInfo = (_json['arimaModelInfo'] as core.List)
-          .map<ArimaModelInfo>((value) => ArimaModelInfo.fromJson(value))
+          .map<ArimaModelInfo>((value) => ArimaModelInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('seasonalPeriods')) {
@@ -3031,14 +3115,15 @@
 
   ArimaSingleModelForecastingMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('arimaFittingMetrics')) {
-      arimaFittingMetrics =
-          ArimaFittingMetrics.fromJson(_json['arimaFittingMetrics']);
+      arimaFittingMetrics = ArimaFittingMetrics.fromJson(
+          _json['arimaFittingMetrics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hasDrift')) {
       hasDrift = _json['hasDrift'] as core.bool;
     }
     if (_json.containsKey('nonSeasonalOrder')) {
-      nonSeasonalOrder = ArimaOrder.fromJson(_json['nonSeasonalOrder']);
+      nonSeasonalOrder = ArimaOrder.fromJson(
+          _json['nonSeasonalOrder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('seasonalPeriods')) {
       seasonalPeriods = (_json['seasonalPeriods'] as core.List)
@@ -3101,7 +3186,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -3328,7 +3414,8 @@
   BigtableColumnFamily.fromJson(core.Map _json) {
     if (_json.containsKey('columns')) {
       columns = (_json['columns'] as core.List)
-          .map<BigtableColumn>((value) => BigtableColumn.fromJson(value))
+          .map<BigtableColumn>((value) => BigtableColumn.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('encoding')) {
@@ -3393,8 +3480,8 @@
   BigtableOptions.fromJson(core.Map _json) {
     if (_json.containsKey('columnFamilies')) {
       columnFamilies = (_json['columnFamilies'] as core.List)
-          .map<BigtableColumnFamily>(
-              (value) => BigtableColumnFamily.fromJson(value))
+          .map<BigtableColumnFamily>((value) => BigtableColumnFamily.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('ignoreUnspecifiedColumnFamilies')) {
@@ -3442,14 +3529,15 @@
   BinaryClassificationMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('aggregateClassificationMetrics')) {
       aggregateClassificationMetrics = AggregateClassificationMetrics.fromJson(
-          _json['aggregateClassificationMetrics']);
+          _json['aggregateClassificationMetrics']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('binaryConfusionMatrixList')) {
-      binaryConfusionMatrixList =
-          (_json['binaryConfusionMatrixList'] as core.List)
-              .map<BinaryConfusionMatrix>(
-                  (value) => BinaryConfusionMatrix.fromJson(value))
-              .toList();
+      binaryConfusionMatrixList = (_json['binaryConfusionMatrixList']
+              as core.List)
+          .map<BinaryConfusionMatrix>((value) => BinaryConfusionMatrix.fromJson(
+              value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
     if (_json.containsKey('negativeLabel')) {
       negativeLabel = _json['negativeLabel'] as core.String;
@@ -3626,7 +3714,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -3827,8 +3916,8 @@
   BqmlTrainingRun.fromJson(core.Map _json) {
     if (_json.containsKey('iterationResults')) {
       iterationResults = (_json['iterationResults'] as core.List)
-          .map<BqmlIterationResult>(
-              (value) => BqmlIterationResult.fromJson(value))
+          .map<BqmlIterationResult>((value) => BqmlIterationResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startTime')) {
@@ -3838,8 +3927,8 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('trainingOptions')) {
-      trainingOptions =
-          BqmlTrainingRunTrainingOptions.fromJson(_json['trainingOptions']);
+      trainingOptions = BqmlTrainingRunTrainingOptions.fromJson(
+          _json['trainingOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3875,7 +3964,8 @@
   CategoricalValue.fromJson(core.Map _json) {
     if (_json.containsKey('categoryCounts')) {
       categoryCounts = (_json['categoryCounts'] as core.List)
-          .map<CategoryCount>((value) => CategoryCount.fromJson(value))
+          .map<CategoryCount>((value) => CategoryCount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3943,7 +4033,8 @@
     }
     if (_json.containsKey('featureValues')) {
       featureValues = (_json['featureValues'] as core.List)
-          .map<FeatureValue>((value) => FeatureValue.fromJson(value))
+          .map<FeatureValue>((value) => FeatureValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4048,7 +4139,8 @@
   ClusteringMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('clusters')) {
       clusters = (_json['clusters'] as core.List)
-          .map<Cluster>((value) => Cluster.fromJson(value))
+          .map<Cluster>((value) =>
+              Cluster.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('daviesBouldinIndex')) {
@@ -4093,7 +4185,8 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<Row>((value) => Row.fromJson(value))
+          .map<Row>((value) =>
+              Row.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4247,10 +4340,12 @@
 
   DataSplitResult.fromJson(core.Map _json) {
     if (_json.containsKey('evaluationTable')) {
-      evaluationTable = TableReference.fromJson(_json['evaluationTable']);
+      evaluationTable = TableReference.fromJson(
+          _json['evaluationTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trainingTable')) {
-      trainingTable = TableReference.fromJson(_json['trainingTable']);
+      trainingTable = TableReference.fromJson(
+          _json['trainingTable'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4330,7 +4425,8 @@
       userByEmail = _json['userByEmail'] as core.String;
     }
     if (_json.containsKey('view')) {
-      view = TableReference.fromJson(_json['view']);
+      view = TableReference.fromJson(
+          _json['view'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4449,18 +4545,21 @@
   Dataset.fromJson(core.Map _json) {
     if (_json.containsKey('access')) {
       access = (_json['access'] as core.List)
-          .map<DatasetAccess>((value) => DatasetAccess.fromJson(value))
+          .map<DatasetAccess>((value) => DatasetAccess.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creationTime')) {
       creationTime = _json['creationTime'] as core.String;
     }
     if (_json.containsKey('datasetReference')) {
-      datasetReference = DatasetReference.fromJson(_json['datasetReference']);
+      datasetReference = DatasetReference.fromJson(
+          _json['datasetReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultEncryptionConfiguration')) {
       defaultEncryptionConfiguration = EncryptionConfiguration.fromJson(
-          _json['defaultEncryptionConfiguration']);
+          _json['defaultEncryptionConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultPartitionExpirationMs')) {
       defaultPartitionExpirationMs =
@@ -4487,7 +4586,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lastModifiedTime')) {
@@ -4585,7 +4685,8 @@
 
   DatasetListDatasets.fromJson(core.Map _json) {
     if (_json.containsKey('datasetReference')) {
-      datasetReference = DatasetReference.fromJson(_json['datasetReference']);
+      datasetReference = DatasetReference.fromJson(
+          _json['datasetReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('friendlyName')) {
       friendlyName = _json['friendlyName'] as core.String;
@@ -4598,7 +4699,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('location')) {
@@ -4654,8 +4756,8 @@
   DatasetList.fromJson(core.Map _json) {
     if (_json.containsKey('datasets')) {
       datasets = (_json['datasets'] as core.List)
-          .map<DatasetListDatasets>(
-              (value) => DatasetListDatasets.fromJson(value))
+          .map<DatasetListDatasets>((value) => DatasetListDatasets.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -4749,7 +4851,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -4900,28 +5003,32 @@
 
   EvaluationMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('arimaForecastingMetrics')) {
-      arimaForecastingMetrics =
-          ArimaForecastingMetrics.fromJson(_json['arimaForecastingMetrics']);
+      arimaForecastingMetrics = ArimaForecastingMetrics.fromJson(
+          _json['arimaForecastingMetrics']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('binaryClassificationMetrics')) {
       binaryClassificationMetrics = BinaryClassificationMetrics.fromJson(
-          _json['binaryClassificationMetrics']);
+          _json['binaryClassificationMetrics']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clusteringMetrics')) {
-      clusteringMetrics =
-          ClusteringMetrics.fromJson(_json['clusteringMetrics']);
+      clusteringMetrics = ClusteringMetrics.fromJson(
+          _json['clusteringMetrics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('multiClassClassificationMetrics')) {
       multiClassClassificationMetrics =
           MultiClassClassificationMetrics.fromJson(
-              _json['multiClassClassificationMetrics']);
+              _json['multiClassClassificationMetrics']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rankingMetrics')) {
-      rankingMetrics = RankingMetrics.fromJson(_json['rankingMetrics']);
+      rankingMetrics = RankingMetrics.fromJson(
+          _json['rankingMetrics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('regressionMetrics')) {
-      regressionMetrics =
-          RegressionMetrics.fromJson(_json['regressionMetrics']);
+      regressionMetrics = RegressionMetrics.fromJson(
+          _json['regressionMetrics'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5114,7 +5221,8 @@
     }
     if (_json.containsKey('steps')) {
       steps = (_json['steps'] as core.List)
-          .map<ExplainQueryStep>((value) => ExplainQueryStep.fromJson(value))
+          .map<ExplainQueryStep>((value) => ExplainQueryStep.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('waitMsAvg')) {
@@ -5413,7 +5521,8 @@
       autodetect = _json['autodetect'] as core.bool;
     }
     if (_json.containsKey('bigtableOptions')) {
-      bigtableOptions = BigtableOptions.fromJson(_json['bigtableOptions']);
+      bigtableOptions = BigtableOptions.fromJson(
+          _json['bigtableOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('compression')) {
       compression = _json['compression'] as core.String;
@@ -5422,15 +5531,17 @@
       connectionId = _json['connectionId'] as core.String;
     }
     if (_json.containsKey('csvOptions')) {
-      csvOptions = CsvOptions.fromJson(_json['csvOptions']);
+      csvOptions = CsvOptions.fromJson(
+          _json['csvOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('googleSheetsOptions')) {
-      googleSheetsOptions =
-          GoogleSheetsOptions.fromJson(_json['googleSheetsOptions']);
+      googleSheetsOptions = GoogleSheetsOptions.fromJson(
+          _json['googleSheetsOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hivePartitioningOptions')) {
-      hivePartitioningOptions =
-          HivePartitioningOptions.fromJson(_json['hivePartitioningOptions']);
+      hivePartitioningOptions = HivePartitioningOptions.fromJson(
+          _json['hivePartitioningOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ignoreUnknownValues')) {
       ignoreUnknownValues = _json['ignoreUnknownValues'] as core.bool;
@@ -5439,7 +5550,8 @@
       maxBadRecords = _json['maxBadRecords'] as core.int;
     }
     if (_json.containsKey('schema')) {
-      schema = TableSchema.fromJson(_json['schema']);
+      schema = TableSchema.fromJson(
+          _json['schema'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceFormat')) {
       sourceFormat = _json['sourceFormat'] as core.String;
@@ -5508,7 +5620,8 @@
 
   FeatureValue.fromJson(core.Map _json) {
     if (_json.containsKey('categoricalValue')) {
-      categoricalValue = CategoricalValue.fromJson(_json['categoricalValue']);
+      categoricalValue = CategoricalValue.fromJson(
+          _json['categoricalValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('featureColumn')) {
       featureColumn = _json['featureColumn'] as core.String;
@@ -5543,7 +5656,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5645,7 +5759,8 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<ErrorProto>((value) => ErrorProto.fromJson(value))
+          .map<ErrorProto>((value) =>
+              ErrorProto.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -5655,7 +5770,8 @@
       jobComplete = _json['jobComplete'] as core.bool;
     }
     if (_json.containsKey('jobReference')) {
-      jobReference = JobReference.fromJson(_json['jobReference']);
+      jobReference = JobReference.fromJson(
+          _json['jobReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -5668,11 +5784,13 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<TableRow>((value) => TableRow.fromJson(value))
+          .map<TableRow>((value) =>
+              TableRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('schema')) {
-      schema = TableSchema.fromJson(_json['schema']);
+      schema = TableSchema.fromJson(
+          _json['schema'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('totalBytesProcessed')) {
       totalBytesProcessed = _json['totalBytesProcessed'] as core.String;
@@ -5880,11 +5998,13 @@
 
   IterationResult.fromJson(core.Map _json) {
     if (_json.containsKey('arimaResult')) {
-      arimaResult = ArimaResult.fromJson(_json['arimaResult']);
+      arimaResult = ArimaResult.fromJson(
+          _json['arimaResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clusterInfos')) {
       clusterInfos = (_json['clusterInfos'] as core.List)
-          .map<ClusterInfo>((value) => ClusterInfo.fromJson(value))
+          .map<ClusterInfo>((value) => ClusterInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('durationMs')) {
@@ -5966,7 +6086,8 @@
 
   Job.fromJson(core.Map _json) {
     if (_json.containsKey('configuration')) {
-      configuration = JobConfiguration.fromJson(_json['configuration']);
+      configuration = JobConfiguration.fromJson(
+          _json['configuration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -5975,7 +6096,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('jobReference')) {
-      jobReference = JobReference.fromJson(_json['jobReference']);
+      jobReference = JobReference.fromJson(
+          _json['jobReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -5984,10 +6106,12 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('statistics')) {
-      statistics = JobStatistics.fromJson(_json['statistics']);
+      statistics = JobStatistics.fromJson(
+          _json['statistics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = JobStatus.fromJson(_json['status']);
+      status = JobStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('user_email')) {
       userEmail = _json['user_email'] as core.String;
@@ -6038,7 +6162,7 @@
 
   JobCancelResponse.fromJson(core.Map _json) {
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -6096,13 +6220,15 @@
 
   JobConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('copy')) {
-      copy = JobConfigurationTableCopy.fromJson(_json['copy']);
+      copy = JobConfigurationTableCopy.fromJson(
+          _json['copy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dryRun')) {
       dryRun = _json['dryRun'] as core.bool;
     }
     if (_json.containsKey('extract')) {
-      extract = JobConfigurationExtract.fromJson(_json['extract']);
+      extract = JobConfigurationExtract.fromJson(
+          _json['extract'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobTimeoutMs')) {
       jobTimeoutMs = _json['jobTimeoutMs'] as core.String;
@@ -6112,14 +6238,17 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('load')) {
-      load = JobConfigurationLoad.fromJson(_json['load']);
+      load = JobConfigurationLoad.fromJson(
+          _json['load'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = JobConfigurationQuery.fromJson(_json['query']);
+      query = JobConfigurationQuery.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6221,10 +6350,12 @@
       printHeader = _json['printHeader'] as core.bool;
     }
     if (_json.containsKey('sourceModel')) {
-      sourceModel = ModelReference.fromJson(_json['sourceModel']);
+      sourceModel = ModelReference.fromJson(
+          _json['sourceModel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceTable')) {
-      sourceTable = TableReference.fromJson(_json['sourceTable']);
+      sourceTable = TableReference.fromJson(
+          _json['sourceTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useAvroLogicalTypes')) {
       useAvroLogicalTypes = _json['useAvroLogicalTypes'] as core.bool;
@@ -6466,7 +6597,8 @@
       autodetect = _json['autodetect'] as core.bool;
     }
     if (_json.containsKey('clustering')) {
-      clustering = Clustering.fromJson(_json['clustering']);
+      clustering = Clustering.fromJson(
+          _json['clustering'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createDisposition')) {
       createDisposition = _json['createDisposition'] as core.String;
@@ -6478,14 +6610,17 @@
     }
     if (_json.containsKey('destinationEncryptionConfiguration')) {
       destinationEncryptionConfiguration = EncryptionConfiguration.fromJson(
-          _json['destinationEncryptionConfiguration']);
+          _json['destinationEncryptionConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationTable')) {
-      destinationTable = TableReference.fromJson(_json['destinationTable']);
+      destinationTable = TableReference.fromJson(
+          _json['destinationTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationTableProperties')) {
       destinationTableProperties = DestinationTableProperties.fromJson(
-          _json['destinationTableProperties']);
+          _json['destinationTableProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encoding')) {
       encoding = _json['encoding'] as core.String;
@@ -6494,8 +6629,9 @@
       fieldDelimiter = _json['fieldDelimiter'] as core.String;
     }
     if (_json.containsKey('hivePartitioningOptions')) {
-      hivePartitioningOptions =
-          HivePartitioningOptions.fromJson(_json['hivePartitioningOptions']);
+      hivePartitioningOptions = HivePartitioningOptions.fromJson(
+          _json['hivePartitioningOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ignoreUnknownValues')) {
       ignoreUnknownValues = _json['ignoreUnknownValues'] as core.bool;
@@ -6515,11 +6651,12 @@
       quote = _json['quote'] as core.String;
     }
     if (_json.containsKey('rangePartitioning')) {
-      rangePartitioning =
-          RangePartitioning.fromJson(_json['rangePartitioning']);
+      rangePartitioning = RangePartitioning.fromJson(
+          _json['rangePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schema')) {
-      schema = TableSchema.fromJson(_json['schema']);
+      schema = TableSchema.fromJson(
+          _json['schema'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schemaInline')) {
       schemaInline = _json['schemaInline'] as core.String;
@@ -6544,7 +6681,8 @@
           .toList();
     }
     if (_json.containsKey('timePartitioning')) {
-      timePartitioning = TimePartitioning.fromJson(_json['timePartitioning']);
+      timePartitioning = TimePartitioning.fromJson(
+          _json['timePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useAvroLogicalTypes')) {
       useAvroLogicalTypes = _json['useAvroLogicalTypes'] as core.bool;
@@ -6780,26 +6918,30 @@
       allowLargeResults = _json['allowLargeResults'] as core.bool;
     }
     if (_json.containsKey('clustering')) {
-      clustering = Clustering.fromJson(_json['clustering']);
+      clustering = Clustering.fromJson(
+          _json['clustering'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('connectionProperties')) {
       connectionProperties = (_json['connectionProperties'] as core.List)
-          .map<ConnectionProperty>(
-              (value) => ConnectionProperty.fromJson(value))
+          .map<ConnectionProperty>((value) => ConnectionProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('createDisposition')) {
       createDisposition = _json['createDisposition'] as core.String;
     }
     if (_json.containsKey('defaultDataset')) {
-      defaultDataset = DatasetReference.fromJson(_json['defaultDataset']);
+      defaultDataset = DatasetReference.fromJson(
+          _json['defaultDataset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationEncryptionConfiguration')) {
       destinationEncryptionConfiguration = EncryptionConfiguration.fromJson(
-          _json['destinationEncryptionConfiguration']);
+          _json['destinationEncryptionConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationTable')) {
-      destinationTable = TableReference.fromJson(_json['destinationTable']);
+      destinationTable = TableReference.fromJson(
+          _json['destinationTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('flattenResults')) {
       flattenResults = _json['flattenResults'] as core.bool;
@@ -6824,12 +6966,13 @@
     }
     if (_json.containsKey('queryParameters')) {
       queryParameters = (_json['queryParameters'] as core.List)
-          .map<QueryParameter>((value) => QueryParameter.fromJson(value))
+          .map<QueryParameter>((value) => QueryParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rangePartitioning')) {
-      rangePartitioning =
-          RangePartitioning.fromJson(_json['rangePartitioning']);
+      rangePartitioning = RangePartitioning.fromJson(
+          _json['rangePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schemaUpdateOptions')) {
       schemaUpdateOptions = (_json['schemaUpdateOptions'] as core.List)
@@ -6838,11 +6981,14 @@
     }
     if (_json.containsKey('tableDefinitions')) {
       tableDefinitions = commons.mapMap<core.Map, ExternalDataConfiguration>(
-          _json['tableDefinitions'].cast<core.String, core.Map>(),
-          (core.Map item) => ExternalDataConfiguration.fromJson(item));
+          (_json['tableDefinitions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ExternalDataConfiguration.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('timePartitioning')) {
-      timePartitioning = TimePartitioning.fromJson(_json['timePartitioning']);
+      timePartitioning = TimePartitioning.fromJson(
+          _json['timePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useLegacySql')) {
       useLegacySql = _json['useLegacySql'] as core.bool;
@@ -6853,8 +6999,9 @@
     if (_json.containsKey('userDefinedFunctionResources')) {
       userDefinedFunctionResources =
           (_json['userDefinedFunctionResources'] as core.List)
-              .map<UserDefinedFunctionResource>(
-                  (value) => UserDefinedFunctionResource.fromJson(value))
+              .map<UserDefinedFunctionResource>((value) =>
+                  UserDefinedFunctionResource.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('writeDisposition')) {
@@ -6993,24 +7140,28 @@
     }
     if (_json.containsKey('destinationEncryptionConfiguration')) {
       destinationEncryptionConfiguration = EncryptionConfiguration.fromJson(
-          _json['destinationEncryptionConfiguration']);
+          _json['destinationEncryptionConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationExpirationTime')) {
       destinationExpirationTime =
           _json['destinationExpirationTime'] as core.Object;
     }
     if (_json.containsKey('destinationTable')) {
-      destinationTable = TableReference.fromJson(_json['destinationTable']);
+      destinationTable = TableReference.fromJson(
+          _json['destinationTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operationType')) {
       operationType = _json['operationType'] as core.String;
     }
     if (_json.containsKey('sourceTable')) {
-      sourceTable = TableReference.fromJson(_json['sourceTable']);
+      sourceTable = TableReference.fromJson(
+          _json['sourceTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceTables')) {
       sourceTables = (_json['sourceTables'] as core.List)
-          .map<TableReference>((value) => TableReference.fromJson(value))
+          .map<TableReference>((value) => TableReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('writeDisposition')) {
@@ -7084,16 +7235,19 @@
 
   JobListJobs.fromJson(core.Map _json) {
     if (_json.containsKey('configuration')) {
-      configuration = JobConfiguration.fromJson(_json['configuration']);
+      configuration = JobConfiguration.fromJson(
+          _json['configuration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errorResult')) {
-      errorResult = ErrorProto.fromJson(_json['errorResult']);
+      errorResult = ErrorProto.fromJson(
+          _json['errorResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('jobReference')) {
-      jobReference = JobReference.fromJson(_json['jobReference']);
+      jobReference = JobReference.fromJson(
+          _json['jobReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -7102,10 +7256,12 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('statistics')) {
-      statistics = JobStatistics.fromJson(_json['statistics']);
+      statistics = JobStatistics.fromJson(
+          _json['statistics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = JobStatus.fromJson(_json['status']);
+      status = JobStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('user_email')) {
       userEmail = _json['user_email'] as core.String;
@@ -7166,7 +7322,8 @@
     }
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<JobListJobs>((value) => JobListJobs.fromJson(value))
+          .map<JobListJobs>((value) => JobListJobs.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7343,10 +7500,12 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('extract')) {
-      extract = JobStatistics4.fromJson(_json['extract']);
+      extract = JobStatistics4.fromJson(
+          _json['extract'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('load')) {
-      load = JobStatistics3.fromJson(_json['load']);
+      load = JobStatistics3.fromJson(
+          _json['load'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('numChildJobs')) {
       numChildJobs = _json['numChildJobs'] as core.String;
@@ -7355,7 +7514,8 @@
       parentJobId = _json['parentJobId'] as core.String;
     }
     if (_json.containsKey('query')) {
-      query = JobStatistics2.fromJson(_json['query']);
+      query = JobStatistics2.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quotaDeferments')) {
       quotaDeferments = (_json['quotaDeferments'] as core.List)
@@ -7364,8 +7524,9 @@
     }
     if (_json.containsKey('reservationUsage')) {
       reservationUsage = (_json['reservationUsage'] as core.List)
-          .map<JobStatisticsReservationUsage>(
-              (value) => JobStatisticsReservationUsage.fromJson(value))
+          .map<JobStatisticsReservationUsage>((value) =>
+              JobStatisticsReservationUsage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reservation_id')) {
@@ -7373,10 +7534,12 @@
     }
     if (_json.containsKey('rowLevelSecurityStatistics')) {
       rowLevelSecurityStatistics = RowLevelSecurityStatistics.fromJson(
-          _json['rowLevelSecurityStatistics']);
+          _json['rowLevelSecurityStatistics']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scriptStatistics')) {
-      scriptStatistics = ScriptStatistics.fromJson(_json['scriptStatistics']);
+      scriptStatistics = ScriptStatistics.fromJson(
+          _json['scriptStatistics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -7388,8 +7551,9 @@
       totalSlotMs = _json['totalSlotMs'] as core.String;
     }
     if (_json.containsKey('transactionInfoTemplate')) {
-      transactionInfoTemplate =
-          TransactionInfo.fromJson(_json['transactionInfoTemplate']);
+      transactionInfoTemplate = TransactionInfo.fromJson(
+          _json['transactionInfoTemplate']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7614,20 +7778,24 @@
       ddlOperationPerformed = _json['ddlOperationPerformed'] as core.String;
     }
     if (_json.containsKey('ddlTargetRoutine')) {
-      ddlTargetRoutine = RoutineReference.fromJson(_json['ddlTargetRoutine']);
+      ddlTargetRoutine = RoutineReference.fromJson(
+          _json['ddlTargetRoutine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ddlTargetRowAccessPolicy')) {
-      ddlTargetRowAccessPolicy =
-          RowAccessPolicyReference.fromJson(_json['ddlTargetRowAccessPolicy']);
+      ddlTargetRowAccessPolicy = RowAccessPolicyReference.fromJson(
+          _json['ddlTargetRowAccessPolicy']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ddlTargetTable')) {
-      ddlTargetTable = TableReference.fromJson(_json['ddlTargetTable']);
+      ddlTargetTable = TableReference.fromJson(
+          _json['ddlTargetTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('estimatedBytesProcessed')) {
       estimatedBytesProcessed = _json['estimatedBytesProcessed'] as core.String;
     }
     if (_json.containsKey('modelTraining')) {
-      modelTraining = BigQueryModelTraining.fromJson(_json['modelTraining']);
+      modelTraining = BigQueryModelTraining.fromJson(
+          _json['modelTraining'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('modelTrainingCurrentIteration')) {
       modelTrainingCurrentIteration =
@@ -7642,35 +7810,40 @@
     }
     if (_json.containsKey('queryPlan')) {
       queryPlan = (_json['queryPlan'] as core.List)
-          .map<ExplainQueryStage>((value) => ExplainQueryStage.fromJson(value))
+          .map<ExplainQueryStage>((value) => ExplainQueryStage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('referencedRoutines')) {
       referencedRoutines = (_json['referencedRoutines'] as core.List)
-          .map<RoutineReference>((value) => RoutineReference.fromJson(value))
+          .map<RoutineReference>((value) => RoutineReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('referencedTables')) {
       referencedTables = (_json['referencedTables'] as core.List)
-          .map<TableReference>((value) => TableReference.fromJson(value))
+          .map<TableReference>((value) => TableReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reservationUsage')) {
       reservationUsage = (_json['reservationUsage'] as core.List)
-          .map<JobStatistics2ReservationUsage>(
-              (value) => JobStatistics2ReservationUsage.fromJson(value))
+          .map<JobStatistics2ReservationUsage>((value) =>
+              JobStatistics2ReservationUsage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('schema')) {
-      schema = TableSchema.fromJson(_json['schema']);
+      schema = TableSchema.fromJson(
+          _json['schema'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('statementType')) {
       statementType = _json['statementType'] as core.String;
     }
     if (_json.containsKey('timeline')) {
       timeline = (_json['timeline'] as core.List)
-          .map<QueryTimelineSample>(
-              (value) => QueryTimelineSample.fromJson(value))
+          .map<QueryTimelineSample>((value) => QueryTimelineSample.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalBytesBilled')) {
@@ -7693,7 +7866,8 @@
     if (_json.containsKey('undeclaredQueryParameters')) {
       undeclaredQueryParameters =
           (_json['undeclaredQueryParameters'] as core.List)
-              .map<QueryParameter>((value) => QueryParameter.fromJson(value))
+              .map<QueryParameter>((value) => QueryParameter.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -7901,11 +8075,13 @@
 
   JobStatus.fromJson(core.Map _json) {
     if (_json.containsKey('errorResult')) {
-      errorResult = ErrorProto.fromJson(_json['errorResult']);
+      errorResult = ErrorProto.fromJson(
+          _json['errorResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<ErrorProto>((value) => ErrorProto.fromJson(value))
+          .map<ErrorProto>((value) =>
+              ErrorProto.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
@@ -7976,7 +8152,8 @@
   ListModelsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('models')) {
       models = (_json['models'] as core.List)
-          .map<Model>((value) => Model.fromJson(value))
+          .map<Model>((value) =>
+              Model.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8013,7 +8190,8 @@
     }
     if (_json.containsKey('routines')) {
       routines = (_json['routines'] as core.List)
-          .map<Routine>((value) => Routine.fromJson(value))
+          .map<Routine>((value) =>
+              Routine.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8190,8 +8368,9 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('encryptionConfiguration')) {
-      encryptionConfiguration =
-          EncryptionConfiguration.fromJson(_json['encryptionConfiguration']);
+      encryptionConfiguration = EncryptionConfiguration.fromJson(
+          _json['encryptionConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -8201,7 +8380,8 @@
     }
     if (_json.containsKey('featureColumns')) {
       featureColumns = (_json['featureColumns'] as core.List)
-          .map<StandardSqlField>((value) => StandardSqlField.fromJson(value))
+          .map<StandardSqlField>((value) => StandardSqlField.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('friendlyName')) {
@@ -8209,12 +8389,14 @@
     }
     if (_json.containsKey('labelColumns')) {
       labelColumns = (_json['labelColumns'] as core.List)
-          .map<StandardSqlField>((value) => StandardSqlField.fromJson(value))
+          .map<StandardSqlField>((value) => StandardSqlField.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lastModifiedTime')) {
@@ -8224,14 +8406,16 @@
       location = _json['location'] as core.String;
     }
     if (_json.containsKey('modelReference')) {
-      modelReference = ModelReference.fromJson(_json['modelReference']);
+      modelReference = ModelReference.fromJson(
+          _json['modelReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('modelType')) {
       modelType = _json['modelType'] as core.String;
     }
     if (_json.containsKey('trainingRuns')) {
       trainingRuns = (_json['trainingRuns'] as core.List)
-          .map<TrainingRun>((value) => TrainingRun.fromJson(value))
+          .map<TrainingRun>((value) => TrainingRun.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8342,12 +8526,13 @@
 
   ModelDefinition.fromJson(core.Map _json) {
     if (_json.containsKey('modelOptions')) {
-      modelOptions =
-          ModelDefinitionModelOptions.fromJson(_json['modelOptions']);
+      modelOptions = ModelDefinitionModelOptions.fromJson(
+          _json['modelOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trainingRuns')) {
       trainingRuns = (_json['trainingRuns'] as core.List)
-          .map<BqmlTrainingRun>((value) => BqmlTrainingRun.fromJson(value))
+          .map<BqmlTrainingRun>((value) => BqmlTrainingRun.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8419,11 +8604,13 @@
   MultiClassClassificationMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('aggregateClassificationMetrics')) {
       aggregateClassificationMetrics = AggregateClassificationMetrics.fromJson(
-          _json['aggregateClassificationMetrics']);
+          _json['aggregateClassificationMetrics']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confusionMatrixList')) {
       confusionMatrixList = (_json['confusionMatrixList'] as core.List)
-          .map<ConfusionMatrix>((value) => ConfusionMatrix.fromJson(value))
+          .map<ConfusionMatrix>((value) => ConfusionMatrix.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8521,12 +8708,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -8588,7 +8777,8 @@
       numericId = _json['numericId'] as core.String;
     }
     if (_json.containsKey('projectReference')) {
-      projectReference = ProjectReference.fromJson(_json['projectReference']);
+      projectReference = ProjectReference.fromJson(
+          _json['projectReference'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8643,8 +8833,8 @@
     }
     if (_json.containsKey('projects')) {
       projects = (_json['projects'] as core.List)
-          .map<ProjectListProjects>(
-              (value) => ProjectListProjects.fromJson(value))
+          .map<ProjectListProjects>((value) => ProjectListProjects.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalItems')) {
@@ -8713,10 +8903,12 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameterType')) {
-      parameterType = QueryParameterType.fromJson(_json['parameterType']);
+      parameterType = QueryParameterType.fromJson(
+          _json['parameterType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameterValue')) {
-      parameterValue = QueryParameterValue.fromJson(_json['parameterValue']);
+      parameterValue = QueryParameterValue.fromJson(
+          _json['parameterValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8755,7 +8947,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('type')) {
-      type = QueryParameterType.fromJson(_json['type']);
+      type = QueryParameterType.fromJson(
+          _json['type'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8789,12 +8982,14 @@
 
   QueryParameterType.fromJson(core.Map _json) {
     if (_json.containsKey('arrayType')) {
-      arrayType = QueryParameterType.fromJson(_json['arrayType']);
+      arrayType = QueryParameterType.fromJson(
+          _json['arrayType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structTypes')) {
       structTypes = (_json['structTypes'] as core.List)
-          .map<QueryParameterTypeStructTypes>(
-              (value) => QueryParameterTypeStructTypes.fromJson(value))
+          .map<QueryParameterTypeStructTypes>((value) =>
+              QueryParameterTypeStructTypes.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -8834,14 +9029,16 @@
   QueryParameterValue.fromJson(core.Map _json) {
     if (_json.containsKey('arrayValues')) {
       arrayValues = (_json['arrayValues'] as core.List)
-          .map<QueryParameterValue>(
-              (value) => QueryParameterValue.fromJson(value))
+          .map<QueryParameterValue>((value) => QueryParameterValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('structValues')) {
       structValues = commons.mapMap<core.Map, QueryParameterValue>(
-          _json['structValues'].cast<core.String, core.Map>(),
-          (core.Map item) => QueryParameterValue.fromJson(item));
+          (_json['structValues'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => QueryParameterValue.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -8972,12 +9169,13 @@
   QueryRequest.fromJson(core.Map _json) {
     if (_json.containsKey('connectionProperties')) {
       connectionProperties = (_json['connectionProperties'] as core.List)
-          .map<ConnectionProperty>(
-              (value) => ConnectionProperty.fromJson(value))
+          .map<ConnectionProperty>((value) => ConnectionProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('defaultDataset')) {
-      defaultDataset = DatasetReference.fromJson(_json['defaultDataset']);
+      defaultDataset = DatasetReference.fromJson(
+          _json['defaultDataset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dryRun')) {
       dryRun = _json['dryRun'] as core.bool;
@@ -8987,7 +9185,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('location')) {
@@ -9010,7 +9209,8 @@
     }
     if (_json.containsKey('queryParameters')) {
       queryParameters = (_json['queryParameters'] as core.List)
-          .map<QueryParameter>((value) => QueryParameter.fromJson(value))
+          .map<QueryParameter>((value) => QueryParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestId')) {
@@ -9141,14 +9341,16 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<ErrorProto>((value) => ErrorProto.fromJson(value))
+          .map<ErrorProto>((value) =>
+              ErrorProto.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('jobComplete')) {
       jobComplete = _json['jobComplete'] as core.bool;
     }
     if (_json.containsKey('jobReference')) {
-      jobReference = JobReference.fromJson(_json['jobReference']);
+      jobReference = JobReference.fromJson(
+          _json['jobReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -9161,11 +9363,13 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<TableRow>((value) => TableRow.fromJson(value))
+          .map<TableRow>((value) =>
+              TableRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('schema')) {
-      schema = TableSchema.fromJson(_json['schema']);
+      schema = TableSchema.fromJson(
+          _json['schema'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('totalBytesProcessed')) {
       totalBytesProcessed = _json['totalBytesProcessed'] as core.String;
@@ -9329,7 +9533,8 @@
       field = _json['field'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = RangePartitioningRange.fromJson(_json['range']);
+      range = RangePartitioningRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9549,7 +9754,8 @@
   Routine.fromJson(core.Map _json) {
     if (_json.containsKey('arguments')) {
       arguments = (_json['arguments'] as core.List)
-          .map<Argument>((value) => Argument.fromJson(value))
+          .map<Argument>((value) =>
+              Argument.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creationTime')) {
@@ -9579,10 +9785,12 @@
       lastModifiedTime = _json['lastModifiedTime'] as core.String;
     }
     if (_json.containsKey('returnType')) {
-      returnType = StandardSqlDataType.fromJson(_json['returnType']);
+      returnType = StandardSqlDataType.fromJson(
+          _json['returnType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('routineReference')) {
-      routineReference = RoutineReference.fromJson(_json['routineReference']);
+      routineReference = RoutineReference.fromJson(
+          _json['routineReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('routineType')) {
       routineType = _json['routineType'] as core.String;
@@ -9688,7 +9896,8 @@
     }
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<Entry>((value) => Entry.fromJson(value))
+          .map<Entry>((value) =>
+              Entry.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9861,7 +10070,8 @@
     }
     if (_json.containsKey('stackFrames')) {
       stackFrames = (_json['stackFrames'] as core.List)
-          .map<ScriptStackFrame>((value) => ScriptStackFrame.fromJson(value))
+          .map<ScriptStackFrame>((value) => ScriptStackFrame.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9896,7 +10106,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -9926,7 +10137,8 @@
 
   SnapshotDefinition.fromJson(core.Map _json) {
     if (_json.containsKey('baseTableReference')) {
-      baseTableReference = TableReference.fromJson(_json['baseTableReference']);
+      baseTableReference = TableReference.fromJson(
+          _json['baseTableReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('snapshotTime')) {
       snapshotTime = core.DateTime.parse(_json['snapshotTime'] as core.String);
@@ -9985,11 +10197,12 @@
 
   StandardSqlDataType.fromJson(core.Map _json) {
     if (_json.containsKey('arrayElementType')) {
-      arrayElementType =
-          StandardSqlDataType.fromJson(_json['arrayElementType']);
+      arrayElementType = StandardSqlDataType.fromJson(
+          _json['arrayElementType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structType')) {
-      structType = StandardSqlStructType.fromJson(_json['structType']);
+      structType = StandardSqlStructType.fromJson(
+          _json['structType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('typeKind')) {
       typeKind = _json['typeKind'] as core.String;
@@ -10028,7 +10241,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('type')) {
-      type = StandardSqlDataType.fromJson(_json['type']);
+      type = StandardSqlDataType.fromJson(
+          _json['type'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10052,7 +10266,8 @@
   StandardSqlStructType.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<StandardSqlField>((value) => StandardSqlField.fromJson(value))
+          .map<StandardSqlField>((value) => StandardSqlField.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10238,7 +10453,8 @@
 
   Table.fromJson(core.Map _json) {
     if (_json.containsKey('clustering')) {
-      clustering = Clustering.fromJson(_json['clustering']);
+      clustering = Clustering.fromJson(
+          _json['clustering'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTime')) {
       creationTime = _json['creationTime'] as core.String;
@@ -10247,8 +10463,9 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('encryptionConfiguration')) {
-      encryptionConfiguration =
-          EncryptionConfiguration.fromJson(_json['encryptionConfiguration']);
+      encryptionConfiguration = EncryptionConfiguration.fromJson(
+          _json['encryptionConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -10258,7 +10475,8 @@
     }
     if (_json.containsKey('externalDataConfiguration')) {
       externalDataConfiguration = ExternalDataConfiguration.fromJson(
-          _json['externalDataConfiguration']);
+          _json['externalDataConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('friendlyName')) {
       friendlyName = _json['friendlyName'] as core.String;
@@ -10271,7 +10489,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lastModifiedTime')) {
@@ -10281,11 +10500,12 @@
       location = _json['location'] as core.String;
     }
     if (_json.containsKey('materializedView')) {
-      materializedView =
-          MaterializedViewDefinition.fromJson(_json['materializedView']);
+      materializedView = MaterializedViewDefinition.fromJson(
+          _json['materializedView'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('model')) {
-      model = ModelDefinition.fromJson(_json['model']);
+      model = ModelDefinition.fromJson(
+          _json['model'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('numBytes')) {
       numBytes = _json['numBytes'] as core.String;
@@ -10300,36 +10520,41 @@
       numRows = _json['numRows'] as core.String;
     }
     if (_json.containsKey('rangePartitioning')) {
-      rangePartitioning =
-          RangePartitioning.fromJson(_json['rangePartitioning']);
+      rangePartitioning = RangePartitioning.fromJson(
+          _json['rangePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requirePartitionFilter')) {
       requirePartitionFilter = _json['requirePartitionFilter'] as core.bool;
     }
     if (_json.containsKey('schema')) {
-      schema = TableSchema.fromJson(_json['schema']);
+      schema = TableSchema.fromJson(
+          _json['schema'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('snapshotDefinition')) {
-      snapshotDefinition =
-          SnapshotDefinition.fromJson(_json['snapshotDefinition']);
+      snapshotDefinition = SnapshotDefinition.fromJson(
+          _json['snapshotDefinition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('streamingBuffer')) {
-      streamingBuffer = Streamingbuffer.fromJson(_json['streamingBuffer']);
+      streamingBuffer = Streamingbuffer.fromJson(
+          _json['streamingBuffer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableReference')) {
-      tableReference = TableReference.fromJson(_json['tableReference']);
+      tableReference = TableReference.fromJson(
+          _json['tableReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timePartitioning')) {
-      timePartitioning = TimePartitioning.fromJson(_json['timePartitioning']);
+      timePartitioning = TimePartitioning.fromJson(
+          _json['timePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('view')) {
-      view = ViewDefinition.fromJson(_json['view']);
+      view = ViewDefinition.fromJson(
+          _json['view'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10466,7 +10691,8 @@
       insertId = _json['insertId'] as core.String;
     }
     if (_json.containsKey('json')) {
-      json = JsonObject.fromJson(_json['json']);
+      json = JsonObject.fromJson(
+          _json['json'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10518,8 +10744,9 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<TableDataInsertAllRequestRows>(
-              (value) => TableDataInsertAllRequestRows.fromJson(value))
+          .map<TableDataInsertAllRequestRows>((value) =>
+              TableDataInsertAllRequestRows.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('skipInvalidRows')) {
@@ -10563,7 +10790,8 @@
   TableDataInsertAllResponseInsertErrors.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<ErrorProto>((value) => ErrorProto.fromJson(value))
+          .map<ErrorProto>((value) =>
+              ErrorProto.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('index')) {
@@ -10595,8 +10823,9 @@
   TableDataInsertAllResponse.fromJson(core.Map _json) {
     if (_json.containsKey('insertErrors')) {
       insertErrors = (_json['insertErrors'] as core.List)
-          .map<TableDataInsertAllResponseInsertErrors>(
-              (value) => TableDataInsertAllResponseInsertErrors.fromJson(value))
+          .map<TableDataInsertAllResponseInsertErrors>((value) =>
+              TableDataInsertAllResponseInsertErrors.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10649,7 +10878,8 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<TableRow>((value) => TableRow.fromJson(value))
+          .map<TableRow>((value) =>
+              TableRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalRows')) {
@@ -10762,14 +10992,16 @@
 
   TableFieldSchema.fromJson(core.Map _json) {
     if (_json.containsKey('categories')) {
-      categories = TableFieldSchemaCategories.fromJson(_json['categories']);
+      categories = TableFieldSchemaCategories.fromJson(
+          _json['categories'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<TableFieldSchema>((value) => TableFieldSchema.fromJson(value))
+          .map<TableFieldSchema>((value) => TableFieldSchema.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mode')) {
@@ -10779,7 +11011,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('policyTags')) {
-      policyTags = TableFieldSchemaPolicyTags.fromJson(_json['policyTags']);
+      policyTags = TableFieldSchemaPolicyTags.fromJson(
+          _json['policyTags'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -10879,7 +11112,8 @@
 
   TableListTables.fromJson(core.Map _json) {
     if (_json.containsKey('clustering')) {
-      clustering = Clustering.fromJson(_json['clustering']);
+      clustering = Clustering.fromJson(
+          _json['clustering'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTime')) {
       creationTime = _json['creationTime'] as core.String;
@@ -10898,24 +11132,28 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('rangePartitioning')) {
-      rangePartitioning =
-          RangePartitioning.fromJson(_json['rangePartitioning']);
+      rangePartitioning = RangePartitioning.fromJson(
+          _json['rangePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableReference')) {
-      tableReference = TableReference.fromJson(_json['tableReference']);
+      tableReference = TableReference.fromJson(
+          _json['tableReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timePartitioning')) {
-      timePartitioning = TimePartitioning.fromJson(_json['timePartitioning']);
+      timePartitioning = TimePartitioning.fromJson(
+          _json['timePartitioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('view')) {
-      view = TableListTablesView.fromJson(_json['view']);
+      view = TableListTablesView.fromJson(
+          _json['view'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10991,7 +11229,8 @@
     }
     if (_json.containsKey('tables')) {
       tables = (_json['tables'] as core.List)
-          .map<TableListTables>((value) => TableListTables.fromJson(value))
+          .map<TableListTables>((value) => TableListTables.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalItems')) {
@@ -11071,7 +11310,8 @@
   TableRow.fromJson(core.Map _json) {
     if (_json.containsKey('f')) {
       f = (_json['f'] as core.List)
-          .map<TableCell>((value) => TableCell.fromJson(value))
+          .map<TableCell>((value) =>
+              TableCell.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11094,7 +11334,8 @@
   TableSchema.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<TableFieldSchema>((value) => TableFieldSchema.fromJson(value))
+          .map<TableFieldSchema>((value) => TableFieldSchema.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11565,7 +11806,8 @@
     }
     if (_json.containsKey('labelClassWeights')) {
       labelClassWeights = commons.mapMap<core.num, core.double>(
-          _json['labelClassWeights'].cast<core.String, core.num>(),
+          (_json['labelClassWeights'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.num>(),
           (core.num item) => (item as core.num).toDouble());
     }
     if (_json.containsKey('learnRate')) {
@@ -11594,7 +11836,8 @@
       modelUri = _json['modelUri'] as core.String;
     }
     if (_json.containsKey('nonSeasonalOrder')) {
-      nonSeasonalOrder = ArimaOrder.fromJson(_json['nonSeasonalOrder']);
+      nonSeasonalOrder = ArimaOrder.fromJson(
+          _json['nonSeasonalOrder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('numClusters')) {
       numClusters = _json['numClusters'] as core.String;
@@ -11791,22 +12034,25 @@
 
   TrainingRun.fromJson(core.Map _json) {
     if (_json.containsKey('dataSplitResult')) {
-      dataSplitResult = DataSplitResult.fromJson(_json['dataSplitResult']);
+      dataSplitResult = DataSplitResult.fromJson(
+          _json['dataSplitResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('evaluationMetrics')) {
-      evaluationMetrics =
-          EvaluationMetrics.fromJson(_json['evaluationMetrics']);
+      evaluationMetrics = EvaluationMetrics.fromJson(
+          _json['evaluationMetrics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<IterationResult>((value) => IterationResult.fromJson(value))
+          .map<IterationResult>((value) => IterationResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('trainingOptions')) {
-      trainingOptions = TrainingOptions.fromJson(_json['trainingOptions']);
+      trainingOptions = TrainingOptions.fromJson(
+          _json['trainingOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11915,8 +12161,9 @@
     if (_json.containsKey('userDefinedFunctionResources')) {
       userDefinedFunctionResources =
           (_json['userDefinedFunctionResources'] as core.List)
-              .map<UserDefinedFunctionResource>(
-                  (value) => UserDefinedFunctionResource.fromJson(value))
+              .map<UserDefinedFunctionResource>((value) =>
+                  UserDefinedFunctionResource.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
diff --git a/generated/googleapis/lib/bigquerydatatransfer/v1.dart b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
index 9ac417a..e4b0454 100644
--- a/generated/googleapis/lib/bigquerydatatransfer/v1.dart
+++ b/generated/googleapis/lib/bigquerydatatransfer/v1.dart
@@ -138,7 +138,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CheckValidCredsResponse.fromJson(data));
+    return _response.then(
+      (data) => CheckValidCredsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a supported data source and returns its settings, which can be
@@ -190,7 +193,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataSource.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataSource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists supported data sources and returns their settings, which can be used
@@ -260,7 +266,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDataSourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDataSourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -321,7 +330,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -389,7 +400,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -460,7 +474,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CheckValidCredsResponse.fromJson(data));
+    return _response.then(
+      (data) => CheckValidCredsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a supported data source and returns its settings, which can be
@@ -513,7 +530,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataSource.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataSource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists supported data sources and returns their settings, which can be used
@@ -583,7 +603,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDataSourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDataSourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -693,7 +716,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a data transfer configuration, including any associated transfer
@@ -746,7 +772,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about a data transfer config.
@@ -798,7 +826,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about all data transfers in the project.
@@ -874,7 +905,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTransferConfigsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTransferConfigsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a data transfer configuration. All fields must be set, even if
@@ -984,7 +1018,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates transfer runs for a time range [start_time, end_time]. For each
@@ -1047,8 +1084,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ScheduleTransferRunsResponse.fromJson(data));
+    return _response.then(
+      (data) => ScheduleTransferRunsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Start manual transfer runs to be executed now with schedule_time equal to
@@ -1111,8 +1150,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => StartManualTransferRunsResponse.fromJson(data));
+    return _response.then(
+      (data) => StartManualTransferRunsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1177,7 +1218,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about the particular transfer run.
@@ -1230,7 +1273,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferRun.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferRun.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about running and completed jobs.
@@ -1315,7 +1361,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTransferRunsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTransferRunsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1400,7 +1449,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTransferLogsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTransferLogsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1510,7 +1562,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a data transfer configuration, including any associated transfer
@@ -1562,7 +1617,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about a data transfer config.
@@ -1613,7 +1670,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about all data transfers in the project.
@@ -1689,7 +1749,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTransferConfigsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTransferConfigsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a data transfer configuration. All fields must be set, even if
@@ -1798,7 +1861,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates transfer runs for a time range [start_time, end_time]. For each
@@ -1860,8 +1926,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ScheduleTransferRunsResponse.fromJson(data));
+    return _response.then(
+      (data) => ScheduleTransferRunsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Start manual transfer runs to be executed now with schedule_time equal to
@@ -1923,8 +1991,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => StartManualTransferRunsResponse.fromJson(data));
+    return _response.then(
+      (data) => StartManualTransferRunsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1987,7 +2057,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about the particular transfer run.
@@ -2040,7 +2112,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferRun.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferRun.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about running and completed jobs.
@@ -2124,7 +2199,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTransferRunsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTransferRunsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2209,7 +2287,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTransferLogsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTransferLogsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2389,8 +2470,8 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<DataSourceParameter>(
-              (value) => DataSourceParameter.fromJson(value))
+          .map<DataSourceParameter>((value) => DataSourceParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('scopes')) {
@@ -2557,8 +2638,8 @@
     }
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<DataSourceParameter>(
-              (value) => DataSourceParameter.fromJson(value))
+          .map<DataSourceParameter>((value) => DataSourceParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('immutable')) {
@@ -2706,7 +2787,8 @@
   ListDataSourcesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dataSources')) {
       dataSources = (_json['dataSources'] as core.List)
-          .map<DataSource>((value) => DataSource.fromJson(value))
+          .map<DataSource>((value) =>
+              DataSource.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2740,7 +2822,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2778,7 +2861,8 @@
     }
     if (_json.containsKey('transferConfigs')) {
       transferConfigs = (_json['transferConfigs'] as core.List)
-          .map<TransferConfig>((value) => TransferConfig.fromJson(value))
+          .map<TransferConfig>((value) => TransferConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2814,7 +2898,8 @@
     }
     if (_json.containsKey('transferMessages')) {
       transferMessages = (_json['transferMessages'] as core.List)
-          .map<TransferMessage>((value) => TransferMessage.fromJson(value))
+          .map<TransferMessage>((value) => TransferMessage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2850,7 +2935,8 @@
     }
     if (_json.containsKey('transferRuns')) {
       transferRuns = (_json['transferRuns'] as core.List)
-          .map<TransferRun>((value) => TransferRun.fromJson(value))
+          .map<TransferRun>((value) => TransferRun.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2900,7 +2986,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -2908,7 +2995,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -3030,7 +3118,8 @@
   ScheduleTransferRunsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('runs')) {
       runs = (_json['runs'] as core.List)
-          .map<TransferRun>((value) => TransferRun.fromJson(value))
+          .map<TransferRun>((value) => TransferRun.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3060,7 +3149,8 @@
       requestedRunTime = _json['requestedRunTime'] as core.String;
     }
     if (_json.containsKey('requestedTimeRange')) {
-      requestedTimeRange = TimeRange.fromJson(_json['requestedTimeRange']);
+      requestedTimeRange = TimeRange.fromJson(
+          _json['requestedTimeRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3086,7 +3176,8 @@
   StartManualTransferRunsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('runs')) {
       runs = (_json['runs'] as core.List)
-          .map<TransferRun>((value) => TransferRun.fromJson(value))
+          .map<TransferRun>((value) => TransferRun.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3132,7 +3223,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3302,7 +3394,8 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('emailPreferences')) {
-      emailPreferences = EmailPreferences.fromJson(_json['emailPreferences']);
+      emailPreferences = EmailPreferences.fromJson(
+          _json['emailPreferences'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3315,14 +3408,16 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.Object, core.Object>(
-          _json['params'].cast<core.String, core.Object>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('schedule')) {
       schedule = _json['schedule'] as core.String;
     }
     if (_json.containsKey('scheduleOptions')) {
-      scheduleOptions = ScheduleOptions.fromJson(_json['scheduleOptions']);
+      scheduleOptions = ScheduleOptions.fromJson(
+          _json['scheduleOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -3514,13 +3609,15 @@
       destinationDatasetId = _json['destinationDatasetId'] as core.String;
     }
     if (_json.containsKey('emailPreferences')) {
-      emailPreferences = EmailPreferences.fromJson(_json['emailPreferences']);
+      emailPreferences = EmailPreferences.fromJson(
+          _json['emailPreferences'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('errorStatus')) {
-      errorStatus = Status.fromJson(_json['errorStatus']);
+      errorStatus = Status.fromJson(
+          _json['errorStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3530,7 +3627,8 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.Object, core.Object>(
-          _json['params'].cast<core.String, core.Object>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('runTime')) {
diff --git a/generated/googleapis/lib/bigqueryreservation/v1.dart b/generated/googleapis/lib/bigqueryreservation/v1.dart
index 35a8e63..e2f8b13 100644
--- a/generated/googleapis/lib/bigqueryreservation/v1.dart
+++ b/generated/googleapis/lib/bigqueryreservation/v1.dart
@@ -105,7 +105,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -180,7 +182,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -251,7 +256,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BiReservation.fromJson(data));
+    return _response.then(
+      (data) =>
+          BiReservation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up assignments for a specified resource for a particular region. If
@@ -335,8 +343,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SearchAllAssignmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchAllAssignmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up assignments for a specified resource for a particular region. If
@@ -421,7 +431,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchAssignmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchAssignmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a BI reservation. Only fields specified in the `field_mask` are
@@ -487,7 +500,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BiReservation.fromJson(data));
+    return _response.then(
+      (data) =>
+          BiReservation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -561,7 +577,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CapacityCommitment.fromJson(data));
+    return _response.then(
+      (data) => CapacityCommitment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a capacity commitment. Attempting to delete capacity commitment
@@ -614,7 +633,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about the capacity commitment.
@@ -665,7 +686,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CapacityCommitment.fromJson(data));
+    return _response.then(
+      (data) => CapacityCommitment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the capacity commitments for the admin project.
@@ -730,8 +754,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListCapacityCommitmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCapacityCommitmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Merges capacity commitments of the same plan into a single commitment. The
@@ -793,7 +819,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CapacityCommitment.fromJson(data));
+    return _response.then(
+      (data) => CapacityCommitment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing capacity commitment. Only `plan` and `renewal_plan`
@@ -860,7 +889,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CapacityCommitment.fromJson(data));
+    return _response.then(
+      (data) => CapacityCommitment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Splits capacity commitment to two commitments of the same plan and
@@ -922,8 +954,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SplitCapacityCommitmentResponse.fromJson(data));
+    return _response.then(
+      (data) => SplitCapacityCommitmentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -998,7 +1032,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Reservation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Reservation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a reservation. Returns `google.rpc.Code.FAILED_PRECONDITION` when
@@ -1050,7 +1087,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about the reservation.
@@ -1101,7 +1140,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Reservation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Reservation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the reservations for the project in the specified location.
@@ -1166,7 +1208,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListReservationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListReservationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing reservation resource.
@@ -1229,7 +1274,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Reservation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Reservation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1313,7 +1361,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Assignment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Assignment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a assignment. No expansion will happen. Example: * Organization
@@ -1371,7 +1422,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists assignments. Only explicitly created assignments will be returned.
@@ -1447,7 +1500,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAssignmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAssignmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves an assignment under a new reservation. This differs from removing an
@@ -1506,7 +1562,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Assignment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Assignment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1703,7 +1762,8 @@
       commitmentStartTime = _json['commitmentStartTime'] as core.String;
     }
     if (_json.containsKey('failureStatus')) {
-      failureStatus = Status.fromJson(_json['failureStatus']);
+      failureStatus = Status.fromJson(
+          _json['failureStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1807,7 +1867,8 @@
   ListAssignmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assignments')) {
       assignments = (_json['assignments'] as core.List)
-          .map<Assignment>((value) => Assignment.fromJson(value))
+          .map<Assignment>((value) =>
+              Assignment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1842,8 +1903,8 @@
   ListCapacityCommitmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('capacityCommitments')) {
       capacityCommitments = (_json['capacityCommitments'] as core.List)
-          .map<CapacityCommitment>(
-              (value) => CapacityCommitment.fromJson(value))
+          .map<CapacityCommitment>((value) => CapacityCommitment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1880,7 +1941,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1914,7 +1976,8 @@
     }
     if (_json.containsKey('reservations')) {
       reservations = (_json['reservations'] as core.List)
-          .map<Reservation>((value) => Reservation.fromJson(value))
+          .map<Reservation>((value) => Reservation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2030,11 +2093,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2042,7 +2107,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2149,7 +2215,8 @@
   SearchAllAssignmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assignments')) {
       assignments = (_json['assignments'] as core.List)
-          .map<Assignment>((value) => Assignment.fromJson(value))
+          .map<Assignment>((value) =>
+              Assignment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2184,7 +2251,8 @@
   SearchAssignmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assignments')) {
       assignments = (_json['assignments'] as core.List)
-          .map<Assignment>((value) => Assignment.fromJson(value))
+          .map<Assignment>((value) =>
+              Assignment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2239,10 +2307,12 @@
 
   SplitCapacityCommitmentResponse.fromJson(core.Map _json) {
     if (_json.containsKey('first')) {
-      first = CapacityCommitment.fromJson(_json['first']);
+      first = CapacityCommitment.fromJson(
+          _json['first'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('second')) {
-      second = CapacityCommitment.fromJson(_json['second']);
+      second = CapacityCommitment.fromJson(
+          _json['second'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2290,7 +2360,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/bigtableadmin/v2.dart b/generated/googleapis/lib/bigtableadmin/v2.dart
index 694716e..ba9366a 100644
--- a/generated/googleapis/lib/bigtableadmin/v2.dart
+++ b/generated/googleapis/lib/bigtableadmin/v2.dart
@@ -142,7 +142,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -194,7 +196,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -245,7 +249,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -338,7 +344,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -420,7 +429,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete an instance from a project.
@@ -470,7 +481,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about an instance.
@@ -520,7 +533,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Instance.fromJson(data));
+    return _response.then(
+      (data) => Instance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for an instance resource. Returns an empty
@@ -580,7 +595,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about instances in a project.
@@ -637,7 +654,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInstancesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Partially updates an instance within a project. This method can modify all
@@ -701,7 +721,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on an instance resource. Replaces any
@@ -761,7 +783,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that the caller has on the specified instance
@@ -821,7 +845,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an instance within a project. This method updates only the display
@@ -879,7 +906,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Instance.fromJson(data));
+    return _response.then(
+      (data) => Instance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -960,7 +989,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppProfile.fromJson(data));
+    return _response.then(
+      (data) =>
+          AppProfile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an app profile from an instance.
@@ -1019,7 +1051,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about an app profile.
@@ -1071,7 +1105,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppProfile.fromJson(data));
+    return _response.then(
+      (data) =>
+          AppProfile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about app profiles in an instance.
@@ -1144,7 +1181,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAppProfilesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAppProfilesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an app profile within an instance.
@@ -1215,7 +1255,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1291,7 +1333,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a cluster from an instance.
@@ -1342,7 +1386,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a cluster.
@@ -1392,7 +1438,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Cluster.fromJson(data));
+    return _response.then(
+      (data) => Cluster.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about clusters in an instance.
@@ -1452,7 +1500,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListClustersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListClustersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a cluster within an instance.
@@ -1508,7 +1559,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1589,7 +1642,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a pending or completed Cloud Bigtable backup.
@@ -1640,7 +1695,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets metadata on a pending or completed Cloud Bigtable Backup.
@@ -1691,7 +1748,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Backup.fromJson(data));
+    return _response.then(
+      (data) => Backup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a Table resource. Returns an empty
@@ -1752,7 +1811,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists Cloud Bigtable backups. Returns both completed and pending backups.
@@ -1862,7 +1923,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBackupsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBackupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a pending or completed Cloud Bigtable Backup.
@@ -1934,7 +1998,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Backup.fromJson(data));
+    return _response.then(
+      (data) => Backup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on a Table resource. Replaces any existing
@@ -1995,7 +2061,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that the caller has on the specified table resource.
@@ -2055,7 +2123,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2123,7 +2194,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CheckConsistencyResponse.fromJson(data));
+    return _response.then(
+      (data) => CheckConsistencyResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new table in the specified instance. The table can be created
@@ -2181,7 +2255,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Table.fromJson(data));
+    return _response.then(
+      (data) => Table.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a specified table and all of its data.
@@ -2231,7 +2307,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently drop/delete a row range from a specified table. The request
@@ -2292,7 +2370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Generates a consistency token for a Table, which can be used in
@@ -2354,8 +2434,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GenerateConsistencyTokenResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateConsistencyTokenResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets metadata information about the specified table.
@@ -2421,7 +2503,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Table.fromJson(data));
+    return _response.then(
+      (data) => Table.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a Table resource. Returns an empty
@@ -2481,7 +2565,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all tables served from a specified instance.
@@ -2566,7 +2652,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTablesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTablesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Performs a series of column family modifications on the specified table.
@@ -2628,7 +2717,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Table.fromJson(data));
+    return _response.then(
+      (data) => Table.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new table by restoring from a completed backup. The new table
@@ -2691,7 +2782,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on a Table resource. Replaces any existing
@@ -2751,7 +2844,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that the caller has on the specified table resource.
@@ -2810,7 +2905,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2866,7 +2964,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -2934,7 +3034,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2974,14 +3077,15 @@
     }
     if (_json.containsKey('multiClusterRoutingUseAny')) {
       multiClusterRoutingUseAny = MultiClusterRoutingUseAny.fromJson(
-          _json['multiClusterRoutingUseAny']);
+          _json['multiClusterRoutingUseAny']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('singleClusterRouting')) {
-      singleClusterRouting =
-          SingleClusterRouting.fromJson(_json['singleClusterRouting']);
+      singleClusterRouting = SingleClusterRouting.fromJson(
+          _json['singleClusterRouting'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3036,7 +3140,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -3296,7 +3401,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -3503,7 +3609,8 @@
 
   ColumnFamily.fromJson(core.Map _json) {
     if (_json.containsKey('gcRule')) {
-      gcRule = GcRule.fromJson(_json['gcRule']);
+      gcRule = GcRule.fromJson(
+          _json['gcRule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3590,15 +3697,18 @@
       finishTime = _json['finishTime'] as core.String;
     }
     if (_json.containsKey('originalRequest')) {
-      originalRequest = CreateClusterRequest.fromJson(_json['originalRequest']);
+      originalRequest = CreateClusterRequest.fromJson(
+          _json['originalRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestTime')) {
       requestTime = _json['requestTime'] as core.String;
     }
     if (_json.containsKey('tables')) {
       tables = commons.mapMap<core.Map, TableProgress>(
-          _json['tables'].cast<core.String, core.Map>(),
-          (core.Map item) => TableProgress.fromJson(item));
+          (_json['tables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => TableProgress.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -3641,7 +3751,8 @@
 
   CreateClusterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cluster')) {
-      cluster = Cluster.fromJson(_json['cluster']);
+      cluster = Cluster.fromJson(
+          _json['cluster'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clusterId')) {
       clusterId = _json['clusterId'] as core.String;
@@ -3684,8 +3795,8 @@
       finishTime = _json['finishTime'] as core.String;
     }
     if (_json.containsKey('originalRequest')) {
-      originalRequest =
-          CreateInstanceRequest.fromJson(_json['originalRequest']);
+      originalRequest = CreateInstanceRequest.fromJson(
+          _json['originalRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestTime')) {
       requestTime = _json['requestTime'] as core.String;
@@ -3734,11 +3845,14 @@
   CreateInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('clusters')) {
       clusters = commons.mapMap<core.Map, Cluster>(
-          _json['clusters'].cast<core.String, core.Map>(),
-          (core.Map item) => Cluster.fromJson(item));
+          (_json['clusters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Cluster.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('instance')) {
-      instance = Instance.fromJson(_json['instance']);
+      instance = Instance.fromJson(
+          _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('instanceId')) {
       instanceId = _json['instanceId'] as core.String;
@@ -3795,11 +3909,13 @@
   CreateTableRequest.fromJson(core.Map _json) {
     if (_json.containsKey('initialSplits')) {
       initialSplits = (_json['initialSplits'] as core.List)
-          .map<Split>((value) => Split.fromJson(value))
+          .map<Split>((value) =>
+              Split.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('table')) {
-      table = Table.fromJson(_json['table']);
+      table =
+          Table.fromJson(_json['table'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableId')) {
       tableId = _json['tableId'] as core.String;
@@ -3956,7 +4072,8 @@
   FailureTrace.fromJson(core.Map _json) {
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
-          .map<Frame>((value) => Frame.fromJson(value))
+          .map<Frame>((value) =>
+              Frame.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4023,7 +4140,8 @@
 
   GcRule.fromJson(core.Map _json) {
     if (_json.containsKey('intersection')) {
-      intersection = Intersection.fromJson(_json['intersection']);
+      intersection = Intersection.fromJson(
+          _json['intersection'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxAge')) {
       maxAge = _json['maxAge'] as core.String;
@@ -4032,7 +4150,8 @@
       maxNumVersions = _json['maxNumVersions'] as core.int;
     }
     if (_json.containsKey('union')) {
-      union = Union.fromJson(_json['union']);
+      union =
+          Union.fromJson(_json['union'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4102,7 +4221,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4194,7 +4314,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -4239,7 +4360,8 @@
   Intersection.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<GcRule>((value) => GcRule.fromJson(value))
+          .map<GcRule>((value) =>
+              GcRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4274,7 +4396,8 @@
   ListAppProfilesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('appProfiles')) {
       appProfiles = (_json['appProfiles'] as core.List)
-          .map<AppProfile>((value) => AppProfile.fromJson(value))
+          .map<AppProfile>((value) =>
+              AppProfile.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('failedLocations')) {
@@ -4317,7 +4440,8 @@
   ListBackupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('backups')) {
       backups = (_json['backups'] as core.List)
-          .map<Backup>((value) => Backup.fromJson(value))
+          .map<Backup>((value) =>
+              Backup.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4356,7 +4480,8 @@
   ListClustersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('clusters')) {
       clusters = (_json['clusters'] as core.List)
-          .map<Cluster>((value) => Cluster.fromJson(value))
+          .map<Cluster>((value) =>
+              Cluster.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('failedLocations')) {
@@ -4410,7 +4535,8 @@
     }
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4446,7 +4572,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4482,7 +4609,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4516,7 +4644,8 @@
     }
     if (_json.containsKey('tables')) {
       tables = (_json['tables'] as core.List)
-          .map<Table>((value) => Table.fromJson(value))
+          .map<Table>((value) =>
+              Table.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4565,7 +4694,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -4573,7 +4703,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4623,7 +4754,8 @@
 
   Modification.fromJson(core.Map _json) {
     if (_json.containsKey('create')) {
-      create = ColumnFamily.fromJson(_json['create']);
+      create = ColumnFamily.fromJson(
+          _json['create'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('drop')) {
       drop = _json['drop'] as core.bool;
@@ -4632,7 +4764,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('update')) {
-      update = ColumnFamily.fromJson(_json['update']);
+      update = ColumnFamily.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4668,7 +4801,8 @@
   ModifyColumnFamiliesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('modifications')) {
       modifications = (_json['modifications'] as core.List)
-          .map<Modification>((value) => Modification.fromJson(value))
+          .map<Modification>((value) => Modification.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4745,11 +4879,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4757,7 +4893,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4844,7 +4981,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('progress')) {
-      progress = OperationProgress.fromJson(_json['progress']);
+      progress = OperationProgress.fromJson(
+          _json['progress'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4873,7 +5011,8 @@
 
   PartialUpdateInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instance')) {
-      instance = Instance.fromJson(_json['instance']);
+      instance = Instance.fromJson(
+          _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -4971,12 +5110,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -5022,7 +5163,8 @@
 
   RestoreInfo.fromJson(core.Map _json) {
     if (_json.containsKey('backupInfo')) {
-      backupInfo = BackupInfo.fromJson(_json['backupInfo']);
+      backupInfo = BackupInfo.fromJson(
+          _json['backupInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceType')) {
       sourceType = _json['sourceType'] as core.String;
@@ -5071,7 +5213,8 @@
 
   RestoreTableMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('backupInfo')) {
-      backupInfo = BackupInfo.fromJson(_json['backupInfo']);
+      backupInfo = BackupInfo.fromJson(
+          _json['backupInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5081,7 +5224,8 @@
           _json['optimizeTableOperationName'] as core.String;
     }
     if (_json.containsKey('progress')) {
-      progress = OperationProgress.fromJson(_json['progress']);
+      progress = OperationProgress.fromJson(
+          _json['progress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceType')) {
       sourceType = _json['sourceType'] as core.String;
@@ -5160,7 +5304,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -5274,7 +5419,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -5337,13 +5483,17 @@
   Table.fromJson(core.Map _json) {
     if (_json.containsKey('clusterStates')) {
       clusterStates = commons.mapMap<core.Map, ClusterState>(
-          _json['clusterStates'].cast<core.String, core.Map>(),
-          (core.Map item) => ClusterState.fromJson(item));
+          (_json['clusterStates'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ClusterState.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('columnFamilies')) {
       columnFamilies = commons.mapMap<core.Map, ColumnFamily>(
-          _json['columnFamilies'].cast<core.String, core.Map>(),
-          (core.Map item) => ColumnFamily.fromJson(item));
+          (_json['columnFamilies'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ColumnFamily.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('granularity')) {
       granularity = _json['granularity'] as core.String;
@@ -5352,7 +5502,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('restoreInfo')) {
-      restoreInfo = RestoreInfo.fromJson(_json['restoreInfo']);
+      restoreInfo = RestoreInfo.fromJson(
+          _json['restoreInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5493,7 +5644,8 @@
   Union.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<GcRule>((value) => GcRule.fromJson(value))
+          .map<GcRule>((value) =>
+              GcRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5539,7 +5691,8 @@
       finishTime = _json['finishTime'] as core.String;
     }
     if (_json.containsKey('originalRequest')) {
-      originalRequest = Cluster.fromJson(_json['originalRequest']);
+      originalRequest = Cluster.fromJson(
+          _json['originalRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestTime')) {
       requestTime = _json['requestTime'] as core.String;
@@ -5579,8 +5732,8 @@
       finishTime = _json['finishTime'] as core.String;
     }
     if (_json.containsKey('originalRequest')) {
-      originalRequest =
-          PartialUpdateInstanceRequest.fromJson(_json['originalRequest']);
+      originalRequest = PartialUpdateInstanceRequest.fromJson(
+          _json['originalRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestTime')) {
       requestTime = _json['requestTime'] as core.String;
diff --git a/generated/googleapis/lib/binaryauthorization/v1.dart b/generated/googleapis/lib/binaryauthorization/v1.dart
index a7e01a5..b3868b2 100644
--- a/generated/googleapis/lib/binaryauthorization/v1.dart
+++ b/generated/googleapis/lib/binaryauthorization/v1.dart
@@ -108,7 +108,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates or updates a project's policy, and returns a copy of the new
@@ -168,7 +170,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -239,7 +243,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Attestor.fromJson(data));
+    return _response.then(
+      (data) => Attestor.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an attestor. Returns NOT_FOUND if the attestor does not exist.
@@ -289,7 +295,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an attestor. Returns NOT_FOUND if the attestor does not exist.
@@ -339,7 +347,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Attestor.fromJson(data));
+    return _response.then(
+      (data) => Attestor.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -407,7 +417,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IamPolicy.fromJson(data));
+    return _response.then(
+      (data) => IamPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists attestors. Returns INVALID_ARGUMENT if the project does not exist.
@@ -474,7 +486,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAttestorsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAttestorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -535,7 +550,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IamPolicy.fromJson(data));
+    return _response.then(
+      (data) => IamPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -598,7 +615,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an attestor. Returns NOT_FOUND if the attestor does not exist.
@@ -654,7 +674,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Attestor.fromJson(data));
+    return _response.then(
+      (data) => Attestor.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns whether the given Attestation for the given image URI was signed
@@ -714,8 +736,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ValidateAttestationOccurrenceResponse.fromJson(data));
+    return _response.then(
+      (data) => ValidateAttestationOccurrenceResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -789,7 +813,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IamPolicy.fromJson(data));
+    return _response.then(
+      (data) => IamPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -850,7 +876,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IamPolicy.fromJson(data));
+    return _response.then(
+      (data) => IamPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -913,7 +941,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1049,7 +1080,8 @@
   AttestationOccurrence.fromJson(core.Map _json) {
     if (_json.containsKey('jwts')) {
       jwts = (_json['jwts'] as core.List)
-          .map<Jwt>((value) => Jwt.fromJson(value))
+          .map<Jwt>((value) =>
+              Jwt.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serializedPayload')) {
@@ -1057,7 +1089,8 @@
     }
     if (_json.containsKey('signatures')) {
       signatures = (_json['signatures'] as core.List)
-          .map<Signature>((value) => Signature.fromJson(value))
+          .map<Signature>((value) =>
+              Signature.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1108,8 +1141,8 @@
       updateTime = _json['updateTime'] as core.String;
     }
     if (_json.containsKey('userOwnedGrafeasNote')) {
-      userOwnedGrafeasNote =
-          UserOwnedGrafeasNote.fromJson(_json['userOwnedGrafeasNote']);
+      userOwnedGrafeasNote = UserOwnedGrafeasNote.fromJson(
+          _json['userOwnedGrafeasNote'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1173,7 +1206,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('pkixPublicKey')) {
-      pkixPublicKey = PkixPublicKey.fromJson(_json['pkixPublicKey']);
+      pkixPublicKey = PkixPublicKey.fromJson(
+          _json['pkixPublicKey'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1252,7 +1286,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1444,7 +1479,8 @@
   IamPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -1508,7 +1544,8 @@
   ListAttestorsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('attestors')) {
       attestors = (_json['attestors'] as core.List)
-          .map<Attestor>((value) => Attestor.fromJson(value))
+          .map<Attestor>((value) =>
+              Attestor.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1636,18 +1673,22 @@
     if (_json.containsKey('admissionWhitelistPatterns')) {
       admissionWhitelistPatterns =
           (_json['admissionWhitelistPatterns'] as core.List)
-              .map<AdmissionWhitelistPattern>(
-                  (value) => AdmissionWhitelistPattern.fromJson(value))
+              .map<AdmissionWhitelistPattern>((value) =>
+                  AdmissionWhitelistPattern.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('clusterAdmissionRules')) {
       clusterAdmissionRules = commons.mapMap<core.Map, AdmissionRule>(
-          _json['clusterAdmissionRules'].cast<core.String, core.Map>(),
-          (core.Map item) => AdmissionRule.fromJson(item));
+          (_json['clusterAdmissionRules']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => AdmissionRule.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('defaultAdmissionRule')) {
-      defaultAdmissionRule =
-          AdmissionRule.fromJson(_json['defaultAdmissionRule']);
+      defaultAdmissionRule = AdmissionRule.fromJson(
+          _json['defaultAdmissionRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -1706,7 +1747,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = IamPolicy.fromJson(_json['policy']);
+      policy = IamPolicy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1878,7 +1920,8 @@
     }
     if (_json.containsKey('publicKeys')) {
       publicKeys = (_json['publicKeys'] as core.List)
-          .map<AttestorPublicKey>((value) => AttestorPublicKey.fromJson(value))
+          .map<AttestorPublicKey>((value) => AttestorPublicKey.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1917,7 +1960,8 @@
 
   ValidateAttestationOccurrenceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('attestation')) {
-      attestation = AttestationOccurrence.fromJson(_json['attestation']);
+      attestation = AttestationOccurrence.fromJson(
+          _json['attestation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('occurrenceNote')) {
       occurrenceNote = _json['occurrenceNote'] as core.String;
diff --git a/generated/googleapis/lib/blogger/v3.dart b/generated/googleapis/lib/blogger/v3.dart
index 42e7495..a3f3e9a 100644
--- a/generated/googleapis/lib/blogger/v3.dart
+++ b/generated/googleapis/lib/blogger/v3.dart
@@ -125,7 +125,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BlogUserInfo.fromJson(data));
+    return _response.then(
+      (data) =>
+          BlogUserInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -196,7 +199,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Blog.fromJson(data));
+    return _response.then(
+      (data) => Blog.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a blog by url.
@@ -256,7 +261,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Blog.fromJson(data));
+    return _response.then(
+      (data) => Blog.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists blogs by user.
@@ -333,7 +340,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BlogList.fromJson(data));
+    return _response.then(
+      (data) => BlogList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -405,7 +414,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a comment by blog id, post id and comment id.
@@ -470,7 +481,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a comment by id.
@@ -546,7 +559,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists comments.
@@ -656,7 +671,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists comments by blog.
@@ -740,7 +758,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks a comment as spam by blog id, post id and comment id.
@@ -806,7 +827,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes the content of a comment by blog id, post id and comment id.
@@ -872,7 +895,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -933,7 +958,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Pageviews.fromJson(data));
+    return _response.then(
+      (data) => Pageviews.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -996,7 +1023,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a page by blog id and page id.
@@ -1064,7 +1093,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Page.fromJson(data));
+    return _response.then(
+      (data) => Page.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a page.
@@ -1124,7 +1155,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Page.fromJson(data));
+    return _response.then(
+      (data) => Page.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists pages.
@@ -1207,7 +1240,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PageList.fromJson(data));
+    return _response.then(
+      (data) => PageList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a page.
@@ -1282,7 +1317,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Page.fromJson(data));
+    return _response.then(
+      (data) => Page.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Publishes a page.
@@ -1340,7 +1377,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Page.fromJson(data));
+    return _response.then(
+      (data) => Page.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts a published or scheduled page to draft state.
@@ -1398,7 +1437,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Page.fromJson(data));
+    return _response.then(
+      (data) => Page.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a page by blog id and page id.
@@ -1473,7 +1514,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Page.fromJson(data));
+    return _response.then(
+      (data) => Page.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1550,7 +1593,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PostUserInfo.fromJson(data));
+    return _response.then(
+      (data) =>
+          PostUserInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists post and user info pairs.
@@ -1671,7 +1717,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PostUserInfosList.fromJson(data));
+    return _response.then(
+      (data) => PostUserInfosList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1734,7 +1783,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a post by blog id and post id
@@ -1820,7 +1871,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Post.fromJson(data));
+    return _response.then(
+      (data) => Post.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a post by path.
@@ -1894,7 +1947,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Post.fromJson(data));
+    return _response.then(
+      (data) => Post.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a post.
@@ -1966,7 +2021,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Post.fromJson(data));
+    return _response.then(
+      (data) => Post.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists posts.
@@ -2083,7 +2140,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PostList.fromJson(data));
+    return _response.then(
+      (data) => PostList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a post.
@@ -2176,7 +2235,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Post.fromJson(data));
+    return _response.then(
+      (data) => Post.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Publishes a post.
@@ -2240,7 +2301,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Post.fromJson(data));
+    return _response.then(
+      (data) => Post.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts a published or scheduled post to draft state.
@@ -2298,7 +2361,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Post.fromJson(data));
+    return _response.then(
+      (data) => Post.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches for posts matching given query terms in the specified blog.
@@ -2371,7 +2436,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PostList.fromJson(data));
+    return _response.then(
+      (data) => PostList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a post by blog id and post id.
@@ -2464,7 +2531,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Post.fromJson(data));
+    return _response.then(
+      (data) => Post.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2518,7 +2587,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2609,7 +2680,8 @@
   BlogPosts.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Post>((value) => Post.fromJson(value))
+          .map<Post>((value) =>
+              Post.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -2694,16 +2766,19 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('locale')) {
-      locale = BlogLocale.fromJson(_json['locale']);
+      locale = BlogLocale.fromJson(
+          _json['locale'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pages')) {
-      pages = BlogPages.fromJson(_json['pages']);
+      pages = BlogPages.fromJson(
+          _json['pages'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('posts')) {
-      posts = BlogPosts.fromJson(_json['posts']);
+      posts = BlogPosts.fromJson(
+          _json['posts'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('published')) {
       published = _json['published'] as core.String;
@@ -2782,12 +2857,14 @@
   BlogList.fromJson(core.Map _json) {
     if (_json.containsKey('blogUserInfos')) {
       blogUserInfos = (_json['blogUserInfos'] as core.List)
-          .map<BlogUserInfo>((value) => BlogUserInfo.fromJson(value))
+          .map<BlogUserInfo>((value) => BlogUserInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Blog>((value) => Blog.fromJson(value))
+          .map<Blog>((value) =>
+              Blog.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2897,10 +2974,12 @@
 
   BlogUserInfo.fromJson(core.Map _json) {
     if (_json.containsKey('blog')) {
-      blog = Blog.fromJson(_json['blog']);
+      blog =
+          Blog.fromJson(_json['blog'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('blog_user_info')) {
-      blogUserInfo = BlogPerUserInfo.fromJson(_json['blog_user_info']);
+      blogUserInfo = BlogPerUserInfo.fromJson(
+          _json['blog_user_info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -2968,7 +3047,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = CommentAuthorImage.fromJson(_json['image']);
+      image = CommentAuthorImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -3102,10 +3182,12 @@
 
   Comment.fromJson(core.Map _json) {
     if (_json.containsKey('author')) {
-      author = CommentAuthor.fromJson(_json['author']);
+      author = CommentAuthor.fromJson(
+          _json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('blog')) {
-      blog = CommentBlog.fromJson(_json['blog']);
+      blog = CommentBlog.fromJson(
+          _json['blog'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -3114,13 +3196,15 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('inReplyTo')) {
-      inReplyTo = CommentInReplyTo.fromJson(_json['inReplyTo']);
+      inReplyTo = CommentInReplyTo.fromJson(
+          _json['inReplyTo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('post')) {
-      post = CommentPost.fromJson(_json['post']);
+      post = CommentPost.fromJson(
+          _json['post'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('published')) {
       published = _json['published'] as core.String;
@@ -3199,7 +3283,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Comment>((value) => Comment.fromJson(value))
+          .map<Comment>((value) =>
+              Comment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3280,7 +3365,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = PageAuthorImage.fromJson(_json['image']);
+      image = PageAuthorImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -3372,10 +3458,12 @@
 
   Page.fromJson(core.Map _json) {
     if (_json.containsKey('author')) {
-      author = PageAuthor.fromJson(_json['author']);
+      author = PageAuthor.fromJson(
+          _json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('blog')) {
-      blog = PageBlog.fromJson(_json['blog']);
+      blog = PageBlog.fromJson(
+          _json['blog'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -3472,7 +3560,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3553,7 +3642,8 @@
     }
     if (_json.containsKey('counts')) {
       counts = (_json['counts'] as core.List)
-          .map<PageviewsCounts>((value) => PageviewsCounts.fromJson(value))
+          .map<PageviewsCounts>((value) => PageviewsCounts.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3622,7 +3712,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = PostAuthorImage.fromJson(_json['image']);
+      image = PostAuthorImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -3754,7 +3845,8 @@
   PostReplies.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Comment>((value) => Comment.fromJson(value))
+          .map<Comment>((value) =>
+              Comment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -3850,10 +3942,12 @@
 
   Post.fromJson(core.Map _json) {
     if (_json.containsKey('author')) {
-      author = PostAuthor.fromJson(_json['author']);
+      author = PostAuthor.fromJson(
+          _json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('blog')) {
-      blog = PostBlog.fromJson(_json['blog']);
+      blog = PostBlog.fromJson(
+          _json['blog'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -3869,7 +3963,8 @@
     }
     if (_json.containsKey('images')) {
       images = (_json['images'] as core.List)
-          .map<PostImages>((value) => PostImages.fromJson(value))
+          .map<PostImages>((value) =>
+              PostImages.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3881,7 +3976,8 @@
           .toList();
     }
     if (_json.containsKey('location')) {
-      location = PostLocation.fromJson(_json['location']);
+      location = PostLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('published')) {
       published = _json['published'] as core.String;
@@ -3890,7 +3986,8 @@
       readerComments = _json['readerComments'] as core.String;
     }
     if (_json.containsKey('replies')) {
-      replies = PostReplies.fromJson(_json['replies']);
+      replies = PostReplies.fromJson(
+          _json['replies'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -3999,7 +4096,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Post>((value) => Post.fromJson(value))
+          .map<Post>((value) =>
+              Post.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4108,10 +4206,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('post')) {
-      post = Post.fromJson(_json['post']);
+      post =
+          Post.fromJson(_json['post'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('post_user_info')) {
-      postUserInfo = PostPerUserInfo.fromJson(_json['post_user_info']);
+      postUserInfo = PostPerUserInfo.fromJson(
+          _json['post_user_info'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4145,7 +4245,8 @@
   PostUserInfosList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PostUserInfo>((value) => PostUserInfo.fromJson(value))
+          .map<PostUserInfo>((value) => PostUserInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4268,7 +4369,8 @@
       about = _json['about'] as core.String;
     }
     if (_json.containsKey('blogs')) {
-      blogs = UserBlogs.fromJson(_json['blogs']);
+      blogs = UserBlogs.fromJson(
+          _json['blogs'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = _json['created'] as core.String;
@@ -4283,7 +4385,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('locale')) {
-      locale = UserLocale.fromJson(_json['locale']);
+      locale = UserLocale.fromJson(
+          _json['locale'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
diff --git a/generated/googleapis/lib/books/v1.dart b/generated/googleapis/lib/books/v1.dart
index 05de682..2206688 100644
--- a/generated/googleapis/lib/books/v1.dart
+++ b/generated/googleapis/lib/books/v1.dart
@@ -130,7 +130,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bookshelf.fromJson(data));
+    return _response.then(
+      (data) => Bookshelf.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of public bookshelves for the specified user.
@@ -186,7 +188,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bookshelves.fromJson(data));
+    return _response.then(
+      (data) =>
+          Bookshelves.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -276,7 +281,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -351,7 +358,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BooksCloudloadingResource.fromJson(data));
+    return _response.then(
+      (data) => BooksCloudloadingResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Remove the book and its contents
@@ -399,7 +409,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a user-upload volume.
@@ -447,7 +459,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BooksCloudloadingResource.fromJson(data));
+    return _response.then(
+      (data) => BooksCloudloadingResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -501,7 +516,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Metadata.fromJson(data));
+    return _response.then(
+      (data) => Metadata.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -555,7 +572,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FamilyInfo.fromJson(data));
+    return _response.then(
+      (data) =>
+          FamilyInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Initiates sharing of the content with the user's family. Empty response
@@ -616,7 +636,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Initiates revoking content that has already been shared with the user's
@@ -677,7 +699,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -757,7 +781,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Layersummary.fromJson(data));
+    return _response.then(
+      (data) =>
+          Layersummary.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List the layer summaries for a volume.
@@ -831,7 +858,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Layersummaries.fromJson(data));
+    return _response.then(
+      (data) =>
+          Layersummaries.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -950,7 +980,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DictionaryAnnotationdata.fromJson(data));
+    return _response.then(
+      (data) => DictionaryAnnotationdata.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the annotation data for a volume and layer.
@@ -1080,7 +1113,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Annotationsdata.fromJson(data));
+    return _response.then(
+      (data) =>
+          Annotationsdata.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1165,7 +1201,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumeannotation.fromJson(data));
+    return _response.then(
+      (data) => Volumeannotation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the volume annotations for a volume and layer.
@@ -1305,7 +1344,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumeannotations.fromJson(data));
+    return _response.then(
+      (data) => Volumeannotations.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1360,7 +1402,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Usersettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          Usersettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Release downloaded content access restriction.
@@ -1427,7 +1472,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DownloadAccesses.fromJson(data));
+    return _response.then(
+      (data) => DownloadAccesses.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Request concurrent and download access restrictions.
@@ -1512,7 +1560,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RequestAccessData.fromJson(data));
+    return _response.then(
+      (data) => RequestAccessData.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Request downloaded content access for specified volumes on the My eBooks
@@ -1606,7 +1657,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the settings for the user. If a sub-object is specified, it will
@@ -1656,7 +1709,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Usersettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          Usersettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1731,7 +1787,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new annotation.
@@ -1806,7 +1864,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Annotation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Annotation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of annotations, possibly filtered.
@@ -1911,7 +1972,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Annotations.fromJson(data));
+    return _response.then(
+      (data) =>
+          Annotations.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the summary of specified layers.
@@ -1965,7 +2029,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AnnotationsSummary.fromJson(data));
+    return _response.then(
+      (data) => AnnotationsSummary.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing annotation.
@@ -2026,7 +2093,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Annotation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Annotation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2109,7 +2179,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Clears all volumes from a bookshelf.
@@ -2165,7 +2237,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves metadata for a specific bookshelf belonging to the authenticated
@@ -2221,7 +2295,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bookshelf.fromJson(data));
+    return _response.then(
+      (data) => Bookshelf.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of bookshelves belonging to the authenticated user.
@@ -2269,7 +2345,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bookshelves.fromJson(data));
+    return _response.then(
+      (data) =>
+          Bookshelves.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves a volume within a bookshelf.
@@ -2339,7 +2418,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a volume from a bookshelf.
@@ -2410,7 +2491,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2514,7 +2597,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2583,7 +2668,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReadingPosition.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReadingPosition.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets my reading position information for a volume.
@@ -2679,7 +2767,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2746,7 +2836,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Notification.fromJson(data));
+    return _response.then(
+      (data) =>
+          Notification.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2801,7 +2894,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Category.fromJson(data));
+    return _response.then(
+      (data) => Category.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List available volumes under categories for onboarding experience.
@@ -2880,7 +2975,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volume2.fromJson(data));
+    return _response.then(
+      (data) => Volume2.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2954,7 +3051,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Discoveryclusters.fromJson(data));
+    return _response.then(
+      (data) => Discoveryclusters.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3050,7 +3150,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks the promo offer as dismissed.
@@ -3134,7 +3236,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of promo offers available to the user
@@ -3212,7 +3316,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Offers.fromJson(data));
+    return _response.then(
+      (data) => Offers.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3269,7 +3375,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Series.fromJson(data));
+    return _response.then(
+      (data) => Series.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3337,7 +3445,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Seriesmembership.fromJson(data));
+    return _response.then(
+      (data) => Seriesmembership.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3443,7 +3554,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volume.fromJson(data));
+    return _response.then(
+      (data) => Volume.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Performs a book search.
@@ -3603,7 +3716,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3696,7 +3811,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3789,7 +3906,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3863,7 +3982,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rate a recommended book for the current user.
@@ -3934,8 +4055,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BooksVolumesRecommendedRateResponse.fromJson(data));
+    return _response.then(
+      (data) => BooksVolumesRecommendedRateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4023,7 +4146,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Volumes.fromJson(data));
+    return _response.then(
+      (data) => Volumes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4048,19 +4173,23 @@
 
   AnnotationClientVersionRanges.fromJson(core.Map _json) {
     if (_json.containsKey('cfiRange')) {
-      cfiRange = BooksAnnotationsRange.fromJson(_json['cfiRange']);
+      cfiRange = BooksAnnotationsRange.fromJson(
+          _json['cfiRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentVersion')) {
       contentVersion = _json['contentVersion'] as core.String;
     }
     if (_json.containsKey('gbImageRange')) {
-      gbImageRange = BooksAnnotationsRange.fromJson(_json['gbImageRange']);
+      gbImageRange = BooksAnnotationsRange.fromJson(
+          _json['gbImageRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gbTextRange')) {
-      gbTextRange = BooksAnnotationsRange.fromJson(_json['gbTextRange']);
+      gbTextRange = BooksAnnotationsRange.fromJson(
+          _json['gbTextRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageCfiRange')) {
-      imageCfiRange = BooksAnnotationsRange.fromJson(_json['imageCfiRange']);
+      imageCfiRange = BooksAnnotationsRange.fromJson(
+          _json['imageCfiRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4106,19 +4235,23 @@
 
   AnnotationCurrentVersionRanges.fromJson(core.Map _json) {
     if (_json.containsKey('cfiRange')) {
-      cfiRange = BooksAnnotationsRange.fromJson(_json['cfiRange']);
+      cfiRange = BooksAnnotationsRange.fromJson(
+          _json['cfiRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentVersion')) {
       contentVersion = _json['contentVersion'] as core.String;
     }
     if (_json.containsKey('gbImageRange')) {
-      gbImageRange = BooksAnnotationsRange.fromJson(_json['gbImageRange']);
+      gbImageRange = BooksAnnotationsRange.fromJson(
+          _json['gbImageRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gbTextRange')) {
-      gbTextRange = BooksAnnotationsRange.fromJson(_json['gbTextRange']);
+      gbTextRange = BooksAnnotationsRange.fromJson(
+          _json['gbTextRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageCfiRange')) {
-      imageCfiRange = BooksAnnotationsRange.fromJson(_json['imageCfiRange']);
+      imageCfiRange = BooksAnnotationsRange.fromJson(
+          _json['imageCfiRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4246,15 +4379,15 @@
       beforeSelectedText = _json['beforeSelectedText'] as core.String;
     }
     if (_json.containsKey('clientVersionRanges')) {
-      clientVersionRanges =
-          AnnotationClientVersionRanges.fromJson(_json['clientVersionRanges']);
+      clientVersionRanges = AnnotationClientVersionRanges.fromJson(
+          _json['clientVersionRanges'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = _json['created'] as core.String;
     }
     if (_json.containsKey('currentVersionRanges')) {
       currentVersionRanges = AnnotationCurrentVersionRanges.fromJson(
-          _json['currentVersionRanges']);
+          _json['currentVersionRanges'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('data')) {
       data = _json['data'] as core.String;
@@ -4275,7 +4408,8 @@
       layerId = _json['layerId'] as core.String;
     }
     if (_json.containsKey('layerSummary')) {
-      layerSummary = AnnotationLayerSummary.fromJson(_json['layerSummary']);
+      layerSummary = AnnotationLayerSummary.fromJson(
+          _json['layerSummary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageIds')) {
       pageIds = (_json['pageIds'] as core.List)
@@ -4373,7 +4507,8 @@
   Annotations.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Annotation>((value) => Annotation.fromJson(value))
+          .map<Annotation>((value) =>
+              Annotation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4465,8 +4600,9 @@
     }
     if (_json.containsKey('layers')) {
       layers = (_json['layers'] as core.List)
-          .map<AnnotationsSummaryLayers>(
-              (value) => AnnotationsSummaryLayers.fromJson(value))
+          .map<AnnotationsSummaryLayers>((value) =>
+              AnnotationsSummaryLayers.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4502,7 +4638,8 @@
   Annotationsdata.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<GeoAnnotationdata>((value) => GeoAnnotationdata.fromJson(value))
+          .map<GeoAnnotationdata>((value) => GeoAnnotationdata.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4760,7 +4897,8 @@
   Bookshelves.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Bookshelf>((value) => Bookshelf.fromJson(value))
+          .map<Bookshelf>((value) =>
+              Bookshelf.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4826,7 +4964,8 @@
   Category.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CategoryItems>((value) => CategoryItems.fromJson(value))
+          .map<CategoryItems>((value) => CategoryItems.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -5002,7 +5141,8 @@
       annotationType = _json['annotationType'] as core.String;
     }
     if (_json.containsKey('data')) {
-      data = Dictlayerdata.fromJson(_json['data']);
+      data = Dictlayerdata.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encodedData')) {
       encodedData = _json['encodedData'] as core.String;
@@ -5145,8 +5285,8 @@
 
   DictlayerdataDictWordsDerivatives.fromJson(core.Map _json) {
     if (_json.containsKey('source')) {
-      source =
-          DictlayerdataDictWordsDerivativesSource.fromJson(_json['source']);
+      source = DictlayerdataDictWordsDerivativesSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -5200,7 +5340,8 @@
 
   DictlayerdataDictWordsExamples.fromJson(core.Map _json) {
     if (_json.containsKey('source')) {
-      source = DictlayerdataDictWordsExamplesSource.fromJson(_json['source']);
+      source = DictlayerdataDictWordsExamplesSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -5283,7 +5424,7 @@
   DictlayerdataDictWordsSensesDefinitionsExamples.fromJson(core.Map _json) {
     if (_json.containsKey('source')) {
       source = DictlayerdataDictWordsSensesDefinitionsExamplesSource.fromJson(
-          _json['source']);
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -5315,7 +5456,8 @@
     if (_json.containsKey('examples')) {
       examples = (_json['examples'] as core.List)
           .map<DictlayerdataDictWordsSensesDefinitionsExamples>((value) =>
-              DictlayerdataDictWordsSensesDefinitionsExamples.fromJson(value))
+              DictlayerdataDictWordsSensesDefinitionsExamples.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5394,8 +5536,8 @@
 
   DictlayerdataDictWordsSensesSynonyms.fromJson(core.Map _json) {
     if (_json.containsKey('source')) {
-      source =
-          DictlayerdataDictWordsSensesSynonymsSource.fromJson(_json['source']);
+      source = DictlayerdataDictWordsSensesSynonymsSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -5430,13 +5572,15 @@
     if (_json.containsKey('conjugations')) {
       conjugations = (_json['conjugations'] as core.List)
           .map<DictlayerdataDictWordsSensesConjugations>((value) =>
-              DictlayerdataDictWordsSensesConjugations.fromJson(value))
+              DictlayerdataDictWordsSensesConjugations.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('definitions')) {
       definitions = (_json['definitions'] as core.List)
           .map<DictlayerdataDictWordsSensesDefinitions>((value) =>
-              DictlayerdataDictWordsSensesDefinitions.fromJson(value))
+              DictlayerdataDictWordsSensesDefinitions.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('partOfSpeech')) {
@@ -5449,15 +5593,17 @@
       pronunciationUrl = _json['pronunciationUrl'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = DictlayerdataDictWordsSensesSource.fromJson(_json['source']);
+      source = DictlayerdataDictWordsSensesSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syllabification')) {
       syllabification = _json['syllabification'] as core.String;
     }
     if (_json.containsKey('synonyms')) {
       synonyms = (_json['synonyms'] as core.List)
-          .map<DictlayerdataDictWordsSensesSynonyms>(
-              (value) => DictlayerdataDictWordsSensesSynonyms.fromJson(value))
+          .map<DictlayerdataDictWordsSensesSynonyms>((value) =>
+              DictlayerdataDictWordsSensesSynonyms.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5537,24 +5683,28 @@
   DictlayerdataDictWords.fromJson(core.Map _json) {
     if (_json.containsKey('derivatives')) {
       derivatives = (_json['derivatives'] as core.List)
-          .map<DictlayerdataDictWordsDerivatives>(
-              (value) => DictlayerdataDictWordsDerivatives.fromJson(value))
+          .map<DictlayerdataDictWordsDerivatives>((value) =>
+              DictlayerdataDictWordsDerivatives.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('examples')) {
       examples = (_json['examples'] as core.List)
-          .map<DictlayerdataDictWordsExamples>(
-              (value) => DictlayerdataDictWordsExamples.fromJson(value))
+          .map<DictlayerdataDictWordsExamples>((value) =>
+              DictlayerdataDictWordsExamples.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('senses')) {
       senses = (_json['senses'] as core.List)
-          .map<DictlayerdataDictWordsSenses>(
-              (value) => DictlayerdataDictWordsSenses.fromJson(value))
+          .map<DictlayerdataDictWordsSenses>((value) =>
+              DictlayerdataDictWordsSenses.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('source')) {
-      source = DictlayerdataDictWordsSource.fromJson(_json['source']);
+      source = DictlayerdataDictWordsSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5586,12 +5736,14 @@
 
   DictlayerdataDict.fromJson(core.Map _json) {
     if (_json.containsKey('source')) {
-      source = DictlayerdataDictSource.fromJson(_json['source']);
+      source = DictlayerdataDictSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<DictlayerdataDictWords>(
-              (value) => DictlayerdataDictWords.fromJson(value))
+          .map<DictlayerdataDictWords>((value) =>
+              DictlayerdataDictWords.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5617,10 +5769,12 @@
 
   Dictlayerdata.fromJson(core.Map _json) {
     if (_json.containsKey('common')) {
-      common = DictlayerdataCommon.fromJson(_json['common']);
+      common = DictlayerdataCommon.fromJson(
+          _json['common'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dict')) {
-      dict = DictlayerdataDict.fromJson(_json['dict']);
+      dict = DictlayerdataDict.fromJson(
+          _json['dict'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -5712,7 +5866,8 @@
     if (_json.containsKey('banner_with_content_container')) {
       bannerWithContentContainer =
           DiscoveryclustersClustersBannerWithContentContainer.fromJson(
-              _json['banner_with_content_container']);
+              _json['banner_with_content_container']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subTitle')) {
       subTitle = _json['subTitle'] as core.String;
@@ -5728,7 +5883,8 @@
     }
     if (_json.containsKey('volumes')) {
       volumes = (_json['volumes'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5770,8 +5926,9 @@
   Discoveryclusters.fromJson(core.Map _json) {
     if (_json.containsKey('clusters')) {
       clusters = (_json['clusters'] as core.List)
-          .map<DiscoveryclustersClusters>(
-              (value) => DiscoveryclustersClusters.fromJson(value))
+          .map<DiscoveryclustersClusters>((value) =>
+              DiscoveryclustersClusters.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -5934,8 +6091,9 @@
   DownloadAccesses.fromJson(core.Map _json) {
     if (_json.containsKey('downloadAccessList')) {
       downloadAccessList = (_json['downloadAccessList'] as core.List)
-          .map<DownloadAccessRestriction>(
-              (value) => DownloadAccessRestriction.fromJson(value))
+          .map<DownloadAccessRestriction>((value) =>
+              DownloadAccessRestriction.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6044,7 +6202,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('membership')) {
-      membership = FamilyInfoMembership.fromJson(_json['membership']);
+      membership = FamilyInfoMembership.fromJson(
+          _json['membership'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6104,7 +6263,8 @@
       annotationType = _json['annotationType'] as core.String;
     }
     if (_json.containsKey('data')) {
-      data = Geolayerdata.fromJson(_json['data']);
+      data = Geolayerdata.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encodedData')) {
       encodedData = _json['encodedData'] as core.String;
@@ -6284,10 +6444,12 @@
 
   GeolayerdataGeoViewport.fromJson(core.Map _json) {
     if (_json.containsKey('hi')) {
-      hi = GeolayerdataGeoViewportHi.fromJson(_json['hi']);
+      hi = GeolayerdataGeoViewportHi.fromJson(
+          _json['hi'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lo')) {
-      lo = GeolayerdataGeoViewportLo.fromJson(_json['lo']);
+      lo = GeolayerdataGeoViewportLo.fromJson(
+          _json['lo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6358,7 +6520,8 @@
       mapType = _json['mapType'] as core.String;
     }
     if (_json.containsKey('viewport')) {
-      viewport = GeolayerdataGeoViewport.fromJson(_json['viewport']);
+      viewport = GeolayerdataGeoViewport.fromJson(
+          _json['viewport'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zoom')) {
       zoom = _json['zoom'] as core.int;
@@ -6404,10 +6567,12 @@
 
   Geolayerdata.fromJson(core.Map _json) {
     if (_json.containsKey('common')) {
-      common = GeolayerdataCommon.fromJson(_json['common']);
+      common = GeolayerdataCommon.fromJson(
+          _json['common'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('geo')) {
-      geo = GeolayerdataGeo.fromJson(_json['geo']);
+      geo = GeolayerdataGeo.fromJson(
+          _json['geo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -6444,7 +6609,8 @@
   Layersummaries.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Layersummary>((value) => Layersummary.fromJson(value))
+          .map<Layersummary>((value) => Layersummary.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6665,7 +6831,8 @@
   Metadata.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<MetadataItems>((value) => MetadataItems.fromJson(value))
+          .map<MetadataItems>((value) => MetadataItems.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6893,7 +7060,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<OffersItemsItems>((value) => OffersItemsItems.fromJson(value))
+          .map<OffersItemsItems>((value) => OffersItemsItems.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6928,7 +7096,8 @@
   Offers.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<OffersItems>((value) => OffersItems.fromJson(value))
+          .map<OffersItems>((value) => OffersItems.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7038,12 +7207,12 @@
 
   RequestAccessData.fromJson(core.Map _json) {
     if (_json.containsKey('concurrentAccess')) {
-      concurrentAccess =
-          ConcurrentAccessRestriction.fromJson(_json['concurrentAccess']);
+      concurrentAccess = ConcurrentAccessRestriction.fromJson(
+          _json['concurrentAccess'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('downloadAccess')) {
-      downloadAccess =
-          DownloadAccessRestriction.fromJson(_json['downloadAccess']);
+      downloadAccess = DownloadAccessRestriction.fromJson(
+          _json['downloadAccess'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -7166,7 +7335,8 @@
 
   Review.fromJson(core.Map _json) {
     if (_json.containsKey('author')) {
-      author = ReviewAuthor.fromJson(_json['author']);
+      author = ReviewAuthor.fromJson(
+          _json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -7184,7 +7354,8 @@
       rating = _json['rating'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = ReviewSource.fromJson(_json['source']);
+      source = ReviewSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -7333,12 +7504,13 @@
     if (_json.containsKey('currentReleaseInfo')) {
       currentReleaseInfo =
           SeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo.fromJson(
-              _json['currentReleaseInfo']);
+              _json['currentReleaseInfo']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextReleaseInfo')) {
       nextReleaseInfo =
           SeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo.fromJson(
-              _json['nextReleaseInfo']);
+              _json['nextReleaseInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('seriesSubscriptionType')) {
       seriesSubscriptionType = _json['seriesSubscriptionType'] as core.String;
@@ -7399,7 +7571,8 @@
     if (_json.containsKey('seriesSubscriptionReleaseInfo')) {
       seriesSubscriptionReleaseInfo =
           SeriesSeriesSeriesSubscriptionReleaseInfo.fromJson(
-              _json['seriesSubscriptionReleaseInfo']);
+              _json['seriesSubscriptionReleaseInfo']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('seriesType')) {
       seriesType = _json['seriesType'] as core.String;
@@ -7462,7 +7635,8 @@
     }
     if (_json.containsKey('series')) {
       series = (_json['series'] as core.List)
-          .map<SeriesSeries>((value) => SeriesSeries.fromJson(value))
+          .map<SeriesSeries>((value) => SeriesSeries.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7493,7 +7667,8 @@
     }
     if (_json.containsKey('member')) {
       member = (_json['member'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7656,23 +7831,23 @@
   UsersettingsNotification.fromJson(core.Map _json) {
     if (_json.containsKey('matchMyInterests')) {
       matchMyInterests = UsersettingsNotificationMatchMyInterests.fromJson(
-          _json['matchMyInterests']);
+          _json['matchMyInterests'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('moreFromAuthors')) {
       moreFromAuthors = UsersettingsNotificationMoreFromAuthors.fromJson(
-          _json['moreFromAuthors']);
+          _json['moreFromAuthors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('moreFromSeries')) {
       moreFromSeries = UsersettingsNotificationMoreFromSeries.fromJson(
-          _json['moreFromSeries']);
+          _json['moreFromSeries'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('priceDrop')) {
-      priceDrop =
-          UsersettingsNotificationPriceDrop.fromJson(_json['priceDrop']);
+      priceDrop = UsersettingsNotificationPriceDrop.fromJson(
+          _json['priceDrop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rewardExpirations')) {
       rewardExpirations = UsersettingsNotificationRewardExpirations.fromJson(
-          _json['rewardExpirations']);
+          _json['rewardExpirations'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7712,10 +7887,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('notesExport')) {
-      notesExport = UsersettingsNotesExport.fromJson(_json['notesExport']);
+      notesExport = UsersettingsNotesExport.fromJson(
+          _json['notesExport'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('notification')) {
-      notification = UsersettingsNotification.fromJson(_json['notification']);
+      notification = UsersettingsNotification.fromJson(
+          _json['notification'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7887,8 +8064,8 @@
       country = _json['country'] as core.String;
     }
     if (_json.containsKey('downloadAccess')) {
-      downloadAccess =
-          DownloadAccessRestriction.fromJson(_json['downloadAccess']);
+      downloadAccess = DownloadAccessRestriction.fromJson(
+          _json['downloadAccess'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveImportedContentLink')) {
       driveImportedContentLink =
@@ -7898,14 +8075,16 @@
       embeddable = _json['embeddable'] as core.bool;
     }
     if (_json.containsKey('epub')) {
-      epub = VolumeAccessInfoEpub.fromJson(_json['epub']);
+      epub = VolumeAccessInfoEpub.fromJson(
+          _json['epub'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('explicitOfflineLicenseManagement')) {
       explicitOfflineLicenseManagement =
           _json['explicitOfflineLicenseManagement'] as core.bool;
     }
     if (_json.containsKey('pdf')) {
-      pdf = VolumeAccessInfoPdf.fromJson(_json['pdf']);
+      pdf = VolumeAccessInfoPdf.fromJson(
+          _json['pdf'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publicDomain')) {
       publicDomain = _json['publicDomain'] as core.bool;
@@ -8019,8 +8198,8 @@
   VolumeLayerInfo.fromJson(core.Map _json) {
     if (_json.containsKey('layers')) {
       layers = (_json['layers'] as core.List)
-          .map<VolumeLayerInfoLayers>(
-              (value) => VolumeLayerInfoLayers.fromJson(value))
+          .map<VolumeLayerInfoLayers>((value) => VolumeLayerInfoLayers.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8197,15 +8376,16 @@
       giftable = _json['giftable'] as core.bool;
     }
     if (_json.containsKey('listPrice')) {
-      listPrice = VolumeSaleInfoOffersListPrice.fromJson(_json['listPrice']);
+      listPrice = VolumeSaleInfoOffersListPrice.fromJson(
+          _json['listPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rentalDuration')) {
-      rentalDuration =
-          VolumeSaleInfoOffersRentalDuration.fromJson(_json['rentalDuration']);
+      rentalDuration = VolumeSaleInfoOffersRentalDuration.fromJson(
+          _json['rentalDuration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retailPrice')) {
-      retailPrice =
-          VolumeSaleInfoOffersRetailPrice.fromJson(_json['retailPrice']);
+      retailPrice = VolumeSaleInfoOffersRetailPrice.fromJson(
+          _json['retailPrice'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8312,19 +8492,21 @@
       isEbook = _json['isEbook'] as core.bool;
     }
     if (_json.containsKey('listPrice')) {
-      listPrice = VolumeSaleInfoListPrice.fromJson(_json['listPrice']);
+      listPrice = VolumeSaleInfoListPrice.fromJson(
+          _json['listPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('offers')) {
       offers = (_json['offers'] as core.List)
-          .map<VolumeSaleInfoOffers>(
-              (value) => VolumeSaleInfoOffers.fromJson(value))
+          .map<VolumeSaleInfoOffers>((value) => VolumeSaleInfoOffers.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('onSaleDate')) {
       onSaleDate = _json['onSaleDate'] as core.String;
     }
     if (_json.containsKey('retailPrice')) {
-      retailPrice = VolumeSaleInfoRetailPrice.fromJson(_json['retailPrice']);
+      retailPrice = VolumeSaleInfoRetailPrice.fromJson(
+          _json['retailPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('saleability')) {
       saleability = _json['saleability'] as core.String;
@@ -8591,14 +8773,15 @@
       acquisitionType = _json['acquisitionType'] as core.int;
     }
     if (_json.containsKey('copy')) {
-      copy = VolumeUserInfoCopy.fromJson(_json['copy']);
+      copy = VolumeUserInfoCopy.fromJson(
+          _json['copy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entitlementType')) {
       entitlementType = _json['entitlementType'] as core.int;
     }
     if (_json.containsKey('familySharing')) {
-      familySharing =
-          VolumeUserInfoFamilySharing.fromJson(_json['familySharing']);
+      familySharing = VolumeUserInfoFamilySharing.fromJson(
+          _json['familySharing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isFamilySharedFromUser')) {
       isFamilySharedFromUser = _json['isFamilySharedFromUser'] as core.bool;
@@ -8626,23 +8809,27 @@
       isUploaded = _json['isUploaded'] as core.bool;
     }
     if (_json.containsKey('readingPosition')) {
-      readingPosition = ReadingPosition.fromJson(_json['readingPosition']);
+      readingPosition = ReadingPosition.fromJson(
+          _json['readingPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rentalPeriod')) {
-      rentalPeriod = VolumeUserInfoRentalPeriod.fromJson(_json['rentalPeriod']);
+      rentalPeriod = VolumeUserInfoRentalPeriod.fromJson(
+          _json['rentalPeriod'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rentalState')) {
       rentalState = _json['rentalState'] as core.String;
     }
     if (_json.containsKey('review')) {
-      review = Review.fromJson(_json['review']);
+      review = Review.fromJson(
+          _json['review'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updated')) {
       updated = _json['updated'] as core.String;
     }
     if (_json.containsKey('userUploadedVolumeInfo')) {
       userUploadedVolumeInfo = VolumeUserInfoUserUploadedVolumeInfo.fromJson(
-          _json['userUploadedVolumeInfo']);
+          _json['userUploadedVolumeInfo']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9041,15 +9228,18 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = VolumeVolumeInfoDimensions.fromJson(_json['dimensions']);
+      dimensions = VolumeVolumeInfoDimensions.fromJson(
+          _json['dimensions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageLinks')) {
-      imageLinks = VolumeVolumeInfoImageLinks.fromJson(_json['imageLinks']);
+      imageLinks = VolumeVolumeInfoImageLinks.fromJson(
+          _json['imageLinks'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('industryIdentifiers')) {
       industryIdentifiers = (_json['industryIdentifiers'] as core.List)
-          .map<VolumeVolumeInfoIndustryIdentifiers>(
-              (value) => VolumeVolumeInfoIndustryIdentifiers.fromJson(value))
+          .map<VolumeVolumeInfoIndustryIdentifiers>((value) =>
+              VolumeVolumeInfoIndustryIdentifiers.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('infoLink')) {
@@ -9069,7 +9259,7 @@
     }
     if (_json.containsKey('panelizationSummary')) {
       panelizationSummary = VolumeVolumeInfoPanelizationSummary.fromJson(
-          _json['panelizationSummary']);
+          _json['panelizationSummary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('previewLink')) {
       previewLink = _json['previewLink'] as core.String;
@@ -9090,14 +9280,15 @@
       ratingsCount = _json['ratingsCount'] as core.int;
     }
     if (_json.containsKey('readingModes')) {
-      readingModes =
-          VolumeVolumeInfoReadingModes.fromJson(_json['readingModes']);
+      readingModes = VolumeVolumeInfoReadingModes.fromJson(
+          _json['readingModes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('samplePageCount')) {
       samplePageCount = _json['samplePageCount'] as core.int;
     }
     if (_json.containsKey('seriesInfo')) {
-      seriesInfo = Volumeseriesinfo.fromJson(_json['seriesInfo']);
+      seriesInfo = Volumeseriesinfo.fromJson(
+          _json['seriesInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subtitle')) {
       subtitle = _json['subtitle'] as core.String;
@@ -9243,7 +9434,8 @@
 
   Volume.fromJson(core.Map _json) {
     if (_json.containsKey('accessInfo')) {
-      accessInfo = VolumeAccessInfo.fromJson(_json['accessInfo']);
+      accessInfo = VolumeAccessInfo.fromJson(
+          _json['accessInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -9255,26 +9447,31 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('layerInfo')) {
-      layerInfo = VolumeLayerInfo.fromJson(_json['layerInfo']);
+      layerInfo = VolumeLayerInfo.fromJson(
+          _json['layerInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recommendedInfo')) {
-      recommendedInfo =
-          VolumeRecommendedInfo.fromJson(_json['recommendedInfo']);
+      recommendedInfo = VolumeRecommendedInfo.fromJson(
+          _json['recommendedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('saleInfo')) {
-      saleInfo = VolumeSaleInfo.fromJson(_json['saleInfo']);
+      saleInfo = VolumeSaleInfo.fromJson(
+          _json['saleInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchInfo')) {
-      searchInfo = VolumeSearchInfo.fromJson(_json['searchInfo']);
+      searchInfo = VolumeSearchInfo.fromJson(
+          _json['searchInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('userInfo')) {
-      userInfo = VolumeUserInfo.fromJson(_json['userInfo']);
+      userInfo = VolumeUserInfo.fromJson(
+          _json['userInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('volumeInfo')) {
-      volumeInfo = VolumeVolumeInfo.fromJson(_json['volumeInfo']);
+      volumeInfo = VolumeVolumeInfo.fromJson(
+          _json['volumeInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9330,7 +9527,8 @@
   Volume2.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9374,16 +9572,19 @@
 
   VolumeannotationContentRanges.fromJson(core.Map _json) {
     if (_json.containsKey('cfiRange')) {
-      cfiRange = BooksAnnotationsRange.fromJson(_json['cfiRange']);
+      cfiRange = BooksAnnotationsRange.fromJson(
+          _json['cfiRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentVersion')) {
       contentVersion = _json['contentVersion'] as core.String;
     }
     if (_json.containsKey('gbImageRange')) {
-      gbImageRange = BooksAnnotationsRange.fromJson(_json['gbImageRange']);
+      gbImageRange = BooksAnnotationsRange.fromJson(
+          _json['gbImageRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gbTextRange')) {
-      gbTextRange = BooksAnnotationsRange.fromJson(_json['gbTextRange']);
+      gbTextRange = BooksAnnotationsRange.fromJson(
+          _json['gbTextRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9462,8 +9663,8 @@
       annotationType = _json['annotationType'] as core.String;
     }
     if (_json.containsKey('contentRanges')) {
-      contentRanges =
-          VolumeannotationContentRanges.fromJson(_json['contentRanges']);
+      contentRanges = VolumeannotationContentRanges.fromJson(
+          _json['contentRanges'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('data')) {
       data = _json['data'] as core.String;
@@ -9572,7 +9773,8 @@
   Volumeannotations.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Volumeannotation>((value) => Volumeannotation.fromJson(value))
+          .map<Volumeannotation>((value) => Volumeannotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9626,7 +9828,8 @@
   Volumes.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9698,8 +9901,9 @@
   VolumeseriesinfoVolumeSeries.fromJson(core.Map _json) {
     if (_json.containsKey('issue')) {
       issue = (_json['issue'] as core.List)
-          .map<VolumeseriesinfoVolumeSeriesIssue>(
-              (value) => VolumeseriesinfoVolumeSeriesIssue.fromJson(value))
+          .map<VolumeseriesinfoVolumeSeriesIssue>((value) =>
+              VolumeseriesinfoVolumeSeriesIssue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('orderNumber')) {
@@ -9757,8 +9961,9 @@
     }
     if (_json.containsKey('volumeSeries')) {
       volumeSeries = (_json['volumeSeries'] as core.List)
-          .map<VolumeseriesinfoVolumeSeries>(
-              (value) => VolumeseriesinfoVolumeSeries.fromJson(value))
+          .map<VolumeseriesinfoVolumeSeries>((value) =>
+              VolumeseriesinfoVolumeSeries.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/calendar/v3.dart b/generated/googleapis/lib/calendar/v3.dart
index 115f966..3e4a69e 100644
--- a/generated/googleapis/lib/calendar/v3.dart
+++ b/generated/googleapis/lib/calendar/v3.dart
@@ -132,7 +132,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns an access control rule.
@@ -191,7 +193,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AclRule.fromJson(data));
+    return _response.then(
+      (data) => AclRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an access control rule.
@@ -254,7 +258,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AclRule.fromJson(data));
+    return _response.then(
+      (data) => AclRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the rules in the access control list for the calendar.
@@ -341,7 +347,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Acl.fromJson(data));
+    return _response.then(
+      (data) => Acl.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an access control rule. This method supports patch semantics.
@@ -414,7 +422,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AclRule.fromJson(data));
+    return _response.then(
+      (data) => AclRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an access control rule.
@@ -487,7 +497,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AclRule.fromJson(data));
+    return _response.then(
+      (data) => AclRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Watch for changes to ACL resources.
@@ -582,7 +594,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -639,7 +653,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns a calendar from the user's calendar list.
@@ -690,7 +706,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarListEntry.fromJson(data));
+    return _response.then(
+      (data) => CalendarListEntry.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts an existing calendar into the user's calendar list.
@@ -747,7 +766,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarListEntry.fromJson(data));
+    return _response.then(
+      (data) => CalendarListEntry.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the calendars on the user's calendar list.
@@ -848,7 +870,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CalendarList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing calendar on the user's calendar list. This method
@@ -915,7 +940,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarListEntry.fromJson(data));
+    return _response.then(
+      (data) => CalendarListEntry.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing calendar on the user's calendar list.
@@ -981,7 +1009,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CalendarListEntry.fromJson(data));
+    return _response.then(
+      (data) => CalendarListEntry.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Watch for changes to CalendarList resources.
@@ -1088,7 +1119,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1146,7 +1179,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Deletes a secondary calendar. Use calendars.clear for clearing all events
@@ -1197,7 +1232,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns metadata for a calendar.
@@ -1247,7 +1284,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Calendar.fromJson(data));
+    return _response.then(
+      (data) => Calendar.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a secondary calendar.
@@ -1295,7 +1334,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Calendar.fromJson(data));
+    return _response.then(
+      (data) => Calendar.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates metadata for a calendar. This method supports patch semantics.
@@ -1351,7 +1392,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Calendar.fromJson(data));
+    return _response.then(
+      (data) => Calendar.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates metadata for a calendar.
@@ -1407,7 +1450,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Calendar.fromJson(data));
+    return _response.then(
+      (data) => Calendar.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1461,7 +1506,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -1509,7 +1556,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Colors.fromJson(data));
+    return _response.then(
+      (data) => Colors.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1598,7 +1647,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns an event.
@@ -1681,7 +1732,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Event.fromJson(data));
+    return _response.then(
+      (data) => Event.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports an event. This operation is used to add a private copy of an
@@ -1758,7 +1811,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Event.fromJson(data));
+    return _response.then(
+      (data) => Event.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an event.
@@ -1866,7 +1921,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Event.fromJson(data));
+    return _response.then(
+      (data) => Event.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns instances of the specified recurring event.
@@ -1996,7 +2053,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Events.fromJson(data));
+    return _response.then(
+      (data) => Events.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns events on the specified calendar.
@@ -2216,7 +2275,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Events.fromJson(data));
+    return _response.then(
+      (data) => Events.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves an event to another calendar, i.e. changes an event's organizer.
@@ -2307,7 +2368,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Event.fromJson(data));
+    return _response.then(
+      (data) => Event.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an event. This method supports patch semantics.
@@ -2431,7 +2494,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Event.fromJson(data));
+    return _response.then(
+      (data) => Event.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an event based on a simple text string.
@@ -2514,7 +2579,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Event.fromJson(data));
+    return _response.then(
+      (data) => Event.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an event.
@@ -2638,7 +2705,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Event.fromJson(data));
+    return _response.then(
+      (data) => Event.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Watch for changes to Events resources.
@@ -2865,7 +2934,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2919,7 +2990,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FreeBusyResponse.fromJson(data));
+    return _response.then(
+      (data) => FreeBusyResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2973,7 +3047,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Setting.fromJson(data));
+    return _response.then(
+      (data) => Setting.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns all user settings for the authenticated user.
@@ -3042,7 +3118,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Settings.fromJson(data));
+    return _response.then(
+      (data) => Settings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Watch for changes to Settings resources.
@@ -3117,7 +3195,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3148,7 +3228,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AclRule>((value) => AclRule.fromJson(value))
+          .map<AclRule>((value) =>
+              AclRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3263,7 +3344,8 @@
       role = _json['role'] as core.String;
     }
     if (_json.containsKey('scope')) {
-      scope = AclRuleScope.fromJson(_json['scope']);
+      scope = AclRuleScope.fromJson(
+          _json['scope'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3320,8 +3402,8 @@
 
   Calendar.fromJson(core.Map _json) {
     if (_json.containsKey('conferenceProperties')) {
-      conferenceProperties =
-          ConferenceProperties.fromJson(_json['conferenceProperties']);
+      conferenceProperties = ConferenceProperties.fromJson(
+          _json['conferenceProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -3403,7 +3485,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CalendarListEntry>((value) => CalendarListEntry.fromJson(value))
+          .map<CalendarListEntry>((value) => CalendarListEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3449,8 +3532,8 @@
   CalendarListEntryNotificationSettings.fromJson(core.Map _json) {
     if (_json.containsKey('notifications')) {
       notifications = (_json['notifications'] as core.List)
-          .map<CalendarNotification>(
-              (value) => CalendarNotification.fromJson(value))
+          .map<CalendarNotification>((value) => CalendarNotification.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3564,12 +3647,13 @@
       colorId = _json['colorId'] as core.String;
     }
     if (_json.containsKey('conferenceProperties')) {
-      conferenceProperties =
-          ConferenceProperties.fromJson(_json['conferenceProperties']);
+      conferenceProperties = ConferenceProperties.fromJson(
+          _json['conferenceProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultReminders')) {
       defaultReminders = (_json['defaultReminders'] as core.List)
-          .map<EventReminder>((value) => EventReminder.fromJson(value))
+          .map<EventReminder>((value) => EventReminder.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deleted')) {
@@ -3598,7 +3682,7 @@
     }
     if (_json.containsKey('notificationSettings')) {
       notificationSettings = CalendarListEntryNotificationSettings.fromJson(
-          _json['notificationSettings']);
+          _json['notificationSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('primary')) {
       primary = _json['primary'] as core.bool;
@@ -3774,7 +3858,8 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.String, core.String>(
-          _json['params'].cast<core.String, core.String>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('payload')) {
@@ -3884,13 +3969,17 @@
   Colors.fromJson(core.Map _json) {
     if (_json.containsKey('calendar')) {
       calendar = commons.mapMap<core.Map, ColorDefinition>(
-          _json['calendar'].cast<core.String, core.Map>(),
-          (core.Map item) => ColorDefinition.fromJson(item));
+          (_json['calendar'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ColorDefinition.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('event')) {
       event = commons.mapMap<core.Map, ColorDefinition>(
-          _json['event'].cast<core.String, core.Map>(),
-          (core.Map item) => ColorDefinition.fromJson(item));
+          (_json['event'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ColorDefinition.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -3976,22 +4065,25 @@
       conferenceId = _json['conferenceId'] as core.String;
     }
     if (_json.containsKey('conferenceSolution')) {
-      conferenceSolution =
-          ConferenceSolution.fromJson(_json['conferenceSolution']);
+      conferenceSolution = ConferenceSolution.fromJson(
+          _json['conferenceSolution'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createRequest')) {
-      createRequest = CreateConferenceRequest.fromJson(_json['createRequest']);
+      createRequest = CreateConferenceRequest.fromJson(
+          _json['createRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entryPoints')) {
       entryPoints = (_json['entryPoints'] as core.List)
-          .map<EntryPoint>((value) => EntryPoint.fromJson(value))
+          .map<EntryPoint>((value) =>
+              EntryPoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('notes')) {
       notes = _json['notes'] as core.String;
     }
     if (_json.containsKey('parameters')) {
-      parameters = ConferenceParameters.fromJson(_json['parameters']);
+      parameters = ConferenceParameters.fromJson(
+          _json['parameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('signature')) {
       signature = _json['signature'] as core.String;
@@ -4035,7 +4127,7 @@
   ConferenceParameters.fromJson(core.Map _json) {
     if (_json.containsKey('addOnParameters')) {
       addOnParameters = ConferenceParametersAddOnParameters.fromJson(
-          _json['addOnParameters']);
+          _json['addOnParameters'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4056,7 +4148,8 @@
   ConferenceParametersAddOnParameters.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.String, core.String>(
-          _json['parameters'].cast<core.String, core.String>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -4143,7 +4236,8 @@
       iconUri = _json['iconUri'] as core.String;
     }
     if (_json.containsKey('key')) {
-      key = ConferenceSolutionKey.fromJson(_json['key']);
+      key = ConferenceSolutionKey.fromJson(
+          _json['key'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4211,14 +4305,16 @@
 
   CreateConferenceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('conferenceSolutionKey')) {
-      conferenceSolutionKey =
-          ConferenceSolutionKey.fromJson(_json['conferenceSolutionKey']);
+      conferenceSolutionKey = ConferenceSolutionKey.fromJson(
+          _json['conferenceSolutionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestId')) {
       requestId = _json['requestId'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = ConferenceRequestStatus.fromJson(_json['status']);
+      status = ConferenceRequestStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4500,12 +4596,14 @@
   EventExtendedProperties.fromJson(core.Map _json) {
     if (_json.containsKey('private')) {
       private = commons.mapMap<core.String, core.String>(
-          _json['private'].cast<core.String, core.String>(),
+          (_json['private'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('shared')) {
       shared = commons.mapMap<core.String, core.String>(
-          _json['shared'].cast<core.String, core.String>(),
+          (_json['shared'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -4571,7 +4669,8 @@
     }
     if (_json.containsKey('preferences')) {
       preferences = commons.mapMap<core.String, core.String>(
-          _json['preferences'].cast<core.String, core.String>(),
+          (_json['preferences'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('title')) {
@@ -4685,7 +4784,8 @@
   EventReminders.fromJson(core.Map _json) {
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
-          .map<EventReminder>((value) => EventReminder.fromJson(value))
+          .map<EventReminder>((value) => EventReminder.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('useDefault')) {
@@ -4965,12 +5065,14 @@
     }
     if (_json.containsKey('attachments')) {
       attachments = (_json['attachments'] as core.List)
-          .map<EventAttachment>((value) => EventAttachment.fromJson(value))
+          .map<EventAttachment>((value) => EventAttachment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('attendees')) {
       attendees = (_json['attendees'] as core.List)
-          .map<EventAttendee>((value) => EventAttendee.fromJson(value))
+          .map<EventAttendee>((value) => EventAttendee.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('attendeesOmitted')) {
@@ -4980,19 +5082,22 @@
       colorId = _json['colorId'] as core.String;
     }
     if (_json.containsKey('conferenceData')) {
-      conferenceData = ConferenceData.fromJson(_json['conferenceData']);
+      conferenceData = ConferenceData.fromJson(
+          _json['conferenceData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('created')) {
       created = core.DateTime.parse(_json['created'] as core.String);
     }
     if (_json.containsKey('creator')) {
-      creator = EventCreator.fromJson(_json['creator']);
+      creator = EventCreator.fromJson(
+          _json['creator'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('end')) {
-      end = EventDateTime.fromJson(_json['end']);
+      end = EventDateTime.fromJson(
+          _json['end'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTimeUnspecified')) {
       endTimeUnspecified = _json['endTimeUnspecified'] as core.bool;
@@ -5001,11 +5106,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('extendedProperties')) {
-      extendedProperties =
-          EventExtendedProperties.fromJson(_json['extendedProperties']);
+      extendedProperties = EventExtendedProperties.fromJson(
+          _json['extendedProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gadget')) {
-      gadget = EventGadget.fromJson(_json['gadget']);
+      gadget = EventGadget.fromJson(
+          _json['gadget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('guestsCanInviteOthers')) {
       guestsCanInviteOthers = _json['guestsCanInviteOthers'] as core.bool;
@@ -5038,10 +5144,12 @@
       locked = _json['locked'] as core.bool;
     }
     if (_json.containsKey('organizer')) {
-      organizer = EventOrganizer.fromJson(_json['organizer']);
+      organizer = EventOrganizer.fromJson(
+          _json['organizer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('originalStartTime')) {
-      originalStartTime = EventDateTime.fromJson(_json['originalStartTime']);
+      originalStartTime = EventDateTime.fromJson(
+          _json['originalStartTime'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('privateCopy')) {
       privateCopy = _json['privateCopy'] as core.bool;
@@ -5055,16 +5163,19 @@
       recurringEventId = _json['recurringEventId'] as core.String;
     }
     if (_json.containsKey('reminders')) {
-      reminders = EventReminders.fromJson(_json['reminders']);
+      reminders = EventReminders.fromJson(
+          _json['reminders'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sequence')) {
       sequence = _json['sequence'] as core.int;
     }
     if (_json.containsKey('source')) {
-      source = EventSource.fromJson(_json['source']);
+      source = EventSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('start')) {
-      start = EventDateTime.fromJson(_json['start']);
+      start = EventDateTime.fromJson(
+          _json['start'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
@@ -5518,7 +5629,8 @@
     }
     if (_json.containsKey('defaultReminders')) {
       defaultReminders = (_json['defaultReminders'] as core.List)
-          .map<EventReminder>((value) => EventReminder.fromJson(value))
+          .map<EventReminder>((value) => EventReminder.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('description')) {
@@ -5529,7 +5641,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Event>((value) => Event.fromJson(value))
+          .map<Event>((value) =>
+              Event.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -5604,12 +5717,14 @@
   FreeBusyCalendar.fromJson(core.Map _json) {
     if (_json.containsKey('busy')) {
       busy = (_json['busy'] as core.List)
-          .map<TimePeriod>((value) => TimePeriod.fromJson(value))
+          .map<TimePeriod>((value) =>
+              TimePeriod.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<Error>((value) => Error.fromJson(value))
+          .map<Error>((value) =>
+              Error.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5643,7 +5758,8 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<Error>((value) => Error.fromJson(value))
+          .map<Error>((value) =>
+              Error.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5693,8 +5809,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<FreeBusyRequestItem>(
-              (value) => FreeBusyRequestItem.fromJson(value))
+          .map<FreeBusyRequestItem>((value) => FreeBusyRequestItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeMax')) {
@@ -5774,13 +5890,17 @@
   FreeBusyResponse.fromJson(core.Map _json) {
     if (_json.containsKey('calendars')) {
       calendars = commons.mapMap<core.Map, FreeBusyCalendar>(
-          _json['calendars'].cast<core.String, core.Map>(),
-          (core.Map item) => FreeBusyCalendar.fromJson(item));
+          (_json['calendars'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => FreeBusyCalendar.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('groups')) {
       groups = commons.mapMap<core.Map, FreeBusyGroup>(
-          _json['groups'].cast<core.String, core.Map>(),
-          (core.Map item) => FreeBusyGroup.fromJson(item));
+          (_json['groups'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => FreeBusyGroup.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -5895,7 +6015,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Setting>((value) => Setting.fromJson(value))
+          .map<Setting>((value) =>
+              Setting.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/chat/v1.dart b/generated/googleapis/lib/chat/v1.dart
index 243ca12..5ff2207 100644
--- a/generated/googleapis/lib/chat/v1.dart
+++ b/generated/googleapis/lib/chat/v1.dart
@@ -118,7 +118,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => Media.fromJson(data));
+      return _response.then(
+        (data) => Media.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -181,7 +183,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Space.fromJson(data));
+    return _response.then(
+      (data) => Space.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists spaces the caller is a member of.
@@ -238,7 +242,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSpacesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSpacesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -295,7 +302,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Membership.fromJson(data));
+    return _response.then(
+      (data) =>
+          Membership.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists human memberships in a space.
@@ -362,7 +372,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListMembershipsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListMembershipsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -441,7 +454,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a message.
@@ -492,7 +507,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a message.
@@ -543,7 +560,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a message.
@@ -606,7 +625,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -664,7 +685,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Attachment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Attachment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -775,7 +799,8 @@
       length = _json['length'] as core.int;
     }
     if (_json.containsKey('slashCommand')) {
-      slashCommand = SlashCommandMetadata.fromJson(_json['slashCommand']);
+      slashCommand = SlashCommandMetadata.fromJson(
+          _json['slashCommand'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startIndex')) {
       startIndex = _json['startIndex'] as core.int;
@@ -784,7 +809,8 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('userMention')) {
-      userMention = UserMentionMetadata.fromJson(_json['userMention']);
+      userMention = UserMentionMetadata.fromJson(
+          _json['userMention'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -849,8 +875,8 @@
 
   Attachment.fromJson(core.Map _json) {
     if (_json.containsKey('attachmentDataRef')) {
-      attachmentDataRef =
-          AttachmentDataRef.fromJson(_json['attachmentDataRef']);
+      attachmentDataRef = AttachmentDataRef.fromJson(
+          _json['attachmentDataRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentName')) {
       contentName = _json['contentName'] as core.String;
@@ -862,7 +888,8 @@
       downloadUri = _json['downloadUri'] as core.String;
     }
     if (_json.containsKey('driveDataRef')) {
-      driveDataRef = DriveDataRef.fromJson(_json['driveDataRef']);
+      driveDataRef = DriveDataRef.fromJson(
+          _json['driveDataRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -940,10 +967,12 @@
 
   Button.fromJson(core.Map _json) {
     if (_json.containsKey('imageButton')) {
-      imageButton = ImageButton.fromJson(_json['imageButton']);
+      imageButton = ImageButton.fromJson(
+          _json['imageButton'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textButton')) {
-      textButton = TextButton.fromJson(_json['textButton']);
+      textButton = TextButton.fromJson(
+          _json['textButton'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -978,18 +1007,21 @@
   Card.fromJson(core.Map _json) {
     if (_json.containsKey('cardActions')) {
       cardActions = (_json['cardActions'] as core.List)
-          .map<CardAction>((value) => CardAction.fromJson(value))
+          .map<CardAction>((value) =>
+              CardAction.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('header')) {
-      header = CardHeader.fromJson(_json['header']);
+      header = CardHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('sections')) {
       sections = (_json['sections'] as core.List)
-          .map<Section>((value) => Section.fromJson(value))
+          .map<Section>((value) =>
+              Section.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1030,7 +1062,8 @@
       actionLabel = _json['actionLabel'] as core.String;
     }
     if (_json.containsKey('onClick')) {
-      onClick = OnClick.fromJson(_json['onClick']);
+      onClick = OnClick.fromJson(
+          _json['onClick'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1149,7 +1182,8 @@
 
   DeprecatedEvent.fromJson(core.Map _json) {
     if (_json.containsKey('action')) {
-      action = FormAction.fromJson(_json['action']);
+      action = FormAction.fromJson(
+          _json['action'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('configCompleteRedirectUrl')) {
       configCompleteRedirectUrl =
@@ -1159,10 +1193,12 @@
       eventTime = _json['eventTime'] as core.String;
     }
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('space')) {
-      space = Space.fromJson(_json['space']);
+      space =
+          Space.fromJson(_json['space'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('threadKey')) {
       threadKey = _json['threadKey'] as core.String;
@@ -1174,7 +1210,8 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1271,7 +1308,8 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<ActionParameter>((value) => ActionParameter.fromJson(value))
+          .map<ActionParameter>((value) => ActionParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1312,7 +1350,8 @@
       imageUrl = _json['imageUrl'] as core.String;
     }
     if (_json.containsKey('onClick')) {
-      onClick = OnClick.fromJson(_json['onClick']);
+      onClick = OnClick.fromJson(
+          _json['onClick'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1392,7 +1431,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('onClick')) {
-      onClick = OnClick.fromJson(_json['onClick']);
+      onClick = OnClick.fromJson(
+          _json['onClick'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1482,7 +1522,8 @@
       bottomLabel = _json['bottomLabel'] as core.String;
     }
     if (_json.containsKey('button')) {
-      button = Button.fromJson(_json['button']);
+      button = Button.fromJson(
+          _json['button'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -1497,7 +1538,8 @@
       iconUrl = _json['iconUrl'] as core.String;
     }
     if (_json.containsKey('onClick')) {
-      onClick = OnClick.fromJson(_json['onClick']);
+      onClick = OnClick.fromJson(
+          _json['onClick'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('topLabel')) {
       topLabel = _json['topLabel'] as core.String;
@@ -1547,7 +1589,8 @@
   ListMembershipsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('memberships')) {
       memberships = (_json['memberships'] as core.List)
-          .map<Membership>((value) => Membership.fromJson(value))
+          .map<Membership>((value) =>
+              Membership.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1585,7 +1628,8 @@
     }
     if (_json.containsKey('spaces')) {
       spaces = (_json['spaces'] as core.List)
-          .map<Space>((value) => Space.fromJson(value))
+          .map<Space>((value) =>
+              Space.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1651,7 +1695,8 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('member')) {
-      member = User.fromJson(_json['member']);
+      member =
+          User.fromJson(_json['member'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1735,11 +1780,13 @@
 
   Message.fromJson(core.Map _json) {
     if (_json.containsKey('actionResponse')) {
-      actionResponse = ActionResponse.fromJson(_json['actionResponse']);
+      actionResponse = ActionResponse.fromJson(
+          _json['actionResponse'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annotations')) {
       annotations = (_json['annotations'] as core.List)
-          .map<Annotation>((value) => Annotation.fromJson(value))
+          .map<Annotation>((value) =>
+              Annotation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('argumentText')) {
@@ -1747,12 +1794,14 @@
     }
     if (_json.containsKey('attachment')) {
       attachment = (_json['attachment'] as core.List)
-          .map<Attachment>((value) => Attachment.fromJson(value))
+          .map<Attachment>((value) =>
+              Attachment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cards')) {
       cards = (_json['cards'] as core.List)
-          .map<Card>((value) => Card.fromJson(value))
+          .map<Card>((value) =>
+              Card.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('createTime')) {
@@ -1768,19 +1817,23 @@
       previewText = _json['previewText'] as core.String;
     }
     if (_json.containsKey('sender')) {
-      sender = User.fromJson(_json['sender']);
+      sender =
+          User.fromJson(_json['sender'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('slashCommand')) {
-      slashCommand = SlashCommand.fromJson(_json['slashCommand']);
+      slashCommand = SlashCommand.fromJson(
+          _json['slashCommand'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('space')) {
-      space = Space.fromJson(_json['space']);
+      space =
+          Space.fromJson(_json['space'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
     }
     if (_json.containsKey('thread')) {
-      thread = Thread.fromJson(_json['thread']);
+      thread = Thread.fromJson(
+          _json['thread'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1845,10 +1898,12 @@
 
   OnClick.fromJson(core.Map _json) {
     if (_json.containsKey('action')) {
-      action = FormAction.fromJson(_json['action']);
+      action = FormAction.fromJson(
+          _json['action'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('openLink')) {
-      openLink = OpenLink.fromJson(_json['openLink']);
+      openLink = OpenLink.fromJson(
+          _json['openLink'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1905,7 +1960,8 @@
     }
     if (_json.containsKey('widgets')) {
       widgets = (_json['widgets'] as core.List)
-          .map<WidgetMarkup>((value) => WidgetMarkup.fromJson(value))
+          .map<WidgetMarkup>((value) => WidgetMarkup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1969,7 +2025,7 @@
 
   SlashCommandMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('bot')) {
-      bot = User.fromJson(_json['bot']);
+      bot = User.fromJson(_json['bot'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('commandId')) {
       commandId = _json['commandId'] as core.String;
@@ -2084,7 +2140,8 @@
 
   TextButton.fromJson(core.Map _json) {
     if (_json.containsKey('onClick')) {
-      onClick = OnClick.fromJson(_json['onClick']);
+      onClick = OnClick.fromJson(
+          _json['onClick'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -2219,7 +2276,8 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2255,17 +2313,21 @@
   WidgetMarkup.fromJson(core.Map _json) {
     if (_json.containsKey('buttons')) {
       buttons = (_json['buttons'] as core.List)
-          .map<Button>((value) => Button.fromJson(value))
+          .map<Button>((value) =>
+              Button.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('image')) {
-      image = Image.fromJson(_json['image']);
+      image =
+          Image.fromJson(_json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keyValue')) {
-      keyValue = KeyValue.fromJson(_json['keyValue']);
+      keyValue = KeyValue.fromJson(
+          _json['keyValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textParagraph')) {
-      textParagraph = TextParagraph.fromJson(_json['textParagraph']);
+      textParagraph = TextParagraph.fromJson(
+          _json['textParagraph'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/civicinfo/v2.dart b/generated/googleapis/lib/civicinfo/v2.dart
index f6b6dde..eb65310 100644
--- a/generated/googleapis/lib/civicinfo/v2.dart
+++ b/generated/googleapis/lib/civicinfo/v2.dart
@@ -100,7 +100,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DivisionSearchResponse.fromJson(data));
+    return _response.then(
+      (data) => DivisionSearchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -148,7 +151,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ElectionsQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => ElectionsQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up information relevant to a voter based on the voter's registered
@@ -225,7 +231,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VoterInfoResponse.fromJson(data));
+    return _response.then(
+      (data) => VoterInfoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -305,7 +314,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RepresentativeInfoResponse.fromJson(data));
+    return _response.then(
+      (data) => RepresentativeInfoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up representative information for a single geographic division.
@@ -380,7 +392,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RepresentativeInfoData.fromJson(data));
+    return _response.then(
+      (data) => RepresentativeInfoData.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -409,22 +424,24 @@
 
   AdministrationRegion.fromJson(core.Map _json) {
     if (_json.containsKey('electionAdministrationBody')) {
-      electionAdministrationBody =
-          AdministrativeBody.fromJson(_json['electionAdministrationBody']);
+      electionAdministrationBody = AdministrativeBody.fromJson(
+          _json['electionAdministrationBody']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('local_jurisdiction')) {
-      localJurisdiction =
-          AdministrationRegion.fromJson(_json['local_jurisdiction']);
+      localJurisdiction = AdministrationRegion.fromJson(
+          _json['local_jurisdiction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<Source>((value) => Source.fromJson(value))
+          .map<Source>((value) =>
+              Source.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -516,8 +533,9 @@
       ballotInfoUrl = _json['ballotInfoUrl'] as core.String;
     }
     if (_json.containsKey('correspondenceAddress')) {
-      correspondenceAddress =
-          SimpleAddressType.fromJson(_json['correspondenceAddress']);
+      correspondenceAddress = SimpleAddressType.fromJson(
+          _json['correspondenceAddress']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('electionInfoUrl')) {
       electionInfoUrl = _json['electionInfoUrl'] as core.String;
@@ -530,7 +548,8 @@
     }
     if (_json.containsKey('electionOfficials')) {
       electionOfficials = (_json['electionOfficials'] as core.List)
-          .map<ElectionOfficial>((value) => ElectionOfficial.fromJson(value))
+          .map<ElectionOfficial>((value) => ElectionOfficial.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('electionRegistrationConfirmationUrl')) {
@@ -550,7 +569,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('physicalAddress')) {
-      physicalAddress = SimpleAddressType.fromJson(_json['physicalAddress']);
+      physicalAddress = SimpleAddressType.fromJson(
+          _json['physicalAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('voter_services')) {
       voterServices = (_json['voter_services'] as core.List)
@@ -651,7 +671,8 @@
     }
     if (_json.containsKey('channels')) {
       channels = (_json['channels'] as core.List)
-          .map<Channel>((value) => Channel.fromJson(value))
+          .map<Channel>((value) =>
+              Channel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('email')) {
@@ -858,11 +879,13 @@
     }
     if (_json.containsKey('candidates')) {
       candidates = (_json['candidates'] as core.List)
-          .map<Candidate>((value) => Candidate.fromJson(value))
+          .map<Candidate>((value) =>
+              Candidate.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('district')) {
-      district = ElectoralDistrict.fromJson(_json['district']);
+      district = ElectoralDistrict.fromJson(
+          _json['district'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('electorateSpecifications')) {
       electorateSpecifications =
@@ -935,7 +958,8 @@
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<Source>((value) => Source.fromJson(value))
+          .map<Source>((value) =>
+              Source.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('special')) {
@@ -1045,8 +1069,8 @@
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<DivisionSearchResult>(
-              (value) => DivisionSearchResult.fromJson(value))
+          .map<DivisionSearchResult>((value) => DivisionSearchResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1235,7 +1259,8 @@
   ElectionsQueryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('elections')) {
       elections = (_json['elections'] as core.List)
-          .map<Election>((value) => Election.fromJson(value))
+          .map<Election>((value) =>
+              Election.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1423,7 +1448,8 @@
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<Source>((value) => Source.fromJson(value))
+          .map<Source>((value) =>
+              Source.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1483,12 +1509,14 @@
   Official.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
       address = (_json['address'] as core.List)
-          .map<SimpleAddressType>((value) => SimpleAddressType.fromJson(value))
+          .map<SimpleAddressType>((value) => SimpleAddressType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('channels')) {
       channels = (_json['channels'] as core.List)
-          .map<Channel>((value) => Channel.fromJson(value))
+          .map<Channel>((value) =>
+              Channel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('emails')) {
@@ -1596,7 +1624,8 @@
 
   PollingLocation.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = SimpleAddressType.fromJson(_json['address']);
+      address = SimpleAddressType.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endDate')) {
       endDate = _json['endDate'] as core.String;
@@ -1621,7 +1650,8 @@
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<Source>((value) => Source.fromJson(value))
+          .map<Source>((value) =>
+              Source.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startDate')) {
@@ -1689,17 +1719,21 @@
   RepresentativeInfoData.fromJson(core.Map _json) {
     if (_json.containsKey('divisions')) {
       divisions = commons.mapMap<core.Map, GeographicDivision>(
-          _json['divisions'].cast<core.String, core.Map>(),
-          (core.Map item) => GeographicDivision.fromJson(item));
+          (_json['divisions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => GeographicDivision.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('offices')) {
       offices = (_json['offices'] as core.List)
-          .map<Office>((value) => Office.fromJson(value))
+          .map<Office>((value) =>
+              Office.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('officials')) {
       officials = (_json['officials'] as core.List)
-          .map<Official>((value) => Official.fromJson(value))
+          .map<Official>((value) =>
+              Official.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1747,23 +1781,28 @@
   RepresentativeInfoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('divisions')) {
       divisions = commons.mapMap<core.Map, GeographicDivision>(
-          _json['divisions'].cast<core.String, core.Map>(),
-          (core.Map item) => GeographicDivision.fromJson(item));
+          (_json['divisions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => GeographicDivision.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('normalizedInput')) {
-      normalizedInput = SimpleAddressType.fromJson(_json['normalizedInput']);
+      normalizedInput = SimpleAddressType.fromJson(
+          _json['normalizedInput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('offices')) {
       offices = (_json['offices'] as core.List)
-          .map<Office>((value) => Office.fromJson(value))
+          .map<Office>((value) =>
+              Office.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('officials')) {
       officials = (_json['officials'] as core.List)
-          .map<Official>((value) => Official.fromJson(value))
+          .map<Official>((value) =>
+              Official.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1953,21 +1992,25 @@
   VoterInfoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('contests')) {
       contests = (_json['contests'] as core.List)
-          .map<Contest>((value) => Contest.fromJson(value))
+          .map<Contest>((value) =>
+              Contest.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dropOffLocations')) {
       dropOffLocations = (_json['dropOffLocations'] as core.List)
-          .map<PollingLocation>((value) => PollingLocation.fromJson(value))
+          .map<PollingLocation>((value) => PollingLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('earlyVoteSites')) {
       earlyVoteSites = (_json['earlyVoteSites'] as core.List)
-          .map<PollingLocation>((value) => PollingLocation.fromJson(value))
+          .map<PollingLocation>((value) => PollingLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('election')) {
-      election = Election.fromJson(_json['election']);
+      election = Election.fromJson(
+          _json['election'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -1976,16 +2019,19 @@
       mailOnly = _json['mailOnly'] as core.bool;
     }
     if (_json.containsKey('normalizedInput')) {
-      normalizedInput = SimpleAddressType.fromJson(_json['normalizedInput']);
+      normalizedInput = SimpleAddressType.fromJson(
+          _json['normalizedInput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('otherElections')) {
       otherElections = (_json['otherElections'] as core.List)
-          .map<Election>((value) => Election.fromJson(value))
+          .map<Election>((value) =>
+              Election.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pollingLocations')) {
       pollingLocations = (_json['pollingLocations'] as core.List)
-          .map<PollingLocation>((value) => PollingLocation.fromJson(value))
+          .map<PollingLocation>((value) => PollingLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('precinctId')) {
@@ -1993,8 +2039,8 @@
     }
     if (_json.containsKey('state')) {
       state = (_json['state'] as core.List)
-          .map<AdministrationRegion>(
-              (value) => AdministrationRegion.fromJson(value))
+          .map<AdministrationRegion>((value) => AdministrationRegion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/classroom/v1.dart b/generated/googleapis/lib/classroom/v1.dart
index 6d47078..9b88ed5 100644
--- a/generated/googleapis/lib/classroom/v1.dart
+++ b/generated/googleapis/lib/classroom/v1.dart
@@ -210,7 +210,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Course.fromJson(data));
+    return _response.then(
+      (data) => Course.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a course. This method returns the following error codes: *
@@ -262,7 +264,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a course. This method returns the following error codes: *
@@ -314,7 +318,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Course.fromJson(data));
+    return _response.then(
+      (data) => Course.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of courses that the requesting user is permitted to view,
@@ -404,7 +410,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCoursesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCoursesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates one or more fields in a course. This method returns the following
@@ -478,7 +487,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Course.fromJson(data));
+    return _response.then(
+      (data) => Course.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a course. This method returns the following error codes: *
@@ -537,7 +548,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Course.fromJson(data));
+    return _response.then(
+      (data) => Course.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -605,7 +618,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseAlias.fromJson(data));
+    return _response.then(
+      (data) =>
+          CourseAlias.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an alias of a course. This method returns the following error
@@ -669,7 +685,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of aliases for a course. This method returns the following
@@ -739,7 +757,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCourseAliasesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCourseAliasesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -809,7 +830,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Announcement.fromJson(data));
+    return _response.then(
+      (data) =>
+          Announcement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an announcement. This request must be made by the Developer
@@ -876,7 +900,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns an announcement. This method returns the following error codes: *
@@ -938,7 +964,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Announcement.fromJson(data));
+    return _response.then(
+      (data) =>
+          Announcement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of announcements that the requester is permitted to view.
@@ -1030,7 +1059,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAnnouncementsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAnnouncementsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies assignee mode and options of an announcement. Only a teacher of
@@ -1101,7 +1133,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Announcement.fromJson(data));
+    return _response.then(
+      (data) =>
+          Announcement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates one or more fields of an announcement. This method returns the
@@ -1184,7 +1219,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Announcement.fromJson(data));
+    return _response.then(
+      (data) =>
+          Announcement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1262,7 +1300,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseWork.fromJson(data));
+    return _response.then(
+      (data) =>
+          CourseWork.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a course work. This request must be made by the Developer Console
@@ -1329,7 +1370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns course work. This method returns the following error codes: *
@@ -1391,7 +1434,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseWork.fromJson(data));
+    return _response.then(
+      (data) =>
+          CourseWork.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of course work that the requester is permitted to view.
@@ -1483,7 +1529,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCourseWorkResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCourseWorkResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies assignee mode and options of a coursework. Only a teacher of the
@@ -1553,7 +1602,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseWork.fromJson(data));
+    return _response.then(
+      (data) =>
+          CourseWork.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates one or more fields of a course work. See
@@ -1643,7 +1695,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseWork.fromJson(data));
+    return _response.then(
+      (data) =>
+          CourseWork.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1720,7 +1775,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StudentSubmission.fromJson(data));
+    return _response.then(
+      (data) => StudentSubmission.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of student submissions that the requester is permitted to
@@ -1836,8 +1894,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListStudentSubmissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListStudentSubmissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies attachments of student submission. Attachments may only be added
@@ -1920,7 +1980,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StudentSubmission.fromJson(data));
+    return _response.then(
+      (data) => StudentSubmission.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates one or more fields of a student submission. See
@@ -2011,7 +2074,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StudentSubmission.fromJson(data));
+    return _response.then(
+      (data) => StudentSubmission.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reclaims a student submission on behalf of the student that owns it.
@@ -2097,7 +2163,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a student submission. Returning a student submission transfers
@@ -2183,7 +2251,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Turns in a student submission. Turning in a student submission transfers
@@ -2267,7 +2337,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2338,7 +2410,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseWorkMaterial.fromJson(data));
+    return _response.then(
+      (data) => CourseWorkMaterial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a course work material. This request must be made by the Developer
@@ -2405,7 +2480,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a course work material. This method returns the following error
@@ -2467,7 +2544,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseWorkMaterial.fromJson(data));
+    return _response.then(
+      (data) => CourseWorkMaterial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of course work material that the requester is permitted to
@@ -2575,8 +2655,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListCourseWorkMaterialResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCourseWorkMaterialResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates one or more fields of a course work material. This method returns
@@ -2659,7 +2741,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CourseWorkMaterial.fromJson(data));
+    return _response.then(
+      (data) => CourseWorkMaterial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2738,7 +2823,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Student.fromJson(data));
+    return _response.then(
+      (data) => Student.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a student of a course. This method returns the following error
@@ -2803,7 +2890,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a student of a course. This method returns the following error
@@ -2868,7 +2957,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Student.fromJson(data));
+    return _response.then(
+      (data) => Student.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of students of this course that the requester is permitted
@@ -2938,7 +3029,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListStudentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListStudentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3008,7 +3102,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Teacher.fromJson(data));
+    return _response.then(
+      (data) => Teacher.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a teacher of a course. This method returns the following error
@@ -3074,7 +3170,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a teacher of a course. This method returns the following error
@@ -3139,7 +3237,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Teacher.fromJson(data));
+    return _response.then(
+      (data) => Teacher.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of teachers of this course that the requester is permitted
@@ -3209,7 +3309,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTeachersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTeachersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3275,7 +3378,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Topic.fromJson(data));
+    return _response.then(
+      (data) => Topic.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a topic. This method returns the following error codes: *
@@ -3337,7 +3442,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a topic. This method returns the following error codes: *
@@ -3398,7 +3505,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Topic.fromJson(data));
+    return _response.then(
+      (data) => Topic.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of topics that the requester is permitted to view. This
@@ -3469,7 +3578,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTopicResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTopicResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates one or more fields of a topic. This method returns the following
@@ -3549,7 +3661,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Topic.fromJson(data));
+    return _response.then(
+      (data) => Topic.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3611,7 +3725,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an invitation. Only one invitation for a user and course may exist
@@ -3667,7 +3783,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Invitation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Invitation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an invitation. This method returns the following error codes: *
@@ -3718,7 +3837,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns an invitation. This method returns the following error codes: *
@@ -3769,7 +3890,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Invitation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Invitation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of invitations that the requesting user is permitted to
@@ -3848,7 +3972,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInvitationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInvitationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3923,7 +4050,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Registration.fromJson(data));
+    return _response.then(
+      (data) =>
+          Registration.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a `Registration`, causing Classroom to stop sending notifications
@@ -3974,7 +4104,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4039,7 +4171,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserProfile.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserProfile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4125,7 +4260,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GuardianInvitation.fromJson(data));
+    return _response.then(
+      (data) => GuardianInvitation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a specific guardian invitation. This method returns the following
@@ -4193,7 +4331,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GuardianInvitation.fromJson(data));
+    return _response.then(
+      (data) => GuardianInvitation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of guardian invitations that the requesting user is
@@ -4291,8 +4432,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListGuardianInvitationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGuardianInvitationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies a guardian invitation. Currently, the only valid modification is
@@ -4378,7 +4521,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GuardianInvitation.fromJson(data));
+    return _response.then(
+      (data) => GuardianInvitation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4455,7 +4601,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a specific guardian. This method returns the following error
@@ -4524,7 +4672,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Guardian.fromJson(data));
+    return _response.then(
+      (data) => Guardian.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of guardians that the requesting user is permitted to view,
@@ -4619,7 +4769,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGuardiansResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGuardiansResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4709,11 +4862,13 @@
     }
     if (_json.containsKey('individualStudentsOptions')) {
       individualStudentsOptions = IndividualStudentsOptions.fromJson(
-          _json['individualStudentsOptions']);
+          _json['individualStudentsOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('materials')) {
       materials = (_json['materials'] as core.List)
-          .map<Material>((value) => Material.fromJson(value))
+          .map<Material>((value) =>
+              Material.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('scheduledTime')) {
@@ -4782,7 +4937,8 @@
 
   Assignment.fromJson(core.Map _json) {
     if (_json.containsKey('studentWorkFolder')) {
-      studentWorkFolder = DriveFolder.fromJson(_json['studentWorkFolder']);
+      studentWorkFolder = DriveFolder.fromJson(
+          _json['studentWorkFolder'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4810,7 +4966,8 @@
   AssignmentSubmission.fromJson(core.Map _json) {
     if (_json.containsKey('attachments')) {
       attachments = (_json['attachments'] as core.List)
-          .map<Attachment>((value) => Attachment.fromJson(value))
+          .map<Attachment>((value) =>
+              Attachment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4844,16 +5001,20 @@
 
   Attachment.fromJson(core.Map _json) {
     if (_json.containsKey('driveFile')) {
-      driveFile = DriveFile.fromJson(_json['driveFile']);
+      driveFile = DriveFile.fromJson(
+          _json['driveFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('form')) {
-      form = Form.fromJson(_json['form']);
+      form =
+          Form.fromJson(_json['form'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('youTubeVideo')) {
-      youTubeVideo = YouTubeVideo.fromJson(_json['youTubeVideo']);
+      youTubeVideo = YouTubeVideo.fromJson(
+          _json['youTubeVideo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5022,7 +5183,8 @@
     }
     if (_json.containsKey('courseMaterialSets')) {
       courseMaterialSets = (_json['courseMaterialSets'] as core.List)
-          .map<CourseMaterialSet>((value) => CourseMaterialSet.fromJson(value))
+          .map<CourseMaterialSet>((value) => CourseMaterialSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('courseState')) {
@@ -5059,7 +5221,8 @@
       section = _json['section'] as core.String;
     }
     if (_json.containsKey('teacherFolder')) {
-      teacherFolder = DriveFolder.fromJson(_json['teacherFolder']);
+      teacherFolder = DriveFolder.fromJson(
+          _json['teacherFolder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('teacherGroupEmail')) {
       teacherGroupEmail = _json['teacherGroupEmail'] as core.String;
@@ -5183,16 +5346,20 @@
 
   CourseMaterial.fromJson(core.Map _json) {
     if (_json.containsKey('driveFile')) {
-      driveFile = DriveFile.fromJson(_json['driveFile']);
+      driveFile = DriveFile.fromJson(
+          _json['driveFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('form')) {
-      form = Form.fromJson(_json['form']);
+      form =
+          Form.fromJson(_json['form'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('youTubeVideo')) {
-      youTubeVideo = YouTubeVideo.fromJson(_json['youTubeVideo']);
+      youTubeVideo = YouTubeVideo.fromJson(
+          _json['youTubeVideo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5229,7 +5396,8 @@
   CourseMaterialSet.fromJson(core.Map _json) {
     if (_json.containsKey('materials')) {
       materials = (_json['materials'] as core.List)
-          .map<CourseMaterial>((value) => CourseMaterial.fromJson(value))
+          .map<CourseMaterial>((value) => CourseMaterial.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -5398,7 +5566,8 @@
       assigneeMode = _json['assigneeMode'] as core.String;
     }
     if (_json.containsKey('assignment')) {
-      assignment = Assignment.fromJson(_json['assignment']);
+      assignment = Assignment.fromJson(
+          _json['assignment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('associatedWithDeveloper')) {
       associatedWithDeveloper = _json['associatedWithDeveloper'] as core.bool;
@@ -5416,29 +5585,34 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('dueDate')) {
-      dueDate = Date.fromJson(_json['dueDate']);
+      dueDate = Date.fromJson(
+          _json['dueDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dueTime')) {
-      dueTime = TimeOfDay.fromJson(_json['dueTime']);
+      dueTime = TimeOfDay.fromJson(
+          _json['dueTime'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('individualStudentsOptions')) {
       individualStudentsOptions = IndividualStudentsOptions.fromJson(
-          _json['individualStudentsOptions']);
+          _json['individualStudentsOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('materials')) {
       materials = (_json['materials'] as core.List)
-          .map<Material>((value) => Material.fromJson(value))
+          .map<Material>((value) =>
+              Material.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxPoints')) {
       maxPoints = (_json['maxPoints'] as core.num).toDouble();
     }
     if (_json.containsKey('multipleChoiceQuestion')) {
-      multipleChoiceQuestion =
-          MultipleChoiceQuestion.fromJson(_json['multipleChoiceQuestion']);
+      multipleChoiceQuestion = MultipleChoiceQuestion.fromJson(
+          _json['multipleChoiceQuestion']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scheduledTime')) {
       scheduledTime = _json['scheduledTime'] as core.String;
@@ -5658,11 +5832,13 @@
     }
     if (_json.containsKey('individualStudentsOptions')) {
       individualStudentsOptions = IndividualStudentsOptions.fromJson(
-          _json['individualStudentsOptions']);
+          _json['individualStudentsOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('materials')) {
       materials = (_json['materials'] as core.List)
-          .map<Material>((value) => Material.fromJson(value))
+          .map<Material>((value) =>
+              Material.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('scheduledTime')) {
@@ -5925,12 +6101,14 @@
 
   Feed.fromJson(core.Map _json) {
     if (_json.containsKey('courseRosterChangesInfo')) {
-      courseRosterChangesInfo =
-          CourseRosterChangesInfo.fromJson(_json['courseRosterChangesInfo']);
+      courseRosterChangesInfo = CourseRosterChangesInfo.fromJson(
+          _json['courseRosterChangesInfo']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('courseWorkChangesInfo')) {
-      courseWorkChangesInfo =
-          CourseWorkChangesInfo.fromJson(_json['courseWorkChangesInfo']);
+      courseWorkChangesInfo = CourseWorkChangesInfo.fromJson(
+          _json['courseWorkChangesInfo']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('feedType')) {
       feedType = _json['feedType'] as core.String;
@@ -6118,7 +6296,8 @@
       guardianId = _json['guardianId'] as core.String;
     }
     if (_json.containsKey('guardianProfile')) {
-      guardianProfile = UserProfile.fromJson(_json['guardianProfile']);
+      guardianProfile = UserProfile.fromJson(
+          _json['guardianProfile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('invitedEmailAddress')) {
       invitedEmailAddress = _json['invitedEmailAddress'] as core.String;
@@ -6349,7 +6528,8 @@
   ListAnnouncementsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('announcements')) {
       announcements = (_json['announcements'] as core.List)
-          .map<Announcement>((value) => Announcement.fromJson(value))
+          .map<Announcement>((value) => Announcement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6384,7 +6564,8 @@
   ListCourseAliasesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('aliases')) {
       aliases = (_json['aliases'] as core.List)
-          .map<CourseAlias>((value) => CourseAlias.fromJson(value))
+          .map<CourseAlias>((value) => CourseAlias.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6418,8 +6599,8 @@
   ListCourseWorkMaterialResponse.fromJson(core.Map _json) {
     if (_json.containsKey('courseWorkMaterial')) {
       courseWorkMaterial = (_json['courseWorkMaterial'] as core.List)
-          .map<CourseWorkMaterial>(
-              (value) => CourseWorkMaterial.fromJson(value))
+          .map<CourseWorkMaterial>((value) => CourseWorkMaterial.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6454,7 +6635,8 @@
   ListCourseWorkResponse.fromJson(core.Map _json) {
     if (_json.containsKey('courseWork')) {
       courseWork = (_json['courseWork'] as core.List)
-          .map<CourseWork>((value) => CourseWork.fromJson(value))
+          .map<CourseWork>((value) =>
+              CourseWork.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6488,7 +6670,8 @@
   ListCoursesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('courses')) {
       courses = (_json['courses'] as core.List)
-          .map<Course>((value) => Course.fromJson(value))
+          .map<Course>((value) =>
+              Course.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6522,8 +6705,8 @@
   ListGuardianInvitationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('guardianInvitations')) {
       guardianInvitations = (_json['guardianInvitations'] as core.List)
-          .map<GuardianInvitation>(
-              (value) => GuardianInvitation.fromJson(value))
+          .map<GuardianInvitation>((value) => GuardianInvitation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6559,7 +6742,8 @@
   ListGuardiansResponse.fromJson(core.Map _json) {
     if (_json.containsKey('guardians')) {
       guardians = (_json['guardians'] as core.List)
-          .map<Guardian>((value) => Guardian.fromJson(value))
+          .map<Guardian>((value) =>
+              Guardian.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6593,7 +6777,8 @@
   ListInvitationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('invitations')) {
       invitations = (_json['invitations'] as core.List)
-          .map<Invitation>((value) => Invitation.fromJson(value))
+          .map<Invitation>((value) =>
+              Invitation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6631,7 +6816,8 @@
     }
     if (_json.containsKey('studentSubmissions')) {
       studentSubmissions = (_json['studentSubmissions'] as core.List)
-          .map<StudentSubmission>((value) => StudentSubmission.fromJson(value))
+          .map<StudentSubmission>((value) => StudentSubmission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6666,7 +6852,8 @@
     }
     if (_json.containsKey('students')) {
       students = (_json['students'] as core.List)
-          .map<Student>((value) => Student.fromJson(value))
+          .map<Student>((value) =>
+              Student.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6700,7 +6887,8 @@
     }
     if (_json.containsKey('teachers')) {
       teachers = (_json['teachers'] as core.List)
-          .map<Teacher>((value) => Teacher.fromJson(value))
+          .map<Teacher>((value) =>
+              Teacher.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6734,7 +6922,8 @@
     }
     if (_json.containsKey('topic')) {
       topic = (_json['topic'] as core.List)
-          .map<Topic>((value) => Topic.fromJson(value))
+          .map<Topic>((value) =>
+              Topic.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6771,16 +6960,20 @@
 
   Material.fromJson(core.Map _json) {
     if (_json.containsKey('driveFile')) {
-      driveFile = SharedDriveFile.fromJson(_json['driveFile']);
+      driveFile = SharedDriveFile.fromJson(
+          _json['driveFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('form')) {
-      form = Form.fromJson(_json['form']);
+      form =
+          Form.fromJson(_json['form'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('youtubeVideo')) {
-      youtubeVideo = YouTubeVideo.fromJson(_json['youtubeVideo']);
+      youtubeVideo = YouTubeVideo.fromJson(
+          _json['youtubeVideo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6826,7 +7019,8 @@
     if (_json.containsKey('modifyIndividualStudentsOptions')) {
       modifyIndividualStudentsOptions =
           ModifyIndividualStudentsOptions.fromJson(
-              _json['modifyIndividualStudentsOptions']);
+              _json['modifyIndividualStudentsOptions']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6854,7 +7048,8 @@
   ModifyAttachmentsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('addAttachments')) {
       addAttachments = (_json['addAttachments'] as core.List)
-          .map<Attachment>((value) => Attachment.fromJson(value))
+          .map<Attachment>((value) =>
+              Attachment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6893,7 +7088,8 @@
     if (_json.containsKey('modifyIndividualStudentsOptions')) {
       modifyIndividualStudentsOptions =
           ModifyIndividualStudentsOptions.fromJson(
-              _json['modifyIndividualStudentsOptions']);
+              _json['modifyIndividualStudentsOptions']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7070,13 +7266,15 @@
 
   Registration.fromJson(core.Map _json) {
     if (_json.containsKey('cloudPubsubTopic')) {
-      cloudPubsubTopic = CloudPubsubTopic.fromJson(_json['cloudPubsubTopic']);
+      cloudPubsubTopic = CloudPubsubTopic.fromJson(
+          _json['cloudPubsubTopic'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('expiryTime')) {
       expiryTime = _json['expiryTime'] as core.String;
     }
     if (_json.containsKey('feed')) {
-      feed = Feed.fromJson(_json['feed']);
+      feed =
+          Feed.fromJson(_json['feed'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('registrationId')) {
       registrationId = _json['registrationId'] as core.String;
@@ -7133,7 +7331,8 @@
 
   SharedDriveFile.fromJson(core.Map _json) {
     if (_json.containsKey('driveFile')) {
-      driveFile = DriveFile.fromJson(_json['driveFile']);
+      driveFile = DriveFile.fromJson(
+          _json['driveFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shareMode')) {
       shareMode = _json['shareMode'] as core.String;
@@ -7252,10 +7451,12 @@
       courseId = _json['courseId'] as core.String;
     }
     if (_json.containsKey('profile')) {
-      profile = UserProfile.fromJson(_json['profile']);
+      profile = UserProfile.fromJson(
+          _json['profile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('studentWorkFolder')) {
-      studentWorkFolder = DriveFolder.fromJson(_json['studentWorkFolder']);
+      studentWorkFolder = DriveFolder.fromJson(
+          _json['studentWorkFolder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userId')) {
       userId = _json['userId'] as core.String;
@@ -7374,8 +7575,8 @@
       assignedGrade = (_json['assignedGrade'] as core.num).toDouble();
     }
     if (_json.containsKey('assignmentSubmission')) {
-      assignmentSubmission =
-          AssignmentSubmission.fromJson(_json['assignmentSubmission']);
+      assignmentSubmission = AssignmentSubmission.fromJson(
+          _json['assignmentSubmission'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('associatedWithDeveloper')) {
       associatedWithDeveloper = _json['associatedWithDeveloper'] as core.bool;
@@ -7402,19 +7603,22 @@
       late = _json['late'] as core.bool;
     }
     if (_json.containsKey('multipleChoiceSubmission')) {
-      multipleChoiceSubmission =
-          MultipleChoiceSubmission.fromJson(_json['multipleChoiceSubmission']);
+      multipleChoiceSubmission = MultipleChoiceSubmission.fromJson(
+          _json['multipleChoiceSubmission']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shortAnswerSubmission')) {
-      shortAnswerSubmission =
-          ShortAnswerSubmission.fromJson(_json['shortAnswerSubmission']);
+      shortAnswerSubmission = ShortAnswerSubmission.fromJson(
+          _json['shortAnswerSubmission']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('submissionHistory')) {
       submissionHistory = (_json['submissionHistory'] as core.List)
-          .map<SubmissionHistory>((value) => SubmissionHistory.fromJson(value))
+          .map<SubmissionHistory>((value) => SubmissionHistory.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('updateTime')) {
@@ -7496,10 +7700,12 @@
 
   SubmissionHistory.fromJson(core.Map _json) {
     if (_json.containsKey('gradeHistory')) {
-      gradeHistory = GradeHistory.fromJson(_json['gradeHistory']);
+      gradeHistory = GradeHistory.fromJson(
+          _json['gradeHistory'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stateHistory')) {
-      stateHistory = StateHistory.fromJson(_json['stateHistory']);
+      stateHistory = StateHistory.fromJson(
+          _json['stateHistory'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7536,7 +7742,8 @@
       courseId = _json['courseId'] as core.String;
     }
     if (_json.containsKey('profile')) {
-      profile = UserProfile.fromJson(_json['profile']);
+      profile = UserProfile.fromJson(
+          _json['profile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userId')) {
       userId = _json['userId'] as core.String;
@@ -7711,11 +7918,13 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('name')) {
-      name = Name.fromJson(_json['name']);
+      name =
+          Name.fromJson(_json['name'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<GlobalPermission>((value) => GlobalPermission.fromJson(value))
+          .map<GlobalPermission>((value) => GlobalPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('photoUrl')) {
diff --git a/generated/googleapis/lib/cloudasset/v1.dart b/generated/googleapis/lib/cloudasset/v1.dart
index 1af949f..e281bac 100644
--- a/generated/googleapis/lib/cloudasset/v1.dart
+++ b/generated/googleapis/lib/cloudasset/v1.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Feed.fromJson(data));
+    return _response.then(
+      (data) => Feed.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an asset feed.
@@ -162,7 +164,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets details about an asset feed.
@@ -213,7 +217,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Feed.fromJson(data));
+    return _response.then(
+      (data) => Feed.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all asset feeds in a parent project/folder/organization.
@@ -265,7 +271,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFeedsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFeedsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an asset feed configuration.
@@ -325,7 +334,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Feed.fromJson(data));
+    return _response.then(
+      (data) => Feed.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -382,7 +393,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -484,8 +497,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchGetAssetsHistoryResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetAssetsHistoryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Exports assets with time and resource types to a given Cloud Storage
@@ -554,7 +569,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches all IAM policies within the specified scope, such as a project,
@@ -660,8 +677,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SearchAllIamPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchAllIamPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches all Cloud resources within the specified scope, such as a
@@ -794,7 +813,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchAllResourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchAllResourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -870,11 +892,11 @@
   Asset.fromJson(core.Map _json) {
     if (_json.containsKey('accessLevel')) {
       accessLevel = GoogleIdentityAccesscontextmanagerV1AccessLevel.fromJson(
-          _json['accessLevel']);
+          _json['accessLevel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('accessPolicy')) {
       accessPolicy = GoogleIdentityAccesscontextmanagerV1AccessPolicy.fromJson(
-          _json['accessPolicy']);
+          _json['accessPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ancestors')) {
       ancestors = (_json['ancestors'] as core.List)
@@ -885,24 +907,27 @@
       assetType = _json['assetType'] as core.String;
     }
     if (_json.containsKey('iamPolicy')) {
-      iamPolicy = Policy.fromJson(_json['iamPolicy']);
+      iamPolicy = Policy.fromJson(
+          _json['iamPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('orgPolicy')) {
       orgPolicy = (_json['orgPolicy'] as core.List)
-          .map<GoogleCloudOrgpolicyV1Policy>(
-              (value) => GoogleCloudOrgpolicyV1Policy.fromJson(value))
+          .map<GoogleCloudOrgpolicyV1Policy>((value) =>
+              GoogleCloudOrgpolicyV1Policy.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resource')) {
-      resource = Resource.fromJson(_json['resource']);
+      resource = Resource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('servicePerimeter')) {
       servicePerimeter =
           GoogleIdentityAccesscontextmanagerV1ServicePerimeter.fromJson(
-              _json['servicePerimeter']);
+              _json['servicePerimeter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -975,7 +1000,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -1049,7 +1075,8 @@
   BatchGetAssetsHistoryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assets')) {
       assets = (_json['assets'] as core.List)
-          .map<TemporalAsset>((value) => TemporalAsset.fromJson(value))
+          .map<TemporalAsset>((value) => TemporalAsset.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1133,7 +1160,8 @@
       force = _json['force'] as core.bool;
     }
     if (_json.containsKey('partitionSpec')) {
-      partitionSpec = PartitionSpec.fromJson(_json['partitionSpec']);
+      partitionSpec = PartitionSpec.fromJson(
+          _json['partitionSpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('separateTablesPerAssetType')) {
       separateTablesPerAssetType =
@@ -1215,7 +1243,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1258,7 +1287,8 @@
 
   CreateFeedRequest.fromJson(core.Map _json) {
     if (_json.containsKey('feed')) {
-      feed = Feed.fromJson(_json['feed']);
+      feed =
+          Feed.fromJson(_json['feed'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('feedId')) {
       feedId = _json['feedId'] as core.String;
@@ -1311,8 +1341,10 @@
   Explanation.fromJson(core.Map _json) {
     if (_json.containsKey('matchedPermissions')) {
       matchedPermissions = commons.mapMap<core.Map, Permissions>(
-          _json['matchedPermissions'].cast<core.String, core.Map>(),
-          (core.Map item) => Permissions.fromJson(item));
+          (_json['matchedPermissions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => Permissions.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -1378,7 +1410,8 @@
       contentType = _json['contentType'] as core.String;
     }
     if (_json.containsKey('outputConfig')) {
-      outputConfig = OutputConfig.fromJson(_json['outputConfig']);
+      outputConfig = OutputConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readTime')) {
       readTime = _json['readTime'] as core.String;
@@ -1542,13 +1575,15 @@
           .toList();
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentType')) {
       contentType = _json['contentType'] as core.String;
     }
     if (_json.containsKey('feedOutputConfig')) {
-      feedOutputConfig = FeedOutputConfig.fromJson(_json['feedOutputConfig']);
+      feedOutputConfig = FeedOutputConfig.fromJson(
+          _json['feedOutputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1588,8 +1623,8 @@
 
   FeedOutputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('pubsubDestination')) {
-      pubsubDestination =
-          PubsubDestination.fromJson(_json['pubsubDestination']);
+      pubsubDestination = PubsubDestination.fromJson(
+          _json['pubsubDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1888,8 +1923,8 @@
 
   GoogleCloudOrgpolicyV1Policy.fromJson(core.Map _json) {
     if (_json.containsKey('booleanPolicy')) {
-      booleanPolicy =
-          GoogleCloudOrgpolicyV1BooleanPolicy.fromJson(_json['booleanPolicy']);
+      booleanPolicy = GoogleCloudOrgpolicyV1BooleanPolicy.fromJson(
+          _json['booleanPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('constraint')) {
       constraint = _json['constraint'] as core.String;
@@ -1898,12 +1933,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('listPolicy')) {
-      listPolicy =
-          GoogleCloudOrgpolicyV1ListPolicy.fromJson(_json['listPolicy']);
+      listPolicy = GoogleCloudOrgpolicyV1ListPolicy.fromJson(
+          _json['listPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('restoreDefault')) {
       restoreDefault = GoogleCloudOrgpolicyV1RestoreDefault.fromJson(
-          _json['restoreDefault']);
+          _json['restoreDefault'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -1990,11 +2025,11 @@
   GoogleIdentityAccesscontextmanagerV1AccessLevel.fromJson(core.Map _json) {
     if (_json.containsKey('basic')) {
       basic = GoogleIdentityAccesscontextmanagerV1BasicLevel.fromJson(
-          _json['basic']);
+          _json['basic'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('custom')) {
       custom = GoogleIdentityAccesscontextmanagerV1CustomLevel.fromJson(
-          _json['custom']);
+          _json['custom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -2112,7 +2147,8 @@
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
           .map<GoogleIdentityAccesscontextmanagerV1Condition>((value) =>
-              GoogleIdentityAccesscontextmanagerV1Condition.fromJson(value))
+              GoogleIdentityAccesscontextmanagerV1Condition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2175,7 +2211,7 @@
   GoogleIdentityAccesscontextmanagerV1Condition.fromJson(core.Map _json) {
     if (_json.containsKey('devicePolicy')) {
       devicePolicy = GoogleIdentityAccesscontextmanagerV1DevicePolicy.fromJson(
-          _json['devicePolicy']);
+          _json['devicePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ipSubnetworks')) {
       ipSubnetworks = (_json['ipSubnetworks'] as core.List)
@@ -2237,7 +2273,8 @@
 
   GoogleIdentityAccesscontextmanagerV1CustomLevel.fromJson(core.Map _json) {
     if (_json.containsKey('expr')) {
-      expr = Expr.fromJson(_json['expr']);
+      expr =
+          Expr.fromJson(_json['expr'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2298,7 +2335,8 @@
     if (_json.containsKey('osConstraints')) {
       osConstraints = (_json['osConstraints'] as core.List)
           .map<GoogleIdentityAccesscontextmanagerV1OsConstraint>((value) =>
-              GoogleIdentityAccesscontextmanagerV1OsConstraint.fromJson(value))
+              GoogleIdentityAccesscontextmanagerV1OsConstraint.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requireAdminApproval')) {
@@ -2463,12 +2501,12 @@
     if (_json.containsKey('spec')) {
       spec =
           GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig.fromJson(
-              _json['spec']);
+              _json['spec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status =
           GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig.fromJson(
-              _json['status']);
+              _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -2554,7 +2592,8 @@
     if (_json.containsKey('vpcAccessibleServices')) {
       vpcAccessibleServices =
           GoogleIdentityAccesscontextmanagerV1VpcAccessibleServices.fromJson(
-              _json['vpcAccessibleServices']);
+              _json['vpcAccessibleServices']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2653,10 +2692,12 @@
 
   IamPolicySearchResult.fromJson(core.Map _json) {
     if (_json.containsKey('explanation')) {
-      explanation = Explanation.fromJson(_json['explanation']);
+      explanation = Explanation.fromJson(
+          _json['explanation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('project')) {
       project = _json['project'] as core.String;
@@ -2693,7 +2734,8 @@
   ListFeedsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('feeds')) {
       feeds = (_json['feeds'] as core.List)
-          .map<Feed>((value) => Feed.fromJson(value))
+          .map<Feed>((value) =>
+              Feed.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2751,11 +2793,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2763,7 +2807,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2802,11 +2847,12 @@
 
   OutputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('bigqueryDestination')) {
-      bigqueryDestination =
-          BigQueryDestination.fromJson(_json['bigqueryDestination']);
+      bigqueryDestination = BigQueryDestination.fromJson(
+          _json['bigqueryDestination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gcsDestination')) {
-      gcsDestination = GcsDestination.fromJson(_json['gcsDestination']);
+      gcsDestination = GcsDestination.fromJson(
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2959,12 +3005,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -3064,7 +3112,8 @@
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
       data = commons.mapMap<core.Object, core.Object>(
-          _json['data'].cast<core.String, core.Object>(),
+          (_json['data'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('discoveryDocumentUri')) {
@@ -3191,7 +3240,8 @@
   ResourceSearchResult.fromJson(core.Map _json) {
     if (_json.containsKey('additionalAttributes')) {
       additionalAttributes = commons.mapMap<core.Object, core.Object>(
-          _json['additionalAttributes'].cast<core.String, core.Object>(),
+          (_json['additionalAttributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('assetType')) {
@@ -3205,7 +3255,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('location')) {
@@ -3276,8 +3327,8 @@
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<IamPolicySearchResult>(
-              (value) => IamPolicySearchResult.fromJson(value))
+          .map<IamPolicySearchResult>((value) => IamPolicySearchResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3313,8 +3364,8 @@
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<ResourceSearchResult>(
-              (value) => ResourceSearchResult.fromJson(value))
+          .map<ResourceSearchResult>((value) => ResourceSearchResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3363,7 +3414,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3417,19 +3469,22 @@
 
   TemporalAsset.fromJson(core.Map _json) {
     if (_json.containsKey('asset')) {
-      asset = Asset.fromJson(_json['asset']);
+      asset =
+          Asset.fromJson(_json['asset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleted')) {
       deleted = _json['deleted'] as core.bool;
     }
     if (_json.containsKey('priorAsset')) {
-      priorAsset = Asset.fromJson(_json['priorAsset']);
+      priorAsset = Asset.fromJson(
+          _json['priorAsset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('priorAssetState')) {
       priorAssetState = _json['priorAssetState'] as core.String;
     }
     if (_json.containsKey('window')) {
-      window = TimeWindow.fromJson(_json['window']);
+      window = TimeWindow.fromJson(
+          _json['window'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3504,7 +3559,8 @@
 
   UpdateFeedRequest.fromJson(core.Map _json) {
     if (_json.containsKey('feed')) {
-      feed = Feed.fromJson(_json['feed']);
+      feed =
+          Feed.fromJson(_json['feed'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
diff --git a/generated/googleapis/lib/cloudbilling/v1.dart b/generated/googleapis/lib/cloudbilling/v1.dart
index da09826..3e7d60b 100644
--- a/generated/googleapis/lib/cloudbilling/v1.dart
+++ b/generated/googleapis/lib/cloudbilling/v1.dart
@@ -119,7 +119,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BillingAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          BillingAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a billing account. The current authenticated user
@@ -171,7 +174,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BillingAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          BillingAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a billing account. The caller must have
@@ -241,7 +247,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the billing accounts that the current authenticated user has
@@ -312,7 +320,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBillingAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBillingAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a billing account's fields. Currently the only field that can be
@@ -378,7 +389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BillingAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          BillingAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy for a billing account. Replaces any
@@ -440,7 +454,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Tests the access control policy for a billing account. This method takes
@@ -501,7 +517,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -578,8 +597,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListProjectBillingInfoResponse.fromJson(data));
+    return _response.then(
+      (data) => ListProjectBillingInfoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -639,7 +660,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProjectBillingInfo.fromJson(data));
+    return _response.then(
+      (data) => ProjectBillingInfo.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets or updates the billing account associated with a project. You specify
@@ -721,7 +745,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProjectBillingInfo.fromJson(data));
+    return _response.then(
+      (data) => ProjectBillingInfo.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -785,7 +812,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -885,7 +915,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSkusResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSkusResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -968,7 +1001,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -1143,7 +1177,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1346,7 +1381,8 @@
   ListBillingAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('billingAccounts')) {
       billingAccounts = (_json['billingAccounts'] as core.List)
-          .map<BillingAccount>((value) => BillingAccount.fromJson(value))
+          .map<BillingAccount>((value) => BillingAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1386,8 +1422,8 @@
     }
     if (_json.containsKey('projectBillingInfo')) {
       projectBillingInfo = (_json['projectBillingInfo'] as core.List)
-          .map<ProjectBillingInfo>(
-              (value) => ProjectBillingInfo.fromJson(value))
+          .map<ProjectBillingInfo>((value) => ProjectBillingInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1423,7 +1459,8 @@
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<Service>((value) => Service.fromJson(value))
+          .map<Service>((value) =>
+              Service.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1458,7 +1495,8 @@
     }
     if (_json.containsKey('skus')) {
       skus = (_json['skus'] as core.List)
-          .map<Sku>((value) => Sku.fromJson(value))
+          .map<Sku>((value) =>
+              Sku.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1600,12 +1638,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -1694,7 +1734,8 @@
     }
     if (_json.containsKey('tieredRates')) {
       tieredRates = (_json['tieredRates'] as core.List)
-          .map<TierRate>((value) => TierRate.fromJson(value))
+          .map<TierRate>((value) =>
+              TierRate.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('usageUnit')) {
@@ -1764,7 +1805,8 @@
 
   PricingInfo.fromJson(core.Map _json) {
     if (_json.containsKey('aggregationInfo')) {
-      aggregationInfo = AggregationInfo.fromJson(_json['aggregationInfo']);
+      aggregationInfo = AggregationInfo.fromJson(
+          _json['aggregationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('currencyConversionRate')) {
       currencyConversionRate =
@@ -1774,8 +1816,8 @@
       effectiveTime = _json['effectiveTime'] as core.String;
     }
     if (_json.containsKey('pricingExpression')) {
-      pricingExpression =
-          PricingExpression.fromJson(_json['pricingExpression']);
+      pricingExpression = PricingExpression.fromJson(
+          _json['pricingExpression'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('summary')) {
       summary = _json['summary'] as core.String;
@@ -1930,7 +1972,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -1983,20 +2026,23 @@
 
   Sku.fromJson(core.Map _json) {
     if (_json.containsKey('category')) {
-      category = Category.fromJson(_json['category']);
+      category = Category.fromJson(
+          _json['category'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('geoTaxonomy')) {
-      geoTaxonomy = GeoTaxonomy.fromJson(_json['geoTaxonomy']);
+      geoTaxonomy = GeoTaxonomy.fromJson(
+          _json['geoTaxonomy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pricingInfo')) {
       pricingInfo = (_json['pricingInfo'] as core.List)
-          .map<PricingInfo>((value) => PricingInfo.fromJson(value))
+          .map<PricingInfo>((value) => PricingInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceProviderName')) {
@@ -2113,7 +2159,8 @@
       startUsageAmount = (_json['startUsageAmount'] as core.num).toDouble();
     }
     if (_json.containsKey('unitPrice')) {
-      unitPrice = Money.fromJson(_json['unitPrice']);
+      unitPrice = Money.fromJson(
+          _json['unitPrice'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/cloudbuild/v1.dart b/generated/googleapis/lib/cloudbuild/v1.dart
index edc5cad..df46cb8 100644
--- a/generated/googleapis/lib/cloudbuild/v1.dart
+++ b/generated/googleapis/lib/cloudbuild/v1.dart
@@ -113,7 +113,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -164,7 +166,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -246,7 +250,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Build.fromJson(data));
+    return _response.then(
+      (data) => Build.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts a build with the specified configuration. This method returns a
@@ -312,7 +318,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about a previously requested build. The `Build` that
@@ -378,7 +386,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Build.fromJson(data));
+    return _response.then(
+      (data) => Build.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists previously requested builds. Previously requested builds may still
@@ -454,7 +464,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBuildsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBuildsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new build based on the specified build. This method creates a
@@ -533,7 +546,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -608,7 +623,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Build.fromJson(data));
+    return _response.then(
+      (data) => Build.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts a build with the specified configuration. This method returns a
@@ -673,7 +690,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about a previously requested build. The `Build` that
@@ -737,7 +756,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Build.fromJson(data));
+    return _response.then(
+      (data) => Build.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists previously requested builds. Previously requested builds may still
@@ -812,7 +833,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBuildsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBuildsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new build based on the specified build. This method creates a
@@ -883,7 +907,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -954,7 +980,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1006,7 +1034,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1070,7 +1100,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BuildTrigger.fromJson(data));
+    return _response.then(
+      (data) =>
+          BuildTrigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a `BuildTrigger` by its project ID and trigger ID. This API is
@@ -1128,7 +1161,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about a `BuildTrigger`. This API is experimental.
@@ -1186,7 +1221,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BuildTrigger.fromJson(data));
+    return _response.then(
+      (data) =>
+          BuildTrigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists existing `BuildTrigger`s. This API is experimental.
@@ -1248,7 +1286,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBuildTriggersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBuildTriggersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a `BuildTrigger` by its project ID and trigger ID. This API is
@@ -1312,7 +1353,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BuildTrigger.fromJson(data));
+    return _response.then(
+      (data) =>
+          BuildTrigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs a `BuildTrigger` at a particular source revision.
@@ -1376,7 +1420,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1408,7 +1454,8 @@
           .toList();
     }
     if (_json.containsKey('timing')) {
-      timing = TimeSpan.fromJson(_json['timing']);
+      timing = TimeSpan.fromJson(
+          _json['timing'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1443,7 +1490,8 @@
   ArtifactResult.fromJson(core.Map _json) {
     if (_json.containsKey('fileHash')) {
       fileHash = (_json['fileHash'] as core.List)
-          .map<FileHashes>((value) => FileHashes.fromJson(value))
+          .map<FileHashes>((value) =>
+              FileHashes.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('location')) {
@@ -1490,7 +1538,8 @@
           .toList();
     }
     if (_json.containsKey('objects')) {
-      objects = ArtifactObjects.fromJson(_json['objects']);
+      objects = ArtifactObjects.fromJson(
+          _json['objects'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1631,7 +1680,8 @@
 
   Build.fromJson(core.Map _json) {
     if (_json.containsKey('artifacts')) {
-      artifacts = Artifacts.fromJson(_json['artifacts']);
+      artifacts = Artifacts.fromJson(
+          _json['artifacts'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('buildTriggerId')) {
       buildTriggerId = _json['buildTriggerId'] as core.String;
@@ -1660,7 +1710,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('options')) {
-      options = BuildOptions.fromJson(_json['options']);
+      options = BuildOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
@@ -1669,21 +1720,25 @@
       queueTtl = _json['queueTtl'] as core.String;
     }
     if (_json.containsKey('results')) {
-      results = Results.fromJson(_json['results']);
+      results = Results.fromJson(
+          _json['results'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secrets')) {
       secrets = (_json['secrets'] as core.List)
-          .map<Secret>((value) => Secret.fromJson(value))
+          .map<Secret>((value) =>
+              Secret.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceAccount')) {
       serviceAccount = _json['serviceAccount'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceProvenance')) {
-      sourceProvenance = SourceProvenance.fromJson(_json['sourceProvenance']);
+      sourceProvenance = SourceProvenance.fromJson(
+          _json['sourceProvenance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -1696,12 +1751,14 @@
     }
     if (_json.containsKey('steps')) {
       steps = (_json['steps'] as core.List)
-          .map<BuildStep>((value) => BuildStep.fromJson(value))
+          .map<BuildStep>((value) =>
+              BuildStep.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('substitutions')) {
       substitutions = commons.mapMap<core.String, core.String>(
-          _json['substitutions'].cast<core.String, core.String>(),
+          (_json['substitutions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('tags')) {
@@ -1714,8 +1771,10 @@
     }
     if (_json.containsKey('timing')) {
       timing = commons.mapMap<core.Map, TimeSpan>(
-          _json['timing'].cast<core.String, core.Map>(),
-          (core.Map item) => TimeSpan.fromJson(item));
+          (_json['timing'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              TimeSpan.fromJson(item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -1811,7 +1870,8 @@
 
   BuildOperationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('build')) {
-      build = Build.fromJson(_json['build']);
+      build =
+          Build.fromJson(_json['build'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1956,7 +2016,8 @@
     }
     if (_json.containsKey('volumes')) {
       volumes = (_json['volumes'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('workerPool')) {
@@ -2124,7 +2185,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pullTiming')) {
-      pullTiming = TimeSpan.fromJson(_json['pullTiming']);
+      pullTiming = TimeSpan.fromJson(
+          _json['pullTiming'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secretEnv')) {
       secretEnv = (_json['secretEnv'] as core.List)
@@ -2138,11 +2200,13 @@
       timeout = _json['timeout'] as core.String;
     }
     if (_json.containsKey('timing')) {
-      timing = TimeSpan.fromJson(_json['timing']);
+      timing = TimeSpan.fromJson(
+          _json['timing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('volumes')) {
       volumes = (_json['volumes'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('waitFor')) {
@@ -2264,7 +2328,8 @@
 
   BuildTrigger.fromJson(core.Map _json) {
     if (_json.containsKey('build')) {
-      build = Build.fromJson(_json['build']);
+      build =
+          Build.fromJson(_json['build'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -2279,7 +2344,8 @@
       filename = _json['filename'] as core.String;
     }
     if (_json.containsKey('github')) {
-      github = GitHubEventsConfig.fromJson(_json['github']);
+      github = GitHubEventsConfig.fromJson(
+          _json['github'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -2299,7 +2365,8 @@
     }
     if (_json.containsKey('substitutions')) {
       substitutions = commons.mapMap<core.String, core.String>(
-          _json['substitutions'].cast<core.String, core.String>(),
+          (_json['substitutions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('tags')) {
@@ -2308,7 +2375,8 @@
           .toList();
     }
     if (_json.containsKey('triggerTemplate')) {
-      triggerTemplate = RepoSource.fromJson(_json['triggerTemplate']);
+      triggerTemplate = RepoSource.fromJson(
+          _json['triggerTemplate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2379,7 +2447,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pushTiming')) {
-      pushTiming = TimeSpan.fromJson(_json['pushTiming']);
+      pushTiming = TimeSpan.fromJson(
+          _json['pushTiming'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2482,7 +2551,8 @@
   FileHashes.fromJson(core.Map _json) {
     if (_json.containsKey('fileHash')) {
       fileHash = (_json['fileHash'] as core.List)
-          .map<Hash>((value) => Hash.fromJson(value))
+          .map<Hash>((value) =>
+              Hash.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2530,10 +2600,12 @@
       owner = _json['owner'] as core.String;
     }
     if (_json.containsKey('pullRequest')) {
-      pullRequest = PullRequestFilter.fromJson(_json['pullRequest']);
+      pullRequest = PullRequestFilter.fromJson(
+          _json['pullRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('push')) {
-      push = PushFilter.fromJson(_json['push']);
+      push = PushFilter.fromJson(
+          _json['push'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2637,7 +2709,8 @@
     }
     if (_json.containsKey('triggers')) {
       triggers = (_json['triggers'] as core.List)
-          .map<BuildTrigger>((value) => BuildTrigger.fromJson(value))
+          .map<BuildTrigger>((value) => BuildTrigger.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2667,7 +2740,8 @@
   ListBuildsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('builds')) {
       builds = (_json['builds'] as core.List)
-          .map<Build>((value) => Build.fromJson(value))
+          .map<Build>((value) =>
+              Build.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2717,17 +2791,21 @@
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('httpDelivery')) {
-      httpDelivery = HTTPDelivery.fromJson(_json['httpDelivery']);
+      httpDelivery = HTTPDelivery.fromJson(
+          _json['httpDelivery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('slackDelivery')) {
-      slackDelivery = SlackDelivery.fromJson(_json['slackDelivery']);
+      slackDelivery = SlackDelivery.fromJson(
+          _json['slackDelivery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('smtpDelivery')) {
-      smtpDelivery = SMTPDelivery.fromJson(_json['smtpDelivery']);
+      smtpDelivery = SMTPDelivery.fromJson(
+          _json['smtpDelivery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structDelivery')) {
       structDelivery = commons.mapMap<core.Object, core.Object>(
-          _json['structDelivery'].cast<core.String, core.Object>(),
+          (_json['structDelivery'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2777,10 +2855,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = NotifierMetadata.fromJson(_json['metadata']);
+      metadata = NotifierMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = NotifierSpec.fromJson(_json['spec']);
+      spec = NotifierSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2909,11 +2989,13 @@
 
   NotifierSpec.fromJson(core.Map _json) {
     if (_json.containsKey('notification')) {
-      notification = Notification.fromJson(_json['notification']);
+      notification = Notification.fromJson(
+          _json['notification'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secrets')) {
       secrets = (_json['secrets'] as core.List)
-          .map<NotifierSecret>((value) => NotifierSecret.fromJson(value))
+          .map<NotifierSecret>((value) => NotifierSecret.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2974,11 +3056,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2986,7 +3070,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3167,7 +3252,8 @@
     }
     if (_json.containsKey('substitutions')) {
       substitutions = commons.mapMap<core.String, core.String>(
-          _json['substitutions'].cast<core.String, core.String>(),
+          (_json['substitutions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('tagName')) {
@@ -3237,7 +3323,8 @@
       artifactManifest = _json['artifactManifest'] as core.String;
     }
     if (_json.containsKey('artifactTiming')) {
-      artifactTiming = TimeSpan.fromJson(_json['artifactTiming']);
+      artifactTiming = TimeSpan.fromJson(
+          _json['artifactTiming'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('buildStepImages')) {
       buildStepImages = (_json['buildStepImages'] as core.List)
@@ -3251,7 +3338,8 @@
     }
     if (_json.containsKey('images')) {
       images = (_json['images'] as core.List)
-          .map<BuiltImage>((value) => BuiltImage.fromJson(value))
+          .map<BuiltImage>((value) =>
+              BuiltImage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('numArtifacts')) {
@@ -3353,7 +3441,8 @@
       fromAddress = _json['fromAddress'] as core.String;
     }
     if (_json.containsKey('password')) {
-      password = NotifierSecretRef.fromJson(_json['password']);
+      password = NotifierSecretRef.fromJson(
+          _json['password'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('port')) {
       port = _json['port'] as core.String;
@@ -3416,7 +3505,8 @@
     }
     if (_json.containsKey('secretEnv')) {
       secretEnv = commons.mapMap<core.String, core.String>(
-          _json['secretEnv'].cast<core.String, core.String>(),
+          (_json['secretEnv'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -3445,7 +3535,8 @@
 
   SlackDelivery.fromJson(core.Map _json) {
     if (_json.containsKey('webhookUri')) {
-      webhookUri = NotifierSecretRef.fromJson(_json['webhookUri']);
+      webhookUri = NotifierSecretRef.fromJson(
+          _json['webhookUri'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3471,10 +3562,12 @@
 
   Source.fromJson(core.Map _json) {
     if (_json.containsKey('repoSource')) {
-      repoSource = RepoSource.fromJson(_json['repoSource']);
+      repoSource = RepoSource.fromJson(
+          _json['repoSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('storageSource')) {
-      storageSource = StorageSource.fromJson(_json['storageSource']);
+      storageSource = StorageSource.fromJson(
+          _json['storageSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3515,15 +3608,19 @@
   SourceProvenance.fromJson(core.Map _json) {
     if (_json.containsKey('fileHashes')) {
       fileHashes = commons.mapMap<core.Map, FileHashes>(
-          _json['fileHashes'].cast<core.String, core.Map>(),
-          (core.Map item) => FileHashes.fromJson(item));
+          (_json['fileHashes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              FileHashes.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('resolvedRepoSource')) {
-      resolvedRepoSource = RepoSource.fromJson(_json['resolvedRepoSource']);
+      resolvedRepoSource = RepoSource.fromJson(
+          _json['resolvedRepoSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resolvedStorageSource')) {
-      resolvedStorageSource =
-          StorageSource.fromJson(_json['resolvedStorageSource']);
+      resolvedStorageSource = StorageSource.fromJson(
+          _json['resolvedStorageSource']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3576,7 +3673,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/clouddebugger/v2.dart b/generated/googleapis/lib/clouddebugger/v2.dart
index 7156636..3604618 100644
--- a/generated/googleapis/lib/clouddebugger/v2.dart
+++ b/generated/googleapis/lib/clouddebugger/v2.dart
@@ -122,7 +122,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RegisterDebuggeeResponse.fromJson(data));
+    return _response.then(
+      (data) => RegisterDebuggeeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -214,8 +217,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListActiveBreakpointsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListActiveBreakpointsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the breakpoint state or mutable fields. The entire Breakpoint
@@ -284,8 +289,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => UpdateActiveBreakpointResponse.fromJson(data));
+    return _response.then(
+      (data) => UpdateActiveBreakpointResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -367,7 +374,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDebuggeesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDebuggeesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -438,7 +448,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets breakpoint information.
@@ -502,7 +514,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetBreakpointResponse.fromJson(data));
+    return _response.then(
+      (data) => GetBreakpointResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all breakpoints for the debuggee.
@@ -605,7 +620,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBreakpointsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBreakpointsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the breakpoint to the debuggee.
@@ -685,7 +703,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SetBreakpointResponse.fromJson(data));
+    return _response.then(
+      (data) => SetBreakpointResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -856,7 +877,8 @@
     }
     if (_json.containsKey('evaluatedExpressions')) {
       evaluatedExpressions = (_json['evaluatedExpressions'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('expressions')) {
@@ -875,11 +897,13 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('location')) {
-      location = SourceLocation.fromJson(_json['location']);
+      location = SourceLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logLevel')) {
       logLevel = _json['logLevel'] as core.String;
@@ -889,21 +913,24 @@
     }
     if (_json.containsKey('stackFrames')) {
       stackFrames = (_json['stackFrames'] as core.List)
-          .map<StackFrame>((value) => StackFrame.fromJson(value))
+          .map<StackFrame>((value) =>
+              StackFrame.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = StatusMessage.fromJson(_json['status']);
+      status = StatusMessage.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userEmail')) {
       userEmail = _json['userEmail'] as core.String;
     }
     if (_json.containsKey('variableTable')) {
       variableTable = (_json['variableTable'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -990,13 +1017,15 @@
 
   CloudRepoSourceContext.fromJson(core.Map _json) {
     if (_json.containsKey('aliasContext')) {
-      aliasContext = AliasContext.fromJson(_json['aliasContext']);
+      aliasContext = AliasContext.fromJson(
+          _json['aliasContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('aliasName')) {
       aliasName = _json['aliasName'] as core.String;
     }
     if (_json.containsKey('repoId')) {
-      repoId = RepoId.fromJson(_json['repoId']);
+      repoId = RepoId.fromJson(
+          _json['repoId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('revisionId')) {
       revisionId = _json['revisionId'] as core.String;
@@ -1039,7 +1068,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('repoId')) {
-      repoId = RepoId.fromJson(_json['repoId']);
+      repoId = RepoId.fromJson(
+          _json['repoId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1071,7 +1101,8 @@
       snapshotId = _json['snapshotId'] as core.String;
     }
     if (_json.containsKey('workspaceId')) {
-      workspaceId = CloudWorkspaceId.fromJson(_json['workspaceId']);
+      workspaceId = CloudWorkspaceId.fromJson(
+          _json['workspaceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1172,8 +1203,8 @@
     }
     if (_json.containsKey('extSourceContexts')) {
       extSourceContexts = (_json['extSourceContexts'] as core.List)
-          .map<ExtendedSourceContext>(
-              (value) => ExtendedSourceContext.fromJson(value))
+          .map<ExtendedSourceContext>((value) => ExtendedSourceContext.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -1187,7 +1218,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('project')) {
@@ -1195,11 +1227,13 @@
     }
     if (_json.containsKey('sourceContexts')) {
       sourceContexts = (_json['sourceContexts'] as core.List)
-          .map<SourceContext>((value) => SourceContext.fromJson(value))
+          .map<SourceContext>((value) => SourceContext.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('status')) {
-      status = StatusMessage.fromJson(_json['status']);
+      status = StatusMessage.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uniquifier')) {
       uniquifier = _json['uniquifier'] as core.String;
@@ -1281,11 +1315,13 @@
 
   ExtendedSourceContext.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
-      context = SourceContext.fromJson(_json['context']);
+      context = SourceContext.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -1362,7 +1398,8 @@
 
   GerritSourceContext.fromJson(core.Map _json) {
     if (_json.containsKey('aliasContext')) {
-      aliasContext = AliasContext.fromJson(_json['aliasContext']);
+      aliasContext = AliasContext.fromJson(
+          _json['aliasContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('aliasName')) {
       aliasName = _json['aliasName'] as core.String;
@@ -1409,7 +1446,8 @@
 
   GetBreakpointResponse.fromJson(core.Map _json) {
     if (_json.containsKey('breakpoint')) {
-      breakpoint = Breakpoint.fromJson(_json['breakpoint']);
+      breakpoint = Breakpoint.fromJson(
+          _json['breakpoint'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1474,7 +1512,8 @@
   ListActiveBreakpointsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('breakpoints')) {
       breakpoints = (_json['breakpoints'] as core.List)
-          .map<Breakpoint>((value) => Breakpoint.fromJson(value))
+          .map<Breakpoint>((value) =>
+              Breakpoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextWaitToken')) {
@@ -1519,7 +1558,8 @@
   ListBreakpointsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('breakpoints')) {
       breakpoints = (_json['breakpoints'] as core.List)
-          .map<Breakpoint>((value) => Breakpoint.fromJson(value))
+          .map<Breakpoint>((value) =>
+              Breakpoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextWaitToken')) {
@@ -1552,7 +1592,8 @@
   ListDebuggeesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('debuggees')) {
       debuggees = (_json['debuggees'] as core.List)
-          .map<Debuggee>((value) => Debuggee.fromJson(value))
+          .map<Debuggee>((value) =>
+              Debuggee.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1609,7 +1650,8 @@
 
   RegisterDebuggeeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('debuggee')) {
-      debuggee = Debuggee.fromJson(_json['debuggee']);
+      debuggee = Debuggee.fromJson(
+          _json['debuggee'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1642,7 +1684,8 @@
       agentId = _json['agentId'] as core.String;
     }
     if (_json.containsKey('debuggee')) {
-      debuggee = Debuggee.fromJson(_json['debuggee']);
+      debuggee = Debuggee.fromJson(
+          _json['debuggee'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1670,7 +1713,8 @@
 
   RepoId.fromJson(core.Map _json) {
     if (_json.containsKey('projectRepoId')) {
-      projectRepoId = ProjectRepoId.fromJson(_json['projectRepoId']);
+      projectRepoId = ProjectRepoId.fromJson(
+          _json['projectRepoId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uid')) {
       uid = _json['uid'] as core.String;
@@ -1699,7 +1743,8 @@
 
   SetBreakpointResponse.fromJson(core.Map _json) {
     if (_json.containsKey('breakpoint')) {
-      breakpoint = Breakpoint.fromJson(_json['breakpoint']);
+      breakpoint = Breakpoint.fromJson(
+          _json['breakpoint'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1731,17 +1776,20 @@
 
   SourceContext.fromJson(core.Map _json) {
     if (_json.containsKey('cloudRepo')) {
-      cloudRepo = CloudRepoSourceContext.fromJson(_json['cloudRepo']);
+      cloudRepo = CloudRepoSourceContext.fromJson(
+          _json['cloudRepo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cloudWorkspace')) {
-      cloudWorkspace =
-          CloudWorkspaceSourceContext.fromJson(_json['cloudWorkspace']);
+      cloudWorkspace = CloudWorkspaceSourceContext.fromJson(
+          _json['cloudWorkspace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gerrit')) {
-      gerrit = GerritSourceContext.fromJson(_json['gerrit']);
+      gerrit = GerritSourceContext.fromJson(
+          _json['gerrit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('git')) {
-      git = GitSourceContext.fromJson(_json['git']);
+      git = GitSourceContext.fromJson(
+          _json['git'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1826,7 +1874,8 @@
   StackFrame.fromJson(core.Map _json) {
     if (_json.containsKey('arguments')) {
       arguments = (_json['arguments'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('function')) {
@@ -1834,11 +1883,13 @@
     }
     if (_json.containsKey('locals')) {
       locals = (_json['locals'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('location')) {
-      location = SourceLocation.fromJson(_json['location']);
+      location = SourceLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1893,7 +1944,8 @@
 
   StatusMessage.fromJson(core.Map _json) {
     if (_json.containsKey('description')) {
-      description = FormatMessage.fromJson(_json['description']);
+      description = FormatMessage.fromJson(
+          _json['description'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isError')) {
       isError = _json['isError'] as core.bool;
@@ -1928,7 +1980,8 @@
 
   UpdateActiveBreakpointRequest.fromJson(core.Map _json) {
     if (_json.containsKey('breakpoint')) {
-      breakpoint = Breakpoint.fromJson(_json['breakpoint']);
+      breakpoint = Breakpoint.fromJson(
+          _json['breakpoint'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2029,14 +2082,16 @@
   Variable.fromJson(core.Map _json) {
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = StatusMessage.fromJson(_json['status']);
+      status = StatusMessage.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
diff --git a/generated/googleapis/lib/cloudfunctions/v1.dart b/generated/googleapis/lib/cloudfunctions/v1.dart
index 701358f..c444b53 100644
--- a/generated/googleapis/lib/cloudfunctions/v1.dart
+++ b/generated/googleapis/lib/cloudfunctions/v1.dart
@@ -101,7 +101,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -183,7 +185,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -270,7 +275,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -336,7 +344,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CallFunctionResponse.fromJson(data));
+    return _response.then(
+      (data) => CallFunctionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new function. If a function with the given name already exists
@@ -396,7 +407,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a function with the given name from the specified project. If the
@@ -448,7 +461,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a signed URL for downloading deployed function source code. The
@@ -510,7 +525,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GenerateDownloadUrlResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateDownloadUrlResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a signed URL for uploading a function source code. For more
@@ -583,7 +601,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GenerateUploadUrlResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateUploadUrlResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a function with the given name from the requested project.
@@ -634,7 +655,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CloudFunction.fromJson(data));
+    return _response.then(
+      (data) =>
+          CloudFunction.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the IAM access control policy for a function. Returns an empty policy
@@ -703,7 +727,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of functions that belong to the requested project.
@@ -772,7 +798,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFunctionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFunctionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates existing function.
@@ -836,7 +865,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the IAM access control policy on the specified function. Replaces any
@@ -897,7 +928,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Tests the specified permissions against the IAM access control policy for
@@ -959,7 +992,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -993,7 +1029,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -1107,7 +1144,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1343,7 +1381,9 @@
     }
     if (_json.containsKey('buildEnvironmentVariables')) {
       buildEnvironmentVariables = commons.mapMap<core.String, core.String>(
-          _json['buildEnvironmentVariables'].cast<core.String, core.String>(),
+          (_json['buildEnvironmentVariables']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('buildId')) {
@@ -1357,21 +1397,25 @@
     }
     if (_json.containsKey('environmentVariables')) {
       environmentVariables = commons.mapMap<core.String, core.String>(
-          _json['environmentVariables'].cast<core.String, core.String>(),
+          (_json['environmentVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('eventTrigger')) {
-      eventTrigger = EventTrigger.fromJson(_json['eventTrigger']);
+      eventTrigger = EventTrigger.fromJson(
+          _json['eventTrigger'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpsTrigger')) {
-      httpsTrigger = HttpsTrigger.fromJson(_json['httpsTrigger']);
+      httpsTrigger = HttpsTrigger.fromJson(
+          _json['httpsTrigger'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ingressSettings')) {
       ingressSettings = _json['ingressSettings'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('maxInstances')) {
@@ -1393,7 +1437,8 @@
       sourceArchiveUrl = _json['sourceArchiveUrl'] as core.String;
     }
     if (_json.containsKey('sourceRepository')) {
-      sourceRepository = SourceRepository.fromJson(_json['sourceRepository']);
+      sourceRepository = SourceRepository.fromJson(
+          _json['sourceRepository'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceUploadUrl')) {
       sourceUploadUrl = _json['sourceUploadUrl'] as core.String;
@@ -1540,7 +1585,8 @@
       eventType = _json['eventType'] as core.String;
     }
     if (_json.containsKey('failurePolicy')) {
-      failurePolicy = FailurePolicy.fromJson(_json['failurePolicy']);
+      failurePolicy = FailurePolicy.fromJson(
+          _json['failurePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resource')) {
       resource = _json['resource'] as core.String;
@@ -1646,7 +1692,8 @@
 
   FailurePolicy.fromJson(core.Map _json) {
     if (_json.containsKey('retry')) {
-      retry = Retry.fromJson(_json['retry']);
+      retry =
+          Retry.fromJson(_json['retry'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1784,7 +1831,8 @@
   ListFunctionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('functions')) {
       functions = (_json['functions'] as core.List)
-          .map<CloudFunction>((value) => CloudFunction.fromJson(value))
+          .map<CloudFunction>((value) => CloudFunction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1825,7 +1873,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1861,7 +1910,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1910,7 +1960,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1918,7 +1969,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1991,11 +2043,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2003,7 +2057,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2068,7 +2123,8 @@
     }
     if (_json.containsKey('request')) {
       request = commons.mapMap<core.Object, core.Object>(
-          _json['request'].cast<core.String, core.Object>(),
+          (_json['request'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('target')) {
@@ -2188,12 +2244,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -2257,7 +2315,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -2352,7 +2411,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/cloudidentity/v1.dart b/generated/googleapis/lib/cloudidentity/v1.dart
index fa14ebc..eb84e96 100644
--- a/generated/googleapis/lib/cloudidentity/v1.dart
+++ b/generated/googleapis/lib/cloudidentity/v1.dart
@@ -133,7 +133,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a device. Only company-owned device may be created.
@@ -192,7 +194,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified device.
@@ -255,7 +259,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified device.
@@ -319,8 +325,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleAppsCloudidentityDevicesV1Device.fromJson(data));
+    return _response.then(
+      (data) => GoogleAppsCloudidentityDevicesV1Device.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists/Searches devices.
@@ -424,8 +432,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleAppsCloudidentityDevicesV1ListDevicesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleAppsCloudidentityDevicesV1ListDevicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Wipes all data on the specified device.
@@ -484,7 +494,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -553,7 +565,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Blocks device from accessing user data
@@ -612,7 +626,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Cancels an unfinished user account wipe. This operation can be used to
@@ -674,7 +690,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified DeviceUser. This also revokes the user's access to
@@ -739,7 +757,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified DeviceUser
@@ -804,7 +824,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(data));
+      (data) => GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists/Searches DeviceUsers.
@@ -899,8 +921,11 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse.fromJson(
+              data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up resource names of the DeviceUsers associated with the caller's
@@ -1005,9 +1030,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse.fromJson(
-            data));
+    return _response.then(
+      (data) => GoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse
+          .fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Wipes the user's account on a device. Other data on the device that is not
@@ -1072,7 +1098,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1147,7 +1175,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleAppsCloudidentityDevicesV1ClientState.fromJson(data));
+      (data) => GoogleAppsCloudidentityDevicesV1ClientState.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the client states for the given search query.
@@ -1236,9 +1266,11 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleAppsCloudidentityDevicesV1ListClientStatesResponse.fromJson(
-            data));
+    return _response.then(
+      (data) =>
+          GoogleAppsCloudidentityDevicesV1ListClientStatesResponse.fromJson(
+              data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the client state for the device user
@@ -1328,7 +1360,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1398,7 +1432,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Group.
@@ -1450,7 +1486,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a Group.
@@ -1502,7 +1540,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists groups within a customer or a domain.
@@ -1574,7 +1614,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up [resource
@@ -1635,7 +1678,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LookupGroupNameResponse.fromJson(data));
+    return _response.then(
+      (data) => LookupGroupNameResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Group.
@@ -1699,7 +1745,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches for Groups.
@@ -1774,7 +1822,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1841,7 +1892,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Membership.
@@ -1895,7 +1948,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a Membership.
@@ -1949,7 +2004,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Membership.fromJson(data));
+    return _response.then(
+      (data) =>
+          Membership.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists Memberships within a Group.
@@ -2027,7 +2085,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListMembershipsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListMembershipsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up [resource
@@ -2100,8 +2161,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LookupMembershipNameResponse.fromJson(data));
+    return _response.then(
+      (data) => LookupMembershipNameResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the `MembershipRole`s of a `Membership`.
@@ -2161,8 +2224,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ModifyMembershipRolesResponse.fromJson(data));
+    return _response.then(
+      (data) => ModifyMembershipRolesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2303,7 +2368,7 @@
       core.Map _json) {
     if (_json.containsKey('deviceUser')) {
       deviceUser = GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(
-          _json['deviceUser']);
+          _json['deviceUser'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2355,7 +2420,7 @@
       core.Map _json) {
     if (_json.containsKey('deviceUser')) {
       deviceUser = GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(
-          _json['deviceUser']);
+          _json['deviceUser'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2407,7 +2472,8 @@
   GoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse.fromJson(
       core.Map _json) {
     if (_json.containsKey('device')) {
-      device = GoogleAppsCloudidentityDevicesV1Device.fromJson(_json['device']);
+      device = GoogleAppsCloudidentityDevicesV1Device.fromJson(
+          _json['device'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2459,7 +2525,7 @@
       core.Map _json) {
     if (_json.containsKey('deviceUser')) {
       deviceUser = GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(
-          _json['deviceUser']);
+          _json['deviceUser'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2584,10 +2650,11 @@
     if (_json.containsKey('keyValuePairs')) {
       keyValuePairs = commons.mapMap<core.Map,
               GoogleAppsCloudidentityDevicesV1CustomAttributeValue>(
-          _json['keyValuePairs'].cast<core.String, core.Map>(),
+          (_json['keyValuePairs'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
           (core.Map item) =>
               GoogleAppsCloudidentityDevicesV1CustomAttributeValue.fromJson(
-                  item));
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('lastUpdateTime')) {
       lastUpdateTime = _json['lastUpdateTime'] as core.String;
@@ -2830,7 +2897,8 @@
     if (_json.containsKey('androidSpecificAttributes')) {
       androidSpecificAttributes =
           GoogleAppsCloudidentityDevicesV1AndroidAttributes.fromJson(
-              _json['androidSpecificAttributes']);
+              _json['androidSpecificAttributes']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('assetTag')) {
       assetTag = _json['assetTag'] as core.String;
@@ -3151,7 +3219,8 @@
     if (_json.containsKey('clientStates')) {
       clientStates = (_json['clientStates'] as core.List)
           .map<GoogleAppsCloudidentityDevicesV1ClientState>((value) =>
-              GoogleAppsCloudidentityDevicesV1ClientState.fromJson(value))
+              GoogleAppsCloudidentityDevicesV1ClientState.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3188,7 +3257,8 @@
     if (_json.containsKey('deviceUsers')) {
       deviceUsers = (_json['deviceUsers'] as core.List)
           .map<GoogleAppsCloudidentityDevicesV1DeviceUser>((value) =>
-              GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(value))
+              GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3223,8 +3293,9 @@
   GoogleAppsCloudidentityDevicesV1ListDevicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<GoogleAppsCloudidentityDevicesV1Device>(
-              (value) => GoogleAppsCloudidentityDevicesV1Device.fromJson(value))
+          .map<GoogleAppsCloudidentityDevicesV1Device>((value) =>
+              GoogleAppsCloudidentityDevicesV1Device.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3331,7 +3402,8 @@
 
   GoogleAppsCloudidentityDevicesV1WipeDeviceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('device')) {
-      device = GoogleAppsCloudidentityDevicesV1Device.fromJson(_json['device']);
+      device = GoogleAppsCloudidentityDevicesV1Device.fromJson(
+          _json['device'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3383,7 +3455,7 @@
       core.Map _json) {
     if (_json.containsKey('deviceUser')) {
       deviceUser = GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(
-          _json['deviceUser']);
+          _json['deviceUser'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3446,11 +3518,13 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('groupKey')) {
-      groupKey = EntityKey.fromJson(_json['groupKey']);
+      groupKey = EntityKey.fromJson(
+          _json['groupKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -3508,7 +3582,8 @@
   ListGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('groups')) {
       groups = (_json['groups'] as core.List)
-          .map<Group>((value) => Group.fromJson(value))
+          .map<Group>((value) =>
+              Group.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3541,7 +3616,8 @@
   ListMembershipsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('memberships')) {
       memberships = (_json['memberships'] as core.List)
-          .map<Membership>((value) => Membership.fromJson(value))
+          .map<Membership>((value) =>
+              Membership.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3654,11 +3730,13 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('preferredMemberKey')) {
-      preferredMemberKey = EntityKey.fromJson(_json['preferredMemberKey']);
+      preferredMemberKey = EntityKey.fromJson(
+          _json['preferredMemberKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('roles')) {
       roles = (_json['roles'] as core.List)
-          .map<MembershipRole>((value) => MembershipRole.fromJson(value))
+          .map<MembershipRole>((value) => MembershipRole.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -3735,7 +3813,8 @@
   ModifyMembershipRolesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('addRoles')) {
       addRoles = (_json['addRoles'] as core.List)
-          .map<MembershipRole>((value) => MembershipRole.fromJson(value))
+          .map<MembershipRole>((value) => MembershipRole.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('removeRoles')) {
@@ -3766,7 +3845,8 @@
 
   ModifyMembershipRolesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('membership')) {
-      membership = Membership.fromJson(_json['membership']);
+      membership = Membership.fromJson(
+          _json['membership'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3823,11 +3903,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -3835,7 +3917,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3874,7 +3957,8 @@
   SearchGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('groups')) {
       groups = (_json['groups'] as core.List)
-          .map<Group>((value) => Group.fromJson(value))
+          .map<Group>((value) =>
+              Group.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3926,7 +4010,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/cloudiot/v1.dart b/generated/googleapis/lib/cloudiot/v1.dart
index ae56ee3..b996215 100644
--- a/generated/googleapis/lib/cloudiot/v1.dart
+++ b/generated/googleapis/lib/cloudiot/v1.dart
@@ -137,7 +137,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BindDeviceToGatewayResponse.fromJson(data));
+    return _response.then(
+      (data) => BindDeviceToGatewayResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a device registry that contains devices.
@@ -196,7 +199,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeviceRegistry.fromJson(data));
+    return _response.then(
+      (data) =>
+          DeviceRegistry.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a device registry configuration.
@@ -247,7 +253,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a device registry configuration.
@@ -298,7 +306,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeviceRegistry.fromJson(data));
+    return _response.then(
+      (data) =>
+          DeviceRegistry.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -359,7 +370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists device registries.
@@ -429,8 +442,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListDeviceRegistriesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDeviceRegistriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a device registry configuration.
@@ -497,7 +512,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeviceRegistry.fromJson(data));
+    return _response.then(
+      (data) =>
+          DeviceRegistry.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -558,7 +576,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -620,7 +640,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the association between the device and the gateway.
@@ -679,8 +702,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => UnbindDeviceFromGatewayResponse.fromJson(data));
+    return _response.then(
+      (data) => UnbindDeviceFromGatewayResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -753,7 +778,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a device.
@@ -806,7 +833,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets details about a device.
@@ -866,7 +895,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List devices in a device registry.
@@ -997,7 +1028,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDevicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDevicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the configuration for the device, which is eventually sent from
@@ -1060,7 +1094,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeviceConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          DeviceConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a device.
@@ -1129,7 +1166,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Device.fromJson(data));
+    return _response.then(
+      (data) => Device.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sends a command to the specified device. In order for a device to be able
@@ -1201,7 +1240,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SendCommandToDeviceResponse.fromJson(data));
+    return _response.then(
+      (data) => SendCommandToDeviceResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1274,8 +1316,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListDeviceConfigVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDeviceConfigVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1345,7 +1389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDeviceStatesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDeviceStatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1416,7 +1463,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1477,7 +1526,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1539,7 +1590,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1678,7 +1732,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDevicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDevicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1787,7 +1844,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1927,15 +1985,18 @@
       blocked = _json['blocked'] as core.bool;
     }
     if (_json.containsKey('config')) {
-      config = DeviceConfig.fromJson(_json['config']);
+      config = DeviceConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('credentials')) {
       credentials = (_json['credentials'] as core.List)
-          .map<DeviceCredential>((value) => DeviceCredential.fromJson(value))
+          .map<DeviceCredential>((value) => DeviceCredential.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('gatewayConfig')) {
-      gatewayConfig = GatewayConfig.fromJson(_json['gatewayConfig']);
+      gatewayConfig = GatewayConfig.fromJson(
+          _json['gatewayConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -1947,7 +2008,8 @@
       lastConfigSendTime = _json['lastConfigSendTime'] as core.String;
     }
     if (_json.containsKey('lastErrorStatus')) {
-      lastErrorStatus = Status.fromJson(_json['lastErrorStatus']);
+      lastErrorStatus = Status.fromJson(
+          _json['lastErrorStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastErrorTime')) {
       lastErrorTime = _json['lastErrorTime'] as core.String;
@@ -1966,7 +2028,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.String, core.String>(
-          _json['metadata'].cast<core.String, core.String>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -1976,7 +2039,8 @@
       numId = _json['numId'] as core.String;
     }
     if (_json.containsKey('state')) {
-      state = DeviceState.fromJson(_json['state']);
+      state = DeviceState.fromJson(
+          _json['state'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2132,7 +2196,8 @@
       expirationTime = _json['expirationTime'] as core.String;
     }
     if (_json.containsKey('publicKey')) {
-      publicKey = PublicKeyCredential.fromJson(_json['publicKey']);
+      publicKey = PublicKeyCredential.fromJson(
+          _json['publicKey'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2212,19 +2277,21 @@
   DeviceRegistry.fromJson(core.Map _json) {
     if (_json.containsKey('credentials')) {
       credentials = (_json['credentials'] as core.List)
-          .map<RegistryCredential>(
-              (value) => RegistryCredential.fromJson(value))
+          .map<RegistryCredential>((value) => RegistryCredential.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('eventNotificationConfigs')) {
       eventNotificationConfigs =
           (_json['eventNotificationConfigs'] as core.List)
-              .map<EventNotificationConfig>(
-                  (value) => EventNotificationConfig.fromJson(value))
+              .map<EventNotificationConfig>((value) =>
+                  EventNotificationConfig.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('httpConfig')) {
-      httpConfig = HttpConfig.fromJson(_json['httpConfig']);
+      httpConfig = HttpConfig.fromJson(
+          _json['httpConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -2233,14 +2300,16 @@
       logLevel = _json['logLevel'] as core.String;
     }
     if (_json.containsKey('mqttConfig')) {
-      mqttConfig = MqttConfig.fromJson(_json['mqttConfig']);
+      mqttConfig = MqttConfig.fromJson(
+          _json['mqttConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('stateNotificationConfig')) {
-      stateNotificationConfig =
-          StateNotificationConfig.fromJson(_json['stateNotificationConfig']);
+      stateNotificationConfig = StateNotificationConfig.fromJson(
+          _json['stateNotificationConfig']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2512,7 +2581,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2593,7 +2663,8 @@
   ListDeviceConfigVersionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deviceConfigs')) {
       deviceConfigs = (_json['deviceConfigs'] as core.List)
-          .map<DeviceConfig>((value) => DeviceConfig.fromJson(value))
+          .map<DeviceConfig>((value) => DeviceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2623,7 +2694,8 @@
   ListDeviceRegistriesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deviceRegistries')) {
       deviceRegistries = (_json['deviceRegistries'] as core.List)
-          .map<DeviceRegistry>((value) => DeviceRegistry.fromJson(value))
+          .map<DeviceRegistry>((value) => DeviceRegistry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2655,7 +2727,8 @@
   ListDeviceStatesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deviceStates')) {
       deviceStates = (_json['deviceStates'] as core.List)
-          .map<DeviceState>((value) => DeviceState.fromJson(value))
+          .map<DeviceState>((value) => DeviceState.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2684,7 +2757,8 @@
   ListDevicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<Device>((value) => Device.fromJson(value))
+          .map<Device>((value) =>
+              Device.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2850,7 +2924,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -2903,7 +2978,8 @@
       format = _json['format'] as core.String;
     }
     if (_json.containsKey('x509Details')) {
-      x509Details = X509CertificateDetails.fromJson(_json['x509Details']);
+      x509Details = X509CertificateDetails.fromJson(
+          _json['x509Details'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2981,8 +3057,8 @@
 
   RegistryCredential.fromJson(core.Map _json) {
     if (_json.containsKey('publicKeyCertificate')) {
-      publicKeyCertificate =
-          PublicKeyCertificate.fromJson(_json['publicKeyCertificate']);
+      publicKeyCertificate = PublicKeyCertificate.fromJson(
+          _json['publicKeyCertificate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3064,7 +3140,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3132,7 +3209,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/cloudkms/v1.dart b/generated/googleapis/lib/cloudkms/v1.dart
index 1df98f5..7976a0c 100644
--- a/generated/googleapis/lib/cloudkms/v1.dart
+++ b/generated/googleapis/lib/cloudkms/v1.dart
@@ -116,7 +116,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -184,7 +186,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -260,7 +265,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => KeyRing.fromJson(data));
+    return _response.then(
+      (data) => KeyRing.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns metadata for a given KeyRing.
@@ -309,7 +316,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => KeyRing.fromJson(data));
+    return _response.then(
+      (data) => KeyRing.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -377,7 +386,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists KeyRings.
@@ -461,7 +472,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListKeyRingsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListKeyRingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -522,7 +536,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -585,7 +601,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -674,7 +693,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKey.fromJson(data));
+    return _response.then(
+      (data) => CryptoKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Decrypts data that was protected by Encrypt. The CryptoKey.purpose must be
@@ -732,7 +753,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DecryptResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          DecryptResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Encrypts data, so that it can only be recovered by a call to Decrypt. The
@@ -791,7 +815,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EncryptResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          EncryptResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns metadata for a given CryptoKey, as well as its primary
@@ -842,7 +869,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKey.fromJson(data));
+    return _response.then(
+      (data) => CryptoKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -911,7 +940,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists CryptoKeys.
@@ -1008,7 +1039,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCryptoKeysResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCryptoKeysResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a CryptoKey.
@@ -1071,7 +1105,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKey.fromJson(data));
+    return _response.then(
+      (data) => CryptoKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1133,7 +1169,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1197,7 +1235,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the version of a CryptoKey that will be used in Encrypt. Returns an
@@ -1256,7 +1297,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKey.fromJson(data));
+    return _response.then(
+      (data) => CryptoKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1325,7 +1368,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AsymmetricDecryptResponse.fromJson(data));
+    return _response.then(
+      (data) => AsymmetricDecryptResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Signs data using a CryptoKeyVersion with CryptoKey.purpose
@@ -1386,7 +1432,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AsymmetricSignResponse.fromJson(data));
+    return _response.then(
+      (data) => AsymmetricSignResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new CryptoKeyVersion in a CryptoKey. The server will assign the
@@ -1446,7 +1495,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKeyVersion.fromJson(data));
+    return _response.then(
+      (data) => CryptoKeyVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Schedule a CryptoKeyVersion for destruction. Upon calling this method,
@@ -1507,7 +1559,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKeyVersion.fromJson(data));
+    return _response.then(
+      (data) => CryptoKeyVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns metadata for a given CryptoKeyVersion.
@@ -1557,7 +1612,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKeyVersion.fromJson(data));
+    return _response.then(
+      (data) => CryptoKeyVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the public key for the given CryptoKeyVersion. The
@@ -1609,7 +1667,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PublicKey.fromJson(data));
+    return _response.then(
+      (data) => PublicKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports a new CryptoKeyVersion into an existing CryptoKey using the
@@ -1669,7 +1729,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKeyVersion.fromJson(data));
+    return _response.then(
+      (data) => CryptoKeyVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists CryptoKeyVersions.
@@ -1767,8 +1830,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListCryptoKeyVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCryptoKeyVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a CryptoKeyVersion's metadata. state may be changed between ENABLED
@@ -1834,7 +1899,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKeyVersion.fromJson(data));
+    return _response.then(
+      (data) => CryptoKeyVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restore a CryptoKeyVersion in the DESTROY_SCHEDULED state. Upon
@@ -1892,7 +1960,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CryptoKeyVersion.fromJson(data));
+    return _response.then(
+      (data) => CryptoKeyVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1965,7 +2036,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImportJob.fromJson(data));
+    return _response.then(
+      (data) => ImportJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns metadata for a given ImportJob.
@@ -2015,7 +2088,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImportJob.fromJson(data));
+    return _response.then(
+      (data) => ImportJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -2084,7 +2159,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists ImportJobs.
@@ -2169,7 +2246,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListImportJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListImportJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -2231,7 +2311,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -2295,7 +2377,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2440,7 +2525,8 @@
 
   AsymmetricSignRequest.fromJson(core.Map _json) {
     if (_json.containsKey('digest')) {
-      digest = Digest.fromJson(_json['digest']);
+      digest = Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('digestCrc32c')) {
       digestCrc32c = _json['digestCrc32c'] as core.String;
@@ -2563,7 +2649,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -2684,7 +2771,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -2823,7 +2911,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -2833,7 +2922,8 @@
       nextRotationTime = _json['nextRotationTime'] as core.String;
     }
     if (_json.containsKey('primary')) {
-      primary = CryptoKeyVersion.fromJson(_json['primary']);
+      primary = CryptoKeyVersion.fromJson(
+          _json['primary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('purpose')) {
       purpose = _json['purpose'] as core.String;
@@ -2842,8 +2932,8 @@
       rotationPeriod = _json['rotationPeriod'] as core.String;
     }
     if (_json.containsKey('versionTemplate')) {
-      versionTemplate =
-          CryptoKeyVersionTemplate.fromJson(_json['versionTemplate']);
+      versionTemplate = CryptoKeyVersionTemplate.fromJson(
+          _json['versionTemplate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3003,7 +3093,8 @@
       algorithm = _json['algorithm'] as core.String;
     }
     if (_json.containsKey('attestation')) {
-      attestation = KeyOperationAttestation.fromJson(_json['attestation']);
+      attestation = KeyOperationAttestation.fromJson(
+          _json['attestation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -3016,7 +3107,8 @@
     }
     if (_json.containsKey('externalProtectionLevelOptions')) {
       externalProtectionLevelOptions = ExternalProtectionLevelOptions.fromJson(
-          _json['externalProtectionLevelOptions']);
+          _json['externalProtectionLevelOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('generateTime')) {
       generateTime = _json['generateTime'] as core.String;
@@ -3843,7 +3935,8 @@
 
   ImportJob.fromJson(core.Map _json) {
     if (_json.containsKey('attestation')) {
-      attestation = KeyOperationAttestation.fromJson(_json['attestation']);
+      attestation = KeyOperationAttestation.fromJson(
+          _json['attestation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -3867,7 +3960,8 @@
       protectionLevel = _json['protectionLevel'] as core.String;
     }
     if (_json.containsKey('publicKey')) {
-      publicKey = WrappingPublicKey.fromJson(_json['publicKey']);
+      publicKey = WrappingPublicKey.fromJson(
+          _json['publicKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -3941,7 +4035,8 @@
 
   KeyOperationAttestation.fromJson(core.Map _json) {
     if (_json.containsKey('certChains')) {
-      certChains = CertificateChains.fromJson(_json['certChains']);
+      certChains = CertificateChains.fromJson(
+          _json['certChains'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -4016,7 +4111,8 @@
   ListCryptoKeyVersionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('cryptoKeyVersions')) {
       cryptoKeyVersions = (_json['cryptoKeyVersions'] as core.List)
-          .map<CryptoKeyVersion>((value) => CryptoKeyVersion.fromJson(value))
+          .map<CryptoKeyVersion>((value) => CryptoKeyVersion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4060,7 +4156,8 @@
   ListCryptoKeysResponse.fromJson(core.Map _json) {
     if (_json.containsKey('cryptoKeys')) {
       cryptoKeys = (_json['cryptoKeys'] as core.List)
-          .map<CryptoKey>((value) => CryptoKey.fromJson(value))
+          .map<CryptoKey>((value) =>
+              CryptoKey.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4103,7 +4200,8 @@
   ListImportJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('importJobs')) {
       importJobs = (_json['importJobs'] as core.List)
-          .map<ImportJob>((value) => ImportJob.fromJson(value))
+          .map<ImportJob>((value) =>
+              ImportJob.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4146,7 +4244,8 @@
   ListKeyRingsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('keyRings')) {
       keyRings = (_json['keyRings'] as core.List)
-          .map<KeyRing>((value) => KeyRing.fromJson(value))
+          .map<KeyRing>((value) =>
+              KeyRing.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4185,7 +4284,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4237,7 +4337,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -4245,7 +4346,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4386,12 +4488,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -4548,7 +4652,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
diff --git a/generated/googleapis/lib/cloudprofiler/v2.dart b/generated/googleapis/lib/cloudprofiler/v2.dart
index 16a2477..75f2c97 100644
--- a/generated/googleapis/lib/cloudprofiler/v2.dart
+++ b/generated/googleapis/lib/cloudprofiler/v2.dart
@@ -132,7 +132,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// CreateOfflineProfile creates a new profile resource in the offline mode.
@@ -191,7 +193,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// UpdateProfile updates the profile bytes and labels on the profile resource
@@ -258,7 +262,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -277,7 +283,8 @@
 
   CreateProfileRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deployment')) {
-      deployment = Deployment.fromJson(_json['deployment']);
+      deployment = Deployment.fromJson(
+          _json['deployment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('profileType')) {
       profileType = (_json['profileType'] as core.List)
@@ -327,7 +334,8 @@
   Deployment.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('projectId')) {
@@ -408,14 +416,16 @@
 
   Profile.fromJson(core.Map _json) {
     if (_json.containsKey('deployment')) {
-      deployment = Deployment.fromJson(_json['deployment']);
+      deployment = Deployment.fromJson(
+          _json['deployment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duration')) {
       duration = _json['duration'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
diff --git a/generated/googleapis/lib/cloudresourcemanager/v1.dart b/generated/googleapis/lib/cloudresourcemanager/v1.dart
index 8e10ad1..4b2671c 100644
--- a/generated/googleapis/lib/cloudresourcemanager/v1.dart
+++ b/generated/googleapis/lib/cloudresourcemanager/v1.dart
@@ -116,7 +116,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the effective `Policy` on a resource. This is the result of merging
@@ -178,7 +180,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a `Policy` on a resource. If no `Policy` is set on the resource, a
@@ -238,7 +242,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists `Constraints` that could be applied on the specified resource.
@@ -297,7 +303,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListAvailableOrgPolicyConstraintsResponse.fromJson(data));
+      (data) => ListAvailableOrgPolicyConstraintsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the `Policies` set for a particular resource.
@@ -354,7 +362,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOrgPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOrgPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified `Policy` on the resource. Creates a new `Policy` for
@@ -414,7 +425,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -472,7 +485,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Lien.fromJson(data));
+    return _response.then(
+      (data) => Lien.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a Lien by `name`. Callers of this method will require permission on
@@ -524,7 +539,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve a Lien by `name`. Callers of this method will require permission
@@ -576,7 +593,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Lien.fromJson(data));
+    return _response.then(
+      (data) => Lien.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all Liens applied to the `parent` resource. Callers of this method
@@ -645,7 +664,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLiensResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLiensResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -702,7 +724,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -765,7 +789,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Fetches an Organization resource identified by the specified resource
@@ -817,7 +843,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Organization.fromJson(data));
+    return _response.then(
+      (data) =>
+          Organization.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the effective `Policy` on a resource. This is the result of merging
@@ -879,7 +908,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for an Organization resource. May be empty
@@ -942,7 +973,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a `Policy` on a resource. If no `Policy` is set on the resource, a
@@ -1002,7 +1035,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists `Constraints` that could be applied on the specified resource.
@@ -1061,7 +1096,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListAvailableOrgPolicyConstraintsResponse.fromJson(data));
+      (data) => ListAvailableOrgPolicyConstraintsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the `Policies` set for a particular resource.
@@ -1118,7 +1155,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOrgPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOrgPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches Organization resources that are visible to the user and satisfy
@@ -1170,7 +1210,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchOrganizationsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchOrganizationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on an Organization resource. Replaces any
@@ -1233,7 +1276,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified `Policy` on the resource. Creates a new `Policy` for
@@ -1293,7 +1338,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified Organization. The
@@ -1355,7 +1402,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1418,7 +1468,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Request that a new Project be created. The result is an Operation which
@@ -1477,7 +1529,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks the Project identified by the specified `project_id` (for example,
@@ -1535,7 +1589,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the Project identified by the specified `project_id` (for
@@ -1585,7 +1641,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a list of ancestors in the resource hierarchy for the Project
@@ -1643,7 +1701,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetAncestryResponse.fromJson(data));
+    return _response.then(
+      (data) => GetAncestryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the effective `Policy` on a resource. This is the result of merging
@@ -1705,7 +1766,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the IAM access control policy for the specified Project.
@@ -1769,7 +1832,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a `Policy` on a resource. If no `Policy` is set on the resource, a
@@ -1829,7 +1894,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists Projects that the caller has the `resourcemanager.projects.get`
@@ -1925,7 +1992,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListProjectsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListProjectsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists `Constraints` that could be applied on the specified resource.
@@ -1984,7 +2054,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListAvailableOrgPolicyConstraintsResponse.fromJson(data));
+      (data) => ListAvailableOrgPolicyConstraintsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the `Policies` set for a particular resource.
@@ -2041,7 +2113,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOrgPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOrgPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the IAM access control policy for the specified Project. CAUTION:
@@ -2132,7 +2207,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified `Policy` on the resource. Creates a new `Policy` for
@@ -2192,7 +2269,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrgPolicy.fromJson(data));
+    return _response.then(
+      (data) => OrgPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified Project. For
@@ -2254,7 +2333,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restores the Project identified by the specified `project_id` (for
@@ -2314,7 +2396,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the attributes of the Project identified by the specified
@@ -2370,7 +2454,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2383,7 +2469,8 @@
 
   Ancestor.fromJson(core.Map _json) {
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2426,7 +2513,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -2547,7 +2635,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -2726,8 +2815,8 @@
 
   Constraint.fromJson(core.Map _json) {
     if (_json.containsKey('booleanConstraint')) {
-      booleanConstraint =
-          BooleanConstraint.fromJson(_json['booleanConstraint']);
+      booleanConstraint = BooleanConstraint.fromJson(
+          _json['booleanConstraint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('constraintDefault')) {
       constraintDefault = _json['constraintDefault'] as core.String;
@@ -2739,7 +2828,8 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('listConstraint')) {
-      listConstraint = ListConstraint.fromJson(_json['listConstraint']);
+      listConstraint = ListConstraint.fromJson(
+          _json['listConstraint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2986,7 +3076,8 @@
   GetAncestryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('ancestor')) {
       ancestor = (_json['ancestor'] as core.List)
-          .map<Ancestor>((value) => Ancestor.fromJson(value))
+          .map<Ancestor>((value) =>
+              Ancestor.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3032,7 +3123,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3227,7 +3319,8 @@
   ListAvailableOrgPolicyConstraintsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('constraints')) {
       constraints = (_json['constraints'] as core.List)
-          .map<Constraint>((value) => Constraint.fromJson(value))
+          .map<Constraint>((value) =>
+              Constraint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3298,7 +3391,8 @@
   ListLiensResponse.fromJson(core.Map _json) {
     if (_json.containsKey('liens')) {
       liens = (_json['liens'] as core.List)
-          .map<Lien>((value) => Lien.fromJson(value))
+          .map<Lien>((value) =>
+              Lien.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3371,7 +3465,8 @@
     }
     if (_json.containsKey('policies')) {
       policies = (_json['policies'] as core.List)
-          .map<OrgPolicy>((value) => OrgPolicy.fromJson(value))
+          .map<OrgPolicy>((value) =>
+              OrgPolicy.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3560,7 +3655,8 @@
     }
     if (_json.containsKey('projects')) {
       projects = (_json['projects'] as core.List)
-          .map<Project>((value) => Project.fromJson(value))
+          .map<Project>((value) =>
+              Project.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3621,11 +3717,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -3633,7 +3731,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3709,7 +3808,8 @@
 
   OrgPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('booleanPolicy')) {
-      booleanPolicy = BooleanPolicy.fromJson(_json['booleanPolicy']);
+      booleanPolicy = BooleanPolicy.fromJson(
+          _json['booleanPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('constraint')) {
       constraint = _json['constraint'] as core.String;
@@ -3718,10 +3818,12 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('listPolicy')) {
-      listPolicy = ListPolicy.fromJson(_json['listPolicy']);
+      listPolicy = ListPolicy.fromJson(
+          _json['listPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('restoreDefault')) {
-      restoreDefault = RestoreDefault.fromJson(_json['restoreDefault']);
+      restoreDefault = RestoreDefault.fromJson(
+          _json['restoreDefault'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -3804,7 +3906,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('owner')) {
-      owner = OrganizationOwner.fromJson(_json['owner']);
+      owner = OrganizationOwner.fromJson(
+          _json['owner'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3933,12 +4036,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -4027,7 +4132,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lifecycleState')) {
@@ -4037,7 +4143,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parent')) {
-      parent = ResourceId.fromJson(_json['parent']);
+      parent = ResourceId.fromJson(
+          _json['parent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
@@ -4246,7 +4353,8 @@
     }
     if (_json.containsKey('organizations')) {
       organizations = (_json['organizations'] as core.List)
-          .map<Organization>((value) => Organization.fromJson(value))
+          .map<Organization>((value) => Organization.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4281,7 +4389,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -4309,7 +4418,8 @@
 
   SetOrgPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = OrgPolicy.fromJson(_json['policy']);
+      policy = OrgPolicy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4354,7 +4464,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/cloudresourcemanager/v2.dart b/generated/googleapis/lib/cloudresourcemanager/v2.dart
index dff0dca..d2f4232 100644
--- a/generated/googleapis/lib/cloudresourcemanager/v2.dart
+++ b/generated/googleapis/lib/cloudresourcemanager/v2.dart
@@ -127,7 +127,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Requests deletion of a Folder. The Folder is moved into the
@@ -182,7 +184,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a Folder identified by the supplied resource name. Valid Folder
@@ -235,7 +239,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a Folder. The returned policy may be
@@ -298,7 +304,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the Folders that are direct descendants of supplied parent resource.
@@ -374,7 +382,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFoldersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFoldersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves a Folder under a new resource parent. Returns an Operation which can
@@ -442,7 +453,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Folder, changing its display_name. Changes to the folder
@@ -515,7 +528,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Search for folders that match specific filter criteria. Search provides an
@@ -566,7 +581,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchFoldersResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchFoldersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on a Folder, replacing any existing policy.
@@ -629,7 +647,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified Folder. The
@@ -691,7 +711,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Cancels the deletion request for a Folder. This method may only be called
@@ -753,7 +776,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -810,7 +835,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -844,7 +871,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -965,7 +993,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1244,7 +1273,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1300,7 +1330,8 @@
   ListFoldersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('folders')) {
       folders = (_json['folders'] as core.List)
-          .map<Folder>((value) => Folder.fromJson(value))
+          .map<Folder>((value) =>
+              Folder.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1388,11 +1419,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1400,7 +1433,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1505,12 +1539,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -1653,7 +1689,8 @@
   SearchFoldersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('folders')) {
       folders = (_json['folders'] as core.List)
-          .map<Folder>((value) => Folder.fromJson(value))
+          .map<Folder>((value) =>
+              Folder.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1690,7 +1727,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -1741,7 +1779,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/cloudscheduler/v1.dart b/generated/googleapis/lib/cloudscheduler/v1.dart
index 675b5f2..bb06bea 100644
--- a/generated/googleapis/lib/cloudscheduler/v1.dart
+++ b/generated/googleapis/lib/cloudscheduler/v1.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -179,7 +181,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -242,7 +247,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a job.
@@ -292,7 +299,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a job.
@@ -342,7 +351,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists jobs.
@@ -412,7 +423,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a job. If successful, the updated Job is returned. If the job does
@@ -488,7 +502,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Pauses a job. If a job is paused then the system will stop executing the
@@ -547,7 +563,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resume a job. This method reenables a job after it has been
@@ -606,7 +624,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Forces a job to run now. When this method is called, Cloud Scheduler will
@@ -663,7 +683,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -733,14 +755,16 @@
 
   AppEngineHttpTarget.fromJson(core.Map _json) {
     if (_json.containsKey('appEngineRouting')) {
-      appEngineRouting = AppEngineRouting.fromJson(_json['appEngineRouting']);
+      appEngineRouting = AppEngineRouting.fromJson(
+          _json['appEngineRouting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('body')) {
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('httpMethod')) {
@@ -953,17 +977,20 @@
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('httpMethod')) {
       httpMethod = _json['httpMethod'] as core.String;
     }
     if (_json.containsKey('oauthToken')) {
-      oauthToken = OAuthToken.fromJson(_json['oauthToken']);
+      oauthToken = OAuthToken.fromJson(
+          _json['oauthToken'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oidcToken')) {
-      oidcToken = OidcToken.fromJson(_json['oidcToken']);
+      oidcToken = OidcToken.fromJson(
+          _json['oidcToken'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uri')) {
       uri = _json['uri'] as core.String;
@@ -1092,8 +1119,8 @@
 
   Job.fromJson(core.Map _json) {
     if (_json.containsKey('appEngineHttpTarget')) {
-      appEngineHttpTarget =
-          AppEngineHttpTarget.fromJson(_json['appEngineHttpTarget']);
+      appEngineHttpTarget = AppEngineHttpTarget.fromJson(
+          _json['appEngineHttpTarget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('attemptDeadline')) {
       attemptDeadline = _json['attemptDeadline'] as core.String;
@@ -1102,7 +1129,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('httpTarget')) {
-      httpTarget = HttpTarget.fromJson(_json['httpTarget']);
+      httpTarget = HttpTarget.fromJson(
+          _json['httpTarget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastAttemptTime')) {
       lastAttemptTime = _json['lastAttemptTime'] as core.String;
@@ -1111,10 +1139,12 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pubsubTarget')) {
-      pubsubTarget = PubsubTarget.fromJson(_json['pubsubTarget']);
+      pubsubTarget = PubsubTarget.fromJson(
+          _json['pubsubTarget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retryConfig')) {
-      retryConfig = RetryConfig.fromJson(_json['retryConfig']);
+      retryConfig = RetryConfig.fromJson(
+          _json['retryConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schedule')) {
       schedule = _json['schedule'] as core.String;
@@ -1126,7 +1156,8 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeZone')) {
       timeZone = _json['timeZone'] as core.String;
@@ -1201,7 +1232,8 @@
   ListJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<Job>((value) => Job.fromJson(value))
+          .map<Job>((value) =>
+              Job.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1234,7 +1266,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1286,7 +1319,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1294,7 +1328,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1463,7 +1498,8 @@
   PubsubMessage.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
       attributes = commons.mapMap<core.String, core.String>(
-          _json['attributes'].cast<core.String, core.String>(),
+          (_json['attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('data')) {
@@ -1531,7 +1567,8 @@
   PubsubTarget.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
       attributes = commons.mapMap<core.String, core.String>(
-          _json['attributes'].cast<core.String, core.String>(),
+          (_json['attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('data')) {
@@ -1701,7 +1738,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/cloudsearch/v1.dart b/generated/googleapis/lib/cloudsearch/v1.dart
index 481539e..b11e7df 100644
--- a/generated/googleapis/lib/cloudsearch/v1.dart
+++ b/generated/googleapis/lib/cloudsearch/v1.dart
@@ -188,7 +188,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CheckAccessResponse.fromJson(data));
+    return _response.then(
+      (data) => CheckAccessResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Fetches the item whose viewUrl exactly matches that of the URL provided in
@@ -246,8 +249,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SearchItemsByViewUrlResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchItemsByViewUrlResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -330,8 +335,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListUnmappedIdentitiesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUnmappedIdentitiesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -440,7 +447,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListItemNamesForUnmappedIdentityResponse.fromJson(data));
+      (data) => ListItemNamesForUnmappedIdentityResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -541,8 +550,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListUnmappedIdentitiesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUnmappedIdentitiesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -623,7 +634,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the schema of a data source. **Note:** This API requires an admin or
@@ -685,7 +698,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Schema.fromJson(data));
+    return _response.then(
+      (data) => Schema.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the schema of a data source. This method does not perform
@@ -746,7 +761,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -845,7 +862,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes all items in a queue. This method is useful for deleting stale
@@ -906,7 +925,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets Item resource by item name. This API requires an admin or service
@@ -974,7 +995,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Item.fromJson(data));
+    return _response.then(
+      (data) => Item.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates Item ACL, metadata, and content. It will insert the Item if it
@@ -1036,7 +1059,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all or a subset of Item resources. This API requires an admin or
@@ -1133,7 +1158,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListItemsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListItemsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Polls for unreserved items from the indexing queue and marks a set as
@@ -1201,7 +1229,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PollItemsResponse.fromJson(data));
+    return _response.then(
+      (data) => PollItemsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Pushes an item onto a queue for later polling and updating. This API
@@ -1262,7 +1293,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Item.fromJson(data));
+    return _response.then(
+      (data) => Item.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unreserves all items from a queue, making them all eligible to be polled.
@@ -1324,7 +1357,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an upload session for uploading item content. For items smaller
@@ -1386,7 +1421,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UploadItemRef.fromJson(data));
+    return _response.then(
+      (data) =>
+          UploadItemRef.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1473,7 +1511,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Media.fromJson(data));
+    return _response.then(
+      (data) => Media.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1532,7 +1572,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1613,7 +1655,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1676,7 +1721,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SearchResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Provides suggestions for autocompleting the query. **Note:** This API
@@ -1728,7 +1776,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SuggestResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SuggestResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1834,7 +1885,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListQuerySourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListQuerySourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1901,7 +1955,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a datasource. **Note:** This API requires an admin account to
@@ -1960,7 +2016,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a datasource. **Note:** This API requires an admin account to
@@ -2019,7 +2077,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataSource.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataSource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists datasources. **Note:** This API requires an admin account to
@@ -2084,7 +2145,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDataSourceResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDataSourceResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a datasource. **Note:** This API requires an admin account to
@@ -2141,7 +2205,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2197,7 +2263,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a search application. **Note:** This API requires an admin account
@@ -2257,7 +2325,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified search application. **Note:** This API requires an
@@ -2317,7 +2387,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchApplication.fromJson(data));
+    return _response.then(
+      (data) => SearchApplication.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all search applications. **Note:** This API requires an admin
@@ -2382,8 +2455,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListSearchApplicationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSearchApplicationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resets a search application to default settings. This will return an empty
@@ -2442,7 +2517,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a search application. **Note:** This API requires an admin account
@@ -2499,7 +2576,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2593,8 +2672,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetCustomerIndexStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetCustomerIndexStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the query statistics for customer. **Note:** This API requires a
@@ -2675,8 +2756,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetCustomerQueryStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetCustomerQueryStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the # of search sessions, % of successful sessions with a click query
@@ -2758,8 +2841,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetCustomerSessionStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetCustomerSessionStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the users statistics for customer. **Note:** This API requires a
@@ -2840,8 +2925,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetCustomerUserStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetCustomerUserStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2946,8 +3033,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetDataSourceIndexStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetDataSourceIndexStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3052,8 +3141,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetSearchApplicationQueryStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetSearchApplicationQueryStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3160,7 +3251,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GetSearchApplicationSessionStatsResponse.fromJson(data));
+      (data) => GetSearchApplicationSessionStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3265,8 +3358,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetSearchApplicationUserStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetSearchApplicationUserStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3311,8 +3406,8 @@
 
   BooleanPropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions =
-          BooleanOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = BooleanOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3365,7 +3460,8 @@
     }
     if (_json.containsKey('subFilters')) {
       subFilters = (_json['subFilters'] as core.List)
-          .map<Filter>((value) => Filter.fromJson(value))
+          .map<Filter>((value) =>
+              Filter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3394,11 +3490,13 @@
 
   CustomerIndexStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('itemCountByStatus')) {
       itemCountByStatus = (_json['itemCountByStatus'] as core.List)
-          .map<ItemCountByStatus>((value) => ItemCountByStatus.fromJson(value))
+          .map<ItemCountByStatus>((value) => ItemCountByStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3426,12 +3524,13 @@
 
   CustomerQueryStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryCountByStatus')) {
       queryCountByStatus = (_json['queryCountByStatus'] as core.List)
-          .map<QueryCountByStatus>(
-              (value) => QueryCountByStatus.fromJson(value))
+          .map<QueryCountByStatus>((value) => QueryCountByStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3461,7 +3560,8 @@
 
   CustomerSessionStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchSessionsCount')) {
       searchSessionsCount = _json['searchSessionsCount'] as core.String;
@@ -3498,7 +3598,8 @@
 
   CustomerUserStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oneDayActiveUsersCount')) {
       oneDayActiveUsersCount = _json['oneDayActiveUsersCount'] as core.String;
@@ -3595,7 +3696,8 @@
     }
     if (_json.containsKey('itemsVisibility')) {
       itemsVisibility = (_json['itemsVisibility'] as core.List)
-          .map<GSuitePrincipal>((value) => GSuitePrincipal.fromJson(value))
+          .map<GSuitePrincipal>((value) => GSuitePrincipal.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3657,11 +3759,13 @@
 
   DataSourceIndexStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('itemCountByStatus')) {
       itemCountByStatus = (_json['itemCountByStatus'] as core.List)
-          .map<ItemCountByStatus>((value) => ItemCountByStatus.fromJson(value))
+          .map<ItemCountByStatus>((value) => ItemCountByStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3698,11 +3802,13 @@
   DataSourceRestriction.fromJson(core.Map _json) {
     if (_json.containsKey('filterOptions')) {
       filterOptions = (_json['filterOptions'] as core.List)
-          .map<FilterOptions>((value) => FilterOptions.fromJson(value))
+          .map<FilterOptions>((value) => FilterOptions.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3835,7 +3941,8 @@
 
   DatePropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions = DateOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = DateOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3857,7 +3964,8 @@
   DateValues.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<Date>((value) => Date.fromJson(value))
+          .map<Date>((value) =>
+              Date.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3912,7 +4020,8 @@
       connectorName = _json['connectorName'] as core.String;
     }
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queue')) {
       queue = _json['queue'] as core.String;
@@ -3997,8 +4106,8 @@
 
   DoublePropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions =
-          DoubleOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = DoubleOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4255,14 +4364,16 @@
 
   EnumPropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions = EnumOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = EnumOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('orderedRanking')) {
       orderedRanking = _json['orderedRanking'] as core.String;
     }
     if (_json.containsKey('possibleValues')) {
       possibleValues = (_json['possibleValues'] as core.List)
-          .map<EnumValuePair>((value) => EnumValuePair.fromJson(value))
+          .map<EnumValuePair>((value) => EnumValuePair.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4360,7 +4471,8 @@
   ErrorInfo.fromJson(core.Map _json) {
     if (_json.containsKey('errorMessages')) {
       errorMessages = (_json['errorMessages'] as core.List)
-          .map<ErrorMessage>((value) => ErrorMessage.fromJson(value))
+          .map<ErrorMessage>((value) => ErrorMessage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4387,7 +4499,8 @@
       errorMessage = _json['errorMessage'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4431,7 +4544,8 @@
       percentage = _json['percentage'] as core.int;
     }
     if (_json.containsKey('value')) {
-      value = Value.fromJson(_json['value']);
+      value =
+          Value.fromJson(_json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4524,7 +4638,8 @@
   FacetResult.fromJson(core.Map _json) {
     if (_json.containsKey('buckets')) {
       buckets = (_json['buckets'] as core.List)
-          .map<FacetBucket>((value) => FacetBucket.fromJson(value))
+          .map<FacetBucket>((value) => FacetBucket.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectType')) {
@@ -4600,10 +4715,12 @@
 
   Filter.fromJson(core.Map _json) {
     if (_json.containsKey('compositeFilter')) {
-      compositeFilter = CompositeFilter.fromJson(_json['compositeFilter']);
+      compositeFilter = CompositeFilter.fromJson(
+          _json['compositeFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('valueFilter')) {
-      valueFilter = ValueFilter.fromJson(_json['valueFilter']);
+      valueFilter = ValueFilter.fromJson(
+          _json['valueFilter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4633,7 +4750,8 @@
 
   FilterOptions.fromJson(core.Map _json) {
     if (_json.containsKey('filter')) {
-      filter = Filter.fromJson(_json['filter']);
+      filter = Filter.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectType')) {
       objectType = _json['objectType'] as core.String;
@@ -4743,8 +4861,8 @@
   GetCustomerIndexStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<CustomerIndexStats>(
-              (value) => CustomerIndexStats.fromJson(value))
+          .map<CustomerIndexStats>((value) => CustomerIndexStats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4766,8 +4884,8 @@
   GetCustomerQueryStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<CustomerQueryStats>(
-              (value) => CustomerQueryStats.fromJson(value))
+          .map<CustomerQueryStats>((value) => CustomerQueryStats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4789,8 +4907,8 @@
   GetCustomerSessionStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<CustomerSessionStats>(
-              (value) => CustomerSessionStats.fromJson(value))
+          .map<CustomerSessionStats>((value) => CustomerSessionStats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4812,7 +4930,8 @@
   GetCustomerUserStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<CustomerUserStats>((value) => CustomerUserStats.fromJson(value))
+          .map<CustomerUserStats>((value) => CustomerUserStats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4835,8 +4954,8 @@
   GetDataSourceIndexStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<DataSourceIndexStats>(
-              (value) => DataSourceIndexStats.fromJson(value))
+          .map<DataSourceIndexStats>((value) => DataSourceIndexStats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4858,8 +4977,9 @@
   GetSearchApplicationQueryStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<SearchApplicationQueryStats>(
-              (value) => SearchApplicationQueryStats.fromJson(value))
+          .map<SearchApplicationQueryStats>((value) =>
+              SearchApplicationQueryStats.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4881,8 +5001,9 @@
   GetSearchApplicationSessionStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<SearchApplicationSessionStats>(
-              (value) => SearchApplicationSessionStats.fromJson(value))
+          .map<SearchApplicationSessionStats>((value) =>
+              SearchApplicationSessionStats.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4904,8 +5025,9 @@
   GetSearchApplicationUserStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('stats')) {
       stats = (_json['stats'] as core.List)
-          .map<SearchApplicationUserStats>(
-              (value) => SearchApplicationUserStats.fromJson(value))
+          .map<SearchApplicationUserStats>((value) =>
+              SearchApplicationUserStats.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4964,11 +5086,12 @@
 
   HtmlPropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions = HtmlOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = HtmlOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retrievalImportance')) {
-      retrievalImportance =
-          RetrievalImportance.fromJson(_json['retrievalImportance']);
+      retrievalImportance = RetrievalImportance.fromJson(
+          _json['retrievalImportance'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5059,13 +5182,16 @@
       connectorName = _json['connectorName'] as core.String;
     }
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indexItemOptions')) {
-      indexItemOptions = IndexItemOptions.fromJson(_json['indexItemOptions']);
+      indexItemOptions = IndexItemOptions.fromJson(
+          _json['indexItemOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('item')) {
-      item = Item.fromJson(_json['item']);
+      item =
+          Item.fromJson(_json['item'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mode')) {
       mode = _json['mode'] as core.String;
@@ -5193,8 +5319,8 @@
       minimumValue = _json['minimumValue'] as core.String;
     }
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions =
-          IntegerOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = IntegerOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('orderedRanking')) {
       orderedRanking = _json['orderedRanking'] as core.String;
@@ -5265,7 +5391,8 @@
       interactionTime = _json['interactionTime'] as core.String;
     }
     if (_json.containsKey('principal')) {
-      principal = Principal.fromJson(_json['principal']);
+      principal = Principal.fromJson(
+          _json['principal'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -5353,16 +5480,19 @@
 
   Item.fromJson(core.Map _json) {
     if (_json.containsKey('acl')) {
-      acl = ItemAcl.fromJson(_json['acl']);
+      acl =
+          ItemAcl.fromJson(_json['acl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
-      content = ItemContent.fromJson(_json['content']);
+      content = ItemContent.fromJson(
+          _json['content'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('itemType')) {
       itemType = _json['itemType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ItemMetadata.fromJson(_json['metadata']);
+      metadata = ItemMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5374,10 +5504,12 @@
       queue = _json['queue'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = ItemStatus.fromJson(_json['status']);
+      status = ItemStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structuredData')) {
-      structuredData = ItemStructuredData.fromJson(_json['structuredData']);
+      structuredData = ItemStructuredData.fromJson(
+          _json['structuredData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
       version = _json['version'] as core.String;
@@ -5477,7 +5609,8 @@
     }
     if (_json.containsKey('deniedReaders')) {
       deniedReaders = (_json['deniedReaders'] as core.List)
-          .map<Principal>((value) => Principal.fromJson(value))
+          .map<Principal>((value) =>
+              Principal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inheritAclFrom')) {
@@ -5485,12 +5618,14 @@
     }
     if (_json.containsKey('owners')) {
       owners = (_json['owners'] as core.List)
-          .map<Principal>((value) => Principal.fromJson(value))
+          .map<Principal>((value) =>
+              Principal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('readers')) {
       readers = (_json['readers'] as core.List)
-          .map<Principal>((value) => Principal.fromJson(value))
+          .map<Principal>((value) =>
+              Principal.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5550,7 +5685,8 @@
 
   ItemContent.fromJson(core.Map _json) {
     if (_json.containsKey('contentDataRef')) {
-      contentDataRef = UploadItemRef.fromJson(_json['contentDataRef']);
+      contentDataRef = UploadItemRef.fromJson(
+          _json['contentDataRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentFormat')) {
       contentFormat = _json['contentFormat'] as core.String;
@@ -5698,7 +5834,8 @@
     }
     if (_json.containsKey('interactions')) {
       interactions = (_json['interactions'] as core.List)
-          .map<Interaction>((value) => Interaction.fromJson(value))
+          .map<Interaction>((value) => Interaction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('keywords')) {
@@ -5713,8 +5850,9 @@
       objectType = _json['objectType'] as core.String;
     }
     if (_json.containsKey('searchQualityMetadata')) {
-      searchQualityMetadata =
-          SearchQualityMetadata.fromJson(_json['searchQualityMetadata']);
+      searchQualityMetadata = SearchQualityMetadata.fromJson(
+          _json['searchQualityMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceRepositoryUrl')) {
       sourceRepositoryUrl = _json['sourceRepositoryUrl'] as core.String;
@@ -5800,12 +5938,14 @@
     }
     if (_json.containsKey('processingErrors')) {
       processingErrors = (_json['processingErrors'] as core.List)
-          .map<ProcessingError>((value) => ProcessingError.fromJson(value))
+          .map<ProcessingError>((value) => ProcessingError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('repositoryErrors')) {
       repositoryErrors = (_json['repositoryErrors'] as core.List)
-          .map<RepositoryError>((value) => RepositoryError.fromJson(value))
+          .map<RepositoryError>((value) => RepositoryError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5845,7 +5985,8 @@
       hash = _json['hash'] as core.String;
     }
     if (_json.containsKey('object')) {
-      object = StructuredDataObject.fromJson(_json['object']);
+      object = StructuredDataObject.fromJson(
+          _json['object'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5875,7 +6016,8 @@
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<DataSource>((value) => DataSource.fromJson(value))
+          .map<DataSource>((value) =>
+              DataSource.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5936,7 +6078,8 @@
   ListItemsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Item>((value) => Item.fromJson(value))
+          .map<Item>((value) =>
+              Item.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5972,7 +6115,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6002,7 +6146,8 @@
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<QuerySource>((value) => QuerySource.fromJson(value))
+          .map<QuerySource>((value) => QuerySource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6033,7 +6178,8 @@
     }
     if (_json.containsKey('searchApplications')) {
       searchApplications = (_json['searchApplications'] as core.List)
-          .map<SearchApplication>((value) => SearchApplication.fromJson(value))
+          .map<SearchApplication>((value) => SearchApplication.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6065,7 +6211,8 @@
     }
     if (_json.containsKey('unmappedIdentities')) {
       unmappedIdentities = (_json['unmappedIdentities'] as core.List)
-          .map<UnmappedIdentity>((value) => UnmappedIdentity.fromJson(value))
+          .map<UnmappedIdentity>((value) => UnmappedIdentity.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6172,11 +6319,13 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('displayOptions')) {
-      displayOptions = ResultDisplayMetadata.fromJson(_json['displayOptions']);
+      displayOptions = ResultDisplayMetadata.fromJson(
+          _json['displayOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<NamedProperty>((value) => NamedProperty.fromJson(value))
+          .map<NamedProperty>((value) => NamedProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mimeType')) {
@@ -6186,10 +6335,12 @@
       objectType = _json['objectType'] as core.String;
     }
     if (_json.containsKey('owner')) {
-      owner = Person.fromJson(_json['owner']);
+      owner = Person.fromJson(
+          _json['owner'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -6238,7 +6389,8 @@
   Metaline.fromJson(core.Map _json) {
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<DisplayedProperty>((value) => DisplayedProperty.fromJson(value))
+          .map<DisplayedProperty>((value) => DisplayedProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6301,31 +6453,39 @@
       booleanValue = _json['booleanValue'] as core.bool;
     }
     if (_json.containsKey('dateValues')) {
-      dateValues = DateValues.fromJson(_json['dateValues']);
+      dateValues = DateValues.fromJson(
+          _json['dateValues'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doubleValues')) {
-      doubleValues = DoubleValues.fromJson(_json['doubleValues']);
+      doubleValues = DoubleValues.fromJson(
+          _json['doubleValues'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enumValues')) {
-      enumValues = EnumValues.fromJson(_json['enumValues']);
+      enumValues = EnumValues.fromJson(
+          _json['enumValues'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('htmlValues')) {
-      htmlValues = HtmlValues.fromJson(_json['htmlValues']);
+      htmlValues = HtmlValues.fromJson(
+          _json['htmlValues'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('integerValues')) {
-      integerValues = IntegerValues.fromJson(_json['integerValues']);
+      integerValues = IntegerValues.fromJson(
+          _json['integerValues'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('objectValues')) {
-      objectValues = ObjectValues.fromJson(_json['objectValues']);
+      objectValues = ObjectValues.fromJson(
+          _json['objectValues'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textValues')) {
-      textValues = TextValues.fromJson(_json['textValues']);
+      textValues = TextValues.fromJson(
+          _json['textValues'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampValues')) {
-      timestampValues = TimestampValues.fromJson(_json['timestampValues']);
+      timestampValues = TimestampValues.fromJson(
+          _json['timestampValues'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6390,12 +6550,13 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('options')) {
-      options = ObjectOptions.fromJson(_json['options']);
+      options = ObjectOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('propertyDefinitions')) {
       propertyDefinitions = (_json['propertyDefinitions'] as core.List)
-          .map<PropertyDefinition>(
-              (value) => PropertyDefinition.fromJson(value))
+          .map<PropertyDefinition>((value) => PropertyDefinition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6438,7 +6599,8 @@
   ObjectDisplayOptions.fromJson(core.Map _json) {
     if (_json.containsKey('metalines')) {
       metalines = (_json['metalines'] as core.List)
-          .map<Metaline>((value) => Metaline.fromJson(value))
+          .map<Metaline>((value) =>
+              Metaline.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectDisplayLabel')) {
@@ -6471,10 +6633,12 @@
 
   ObjectOptions.fromJson(core.Map _json) {
     if (_json.containsKey('displayOptions')) {
-      displayOptions = ObjectDisplayOptions.fromJson(_json['displayOptions']);
+      displayOptions = ObjectDisplayOptions.fromJson(
+          _json['displayOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('freshnessOptions')) {
-      freshnessOptions = FreshnessOptions.fromJson(_json['freshnessOptions']);
+      freshnessOptions = FreshnessOptions.fromJson(
+          _json['freshnessOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6503,8 +6667,8 @@
   ObjectPropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('subobjectProperties')) {
       subobjectProperties = (_json['subobjectProperties'] as core.List)
-          .map<PropertyDefinition>(
-              (value) => PropertyDefinition.fromJson(value))
+          .map<PropertyDefinition>((value) => PropertyDefinition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6528,8 +6692,8 @@
   ObjectValues.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<StructuredDataObject>(
-              (value) => StructuredDataObject.fromJson(value))
+          .map<StructuredDataObject>((value) => StructuredDataObject.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6587,11 +6751,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -6599,7 +6765,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -6634,7 +6801,8 @@
 
   PeopleSuggestion.fromJson(core.Map _json) {
     if (_json.containsKey('person')) {
-      person = Person.fromJson(_json['person']);
+      person = Person.fromJson(
+          _json['person'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6671,7 +6839,8 @@
   Person.fromJson(core.Map _json) {
     if (_json.containsKey('emailAddresses')) {
       emailAddresses = (_json['emailAddresses'] as core.List)
-          .map<EmailAddress>((value) => EmailAddress.fromJson(value))
+          .map<EmailAddress>((value) => EmailAddress.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -6682,12 +6851,14 @@
     }
     if (_json.containsKey('personNames')) {
       personNames = (_json['personNames'] as core.List)
-          .map<Name>((value) => Name.fromJson(value))
+          .map<Name>((value) =>
+              Name.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('photos')) {
       photos = (_json['photos'] as core.List)
-          .map<Photo>((value) => Photo.fromJson(value))
+          .map<Photo>((value) =>
+              Photo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6763,7 +6934,8 @@
       connectorName = _json['connectorName'] as core.String;
     }
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('limit')) {
       limit = _json['limit'] as core.int;
@@ -6810,7 +6982,8 @@
   PollItemsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Item>((value) => Item.fromJson(value))
+          .map<Item>((value) =>
+              Item.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6846,7 +7019,8 @@
       groupResourceName = _json['groupResourceName'] as core.String;
     }
     if (_json.containsKey('gsuitePrincipal')) {
-      gsuitePrincipal = GSuitePrincipal.fromJson(_json['gsuitePrincipal']);
+      gsuitePrincipal = GSuitePrincipal.fromJson(
+          _json['gsuitePrincipal'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userResourceName')) {
       userResourceName = _json['userResourceName'] as core.String;
@@ -6901,7 +7075,8 @@
     }
     if (_json.containsKey('fieldViolations')) {
       fieldViolations = (_json['fieldViolations'] as core.List)
-          .map<FieldViolation>((value) => FieldViolation.fromJson(value))
+          .map<FieldViolation>((value) => FieldViolation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6990,31 +7165,35 @@
 
   PropertyDefinition.fromJson(core.Map _json) {
     if (_json.containsKey('booleanPropertyOptions')) {
-      booleanPropertyOptions =
-          BooleanPropertyOptions.fromJson(_json['booleanPropertyOptions']);
+      booleanPropertyOptions = BooleanPropertyOptions.fromJson(
+          _json['booleanPropertyOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('datePropertyOptions')) {
-      datePropertyOptions =
-          DatePropertyOptions.fromJson(_json['datePropertyOptions']);
+      datePropertyOptions = DatePropertyOptions.fromJson(
+          _json['datePropertyOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayOptions')) {
-      displayOptions = PropertyDisplayOptions.fromJson(_json['displayOptions']);
+      displayOptions = PropertyDisplayOptions.fromJson(
+          _json['displayOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doublePropertyOptions')) {
-      doublePropertyOptions =
-          DoublePropertyOptions.fromJson(_json['doublePropertyOptions']);
+      doublePropertyOptions = DoublePropertyOptions.fromJson(
+          _json['doublePropertyOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enumPropertyOptions')) {
-      enumPropertyOptions =
-          EnumPropertyOptions.fromJson(_json['enumPropertyOptions']);
+      enumPropertyOptions = EnumPropertyOptions.fromJson(
+          _json['enumPropertyOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('htmlPropertyOptions')) {
-      htmlPropertyOptions =
-          HtmlPropertyOptions.fromJson(_json['htmlPropertyOptions']);
+      htmlPropertyOptions = HtmlPropertyOptions.fromJson(
+          _json['htmlPropertyOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('integerPropertyOptions')) {
-      integerPropertyOptions =
-          IntegerPropertyOptions.fromJson(_json['integerPropertyOptions']);
+      integerPropertyOptions = IntegerPropertyOptions.fromJson(
+          _json['integerPropertyOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isFacetable')) {
       isFacetable = _json['isFacetable'] as core.bool;
@@ -7038,16 +7217,18 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('objectPropertyOptions')) {
-      objectPropertyOptions =
-          ObjectPropertyOptions.fromJson(_json['objectPropertyOptions']);
+      objectPropertyOptions = ObjectPropertyOptions.fromJson(
+          _json['objectPropertyOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textPropertyOptions')) {
-      textPropertyOptions =
-          TextPropertyOptions.fromJson(_json['textPropertyOptions']);
+      textPropertyOptions = TextPropertyOptions.fromJson(
+          _json['textPropertyOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampPropertyOptions')) {
-      timestampPropertyOptions =
-          TimestampPropertyOptions.fromJson(_json['timestampPropertyOptions']);
+      timestampPropertyOptions = TimestampPropertyOptions.fromJson(
+          _json['timestampPropertyOptions']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7212,7 +7393,8 @@
       queue = _json['queue'] as core.String;
     }
     if (_json.containsKey('repositoryError')) {
-      repositoryError = RepositoryError.fromJson(_json['repositoryError']);
+      repositoryError = RepositoryError.fromJson(
+          _json['repositoryError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structuredDataHash')) {
       structuredDataHash = _json['structuredDataHash'] as core.String;
@@ -7267,10 +7449,12 @@
       connectorName = _json['connectorName'] as core.String;
     }
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('item')) {
-      item = PushItem.fromJson(_json['item']);
+      item = PushItem.fromJson(
+          _json['item'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7597,14 +7781,16 @@
     }
     if (_json.containsKey('operators')) {
       operators = (_json['operators'] as core.List)
-          .map<QueryOperator>((value) => QueryOperator.fromJson(value))
+          .map<QueryOperator>((value) => QueryOperator.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shortName')) {
       shortName = _json['shortName'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7729,7 +7915,8 @@
 
   RequestOptions.fromJson(core.Map _json) {
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -7768,7 +7955,8 @@
 
   ResetSearchApplicationRequest.fromJson(core.Map _json) {
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7820,20 +8008,24 @@
 
   RestrictItem.fromJson(core.Map _json) {
     if (_json.containsKey('driveFollowUpRestrict')) {
-      driveFollowUpRestrict =
-          DriveFollowUpRestrict.fromJson(_json['driveFollowUpRestrict']);
+      driveFollowUpRestrict = DriveFollowUpRestrict.fromJson(
+          _json['driveFollowUpRestrict']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveLocationRestrict')) {
-      driveLocationRestrict =
-          DriveLocationRestrict.fromJson(_json['driveLocationRestrict']);
+      driveLocationRestrict = DriveLocationRestrict.fromJson(
+          _json['driveLocationRestrict']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveMimeTypeRestrict')) {
-      driveMimeTypeRestrict =
-          DriveMimeTypeRestrict.fromJson(_json['driveMimeTypeRestrict']);
+      driveMimeTypeRestrict = DriveMimeTypeRestrict.fromJson(
+          _json['driveMimeTypeRestrict']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveTimeSpanRestrict')) {
-      driveTimeSpanRestrict =
-          DriveTimeSpanRestrict.fromJson(_json['driveTimeSpanRestrict']);
+      driveTimeSpanRestrict = DriveTimeSpanRestrict.fromJson(
+          _json['driveTimeSpanRestrict']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchOperator')) {
       searchOperator = _json['searchOperator'] as core.String;
@@ -7871,7 +8063,8 @@
   ResultCounts.fromJson(core.Map _json) {
     if (_json.containsKey('sourceResultCounts')) {
       sourceResultCounts = (_json['sourceResultCounts'] as core.List)
-          .map<SourceResultCount>((value) => SourceResultCount.fromJson(value))
+          .map<SourceResultCount>((value) => SourceResultCount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7929,7 +8122,8 @@
       operatorName = _json['operatorName'] as core.String;
     }
     if (_json.containsKey('property')) {
-      property = NamedProperty.fromJson(_json['property']);
+      property = NamedProperty.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7957,8 +8151,8 @@
   ResultDisplayLine.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<ResultDisplayField>(
-              (value) => ResultDisplayField.fromJson(value))
+          .map<ResultDisplayField>((value) => ResultDisplayField.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7984,7 +8178,8 @@
   ResultDisplayMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('metalines')) {
       metalines = (_json['metalines'] as core.List)
-          .map<ResultDisplayLine>((value) => ResultDisplayLine.fromJson(value))
+          .map<ResultDisplayLine>((value) => ResultDisplayLine.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectTypeLabel')) {
@@ -8050,7 +8245,8 @@
   Schema.fromJson(core.Map _json) {
     if (_json.containsKey('objectDefinitions')) {
       objectDefinitions = (_json['objectDefinitions'] as core.List)
-          .map<ObjectDefinition>((value) => ObjectDefinition.fromJson(value))
+          .map<ObjectDefinition>((value) => ObjectDefinition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operationIds')) {
@@ -8144,17 +8340,19 @@
   SearchApplication.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceRestrictions')) {
       dataSourceRestrictions = (_json['dataSourceRestrictions'] as core.List)
-          .map<DataSourceRestriction>(
-              (value) => DataSourceRestriction.fromJson(value))
+          .map<DataSourceRestriction>((value) => DataSourceRestriction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('defaultFacetOptions')) {
       defaultFacetOptions = (_json['defaultFacetOptions'] as core.List)
-          .map<FacetOptions>((value) => FacetOptions.fromJson(value))
+          .map<FacetOptions>((value) => FacetOptions.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('defaultSortOptions')) {
-      defaultSortOptions = SortOptions.fromJson(_json['defaultSortOptions']);
+      defaultSortOptions = SortOptions.fromJson(
+          _json['defaultSortOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -8168,11 +8366,13 @@
           .toList();
     }
     if (_json.containsKey('scoringConfig')) {
-      scoringConfig = ScoringConfig.fromJson(_json['scoringConfig']);
+      scoringConfig = ScoringConfig.fromJson(
+          _json['scoringConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceConfig')) {
       sourceConfig = (_json['sourceConfig'] as core.List)
-          .map<SourceConfig>((value) => SourceConfig.fromJson(value))
+          .map<SourceConfig>((value) => SourceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8220,12 +8420,13 @@
 
   SearchApplicationQueryStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryCountByStatus')) {
       queryCountByStatus = (_json['queryCountByStatus'] as core.List)
-          .map<QueryCountByStatus>(
-              (value) => QueryCountByStatus.fromJson(value))
+          .map<QueryCountByStatus>((value) => QueryCountByStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8255,7 +8456,8 @@
 
   SearchApplicationSessionStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchSessionsCount')) {
       searchSessionsCount = _json['searchSessionsCount'] as core.String;
@@ -8292,7 +8494,8 @@
 
   SearchApplicationUserStats.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oneDayActiveUsersCount')) {
       oneDayActiveUsersCount = _json['oneDayActiveUsersCount'] as core.String;
@@ -8340,7 +8543,8 @@
 
   SearchItemsByViewUrlRequest.fromJson(core.Map _json) {
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageToken')) {
       pageToken = _json['pageToken'] as core.String;
@@ -8377,7 +8581,8 @@
   SearchItemsByViewUrlResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Item>((value) => Item.fromJson(value))
+          .map<Item>((value) =>
+              Item.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8454,13 +8659,14 @@
   SearchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceRestrictions')) {
       dataSourceRestrictions = (_json['dataSourceRestrictions'] as core.List)
-          .map<DataSourceRestriction>(
-              (value) => DataSourceRestriction.fromJson(value))
+          .map<DataSourceRestriction>((value) => DataSourceRestriction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('facetOptions')) {
       facetOptions = (_json['facetOptions'] as core.List)
-          .map<FacetOptions>((value) => FacetOptions.fromJson(value))
+          .map<FacetOptions>((value) => FacetOptions.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageSize')) {
@@ -8471,13 +8677,16 @@
     }
     if (_json.containsKey('queryInterpretationOptions')) {
       queryInterpretationOptions = QueryInterpretationOptions.fromJson(
-          _json['queryInterpretationOptions']);
+          _json['queryInterpretationOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestOptions')) {
-      requestOptions = RequestOptions.fromJson(_json['requestOptions']);
+      requestOptions = RequestOptions.fromJson(
+          _json['requestOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortOptions')) {
-      sortOptions = SortOptions.fromJson(_json['sortOptions']);
+      sortOptions = SortOptions.fromJson(
+          _json['sortOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('start')) {
       start = _json['start'] as core.int;
@@ -8557,22 +8766,25 @@
 
   SearchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('debugInfo')) {
-      debugInfo = ResponseDebugInfo.fromJson(_json['debugInfo']);
+      debugInfo = ResponseDebugInfo.fromJson(
+          _json['debugInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errorInfo')) {
-      errorInfo = ErrorInfo.fromJson(_json['errorInfo']);
+      errorInfo = ErrorInfo.fromJson(
+          _json['errorInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('facetResults')) {
       facetResults = (_json['facetResults'] as core.List)
-          .map<FacetResult>((value) => FacetResult.fromJson(value))
+          .map<FacetResult>((value) => FacetResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('hasMoreResults')) {
       hasMoreResults = _json['hasMoreResults'] as core.bool;
     }
     if (_json.containsKey('queryInterpretation')) {
-      queryInterpretation =
-          QueryInterpretation.fromJson(_json['queryInterpretation']);
+      queryInterpretation = QueryInterpretation.fromJson(
+          _json['queryInterpretation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resultCountEstimate')) {
       resultCountEstimate = _json['resultCountEstimate'] as core.String;
@@ -8581,21 +8793,25 @@
       resultCountExact = _json['resultCountExact'] as core.String;
     }
     if (_json.containsKey('resultCounts')) {
-      resultCounts = ResultCounts.fromJson(_json['resultCounts']);
+      resultCounts = ResultCounts.fromJson(
+          _json['resultCounts'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<SearchResult>((value) => SearchResult.fromJson(value))
+          .map<SearchResult>((value) => SearchResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('spellResults')) {
       spellResults = (_json['spellResults'] as core.List)
-          .map<SpellResult>((value) => SpellResult.fromJson(value))
+          .map<SpellResult>((value) => SpellResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('structuredResults')) {
       structuredResults = (_json['structuredResults'] as core.List)
-          .map<StructuredResult>((value) => StructuredResult.fromJson(value))
+          .map<StructuredResult>((value) => StructuredResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8670,17 +8886,21 @@
   SearchResult.fromJson(core.Map _json) {
     if (_json.containsKey('clusteredResults')) {
       clusteredResults = (_json['clusteredResults'] as core.List)
-          .map<SearchResult>((value) => SearchResult.fromJson(value))
+          .map<SearchResult>((value) => SearchResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('debugInfo')) {
-      debugInfo = ResultDebugInfo.fromJson(_json['debugInfo']);
+      debugInfo = ResultDebugInfo.fromJson(
+          _json['debugInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata = Metadata.fromJson(_json['metadata']);
+      metadata = Metadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('snippet')) {
-      snippet = Snippet.fromJson(_json['snippet']);
+      snippet = Snippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -8730,7 +8950,8 @@
   Snippet.fromJson(core.Map _json) {
     if (_json.containsKey('matchRanges')) {
       matchRanges = (_json['matchRanges'] as core.List)
-          .map<MatchRange>((value) => MatchRange.fromJson(value))
+          .map<MatchRange>((value) =>
+              MatchRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('snippet')) {
@@ -8843,13 +9064,16 @@
 
   SourceConfig.fromJson(core.Map _json) {
     if (_json.containsKey('crowdingConfig')) {
-      crowdingConfig = SourceCrowdingConfig.fromJson(_json['crowdingConfig']);
+      crowdingConfig = SourceCrowdingConfig.fromJson(
+          _json['crowdingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scoringConfig')) {
-      scoringConfig = SourceScoringConfig.fromJson(_json['scoringConfig']);
+      scoringConfig = SourceScoringConfig.fromJson(
+          _json['scoringConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8932,7 +9156,8 @@
       resultCountExact = _json['resultCountExact'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9018,7 +9243,8 @@
       connectorName = _json['connectorName'] as core.String;
     }
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9066,7 +9292,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -9100,7 +9327,8 @@
   StructuredDataObject.fromJson(core.Map _json) {
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<NamedProperty>((value) => NamedProperty.fromJson(value))
+          .map<NamedProperty>((value) => NamedProperty.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9123,7 +9351,8 @@
 
   StructuredResult.fromJson(core.Map _json) {
     if (_json.containsKey('person')) {
-      person = Person.fromJson(_json['person']);
+      person = Person.fromJson(
+          _json['person'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9157,15 +9386,16 @@
   SuggestRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceRestrictions')) {
       dataSourceRestrictions = (_json['dataSourceRestrictions'] as core.List)
-          .map<DataSourceRestriction>(
-              (value) => DataSourceRestriction.fromJson(value))
+          .map<DataSourceRestriction>((value) => DataSourceRestriction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('query')) {
       query = _json['query'] as core.String;
     }
     if (_json.containsKey('requestOptions')) {
-      requestOptions = RequestOptions.fromJson(_json['requestOptions']);
+      requestOptions = RequestOptions.fromJson(
+          _json['requestOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9195,7 +9425,8 @@
   SuggestResponse.fromJson(core.Map _json) {
     if (_json.containsKey('suggestResults')) {
       suggestResults = (_json['suggestResults'] as core.List)
-          .map<SuggestResult>((value) => SuggestResult.fromJson(value))
+          .map<SuggestResult>((value) => SuggestResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9231,13 +9462,16 @@
 
   SuggestResult.fromJson(core.Map _json) {
     if (_json.containsKey('peopleSuggestion')) {
-      peopleSuggestion = PeopleSuggestion.fromJson(_json['peopleSuggestion']);
+      peopleSuggestion = PeopleSuggestion.fromJson(
+          _json['peopleSuggestion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('querySuggestion')) {
-      querySuggestion = QuerySuggestion.fromJson(_json['querySuggestion']);
+      querySuggestion = QuerySuggestion.fromJson(
+          _json['querySuggestion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestedQuery')) {
       suggestedQuery = _json['suggestedQuery'] as core.String;
@@ -9323,11 +9557,12 @@
 
   TextPropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions = TextOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = TextOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retrievalImportance')) {
-      retrievalImportance =
-          RetrievalImportance.fromJson(_json['retrievalImportance']);
+      retrievalImportance = RetrievalImportance.fromJson(
+          _json['retrievalImportance'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9438,8 +9673,8 @@
 
   TimestampPropertyOptions.fromJson(core.Map _json) {
     if (_json.containsKey('operatorOptions')) {
-      operatorOptions =
-          TimestampOperatorOptions.fromJson(_json['operatorOptions']);
+      operatorOptions = TimestampOperatorOptions.fromJson(
+          _json['operatorOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9498,7 +9733,8 @@
 
   UnmappedIdentity.fromJson(core.Map _json) {
     if (_json.containsKey('externalIdentity')) {
-      externalIdentity = Principal.fromJson(_json['externalIdentity']);
+      externalIdentity = Principal.fromJson(
+          _json['externalIdentity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resolutionStatusCode')) {
       resolutionStatusCode = _json['resolutionStatusCode'] as core.String;
@@ -9535,7 +9771,8 @@
       connectorName = _json['connectorName'] as core.String;
     }
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queue')) {
       queue = _json['queue'] as core.String;
@@ -9566,10 +9803,12 @@
 
   UpdateDataSourceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('source')) {
-      source = DataSource.fromJson(_json['source']);
+      source = DataSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9600,10 +9839,12 @@
 
   UpdateSchemaRequest.fromJson(core.Map _json) {
     if (_json.containsKey('debugOptions')) {
-      debugOptions = DebugOptions.fromJson(_json['debugOptions']);
+      debugOptions = DebugOptions.fromJson(
+          _json['debugOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schema')) {
-      schema = Schema.fromJson(_json['schema']);
+      schema = Schema.fromJson(
+          _json['schema'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('validateOnly')) {
       validateOnly = _json['validateOnly'] as core.bool;
@@ -9665,7 +9906,8 @@
       booleanValue = _json['booleanValue'] as core.bool;
     }
     if (_json.containsKey('dateValue')) {
-      dateValue = Date.fromJson(_json['dateValue']);
+      dateValue = Date.fromJson(
+          _json['dateValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doubleValue')) {
       doubleValue = (_json['doubleValue'] as core.num).toDouble();
@@ -9725,7 +9967,8 @@
       operatorName = _json['operatorName'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = Value.fromJson(_json['value']);
+      value =
+          Value.fromJson(_json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/cloudshell/v1.dart b/generated/googleapis/lib/cloudshell/v1.dart
index 141558c..245161f 100644
--- a/generated/googleapis/lib/cloudshell/v1.dart
+++ b/generated/googleapis/lib/cloudshell/v1.dart
@@ -114,7 +114,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -166,7 +168,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -217,7 +221,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -292,7 +298,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -368,7 +377,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sends OAuth credentials to a running environment on behalf of a user. When
@@ -429,7 +440,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an environment. Returns NOT_FOUND if the environment does not exist.
@@ -480,7 +493,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a public SSH key from an environment. Clients will no longer be
@@ -541,7 +557,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts an existing environment, allowing clients to connect to it. The
@@ -603,7 +621,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -941,7 +961,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1002,11 +1023,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1014,7 +1037,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1176,7 +1200,8 @@
 
   StartEnvironmentResponse.fromJson(core.Map _json) {
     if (_json.containsKey('environment')) {
-      environment = Environment.fromJson(_json['environment']);
+      environment = Environment.fromJson(
+          _json['environment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1221,7 +1246,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/cloudtasks/v2.dart b/generated/googleapis/lib/cloudtasks/v2.dart
index c5a9872..01564f0 100644
--- a/generated/googleapis/lib/cloudtasks/v2.dart
+++ b/generated/googleapis/lib/cloudtasks/v2.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -179,7 +181,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -254,7 +259,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Queue.fromJson(data));
+    return _response.then(
+      (data) => Queue.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a queue. This command will delete the queue even if it has tasks
@@ -310,7 +317,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a queue.
@@ -360,7 +369,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Queue.fromJson(data));
+    return _response.then(
+      (data) => Queue.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a Queue. Returns an empty policy if the
@@ -422,7 +433,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists queues. Queues are returned in lexicographical order.
@@ -503,7 +516,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListQueuesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListQueuesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a queue. This method creates the queue if it does not exist and
@@ -584,7 +600,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Queue.fromJson(data));
+    return _response.then(
+      (data) => Queue.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Pauses the queue. If a queue is paused then the system will stop
@@ -643,7 +661,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Queue.fromJson(data));
+    return _response.then(
+      (data) => Queue.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Purges a queue by deleting all of its tasks. All tasks created before this
@@ -702,7 +722,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Queue.fromJson(data));
+    return _response.then(
+      (data) => Queue.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resume a queue. This method resumes a queue after it has been PAUSED or
@@ -764,7 +786,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Queue.fromJson(data));
+    return _response.then(
+      (data) => Queue.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy for a Queue. Replaces any existing policy.
@@ -828,7 +852,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on a Queue. If the resource does not
@@ -891,7 +917,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -957,7 +986,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a task. A task can be deleted if it is scheduled or dispatched. A
@@ -1010,7 +1041,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a task.
@@ -1083,7 +1116,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the tasks in a queue. By default, only the BASIC view is retrieved
@@ -1177,7 +1212,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTasksResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTasksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Forces a task to run now. When this method is called, Cloud Tasks will
@@ -1246,7 +1284,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1357,14 +1397,16 @@
 
   AppEngineHttpRequest.fromJson(core.Map _json) {
     if (_json.containsKey('appEngineRouting')) {
-      appEngineRouting = AppEngineRouting.fromJson(_json['appEngineRouting']);
+      appEngineRouting = AppEngineRouting.fromJson(
+          _json['appEngineRouting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('body')) {
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('httpMethod')) {
@@ -1509,7 +1551,8 @@
       dispatchTime = _json['dispatchTime'] as core.String;
     }
     if (_json.containsKey('responseStatus')) {
-      responseStatus = Status.fromJson(_json['responseStatus']);
+      responseStatus = Status.fromJson(
+          _json['responseStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responseTime')) {
       responseTime = _json['responseTime'] as core.String;
@@ -1594,7 +1637,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1675,7 +1719,8 @@
       responseView = _json['responseView'] as core.String;
     }
     if (_json.containsKey('task')) {
-      task = Task.fromJson(_json['task']);
+      task =
+          Task.fromJson(_json['task'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1787,7 +1832,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1918,17 +1964,20 @@
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('httpMethod')) {
       httpMethod = _json['httpMethod'] as core.String;
     }
     if (_json.containsKey('oauthToken')) {
-      oauthToken = OAuthToken.fromJson(_json['oauthToken']);
+      oauthToken = OAuthToken.fromJson(
+          _json['oauthToken'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oidcToken')) {
-      oidcToken = OidcToken.fromJson(_json['oidcToken']);
+      oidcToken = OidcToken.fromJson(
+          _json['oidcToken'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -1972,7 +2021,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2011,7 +2061,8 @@
     }
     if (_json.containsKey('queues')) {
       queues = (_json['queues'] as core.List)
-          .map<Queue>((value) => Queue.fromJson(value))
+          .map<Queue>((value) =>
+              Queue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2046,7 +2097,8 @@
     }
     if (_json.containsKey('tasks')) {
       tasks = (_json['tasks'] as core.List)
-          .map<Task>((value) => Task.fromJson(value))
+          .map<Task>((value) =>
+              Task.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2095,7 +2147,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -2103,7 +2156,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2300,7 +2354,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -2429,8 +2484,9 @@
 
   Queue.fromJson(core.Map _json) {
     if (_json.containsKey('appEngineRoutingOverride')) {
-      appEngineRoutingOverride =
-          AppEngineRouting.fromJson(_json['appEngineRoutingOverride']);
+      appEngineRoutingOverride = AppEngineRouting.fromJson(
+          _json['appEngineRoutingOverride']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2439,14 +2495,17 @@
       purgeTime = _json['purgeTime'] as core.String;
     }
     if (_json.containsKey('rateLimits')) {
-      rateLimits = RateLimits.fromJson(_json['rateLimits']);
+      rateLimits = RateLimits.fromJson(
+          _json['rateLimits'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retryConfig')) {
-      retryConfig = RetryConfig.fromJson(_json['retryConfig']);
+      retryConfig = RetryConfig.fromJson(
+          _json['retryConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stackdriverLoggingConfig')) {
-      stackdriverLoggingConfig =
-          StackdriverLoggingConfig.fromJson(_json['stackdriverLoggingConfig']);
+      stackdriverLoggingConfig = StackdriverLoggingConfig.fromJson(
+          _json['stackdriverLoggingConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -2710,7 +2769,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2781,7 +2841,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -2895,8 +2956,8 @@
 
   Task.fromJson(core.Map _json) {
     if (_json.containsKey('appEngineHttpRequest')) {
-      appEngineHttpRequest =
-          AppEngineHttpRequest.fromJson(_json['appEngineHttpRequest']);
+      appEngineHttpRequest = AppEngineHttpRequest.fromJson(
+          _json['appEngineHttpRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -2908,13 +2969,16 @@
       dispatchDeadline = _json['dispatchDeadline'] as core.String;
     }
     if (_json.containsKey('firstAttempt')) {
-      firstAttempt = Attempt.fromJson(_json['firstAttempt']);
+      firstAttempt = Attempt.fromJson(
+          _json['firstAttempt'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpRequest')) {
-      httpRequest = HttpRequest.fromJson(_json['httpRequest']);
+      httpRequest = HttpRequest.fromJson(
+          _json['httpRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastAttempt')) {
-      lastAttempt = Attempt.fromJson(_json['lastAttempt']);
+      lastAttempt = Attempt.fromJson(
+          _json['lastAttempt'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
diff --git a/generated/googleapis/lib/cloudtrace/v2.dart b/generated/googleapis/lib/cloudtrace/v2.dart
index 6dedf5a..2bb62df 100644
--- a/generated/googleapis/lib/cloudtrace/v2.dart
+++ b/generated/googleapis/lib/cloudtrace/v2.dart
@@ -127,7 +127,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -194,7 +196,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Span.fromJson(data));
+    return _response.then(
+      (data) => Span.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -212,10 +216,12 @@
 
   Annotation.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = Attributes.fromJson(_json['attributes']);
+      attributes = Attributes.fromJson(
+          _json['attributes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
-      description = TruncatableString.fromJson(_json['description']);
+      description = TruncatableString.fromJson(
+          _json['description'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -252,7 +258,8 @@
       intValue = _json['intValue'] as core.String;
     }
     if (_json.containsKey('stringValue')) {
-      stringValue = TruncatableString.fromJson(_json['stringValue']);
+      stringValue = TruncatableString.fromJson(
+          _json['stringValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -290,8 +297,10 @@
   Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('attributeMap')) {
       attributeMap = commons.mapMap<core.Map, AttributeValue>(
-          _json['attributeMap'].cast<core.String, core.Map>(),
-          (core.Map item) => AttributeValue.fromJson(item));
+          (_json['attributeMap'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => AttributeValue.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('droppedAttributesCount')) {
       droppedAttributesCount = _json['droppedAttributesCount'] as core.int;
@@ -323,7 +332,8 @@
   BatchWriteSpansRequest.fromJson(core.Map _json) {
     if (_json.containsKey('spans')) {
       spans = (_json['spans'] as core.List)
-          .map<Span>((value) => Span.fromJson(value))
+          .map<Span>((value) =>
+              Span.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -381,7 +391,8 @@
 
   Link.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = Attributes.fromJson(_json['attributes']);
+      attributes = Attributes.fromJson(
+          _json['attributes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spanId')) {
       spanId = _json['spanId'] as core.String;
@@ -430,7 +441,8 @@
     }
     if (_json.containsKey('link')) {
       link = (_json['link'] as core.List)
-          .map<Link>((value) => Link.fromJson(value))
+          .map<Link>((value) =>
+              Link.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -517,10 +529,12 @@
 
   Module.fromJson(core.Map _json) {
     if (_json.containsKey('buildId')) {
-      buildId = TruncatableString.fromJson(_json['buildId']);
+      buildId = TruncatableString.fromJson(
+          _json['buildId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('module')) {
-      module = TruncatableString.fromJson(_json['module']);
+      module = TruncatableString.fromJson(
+          _json['module'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -627,19 +641,22 @@
 
   Span.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = Attributes.fromJson(_json['attributes']);
+      attributes = Attributes.fromJson(
+          _json['attributes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('childSpanCount')) {
       childSpanCount = _json['childSpanCount'] as core.int;
     }
     if (_json.containsKey('displayName')) {
-      displayName = TruncatableString.fromJson(_json['displayName']);
+      displayName = TruncatableString.fromJson(
+          _json['displayName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('links')) {
-      links = Links.fromJson(_json['links']);
+      links =
+          Links.fromJson(_json['links'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -657,16 +674,19 @@
       spanKind = _json['spanKind'] as core.String;
     }
     if (_json.containsKey('stackTrace')) {
-      stackTrace = StackTrace.fromJson(_json['stackTrace']);
+      stackTrace = StackTrace.fromJson(
+          _json['stackTrace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeEvents')) {
-      timeEvents = TimeEvents.fromJson(_json['timeEvents']);
+      timeEvents = TimeEvents.fromJson(
+          _json['timeEvents'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -753,23 +773,27 @@
       columnNumber = _json['columnNumber'] as core.String;
     }
     if (_json.containsKey('fileName')) {
-      fileName = TruncatableString.fromJson(_json['fileName']);
+      fileName = TruncatableString.fromJson(
+          _json['fileName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('functionName')) {
-      functionName = TruncatableString.fromJson(_json['functionName']);
+      functionName = TruncatableString.fromJson(
+          _json['functionName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineNumber')) {
       lineNumber = _json['lineNumber'] as core.String;
     }
     if (_json.containsKey('loadModule')) {
-      loadModule = Module.fromJson(_json['loadModule']);
+      loadModule = Module.fromJson(
+          _json['loadModule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('originalFunctionName')) {
-      originalFunctionName =
-          TruncatableString.fromJson(_json['originalFunctionName']);
+      originalFunctionName = TruncatableString.fromJson(
+          _json['originalFunctionName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceVersion')) {
-      sourceVersion = TruncatableString.fromJson(_json['sourceVersion']);
+      sourceVersion = TruncatableString.fromJson(
+          _json['sourceVersion'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -817,7 +841,8 @@
     }
     if (_json.containsKey('frame')) {
       frame = (_json['frame'] as core.List)
-          .map<StackFrame>((value) => StackFrame.fromJson(value))
+          .map<StackFrame>((value) =>
+              StackFrame.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -851,7 +876,8 @@
 
   StackTrace.fromJson(core.Map _json) {
     if (_json.containsKey('stackFrames')) {
-      stackFrames = StackFrames.fromJson(_json['stackFrames']);
+      stackFrames = StackFrames.fromJson(
+          _json['stackFrames'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stackTraceHashId')) {
       stackTraceHashId = _json['stackTraceHashId'] as core.String;
@@ -902,7 +928,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -941,10 +968,12 @@
 
   TimeEvent.fromJson(core.Map _json) {
     if (_json.containsKey('annotation')) {
-      annotation = Annotation.fromJson(_json['annotation']);
+      annotation = Annotation.fromJson(
+          _json['annotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('messageEvent')) {
-      messageEvent = MessageEvent.fromJson(_json['messageEvent']);
+      messageEvent = MessageEvent.fromJson(
+          _json['messageEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('time')) {
       time = _json['time'] as core.String;
@@ -993,7 +1022,8 @@
     }
     if (_json.containsKey('timeEvent')) {
       timeEvent = (_json['timeEvent'] as core.List)
-          .map<TimeEvent>((value) => TimeEvent.fromJson(value))
+          .map<TimeEvent>((value) =>
+              TimeEvent.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/composer/v1.dart b/generated/googleapis/lib/composer/v1.dart
index a48c0fa..f65dad2 100644
--- a/generated/googleapis/lib/composer/v1.dart
+++ b/generated/googleapis/lib/composer/v1.dart
@@ -131,7 +131,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete an environment.
@@ -182,7 +184,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get an existing environment.
@@ -233,7 +237,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List environments.
@@ -298,7 +305,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListEnvironmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListEnvironmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an environment.
@@ -424,7 +434,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -496,7 +508,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListImageVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListImageVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -556,7 +571,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -608,7 +625,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -684,7 +703,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -751,14 +773,16 @@
 
   Environment.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = EnvironmentConfig.fromJson(_json['config']);
+      config = EnvironmentConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -845,17 +869,20 @@
       gkeCluster = _json['gkeCluster'] as core.String;
     }
     if (_json.containsKey('nodeConfig')) {
-      nodeConfig = NodeConfig.fromJson(_json['nodeConfig']);
+      nodeConfig = NodeConfig.fromJson(
+          _json['nodeConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nodeCount')) {
       nodeCount = _json['nodeCount'] as core.int;
     }
     if (_json.containsKey('privateEnvironmentConfig')) {
-      privateEnvironmentConfig =
-          PrivateEnvironmentConfig.fromJson(_json['privateEnvironmentConfig']);
+      privateEnvironmentConfig = PrivateEnvironmentConfig.fromJson(
+          _json['privateEnvironmentConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareConfig')) {
-      softwareConfig = SoftwareConfig.fromJson(_json['softwareConfig']);
+      softwareConfig = SoftwareConfig.fromJson(
+          _json['softwareConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1024,7 +1051,8 @@
   ListEnvironmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('environments')) {
       environments = (_json['environments'] as core.List)
-          .map<Environment>((value) => Environment.fromJson(value))
+          .map<Environment>((value) => Environment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1058,7 +1086,8 @@
   ListImageVersionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('imageVersions')) {
       imageVersions = (_json['imageVersions'] as core.List)
-          .map<ImageVersion>((value) => ImageVersion.fromJson(value))
+          .map<ImageVersion>((value) => ImageVersion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1095,7 +1124,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1198,8 +1228,8 @@
       diskSizeGb = _json['diskSizeGb'] as core.int;
     }
     if (_json.containsKey('ipAllocationPolicy')) {
-      ipAllocationPolicy =
-          IPAllocationPolicy.fromJson(_json['ipAllocationPolicy']);
+      ipAllocationPolicy = IPAllocationPolicy.fromJson(
+          _json['ipAllocationPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -1305,11 +1335,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1317,7 +1349,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1508,8 +1541,8 @@
       enablePrivateEnvironment = _json['enablePrivateEnvironment'] as core.bool;
     }
     if (_json.containsKey('privateClusterConfig')) {
-      privateClusterConfig =
-          PrivateClusterConfig.fromJson(_json['privateClusterConfig']);
+      privateClusterConfig = PrivateClusterConfig.fromJson(
+          _json['privateClusterConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webServerIpv4CidrBlock')) {
       webServerIpv4CidrBlock = _json['webServerIpv4CidrBlock'] as core.String;
@@ -1604,12 +1637,15 @@
   SoftwareConfig.fromJson(core.Map _json) {
     if (_json.containsKey('airflowConfigOverrides')) {
       airflowConfigOverrides = commons.mapMap<core.String, core.String>(
-          _json['airflowConfigOverrides'].cast<core.String, core.String>(),
+          (_json['airflowConfigOverrides']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('envVariables')) {
       envVariables = commons.mapMap<core.String, core.String>(
-          _json['envVariables'].cast<core.String, core.String>(),
+          (_json['envVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('imageVersion')) {
@@ -1617,7 +1653,8 @@
     }
     if (_json.containsKey('pypiPackages')) {
       pypiPackages = commons.mapMap<core.String, core.String>(
-          _json['pypiPackages'].cast<core.String, core.String>(),
+          (_json['pypiPackages'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('pythonVersion')) {
@@ -1678,7 +1715,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/compute/v1.dart b/generated/googleapis/lib/compute/v1.dart
index 829b27e..75eee17 100644
--- a/generated/googleapis/lib/compute/v1.dart
+++ b/generated/googleapis/lib/compute/v1.dart
@@ -324,8 +324,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AcceleratorTypeAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => AcceleratorTypeAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified accelerator type.
@@ -394,7 +396,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AcceleratorType.fromJson(data));
+    return _response.then(
+      (data) =>
+          AcceleratorType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of accelerator types that are available to the specified
@@ -524,7 +529,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AcceleratorTypeList.fromJson(data));
+    return _response.then(
+      (data) => AcceleratorTypeList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -661,7 +669,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AddressAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => AddressAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified address resource.
@@ -747,7 +758,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified address resource.
@@ -816,7 +829,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Address.fromJson(data));
+    return _response.then(
+      (data) => Address.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an address resource in the specified project by using the data
@@ -900,7 +915,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of addresses contained within the specified region.
@@ -1029,7 +1046,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AddressList.fromJson(data));
+    return _response.then(
+      (data) =>
+          AddressList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1167,7 +1187,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalerAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => AutoscalerAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified autoscaler.
@@ -1253,7 +1276,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified autoscaler resource. Gets a list of available
@@ -1323,7 +1348,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Autoscaler.fromJson(data));
+    return _response.then(
+      (data) =>
+          Autoscaler.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an autoscaler in the specified project using the data included in
@@ -1407,7 +1435,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of autoscalers contained within the specified zone.
@@ -1536,7 +1566,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalerList.fromJson(data));
+    return _response.then(
+      (data) =>
+          AutoscalerList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an autoscaler in the specified project using the data included in
@@ -1629,7 +1662,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an autoscaler in the specified project using the data included in
@@ -1721,7 +1756,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1811,7 +1848,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified BackendBucket resource.
@@ -1888,7 +1927,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a key for validating requests with signed URLs for this backend
@@ -1973,7 +2014,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified BackendBucket resource. Gets a list of available
@@ -2034,7 +2077,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendBucket.fromJson(data));
+    return _response.then(
+      (data) =>
+          BackendBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a BackendBucket resource in the specified project using the data
@@ -2108,7 +2154,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of BackendBucket resources available to the specified
@@ -2228,7 +2276,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendBucketList.fromJson(data));
+    return _response.then(
+      (data) => BackendBucketList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified BackendBucket resource with the data included in the
@@ -2313,7 +2364,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified BackendBucket resource with the data included in the
@@ -2397,7 +2450,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2487,7 +2542,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of all BackendService resources, regional and global,
@@ -2620,8 +2677,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BackendServiceAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => BackendServiceAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified BackendService resource.
@@ -2698,7 +2757,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a key for validating requests with signed URLs for this backend
@@ -2783,7 +2844,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified BackendService resource. Gets a list of available
@@ -2844,7 +2907,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendService.fromJson(data));
+    return _response.then(
+      (data) =>
+          BackendService.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the most recent health check results for this BackendService.
@@ -2916,7 +2982,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendServiceGroupHealth.fromJson(data));
+    return _response.then(
+      (data) => BackendServiceGroupHealth.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a BackendService resource in the specified project using the data
@@ -2992,7 +3061,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of BackendService resources available to the specified
@@ -3113,7 +3184,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendServiceList.fromJson(data));
+    return _response.then(
+      (data) => BackendServiceList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified BackendService resource with the data included in
@@ -3199,7 +3273,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the security policy for the specified backend service.
@@ -3282,7 +3358,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified BackendService resource with the data included in
@@ -3366,7 +3444,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3503,7 +3583,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DiskTypeAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => DiskTypeAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified disk type. Gets a list of available disk types by
@@ -3573,7 +3656,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DiskType.fromJson(data));
+    return _response.then(
+      (data) => DiskType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of disk types available to the specified project.
@@ -3702,7 +3787,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DiskTypeList.fromJson(data));
+    return _response.then(
+      (data) =>
+          DiskTypeList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3802,7 +3890,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an aggregated list of persistent disks.
@@ -3933,7 +4023,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DiskAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => DiskAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a snapshot of a specified persistent disk.
@@ -4035,7 +4128,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified persistent disk. Deleting a disk removes its data
@@ -4122,7 +4217,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a specified persistent disk. Gets a list of available persistent
@@ -4192,7 +4289,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Disk.fromJson(data));
+    return _response.then(
+      (data) => Disk.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -4271,7 +4370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a persistent disk in the specified project using the data in the
@@ -4364,7 +4465,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of persistent disks contained within the specified zone.
@@ -4493,7 +4596,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DiskList.fromJson(data));
+    return _response.then(
+      (data) => DiskList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes resource policies from a disk.
@@ -4586,7 +4691,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resizes the specified persistent disk. You can only increase the size of
@@ -4680,7 +4787,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -4757,7 +4866,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the labels on a disk. To learn more about labels, read the Labeling
@@ -4851,7 +4962,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -4927,7 +5040,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5010,7 +5126,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified externalVpnGateway. Get a list of available
@@ -5070,7 +5188,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ExternalVpnGateway.fromJson(data));
+    return _response.then(
+      (data) => ExternalVpnGateway.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a ExternalVpnGateway in the specified project using the data
@@ -5145,7 +5266,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of ExternalVpnGateway available to the specified
@@ -5266,7 +5389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ExternalVpnGatewayList.fromJson(data));
+    return _response.then(
+      (data) => ExternalVpnGatewayList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the labels on an ExternalVpnGateway. To learn more about labels, read
@@ -5334,7 +5460,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -5401,7 +5529,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5484,7 +5615,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified firewall.
@@ -5544,7 +5677,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Firewall.fromJson(data));
+    return _response.then(
+      (data) => Firewall.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a firewall rule in the specified project using the data included
@@ -5618,7 +5753,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of firewall rules available to the specified project.
@@ -5737,7 +5874,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FirewallList.fromJson(data));
+    return _response.then(
+      (data) =>
+          FirewallList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified firewall rule with the data included in the request.
@@ -5822,7 +5962,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified firewall rule with the data included in the request.
@@ -5907,7 +6049,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6045,8 +6189,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ForwardingRuleAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => ForwardingRuleAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified ForwardingRule resource.
@@ -6132,7 +6278,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified ForwardingRule resource.
@@ -6201,7 +6349,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ForwardingRule.fromJson(data));
+    return _response.then(
+      (data) =>
+          ForwardingRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a ForwardingRule resource in the specified project and region
@@ -6285,7 +6436,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of ForwardingRule resources available to the specified
@@ -6415,7 +6568,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ForwardingRuleList.fromJson(data));
+    return _response.then(
+      (data) => ForwardingRuleList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified forwarding rule with the data included in the
@@ -6510,7 +6666,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes target URL for forwarding rule. The new target should be of the
@@ -6605,7 +6763,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6688,7 +6848,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified address resource. Gets a list of available addresses
@@ -6749,7 +6911,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Address.fromJson(data));
+    return _response.then(
+      (data) => Address.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an address resource in the specified project by using the data
@@ -6823,7 +6987,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of global addresses.
@@ -6942,7 +7108,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AddressList.fromJson(data));
+    return _response.then(
+      (data) =>
+          AddressList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7026,7 +7195,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified GlobalForwardingRule resource. Gets a list of
@@ -7087,7 +7258,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ForwardingRule.fromJson(data));
+    return _response.then(
+      (data) =>
+          ForwardingRule.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a GlobalForwardingRule resource in the specified project using the
@@ -7162,7 +7336,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of GlobalForwardingRule resources available to the
@@ -7283,7 +7459,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ForwardingRuleList.fromJson(data));
+    return _response.then(
+      (data) => ForwardingRuleList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified forwarding rule with the data included in the
@@ -7369,7 +7548,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes target URL for the GlobalForwardingRule resource. The new target
@@ -7455,7 +7636,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7545,7 +7728,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified network endpoint group.Note that the NEG cannot be
@@ -7622,7 +7807,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Detach the network endpoint from the specified network endpoint group.
@@ -7705,7 +7892,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified network endpoint group. Gets a list of available
@@ -7765,7 +7954,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NetworkEndpointGroup.fromJson(data));
+    return _response.then(
+      (data) => NetworkEndpointGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a network endpoint group in the specified project using the
@@ -7840,7 +8032,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of network endpoint groups that are located in the
@@ -7961,7 +8155,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NetworkEndpointGroupList.fromJson(data));
+    return _response.then(
+      (data) => NetworkEndpointGroupList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the network endpoints in the specified network endpoint group.
@@ -8092,7 +8289,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => NetworkEndpointGroupsListNetworkEndpoints.fromJson(data));
+      (data) => NetworkEndpointGroupsListNetworkEndpoints.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8230,7 +8429,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OperationAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => OperationAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified Operations resource.
@@ -8290,7 +8492,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves the specified Operations resource. Gets a list of operations by
@@ -8351,7 +8555,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of Operation resources contained within the specified
@@ -8471,7 +8677,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OperationList.fromJson(data));
+    return _response.then(
+      (data) =>
+          OperationList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Waits for the specified Operation resource to return as `DONE` or for the
@@ -8545,7 +8754,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8684,7 +8895,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HealthChecksAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => HealthChecksAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified HealthCheck resource.
@@ -8761,7 +8975,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified HealthCheck resource. Gets a list of available
@@ -8822,7 +9038,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HealthCheck.fromJson(data));
+    return _response.then(
+      (data) =>
+          HealthCheck.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a HealthCheck resource in the specified project using the data
@@ -8896,7 +9115,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of HealthCheck resources available to the specified
@@ -9016,7 +9237,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HealthCheckList.fromJson(data));
+    return _response.then(
+      (data) =>
+          HealthCheckList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HealthCheck resource in the specified project using the data
@@ -9101,7 +9325,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HealthCheck resource in the specified project using the data
@@ -9185,7 +9411,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9269,7 +9497,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified HttpHealthCheck resource. Gets a list of available
@@ -9330,7 +9560,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpHealthCheck.fromJson(data));
+    return _response.then(
+      (data) =>
+          HttpHealthCheck.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a HttpHealthCheck resource in the specified project using the data
@@ -9405,7 +9638,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of HttpHealthCheck resources available to the specified
@@ -9526,7 +9761,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpHealthCheckList.fromJson(data));
+    return _response.then(
+      (data) => HttpHealthCheckList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HttpHealthCheck resource in the specified project using the data
@@ -9611,7 +9849,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HttpHealthCheck resource in the specified project using the data
@@ -9695,7 +9935,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9779,7 +10021,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified HttpsHealthCheck resource. Gets a list of available
@@ -9840,7 +10084,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpsHealthCheck.fromJson(data));
+    return _response.then(
+      (data) => HttpsHealthCheck.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a HttpsHealthCheck resource in the specified project using the
@@ -9915,7 +10162,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of HttpsHealthCheck resources available to the
@@ -10036,7 +10285,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpsHealthCheckList.fromJson(data));
+    return _response.then(
+      (data) => HttpsHealthCheckList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HttpsHealthCheck resource in the specified project using the
@@ -10121,7 +10373,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HttpsHealthCheck resource in the specified project using the
@@ -10205,7 +10459,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10288,7 +10544,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the deprecation status of an image.
@@ -10374,7 +10632,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified image. Gets a list of available images by making a
@@ -10435,7 +10695,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Image.fromJson(data));
+    return _response.then(
+      (data) => Image.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the latest image that is part of an image family and is not
@@ -10496,7 +10758,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Image.fromJson(data));
+    return _response.then(
+      (data) => Image.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -10566,7 +10830,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an image in the specified project using the data included in the
@@ -10646,7 +10912,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of custom images available to the specified project.
@@ -10770,7 +11038,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImageList.fromJson(data));
+    return _response.then(
+      (data) => ImageList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified image with the data included in the request. Only
@@ -10855,7 +11125,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -10923,7 +11195,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the labels on an image. To learn more about labels, read the Labeling
@@ -10991,7 +11265,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -11058,7 +11334,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11168,7 +11447,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of managed instance groups and groups them by zone.
@@ -11300,8 +11581,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => InstanceGroupManagerAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupManagerAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Applies changes to selected instances on the managed instance group. This
@@ -11377,7 +11660,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates instances with per-instance configs in this managed instance
@@ -11473,7 +11758,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified managed instance group and all of the instances in
@@ -11558,7 +11845,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Flags the specified instances in the managed instance group for immediate
@@ -11660,7 +11949,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes selected per-instance configs for the managed instance group.
@@ -11735,7 +12026,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns all of the details about the specified managed instance group.
@@ -11803,7 +12096,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroupManager.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupManager.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a managed instance group using the information that you specify in
@@ -11894,7 +12190,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of managed instance groups that are contained within the
@@ -12023,7 +12321,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroupManagerList.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupManagerList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all errors thrown by actions on instances for a given managed
@@ -12164,8 +12465,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => InstanceGroupManagersListErrorsResponse.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupManagersListErrorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all of the instances in the managed instance group. Each instance in
@@ -12307,8 +12610,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        InstanceGroupManagersListManagedInstancesResponse.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupManagersListManagedInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all of the per-instance configs defined for the managed instance
@@ -12448,8 +12753,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        InstanceGroupManagersListPerInstanceConfigsResp.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupManagersListPerInstanceConfigsResp.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a managed instance group using the information that you specify in
@@ -12544,7 +12851,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts or patches per-instance configs for the managed instance group.
@@ -12638,7 +12947,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Flags the specified instances in the managed instance group to be
@@ -12739,7 +13050,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resizes the managed instance group. If you increase the size, the group
@@ -12851,7 +13164,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Specifies the instance template to use when creating new instances in this
@@ -12943,7 +13258,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the target pools to which all instances in this managed instance
@@ -13038,7 +13355,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts or updates per-instance configs for the managed instance group.
@@ -13132,7 +13451,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -13231,7 +13552,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of instance groups and sorts them by zone.
@@ -13363,7 +13686,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroupAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified instance group. The instances in the group are not
@@ -13448,7 +13774,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified zonal instance group. Get a list of available zonal
@@ -13518,7 +13846,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          InstanceGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an instance group in the specified project using the parameters
@@ -13601,7 +13932,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of zonal instance group resources contained within the
@@ -13733,7 +14066,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroupList.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the instances in the specified instance group. The orderBy query
@@ -13877,7 +14213,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroupsListInstances.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupsListInstances.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes one or more instances from the specified instance group, but does
@@ -13973,7 +14312,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the named ports for the specified instance group.
@@ -14064,7 +14405,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -14150,7 +14493,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified instance template. Gets a list of available instance
@@ -14211,7 +14556,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceTemplate.fromJson(data));
+    return _response.then(
+      (data) => InstanceTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -14281,7 +14629,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an instance template in the specified project using the data that
@@ -14358,7 +14708,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of instance templates that are contained within the
@@ -14479,7 +14831,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceTemplateList.fromJson(data));
+    return _response.then(
+      (data) => InstanceTemplateList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -14547,7 +14902,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -14614,7 +14971,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -14721,7 +15081,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds existing resource policies to an instance. You can only add one
@@ -14816,7 +15178,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves aggregated list of all of the instances in your project across
@@ -14948,7 +15312,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => InstanceAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Attaches an existing Disk resource to an instance. You must first create
@@ -15052,7 +15419,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified Instance resource. For more information, see
@@ -15139,7 +15508,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an access config from an instance's network interface.
@@ -15240,7 +15611,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Detaches a disk from an instance.
@@ -15335,7 +15708,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified Instance resource. Gets a list of available
@@ -15405,7 +15780,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Instance.fromJson(data));
+    return _response.then(
+      (data) => Instance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified guest attributes entry.
@@ -15487,7 +15864,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GuestAttributes.fromJson(data));
+    return _response.then(
+      (data) =>
+          GuestAttributes.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -15566,7 +15946,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the screenshot from the specified instance.
@@ -15636,7 +16018,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Screenshot.fromJson(data));
+    return _response.then(
+      (data) =>
+          Screenshot.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the last 1 MB of serial port output from the specified instance.
@@ -15733,7 +16118,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SerialPortOutput.fromJson(data));
+    return _response.then(
+      (data) => SerialPortOutput.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the Shielded Instance Identity of an instance
@@ -15803,7 +16191,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ShieldedInstanceIdentity.fromJson(data));
+    return _response.then(
+      (data) => ShieldedInstanceIdentity.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an instance resource in the specified project using the data
@@ -15901,7 +16292,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of instances contained within the specified zone.
@@ -16030,7 +16423,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceList.fromJson(data));
+    return _response.then(
+      (data) =>
+          InstanceList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources that refer to the VM instance specified in
@@ -16173,7 +16569,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceListReferrers.fromJson(data));
+    return _response.then(
+      (data) => InstanceListReferrers.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes resource policies from an instance.
@@ -16266,7 +16665,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Performs a reset on the instance. This is a hard reset the VM does not do
@@ -16354,7 +16755,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets deletion protection on the instance.
@@ -16448,7 +16851,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the auto-delete flag for a disk attached to an instance.
@@ -16552,7 +16957,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -16629,7 +17036,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets labels on an instance. To learn more about labels, read the Labeling
@@ -16723,7 +17132,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the number and/or type of accelerator for a stopped instance to
@@ -16817,7 +17228,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the machine type for a stopped instance to the machine type
@@ -16911,7 +17324,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets metadata for the specified instance to the data included in the
@@ -17005,7 +17420,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the minimum CPU platform that this instance should use. This
@@ -17100,7 +17517,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets an instance's scheduling options. You can only call this method on a
@@ -17196,7 +17615,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the service account on the instance. For more information, read
@@ -17290,7 +17711,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the Shielded Instance integrity policy for an instance. You can only
@@ -17385,7 +17808,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets network tags for the specified instance to the data included in the
@@ -17479,7 +17904,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Simulates a maintenance event on the instance.
@@ -17549,7 +17976,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts an instance that was stopped using the instances().stop method. For
@@ -17637,7 +18066,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts an instance that was stopped using the instances().stop method. For
@@ -17731,7 +18162,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stops a running instance, shutting it down cleanly, and allows you to
@@ -17823,7 +18256,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -17899,7 +18334,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an instance only if the necessary resources are available. This
@@ -18024,7 +18462,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified access config from an instance's network interface
@@ -18127,7 +18567,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the Display config for a VM instance. You can only use this method
@@ -18221,7 +18663,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an instance's network interface. This method follows PATCH
@@ -18322,7 +18766,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the Shielded Instance config for an instance. You can only use
@@ -18417,7 +18863,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -18556,8 +19004,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => InterconnectAttachmentAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => InterconnectAttachmentAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified interconnect attachment.
@@ -18643,7 +19093,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified interconnect attachment.
@@ -18712,7 +19164,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InterconnectAttachment.fromJson(data));
+    return _response.then(
+      (data) => InterconnectAttachment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an InterconnectAttachment in the specified project using the data
@@ -18802,7 +19257,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of interconnect attachments contained within the
@@ -18932,7 +19389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InterconnectAttachmentList.fromJson(data));
+    return _response.then(
+      (data) => InterconnectAttachmentList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified interconnect attachment with the data included in
@@ -19026,7 +19486,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -19094,7 +19556,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InterconnectLocation.fromJson(data));
+    return _response.then(
+      (data) => InterconnectLocation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of interconnect locations available to the specified
@@ -19215,7 +19680,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InterconnectLocationList.fromJson(data));
+    return _response.then(
+      (data) => InterconnectLocationList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -19298,7 +19766,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified interconnect. Get a list of available interconnects
@@ -19359,7 +19829,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Interconnect.fromJson(data));
+    return _response.then(
+      (data) =>
+          Interconnect.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the interconnectDiagnostics for the specified interconnect.
@@ -19420,8 +19893,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => InterconnectsGetDiagnosticsResponse.fromJson(data));
+    return _response.then(
+      (data) => InterconnectsGetDiagnosticsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a Interconnect in the specified project using the data included in
@@ -19495,7 +19970,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of interconnect available to the specified project.
@@ -19614,7 +20091,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InterconnectList.fromJson(data));
+    return _response.then(
+      (data) => InterconnectList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified interconnect with the data included in the request.
@@ -19699,7 +20179,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -19768,7 +20250,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicenseCode.fromJson(data));
+    return _response.then(
+      (data) =>
+          LicenseCode.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.  Caution
@@ -19837,7 +20322,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -19921,7 +20409,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified License resource.  Caution This resource is intended
@@ -19983,7 +20473,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => License.fromJson(data));
+    return _response.then(
+      (data) => License.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -20054,7 +20546,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a License resource in the specified project.  Caution This resource
@@ -20129,7 +20623,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of licenses available in the specified project. This
@@ -20254,7 +20750,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicensesListResponse.fromJson(data));
+    return _response.then(
+      (data) => LicensesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -20323,7 +20822,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.  Caution
@@ -20392,7 +20893,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -20530,7 +21034,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MachineTypeAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => MachineTypeAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified machine type. Gets a list of available machine types
@@ -20600,7 +21107,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MachineType.fromJson(data));
+    return _response.then(
+      (data) =>
+          MachineType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of machine types available to the specified project.
@@ -20729,7 +21239,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MachineTypeList.fromJson(data));
+    return _response.then(
+      (data) =>
+          MachineTypeList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -20868,8 +21381,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => NetworkEndpointGroupAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => NetworkEndpointGroupAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Attach a list of network endpoints to the specified network endpoint
@@ -20962,7 +21477,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified network endpoint group. The network endpoints in the
@@ -21050,7 +21567,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Detach a list of network endpoints from the specified network endpoint
@@ -21143,7 +21662,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified network endpoint group. Gets a list of available
@@ -21212,7 +21733,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NetworkEndpointGroup.fromJson(data));
+    return _response.then(
+      (data) => NetworkEndpointGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a network endpoint group in the specified project using the
@@ -21296,7 +21820,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of network endpoint groups that are located in the
@@ -21426,7 +21952,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NetworkEndpointGroupList.fromJson(data));
+    return _response.then(
+      (data) => NetworkEndpointGroupList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the network endpoints in the specified network endpoint group.
@@ -21572,7 +22101,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => NetworkEndpointGroupsListNetworkEndpoints.fromJson(data));
+      (data) => NetworkEndpointGroupsListNetworkEndpoints.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -21648,7 +22179,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -21738,7 +22272,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified network.
@@ -21815,7 +22351,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified network. Gets a list of available networks by making
@@ -21876,7 +22414,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Network.fromJson(data));
+    return _response.then(
+      (data) => Network.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a network in the specified project using the data included in the
@@ -21950,7 +22490,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of networks available to the specified project.
@@ -22069,7 +22611,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NetworkList.fromJson(data));
+    return _response.then(
+      (data) =>
+          NetworkList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the peering routes exchanged over peering connection.
@@ -22221,7 +22766,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ExchangedPeeringRoutesList.fromJson(data));
+    return _response.then(
+      (data) => ExchangedPeeringRoutesList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified network with the data included in the request. Only
@@ -22305,7 +22853,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a peering from the specified network.
@@ -22389,7 +22939,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Switches the network mode from auto subnet mode to custom subnet mode.
@@ -22467,7 +23019,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified network peering with the data included in the
@@ -22555,7 +23109,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -22654,7 +23210,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an aggregated list of node groups. Note: use
@@ -22786,7 +23344,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeGroupAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => NodeGroupAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified NodeGroup resource.
@@ -22872,7 +23433,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes specified nodes from the node group.
@@ -22965,7 +23528,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified NodeGroup. Get a list of available NodeGroups by
@@ -23036,7 +23601,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeGroup.fromJson(data));
+    return _response.then(
+      (data) => NodeGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -23115,7 +23682,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a NodeGroup resource in the specified project using the data
@@ -23206,7 +23775,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of node groups available to the specified project. Note:
@@ -23336,7 +23907,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeGroupList.fromJson(data));
+    return _response.then(
+      (data) =>
+          NodeGroupList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists nodes in the node group.
@@ -23475,7 +24049,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeGroupsListNodes.fromJson(data));
+    return _response.then(
+      (data) => NodeGroupsListNodes.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified node group.
@@ -23567,7 +24144,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -23644,7 +24223,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the node template of the node group.
@@ -23737,7 +24318,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -23813,7 +24396,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -23951,7 +24537,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeTemplateAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => NodeTemplateAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified NodeTemplate resource.
@@ -24037,7 +24626,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified node template. Gets a list of available node
@@ -24107,7 +24698,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeTemplate.fromJson(data));
+    return _response.then(
+      (data) =>
+          NodeTemplate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -24186,7 +24780,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a NodeTemplate resource in the specified project using the data
@@ -24270,7 +24866,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of node templates available to the specified project.
@@ -24399,7 +24997,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeTemplateList.fromJson(data));
+    return _response.then(
+      (data) => NodeTemplateList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -24476,7 +25077,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -24552,7 +25155,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -24689,7 +25295,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeTypeAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => NodeTypeAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified node type. Gets a list of available node types by
@@ -24759,7 +25368,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeType.fromJson(data));
+    return _response.then(
+      (data) => NodeType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of node types available to the specified project.
@@ -24888,7 +25499,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodeTypeList.fromJson(data));
+    return _response.then(
+      (data) =>
+          NodeTypeList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -25027,8 +25641,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PacketMirroringAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => PacketMirroringAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified PacketMirroring resource.
@@ -25114,7 +25730,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified PacketMirroring resource.
@@ -25183,7 +25801,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PacketMirroring.fromJson(data));
+    return _response.then(
+      (data) =>
+          PacketMirroring.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a PacketMirroring resource in the specified project and region
@@ -25267,7 +25888,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of PacketMirroring resources available to the specified
@@ -25397,7 +26020,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PacketMirroringList.fromJson(data));
+    return _response.then(
+      (data) => PacketMirroringList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified PacketMirroring resource with the data included in
@@ -25491,7 +26117,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -25567,7 +26195,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -25640,7 +26271,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Disable a service resource (also known as service project) associated with
@@ -25714,7 +26347,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enable this project as a shared VPC host project.
@@ -25781,7 +26416,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enable service resource (a.k.a service project) for a host project, so
@@ -25856,7 +26493,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified Project resource.
@@ -25906,7 +26545,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the shared VPC host project that this project links to. May be empty
@@ -25957,7 +26598,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets service resources (a.k.a service project) associated with this host
@@ -26077,7 +26720,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProjectsGetXpnResources.fromJson(data));
+    return _response.then(
+      (data) => ProjectsGetXpnResources.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all shared VPC host projects visible to the user in an organization.
@@ -26202,7 +26848,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => XpnHostList.fromJson(data));
+    return _response.then(
+      (data) =>
+          XpnHostList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves a persistent disk from one zone to another.
@@ -26275,7 +26924,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves an instance and its attached persistent disks from one zone to
@@ -26349,7 +27000,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets metadata common to all instances within the specified project using
@@ -26424,7 +27077,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the default network tier of the project. The default network tier is
@@ -26499,7 +27154,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables the usage export feature and sets the usage export bucket where
@@ -26574,7 +27231,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -26667,7 +27326,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified autoscaler.
@@ -26736,7 +27397,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Autoscaler.fromJson(data));
+    return _response.then(
+      (data) =>
+          Autoscaler.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an autoscaler in the specified project using the data included in
@@ -26820,7 +27484,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of autoscalers contained within the specified region.
@@ -26949,7 +27615,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RegionAutoscalerList.fromJson(data));
+    return _response.then(
+      (data) => RegionAutoscalerList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an autoscaler in the specified project using the data included in
@@ -27042,7 +27711,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an autoscaler in the specified project using the data included in
@@ -27134,7 +27805,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -27227,7 +27900,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified regional BackendService resource.
@@ -27296,7 +27971,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendService.fromJson(data));
+    return _response.then(
+      (data) =>
+          BackendService.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the most recent health check results for this regional
@@ -27374,7 +28052,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendServiceGroupHealth.fromJson(data));
+    return _response.then(
+      (data) => BackendServiceGroupHealth.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a regional BackendService resource in the specified project using
@@ -27459,7 +28140,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of regional BackendService resources available to the
@@ -27589,7 +28272,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BackendServiceList.fromJson(data));
+    return _response.then(
+      (data) => BackendServiceList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified regional BackendService resource with the data
@@ -27684,7 +28370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified regional BackendService resource with the data
@@ -27778,7 +28466,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -27917,7 +28607,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommitmentAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => CommitmentAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified commitment resource. Gets a list of available
@@ -27987,7 +28680,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Commitment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Commitment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a commitment in the specified project using the data included in
@@ -28071,7 +28767,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of commitments contained within the specified region.
@@ -28200,7 +28898,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommitmentList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommitmentList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -28276,7 +28977,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DiskType.fromJson(data));
+    return _response.then(
+      (data) => DiskType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of regional disk types available to the specified
@@ -28406,7 +29109,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RegionDiskTypeList.fromJson(data));
+    return _response.then(
+      (data) => RegionDiskTypeList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -28507,7 +29213,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a snapshot of this regional disk.
@@ -28600,7 +29308,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified regional persistent disk. Deleting a regional disk
@@ -28687,7 +29397,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a specified regional persistent disk.
@@ -28756,7 +29468,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Disk.fromJson(data));
+    return _response.then(
+      (data) => Disk.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -28835,7 +29549,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a persistent regional disk in the specified project using the data
@@ -28925,7 +29641,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of persistent disks contained within the specified
@@ -29055,7 +29773,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DiskList.fromJson(data));
+    return _response.then(
+      (data) => DiskList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes resource policies from a regional disk.
@@ -29148,7 +29868,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resizes the specified regional persistent disk.
@@ -29241,7 +29963,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -29318,7 +30042,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the labels on the target regional disk.
@@ -29411,7 +30137,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -29487,7 +30215,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -29579,7 +30310,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified regional HealthCheckService resource.
@@ -29647,7 +30380,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HealthCheckService.fromJson(data));
+    return _response.then(
+      (data) => HealthCheckService.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a regional HealthCheckService resource in the specified project
@@ -29731,7 +30467,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the HealthCheckService resources that have been configured for
@@ -29861,7 +30599,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HealthCheckServicesList.fromJson(data));
+    return _response.then(
+      (data) => HealthCheckServicesList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified regional HealthCheckService resource with the data
@@ -29954,7 +30695,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -30047,7 +30790,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified HealthCheck resource. Gets a list of available
@@ -30117,7 +30862,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HealthCheck.fromJson(data));
+    return _response.then(
+      (data) =>
+          HealthCheck.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a HealthCheck resource in the specified project using the data
@@ -30201,7 +30949,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of HealthCheck resources available to the specified
@@ -30331,7 +31081,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HealthCheckList.fromJson(data));
+    return _response.then(
+      (data) =>
+          HealthCheckList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HealthCheck resource in the specified project using the data
@@ -30425,7 +31178,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a HealthCheck resource in the specified project using the data
@@ -30518,7 +31273,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -30628,7 +31385,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Apply updates to selected instances the managed instance group.
@@ -30703,7 +31462,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates instances with per-instance configs in this regional managed
@@ -30799,7 +31560,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified managed instance group and all of the instances in
@@ -30883,7 +31646,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Flags the specified instances in the managed instance group to be
@@ -30986,7 +31751,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes selected per-instance configs for the managed instance group.
@@ -31061,7 +31828,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns all of the details about the specified managed instance group.
@@ -31127,7 +31896,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroupManager.fromJson(data));
+    return _response.then(
+      (data) => InstanceGroupManager.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a managed instance group using the information that you specify in
@@ -31216,7 +31988,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of managed instance groups that are contained within
@@ -31345,8 +32119,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => RegionInstanceGroupManagerList.fromJson(data));
+    return _response.then(
+      (data) => RegionInstanceGroupManagerList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all errors thrown by actions on instances for a given regional
@@ -31489,7 +32265,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => RegionInstanceGroupManagersListErrorsResponse.fromJson(data));
+      (data) => RegionInstanceGroupManagersListErrorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the instances in the managed instance group and instances that are
@@ -31629,8 +32407,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        RegionInstanceGroupManagersListInstancesResponse.fromJson(data));
+    return _response.then(
+      (data) => RegionInstanceGroupManagersListInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all of the per-instance configs defined for the managed instance
@@ -31770,8 +32550,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        RegionInstanceGroupManagersListInstanceConfigsResp.fromJson(data));
+    return _response.then(
+      (data) => RegionInstanceGroupManagersListInstanceConfigsResp.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a managed instance group using the information that you specify in
@@ -31865,7 +32647,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Insert or patch (for the ones that already exist) per-instance configs for
@@ -31959,7 +32743,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Flags the specified instances in the managed instance group to be
@@ -32060,7 +32846,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the intended size of the managed instance group. If you increase
@@ -32164,7 +32952,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the instance template to use when creating new instances or
@@ -32255,7 +33045,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the target pools to which all new instances in this group are
@@ -32346,7 +33138,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Insert or update (for the ones that already exist) per-instance configs
@@ -32440,7 +33234,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -32513,7 +33309,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          InstanceGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of instance group resources contained within the
@@ -32642,7 +33441,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RegionInstanceGroupList.fromJson(data));
+    return _response.then(
+      (data) => RegionInstanceGroupList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the instances in the specified instance group and displays
@@ -32788,8 +33590,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => RegionInstanceGroupsListInstances.fromJson(data));
+    return _response.then(
+      (data) => RegionInstanceGroupsListInstances.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the named ports for the specified regional instance group.
@@ -32880,7 +33684,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -32973,7 +33779,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified network endpoint group. Gets a list of available
@@ -33042,7 +33850,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NetworkEndpointGroup.fromJson(data));
+    return _response.then(
+      (data) => NetworkEndpointGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a network endpoint group in the specified project using the
@@ -33126,7 +33937,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of regional network endpoint groups available to the
@@ -33256,7 +34069,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NetworkEndpointGroupList.fromJson(data));
+    return _response.then(
+      (data) => NetworkEndpointGroupList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -33350,7 +34166,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified NotificationEndpoint resource in the given region.
@@ -33420,7 +34238,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationEndpoint.fromJson(data));
+    return _response.then(
+      (data) => NotificationEndpoint.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a NotificationEndpoint in the specified project in the given region
@@ -33504,7 +34325,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the NotificationEndpoints for a project in the given region.
@@ -33633,7 +34456,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationEndpointList.fromJson(data));
+    return _response.then(
+      (data) => NotificationEndpointList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -33709,7 +34535,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves the specified region-specific Operations resource.
@@ -33778,7 +34606,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of Operation resources contained within the specified
@@ -33908,7 +34738,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OperationList.fromJson(data));
+    return _response.then(
+      (data) =>
+          OperationList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Waits for the specified Operation resource to return as `DONE` or for the
@@ -33991,7 +34824,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -34084,7 +34919,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified SslCertificate resource in the specified region. Get
@@ -34154,7 +34991,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SslCertificate.fromJson(data));
+    return _response.then(
+      (data) =>
+          SslCertificate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a SslCertificate resource in the specified project and region
@@ -34238,7 +35078,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of SslCertificate resources available to the specified
@@ -34368,7 +35210,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SslCertificateList.fromJson(data));
+    return _response.then(
+      (data) => SslCertificateList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -34461,7 +35306,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetHttpProxy resource in the specified region.
@@ -34531,7 +35378,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpProxy.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetHttpProxy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetHttpProxy resource in the specified project and region
@@ -34615,7 +35465,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of TargetHttpProxy resources available to the specified
@@ -34745,7 +35597,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpProxyList.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpProxyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the URL map for TargetHttpProxy.
@@ -34838,7 +35693,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -34931,7 +35788,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetHttpsProxy resource in the specified region.
@@ -35001,7 +35860,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpsProxy.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpsProxy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetHttpsProxy resource in the specified project and region
@@ -35085,7 +35947,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of TargetHttpsProxy resources available to the
@@ -35215,7 +36079,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpsProxyList.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpsProxyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replaces SslCertificates for TargetHttpsProxy.
@@ -35309,7 +36176,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the URL map for TargetHttpsProxy.
@@ -35402,7 +36271,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -35484,7 +36355,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified UrlMap resource. Gets a list of available URL maps
@@ -35554,7 +36427,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlMap.fromJson(data));
+    return _response.then(
+      (data) => UrlMap.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a UrlMap resource in the specified project using the data included
@@ -35628,7 +36503,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of UrlMap resources available to the specified project
@@ -35758,7 +36635,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlMapList.fromJson(data));
+    return _response.then(
+      (data) =>
+          UrlMapList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified UrlMap resource with the data included in the
@@ -35842,7 +36722,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified UrlMap resource with the data included in the
@@ -35925,7 +36807,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs static validation for the UrlMap. In particular, the tests of the
@@ -36003,7 +36887,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlMapsValidateResponse.fromJson(data));
+    return _response.then(
+      (data) => UrlMapsValidateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -36070,7 +36957,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Region.fromJson(data));
+    return _response.then(
+      (data) => Region.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of region resources available to the specified project.
@@ -36189,7 +37078,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RegionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RegionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -36327,7 +37219,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReservationAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => ReservationAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified reservation.
@@ -36413,7 +37308,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves information about the specified reservation.
@@ -36482,7 +37379,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Reservation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Reservation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -36561,7 +37461,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new reservation. For more information, read Reserving zonal
@@ -36645,7 +37547,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// A list of all the reservations that have been configured for the specified
@@ -36775,7 +37679,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReservationList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReservationList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resizes the reservation (applicable to standalone reservations only). For
@@ -36868,7 +37775,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -36945,7 +37854,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -37021,7 +37932,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -37160,8 +38074,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ResourcePolicyAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => ResourcePolicyAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified resource policy.
@@ -37247,7 +38163,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves all information of the specified resource policy.
@@ -37316,7 +38234,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResourcePolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          ResourcePolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -37395,7 +38316,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new resource policy.
@@ -37478,7 +38401,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// A list all the resource policies that have been configured for the
@@ -37608,7 +38533,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResourcePolicyList.fromJson(data));
+    return _response.then(
+      (data) => ResourcePolicyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -37685,7 +38613,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -37761,7 +38691,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -37898,7 +38831,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RouterAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => RouterAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified Router resource.
@@ -37984,7 +38920,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified Router resource. Gets a list of available routers by
@@ -38054,7 +38992,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Router.fromJson(data));
+    return _response.then(
+      (data) => Router.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves runtime Nat mapping information of VM endpoints.
@@ -38194,7 +39134,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VmEndpointNatMappingsList.fromJson(data));
+    return _response.then(
+      (data) => VmEndpointNatMappingsList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves runtime information of the specified router.
@@ -38264,7 +39207,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RouterStatusResponse.fromJson(data));
+    return _response.then(
+      (data) => RouterStatusResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a Router resource in the specified project and region using the
@@ -38348,7 +39294,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of Router resources available to the specified project.
@@ -38477,7 +39425,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RouterList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RouterList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified Router resource with the data included in the
@@ -38571,7 +39522,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Preview fields auto-generated during router create and update operations.
@@ -38648,7 +39601,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RoutersPreviewResponse.fromJson(data));
+    return _response.then(
+      (data) => RoutersPreviewResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified Router resource with the data included in the
@@ -38743,7 +39699,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -38826,7 +39784,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified Route resource. Gets a list of available routes by
@@ -38887,7 +39847,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Route.fromJson(data));
+    return _response.then(
+      (data) => Route.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a Route resource in the specified project using the data included
@@ -38961,7 +39923,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of Route resources available to the specified project.
@@ -39080,7 +40044,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RouteList.fromJson(data));
+    return _response.then(
+      (data) => RouteList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -39154,7 +40120,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified policy.
@@ -39231,7 +40199,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all of the ordered rules present in a single specified policy.
@@ -39291,7 +40261,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecurityPolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecurityPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a rule at the specified priority.
@@ -39359,7 +40332,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecurityPolicyRule.fromJson(data));
+    return _response.then(
+      (data) => SecurityPolicyRule.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new policy in the specified project using the data included in
@@ -39434,7 +40410,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all the policies that have been configured for the specified project.
@@ -39554,7 +40532,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecurityPolicyList.fromJson(data));
+    return _response.then(
+      (data) => SecurityPolicyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the current list of preconfigured Web Application Firewall (WAF)
@@ -39677,8 +40658,11 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        SecurityPoliciesListPreconfiguredExpressionSetsResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecurityPoliciesListPreconfiguredExpressionSetsResponse.fromJson(
+              data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified policy with the data included in the request.
@@ -39761,7 +40745,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a rule at the specified priority.
@@ -39834,7 +40820,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a rule at the specified priority.
@@ -39901,7 +40889,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -39990,7 +40980,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified Snapshot resource. Gets a list of available
@@ -40051,7 +41043,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Snapshot.fromJson(data));
+    return _response.then(
+      (data) => Snapshot.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -40121,7 +41115,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of Snapshot resources contained within the specified
@@ -40241,7 +41237,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SnapshotList.fromJson(data));
+    return _response.then(
+      (data) =>
+          SnapshotList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -40309,7 +41308,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the labels on a snapshot. To learn more about labels, read the
@@ -40377,7 +41378,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -40444,7 +41447,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -40583,8 +41589,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SslCertificateAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => SslCertificateAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified SslCertificate resource.
@@ -40661,7 +41669,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified SslCertificate resource. Gets a list of available
@@ -40722,7 +41732,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SslCertificate.fromJson(data));
+    return _response.then(
+      (data) =>
+          SslCertificate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a SslCertificate resource in the specified project using the data
@@ -40797,7 +41810,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of SslCertificate resources available to the specified
@@ -40918,7 +41933,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SslCertificateList.fromJson(data));
+    return _response.then(
+      (data) => SslCertificateList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -41002,7 +42020,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all of the ordered rules present in a single specified policy.
@@ -41061,7 +42081,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SslPolicy.fromJson(data));
+    return _response.then(
+      (data) => SslPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified SSL policy resource. Gets a list of available SSL
@@ -41135,7 +42157,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the SSL policies that have been configured for the specified
@@ -41255,7 +42279,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SslPoliciesList.fromJson(data));
+    return _response.then(
+      (data) =>
+          SslPoliciesList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all features that can be specified in the SSL policy when using
@@ -41377,7 +42404,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => SslPoliciesListAvailableFeaturesResponse.fromJson(data));
+      (data) => SslPoliciesListAvailableFeaturesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified SSL policy with the data included in the request.
@@ -41459,7 +42488,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -41597,7 +42628,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SubnetworkAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => SubnetworkAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified subnetwork.
@@ -41683,7 +42717,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Expands the IP CIDR range of the subnetwork to a specified value.
@@ -41776,7 +42812,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified subnetwork. Gets a list of available subnetworks
@@ -41846,7 +42884,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subnetwork.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subnetwork.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -41925,7 +42966,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a subnetwork in the specified project using the data included in
@@ -42009,7 +43052,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of subnetworks available to the specified project.
@@ -42138,7 +43183,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SubnetworkList.fromJson(data));
+    return _response.then(
+      (data) =>
+          SubnetworkList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an aggregated list of all usable subnetworks in the project.
@@ -42258,8 +43306,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => UsableSubnetworksAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => UsableSubnetworksAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified subnetwork with the data included in the request.
@@ -42367,7 +43417,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -42444,7 +43496,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Set whether VMs in this subnet can access Google services without
@@ -42538,7 +43592,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -42614,7 +43670,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -42698,7 +43757,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetGrpcProxy resource in the given scope.
@@ -42758,7 +43819,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetGrpcProxy.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetGrpcProxy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetGrpcProxy in the specified project in the given scope
@@ -42833,7 +43897,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the TargetGrpcProxies for a project in the given scope.
@@ -42953,7 +44019,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetGrpcProxyList.fromJson(data));
+    return _response.then(
+      (data) => TargetGrpcProxyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified TargetGrpcProxy resource with the data included in
@@ -43038,7 +44107,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -43178,8 +44249,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => TargetHttpProxyAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpProxyAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified TargetHttpProxy resource.
@@ -43256,7 +44329,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetHttpProxy resource. Gets a list of available
@@ -43317,7 +44392,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpProxy.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetHttpProxy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetHttpProxy resource in the specified project using the data
@@ -43392,7 +44470,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of TargetHttpProxy resources available to the specified
@@ -43513,7 +44593,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpProxyList.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpProxyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified TargetHttpProxy resource with the data included in
@@ -43599,7 +44682,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the URL map for TargetHttpProxy.
@@ -43683,7 +44768,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -43823,8 +44910,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => TargetHttpsProxyAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpsProxyAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified TargetHttpsProxy resource.
@@ -43901,7 +44990,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetHttpsProxy resource. Gets a list of available
@@ -43962,7 +45053,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpsProxy.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpsProxy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetHttpsProxy resource in the specified project using the
@@ -44037,7 +45131,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of TargetHttpsProxy resources available to the
@@ -44158,7 +45254,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetHttpsProxyList.fromJson(data));
+    return _response.then(
+      (data) => TargetHttpsProxyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the QUIC override policy for TargetHttpsProxy.
@@ -44241,7 +45340,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replaces SslCertificates for TargetHttpsProxy.
@@ -44326,7 +45427,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the SSL policy for TargetHttpsProxy. The SSL policy specifies the
@@ -44413,7 +45516,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the URL map for TargetHttpsProxy.
@@ -44498,7 +45603,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -44636,8 +45743,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => TargetInstanceAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => TargetInstanceAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified TargetInstance resource.
@@ -44723,7 +45832,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetInstance resource. Gets a list of available
@@ -44793,7 +45904,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetInstance.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetInstance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetInstance resource in the specified project and zone using
@@ -44877,7 +45991,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of TargetInstance resources available to the specified
@@ -45007,7 +46123,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetInstanceList.fromJson(data));
+    return _response.then(
+      (data) => TargetInstanceList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -45106,7 +46225,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds an instance to a target pool.
@@ -45199,7 +46320,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an aggregated list of target pools.
@@ -45331,7 +46454,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetPoolAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => TargetPoolAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified target pool.
@@ -45417,7 +46543,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified target pool. Gets a list of available target pools
@@ -45487,7 +46615,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetPool.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetPool.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the most recent health check results for each IP for the instance
@@ -45565,7 +46696,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetPoolInstanceHealth.fromJson(data));
+    return _response.then(
+      (data) => TargetPoolInstanceHealth.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a target pool in the specified project and region using the data
@@ -45649,7 +46783,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of target pools available to the specified project and
@@ -45779,7 +46915,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetPoolList.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetPoolList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes health check URL from a target pool.
@@ -45872,7 +47011,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes instance URL from a target pool.
@@ -45965,7 +47106,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes a backup target pool's configurations.
@@ -46064,7 +47207,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -46148,7 +47293,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetSslProxy resource. Gets a list of available
@@ -46209,7 +47356,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetSslProxy.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetSslProxy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetSslProxy resource in the specified project using the data
@@ -46284,7 +47434,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of TargetSslProxy resources available to the specified
@@ -46405,7 +47557,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetSslProxyList.fromJson(data));
+    return _response.then(
+      (data) => TargetSslProxyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the BackendService for TargetSslProxy.
@@ -46490,7 +47645,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the ProxyHeaderType for TargetSslProxy.
@@ -46575,7 +47732,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes SslCertificates for TargetSslProxy.
@@ -46660,7 +47819,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the SSL policy for TargetSslProxy. The SSL policy specifies the
@@ -46746,7 +47907,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -46830,7 +47993,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified TargetTcpProxy resource. Gets a list of available
@@ -46891,7 +48056,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetTcpProxy.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetTcpProxy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a TargetTcpProxy resource in the specified project using the data
@@ -46966,7 +48134,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of TargetTcpProxy resources available to the specified
@@ -47087,7 +48257,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetTcpProxyList.fromJson(data));
+    return _response.then(
+      (data) => TargetTcpProxyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the BackendService for TargetTcpProxy.
@@ -47172,7 +48345,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes the ProxyHeaderType for TargetTcpProxy.
@@ -47257,7 +48432,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -47396,8 +48573,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => TargetVpnGatewayAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => TargetVpnGatewayAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified target VPN gateway.
@@ -47483,7 +48662,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified target VPN gateway. Gets a list of available target
@@ -47553,7 +48734,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetVpnGateway.fromJson(data));
+    return _response.then(
+      (data) => TargetVpnGateway.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a target VPN gateway in the specified project and region using the
@@ -47637,7 +48821,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of target VPN gateways available to the specified project
@@ -47767,7 +48953,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetVpnGatewayList.fromJson(data));
+    return _response.then(
+      (data) => TargetVpnGatewayList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -47905,7 +49094,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlMapsAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => UrlMapsAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified UrlMap resource.
@@ -47982,7 +49174,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified UrlMap resource. Gets a list of available URL maps
@@ -48043,7 +49237,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlMap.fromJson(data));
+    return _response.then(
+      (data) => UrlMap.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a UrlMap resource in the specified project using the data included
@@ -48117,7 +49313,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Initiates a cache invalidation operation, invalidating the specified path,
@@ -48202,7 +49400,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of UrlMap resources available to the specified project.
@@ -48321,7 +49521,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlMapList.fromJson(data));
+    return _response.then(
+      (data) =>
+          UrlMapList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches the specified UrlMap resource with the data included in the
@@ -48406,7 +49609,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified UrlMap resource with the data included in the
@@ -48490,7 +49695,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs static validation for the UrlMap. In particular, the tests of the
@@ -48559,7 +49766,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlMapsValidateResponse.fromJson(data));
+    return _response.then(
+      (data) => UrlMapsValidateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -48697,7 +49907,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VpnGatewayAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => VpnGatewayAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified VPN gateway.
@@ -48783,7 +49996,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified VPN gateway. Gets a list of available VPN gateways
@@ -48853,7 +50068,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VpnGateway.fromJson(data));
+    return _response.then(
+      (data) =>
+          VpnGateway.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the status for the specified VPN gateway.
@@ -48923,8 +50141,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => VpnGatewaysGetStatusResponse.fromJson(data));
+    return _response.then(
+      (data) => VpnGatewaysGetStatusResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a VPN gateway in the specified project and region using the data
@@ -49008,7 +50228,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of VPN gateways available to the specified project and
@@ -49138,7 +50360,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VpnGatewayList.fromJson(data));
+    return _response.then(
+      (data) =>
+          VpnGatewayList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the labels on a VpnGateway. To learn more about labels, read the
@@ -49232,7 +50457,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -49308,7 +50535,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -49445,7 +50675,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VpnTunnelAggregatedList.fromJson(data));
+    return _response.then(
+      (data) => VpnTunnelAggregatedList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified VpnTunnel resource.
@@ -49531,7 +50764,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified VpnTunnel resource. Gets a list of available VPN
@@ -49601,7 +50836,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VpnTunnel.fromJson(data));
+    return _response.then(
+      (data) => VpnTunnel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a VpnTunnel resource in the specified project and region using the
@@ -49685,7 +50922,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of VpnTunnel resources contained in the specified project
@@ -49815,7 +51054,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VpnTunnelList.fromJson(data));
+    return _response.then(
+      (data) =>
+          VpnTunnelList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -49890,7 +51132,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves the specified zone-specific Operations resource.
@@ -49959,7 +51203,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of Operation resources contained within the specified
@@ -50089,7 +51335,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OperationList.fromJson(data));
+    return _response.then(
+      (data) =>
+          OperationList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Waits for the specified Operation resource to return as `DONE` or for the
@@ -50172,7 +51421,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -50239,7 +51490,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Zone.fromJson(data));
+    return _response.then(
+      (data) => Zone.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of Zone resources available to the specified project.
@@ -50358,7 +51611,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ZoneList.fromJson(data));
+    return _response.then(
+      (data) => ZoneList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -50444,7 +51699,8 @@
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('deprecated')) {
-      deprecated = DeprecationStatus.fromJson(_json['deprecated']);
+      deprecated = DeprecationStatus.fromJson(
+          _json['deprecated'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -50586,7 +51842,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<AcceleratorTypeAggregatedListWarningData>((value) =>
-              AcceleratorTypeAggregatedListWarningData.fromJson(value))
+              AcceleratorTypeAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -50645,8 +51902,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, AcceleratorTypesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => AcceleratorTypesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => AcceleratorTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -50663,7 +51922,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = AcceleratorTypeAggregatedListWarning.fromJson(_json['warning']);
+      warning = AcceleratorTypeAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -50779,8 +52039,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AcceleratorTypeListWarningData>(
-              (value) => AcceleratorTypeListWarningData.fromJson(value))
+          .map<AcceleratorTypeListWarningData>((value) =>
+              AcceleratorTypeListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -50836,7 +52097,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AcceleratorType>((value) => AcceleratorType.fromJson(value))
+          .map<AcceleratorType>((value) => AcceleratorType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -50849,7 +52111,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = AcceleratorTypeListWarning.fromJson(_json['warning']);
+      warning = AcceleratorTypeListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -50961,8 +52224,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AcceleratorTypesScopedListWarningData>(
-              (value) => AcceleratorTypesScopedListWarningData.fromJson(value))
+          .map<AcceleratorTypesScopedListWarningData>((value) =>
+              AcceleratorTypesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -50998,11 +52262,13 @@
   AcceleratorTypesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('acceleratorTypes')) {
       acceleratorTypes = (_json['acceleratorTypes'] as core.List)
-          .map<AcceleratorType>((value) => AcceleratorType.fromJson(value))
+          .map<AcceleratorType>((value) => AcceleratorType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = AcceleratorTypesScopedListWarning.fromJson(_json['warning']);
+      warning = AcceleratorTypesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -51447,8 +52713,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AddressAggregatedListWarningData>(
-              (value) => AddressAggregatedListWarningData.fromJson(value))
+          .map<AddressAggregatedListWarningData>((value) =>
+              AddressAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -51506,8 +52773,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, AddressesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => AddressesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => AddressesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -51524,7 +52793,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = AddressAggregatedListWarning.fromJson(_json['warning']);
+      warning = AddressAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -51640,8 +52910,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AddressListWarningData>(
-              (value) => AddressListWarningData.fromJson(value))
+          .map<AddressListWarningData>((value) =>
+              AddressListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -51697,7 +52968,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Address>((value) => Address.fromJson(value))
+          .map<Address>((value) =>
+              Address.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -51710,7 +52982,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = AddressListWarning.fromJson(_json['warning']);
+      warning = AddressListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -51822,8 +53095,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AddressesScopedListWarningData>(
-              (value) => AddressesScopedListWarningData.fromJson(value))
+          .map<AddressesScopedListWarningData>((value) =>
+              AddressesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -51859,11 +53133,13 @@
   AddressesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('addresses')) {
       addresses = (_json['addresses'] as core.List)
-          .map<Address>((value) => Address.fromJson(value))
+          .map<Address>((value) =>
+              Address.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = AddressesScopedListWarning.fromJson(_json['warning']);
+      warning = AddressesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -51977,7 +53253,8 @@
       core.Map _json) {
     if (_json.containsKey('guestAccelerators')) {
       guestAccelerators = (_json['guestAccelerators'] as core.List)
-          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(value))
+          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('localSsds')) {
@@ -51985,7 +53262,7 @@
           .map<AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk>(
               (value) =>
                   AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('machineType')) {
@@ -52039,7 +53316,8 @@
     if (_json.containsKey('instanceProperties')) {
       instanceProperties =
           AllocationSpecificSKUAllocationReservedInstanceProperties.fromJson(
-              _json['instanceProperties']);
+              _json['instanceProperties']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -52178,23 +53456,24 @@
       deviceName = _json['deviceName'] as core.String;
     }
     if (_json.containsKey('diskEncryptionKey')) {
-      diskEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['diskEncryptionKey']);
+      diskEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['diskEncryptionKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diskSizeGb')) {
       diskSizeGb = _json['diskSizeGb'] as core.String;
     }
     if (_json.containsKey('guestOsFeatures')) {
       guestOsFeatures = (_json['guestOsFeatures'] as core.List)
-          .map<GuestOsFeature>((value) => GuestOsFeature.fromJson(value))
+          .map<GuestOsFeature>((value) => GuestOsFeature.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('index')) {
       index = _json['index'] as core.int;
     }
     if (_json.containsKey('initializeParams')) {
-      initializeParams =
-          AttachedDiskInitializeParams.fromJson(_json['initializeParams']);
+      initializeParams = AttachedDiskInitializeParams.fromJson(
+          _json['initializeParams'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('interface')) {
       interface = _json['interface'] as core.String;
@@ -52211,8 +53490,9 @@
       mode = _json['mode'] as core.String;
     }
     if (_json.containsKey('shieldedInstanceInitialState')) {
-      shieldedInstanceInitialState =
-          InitialStateConfig.fromJson(_json['shieldedInstanceInitialState']);
+      shieldedInstanceInitialState = InitialStateConfig.fromJson(
+          _json['shieldedInstanceInitialState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('source')) {
       source = _json['source'] as core.String;
@@ -52398,7 +53678,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('onUpdateAction')) {
@@ -52413,15 +53694,17 @@
       sourceImage = _json['sourceImage'] as core.String;
     }
     if (_json.containsKey('sourceImageEncryptionKey')) {
-      sourceImageEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceImageEncryptionKey']);
+      sourceImageEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceImageEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceSnapshot')) {
       sourceSnapshot = _json['sourceSnapshot'] as core.String;
     }
     if (_json.containsKey('sourceSnapshotEncryptionKey')) {
-      sourceSnapshotEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceSnapshotEncryptionKey']);
+      sourceSnapshotEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceSnapshotEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -52502,7 +53785,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('exemptedMembers')) {
@@ -52706,8 +53990,8 @@
 
   Autoscaler.fromJson(core.Map _json) {
     if (_json.containsKey('autoscalingPolicy')) {
-      autoscalingPolicy =
-          AutoscalingPolicy.fromJson(_json['autoscalingPolicy']);
+      autoscalingPolicy = AutoscalingPolicy.fromJson(
+          _json['autoscalingPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
@@ -52738,8 +54022,9 @@
     }
     if (_json.containsKey('statusDetails')) {
       statusDetails = (_json['statusDetails'] as core.List)
-          .map<AutoscalerStatusDetails>(
-              (value) => AutoscalerStatusDetails.fromJson(value))
+          .map<AutoscalerStatusDetails>((value) =>
+              AutoscalerStatusDetails.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('target')) {
@@ -52879,8 +54164,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AutoscalerAggregatedListWarningData>(
-              (value) => AutoscalerAggregatedListWarningData.fromJson(value))
+          .map<AutoscalerAggregatedListWarningData>((value) =>
+              AutoscalerAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -52938,8 +54224,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, AutoscalersScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => AutoscalersScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => AutoscalersScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -52956,7 +54244,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = AutoscalerAggregatedListWarning.fromJson(_json['warning']);
+      warning = AutoscalerAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -53072,8 +54361,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AutoscalerListWarningData>(
-              (value) => AutoscalerListWarningData.fromJson(value))
+          .map<AutoscalerListWarningData>((value) =>
+              AutoscalerListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -53129,7 +54419,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Autoscaler>((value) => Autoscaler.fromJson(value))
+          .map<Autoscaler>((value) =>
+              Autoscaler.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -53142,7 +54433,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = AutoscalerListWarning.fromJson(_json['warning']);
+      warning = AutoscalerListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -53344,8 +54636,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<AutoscalersScopedListWarningData>(
-              (value) => AutoscalersScopedListWarningData.fromJson(value))
+          .map<AutoscalersScopedListWarningData>((value) =>
+              AutoscalersScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -53381,11 +54674,13 @@
   AutoscalersScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('autoscalers')) {
       autoscalers = (_json['autoscalers'] as core.List)
-          .map<Autoscaler>((value) => Autoscaler.fromJson(value))
+          .map<Autoscaler>((value) =>
+              Autoscaler.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = AutoscalersScopedListWarning.fromJson(_json['warning']);
+      warning = AutoscalersScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -53451,20 +54746,22 @@
       coolDownPeriodSec = _json['coolDownPeriodSec'] as core.int;
     }
     if (_json.containsKey('cpuUtilization')) {
-      cpuUtilization =
-          AutoscalingPolicyCpuUtilization.fromJson(_json['cpuUtilization']);
+      cpuUtilization = AutoscalingPolicyCpuUtilization.fromJson(
+          _json['cpuUtilization'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customMetricUtilizations')) {
       customMetricUtilizations =
           (_json['customMetricUtilizations'] as core.List)
               .map<AutoscalingPolicyCustomMetricUtilization>((value) =>
-                  AutoscalingPolicyCustomMetricUtilization.fromJson(value))
+                  AutoscalingPolicyCustomMetricUtilization.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('loadBalancingUtilization')) {
       loadBalancingUtilization =
           AutoscalingPolicyLoadBalancingUtilization.fromJson(
-              _json['loadBalancingUtilization']);
+              _json['loadBalancingUtilization']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxNumReplicas')) {
       maxNumReplicas = _json['maxNumReplicas'] as core.int;
@@ -53476,8 +54773,8 @@
       mode = _json['mode'] as core.String;
     }
     if (_json.containsKey('scaleInControl')) {
-      scaleInControl =
-          AutoscalingPolicyScaleInControl.fromJson(_json['scaleInControl']);
+      scaleInControl = AutoscalingPolicyScaleInControl.fromJson(
+          _json['scaleInControl'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -53642,8 +54939,8 @@
 
   AutoscalingPolicyScaleInControl.fromJson(core.Map _json) {
     if (_json.containsKey('maxScaledInReplicas')) {
-      maxScaledInReplicas =
-          FixedOrPercent.fromJson(_json['maxScaledInReplicas']);
+      maxScaledInReplicas = FixedOrPercent.fromJson(
+          _json['maxScaledInReplicas'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeWindowSec')) {
       timeWindowSec = _json['timeWindowSec'] as core.int;
@@ -53962,7 +55259,8 @@
       bucketName = _json['bucketName'] as core.String;
     }
     if (_json.containsKey('cdnPolicy')) {
-      cdnPolicy = BackendBucketCdnPolicy.fromJson(_json['cdnPolicy']);
+      cdnPolicy = BackendBucketCdnPolicy.fromJson(
+          _json['cdnPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
@@ -54142,8 +55440,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<BackendBucketListWarningData>(
-              (value) => BackendBucketListWarningData.fromJson(value))
+          .map<BackendBucketListWarningData>((value) =>
+              BackendBucketListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -54198,7 +55497,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<BackendBucket>((value) => BackendBucket.fromJson(value))
+          .map<BackendBucket>((value) => BackendBucket.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -54211,7 +55511,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = BackendBucketListWarning.fromJson(_json['warning']);
+      warning = BackendBucketListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -54550,22 +55851,25 @@
     }
     if (_json.containsKey('backends')) {
       backends = (_json['backends'] as core.List)
-          .map<Backend>((value) => Backend.fromJson(value))
+          .map<Backend>((value) =>
+              Backend.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cdnPolicy')) {
-      cdnPolicy = BackendServiceCdnPolicy.fromJson(_json['cdnPolicy']);
+      cdnPolicy = BackendServiceCdnPolicy.fromJson(
+          _json['cdnPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('circuitBreakers')) {
-      circuitBreakers = CircuitBreakers.fromJson(_json['circuitBreakers']);
+      circuitBreakers = CircuitBreakers.fromJson(
+          _json['circuitBreakers'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('connectionDraining')) {
-      connectionDraining =
-          ConnectionDraining.fromJson(_json['connectionDraining']);
+      connectionDraining = ConnectionDraining.fromJson(
+          _json['connectionDraining'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('consistentHash')) {
-      consistentHash =
-          ConsistentHashLoadBalancerSettings.fromJson(_json['consistentHash']);
+      consistentHash = ConsistentHashLoadBalancerSettings.fromJson(
+          _json['consistentHash'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
@@ -54582,8 +55886,8 @@
       enableCDN = _json['enableCDN'] as core.bool;
     }
     if (_json.containsKey('failoverPolicy')) {
-      failoverPolicy =
-          BackendServiceFailoverPolicy.fromJson(_json['failoverPolicy']);
+      failoverPolicy = BackendServiceFailoverPolicy.fromJson(
+          _json['failoverPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fingerprint')) {
       fingerprint = _json['fingerprint'] as core.String;
@@ -54594,7 +55898,8 @@
           .toList();
     }
     if (_json.containsKey('iap')) {
-      iap = BackendServiceIAP.fromJson(_json['iap']);
+      iap = BackendServiceIAP.fromJson(
+          _json['iap'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -54609,7 +55914,8 @@
       localityLbPolicy = _json['localityLbPolicy'] as core.String;
     }
     if (_json.containsKey('logConfig')) {
-      logConfig = BackendServiceLogConfig.fromJson(_json['logConfig']);
+      logConfig = BackendServiceLogConfig.fromJson(
+          _json['logConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -54618,7 +55924,8 @@
       network = _json['network'] as core.String;
     }
     if (_json.containsKey('outlierDetection')) {
-      outlierDetection = OutlierDetection.fromJson(_json['outlierDetection']);
+      outlierDetection = OutlierDetection.fromJson(
+          _json['outlierDetection'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('port')) {
       port = _json['port'] as core.int;
@@ -54826,7 +56133,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<BackendServiceAggregatedListWarningData>((value) =>
-              BackendServiceAggregatedListWarningData.fromJson(value))
+              BackendServiceAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -54884,8 +56192,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, BackendServicesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => BackendServicesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => BackendServicesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -54902,7 +56212,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = BackendServiceAggregatedListWarning.fromJson(_json['warning']);
+      warning = BackendServiceAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -54956,7 +56267,8 @@
 
   BackendServiceCdnPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('cacheKeyPolicy')) {
-      cacheKeyPolicy = CacheKeyPolicy.fromJson(_json['cacheKeyPolicy']);
+      cacheKeyPolicy = CacheKeyPolicy.fromJson(
+          _json['cacheKeyPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('signedUrlCacheMaxAgeSec')) {
       signedUrlCacheMaxAgeSec = _json['signedUrlCacheMaxAgeSec'] as core.String;
@@ -55061,12 +56373,14 @@
   BackendServiceGroupHealth.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
       annotations = commons.mapMap<core.String, core.String>(
-          _json['annotations'].cast<core.String, core.String>(),
+          (_json['annotations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('healthStatus')) {
       healthStatus = (_json['healthStatus'] as core.List)
-          .map<HealthStatus>((value) => HealthStatus.fromJson(value))
+          .map<HealthStatus>((value) => HealthStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -55227,8 +56541,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<BackendServiceListWarningData>(
-              (value) => BackendServiceListWarningData.fromJson(value))
+          .map<BackendServiceListWarningData>((value) =>
+              BackendServiceListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -55284,7 +56599,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<BackendService>((value) => BackendService.fromJson(value))
+          .map<BackendService>((value) => BackendService.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -55297,7 +56613,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = BackendServiceListWarning.fromJson(_json['warning']);
+      warning = BackendServiceListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -55466,8 +56783,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<BackendServicesScopedListWarningData>(
-              (value) => BackendServicesScopedListWarningData.fromJson(value))
+          .map<BackendServicesScopedListWarningData>((value) =>
+              BackendServicesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -55503,11 +56821,13 @@
   BackendServicesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('backendServices')) {
       backendServices = (_json['backendServices'] as core.List)
-          .map<BackendService>((value) => BackendService.fromJson(value))
+          .map<BackendService>((value) => BackendService.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = BackendServicesScopedListWarning.fromJson(_json['warning']);
+      warning = BackendServicesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -55601,7 +56921,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -55906,8 +57227,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('licenseResource')) {
-      licenseResource =
-          LicenseResourceCommitment.fromJson(_json['licenseResource']);
+      licenseResource = LicenseResourceCommitment.fromJson(
+          _json['licenseResource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -55920,13 +57241,14 @@
     }
     if (_json.containsKey('reservations')) {
       reservations = (_json['reservations'] as core.List)
-          .map<Reservation>((value) => Reservation.fromJson(value))
+          .map<Reservation>((value) => Reservation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ResourceCommitment>(
-              (value) => ResourceCommitment.fromJson(value))
+          .map<ResourceCommitment>((value) => ResourceCommitment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -56081,8 +57403,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<CommitmentAggregatedListWarningData>(
-              (value) => CommitmentAggregatedListWarningData.fromJson(value))
+          .map<CommitmentAggregatedListWarningData>((value) =>
+              CommitmentAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -56140,8 +57463,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, CommitmentsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => CommitmentsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => CommitmentsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -56158,7 +57483,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = CommitmentAggregatedListWarning.fromJson(_json['warning']);
+      warning = CommitmentAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -56274,8 +57600,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<CommitmentListWarningData>(
-              (value) => CommitmentListWarningData.fromJson(value))
+          .map<CommitmentListWarningData>((value) =>
+              CommitmentListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -56331,7 +57658,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Commitment>((value) => Commitment.fromJson(value))
+          .map<Commitment>((value) =>
+              Commitment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -56344,7 +57672,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = CommitmentListWarning.fromJson(_json['warning']);
+      warning = CommitmentListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -56456,8 +57785,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<CommitmentsScopedListWarningData>(
-              (value) => CommitmentsScopedListWarningData.fromJson(value))
+          .map<CommitmentsScopedListWarningData>((value) =>
+              CommitmentsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -56493,11 +57823,13 @@
   CommitmentsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('commitments')) {
       commitments = (_json['commitments'] as core.List)
-          .map<Commitment>((value) => Commitment.fromJson(value))
+          .map<Commitment>((value) =>
+              Commitment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = CommitmentsScopedListWarning.fromJson(_json['warning']);
+      warning = CommitmentsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -56667,7 +57999,7 @@
   ConsistentHashLoadBalancerSettings.fromJson(core.Map _json) {
     if (_json.containsKey('httpCookie')) {
       httpCookie = ConsistentHashLoadBalancerSettingsHttpCookie.fromJson(
-          _json['httpCookie']);
+          _json['httpCookie'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpHeaderName')) {
       httpHeaderName = _json['httpHeaderName'] as core.String;
@@ -56714,7 +58046,8 @@
       path = _json['path'] as core.String;
     }
     if (_json.containsKey('ttl')) {
-      ttl = Duration.fromJson(_json['ttl']);
+      ttl = Duration.fromJson(
+          _json['ttl'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -56904,8 +58237,8 @@
 
   CustomerEncryptionKeyProtectedDisk.fromJson(core.Map _json) {
     if (_json.containsKey('diskEncryptionKey')) {
-      diskEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['diskEncryptionKey']);
+      diskEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['diskEncryptionKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('source')) {
       source = _json['source'] as core.String;
@@ -57237,12 +58570,13 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('diskEncryptionKey')) {
-      diskEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['diskEncryptionKey']);
+      diskEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['diskEncryptionKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('guestOsFeatures')) {
       guestOsFeatures = (_json['guestOsFeatures'] as core.List)
-          .map<GuestOsFeature>((value) => GuestOsFeature.fromJson(value))
+          .map<GuestOsFeature>((value) => GuestOsFeature.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -57256,7 +58590,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lastAttachTimestamp')) {
@@ -57313,8 +58648,9 @@
       sourceImage = _json['sourceImage'] as core.String;
     }
     if (_json.containsKey('sourceImageEncryptionKey')) {
-      sourceImageEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceImageEncryptionKey']);
+      sourceImageEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceImageEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceImageId')) {
       sourceImageId = _json['sourceImageId'] as core.String;
@@ -57323,8 +58659,9 @@
       sourceSnapshot = _json['sourceSnapshot'] as core.String;
     }
     if (_json.containsKey('sourceSnapshotEncryptionKey')) {
-      sourceSnapshotEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceSnapshotEncryptionKey']);
+      sourceSnapshotEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceSnapshotEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceSnapshotId')) {
       sourceSnapshotId = _json['sourceSnapshotId'] as core.String;
@@ -57532,8 +58869,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<DiskAggregatedListWarningData>(
-              (value) => DiskAggregatedListWarningData.fromJson(value))
+          .map<DiskAggregatedListWarningData>((value) =>
+              DiskAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -57591,8 +58929,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, DisksScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => DisksScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => DisksScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -57609,7 +58949,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = DiskAggregatedListWarning.fromJson(_json['warning']);
+      warning = DiskAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -57799,8 +59140,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<DiskListWarningData>(
-              (value) => DiskListWarningData.fromJson(value))
+          .map<DiskListWarningData>((value) => DiskListWarningData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -57856,7 +59197,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Disk>((value) => Disk.fromJson(value))
+          .map<Disk>((value) =>
+              Disk.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -57869,7 +59211,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = DiskListWarning.fromJson(_json['warning']);
+      warning = DiskListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -58004,7 +59347,8 @@
       defaultDiskSizeGb = _json['defaultDiskSizeGb'] as core.String;
     }
     if (_json.containsKey('deprecated')) {
-      deprecated = DeprecationStatus.fromJson(_json['deprecated']);
+      deprecated = DeprecationStatus.fromJson(
+          _json['deprecated'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -58154,8 +59498,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<DiskTypeAggregatedListWarningData>(
-              (value) => DiskTypeAggregatedListWarningData.fromJson(value))
+          .map<DiskTypeAggregatedListWarningData>((value) =>
+              DiskTypeAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -58212,8 +59557,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, DiskTypesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => DiskTypesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => DiskTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -58230,7 +59577,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = DiskTypeAggregatedListWarning.fromJson(_json['warning']);
+      warning = DiskTypeAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -58346,8 +59694,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<DiskTypeListWarningData>(
-              (value) => DiskTypeListWarningData.fromJson(value))
+          .map<DiskTypeListWarningData>((value) =>
+              DiskTypeListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -58403,7 +59752,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<DiskType>((value) => DiskType.fromJson(value))
+          .map<DiskType>((value) =>
+              DiskType.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -58416,7 +59766,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = DiskTypeListWarning.fromJson(_json['warning']);
+      warning = DiskTypeListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -58528,8 +59879,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<DiskTypesScopedListWarningData>(
-              (value) => DiskTypesScopedListWarningData.fromJson(value))
+          .map<DiskTypesScopedListWarningData>((value) =>
+              DiskTypesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -58565,11 +59917,13 @@
   DiskTypesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('diskTypes')) {
       diskTypes = (_json['diskTypes'] as core.List)
-          .map<DiskType>((value) => DiskType.fromJson(value))
+          .map<DiskType>((value) =>
+              DiskType.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = DiskTypesScopedListWarning.fromJson(_json['warning']);
+      warning = DiskTypesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -58737,8 +60091,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<DisksScopedListWarningData>(
-              (value) => DisksScopedListWarningData.fromJson(value))
+          .map<DisksScopedListWarningData>((value) =>
+              DisksScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -58774,11 +60129,13 @@
   DisksScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('disks')) {
       disks = (_json['disks'] as core.List)
-          .map<Disk>((value) => Disk.fromJson(value))
+          .map<Disk>((value) =>
+              Disk.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = DisksScopedListWarning.fromJson(_json['warning']);
+      warning = DisksScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -58826,8 +60183,9 @@
   DistributionPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('zones')) {
       zones = (_json['zones'] as core.List)
-          .map<DistributionPolicyZoneConfiguration>(
-              (value) => DistributionPolicyZoneConfiguration.fromJson(value))
+          .map<DistributionPolicyZoneConfiguration>((value) =>
+              DistributionPolicyZoneConfiguration.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -59048,8 +60406,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ExchangedPeeringRoutesListWarningData>(
-              (value) => ExchangedPeeringRoutesListWarningData.fromJson(value))
+          .map<ExchangedPeeringRoutesListWarningData>((value) =>
+              ExchangedPeeringRoutesListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -59104,8 +60463,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ExchangedPeeringRoute>(
-              (value) => ExchangedPeeringRoute.fromJson(value))
+          .map<ExchangedPeeringRoute>((value) => ExchangedPeeringRoute.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -59118,7 +60477,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = ExchangedPeeringRoutesListWarning.fromJson(_json['warning']);
+      warning = ExchangedPeeringRoutesListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -59314,8 +60674,9 @@
     }
     if (_json.containsKey('interfaces')) {
       interfaces = (_json['interfaces'] as core.List)
-          .map<ExternalVpnGatewayInterface>(
-              (value) => ExternalVpnGatewayInterface.fromJson(value))
+          .map<ExternalVpnGatewayInterface>((value) =>
+              ExternalVpnGatewayInterface.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -59326,7 +60687,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -59496,8 +60858,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ExternalVpnGatewayListWarningData>(
-              (value) => ExternalVpnGatewayListWarningData.fromJson(value))
+          .map<ExternalVpnGatewayListWarningData>((value) =>
+              ExternalVpnGatewayListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -59558,8 +60921,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ExternalVpnGateway>(
-              (value) => ExternalVpnGateway.fromJson(value))
+          .map<ExternalVpnGateway>((value) => ExternalVpnGateway.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -59572,7 +60935,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = ExternalVpnGatewayListWarning.fromJson(_json['warning']);
+      warning = ExternalVpnGatewayListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -59861,7 +61225,8 @@
   Firewall.fromJson(core.Map _json) {
     if (_json.containsKey('allowed')) {
       allowed = (_json['allowed'] as core.List)
-          .map<FirewallAllowed>((value) => FirewallAllowed.fromJson(value))
+          .map<FirewallAllowed>((value) => FirewallAllowed.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creationTimestamp')) {
@@ -59869,7 +61234,8 @@
     }
     if (_json.containsKey('denied')) {
       denied = (_json['denied'] as core.List)
-          .map<FirewallDenied>((value) => FirewallDenied.fromJson(value))
+          .map<FirewallDenied>((value) => FirewallDenied.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('description')) {
@@ -59893,7 +61259,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('logConfig')) {
-      logConfig = FirewallLogConfig.fromJson(_json['logConfig']);
+      logConfig = FirewallLogConfig.fromJson(
+          _json['logConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -60080,8 +61447,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<FirewallListWarningData>(
-              (value) => FirewallListWarningData.fromJson(value))
+          .map<FirewallListWarningData>((value) =>
+              FirewallListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -60137,7 +61505,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Firewall>((value) => Firewall.fromJson(value))
+          .map<Firewall>((value) =>
+              Firewall.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -60150,7 +61519,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = FirewallListWarning.fromJson(_json['warning']);
+      warning = FirewallListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -60604,7 +61974,8 @@
     }
     if (_json.containsKey('metadataFilters')) {
       metadataFilters = (_json['metadataFilters'] as core.List)
-          .map<MetadataFilter>((value) => MetadataFilter.fromJson(value))
+          .map<MetadataFilter>((value) => MetadataFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -60810,7 +62181,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<ForwardingRuleAggregatedListWarningData>((value) =>
-              ForwardingRuleAggregatedListWarningData.fromJson(value))
+              ForwardingRuleAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -60868,8 +62240,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, ForwardingRulesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => ForwardingRulesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ForwardingRulesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -60886,7 +62260,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = ForwardingRuleAggregatedListWarning.fromJson(_json['warning']);
+      warning = ForwardingRuleAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -61002,8 +62377,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ForwardingRuleListWarningData>(
-              (value) => ForwardingRuleListWarningData.fromJson(value))
+          .map<ForwardingRuleListWarningData>((value) =>
+              ForwardingRuleListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -61058,7 +62434,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ForwardingRule>((value) => ForwardingRule.fromJson(value))
+          .map<ForwardingRule>((value) => ForwardingRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -61071,7 +62448,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = ForwardingRuleListWarning.fromJson(_json['warning']);
+      warning = ForwardingRuleListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -61203,8 +62581,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ForwardingRulesScopedListWarningData>(
-              (value) => ForwardingRulesScopedListWarningData.fromJson(value))
+          .map<ForwardingRulesScopedListWarningData>((value) =>
+              ForwardingRulesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -61240,11 +62619,13 @@
   ForwardingRulesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('forwardingRules')) {
       forwardingRules = (_json['forwardingRules'] as core.List)
-          .map<ForwardingRule>((value) => ForwardingRule.fromJson(value))
+          .map<ForwardingRule>((value) => ForwardingRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = ForwardingRulesScopedListWarning.fromJson(_json['warning']);
+      warning = ForwardingRulesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -61343,7 +62724,8 @@
   GlobalNetworkEndpointGroupsAttachEndpointsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('networkEndpoints')) {
       networkEndpoints = (_json['networkEndpoints'] as core.List)
-          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(value))
+          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -61367,7 +62749,8 @@
   GlobalNetworkEndpointGroupsDetachEndpointsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('networkEndpoints')) {
       networkEndpoints = (_json['networkEndpoints'] as core.List)
-          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(value))
+          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -61415,7 +62798,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -61457,14 +62841,16 @@
   GlobalSetPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -61515,7 +62901,8 @@
       queryPath = _json['queryPath'] as core.String;
     }
     if (_json.containsKey('queryValue')) {
-      queryValue = GuestAttributesValue.fromJson(_json['queryValue']);
+      queryValue = GuestAttributesValue.fromJson(
+          _json['queryValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -61601,8 +62988,8 @@
   GuestAttributesValue.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<GuestAttributesEntry>(
-              (value) => GuestAttributesEntry.fromJson(value))
+          .map<GuestAttributesEntry>((value) => GuestAttributesEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -62045,19 +63432,23 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('grpcHealthCheck')) {
-      grpcHealthCheck = GRPCHealthCheck.fromJson(_json['grpcHealthCheck']);
+      grpcHealthCheck = GRPCHealthCheck.fromJson(
+          _json['grpcHealthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('healthyThreshold')) {
       healthyThreshold = _json['healthyThreshold'] as core.int;
     }
     if (_json.containsKey('http2HealthCheck')) {
-      http2HealthCheck = HTTP2HealthCheck.fromJson(_json['http2HealthCheck']);
+      http2HealthCheck = HTTP2HealthCheck.fromJson(
+          _json['http2HealthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpHealthCheck')) {
-      httpHealthCheck = HTTPHealthCheck.fromJson(_json['httpHealthCheck']);
+      httpHealthCheck = HTTPHealthCheck.fromJson(
+          _json['httpHealthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpsHealthCheck')) {
-      httpsHealthCheck = HTTPSHealthCheck.fromJson(_json['httpsHealthCheck']);
+      httpsHealthCheck = HTTPSHealthCheck.fromJson(
+          _json['httpsHealthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -62075,10 +63466,12 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('sslHealthCheck')) {
-      sslHealthCheck = SSLHealthCheck.fromJson(_json['sslHealthCheck']);
+      sslHealthCheck = SSLHealthCheck.fromJson(
+          _json['sslHealthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tcpHealthCheck')) {
-      tcpHealthCheck = TCPHealthCheck.fromJson(_json['tcpHealthCheck']);
+      tcpHealthCheck = TCPHealthCheck.fromJson(
+          _json['tcpHealthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeoutSec')) {
       timeoutSec = _json['timeoutSec'] as core.int;
@@ -62234,8 +63627,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<HealthCheckListWarningData>(
-              (value) => HealthCheckListWarningData.fromJson(value))
+          .map<HealthCheckListWarningData>((value) =>
+              HealthCheckListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -62290,7 +63684,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<HealthCheck>((value) => HealthCheck.fromJson(value))
+          .map<HealthCheck>((value) => HealthCheck.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -62303,7 +63698,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = HealthCheckListWarning.fromJson(_json['warning']);
+      warning = HealthCheckListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -62643,8 +64039,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<HealthCheckServicesListWarningData>(
-              (value) => HealthCheckServicesListWarningData.fromJson(value))
+          .map<HealthCheckServicesListWarningData>((value) =>
+              HealthCheckServicesListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -62699,8 +64096,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<HealthCheckService>(
-              (value) => HealthCheckService.fromJson(value))
+          .map<HealthCheckService>((value) => HealthCheckService.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -62713,7 +64110,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = HealthCheckServicesListWarning.fromJson(_json['warning']);
+      warning = HealthCheckServicesListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -62824,8 +64222,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<HealthChecksAggregatedListWarningData>(
-              (value) => HealthChecksAggregatedListWarningData.fromJson(value))
+          .map<HealthChecksAggregatedListWarningData>((value) =>
+              HealthChecksAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -62882,8 +64281,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, HealthChecksScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => HealthChecksScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => HealthChecksScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -62900,7 +64301,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = HealthChecksAggregatedListWarning.fromJson(_json['warning']);
+      warning = HealthChecksAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -63017,8 +64419,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<HealthChecksScopedListWarningData>(
-              (value) => HealthChecksScopedListWarningData.fromJson(value))
+          .map<HealthChecksScopedListWarningData>((value) =>
+              HealthChecksScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -63054,11 +64457,13 @@
   HealthChecksScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('healthChecks')) {
       healthChecks = (_json['healthChecks'] as core.List)
-          .map<HealthCheck>((value) => HealthCheck.fromJson(value))
+          .map<HealthCheck>((value) => HealthCheck.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = HealthChecksScopedListWarning.fromJson(_json['warning']);
+      warning = HealthChecksScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -63100,7 +64505,8 @@
   HealthStatus.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
       annotations = commons.mapMap<core.String, core.String>(
-          _json['annotations'].cast<core.String, core.String>(),
+          (_json['annotations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('healthState')) {
@@ -63168,19 +64574,20 @@
 
   HealthStatusForNetworkEndpoint.fromJson(core.Map _json) {
     if (_json.containsKey('backendService')) {
-      backendService =
-          BackendServiceReference.fromJson(_json['backendService']);
+      backendService = BackendServiceReference.fromJson(
+          _json['backendService'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('forwardingRule')) {
-      forwardingRule =
-          ForwardingRuleReference.fromJson(_json['forwardingRule']);
+      forwardingRule = ForwardingRuleReference.fromJson(
+          _json['forwardingRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('healthCheck')) {
-      healthCheck = HealthCheckReference.fromJson(_json['healthCheck']);
+      healthCheck = HealthCheckReference.fromJson(
+          _json['healthCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('healthCheckService')) {
-      healthCheckService =
-          HealthCheckServiceReference.fromJson(_json['healthCheckService']);
+      healthCheckService = HealthCheckServiceReference.fromJson(
+          _json['healthCheckService'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('healthState')) {
       healthState = _json['healthState'] as core.String;
@@ -63307,7 +64714,8 @@
 
   HttpFaultDelay.fromJson(core.Map _json) {
     if (_json.containsKey('fixedDelay')) {
-      fixedDelay = Duration.fromJson(_json['fixedDelay']);
+      fixedDelay = Duration.fromJson(
+          _json['fixedDelay'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('percentage')) {
       percentage = (_json['percentage'] as core.num).toDouble();
@@ -63345,10 +64753,12 @@
 
   HttpFaultInjection.fromJson(core.Map _json) {
     if (_json.containsKey('abort')) {
-      abort = HttpFaultAbort.fromJson(_json['abort']);
+      abort = HttpFaultAbort.fromJson(
+          _json['abort'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delay')) {
-      delay = HttpFaultDelay.fromJson(_json['delay']);
+      delay = HttpFaultDelay.fromJson(
+          _json['delay'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -63388,7 +64798,8 @@
   HttpHeaderAction.fromJson(core.Map _json) {
     if (_json.containsKey('requestHeadersToAdd')) {
       requestHeadersToAdd = (_json['requestHeadersToAdd'] as core.List)
-          .map<HttpHeaderOption>((value) => HttpHeaderOption.fromJson(value))
+          .map<HttpHeaderOption>((value) => HttpHeaderOption.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestHeadersToRemove')) {
@@ -63398,7 +64809,8 @@
     }
     if (_json.containsKey('responseHeadersToAdd')) {
       responseHeadersToAdd = (_json['responseHeadersToAdd'] as core.List)
-          .map<HttpHeaderOption>((value) => HttpHeaderOption.fromJson(value))
+          .map<HttpHeaderOption>((value) => HttpHeaderOption.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('responseHeadersToRemove')) {
@@ -63516,7 +64928,8 @@
       presentMatch = _json['presentMatch'] as core.bool;
     }
     if (_json.containsKey('rangeMatch')) {
-      rangeMatch = Int64RangeMatch.fromJson(_json['rangeMatch']);
+      rangeMatch = Int64RangeMatch.fromJson(
+          _json['rangeMatch'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('regexMatch')) {
       regexMatch = _json['regexMatch'] as core.String;
@@ -63833,8 +65246,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<HttpHealthCheckListWarningData>(
-              (value) => HttpHealthCheckListWarningData.fromJson(value))
+          .map<HttpHealthCheckListWarningData>((value) =>
+              HttpHealthCheckListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -63889,7 +65303,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<HttpHealthCheck>((value) => HttpHealthCheck.fromJson(value))
+          .map<HttpHealthCheck>((value) => HttpHealthCheck.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -63902,7 +65317,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = HttpHealthCheckListWarning.fromJson(_json['warning']);
+      warning = HttpHealthCheckListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -64137,7 +65553,8 @@
       numRetries = _json['numRetries'] as core.int;
     }
     if (_json.containsKey('perTryTimeout')) {
-      perTryTimeout = Duration.fromJson(_json['perTryTimeout']);
+      perTryTimeout = Duration.fromJson(
+          _json['perTryTimeout'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retryConditions')) {
       retryConditions = (_json['retryConditions'] as core.List)
@@ -64224,29 +65641,34 @@
 
   HttpRouteAction.fromJson(core.Map _json) {
     if (_json.containsKey('corsPolicy')) {
-      corsPolicy = CorsPolicy.fromJson(_json['corsPolicy']);
+      corsPolicy = CorsPolicy.fromJson(
+          _json['corsPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('faultInjectionPolicy')) {
-      faultInjectionPolicy =
-          HttpFaultInjection.fromJson(_json['faultInjectionPolicy']);
+      faultInjectionPolicy = HttpFaultInjection.fromJson(
+          _json['faultInjectionPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestMirrorPolicy')) {
-      requestMirrorPolicy =
-          RequestMirrorPolicy.fromJson(_json['requestMirrorPolicy']);
+      requestMirrorPolicy = RequestMirrorPolicy.fromJson(
+          _json['requestMirrorPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retryPolicy')) {
-      retryPolicy = HttpRetryPolicy.fromJson(_json['retryPolicy']);
+      retryPolicy = HttpRetryPolicy.fromJson(
+          _json['retryPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeout')) {
-      timeout = Duration.fromJson(_json['timeout']);
+      timeout = Duration.fromJson(
+          _json['timeout'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('urlRewrite')) {
-      urlRewrite = UrlRewrite.fromJson(_json['urlRewrite']);
+      urlRewrite = UrlRewrite.fromJson(
+          _json['urlRewrite'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('weightedBackendServices')) {
       weightedBackendServices = (_json['weightedBackendServices'] as core.List)
-          .map<WeightedBackendService>(
-              (value) => WeightedBackendService.fromJson(value))
+          .map<WeightedBackendService>((value) =>
+              WeightedBackendService.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -64354,25 +65776,28 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('headerAction')) {
-      headerAction = HttpHeaderAction.fromJson(_json['headerAction']);
+      headerAction = HttpHeaderAction.fromJson(
+          _json['headerAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('matchRules')) {
       matchRules = (_json['matchRules'] as core.List)
-          .map<HttpRouteRuleMatch>(
-              (value) => HttpRouteRuleMatch.fromJson(value))
+          .map<HttpRouteRuleMatch>((value) => HttpRouteRuleMatch.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('priority')) {
       priority = _json['priority'] as core.int;
     }
     if (_json.containsKey('routeAction')) {
-      routeAction = HttpRouteAction.fromJson(_json['routeAction']);
+      routeAction = HttpRouteAction.fromJson(
+          _json['routeAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('service')) {
       service = _json['service'] as core.String;
     }
     if (_json.containsKey('urlRedirect')) {
-      urlRedirect = HttpRedirectAction.fromJson(_json['urlRedirect']);
+      urlRedirect = HttpRedirectAction.fromJson(
+          _json['urlRedirect'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -64473,7 +65898,8 @@
     }
     if (_json.containsKey('headerMatches')) {
       headerMatches = (_json['headerMatches'] as core.List)
-          .map<HttpHeaderMatch>((value) => HttpHeaderMatch.fromJson(value))
+          .map<HttpHeaderMatch>((value) => HttpHeaderMatch.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('ignoreCase')) {
@@ -64481,7 +65907,8 @@
     }
     if (_json.containsKey('metadataFilters')) {
       metadataFilters = (_json['metadataFilters'] as core.List)
-          .map<MetadataFilter>((value) => MetadataFilter.fromJson(value))
+          .map<MetadataFilter>((value) => MetadataFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('prefixMatch')) {
@@ -64489,8 +65916,9 @@
     }
     if (_json.containsKey('queryParameterMatches')) {
       queryParameterMatches = (_json['queryParameterMatches'] as core.List)
-          .map<HttpQueryParameterMatch>(
-              (value) => HttpQueryParameterMatch.fromJson(value))
+          .map<HttpQueryParameterMatch>((value) =>
+              HttpQueryParameterMatch.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('regexMatch')) {
@@ -64761,8 +66189,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<HttpsHealthCheckListWarningData>(
-              (value) => HttpsHealthCheckListWarningData.fromJson(value))
+          .map<HttpsHealthCheckListWarningData>((value) =>
+              HttpsHealthCheckListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -64817,7 +66246,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<HttpsHealthCheck>((value) => HttpsHealthCheck.fromJson(value))
+          .map<HttpsHealthCheck>((value) => HttpsHealthCheck.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -64830,7 +66260,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = HttpsHealthCheckListWarning.fromJson(_json['warning']);
+      warning = HttpsHealthCheckListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -65094,7 +66525,8 @@
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('deprecated')) {
-      deprecated = DeprecationStatus.fromJson(_json['deprecated']);
+      deprecated = DeprecationStatus.fromJson(
+          _json['deprecated'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -65107,15 +66539,16 @@
     }
     if (_json.containsKey('guestOsFeatures')) {
       guestOsFeatures = (_json['guestOsFeatures'] as core.List)
-          .map<GuestOsFeature>((value) => GuestOsFeature.fromJson(value))
+          .map<GuestOsFeature>((value) => GuestOsFeature.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('imageEncryptionKey')) {
-      imageEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['imageEncryptionKey']);
+      imageEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['imageEncryptionKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -65125,7 +66558,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('licenseCodes')) {
@@ -65142,21 +66576,24 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('rawDisk')) {
-      rawDisk = ImageRawDisk.fromJson(_json['rawDisk']);
+      rawDisk = ImageRawDisk.fromJson(
+          _json['rawDisk'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('shieldedInstanceInitialState')) {
-      shieldedInstanceInitialState =
-          InitialStateConfig.fromJson(_json['shieldedInstanceInitialState']);
+      shieldedInstanceInitialState = InitialStateConfig.fromJson(
+          _json['shieldedInstanceInitialState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceDisk')) {
       sourceDisk = _json['sourceDisk'] as core.String;
     }
     if (_json.containsKey('sourceDiskEncryptionKey')) {
-      sourceDiskEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceDiskEncryptionKey']);
+      sourceDiskEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceDiskEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceDiskId')) {
       sourceDiskId = _json['sourceDiskId'] as core.String;
@@ -65165,8 +66602,9 @@
       sourceImage = _json['sourceImage'] as core.String;
     }
     if (_json.containsKey('sourceImageEncryptionKey')) {
-      sourceImageEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceImageEncryptionKey']);
+      sourceImageEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceImageEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceImageId')) {
       sourceImageId = _json['sourceImageId'] as core.String;
@@ -65175,8 +66613,9 @@
       sourceSnapshot = _json['sourceSnapshot'] as core.String;
     }
     if (_json.containsKey('sourceSnapshotEncryptionKey')) {
-      sourceSnapshotEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceSnapshotEncryptionKey']);
+      sourceSnapshotEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceSnapshotEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceSnapshotId')) {
       sourceSnapshotId = _json['sourceSnapshotId'] as core.String;
@@ -65376,8 +66815,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ImageListWarningData>(
-              (value) => ImageListWarningData.fromJson(value))
+          .map<ImageListWarningData>((value) => ImageListWarningData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -65432,7 +66871,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Image>((value) => Image.fromJson(value))
+          .map<Image>((value) =>
+              Image.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -65445,7 +66885,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = ImageListWarning.fromJson(_json['warning']);
+      warning = ImageListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -65493,21 +66934,25 @@
   InitialStateConfig.fromJson(core.Map _json) {
     if (_json.containsKey('dbs')) {
       dbs = (_json['dbs'] as core.List)
-          .map<FileContentBuffer>((value) => FileContentBuffer.fromJson(value))
+          .map<FileContentBuffer>((value) => FileContentBuffer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dbxs')) {
       dbxs = (_json['dbxs'] as core.List)
-          .map<FileContentBuffer>((value) => FileContentBuffer.fromJson(value))
+          .map<FileContentBuffer>((value) => FileContentBuffer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('keks')) {
       keks = (_json['keks'] as core.List)
-          .map<FileContentBuffer>((value) => FileContentBuffer.fromJson(value))
+          .map<FileContentBuffer>((value) => FileContentBuffer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pk')) {
-      pk = FileContentBuffer.fromJson(_json['pk']);
+      pk = FileContentBuffer.fromJson(
+          _json['pk'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -65733,7 +67178,8 @@
     }
     if (_json.containsKey('confidentialInstanceConfig')) {
       confidentialInstanceConfig = ConfidentialInstanceConfig.fromJson(
-          _json['confidentialInstanceConfig']);
+          _json['confidentialInstanceConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cpuPlatform')) {
       cpuPlatform = _json['cpuPlatform'] as core.String;
@@ -65749,18 +67195,21 @@
     }
     if (_json.containsKey('disks')) {
       disks = (_json['disks'] as core.List)
-          .map<AttachedDisk>((value) => AttachedDisk.fromJson(value))
+          .map<AttachedDisk>((value) => AttachedDisk.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('displayDevice')) {
-      displayDevice = DisplayDevice.fromJson(_json['displayDevice']);
+      displayDevice = DisplayDevice.fromJson(
+          _json['displayDevice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fingerprint')) {
       fingerprint = _json['fingerprint'] as core.String;
     }
     if (_json.containsKey('guestAccelerators')) {
       guestAccelerators = (_json['guestAccelerators'] as core.List)
-          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(value))
+          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('hostname')) {
@@ -65777,14 +67226,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('machineType')) {
       machineType = _json['machineType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = Metadata.fromJson(_json['metadata']);
+      metadata = Metadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minCpuPlatform')) {
       minCpuPlatform = _json['minCpuPlatform'] as core.String;
@@ -65794,15 +67245,16 @@
     }
     if (_json.containsKey('networkInterfaces')) {
       networkInterfaces = (_json['networkInterfaces'] as core.List)
-          .map<NetworkInterface>((value) => NetworkInterface.fromJson(value))
+          .map<NetworkInterface>((value) => NetworkInterface.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('privateIpv6GoogleAccess')) {
       privateIpv6GoogleAccess = _json['privateIpv6GoogleAccess'] as core.String;
     }
     if (_json.containsKey('reservationAffinity')) {
-      reservationAffinity =
-          ReservationAffinity.fromJson(_json['reservationAffinity']);
+      reservationAffinity = ReservationAffinity.fromJson(
+          _json['reservationAffinity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourcePolicies')) {
       resourcePolicies = (_json['resourcePolicies'] as core.List)
@@ -65810,24 +67262,28 @@
           .toList();
     }
     if (_json.containsKey('scheduling')) {
-      scheduling = Scheduling.fromJson(_json['scheduling']);
+      scheduling = Scheduling.fromJson(
+          _json['scheduling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('serviceAccounts')) {
       serviceAccounts = (_json['serviceAccounts'] as core.List)
-          .map<ServiceAccount>((value) => ServiceAccount.fromJson(value))
+          .map<ServiceAccount>((value) => ServiceAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shieldedInstanceConfig')) {
-      shieldedInstanceConfig =
-          ShieldedInstanceConfig.fromJson(_json['shieldedInstanceConfig']);
+      shieldedInstanceConfig = ShieldedInstanceConfig.fromJson(
+          _json['shieldedInstanceConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shieldedInstanceIntegrityPolicy')) {
       shieldedInstanceIntegrityPolicy =
           ShieldedInstanceIntegrityPolicy.fromJson(
-              _json['shieldedInstanceIntegrityPolicy']);
+              _json['shieldedInstanceIntegrityPolicy']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startRestricted')) {
       startRestricted = _json['startRestricted'] as core.bool;
@@ -65839,7 +67295,8 @@
       statusMessage = _json['statusMessage'] as core.String;
     }
     if (_json.containsKey('tags')) {
-      tags = Tags.fromJson(_json['tags']);
+      tags =
+          Tags.fromJson(_json['tags'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -66038,8 +67495,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceAggregatedListWarningData>(
-              (value) => InstanceAggregatedListWarningData.fromJson(value))
+          .map<InstanceAggregatedListWarningData>((value) =>
+              InstanceAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -66097,8 +67555,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, InstancesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => InstancesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => InstancesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -66115,7 +67575,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceAggregatedListWarning.fromJson(_json['warning']);
+      warning = InstanceAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -66257,7 +67718,8 @@
     }
     if (_json.containsKey('namedPorts')) {
       namedPorts = (_json['namedPorts'] as core.List)
-          .map<NamedPort>((value) => NamedPort.fromJson(value))
+          .map<NamedPort>((value) =>
+              NamedPort.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('network')) {
@@ -66408,8 +67870,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceGroupAggregatedListWarningData>(
-              (value) => InstanceGroupAggregatedListWarningData.fromJson(value))
+          .map<InstanceGroupAggregatedListWarningData>((value) =>
+              InstanceGroupAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -66468,8 +67931,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, InstanceGroupsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => InstanceGroupsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => InstanceGroupsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -66486,7 +67951,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceGroupAggregatedListWarning.fromJson(_json['warning']);
+      warning = InstanceGroupAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -66602,8 +68068,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceGroupListWarningData>(
-              (value) => InstanceGroupListWarningData.fromJson(value))
+          .map<InstanceGroupListWarningData>((value) =>
+              InstanceGroupListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -66659,7 +68126,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceGroup>((value) => InstanceGroup.fromJson(value))
+          .map<InstanceGroup>((value) => InstanceGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -66672,7 +68140,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceGroupListWarning.fromJson(_json['warning']);
+      warning = InstanceGroupListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -66826,8 +68295,9 @@
   InstanceGroupManager.fromJson(core.Map _json) {
     if (_json.containsKey('autoHealingPolicies')) {
       autoHealingPolicies = (_json['autoHealingPolicies'] as core.List)
-          .map<InstanceGroupManagerAutoHealingPolicy>(
-              (value) => InstanceGroupManagerAutoHealingPolicy.fromJson(value))
+          .map<InstanceGroupManagerAutoHealingPolicy>((value) =>
+              InstanceGroupManagerAutoHealingPolicy.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('baseInstanceName')) {
@@ -66837,15 +68307,15 @@
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('currentActions')) {
-      currentActions =
-          InstanceGroupManagerActionsSummary.fromJson(_json['currentActions']);
+      currentActions = InstanceGroupManagerActionsSummary.fromJson(
+          _json['currentActions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('distributionPolicy')) {
-      distributionPolicy =
-          DistributionPolicy.fromJson(_json['distributionPolicy']);
+      distributionPolicy = DistributionPolicy.fromJson(
+          _json['distributionPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fingerprint')) {
       fingerprint = _json['fingerprint'] as core.String;
@@ -66867,7 +68337,8 @@
     }
     if (_json.containsKey('namedPorts')) {
       namedPorts = (_json['namedPorts'] as core.List)
-          .map<NamedPort>((value) => NamedPort.fromJson(value))
+          .map<NamedPort>((value) =>
+              NamedPort.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('region')) {
@@ -66877,10 +68348,12 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('statefulPolicy')) {
-      statefulPolicy = StatefulPolicy.fromJson(_json['statefulPolicy']);
+      statefulPolicy = StatefulPolicy.fromJson(
+          _json['statefulPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = InstanceGroupManagerStatus.fromJson(_json['status']);
+      status = InstanceGroupManagerStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetPools')) {
       targetPools = (_json['targetPools'] as core.List)
@@ -66891,13 +68364,14 @@
       targetSize = _json['targetSize'] as core.int;
     }
     if (_json.containsKey('updatePolicy')) {
-      updatePolicy =
-          InstanceGroupManagerUpdatePolicy.fromJson(_json['updatePolicy']);
+      updatePolicy = InstanceGroupManagerUpdatePolicy.fromJson(
+          _json['updatePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('versions')) {
       versions = (_json['versions'] as core.List)
-          .map<InstanceGroupManagerVersion>(
-              (value) => InstanceGroupManagerVersion.fromJson(value))
+          .map<InstanceGroupManagerVersion>((value) =>
+              InstanceGroupManagerVersion.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('zone')) {
@@ -67178,7 +68652,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<InstanceGroupManagerAggregatedListWarningData>((value) =>
-              InstanceGroupManagerAggregatedListWarningData.fromJson(value))
+              InstanceGroupManagerAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -67237,8 +68712,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, InstanceGroupManagersScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => InstanceGroupManagersScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => InstanceGroupManagersScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -67255,8 +68732,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning =
-          InstanceGroupManagerAggregatedListWarning.fromJson(_json['warning']);
+      warning = InstanceGroupManagerAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -67407,8 +68884,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceGroupManagerListWarningData>(
-              (value) => InstanceGroupManagerListWarningData.fromJson(value))
+          .map<InstanceGroupManagerListWarningData>((value) =>
+              InstanceGroupManagerListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -67464,8 +68942,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceGroupManager>(
-              (value) => InstanceGroupManager.fromJson(value))
+          .map<InstanceGroupManager>((value) => InstanceGroupManager.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -67478,7 +68956,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceGroupManagerListWarning.fromJson(_json['warning']);
+      warning = InstanceGroupManagerListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -67536,11 +69015,12 @@
       isStable = _json['isStable'] as core.bool;
     }
     if (_json.containsKey('stateful')) {
-      stateful = InstanceGroupManagerStatusStateful.fromJson(_json['stateful']);
+      stateful = InstanceGroupManagerStatusStateful.fromJson(
+          _json['stateful'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('versionTarget')) {
       versionTarget = InstanceGroupManagerStatusVersionTarget.fromJson(
-          _json['versionTarget']);
+          _json['versionTarget'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -67583,7 +69063,8 @@
     if (_json.containsKey('perInstanceConfigs')) {
       perInstanceConfigs =
           InstanceGroupManagerStatusStatefulPerInstanceConfigs.fromJson(
-              _json['perInstanceConfigs']);
+              _json['perInstanceConfigs']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -67724,10 +69205,12 @@
           _json['instanceRedistributionType'] as core.String;
     }
     if (_json.containsKey('maxSurge')) {
-      maxSurge = FixedOrPercent.fromJson(_json['maxSurge']);
+      maxSurge = FixedOrPercent.fromJson(
+          _json['maxSurge'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxUnavailable')) {
-      maxUnavailable = FixedOrPercent.fromJson(_json['maxUnavailable']);
+      maxUnavailable = FixedOrPercent.fromJson(
+          _json['maxUnavailable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minimalAction')) {
       minimalAction = _json['minimalAction'] as core.String;
@@ -67797,7 +69280,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('targetSize')) {
-      targetSize = FixedOrPercent.fromJson(_json['targetSize']);
+      targetSize = FixedOrPercent.fromJson(
+          _json['targetSize'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -67921,7 +69405,8 @@
   InstanceGroupManagersCreateInstancesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -68000,8 +69485,9 @@
   InstanceGroupManagersListErrorsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceManagedByIgmError>(
-              (value) => InstanceManagedByIgmError.fromJson(value))
+          .map<InstanceManagedByIgmError>((value) =>
+              InstanceManagedByIgmError.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -68037,7 +69523,8 @@
   InstanceGroupManagersListManagedInstancesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('managedInstances')) {
       managedInstances = (_json['managedInstances'] as core.List)
-          .map<ManagedInstance>((value) => ManagedInstance.fromJson(value))
+          .map<ManagedInstance>((value) => ManagedInstance.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -68146,7 +69633,7 @@
           .map<InstanceGroupManagersListPerInstanceConfigsRespWarningData>(
               (value) =>
                   InstanceGroupManagersListPerInstanceConfigsRespWarningData
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -68188,7 +69675,8 @@
   InstanceGroupManagersListPerInstanceConfigsResp.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -68196,7 +69684,7 @@
     }
     if (_json.containsKey('warning')) {
       warning = InstanceGroupManagersListPerInstanceConfigsRespWarning.fromJson(
-          _json['warning']);
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -68226,7 +69714,8 @@
   InstanceGroupManagersPatchPerInstanceConfigsReq.fromJson(core.Map _json) {
     if (_json.containsKey('perInstanceConfigs')) {
       perInstanceConfigs = (_json['perInstanceConfigs'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -68350,7 +69839,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<InstanceGroupManagersScopedListWarningData>((value) =>
-              InstanceGroupManagersScopedListWarningData.fromJson(value))
+              InstanceGroupManagersScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -68387,13 +69877,13 @@
   InstanceGroupManagersScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('instanceGroupManagers')) {
       instanceGroupManagers = (_json['instanceGroupManagers'] as core.List)
-          .map<InstanceGroupManager>(
-              (value) => InstanceGroupManager.fromJson(value))
+          .map<InstanceGroupManager>((value) => InstanceGroupManager.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning =
-          InstanceGroupManagersScopedListWarning.fromJson(_json['warning']);
+      warning = InstanceGroupManagersScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -68491,7 +69981,8 @@
   InstanceGroupManagersUpdatePerInstanceConfigsReq.fromJson(core.Map _json) {
     if (_json.containsKey('perInstanceConfigs')) {
       perInstanceConfigs = (_json['perInstanceConfigs'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -68515,7 +70006,8 @@
   InstanceGroupsAddInstancesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<InstanceReference>((value) => InstanceReference.fromJson(value))
+          .map<InstanceReference>((value) => InstanceReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -68612,8 +70104,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceGroupsListInstancesWarningData>(
-              (value) => InstanceGroupsListInstancesWarningData.fromJson(value))
+          .map<InstanceGroupsListInstancesWarningData>((value) =>
+              InstanceGroupsListInstancesWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -68669,8 +70162,9 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceWithNamedPorts>(
-              (value) => InstanceWithNamedPorts.fromJson(value))
+          .map<InstanceWithNamedPorts>((value) =>
+              InstanceWithNamedPorts.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -68683,7 +70177,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceGroupsListInstancesWarning.fromJson(_json['warning']);
+      warning = InstanceGroupsListInstancesWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -68746,7 +70241,8 @@
   InstanceGroupsRemoveInstancesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<InstanceReference>((value) => InstanceReference.fromJson(value))
+          .map<InstanceReference>((value) => InstanceReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -68844,8 +70340,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceGroupsScopedListWarningData>(
-              (value) => InstanceGroupsScopedListWarningData.fromJson(value))
+          .map<InstanceGroupsScopedListWarningData>((value) =>
+              InstanceGroupsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -68882,11 +70379,13 @@
   InstanceGroupsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('instanceGroups')) {
       instanceGroups = (_json['instanceGroups'] as core.List)
-          .map<InstanceGroup>((value) => InstanceGroup.fromJson(value))
+          .map<InstanceGroup>((value) => InstanceGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceGroupsScopedListWarning.fromJson(_json['warning']);
+      warning = InstanceGroupsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -68931,7 +70430,8 @@
     }
     if (_json.containsKey('namedPorts')) {
       namedPorts = (_json['namedPorts'] as core.List)
-          .map<NamedPort>((value) => NamedPort.fromJson(value))
+          .map<NamedPort>((value) =>
+              NamedPort.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -69031,8 +70531,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceListWarningData>(
-              (value) => InstanceListWarningData.fromJson(value))
+          .map<InstanceListWarningData>((value) =>
+              InstanceListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -69088,7 +70589,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -69101,7 +70603,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceListWarning.fromJson(_json['warning']);
+      warning = InstanceListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -69212,8 +70715,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceListReferrersWarningData>(
-              (value) => InstanceListReferrersWarningData.fromJson(value))
+          .map<InstanceListReferrersWarningData>((value) =>
+              InstanceListReferrersWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -69269,7 +70773,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Reference>((value) => Reference.fromJson(value))
+          .map<Reference>((value) =>
+              Reference.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -69282,7 +70787,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceListReferrersWarning.fromJson(_json['warning']);
+      warning = InstanceListReferrersWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -69328,12 +70834,13 @@
   InstanceManagedByIgmError.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
       error = InstanceManagedByIgmErrorManagedInstanceError.fromJson(
-          _json['error']);
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('instanceActionDetails')) {
       instanceActionDetails =
           InstanceManagedByIgmErrorInstanceActionDetails.fromJson(
-              _json['instanceActionDetails']);
+              _json['instanceActionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
@@ -69390,7 +70897,8 @@
       instance = _json['instance'] as core.String;
     }
     if (_json.containsKey('version')) {
-      version = ManagedInstanceVersion.fromJson(_json['version']);
+      version = ManagedInstanceVersion.fromJson(
+          _json['version'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -69564,46 +71072,52 @@
     }
     if (_json.containsKey('confidentialInstanceConfig')) {
       confidentialInstanceConfig = ConfidentialInstanceConfig.fromJson(
-          _json['confidentialInstanceConfig']);
+          _json['confidentialInstanceConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('disks')) {
       disks = (_json['disks'] as core.List)
-          .map<AttachedDisk>((value) => AttachedDisk.fromJson(value))
+          .map<AttachedDisk>((value) => AttachedDisk.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('guestAccelerators')) {
       guestAccelerators = (_json['guestAccelerators'] as core.List)
-          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(value))
+          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('machineType')) {
       machineType = _json['machineType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = Metadata.fromJson(_json['metadata']);
+      metadata = Metadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minCpuPlatform')) {
       minCpuPlatform = _json['minCpuPlatform'] as core.String;
     }
     if (_json.containsKey('networkInterfaces')) {
       networkInterfaces = (_json['networkInterfaces'] as core.List)
-          .map<NetworkInterface>((value) => NetworkInterface.fromJson(value))
+          .map<NetworkInterface>((value) => NetworkInterface.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('privateIpv6GoogleAccess')) {
       privateIpv6GoogleAccess = _json['privateIpv6GoogleAccess'] as core.String;
     }
     if (_json.containsKey('reservationAffinity')) {
-      reservationAffinity =
-          ReservationAffinity.fromJson(_json['reservationAffinity']);
+      reservationAffinity = ReservationAffinity.fromJson(
+          _json['reservationAffinity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourcePolicies')) {
       resourcePolicies = (_json['resourcePolicies'] as core.List)
@@ -69611,19 +71125,23 @@
           .toList();
     }
     if (_json.containsKey('scheduling')) {
-      scheduling = Scheduling.fromJson(_json['scheduling']);
+      scheduling = Scheduling.fromJson(
+          _json['scheduling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceAccounts')) {
       serviceAccounts = (_json['serviceAccounts'] as core.List)
-          .map<ServiceAccount>((value) => ServiceAccount.fromJson(value))
+          .map<ServiceAccount>((value) => ServiceAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shieldedInstanceConfig')) {
-      shieldedInstanceConfig =
-          ShieldedInstanceConfig.fromJson(_json['shieldedInstanceConfig']);
+      shieldedInstanceConfig = ShieldedInstanceConfig.fromJson(
+          _json['shieldedInstanceConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tags')) {
-      tags = Tags.fromJson(_json['tags']);
+      tags =
+          Tags.fromJson(_json['tags'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -69776,7 +71294,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = InstanceProperties.fromJson(_json['properties']);
+      properties = InstanceProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -69785,8 +71304,8 @@
       sourceInstance = _json['sourceInstance'] as core.String;
     }
     if (_json.containsKey('sourceInstanceParams')) {
-      sourceInstanceParams =
-          SourceInstanceParams.fromJson(_json['sourceInstanceParams']);
+      sourceInstanceParams = SourceInstanceParams.fromJson(
+          _json['sourceInstanceParams'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -69906,8 +71425,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstanceTemplateListWarningData>(
-              (value) => InstanceTemplateListWarningData.fromJson(value))
+          .map<InstanceTemplateListWarningData>((value) =>
+              InstanceTemplateListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -69963,7 +71483,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceTemplate>((value) => InstanceTemplate.fromJson(value))
+          .map<InstanceTemplate>((value) => InstanceTemplate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -69976,7 +71497,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InstanceTemplateListWarning.fromJson(_json['warning']);
+      warning = InstanceTemplateListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -70033,7 +71555,8 @@
     }
     if (_json.containsKey('namedPorts')) {
       namedPorts = (_json['namedPorts'] as core.List)
-          .map<NamedPort>((value) => NamedPort.fromJson(value))
+          .map<NamedPort>((value) =>
+              NamedPort.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('status')) {
@@ -70186,8 +71709,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InstancesScopedListWarningData>(
-              (value) => InstancesScopedListWarningData.fromJson(value))
+          .map<InstancesScopedListWarningData>((value) =>
+              InstancesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -70223,11 +71747,13 @@
   InstancesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = InstancesScopedListWarning.fromJson(_json['warning']);
+      warning = InstancesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -70266,7 +71792,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -70293,7 +71820,8 @@
   InstancesSetMachineResourcesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('guestAccelerators')) {
       guestAccelerators = (_json['guestAccelerators'] as core.List)
-          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(value))
+          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -70400,8 +71928,9 @@
   InstancesStartWithEncryptionKeyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('disks')) {
       disks = (_json['disks'] as core.List)
-          .map<CustomerEncryptionKeyProtectedDisk>(
-              (value) => CustomerEncryptionKeyProtectedDisk.fromJson(value))
+          .map<CustomerEncryptionKeyProtectedDisk>((value) =>
+              CustomerEncryptionKeyProtectedDisk.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -70587,8 +72116,9 @@
     }
     if (_json.containsKey('circuitInfos')) {
       circuitInfos = (_json['circuitInfos'] as core.List)
-          .map<InterconnectCircuitInfo>(
-              (value) => InterconnectCircuitInfo.fromJson(value))
+          .map<InterconnectCircuitInfo>((value) =>
+              InterconnectCircuitInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creationTimestamp')) {
@@ -70602,8 +72132,9 @@
     }
     if (_json.containsKey('expectedOutages')) {
       expectedOutages = (_json['expectedOutages'] as core.List)
-          .map<InterconnectOutageNotification>(
-              (value) => InterconnectOutageNotification.fromJson(value))
+          .map<InterconnectOutageNotification>((value) =>
+              InterconnectOutageNotification.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('googleIpAddress')) {
@@ -70986,11 +72517,12 @@
     }
     if (_json.containsKey('partnerMetadata')) {
       partnerMetadata = InterconnectAttachmentPartnerMetadata.fromJson(
-          _json['partnerMetadata']);
+          _json['partnerMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('privateInterconnectInfo')) {
       privateInterconnectInfo = InterconnectAttachmentPrivateInfo.fromJson(
-          _json['privateInterconnectInfo']);
+          _json['privateInterconnectInfo']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('region')) {
       region = _json['region'] as core.String;
@@ -71174,7 +72706,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<InterconnectAttachmentAggregatedListWarningData>((value) =>
-              InterconnectAttachmentAggregatedListWarningData.fromJson(value))
+              InterconnectAttachmentAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -71233,8 +72766,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, InterconnectAttachmentsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => InterconnectAttachmentsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => InterconnectAttachmentsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -71252,7 +72787,7 @@
     }
     if (_json.containsKey('warning')) {
       warning = InterconnectAttachmentAggregatedListWarning.fromJson(
-          _json['warning']);
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -71368,8 +72903,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InterconnectAttachmentListWarningData>(
-              (value) => InterconnectAttachmentListWarningData.fromJson(value))
+          .map<InterconnectAttachmentListWarningData>((value) =>
+              InterconnectAttachmentListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -71426,8 +72962,9 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InterconnectAttachment>(
-              (value) => InterconnectAttachment.fromJson(value))
+          .map<InterconnectAttachment>((value) =>
+              InterconnectAttachment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -71440,7 +72977,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InterconnectAttachmentListWarning.fromJson(_json['warning']);
+      warning = InterconnectAttachmentListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -71624,7 +73162,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<InterconnectAttachmentsScopedListWarningData>((value) =>
-              InterconnectAttachmentsScopedListWarningData.fromJson(value))
+              InterconnectAttachmentsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -71660,13 +73199,14 @@
   InterconnectAttachmentsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('interconnectAttachments')) {
       interconnectAttachments = (_json['interconnectAttachments'] as core.List)
-          .map<InterconnectAttachment>(
-              (value) => InterconnectAttachment.fromJson(value))
+          .map<InterconnectAttachment>((value) =>
+              InterconnectAttachment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning =
-          InterconnectAttachmentsScopedListWarning.fromJson(_json['warning']);
+      warning = InterconnectAttachmentsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -71745,14 +73285,16 @@
   InterconnectDiagnostics.fromJson(core.Map _json) {
     if (_json.containsKey('arpCaches')) {
       arpCaches = (_json['arpCaches'] as core.List)
-          .map<InterconnectDiagnosticsARPEntry>(
-              (value) => InterconnectDiagnosticsARPEntry.fromJson(value))
+          .map<InterconnectDiagnosticsARPEntry>((value) =>
+              InterconnectDiagnosticsARPEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('links')) {
       links = (_json['links'] as core.List)
-          .map<InterconnectDiagnosticsLinkStatus>(
-              (value) => InterconnectDiagnosticsLinkStatus.fromJson(value))
+          .map<InterconnectDiagnosticsLinkStatus>((value) =>
+              InterconnectDiagnosticsLinkStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('macAddress')) {
@@ -71923,8 +73465,9 @@
   InterconnectDiagnosticsLinkStatus.fromJson(core.Map _json) {
     if (_json.containsKey('arpCaches')) {
       arpCaches = (_json['arpCaches'] as core.List)
-          .map<InterconnectDiagnosticsARPEntry>(
-              (value) => InterconnectDiagnosticsARPEntry.fromJson(value))
+          .map<InterconnectDiagnosticsARPEntry>((value) =>
+              InterconnectDiagnosticsARPEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('circuitId')) {
@@ -71934,17 +73477,19 @@
       googleDemarc = _json['googleDemarc'] as core.String;
     }
     if (_json.containsKey('lacpStatus')) {
-      lacpStatus =
-          InterconnectDiagnosticsLinkLACPStatus.fromJson(_json['lacpStatus']);
+      lacpStatus = InterconnectDiagnosticsLinkLACPStatus.fromJson(
+          _json['lacpStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('receivingOpticalPower')) {
       receivingOpticalPower = InterconnectDiagnosticsLinkOpticalPower.fromJson(
-          _json['receivingOpticalPower']);
+          _json['receivingOpticalPower']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transmittingOpticalPower')) {
       transmittingOpticalPower =
           InterconnectDiagnosticsLinkOpticalPower.fromJson(
-              _json['transmittingOpticalPower']);
+              _json['transmittingOpticalPower']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -72055,8 +73600,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InterconnectListWarningData>(
-              (value) => InterconnectListWarningData.fromJson(value))
+          .map<InterconnectListWarningData>((value) =>
+              InterconnectListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -72112,7 +73658,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Interconnect>((value) => Interconnect.fromJson(value))
+          .map<Interconnect>((value) => Interconnect.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -72125,7 +73672,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InterconnectListWarning.fromJson(_json['warning']);
+      warning = InterconnectListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -72282,8 +73830,9 @@
     }
     if (_json.containsKey('regionInfos')) {
       regionInfos = (_json['regionInfos'] as core.List)
-          .map<InterconnectLocationRegionInfo>(
-              (value) => InterconnectLocationRegionInfo.fromJson(value))
+          .map<InterconnectLocationRegionInfo>((value) =>
+              InterconnectLocationRegionInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -72429,8 +73978,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<InterconnectLocationListWarningData>(
-              (value) => InterconnectLocationListWarningData.fromJson(value))
+          .map<InterconnectLocationListWarningData>((value) =>
+              InterconnectLocationListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -72486,8 +74036,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InterconnectLocation>(
-              (value) => InterconnectLocation.fromJson(value))
+          .map<InterconnectLocation>((value) => InterconnectLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -72500,7 +74050,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = InterconnectLocationListWarning.fromJson(_json['warning']);
+      warning = InterconnectLocationListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -72702,7 +74253,8 @@
 
   InterconnectsGetDiagnosticsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = InterconnectDiagnostics.fromJson(_json['result']);
+      result = InterconnectDiagnostics.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -72781,8 +74333,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('resourceRequirements')) {
-      resourceRequirements =
-          LicenseResourceRequirements.fromJson(_json['resourceRequirements']);
+      resourceRequirements = LicenseResourceRequirements.fromJson(
+          _json['resourceRequirements'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -72889,8 +74441,9 @@
     }
     if (_json.containsKey('licenseAlias')) {
       licenseAlias = (_json['licenseAlias'] as core.List)
-          .map<LicenseCodeLicenseAlias>(
-              (value) => LicenseCodeLicenseAlias.fromJson(value))
+          .map<LicenseCodeLicenseAlias>((value) =>
+              LicenseCodeLicenseAlias.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -73126,8 +74679,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<LicensesListResponseWarningData>(
-              (value) => LicensesListResponseWarningData.fromJson(value))
+          .map<LicensesListResponseWarningData>((value) =>
+              LicensesListResponseWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -73178,7 +74732,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<License>((value) => License.fromJson(value))
+          .map<License>((value) =>
+              License.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -73188,7 +74743,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = LicensesListResponseWarning.fromJson(_json['warning']);
+      warning = LicensesListResponseWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -73228,13 +74784,16 @@
 
   LogConfig.fromJson(core.Map _json) {
     if (_json.containsKey('cloudAudit')) {
-      cloudAudit = LogConfigCloudAuditOptions.fromJson(_json['cloudAudit']);
+      cloudAudit = LogConfigCloudAuditOptions.fromJson(
+          _json['cloudAudit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('counter')) {
-      counter = LogConfigCounterOptions.fromJson(_json['counter']);
+      counter = LogConfigCounterOptions.fromJson(
+          _json['counter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataAccess')) {
-      dataAccess = LogConfigDataAccessOptions.fromJson(_json['dataAccess']);
+      dataAccess = LogConfigDataAccessOptions.fromJson(
+          _json['dataAccess'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -73270,7 +74829,8 @@
   LogConfigCloudAuditOptions.fromJson(core.Map _json) {
     if (_json.containsKey('authorizationLoggingOptions')) {
       authorizationLoggingOptions = AuthorizationLoggingOptions.fromJson(
-          _json['authorizationLoggingOptions']);
+          _json['authorizationLoggingOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logName')) {
       logName = _json['logName'] as core.String;
@@ -73324,8 +74884,9 @@
   LogConfigCounterOptions.fromJson(core.Map _json) {
     if (_json.containsKey('customFields')) {
       customFields = (_json['customFields'] as core.List)
-          .map<LogConfigCounterOptionsCustomField>(
-              (value) => LogConfigCounterOptionsCustomField.fromJson(value))
+          .map<LogConfigCounterOptionsCustomField>((value) =>
+              LogConfigCounterOptionsCustomField.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('field')) {
@@ -73531,15 +75092,17 @@
   MachineType.fromJson(core.Map _json) {
     if (_json.containsKey('accelerators')) {
       accelerators = (_json['accelerators'] as core.List)
-          .map<MachineTypeAccelerators>(
-              (value) => MachineTypeAccelerators.fromJson(value))
+          .map<MachineTypeAccelerators>((value) =>
+              MachineTypeAccelerators.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('deprecated')) {
-      deprecated = DeprecationStatus.fromJson(_json['deprecated']);
+      deprecated = DeprecationStatus.fromJson(
+          _json['deprecated'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -73574,8 +75137,9 @@
     }
     if (_json.containsKey('scratchDisks')) {
       scratchDisks = (_json['scratchDisks'] as core.List)
-          .map<MachineTypeScratchDisks>(
-              (value) => MachineTypeScratchDisks.fromJson(value))
+          .map<MachineTypeScratchDisks>((value) =>
+              MachineTypeScratchDisks.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -73725,8 +75289,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<MachineTypeAggregatedListWarningData>(
-              (value) => MachineTypeAggregatedListWarningData.fromJson(value))
+          .map<MachineTypeAggregatedListWarningData>((value) =>
+              MachineTypeAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -73784,8 +75349,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, MachineTypesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => MachineTypesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => MachineTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -73802,7 +75369,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = MachineTypeAggregatedListWarning.fromJson(_json['warning']);
+      warning = MachineTypeAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -73918,8 +75486,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<MachineTypeListWarningData>(
-              (value) => MachineTypeListWarningData.fromJson(value))
+          .map<MachineTypeListWarningData>((value) =>
+              MachineTypeListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -73975,7 +75544,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<MachineType>((value) => MachineType.fromJson(value))
+          .map<MachineType>((value) => MachineType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -73988,7 +75558,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = MachineTypeListWarning.fromJson(_json['warning']);
+      warning = MachineTypeListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -74100,8 +75671,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<MachineTypesScopedListWarningData>(
-              (value) => MachineTypesScopedListWarningData.fromJson(value))
+          .map<MachineTypesScopedListWarningData>((value) =>
+              MachineTypesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -74137,11 +75709,13 @@
   MachineTypesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('machineTypes')) {
       machineTypes = (_json['machineTypes'] as core.List)
-          .map<MachineType>((value) => MachineType.fromJson(value))
+          .map<MachineType>((value) => MachineType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = MachineTypesScopedListWarning.fromJson(_json['warning']);
+      warning = MachineTypesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -74250,26 +75824,31 @@
     }
     if (_json.containsKey('instanceHealth')) {
       instanceHealth = (_json['instanceHealth'] as core.List)
-          .map<ManagedInstanceInstanceHealth>(
-              (value) => ManagedInstanceInstanceHealth.fromJson(value))
+          .map<ManagedInstanceInstanceHealth>((value) =>
+              ManagedInstanceInstanceHealth.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('instanceStatus')) {
       instanceStatus = _json['instanceStatus'] as core.String;
     }
     if (_json.containsKey('lastAttempt')) {
-      lastAttempt = ManagedInstanceLastAttempt.fromJson(_json['lastAttempt']);
+      lastAttempt = ManagedInstanceLastAttempt.fromJson(
+          _json['lastAttempt'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('preservedStateFromConfig')) {
-      preservedStateFromConfig =
-          PreservedState.fromJson(_json['preservedStateFromConfig']);
+      preservedStateFromConfig = PreservedState.fromJson(
+          _json['preservedStateFromConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('preservedStateFromPolicy')) {
-      preservedStateFromPolicy =
-          PreservedState.fromJson(_json['preservedStateFromPolicy']);
+      preservedStateFromPolicy = PreservedState.fromJson(
+          _json['preservedStateFromPolicy']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
-      version = ManagedInstanceVersion.fromJson(_json['version']);
+      version = ManagedInstanceVersion.fromJson(
+          _json['version'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -74396,8 +75975,9 @@
   ManagedInstanceLastAttemptErrors.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<ManagedInstanceLastAttemptErrorsErrors>(
-              (value) => ManagedInstanceLastAttemptErrorsErrors.fromJson(value))
+          .map<ManagedInstanceLastAttemptErrorsErrors>((value) =>
+              ManagedInstanceLastAttemptErrorsErrors.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -74420,7 +76000,8 @@
 
   ManagedInstanceLastAttempt.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
-      errors = ManagedInstanceLastAttemptErrors.fromJson(_json['errors']);
+      errors = ManagedInstanceLastAttemptErrors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -74535,7 +76116,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<MetadataItems>((value) => MetadataItems.fromJson(value))
+          .map<MetadataItems>((value) => MetadataItems.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -74597,8 +76179,9 @@
   MetadataFilter.fromJson(core.Map _json) {
     if (_json.containsKey('filterLabels')) {
       filterLabels = (_json['filterLabels'] as core.List)
-          .map<MetadataFilterLabelMatch>(
-              (value) => MetadataFilterLabelMatch.fromJson(value))
+          .map<MetadataFilterLabelMatch>((value) =>
+              MetadataFilterLabelMatch.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('filterMatchCriteria')) {
@@ -74788,11 +76371,13 @@
     }
     if (_json.containsKey('peerings')) {
       peerings = (_json['peerings'] as core.List)
-          .map<NetworkPeering>((value) => NetworkPeering.fromJson(value))
+          .map<NetworkPeering>((value) => NetworkPeering.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('routingConfig')) {
-      routingConfig = NetworkRoutingConfig.fromJson(_json['routingConfig']);
+      routingConfig = NetworkRoutingConfig.fromJson(
+          _json['routingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -74883,7 +76468,8 @@
   NetworkEndpoint.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
       annotations = commons.mapMap<core.String, core.String>(
-          _json['annotations'].cast<core.String, core.String>(),
+          (_json['annotations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('fqdn')) {
@@ -75012,18 +76598,21 @@
   NetworkEndpointGroup.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
       annotations = commons.mapMap<core.String, core.String>(
-          _json['annotations'].cast<core.String, core.String>(),
+          (_json['annotations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('appEngine')) {
-      appEngine = NetworkEndpointGroupAppEngine.fromJson(_json['appEngine']);
+      appEngine = NetworkEndpointGroupAppEngine.fromJson(
+          _json['appEngine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cloudFunction')) {
-      cloudFunction =
-          NetworkEndpointGroupCloudFunction.fromJson(_json['cloudFunction']);
+      cloudFunction = NetworkEndpointGroupCloudFunction.fromJson(
+          _json['cloudFunction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cloudRun')) {
-      cloudRun = NetworkEndpointGroupCloudRun.fromJson(_json['cloudRun']);
+      cloudRun = NetworkEndpointGroupCloudRun.fromJson(
+          _json['cloudRun'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
@@ -75207,7 +76796,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<NetworkEndpointGroupAggregatedListWarningData>((value) =>
-              NetworkEndpointGroupAggregatedListWarningData.fromJson(value))
+              NetworkEndpointGroupAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -75266,8 +76856,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, NetworkEndpointGroupsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => NetworkEndpointGroupsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NetworkEndpointGroupsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -75284,8 +76876,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning =
-          NetworkEndpointGroupAggregatedListWarning.fromJson(_json['warning']);
+      warning = NetworkEndpointGroupAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -75571,8 +77163,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NetworkEndpointGroupListWarningData>(
-              (value) => NetworkEndpointGroupListWarningData.fromJson(value))
+          .map<NetworkEndpointGroupListWarningData>((value) =>
+              NetworkEndpointGroupListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -75627,8 +77220,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<NetworkEndpointGroup>(
-              (value) => NetworkEndpointGroup.fromJson(value))
+          .map<NetworkEndpointGroup>((value) => NetworkEndpointGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -75641,7 +77234,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = NetworkEndpointGroupListWarning.fromJson(_json['warning']);
+      warning = NetworkEndpointGroupListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -75678,7 +77272,8 @@
   NetworkEndpointGroupsAttachEndpointsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('networkEndpoints')) {
       networkEndpoints = (_json['networkEndpoints'] as core.List)
-          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(value))
+          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -75702,7 +77297,8 @@
   NetworkEndpointGroupsDetachEndpointsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('networkEndpoints')) {
       networkEndpoints = (_json['networkEndpoints'] as core.List)
-          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(value))
+          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -75829,7 +77425,7 @@
       data = (_json['data'] as core.List)
           .map<NetworkEndpointGroupsListNetworkEndpointsWarningData>((value) =>
               NetworkEndpointGroupsListNetworkEndpointsWarningData.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -75882,8 +77478,9 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<NetworkEndpointWithHealthStatus>(
-              (value) => NetworkEndpointWithHealthStatus.fromJson(value))
+          .map<NetworkEndpointWithHealthStatus>((value) =>
+              NetworkEndpointWithHealthStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -75894,7 +77491,7 @@
     }
     if (_json.containsKey('warning')) {
       warning = NetworkEndpointGroupsListNetworkEndpointsWarning.fromJson(
-          _json['warning']);
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -76004,7 +77601,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<NetworkEndpointGroupsScopedListWarningData>((value) =>
-              NetworkEndpointGroupsScopedListWarningData.fromJson(value))
+              NetworkEndpointGroupsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -76041,13 +77639,13 @@
   NetworkEndpointGroupsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('networkEndpointGroups')) {
       networkEndpointGroups = (_json['networkEndpointGroups'] as core.List)
-          .map<NetworkEndpointGroup>(
-              (value) => NetworkEndpointGroup.fromJson(value))
+          .map<NetworkEndpointGroup>((value) => NetworkEndpointGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning =
-          NetworkEndpointGroupsScopedListWarning.fromJson(_json['warning']);
+      warning = NetworkEndpointGroupsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -76076,12 +77674,14 @@
   NetworkEndpointWithHealthStatus.fromJson(core.Map _json) {
     if (_json.containsKey('healths')) {
       healths = (_json['healths'] as core.List)
-          .map<HealthStatusForNetworkEndpoint>(
-              (value) => HealthStatusForNetworkEndpoint.fromJson(value))
+          .map<HealthStatusForNetworkEndpoint>((value) =>
+              HealthStatusForNetworkEndpoint.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('networkEndpoint')) {
-      networkEndpoint = NetworkEndpoint.fromJson(_json['networkEndpoint']);
+      networkEndpoint = NetworkEndpoint.fromJson(
+          _json['networkEndpoint'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -76167,12 +77767,14 @@
   NetworkInterface.fromJson(core.Map _json) {
     if (_json.containsKey('accessConfigs')) {
       accessConfigs = (_json['accessConfigs'] as core.List)
-          .map<AccessConfig>((value) => AccessConfig.fromJson(value))
+          .map<AccessConfig>((value) => AccessConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('aliasIpRanges')) {
       aliasIpRanges = (_json['aliasIpRanges'] as core.List)
-          .map<AliasIpRange>((value) => AliasIpRange.fromJson(value))
+          .map<AliasIpRange>((value) => AliasIpRange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fingerprint')) {
@@ -76316,8 +77918,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NetworkListWarningData>(
-              (value) => NetworkListWarningData.fromJson(value))
+          .map<NetworkListWarningData>((value) =>
+              NetworkListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -76373,7 +77976,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Network>((value) => Network.fromJson(value))
+          .map<Network>((value) =>
+              Network.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -76386,7 +77990,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = NetworkListWarning.fromJson(_json['warning']);
+      warning = NetworkListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -76622,7 +78227,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('networkPeering')) {
-      networkPeering = NetworkPeering.fromJson(_json['networkPeering']);
+      networkPeering = NetworkPeering.fromJson(
+          _json['networkPeering'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('peerNetwork')) {
       peerNetwork = _json['peerNetwork'] as core.String;
@@ -76675,7 +78281,8 @@
 
   NetworksUpdatePeeringRequest.fromJson(core.Map _json) {
     if (_json.containsKey('networkPeering')) {
-      networkPeering = NetworkPeering.fromJson(_json['networkPeering']);
+      networkPeering = NetworkPeering.fromJson(
+          _json['networkPeering'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -76767,8 +78374,8 @@
 
   NodeGroup.fromJson(core.Map _json) {
     if (_json.containsKey('autoscalingPolicy')) {
-      autoscalingPolicy =
-          NodeGroupAutoscalingPolicy.fromJson(_json['autoscalingPolicy']);
+      autoscalingPolicy = NodeGroupAutoscalingPolicy.fromJson(
+          _json['autoscalingPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
@@ -76936,8 +78543,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeGroupAggregatedListWarningData>(
-              (value) => NodeGroupAggregatedListWarningData.fromJson(value))
+          .map<NodeGroupAggregatedListWarningData>((value) =>
+              NodeGroupAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -76995,8 +78603,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, NodeGroupsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => NodeGroupsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NodeGroupsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -77013,7 +78623,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = NodeGroupAggregatedListWarning.fromJson(_json['warning']);
+      warning = NodeGroupAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -77174,8 +78785,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeGroupListWarningData>(
-              (value) => NodeGroupListWarningData.fromJson(value))
+          .map<NodeGroupListWarningData>((value) =>
+              NodeGroupListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -77231,7 +78843,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<NodeGroup>((value) => NodeGroup.fromJson(value))
+          .map<NodeGroup>((value) =>
+              NodeGroup.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -77244,7 +78857,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = NodeGroupListWarning.fromJson(_json['warning']);
+      warning = NodeGroupListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -77322,7 +78936,8 @@
       nodeType = _json['nodeType'] as core.String;
     }
     if (_json.containsKey('serverBinding')) {
-      serverBinding = ServerBinding.fromJson(_json['serverBinding']);
+      serverBinding = ServerBinding.fromJson(
+          _json['serverBinding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serverId')) {
       serverId = _json['serverId'] as core.String;
@@ -77486,8 +79101,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeGroupsListNodesWarningData>(
-              (value) => NodeGroupsListNodesWarningData.fromJson(value))
+          .map<NodeGroupsListNodesWarningData>((value) =>
+              NodeGroupsListNodesWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -77543,7 +79159,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<NodeGroupNode>((value) => NodeGroupNode.fromJson(value))
+          .map<NodeGroupNode>((value) => NodeGroupNode.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -77556,7 +79173,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = NodeGroupsListNodesWarning.fromJson(_json['warning']);
+      warning = NodeGroupsListNodesWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -77668,8 +79286,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeGroupsScopedListWarningData>(
-              (value) => NodeGroupsScopedListWarningData.fromJson(value))
+          .map<NodeGroupsScopedListWarningData>((value) =>
+              NodeGroupsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -77705,11 +79324,13 @@
   NodeGroupsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('nodeGroups')) {
       nodeGroups = (_json['nodeGroups'] as core.List)
-          .map<NodeGroup>((value) => NodeGroup.fromJson(value))
+          .map<NodeGroup>((value) =>
+              NodeGroup.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = NodeGroupsScopedListWarning.fromJson(_json['warning']);
+      warning = NodeGroupsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -77850,7 +79471,8 @@
     }
     if (_json.containsKey('nodeAffinityLabels')) {
       nodeAffinityLabels = commons.mapMap<core.String, core.String>(
-          _json['nodeAffinityLabels'].cast<core.String, core.String>(),
+          (_json['nodeAffinityLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('nodeType')) {
@@ -77858,7 +79480,7 @@
     }
     if (_json.containsKey('nodeTypeFlexibility')) {
       nodeTypeFlexibility = NodeTemplateNodeTypeFlexibility.fromJson(
-          _json['nodeTypeFlexibility']);
+          _json['nodeTypeFlexibility'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('region')) {
       region = _json['region'] as core.String;
@@ -77867,7 +79489,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('serverBinding')) {
-      serverBinding = ServerBinding.fromJson(_json['serverBinding']);
+      serverBinding = ServerBinding.fromJson(
+          _json['serverBinding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
@@ -78008,8 +79631,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeTemplateAggregatedListWarningData>(
-              (value) => NodeTemplateAggregatedListWarningData.fromJson(value))
+          .map<NodeTemplateAggregatedListWarningData>((value) =>
+              NodeTemplateAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -78067,8 +79691,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, NodeTemplatesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => NodeTemplatesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NodeTemplatesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -78085,7 +79711,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = NodeTemplateAggregatedListWarning.fromJson(_json['warning']);
+      warning = NodeTemplateAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -78201,8 +79828,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeTemplateListWarningData>(
-              (value) => NodeTemplateListWarningData.fromJson(value))
+          .map<NodeTemplateListWarningData>((value) =>
+              NodeTemplateListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -78258,7 +79886,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<NodeTemplate>((value) => NodeTemplate.fromJson(value))
+          .map<NodeTemplate>((value) => NodeTemplate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -78271,7 +79900,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = NodeTemplateListWarning.fromJson(_json['warning']);
+      warning = NodeTemplateListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -78417,8 +80047,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeTemplatesScopedListWarningData>(
-              (value) => NodeTemplatesScopedListWarningData.fromJson(value))
+          .map<NodeTemplatesScopedListWarningData>((value) =>
+              NodeTemplatesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -78454,11 +80085,13 @@
   NodeTemplatesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('nodeTemplates')) {
       nodeTemplates = (_json['nodeTemplates'] as core.List)
-          .map<NodeTemplate>((value) => NodeTemplate.fromJson(value))
+          .map<NodeTemplate>((value) => NodeTemplate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = NodeTemplatesScopedListWarning.fromJson(_json['warning']);
+      warning = NodeTemplatesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -78534,7 +80167,8 @@
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('deprecated')) {
-      deprecated = DeprecationStatus.fromJson(_json['deprecated']);
+      deprecated = DeprecationStatus.fromJson(
+          _json['deprecated'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -78690,8 +80324,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeTypeAggregatedListWarningData>(
-              (value) => NodeTypeAggregatedListWarningData.fromJson(value))
+          .map<NodeTypeAggregatedListWarningData>((value) =>
+              NodeTypeAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -78749,8 +80384,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, NodeTypesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => NodeTypesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NodeTypesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -78767,7 +80404,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = NodeTypeAggregatedListWarning.fromJson(_json['warning']);
+      warning = NodeTypeAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -78883,8 +80521,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeTypeListWarningData>(
-              (value) => NodeTypeListWarningData.fromJson(value))
+          .map<NodeTypeListWarningData>((value) =>
+              NodeTypeListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -78940,7 +80579,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<NodeType>((value) => NodeType.fromJson(value))
+          .map<NodeType>((value) =>
+              NodeType.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -78953,7 +80593,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = NodeTypeListWarning.fromJson(_json['warning']);
+      warning = NodeTypeListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -79065,8 +80706,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NodeTypesScopedListWarningData>(
-              (value) => NodeTypesScopedListWarningData.fromJson(value))
+          .map<NodeTypesScopedListWarningData>((value) =>
+              NodeTypesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -79102,11 +80744,13 @@
   NodeTypesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('nodeTypes')) {
       nodeTypes = (_json['nodeTypes'] as core.List)
-          .map<NodeType>((value) => NodeType.fromJson(value))
+          .map<NodeType>((value) =>
+              NodeType.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = NodeTypesScopedListWarning.fromJson(_json['warning']);
+      warning = NodeTypesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -79179,8 +80823,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('grpcSettings')) {
-      grpcSettings =
-          NotificationEndpointGrpcSettings.fromJson(_json['grpcSettings']);
+      grpcSettings = NotificationEndpointGrpcSettings.fromJson(
+          _json['grpcSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -79269,7 +80913,8 @@
       payloadName = _json['payloadName'] as core.String;
     }
     if (_json.containsKey('resendInterval')) {
-      resendInterval = Duration.fromJson(_json['resendInterval']);
+      resendInterval = Duration.fromJson(
+          _json['resendInterval'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retryDurationSec')) {
       retryDurationSec = _json['retryDurationSec'] as core.int;
@@ -79380,8 +81025,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<NotificationEndpointListWarningData>(
-              (value) => NotificationEndpointListWarningData.fromJson(value))
+          .map<NotificationEndpointListWarningData>((value) =>
+              NotificationEndpointListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -79436,8 +81082,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<NotificationEndpoint>(
-              (value) => NotificationEndpoint.fromJson(value))
+          .map<NotificationEndpoint>((value) => NotificationEndpoint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -79450,7 +81096,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = NotificationEndpointListWarning.fromJson(_json['warning']);
+      warning = NotificationEndpointListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -79530,8 +81177,8 @@
   OperationError.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<OperationErrorErrors>(
-              (value) => OperationErrorErrors.fromJson(value))
+          .map<OperationErrorErrors>((value) => OperationErrorErrors.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -79627,8 +81274,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<OperationWarningsData>(
-              (value) => OperationWarningsData.fromJson(value))
+          .map<OperationWarningsData>((value) => OperationWarningsData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -79786,7 +81433,8 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('error')) {
-      error = OperationError.fromJson(_json['error']);
+      error = OperationError.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpErrorMessage')) {
       httpErrorMessage = _json['httpErrorMessage'] as core.String;
@@ -79838,7 +81486,8 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<OperationWarnings>((value) => OperationWarnings.fromJson(value))
+          .map<OperationWarnings>((value) => OperationWarnings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('zone')) {
@@ -80004,8 +81653,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<OperationAggregatedListWarningData>(
-              (value) => OperationAggregatedListWarningData.fromJson(value))
+          .map<OperationAggregatedListWarningData>((value) =>
+              OperationAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -80064,8 +81714,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, OperationsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => OperationsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => OperationsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -80082,7 +81734,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = OperationAggregatedListWarning.fromJson(_json['warning']);
+      warning = OperationAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -80198,8 +81851,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<OperationListWarningData>(
-              (value) => OperationListWarningData.fromJson(value))
+          .map<OperationListWarningData>((value) =>
+              OperationListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -80256,7 +81910,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -80269,7 +81924,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = OperationListWarning.fromJson(_json['warning']);
+      warning = OperationListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -80381,8 +82037,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<OperationsScopedListWarningData>(
-              (value) => OperationsScopedListWarningData.fromJson(value))
+          .map<OperationsScopedListWarningData>((value) =>
+              OperationsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -80418,11 +82075,13 @@
   OperationsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = OperationsScopedListWarning.fromJson(_json['warning']);
+      warning = OperationsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -80506,7 +82165,8 @@
 
   OutlierDetection.fromJson(core.Map _json) {
     if (_json.containsKey('baseEjectionTime')) {
-      baseEjectionTime = Duration.fromJson(_json['baseEjectionTime']);
+      baseEjectionTime = Duration.fromJson(
+          _json['baseEjectionTime'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('consecutiveErrors')) {
       consecutiveErrors = _json['consecutiveErrors'] as core.int;
@@ -80527,7 +82187,8 @@
       enforcingSuccessRate = _json['enforcingSuccessRate'] as core.int;
     }
     if (_json.containsKey('interval')) {
-      interval = Duration.fromJson(_json['interval']);
+      interval = Duration.fromJson(
+          _json['interval'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxEjectionPercent')) {
       maxEjectionPercent = _json['maxEjectionPercent'] as core.int;
@@ -80660,8 +82321,8 @@
 
   PacketMirroring.fromJson(core.Map _json) {
     if (_json.containsKey('collectorIlb')) {
-      collectorIlb =
-          PacketMirroringForwardingRuleInfo.fromJson(_json['collectorIlb']);
+      collectorIlb = PacketMirroringForwardingRuleInfo.fromJson(
+          _json['collectorIlb'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
@@ -80673,7 +82334,8 @@
       enable = _json['enable'] as core.String;
     }
     if (_json.containsKey('filter')) {
-      filter = PacketMirroringFilter.fromJson(_json['filter']);
+      filter = PacketMirroringFilter.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -80683,13 +82345,14 @@
     }
     if (_json.containsKey('mirroredResources')) {
       mirroredResources = PacketMirroringMirroredResourceInfo.fromJson(
-          _json['mirroredResources']);
+          _json['mirroredResources'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('network')) {
-      network = PacketMirroringNetworkInfo.fromJson(_json['network']);
+      network = PacketMirroringNetworkInfo.fromJson(
+          _json['network'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('priority')) {
       priority = _json['priority'] as core.int;
@@ -80831,7 +82494,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<PacketMirroringAggregatedListWarningData>((value) =>
-              PacketMirroringAggregatedListWarningData.fromJson(value))
+              PacketMirroringAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -80889,8 +82553,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, PacketMirroringsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => PacketMirroringsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => PacketMirroringsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -80907,7 +82573,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = PacketMirroringAggregatedListWarning.fromJson(_json['warning']);
+      warning = PacketMirroringAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -81096,8 +82763,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<PacketMirroringListWarningData>(
-              (value) => PacketMirroringListWarningData.fromJson(value))
+          .map<PacketMirroringListWarningData>((value) =>
+              PacketMirroringListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -81153,7 +82821,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PacketMirroring>((value) => PacketMirroring.fromJson(value))
+          .map<PacketMirroring>((value) => PacketMirroring.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -81166,7 +82835,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = PacketMirroringListWarning.fromJson(_json['warning']);
+      warning = PacketMirroringListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -81220,13 +82890,15 @@
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
           .map<PacketMirroringMirroredResourceInfoInstanceInfo>((value) =>
-              PacketMirroringMirroredResourceInfoInstanceInfo.fromJson(value))
+              PacketMirroringMirroredResourceInfoInstanceInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subnetworks')) {
       subnetworks = (_json['subnetworks'] as core.List)
           .map<PacketMirroringMirroredResourceInfoSubnetInfo>((value) =>
-              PacketMirroringMirroredResourceInfoSubnetInfo.fromJson(value))
+              PacketMirroringMirroredResourceInfoSubnetInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tags')) {
@@ -81427,8 +83099,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<PacketMirroringsScopedListWarningData>(
-              (value) => PacketMirroringsScopedListWarningData.fromJson(value))
+          .map<PacketMirroringsScopedListWarningData>((value) =>
+              PacketMirroringsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -81464,11 +83137,13 @@
   PacketMirroringsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('packetMirrorings')) {
       packetMirrorings = (_json['packetMirrorings'] as core.List)
-          .map<PacketMirroring>((value) => PacketMirroring.fromJson(value))
+          .map<PacketMirroring>((value) => PacketMirroring.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = PacketMirroringsScopedListWarning.fromJson(_json['warning']);
+      warning = PacketMirroringsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -81567,33 +83242,36 @@
 
   PathMatcher.fromJson(core.Map _json) {
     if (_json.containsKey('defaultRouteAction')) {
-      defaultRouteAction =
-          HttpRouteAction.fromJson(_json['defaultRouteAction']);
+      defaultRouteAction = HttpRouteAction.fromJson(
+          _json['defaultRouteAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultService')) {
       defaultService = _json['defaultService'] as core.String;
     }
     if (_json.containsKey('defaultUrlRedirect')) {
-      defaultUrlRedirect =
-          HttpRedirectAction.fromJson(_json['defaultUrlRedirect']);
+      defaultUrlRedirect = HttpRedirectAction.fromJson(
+          _json['defaultUrlRedirect'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('headerAction')) {
-      headerAction = HttpHeaderAction.fromJson(_json['headerAction']);
+      headerAction = HttpHeaderAction.fromJson(
+          _json['headerAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pathRules')) {
       pathRules = (_json['pathRules'] as core.List)
-          .map<PathRule>((value) => PathRule.fromJson(value))
+          .map<PathRule>((value) =>
+              PathRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('routeRules')) {
       routeRules = (_json['routeRules'] as core.List)
-          .map<HttpRouteRule>((value) => HttpRouteRule.fromJson(value))
+          .map<HttpRouteRule>((value) => HttpRouteRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -81673,13 +83351,15 @@
           .toList();
     }
     if (_json.containsKey('routeAction')) {
-      routeAction = HttpRouteAction.fromJson(_json['routeAction']);
+      routeAction = HttpRouteAction.fromJson(
+          _json['routeAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('service')) {
       service = _json['service'] as core.String;
     }
     if (_json.containsKey('urlRedirect')) {
-      urlRedirect = HttpRedirectAction.fromJson(_json['urlRedirect']);
+      urlRedirect = HttpRedirectAction.fromJson(
+          _json['urlRedirect'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -81748,7 +83428,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('preservedState')) {
-      preservedState = PreservedState.fromJson(_json['preservedState']);
+      preservedState = PreservedState.fromJson(
+          _json['preservedState'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
@@ -81887,12 +83568,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -81903,7 +83586,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<Rule>((value) => Rule.fromJson(value))
+          .map<Rule>((value) =>
+              Rule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -81945,7 +83629,8 @@
   PreconfiguredWafSet.fromJson(core.Map _json) {
     if (_json.containsKey('expressionSets')) {
       expressionSets = (_json['expressionSets'] as core.List)
-          .map<WafExpressionSet>((value) => WafExpressionSet.fromJson(value))
+          .map<WafExpressionSet>((value) => WafExpressionSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -81974,12 +83659,15 @@
   PreservedState.fromJson(core.Map _json) {
     if (_json.containsKey('disks')) {
       disks = commons.mapMap<core.Map, PreservedStatePreservedDisk>(
-          _json['disks'].cast<core.String, core.Map>(),
-          (core.Map item) => PreservedStatePreservedDisk.fromJson(item));
+          (_json['disks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => PreservedStatePreservedDisk.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.String, core.String>(
-          _json['metadata'].cast<core.String, core.String>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -82113,8 +83801,8 @@
 
   Project.fromJson(core.Map _json) {
     if (_json.containsKey('commonInstanceMetadata')) {
-      commonInstanceMetadata =
-          Metadata.fromJson(_json['commonInstanceMetadata']);
+      commonInstanceMetadata = Metadata.fromJson(_json['commonInstanceMetadata']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationTimestamp')) {
       creationTimestamp = _json['creationTimestamp'] as core.String;
@@ -82144,15 +83832,16 @@
     }
     if (_json.containsKey('quotas')) {
       quotas = (_json['quotas'] as core.List)
-          .map<Quota>((value) => Quota.fromJson(value))
+          .map<Quota>((value) =>
+              Quota.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('usageExportLocation')) {
-      usageExportLocation =
-          UsageExportLocation.fromJson(_json['usageExportLocation']);
+      usageExportLocation = UsageExportLocation.fromJson(
+          _json['usageExportLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('xpnProjectStatus')) {
       xpnProjectStatus = _json['xpnProjectStatus'] as core.String;
@@ -82212,7 +83901,8 @@
 
   ProjectsDisableXpnResourceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('xpnResource')) {
-      xpnResource = XpnResourceId.fromJson(_json['xpnResource']);
+      xpnResource = XpnResourceId.fromJson(
+          _json['xpnResource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -82233,7 +83923,8 @@
 
   ProjectsEnableXpnResourceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('xpnResource')) {
-      xpnResource = XpnResourceId.fromJson(_json['xpnResource']);
+      xpnResource = XpnResourceId.fromJson(
+          _json['xpnResource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -82273,7 +83964,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<XpnResourceId>((value) => XpnResourceId.fromJson(value))
+          .map<XpnResourceId>((value) => XpnResourceId.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -82597,7 +84289,8 @@
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('deprecated')) {
-      deprecated = DeprecationStatus.fromJson(_json['deprecated']);
+      deprecated = DeprecationStatus.fromJson(
+          _json['deprecated'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -82613,7 +84306,8 @@
     }
     if (_json.containsKey('quotas')) {
       quotas = (_json['quotas'] as core.List)
-          .map<Quota>((value) => Quota.fromJson(value))
+          .map<Quota>((value) =>
+              Quota.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -82748,8 +84442,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RegionAutoscalerListWarningData>(
-              (value) => RegionAutoscalerListWarningData.fromJson(value))
+          .map<RegionAutoscalerListWarningData>((value) =>
+              RegionAutoscalerListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -82804,7 +84499,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Autoscaler>((value) => Autoscaler.fromJson(value))
+          .map<Autoscaler>((value) =>
+              Autoscaler.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -82817,7 +84513,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = RegionAutoscalerListWarning.fromJson(_json['warning']);
+      warning = RegionAutoscalerListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -82928,8 +84625,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RegionDiskTypeListWarningData>(
-              (value) => RegionDiskTypeListWarningData.fromJson(value))
+          .map<RegionDiskTypeListWarningData>((value) =>
+              RegionDiskTypeListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -82984,7 +84682,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<DiskType>((value) => DiskType.fromJson(value))
+          .map<DiskType>((value) =>
+              DiskType.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -82997,7 +84696,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = RegionDiskTypeListWarning.fromJson(_json['warning']);
+      warning = RegionDiskTypeListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -83175,8 +84875,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RegionInstanceGroupListWarningData>(
-              (value) => RegionInstanceGroupListWarningData.fromJson(value))
+          .map<RegionInstanceGroupListWarningData>((value) =>
+              RegionInstanceGroupListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -83231,7 +84932,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceGroup>((value) => InstanceGroup.fromJson(value))
+          .map<InstanceGroup>((value) => InstanceGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -83244,7 +84946,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = RegionInstanceGroupListWarning.fromJson(_json['warning']);
+      warning = RegionInstanceGroupListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -83381,7 +85084,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<RegionInstanceGroupManagerListWarningData>((value) =>
-              RegionInstanceGroupManagerListWarningData.fromJson(value))
+              RegionInstanceGroupManagerListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -83438,8 +85142,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceGroupManager>(
-              (value) => InstanceGroupManager.fromJson(value))
+          .map<InstanceGroupManager>((value) => InstanceGroupManager.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -83452,8 +85156,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning =
-          RegionInstanceGroupManagerListWarning.fromJson(_json['warning']);
+      warning = RegionInstanceGroupManagerListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -83492,7 +85196,8 @@
   RegionInstanceGroupManagerPatchInstanceConfigReq.fromJson(core.Map _json) {
     if (_json.containsKey('perInstanceConfigs')) {
       perInstanceConfigs = (_json['perInstanceConfigs'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -83518,7 +85223,8 @@
   RegionInstanceGroupManagerUpdateInstanceConfigReq.fromJson(core.Map _json) {
     if (_json.containsKey('perInstanceConfigs')) {
       perInstanceConfigs = (_json['perInstanceConfigs'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -83638,7 +85344,8 @@
   RegionInstanceGroupManagersCreateInstancesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -83692,8 +85399,9 @@
   RegionInstanceGroupManagersListErrorsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceManagedByIgmError>(
-              (value) => InstanceManagedByIgmError.fromJson(value))
+          .map<InstanceManagedByIgmError>((value) =>
+              InstanceManagedByIgmError.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -83801,7 +85509,7 @@
           .map<RegionInstanceGroupManagersListInstanceConfigsRespWarningData>(
               (value) =>
                   RegionInstanceGroupManagersListInstanceConfigsRespWarningData
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -83843,7 +85551,8 @@
   RegionInstanceGroupManagersListInstanceConfigsResp.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(value))
+          .map<PerInstanceConfig>((value) => PerInstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -83852,7 +85561,7 @@
     if (_json.containsKey('warning')) {
       warning =
           RegionInstanceGroupManagersListInstanceConfigsRespWarning.fromJson(
-              _json['warning']);
+              _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -83887,7 +85596,8 @@
   RegionInstanceGroupManagersListInstancesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('managedInstances')) {
       managedInstances = (_json['managedInstances'] as core.List)
-          .map<ManagedInstance>((value) => ManagedInstance.fromJson(value))
+          .map<ManagedInstance>((value) => ManagedInstance.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -84081,7 +85791,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<RegionInstanceGroupsListInstancesWarningData>((value) =>
-              RegionInstanceGroupsListInstancesWarningData.fromJson(value))
+              RegionInstanceGroupsListInstancesWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -84135,8 +85846,9 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<InstanceWithNamedPorts>(
-              (value) => InstanceWithNamedPorts.fromJson(value))
+          .map<InstanceWithNamedPorts>((value) =>
+              InstanceWithNamedPorts.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -84149,8 +85861,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning =
-          RegionInstanceGroupsListInstancesWarning.fromJson(_json['warning']);
+      warning = RegionInstanceGroupsListInstancesWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -84241,7 +85953,8 @@
     }
     if (_json.containsKey('namedPorts')) {
       namedPorts = (_json['namedPorts'] as core.List)
-          .map<NamedPort>((value) => NamedPort.fromJson(value))
+          .map<NamedPort>((value) =>
+              NamedPort.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -84341,8 +86054,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RegionListWarningData>(
-              (value) => RegionListWarningData.fromJson(value))
+          .map<RegionListWarningData>((value) => RegionListWarningData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -84398,7 +86111,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Region>((value) => Region.fromJson(value))
+          .map<Region>((value) =>
+              Region.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -84411,7 +86125,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = RegionListWarning.fromJson(_json['warning']);
+      warning = RegionListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -84466,7 +86181,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -84508,14 +86224,16 @@
   RegionSetPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -84567,7 +86285,8 @@
 
   RegionUrlMapsValidateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('resource')) {
-      resource = UrlMap.fromJson(_json['resource']);
+      resource = UrlMap.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -84688,7 +86407,7 @@
     }
     if (_json.containsKey('specificReservation')) {
       specificReservation = AllocationSpecificSKUReservation.fromJson(
-          _json['specificReservation']);
+          _json['specificReservation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('specificReservationRequired')) {
       specificReservationRequired =
@@ -84875,8 +86594,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ReservationAggregatedListWarningData>(
-              (value) => ReservationAggregatedListWarningData.fromJson(value))
+          .map<ReservationAggregatedListWarningData>((value) =>
+              ReservationAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -84934,8 +86654,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, ReservationsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => ReservationsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ReservationsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -84952,7 +86674,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = ReservationAggregatedListWarning.fromJson(_json['warning']);
+      warning = ReservationAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -85068,8 +86791,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ReservationListWarningData>(
-              (value) => ReservationListWarningData.fromJson(value))
+          .map<ReservationListWarningData>((value) =>
+              ReservationListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -85125,7 +86849,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Reservation>((value) => Reservation.fromJson(value))
+          .map<Reservation>((value) => Reservation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -85138,7 +86863,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = ReservationListWarning.fromJson(_json['warning']);
+      warning = ReservationListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -85272,8 +86998,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ReservationsScopedListWarningData>(
-              (value) => ReservationsScopedListWarningData.fromJson(value))
+          .map<ReservationsScopedListWarningData>((value) =>
+              ReservationsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -85309,11 +87036,13 @@
   ReservationsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('reservations')) {
       reservations = (_json['reservations'] as core.List)
-          .map<Reservation>((value) => Reservation.fromJson(value))
+          .map<Reservation>((value) => Reservation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = ReservationsScopedListWarning.fromJson(_json['warning']);
+      warning = ReservationsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -85488,8 +87217,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ResourcePoliciesScopedListWarningData>(
-              (value) => ResourcePoliciesScopedListWarningData.fromJson(value))
+          .map<ResourcePoliciesScopedListWarningData>((value) =>
+              ResourcePoliciesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -85525,11 +87255,13 @@
   ResourcePoliciesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('resourcePolicies')) {
       resourcePolicies = (_json['resourcePolicies'] as core.List)
-          .map<ResourcePolicy>((value) => ResourcePolicy.fromJson(value))
+          .map<ResourcePolicy>((value) => ResourcePolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = ResourcePoliciesScopedListWarning.fromJson(_json['warning']);
+      warning = ResourcePoliciesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -85602,7 +87334,7 @@
     }
     if (_json.containsKey('groupPlacementPolicy')) {
       groupPlacementPolicy = ResourcePolicyGroupPlacementPolicy.fromJson(
-          _json['groupPlacementPolicy']);
+          _json['groupPlacementPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -85621,7 +87353,8 @@
     }
     if (_json.containsKey('snapshotSchedulePolicy')) {
       snapshotSchedulePolicy = ResourcePolicySnapshotSchedulePolicy.fromJson(
-          _json['snapshotSchedulePolicy']);
+          _json['snapshotSchedulePolicy']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
@@ -85748,7 +87481,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<ResourcePolicyAggregatedListWarningData>((value) =>
-              ResourcePolicyAggregatedListWarningData.fromJson(value))
+              ResourcePolicyAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -85811,8 +87545,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, ResourcePoliciesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => ResourcePoliciesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ResourcePoliciesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -85829,7 +87565,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = ResourcePolicyAggregatedListWarning.fromJson(_json['warning']);
+      warning = ResourcePolicyAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -86081,8 +87818,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ResourcePolicyListWarningData>(
-              (value) => ResourcePolicyListWarningData.fromJson(value))
+          .map<ResourcePolicyListWarningData>((value) =>
+              ResourcePolicyListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -86143,7 +87881,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ResourcePolicy>((value) => ResourcePolicy.fromJson(value))
+          .map<ResourcePolicy>((value) => ResourcePolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -86156,7 +87895,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = ResourcePolicyListWarning.fromJson(_json['warning']);
+      warning = ResourcePolicyListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -86209,16 +87949,17 @@
     if (_json.containsKey('retentionPolicy')) {
       retentionPolicy =
           ResourcePolicySnapshotSchedulePolicyRetentionPolicy.fromJson(
-              _json['retentionPolicy']);
+              _json['retentionPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schedule')) {
       schedule = ResourcePolicySnapshotSchedulePolicySchedule.fromJson(
-          _json['schedule']);
+          _json['schedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('snapshotProperties')) {
       snapshotProperties =
           ResourcePolicySnapshotSchedulePolicySnapshotProperties.fromJson(
-              _json['snapshotProperties']);
+              _json['snapshotProperties']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -86283,15 +88024,16 @@
 
   ResourcePolicySnapshotSchedulePolicySchedule.fromJson(core.Map _json) {
     if (_json.containsKey('dailySchedule')) {
-      dailySchedule = ResourcePolicyDailyCycle.fromJson(_json['dailySchedule']);
+      dailySchedule = ResourcePolicyDailyCycle.fromJson(
+          _json['dailySchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hourlySchedule')) {
-      hourlySchedule =
-          ResourcePolicyHourlyCycle.fromJson(_json['hourlySchedule']);
+      hourlySchedule = ResourcePolicyHourlyCycle.fromJson(
+          _json['hourlySchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('weeklySchedule')) {
-      weeklySchedule =
-          ResourcePolicyWeeklyCycle.fromJson(_json['weeklySchedule']);
+      weeklySchedule = ResourcePolicyWeeklyCycle.fromJson(
+          _json['weeklySchedule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -86333,7 +88075,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('storageLocations')) {
@@ -86368,8 +88111,9 @@
   ResourcePolicyWeeklyCycle.fromJson(core.Map _json) {
     if (_json.containsKey('dayOfWeeks')) {
       dayOfWeeks = (_json['dayOfWeeks'] as core.List)
-          .map<ResourcePolicyWeeklyCycleDayOfWeek>(
-              (value) => ResourcePolicyWeeklyCycleDayOfWeek.fromJson(value))
+          .map<ResourcePolicyWeeklyCycleDayOfWeek>((value) =>
+              ResourcePolicyWeeklyCycleDayOfWeek.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -86517,7 +88261,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RouteWarningsData>((value) => RouteWarningsData.fromJson(value))
+          .map<RouteWarningsData>((value) => RouteWarningsData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -86685,7 +88430,8 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<RouteWarnings>((value) => RouteWarnings.fromJson(value))
+          .map<RouteWarnings>((value) => RouteWarnings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -86833,8 +88579,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RouteListWarningData>(
-              (value) => RouteListWarningData.fromJson(value))
+          .map<RouteListWarningData>((value) => RouteListWarningData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -86889,7 +88635,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Route>((value) => Route.fromJson(value))
+          .map<Route>((value) =>
+              Route.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -86902,7 +88649,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = RouteListWarning.fromJson(_json['warning']);
+      warning = RouteListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -86989,11 +88737,13 @@
 
   Router.fromJson(core.Map _json) {
     if (_json.containsKey('bgp')) {
-      bgp = RouterBgp.fromJson(_json['bgp']);
+      bgp = RouterBgp.fromJson(
+          _json['bgp'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bgpPeers')) {
       bgpPeers = (_json['bgpPeers'] as core.List)
-          .map<RouterBgpPeer>((value) => RouterBgpPeer.fromJson(value))
+          .map<RouterBgpPeer>((value) => RouterBgpPeer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creationTimestamp')) {
@@ -87007,7 +88757,8 @@
     }
     if (_json.containsKey('interfaces')) {
       interfaces = (_json['interfaces'] as core.List)
-          .map<RouterInterface>((value) => RouterInterface.fromJson(value))
+          .map<RouterInterface>((value) => RouterInterface.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -87018,7 +88769,8 @@
     }
     if (_json.containsKey('nats')) {
       nats = (_json['nats'] as core.List)
-          .map<RouterNat>((value) => RouterNat.fromJson(value))
+          .map<RouterNat>((value) =>
+              RouterNat.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('network')) {
@@ -87188,8 +88940,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RouterAggregatedListWarningData>(
-              (value) => RouterAggregatedListWarningData.fromJson(value))
+          .map<RouterAggregatedListWarningData>((value) =>
+              RouterAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -87247,8 +89000,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, RoutersScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => RoutersScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => RoutersScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -87265,7 +89020,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = RouterAggregatedListWarning.fromJson(_json['warning']);
+      warning = RouterAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -87338,8 +89094,9 @@
     }
     if (_json.containsKey('advertisedIpRanges')) {
       advertisedIpRanges = (_json['advertisedIpRanges'] as core.List)
-          .map<RouterAdvertisedIpRange>(
-              (value) => RouterAdvertisedIpRange.fromJson(value))
+          .map<RouterAdvertisedIpRange>((value) =>
+              RouterAdvertisedIpRange.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('asn')) {
@@ -87446,8 +89203,9 @@
     }
     if (_json.containsKey('advertisedIpRanges')) {
       advertisedIpRanges = (_json['advertisedIpRanges'] as core.List)
-          .map<RouterAdvertisedIpRange>(
-              (value) => RouterAdvertisedIpRange.fromJson(value))
+          .map<RouterAdvertisedIpRange>((value) =>
+              RouterAdvertisedIpRange.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('advertisedRoutePriority')) {
@@ -87673,8 +89431,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RouterListWarningData>(
-              (value) => RouterListWarningData.fromJson(value))
+          .map<RouterListWarningData>((value) => RouterListWarningData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -87729,7 +89487,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Router>((value) => Router.fromJson(value))
+          .map<Router>((value) =>
+              Router.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -87742,7 +89501,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = RouterListWarning.fromJson(_json['warning']);
+      warning = RouterListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -87859,7 +89619,8 @@
       icmpIdleTimeoutSec = _json['icmpIdleTimeoutSec'] as core.int;
     }
     if (_json.containsKey('logConfig')) {
-      logConfig = RouterNatLogConfig.fromJson(_json['logConfig']);
+      logConfig = RouterNatLogConfig.fromJson(
+          _json['logConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minPortsPerVm')) {
       minPortsPerVm = _json['minPortsPerVm'] as core.int;
@@ -87881,8 +89642,9 @@
     }
     if (_json.containsKey('subnetworks')) {
       subnetworks = (_json['subnetworks'] as core.List)
-          .map<RouterNatSubnetworkToNat>(
-              (value) => RouterNatSubnetworkToNat.fromJson(value))
+          .map<RouterNatSubnetworkToNat>((value) =>
+              RouterNatSubnetworkToNat.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tcpEstablishedIdleTimeoutSec')) {
@@ -88047,24 +89809,27 @@
   RouterStatus.fromJson(core.Map _json) {
     if (_json.containsKey('bestRoutes')) {
       bestRoutes = (_json['bestRoutes'] as core.List)
-          .map<Route>((value) => Route.fromJson(value))
+          .map<Route>((value) =>
+              Route.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bestRoutesForRouter')) {
       bestRoutesForRouter = (_json['bestRoutesForRouter'] as core.List)
-          .map<Route>((value) => Route.fromJson(value))
+          .map<Route>((value) =>
+              Route.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bgpPeerStatus')) {
       bgpPeerStatus = (_json['bgpPeerStatus'] as core.List)
-          .map<RouterStatusBgpPeerStatus>(
-              (value) => RouterStatusBgpPeerStatus.fromJson(value))
+          .map<RouterStatusBgpPeerStatus>((value) =>
+              RouterStatusBgpPeerStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('natStatus')) {
       natStatus = (_json['natStatus'] as core.List)
-          .map<RouterStatusNatStatus>(
-              (value) => RouterStatusNatStatus.fromJson(value))
+          .map<RouterStatusNatStatus>((value) => RouterStatusNatStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('network')) {
@@ -88136,7 +89901,8 @@
   RouterStatusBgpPeerStatus.fromJson(core.Map _json) {
     if (_json.containsKey('advertisedRoutes')) {
       advertisedRoutes = (_json['advertisedRoutes'] as core.List)
-          .map<Route>((value) => Route.fromJson(value))
+          .map<Route>((value) =>
+              Route.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('ipAddress')) {
@@ -88322,7 +90088,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('result')) {
-      result = RouterStatus.fromJson(_json['result']);
+      result = RouterStatus.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -88346,7 +90113,8 @@
 
   RoutersPreviewResponse.fromJson(core.Map _json) {
     if (_json.containsKey('resource')) {
-      resource = Router.fromJson(_json['resource']);
+      resource = Router.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -88443,8 +90211,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<RoutersScopedListWarningData>(
-              (value) => RoutersScopedListWarningData.fromJson(value))
+          .map<RoutersScopedListWarningData>((value) =>
+              RoutersScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -88480,11 +90249,13 @@
   RoutersScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('routers')) {
       routers = (_json['routers'] as core.List)
-          .map<Router>((value) => Router.fromJson(value))
+          .map<Router>((value) =>
+              Router.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = RoutersScopedListWarning.fromJson(_json['warning']);
+      warning = RoutersScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -88544,7 +90315,8 @@
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('description')) {
@@ -88557,7 +90329,8 @@
     }
     if (_json.containsKey('logConfigs')) {
       logConfigs = (_json['logConfigs'] as core.List)
-          .map<LogConfig>((value) => LogConfig.fromJson(value))
+          .map<LogConfig>((value) =>
+              LogConfig.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('notIns')) {
@@ -88737,8 +90510,9 @@
     }
     if (_json.containsKey('nodeAffinities')) {
       nodeAffinities = (_json['nodeAffinities'] as core.List)
-          .map<SchedulingNodeAffinity>(
-              (value) => SchedulingNodeAffinity.fromJson(value))
+          .map<SchedulingNodeAffinity>((value) =>
+              SchedulingNodeAffinity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('onHostMaintenance')) {
@@ -88860,7 +90634,8 @@
       core.Map _json) {
     if (_json.containsKey('preconfiguredExpressionSets')) {
       preconfiguredExpressionSets = SecurityPoliciesWafConfig.fromJson(
-          _json['preconfiguredExpressionSets']);
+          _json['preconfiguredExpressionSets']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -88881,7 +90656,8 @@
 
   SecurityPoliciesWafConfig.fromJson(core.Map _json) {
     if (_json.containsKey('wafRules')) {
-      wafRules = PreconfiguredWafSet.fromJson(_json['wafRules']);
+      wafRules = PreconfiguredWafSet.fromJson(
+          _json['wafRules'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -88973,8 +90749,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<SecurityPolicyRule>(
-              (value) => SecurityPolicyRule.fromJson(value))
+          .map<SecurityPolicyRule>((value) => SecurityPolicyRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -89095,8 +90871,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SecurityPolicyListWarningData>(
-              (value) => SecurityPolicyListWarningData.fromJson(value))
+          .map<SecurityPolicyListWarningData>((value) =>
+              SecurityPolicyListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -89148,7 +90925,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SecurityPolicy>((value) => SecurityPolicy.fromJson(value))
+          .map<SecurityPolicy>((value) => SecurityPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -89158,7 +90936,8 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = SecurityPolicyListWarning.fromJson(_json['warning']);
+      warning = SecurityPolicyListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -89245,7 +91024,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('match')) {
-      match = SecurityPolicyRuleMatcher.fromJson(_json['match']);
+      match = SecurityPolicyRuleMatcher.fromJson(
+          _json['match'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('preview')) {
       preview = _json['preview'] as core.bool;
@@ -89304,10 +91084,12 @@
 
   SecurityPolicyRuleMatcher.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = SecurityPolicyRuleMatcherConfig.fromJson(_json['config']);
+      config = SecurityPolicyRuleMatcherConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('expr')) {
-      expr = Expr.fromJson(_json['expr']);
+      expr =
+          Expr.fromJson(_json['expr'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('versionedExpr')) {
       versionedExpr = _json['versionedExpr'] as core.String;
@@ -89537,14 +91319,15 @@
 
   ShieldedInstanceIdentity.fromJson(core.Map _json) {
     if (_json.containsKey('encryptionKey')) {
-      encryptionKey =
-          ShieldedInstanceIdentityEntry.fromJson(_json['encryptionKey']);
+      encryptionKey = ShieldedInstanceIdentityEntry.fromJson(
+          _json['encryptionKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('signingKey')) {
-      signingKey = ShieldedInstanceIdentityEntry.fromJson(_json['signingKey']);
+      signingKey = ShieldedInstanceIdentityEntry.fromJson(
+          _json['signingKey'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -89813,7 +91596,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('licenseCodes')) {
@@ -89833,15 +91617,17 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('snapshotEncryptionKey')) {
-      snapshotEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['snapshotEncryptionKey']);
+      snapshotEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['snapshotEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceDisk')) {
       sourceDisk = _json['sourceDisk'] as core.String;
     }
     if (_json.containsKey('sourceDiskEncryptionKey')) {
-      sourceDiskEncryptionKey =
-          CustomerEncryptionKey.fromJson(_json['sourceDiskEncryptionKey']);
+      sourceDiskEncryptionKey = CustomerEncryptionKey.fromJson(
+          _json['sourceDiskEncryptionKey']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceDiskId')) {
       sourceDiskId = _json['sourceDiskId'] as core.String;
@@ -90014,8 +91800,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SnapshotListWarningData>(
-              (value) => SnapshotListWarningData.fromJson(value))
+          .map<SnapshotListWarningData>((value) =>
+              SnapshotListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -90070,7 +91857,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Snapshot>((value) => Snapshot.fromJson(value))
+          .map<Snapshot>((value) =>
+              Snapshot.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -90083,7 +91871,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = SnapshotListWarning.fromJson(_json['warning']);
+      warning = SnapshotListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -90125,8 +91914,9 @@
   SourceInstanceParams.fromJson(core.Map _json) {
     if (_json.containsKey('diskConfigs')) {
       diskConfigs = (_json['diskConfigs'] as core.List)
-          .map<DiskInstantiationConfig>(
-              (value) => DiskInstantiationConfig.fromJson(value))
+          .map<DiskInstantiationConfig>((value) =>
+              DiskInstantiationConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -90250,7 +92040,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('managed')) {
-      managed = SslCertificateManagedSslCertificate.fromJson(_json['managed']);
+      managed = SslCertificateManagedSslCertificate.fromJson(
+          _json['managed'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -90266,7 +92057,7 @@
     }
     if (_json.containsKey('selfManaged')) {
       selfManaged = SslCertificateSelfManagedSslCertificate.fromJson(
-          _json['selfManaged']);
+          _json['selfManaged'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subjectAlternativeNames')) {
       subjectAlternativeNames = (_json['subjectAlternativeNames'] as core.List)
@@ -90410,7 +92201,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<SslCertificateAggregatedListWarningData>((value) =>
-              SslCertificateAggregatedListWarningData.fromJson(value))
+              SslCertificateAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -90468,8 +92260,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, SslCertificatesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => SslCertificatesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SslCertificatesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -90486,7 +92280,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = SslCertificateAggregatedListWarning.fromJson(_json['warning']);
+      warning = SslCertificateAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -90602,8 +92397,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SslCertificateListWarningData>(
-              (value) => SslCertificateListWarningData.fromJson(value))
+          .map<SslCertificateListWarningData>((value) =>
+              SslCertificateListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -90658,7 +92454,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SslCertificate>((value) => SslCertificate.fromJson(value))
+          .map<SslCertificate>((value) => SslCertificate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -90671,7 +92468,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = SslCertificateListWarning.fromJson(_json['warning']);
+      warning = SslCertificateListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -90724,7 +92522,8 @@
   SslCertificateManagedSslCertificate.fromJson(core.Map _json) {
     if (_json.containsKey('domainStatus')) {
       domainStatus = commons.mapMap<core.String, core.String>(
-          _json['domainStatus'].cast<core.String, core.String>(),
+          (_json['domainStatus'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('domains')) {
@@ -90870,8 +92669,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SslCertificatesScopedListWarningData>(
-              (value) => SslCertificatesScopedListWarningData.fromJson(value))
+          .map<SslCertificatesScopedListWarningData>((value) =>
+              SslCertificatesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -90907,11 +92707,13 @@
   SslCertificatesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('sslCertificates')) {
       sslCertificates = (_json['sslCertificates'] as core.List)
-          .map<SslCertificate>((value) => SslCertificate.fromJson(value))
+          .map<SslCertificate>((value) => SslCertificate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = SslCertificatesScopedListWarning.fromJson(_json['warning']);
+      warning = SslCertificatesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -91011,8 +92813,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SslPoliciesListWarningData>(
-              (value) => SslPoliciesListWarningData.fromJson(value))
+          .map<SslPoliciesListWarningData>((value) =>
+              SslPoliciesListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -91067,7 +92870,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SslPolicy>((value) => SslPolicy.fromJson(value))
+          .map<SslPolicy>((value) =>
+              SslPolicy.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -91080,7 +92884,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = SslPoliciesListWarning.fromJson(_json['warning']);
+      warning = SslPoliciesListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -91212,8 +93017,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SslPolicyWarningsData>(
-              (value) => SslPolicyWarningsData.fromJson(value))
+          .map<SslPolicyWarningsData>((value) => SslPolicyWarningsData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -91359,7 +93164,8 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<SslPolicyWarnings>((value) => SslPolicyWarnings.fromJson(value))
+          .map<SslPolicyWarnings>((value) => SslPolicyWarnings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -91435,8 +93241,8 @@
 
   StatefulPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('preservedState')) {
-      preservedState =
-          StatefulPolicyPreservedState.fromJson(_json['preservedState']);
+      preservedState = StatefulPolicyPreservedState.fromJson(
+          _json['preservedState'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -91460,9 +93266,10 @@
   StatefulPolicyPreservedState.fromJson(core.Map _json) {
     if (_json.containsKey('disks')) {
       disks = commons.mapMap<core.Map, StatefulPolicyPreservedStateDiskDevice>(
-          _json['disks'].cast<core.String, core.Map>(),
-          (core.Map item) =>
-              StatefulPolicyPreservedStateDiskDevice.fromJson(item));
+          (_json['disks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => StatefulPolicyPreservedStateDiskDevice.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -91682,7 +93489,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('logConfig')) {
-      logConfig = SubnetworkLogConfig.fromJson(_json['logConfig']);
+      logConfig = SubnetworkLogConfig.fromJson(
+          _json['logConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -91707,8 +93515,9 @@
     }
     if (_json.containsKey('secondaryIpRanges')) {
       secondaryIpRanges = (_json['secondaryIpRanges'] as core.List)
-          .map<SubnetworkSecondaryRange>(
-              (value) => SubnetworkSecondaryRange.fromJson(value))
+          .map<SubnetworkSecondaryRange>((value) =>
+              SubnetworkSecondaryRange.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -91869,8 +93678,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SubnetworkAggregatedListWarningData>(
-              (value) => SubnetworkAggregatedListWarningData.fromJson(value))
+          .map<SubnetworkAggregatedListWarningData>((value) =>
+              SubnetworkAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -91928,8 +93738,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, SubnetworksScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => SubnetworksScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SubnetworksScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -91946,7 +93758,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = SubnetworkAggregatedListWarning.fromJson(_json['warning']);
+      warning = SubnetworkAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -92062,8 +93875,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SubnetworkListWarningData>(
-              (value) => SubnetworkListWarningData.fromJson(value))
+          .map<SubnetworkListWarningData>((value) =>
+              SubnetworkListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -92119,7 +93933,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Subnetwork>((value) => Subnetwork.fromJson(value))
+          .map<Subnetwork>((value) =>
+              Subnetwork.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -92132,7 +93947,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = SubnetworkListWarning.fromJson(_json['warning']);
+      warning = SubnetworkListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -92397,8 +94213,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<SubnetworksScopedListWarningData>(
-              (value) => SubnetworksScopedListWarningData.fromJson(value))
+          .map<SubnetworksScopedListWarningData>((value) =>
+              SubnetworksScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -92433,11 +94250,13 @@
   SubnetworksScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('subnetworks')) {
       subnetworks = (_json['subnetworks'] as core.List)
-          .map<Subnetwork>((value) => Subnetwork.fromJson(value))
+          .map<Subnetwork>((value) =>
+              Subnetwork.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = SubnetworksScopedListWarning.fromJson(_json['warning']);
+      warning = SubnetworksScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -92836,8 +94655,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetGrpcProxyListWarningData>(
-              (value) => TargetGrpcProxyListWarningData.fromJson(value))
+          .map<TargetGrpcProxyListWarningData>((value) =>
+              TargetGrpcProxyListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -92892,7 +94712,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetGrpcProxy>((value) => TargetGrpcProxy.fromJson(value))
+          .map<TargetGrpcProxy>((value) => TargetGrpcProxy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -92905,7 +94726,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetGrpcProxyListWarning.fromJson(_json['warning']);
+      warning = TargetGrpcProxyListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -93017,8 +94839,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetHttpProxiesScopedListWarningData>(
-              (value) => TargetHttpProxiesScopedListWarningData.fromJson(value))
+          .map<TargetHttpProxiesScopedListWarningData>((value) =>
+              TargetHttpProxiesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -93054,11 +94877,13 @@
   TargetHttpProxiesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('targetHttpProxies')) {
       targetHttpProxies = (_json['targetHttpProxies'] as core.List)
-          .map<TargetHttpProxy>((value) => TargetHttpProxy.fromJson(value))
+          .map<TargetHttpProxy>((value) => TargetHttpProxy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = TargetHttpProxiesScopedListWarning.fromJson(_json['warning']);
+      warning = TargetHttpProxiesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -93240,8 +95065,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, TargetHttpProxiesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => TargetHttpProxiesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => TargetHttpProxiesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -93368,8 +95195,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetHttpProxyListWarningData>(
-              (value) => TargetHttpProxyListWarningData.fromJson(value))
+          .map<TargetHttpProxyListWarningData>((value) =>
+              TargetHttpProxyListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -93425,7 +95253,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetHttpProxy>((value) => TargetHttpProxy.fromJson(value))
+          .map<TargetHttpProxy>((value) => TargetHttpProxy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -93438,7 +95267,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetHttpProxyListWarning.fromJson(_json['warning']);
+      warning = TargetHttpProxyListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -93551,7 +95381,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<TargetHttpsProxiesScopedListWarningData>((value) =>
-              TargetHttpsProxiesScopedListWarningData.fromJson(value))
+              TargetHttpsProxiesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -93587,11 +95418,13 @@
   TargetHttpsProxiesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('targetHttpsProxies')) {
       targetHttpsProxies = (_json['targetHttpsProxies'] as core.List)
-          .map<TargetHttpsProxy>((value) => TargetHttpsProxy.fromJson(value))
+          .map<TargetHttpsProxy>((value) => TargetHttpsProxy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = TargetHttpsProxiesScopedListWarning.fromJson(_json['warning']);
+      warning = TargetHttpsProxiesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -93904,7 +95737,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<TargetHttpsProxyAggregatedListWarningData>((value) =>
-              TargetHttpsProxyAggregatedListWarningData.fromJson(value))
+              TargetHttpsProxyAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -93962,8 +95796,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, TargetHttpsProxiesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => TargetHttpsProxiesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => TargetHttpsProxiesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -93980,8 +95816,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning =
-          TargetHttpsProxyAggregatedListWarning.fromJson(_json['warning']);
+      warning = TargetHttpsProxyAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -94097,8 +95933,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetHttpsProxyListWarningData>(
-              (value) => TargetHttpsProxyListWarningData.fromJson(value))
+          .map<TargetHttpsProxyListWarningData>((value) =>
+              TargetHttpsProxyListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -94154,7 +95991,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetHttpsProxy>((value) => TargetHttpsProxy.fromJson(value))
+          .map<TargetHttpsProxy>((value) => TargetHttpsProxy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -94167,7 +96005,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetHttpsProxyListWarning.fromJson(_json['warning']);
+      warning = TargetHttpsProxyListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -94399,7 +96238,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<TargetInstanceAggregatedListWarningData>((value) =>
-              TargetInstanceAggregatedListWarningData.fromJson(value))
+              TargetInstanceAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -94456,8 +96296,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, TargetInstancesScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => TargetInstancesScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => TargetInstancesScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -94474,7 +96316,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = TargetInstanceAggregatedListWarning.fromJson(_json['warning']);
+      warning = TargetInstanceAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -94590,8 +96433,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetInstanceListWarningData>(
-              (value) => TargetInstanceListWarningData.fromJson(value))
+          .map<TargetInstanceListWarningData>((value) =>
+              TargetInstanceListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -94646,7 +96490,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetInstance>((value) => TargetInstance.fromJson(value))
+          .map<TargetInstance>((value) => TargetInstance.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -94659,7 +96504,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetInstanceListWarning.fromJson(_json['warning']);
+      warning = TargetInstanceListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -94771,8 +96617,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetInstancesScopedListWarningData>(
-              (value) => TargetInstancesScopedListWarningData.fromJson(value))
+          .map<TargetInstancesScopedListWarningData>((value) =>
+              TargetInstancesScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -94808,11 +96655,13 @@
   TargetInstancesScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('targetInstances')) {
       targetInstances = (_json['targetInstances'] as core.List)
-          .map<TargetInstance>((value) => TargetInstance.fromJson(value))
+          .map<TargetInstance>((value) => TargetInstance.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = TargetInstancesScopedListWarning.fromJson(_json['warning']);
+      warning = TargetInstancesScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -95096,8 +96945,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetPoolAggregatedListWarningData>(
-              (value) => TargetPoolAggregatedListWarningData.fromJson(value))
+          .map<TargetPoolAggregatedListWarningData>((value) =>
+              TargetPoolAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -95155,8 +97005,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, TargetPoolsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => TargetPoolsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => TargetPoolsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -95173,7 +97025,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = TargetPoolAggregatedListWarning.fromJson(_json['warning']);
+      warning = TargetPoolAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -95218,7 +97071,8 @@
   TargetPoolInstanceHealth.fromJson(core.Map _json) {
     if (_json.containsKey('healthStatus')) {
       healthStatus = (_json['healthStatus'] as core.List)
-          .map<HealthStatus>((value) => HealthStatus.fromJson(value))
+          .map<HealthStatus>((value) => HealthStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -95322,8 +97176,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetPoolListWarningData>(
-              (value) => TargetPoolListWarningData.fromJson(value))
+          .map<TargetPoolListWarningData>((value) =>
+              TargetPoolListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -95379,7 +97234,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetPool>((value) => TargetPool.fromJson(value))
+          .map<TargetPool>((value) =>
+              TargetPool.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -95392,7 +97248,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetPoolListWarning.fromJson(_json['warning']);
+      warning = TargetPoolListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -95429,8 +97286,8 @@
   TargetPoolsAddHealthCheckRequest.fromJson(core.Map _json) {
     if (_json.containsKey('healthChecks')) {
       healthChecks = (_json['healthChecks'] as core.List)
-          .map<HealthCheckReference>(
-              (value) => HealthCheckReference.fromJson(value))
+          .map<HealthCheckReference>((value) => HealthCheckReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -95459,7 +97316,8 @@
   TargetPoolsAddInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<InstanceReference>((value) => InstanceReference.fromJson(value))
+          .map<InstanceReference>((value) => InstanceReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -95487,8 +97345,8 @@
   TargetPoolsRemoveHealthCheckRequest.fromJson(core.Map _json) {
     if (_json.containsKey('healthChecks')) {
       healthChecks = (_json['healthChecks'] as core.List)
-          .map<HealthCheckReference>(
-              (value) => HealthCheckReference.fromJson(value))
+          .map<HealthCheckReference>((value) => HealthCheckReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -95512,7 +97370,8 @@
   TargetPoolsRemoveInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<InstanceReference>((value) => InstanceReference.fromJson(value))
+          .map<InstanceReference>((value) => InstanceReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -95610,8 +97469,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetPoolsScopedListWarningData>(
-              (value) => TargetPoolsScopedListWarningData.fromJson(value))
+          .map<TargetPoolsScopedListWarningData>((value) =>
+              TargetPoolsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -95647,11 +97507,13 @@
   TargetPoolsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('targetPools')) {
       targetPools = (_json['targetPools'] as core.List)
-          .map<TargetPool>((value) => TargetPool.fromJson(value))
+          .map<TargetPool>((value) =>
+              TargetPool.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = TargetPoolsScopedListWarning.fromJson(_json['warning']);
+      warning = TargetPoolsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -95968,8 +97830,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetSslProxyListWarningData>(
-              (value) => TargetSslProxyListWarningData.fromJson(value))
+          .map<TargetSslProxyListWarningData>((value) =>
+              TargetSslProxyListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -96024,7 +97887,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetSslProxy>((value) => TargetSslProxy.fromJson(value))
+          .map<TargetSslProxy>((value) => TargetSslProxy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -96037,7 +97901,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetSslProxyListWarning.fromJson(_json['warning']);
+      warning = TargetSslProxyListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -96298,8 +98163,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetTcpProxyListWarningData>(
-              (value) => TargetTcpProxyListWarningData.fromJson(value))
+          .map<TargetTcpProxyListWarningData>((value) =>
+              TargetTcpProxyListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -96354,7 +98220,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetTcpProxy>((value) => TargetTcpProxy.fromJson(value))
+          .map<TargetTcpProxy>((value) => TargetTcpProxy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -96367,7 +98234,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetTcpProxyListWarning.fromJson(_json['warning']);
+      warning = TargetTcpProxyListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -96621,7 +98489,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<TargetVpnGatewayAggregatedListWarningData>((value) =>
-              TargetVpnGatewayAggregatedListWarningData.fromJson(value))
+              TargetVpnGatewayAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -96679,8 +98548,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, TargetVpnGatewaysScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => TargetVpnGatewaysScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => TargetVpnGatewaysScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -96697,8 +98568,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning =
-          TargetVpnGatewayAggregatedListWarning.fromJson(_json['warning']);
+      warning = TargetVpnGatewayAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -96814,8 +98685,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetVpnGatewayListWarningData>(
-              (value) => TargetVpnGatewayListWarningData.fromJson(value))
+          .map<TargetVpnGatewayListWarningData>((value) =>
+              TargetVpnGatewayListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -96871,7 +98743,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TargetVpnGateway>((value) => TargetVpnGateway.fromJson(value))
+          .map<TargetVpnGateway>((value) => TargetVpnGateway.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -96884,7 +98757,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = TargetVpnGatewayListWarning.fromJson(_json['warning']);
+      warning = TargetVpnGatewayListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -96996,8 +98870,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<TargetVpnGatewaysScopedListWarningData>(
-              (value) => TargetVpnGatewaysScopedListWarningData.fromJson(value))
+          .map<TargetVpnGatewaysScopedListWarningData>((value) =>
+              TargetVpnGatewaysScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -97033,11 +98908,13 @@
   TargetVpnGatewaysScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('targetVpnGateways')) {
       targetVpnGateways = (_json['targetVpnGateways'] as core.List)
-          .map<TargetVpnGateway>((value) => TargetVpnGateway.fromJson(value))
+          .map<TargetVpnGateway>((value) => TargetVpnGateway.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = TargetVpnGatewaysScopedListWarning.fromJson(_json['warning']);
+      warning = TargetVpnGatewaysScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -97289,15 +99166,15 @@
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('defaultRouteAction')) {
-      defaultRouteAction =
-          HttpRouteAction.fromJson(_json['defaultRouteAction']);
+      defaultRouteAction = HttpRouteAction.fromJson(
+          _json['defaultRouteAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultService')) {
       defaultService = _json['defaultService'] as core.String;
     }
     if (_json.containsKey('defaultUrlRedirect')) {
-      defaultUrlRedirect =
-          HttpRedirectAction.fromJson(_json['defaultUrlRedirect']);
+      defaultUrlRedirect = HttpRedirectAction.fromJson(
+          _json['defaultUrlRedirect'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -97306,11 +99183,13 @@
       fingerprint = _json['fingerprint'] as core.String;
     }
     if (_json.containsKey('headerAction')) {
-      headerAction = HttpHeaderAction.fromJson(_json['headerAction']);
+      headerAction = HttpHeaderAction.fromJson(
+          _json['headerAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hostRules')) {
       hostRules = (_json['hostRules'] as core.List)
-          .map<HostRule>((value) => HostRule.fromJson(value))
+          .map<HostRule>((value) =>
+              HostRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -97324,7 +99203,8 @@
     }
     if (_json.containsKey('pathMatchers')) {
       pathMatchers = (_json['pathMatchers'] as core.List)
-          .map<PathMatcher>((value) => PathMatcher.fromJson(value))
+          .map<PathMatcher>((value) => PathMatcher.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('region')) {
@@ -97335,7 +99215,8 @@
     }
     if (_json.containsKey('tests')) {
       tests = (_json['tests'] as core.List)
-          .map<UrlMapTest>((value) => UrlMapTest.fromJson(value))
+          .map<UrlMapTest>((value) =>
+              UrlMapTest.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -97475,8 +99356,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<UrlMapListWarningData>(
-              (value) => UrlMapListWarningData.fromJson(value))
+          .map<UrlMapListWarningData>((value) => UrlMapListWarningData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -97531,7 +99412,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<UrlMap>((value) => UrlMap.fromJson(value))
+          .map<UrlMap>((value) =>
+              UrlMap.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -97544,7 +99426,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = UrlMapListWarning.fromJson(_json['warning']);
+      warning = UrlMapListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -97670,7 +99553,8 @@
     }
     if (_json.containsKey('testFailures')) {
       testFailures = (_json['testFailures'] as core.List)
-          .map<TestFailure>((value) => TestFailure.fromJson(value))
+          .map<TestFailure>((value) => TestFailure.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('testPassed')) {
@@ -97780,8 +99664,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<UrlMapsAggregatedListWarningData>(
-              (value) => UrlMapsAggregatedListWarningData.fromJson(value))
+          .map<UrlMapsAggregatedListWarningData>((value) =>
+              UrlMapsAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -97838,8 +99723,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, UrlMapsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => UrlMapsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => UrlMapsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -97856,7 +99743,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = UrlMapsAggregatedListWarning.fromJson(_json['warning']);
+      warning = UrlMapsAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -97973,8 +99861,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<UrlMapsScopedListWarningData>(
-              (value) => UrlMapsScopedListWarningData.fromJson(value))
+          .map<UrlMapsScopedListWarningData>((value) =>
+              UrlMapsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -98010,11 +99899,13 @@
   UrlMapsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('urlMaps')) {
       urlMaps = (_json['urlMaps'] as core.List)
-          .map<UrlMap>((value) => UrlMap.fromJson(value))
+          .map<UrlMap>((value) =>
+              UrlMap.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = UrlMapsScopedListWarning.fromJson(_json['warning']);
+      warning = UrlMapsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -98038,7 +99929,8 @@
 
   UrlMapsValidateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('resource')) {
-      resource = UrlMap.fromJson(_json['resource']);
+      resource = UrlMap.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -98058,7 +99950,8 @@
 
   UrlMapsValidateResponse.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = UrlMapValidationResult.fromJson(_json['result']);
+      result = UrlMapValidationResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -98132,8 +100025,9 @@
     }
     if (_json.containsKey('secondaryIpRanges')) {
       secondaryIpRanges = (_json['secondaryIpRanges'] as core.List)
-          .map<UsableSubnetworkSecondaryRange>(
-              (value) => UsableSubnetworkSecondaryRange.fromJson(value))
+          .map<UsableSubnetworkSecondaryRange>((value) =>
+              UsableSubnetworkSecondaryRange.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subnetwork')) {
@@ -98277,7 +100171,8 @@
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
           .map<UsableSubnetworksAggregatedListWarningData>((value) =>
-              UsableSubnetworksAggregatedListWarningData.fromJson(value))
+              UsableSubnetworksAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -98334,7 +100229,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<UsableSubnetwork>((value) => UsableSubnetwork.fromJson(value))
+          .map<UsableSubnetwork>((value) => UsableSubnetwork.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -98347,8 +100243,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning =
-          UsableSubnetworksAggregatedListWarning.fromJson(_json['warning']);
+      warning = UsableSubnetworksAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -98432,7 +100328,8 @@
     if (_json.containsKey('interfaceNatMappings')) {
       interfaceNatMappings = (_json['interfaceNatMappings'] as core.List)
           .map<VmEndpointNatMappingsInterfaceNatMappings>((value) =>
-              VmEndpointNatMappingsInterfaceNatMappings.fromJson(value))
+              VmEndpointNatMappingsInterfaceNatMappings.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -98612,8 +100509,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<VmEndpointNatMappingsListWarningData>(
-              (value) => VmEndpointNatMappingsListWarningData.fromJson(value))
+          .map<VmEndpointNatMappingsListWarningData>((value) =>
+              VmEndpointNatMappingsListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -98676,15 +100574,16 @@
     }
     if (_json.containsKey('result')) {
       result = (_json['result'] as core.List)
-          .map<VmEndpointNatMappings>(
-              (value) => VmEndpointNatMappings.fromJson(value))
+          .map<VmEndpointNatMappings>((value) => VmEndpointNatMappings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = VmEndpointNatMappingsListWarning.fromJson(_json['warning']);
+      warning = VmEndpointNatMappingsListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -98800,7 +100699,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -98817,8 +100717,9 @@
     }
     if (_json.containsKey('vpnInterfaces')) {
       vpnInterfaces = (_json['vpnInterfaces'] as core.List)
-          .map<VpnGatewayVpnGatewayInterface>(
-              (value) => VpnGatewayVpnGatewayInterface.fromJson(value))
+          .map<VpnGatewayVpnGatewayInterface>((value) =>
+              VpnGatewayVpnGatewayInterface.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -98946,8 +100847,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<VpnGatewayAggregatedListWarningData>(
-              (value) => VpnGatewayAggregatedListWarningData.fromJson(value))
+          .map<VpnGatewayAggregatedListWarningData>((value) =>
+              VpnGatewayAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -99005,8 +100907,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, VpnGatewaysScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => VpnGatewaysScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => VpnGatewaysScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -99023,7 +100927,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = VpnGatewayAggregatedListWarning.fromJson(_json['warning']);
+      warning = VpnGatewayAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -99139,8 +101044,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<VpnGatewayListWarningData>(
-              (value) => VpnGatewayListWarningData.fromJson(value))
+          .map<VpnGatewayListWarningData>((value) =>
+              VpnGatewayListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -99196,7 +101102,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<VpnGateway>((value) => VpnGateway.fromJson(value))
+          .map<VpnGateway>((value) =>
+              VpnGateway.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -99209,7 +101116,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = VpnGatewayListWarning.fromJson(_json['warning']);
+      warning = VpnGatewayListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -99246,8 +101154,9 @@
   VpnGatewayStatus.fromJson(core.Map _json) {
     if (_json.containsKey('vpnConnections')) {
       vpnConnections = (_json['vpnConnections'] as core.List)
-          .map<VpnGatewayStatusVpnConnection>(
-              (value) => VpnGatewayStatusVpnConnection.fromJson(value))
+          .map<VpnGatewayStatusVpnConnection>((value) =>
+              VpnGatewayStatusVpnConnection.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -99374,12 +101283,13 @@
     }
     if (_json.containsKey('state')) {
       state = VpnGatewayStatusHighAvailabilityRequirementState.fromJson(
-          _json['state']);
+          _json['state'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tunnels')) {
       tunnels = (_json['tunnels'] as core.List)
-          .map<VpnGatewayStatusTunnel>(
-              (value) => VpnGatewayStatusTunnel.fromJson(value))
+          .map<VpnGatewayStatusTunnel>((value) =>
+              VpnGatewayStatusTunnel.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -99440,7 +101350,8 @@
 
   VpnGatewaysGetStatusResponse.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = VpnGatewayStatus.fromJson(_json['result']);
+      result = VpnGatewayStatus.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -99537,8 +101448,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<VpnGatewaysScopedListWarningData>(
-              (value) => VpnGatewaysScopedListWarningData.fromJson(value))
+          .map<VpnGatewaysScopedListWarningData>((value) =>
+              VpnGatewaysScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -99574,11 +101486,13 @@
   VpnGatewaysScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('vpnGateways')) {
       vpnGateways = (_json['vpnGateways'] as core.List)
-          .map<VpnGateway>((value) => VpnGateway.fromJson(value))
+          .map<VpnGateway>((value) =>
+              VpnGateway.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = VpnGatewaysScopedListWarning.fromJson(_json['warning']);
+      warning = VpnGatewaysScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -99967,8 +101881,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<VpnTunnelAggregatedListWarningData>(
-              (value) => VpnTunnelAggregatedListWarningData.fromJson(value))
+          .map<VpnTunnelAggregatedListWarningData>((value) =>
+              VpnTunnelAggregatedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -100025,8 +101940,10 @@
     }
     if (_json.containsKey('items')) {
       items = commons.mapMap<core.Map, VpnTunnelsScopedList>(
-          _json['items'].cast<core.String, core.Map>(),
-          (core.Map item) => VpnTunnelsScopedList.fromJson(item));
+          (_json['items'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => VpnTunnelsScopedList.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -100043,7 +101960,8 @@
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = VpnTunnelAggregatedListWarning.fromJson(_json['warning']);
+      warning = VpnTunnelAggregatedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -100159,8 +102077,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<VpnTunnelListWarningData>(
-              (value) => VpnTunnelListWarningData.fromJson(value))
+          .map<VpnTunnelListWarningData>((value) =>
+              VpnTunnelListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -100215,7 +102134,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<VpnTunnel>((value) => VpnTunnel.fromJson(value))
+          .map<VpnTunnel>((value) =>
+              VpnTunnel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -100228,7 +102148,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = VpnTunnelListWarning.fromJson(_json['warning']);
+      warning = VpnTunnelListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -100340,8 +102261,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<VpnTunnelsScopedListWarningData>(
-              (value) => VpnTunnelsScopedListWarningData.fromJson(value))
+          .map<VpnTunnelsScopedListWarningData>((value) =>
+              VpnTunnelsScopedListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -100377,11 +102299,13 @@
   VpnTunnelsScopedList.fromJson(core.Map _json) {
     if (_json.containsKey('vpnTunnels')) {
       vpnTunnels = (_json['vpnTunnels'] as core.List)
-          .map<VpnTunnel>((value) => VpnTunnel.fromJson(value))
+          .map<VpnTunnel>((value) =>
+              VpnTunnel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warning')) {
-      warning = VpnTunnelsScopedListWarning.fromJson(_json['warning']);
+      warning = VpnTunnelsScopedListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -100421,8 +102345,9 @@
     }
     if (_json.containsKey('expressions')) {
       expressions = (_json['expressions'] as core.List)
-          .map<WafExpressionSetExpression>(
-              (value) => WafExpressionSetExpression.fromJson(value))
+          .map<WafExpressionSetExpression>((value) =>
+              WafExpressionSetExpression.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -100508,7 +102433,8 @@
       backendService = _json['backendService'] as core.String;
     }
     if (_json.containsKey('headerAction')) {
-      headerAction = HttpHeaderAction.fromJson(_json['headerAction']);
+      headerAction = HttpHeaderAction.fromJson(
+          _json['headerAction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('weight')) {
       weight = _json['weight'] as core.int;
@@ -100613,8 +102539,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<XpnHostListWarningData>(
-              (value) => XpnHostListWarningData.fromJson(value))
+          .map<XpnHostListWarningData>((value) =>
+              XpnHostListWarningData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -100669,7 +102596,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Project>((value) => Project.fromJson(value))
+          .map<Project>((value) =>
+              Project.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -100682,7 +102610,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = XpnHostListWarning.fromJson(_json['warning']);
+      warning = XpnHostListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -100799,7 +102728,8 @@
       creationTimestamp = _json['creationTimestamp'] as core.String;
     }
     if (_json.containsKey('deprecated')) {
-      deprecated = DeprecationStatus.fromJson(_json['deprecated']);
+      deprecated = DeprecationStatus.fromJson(
+          _json['deprecated'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -100943,8 +102873,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ZoneListWarningData>(
-              (value) => ZoneListWarningData.fromJson(value))
+          .map<ZoneListWarningData>((value) => ZoneListWarningData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -100999,7 +102929,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Zone>((value) => Zone.fromJson(value))
+          .map<Zone>((value) =>
+              Zone.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -101012,7 +102943,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
-      warning = ZoneListWarning.fromJson(_json['warning']);
+      warning = ZoneListWarning.fromJson(
+          _json['warning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -101067,7 +102999,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -101109,14 +103042,16 @@
   ZoneSetPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/container/v1.dart b/generated/googleapis/lib/container/v1.dart
index 54dfbfa..f37063e 100644
--- a/generated/googleapis/lib/container/v1.dart
+++ b/generated/googleapis/lib/container/v1.dart
@@ -151,8 +151,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListUsableSubnetworksResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUsableSubnetworksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -233,7 +235,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServerConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServerConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -304,7 +309,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a cluster, consisting of the specified number and type of Google
@@ -369,7 +376,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the cluster, including the Kubernetes endpoint and all worker
@@ -447,7 +456,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a specific cluster.
@@ -521,7 +532,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Cluster.fromJson(data));
+    return _response.then(
+      (data) => Cluster.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the public component of the cluster signing keys in JSON Web Key
@@ -573,7 +586,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetJSONWebKeysResponse.fromJson(data));
+    return _response.then(
+      (data) => GetJSONWebKeysResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all clusters owned by a project in either the specified zone or all
@@ -643,7 +659,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListClustersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListClustersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the addons for a specific cluster.
@@ -701,7 +720,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables or disables the ABAC authorization mechanism on a cluster.
@@ -760,7 +781,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the locations for a specific cluster. Deprecated. Use
@@ -821,7 +844,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the logging service for a specific cluster.
@@ -879,7 +904,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the maintenance policy for a cluster.
@@ -938,7 +965,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets master auth materials. Currently supports changing the admin password
@@ -998,7 +1027,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the monitoring service for a specific cluster.
@@ -1057,7 +1088,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables or disables Network Policy for a cluster.
@@ -1116,7 +1149,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets labels on a cluster.
@@ -1175,7 +1210,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts master IP rotation.
@@ -1234,7 +1271,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the settings of a specific cluster.
@@ -1290,7 +1329,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the master for a specific cluster.
@@ -1348,7 +1389,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1413,7 +1456,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a node pool from a cluster.
@@ -1497,7 +1542,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the requested node pool.
@@ -1581,7 +1628,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodePool.fromJson(data));
+    return _response.then(
+      (data) => NodePool.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the node pools for a cluster.
@@ -1658,7 +1707,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListNodePoolsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListNodePoolsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rolls back a previously Aborted or Failed NodePool upgrade. This makes no
@@ -1717,7 +1769,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the autoscaling settings for the specified node pool.
@@ -1777,7 +1831,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the NodeManagement options for a node pool.
@@ -1837,7 +1893,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the size for a specific node pool.
@@ -1895,7 +1953,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the version and/or image type for the specified node pool.
@@ -1953,7 +2013,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2017,7 +2079,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetOpenIDConfigResponse.fromJson(data));
+    return _response.then(
+      (data) => GetOpenIDConfigResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2082,7 +2147,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified operation.
@@ -2158,7 +2225,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all operations in a project in a specific zone or all zones.
@@ -2228,7 +2297,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2309,7 +2381,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServerConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServerConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2397,7 +2472,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Completes master IP rotation.
@@ -2476,7 +2553,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a cluster, consisting of the specified number and type of Google
@@ -2553,7 +2632,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the cluster, including the Kubernetes endpoint and all worker
@@ -2635,7 +2716,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a specific cluster.
@@ -2713,7 +2796,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Cluster.fromJson(data));
+    return _response.then(
+      (data) => Cluster.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables or disables the ABAC authorization mechanism on a cluster.
@@ -2791,7 +2876,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all clusters owned by a project in either the specified zone or all
@@ -2863,7 +2950,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListClustersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListClustersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the locations for a specific cluster. Deprecated. Use
@@ -2943,7 +3033,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the logging service for a specific cluster.
@@ -3021,7 +3113,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the master for a specific cluster.
@@ -3099,7 +3193,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the monitoring service for a specific cluster.
@@ -3177,7 +3273,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets labels on a cluster.
@@ -3256,7 +3354,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the maintenance policy for a cluster.
@@ -3331,7 +3431,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets master auth materials. Currently supports changing the admin password
@@ -3411,7 +3513,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables or disables Network Policy for a cluster.
@@ -3490,7 +3594,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts master IP rotation.
@@ -3569,7 +3675,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the settings of a specific cluster.
@@ -3646,7 +3754,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3740,7 +3850,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a node pool for a cluster.
@@ -3819,7 +3931,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a node pool from a cluster.
@@ -3908,7 +4022,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the requested node pool.
@@ -3997,7 +4113,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NodePool.fromJson(data));
+    return _response.then(
+      (data) => NodePool.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the node pools for a cluster.
@@ -4078,7 +4196,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListNodePoolsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListNodePoolsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rolls back a previously Aborted or Failed NodePool upgrade. This makes no
@@ -4166,7 +4287,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the NodeManagement options for a node pool.
@@ -4253,7 +4376,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the size for a specific node pool.
@@ -4340,7 +4465,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the version and/or image type for the specified node pool.
@@ -4427,7 +4554,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4512,7 +4641,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified operation.
@@ -4591,7 +4722,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all operations in a project in a specific zone or all zones.
@@ -4662,7 +4795,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4737,30 +4873,34 @@
 
   AddonsConfig.fromJson(core.Map _json) {
     if (_json.containsKey('cloudRunConfig')) {
-      cloudRunConfig = CloudRunConfig.fromJson(_json['cloudRunConfig']);
+      cloudRunConfig = CloudRunConfig.fromJson(
+          _json['cloudRunConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('configConnectorConfig')) {
-      configConnectorConfig =
-          ConfigConnectorConfig.fromJson(_json['configConnectorConfig']);
+      configConnectorConfig = ConfigConnectorConfig.fromJson(
+          _json['configConnectorConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dnsCacheConfig')) {
-      dnsCacheConfig = DnsCacheConfig.fromJson(_json['dnsCacheConfig']);
+      dnsCacheConfig = DnsCacheConfig.fromJson(
+          _json['dnsCacheConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('horizontalPodAutoscaling')) {
-      horizontalPodAutoscaling =
-          HorizontalPodAutoscaling.fromJson(_json['horizontalPodAutoscaling']);
+      horizontalPodAutoscaling = HorizontalPodAutoscaling.fromJson(
+          _json['horizontalPodAutoscaling']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpLoadBalancing')) {
-      httpLoadBalancing =
-          HttpLoadBalancing.fromJson(_json['httpLoadBalancing']);
+      httpLoadBalancing = HttpLoadBalancing.fromJson(
+          _json['httpLoadBalancing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kubernetesDashboard')) {
-      kubernetesDashboard =
-          KubernetesDashboard.fromJson(_json['kubernetesDashboard']);
+      kubernetesDashboard = KubernetesDashboard.fromJson(
+          _json['kubernetesDashboard'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('networkPolicyConfig')) {
-      networkPolicyConfig =
-          NetworkPolicyConfig.fromJson(_json['networkPolicyConfig']);
+      networkPolicyConfig = NetworkPolicyConfig.fromJson(
+          _json['networkPolicyConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4915,7 +5055,8 @@
       diskType = _json['diskType'] as core.String;
     }
     if (_json.containsKey('management')) {
-      management = NodeManagement.fromJson(_json['management']);
+      management = NodeManagement.fromJson(
+          _json['management'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minCpuPlatform')) {
       minCpuPlatform = _json['minCpuPlatform'] as core.String;
@@ -4929,11 +5070,13 @@
       serviceAccount = _json['serviceAccount'] as core.String;
     }
     if (_json.containsKey('shieldedInstanceConfig')) {
-      shieldedInstanceConfig =
-          ShieldedInstanceConfig.fromJson(_json['shieldedInstanceConfig']);
+      shieldedInstanceConfig = ShieldedInstanceConfig.fromJson(
+          _json['shieldedInstanceConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('upgradeSettings')) {
-      upgradeSettings = UpgradeSettings.fromJson(_json['upgradeSettings']);
+      upgradeSettings = UpgradeSettings.fromJson(
+          _json['upgradeSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5425,25 +5568,29 @@
 
   Cluster.fromJson(core.Map _json) {
     if (_json.containsKey('addonsConfig')) {
-      addonsConfig = AddonsConfig.fromJson(_json['addonsConfig']);
+      addonsConfig = AddonsConfig.fromJson(
+          _json['addonsConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('authenticatorGroupsConfig')) {
       authenticatorGroupsConfig = AuthenticatorGroupsConfig.fromJson(
-          _json['authenticatorGroupsConfig']);
+          _json['authenticatorGroupsConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('autoscaling')) {
-      autoscaling = ClusterAutoscaling.fromJson(_json['autoscaling']);
+      autoscaling = ClusterAutoscaling.fromJson(
+          _json['autoscaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('binaryAuthorization')) {
-      binaryAuthorization =
-          BinaryAuthorization.fromJson(_json['binaryAuthorization']);
+      binaryAuthorization = BinaryAuthorization.fromJson(
+          _json['binaryAuthorization'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clusterIpv4Cidr')) {
       clusterIpv4Cidr = _json['clusterIpv4Cidr'] as core.String;
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<StatusCondition>((value) => StatusCondition.fromJson(value))
+          .map<StatusCondition>((value) => StatusCondition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('createTime')) {
@@ -5459,12 +5606,13 @@
       currentNodeVersion = _json['currentNodeVersion'] as core.String;
     }
     if (_json.containsKey('databaseEncryption')) {
-      databaseEncryption =
-          DatabaseEncryption.fromJson(_json['databaseEncryption']);
+      databaseEncryption = DatabaseEncryption.fromJson(
+          _json['databaseEncryption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultMaxPodsConstraint')) {
-      defaultMaxPodsConstraint =
-          MaxPodsConstraint.fromJson(_json['defaultMaxPodsConstraint']);
+      defaultMaxPodsConstraint = MaxPodsConstraint.fromJson(
+          _json['defaultMaxPodsConstraint']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -5493,14 +5641,15 @@
           .toList();
     }
     if (_json.containsKey('ipAllocationPolicy')) {
-      ipAllocationPolicy =
-          IPAllocationPolicy.fromJson(_json['ipAllocationPolicy']);
+      ipAllocationPolicy = IPAllocationPolicy.fromJson(
+          _json['ipAllocationPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelFingerprint')) {
       labelFingerprint = _json['labelFingerprint'] as core.String;
     }
     if (_json.containsKey('legacyAbac')) {
-      legacyAbac = LegacyAbac.fromJson(_json['legacyAbac']);
+      legacyAbac = LegacyAbac.fromJson(
+          _json['legacyAbac'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -5514,15 +5663,17 @@
       loggingService = _json['loggingService'] as core.String;
     }
     if (_json.containsKey('maintenancePolicy')) {
-      maintenancePolicy =
-          MaintenancePolicy.fromJson(_json['maintenancePolicy']);
+      maintenancePolicy = MaintenancePolicy.fromJson(
+          _json['maintenancePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('masterAuth')) {
-      masterAuth = MasterAuth.fromJson(_json['masterAuth']);
+      masterAuth = MasterAuth.fromJson(
+          _json['masterAuth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('masterAuthorizedNetworksConfig')) {
       masterAuthorizedNetworksConfig = MasterAuthorizedNetworksConfig.fromJson(
-          _json['masterAuthorizedNetworksConfig']);
+          _json['masterAuthorizedNetworksConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('monitoringService')) {
       monitoringService = _json['monitoringService'] as core.String;
@@ -5534,37 +5685,44 @@
       network = _json['network'] as core.String;
     }
     if (_json.containsKey('networkConfig')) {
-      networkConfig = NetworkConfig.fromJson(_json['networkConfig']);
+      networkConfig = NetworkConfig.fromJson(
+          _json['networkConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('networkPolicy')) {
-      networkPolicy = NetworkPolicy.fromJson(_json['networkPolicy']);
+      networkPolicy = NetworkPolicy.fromJson(
+          _json['networkPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nodeConfig')) {
-      nodeConfig = NodeConfig.fromJson(_json['nodeConfig']);
+      nodeConfig = NodeConfig.fromJson(
+          _json['nodeConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nodeIpv4CidrSize')) {
       nodeIpv4CidrSize = _json['nodeIpv4CidrSize'] as core.int;
     }
     if (_json.containsKey('nodePools')) {
       nodePools = (_json['nodePools'] as core.List)
-          .map<NodePool>((value) => NodePool.fromJson(value))
+          .map<NodePool>((value) =>
+              NodePool.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('privateClusterConfig')) {
-      privateClusterConfig =
-          PrivateClusterConfig.fromJson(_json['privateClusterConfig']);
+      privateClusterConfig = PrivateClusterConfig.fromJson(
+          _json['privateClusterConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('releaseChannel')) {
-      releaseChannel = ReleaseChannel.fromJson(_json['releaseChannel']);
+      releaseChannel = ReleaseChannel.fromJson(
+          _json['releaseChannel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceLabels')) {
       resourceLabels = commons.mapMap<core.String, core.String>(
-          _json['resourceLabels'].cast<core.String, core.String>(),
+          (_json['resourceLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('resourceUsageExportConfig')) {
       resourceUsageExportConfig = ResourceUsageExportConfig.fromJson(
-          _json['resourceUsageExportConfig']);
+          _json['resourceUsageExportConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -5573,7 +5731,8 @@
       servicesIpv4Cidr = _json['servicesIpv4Cidr'] as core.String;
     }
     if (_json.containsKey('shieldedNodes')) {
-      shieldedNodes = ShieldedNodes.fromJson(_json['shieldedNodes']);
+      shieldedNodes = ShieldedNodes.fromJson(
+          _json['shieldedNodes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
@@ -5588,12 +5747,14 @@
       tpuIpv4CidrBlock = _json['tpuIpv4CidrBlock'] as core.String;
     }
     if (_json.containsKey('verticalPodAutoscaling')) {
-      verticalPodAutoscaling =
-          VerticalPodAutoscaling.fromJson(_json['verticalPodAutoscaling']);
+      verticalPodAutoscaling = VerticalPodAutoscaling.fromJson(
+          _json['verticalPodAutoscaling']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workloadIdentityConfig')) {
-      workloadIdentityConfig =
-          WorkloadIdentityConfig.fromJson(_json['workloadIdentityConfig']);
+      workloadIdentityConfig = WorkloadIdentityConfig.fromJson(
+          _json['workloadIdentityConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -5792,7 +5953,8 @@
     if (_json.containsKey('autoprovisioningNodePoolDefaults')) {
       autoprovisioningNodePoolDefaults =
           AutoprovisioningNodePoolDefaults.fromJson(
-              _json['autoprovisioningNodePoolDefaults']);
+              _json['autoprovisioningNodePoolDefaults']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enableNodeAutoprovisioning')) {
       enableNodeAutoprovisioning =
@@ -5800,7 +5962,8 @@
     }
     if (_json.containsKey('resourceLimits')) {
       resourceLimits = (_json['resourceLimits'] as core.List)
-          .map<ResourceLimit>((value) => ResourceLimit.fromJson(value))
+          .map<ResourceLimit>((value) => ResourceLimit.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5934,30 +6097,36 @@
 
   ClusterUpdate.fromJson(core.Map _json) {
     if (_json.containsKey('desiredAddonsConfig')) {
-      desiredAddonsConfig = AddonsConfig.fromJson(_json['desiredAddonsConfig']);
+      desiredAddonsConfig = AddonsConfig.fromJson(
+          _json['desiredAddonsConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredBinaryAuthorization')) {
-      desiredBinaryAuthorization =
-          BinaryAuthorization.fromJson(_json['desiredBinaryAuthorization']);
+      desiredBinaryAuthorization = BinaryAuthorization.fromJson(
+          _json['desiredBinaryAuthorization']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredClusterAutoscaling')) {
-      desiredClusterAutoscaling =
-          ClusterAutoscaling.fromJson(_json['desiredClusterAutoscaling']);
+      desiredClusterAutoscaling = ClusterAutoscaling.fromJson(
+          _json['desiredClusterAutoscaling']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredDatabaseEncryption')) {
-      desiredDatabaseEncryption =
-          DatabaseEncryption.fromJson(_json['desiredDatabaseEncryption']);
+      desiredDatabaseEncryption = DatabaseEncryption.fromJson(
+          _json['desiredDatabaseEncryption']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredDefaultSnatStatus')) {
-      desiredDefaultSnatStatus =
-          DefaultSnatStatus.fromJson(_json['desiredDefaultSnatStatus']);
+      desiredDefaultSnatStatus = DefaultSnatStatus.fromJson(
+          _json['desiredDefaultSnatStatus']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredImageType')) {
       desiredImageType = _json['desiredImageType'] as core.String;
     }
     if (_json.containsKey('desiredIntraNodeVisibilityConfig')) {
       desiredIntraNodeVisibilityConfig = IntraNodeVisibilityConfig.fromJson(
-          _json['desiredIntraNodeVisibilityConfig']);
+          _json['desiredIntraNodeVisibilityConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredLocations')) {
       desiredLocations = (_json['desiredLocations'] as core.List)
@@ -5970,7 +6139,8 @@
     if (_json.containsKey('desiredMasterAuthorizedNetworksConfig')) {
       desiredMasterAuthorizedNetworksConfig =
           MasterAuthorizedNetworksConfig.fromJson(
-              _json['desiredMasterAuthorizedNetworksConfig']);
+              _json['desiredMasterAuthorizedNetworksConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredMasterVersion')) {
       desiredMasterVersion = _json['desiredMasterVersion'] as core.String;
@@ -5980,8 +6150,9 @@
           _json['desiredMonitoringService'] as core.String;
     }
     if (_json.containsKey('desiredNodePoolAutoscaling')) {
-      desiredNodePoolAutoscaling =
-          NodePoolAutoscaling.fromJson(_json['desiredNodePoolAutoscaling']);
+      desiredNodePoolAutoscaling = NodePoolAutoscaling.fromJson(
+          _json['desiredNodePoolAutoscaling']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredNodePoolId')) {
       desiredNodePoolId = _json['desiredNodePoolId'] as core.String;
@@ -5990,28 +6161,33 @@
       desiredNodeVersion = _json['desiredNodeVersion'] as core.String;
     }
     if (_json.containsKey('desiredPrivateClusterConfig')) {
-      desiredPrivateClusterConfig =
-          PrivateClusterConfig.fromJson(_json['desiredPrivateClusterConfig']);
+      desiredPrivateClusterConfig = PrivateClusterConfig.fromJson(
+          _json['desiredPrivateClusterConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredReleaseChannel')) {
-      desiredReleaseChannel =
-          ReleaseChannel.fromJson(_json['desiredReleaseChannel']);
+      desiredReleaseChannel = ReleaseChannel.fromJson(
+          _json['desiredReleaseChannel']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredResourceUsageExportConfig')) {
       desiredResourceUsageExportConfig = ResourceUsageExportConfig.fromJson(
-          _json['desiredResourceUsageExportConfig']);
+          _json['desiredResourceUsageExportConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredShieldedNodes')) {
-      desiredShieldedNodes =
-          ShieldedNodes.fromJson(_json['desiredShieldedNodes']);
+      desiredShieldedNodes = ShieldedNodes.fromJson(
+          _json['desiredShieldedNodes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredVerticalPodAutoscaling')) {
       desiredVerticalPodAutoscaling = VerticalPodAutoscaling.fromJson(
-          _json['desiredVerticalPodAutoscaling']);
+          _json['desiredVerticalPodAutoscaling']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desiredWorkloadIdentityConfig')) {
       desiredWorkloadIdentityConfig = WorkloadIdentityConfig.fromJson(
-          _json['desiredWorkloadIdentityConfig']);
+          _json['desiredWorkloadIdentityConfig']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6218,7 +6394,8 @@
 
   CreateClusterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cluster')) {
-      cluster = Cluster.fromJson(_json['cluster']);
+      cluster = Cluster.fromJson(
+          _json['cluster'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parent')) {
       parent = _json['parent'] as core.String;
@@ -6281,7 +6458,8 @@
       clusterId = _json['clusterId'] as core.String;
     }
     if (_json.containsKey('nodePool')) {
-      nodePool = NodePool.fromJson(_json['nodePool']);
+      nodePool = NodePool.fromJson(
+          _json['nodePool'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parent')) {
       parent = _json['parent'] as core.String;
@@ -6464,12 +6642,13 @@
 
   GetJSONWebKeysResponse.fromJson(core.Map _json) {
     if (_json.containsKey('cacheHeader')) {
-      cacheHeader =
-          HttpCacheControlResponseHeader.fromJson(_json['cacheHeader']);
+      cacheHeader = HttpCacheControlResponseHeader.fromJson(
+          _json['cacheHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
-          .map<Jwk>((value) => Jwk.fromJson(value))
+          .map<Jwk>((value) =>
+              Jwk.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6518,8 +6697,8 @@
 
   GetOpenIDConfigResponse.fromJson(core.Map _json) {
     if (_json.containsKey('cacheHeader')) {
-      cacheHeader =
-          HttpCacheControlResponseHeader.fromJson(_json['cacheHeader']);
+      cacheHeader = HttpCacheControlResponseHeader.fromJson(
+          _json['cacheHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('claims_supported')) {
       claimsSupported = (_json['claims_supported'] as core.List)
@@ -7037,7 +7216,8 @@
   ListClustersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('clusters')) {
       clusters = (_json['clusters'] as core.List)
-          .map<Cluster>((value) => Cluster.fromJson(value))
+          .map<Cluster>((value) =>
+              Cluster.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('missingZones')) {
@@ -7069,7 +7249,8 @@
   ListNodePoolsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('nodePools')) {
       nodePools = (_json['nodePools'] as core.List)
-          .map<NodePool>((value) => NodePool.fromJson(value))
+          .map<NodePool>((value) =>
+              NodePool.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7102,7 +7283,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7139,7 +7321,8 @@
     }
     if (_json.containsKey('subnetworks')) {
       subnetworks = (_json['subnetworks'] as core.List)
-          .map<UsableSubnetwork>((value) => UsableSubnetwork.fromJson(value))
+          .map<UsableSubnetwork>((value) => UsableSubnetwork.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7176,7 +7359,8 @@
       resourceVersion = _json['resourceVersion'] as core.String;
     }
     if (_json.containsKey('window')) {
-      window = MaintenanceWindow.fromJson(_json['window']);
+      window = MaintenanceWindow.fromJson(
+          _json['window'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7210,16 +7394,21 @@
 
   MaintenanceWindow.fromJson(core.Map _json) {
     if (_json.containsKey('dailyMaintenanceWindow')) {
-      dailyMaintenanceWindow =
-          DailyMaintenanceWindow.fromJson(_json['dailyMaintenanceWindow']);
+      dailyMaintenanceWindow = DailyMaintenanceWindow.fromJson(
+          _json['dailyMaintenanceWindow']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maintenanceExclusions')) {
       maintenanceExclusions = commons.mapMap<core.Map, TimeWindow>(
-          _json['maintenanceExclusions'].cast<core.String, core.Map>(),
-          (core.Map item) => TimeWindow.fromJson(item));
+          (_json['maintenanceExclusions']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              TimeWindow.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('recurringWindow')) {
-      recurringWindow = RecurringTimeWindow.fromJson(_json['recurringWindow']);
+      recurringWindow = RecurringTimeWindow.fromJson(
+          _json['recurringWindow'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7286,8 +7475,9 @@
       clientCertificate = _json['clientCertificate'] as core.String;
     }
     if (_json.containsKey('clientCertificateConfig')) {
-      clientCertificateConfig =
-          ClientCertificateConfig.fromJson(_json['clientCertificateConfig']);
+      clientCertificateConfig = ClientCertificateConfig.fromJson(
+          _json['clientCertificateConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clientKey')) {
       clientKey = _json['clientKey'] as core.String;
@@ -7344,7 +7534,8 @@
   MasterAuthorizedNetworksConfig.fromJson(core.Map _json) {
     if (_json.containsKey('cidrBlocks')) {
       cidrBlocks = (_json['cidrBlocks'] as core.List)
-          .map<CidrBlock>((value) => CidrBlock.fromJson(value))
+          .map<CidrBlock>((value) =>
+              CidrBlock.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('enabled')) {
@@ -7463,8 +7654,8 @@
 
   NetworkConfig.fromJson(core.Map _json) {
     if (_json.containsKey('defaultSnatStatus')) {
-      defaultSnatStatus =
-          DefaultSnatStatus.fromJson(_json['defaultSnatStatus']);
+      defaultSnatStatus = DefaultSnatStatus.fromJson(
+          _json['defaultSnatStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enableIntraNodeVisibility')) {
       enableIntraNodeVisibility =
@@ -7686,7 +7877,8 @@
   NodeConfig.fromJson(core.Map _json) {
     if (_json.containsKey('accelerators')) {
       accelerators = (_json['accelerators'] as core.List)
-          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(value))
+          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bootDiskKmsKey')) {
@@ -7703,7 +7895,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('localSsdCount')) {
@@ -7714,7 +7907,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.String, core.String>(
-          _json['metadata'].cast<core.String, core.String>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('minCpuPlatform')) {
@@ -7732,18 +7926,20 @@
       preemptible = _json['preemptible'] as core.bool;
     }
     if (_json.containsKey('reservationAffinity')) {
-      reservationAffinity =
-          ReservationAffinity.fromJson(_json['reservationAffinity']);
+      reservationAffinity = ReservationAffinity.fromJson(
+          _json['reservationAffinity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sandboxConfig')) {
-      sandboxConfig = SandboxConfig.fromJson(_json['sandboxConfig']);
+      sandboxConfig = SandboxConfig.fromJson(
+          _json['sandboxConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceAccount')) {
       serviceAccount = _json['serviceAccount'] as core.String;
     }
     if (_json.containsKey('shieldedInstanceConfig')) {
-      shieldedInstanceConfig =
-          ShieldedInstanceConfig.fromJson(_json['shieldedInstanceConfig']);
+      shieldedInstanceConfig = ShieldedInstanceConfig.fromJson(
+          _json['shieldedInstanceConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tags')) {
       tags = (_json['tags'] as core.List)
@@ -7752,12 +7948,14 @@
     }
     if (_json.containsKey('taints')) {
       taints = (_json['taints'] as core.List)
-          .map<NodeTaint>((value) => NodeTaint.fromJson(value))
+          .map<NodeTaint>((value) =>
+              NodeTaint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('workloadMetadataConfig')) {
-      workloadMetadataConfig =
-          WorkloadMetadataConfig.fromJson(_json['workloadMetadataConfig']);
+      workloadMetadataConfig = WorkloadMetadataConfig.fromJson(
+          _json['workloadMetadataConfig']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7855,7 +8053,8 @@
       autoUpgrade = _json['autoUpgrade'] as core.bool;
     }
     if (_json.containsKey('upgradeOptions')) {
-      upgradeOptions = AutoUpgradeOptions.fromJson(_json['upgradeOptions']);
+      upgradeOptions = AutoUpgradeOptions.fromJson(
+          _json['upgradeOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7957,15 +8156,18 @@
 
   NodePool.fromJson(core.Map _json) {
     if (_json.containsKey('autoscaling')) {
-      autoscaling = NodePoolAutoscaling.fromJson(_json['autoscaling']);
+      autoscaling = NodePoolAutoscaling.fromJson(
+          _json['autoscaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<StatusCondition>((value) => StatusCondition.fromJson(value))
+          .map<StatusCondition>((value) => StatusCondition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('config')) {
-      config = NodeConfig.fromJson(_json['config']);
+      config = NodeConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('initialNodeCount')) {
       initialNodeCount = _json['initialNodeCount'] as core.int;
@@ -7981,11 +8183,12 @@
           .toList();
     }
     if (_json.containsKey('management')) {
-      management = NodeManagement.fromJson(_json['management']);
+      management = NodeManagement.fromJson(
+          _json['management'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxPodsConstraint')) {
-      maxPodsConstraint =
-          MaxPodsConstraint.fromJson(_json['maxPodsConstraint']);
+      maxPodsConstraint = MaxPodsConstraint.fromJson(
+          _json['maxPodsConstraint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8003,7 +8206,8 @@
       statusMessage = _json['statusMessage'] as core.String;
     }
     if (_json.containsKey('upgradeSettings')) {
-      upgradeSettings = UpgradeSettings.fromJson(_json['upgradeSettings']);
+      upgradeSettings = UpgradeSettings.fromJson(
+          _json['upgradeSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
       version = _json['version'] as core.String;
@@ -8244,7 +8448,8 @@
   Operation.fromJson(core.Map _json) {
     if (_json.containsKey('clusterConditions')) {
       clusterConditions = (_json['clusterConditions'] as core.List)
-          .map<StatusCondition>((value) => StatusCondition.fromJson(value))
+          .map<StatusCondition>((value) => StatusCondition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('detail')) {
@@ -8261,14 +8466,16 @@
     }
     if (_json.containsKey('nodepoolConditions')) {
       nodepoolConditions = (_json['nodepoolConditions'] as core.List)
-          .map<StatusCondition>((value) => StatusCondition.fromJson(value))
+          .map<StatusCondition>((value) => StatusCondition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operationType')) {
       operationType = _json['operationType'] as core.String;
     }
     if (_json.containsKey('progress')) {
-      progress = OperationProgress.fromJson(_json['progress']);
+      progress = OperationProgress.fromJson(
+          _json['progress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -8369,7 +8576,8 @@
   OperationProgress.fromJson(core.Map _json) {
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -8377,7 +8585,8 @@
     }
     if (_json.containsKey('stages')) {
       stages = (_json['stages'] as core.List)
-          .map<OperationProgress>((value) => OperationProgress.fromJson(value))
+          .map<OperationProgress>((value) => OperationProgress.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('status')) {
@@ -8443,7 +8652,8 @@
     if (_json.containsKey('masterGlobalAccessConfig')) {
       masterGlobalAccessConfig =
           PrivateClusterMasterGlobalAccessConfig.fromJson(
-              _json['masterGlobalAccessConfig']);
+              _json['masterGlobalAccessConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('masterIpv4CidrBlock')) {
       masterIpv4CidrBlock = _json['masterIpv4CidrBlock'] as core.String;
@@ -8538,7 +8748,8 @@
       recurrence = _json['recurrence'] as core.String;
     }
     if (_json.containsKey('window')) {
-      window = TimeWindow.fromJson(_json['window']);
+      window = TimeWindow.fromJson(
+          _json['window'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8752,12 +8963,13 @@
 
   ResourceUsageExportConfig.fromJson(core.Map _json) {
     if (_json.containsKey('bigqueryDestination')) {
-      bigqueryDestination =
-          BigQueryDestination.fromJson(_json['bigqueryDestination']);
+      bigqueryDestination = BigQueryDestination.fromJson(
+          _json['bigqueryDestination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('consumptionMeteringConfig')) {
       consumptionMeteringConfig = ConsumptionMeteringConfig.fromJson(
-          _json['consumptionMeteringConfig']);
+          _json['consumptionMeteringConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enableNetworkEgressMetering')) {
       enableNetworkEgressMetering =
@@ -8899,8 +9111,8 @@
   ServerConfig.fromJson(core.Map _json) {
     if (_json.containsKey('channels')) {
       channels = (_json['channels'] as core.List)
-          .map<ReleaseChannelConfig>(
-              (value) => ReleaseChannelConfig.fromJson(value))
+          .map<ReleaseChannelConfig>((value) => ReleaseChannelConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('defaultClusterVersion')) {
@@ -8979,7 +9191,8 @@
 
   SetAddonsConfigRequest.fromJson(core.Map _json) {
     if (_json.containsKey('addonsConfig')) {
-      addonsConfig = AddonsConfig.fromJson(_json['addonsConfig']);
+      addonsConfig = AddonsConfig.fromJson(
+          _json['addonsConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clusterId')) {
       clusterId = _json['clusterId'] as core.String;
@@ -9067,7 +9280,8 @@
     }
     if (_json.containsKey('resourceLabels')) {
       resourceLabels = commons.mapMap<core.String, core.String>(
-          _json['resourceLabels'].cast<core.String, core.String>(),
+          (_json['resourceLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('zone')) {
@@ -9340,8 +9554,8 @@
       clusterId = _json['clusterId'] as core.String;
     }
     if (_json.containsKey('maintenancePolicy')) {
-      maintenancePolicy =
-          MaintenancePolicy.fromJson(_json['maintenancePolicy']);
+      maintenancePolicy = MaintenancePolicy.fromJson(
+          _json['maintenancePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -9426,7 +9640,8 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('update')) {
-      update = MasterAuth.fromJson(_json['update']);
+      update = MasterAuth.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -9564,7 +9779,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('networkPolicy')) {
-      networkPolicy = NetworkPolicy.fromJson(_json['networkPolicy']);
+      networkPolicy = NetworkPolicy.fromJson(
+          _json['networkPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
@@ -9628,7 +9844,8 @@
 
   SetNodePoolAutoscalingRequest.fromJson(core.Map _json) {
     if (_json.containsKey('autoscaling')) {
-      autoscaling = NodePoolAutoscaling.fromJson(_json['autoscaling']);
+      autoscaling = NodePoolAutoscaling.fromJson(
+          _json['autoscaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clusterId')) {
       clusterId = _json['clusterId'] as core.String;
@@ -9708,7 +9925,8 @@
       clusterId = _json['clusterId'] as core.String;
     }
     if (_json.containsKey('management')) {
-      management = NodeManagement.fromJson(_json['management']);
+      management = NodeManagement.fromJson(
+          _json['management'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -10064,7 +10282,8 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('update')) {
-      update = ClusterUpdate.fromJson(_json['update']);
+      update = ClusterUpdate.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -10241,11 +10460,13 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('upgradeSettings')) {
-      upgradeSettings = UpgradeSettings.fromJson(_json['upgradeSettings']);
+      upgradeSettings = UpgradeSettings.fromJson(
+          _json['upgradeSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workloadMetadataConfig')) {
-      workloadMetadataConfig =
-          WorkloadMetadataConfig.fromJson(_json['workloadMetadataConfig']);
+      workloadMetadataConfig = WorkloadMetadataConfig.fromJson(
+          _json['workloadMetadataConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -10443,8 +10664,9 @@
     }
     if (_json.containsKey('secondaryIpRanges')) {
       secondaryIpRanges = (_json['secondaryIpRanges'] as core.List)
-          .map<UsableSubnetworkSecondaryRange>(
-              (value) => UsableSubnetworkSecondaryRange.fromJson(value))
+          .map<UsableSubnetworkSecondaryRange>((value) =>
+              UsableSubnetworkSecondaryRange.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('statusMessage')) {
diff --git a/generated/googleapis/lib/content/v2_1.dart b/generated/googleapis/lib/content/v2_1.dart
index 72a4b1e..8948043 100644
--- a/generated/googleapis/lib/content/v2_1.dart
+++ b/generated/googleapis/lib/content/v2_1.dart
@@ -125,7 +125,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsAuthInfoResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsAuthInfoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Claims the website of a Merchant Center sub-account.
@@ -192,8 +195,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AccountsClaimWebsiteResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsClaimWebsiteResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves, inserts, updates, and deletes multiple Merchant Center
@@ -242,7 +247,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Merchant Center sub-account.
@@ -306,7 +314,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a Merchant Center account.
@@ -374,7 +384,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a Merchant Center sub-account.
@@ -429,7 +441,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Performs an action on a link between two Merchant Center accounts, namely
@@ -495,7 +509,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsLinkResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsLinkResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the sub-accounts in your Merchant Center account.
@@ -574,7 +591,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsListResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of accounts linked to your Merchant Center account.
@@ -646,7 +666,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsListLinksResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsListLinksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Merchant Center account. Any fields that are not provided are
@@ -711,7 +734,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates labels that are assigned to the Merchant Center account by CSS
@@ -775,8 +800,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AccountsUpdateLabelsResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsUpdateLabelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -830,8 +857,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AccountstatusesCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountstatusesCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the status of a Merchant Center account. No itemLevelIssues are
@@ -897,7 +926,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountStatus.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccountStatus.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the statuses of the sub-accounts in your Merchant Center account.
@@ -966,7 +998,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountstatusesListResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountstatusesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1021,8 +1056,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AccounttaxCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => AccounttaxCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the tax settings of the account.
@@ -1081,7 +1118,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountTax.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccountTax.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the tax settings of the sub-accounts in your Merchant Center
@@ -1144,7 +1184,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccounttaxListResponse.fromJson(data));
+    return _response.then(
+      (data) => AccounttaxListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the tax settings of the account. Any fields that are not provided
@@ -1210,7 +1253,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountTax.fromJson(data));
+    return _response.then(
+      (data) =>
+          AccountTax.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1265,8 +1311,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => DatafeedsCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => DatafeedsCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a datafeed configuration from your Merchant Center account.
@@ -1323,7 +1371,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Invokes a fetch for the datafeed in your Merchant Center account.
@@ -1381,7 +1431,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DatafeedsFetchNowResponse.fromJson(data));
+    return _response.then(
+      (data) => DatafeedsFetchNowResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a datafeed configuration from your Merchant Center account.
@@ -1438,7 +1491,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Datafeed.fromJson(data));
+    return _response.then(
+      (data) => Datafeed.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Registers a datafeed configuration with your Merchant Center account.
@@ -1493,7 +1548,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Datafeed.fromJson(data));
+    return _response.then(
+      (data) => Datafeed.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the configurations for datafeeds in your Merchant Center account.
@@ -1555,7 +1612,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DatafeedsListResponse.fromJson(data));
+    return _response.then(
+      (data) => DatafeedsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a datafeed configuration of your Merchant Center account. Any
@@ -1619,7 +1679,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Datafeed.fromJson(data));
+    return _response.then(
+      (data) => Datafeed.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1674,8 +1736,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => DatafeedstatusesCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => DatafeedstatusesCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the status of a datafeed from your Merchant Center account.
@@ -1750,7 +1814,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DatafeedStatus.fromJson(data));
+    return _response.then(
+      (data) =>
+          DatafeedStatus.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the statuses of the datafeeds in your Merchant Center account.
@@ -1812,8 +1879,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => DatafeedstatusesListResponse.fromJson(data));
+    return _response.then(
+      (data) => DatafeedstatusesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1868,8 +1937,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LiasettingsCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => LiasettingsCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the LIA settings of the account.
@@ -1928,7 +1999,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiaSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiaSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of accessible Google My Business accounts.
@@ -1990,7 +2064,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => LiasettingsGetAccessibleGmbAccountsResponse.fromJson(data));
+      (data) => LiasettingsGetAccessibleGmbAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the LIA settings of the sub-accounts in your Merchant Center
@@ -2053,7 +2129,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiasettingsListResponse.fromJson(data));
+    return _response.then(
+      (data) => LiasettingsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of POS data providers that have active settings for the
@@ -2096,8 +2175,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LiasettingsListPosDataProvidersResponse.fromJson(data));
+    return _response.then(
+      (data) => LiasettingsListPosDataProvidersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Requests access to a specified Google My Business account.
@@ -2163,8 +2244,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LiasettingsRequestGmbAccessResponse.fromJson(data));
+    return _response.then(
+      (data) => LiasettingsRequestGmbAccessResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Requests inventory validation for the specified country.
@@ -2232,8 +2315,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        LiasettingsRequestInventoryVerificationResponse.fromJson(data));
+    return _response.then(
+      (data) => LiasettingsRequestInventoryVerificationResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the inventory verification contract for the specified country.
@@ -2322,8 +2407,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        LiasettingsSetInventoryVerificationContactResponse.fromJson(data));
+    return _response.then(
+      (data) => LiasettingsSetInventoryVerificationContactResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the POS data provider for the specified country.
@@ -2403,8 +2490,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LiasettingsSetPosDataProviderResponse.fromJson(data));
+    return _response.then(
+      (data) => LiasettingsSetPosDataProviderResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the LIA settings of the account. Any fields that are not provided
@@ -2470,7 +2559,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiaSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiaSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2525,8 +2617,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LocalinventoryCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => LocalinventoryCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the local inventory of a product in your Merchant Center account.
@@ -2591,7 +2685,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LocalInventory.fromJson(data));
+    return _response.then(
+      (data) =>
+          LocalInventory.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2663,7 +2760,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => OrderinvoicesCreateChargeInvoiceResponse.fromJson(data));
+      (data) => OrderinvoicesCreateChargeInvoiceResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a refund invoice for one or more shipment groups, and triggers a
@@ -2732,7 +2831,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => OrderinvoicesCreateRefundInvoiceResponse.fromJson(data));
+      (data) => OrderinvoicesCreateRefundInvoiceResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2816,8 +2917,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrderreportsListDisbursementsResponse.fromJson(data));
+    return _response.then(
+      (data) => OrderreportsListDisbursementsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of transactions for a disbursement from your Merchant
@@ -2905,8 +3008,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrderreportsListTransactionsResponse.fromJson(data));
+    return _response.then(
+      (data) => OrderreportsListTransactionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2976,8 +3081,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrderreturnsAcknowledgeResponse.fromJson(data));
+    return _response.then(
+      (data) => OrderreturnsAcknowledgeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create return in your Merchant Center account.
@@ -3033,8 +3140,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrderreturnsCreateOrderReturnResponse.fromJson(data));
+    return _response.then(
+      (data) => OrderreturnsCreateOrderReturnResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an order return from your Merchant Center account.
@@ -3091,7 +3200,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MerchantOrderReturn.fromJson(data));
+    return _response.then(
+      (data) => MerchantOrderReturn.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists order returns in your Merchant Center account.
@@ -3238,7 +3350,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrderreturnsListResponse.fromJson(data));
+    return _response.then(
+      (data) => OrderreturnsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Processes return in your Merchant Center account.
@@ -3302,7 +3417,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrderreturnsProcessResponse.fromJson(data));
+    return _response.then(
+      (data) => OrderreturnsProcessResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3372,7 +3490,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrdersAcknowledgeResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersAcknowledgeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sandbox only. Moves a test order from state "`inProgress`" to state
@@ -3431,8 +3552,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersAdvanceTestOrderResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersAdvanceTestOrderResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Cancels all line items in an order, making a full refund.
@@ -3496,7 +3619,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrdersCancelResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersCancelResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Cancels a line item, making a full refund.
@@ -3560,8 +3686,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersCancelLineItemResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersCancelLineItemResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sandbox only. Cancels a test order for customer-initiated cancellation.
@@ -3626,8 +3754,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersCancelTestOrderByCustomerResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersCancelTestOrderByCustomerResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sandbox only. Creates a test order.
@@ -3682,8 +3812,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersCreateTestOrderResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersCreateTestOrderResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sandbox only. Creates a test return.
@@ -3747,8 +3879,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersCreateTestReturnResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersCreateTestReturnResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an order from your Merchant Center account.
@@ -3805,7 +3939,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Order.fromJson(data));
+    return _response.then(
+      (data) => Order.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an order using merchant order ID.
@@ -3862,8 +3998,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersGetByMerchantOrderIdResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersGetByMerchantOrderIdResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sandbox only. Retrieves an order template that can be used to quickly
@@ -3934,8 +4072,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersGetTestOrderTemplateResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersGetTestOrderTemplateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated. Notifies that item return and refund was handled directly by
@@ -4007,8 +4147,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersInStoreRefundLineItemResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersInStoreRefundLineItemResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the orders in your Merchant Center account.
@@ -4116,7 +4258,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrdersListResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Issues a partial or total refund for items and shipment.
@@ -4180,7 +4325,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrdersRefundItemResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersRefundItemResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Issues a partial or total refund for an order.
@@ -4244,7 +4392,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrdersRefundOrderResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersRefundOrderResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rejects return on an line item.
@@ -4308,8 +4459,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersRejectReturnLineItemResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersRejectReturnLineItemResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns and refunds a line item. Note that this method can only be called
@@ -4379,8 +4532,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersReturnRefundLineItemResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersReturnRefundLineItemResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets (or overrides if it already exists) merchant provided annotations in
@@ -4448,8 +4603,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersSetLineItemMetadataResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersSetLineItemMetadataResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks line item(s) as shipped.
@@ -4513,7 +4670,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrdersShipLineItemsResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersShipLineItemsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates ship by and delivery by dates for a line item.
@@ -4579,7 +4739,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => OrdersUpdateLineItemShippingDetailsResponse.fromJson(data));
+      (data) => OrdersUpdateLineItemShippingDetailsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the merchant order ID for a given order.
@@ -4643,8 +4805,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersUpdateMerchantOrderIdResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersUpdateMerchantOrderIdResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a shipment's status, carrier, and/or tracking ID.
@@ -4708,8 +4872,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OrdersUpdateShipmentResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersUpdateShipmentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4763,7 +4929,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PosCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => PosCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a store for the given merchant.
@@ -4827,7 +4996,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves information about the given store.
@@ -4891,7 +5062,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PosStore.fromJson(data));
+    return _response.then(
+      (data) => PosStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a store for the given merchant.
@@ -4954,7 +5127,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PosStore.fromJson(data));
+    return _response.then(
+      (data) => PosStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submit inventory for the given merchant.
@@ -5017,7 +5192,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PosInventoryResponse.fromJson(data));
+    return _response.then(
+      (data) => PosInventoryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the stores of the target merchant.
@@ -5074,7 +5252,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PosListResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          PosListResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submit a sale event for the given merchant.
@@ -5137,7 +5318,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PosSaleResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          PosSaleResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5191,7 +5375,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductsCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => ProductsCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a product from your Merchant Center account.
@@ -5254,7 +5441,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a product from your Merchant Center account.
@@ -5311,7 +5500,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Uploads a product to your Merchant Center account. If an item with the
@@ -5374,7 +5565,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the products in your Merchant Center account. The response might
@@ -5438,7 +5631,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ProductsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5492,8 +5688,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ProductstatusesCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => ProductstatusesCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the status of a product from your Merchant Center account.
@@ -5557,7 +5755,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductStatus.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProductStatus.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the statuses of the products in your Merchant Center account.
@@ -5626,7 +5827,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductstatusesListResponse.fromJson(data));
+    return _response.then(
+      (data) => ProductstatusesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5683,7 +5887,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PubsubNotificationSettings.fromJson(data));
+    return _response.then(
+      (data) => PubsubNotificationSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Register a Merchant Center account for pubsub notifications. Note that
@@ -5739,7 +5946,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PubsubNotificationSettings.fromJson(data));
+    return _response.then(
+      (data) => PubsubNotificationSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5795,8 +6005,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => RegionalinventoryCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => RegionalinventoryCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the regional inventory of a product in your Merchant Center
@@ -5863,7 +6075,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RegionalInventory.fromJson(data));
+    return _response.then(
+      (data) => RegionalInventory.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5917,8 +6132,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ReturnaddressCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => ReturnaddressCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a return address for the given Merchant Center account.
@@ -5975,7 +6192,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a return address of the Merchant Center account.
@@ -6031,7 +6250,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReturnAddress.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReturnAddress.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a return address for the Merchant Center account.
@@ -6085,7 +6307,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReturnAddress.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReturnAddress.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the return addresses of the Merchant Center account.
@@ -6153,7 +6378,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReturnaddressListResponse.fromJson(data));
+    return _response.then(
+      (data) => ReturnaddressListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6207,8 +6435,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ReturnpolicyCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => ReturnpolicyCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a return policy for the given Merchant Center account.
@@ -6265,7 +6495,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a return policy of the Merchant Center account.
@@ -6321,7 +6553,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReturnPolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReturnPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a return policy for the Merchant Center account.
@@ -6375,7 +6610,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReturnPolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReturnPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the return policies of the Merchant Center account.
@@ -6423,7 +6661,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReturnpolicyListResponse.fromJson(data));
+    return _response.then(
+      (data) => ReturnpolicyListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6486,7 +6727,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SettlementReport.fromJson(data));
+    return _response.then(
+      (data) => SettlementReport.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of settlement reports from your Merchant Center account.
@@ -6562,8 +6806,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SettlementreportsListResponse.fromJson(data));
+    return _response.then(
+      (data) => SettlementreportsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6648,8 +6894,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SettlementtransactionsListResponse.fromJson(data));
+    return _response.then(
+      (data) => SettlementtransactionsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6705,8 +6953,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ShippingsettingsCustomBatchResponse.fromJson(data));
+    return _response.then(
+      (data) => ShippingsettingsCustomBatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the shipping settings of the account.
@@ -6765,7 +7015,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ShippingSettings.fromJson(data));
+    return _response.then(
+      (data) => ShippingSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves supported carriers and carrier services for an account.
@@ -6816,7 +7069,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ShippingsettingsGetSupportedCarriersResponse.fromJson(data));
+      (data) => ShippingsettingsGetSupportedCarriersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves supported holidays for an account.
@@ -6867,7 +7122,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ShippingsettingsGetSupportedHolidaysResponse.fromJson(data));
+      (data) => ShippingsettingsGetSupportedHolidaysResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves supported pickup services for an account.
@@ -6918,8 +7175,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        ShippingsettingsGetSupportedPickupServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ShippingsettingsGetSupportedPickupServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the shipping settings of the sub-accounts in your Merchant Center
@@ -6982,8 +7241,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ShippingsettingsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ShippingsettingsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the shipping settings of the account. Any fields that are not
@@ -7049,7 +7310,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ShippingSettings.fromJson(data));
+    return _response.then(
+      (data) => ShippingSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7112,22 +7376,23 @@
   Account.fromJson(core.Map _json) {
     if (_json.containsKey('adsLinks')) {
       adsLinks = (_json['adsLinks'] as core.List)
-          .map<AccountAdsLink>((value) => AccountAdsLink.fromJson(value))
+          .map<AccountAdsLink>((value) => AccountAdsLink.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('adultContent')) {
       adultContent = _json['adultContent'] as core.bool;
     }
     if (_json.containsKey('businessInformation')) {
-      businessInformation =
-          AccountBusinessInformation.fromJson(_json['businessInformation']);
+      businessInformation = AccountBusinessInformation.fromJson(
+          _json['businessInformation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cssId')) {
       cssId = _json['cssId'] as core.String;
     }
     if (_json.containsKey('googleMyBusinessLink')) {
-      googleMyBusinessLink =
-          AccountGoogleMyBusinessLink.fromJson(_json['googleMyBusinessLink']);
+      googleMyBusinessLink = AccountGoogleMyBusinessLink.fromJson(
+          _json['googleMyBusinessLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -7148,7 +7413,8 @@
     }
     if (_json.containsKey('users')) {
       users = (_json['users'] as core.List)
-          .map<AccountUser>((value) => AccountUser.fromJson(value))
+          .map<AccountUser>((value) => AccountUser.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('websiteUrl')) {
@@ -7156,8 +7422,9 @@
     }
     if (_json.containsKey('youtubeChannelLinks')) {
       youtubeChannelLinks = (_json['youtubeChannelLinks'] as core.List)
-          .map<AccountYouTubeChannelLink>(
-              (value) => AccountYouTubeChannelLink.fromJson(value))
+          .map<AccountYouTubeChannelLink>((value) =>
+              AccountYouTubeChannelLink.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7325,11 +7592,12 @@
 
   AccountBusinessInformation.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = AccountAddress.fromJson(_json['address']);
+      address = AccountAddress.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customerService')) {
-      customerService =
-          AccountCustomerService.fromJson(_json['customerService']);
+      customerService = AccountCustomerService.fromJson(
+          _json['customerService'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('phoneNumber')) {
       phoneNumber = _json['phoneNumber'] as core.String;
@@ -7497,8 +7765,9 @@
     }
     if (_json.containsKey('accountLevelIssues')) {
       accountLevelIssues = (_json['accountLevelIssues'] as core.List)
-          .map<AccountStatusAccountLevelIssue>(
-              (value) => AccountStatusAccountLevelIssue.fromJson(value))
+          .map<AccountStatusAccountLevelIssue>((value) =>
+              AccountStatusAccountLevelIssue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7506,8 +7775,8 @@
     }
     if (_json.containsKey('products')) {
       products = (_json['products'] as core.List)
-          .map<AccountStatusProducts>(
-              (value) => AccountStatusProducts.fromJson(value))
+          .map<AccountStatusProducts>((value) => AccountStatusProducts.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('websiteClaimed')) {
@@ -7736,12 +8005,14 @@
     }
     if (_json.containsKey('itemLevelIssues')) {
       itemLevelIssues = (_json['itemLevelIssues'] as core.List)
-          .map<AccountStatusItemLevelIssue>(
-              (value) => AccountStatusItemLevelIssue.fromJson(value))
+          .map<AccountStatusItemLevelIssue>((value) =>
+              AccountStatusItemLevelIssue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('statistics')) {
-      statistics = AccountStatusStatistics.fromJson(_json['statistics']);
+      statistics = AccountStatusStatistics.fromJson(
+          _json['statistics'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7840,7 +8111,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<AccountTaxTaxRule>((value) => AccountTaxTaxRule.fromJson(value))
+          .map<AccountTaxTaxRule>((value) => AccountTaxTaxRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8034,7 +8306,8 @@
   AccountsAuthInfoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accountIdentifiers')) {
       accountIdentifiers = (_json['accountIdentifiers'] as core.List)
-          .map<AccountIdentifier>((value) => AccountIdentifier.fromJson(value))
+          .map<AccountIdentifier>((value) => AccountIdentifier.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -8086,8 +8359,9 @@
   AccountsCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<AccountsCustomBatchRequestEntry>(
-              (value) => AccountsCustomBatchRequestEntry.fromJson(value))
+          .map<AccountsCustomBatchRequestEntry>((value) =>
+              AccountsCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8149,7 +8423,8 @@
 
   AccountsCustomBatchRequestEntry.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
-      account = Account.fromJson(_json['account']);
+      account = Account.fromJson(
+          _json['account'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('accountId')) {
       accountId = _json['accountId'] as core.String;
@@ -8167,7 +8442,7 @@
     }
     if (_json.containsKey('linkRequest')) {
       linkRequest = AccountsCustomBatchRequestEntryLinkRequest.fromJson(
-          _json['linkRequest']);
+          _json['linkRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('merchantId')) {
       merchantId = _json['merchantId'] as core.String;
@@ -8292,8 +8567,9 @@
   AccountsCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<AccountsCustomBatchResponseEntry>(
-              (value) => AccountsCustomBatchResponseEntry.fromJson(value))
+          .map<AccountsCustomBatchResponseEntry>((value) =>
+              AccountsCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -8333,13 +8609,15 @@
 
   AccountsCustomBatchResponseEntry.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
-      account = Account.fromJson(_json['account']);
+      account = Account.fromJson(
+          _json['account'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('batchId')) {
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -8465,7 +8743,8 @@
     }
     if (_json.containsKey('links')) {
       links = (_json['links'] as core.List)
-          .map<LinkedAccount>((value) => LinkedAccount.fromJson(value))
+          .map<LinkedAccount>((value) => LinkedAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8508,7 +8787,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8582,8 +8862,9 @@
   AccountstatusesCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<AccountstatusesCustomBatchRequestEntry>(
-              (value) => AccountstatusesCustomBatchRequestEntry.fromJson(value))
+          .map<AccountstatusesCustomBatchRequestEntry>((value) =>
+              AccountstatusesCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8675,7 +8956,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<AccountstatusesCustomBatchResponseEntry>((value) =>
-              AccountstatusesCustomBatchResponseEntry.fromJson(value))
+              AccountstatusesCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -8711,13 +8993,15 @@
 
   AccountstatusesCustomBatchResponseEntry.fromJson(core.Map _json) {
     if (_json.containsKey('accountStatus')) {
-      accountStatus = AccountStatus.fromJson(_json['accountStatus']);
+      accountStatus = AccountStatus.fromJson(
+          _json['accountStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('batchId')) {
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8756,7 +9040,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<AccountStatus>((value) => AccountStatus.fromJson(value))
+          .map<AccountStatus>((value) => AccountStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8785,8 +9070,9 @@
   AccounttaxCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<AccounttaxCustomBatchRequestEntry>(
-              (value) => AccounttaxCustomBatchRequestEntry.fromJson(value))
+          .map<AccounttaxCustomBatchRequestEntry>((value) =>
+              AccounttaxCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8829,7 +9115,8 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('accountTax')) {
-      accountTax = AccountTax.fromJson(_json['accountTax']);
+      accountTax = AccountTax.fromJson(
+          _json['accountTax'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('batchId')) {
       batchId = _json['batchId'] as core.int;
@@ -8876,8 +9163,9 @@
   AccounttaxCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<AccounttaxCustomBatchResponseEntry>(
-              (value) => AccounttaxCustomBatchResponseEntry.fromJson(value))
+          .map<AccounttaxCustomBatchResponseEntry>((value) =>
+              AccounttaxCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -8916,13 +9204,15 @@
 
   AccounttaxCustomBatchResponseEntry.fromJson(core.Map _json) {
     if (_json.containsKey('accountTax')) {
-      accountTax = AccountTax.fromJson(_json['accountTax']);
+      accountTax = AccountTax.fromJson(
+          _json['accountTax'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('batchId')) {
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -8967,7 +9257,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<AccountTax>((value) => AccountTax.fromJson(value))
+          .map<AccountTax>((value) =>
+              AccountTax.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8999,10 +9290,12 @@
 
   Amount.fromJson(core.Map _json) {
     if (_json.containsKey('priceAmount')) {
-      priceAmount = Price.fromJson(_json['priceAmount']);
+      priceAmount = Price.fromJson(
+          _json['priceAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('taxAmount')) {
-      taxAmount = Price.fromJson(_json['taxAmount']);
+      taxAmount = Price.fromJson(
+          _json['taxAmount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9077,7 +9370,8 @@
       carrierService = _json['carrierService'] as core.String;
     }
     if (_json.containsKey('flatAdjustment')) {
-      flatAdjustment = Price.fromJson(_json['flatAdjustment']);
+      flatAdjustment = Price.fromJson(
+          _json['flatAdjustment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -9173,7 +9467,8 @@
   CustomAttribute.fromJson(core.Map _json) {
     if (_json.containsKey('groupValues')) {
       groupValues = (_json['groupValues'] as core.List)
-          .map<CustomAttribute>((value) => CustomAttribute.fromJson(value))
+          .map<CustomAttribute>((value) => CustomAttribute.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -9336,13 +9631,15 @@
       contentType = _json['contentType'] as core.String;
     }
     if (_json.containsKey('fetchSchedule')) {
-      fetchSchedule = DatafeedFetchSchedule.fromJson(_json['fetchSchedule']);
+      fetchSchedule = DatafeedFetchSchedule.fromJson(
+          _json['fetchSchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileName')) {
       fileName = _json['fileName'] as core.String;
     }
     if (_json.containsKey('format')) {
-      format = DatafeedFormat.fromJson(_json['format']);
+      format = DatafeedFormat.fromJson(
+          _json['format'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -9355,7 +9652,8 @@
     }
     if (_json.containsKey('targets')) {
       targets = (_json['targets'] as core.List)
-          .map<DatafeedTarget>((value) => DatafeedTarget.fromJson(value))
+          .map<DatafeedTarget>((value) => DatafeedTarget.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9616,8 +9914,8 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<DatafeedStatusError>(
-              (value) => DatafeedStatusError.fromJson(value))
+          .map<DatafeedStatusError>((value) => DatafeedStatusError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('itemsTotal')) {
@@ -9640,8 +9938,8 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<DatafeedStatusError>(
-              (value) => DatafeedStatusError.fromJson(value))
+          .map<DatafeedStatusError>((value) => DatafeedStatusError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9707,8 +10005,8 @@
     }
     if (_json.containsKey('examples')) {
       examples = (_json['examples'] as core.List)
-          .map<DatafeedStatusExample>(
-              (value) => DatafeedStatusExample.fromJson(value))
+          .map<DatafeedStatusExample>((value) => DatafeedStatusExample.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -9846,8 +10144,9 @@
   DatafeedsCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<DatafeedsCustomBatchRequestEntry>(
-              (value) => DatafeedsCustomBatchRequestEntry.fromJson(value))
+          .map<DatafeedsCustomBatchRequestEntry>((value) =>
+              DatafeedsCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9892,7 +10191,8 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('datafeed')) {
-      datafeed = Datafeed.fromJson(_json['datafeed']);
+      datafeed = Datafeed.fromJson(
+          _json['datafeed'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('datafeedId')) {
       datafeedId = _json['datafeedId'] as core.String;
@@ -9939,8 +10239,9 @@
   DatafeedsCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<DatafeedsCustomBatchResponseEntry>(
-              (value) => DatafeedsCustomBatchResponseEntry.fromJson(value))
+          .map<DatafeedsCustomBatchResponseEntry>((value) =>
+              DatafeedsCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9979,10 +10280,12 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('datafeed')) {
-      datafeed = Datafeed.fromJson(_json['datafeed']);
+      datafeed = Datafeed.fromJson(
+          _json['datafeed'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10043,7 +10346,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<Datafeed>((value) => Datafeed.fromJson(value))
+          .map<Datafeed>((value) =>
+              Datafeed.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10073,7 +10377,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<DatafeedstatusesCustomBatchRequestEntry>((value) =>
-              DatafeedstatusesCustomBatchRequestEntry.fromJson(value))
+              DatafeedstatusesCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10175,7 +10480,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<DatafeedstatusesCustomBatchResponseEntry>((value) =>
-              DatafeedstatusesCustomBatchResponseEntry.fromJson(value))
+              DatafeedstatusesCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10214,10 +10520,12 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('datafeedStatus')) {
-      datafeedStatus = DatafeedStatus.fromJson(_json['datafeedStatus']);
+      datafeedStatus = DatafeedStatus.fromJson(
+          _json['datafeedStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10256,7 +10564,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<DatafeedStatus>((value) => DatafeedStatus.fromJson(value))
+          .map<DatafeedStatus>((value) => DatafeedStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10321,15 +10630,18 @@
 
   DeliveryTime.fromJson(core.Map _json) {
     if (_json.containsKey('cutoffTime')) {
-      cutoffTime = CutoffTime.fromJson(_json['cutoffTime']);
+      cutoffTime = CutoffTime.fromJson(
+          _json['cutoffTime'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('handlingBusinessDayConfig')) {
-      handlingBusinessDayConfig =
-          BusinessDayConfig.fromJson(_json['handlingBusinessDayConfig']);
+      handlingBusinessDayConfig = BusinessDayConfig.fromJson(
+          _json['handlingBusinessDayConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('holidayCutoffs')) {
       holidayCutoffs = (_json['holidayCutoffs'] as core.List)
-          .map<HolidayCutoff>((value) => HolidayCutoff.fromJson(value))
+          .map<HolidayCutoff>((value) => HolidayCutoff.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxHandlingTimeInDays')) {
@@ -10345,11 +10657,13 @@
       minTransitTimeInDays = _json['minTransitTimeInDays'] as core.int;
     }
     if (_json.containsKey('transitBusinessDayConfig')) {
-      transitBusinessDayConfig =
-          BusinessDayConfig.fromJson(_json['transitBusinessDayConfig']);
+      transitBusinessDayConfig = BusinessDayConfig.fromJson(
+          _json['transitBusinessDayConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transitTimeTable')) {
-      transitTimeTable = TransitTable.fromJson(_json['transitTimeTable']);
+      transitTimeTable = TransitTable.fromJson(
+          _json['transitTimeTable'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10446,7 +10760,8 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<Error>((value) => Error.fromJson(value))
+          .map<Error>((value) =>
+              Error.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -10484,8 +10799,8 @@
     }
     if (_json.containsKey('gmbAccounts')) {
       gmbAccounts = (_json['gmbAccounts'] as core.List)
-          .map<GmbAccountsGmbAccount>(
-              (value) => GmbAccountsGmbAccount.fromJson(value))
+          .map<GmbAccountsGmbAccount>((value) => GmbAccountsGmbAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10593,7 +10908,8 @@
   Headers.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<LocationIdSet>((value) => LocationIdSet.fromJson(value))
+          .map<LocationIdSet>((value) => LocationIdSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('numberOfItems')) {
@@ -10608,12 +10924,14 @@
     }
     if (_json.containsKey('prices')) {
       prices = (_json['prices'] as core.List)
-          .map<Price>((value) => Price.fromJson(value))
+          .map<Price>((value) =>
+              Price.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('weights')) {
       weights = (_json['weights'] as core.List)
-          .map<Weight>((value) => Weight.fromJson(value))
+          .map<Weight>((value) =>
+              Weight.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10795,7 +11113,8 @@
 
   Installment.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Price.fromJson(_json['amount']);
+      amount = Price.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('months')) {
       months = _json['months'] as core.String;
@@ -10825,14 +11144,16 @@
 
   InvoiceSummary.fromJson(core.Map _json) {
     if (_json.containsKey('additionalChargeSummaries')) {
-      additionalChargeSummaries = (_json['additionalChargeSummaries']
-              as core.List)
-          .map<InvoiceSummaryAdditionalChargeSummary>(
-              (value) => InvoiceSummaryAdditionalChargeSummary.fromJson(value))
-          .toList();
+      additionalChargeSummaries =
+          (_json['additionalChargeSummaries'] as core.List)
+              .map<InvoiceSummaryAdditionalChargeSummary>((value) =>
+                  InvoiceSummaryAdditionalChargeSummary.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
     if (_json.containsKey('productTotal')) {
-      productTotal = Amount.fromJson(_json['productTotal']);
+      productTotal = Amount.fromJson(
+          _json['productTotal'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10863,7 +11184,8 @@
 
   InvoiceSummaryAdditionalChargeSummary.fromJson(core.Map _json) {
     if (_json.containsKey('totalAmount')) {
-      totalAmount = Amount.fromJson(_json['totalAmount']);
+      totalAmount = Amount.fromJson(
+          _json['totalAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -10943,7 +11265,8 @@
 
   LiaCountrySettings.fromJson(core.Map _json) {
     if (_json.containsKey('about')) {
-      about = LiaAboutPageSettings.fromJson(_json['about']);
+      about = LiaAboutPageSettings.fromJson(
+          _json['about'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('country')) {
       country = _json['country'] as core.String;
@@ -10953,14 +11276,16 @@
           _json['hostedLocalStorefrontActive'] as core.bool;
     }
     if (_json.containsKey('inventory')) {
-      inventory = LiaInventorySettings.fromJson(_json['inventory']);
+      inventory = LiaInventorySettings.fromJson(
+          _json['inventory'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('onDisplayToOrder')) {
-      onDisplayToOrder =
-          LiaOnDisplayToOrderSettings.fromJson(_json['onDisplayToOrder']);
+      onDisplayToOrder = LiaOnDisplayToOrderSettings.fromJson(
+          _json['onDisplayToOrder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('posDataProvider')) {
-      posDataProvider = LiaPosDataProvider.fromJson(_json['posDataProvider']);
+      posDataProvider = LiaPosDataProvider.fromJson(
+          _json['posDataProvider'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('storePickupActive')) {
       storePickupActive = _json['storePickupActive'] as core.bool;
@@ -11145,8 +11470,8 @@
     }
     if (_json.containsKey('countrySettings')) {
       countrySettings = (_json['countrySettings'] as core.List)
-          .map<LiaCountrySettings>(
-              (value) => LiaCountrySettings.fromJson(value))
+          .map<LiaCountrySettings>((value) => LiaCountrySettings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11179,8 +11504,9 @@
   LiasettingsCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<LiasettingsCustomBatchRequestEntry>(
-              (value) => LiasettingsCustomBatchRequestEntry.fromJson(value))
+          .map<LiasettingsCustomBatchRequestEntry>((value) =>
+              LiasettingsCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11261,7 +11587,8 @@
       gmbEmail = _json['gmbEmail'] as core.String;
     }
     if (_json.containsKey('liaSettings')) {
-      liaSettings = LiaSettings.fromJson(_json['liaSettings']);
+      liaSettings = LiaSettings.fromJson(
+          _json['liaSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('merchantId')) {
       merchantId = _json['merchantId'] as core.String;
@@ -11329,8 +11656,9 @@
   LiasettingsCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<LiasettingsCustomBatchResponseEntry>(
-              (value) => LiasettingsCustomBatchResponseEntry.fromJson(value))
+          .map<LiasettingsCustomBatchResponseEntry>((value) =>
+              LiasettingsCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11377,20 +11705,24 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gmbAccounts')) {
-      gmbAccounts = GmbAccounts.fromJson(_json['gmbAccounts']);
+      gmbAccounts = GmbAccounts.fromJson(
+          _json['gmbAccounts'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('liaSettings')) {
-      liaSettings = LiaSettings.fromJson(_json['liaSettings']);
+      liaSettings = LiaSettings.fromJson(
+          _json['liaSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('posDataProviders')) {
       posDataProviders = (_json['posDataProviders'] as core.List)
-          .map<PosDataProviders>((value) => PosDataProviders.fromJson(value))
+          .map<PosDataProviders>((value) => PosDataProviders.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11439,8 +11771,8 @@
     }
     if (_json.containsKey('gmbAccounts')) {
       gmbAccounts = (_json['gmbAccounts'] as core.List)
-          .map<GmbAccountsGmbAccount>(
-              (value) => GmbAccountsGmbAccount.fromJson(value))
+          .map<GmbAccountsGmbAccount>((value) => GmbAccountsGmbAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11480,7 +11812,8 @@
     }
     if (_json.containsKey('posDataProviders')) {
       posDataProviders = (_json['posDataProviders'] as core.List)
-          .map<PosDataProviders>((value) => PosDataProviders.fromJson(value))
+          .map<PosDataProviders>((value) => PosDataProviders.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11518,7 +11851,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<LiaSettings>((value) => LiaSettings.fromJson(value))
+          .map<LiaSettings>((value) => LiaSettings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11681,7 +12015,8 @@
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<LinkService>((value) => LinkService.fromJson(value))
+          .map<LinkService>((value) => LinkService.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11755,13 +12090,15 @@
       pickupSla = _json['pickupSla'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantity')) {
       quantity = _json['quantity'] as core.int;
     }
     if (_json.containsKey('salePrice')) {
-      salePrice = Price.fromJson(_json['salePrice']);
+      salePrice = Price.fromJson(
+          _json['salePrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('salePriceEffectiveDate')) {
       salePriceEffectiveDate = _json['salePriceEffectiveDate'] as core.String;
@@ -11816,8 +12153,9 @@
   LocalinventoryCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<LocalinventoryCustomBatchRequestEntry>(
-              (value) => LocalinventoryCustomBatchRequestEntry.fromJson(value))
+          .map<LocalinventoryCustomBatchRequestEntry>((value) =>
+              LocalinventoryCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11858,7 +12196,8 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('localInventory')) {
-      localInventory = LocalInventory.fromJson(_json['localInventory']);
+      localInventory = LocalInventory.fromJson(
+          _json['localInventory'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('merchantId')) {
       merchantId = _json['merchantId'] as core.String;
@@ -11905,8 +12244,9 @@
   LocalinventoryCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<LocalinventoryCustomBatchResponseEntry>(
-              (value) => LocalinventoryCustomBatchResponseEntry.fromJson(value))
+          .map<LocalinventoryCustomBatchResponseEntry>((value) =>
+              LocalinventoryCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11945,7 +12285,8 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -12074,17 +12415,19 @@
     }
     if (_json.containsKey('returnItems')) {
       returnItems = (_json['returnItems'] as core.List)
-          .map<MerchantOrderReturnItem>(
-              (value) => MerchantOrderReturnItem.fromJson(value))
+          .map<MerchantOrderReturnItem>((value) =>
+              MerchantOrderReturnItem.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('returnPricingInfo')) {
-      returnPricingInfo =
-          ReturnPricingInfo.fromJson(_json['returnPricingInfo']);
+      returnPricingInfo = ReturnPricingInfo.fromJson(
+          _json['returnPricingInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnShipments')) {
       returnShipments = (_json['returnShipments'] as core.List)
-          .map<ReturnShipment>((value) => ReturnShipment.fromJson(value))
+          .map<ReturnShipment>((value) => ReturnShipment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12167,25 +12510,28 @@
 
   MerchantOrderReturnItem.fromJson(core.Map _json) {
     if (_json.containsKey('customerReturnReason')) {
-      customerReturnReason =
-          CustomerReturnReason.fromJson(_json['customerReturnReason']);
+      customerReturnReason = CustomerReturnReason.fromJson(
+          _json['customerReturnReason'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('itemId')) {
       itemId = _json['itemId'] as core.String;
     }
     if (_json.containsKey('merchantRejectionReason')) {
-      merchantRejectionReason =
-          MerchantRejectionReason.fromJson(_json['merchantRejectionReason']);
+      merchantRejectionReason = MerchantRejectionReason.fromJson(
+          _json['merchantRejectionReason']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('merchantReturnReason')) {
-      merchantReturnReason =
-          RefundReason.fromJson(_json['merchantReturnReason']);
+      merchantReturnReason = RefundReason.fromJson(
+          _json['merchantReturnReason'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('product')) {
-      product = OrderLineItemProduct.fromJson(_json['product']);
+      product = OrderLineItemProduct.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('refundableAmount')) {
-      refundableAmount = MonetaryAmount.fromJson(_json['refundableAmount']);
+      refundableAmount = MonetaryAmount.fromJson(
+          _json['refundableAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnItemId')) {
       returnItemId = _json['returnItemId'] as core.String;
@@ -12284,7 +12630,8 @@
     if (_json.containsKey('storeCodeSetWithMovs')) {
       storeCodeSetWithMovs = (_json['storeCodeSetWithMovs'] as core.List)
           .map<MinimumOrderValueTableStoreCodeSetWithMov>((value) =>
-              MinimumOrderValueTableStoreCodeSetWithMov.fromJson(value))
+              MinimumOrderValueTableStoreCodeSetWithMov.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12319,7 +12666,8 @@
           .toList();
     }
     if (_json.containsKey('value')) {
-      value = Price.fromJson(_json['value']);
+      value =
+          Price.fromJson(_json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12351,10 +12699,12 @@
 
   MonetaryAmount.fromJson(core.Map _json) {
     if (_json.containsKey('priceAmount')) {
-      priceAmount = Price.fromJson(_json['priceAmount']);
+      priceAmount = Price.fromJson(
+          _json['priceAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('taxAmount')) {
-      taxAmount = Price.fromJson(_json['taxAmount']);
+      taxAmount = Price.fromJson(
+          _json['taxAmount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12495,18 +12845,21 @@
     }
     if (_json.containsKey('annotations')) {
       annotations = (_json['annotations'] as core.List)
-          .map<OrderOrderAnnotation>(
-              (value) => OrderOrderAnnotation.fromJson(value))
+          .map<OrderOrderAnnotation>((value) => OrderOrderAnnotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('billingAddress')) {
-      billingAddress = OrderAddress.fromJson(_json['billingAddress']);
+      billingAddress = OrderAddress.fromJson(
+          _json['billingAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customer')) {
-      customer = OrderCustomer.fromJson(_json['customer']);
+      customer = OrderCustomer.fromJson(
+          _json['customer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deliveryDetails')) {
-      deliveryDetails = OrderDeliveryDetails.fromJson(_json['deliveryDetails']);
+      deliveryDetails = OrderDeliveryDetails.fromJson(
+          _json['deliveryDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -12516,7 +12869,8 @@
     }
     if (_json.containsKey('lineItems')) {
       lineItems = (_json['lineItems'] as core.List)
-          .map<OrderLineItem>((value) => OrderLineItem.fromJson(value))
+          .map<OrderLineItem>((value) => OrderLineItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('merchantId')) {
@@ -12526,40 +12880,48 @@
       merchantOrderId = _json['merchantOrderId'] as core.String;
     }
     if (_json.containsKey('netPriceAmount')) {
-      netPriceAmount = Price.fromJson(_json['netPriceAmount']);
+      netPriceAmount = Price.fromJson(
+          _json['netPriceAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('netTaxAmount')) {
-      netTaxAmount = Price.fromJson(_json['netTaxAmount']);
+      netTaxAmount = Price.fromJson(
+          _json['netTaxAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('paymentStatus')) {
       paymentStatus = _json['paymentStatus'] as core.String;
     }
     if (_json.containsKey('pickupDetails')) {
-      pickupDetails = OrderPickupDetails.fromJson(_json['pickupDetails']);
+      pickupDetails = OrderPickupDetails.fromJson(
+          _json['pickupDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('placedDate')) {
       placedDate = _json['placedDate'] as core.String;
     }
     if (_json.containsKey('promotions')) {
       promotions = (_json['promotions'] as core.List)
-          .map<OrderPromotion>((value) => OrderPromotion.fromJson(value))
+          .map<OrderPromotion>((value) => OrderPromotion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('refunds')) {
       refunds = (_json['refunds'] as core.List)
-          .map<OrderRefund>((value) => OrderRefund.fromJson(value))
+          .map<OrderRefund>((value) => OrderRefund.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shipments')) {
       shipments = (_json['shipments'] as core.List)
-          .map<OrderShipment>((value) => OrderShipment.fromJson(value))
+          .map<OrderShipment>((value) => OrderShipment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shippingCost')) {
-      shippingCost = Price.fromJson(_json['shippingCost']);
+      shippingCost = Price.fromJson(
+          _json['shippingCost'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shippingCostTax')) {
-      shippingCostTax = Price.fromJson(_json['shippingCostTax']);
+      shippingCostTax = Price.fromJson(
+          _json['shippingCostTax'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
@@ -12864,11 +13226,12 @@
       invoiceReceivingEmail = _json['invoiceReceivingEmail'] as core.String;
     }
     if (_json.containsKey('loyaltyInfo')) {
-      loyaltyInfo = OrderCustomerLoyaltyInfo.fromJson(_json['loyaltyInfo']);
+      loyaltyInfo = OrderCustomerLoyaltyInfo.fromJson(
+          _json['loyaltyInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marketingRightsInfo')) {
       marketingRightsInfo = OrderCustomerMarketingRightsInfo.fromJson(
-          _json['marketingRightsInfo']);
+          _json['marketingRightsInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12982,7 +13345,8 @@
 
   OrderDeliveryDetails.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = OrderAddress.fromJson(_json['address']);
+      address = OrderAddress.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('phoneNumber')) {
       phoneNumber = _json['phoneNumber'] as core.String;
@@ -13066,29 +13430,34 @@
   OrderLineItem.fromJson(core.Map _json) {
     if (_json.containsKey('adjustments')) {
       adjustments = (_json['adjustments'] as core.List)
-          .map<OrderLineItemAdjustment>(
-              (value) => OrderLineItemAdjustment.fromJson(value))
+          .map<OrderLineItemAdjustment>((value) =>
+              OrderLineItemAdjustment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('annotations')) {
       annotations = (_json['annotations'] as core.List)
-          .map<OrderMerchantProvidedAnnotation>(
-              (value) => OrderMerchantProvidedAnnotation.fromJson(value))
+          .map<OrderMerchantProvidedAnnotation>((value) =>
+              OrderMerchantProvidedAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cancellations')) {
       cancellations = (_json['cancellations'] as core.List)
-          .map<OrderCancellation>((value) => OrderCancellation.fromJson(value))
+          .map<OrderCancellation>((value) => OrderCancellation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('product')) {
-      product = OrderLineItemProduct.fromJson(_json['product']);
+      product = OrderLineItemProduct.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantityCanceled')) {
       quantityCanceled = _json['quantityCanceled'] as core.int;
@@ -13115,19 +13484,21 @@
       quantityUndeliverable = _json['quantityUndeliverable'] as core.int;
     }
     if (_json.containsKey('returnInfo')) {
-      returnInfo = OrderLineItemReturnInfo.fromJson(_json['returnInfo']);
+      returnInfo = OrderLineItemReturnInfo.fromJson(
+          _json['returnInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returns')) {
       returns = (_json['returns'] as core.List)
-          .map<OrderReturn>((value) => OrderReturn.fromJson(value))
+          .map<OrderReturn>((value) => OrderReturn.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shippingDetails')) {
-      shippingDetails =
-          OrderLineItemShippingDetails.fromJson(_json['shippingDetails']);
+      shippingDetails = OrderLineItemShippingDetails.fromJson(
+          _json['shippingDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tax')) {
-      tax = Price.fromJson(_json['tax']);
+      tax = Price.fromJson(_json['tax'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13211,10 +13582,12 @@
 
   OrderLineItemAdjustment.fromJson(core.Map _json) {
     if (_json.containsKey('priceAdjustment')) {
-      priceAdjustment = Price.fromJson(_json['priceAdjustment']);
+      priceAdjustment = Price.fromJson(
+          _json['priceAdjustment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('taxAdjustment')) {
-      taxAdjustment = Price.fromJson(_json['taxAdjustment']);
+      taxAdjustment = Price.fromJson(
+          _json['taxAdjustment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -13303,8 +13676,9 @@
     }
     if (_json.containsKey('fees')) {
       fees = (_json['fees'] as core.List)
-          .map<OrderLineItemProductFee>(
-              (value) => OrderLineItemProductFee.fromJson(value))
+          .map<OrderLineItemProductFee>((value) =>
+              OrderLineItemProductFee.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('gtin')) {
@@ -13326,7 +13700,8 @@
       offerId = _json['offerId'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shownImage')) {
       shownImage = _json['shownImage'] as core.String;
@@ -13339,8 +13714,9 @@
     }
     if (_json.containsKey('variantAttributes')) {
       variantAttributes = (_json['variantAttributes'] as core.List)
-          .map<OrderLineItemProductVariantAttribute>(
-              (value) => OrderLineItemProductVariantAttribute.fromJson(value))
+          .map<OrderLineItemProductVariantAttribute>((value) =>
+              OrderLineItemProductVariantAttribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13408,7 +13784,8 @@
 
   OrderLineItemProductFee.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Price.fromJson(_json['amount']);
+      amount = Price.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -13525,7 +13902,8 @@
       deliverByDate = _json['deliverByDate'] as core.String;
     }
     if (_json.containsKey('method')) {
-      method = OrderLineItemShippingDetailsMethod.fromJson(_json['method']);
+      method = OrderLineItemShippingDetailsMethod.fromJson(
+          _json['method'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pickupPromiseInMinutes')) {
       pickupPromiseInMinutes = _json['pickupPromiseInMinutes'] as core.int;
@@ -13696,12 +14074,14 @@
 
   OrderPickupDetails.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = OrderAddress.fromJson(_json['address']);
+      address = OrderAddress.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('collectors')) {
       collectors = (_json['collectors'] as core.List)
-          .map<OrderPickupDetailsCollector>(
-              (value) => OrderPickupDetailsCollector.fromJson(value))
+          .map<OrderPickupDetailsCollector>((value) =>
+              OrderPickupDetailsCollector.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('locationId')) {
@@ -13840,14 +14220,14 @@
   OrderPromotion.fromJson(core.Map _json) {
     if (_json.containsKey('applicableItems')) {
       applicableItems = (_json['applicableItems'] as core.List)
-          .map<OrderPromotionItem>(
-              (value) => OrderPromotionItem.fromJson(value))
+          .map<OrderPromotionItem>((value) => OrderPromotionItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('appliedItems')) {
       appliedItems = (_json['appliedItems'] as core.List)
-          .map<OrderPromotionItem>(
-              (value) => OrderPromotionItem.fromJson(value))
+          .map<OrderPromotionItem>((value) => OrderPromotionItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('endTime')) {
@@ -13860,7 +14240,8 @@
       merchantPromotionId = _json['merchantPromotionId'] as core.String;
     }
     if (_json.containsKey('priceValue')) {
-      priceValue = Price.fromJson(_json['priceValue']);
+      priceValue = Price.fromJson(
+          _json['priceValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shortTitle')) {
       shortTitle = _json['shortTitle'] as core.String;
@@ -13872,7 +14253,8 @@
       subtype = _json['subtype'] as core.String;
     }
     if (_json.containsKey('taxValue')) {
-      taxValue = Price.fromJson(_json['taxValue']);
+      taxValue = Price.fromJson(
+          _json['taxValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -14053,7 +14435,8 @@
       actor = _json['actor'] as core.String;
     }
     if (_json.containsKey('amount')) {
-      amount = Price.fromJson(_json['amount']);
+      amount = Price.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creationDate')) {
       creationDate = _json['creationDate'] as core.String;
@@ -14109,7 +14492,8 @@
 
   OrderReportDisbursement.fromJson(core.Map _json) {
     if (_json.containsKey('disbursementAmount')) {
-      disbursementAmount = Price.fromJson(_json['disbursementAmount']);
+      disbursementAmount = Price.fromJson(
+          _json['disbursementAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('disbursementCreationDate')) {
       disbursementCreationDate =
@@ -14179,7 +14563,8 @@
 
   OrderReportTransaction.fromJson(core.Map _json) {
     if (_json.containsKey('disbursementAmount')) {
-      disbursementAmount = Price.fromJson(_json['disbursementAmount']);
+      disbursementAmount = Price.fromJson(
+          _json['disbursementAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('disbursementCreationDate')) {
       disbursementCreationDate =
@@ -14201,7 +14586,8 @@
       orderId = _json['orderId'] as core.String;
     }
     if (_json.containsKey('productAmount')) {
-      productAmount = ProductAmount.fromJson(_json['productAmount']);
+      productAmount = ProductAmount.fromJson(
+          _json['productAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transactionDate')) {
       transactionDate = _json['transactionDate'] as core.String;
@@ -14427,13 +14813,15 @@
     }
     if (_json.containsKey('lineItems')) {
       lineItems = (_json['lineItems'] as core.List)
-          .map<OrderShipmentLineItemShipment>(
-              (value) => OrderShipmentLineItemShipment.fromJson(value))
+          .map<OrderShipmentLineItemShipment>((value) =>
+              OrderShipmentLineItemShipment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('scheduledDeliveryDetails')) {
       scheduledDeliveryDetails = OrderShipmentScheduledDeliveryDetails.fromJson(
-          _json['scheduledDeliveryDetails']);
+          _json['scheduledDeliveryDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shipmentGroupId')) {
       shipmentGroupId = _json['shipmentGroupId'] as core.String;
@@ -14578,12 +14966,14 @@
       invoiceId = _json['invoiceId'] as core.String;
     }
     if (_json.containsKey('invoiceSummary')) {
-      invoiceSummary = InvoiceSummary.fromJson(_json['invoiceSummary']);
+      invoiceSummary = InvoiceSummary.fromJson(
+          _json['invoiceSummary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineItemInvoices')) {
       lineItemInvoices = (_json['lineItemInvoices'] as core.List)
-          .map<ShipmentInvoiceLineItemInvoice>(
-              (value) => ShipmentInvoiceLineItemInvoice.fromJson(value))
+          .map<ShipmentInvoiceLineItemInvoice>((value) =>
+              ShipmentInvoiceLineItemInvoice.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operationId')) {
@@ -14685,16 +15075,19 @@
     if (_json.containsKey('refundOnlyOption')) {
       refundOnlyOption =
           OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption
-              .fromJson(_json['refundOnlyOption']);
+              .fromJson(_json['refundOnlyOption']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnOption')) {
       returnOption =
           OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption
-              .fromJson(_json['returnOption']);
+              .fromJson(
+                  _json['returnOption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shipmentInvoices')) {
       shipmentInvoices = (_json['shipmentInvoices'] as core.List)
-          .map<ShipmentInvoice>((value) => ShipmentInvoice.fromJson(value))
+          .map<ShipmentInvoice>((value) => ShipmentInvoice.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14895,8 +15288,9 @@
   OrderreportsListDisbursementsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('disbursements')) {
       disbursements = (_json['disbursements'] as core.List)
-          .map<OrderReportDisbursement>(
-              (value) => OrderReportDisbursement.fromJson(value))
+          .map<OrderReportDisbursement>((value) =>
+              OrderReportDisbursement.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -14945,8 +15339,9 @@
     }
     if (_json.containsKey('transactions')) {
       transactions = (_json['transactions'] as core.List)
-          .map<OrderReportTransaction>(
-              (value) => OrderReportTransaction.fromJson(value))
+          .map<OrderReportTransaction>((value) =>
+              OrderReportTransaction.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15042,8 +15437,8 @@
   OrderreturnsCreateOrderReturnRequest.fromJson(core.Map _json) {
     if (_json.containsKey('lineItems')) {
       lineItems = (_json['lineItems'] as core.List)
-          .map<OrderreturnsLineItem>(
-              (value) => OrderreturnsLineItem.fromJson(value))
+          .map<OrderreturnsLineItem>((value) => OrderreturnsLineItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operationId')) {
@@ -15100,7 +15495,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('orderReturn')) {
-      orderReturn = MerchantOrderReturn.fromJson(_json['orderReturn']);
+      orderReturn = MerchantOrderReturn.fromJson(
+          _json['orderReturn'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15170,8 +15566,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<MerchantOrderReturn>(
-              (value) => MerchantOrderReturn.fromJson(value))
+          .map<MerchantOrderReturn>((value) => MerchantOrderReturn.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15204,10 +15600,12 @@
 
   OrderreturnsPartialRefund.fromJson(core.Map _json) {
     if (_json.containsKey('priceAmount')) {
-      priceAmount = Price.fromJson(_json['priceAmount']);
+      priceAmount = Price.fromJson(
+          _json['priceAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('taxAmount')) {
-      taxAmount = Price.fromJson(_json['taxAmount']);
+      taxAmount = Price.fromJson(
+          _json['taxAmount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15248,13 +15646,14 @@
       operationId = _json['operationId'] as core.String;
     }
     if (_json.containsKey('refundShippingFee')) {
-      refundShippingFee =
-          OrderreturnsRefundOperation.fromJson(_json['refundShippingFee']);
+      refundShippingFee = OrderreturnsRefundOperation.fromJson(
+          _json['refundShippingFee'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnItems')) {
       returnItems = (_json['returnItems'] as core.List)
-          .map<OrderreturnsReturnItem>(
-              (value) => OrderreturnsReturnItem.fromJson(value))
+          .map<OrderreturnsReturnItem>((value) =>
+              OrderreturnsReturnItem.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15342,8 +15741,8 @@
       fullRefund = _json['fullRefund'] as core.bool;
     }
     if (_json.containsKey('partialRefund')) {
-      partialRefund =
-          OrderreturnsPartialRefund.fromJson(_json['partialRefund']);
+      partialRefund = OrderreturnsPartialRefund.fromJson(
+          _json['partialRefund'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('paymentType')) {
       paymentType = _json['paymentType'] as core.String;
@@ -15422,10 +15821,12 @@
 
   OrderreturnsReturnItem.fromJson(core.Map _json) {
     if (_json.containsKey('refund')) {
-      refund = OrderreturnsRefundOperation.fromJson(_json['refund']);
+      refund = OrderreturnsRefundOperation.fromJson(
+          _json['refund'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reject')) {
-      reject = OrderreturnsRejectOperation.fromJson(_json['reject']);
+      reject = OrderreturnsRejectOperation.fromJson(
+          _json['reject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnItemId')) {
       returnItemId = _json['returnItemId'] as core.String;
@@ -15809,7 +16210,8 @@
       templateName = _json['templateName'] as core.String;
     }
     if (_json.containsKey('testOrder')) {
-      testOrder = TestOrder.fromJson(_json['testOrder']);
+      testOrder = TestOrder.fromJson(
+          _json['testOrder'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15870,7 +16272,7 @@
       items = (_json['items'] as core.List)
           .map<OrdersCustomBatchRequestEntryCreateTestReturnReturnItem>(
               (value) => OrdersCustomBatchRequestEntryCreateTestReturnReturnItem
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15971,7 +16373,8 @@
 
   OrdersCustomBatchRequestEntryRefundItemItem.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = MonetaryAmount.fromJson(_json['amount']);
+      amount = MonetaryAmount.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fullRefund')) {
       fullRefund = _json['fullRefund'] as core.bool;
@@ -16021,7 +16424,8 @@
 
   OrdersCustomBatchRequestEntryRefundItemShipping.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Price.fromJson(_json['amount']);
+      amount = Price.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fullRefund')) {
       fullRefund = _json['fullRefund'] as core.bool;
@@ -16097,7 +16501,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('order')) {
-      order = Order.fromJson(_json['order']);
+      order =
+          Order.fromJson(_json['order'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16128,7 +16533,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('template')) {
-      template = TestOrder.fromJson(_json['template']);
+      template = TestOrder.fromJson(
+          _json['template'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16197,7 +16603,8 @@
       operationId = _json['operationId'] as core.String;
     }
     if (_json.containsKey('priceAmount')) {
-      priceAmount = Price.fromJson(_json['priceAmount']);
+      priceAmount = Price.fromJson(
+          _json['priceAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productId')) {
       productId = _json['productId'] as core.String;
@@ -16212,7 +16619,8 @@
       reasonText = _json['reasonText'] as core.String;
     }
     if (_json.containsKey('taxAmount')) {
-      taxAmount = Price.fromJson(_json['taxAmount']);
+      taxAmount = Price.fromJson(
+          _json['taxAmount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16301,7 +16709,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<Order>((value) => Order.fromJson(value))
+          .map<Order>((value) =>
+              Order.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16361,7 +16770,8 @@
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
           .map<OrdersCustomBatchRequestEntryRefundItemItem>((value) =>
-              OrdersCustomBatchRequestEntryRefundItemItem.fromJson(value))
+              OrdersCustomBatchRequestEntryRefundItemItem.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operationId')) {
@@ -16375,7 +16785,7 @@
     }
     if (_json.containsKey('shipping')) {
       shipping = OrdersCustomBatchRequestEntryRefundItemShipping.fromJson(
-          _json['shipping']);
+          _json['shipping'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16461,7 +16871,8 @@
 
   OrdersRefundOrderRequest.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = MonetaryAmount.fromJson(_json['amount']);
+      amount = MonetaryAmount.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fullRefund')) {
       fullRefund = _json['fullRefund'] as core.bool;
@@ -16697,7 +17108,8 @@
       operationId = _json['operationId'] as core.String;
     }
     if (_json.containsKey('priceAmount')) {
-      priceAmount = Price.fromJson(_json['priceAmount']);
+      priceAmount = Price.fromJson(
+          _json['priceAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productId')) {
       productId = _json['productId'] as core.String;
@@ -16712,7 +17124,8 @@
       reasonText = _json['reasonText'] as core.String;
     }
     if (_json.containsKey('taxAmount')) {
-      taxAmount = Price.fromJson(_json['taxAmount']);
+      taxAmount = Price.fromJson(
+          _json['taxAmount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16800,8 +17213,9 @@
   OrdersSetLineItemMetadataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
       annotations = (_json['annotations'] as core.List)
-          .map<OrderMerchantProvidedAnnotation>(
-              (value) => OrderMerchantProvidedAnnotation.fromJson(value))
+          .map<OrderMerchantProvidedAnnotation>((value) =>
+              OrderMerchantProvidedAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lineItemId')) {
@@ -16890,8 +17304,9 @@
   OrdersShipLineItemsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('lineItems')) {
       lineItems = (_json['lineItems'] as core.List)
-          .map<OrderShipmentLineItemShipment>(
-              (value) => OrderShipmentLineItemShipment.fromJson(value))
+          .map<OrderShipmentLineItemShipment>((value) =>
+              OrderShipmentLineItemShipment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operationId')) {
@@ -16904,7 +17319,7 @@
       shipmentInfos = (_json['shipmentInfos'] as core.List)
           .map<OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo>(
               (value) => OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17349,8 +17764,9 @@
   PosCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<PosCustomBatchRequestEntry>(
-              (value) => PosCustomBatchRequestEntry.fromJson(value))
+          .map<PosCustomBatchRequestEntry>((value) =>
+              PosCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17403,7 +17819,8 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('inventory')) {
-      inventory = PosInventory.fromJson(_json['inventory']);
+      inventory = PosInventory.fromJson(
+          _json['inventory'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('merchantId')) {
       merchantId = _json['merchantId'] as core.String;
@@ -17412,10 +17829,12 @@
       method = _json['method'] as core.String;
     }
     if (_json.containsKey('sale')) {
-      sale = PosSale.fromJson(_json['sale']);
+      sale = PosSale.fromJson(
+          _json['sale'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('store')) {
-      store = PosStore.fromJson(_json['store']);
+      store = PosStore.fromJson(
+          _json['store'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('storeCode')) {
       storeCode = _json['storeCode'] as core.String;
@@ -17468,8 +17887,9 @@
   PosCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<PosCustomBatchResponseEntry>(
-              (value) => PosCustomBatchResponseEntry.fromJson(value))
+          .map<PosCustomBatchResponseEntry>((value) =>
+              PosCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17516,19 +17936,23 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inventory')) {
-      inventory = PosInventory.fromJson(_json['inventory']);
+      inventory = PosInventory.fromJson(
+          _json['inventory'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('sale')) {
-      sale = PosSale.fromJson(_json['sale']);
+      sale = PosSale.fromJson(
+          _json['sale'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('store')) {
-      store = PosStore.fromJson(_json['store']);
+      store = PosStore.fromJson(
+          _json['store'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17571,8 +17995,9 @@
     }
     if (_json.containsKey('posDataProviders')) {
       posDataProviders = (_json['posDataProviders'] as core.List)
-          .map<PosDataProvidersPosDataProvider>(
-              (value) => PosDataProvidersPosDataProvider.fromJson(value))
+          .map<PosDataProvidersPosDataProvider>((value) =>
+              PosDataProvidersPosDataProvider.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17676,7 +18101,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantity')) {
       quantity = _json['quantity'] as core.String;
@@ -17764,7 +18190,8 @@
       itemId = _json['itemId'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantity')) {
       quantity = _json['quantity'] as core.String;
@@ -17856,7 +18283,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantity')) {
       quantity = _json['quantity'] as core.String;
@@ -17919,7 +18347,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<PosStore>((value) => PosStore.fromJson(value))
+          .map<PosStore>((value) =>
+              PosStore.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17987,7 +18416,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantity')) {
       quantity = _json['quantity'] as core.String;
@@ -18085,7 +18515,8 @@
       itemId = _json['itemId'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantity')) {
       quantity = _json['quantity'] as core.String;
@@ -18187,7 +18618,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantity')) {
       quantity = _json['quantity'] as core.String;
@@ -18305,7 +18737,8 @@
     }
     if (_json.containsKey('postalCodeRanges')) {
       postalCodeRanges = (_json['postalCodeRanges'] as core.List)
-          .map<PostalCodeRange>((value) => PostalCodeRange.fromJson(value))
+          .map<PostalCodeRange>((value) => PostalCodeRange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18740,11 +19173,13 @@
       contentLanguage = _json['contentLanguage'] as core.String;
     }
     if (_json.containsKey('costOfGoodsSold')) {
-      costOfGoodsSold = Price.fromJson(_json['costOfGoodsSold']);
+      costOfGoodsSold = Price.fromJson(
+          _json['costOfGoodsSold'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributes')) {
       customAttributes = (_json['customAttributes'] as core.List)
-          .map<CustomAttribute>((value) => CustomAttribute.fromJson(value))
+          .map<CustomAttribute>((value) => CustomAttribute.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('customLabel0')) {
@@ -18817,7 +19252,8 @@
           .toList();
     }
     if (_json.containsKey('installment')) {
-      installment = Installment.fromJson(_json['installment']);
+      installment = Installment.fromJson(
+          _json['installment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isBundle')) {
       isBundle = _json['isBundle'] as core.bool;
@@ -18832,7 +19268,8 @@
       link = _json['link'] as core.String;
     }
     if (_json.containsKey('loyaltyPoints')) {
-      loyaltyPoints = LoyaltyPoints.fromJson(_json['loyaltyPoints']);
+      loyaltyPoints = LoyaltyPoints.fromJson(
+          _json['loyaltyPoints'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('material')) {
       material = _json['material'] as core.String;
@@ -18867,12 +19304,13 @@
       pattern = _json['pattern'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productDetails')) {
       productDetails = (_json['productDetails'] as core.List)
-          .map<ProductProductDetail>(
-              (value) => ProductProductDetail.fromJson(value))
+          .map<ProductProductDetail>((value) => ProductProductDetail.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productHighlights')) {
@@ -18891,7 +19329,8 @@
           .toList();
     }
     if (_json.containsKey('salePrice')) {
-      salePrice = Price.fromJson(_json['salePrice']);
+      salePrice = Price.fromJson(
+          _json['salePrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('salePriceEffectiveDate')) {
       salePriceEffectiveDate = _json['salePriceEffectiveDate'] as core.String;
@@ -18901,25 +19340,28 @@
     }
     if (_json.containsKey('shipping')) {
       shipping = (_json['shipping'] as core.List)
-          .map<ProductShipping>((value) => ProductShipping.fromJson(value))
+          .map<ProductShipping>((value) => ProductShipping.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shippingHeight')) {
-      shippingHeight =
-          ProductShippingDimension.fromJson(_json['shippingHeight']);
+      shippingHeight = ProductShippingDimension.fromJson(
+          _json['shippingHeight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shippingLabel')) {
       shippingLabel = _json['shippingLabel'] as core.String;
     }
     if (_json.containsKey('shippingLength')) {
-      shippingLength =
-          ProductShippingDimension.fromJson(_json['shippingLength']);
+      shippingLength = ProductShippingDimension.fromJson(
+          _json['shippingLength'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shippingWeight')) {
-      shippingWeight = ProductShippingWeight.fromJson(_json['shippingWeight']);
+      shippingWeight = ProductShippingWeight.fromJson(
+          _json['shippingWeight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shippingWidth')) {
-      shippingWidth = ProductShippingDimension.fromJson(_json['shippingWidth']);
+      shippingWidth = ProductShippingDimension.fromJson(
+          _json['shippingWidth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shoppingAdsExcludedCountries')) {
       shoppingAdsExcludedCountries =
@@ -18942,8 +19384,8 @@
       source = _json['source'] as core.String;
     }
     if (_json.containsKey('subscriptionCost')) {
-      subscriptionCost =
-          ProductSubscriptionCost.fromJson(_json['subscriptionCost']);
+      subscriptionCost = ProductSubscriptionCost.fromJson(
+          _json['subscriptionCost'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetCountry')) {
       targetCountry = _json['targetCountry'] as core.String;
@@ -18953,7 +19395,8 @@
     }
     if (_json.containsKey('taxes')) {
       taxes = (_json['taxes'] as core.List)
-          .map<ProductTax>((value) => ProductTax.fromJson(value))
+          .map<ProductTax>((value) =>
+              ProductTax.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -18964,11 +19407,12 @@
     }
     if (_json.containsKey('unitPricingBaseMeasure')) {
       unitPricingBaseMeasure = ProductUnitPricingBaseMeasure.fromJson(
-          _json['unitPricingBaseMeasure']);
+          _json['unitPricingBaseMeasure']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unitPricingMeasure')) {
-      unitPricingMeasure =
-          ProductUnitPricingMeasure.fromJson(_json['unitPricingMeasure']);
+      unitPricingMeasure = ProductUnitPricingMeasure.fromJson(
+          _json['unitPricingMeasure'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -19234,13 +19678,16 @@
 
   ProductAmount.fromJson(core.Map _json) {
     if (_json.containsKey('priceAmount')) {
-      priceAmount = Price.fromJson(_json['priceAmount']);
+      priceAmount = Price.fromJson(
+          _json['priceAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('remittedTaxAmount')) {
-      remittedTaxAmount = Price.fromJson(_json['remittedTaxAmount']);
+      remittedTaxAmount = Price.fromJson(
+          _json['remittedTaxAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('taxAmount')) {
-      taxAmount = Price.fromJson(_json['taxAmount']);
+      taxAmount = Price.fromJson(
+          _json['taxAmount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -19340,7 +19787,8 @@
       postalCode = _json['postalCode'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('region')) {
       region = _json['region'] as core.String;
@@ -19477,8 +19925,9 @@
     }
     if (_json.containsKey('destinationStatuses')) {
       destinationStatuses = (_json['destinationStatuses'] as core.List)
-          .map<ProductStatusDestinationStatus>(
-              (value) => ProductStatusDestinationStatus.fromJson(value))
+          .map<ProductStatusDestinationStatus>((value) =>
+              ProductStatusDestinationStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('googleExpirationDate')) {
@@ -19486,8 +19935,9 @@
     }
     if (_json.containsKey('itemLevelIssues')) {
       itemLevelIssues = (_json['itemLevelIssues'] as core.List)
-          .map<ProductStatusItemLevelIssue>(
-              (value) => ProductStatusItemLevelIssue.fromJson(value))
+          .map<ProductStatusItemLevelIssue>((value) =>
+              ProductStatusItemLevelIssue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -19716,7 +20166,8 @@
 
   ProductSubscriptionCost.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Price.fromJson(_json['amount']);
+      amount = Price.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('period')) {
       period = _json['period'] as core.String;
@@ -19881,8 +20332,9 @@
   ProductsCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ProductsCustomBatchRequestEntry>(
-              (value) => ProductsCustomBatchRequestEntry.fromJson(value))
+          .map<ProductsCustomBatchRequestEntry>((value) =>
+              ProductsCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -19938,7 +20390,8 @@
       method = _json['method'] as core.String;
     }
     if (_json.containsKey('product')) {
-      product = Product.fromJson(_json['product']);
+      product = Product.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productId')) {
       productId = _json['productId'] as core.String;
@@ -19982,8 +20435,9 @@
   ProductsCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ProductsCustomBatchResponseEntry>(
-              (value) => ProductsCustomBatchResponseEntry.fromJson(value))
+          .map<ProductsCustomBatchResponseEntry>((value) =>
+              ProductsCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -20026,13 +20480,15 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('product')) {
-      product = Product.fromJson(_json['product']);
+      product = Product.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -20074,7 +20530,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<Product>((value) => Product.fromJson(value))
+          .map<Product>((value) =>
+              Product.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20103,8 +20560,9 @@
   ProductstatusesCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ProductstatusesCustomBatchRequestEntry>(
-              (value) => ProductstatusesCustomBatchRequestEntry.fromJson(value))
+          .map<ProductstatusesCustomBatchRequestEntry>((value) =>
+              ProductstatusesCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20203,7 +20661,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<ProductstatusesCustomBatchResponseEntry>((value) =>
-              ProductstatusesCustomBatchResponseEntry.fromJson(value))
+              ProductstatusesCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -20245,13 +20704,15 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('productStatus')) {
-      productStatus = ProductStatus.fromJson(_json['productStatus']);
+      productStatus = ProductStatus.fromJson(
+          _json['productStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -20293,7 +20754,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ProductStatus>((value) => ProductStatus.fromJson(value))
+          .map<ProductStatus>((value) => ProductStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20399,21 +20861,25 @@
     }
     if (_json.containsKey('carrierRates')) {
       carrierRates = (_json['carrierRates'] as core.List)
-          .map<CarrierRate>((value) => CarrierRate.fromJson(value))
+          .map<CarrierRate>((value) => CarrierRate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mainTable')) {
-      mainTable = Table.fromJson(_json['mainTable']);
+      mainTable = Table.fromJson(
+          _json['mainTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('singleValue')) {
-      singleValue = Value.fromJson(_json['singleValue']);
+      singleValue = Value.fromJson(
+          _json['singleValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subtables')) {
       subtables = (_json['subtables'] as core.List)
-          .map<Table>((value) => Table.fromJson(value))
+          .map<Table>((value) =>
+              Table.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20555,20 +21021,23 @@
     }
     if (_json.containsKey('customAttributes')) {
       customAttributes = (_json['customAttributes'] as core.List)
-          .map<CustomAttribute>((value) => CustomAttribute.fromJson(value))
+          .map<CustomAttribute>((value) => CustomAttribute.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('regionId')) {
       regionId = _json['regionId'] as core.String;
     }
     if (_json.containsKey('salePrice')) {
-      salePrice = Price.fromJson(_json['salePrice']);
+      salePrice = Price.fromJson(
+          _json['salePrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('salePriceEffectiveDate')) {
       salePriceEffectiveDate = _json['salePriceEffectiveDate'] as core.String;
@@ -20613,7 +21082,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<RegionalinventoryCustomBatchRequestEntry>((value) =>
-              RegionalinventoryCustomBatchRequestEntry.fromJson(value))
+              RegionalinventoryCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20663,8 +21133,8 @@
       productId = _json['productId'] as core.String;
     }
     if (_json.containsKey('regionalInventory')) {
-      regionalInventory =
-          RegionalInventory.fromJson(_json['regionalInventory']);
+      regionalInventory = RegionalInventory.fromJson(
+          _json['regionalInventory'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -20703,7 +21173,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<RegionalinventoryCustomBatchResponseEntry>((value) =>
-              RegionalinventoryCustomBatchResponseEntry.fromJson(value))
+              RegionalinventoryCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -20745,14 +21216,15 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('regionalInventory')) {
-      regionalInventory =
-          RegionalInventory.fromJson(_json['regionalInventory']);
+      regionalInventory = RegionalInventory.fromJson(
+          _json['regionalInventory'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -20800,7 +21272,8 @@
 
   ReturnAddress.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = ReturnAddressAddress.fromJson(_json['address']);
+      address = ReturnAddressAddress.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('country')) {
       country = _json['country'] as core.String;
@@ -20963,15 +21436,17 @@
           .toList();
     }
     if (_json.containsKey('policy')) {
-      policy = ReturnPolicyPolicy.fromJson(_json['policy']);
+      policy = ReturnPolicyPolicy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnPolicyId')) {
       returnPolicyId = _json['returnPolicyId'] as core.String;
     }
     if (_json.containsKey('seasonalOverrides')) {
       seasonalOverrides = (_json['seasonalOverrides'] as core.List)
-          .map<ReturnPolicySeasonalOverride>(
-              (value) => ReturnPolicySeasonalOverride.fromJson(value))
+          .map<ReturnPolicySeasonalOverride>((value) =>
+              ReturnPolicySeasonalOverride.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21088,7 +21563,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('policy')) {
-      policy = ReturnPolicyPolicy.fromJson(_json['policy']);
+      policy = ReturnPolicyPolicy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startDate')) {
       startDate = _json['startDate'] as core.String;
@@ -21144,20 +21620,22 @@
       chargeReturnShippingFee = _json['chargeReturnShippingFee'] as core.bool;
     }
     if (_json.containsKey('maxReturnShippingFee')) {
-      maxReturnShippingFee =
-          MonetaryAmount.fromJson(_json['maxReturnShippingFee']);
+      maxReturnShippingFee = MonetaryAmount.fromJson(
+          _json['maxReturnShippingFee'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('refundableItemsTotalAmount')) {
-      refundableItemsTotalAmount =
-          MonetaryAmount.fromJson(_json['refundableItemsTotalAmount']);
+      refundableItemsTotalAmount = MonetaryAmount.fromJson(
+          _json['refundableItemsTotalAmount']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('refundableShippingAmount')) {
-      refundableShippingAmount =
-          MonetaryAmount.fromJson(_json['refundableShippingAmount']);
+      refundableShippingAmount = MonetaryAmount.fromJson(
+          _json['refundableShippingAmount']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('totalRefundedAmount')) {
-      totalRefundedAmount =
-          MonetaryAmount.fromJson(_json['totalRefundedAmount']);
+      totalRefundedAmount = MonetaryAmount.fromJson(
+          _json['totalRefundedAmount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -21234,8 +21712,8 @@
     }
     if (_json.containsKey('shipmentTrackingInfos')) {
       shipmentTrackingInfos = (_json['shipmentTrackingInfos'] as core.List)
-          .map<ShipmentTrackingInfo>(
-              (value) => ShipmentTrackingInfo.fromJson(value))
+          .map<ShipmentTrackingInfo>((value) => ShipmentTrackingInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shippingDate')) {
@@ -21283,8 +21761,9 @@
   ReturnaddressCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ReturnaddressCustomBatchRequestEntry>(
-              (value) => ReturnaddressCustomBatchRequestEntry.fromJson(value))
+          .map<ReturnaddressCustomBatchRequestEntry>((value) =>
+              ReturnaddressCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21332,7 +21811,8 @@
       method = _json['method'] as core.String;
     }
     if (_json.containsKey('returnAddress')) {
-      returnAddress = ReturnAddress.fromJson(_json['returnAddress']);
+      returnAddress = ReturnAddress.fromJson(
+          _json['returnAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnAddressId')) {
       returnAddressId = _json['returnAddressId'] as core.String;
@@ -21373,8 +21853,9 @@
   ReturnaddressCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ReturnaddressCustomBatchResponseEntry>(
-              (value) => ReturnaddressCustomBatchResponseEntry.fromJson(value))
+          .map<ReturnaddressCustomBatchResponseEntry>((value) =>
+              ReturnaddressCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -21415,13 +21896,15 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('returnAddress')) {
-      returnAddress = ReturnAddress.fromJson(_json['returnAddress']);
+      returnAddress = ReturnAddress.fromJson(
+          _json['returnAddress'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -21463,7 +21946,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ReturnAddress>((value) => ReturnAddress.fromJson(value))
+          .map<ReturnAddress>((value) => ReturnAddress.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21492,8 +21976,9 @@
   ReturnpolicyCustomBatchRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ReturnpolicyCustomBatchRequestEntry>(
-              (value) => ReturnpolicyCustomBatchRequestEntry.fromJson(value))
+          .map<ReturnpolicyCustomBatchRequestEntry>((value) =>
+              ReturnpolicyCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21541,7 +22026,8 @@
       method = _json['method'] as core.String;
     }
     if (_json.containsKey('returnPolicy')) {
-      returnPolicy = ReturnPolicy.fromJson(_json['returnPolicy']);
+      returnPolicy = ReturnPolicy.fromJson(
+          _json['returnPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('returnPolicyId')) {
       returnPolicyId = _json['returnPolicyId'] as core.String;
@@ -21582,8 +22068,9 @@
   ReturnpolicyCustomBatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<ReturnpolicyCustomBatchResponseEntry>(
-              (value) => ReturnpolicyCustomBatchResponseEntry.fromJson(value))
+          .map<ReturnpolicyCustomBatchResponseEntry>((value) =>
+              ReturnpolicyCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -21624,13 +22111,15 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('returnPolicy')) {
-      returnPolicy = ReturnPolicy.fromJson(_json['returnPolicy']);
+      returnPolicy = ReturnPolicy.fromJson(
+          _json['returnPolicy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -21666,7 +22155,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ReturnPolicy>((value) => ReturnPolicy.fromJson(value))
+          .map<ReturnPolicy>((value) => ReturnPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21694,7 +22184,8 @@
   Row.fromJson(core.Map _json) {
     if (_json.containsKey('cells')) {
       cells = (_json['cells'] as core.List)
-          .map<Value>((value) => Value.fromJson(value))
+          .map<Value>((value) =>
+              Value.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21777,27 +22268,32 @@
       deliveryCountry = _json['deliveryCountry'] as core.String;
     }
     if (_json.containsKey('deliveryTime')) {
-      deliveryTime = DeliveryTime.fromJson(_json['deliveryTime']);
+      deliveryTime = DeliveryTime.fromJson(
+          _json['deliveryTime'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('eligibility')) {
       eligibility = _json['eligibility'] as core.String;
     }
     if (_json.containsKey('minimumOrderValue')) {
-      minimumOrderValue = Price.fromJson(_json['minimumOrderValue']);
+      minimumOrderValue = Price.fromJson(
+          _json['minimumOrderValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minimumOrderValueTable')) {
-      minimumOrderValueTable =
-          MinimumOrderValueTable.fromJson(_json['minimumOrderValueTable']);
+      minimumOrderValueTable = MinimumOrderValueTable.fromJson(
+          _json['minimumOrderValueTable']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pickupService')) {
-      pickupService = PickupCarrierService.fromJson(_json['pickupService']);
+      pickupService = PickupCarrierService.fromJson(
+          _json['pickupService'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rateGroups')) {
       rateGroups = (_json['rateGroups'] as core.List)
-          .map<RateGroup>((value) => RateGroup.fromJson(value))
+          .map<RateGroup>((value) =>
+              RateGroup.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shipmentType')) {
@@ -21888,7 +22384,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('previousBalance')) {
-      previousBalance = Price.fromJson(_json['previousBalance']);
+      previousBalance = Price.fromJson(
+          _json['previousBalance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('settlementId')) {
       settlementId = _json['settlementId'] as core.String;
@@ -21897,7 +22394,8 @@
       startDate = _json['startDate'] as core.String;
     }
     if (_json.containsKey('transferAmount')) {
-      transferAmount = Price.fromJson(_json['transferAmount']);
+      transferAmount = Price.fromJson(
+          _json['transferAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transferDate')) {
       transferDate = _json['transferDate'] as core.String;
@@ -21959,18 +22457,19 @@
 
   SettlementTransaction.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = SettlementTransactionAmount.fromJson(_json['amount']);
+      amount = SettlementTransactionAmount.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('identifiers')) {
-      identifiers =
-          SettlementTransactionIdentifiers.fromJson(_json['identifiers']);
+      identifiers = SettlementTransactionIdentifiers.fromJson(
+          _json['identifiers'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('transaction')) {
-      transaction =
-          SettlementTransactionTransaction.fromJson(_json['transaction']);
+      transaction = SettlementTransactionTransaction.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -22060,14 +22559,15 @@
 
   SettlementTransactionAmount.fromJson(core.Map _json) {
     if (_json.containsKey('commission')) {
-      commission =
-          SettlementTransactionAmountCommission.fromJson(_json['commission']);
+      commission = SettlementTransactionAmountCommission.fromJson(
+          _json['commission'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('transactionAmount')) {
-      transactionAmount = Price.fromJson(_json['transactionAmount']);
+      transactionAmount = Price.fromJson(
+          _json['transactionAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -22296,7 +22796,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<SettlementReport>((value) => SettlementReport.fromJson(value))
+          .map<SettlementReport>((value) => SettlementReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -22336,8 +22837,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<SettlementTransaction>(
-              (value) => SettlementTransaction.fromJson(value))
+          .map<SettlementTransaction>((value) => SettlementTransaction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -22373,12 +22874,14 @@
 
   ShipmentInvoice.fromJson(core.Map _json) {
     if (_json.containsKey('invoiceSummary')) {
-      invoiceSummary = InvoiceSummary.fromJson(_json['invoiceSummary']);
+      invoiceSummary = InvoiceSummary.fromJson(
+          _json['invoiceSummary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineItemInvoices')) {
       lineItemInvoices = (_json['lineItemInvoices'] as core.List)
-          .map<ShipmentInvoiceLineItemInvoice>(
-              (value) => ShipmentInvoiceLineItemInvoice.fromJson(value))
+          .map<ShipmentInvoiceLineItemInvoice>((value) =>
+              ShipmentInvoiceLineItemInvoice.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shipmentGroupId')) {
@@ -22434,7 +22937,8 @@
           .toList();
     }
     if (_json.containsKey('unitInvoice')) {
-      unitInvoice = UnitInvoice.fromJson(_json['unitInvoice']);
+      unitInvoice = UnitInvoice.fromJson(
+          _json['unitInvoice'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -22540,12 +23044,14 @@
     }
     if (_json.containsKey('postalCodeGroups')) {
       postalCodeGroups = (_json['postalCodeGroups'] as core.List)
-          .map<PostalCodeGroup>((value) => PostalCodeGroup.fromJson(value))
+          .map<PostalCodeGroup>((value) => PostalCodeGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<Service>((value) => Service.fromJson(value))
+          .map<Service>((value) =>
+              Service.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -22576,7 +23082,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<ShippingsettingsCustomBatchRequestEntry>((value) =>
-              ShippingsettingsCustomBatchRequestEntry.fromJson(value))
+              ShippingsettingsCustomBatchRequestEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -22628,7 +23135,8 @@
       method = _json['method'] as core.String;
     }
     if (_json.containsKey('shippingSettings')) {
-      shippingSettings = ShippingSettings.fromJson(_json['shippingSettings']);
+      shippingSettings = ShippingSettings.fromJson(
+          _json['shippingSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -22667,7 +23175,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<ShippingsettingsCustomBatchResponseEntry>((value) =>
-              ShippingsettingsCustomBatchResponseEntry.fromJson(value))
+              ShippingsettingsCustomBatchResponseEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -22709,13 +23218,15 @@
       batchId = _json['batchId'] as core.int;
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('shippingSettings')) {
-      shippingSettings = ShippingSettings.fromJson(_json['shippingSettings']);
+      shippingSettings = ShippingSettings.fromJson(
+          _json['shippingSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -22750,7 +23261,8 @@
   ShippingsettingsGetSupportedCarriersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('carriers')) {
       carriers = (_json['carriers'] as core.List)
-          .map<CarriersCarrier>((value) => CarriersCarrier.fromJson(value))
+          .map<CarriersCarrier>((value) => CarriersCarrier.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -22783,7 +23295,8 @@
   ShippingsettingsGetSupportedHolidaysResponse.fromJson(core.Map _json) {
     if (_json.containsKey('holidays')) {
       holidays = (_json['holidays'] as core.List)
-          .map<HolidaysHoliday>((value) => HolidaysHoliday.fromJson(value))
+          .map<HolidaysHoliday>((value) => HolidaysHoliday.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -22819,8 +23332,9 @@
     }
     if (_json.containsKey('pickupServices')) {
       pickupServices = (_json['pickupServices'] as core.List)
-          .map<PickupServicesPickupService>(
-              (value) => PickupServicesPickupService.fromJson(value))
+          .map<PickupServicesPickupService>((value) =>
+              PickupServicesPickupService.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -22858,7 +23372,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ShippingSettings>((value) => ShippingSettings.fromJson(value))
+          .map<ShippingSettings>((value) => ShippingSettings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -22897,17 +23412,20 @@
 
   Table.fromJson(core.Map _json) {
     if (_json.containsKey('columnHeaders')) {
-      columnHeaders = Headers.fromJson(_json['columnHeaders']);
+      columnHeaders = Headers.fromJson(
+          _json['columnHeaders'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('rowHeaders')) {
-      rowHeaders = Headers.fromJson(_json['rowHeaders']);
+      rowHeaders = Headers.fromJson(
+          _json['rowHeaders'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<Row>((value) => Row.fromJson(value))
+          .map<Row>((value) =>
+              Row.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -23009,8 +23527,8 @@
 
   TestOrder.fromJson(core.Map _json) {
     if (_json.containsKey('deliveryDetails')) {
-      deliveryDetails =
-          TestOrderDeliveryDetails.fromJson(_json['deliveryDetails']);
+      deliveryDetails = TestOrderDeliveryDetails.fromJson(
+          _json['deliveryDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enableOrderinvoices')) {
       enableOrderinvoices = _json['enableOrderinvoices'] as core.bool;
@@ -23020,14 +23538,16 @@
     }
     if (_json.containsKey('lineItems')) {
       lineItems = (_json['lineItems'] as core.List)
-          .map<TestOrderLineItem>((value) => TestOrderLineItem.fromJson(value))
+          .map<TestOrderLineItem>((value) => TestOrderLineItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('notificationMode')) {
       notificationMode = _json['notificationMode'] as core.String;
     }
     if (_json.containsKey('pickupDetails')) {
-      pickupDetails = TestOrderPickupDetails.fromJson(_json['pickupDetails']);
+      pickupDetails = TestOrderPickupDetails.fromJson(
+          _json['pickupDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('predefinedBillingAddress')) {
       predefinedBillingAddress =
@@ -23045,11 +23565,13 @@
     }
     if (_json.containsKey('promotions')) {
       promotions = (_json['promotions'] as core.List)
-          .map<OrderPromotion>((value) => OrderPromotion.fromJson(value))
+          .map<OrderPromotion>((value) => OrderPromotion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shippingCost')) {
-      shippingCost = Price.fromJson(_json['shippingCost']);
+      shippingCost = Price.fromJson(
+          _json['shippingCost'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shippingOption')) {
       shippingOption = _json['shippingOption'] as core.String;
@@ -23207,7 +23729,8 @@
 
   TestOrderDeliveryDetails.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = TestOrderAddress.fromJson(_json['address']);
+      address = TestOrderAddress.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('phoneNumber')) {
       phoneNumber = _json['phoneNumber'] as core.String;
@@ -23243,17 +23766,19 @@
 
   TestOrderLineItem.fromJson(core.Map _json) {
     if (_json.containsKey('product')) {
-      product = TestOrderLineItemProduct.fromJson(_json['product']);
+      product = TestOrderLineItemProduct.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantityOrdered')) {
       quantityOrdered = _json['quantityOrdered'] as core.int;
     }
     if (_json.containsKey('returnInfo')) {
-      returnInfo = OrderLineItemReturnInfo.fromJson(_json['returnInfo']);
+      returnInfo = OrderLineItemReturnInfo.fromJson(
+          _json['returnInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shippingDetails')) {
-      shippingDetails =
-          OrderLineItemShippingDetails.fromJson(_json['shippingDetails']);
+      shippingDetails = OrderLineItemShippingDetails.fromJson(
+          _json['shippingDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -23338,8 +23863,9 @@
     }
     if (_json.containsKey('fees')) {
       fees = (_json['fees'] as core.List)
-          .map<OrderLineItemProductFee>(
-              (value) => OrderLineItemProductFee.fromJson(value))
+          .map<OrderLineItemProductFee>((value) =>
+              OrderLineItemProductFee.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('gtin')) {
@@ -23358,7 +23884,8 @@
       offerId = _json['offerId'] as core.String;
     }
     if (_json.containsKey('price')) {
-      price = Price.fromJson(_json['price']);
+      price =
+          Price.fromJson(_json['price'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetCountry')) {
       targetCountry = _json['targetCountry'] as core.String;
@@ -23368,8 +23895,9 @@
     }
     if (_json.containsKey('variantAttributes')) {
       variantAttributes = (_json['variantAttributes'] as core.List)
-          .map<OrderLineItemProductVariantAttribute>(
-              (value) => OrderLineItemProductVariantAttribute.fromJson(value))
+          .map<OrderLineItemProductVariantAttribute>((value) =>
+              OrderLineItemProductVariantAttribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -23445,16 +23973,18 @@
       locationCode = _json['locationCode'] as core.String;
     }
     if (_json.containsKey('pickupLocationAddress')) {
-      pickupLocationAddress =
-          TestOrderAddress.fromJson(_json['pickupLocationAddress']);
+      pickupLocationAddress = TestOrderAddress.fromJson(
+          _json['pickupLocationAddress']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pickupLocationType')) {
       pickupLocationType = _json['pickupLocationType'] as core.String;
     }
     if (_json.containsKey('pickupPersons')) {
       pickupPersons = (_json['pickupPersons'] as core.List)
-          .map<TestOrderPickupDetailsPickupPerson>(
-              (value) => TestOrderPickupDetailsPickupPerson.fromJson(value))
+          .map<TestOrderPickupDetailsPickupPerson>((value) =>
+              TestOrderPickupDetailsPickupPerson.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -23530,8 +24060,9 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<TransitTableTransitTimeRow>(
-              (value) => TransitTableTransitTimeRow.fromJson(value))
+          .map<TransitTableTransitTimeRow>((value) =>
+              TransitTableTransitTimeRow.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('transitTimeLabels')) {
@@ -23565,7 +24096,8 @@
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
           .map<TransitTableTransitTimeRowTransitTimeValue>((value) =>
-              TransitTableTransitTimeRowTransitTimeValue.fromJson(value))
+              TransitTableTransitTimeRowTransitTimeValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -23626,17 +24158,19 @@
   UnitInvoice.fromJson(core.Map _json) {
     if (_json.containsKey('additionalCharges')) {
       additionalCharges = (_json['additionalCharges'] as core.List)
-          .map<UnitInvoiceAdditionalCharge>(
-              (value) => UnitInvoiceAdditionalCharge.fromJson(value))
+          .map<UnitInvoiceAdditionalCharge>((value) =>
+              UnitInvoiceAdditionalCharge.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('unitPrice')) {
-      unitPrice = Price.fromJson(_json['unitPrice']);
+      unitPrice = Price.fromJson(
+          _json['unitPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unitPriceTaxes')) {
       unitPriceTaxes = (_json['unitPriceTaxes'] as core.List)
-          .map<UnitInvoiceTaxLine>(
-              (value) => UnitInvoiceTaxLine.fromJson(value))
+          .map<UnitInvoiceTaxLine>((value) => UnitInvoiceTaxLine.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -23672,7 +24206,8 @@
 
   UnitInvoiceAdditionalCharge.fromJson(core.Map _json) {
     if (_json.containsKey('additionalChargeAmount')) {
-      additionalChargeAmount = Amount.fromJson(_json['additionalChargeAmount']);
+      additionalChargeAmount = Amount.fromJson(_json['additionalChargeAmount']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -23711,7 +24246,8 @@
 
   UnitInvoiceTaxLine.fromJson(core.Map _json) {
     if (_json.containsKey('taxAmount')) {
-      taxAmount = Price.fromJson(_json['taxAmount']);
+      taxAmount = Price.fromJson(
+          _json['taxAmount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('taxName')) {
       taxName = _json['taxName'] as core.String;
@@ -23766,7 +24302,8 @@
       carrierRateName = _json['carrierRateName'] as core.String;
     }
     if (_json.containsKey('flatRate')) {
-      flatRate = Price.fromJson(_json['flatRate']);
+      flatRate = Price.fromJson(
+          _json['flatRate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('noShipping')) {
       noShipping = _json['noShipping'] as core.bool;
diff --git a/generated/googleapis/lib/customsearch/v1.dart b/generated/googleapis/lib/customsearch/v1.dart
index 4d2a50f..c939524 100644
--- a/generated/googleapis/lib/customsearch/v1.dart
+++ b/generated/googleapis/lib/customsearch/v1.dart
@@ -420,7 +420,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Search.fromJson(data));
+    return _response.then(
+      (data) => Search.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -800,7 +802,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Search.fromJson(data));
+    return _response.then(
+      (data) => Search.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -921,8 +925,8 @@
   Promotion.fromJson(core.Map _json) {
     if (_json.containsKey('bodyLines')) {
       bodyLines = (_json['bodyLines'] as core.List)
-          .map<PromotionBodyLines>(
-              (value) => PromotionBodyLines.fromJson(value))
+          .map<PromotionBodyLines>((value) => PromotionBodyLines.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('displayLink')) {
@@ -932,7 +936,8 @@
       htmlTitle = _json['htmlTitle'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = PromotionImage.fromJson(_json['image']);
+      image = PromotionImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
       link = _json['link'] as core.String;
@@ -1164,14 +1169,16 @@
       htmlTitle = _json['htmlTitle'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = ResultImage.fromJson(_json['image']);
+      image = ResultImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<ResultLabels>((value) => ResultLabels.fromJson(value))
+          .map<ResultLabels>((value) => ResultLabels.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('link')) {
@@ -1182,7 +1189,8 @@
     }
     if (_json.containsKey('pagemap')) {
       pagemap = commons.mapMap<core.Object, core.Object>(
-          _json['pagemap'].cast<core.String, core.Object>(),
+          (_json['pagemap'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('snippet')) {
@@ -2499,20 +2507,21 @@
   SearchQueries.fromJson(core.Map _json) {
     if (_json.containsKey('nextPage')) {
       nextPage = (_json['nextPage'] as core.List)
-          .map<SearchQueriesNextPage>(
-              (value) => SearchQueriesNextPage.fromJson(value))
+          .map<SearchQueriesNextPage>((value) => SearchQueriesNextPage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('previousPage')) {
       previousPage = (_json['previousPage'] as core.List)
-          .map<SearchQueriesPreviousPage>(
-              (value) => SearchQueriesPreviousPage.fromJson(value))
+          .map<SearchQueriesPreviousPage>((value) =>
+              SearchQueriesPreviousPage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('request')) {
       request = (_json['request'] as core.List)
-          .map<SearchQueriesRequest>(
-              (value) => SearchQueriesRequest.fromJson(value))
+          .map<SearchQueriesRequest>((value) => SearchQueriesRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2690,12 +2699,14 @@
   Search.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
       context = commons.mapMap<core.Object, core.Object>(
-          _json['context'].cast<core.String, core.Object>(),
+          (_json['context'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Result>((value) => Result.fromJson(value))
+          .map<Result>((value) =>
+              Result.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2703,21 +2714,25 @@
     }
     if (_json.containsKey('promotions')) {
       promotions = (_json['promotions'] as core.List)
-          .map<Promotion>((value) => Promotion.fromJson(value))
+          .map<Promotion>((value) =>
+              Promotion.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('queries')) {
-      queries = SearchQueries.fromJson(_json['queries']);
+      queries = SearchQueries.fromJson(
+          _json['queries'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchInformation')) {
-      searchInformation =
-          SearchSearchInformation.fromJson(_json['searchInformation']);
+      searchInformation = SearchSearchInformation.fromJson(
+          _json['searchInformation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spelling')) {
-      spelling = SearchSpelling.fromJson(_json['spelling']);
+      spelling = SearchSpelling.fromJson(
+          _json['spelling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
-      url = SearchUrl.fromJson(_json['url']);
+      url = SearchUrl.fromJson(
+          _json['url'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/dataproc/v1.dart b/generated/googleapis/lib/dataproc/v1.dart
index 1a043ce..0975e9d 100644
--- a/generated/googleapis/lib/dataproc/v1.dart
+++ b/generated/googleapis/lib/dataproc/v1.dart
@@ -136,7 +136,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalingPolicy.fromJson(data));
+    return _response.then(
+      (data) => AutoscalingPolicy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an autoscaling policy. It is an error to delete an autoscaling
@@ -194,7 +197,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves autoscaling policy.
@@ -251,7 +256,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalingPolicy.fromJson(data));
+    return _response.then(
+      (data) => AutoscalingPolicy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -312,7 +320,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists autoscaling policies in the project.
@@ -383,8 +393,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAutoscalingPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAutoscalingPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -446,7 +458,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -510,7 +524,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates (replaces) autoscaling policy.Disabled check for update_mask,
@@ -574,7 +591,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalingPolicy.fromJson(data));
+    return _response.then(
+      (data) => AutoscalingPolicy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -644,7 +664,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WorkflowTemplate.fromJson(data));
+    return _response.then(
+      (data) => WorkflowTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a workflow template. It does not cancel in-progress workflows.
@@ -709,7 +732,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the latest workflow template.Can retrieve previously
@@ -775,7 +800,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WorkflowTemplate.fromJson(data));
+    return _response.then(
+      (data) => WorkflowTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -836,7 +864,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Instantiates a template and begins execution.The returned Operation can be
@@ -909,7 +939,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Instantiates a template and begins execution.This method is equivalent to
@@ -996,7 +1028,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists workflows that match the specified filter in the request.
@@ -1067,8 +1101,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListWorkflowTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListWorkflowTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1130,7 +1166,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1194,7 +1232,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates (replaces) workflow template. The updated template must contain
@@ -1258,7 +1299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WorkflowTemplate.fromJson(data));
+    return _response.then(
+      (data) => WorkflowTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1345,7 +1389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalingPolicy.fromJson(data));
+    return _response.then(
+      (data) => AutoscalingPolicy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an autoscaling policy. It is an error to delete an autoscaling
@@ -1403,7 +1450,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves autoscaling policy.
@@ -1460,7 +1509,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalingPolicy.fromJson(data));
+    return _response.then(
+      (data) => AutoscalingPolicy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -1521,7 +1573,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists autoscaling policies in the project.
@@ -1592,8 +1646,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAutoscalingPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAutoscalingPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1655,7 +1711,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1719,7 +1777,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates (replaces) autoscaling policy.Disabled check for update_mask,
@@ -1783,7 +1844,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoscalingPolicy.fromJson(data));
+    return _response.then(
+      (data) => AutoscalingPolicy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1870,7 +1934,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a cluster in a project. The returned Operation.metadata will be
@@ -1958,7 +2024,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets cluster diagnostic information. The returned Operation.metadata will
@@ -2036,7 +2104,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the resource representation for a cluster in a project.
@@ -2102,7 +2172,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Cluster.fromJson(data));
+    return _response.then(
+      (data) => Cluster.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -2162,7 +2234,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all regions/{region}/clusters in a project alphabetically.
@@ -2249,7 +2323,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListClustersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListClustersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a cluster in a project. The returned Operation.metadata will be
@@ -2372,7 +2449,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -2433,7 +2512,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -2496,7 +2577,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2580,7 +2664,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the job from the project. If the job is active, the delete fails,
@@ -2647,7 +2733,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the resource representation for a job in a project.
@@ -2713,7 +2801,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -2773,7 +2863,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists regions/{region}/jobs in a project.
@@ -2879,7 +2971,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a job in a project.
@@ -2961,7 +3056,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -3022,7 +3119,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submits a job to a cluster.
@@ -3087,7 +3186,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submits job to a cluster.
@@ -3152,7 +3253,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -3215,7 +3318,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3279,7 +3385,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -3331,7 +3439,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -3382,7 +3492,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -3442,7 +3554,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -3517,7 +3631,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -3578,7 +3695,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -3641,7 +3760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3711,7 +3833,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WorkflowTemplate.fromJson(data));
+    return _response.then(
+      (data) => WorkflowTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a workflow template. It does not cancel in-progress workflows.
@@ -3776,7 +3901,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the latest workflow template.Can retrieve previously
@@ -3842,7 +3969,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WorkflowTemplate.fromJson(data));
+    return _response.then(
+      (data) => WorkflowTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -3903,7 +4033,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Instantiates a template and begins execution.The returned Operation can be
@@ -3976,7 +4108,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Instantiates a template and begins execution.This method is equivalent to
@@ -4063,7 +4197,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists workflows that match the specified filter in the request.
@@ -4134,8 +4270,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListWorkflowTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListWorkflowTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -4197,7 +4335,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -4261,7 +4401,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates (replaces) workflow template. The updated template must contain
@@ -4325,7 +4468,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WorkflowTemplate.fromJson(data));
+    return _response.then(
+      (data) => WorkflowTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4426,8 +4572,8 @@
 
   AutoscalingPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('basicAlgorithm')) {
-      basicAlgorithm =
-          BasicAutoscalingAlgorithm.fromJson(_json['basicAlgorithm']);
+      basicAlgorithm = BasicAutoscalingAlgorithm.fromJson(
+          _json['basicAlgorithm'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -4437,11 +4583,12 @@
     }
     if (_json.containsKey('secondaryWorkerConfig')) {
       secondaryWorkerConfig = InstanceGroupAutoscalingPolicyConfig.fromJson(
-          _json['secondaryWorkerConfig']);
+          _json['secondaryWorkerConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workerConfig')) {
-      workerConfig =
-          InstanceGroupAutoscalingPolicyConfig.fromJson(_json['workerConfig']);
+      workerConfig = InstanceGroupAutoscalingPolicyConfig.fromJson(
+          _json['workerConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4483,7 +4630,8 @@
       cooldownPeriod = _json['cooldownPeriod'] as core.String;
     }
     if (_json.containsKey('yarnConfig')) {
-      yarnConfig = BasicYarnAutoscalingConfig.fromJson(_json['yarnConfig']);
+      yarnConfig = BasicYarnAutoscalingConfig.fromJson(
+          _json['yarnConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4643,7 +4791,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -4735,25 +4884,30 @@
       clusterUuid = _json['clusterUuid'] as core.String;
     }
     if (_json.containsKey('config')) {
-      config = ClusterConfig.fromJson(_json['config']);
+      config = ClusterConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('metrics')) {
-      metrics = ClusterMetrics.fromJson(_json['metrics']);
+      metrics = ClusterMetrics.fromJson(
+          _json['metrics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = ClusterStatus.fromJson(_json['status']);
+      status = ClusterStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('statusHistory')) {
       statusHistory = (_json['statusHistory'] as core.List)
-          .map<ClusterStatus>((value) => ClusterStatus.fromJson(value))
+          .map<ClusterStatus>((value) => ClusterStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4858,48 +5012,58 @@
 
   ClusterConfig.fromJson(core.Map _json) {
     if (_json.containsKey('autoscalingConfig')) {
-      autoscalingConfig =
-          AutoscalingConfig.fromJson(_json['autoscalingConfig']);
+      autoscalingConfig = AutoscalingConfig.fromJson(
+          _json['autoscalingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('configBucket')) {
       configBucket = _json['configBucket'] as core.String;
     }
     if (_json.containsKey('encryptionConfig')) {
-      encryptionConfig = EncryptionConfig.fromJson(_json['encryptionConfig']);
+      encryptionConfig = EncryptionConfig.fromJson(
+          _json['encryptionConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endpointConfig')) {
-      endpointConfig = EndpointConfig.fromJson(_json['endpointConfig']);
+      endpointConfig = EndpointConfig.fromJson(
+          _json['endpointConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gceClusterConfig')) {
-      gceClusterConfig = GceClusterConfig.fromJson(_json['gceClusterConfig']);
+      gceClusterConfig = GceClusterConfig.fromJson(
+          _json['gceClusterConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('initializationActions')) {
       initializationActions = (_json['initializationActions'] as core.List)
-          .map<NodeInitializationAction>(
-              (value) => NodeInitializationAction.fromJson(value))
+          .map<NodeInitializationAction>((value) =>
+              NodeInitializationAction.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lifecycleConfig')) {
-      lifecycleConfig = LifecycleConfig.fromJson(_json['lifecycleConfig']);
+      lifecycleConfig = LifecycleConfig.fromJson(
+          _json['lifecycleConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('masterConfig')) {
-      masterConfig = InstanceGroupConfig.fromJson(_json['masterConfig']);
+      masterConfig = InstanceGroupConfig.fromJson(
+          _json['masterConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secondaryWorkerConfig')) {
-      secondaryWorkerConfig =
-          InstanceGroupConfig.fromJson(_json['secondaryWorkerConfig']);
+      secondaryWorkerConfig = InstanceGroupConfig.fromJson(
+          _json['secondaryWorkerConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('securityConfig')) {
-      securityConfig = SecurityConfig.fromJson(_json['securityConfig']);
+      securityConfig = SecurityConfig.fromJson(
+          _json['securityConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareConfig')) {
-      softwareConfig = SoftwareConfig.fromJson(_json['softwareConfig']);
+      softwareConfig = SoftwareConfig.fromJson(
+          _json['softwareConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tempBucket')) {
       tempBucket = _json['tempBucket'] as core.String;
     }
     if (_json.containsKey('workerConfig')) {
-      workerConfig = InstanceGroupConfig.fromJson(_json['workerConfig']);
+      workerConfig = InstanceGroupConfig.fromJson(
+          _json['workerConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4964,12 +5128,14 @@
   ClusterMetrics.fromJson(core.Map _json) {
     if (_json.containsKey('hdfsMetrics')) {
       hdfsMetrics = commons.mapMap<core.String, core.String>(
-          _json['hdfsMetrics'].cast<core.String, core.String>(),
+          (_json['hdfsMetrics'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('yarnMetrics')) {
       yarnMetrics = commons.mapMap<core.String, core.String>(
-          _json['yarnMetrics'].cast<core.String, core.String>(),
+          (_json['yarnMetrics'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -5066,19 +5232,22 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('operationType')) {
       operationType = _json['operationType'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = ClusterOperationStatus.fromJson(_json['status']);
+      status = ClusterOperationStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('statusHistory')) {
       statusHistory = (_json['statusHistory'] as core.List)
-          .map<ClusterOperationStatus>(
-              (value) => ClusterOperationStatus.fromJson(value))
+          .map<ClusterOperationStatus>((value) =>
+              ClusterOperationStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warnings')) {
@@ -5188,7 +5357,8 @@
   ClusterSelector.fromJson(core.Map _json) {
     if (_json.containsKey('clusterLabels')) {
       clusterLabels = commons.mapMap<core.String, core.String>(
-          _json['clusterLabels'].cast<core.String, core.String>(),
+          (_json['clusterLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('zone')) {
@@ -5419,7 +5589,8 @@
     }
     if (_json.containsKey('httpPorts')) {
       httpPorts = commons.mapMap<core.String, core.String>(
-          _json['httpPorts'].cast<core.String, core.String>(),
+          (_json['httpPorts'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -5601,22 +5772,23 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.String, core.String>(
-          _json['metadata'].cast<core.String, core.String>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('networkUri')) {
       networkUri = _json['networkUri'] as core.String;
     }
     if (_json.containsKey('nodeGroupAffinity')) {
-      nodeGroupAffinity =
-          NodeGroupAffinity.fromJson(_json['nodeGroupAffinity']);
+      nodeGroupAffinity = NodeGroupAffinity.fromJson(
+          _json['nodeGroupAffinity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('privateIpv6GoogleAccess')) {
       privateIpv6GoogleAccess = _json['privateIpv6GoogleAccess'] as core.String;
     }
     if (_json.containsKey('reservationAffinity')) {
-      reservationAffinity =
-          ReservationAffinity.fromJson(_json['reservationAffinity']);
+      reservationAffinity = ReservationAffinity.fromJson(
+          _json['reservationAffinity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceAccount')) {
       serviceAccount = _json['serviceAccount'] as core.String;
@@ -5688,7 +5860,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5796,7 +5969,8 @@
           .toList();
     }
     if (_json.containsKey('loggingConfig')) {
-      loggingConfig = LoggingConfig.fromJson(_json['loggingConfig']);
+      loggingConfig = LoggingConfig.fromJson(
+          _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mainClass')) {
       mainClass = _json['mainClass'] as core.String;
@@ -5806,7 +5980,8 @@
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -5882,18 +6057,21 @@
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
     }
     if (_json.containsKey('queryList')) {
-      queryList = QueryList.fromJson(_json['queryList']);
+      queryList = QueryList.fromJson(
+          _json['queryList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scriptVariables')) {
       scriptVariables = commons.mapMap<core.String, core.String>(
-          _json['scriptVariables'].cast<core.String, core.String>(),
+          (_json['scriptVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -6057,11 +6235,13 @@
   InstanceGroupConfig.fromJson(core.Map _json) {
     if (_json.containsKey('accelerators')) {
       accelerators = (_json['accelerators'] as core.List)
-          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(value))
+          .map<AcceleratorConfig>((value) => AcceleratorConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('diskConfig')) {
-      diskConfig = DiskConfig.fromJson(_json['diskConfig']);
+      diskConfig = DiskConfig.fromJson(
+          _json['diskConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageUri')) {
       imageUri = _json['imageUri'] as core.String;
@@ -6073,7 +6253,8 @@
     }
     if (_json.containsKey('instanceReferences')) {
       instanceReferences = (_json['instanceReferences'] as core.List)
-          .map<InstanceReference>((value) => InstanceReference.fromJson(value))
+          .map<InstanceReference>((value) => InstanceReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('isPreemptible')) {
@@ -6083,8 +6264,8 @@
       machineTypeUri = _json['machineTypeUri'] as core.String;
     }
     if (_json.containsKey('managedGroupConfig')) {
-      managedGroupConfig =
-          ManagedGroupConfig.fromJson(_json['managedGroupConfig']);
+      managedGroupConfig = ManagedGroupConfig.fromJson(
+          _json['managedGroupConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minCpuPlatform')) {
       minCpuPlatform = _json['minCpuPlatform'] as core.String;
@@ -6194,7 +6375,8 @@
   InstantiateWorkflowTemplateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.String, core.String>(
-          _json['parameters'].cast<core.String, core.String>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('requestId')) {
@@ -6310,57 +6492,72 @@
       driverOutputResourceUri = _json['driverOutputResourceUri'] as core.String;
     }
     if (_json.containsKey('hadoopJob')) {
-      hadoopJob = HadoopJob.fromJson(_json['hadoopJob']);
+      hadoopJob = HadoopJob.fromJson(
+          _json['hadoopJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hiveJob')) {
-      hiveJob = HiveJob.fromJson(_json['hiveJob']);
+      hiveJob = HiveJob.fromJson(
+          _json['hiveJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobUuid')) {
       jobUuid = _json['jobUuid'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('pigJob')) {
-      pigJob = PigJob.fromJson(_json['pigJob']);
+      pigJob = PigJob.fromJson(
+          _json['pigJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('placement')) {
-      placement = JobPlacement.fromJson(_json['placement']);
+      placement = JobPlacement.fromJson(
+          _json['placement'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prestoJob')) {
-      prestoJob = PrestoJob.fromJson(_json['prestoJob']);
+      prestoJob = PrestoJob.fromJson(
+          _json['prestoJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pysparkJob')) {
-      pysparkJob = PySparkJob.fromJson(_json['pysparkJob']);
+      pysparkJob = PySparkJob.fromJson(
+          _json['pysparkJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reference')) {
-      reference = JobReference.fromJson(_json['reference']);
+      reference = JobReference.fromJson(
+          _json['reference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scheduling')) {
-      scheduling = JobScheduling.fromJson(_json['scheduling']);
+      scheduling = JobScheduling.fromJson(
+          _json['scheduling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sparkJob')) {
-      sparkJob = SparkJob.fromJson(_json['sparkJob']);
+      sparkJob = SparkJob.fromJson(
+          _json['sparkJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sparkRJob')) {
-      sparkRJob = SparkRJob.fromJson(_json['sparkRJob']);
+      sparkRJob = SparkRJob.fromJson(
+          _json['sparkRJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sparkSqlJob')) {
-      sparkSqlJob = SparkSqlJob.fromJson(_json['sparkSqlJob']);
+      sparkSqlJob = SparkSqlJob.fromJson(
+          _json['sparkSqlJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = JobStatus.fromJson(_json['status']);
+      status = JobStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('statusHistory')) {
       statusHistory = (_json['statusHistory'] as core.List)
-          .map<JobStatus>((value) => JobStatus.fromJson(value))
+          .map<JobStatus>((value) =>
+              JobStatus.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('yarnApplications')) {
       yarnApplications = (_json['yarnApplications'] as core.List)
-          .map<YarnApplication>((value) => YarnApplication.fromJson(value))
+          .map<YarnApplication>((value) => YarnApplication.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6457,7 +6654,8 @@
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = JobStatus.fromJson(_json['status']);
+      status = JobStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6899,7 +7097,8 @@
     }
     if (_json.containsKey('policies')) {
       policies = (_json['policies'] as core.List)
-          .map<AutoscalingPolicy>((value) => AutoscalingPolicy.fromJson(value))
+          .map<AutoscalingPolicy>((value) => AutoscalingPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6931,7 +7130,8 @@
   ListClustersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('clusters')) {
       clusters = (_json['clusters'] as core.List)
-          .map<Cluster>((value) => Cluster.fromJson(value))
+          .map<Cluster>((value) =>
+              Cluster.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6966,7 +7166,8 @@
   ListJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<Job>((value) => Job.fromJson(value))
+          .map<Job>((value) =>
+              Job.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7002,7 +7203,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7037,7 +7239,8 @@
     }
     if (_json.containsKey('templates')) {
       templates = (_json['templates'] as core.List)
-          .map<WorkflowTemplate>((value) => WorkflowTemplate.fromJson(value))
+          .map<WorkflowTemplate>((value) => WorkflowTemplate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7066,7 +7269,8 @@
   LoggingConfig.fromJson(core.Map _json) {
     if (_json.containsKey('driverLogLevels')) {
       driverLogLevels = commons.mapMap<core.String, core.String>(
-          _json['driverLogLevels'].cast<core.String, core.String>(),
+          (_json['driverLogLevels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -7106,11 +7310,13 @@
       clusterName = _json['clusterName'] as core.String;
     }
     if (_json.containsKey('config')) {
-      config = ClusterConfig.fromJson(_json['config']);
+      config = ClusterConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -7268,11 +7474,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -7280,7 +7488,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -7359,18 +7568,22 @@
 
   OrderedJob.fromJson(core.Map _json) {
     if (_json.containsKey('hadoopJob')) {
-      hadoopJob = HadoopJob.fromJson(_json['hadoopJob']);
+      hadoopJob = HadoopJob.fromJson(
+          _json['hadoopJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hiveJob')) {
-      hiveJob = HiveJob.fromJson(_json['hiveJob']);
+      hiveJob = HiveJob.fromJson(
+          _json['hiveJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('pigJob')) {
-      pigJob = PigJob.fromJson(_json['pigJob']);
+      pigJob = PigJob.fromJson(
+          _json['pigJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prerequisiteStepIds')) {
       prerequisiteStepIds = (_json['prerequisiteStepIds'] as core.List)
@@ -7378,22 +7591,28 @@
           .toList();
     }
     if (_json.containsKey('prestoJob')) {
-      prestoJob = PrestoJob.fromJson(_json['prestoJob']);
+      prestoJob = PrestoJob.fromJson(
+          _json['prestoJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pysparkJob')) {
-      pysparkJob = PySparkJob.fromJson(_json['pysparkJob']);
+      pysparkJob = PySparkJob.fromJson(
+          _json['pysparkJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scheduling')) {
-      scheduling = JobScheduling.fromJson(_json['scheduling']);
+      scheduling = JobScheduling.fromJson(
+          _json['scheduling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sparkJob')) {
-      sparkJob = SparkJob.fromJson(_json['sparkJob']);
+      sparkJob = SparkJob.fromJson(
+          _json['sparkJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sparkRJob')) {
-      sparkRJob = SparkRJob.fromJson(_json['sparkRJob']);
+      sparkRJob = SparkRJob.fromJson(
+          _json['sparkRJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sparkSqlJob')) {
-      sparkSqlJob = SparkSqlJob.fromJson(_json['sparkSqlJob']);
+      sparkSqlJob = SparkSqlJob.fromJson(
+          _json['sparkSqlJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stepId')) {
       stepId = _json['stepId'] as core.String;
@@ -7454,10 +7673,12 @@
 
   ParameterValidation.fromJson(core.Map _json) {
     if (_json.containsKey('regex')) {
-      regex = RegexValidation.fromJson(_json['regex']);
+      regex = RegexValidation.fromJson(
+          _json['regex'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('values')) {
-      values = ValueValidation.fromJson(_json['values']);
+      values = ValueValidation.fromJson(
+          _json['values'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7516,22 +7737,26 @@
           .toList();
     }
     if (_json.containsKey('loggingConfig')) {
-      loggingConfig = LoggingConfig.fromJson(_json['loggingConfig']);
+      loggingConfig = LoggingConfig.fromJson(
+          _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
     }
     if (_json.containsKey('queryList')) {
-      queryList = QueryList.fromJson(_json['queryList']);
+      queryList = QueryList.fromJson(
+          _json['queryList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scriptVariables')) {
       scriptVariables = commons.mapMap<core.String, core.String>(
-          _json['scriptVariables'].cast<core.String, core.String>(),
+          (_json['scriptVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -7639,7 +7864,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -7708,21 +7934,24 @@
       continueOnFailure = _json['continueOnFailure'] as core.bool;
     }
     if (_json.containsKey('loggingConfig')) {
-      loggingConfig = LoggingConfig.fromJson(_json['loggingConfig']);
+      loggingConfig = LoggingConfig.fromJson(
+          _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputFormat')) {
       outputFormat = _json['outputFormat'] as core.String;
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
     }
     if (_json.containsKey('queryList')) {
-      queryList = QueryList.fromJson(_json['queryList']);
+      queryList = QueryList.fromJson(
+          _json['queryList'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7816,14 +8045,16 @@
           .toList();
     }
     if (_json.containsKey('loggingConfig')) {
-      loggingConfig = LoggingConfig.fromJson(_json['loggingConfig']);
+      loggingConfig = LoggingConfig.fromJson(
+          _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mainPythonFileUri')) {
       mainPythonFileUri = _json['mainPythonFileUri'] as core.String;
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('pythonFileUris')) {
@@ -7975,7 +8206,8 @@
 
   SecurityConfig.fromJson(core.Map _json) {
     if (_json.containsKey('kerberosConfig')) {
-      kerberosConfig = KerberosConfig.fromJson(_json['kerberosConfig']);
+      kerberosConfig = KerberosConfig.fromJson(
+          _json['kerberosConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8000,7 +8232,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8050,7 +8283,8 @@
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -8131,7 +8365,8 @@
           .toList();
     }
     if (_json.containsKey('loggingConfig')) {
-      loggingConfig = LoggingConfig.fromJson(_json['loggingConfig']);
+      loggingConfig = LoggingConfig.fromJson(
+          _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mainClass')) {
       mainClass = _json['mainClass'] as core.String;
@@ -8141,7 +8376,8 @@
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -8225,14 +8461,16 @@
           .toList();
     }
     if (_json.containsKey('loggingConfig')) {
-      loggingConfig = LoggingConfig.fromJson(_json['loggingConfig']);
+      loggingConfig = LoggingConfig.fromJson(
+          _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mainRFileUri')) {
       mainRFileUri = _json['mainRFileUri'] as core.String;
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -8294,22 +8532,26 @@
           .toList();
     }
     if (_json.containsKey('loggingConfig')) {
-      loggingConfig = LoggingConfig.fromJson(_json['loggingConfig']);
+      loggingConfig = LoggingConfig.fromJson(
+          _json['loggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('queryFileUri')) {
       queryFileUri = _json['queryFileUri'] as core.String;
     }
     if (_json.containsKey('queryList')) {
-      queryList = QueryList.fromJson(_json['queryList']);
+      queryList = QueryList.fromJson(
+          _json['queryList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scriptVariables')) {
       scriptVariables = commons.mapMap<core.String, core.String>(
-          _json['scriptVariables'].cast<core.String, core.String>(),
+          (_json['scriptVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -8370,7 +8612,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -8412,7 +8655,7 @@
 
   SubmitJobRequest.fromJson(core.Map _json) {
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestId')) {
       requestId = _json['requestId'] as core.String;
@@ -8492,7 +8735,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('validation')) {
-      validation = ParameterValidation.fromJson(_json['validation']);
+      validation = ParameterValidation.fromJson(
+          _json['validation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8599,7 +8843,8 @@
   WorkflowGraph.fromJson(core.Map _json) {
     if (_json.containsKey('nodes')) {
       nodes = (_json['nodes'] as core.List)
-          .map<WorkflowNode>((value) => WorkflowNode.fromJson(value))
+          .map<WorkflowNode>((value) => WorkflowNode.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8671,20 +8916,24 @@
       clusterUuid = _json['clusterUuid'] as core.String;
     }
     if (_json.containsKey('createCluster')) {
-      createCluster = ClusterOperation.fromJson(_json['createCluster']);
+      createCluster = ClusterOperation.fromJson(
+          _json['createCluster'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteCluster')) {
-      deleteCluster = ClusterOperation.fromJson(_json['deleteCluster']);
+      deleteCluster = ClusterOperation.fromJson(
+          _json['deleteCluster'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('graph')) {
-      graph = WorkflowGraph.fromJson(_json['graph']);
+      graph = WorkflowGraph.fromJson(
+          _json['graph'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.String, core.String>(
-          _json['parameters'].cast<core.String, core.String>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('startTime')) {
@@ -8868,12 +9117,14 @@
     }
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<OrderedJob>((value) => OrderedJob.fromJson(value))
+          .map<OrderedJob>((value) =>
+              OrderedJob.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -8881,11 +9132,13 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<TemplateParameter>((value) => TemplateParameter.fromJson(value))
+          .map<TemplateParameter>((value) => TemplateParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('placement')) {
-      placement = WorkflowTemplatePlacement.fromJson(_json['placement']);
+      placement = WorkflowTemplatePlacement.fromJson(
+          _json['placement'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -8942,10 +9195,12 @@
 
   WorkflowTemplatePlacement.fromJson(core.Map _json) {
     if (_json.containsKey('clusterSelector')) {
-      clusterSelector = ClusterSelector.fromJson(_json['clusterSelector']);
+      clusterSelector = ClusterSelector.fromJson(
+          _json['clusterSelector'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('managedCluster')) {
-      managedCluster = ManagedCluster.fromJson(_json['managedCluster']);
+      managedCluster = ManagedCluster.fromJson(
+          _json['managedCluster'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/datastore/v1.dart b/generated/googleapis/lib/datastore/v1.dart
index 6e9bc35..50a5a09 100644
--- a/generated/googleapis/lib/datastore/v1.dart
+++ b/generated/googleapis/lib/datastore/v1.dart
@@ -116,7 +116,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AllocateIdsResponse.fromJson(data));
+    return _response.then(
+      (data) => AllocateIdsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Begins a new transaction.
@@ -173,7 +176,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BeginTransactionResponse.fromJson(data));
+    return _response.then(
+      (data) => BeginTransactionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Commits a transaction, optionally creating, deleting or modifying some
@@ -231,7 +237,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommitResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommitResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Exports a copy of all or a subset of entities from Google Cloud Datastore
@@ -294,7 +303,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports entities into Google Cloud Datastore. Existing entities with the
@@ -354,7 +366,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Looks up entities by key.
@@ -411,7 +426,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LookupResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          LookupResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Prevents the supplied keys' IDs from being auto-allocated by Cloud
@@ -469,7 +487,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReserveIdsResponse.fromJson(data));
+    return _response.then(
+      (data) => ReserveIdsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rolls back a transaction.
@@ -526,7 +547,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RollbackResponse.fromJson(data));
+    return _response.then(
+      (data) => RollbackResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Queries for entities.
@@ -583,7 +607,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RunQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => RunQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -652,7 +679,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an existing index. An index can only be deleted if it is in a
@@ -715,7 +745,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an index.
@@ -772,7 +805,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleDatastoreAdminV1Index.fromJson(data));
+    return _response.then(
+      (data) => GoogleDatastoreAdminV1Index.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the indexes that match the specified filters. Datastore uses an
@@ -845,7 +881,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleDatastoreAdminV1ListIndexesResponse.fromJson(data));
+      (data) => GoogleDatastoreAdminV1ListIndexesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -909,7 +947,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -961,7 +1001,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1012,7 +1054,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1088,8 +1133,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleLongrunningListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1104,7 +1151,8 @@
   AllocateIdsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
-          .map<Key>((value) => Key.fromJson(value))
+          .map<Key>((value) =>
+              Key.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1129,7 +1177,8 @@
   AllocateIdsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
-          .map<Key>((value) => Key.fromJson(value))
+          .map<Key>((value) =>
+              Key.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1154,7 +1203,8 @@
   ArrayValue.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<Value>((value) => Value.fromJson(value))
+          .map<Value>((value) =>
+              Value.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1177,8 +1227,8 @@
 
   BeginTransactionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('transactionOptions')) {
-      transactionOptions =
-          TransactionOptions.fromJson(_json['transactionOptions']);
+      transactionOptions = TransactionOptions.fromJson(
+          _json['transactionOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1260,7 +1310,8 @@
     }
     if (_json.containsKey('mutations')) {
       mutations = (_json['mutations'] as core.List)
-          .map<Mutation>((value) => Mutation.fromJson(value))
+          .map<Mutation>((value) =>
+              Mutation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('transaction')) {
@@ -1301,7 +1352,8 @@
     }
     if (_json.containsKey('mutationResults')) {
       mutationResults = (_json['mutationResults'] as core.List)
-          .map<MutationResult>((value) => MutationResult.fromJson(value))
+          .map<MutationResult>((value) => MutationResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1336,7 +1388,8 @@
   CompositeFilter.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<Filter>((value) => Filter.fromJson(value))
+          .map<Filter>((value) =>
+              Filter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('op')) {
@@ -1394,12 +1447,14 @@
 
   Entity.fromJson(core.Map _json) {
     if (_json.containsKey('key')) {
-      key = Key.fromJson(_json['key']);
+      key = Key.fromJson(_json['key'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.Map, Value>(
-          _json['properties'].cast<core.String, core.Map>(),
-          (core.Map item) => Value.fromJson(item));
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Value.fromJson(item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -1446,7 +1501,8 @@
       cursor = _json['cursor'] as core.String;
     }
     if (_json.containsKey('entity')) {
-      entity = Entity.fromJson(_json['entity']);
+      entity = Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
       version = _json['version'] as core.String;
@@ -1480,10 +1536,12 @@
 
   Filter.fromJson(core.Map _json) {
     if (_json.containsKey('compositeFilter')) {
-      compositeFilter = CompositeFilter.fromJson(_json['compositeFilter']);
+      compositeFilter = CompositeFilter.fromJson(
+          _json['compositeFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('propertyFilter')) {
-      propertyFilter = PropertyFilter.fromJson(_json['propertyFilter']);
+      propertyFilter = PropertyFilter.fromJson(
+          _json['propertyFilter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1545,7 +1603,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('operationType')) {
@@ -1652,22 +1711,23 @@
 
   GoogleDatastoreAdminV1ExportEntitiesMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('common')) {
-      common = GoogleDatastoreAdminV1CommonMetadata.fromJson(_json['common']);
+      common = GoogleDatastoreAdminV1CommonMetadata.fromJson(
+          _json['common'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entityFilter')) {
-      entityFilter =
-          GoogleDatastoreAdminV1EntityFilter.fromJson(_json['entityFilter']);
+      entityFilter = GoogleDatastoreAdminV1EntityFilter.fromJson(
+          _json['entityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputUrlPrefix')) {
       outputUrlPrefix = _json['outputUrlPrefix'] as core.String;
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleDatastoreAdminV1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleDatastoreAdminV1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressEntities')) {
-      progressEntities =
-          GoogleDatastoreAdminV1Progress.fromJson(_json['progressEntities']);
+      progressEntities = GoogleDatastoreAdminV1Progress.fromJson(
+          _json['progressEntities'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1720,12 +1780,13 @@
 
   GoogleDatastoreAdminV1ExportEntitiesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entityFilter')) {
-      entityFilter =
-          GoogleDatastoreAdminV1EntityFilter.fromJson(_json['entityFilter']);
+      entityFilter = GoogleDatastoreAdminV1EntityFilter.fromJson(
+          _json['entityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('outputUrlPrefix')) {
@@ -1795,22 +1856,23 @@
 
   GoogleDatastoreAdminV1ImportEntitiesMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('common')) {
-      common = GoogleDatastoreAdminV1CommonMetadata.fromJson(_json['common']);
+      common = GoogleDatastoreAdminV1CommonMetadata.fromJson(
+          _json['common'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entityFilter')) {
-      entityFilter =
-          GoogleDatastoreAdminV1EntityFilter.fromJson(_json['entityFilter']);
+      entityFilter = GoogleDatastoreAdminV1EntityFilter.fromJson(
+          _json['entityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputUrl')) {
       inputUrl = _json['inputUrl'] as core.String;
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleDatastoreAdminV1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleDatastoreAdminV1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressEntities')) {
-      progressEntities =
-          GoogleDatastoreAdminV1Progress.fromJson(_json['progressEntities']);
+      progressEntities = GoogleDatastoreAdminV1Progress.fromJson(
+          _json['progressEntities'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1864,15 +1926,16 @@
 
   GoogleDatastoreAdminV1ImportEntitiesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('entityFilter')) {
-      entityFilter =
-          GoogleDatastoreAdminV1EntityFilter.fromJson(_json['entityFilter']);
+      entityFilter = GoogleDatastoreAdminV1EntityFilter.fromJson(
+          _json['entityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputUrl')) {
       inputUrl = _json['inputUrl'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -1951,8 +2014,9 @@
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<GoogleDatastoreAdminV1IndexedProperty>(
-              (value) => GoogleDatastoreAdminV1IndexedProperty.fromJson(value))
+          .map<GoogleDatastoreAdminV1IndexedProperty>((value) =>
+              GoogleDatastoreAdminV1IndexedProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
@@ -1999,14 +2063,15 @@
 
   GoogleDatastoreAdminV1IndexOperationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('common')) {
-      common = GoogleDatastoreAdminV1CommonMetadata.fromJson(_json['common']);
+      common = GoogleDatastoreAdminV1CommonMetadata.fromJson(
+          _json['common'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indexId')) {
       indexId = _json['indexId'] as core.String;
     }
     if (_json.containsKey('progressEntities')) {
-      progressEntities =
-          GoogleDatastoreAdminV1Progress.fromJson(_json['progressEntities']);
+      progressEntities = GoogleDatastoreAdminV1Progress.fromJson(
+          _json['progressEntities'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2076,8 +2141,9 @@
   GoogleDatastoreAdminV1ListIndexesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('indexes')) {
       indexes = (_json['indexes'] as core.List)
-          .map<GoogleDatastoreAdminV1Index>(
-              (value) => GoogleDatastoreAdminV1Index.fromJson(value))
+          .map<GoogleDatastoreAdminV1Index>((value) =>
+              GoogleDatastoreAdminV1Index.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2174,7 +2240,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('operationType')) {
@@ -2281,23 +2348,23 @@
 
   GoogleDatastoreAdminV1beta1ExportEntitiesMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('common')) {
-      common =
-          GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(_json['common']);
+      common = GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(
+          _json['common'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entityFilter')) {
       entityFilter = GoogleDatastoreAdminV1beta1EntityFilter.fromJson(
-          _json['entityFilter']);
+          _json['entityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputUrlPrefix')) {
       outputUrlPrefix = _json['outputUrlPrefix'] as core.String;
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleDatastoreAdminV1beta1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleDatastoreAdminV1beta1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressEntities')) {
       progressEntities = GoogleDatastoreAdminV1beta1Progress.fromJson(
-          _json['progressEntities']);
+          _json['progressEntities'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2371,23 +2438,23 @@
 
   GoogleDatastoreAdminV1beta1ImportEntitiesMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('common')) {
-      common =
-          GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(_json['common']);
+      common = GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(
+          _json['common'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entityFilter')) {
       entityFilter = GoogleDatastoreAdminV1beta1EntityFilter.fromJson(
-          _json['entityFilter']);
+          _json['entityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputUrl')) {
       inputUrl = _json['inputUrl'] as core.String;
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleDatastoreAdminV1beta1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleDatastoreAdminV1beta1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressEntities')) {
       progressEntities = GoogleDatastoreAdminV1beta1Progress.fromJson(
-          _json['progressEntities']);
+          _json['progressEntities'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2461,8 +2528,9 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleLongrunningOperation>(
-              (value) => GoogleLongrunningOperation.fromJson(value))
+          .map<GoogleLongrunningOperation>((value) =>
+              GoogleLongrunningOperation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2523,11 +2591,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2535,7 +2605,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2593,12 +2664,15 @@
     }
     if (_json.containsKey('namedBindings')) {
       namedBindings = commons.mapMap<core.Map, GqlQueryParameter>(
-          _json['namedBindings'].cast<core.String, core.Map>(),
-          (core.Map item) => GqlQueryParameter.fromJson(item));
+          (_json['namedBindings'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => GqlQueryParameter.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('positionalBindings')) {
       positionalBindings = (_json['positionalBindings'] as core.List)
-          .map<GqlQueryParameter>((value) => GqlQueryParameter.fromJson(value))
+          .map<GqlQueryParameter>((value) => GqlQueryParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('queryString')) {
@@ -2648,7 +2722,8 @@
       cursor = _json['cursor'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = Value.fromJson(_json['value']);
+      value =
+          Value.fromJson(_json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2690,11 +2765,13 @@
 
   Key.fromJson(core.Map _json) {
     if (_json.containsKey('partitionId')) {
-      partitionId = PartitionId.fromJson(_json['partitionId']);
+      partitionId = PartitionId.fromJson(
+          _json['partitionId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('path')) {
       path = (_json['path'] as core.List)
-          .map<PathElement>((value) => PathElement.fromJson(value))
+          .map<PathElement>((value) => PathElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2780,11 +2857,13 @@
   LookupRequest.fromJson(core.Map _json) {
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
-          .map<Key>((value) => Key.fromJson(value))
+          .map<Key>((value) =>
+              Key.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('readOptions')) {
-      readOptions = ReadOptions.fromJson(_json['readOptions']);
+      readOptions = ReadOptions.fromJson(
+          _json['readOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2822,17 +2901,20 @@
   LookupResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deferred')) {
       deferred = (_json['deferred'] as core.List)
-          .map<Key>((value) => Key.fromJson(value))
+          .map<Key>((value) =>
+              Key.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('found')) {
       found = (_json['found'] as core.List)
-          .map<EntityResult>((value) => EntityResult.fromJson(value))
+          .map<EntityResult>((value) => EntityResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('missing')) {
       missing = (_json['missing'] as core.List)
-          .map<EntityResult>((value) => EntityResult.fromJson(value))
+          .map<EntityResult>((value) => EntityResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2881,16 +2963,20 @@
       baseVersion = _json['baseVersion'] as core.String;
     }
     if (_json.containsKey('delete')) {
-      delete = Key.fromJson(_json['delete']);
+      delete =
+          Key.fromJson(_json['delete'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insert')) {
-      insert = Entity.fromJson(_json['insert']);
+      insert = Entity.fromJson(
+          _json['insert'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('update')) {
-      update = Entity.fromJson(_json['update']);
+      update = Entity.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('upsert')) {
-      upsert = Entity.fromJson(_json['upsert']);
+      upsert = Entity.fromJson(
+          _json['upsert'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2939,7 +3025,7 @@
       conflictDetected = _json['conflictDetected'] as core.bool;
     }
     if (_json.containsKey('key')) {
-      key = Key.fromJson(_json['key']);
+      key = Key.fromJson(_json['key'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
       version = _json['version'] as core.String;
@@ -3056,7 +3142,8 @@
 
   Projection.fromJson(core.Map _json) {
     if (_json.containsKey('property')) {
-      property = PropertyReference.fromJson(_json['property']);
+      property = PropertyReference.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3095,10 +3182,12 @@
       op = _json['op'] as core.String;
     }
     if (_json.containsKey('property')) {
-      property = PropertyReference.fromJson(_json['property']);
+      property = PropertyReference.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
-      value = Value.fromJson(_json['value']);
+      value =
+          Value.fromJson(_json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3136,7 +3225,8 @@
       direction = _json['direction'] as core.String;
     }
     if (_json.containsKey('property')) {
-      property = PropertyReference.fromJson(_json['property']);
+      property = PropertyReference.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3232,18 +3322,21 @@
   Query.fromJson(core.Map _json) {
     if (_json.containsKey('distinctOn')) {
       distinctOn = (_json['distinctOn'] as core.List)
-          .map<PropertyReference>((value) => PropertyReference.fromJson(value))
+          .map<PropertyReference>((value) => PropertyReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('endCursor')) {
       endCursor = _json['endCursor'] as core.String;
     }
     if (_json.containsKey('filter')) {
-      filter = Filter.fromJson(_json['filter']);
+      filter = Filter.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = (_json['kind'] as core.List)
-          .map<KindExpression>((value) => KindExpression.fromJson(value))
+          .map<KindExpression>((value) => KindExpression.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('limit')) {
@@ -3254,12 +3347,14 @@
     }
     if (_json.containsKey('order')) {
       order = (_json['order'] as core.List)
-          .map<PropertyOrder>((value) => PropertyOrder.fromJson(value))
+          .map<PropertyOrder>((value) => PropertyOrder.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('projection')) {
       projection = (_json['projection'] as core.List)
-          .map<Projection>((value) => Projection.fromJson(value))
+          .map<Projection>((value) =>
+              Projection.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startCursor')) {
@@ -3371,7 +3466,8 @@
     }
     if (_json.containsKey('entityResults')) {
       entityResults = (_json['entityResults'] as core.List)
-          .map<EntityResult>((value) => EntityResult.fromJson(value))
+          .map<EntityResult>((value) => EntityResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('moreResults')) {
@@ -3521,7 +3617,8 @@
     }
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
-          .map<Key>((value) => Key.fromJson(value))
+          .map<Key>((value) =>
+              Key.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3616,16 +3713,20 @@
 
   RunQueryRequest.fromJson(core.Map _json) {
     if (_json.containsKey('gqlQuery')) {
-      gqlQuery = GqlQuery.fromJson(_json['gqlQuery']);
+      gqlQuery = GqlQuery.fromJson(
+          _json['gqlQuery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('partitionId')) {
-      partitionId = PartitionId.fromJson(_json['partitionId']);
+      partitionId = PartitionId.fromJson(
+          _json['partitionId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = Query.fromJson(_json['query']);
+      query =
+          Query.fromJson(_json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readOptions')) {
-      readOptions = ReadOptions.fromJson(_json['readOptions']);
+      readOptions = ReadOptions.fromJson(
+          _json['readOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3659,10 +3760,12 @@
 
   RunQueryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('batch')) {
-      batch = QueryResultBatch.fromJson(_json['batch']);
+      batch = QueryResultBatch.fromJson(
+          _json['batch'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = Query.fromJson(_json['query']);
+      query =
+          Query.fromJson(_json['query'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3710,7 +3813,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3748,10 +3852,12 @@
 
   TransactionOptions.fromJson(core.Map _json) {
     if (_json.containsKey('readOnly')) {
-      readOnly = ReadOnly.fromJson(_json['readOnly']);
+      readOnly = ReadOnly.fromJson(
+          _json['readOnly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readWrite')) {
-      readWrite = ReadWrite.fromJson(_json['readWrite']);
+      readWrite = ReadWrite.fromJson(
+          _json['readWrite'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3830,7 +3936,8 @@
 
   Value.fromJson(core.Map _json) {
     if (_json.containsKey('arrayValue')) {
-      arrayValue = ArrayValue.fromJson(_json['arrayValue']);
+      arrayValue = ArrayValue.fromJson(
+          _json['arrayValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('blobValue')) {
       blobValue = _json['blobValue'] as core.String;
@@ -3842,19 +3949,22 @@
       doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('entityValue')) {
-      entityValue = Entity.fromJson(_json['entityValue']);
+      entityValue = Entity.fromJson(
+          _json['entityValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('excludeFromIndexes')) {
       excludeFromIndexes = _json['excludeFromIndexes'] as core.bool;
     }
     if (_json.containsKey('geoPointValue')) {
-      geoPointValue = LatLng.fromJson(_json['geoPointValue']);
+      geoPointValue = LatLng.fromJson(
+          _json['geoPointValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('integerValue')) {
       integerValue = _json['integerValue'] as core.String;
     }
     if (_json.containsKey('keyValue')) {
-      keyValue = Key.fromJson(_json['keyValue']);
+      keyValue = Key.fromJson(
+          _json['keyValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('meaning')) {
       meaning = _json['meaning'] as core.int;
diff --git a/generated/googleapis/lib/deploymentmanager/v2.dart b/generated/googleapis/lib/deploymentmanager/v2.dart
index 691e188..84643cf 100644
--- a/generated/googleapis/lib/deploymentmanager/v2.dart
+++ b/generated/googleapis/lib/deploymentmanager/v2.dart
@@ -134,7 +134,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a deployment and all of the resources in the deployment.
@@ -201,7 +203,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a specific deployment.
@@ -260,7 +264,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Deployment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Deployment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. May be empty if no such
@@ -322,7 +329,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a deployment and all of the resources described by the deployment
@@ -401,7 +410,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all deployments for a given project.
@@ -512,7 +523,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeploymentsListResponse.fromJson(data));
+    return _response.then(
+      (data) => DeploymentsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a deployment and all of the resources described by the deployment
@@ -611,7 +625,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -679,7 +695,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stops an ongoing operation. This does not roll back any work that has
@@ -746,7 +764,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource.
@@ -813,7 +833,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a deployment and all of the resources described by the deployment
@@ -912,7 +935,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -986,7 +1011,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Manifest.fromJson(data));
+    return _response.then(
+      (data) => Manifest.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all manifests for a given deployment.
@@ -1107,7 +1134,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManifestsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ManifestsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1171,7 +1201,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all operations for a project.
@@ -1282,7 +1314,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OperationsListResponse.fromJson(data));
+    return _response.then(
+      (data) => OperationsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1355,7 +1390,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Resource.fromJson(data));
+    return _response.then(
+      (data) => Resource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all resources in a given deployment.
@@ -1476,7 +1513,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResourcesListResponse.fromJson(data));
+    return _response.then(
+      (data) => ResourcesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1593,7 +1633,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TypesListResponse.fromJson(data));
+    return _response.then(
+      (data) => TypesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1634,7 +1677,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('exemptedMembers')) {
@@ -1802,7 +1846,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1995,8 +2040,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<DeploymentLabelEntry>(
-              (value) => DeploymentLabelEntry.fromJson(value))
+          .map<DeploymentLabelEntry>((value) => DeploymentLabelEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('manifest')) {
@@ -2006,16 +2051,19 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('operation')) {
-      operation = Operation.fromJson(_json['operation']);
+      operation = Operation.fromJson(
+          _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('target')) {
-      target = TargetConfiguration.fromJson(_json['target']);
+      target = TargetConfiguration.fromJson(
+          _json['target'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('update')) {
-      update = DeploymentUpdate.fromJson(_json['update']);
+      update = DeploymentUpdate.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -2116,8 +2164,9 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<DeploymentUpdateLabelEntry>(
-              (value) => DeploymentUpdateLabelEntry.fromJson(value))
+          .map<DeploymentUpdateLabelEntry>((value) =>
+              DeploymentUpdateLabelEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('manifest')) {
@@ -2218,7 +2267,8 @@
   DeploymentsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deployments')) {
       deployments = (_json['deployments'] as core.List)
-          .map<Deployment>((value) => Deployment.fromJson(value))
+          .map<Deployment>((value) =>
+              Deployment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2382,14 +2432,16 @@
   GlobalSetPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2453,13 +2505,16 @@
 
   LogConfig.fromJson(core.Map _json) {
     if (_json.containsKey('cloudAudit')) {
-      cloudAudit = LogConfigCloudAuditOptions.fromJson(_json['cloudAudit']);
+      cloudAudit = LogConfigCloudAuditOptions.fromJson(
+          _json['cloudAudit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('counter')) {
-      counter = LogConfigCounterOptions.fromJson(_json['counter']);
+      counter = LogConfigCounterOptions.fromJson(
+          _json['counter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataAccess')) {
-      dataAccess = LogConfigDataAccessOptions.fromJson(_json['dataAccess']);
+      dataAccess = LogConfigDataAccessOptions.fromJson(
+          _json['dataAccess'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2491,7 +2546,8 @@
   LogConfigCloudAuditOptions.fromJson(core.Map _json) {
     if (_json.containsKey('authorizationLoggingOptions')) {
       authorizationLoggingOptions = AuthorizationLoggingOptions.fromJson(
-          _json['authorizationLoggingOptions']);
+          _json['authorizationLoggingOptions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logName')) {
       logName = _json['logName'] as core.String;
@@ -2545,8 +2601,9 @@
   LogConfigCounterOptions.fromJson(core.Map _json) {
     if (_json.containsKey('customFields')) {
       customFields = (_json['customFields'] as core.List)
-          .map<LogConfigCounterOptionsCustomField>(
-              (value) => LogConfigCounterOptionsCustomField.fromJson(value))
+          .map<LogConfigCounterOptionsCustomField>((value) =>
+              LogConfigCounterOptionsCustomField.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('field')) {
@@ -2658,7 +2715,8 @@
 
   Manifest.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = ConfigFile.fromJson(_json['config']);
+      config = ConfigFile.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('expandedConfig')) {
       expandedConfig = _json['expandedConfig'] as core.String;
@@ -2668,7 +2726,8 @@
     }
     if (_json.containsKey('imports')) {
       imports = (_json['imports'] as core.List)
-          .map<ImportFile>((value) => ImportFile.fromJson(value))
+          .map<ImportFile>((value) =>
+              ImportFile.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('insertTime')) {
@@ -2729,7 +2788,8 @@
   ManifestsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('manifests')) {
       manifests = (_json['manifests'] as core.List)
-          .map<Manifest>((value) => Manifest.fromJson(value))
+          .map<Manifest>((value) =>
+              Manifest.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2801,8 +2861,8 @@
   OperationError.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<OperationErrorErrors>(
-              (value) => OperationErrorErrors.fromJson(value))
+          .map<OperationErrorErrors>((value) => OperationErrorErrors.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2873,8 +2933,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<OperationWarningsData>(
-              (value) => OperationWarningsData.fromJson(value))
+          .map<OperationWarningsData>((value) => OperationWarningsData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -3028,7 +3088,8 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('error')) {
-      error = OperationError.fromJson(_json['error']);
+      error = OperationError.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpErrorMessage')) {
       httpErrorMessage = _json['httpErrorMessage'] as core.String;
@@ -3080,7 +3141,8 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<OperationWarnings>((value) => OperationWarnings.fromJson(value))
+          .map<OperationWarnings>((value) => OperationWarnings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('zone')) {
@@ -3180,7 +3242,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3311,12 +3374,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -3327,7 +3392,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<Rule>((value) => Rule.fromJson(value))
+          .map<Rule>((value) =>
+              Rule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -3417,8 +3483,8 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ResourceWarningsData>(
-              (value) => ResourceWarningsData.fromJson(value))
+          .map<ResourceWarningsData>((value) => ResourceWarningsData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -3486,7 +3552,8 @@
 
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('accessControl')) {
-      accessControl = ResourceAccessControl.fromJson(_json['accessControl']);
+      accessControl = ResourceAccessControl.fromJson(
+          _json['accessControl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('finalProperties')) {
       finalProperties = _json['finalProperties'] as core.String;
@@ -3510,7 +3577,8 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('update')) {
-      update = ResourceUpdate.fromJson(_json['update']);
+      update = ResourceUpdate.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -3520,7 +3588,8 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<ResourceWarnings>((value) => ResourceWarnings.fromJson(value))
+          .map<ResourceWarnings>((value) => ResourceWarnings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3641,8 +3710,9 @@
   ResourceUpdateError.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<ResourceUpdateErrorErrors>(
-              (value) => ResourceUpdateErrorErrors.fromJson(value))
+          .map<ResourceUpdateErrorErrors>((value) =>
+              ResourceUpdateErrorErrors.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3713,8 +3783,9 @@
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ResourceUpdateWarningsData>(
-              (value) => ResourceUpdateWarningsData.fromJson(value))
+          .map<ResourceUpdateWarningsData>((value) =>
+              ResourceUpdateWarningsData.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('message')) {
@@ -3772,10 +3843,12 @@
 
   ResourceUpdate.fromJson(core.Map _json) {
     if (_json.containsKey('accessControl')) {
-      accessControl = ResourceAccessControl.fromJson(_json['accessControl']);
+      accessControl = ResourceAccessControl.fromJson(
+          _json['accessControl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('error')) {
-      error = ResourceUpdateError.fromJson(_json['error']);
+      error = ResourceUpdateError.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('finalProperties')) {
       finalProperties = _json['finalProperties'] as core.String;
@@ -3794,8 +3867,9 @@
     }
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<ResourceUpdateWarnings>(
-              (value) => ResourceUpdateWarnings.fromJson(value))
+          .map<ResourceUpdateWarnings>((value) =>
+              ResourceUpdateWarnings.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3847,7 +3921,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<Resource>((value) => Resource.fromJson(value))
+          .map<Resource>((value) =>
+              Resource.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3901,7 +3976,8 @@
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('description')) {
@@ -3914,7 +3990,8 @@
     }
     if (_json.containsKey('logConfigs')) {
       logConfigs = (_json['logConfigs'] as core.List)
-          .map<LogConfig>((value) => LogConfig.fromJson(value))
+          .map<LogConfig>((value) =>
+              LogConfig.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('notIns')) {
@@ -3969,11 +4046,13 @@
 
   TargetConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = ConfigFile.fromJson(_json['config']);
+      config = ConfigFile.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imports')) {
       imports = (_json['imports'] as core.List)
-          .map<ImportFile>((value) => ImportFile.fromJson(value))
+          .map<ImportFile>((value) =>
+              ImportFile.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4068,7 +4147,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('operation')) {
-      operation = Operation.fromJson(_json['operation']);
+      operation = Operation.fromJson(
+          _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -4112,7 +4192,8 @@
     }
     if (_json.containsKey('types')) {
       types = (_json['types'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/dfareporting/v3_4.dart b/generated/googleapis/lib/dfareporting/v3_4.dart
index f514381..0b5ce98 100644
--- a/generated/googleapis/lib/dfareporting/v3_4.dart
+++ b/generated/googleapis/lib/dfareporting/v3_4.dart
@@ -220,7 +220,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountActiveAdSummary.fromJson(data));
+    return _response.then(
+      (data) => AccountActiveAdSummary.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -284,7 +287,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountPermissionGroup.fromJson(data));
+    return _response.then(
+      (data) => AccountPermissionGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of account permission groups.
@@ -334,8 +340,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AccountPermissionGroupsListResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountPermissionGroupsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -399,7 +407,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountPermission.fromJson(data));
+    return _response.then(
+      (data) => AccountPermission.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of account permissions.
@@ -449,8 +460,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AccountPermissionsListResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountPermissionsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -514,7 +527,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountUserProfile.fromJson(data));
+    return _response.then(
+      (data) => AccountUserProfile.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new account user profile.
@@ -570,7 +586,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountUserProfile.fromJson(data));
+    return _response.then(
+      (data) => AccountUserProfile.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of account user profiles, possibly filtered. This method
@@ -689,8 +708,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AccountUserProfilesListResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountUserProfilesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account user profile. This method supports patch
@@ -754,7 +775,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountUserProfile.fromJson(data));
+    return _response.then(
+      (data) => AccountUserProfile.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account user profile.
@@ -810,7 +834,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountUserProfile.fromJson(data));
+    return _response.then(
+      (data) => AccountUserProfile.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -873,7 +900,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of accounts, possibly filtered. This method supports
@@ -979,7 +1008,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccountsListResponse.fromJson(data));
+    return _response.then(
+      (data) => AccountsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account. This method supports patch semantics.
@@ -1042,7 +1074,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing account.
@@ -1098,7 +1132,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1161,7 +1197,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Ad.fromJson(data));
+    return _response.then(
+      (data) => Ad.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new ad.
@@ -1216,7 +1254,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Ad.fromJson(data));
+    return _response.then(
+      (data) => Ad.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of ads, possibly filtered. This method supports paging.
@@ -1433,7 +1473,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdsListResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          AdsListResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing ad. This method supports patch semantics.
@@ -1495,7 +1538,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Ad.fromJson(data));
+    return _response.then(
+      (data) => Ad.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing ad.
@@ -1550,7 +1595,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Ad.fromJson(data));
+    return _response.then(
+      (data) => Ad.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1614,7 +1661,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets one advertiser group by ID.
@@ -1671,7 +1720,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdvertiserGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          AdvertiserGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new advertiser group.
@@ -1727,7 +1779,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdvertiserGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          AdvertiserGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of advertiser groups, possibly filtered. This method
@@ -1827,8 +1882,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AdvertiserGroupsListResponse.fromJson(data));
+    return _response.then(
+      (data) => AdvertiserGroupsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing advertiser group. This method supports patch
@@ -1892,7 +1949,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdvertiserGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          AdvertiserGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing advertiser group.
@@ -1948,7 +2008,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdvertiserGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          AdvertiserGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2012,7 +2075,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LandingPage.fromJson(data));
+    return _response.then(
+      (data) =>
+          LandingPage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new landing page.
@@ -2068,7 +2134,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LandingPage.fromJson(data));
+    return _response.then(
+      (data) =>
+          LandingPage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of landing pages.
@@ -2194,8 +2263,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AdvertiserLandingPagesListResponse.fromJson(data));
+    return _response.then(
+      (data) => AdvertiserLandingPagesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing advertiser landing page. This method supports patch
@@ -2259,7 +2330,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LandingPage.fromJson(data));
+    return _response.then(
+      (data) =>
+          LandingPage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing landing page.
@@ -2315,7 +2389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LandingPage.fromJson(data));
+    return _response.then(
+      (data) =>
+          LandingPage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2378,7 +2455,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Advertiser.fromJson(data));
+    return _response.then(
+      (data) =>
+          Advertiser.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new advertiser.
@@ -2434,7 +2514,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Advertiser.fromJson(data));
+    return _response.then(
+      (data) =>
+          Advertiser.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of advertisers, possibly filtered. This method supports
@@ -2579,7 +2662,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AdvertisersListResponse.fromJson(data));
+    return _response.then(
+      (data) => AdvertisersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing advertiser. This method supports patch semantics.
@@ -2642,7 +2728,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Advertiser.fromJson(data));
+    return _response.then(
+      (data) =>
+          Advertiser.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing advertiser.
@@ -2698,7 +2787,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Advertiser.fromJson(data));
+    return _response.then(
+      (data) =>
+          Advertiser.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2754,7 +2846,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BrowsersListResponse.fromJson(data));
+    return _response.then(
+      (data) => BrowsersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2827,7 +2922,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CampaignCreativeAssociation.fromJson(data));
+    return _response.then(
+      (data) => CampaignCreativeAssociation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the list of creative IDs associated with the specified campaign.
@@ -2909,7 +3007,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => CampaignCreativeAssociationsListResponse.fromJson(data));
+      (data) => CampaignCreativeAssociationsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2972,7 +3072,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Campaign.fromJson(data));
+    return _response.then(
+      (data) => Campaign.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new campaign.
@@ -3028,7 +3130,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Campaign.fromJson(data));
+    return _response.then(
+      (data) => Campaign.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of campaigns, possibly filtered. This method supports
@@ -3176,7 +3280,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CampaignsListResponse.fromJson(data));
+    return _response.then(
+      (data) => CampaignsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing campaign. This method supports patch semantics.
@@ -3239,7 +3346,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Campaign.fromJson(data));
+    return _response.then(
+      (data) => Campaign.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing campaign.
@@ -3295,7 +3404,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Campaign.fromJson(data));
+    return _response.then(
+      (data) => Campaign.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3358,7 +3469,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChangeLog.fromJson(data));
+    return _response.then(
+      (data) => ChangeLog.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of change logs. This method supports paging.
@@ -3539,7 +3652,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChangeLogsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ChangeLogsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3619,7 +3735,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CitiesListResponse.fromJson(data));
+    return _response.then(
+      (data) => CitiesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3682,7 +3801,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ConnectionType.fromJson(data));
+    return _response.then(
+      (data) =>
+          ConnectionType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of connection types.
@@ -3732,7 +3854,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ConnectionTypesListResponse.fromJson(data));
+    return _response.then(
+      (data) => ConnectionTypesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3796,7 +3921,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets one content category by ID.
@@ -3853,7 +3980,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContentCategory.fromJson(data));
+    return _response.then(
+      (data) =>
+          ContentCategory.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new content category.
@@ -3909,7 +4039,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContentCategory.fromJson(data));
+    return _response.then(
+      (data) =>
+          ContentCategory.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of content categories, possibly filtered. This method
@@ -4009,8 +4142,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ContentCategoriesListResponse.fromJson(data));
+    return _response.then(
+      (data) => ContentCategoriesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing content category. This method supports patch
@@ -4074,7 +4209,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContentCategory.fromJson(data));
+    return _response.then(
+      (data) =>
+          ContentCategory.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing content category.
@@ -4130,7 +4268,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContentCategory.fromJson(data));
+    return _response.then(
+      (data) =>
+          ContentCategory.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4192,8 +4333,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ConversionsBatchInsertResponse.fromJson(data));
+    return _response.then(
+      (data) => ConversionsBatchInsertResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates existing conversions.
@@ -4249,8 +4392,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ConversionsBatchUpdateResponse.fromJson(data));
+    return _response.then(
+      (data) => ConversionsBatchUpdateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4313,7 +4458,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Country.fromJson(data));
+    return _response.then(
+      (data) => Country.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of countries.
@@ -4363,7 +4510,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CountriesListResponse.fromJson(data));
+    return _response.then(
+      (data) => CountriesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4447,7 +4597,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeAssetMetadata.fromJson(data));
+    return _response.then(
+      (data) => CreativeAssetMetadata.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4519,7 +4672,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets one creative field value by ID.
@@ -4584,7 +4739,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeFieldValue.fromJson(data));
+    return _response.then(
+      (data) => CreativeFieldValue.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new creative field value.
@@ -4648,7 +4806,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeFieldValue.fromJson(data));
+    return _response.then(
+      (data) => CreativeFieldValue.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of creative field values, possibly filtered. This method
@@ -4751,8 +4912,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CreativeFieldValuesListResponse.fromJson(data));
+    return _response.then(
+      (data) => CreativeFieldValuesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative field value. This method supports patch
@@ -4824,7 +4987,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeFieldValue.fromJson(data));
+    return _response.then(
+      (data) => CreativeFieldValue.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative field value.
@@ -4888,7 +5054,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeFieldValue.fromJson(data));
+    return _response.then(
+      (data) => CreativeFieldValue.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4951,7 +5120,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets one creative field by ID.
@@ -5008,7 +5179,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeField.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeField.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new creative field.
@@ -5064,7 +5238,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeField.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeField.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of creative fields, possibly filtered. This method
@@ -5172,7 +5349,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeFieldsListResponse.fromJson(data));
+    return _response.then(
+      (data) => CreativeFieldsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative field. This method supports patch semantics.
@@ -5235,7 +5415,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeField.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeField.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative field.
@@ -5291,7 +5474,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeField.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeField.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5354,7 +5540,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new creative group.
@@ -5410,7 +5599,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of creative groups, possibly filtered. This method
@@ -5525,7 +5717,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeGroupsListResponse.fromJson(data));
+    return _response.then(
+      (data) => CreativeGroupsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative group. This method supports patch semantics.
@@ -5588,7 +5783,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative group.
@@ -5644,7 +5842,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativeGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          CreativeGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5707,7 +5908,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new creative.
@@ -5763,7 +5966,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of creatives, possibly filtered. This method supports
@@ -5927,7 +6132,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreativesListResponse.fromJson(data));
+    return _response.then(
+      (data) => CreativesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative. This method supports patch semantics.
@@ -5990,7 +6198,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative.
@@ -6046,7 +6256,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6108,8 +6320,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CustomEventsBatchInsertResponse.fromJson(data));
+    return _response.then(
+      (data) => CustomEventsBatchInsertResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6184,7 +6398,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DimensionValueList.fromJson(data));
+    return _response.then(
+      (data) => DimensionValueList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6247,7 +6464,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DirectorySite.fromJson(data));
+    return _response.then(
+      (data) =>
+          DirectorySite.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new directory site.
@@ -6303,7 +6523,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DirectorySite.fromJson(data));
+    return _response.then(
+      (data) =>
+          DirectorySite.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of directory sites, possibly filtered. This method
@@ -6444,7 +6667,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DirectorySitesListResponse.fromJson(data));
+    return _response.then(
+      (data) => DirectorySitesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6531,7 +6757,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new dynamic targeting key. Keys must be created at the
@@ -6590,7 +6818,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DynamicTargetingKey.fromJson(data));
+    return _response.then(
+      (data) => DynamicTargetingKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of dynamic targeting keys.
@@ -6670,8 +6901,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => DynamicTargetingKeysListResponse.fromJson(data));
+    return _response.then(
+      (data) => DynamicTargetingKeysListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6734,7 +6967,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets one event tag by ID.
@@ -6791,7 +7026,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EventTag.fromJson(data));
+    return _response.then(
+      (data) => EventTag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new event tag.
@@ -6847,7 +7084,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EventTag.fromJson(data));
+    return _response.then(
+      (data) => EventTag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of event tags, possibly filtered.
@@ -6983,7 +7222,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EventTagsListResponse.fromJson(data));
+    return _response.then(
+      (data) => EventTagsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing event tag. This method supports patch semantics.
@@ -7046,7 +7288,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EventTag.fromJson(data));
+    return _response.then(
+      (data) => EventTag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing event tag.
@@ -7102,7 +7346,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EventTag.fromJson(data));
+    return _response.then(
+      (data) => EventTag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7179,7 +7425,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => File.fromJson(data));
+      return _response.then(
+        (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -7273,7 +7521,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FileList.fromJson(data));
+    return _response.then(
+      (data) => FileList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7337,7 +7587,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Generates a tag for a floodlight activity.
@@ -7394,8 +7646,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => FloodlightActivitiesGenerateTagResponse.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivitiesGenerateTagResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets one floodlight activity by ID.
@@ -7452,7 +7706,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivity.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivity.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new floodlight activity.
@@ -7508,7 +7765,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivity.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivity.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of floodlight activities, possibly filtered. This method
@@ -7671,8 +7931,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => FloodlightActivitiesListResponse.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivitiesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing floodlight activity. This method supports patch
@@ -7736,7 +7998,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivity.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivity.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing floodlight activity.
@@ -7792,7 +8057,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivity.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivity.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7856,7 +8124,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivityGroup.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivityGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new floodlight activity group.
@@ -7912,7 +8183,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivityGroup.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivityGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of floodlight activity groups, possibly filtered. This
@@ -8042,8 +8316,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => FloodlightActivityGroupsListResponse.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivityGroupsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing floodlight activity group. This method supports patch
@@ -8107,7 +8383,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivityGroup.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivityGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing floodlight activity group.
@@ -8163,7 +8442,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightActivityGroup.fromJson(data));
+    return _response.then(
+      (data) => FloodlightActivityGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8227,7 +8509,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightConfiguration.fromJson(data));
+    return _response.then(
+      (data) => FloodlightConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of floodlight configurations, possibly filtered.
@@ -8284,8 +8569,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => FloodlightConfigurationsListResponse.fromJson(data));
+    return _response.then(
+      (data) => FloodlightConfigurationsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing floodlight configuration. This method supports patch
@@ -8349,7 +8636,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightConfiguration.fromJson(data));
+    return _response.then(
+      (data) => FloodlightConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing floodlight configuration.
@@ -8405,7 +8695,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightConfiguration.fromJson(data));
+    return _response.then(
+      (data) => FloodlightConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8476,7 +8769,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InventoryItem.fromJson(data));
+    return _response.then(
+      (data) =>
+          InventoryItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of inventory items, possibly filtered. This method
@@ -8600,7 +8896,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InventoryItemsListResponse.fromJson(data));
+    return _response.then(
+      (data) => InventoryItemsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8656,7 +8955,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LanguagesListResponse.fromJson(data));
+    return _response.then(
+      (data) => LanguagesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8712,7 +9014,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MetrosListResponse.fromJson(data));
+    return _response.then(
+      (data) => MetrosListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8775,7 +9080,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MobileApp.fromJson(data));
+    return _response.then(
+      (data) => MobileApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves list of available mobile apps.
@@ -8861,7 +9168,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MobileAppsListResponse.fromJson(data));
+    return _response.then(
+      (data) => MobileAppsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8924,7 +9234,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MobileCarrier.fromJson(data));
+    return _response.then(
+      (data) =>
+          MobileCarrier.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of mobile carriers.
@@ -8974,7 +9287,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MobileCarriersListResponse.fromJson(data));
+    return _response.then(
+      (data) => MobileCarriersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9038,7 +9354,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OperatingSystemVersion.fromJson(data));
+    return _response.then(
+      (data) => OperatingSystemVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of operating system versions.
@@ -9088,8 +9407,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OperatingSystemVersionsListResponse.fromJson(data));
+    return _response.then(
+      (data) => OperatingSystemVersionsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9153,7 +9474,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OperatingSystem.fromJson(data));
+    return _response.then(
+      (data) =>
+          OperatingSystem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of operating systems.
@@ -9203,8 +9527,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => OperatingSystemsListResponse.fromJson(data));
+    return _response.then(
+      (data) => OperatingSystemsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9275,7 +9601,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrderDocument.fromJson(data));
+    return _response.then(
+      (data) =>
+          OrderDocument.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of order documents, possibly filtered. This method
@@ -9404,7 +9733,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrderDocumentsListResponse.fromJson(data));
+    return _response.then(
+      (data) => OrderDocumentsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9475,7 +9807,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Order.fromJson(data));
+    return _response.then(
+      (data) => Order.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of orders, possibly filtered. This method supports
@@ -9588,7 +9922,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrdersListResponse.fromJson(data));
+    return _response.then(
+      (data) => OrdersListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9651,7 +9988,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          PlacementGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new placement group.
@@ -9707,7 +10047,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          PlacementGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of placement groups, possibly filtered. This method
@@ -9910,7 +10253,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementGroupsListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlacementGroupsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing placement group. This method supports patch semantics.
@@ -9973,7 +10319,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          PlacementGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing placement group.
@@ -10029,7 +10378,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          PlacementGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10093,7 +10445,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets one placement strategy by ID.
@@ -10150,7 +10504,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementStrategy.fromJson(data));
+    return _response.then(
+      (data) => PlacementStrategy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new placement strategy.
@@ -10206,7 +10563,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementStrategy.fromJson(data));
+    return _response.then(
+      (data) => PlacementStrategy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of placement strategies, possibly filtered. This method
@@ -10307,8 +10667,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PlacementStrategiesListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlacementStrategiesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing placement strategy. This method supports patch
@@ -10372,7 +10734,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementStrategy.fromJson(data));
+    return _response.then(
+      (data) => PlacementStrategy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing placement strategy.
@@ -10428,7 +10793,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementStrategy.fromJson(data));
+    return _response.then(
+      (data) => PlacementStrategy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10504,8 +10872,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PlacementsGenerateTagsResponse.fromJson(data));
+    return _response.then(
+      (data) => PlacementsGenerateTagsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets one placement by ID.
@@ -10562,7 +10932,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Placement.fromJson(data));
+    return _response.then(
+      (data) => Placement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new placement.
@@ -10618,7 +10990,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Placement.fromJson(data));
+    return _response.then(
+      (data) => Placement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of placements, possibly filtered. This method supports
@@ -10834,7 +11208,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlacementsListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlacementsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing placement. This method supports patch semantics.
@@ -10897,7 +11274,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Placement.fromJson(data));
+    return _response.then(
+      (data) => Placement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing placement.
@@ -10953,7 +11332,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Placement.fromJson(data));
+    return _response.then(
+      (data) => Placement.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11016,7 +11397,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlatformType.fromJson(data));
+    return _response.then(
+      (data) =>
+          PlatformType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of platform types.
@@ -11066,7 +11450,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlatformTypesListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlatformTypesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11129,7 +11516,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PostalCode.fromJson(data));
+    return _response.then(
+      (data) =>
+          PostalCode.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of postal codes.
@@ -11179,7 +11569,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PostalCodesListResponse.fromJson(data));
+    return _response.then(
+      (data) => PostalCodesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11242,7 +11635,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of projects, possibly filtered. This method supports
@@ -11348,7 +11743,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProjectsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ProjectsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11404,7 +11802,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RegionsListResponse.fromJson(data));
+    return _response.then(
+      (data) => RegionsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11468,7 +11869,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingListShare.fromJson(data));
+    return _response.then(
+      (data) => RemarketingListShare.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing remarketing list share. This method supports patch
@@ -11532,7 +11936,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingListShare.fromJson(data));
+    return _response.then(
+      (data) => RemarketingListShare.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing remarketing list share.
@@ -11588,7 +11995,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingListShare.fromJson(data));
+    return _response.then(
+      (data) => RemarketingListShare.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -11652,7 +12062,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RemarketingList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new remarketing list.
@@ -11708,7 +12121,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RemarketingList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of remarketing lists, possibly filtered. This method
@@ -11822,8 +12238,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => RemarketingListsListResponse.fromJson(data));
+    return _response.then(
+      (data) => RemarketingListsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing remarketing list. This method supports patch
@@ -11887,7 +12305,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RemarketingList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing remarketing list.
@@ -11943,7 +12364,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemarketingList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RemarketingList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -12010,7 +12434,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a report by its ID.
@@ -12067,7 +12493,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a report.
@@ -12123,7 +12551,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves list of reports.
@@ -12214,7 +12644,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReportList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReportList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing report. This method supports patch semantics.
@@ -12277,7 +12710,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs a report.
@@ -12341,7 +12776,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a report.
@@ -12404,7 +12841,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -12469,7 +12908,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CompatibleFields.fromJson(data));
+    return _response.then(
+      (data) => CompatibleFields.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -12554,7 +12996,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => File.fromJson(data));
+      return _response.then(
+        (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -12646,7 +13090,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FileList.fromJson(data));
+    return _response.then(
+      (data) => FileList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -12709,7 +13155,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Site.fromJson(data));
+    return _response.then(
+      (data) => Site.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new site.
@@ -12765,7 +13213,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Site.fromJson(data));
+    return _response.then(
+      (data) => Site.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of sites, possibly filtered. This method supports paging.
@@ -12927,7 +13377,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SitesListResponse.fromJson(data));
+    return _response.then(
+      (data) => SitesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing site. This method supports patch semantics.
@@ -12990,7 +13443,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Site.fromJson(data));
+    return _response.then(
+      (data) => Site.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing site.
@@ -13046,7 +13501,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Site.fromJson(data));
+    return _response.then(
+      (data) => Site.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -13109,7 +13566,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Size.fromJson(data));
+    return _response.then(
+      (data) => Size.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new size.
@@ -13165,7 +13624,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Size.fromJson(data));
+    return _response.then(
+      (data) => Size.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of sizes, possibly filtered. Retrieved sizes are globally
@@ -13244,7 +13705,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SizesListResponse.fromJson(data));
+    return _response.then(
+      (data) => SizesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -13307,7 +13771,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subaccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subaccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new subaccount.
@@ -13363,7 +13830,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subaccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subaccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a list of subaccounts, possibly filtered. This method supports
@@ -13463,7 +13933,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SubaccountsListResponse.fromJson(data));
+    return _response.then(
+      (data) => SubaccountsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing subaccount. This method supports patch semantics.
@@ -13526,7 +13999,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subaccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subaccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing subaccount.
@@ -13582,7 +14058,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subaccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subaccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -13646,7 +14125,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetableRemarketingList.fromJson(data));
+    return _response.then(
+      (data) => TargetableRemarketingList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of targetable remarketing lists, possibly filtered. This
@@ -13755,8 +14237,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => TargetableRemarketingListsListResponse.fromJson(data));
+    return _response.then(
+      (data) => TargetableRemarketingListsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -13820,7 +14304,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetingTemplate.fromJson(data));
+    return _response.then(
+      (data) => TargetingTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new targeting template.
@@ -13876,7 +14363,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetingTemplate.fromJson(data));
+    return _response.then(
+      (data) => TargetingTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of targeting templates, optionally filtered. This method
@@ -13982,8 +14472,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => TargetingTemplatesListResponse.fromJson(data));
+    return _response.then(
+      (data) => TargetingTemplatesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing targeting template. This method supports patch
@@ -14047,7 +14539,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetingTemplate.fromJson(data));
+    return _response.then(
+      (data) => TargetingTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing targeting template.
@@ -14103,7 +14598,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetingTemplate.fromJson(data));
+    return _response.then(
+      (data) => TargetingTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -14157,7 +14655,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserProfile.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserProfile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves list of user profiles for a user.
@@ -14199,7 +14700,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserProfileList.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserProfileList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -14263,7 +14767,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserRolePermissionGroup.fromJson(data));
+    return _response.then(
+      (data) => UserRolePermissionGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a list of all supported user role permission groups.
@@ -14313,8 +14820,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => UserRolePermissionGroupsListResponse.fromJson(data));
+    return _response.then(
+      (data) => UserRolePermissionGroupsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -14378,7 +14887,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserRolePermission.fromJson(data));
+    return _response.then(
+      (data) => UserRolePermission.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a list of user role permissions, possibly filtered.
@@ -14434,8 +14946,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => UserRolePermissionsListResponse.fromJson(data));
+    return _response.then(
+      (data) => UserRolePermissionsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -14498,7 +15012,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets one user role by ID.
@@ -14555,7 +15071,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserRole.fromJson(data));
+    return _response.then(
+      (data) => UserRole.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new user role.
@@ -14611,7 +15129,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserRole.fromJson(data));
+    return _response.then(
+      (data) => UserRole.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of user roles, possibly filtered. This method supports
@@ -14724,7 +15244,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserRolesListResponse.fromJson(data));
+    return _response.then(
+      (data) => UserRolesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing user role. This method supports patch semantics.
@@ -14787,7 +15310,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserRole.fromJson(data));
+    return _response.then(
+      (data) => UserRole.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing user role.
@@ -14843,7 +15368,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserRole.fromJson(data));
+    return _response.then(
+      (data) => UserRole.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -14906,7 +15433,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VideoFormat.fromJson(data));
+    return _response.then(
+      (data) =>
+          VideoFormat.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists available video formats.
@@ -14956,7 +15486,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VideoFormatsListResponse.fromJson(data));
+    return _response.then(
+      (data) => VideoFormatsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -15109,8 +15642,8 @@
       nielsenOcrEnabled = _json['nielsenOcrEnabled'] as core.bool;
     }
     if (_json.containsKey('reportsConfiguration')) {
-      reportsConfiguration =
-          ReportsConfiguration.fromJson(_json['reportsConfiguration']);
+      reportsConfiguration = ReportsConfiguration.fromJson(
+          _json['reportsConfiguration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shareReportsWithTwitter')) {
       shareReportsWithTwitter = _json['shareReportsWithTwitter'] as core.bool;
@@ -15383,8 +15916,9 @@
   AccountPermissionGroupsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accountPermissionGroups')) {
       accountPermissionGroups = (_json['accountPermissionGroups'] as core.List)
-          .map<AccountPermissionGroup>(
-              (value) => AccountPermissionGroup.fromJson(value))
+          .map<AccountPermissionGroup>((value) =>
+              AccountPermissionGroup.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15419,7 +15953,8 @@
   AccountPermissionsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accountPermissions')) {
       accountPermissions = (_json['accountPermissions'] as core.List)
-          .map<AccountPermission>((value) => AccountPermission.fromJson(value))
+          .map<AccountPermission>((value) => AccountPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15525,10 +16060,12 @@
       active = _json['active'] as core.bool;
     }
     if (_json.containsKey('advertiserFilter')) {
-      advertiserFilter = ObjectFilter.fromJson(_json['advertiserFilter']);
+      advertiserFilter = ObjectFilter.fromJson(
+          _json['advertiserFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('campaignFilter')) {
-      campaignFilter = ObjectFilter.fromJson(_json['campaignFilter']);
+      campaignFilter = ObjectFilter.fromJson(
+          _json['campaignFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('comments')) {
       comments = _json['comments'] as core.String;
@@ -15549,7 +16086,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('siteFilter')) {
-      siteFilter = ObjectFilter.fromJson(_json['siteFilter']);
+      siteFilter = ObjectFilter.fromJson(
+          _json['siteFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subaccountId')) {
       subaccountId = _json['subaccountId'] as core.String;
@@ -15561,7 +16099,8 @@
       userAccessType = _json['userAccessType'] as core.String;
     }
     if (_json.containsKey('userRoleFilter')) {
-      userRoleFilter = ObjectFilter.fromJson(_json['userRoleFilter']);
+      userRoleFilter = ObjectFilter.fromJson(
+          _json['userRoleFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userRoleId')) {
       userRoleId = _json['userRoleId'] as core.String;
@@ -15639,8 +16178,8 @@
   AccountUserProfilesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accountUserProfiles')) {
       accountUserProfiles = (_json['accountUserProfiles'] as core.List)
-          .map<AccountUserProfile>(
-              (value) => AccountUserProfile.fromJson(value))
+          .map<AccountUserProfile>((value) => AccountUserProfile.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15684,7 +16223,8 @@
   AccountsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accounts')) {
       accounts = (_json['accounts'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15727,7 +16267,8 @@
   Activities.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15942,8 +16483,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('archived')) {
       archived = _json['archived'] as core.bool;
@@ -15955,16 +16497,19 @@
       campaignId = _json['campaignId'] as core.String;
     }
     if (_json.containsKey('campaignIdDimensionValue')) {
-      campaignIdDimensionValue =
-          DimensionValue.fromJson(_json['campaignIdDimensionValue']);
+      campaignIdDimensionValue = DimensionValue.fromJson(
+          _json['campaignIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clickThroughUrl')) {
-      clickThroughUrl = ClickThroughUrl.fromJson(_json['clickThroughUrl']);
+      clickThroughUrl = ClickThroughUrl.fromJson(
+          _json['clickThroughUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clickThroughUrlSuffixProperties')) {
       clickThroughUrlSuffixProperties =
           ClickThroughUrlSuffixProperties.fromJson(
-              _json['clickThroughUrlSuffixProperties']);
+              _json['clickThroughUrlSuffixProperties']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('comments')) {
       comments = _json['comments'] as core.String;
@@ -15973,28 +16518,34 @@
       compatibility = _json['compatibility'] as core.String;
     }
     if (_json.containsKey('createInfo')) {
-      createInfo = LastModifiedInfo.fromJson(_json['createInfo']);
+      createInfo = LastModifiedInfo.fromJson(
+          _json['createInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creativeGroupAssignments')) {
       creativeGroupAssignments =
           (_json['creativeGroupAssignments'] as core.List)
-              .map<CreativeGroupAssignment>(
-                  (value) => CreativeGroupAssignment.fromJson(value))
+              .map<CreativeGroupAssignment>((value) =>
+                  CreativeGroupAssignment.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('creativeRotation')) {
-      creativeRotation = CreativeRotation.fromJson(_json['creativeRotation']);
+      creativeRotation = CreativeRotation.fromJson(
+          _json['creativeRotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dayPartTargeting')) {
-      dayPartTargeting = DayPartTargeting.fromJson(_json['dayPartTargeting']);
+      dayPartTargeting = DayPartTargeting.fromJson(
+          _json['dayPartTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultClickThroughEventTagProperties')) {
       defaultClickThroughEventTagProperties =
           DefaultClickThroughEventTagProperties.fromJson(
-              _json['defaultClickThroughEventTagProperties']);
+              _json['defaultClickThroughEventTagProperties']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deliverySchedule')) {
-      deliverySchedule = DeliverySchedule.fromJson(_json['deliverySchedule']);
+      deliverySchedule = DeliverySchedule.fromJson(
+          _json['deliverySchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dynamicClickTracker')) {
       dynamicClickTracker = _json['dynamicClickTracker'] as core.bool;
@@ -16004,47 +16555,54 @@
     }
     if (_json.containsKey('eventTagOverrides')) {
       eventTagOverrides = (_json['eventTagOverrides'] as core.List)
-          .map<EventTagOverride>((value) => EventTagOverride.fromJson(value))
+          .map<EventTagOverride>((value) => EventTagOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('geoTargeting')) {
-      geoTargeting = GeoTargeting.fromJson(_json['geoTargeting']);
+      geoTargeting = GeoTargeting.fromJson(
+          _json['geoTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keyValueTargetingExpression')) {
       keyValueTargetingExpression = KeyValueTargetingExpression.fromJson(
-          _json['keyValueTargetingExpression']);
+          _json['keyValueTargetingExpression']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('languageTargeting')) {
-      languageTargeting =
-          LanguageTargeting.fromJson(_json['languageTargeting']);
+      languageTargeting = LanguageTargeting.fromJson(
+          _json['languageTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('placementAssignments')) {
       placementAssignments = (_json['placementAssignments'] as core.List)
-          .map<PlacementAssignment>(
-              (value) => PlacementAssignment.fromJson(value))
+          .map<PlacementAssignment>((value) => PlacementAssignment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('remarketingListExpression')) {
-      remarketingListExpression =
-          ListTargetingExpression.fromJson(_json['remarketingListExpression']);
+      remarketingListExpression = ListTargetingExpression.fromJson(
+          _json['remarketingListExpression']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sslCompliant')) {
       sslCompliant = _json['sslCompliant'] as core.bool;
@@ -16062,8 +16620,8 @@
       targetingTemplateId = _json['targetingTemplateId'] as core.String;
     }
     if (_json.containsKey('technologyTargeting')) {
-      technologyTargeting =
-          TechnologyTargeting.fromJson(_json['technologyTargeting']);
+      technologyTargeting = TechnologyTargeting.fromJson(
+          _json['technologyTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -16373,7 +16931,8 @@
   AdsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('ads')) {
       ads = (_json['ads'] as core.List)
-          .map<Ad>((value) => Ad.fromJson(value))
+          .map<Ad>((value) =>
+              Ad.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -16497,13 +17056,15 @@
     }
     if (_json.containsKey('floodlightConfigurationIdDimensionValue')) {
       floodlightConfigurationIdDimensionValue = DimensionValue.fromJson(
-          _json['floodlightConfigurationIdDimensionValue']);
+          _json['floodlightConfigurationIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -16650,7 +17211,8 @@
   AdvertiserGroupsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('advertiserGroups')) {
       advertiserGroups = (_json['advertiserGroups'] as core.List)
-          .map<AdvertiserGroup>((value) => AdvertiserGroup.fromJson(value))
+          .map<AdvertiserGroup>((value) => AdvertiserGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -16697,7 +17259,8 @@
     }
     if (_json.containsKey('landingPages')) {
       landingPages = (_json['landingPages'] as core.List)
-          .map<LandingPage>((value) => LandingPage.fromJson(value))
+          .map<LandingPage>((value) => LandingPage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -16738,7 +17301,8 @@
   AdvertisersListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('advertisers')) {
       advertisers = (_json['advertisers'] as core.List)
-          .map<Advertiser>((value) => Advertiser.fromJson(value))
+          .map<Advertiser>((value) =>
+              Advertiser.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -16827,7 +17391,8 @@
   AudienceSegmentGroup.fromJson(core.Map _json) {
     if (_json.containsKey('audienceSegments')) {
       audienceSegments = (_json['audienceSegments'] as core.List)
-          .map<AudienceSegment>((value) => AudienceSegment.fromJson(value))
+          .map<AudienceSegment>((value) => AudienceSegment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -16951,7 +17516,8 @@
   BrowsersListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('browsers')) {
       browsers = (_json['browsers'] as core.List)
-          .map<Browser>((value) => Browser.fromJson(value))
+          .map<Browser>((value) =>
+              Browser.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17073,14 +17639,16 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('adBlockingConfiguration')) {
-      adBlockingConfiguration =
-          AdBlockingConfiguration.fromJson(_json['adBlockingConfiguration']);
+      adBlockingConfiguration = AdBlockingConfiguration.fromJson(
+          _json['adBlockingConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('additionalCreativeOptimizationConfigurations')) {
       additionalCreativeOptimizationConfigurations =
           (_json['additionalCreativeOptimizationConfigurations'] as core.List)
-              .map<CreativeOptimizationConfiguration>(
-                  (value) => CreativeOptimizationConfiguration.fromJson(value))
+              .map<CreativeOptimizationConfiguration>((value) =>
+                  CreativeOptimizationConfiguration.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('advertiserGroupId')) {
@@ -17090,16 +17658,17 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('archived')) {
       archived = _json['archived'] as core.bool;
     }
     if (_json.containsKey('audienceSegmentGroups')) {
       audienceSegmentGroups = (_json['audienceSegmentGroups'] as core.List)
-          .map<AudienceSegmentGroup>(
-              (value) => AudienceSegmentGroup.fromJson(value))
+          .map<AudienceSegmentGroup>((value) => AudienceSegmentGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('billingInvoiceCode')) {
@@ -17108,13 +17677,15 @@
     if (_json.containsKey('clickThroughUrlSuffixProperties')) {
       clickThroughUrlSuffixProperties =
           ClickThroughUrlSuffixProperties.fromJson(
-              _json['clickThroughUrlSuffixProperties']);
+              _json['clickThroughUrlSuffixProperties']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('comment')) {
       comment = _json['comment'] as core.String;
     }
     if (_json.containsKey('createInfo')) {
-      createInfo = LastModifiedInfo.fromJson(_json['createInfo']);
+      createInfo = LastModifiedInfo.fromJson(
+          _json['createInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creativeGroupIds')) {
       creativeGroupIds = (_json['creativeGroupIds'] as core.List)
@@ -17124,12 +17695,14 @@
     if (_json.containsKey('creativeOptimizationConfiguration')) {
       creativeOptimizationConfiguration =
           CreativeOptimizationConfiguration.fromJson(
-              _json['creativeOptimizationConfiguration']);
+              _json['creativeOptimizationConfiguration']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultClickThroughEventTagProperties')) {
       defaultClickThroughEventTagProperties =
           DefaultClickThroughEventTagProperties.fromJson(
-              _json['defaultClickThroughEventTagProperties']);
+              _json['defaultClickThroughEventTagProperties']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultLandingPageId')) {
       defaultLandingPageId = _json['defaultLandingPageId'] as core.String;
@@ -17139,7 +17712,8 @@
     }
     if (_json.containsKey('eventTagOverrides')) {
       eventTagOverrides = (_json['eventTagOverrides'] as core.List)
-          .map<EventTagOverride>((value) => EventTagOverride.fromJson(value))
+          .map<EventTagOverride>((value) => EventTagOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('externalId')) {
@@ -17149,13 +17723,15 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -17326,8 +17902,9 @@
     if (_json.containsKey('campaignCreativeAssociations')) {
       campaignCreativeAssociations =
           (_json['campaignCreativeAssociations'] as core.List)
-              .map<CampaignCreativeAssociation>(
-                  (value) => CampaignCreativeAssociation.fromJson(value))
+              .map<CampaignCreativeAssociation>((value) =>
+                  CampaignCreativeAssociation.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17439,7 +18016,8 @@
   CampaignsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('campaigns')) {
       campaigns = (_json['campaigns'] as core.List)
-          .map<Campaign>((value) => Campaign.fromJson(value))
+          .map<Campaign>((value) =>
+              Campaign.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17623,7 +18201,8 @@
   ChangeLogsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('changeLogs')) {
       changeLogs = (_json['changeLogs'] as core.List)
-          .map<ChangeLog>((value) => ChangeLog.fromJson(value))
+          .map<ChangeLog>((value) =>
+              ChangeLog.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17677,8 +18256,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<ChannelGroupingRule>(
-              (value) => ChannelGroupingRule.fromJson(value))
+          .map<ChannelGroupingRule>((value) => ChannelGroupingRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17719,8 +18298,9 @@
     if (_json.containsKey('disjunctiveMatchStatements')) {
       disjunctiveMatchStatements =
           (_json['disjunctiveMatchStatements'] as core.List)
-              .map<DisjunctiveMatchStatement>(
-                  (value) => DisjunctiveMatchStatement.fromJson(value))
+              .map<DisjunctiveMatchStatement>((value) =>
+                  DisjunctiveMatchStatement.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17761,7 +18341,8 @@
   CitiesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('cities')) {
       cities = (_json['cities'] as core.List)
-          .map<City>((value) => City.fromJson(value))
+          .map<City>((value) =>
+              City.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17897,8 +18478,8 @@
 
   ClickTag.fromJson(core.Map _json) {
     if (_json.containsKey('clickThroughUrl')) {
-      clickThroughUrl =
-          CreativeClickThroughUrl.fromJson(_json['clickThroughUrl']);
+      clickThroughUrl = CreativeClickThroughUrl.fromJson(
+          _json['clickThroughUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('eventName')) {
       eventName = _json['eventName'] as core.String;
@@ -18025,7 +18606,8 @@
 
   CompanionClickThroughOverride.fromJson(core.Map _json) {
     if (_json.containsKey('clickThroughUrl')) {
-      clickThroughUrl = ClickThroughUrl.fromJson(_json['clickThroughUrl']);
+      clickThroughUrl = ClickThroughUrl.fromJson(
+          _json['clickThroughUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creativeId')) {
       creativeId = _json['creativeId'] as core.String;
@@ -18068,7 +18650,8 @@
     }
     if (_json.containsKey('enabledSizes')) {
       enabledSizes = (_json['enabledSizes'] as core.List)
-          .map<Size>((value) => Size.fromJson(value))
+          .map<Size>((value) =>
+              Size.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imageOnly')) {
@@ -18138,12 +18721,14 @@
     if (_json.containsKey('crossDimensionReachReportCompatibleFields')) {
       crossDimensionReachReportCompatibleFields =
           CrossDimensionReachReportCompatibleFields.fromJson(
-              _json['crossDimensionReachReportCompatibleFields']);
+              _json['crossDimensionReachReportCompatibleFields']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('floodlightReportCompatibleFields')) {
       floodlightReportCompatibleFields =
           FloodlightReportCompatibleFields.fromJson(
-              _json['floodlightReportCompatibleFields']);
+              _json['floodlightReportCompatibleFields']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -18151,24 +18736,29 @@
     if (_json.containsKey('pathAttributionReportCompatibleFields')) {
       pathAttributionReportCompatibleFields =
           PathReportCompatibleFields.fromJson(
-              _json['pathAttributionReportCompatibleFields']);
+              _json['pathAttributionReportCompatibleFields']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pathReportCompatibleFields')) {
       pathReportCompatibleFields = PathReportCompatibleFields.fromJson(
-          _json['pathReportCompatibleFields']);
+          _json['pathReportCompatibleFields']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pathToConversionReportCompatibleFields')) {
       pathToConversionReportCompatibleFields =
           PathToConversionReportCompatibleFields.fromJson(
-              _json['pathToConversionReportCompatibleFields']);
+              _json['pathToConversionReportCompatibleFields']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reachReportCompatibleFields')) {
       reachReportCompatibleFields = ReachReportCompatibleFields.fromJson(
-          _json['reachReportCompatibleFields']);
+          _json['reachReportCompatibleFields']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reportCompatibleFields')) {
-      reportCompatibleFields =
-          ReportCompatibleFields.fromJson(_json['reportCompatibleFields']);
+      reportCompatibleFields = ReportCompatibleFields.fromJson(
+          _json['reportCompatibleFields']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -18264,7 +18854,8 @@
   ConnectionTypesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('connectionTypes')) {
       connectionTypes = (_json['connectionTypes'] as core.List)
-          .map<ConnectionType>((value) => ConnectionType.fromJson(value))
+          .map<ConnectionType>((value) => ConnectionType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -18302,7 +18893,8 @@
   ContentCategoriesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('contentCategories')) {
       contentCategories = (_json['contentCategories'] as core.List)
-          .map<ContentCategory>((value) => ContentCategory.fromJson(value))
+          .map<ContentCategory>((value) => ContentCategory.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -18480,8 +19072,9 @@
     }
     if (_json.containsKey('customVariables')) {
       customVariables = (_json['customVariables'] as core.List)
-          .map<CustomFloodlightVariable>(
-              (value) => CustomFloodlightVariable.fromJson(value))
+          .map<CustomFloodlightVariable>((value) =>
+              CustomFloodlightVariable.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dclid')) {
@@ -18663,11 +19256,13 @@
 
   ConversionStatus.fromJson(core.Map _json) {
     if (_json.containsKey('conversion')) {
-      conversion = Conversion.fromJson(_json['conversion']);
+      conversion = Conversion.fromJson(
+          _json['conversion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<ConversionError>((value) => ConversionError.fromJson(value))
+          .map<ConversionError>((value) => ConversionError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -18709,11 +19304,13 @@
   ConversionsBatchInsertRequest.fromJson(core.Map _json) {
     if (_json.containsKey('conversions')) {
       conversions = (_json['conversions'] as core.List)
-          .map<Conversion>((value) => Conversion.fromJson(value))
+          .map<Conversion>((value) =>
+              Conversion.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('encryptionInfo')) {
-      encryptionInfo = EncryptionInfo.fromJson(_json['encryptionInfo']);
+      encryptionInfo = EncryptionInfo.fromJson(
+          _json['encryptionInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -18760,7 +19357,8 @@
     }
     if (_json.containsKey('status')) {
       status = (_json['status'] as core.List)
-          .map<ConversionStatus>((value) => ConversionStatus.fromJson(value))
+          .map<ConversionStatus>((value) => ConversionStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18798,11 +19396,13 @@
   ConversionsBatchUpdateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('conversions')) {
       conversions = (_json['conversions'] as core.List)
-          .map<Conversion>((value) => Conversion.fromJson(value))
+          .map<Conversion>((value) =>
+              Conversion.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('encryptionInfo')) {
-      encryptionInfo = EncryptionInfo.fromJson(_json['encryptionInfo']);
+      encryptionInfo = EncryptionInfo.fromJson(
+          _json['encryptionInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -18849,7 +19449,8 @@
     }
     if (_json.containsKey('status')) {
       status = (_json['status'] as core.List)
-          .map<ConversionStatus>((value) => ConversionStatus.fromJson(value))
+          .map<ConversionStatus>((value) => ConversionStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18883,7 +19484,8 @@
   CountriesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('countries')) {
       countries = (_json['countries'] as core.List)
-          .map<Country>((value) => Country.fromJson(value))
+          .map<Country>((value) =>
+              Country.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -19371,7 +19973,8 @@
     }
     if (_json.containsKey('additionalSizes')) {
       additionalSizes = (_json['additionalSizes'] as core.List)
-          .map<Size>((value) => Size.fromJson(value))
+          .map<Size>((value) =>
+              Size.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('advertiserId')) {
@@ -19399,8 +20002,9 @@
       backgroundColor = _json['backgroundColor'] as core.String;
     }
     if (_json.containsKey('backupImageClickThroughUrl')) {
-      backupImageClickThroughUrl =
-          CreativeClickThroughUrl.fromJson(_json['backupImageClickThroughUrl']);
+      backupImageClickThroughUrl = CreativeClickThroughUrl.fromJson(
+          _json['backupImageClickThroughUrl']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backupImageFeatures')) {
       backupImageFeatures = (_json['backupImageFeatures'] as core.List)
@@ -19412,12 +20016,14 @@
           _json['backupImageReportingLabel'] as core.String;
     }
     if (_json.containsKey('backupImageTargetWindow')) {
-      backupImageTargetWindow =
-          TargetWindow.fromJson(_json['backupImageTargetWindow']);
+      backupImageTargetWindow = TargetWindow.fromJson(
+          _json['backupImageTargetWindow']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clickTags')) {
       clickTags = (_json['clickTags'] as core.List)
-          .map<ClickTag>((value) => ClickTag.fromJson(value))
+          .map<ClickTag>((value) =>
+              ClickTag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('commercialId')) {
@@ -19438,24 +20044,27 @@
     }
     if (_json.containsKey('counterCustomEvents')) {
       counterCustomEvents = (_json['counterCustomEvents'] as core.List)
-          .map<CreativeCustomEvent>(
-              (value) => CreativeCustomEvent.fromJson(value))
+          .map<CreativeCustomEvent>((value) => CreativeCustomEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creativeAssetSelection')) {
-      creativeAssetSelection =
-          CreativeAssetSelection.fromJson(_json['creativeAssetSelection']);
+      creativeAssetSelection = CreativeAssetSelection.fromJson(
+          _json['creativeAssetSelection']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creativeAssets')) {
       creativeAssets = (_json['creativeAssets'] as core.List)
-          .map<CreativeAsset>((value) => CreativeAsset.fromJson(value))
+          .map<CreativeAsset>((value) => CreativeAsset.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creativeFieldAssignments')) {
       creativeFieldAssignments =
           (_json['creativeFieldAssignments'] as core.List)
-              .map<CreativeFieldAssignment>(
-                  (value) => CreativeFieldAssignment.fromJson(value))
+              .map<CreativeFieldAssignment>((value) =>
+                  CreativeFieldAssignment.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('customKeyValues')) {
@@ -19468,12 +20077,13 @@
     }
     if (_json.containsKey('exitCustomEvents')) {
       exitCustomEvents = (_json['exitCustomEvents'] as core.List)
-          .map<CreativeCustomEvent>(
-              (value) => CreativeCustomEvent.fromJson(value))
+          .map<CreativeCustomEvent>((value) => CreativeCustomEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fsCommand')) {
-      fsCommand = FsCommand.fromJson(_json['fsCommand']);
+      fsCommand = FsCommand.fromJson(
+          _json['fsCommand'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('htmlCode')) {
       htmlCode = _json['htmlCode'] as core.String;
@@ -19485,13 +20095,15 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('latestTraffickedCreativeId')) {
       latestTraffickedCreativeId =
@@ -19507,13 +20119,15 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('obaIcon')) {
-      obaIcon = ObaIcon.fromJson(_json['obaIcon']);
+      obaIcon = ObaIcon.fromJson(
+          _json['obaIcon'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('overrideCss')) {
       overrideCss = _json['overrideCss'] as core.String;
     }
     if (_json.containsKey('progressOffset')) {
-      progressOffset = VideoOffset.fromJson(_json['progressOffset']);
+      progressOffset = VideoOffset.fromJson(
+          _json['progressOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('redirectUrl')) {
       redirectUrl = _json['redirectUrl'] as core.String;
@@ -19522,8 +20136,9 @@
       renderingId = _json['renderingId'] as core.String;
     }
     if (_json.containsKey('renderingIdDimensionValue')) {
-      renderingIdDimensionValue =
-          DimensionValue.fromJson(_json['renderingIdDimensionValue']);
+      renderingIdDimensionValue = DimensionValue.fromJson(
+          _json['renderingIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requiredFlashPluginVersion')) {
       requiredFlashPluginVersion =
@@ -19533,10 +20148,12 @@
       requiredFlashVersion = _json['requiredFlashVersion'] as core.int;
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skipOffset')) {
-      skipOffset = VideoOffset.fromJson(_json['skipOffset']);
+      skipOffset = VideoOffset.fromJson(
+          _json['skipOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skippable')) {
       skippable = _json['skippable'] as core.bool;
@@ -19570,14 +20187,14 @@
     }
     if (_json.containsKey('thirdPartyUrls')) {
       thirdPartyUrls = (_json['thirdPartyUrls'] as core.List)
-          .map<ThirdPartyTrackingUrl>(
-              (value) => ThirdPartyTrackingUrl.fromJson(value))
+          .map<ThirdPartyTrackingUrl>((value) => ThirdPartyTrackingUrl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timerCustomEvents')) {
       timerCustomEvents = (_json['timerCustomEvents'] as core.List)
-          .map<CreativeCustomEvent>(
-              (value) => CreativeCustomEvent.fromJson(value))
+          .map<CreativeCustomEvent>((value) => CreativeCustomEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalFileSize')) {
@@ -19587,7 +20204,8 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('universalAdId')) {
-      universalAdId = UniversalAdId.fromJson(_json['universalAdId']);
+      universalAdId = UniversalAdId.fromJson(
+          _json['universalAdId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
       version = _json['version'] as core.int;
@@ -20139,7 +20757,8 @@
     }
     if (_json.containsKey('additionalSizes')) {
       additionalSizes = (_json['additionalSizes'] as core.List)
-          .map<Size>((value) => Size.fromJson(value))
+          .map<Size>((value) =>
+              Size.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('alignment')) {
@@ -20149,7 +20768,8 @@
       artworkType = _json['artworkType'] as core.String;
     }
     if (_json.containsKey('assetIdentifier')) {
-      assetIdentifier = CreativeAssetId.fromJson(_json['assetIdentifier']);
+      assetIdentifier = CreativeAssetId.fromJson(
+          _json['assetIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('audioBitRate')) {
       audioBitRate = _json['audioBitRate'] as core.int;
@@ -20158,7 +20778,8 @@
       audioSampleRate = _json['audioSampleRate'] as core.int;
     }
     if (_json.containsKey('backupImageExit')) {
-      backupImageExit = CreativeCustomEvent.fromJson(_json['backupImageExit']);
+      backupImageExit = CreativeCustomEvent.fromJson(
+          _json['backupImageExit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bitRate')) {
       bitRate = _json['bitRate'] as core.int;
@@ -20167,7 +20788,8 @@
       childAssetType = _json['childAssetType'] as core.String;
     }
     if (_json.containsKey('collapsedSize')) {
-      collapsedSize = Size.fromJson(_json['collapsedSize']);
+      collapsedSize = Size.fromJson(
+          _json['collapsedSize'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('companionCreativeIds')) {
       companionCreativeIds = (_json['companionCreativeIds'] as core.List)
@@ -20192,7 +20814,8 @@
       durationType = _json['durationType'] as core.String;
     }
     if (_json.containsKey('expandedDimension')) {
-      expandedDimension = Size.fromJson(_json['expandedDimension']);
+      expandedDimension = Size.fromJson(
+          _json['expandedDimension'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileSize')) {
       fileSize = _json['fileSize'] as core.String;
@@ -20216,7 +20839,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mediaDuration')) {
       mediaDuration = (_json['mediaDuration'] as core.num).toDouble();
@@ -20225,7 +20849,8 @@
       mimeType = _json['mimeType'] as core.String;
     }
     if (_json.containsKey('offset')) {
-      offset = OffsetPosition.fromJson(_json['offset']);
+      offset = OffsetPosition.fromJson(
+          _json['offset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('orientation')) {
       orientation = _json['orientation'] as core.String;
@@ -20237,7 +20862,8 @@
       politeLoad = _json['politeLoad'] as core.bool;
     }
     if (_json.containsKey('position')) {
-      position = OffsetPosition.fromJson(_json['position']);
+      position = OffsetPosition.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positionLeftUnit')) {
       positionLeftUnit = _json['positionLeftUnit'] as core.String;
@@ -20258,7 +20884,8 @@
       role = _json['role'] as core.String;
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sslCompliant')) {
       sslCompliant = _json['sslCompliant'] as core.bool;
@@ -20549,17 +21176,19 @@
 
   CreativeAssetMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('assetIdentifier')) {
-      assetIdentifier = CreativeAssetId.fromJson(_json['assetIdentifier']);
+      assetIdentifier = CreativeAssetId.fromJson(
+          _json['assetIdentifier'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clickTags')) {
       clickTags = (_json['clickTags'] as core.List)
-          .map<ClickTag>((value) => ClickTag.fromJson(value))
+          .map<ClickTag>((value) =>
+              ClickTag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('counterCustomEvents')) {
       counterCustomEvents = (_json['counterCustomEvents'] as core.List)
-          .map<CreativeCustomEvent>(
-              (value) => CreativeCustomEvent.fromJson(value))
+          .map<CreativeCustomEvent>((value) => CreativeCustomEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('detectedFeatures')) {
@@ -20569,15 +21198,16 @@
     }
     if (_json.containsKey('exitCustomEvents')) {
       exitCustomEvents = (_json['exitCustomEvents'] as core.List)
-          .map<CreativeCustomEvent>(
-              (value) => CreativeCustomEvent.fromJson(value))
+          .map<CreativeCustomEvent>((value) => CreativeCustomEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -20587,8 +21217,8 @@
     }
     if (_json.containsKey('timerCustomEvents')) {
       timerCustomEvents = (_json['timerCustomEvents'] as core.List)
-          .map<CreativeCustomEvent>(
-              (value) => CreativeCustomEvent.fromJson(value))
+          .map<CreativeCustomEvent>((value) => CreativeCustomEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warnedValidationRules')) {
@@ -20661,7 +21291,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<Rule>((value) => Rule.fromJson(value))
+          .map<Rule>((value) =>
+              Rule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -20742,36 +21373,40 @@
       applyEventTags = _json['applyEventTags'] as core.bool;
     }
     if (_json.containsKey('clickThroughUrl')) {
-      clickThroughUrl = ClickThroughUrl.fromJson(_json['clickThroughUrl']);
+      clickThroughUrl = ClickThroughUrl.fromJson(
+          _json['clickThroughUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('companionCreativeOverrides')) {
       companionCreativeOverrides =
           (_json['companionCreativeOverrides'] as core.List)
-              .map<CompanionClickThroughOverride>(
-                  (value) => CompanionClickThroughOverride.fromJson(value))
+              .map<CompanionClickThroughOverride>((value) =>
+                  CompanionClickThroughOverride.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('creativeGroupAssignments')) {
       creativeGroupAssignments =
           (_json['creativeGroupAssignments'] as core.List)
-              .map<CreativeGroupAssignment>(
-                  (value) => CreativeGroupAssignment.fromJson(value))
+              .map<CreativeGroupAssignment>((value) =>
+                  CreativeGroupAssignment.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('creativeId')) {
       creativeId = _json['creativeId'] as core.String;
     }
     if (_json.containsKey('creativeIdDimensionValue')) {
-      creativeIdDimensionValue =
-          DimensionValue.fromJson(_json['creativeIdDimensionValue']);
+      creativeIdDimensionValue = DimensionValue.fromJson(
+          _json['creativeIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = core.DateTime.parse(_json['endTime'] as core.String);
     }
     if (_json.containsKey('richMediaExitOverrides')) {
       richMediaExitOverrides = (_json['richMediaExitOverrides'] as core.List)
-          .map<RichMediaExitOverride>(
-              (value) => RichMediaExitOverride.fromJson(value))
+          .map<RichMediaExitOverride>((value) => RichMediaExitOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sequence')) {
@@ -20955,15 +21590,16 @@
       artworkType = _json['artworkType'] as core.String;
     }
     if (_json.containsKey('exitClickThroughUrl')) {
-      exitClickThroughUrl =
-          CreativeClickThroughUrl.fromJson(_json['exitClickThroughUrl']);
+      exitClickThroughUrl = CreativeClickThroughUrl.fromJson(
+          _json['exitClickThroughUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('popupWindowProperties')) {
-      popupWindowProperties =
-          PopupWindowProperties.fromJson(_json['popupWindowProperties']);
+      popupWindowProperties = PopupWindowProperties.fromJson(
+          _json['popupWindowProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetType')) {
       targetType = _json['targetType'] as core.String;
@@ -21049,8 +21685,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -21184,8 +21821,8 @@
   CreativeFieldValuesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('creativeFieldValues')) {
       creativeFieldValues = (_json['creativeFieldValues'] as core.List)
-          .map<CreativeFieldValue>(
-              (value) => CreativeFieldValue.fromJson(value))
+          .map<CreativeFieldValue>((value) => CreativeFieldValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -21229,7 +21866,8 @@
   CreativeFieldsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('creativeFields')) {
       creativeFields = (_json['creativeFields'] as core.List)
-          .map<CreativeField>((value) => CreativeField.fromJson(value))
+          .map<CreativeField>((value) => CreativeField.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -21302,8 +21940,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupNumber')) {
       groupNumber = _json['groupNumber'] as core.int;
@@ -21403,7 +22042,8 @@
   CreativeGroupsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('creativeGroups')) {
       creativeGroups = (_json['creativeGroups'] as core.List)
-          .map<CreativeGroup>((value) => CreativeGroup.fromJson(value))
+          .map<CreativeGroup>((value) => CreativeGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -21464,8 +22104,8 @@
     }
     if (_json.containsKey('optimizationActivitys')) {
       optimizationActivitys = (_json['optimizationActivitys'] as core.List)
-          .map<OptimizationActivity>(
-              (value) => OptimizationActivity.fromJson(value))
+          .map<OptimizationActivity>((value) => OptimizationActivity.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('optimizationModel')) {
@@ -21523,8 +22163,8 @@
   CreativeRotation.fromJson(core.Map _json) {
     if (_json.containsKey('creativeAssignments')) {
       creativeAssignments = (_json['creativeAssignments'] as core.List)
-          .map<CreativeAssignment>(
-              (value) => CreativeAssignment.fromJson(value))
+          .map<CreativeAssignment>((value) => CreativeAssignment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creativeOptimizationConfigurationId')) {
@@ -21577,7 +22217,8 @@
   CreativesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('creatives')) {
       creatives = (_json['creatives'] as core.List)
-          .map<Creative>((value) => Creative.fromJson(value))
+          .map<Creative>((value) =>
+              Creative.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -21631,12 +22272,14 @@
   CrossDimensionReachReportCompatibleFields.fromJson(core.Map _json) {
     if (_json.containsKey('breakdown')) {
       breakdown = (_json['breakdown'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -21644,12 +22287,14 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('overlapMetrics')) {
       overlapMetrics = (_json['overlapMetrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21727,16 +22372,18 @@
 
   CustomEvent.fromJson(core.Map _json) {
     if (_json.containsKey('annotateClickEvent')) {
-      annotateClickEvent =
-          CustomEventClickAnnotation.fromJson(_json['annotateClickEvent']);
+      annotateClickEvent = CustomEventClickAnnotation.fromJson(
+          _json['annotateClickEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annotateImpressionEvent')) {
       annotateImpressionEvent = CustomEventImpressionAnnotation.fromJson(
-          _json['annotateImpressionEvent']);
+          _json['annotateImpressionEvent']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customVariables')) {
       customVariables = (_json['customVariables'] as core.List)
-          .map<CustomVariable>((value) => CustomVariable.fromJson(value))
+          .map<CustomVariable>((value) => CustomVariable.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('eventType')) {
@@ -21747,7 +22394,8 @@
           _json['floodlightConfigurationId'] as core.String;
     }
     if (_json.containsKey('insertEvent')) {
-      insertEvent = CustomEventInsert.fromJson(_json['insertEvent']);
+      insertEvent = CustomEventInsert.fromJson(
+          _json['insertEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -21940,10 +22588,12 @@
 
   CustomEventInsert.fromJson(core.Map _json) {
     if (_json.containsKey('cmDimensions')) {
-      cmDimensions = CampaignManagerIds.fromJson(_json['cmDimensions']);
+      cmDimensions = CampaignManagerIds.fromJson(
+          _json['cmDimensions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dv3Dimensions')) {
-      dv3Dimensions = DV3Ids.fromJson(_json['dv3Dimensions']);
+      dv3Dimensions = DV3Ids.fromJson(
+          _json['dv3Dimensions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertEventType')) {
       insertEventType = _json['insertEventType'] as core.String;
@@ -22000,11 +22650,13 @@
 
   CustomEventStatus.fromJson(core.Map _json) {
     if (_json.containsKey('customEvent')) {
-      customEvent = CustomEvent.fromJson(_json['customEvent']);
+      customEvent = CustomEvent.fromJson(
+          _json['customEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<CustomEventError>((value) => CustomEventError.fromJson(value))
+          .map<CustomEventError>((value) => CustomEventError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -22041,7 +22693,8 @@
   CustomEventsBatchInsertRequest.fromJson(core.Map _json) {
     if (_json.containsKey('customEvents')) {
       customEvents = (_json['customEvents'] as core.List)
-          .map<CustomEvent>((value) => CustomEvent.fromJson(value))
+          .map<CustomEvent>((value) => CustomEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -22086,7 +22739,8 @@
     }
     if (_json.containsKey('status')) {
       status = (_json['status'] as core.List)
-          .map<CustomEventStatus>((value) => CustomEventStatus.fromJson(value))
+          .map<CustomEventStatus>((value) => CustomEventStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -22265,7 +22919,8 @@
   CustomRichMediaEvents.fromJson(core.Map _json) {
     if (_json.containsKey('filteredEventIds')) {
       filteredEventIds = (_json['filteredEventIds'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -22343,8 +22998,8 @@
 
   CustomViewabilityMetric.fromJson(core.Map _json) {
     if (_json.containsKey('configuration')) {
-      configuration =
-          CustomViewabilityMetricConfiguration.fromJson(_json['configuration']);
+      configuration = CustomViewabilityMetricConfiguration.fromJson(
+          _json['configuration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -22643,7 +23298,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('mobileApp')) {
-      mobileApp = MobileApp.fromJson(_json['mobileApp']);
+      mobileApp = MobileApp.fromJson(
+          _json['mobileApp'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('remarketingListIds')) {
       remarketingListIds = (_json['remarketingListIds'] as core.List)
@@ -22753,7 +23409,8 @@
 
   DeliverySchedule.fromJson(core.Map _json) {
     if (_json.containsKey('frequencyCap')) {
-      frequencyCap = FrequencyCap.fromJson(_json['frequencyCap']);
+      frequencyCap = FrequencyCap.fromJson(
+          _json['frequencyCap'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hardCutoff')) {
       hardCutoff = _json['hardCutoff'] as core.bool;
@@ -23015,7 +23672,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -23069,7 +23727,8 @@
     }
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<DimensionFilter>((value) => DimensionFilter.fromJson(value))
+          .map<DimensionFilter>((value) => DimensionFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -23144,7 +23803,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inpageTagFormats')) {
       inpageTagFormats = (_json['inpageTagFormats'] as core.List)
@@ -23163,7 +23823,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('settings')) {
-      settings = DirectorySiteSettings.fromJson(_json['settings']);
+      settings = DirectorySiteSettings.fromJson(
+          _json['settings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -23221,7 +23882,8 @@
       activeViewOptOut = _json['activeViewOptOut'] as core.bool;
     }
     if (_json.containsKey('dfpSettings')) {
-      dfpSettings = DfpSettings.fromJson(_json['dfpSettings']);
+      dfpSettings = DfpSettings.fromJson(
+          _json['dfpSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('instreamVideoPlacementAccepted')) {
       instreamVideoPlacementAccepted =
@@ -23268,7 +23930,8 @@
   DirectorySitesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('directorySites')) {
       directorySites = (_json['directorySites'] as core.List)
-          .map<DirectorySite>((value) => DirectorySite.fromJson(value))
+          .map<DirectorySite>((value) => DirectorySite.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -23310,7 +23973,8 @@
   DisjunctiveMatchStatement.fromJson(core.Map _json) {
     if (_json.containsKey('eventFilters')) {
       eventFilters = (_json['eventFilters'] as core.List)
-          .map<EventFilter>((value) => EventFilter.fromJson(value))
+          .map<EventFilter>((value) => EventFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -23408,8 +24072,8 @@
   DynamicTargetingKeysListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dynamicTargetingKeys')) {
       dynamicTargetingKeys = (_json['dynamicTargetingKeys'] as core.List)
-          .map<DynamicTargetingKey>(
-              (value) => DynamicTargetingKey.fromJson(value))
+          .map<DynamicTargetingKey>((value) => DynamicTargetingKey.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -23507,8 +24171,8 @@
 
   EventFilter.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionFilter')) {
-      dimensionFilter =
-          PathReportDimensionValue.fromJson(_json['dimensionFilter']);
+      dimensionFilter = PathReportDimensionValue.fromJson(
+          _json['dimensionFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -23624,15 +24288,17 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('campaignId')) {
       campaignId = _json['campaignId'] as core.String;
     }
     if (_json.containsKey('campaignIdDimensionValue')) {
-      campaignIdDimensionValue =
-          DimensionValue.fromJson(_json['campaignIdDimensionValue']);
+      campaignIdDimensionValue = DimensionValue.fromJson(
+          _json['campaignIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enabledByDefault')) {
       enabledByDefault = _json['enabledByDefault'] as core.bool;
@@ -23782,7 +24448,8 @@
   EventTagsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('eventTags')) {
       eventTags = (_json['eventTags'] as core.List)
-          .map<EventTag>((value) => EventTag.fromJson(value))
+          .map<EventTag>((value) =>
+              EventTag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -23883,7 +24550,8 @@
 
   File.fromJson(core.Map _json) {
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -23910,7 +24578,8 @@
       status = _json['status'] as core.String;
     }
     if (_json.containsKey('urls')) {
-      urls = FileUrls.fromJson(_json['urls']);
+      urls = FileUrls.fromJson(
+          _json['urls'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -23976,7 +24645,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<File>((value) => File.fromJson(value))
+          .map<File>((value) =>
+              File.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -24115,8 +24785,8 @@
   FloodlightActivitiesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('floodlightActivities')) {
       floodlightActivities = (_json['floodlightActivities'] as core.List)
-          .map<FloodlightActivity>(
-              (value) => FloodlightActivity.fromJson(value))
+          .map<FloodlightActivity>((value) => FloodlightActivity.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -24303,8 +24973,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('attributionEnabled')) {
       attributionEnabled = _json['attributionEnabled'] as core.bool;
@@ -24317,8 +24988,9 @@
     }
     if (_json.containsKey('defaultTags')) {
       defaultTags = (_json['defaultTags'] as core.List)
-          .map<FloodlightActivityDynamicTag>(
-              (value) => FloodlightActivityDynamicTag.fromJson(value))
+          .map<FloodlightActivityDynamicTag>((value) =>
+              FloodlightActivityDynamicTag.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('expectedUrl')) {
@@ -24346,7 +25018,8 @@
     }
     if (_json.containsKey('floodlightConfigurationIdDimensionValue')) {
       floodlightConfigurationIdDimensionValue = DimensionValue.fromJson(
-          _json['floodlightConfigurationIdDimensionValue']);
+          _json['floodlightConfigurationIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('floodlightTagType')) {
       floodlightTagType = _json['floodlightTagType'] as core.String;
@@ -24355,7 +25028,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -24368,8 +25042,9 @@
     }
     if (_json.containsKey('publisherTags')) {
       publisherTags = (_json['publisherTags'] as core.List)
-          .map<FloodlightActivityPublisherDynamicTag>(
-              (value) => FloodlightActivityPublisherDynamicTag.fromJson(value))
+          .map<FloodlightActivityPublisherDynamicTag>((value) =>
+              FloodlightActivityPublisherDynamicTag.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('secure')) {
@@ -24607,8 +25282,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('floodlightConfigurationId')) {
       floodlightConfigurationId =
@@ -24616,13 +25292,15 @@
     }
     if (_json.containsKey('floodlightConfigurationIdDimensionValue')) {
       floodlightConfigurationIdDimensionValue = DimensionValue.fromJson(
-          _json['floodlightConfigurationIdDimensionValue']);
+          _json['floodlightConfigurationIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -24702,8 +25380,9 @@
     if (_json.containsKey('floodlightActivityGroups')) {
       floodlightActivityGroups =
           (_json['floodlightActivityGroups'] as core.List)
-              .map<FloodlightActivityGroup>(
-                  (value) => FloodlightActivityGroup.fromJson(value))
+              .map<FloodlightActivityGroup>((value) =>
+                  FloodlightActivityGroup.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('kind')) {
@@ -24763,14 +25442,15 @@
       directorySiteId = _json['directorySiteId'] as core.String;
     }
     if (_json.containsKey('dynamicTag')) {
-      dynamicTag = FloodlightActivityDynamicTag.fromJson(_json['dynamicTag']);
+      dynamicTag = FloodlightActivityDynamicTag.fromJson(
+          _json['dynamicTag'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('siteId')) {
       siteId = _json['siteId'] as core.String;
     }
     if (_json.containsKey('siteIdDimensionValue')) {
-      siteIdDimensionValue =
-          DimensionValue.fromJson(_json['siteIdDimensionValue']);
+      siteIdDimensionValue = DimensionValue.fromJson(
+          _json['siteIdDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('viewThrough')) {
       viewThrough = _json['viewThrough'] as core.bool;
@@ -24883,16 +25563,18 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('analyticsDataSharingEnabled')) {
       analyticsDataSharingEnabled =
           _json['analyticsDataSharingEnabled'] as core.bool;
     }
     if (_json.containsKey('customViewabilityMetric')) {
-      customViewabilityMetric =
-          CustomViewabilityMetric.fromJson(_json['customViewabilityMetric']);
+      customViewabilityMetric = CustomViewabilityMetric.fromJson(
+          _json['customViewabilityMetric']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exposureToConversionEnabled')) {
       exposureToConversionEnabled =
@@ -24905,7 +25587,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inAppAttributionTrackingEnabled')) {
       inAppAttributionTrackingEnabled =
@@ -24915,34 +25598,39 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lookbackConfiguration')) {
-      lookbackConfiguration =
-          LookbackConfiguration.fromJson(_json['lookbackConfiguration']);
+      lookbackConfiguration = LookbackConfiguration.fromJson(
+          _json['lookbackConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('naturalSearchConversionAttributionOption')) {
       naturalSearchConversionAttributionOption =
           _json['naturalSearchConversionAttributionOption'] as core.String;
     }
     if (_json.containsKey('omnitureSettings')) {
-      omnitureSettings = OmnitureSettings.fromJson(_json['omnitureSettings']);
+      omnitureSettings = OmnitureSettings.fromJson(
+          _json['omnitureSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subaccountId')) {
       subaccountId = _json['subaccountId'] as core.String;
     }
     if (_json.containsKey('tagSettings')) {
-      tagSettings = TagSettings.fromJson(_json['tagSettings']);
+      tagSettings = TagSettings.fromJson(
+          _json['tagSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('thirdPartyAuthenticationTokens')) {
       thirdPartyAuthenticationTokens =
           (_json['thirdPartyAuthenticationTokens'] as core.List)
-              .map<ThirdPartyAuthenticationToken>(
-                  (value) => ThirdPartyAuthenticationToken.fromJson(value))
+              .map<ThirdPartyAuthenticationToken>((value) =>
+                  ThirdPartyAuthenticationToken.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('userDefinedVariableConfigurations')) {
       userDefinedVariableConfigurations =
           (_json['userDefinedVariableConfigurations'] as core.List)
-              .map<UserDefinedVariableConfiguration>(
-                  (value) => UserDefinedVariableConfiguration.fromJson(value))
+              .map<UserDefinedVariableConfiguration>((value) =>
+                  UserDefinedVariableConfiguration.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -25029,8 +25717,9 @@
     if (_json.containsKey('floodlightConfigurations')) {
       floodlightConfigurations =
           (_json['floodlightConfigurations'] as core.List)
-              .map<FloodlightConfiguration>(
-                  (value) => FloodlightConfiguration.fromJson(value))
+              .map<FloodlightConfiguration>((value) =>
+                  FloodlightConfiguration.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('kind')) {
@@ -25075,12 +25764,14 @@
   FloodlightReportCompatibleFields.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -25088,7 +25779,8 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -25249,12 +25941,14 @@
   GeoTargeting.fromJson(core.Map _json) {
     if (_json.containsKey('cities')) {
       cities = (_json['cities'] as core.List)
-          .map<City>((value) => City.fromJson(value))
+          .map<City>((value) =>
+              City.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('countries')) {
       countries = (_json['countries'] as core.List)
-          .map<Country>((value) => Country.fromJson(value))
+          .map<Country>((value) =>
+              Country.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('excludeCountries')) {
@@ -25262,17 +25956,20 @@
     }
     if (_json.containsKey('metros')) {
       metros = (_json['metros'] as core.List)
-          .map<Metro>((value) => Metro.fromJson(value))
+          .map<Metro>((value) =>
+              Metro.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('postalCodes')) {
       postalCodes = (_json['postalCodes'] as core.List)
-          .map<PostalCode>((value) => PostalCode.fromJson(value))
+          .map<PostalCode>((value) =>
+              PostalCode.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('regions')) {
       regions = (_json['regions'] as core.List)
-          .map<Region>((value) => Region.fromJson(value))
+          .map<Region>((value) =>
+              Region.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -25381,7 +26078,8 @@
     }
     if (_json.containsKey('adSlots')) {
       adSlots = (_json['adSlots'] as core.List)
-          .map<AdSlot>((value) => AdSlot.fromJson(value))
+          .map<AdSlot>((value) =>
+              AdSlot.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('advertiserId')) {
@@ -25407,7 +26105,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -25422,7 +26121,8 @@
       placementStrategyId = _json['placementStrategyId'] as core.String;
     }
     if (_json.containsKey('pricing')) {
-      pricing = Pricing.fromJson(_json['pricing']);
+      pricing = Pricing.fromJson(
+          _json['pricing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
@@ -25524,7 +26224,8 @@
   InventoryItemsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('inventoryItems')) {
       inventoryItems = (_json['inventoryItems'] as core.List)
-          .map<InventoryItem>((value) => InventoryItem.fromJson(value))
+          .map<InventoryItem>((value) => InventoryItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -25610,7 +26311,8 @@
     }
     if (_json.containsKey('deepLinks')) {
       deepLinks = (_json['deepLinks'] as core.List)
-          .map<DeepLink>((value) => DeepLink.fromJson(value))
+          .map<DeepLink>((value) =>
+              DeepLink.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -25719,7 +26421,8 @@
   LanguageTargeting.fromJson(core.Map _json) {
     if (_json.containsKey('languages')) {
       languages = (_json['languages'] as core.List)
-          .map<Language>((value) => Language.fromJson(value))
+          .map<Language>((value) =>
+              Language.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -25750,7 +26453,8 @@
     }
     if (_json.containsKey('languages')) {
       languages = (_json['languages'] as core.List)
-          .map<Language>((value) => Language.fromJson(value))
+          .map<Language>((value) =>
+              Language.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -25801,8 +26505,8 @@
   ListPopulationClause.fromJson(core.Map _json) {
     if (_json.containsKey('terms')) {
       terms = (_json['terms'] as core.List)
-          .map<ListPopulationTerm>(
-              (value) => ListPopulationTerm.fromJson(value))
+          .map<ListPopulationTerm>((value) => ListPopulationTerm.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -25842,8 +26546,8 @@
     }
     if (_json.containsKey('listPopulationClauses')) {
       listPopulationClauses = (_json['listPopulationClauses'] as core.List)
-          .map<ListPopulationClause>(
-              (value) => ListPopulationClause.fromJson(value))
+          .map<ListPopulationClause>((value) => ListPopulationClause.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -26166,7 +26870,8 @@
     }
     if (_json.containsKey('metros')) {
       metros = (_json['metros'] as core.List)
-          .map<Metro>((value) => Metro.fromJson(value))
+          .map<Metro>((value) =>
+              Metro.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -26266,7 +26971,8 @@
     }
     if (_json.containsKey('mobileApps')) {
       mobileApps = (_json['mobileApps'] as core.List)
-          .map<MobileApp>((value) => MobileApp.fromJson(value))
+          .map<MobileApp>((value) =>
+              MobileApp.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -26365,7 +27071,8 @@
     }
     if (_json.containsKey('mobileCarriers')) {
       mobileCarriers = (_json['mobileCarriers'] as core.List)
-          .map<MobileCarrier>((value) => MobileCarrier.fromJson(value))
+          .map<MobileCarrier>((value) => MobileCarrier.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -26430,7 +27137,8 @@
       resourceUrl = _json['resourceUrl'] as core.String;
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('xPosition')) {
       xPosition = _json['xPosition'] as core.String;
@@ -26686,7 +27394,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('operatingSystem')) {
-      operatingSystem = OperatingSystem.fromJson(_json['operatingSystem']);
+      operatingSystem = OperatingSystem.fromJson(
+          _json['operatingSystem'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -26731,8 +27440,9 @@
     }
     if (_json.containsKey('operatingSystemVersions')) {
       operatingSystemVersions = (_json['operatingSystemVersions'] as core.List)
-          .map<OperatingSystemVersion>(
-              (value) => OperatingSystemVersion.fromJson(value))
+          .map<OperatingSystemVersion>((value) =>
+              OperatingSystemVersion.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -26767,7 +27477,8 @@
     }
     if (_json.containsKey('operatingSystems')) {
       operatingSystems = (_json['operatingSystems'] as core.List)
-          .map<OperatingSystem>((value) => OperatingSystem.fromJson(value))
+          .map<OperatingSystem>((value) => OperatingSystem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -26807,8 +27518,9 @@
       floodlightActivityId = _json['floodlightActivityId'] as core.String;
     }
     if (_json.containsKey('floodlightActivityIdDimensionValue')) {
-      floodlightActivityIdDimensionValue =
-          DimensionValue.fromJson(_json['floodlightActivityIdDimensionValue']);
+      floodlightActivityIdDimensionValue = DimensionValue.fromJson(
+          _json['floodlightActivityIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('weight')) {
       weight = _json['weight'] as core.int;
@@ -26919,7 +27631,8 @@
     }
     if (_json.containsKey('contacts')) {
       contacts = (_json['contacts'] as core.List)
-          .map<OrderContact>((value) => OrderContact.fromJson(value))
+          .map<OrderContact>((value) => OrderContact.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -26929,7 +27642,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -27175,7 +27889,8 @@
       cancelled = _json['cancelled'] as core.bool;
     }
     if (_json.containsKey('createdInfo')) {
-      createdInfo = LastModifiedInfo.fromJson(_json['createdInfo']);
+      createdInfo = LastModifiedInfo.fromJson(
+          _json['createdInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('effectiveDate')) {
       effectiveDate =
@@ -27296,7 +28011,8 @@
     }
     if (_json.containsKey('orderDocuments')) {
       orderDocuments = (_json['orderDocuments'] as core.List)
-          .map<OrderDocument>((value) => OrderDocument.fromJson(value))
+          .map<OrderDocument>((value) => OrderDocument.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -27340,7 +28056,8 @@
     }
     if (_json.containsKey('orders')) {
       orders = (_json['orders'] as core.List)
-          .map<Order>((value) => Order.fromJson(value))
+          .map<Order>((value) =>
+              Order.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -27385,7 +28102,8 @@
   PathFilter.fromJson(core.Map _json) {
     if (_json.containsKey('eventFilters')) {
       eventFilters = (_json['eventFilters'] as core.List)
-          .map<EventFilter>((value) => EventFilter.fromJson(value))
+          .map<EventFilter>((value) => EventFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -27440,12 +28158,14 @@
   PathReportCompatibleFields.fromJson(core.Map _json) {
     if (_json.containsKey('channelGroupings')) {
       channelGroupings = (_json['channelGroupings'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -27453,12 +28173,14 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pathFilters')) {
       pathFilters = (_json['pathFilters'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -27586,28 +28308,32 @@
   PathToConversionReportCompatibleFields.fromJson(core.Map _json) {
     if (_json.containsKey('conversionDimensions')) {
       conversionDimensions = (_json['conversionDimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('customFloodlightVariables')) {
-      customFloodlightVariables =
-          (_json['customFloodlightVariables'] as core.List)
-              .map<Dimension>((value) => Dimension.fromJson(value))
-              .toList();
+      customFloodlightVariables = (_json['customFloodlightVariables']
+              as core.List)
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('perInteractionDimensions')) {
-      perInteractionDimensions =
-          (_json['perInteractionDimensions'] as core.List)
-              .map<Dimension>((value) => Dimension.fromJson(value))
-              .toList();
+      perInteractionDimensions = (_json['perInteractionDimensions']
+              as core.List)
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
   }
 
@@ -27848,15 +28574,17 @@
     }
     if (_json.containsKey('additionalSizes')) {
       additionalSizes = (_json['additionalSizes'] as core.List)
-          .map<Size>((value) => Size.fromJson(value))
+          .map<Size>((value) =>
+              Size.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('advertiserId')) {
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('archived')) {
       archived = _json['archived'] as core.bool;
@@ -27865,8 +28593,9 @@
       campaignId = _json['campaignId'] as core.String;
     }
     if (_json.containsKey('campaignIdDimensionValue')) {
-      campaignIdDimensionValue =
-          DimensionValue.fromJson(_json['campaignIdDimensionValue']);
+      campaignIdDimensionValue = DimensionValue.fromJson(
+          _json['campaignIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('comment')) {
       comment = _json['comment'] as core.String;
@@ -27878,14 +28607,16 @@
       contentCategoryId = _json['contentCategoryId'] as core.String;
     }
     if (_json.containsKey('createInfo')) {
-      createInfo = LastModifiedInfo.fromJson(_json['createInfo']);
+      createInfo = LastModifiedInfo.fromJson(
+          _json['createInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('directorySiteId')) {
       directorySiteId = _json['directorySiteId'] as core.String;
     }
     if (_json.containsKey('directorySiteIdDimensionValue')) {
-      directorySiteIdDimensionValue =
-          DimensionValue.fromJson(_json['directorySiteIdDimensionValue']);
+      directorySiteIdDimensionValue = DimensionValue.fromJson(
+          _json['directorySiteIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('externalId')) {
       externalId = _json['externalId'] as core.String;
@@ -27894,7 +28625,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keyName')) {
       keyName = _json['keyName'] as core.String;
@@ -27903,11 +28635,13 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lookbackConfiguration')) {
-      lookbackConfiguration =
-          LookbackConfiguration.fromJson(_json['lookbackConfiguration']);
+      lookbackConfiguration = LookbackConfiguration.fromJson(
+          _json['lookbackConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -27922,31 +28656,34 @@
       placementGroupId = _json['placementGroupId'] as core.String;
     }
     if (_json.containsKey('placementGroupIdDimensionValue')) {
-      placementGroupIdDimensionValue =
-          DimensionValue.fromJson(_json['placementGroupIdDimensionValue']);
+      placementGroupIdDimensionValue = DimensionValue.fromJson(
+          _json['placementGroupIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('placementStrategyId')) {
       placementStrategyId = _json['placementStrategyId'] as core.String;
     }
     if (_json.containsKey('pricingSchedule')) {
-      pricingSchedule = PricingSchedule.fromJson(_json['pricingSchedule']);
+      pricingSchedule = PricingSchedule.fromJson(
+          _json['pricingSchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('primary')) {
       primary = _json['primary'] as core.bool;
     }
     if (_json.containsKey('publisherUpdateInfo')) {
-      publisherUpdateInfo =
-          LastModifiedInfo.fromJson(_json['publisherUpdateInfo']);
+      publisherUpdateInfo = LastModifiedInfo.fromJson(
+          _json['publisherUpdateInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('siteId')) {
       siteId = _json['siteId'] as core.String;
     }
     if (_json.containsKey('siteIdDimensionValue')) {
-      siteIdDimensionValue =
-          DimensionValue.fromJson(_json['siteIdDimensionValue']);
+      siteIdDimensionValue = DimensionValue.fromJson(
+          _json['siteIdDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sslRequired')) {
       sslRequired = _json['sslRequired'] as core.bool;
@@ -27963,13 +28700,15 @@
           .toList();
     }
     if (_json.containsKey('tagSetting')) {
-      tagSetting = TagSetting.fromJson(_json['tagSetting']);
+      tagSetting = TagSetting.fromJson(
+          _json['tagSetting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('videoActiveViewOptOut')) {
       videoActiveViewOptOut = _json['videoActiveViewOptOut'] as core.bool;
     }
     if (_json.containsKey('videoSettings')) {
-      videoSettings = VideoSettings.fromJson(_json['videoSettings']);
+      videoSettings = VideoSettings.fromJson(
+          _json['videoSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('vpaidAdapterChoice')) {
       vpaidAdapterChoice = _json['vpaidAdapterChoice'] as core.String;
@@ -28135,8 +28874,9 @@
       placementId = _json['placementId'] as core.String;
     }
     if (_json.containsKey('placementIdDimensionValue')) {
-      placementIdDimensionValue =
-          DimensionValue.fromJson(_json['placementIdDimensionValue']);
+      placementIdDimensionValue = DimensionValue.fromJson(
+          _json['placementIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sslRequired')) {
       sslRequired = _json['sslRequired'] as core.bool;
@@ -28282,8 +29022,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('archived')) {
       archived = _json['archived'] as core.bool;
@@ -28292,8 +29033,9 @@
       campaignId = _json['campaignId'] as core.String;
     }
     if (_json.containsKey('campaignIdDimensionValue')) {
-      campaignIdDimensionValue =
-          DimensionValue.fromJson(_json['campaignIdDimensionValue']);
+      campaignIdDimensionValue = DimensionValue.fromJson(
+          _json['campaignIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('childPlacementIds')) {
       childPlacementIds = (_json['childPlacementIds'] as core.List)
@@ -28307,14 +29049,16 @@
       contentCategoryId = _json['contentCategoryId'] as core.String;
     }
     if (_json.containsKey('createInfo')) {
-      createInfo = LastModifiedInfo.fromJson(_json['createInfo']);
+      createInfo = LastModifiedInfo.fromJson(
+          _json['createInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('directorySiteId')) {
       directorySiteId = _json['directorySiteId'] as core.String;
     }
     if (_json.containsKey('directorySiteIdDimensionValue')) {
-      directorySiteIdDimensionValue =
-          DimensionValue.fromJson(_json['directorySiteIdDimensionValue']);
+      directorySiteIdDimensionValue = DimensionValue.fromJson(
+          _json['directorySiteIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('externalId')) {
       externalId = _json['externalId'] as core.String;
@@ -28323,13 +29067,15 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -28341,21 +29087,23 @@
       placementStrategyId = _json['placementStrategyId'] as core.String;
     }
     if (_json.containsKey('pricingSchedule')) {
-      pricingSchedule = PricingSchedule.fromJson(_json['pricingSchedule']);
+      pricingSchedule = PricingSchedule.fromJson(
+          _json['pricingSchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('primaryPlacementId')) {
       primaryPlacementId = _json['primaryPlacementId'] as core.String;
     }
     if (_json.containsKey('primaryPlacementIdDimensionValue')) {
-      primaryPlacementIdDimensionValue =
-          DimensionValue.fromJson(_json['primaryPlacementIdDimensionValue']);
+      primaryPlacementIdDimensionValue = DimensionValue.fromJson(
+          _json['primaryPlacementIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('siteId')) {
       siteId = _json['siteId'] as core.String;
     }
     if (_json.containsKey('siteIdDimensionValue')) {
-      siteIdDimensionValue =
-          DimensionValue.fromJson(_json['siteIdDimensionValue']);
+      siteIdDimensionValue = DimensionValue.fromJson(
+          _json['siteIdDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subaccountId')) {
       subaccountId = _json['subaccountId'] as core.String;
@@ -28471,7 +29219,8 @@
     }
     if (_json.containsKey('placementGroups')) {
       placementGroups = (_json['placementGroups'] as core.List)
-          .map<PlacementGroup>((value) => PlacementGroup.fromJson(value))
+          .map<PlacementGroup>((value) => PlacementGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -28515,7 +29264,8 @@
     }
     if (_json.containsKey('placementStrategies')) {
       placementStrategies = (_json['placementStrategies'] as core.List)
-          .map<PlacementStrategy>((value) => PlacementStrategy.fromJson(value))
+          .map<PlacementStrategy>((value) => PlacementStrategy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -28605,7 +29355,8 @@
     }
     if (_json.containsKey('tagDatas')) {
       tagDatas = (_json['tagDatas'] as core.List)
-          .map<TagData>((value) => TagData.fromJson(value))
+          .map<TagData>((value) =>
+              TagData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -28639,7 +29390,8 @@
     }
     if (_json.containsKey('placementTags')) {
       placementTags = (_json['placementTags'] as core.List)
-          .map<PlacementTag>((value) => PlacementTag.fromJson(value))
+          .map<PlacementTag>((value) => PlacementTag.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -28680,7 +29432,8 @@
     }
     if (_json.containsKey('placements')) {
       placements = (_json['placements'] as core.List)
-          .map<Placement>((value) => Placement.fromJson(value))
+          .map<Placement>((value) =>
+              Placement.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -28758,7 +29511,8 @@
     }
     if (_json.containsKey('platformTypes')) {
       platformTypes = (_json['platformTypes'] as core.List)
-          .map<PlatformType>((value) => PlatformType.fromJson(value))
+          .map<PlatformType>((value) => PlatformType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -28814,10 +29568,12 @@
 
   PopupWindowProperties.fromJson(core.Map _json) {
     if (_json.containsKey('dimension')) {
-      dimension = Size.fromJson(_json['dimension']);
+      dimension = Size.fromJson(
+          _json['dimension'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('offset')) {
-      offset = OffsetPosition.fromJson(_json['offset']);
+      offset = OffsetPosition.fromJson(
+          _json['offset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positionType')) {
       positionType = _json['positionType'] as core.String;
@@ -28951,7 +29707,8 @@
     }
     if (_json.containsKey('postalCodes')) {
       postalCodes = (_json['postalCodes'] as core.List)
-          .map<PostalCode>((value) => PostalCode.fromJson(value))
+          .map<PostalCode>((value) =>
+              PostalCode.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -29021,7 +29778,8 @@
     }
     if (_json.containsKey('flights')) {
       flights = (_json['flights'] as core.List)
-          .map<Flight>((value) => Flight.fromJson(value))
+          .map<Flight>((value) =>
+              Flight.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('groupType')) {
@@ -29111,8 +29869,9 @@
     }
     if (_json.containsKey('pricingPeriods')) {
       pricingPeriods = (_json['pricingPeriods'] as core.List)
-          .map<PricingSchedulePricingPeriod>(
-              (value) => PricingSchedulePricingPeriod.fromJson(value))
+          .map<PricingSchedulePricingPeriod>((value) =>
+              PricingSchedulePricingPeriod.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pricingType')) {
@@ -29333,7 +30092,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifiedInfo')) {
-      lastModifiedInfo = LastModifiedInfo.fromJson(_json['lastModifiedInfo']);
+      lastModifiedInfo = LastModifiedInfo.fromJson(
+          _json['lastModifiedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -29468,7 +30228,8 @@
     }
     if (_json.containsKey('projects')) {
       projects = (_json['projects'] as core.List)
-          .map<Project>((value) => Project.fromJson(value))
+          .map<Project>((value) =>
+              Project.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -29520,12 +30281,14 @@
   ReachReportCompatibleFields.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -29533,17 +30296,20 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pivotedActivityMetrics')) {
       pivotedActivityMetrics = (_json['pivotedActivityMetrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reachByFrequencyMetrics')) {
       reachByFrequencyMetrics = (_json['reachByFrequencyMetrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -29703,7 +30469,8 @@
     }
     if (_json.containsKey('regions')) {
       regions = (_json['regions'] as core.List)
-          .map<Region>((value) => Region.fromJson(value))
+          .map<Region>((value) =>
+              Region.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -29798,8 +30565,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -29814,8 +30582,8 @@
       lifeSpan = _json['lifeSpan'] as core.String;
     }
     if (_json.containsKey('listPopulationRule')) {
-      listPopulationRule =
-          ListPopulationRule.fromJson(_json['listPopulationRule']);
+      listPopulationRule = ListPopulationRule.fromJson(
+          _json['listPopulationRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('listSize')) {
       listSize = _json['listSize'] as core.String;
@@ -29956,7 +30724,8 @@
     }
     if (_json.containsKey('remarketingLists')) {
       remarketingLists = (_json['remarketingLists'] as core.List)
-          .map<RemarketingList>((value) => RemarketingList.fromJson(value))
+          .map<RemarketingList>((value) => RemarketingList.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -30003,23 +30772,28 @@
 
   ReportCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('activities')) {
-      activities = Activities.fromJson(_json['activities']);
+      activities = Activities.fromJson(
+          _json['activities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customRichMediaEvents')) {
-      customRichMediaEvents =
-          CustomRichMediaEvents.fromJson(_json['customRichMediaEvents']);
+      customRichMediaEvents = CustomRichMediaEvents.fromJson(
+          _json['customRichMediaEvents']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+          .map<SortedDimension>((value) => SortedDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metricNames')) {
@@ -30087,18 +30861,21 @@
   ReportCrossDimensionReachCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('breakdown')) {
       breakdown = (_json['breakdown'] as core.List)
-          .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+          .map<SortedDimension>((value) => SortedDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimension')) {
       dimension = _json['dimension'] as core.String;
     }
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metricNames')) {
@@ -30175,7 +30952,8 @@
     }
     if (_json.containsKey('recipients')) {
       recipients = (_json['recipients'] as core.List)
-          .map<Recipient>((value) => Recipient.fromJson(value))
+          .map<Recipient>((value) =>
+              Recipient.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -30280,24 +31058,29 @@
   ReportFloodlightCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('customRichMediaEvents')) {
       customRichMediaEvents = (_json['customRichMediaEvents'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+          .map<SortedDimension>((value) => SortedDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('floodlightConfigId')) {
-      floodlightConfigId = DimensionValue.fromJson(_json['floodlightConfigId']);
+      floodlightConfigId = DimensionValue.fromJson(
+          _json['floodlightConfigId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricNames')) {
       metricNames = (_json['metricNames'] as core.List)
@@ -30306,7 +31089,7 @@
     }
     if (_json.containsKey('reportProperties')) {
       reportProperties = ReportFloodlightCriteriaReportProperties.fromJson(
-          _json['reportProperties']);
+          _json['reportProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -30369,23 +31152,28 @@
   ReportPathAttributionCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('activityFilters')) {
       activityFilters = (_json['activityFilters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('customChannelGrouping')) {
-      customChannelGrouping =
-          ChannelGrouping.fromJson(_json['customChannelGrouping']);
+      customChannelGrouping = ChannelGrouping.fromJson(
+          _json['customChannelGrouping']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+          .map<SortedDimension>((value) => SortedDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('floodlightConfigId')) {
-      floodlightConfigId = DimensionValue.fromJson(_json['floodlightConfigId']);
+      floodlightConfigId = DimensionValue.fromJson(
+          _json['floodlightConfigId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricNames')) {
       metricNames = (_json['metricNames'] as core.List)
@@ -30394,7 +31182,8 @@
     }
     if (_json.containsKey('pathFilters')) {
       pathFilters = (_json['pathFilters'] as core.List)
-          .map<PathFilter>((value) => PathFilter.fromJson(value))
+          .map<PathFilter>((value) =>
+              PathFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -30458,23 +31247,28 @@
   ReportPathCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('activityFilters')) {
       activityFilters = (_json['activityFilters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('customChannelGrouping')) {
-      customChannelGrouping =
-          ChannelGrouping.fromJson(_json['customChannelGrouping']);
+      customChannelGrouping = ChannelGrouping.fromJson(
+          _json['customChannelGrouping']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+          .map<SortedDimension>((value) => SortedDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('floodlightConfigId')) {
-      floodlightConfigId = DimensionValue.fromJson(_json['floodlightConfigId']);
+      floodlightConfigId = DimensionValue.fromJson(
+          _json['floodlightConfigId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricNames')) {
       metricNames = (_json['metricNames'] as core.List)
@@ -30483,7 +31277,8 @@
     }
     if (_json.containsKey('pathFilters')) {
       pathFilters = (_json['pathFilters'] as core.List)
-          .map<PathFilter>((value) => PathFilter.fromJson(value))
+          .map<PathFilter>((value) =>
+              PathFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -30671,30 +31466,36 @@
   ReportPathToConversionCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('activityFilters')) {
       activityFilters = (_json['activityFilters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('conversionDimensions')) {
       conversionDimensions = (_json['conversionDimensions'] as core.List)
-          .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+          .map<SortedDimension>((value) => SortedDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('customFloodlightVariables')) {
       customFloodlightVariables =
           (_json['customFloodlightVariables'] as core.List)
-              .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+              .map<SortedDimension>((value) => SortedDimension.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('customRichMediaEvents')) {
       customRichMediaEvents = (_json['customRichMediaEvents'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('floodlightConfigId')) {
-      floodlightConfigId = DimensionValue.fromJson(_json['floodlightConfigId']);
+      floodlightConfigId = DimensionValue.fromJson(
+          _json['floodlightConfigId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricNames')) {
       metricNames = (_json['metricNames'] as core.List)
@@ -30704,13 +31505,14 @@
     if (_json.containsKey('perInteractionDimensions')) {
       perInteractionDimensions =
           (_json['perInteractionDimensions'] as core.List)
-              .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+              .map<SortedDimension>((value) => SortedDimension.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('reportProperties')) {
       reportProperties =
           ReportPathToConversionCriteriaReportProperties.fromJson(
-              _json['reportProperties']);
+              _json['reportProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -30786,23 +31588,28 @@
 
   ReportReachCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('activities')) {
-      activities = Activities.fromJson(_json['activities']);
+      activities = Activities.fromJson(
+          _json['activities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customRichMediaEvents')) {
-      customRichMediaEvents =
-          CustomRichMediaEvents.fromJson(_json['customRichMediaEvents']);
+      customRichMediaEvents = CustomRichMediaEvents.fromJson(
+          _json['customRichMediaEvents']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<DimensionValue>((value) => DimensionValue.fromJson(value))
+          .map<DimensionValue>((value) => DimensionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<SortedDimension>((value) => SortedDimension.fromJson(value))
+          .map<SortedDimension>((value) => SortedDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('enableAllDimensionCombinations')) {
@@ -31029,14 +31836,17 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('criteria')) {
-      criteria = ReportCriteria.fromJson(_json['criteria']);
+      criteria = ReportCriteria.fromJson(
+          _json['criteria'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('crossDimensionReachCriteria')) {
       crossDimensionReachCriteria = ReportCrossDimensionReachCriteria.fromJson(
-          _json['crossDimensionReachCriteria']);
+          _json['crossDimensionReachCriteria']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delivery')) {
-      delivery = ReportDelivery.fromJson(_json['delivery']);
+      delivery = ReportDelivery.fromJson(
+          _json['delivery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -31045,8 +31855,8 @@
       fileName = _json['fileName'] as core.String;
     }
     if (_json.containsKey('floodlightCriteria')) {
-      floodlightCriteria =
-          ReportFloodlightCriteria.fromJson(_json['floodlightCriteria']);
+      floodlightCriteria = ReportFloodlightCriteria.fromJson(
+          _json['floodlightCriteria'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('format')) {
       format = _json['format'] as core.String;
@@ -31068,20 +31878,25 @@
     }
     if (_json.containsKey('pathAttributionCriteria')) {
       pathAttributionCriteria = ReportPathAttributionCriteria.fromJson(
-          _json['pathAttributionCriteria']);
+          _json['pathAttributionCriteria']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pathCriteria')) {
-      pathCriteria = ReportPathCriteria.fromJson(_json['pathCriteria']);
+      pathCriteria = ReportPathCriteria.fromJson(
+          _json['pathCriteria'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pathToConversionCriteria')) {
       pathToConversionCriteria = ReportPathToConversionCriteria.fromJson(
-          _json['pathToConversionCriteria']);
+          _json['pathToConversionCriteria']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reachCriteria')) {
-      reachCriteria = ReportReachCriteria.fromJson(_json['reachCriteria']);
+      reachCriteria = ReportReachCriteria.fromJson(
+          _json['reachCriteria'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schedule')) {
-      schedule = ReportSchedule.fromJson(_json['schedule']);
+      schedule = ReportSchedule.fromJson(
+          _json['schedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subAccountId')) {
       subAccountId = _json['subAccountId'] as core.String;
@@ -31186,12 +32001,14 @@
   ReportCompatibleFields.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionFilters')) {
       dimensionFilters = (_json['dimensionFilters'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
       dimensions = (_json['dimensions'] as core.List)
-          .map<Dimension>((value) => Dimension.fromJson(value))
+          .map<Dimension>((value) =>
+              Dimension.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -31199,12 +32016,14 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pivotedActivityMetrics')) {
       pivotedActivityMetrics = (_json['pivotedActivityMetrics'] as core.List)
-          .map<Metric>((value) => Metric.fromJson(value))
+          .map<Metric>((value) =>
+              Metric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -31257,7 +32076,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Report>((value) => Report.fromJson(value))
+          .map<Report>((value) =>
+              Report.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -31322,8 +32142,9 @@
           _json['exposureToConversionEnabled'] as core.bool;
     }
     if (_json.containsKey('lookbackConfiguration')) {
-      lookbackConfiguration =
-          LookbackConfiguration.fromJson(_json['lookbackConfiguration']);
+      lookbackConfiguration = LookbackConfiguration.fromJson(
+          _json['lookbackConfiguration']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reportGenerationTimeZoneId')) {
       reportGenerationTimeZoneId =
@@ -31363,7 +32184,8 @@
 
   RichMediaExitOverride.fromJson(core.Map _json) {
     if (_json.containsKey('clickThroughUrl')) {
-      clickThroughUrl = ClickThroughUrl.fromJson(_json['clickThroughUrl']);
+      clickThroughUrl = ClickThroughUrl.fromJson(
+          _json['clickThroughUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enabled')) {
       enabled = _json['enabled'] as core.bool;
@@ -31497,14 +32319,16 @@
       directorySiteId = _json['directorySiteId'] as core.String;
     }
     if (_json.containsKey('directorySiteIdDimensionValue')) {
-      directorySiteIdDimensionValue =
-          DimensionValue.fromJson(_json['directorySiteIdDimensionValue']);
+      directorySiteIdDimensionValue = DimensionValue.fromJson(
+          _json['directorySiteIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('idDimensionValue')) {
-      idDimensionValue = DimensionValue.fromJson(_json['idDimensionValue']);
+      idDimensionValue = DimensionValue.fromJson(
+          _json['idDimensionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keyName')) {
       keyName = _json['keyName'] as core.String;
@@ -31517,17 +32341,20 @@
     }
     if (_json.containsKey('siteContacts')) {
       siteContacts = (_json['siteContacts'] as core.List)
-          .map<SiteContact>((value) => SiteContact.fromJson(value))
+          .map<SiteContact>((value) => SiteContact.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('siteSettings')) {
-      siteSettings = SiteSettings.fromJson(_json['siteSettings']);
+      siteSettings = SiteSettings.fromJson(
+          _json['siteSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subaccountId')) {
       subaccountId = _json['subaccountId'] as core.String;
     }
     if (_json.containsKey('videoSettings')) {
-      videoSettings = SiteVideoSettings.fromJson(_json['videoSettings']);
+      videoSettings = SiteVideoSettings.fromJson(
+          _json['videoSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -31602,7 +32429,8 @@
     }
     if (_json.containsKey('enabledSizes')) {
       enabledSizes = (_json['enabledSizes'] as core.List)
-          .map<Size>((value) => Size.fromJson(value))
+          .map<Size>((value) =>
+              Size.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imageOnly')) {
@@ -31772,7 +32600,8 @@
       disableNewCookie = _json['disableNewCookie'] as core.bool;
     }
     if (_json.containsKey('tagSetting')) {
-      tagSetting = TagSetting.fromJson(_json['tagSetting']);
+      tagSetting = TagSetting.fromJson(
+          _json['tagSetting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('videoActiveViewOptOutTemplate')) {
       videoActiveViewOptOutTemplate =
@@ -31833,10 +32662,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('progressOffset')) {
-      progressOffset = VideoOffset.fromJson(_json['progressOffset']);
+      progressOffset = VideoOffset.fromJson(
+          _json['progressOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skipOffset')) {
-      skipOffset = VideoOffset.fromJson(_json['skipOffset']);
+      skipOffset = VideoOffset.fromJson(
+          _json['skipOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skippable')) {
       skippable = _json['skippable'] as core.bool;
@@ -31933,8 +32764,8 @@
 
   SiteVideoSettings.fromJson(core.Map _json) {
     if (_json.containsKey('companionSettings')) {
-      companionSettings =
-          SiteCompanionSetting.fromJson(_json['companionSettings']);
+      companionSettings = SiteCompanionSetting.fromJson(
+          _json['companionSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -31943,18 +32774,19 @@
       obaEnabled = _json['obaEnabled'] as core.bool;
     }
     if (_json.containsKey('obaSettings')) {
-      obaSettings = ObaIcon.fromJson(_json['obaSettings']);
+      obaSettings = ObaIcon.fromJson(
+          _json['obaSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('orientation')) {
       orientation = _json['orientation'] as core.String;
     }
     if (_json.containsKey('skippableSettings')) {
-      skippableSettings =
-          SiteSkippableSetting.fromJson(_json['skippableSettings']);
+      skippableSettings = SiteSkippableSetting.fromJson(
+          _json['skippableSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transcodeSettings')) {
-      transcodeSettings =
-          SiteTranscodeSetting.fromJson(_json['transcodeSettings']);
+      transcodeSettings = SiteTranscodeSetting.fromJson(
+          _json['transcodeSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -32008,7 +32840,8 @@
     }
     if (_json.containsKey('sites')) {
       sites = (_json['sites'] as core.List)
-          .map<Site>((value) => Site.fromJson(value))
+          .map<Site>((value) =>
+              Site.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -32104,7 +32937,8 @@
     }
     if (_json.containsKey('sizes')) {
       sizes = (_json['sizes'] as core.List)
-          .map<Size>((value) => Size.fromJson(value))
+          .map<Size>((value) =>
+              Size.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -32145,10 +32979,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('progressOffset')) {
-      progressOffset = VideoOffset.fromJson(_json['progressOffset']);
+      progressOffset = VideoOffset.fromJson(
+          _json['progressOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skipOffset')) {
-      skipOffset = VideoOffset.fromJson(_json['skipOffset']);
+      skipOffset = VideoOffset.fromJson(
+          _json['skipOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skippable')) {
       skippable = _json['skippable'] as core.bool;
@@ -32302,7 +33138,8 @@
     }
     if (_json.containsKey('subaccounts')) {
       subaccounts = (_json['subaccounts'] as core.List)
-          .map<Subaccount>((value) => Subaccount.fromJson(value))
+          .map<Subaccount>((value) =>
+              Subaccount.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -32606,8 +33443,9 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -32701,8 +33539,9 @@
     if (_json.containsKey('targetableRemarketingLists')) {
       targetableRemarketingLists =
           (_json['targetableRemarketingLists'] as core.List)
-              .map<TargetableRemarketingList>(
-                  (value) => TargetableRemarketingList.fromJson(value))
+              .map<TargetableRemarketingList>((value) =>
+                  TargetableRemarketingList.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -32781,32 +33620,37 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('advertiserIdDimensionValue')) {
-      advertiserIdDimensionValue =
-          DimensionValue.fromJson(_json['advertiserIdDimensionValue']);
+      advertiserIdDimensionValue = DimensionValue.fromJson(
+          _json['advertiserIdDimensionValue']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dayPartTargeting')) {
-      dayPartTargeting = DayPartTargeting.fromJson(_json['dayPartTargeting']);
+      dayPartTargeting = DayPartTargeting.fromJson(
+          _json['dayPartTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('geoTargeting')) {
-      geoTargeting = GeoTargeting.fromJson(_json['geoTargeting']);
+      geoTargeting = GeoTargeting.fromJson(
+          _json['geoTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('keyValueTargetingExpression')) {
       keyValueTargetingExpression = KeyValueTargetingExpression.fromJson(
-          _json['keyValueTargetingExpression']);
+          _json['keyValueTargetingExpression']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('languageTargeting')) {
-      languageTargeting =
-          LanguageTargeting.fromJson(_json['languageTargeting']);
+      languageTargeting = LanguageTargeting.fromJson(
+          _json['languageTargeting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('listTargetingExpression')) {
-      listTargetingExpression =
-          ListTargetingExpression.fromJson(_json['listTargetingExpression']);
+      listTargetingExpression = ListTargetingExpression.fromJson(
+          _json['listTargetingExpression']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -32815,8 +33659,8 @@
       subaccountId = _json['subaccountId'] as core.String;
     }
     if (_json.containsKey('technologyTargeting')) {
-      technologyTargeting =
-          TechnologyTargeting.fromJson(_json['technologyTargeting']);
+      technologyTargeting = TechnologyTargeting.fromJson(
+          _json['technologyTargeting'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -32889,7 +33733,8 @@
     }
     if (_json.containsKey('targetingTemplates')) {
       targetingTemplates = (_json['targetingTemplates'] as core.List)
-          .map<TargetingTemplate>((value) => TargetingTemplate.fromJson(value))
+          .map<TargetingTemplate>((value) => TargetingTemplate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -32953,33 +33798,39 @@
   TechnologyTargeting.fromJson(core.Map _json) {
     if (_json.containsKey('browsers')) {
       browsers = (_json['browsers'] as core.List)
-          .map<Browser>((value) => Browser.fromJson(value))
+          .map<Browser>((value) =>
+              Browser.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('connectionTypes')) {
       connectionTypes = (_json['connectionTypes'] as core.List)
-          .map<ConnectionType>((value) => ConnectionType.fromJson(value))
+          .map<ConnectionType>((value) => ConnectionType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mobileCarriers')) {
       mobileCarriers = (_json['mobileCarriers'] as core.List)
-          .map<MobileCarrier>((value) => MobileCarrier.fromJson(value))
+          .map<MobileCarrier>((value) => MobileCarrier.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operatingSystemVersions')) {
       operatingSystemVersions = (_json['operatingSystemVersions'] as core.List)
-          .map<OperatingSystemVersion>(
-              (value) => OperatingSystemVersion.fromJson(value))
+          .map<OperatingSystemVersion>((value) =>
+              OperatingSystemVersion.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operatingSystems')) {
       operatingSystems = (_json['operatingSystems'] as core.List)
-          .map<OperatingSystem>((value) => OperatingSystem.fromJson(value))
+          .map<OperatingSystem>((value) => OperatingSystem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('platformTypes')) {
       platformTypes = (_json['platformTypes'] as core.List)
-          .map<PlatformType>((value) => PlatformType.fromJson(value))
+          .map<PlatformType>((value) => PlatformType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -33424,7 +34275,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<UserProfile>((value) => UserProfile.fromJson(value))
+          .map<UserProfile>((value) => UserProfile.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -33506,8 +34358,8 @@
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<UserRolePermission>(
-              (value) => UserRolePermission.fromJson(value))
+          .map<UserRolePermission>((value) => UserRolePermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subaccountId')) {
@@ -33670,8 +34522,9 @@
     if (_json.containsKey('userRolePermissionGroups')) {
       userRolePermissionGroups =
           (_json['userRolePermissionGroups'] as core.List)
-              .map<UserRolePermissionGroup>(
-                  (value) => UserRolePermissionGroup.fromJson(value))
+              .map<UserRolePermissionGroup>((value) =>
+                  UserRolePermissionGroup.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -33706,8 +34559,8 @@
     }
     if (_json.containsKey('userRolePermissions')) {
       userRolePermissions = (_json['userRolePermissions'] as core.List)
-          .map<UserRolePermission>(
-              (value) => UserRolePermission.fromJson(value))
+          .map<UserRolePermission>((value) => UserRolePermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -33748,7 +34601,8 @@
     }
     if (_json.containsKey('userRoles')) {
       userRoles = (_json['userRoles'] as core.List)
-          .map<UserRole>((value) => UserRole.fromJson(value))
+          .map<UserRole>((value) =>
+              UserRole.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -33805,7 +34659,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('resolution')) {
-      resolution = Size.fromJson(_json['resolution']);
+      resolution = Size.fromJson(
+          _json['resolution'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetBitRate')) {
       targetBitRate = _json['targetBitRate'] as core.int;
@@ -33850,7 +34705,8 @@
     }
     if (_json.containsKey('videoFormats')) {
       videoFormats = (_json['videoFormats'] as core.List)
-          .map<VideoFormat>((value) => VideoFormat.fromJson(value))
+          .map<VideoFormat>((value) => VideoFormat.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -33941,7 +34797,8 @@
 
   VideoSettings.fromJson(core.Map _json) {
     if (_json.containsKey('companionSettings')) {
-      companionSettings = CompanionSetting.fromJson(_json['companionSettings']);
+      companionSettings = CompanionSetting.fromJson(
+          _json['companionSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -33950,16 +34807,19 @@
       obaEnabled = _json['obaEnabled'] as core.bool;
     }
     if (_json.containsKey('obaSettings')) {
-      obaSettings = ObaIcon.fromJson(_json['obaSettings']);
+      obaSettings = ObaIcon.fromJson(
+          _json['obaSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('orientation')) {
       orientation = _json['orientation'] as core.String;
     }
     if (_json.containsKey('skippableSettings')) {
-      skippableSettings = SkippableSetting.fromJson(_json['skippableSettings']);
+      skippableSettings = SkippableSetting.fromJson(
+          _json['skippableSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transcodeSettings')) {
-      transcodeSettings = TranscodeSetting.fromJson(_json['transcodeSettings']);
+      transcodeSettings = TranscodeSetting.fromJson(
+          _json['transcodeSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/dialogflow/v2.dart b/generated/googleapis/lib/dialogflow/v2.dart
index 625d0e9..5d0cb71 100644
--- a/generated/googleapis/lib/dialogflow/v2.dart
+++ b/generated/googleapis/lib/dialogflow/v2.dart
@@ -109,7 +109,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified agent.
@@ -159,8 +162,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Agent.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Agent.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates/updates the specified agent.
@@ -221,8 +226,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Agent.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Agent.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -295,7 +302,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the fulfillment.
@@ -345,8 +355,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Fulfillment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Fulfillment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets agent validation result. Agent validation is performed during
@@ -409,8 +421,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2ValidationResult.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2ValidationResult.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports the specified agent from a ZIP file. Uploads new intents and
@@ -477,7 +491,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restores the specified agent from a ZIP file. Replaces the current agent
@@ -543,7 +560,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of agents. Since there is at most one conversational
@@ -613,7 +633,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2SearchAgentsResponse.fromJson(data));
+      (data) => GoogleCloudDialogflowV2SearchAgentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Trains the specified agent. Operation
@@ -671,7 +693,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the fulfillment.
@@ -734,8 +759,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Fulfillment.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Fulfillment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -803,7 +830,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates/Creates multiple entity types in the specified agent. Operation
@@ -861,7 +891,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an entity type in the specified agent.
@@ -928,8 +961,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2EntityType.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2EntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified entity type.
@@ -979,7 +1014,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified entity type.
@@ -1038,8 +1076,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2EntityType.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2EntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of all entity types in the specified agent.
@@ -1114,8 +1154,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudDialogflowV2ListEntityTypesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2ListEntityTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified entity type.
@@ -1187,8 +1229,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2EntityType.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2EntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1253,7 +1297,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes entities in the specified entity type. Operation
@@ -1311,7 +1358,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates or creates multiple entities in the specified entity type. This
@@ -1371,7 +1421,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1447,8 +1500,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudDialogflowV2ListEnvironmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2ListEnvironmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1527,7 +1582,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Processes a natural language query and returns structured, actionable data
@@ -1598,7 +1656,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2DetectIntentResponse.fromJson(data));
+      (data) => GoogleCloudDialogflowV2DetectIntentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1668,8 +1728,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Context.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Context.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified context.
@@ -1723,7 +1785,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified context.
@@ -1777,8 +1842,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Context.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Context.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of all contexts in the specified session.
@@ -1848,7 +1915,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2ListContextsResponse.fromJson(data));
+      (data) => GoogleCloudDialogflowV2ListContextsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified context.
@@ -1919,8 +1988,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Context.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Context.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1994,7 +2065,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(data));
+      (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified session entity type. This method doesn't work with
@@ -2050,7 +2123,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified session entity type. This method doesn't work with
@@ -2107,7 +2183,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(data));
+      (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of all session entity types in the specified session.
@@ -2180,8 +2258,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudDialogflowV2ListSessionEntityTypesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2ListSessionEntityTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified session entity type. This method doesn't work with
@@ -2252,7 +2332,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(data));
+      (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2317,7 +2399,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates/Creates multiple intents in the specified agent. Operation
@@ -2375,7 +2460,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an intent in the specified agent.
@@ -2452,8 +2540,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Intent.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Intent.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified intent and its direct or indirect followup intents.
@@ -2504,7 +2594,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified intent.
@@ -2574,8 +2667,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Intent.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Intent.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of all intents in the specified agent.
@@ -2661,7 +2756,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2ListIntentsResponse.fromJson(data));
+      (data) => GoogleCloudDialogflowV2ListIntentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified intent.
@@ -2744,8 +2841,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Intent.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Intent.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2811,7 +2910,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Processes a natural language query and returns structured, actionable data
@@ -2881,7 +2983,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2DetectIntentResponse.fromJson(data));
+      (data) => GoogleCloudDialogflowV2DetectIntentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2949,8 +3053,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Context.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Context.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified context.
@@ -3004,7 +3110,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified context.
@@ -3058,8 +3167,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Context.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Context.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of all contexts in the specified session.
@@ -3128,7 +3239,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2ListContextsResponse.fromJson(data));
+      (data) => GoogleCloudDialogflowV2ListContextsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified context.
@@ -3199,8 +3312,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudDialogflowV2Context.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2Context.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3272,7 +3387,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(data));
+      (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified session entity type. This method doesn't work with
@@ -3328,7 +3445,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified session entity type. This method doesn't work with
@@ -3385,7 +3505,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(data));
+      (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the list of all session entity types in the specified session.
@@ -3457,8 +3579,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudDialogflowV2ListSessionEntityTypesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudDialogflowV2ListSessionEntityTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified session entity type. This method doesn't work with
@@ -3529,7 +3653,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(data));
+      (data) => GoogleCloudDialogflowV2SessionEntityType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3604,7 +3730,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -3656,7 +3785,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -3732,8 +3864,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleLongrunningListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3797,7 +3931,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -3848,7 +3985,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -3924,8 +4064,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleLongrunningListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4035,7 +4177,7 @@
     }
     if (_json.containsKey('formInfo')) {
       formInfo = GoogleCloudDialogflowCxV3beta1PageInfoFormInfo.fromJson(
-          _json['formInfo']);
+          _json['formInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4067,7 +4209,7 @@
           .map<GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo>(
               (value) =>
                   GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4221,41 +4363,44 @@
     if (_json.containsKey('conversationSuccess')) {
       conversationSuccess =
           GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess
-              .fromJson(_json['conversationSuccess']);
+              .fromJson(_json['conversationSuccess']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endInteraction')) {
       endInteraction =
           GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction.fromJson(
-              _json['endInteraction']);
+              _json['endInteraction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('liveAgentHandoff')) {
       liveAgentHandoff =
           GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff
-              .fromJson(_json['liveAgentHandoff']);
+              .fromJson(_json['liveAgentHandoff']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mixedAudio')) {
       mixedAudio =
           GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio.fromJson(
-              _json['mixedAudio']);
+              _json['mixedAudio'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputAudioText')) {
       outputAudioText =
           GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText.fromJson(
-              _json['outputAudioText']);
+              _json['outputAudioText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('playAudio')) {
       playAudio =
           GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio.fromJson(
-              _json['playAudio']);
+              _json['playAudio'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = GoogleCloudDialogflowCxV3beta1ResponseMessageText.fromJson(
-          _json['text']);
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4311,7 +4456,8 @@
       core.Map _json) {
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4361,7 +4507,8 @@
       core.Map _json) {
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4393,7 +4540,7 @@
           .map<GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment>(
               (value) =>
                   GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4599,7 +4746,8 @@
   GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Object, core.Object>(
-          _json['parameters'].cast<core.String, core.Object>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('session')) {
@@ -4658,31 +4806,33 @@
     if (_json.containsKey('fulfillmentInfo')) {
       fulfillmentInfo =
           GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo.fromJson(
-              _json['fulfillmentInfo']);
+              _json['fulfillmentInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('intentInfo')) {
       intentInfo =
           GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo.fromJson(
-              _json['intentInfo']);
+              _json['intentInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
           .map<GoogleCloudDialogflowCxV3beta1ResponseMessage>((value) =>
-              GoogleCloudDialogflowCxV3beta1ResponseMessage.fromJson(value))
+              GoogleCloudDialogflowCxV3beta1ResponseMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo =
-          GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('sessionInfo')) {
       sessionInfo = GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(
-          _json['sessionInfo']);
+          _json['sessionInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4761,10 +4911,11 @@
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Map,
               GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue>(
-          _json['parameters'].cast<core.String, core.Map>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
           (core.Map item) =>
               GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
-                  .fromJson(item));
+                  .fromJson(item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -4857,20 +5008,22 @@
     if (_json.containsKey('fulfillmentResponse')) {
       fulfillmentResponse =
           GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse
-              .fromJson(_json['fulfillmentResponse']);
+              .fromJson(_json['fulfillmentResponse']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo =
-          GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('sessionInfo')) {
       sessionInfo = GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(
-          _json['sessionInfo']);
+          _json['sessionInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetFlow')) {
       targetFlow = _json['targetFlow'] as core.String;
@@ -4928,7 +5081,8 @@
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
           .map<GoogleCloudDialogflowCxV3beta1ResponseMessage>((value) =>
-              GoogleCloudDialogflowCxV3beta1ResponseMessage.fromJson(value))
+              GoogleCloudDialogflowCxV3beta1ResponseMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5181,7 +5335,8 @@
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
           .map<GoogleCloudDialogflowV2EntityTypeEntity>((value) =>
-              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(value))
+              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('languageCode')) {
@@ -5276,8 +5431,9 @@
   GoogleCloudDialogflowV2BatchDeleteIntentsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('intents')) {
       intents = (_json['intents'] as core.List)
-          .map<GoogleCloudDialogflowV2Intent>(
-              (value) => GoogleCloudDialogflowV2Intent.fromJson(value))
+          .map<GoogleCloudDialogflowV2Intent>((value) =>
+              GoogleCloudDialogflowV2Intent.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5311,7 +5467,8 @@
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
           .map<GoogleCloudDialogflowV2EntityTypeEntity>((value) =>
-              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(value))
+              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('languageCode')) {
@@ -5362,7 +5519,8 @@
       core.Map _json) {
     if (_json.containsKey('entityTypeBatchInline')) {
       entityTypeBatchInline = GoogleCloudDialogflowV2EntityTypeBatch.fromJson(
-          _json['entityTypeBatchInline']);
+          _json['entityTypeBatchInline']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entityTypeBatchUri')) {
       entityTypeBatchUri = _json['entityTypeBatchUri'] as core.String;
@@ -5404,8 +5562,9 @@
       core.Map _json) {
     if (_json.containsKey('entityTypes')) {
       entityTypes = (_json['entityTypes'] as core.List)
-          .map<GoogleCloudDialogflowV2EntityType>(
-              (value) => GoogleCloudDialogflowV2EntityType.fromJson(value))
+          .map<GoogleCloudDialogflowV2EntityType>((value) =>
+              GoogleCloudDialogflowV2EntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5450,7 +5609,7 @@
   GoogleCloudDialogflowV2BatchUpdateIntentsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('intentBatchInline')) {
       intentBatchInline = GoogleCloudDialogflowV2IntentBatch.fromJson(
-          _json['intentBatchInline']);
+          _json['intentBatchInline'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('intentBatchUri')) {
       intentBatchUri = _json['intentBatchUri'] as core.String;
@@ -5497,8 +5656,9 @@
   GoogleCloudDialogflowV2BatchUpdateIntentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('intents')) {
       intents = (_json['intents'] as core.List)
-          .map<GoogleCloudDialogflowV2Intent>(
-              (value) => GoogleCloudDialogflowV2Intent.fromJson(value))
+          .map<GoogleCloudDialogflowV2Intent>((value) =>
+              GoogleCloudDialogflowV2Intent.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5568,7 +5728,8 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Object, core.Object>(
-          _json['parameters'].cast<core.String, core.Object>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -5631,11 +5792,12 @@
       conversation = _json['conversation'] as core.String;
     }
     if (_json.containsKey('errorStatus')) {
-      errorStatus = GoogleRpcStatus.fromJson(_json['errorStatus']);
+      errorStatus = GoogleRpcStatus.fromJson(
+          _json['errorStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('newMessagePayload')) {
-      newMessagePayload =
-          GoogleCloudDialogflowV2Message.fromJson(_json['newMessagePayload']);
+      newMessagePayload = GoogleCloudDialogflowV2Message.fromJson(
+          _json['newMessagePayload'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -5702,18 +5864,18 @@
     }
     if (_json.containsKey('outputAudioConfig')) {
       outputAudioConfig = GoogleCloudDialogflowV2OutputAudioConfig.fromJson(
-          _json['outputAudioConfig']);
+          _json['outputAudioConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputAudioConfigMask')) {
       outputAudioConfigMask = _json['outputAudioConfigMask'] as core.String;
     }
     if (_json.containsKey('queryInput')) {
-      queryInput =
-          GoogleCloudDialogflowV2QueryInput.fromJson(_json['queryInput']);
+      queryInput = GoogleCloudDialogflowV2QueryInput.fromJson(
+          _json['queryInput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryParams')) {
-      queryParams =
-          GoogleCloudDialogflowV2QueryParameters.fromJson(_json['queryParams']);
+      queryParams = GoogleCloudDialogflowV2QueryParameters.fromJson(
+          _json['queryParams'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5779,17 +5941,18 @@
     }
     if (_json.containsKey('outputAudioConfig')) {
       outputAudioConfig = GoogleCloudDialogflowV2OutputAudioConfig.fromJson(
-          _json['outputAudioConfig']);
+          _json['outputAudioConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryResult')) {
-      queryResult =
-          GoogleCloudDialogflowV2QueryResult.fromJson(_json['queryResult']);
+      queryResult = GoogleCloudDialogflowV2QueryResult.fromJson(
+          _json['queryResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responseId')) {
       responseId = _json['responseId'] as core.String;
     }
     if (_json.containsKey('webhookStatus')) {
-      webhookStatus = GoogleRpcStatus.fromJson(_json['webhookStatus']);
+      webhookStatus = GoogleRpcStatus.fromJson(
+          _json['webhookStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5874,7 +6037,8 @@
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
           .map<GoogleCloudDialogflowV2EntityTypeEntity>((value) =>
-              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(value))
+              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -5919,8 +6083,9 @@
   GoogleCloudDialogflowV2EntityTypeBatch.fromJson(core.Map _json) {
     if (_json.containsKey('entityTypes')) {
       entityTypes = (_json['entityTypes'] as core.List)
-          .map<GoogleCloudDialogflowV2EntityType>(
-              (value) => GoogleCloudDialogflowV2EntityType.fromJson(value))
+          .map<GoogleCloudDialogflowV2EntityType>((value) =>
+              GoogleCloudDialogflowV2EntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6090,7 +6255,8 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Object, core.Object>(
-          _json['parameters'].cast<core.String, core.Object>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -6213,13 +6379,15 @@
     if (_json.containsKey('features')) {
       features = (_json['features'] as core.List)
           .map<GoogleCloudDialogflowV2FulfillmentFeature>((value) =>
-              GoogleCloudDialogflowV2FulfillmentFeature.fromJson(value))
+              GoogleCloudDialogflowV2FulfillmentFeature.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('genericWebService')) {
       genericWebService =
           GoogleCloudDialogflowV2FulfillmentGenericWebService.fromJson(
-              _json['genericWebService']);
+              _json['genericWebService']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -6307,7 +6475,8 @@
     }
     if (_json.containsKey('requestHeaders')) {
       requestHeaders = commons.mapMap<core.String, core.String>(
-          _json['requestHeaders'].cast<core.String, core.String>(),
+          (_json['requestHeaders'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('uri')) {
@@ -6388,7 +6557,8 @@
   GoogleCloudDialogflowV2ImportDocumentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<GoogleRpcStatus>((value) => GoogleRpcStatus.fromJson(value))
+          .map<GoogleRpcStatus>((value) => GoogleRpcStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6546,8 +6716,9 @@
     }
     if (_json.containsKey('speechContexts')) {
       speechContexts = (_json['speechContexts'] as core.List)
-          .map<GoogleCloudDialogflowV2SpeechContext>(
-              (value) => GoogleCloudDialogflowV2SpeechContext.fromJson(value))
+          .map<GoogleCloudDialogflowV2SpeechContext>((value) =>
+              GoogleCloudDialogflowV2SpeechContext.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6707,7 +6878,8 @@
     if (_json.containsKey('followupIntentInfo')) {
       followupIntentInfo = (_json['followupIntentInfo'] as core.List)
           .map<GoogleCloudDialogflowV2IntentFollowupIntentInfo>((value) =>
-              GoogleCloudDialogflowV2IntentFollowupIntentInfo.fromJson(value))
+              GoogleCloudDialogflowV2IntentFollowupIntentInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inputContextNames')) {
@@ -6720,8 +6892,9 @@
     }
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
-          .map<GoogleCloudDialogflowV2IntentMessage>(
-              (value) => GoogleCloudDialogflowV2IntentMessage.fromJson(value))
+          .map<GoogleCloudDialogflowV2IntentMessage>((value) =>
+              GoogleCloudDialogflowV2IntentMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mlDisabled')) {
@@ -6732,14 +6905,16 @@
     }
     if (_json.containsKey('outputContexts')) {
       outputContexts = (_json['outputContexts'] as core.List)
-          .map<GoogleCloudDialogflowV2Context>(
-              (value) => GoogleCloudDialogflowV2Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2Context>((value) =>
+              GoogleCloudDialogflowV2Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<GoogleCloudDialogflowV2IntentParameter>(
-              (value) => GoogleCloudDialogflowV2IntentParameter.fromJson(value))
+          .map<GoogleCloudDialogflowV2IntentParameter>((value) =>
+              GoogleCloudDialogflowV2IntentParameter.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFollowupIntentName')) {
@@ -6758,7 +6933,8 @@
     if (_json.containsKey('trainingPhrases')) {
       trainingPhrases = (_json['trainingPhrases'] as core.List)
           .map<GoogleCloudDialogflowV2IntentTrainingPhrase>((value) =>
-              GoogleCloudDialogflowV2IntentTrainingPhrase.fromJson(value))
+              GoogleCloudDialogflowV2IntentTrainingPhrase.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webhookState')) {
@@ -6839,8 +7015,9 @@
   GoogleCloudDialogflowV2IntentBatch.fromJson(core.Map _json) {
     if (_json.containsKey('intents')) {
       intents = (_json['intents'] as core.List)
-          .map<GoogleCloudDialogflowV2Intent>(
-              (value) => GoogleCloudDialogflowV2Intent.fromJson(value))
+          .map<GoogleCloudDialogflowV2Intent>((value) =>
+              GoogleCloudDialogflowV2Intent.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6957,41 +7134,45 @@
   GoogleCloudDialogflowV2IntentMessage.fromJson(core.Map _json) {
     if (_json.containsKey('basicCard')) {
       basicCard = GoogleCloudDialogflowV2IntentMessageBasicCard.fromJson(
-          _json['basicCard']);
+          _json['basicCard'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('browseCarouselCard')) {
       browseCarouselCard =
           GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard.fromJson(
-              _json['browseCarouselCard']);
+              _json['browseCarouselCard']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('card')) {
-      card = GoogleCloudDialogflowV2IntentMessageCard.fromJson(_json['card']);
+      card = GoogleCloudDialogflowV2IntentMessageCard.fromJson(
+          _json['card'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('carouselSelect')) {
       carouselSelect =
           GoogleCloudDialogflowV2IntentMessageCarouselSelect.fromJson(
-              _json['carouselSelect']);
+              _json['carouselSelect'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('image')) {
-      image =
-          GoogleCloudDialogflowV2IntentMessageImage.fromJson(_json['image']);
+      image = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linkOutSuggestion')) {
       linkOutSuggestion =
           GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion.fromJson(
-              _json['linkOutSuggestion']);
+              _json['linkOutSuggestion']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('listSelect')) {
       listSelect = GoogleCloudDialogflowV2IntentMessageListSelect.fromJson(
-          _json['listSelect']);
+          _json['listSelect'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mediaContent')) {
       mediaContent = GoogleCloudDialogflowV2IntentMessageMediaContent.fromJson(
-          _json['mediaContent']);
+          _json['mediaContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('platform')) {
@@ -6999,23 +7180,24 @@
     }
     if (_json.containsKey('quickReplies')) {
       quickReplies = GoogleCloudDialogflowV2IntentMessageQuickReplies.fromJson(
-          _json['quickReplies']);
+          _json['quickReplies'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('simpleResponses')) {
       simpleResponses =
           GoogleCloudDialogflowV2IntentMessageSimpleResponses.fromJson(
-              _json['simpleResponses']);
+              _json['simpleResponses'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestions')) {
       suggestions = GoogleCloudDialogflowV2IntentMessageSuggestions.fromJson(
-          _json['suggestions']);
+          _json['suggestions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableCard')) {
       tableCard = GoogleCloudDialogflowV2IntentMessageTableCard.fromJson(
-          _json['tableCard']);
+          _json['tableCard'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text = GoogleCloudDialogflowV2IntentMessageText.fromJson(_json['text']);
+      text = GoogleCloudDialogflowV2IntentMessageText.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7094,15 +7276,15 @@
       buttons = (_json['buttons'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageBasicCardButton>((value) =>
               GoogleCloudDialogflowV2IntentMessageBasicCardButton.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('formattedText')) {
       formattedText = _json['formattedText'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image =
-          GoogleCloudDialogflowV2IntentMessageImage.fromJson(_json['image']);
+      image = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subtitle')) {
       subtitle = _json['subtitle'] as core.String;
@@ -7148,7 +7330,8 @@
     if (_json.containsKey('openUriAction')) {
       openUriAction =
           GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction
-              .fromJson(_json['openUriAction']);
+              .fromJson(_json['openUriAction']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -7230,7 +7413,7 @@
           .map<GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem>(
               (value) =>
                   GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7277,13 +7460,14 @@
       footer = _json['footer'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image =
-          GoogleCloudDialogflowV2IntentMessageImage.fromJson(_json['image']);
+      image = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('openUriAction')) {
       openUriAction =
           GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
-              .fromJson(_json['openUriAction']);
+              .fromJson(_json['openUriAction']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -7369,7 +7553,8 @@
     if (_json.containsKey('buttons')) {
       buttons = (_json['buttons'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageCardButton>((value) =>
-              GoogleCloudDialogflowV2IntentMessageCardButton.fromJson(value))
+              GoogleCloudDialogflowV2IntentMessageCardButton.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imageUri')) {
@@ -7444,7 +7629,7 @@
       items = (_json['items'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageCarouselSelectItem>(
               (value) => GoogleCloudDialogflowV2IntentMessageCarouselSelectItem
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7480,12 +7665,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image =
-          GoogleCloudDialogflowV2IntentMessageImage.fromJson(_json['image']);
+      image = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('info')) {
       info = GoogleCloudDialogflowV2IntentMessageSelectItemInfo.fromJson(
-          _json['info']);
+          _json['info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -7632,7 +7817,7 @@
       items = (_json['items'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageListSelectItem>((value) =>
               GoogleCloudDialogflowV2IntentMessageListSelectItem.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subtitle')) {
@@ -7679,12 +7864,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image =
-          GoogleCloudDialogflowV2IntentMessageImage.fromJson(_json['image']);
+      image = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('info')) {
       info = GoogleCloudDialogflowV2IntentMessageSelectItemInfo.fromJson(
-          _json['info']);
+          _json['info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -7729,7 +7914,7 @@
           .map<GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject>(
               (value) =>
                   GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mediaType')) {
@@ -7778,11 +7963,12 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('icon')) {
-      icon = GoogleCloudDialogflowV2IntentMessageImage.fromJson(_json['icon']);
+      icon = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          _json['icon'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('largeImage')) {
       largeImage = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
-          _json['largeImage']);
+          _json['largeImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -7935,7 +8121,7 @@
       simpleResponses = (_json['simpleResponses'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageSimpleResponse>((value) =>
               GoogleCloudDialogflowV2IntentMessageSimpleResponse.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7984,7 +8170,8 @@
     if (_json.containsKey('suggestions')) {
       suggestions = (_json['suggestions'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageSuggestion>((value) =>
-              GoogleCloudDialogflowV2IntentMessageSuggestion.fromJson(value))
+              GoogleCloudDialogflowV2IntentMessageSuggestion.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8027,24 +8214,25 @@
       buttons = (_json['buttons'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageBasicCardButton>((value) =>
               GoogleCloudDialogflowV2IntentMessageBasicCardButton.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('columnProperties')) {
       columnProperties = (_json['columnProperties'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageColumnProperties>((value) =>
               GoogleCloudDialogflowV2IntentMessageColumnProperties.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('image')) {
-      image =
-          GoogleCloudDialogflowV2IntentMessageImage.fromJson(_json['image']);
+      image = GoogleCloudDialogflowV2IntentMessageImage.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageTableCardRow>((value) =>
-              GoogleCloudDialogflowV2IntentMessageTableCardRow.fromJson(value))
+              GoogleCloudDialogflowV2IntentMessageTableCardRow.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subtitle')) {
@@ -8116,7 +8304,8 @@
     if (_json.containsKey('cells')) {
       cells = (_json['cells'] as core.List)
           .map<GoogleCloudDialogflowV2IntentMessageTableCardCell>((value) =>
-              GoogleCloudDialogflowV2IntentMessageTableCardCell.fromJson(value))
+              GoogleCloudDialogflowV2IntentMessageTableCardCell.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dividerAfter')) {
@@ -8301,7 +8490,8 @@
     if (_json.containsKey('parts')) {
       parts = (_json['parts'] as core.List)
           .map<GoogleCloudDialogflowV2IntentTrainingPhrasePart>((value) =>
-              GoogleCloudDialogflowV2IntentTrainingPhrasePart.fromJson(value))
+              GoogleCloudDialogflowV2IntentTrainingPhrasePart.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timesAddedCount')) {
@@ -8400,8 +8590,9 @@
   GoogleCloudDialogflowV2ListContextsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('contexts')) {
       contexts = (_json['contexts'] as core.List)
-          .map<GoogleCloudDialogflowV2Context>(
-              (value) => GoogleCloudDialogflowV2Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2Context>((value) =>
+              GoogleCloudDialogflowV2Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8436,8 +8627,9 @@
   GoogleCloudDialogflowV2ListEntityTypesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entityTypes')) {
       entityTypes = (_json['entityTypes'] as core.List)
-          .map<GoogleCloudDialogflowV2EntityType>(
-              (value) => GoogleCloudDialogflowV2EntityType.fromJson(value))
+          .map<GoogleCloudDialogflowV2EntityType>((value) =>
+              GoogleCloudDialogflowV2EntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8473,8 +8665,9 @@
   GoogleCloudDialogflowV2ListEnvironmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('environments')) {
       environments = (_json['environments'] as core.List)
-          .map<GoogleCloudDialogflowV2Environment>(
-              (value) => GoogleCloudDialogflowV2Environment.fromJson(value))
+          .map<GoogleCloudDialogflowV2Environment>((value) =>
+              GoogleCloudDialogflowV2Environment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8510,8 +8703,9 @@
   GoogleCloudDialogflowV2ListIntentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('intents')) {
       intents = (_json['intents'] as core.List)
-          .map<GoogleCloudDialogflowV2Intent>(
-              (value) => GoogleCloudDialogflowV2Intent.fromJson(value))
+          .map<GoogleCloudDialogflowV2Intent>((value) =>
+              GoogleCloudDialogflowV2Intent.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8551,7 +8745,8 @@
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
           .map<GoogleCloudDialogflowV2SessionEntityType>((value) =>
-              GoogleCloudDialogflowV2SessionEntityType.fromJson(value))
+              GoogleCloudDialogflowV2SessionEntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8616,7 +8811,7 @@
     }
     if (_json.containsKey('messageAnnotation')) {
       messageAnnotation = GoogleCloudDialogflowV2MessageAnnotation.fromJson(
-          _json['messageAnnotation']);
+          _json['messageAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8675,7 +8870,8 @@
     if (_json.containsKey('parts')) {
       parts = (_json['parts'] as core.List)
           .map<GoogleCloudDialogflowV2AnnotatedMessagePart>((value) =>
-              GoogleCloudDialogflowV2AnnotatedMessagePart.fromJson(value))
+              GoogleCloudDialogflowV2AnnotatedMessagePart.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8721,7 +8917,8 @@
   GoogleCloudDialogflowV2OriginalDetectIntentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('source')) {
@@ -8787,7 +8984,8 @@
     if (_json.containsKey('synthesizeSpeechConfig')) {
       synthesizeSpeechConfig =
           GoogleCloudDialogflowV2SynthesizeSpeechConfig.fromJson(
-              _json['synthesizeSpeechConfig']);
+              _json['synthesizeSpeechConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8825,13 +9023,15 @@
   GoogleCloudDialogflowV2QueryInput.fromJson(core.Map _json) {
     if (_json.containsKey('audioConfig')) {
       audioConfig = GoogleCloudDialogflowV2InputAudioConfig.fromJson(
-          _json['audioConfig']);
+          _json['audioConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('event')) {
-      event = GoogleCloudDialogflowV2EventInput.fromJson(_json['event']);
+      event = GoogleCloudDialogflowV2EventInput.fromJson(
+          _json['event'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text = GoogleCloudDialogflowV2TextInput.fromJson(_json['text']);
+      text = GoogleCloudDialogflowV2TextInput.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8892,16 +9092,19 @@
   GoogleCloudDialogflowV2QueryParameters.fromJson(core.Map _json) {
     if (_json.containsKey('contexts')) {
       contexts = (_json['contexts'] as core.List)
-          .map<GoogleCloudDialogflowV2Context>(
-              (value) => GoogleCloudDialogflowV2Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2Context>((value) =>
+              GoogleCloudDialogflowV2Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('geoLocation')) {
-      geoLocation = GoogleTypeLatLng.fromJson(_json['geoLocation']);
+      geoLocation = GoogleTypeLatLng.fromJson(
+          _json['geoLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('resetContexts')) {
@@ -8910,12 +9113,14 @@
     if (_json.containsKey('sentimentAnalysisRequestConfig')) {
       sentimentAnalysisRequestConfig =
           GoogleCloudDialogflowV2SentimentAnalysisRequestConfig.fromJson(
-              _json['sentimentAnalysisRequestConfig']);
+              _json['sentimentAnalysisRequestConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
           .map<GoogleCloudDialogflowV2SessionEntityType>((value) =>
-              GoogleCloudDialogflowV2SessionEntityType.fromJson(value))
+              GoogleCloudDialogflowV2SessionEntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeZone')) {
@@ -9060,20 +9265,23 @@
     }
     if (_json.containsKey('diagnosticInfo')) {
       diagnosticInfo = commons.mapMap<core.Object, core.Object>(
-          _json['diagnosticInfo'].cast<core.String, core.Object>(),
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
-          .map<GoogleCloudDialogflowV2IntentMessage>(
-              (value) => GoogleCloudDialogflowV2IntentMessage.fromJson(value))
+          .map<GoogleCloudDialogflowV2IntentMessage>((value) =>
+              GoogleCloudDialogflowV2IntentMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fulfillmentText')) {
       fulfillmentText = _json['fulfillmentText'] as core.String;
     }
     if (_json.containsKey('intent')) {
-      intent = GoogleCloudDialogflowV2Intent.fromJson(_json['intent']);
+      intent = GoogleCloudDialogflowV2Intent.fromJson(
+          _json['intent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('intentDetectionConfidence')) {
       intentDetectionConfidence =
@@ -9084,13 +9292,15 @@
     }
     if (_json.containsKey('outputContexts')) {
       outputContexts = (_json['outputContexts'] as core.List)
-          .map<GoogleCloudDialogflowV2Context>(
-              (value) => GoogleCloudDialogflowV2Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2Context>((value) =>
+              GoogleCloudDialogflowV2Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Object, core.Object>(
-          _json['parameters'].cast<core.String, core.Object>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('queryText')) {
@@ -9099,7 +9309,8 @@
     if (_json.containsKey('sentimentAnalysisResult')) {
       sentimentAnalysisResult =
           GoogleCloudDialogflowV2SentimentAnalysisResult.fromJson(
-              _json['sentimentAnalysisResult']);
+              _json['sentimentAnalysisResult']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('speechRecognitionConfidence')) {
       speechRecognitionConfidence =
@@ -9107,7 +9318,8 @@
     }
     if (_json.containsKey('webhookPayload')) {
       webhookPayload = commons.mapMap<core.Object, core.Object>(
-          _json['webhookPayload'].cast<core.String, core.Object>(),
+          (_json['webhookPayload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('webhookSource')) {
@@ -9222,8 +9434,9 @@
   GoogleCloudDialogflowV2SearchAgentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('agents')) {
       agents = (_json['agents'] as core.List)
-          .map<GoogleCloudDialogflowV2Agent>(
-              (value) => GoogleCloudDialogflowV2Agent.fromJson(value))
+          .map<GoogleCloudDialogflowV2Agent>((value) =>
+              GoogleCloudDialogflowV2Agent.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -9320,7 +9533,7 @@
   GoogleCloudDialogflowV2SentimentAnalysisResult.fromJson(core.Map _json) {
     if (_json.containsKey('queryTextSentiment')) {
       queryTextSentiment = GoogleCloudDialogflowV2Sentiment.fromJson(
-          _json['queryTextSentiment']);
+          _json['queryTextSentiment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9377,7 +9590,8 @@
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
           .map<GoogleCloudDialogflowV2EntityTypeEntity>((value) =>
-              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(value))
+              GoogleCloudDialogflowV2EntityTypeEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entityOverrideMode')) {
@@ -9494,8 +9708,8 @@
       speakingRate = (_json['speakingRate'] as core.num).toDouble();
     }
     if (_json.containsKey('voice')) {
-      voice =
-          GoogleCloudDialogflowV2VoiceSelectionParams.fromJson(_json['voice']);
+      voice = GoogleCloudDialogflowV2VoiceSelectionParams.fromJson(
+          _json['voice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('volumeGainDb')) {
       volumeGainDb = (_json['volumeGainDb'] as core.num).toDouble();
@@ -9637,8 +9851,9 @@
   GoogleCloudDialogflowV2ValidationResult.fromJson(core.Map _json) {
     if (_json.containsKey('validationErrors')) {
       validationErrors = (_json['validationErrors'] as core.List)
-          .map<GoogleCloudDialogflowV2ValidationError>(
-              (value) => GoogleCloudDialogflowV2ValidationError.fromJson(value))
+          .map<GoogleCloudDialogflowV2ValidationError>((value) =>
+              GoogleCloudDialogflowV2ValidationError.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9722,11 +9937,12 @@
     if (_json.containsKey('originalDetectIntentRequest')) {
       originalDetectIntentRequest =
           GoogleCloudDialogflowV2OriginalDetectIntentRequest.fromJson(
-              _json['originalDetectIntentRequest']);
+              _json['originalDetectIntentRequest']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryResult')) {
-      queryResult =
-          GoogleCloudDialogflowV2QueryResult.fromJson(_json['queryResult']);
+      queryResult = GoogleCloudDialogflowV2QueryResult.fromJson(
+          _json['queryResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responseId')) {
       responseId = _json['responseId'] as core.String;
@@ -9816,12 +10032,13 @@
   GoogleCloudDialogflowV2WebhookResponse.fromJson(core.Map _json) {
     if (_json.containsKey('followupEventInput')) {
       followupEventInput = GoogleCloudDialogflowV2EventInput.fromJson(
-          _json['followupEventInput']);
+          _json['followupEventInput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
-          .map<GoogleCloudDialogflowV2IntentMessage>(
-              (value) => GoogleCloudDialogflowV2IntentMessage.fromJson(value))
+          .map<GoogleCloudDialogflowV2IntentMessage>((value) =>
+              GoogleCloudDialogflowV2IntentMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fulfillmentText')) {
@@ -9829,19 +10046,22 @@
     }
     if (_json.containsKey('outputContexts')) {
       outputContexts = (_json['outputContexts'] as core.List)
-          .map<GoogleCloudDialogflowV2Context>(
-              (value) => GoogleCloudDialogflowV2Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2Context>((value) =>
+              GoogleCloudDialogflowV2Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
           .map<GoogleCloudDialogflowV2SessionEntityType>((value) =>
-              GoogleCloudDialogflowV2SessionEntityType.fromJson(value))
+              GoogleCloudDialogflowV2SessionEntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('source')) {
@@ -10018,8 +10238,9 @@
       core.Map _json) {
     if (_json.containsKey('entityTypes')) {
       entityTypes = (_json['entityTypes'] as core.List)
-          .map<GoogleCloudDialogflowV2beta1EntityType>(
-              (value) => GoogleCloudDialogflowV2beta1EntityType.fromJson(value))
+          .map<GoogleCloudDialogflowV2beta1EntityType>((value) =>
+              GoogleCloudDialogflowV2beta1EntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10045,8 +10266,9 @@
       core.Map _json) {
     if (_json.containsKey('intents')) {
       intents = (_json['intents'] as core.List)
-          .map<GoogleCloudDialogflowV2beta1Intent>(
-              (value) => GoogleCloudDialogflowV2beta1Intent.fromJson(value))
+          .map<GoogleCloudDialogflowV2beta1Intent>((value) =>
+              GoogleCloudDialogflowV2beta1Intent.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10073,7 +10295,8 @@
     if (_json.containsKey('smartMessagingEntries')) {
       smartMessagingEntries = (_json['smartMessagingEntries'] as core.List)
           .map<GoogleCloudDialogflowV2beta1SmartMessagingEntry>((value) =>
-              GoogleCloudDialogflowV2beta1SmartMessagingEntry.fromJson(value))
+              GoogleCloudDialogflowV2beta1SmartMessagingEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10146,7 +10369,8 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Object, core.Object>(
-          _json['parameters'].cast<core.String, core.Object>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -10227,7 +10451,8 @@
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
           .map<GoogleCloudDialogflowV2beta1EntityTypeEntity>((value) =>
-              GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(value))
+              GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10340,7 +10565,8 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Object, core.Object>(
-          _json['parameters'].cast<core.String, core.Object>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -10409,7 +10635,8 @@
   GoogleCloudDialogflowV2beta1ImportDocumentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('warnings')) {
       warnings = (_json['warnings'] as core.List)
-          .map<GoogleRpcStatus>((value) => GoogleRpcStatus.fromJson(value))
+          .map<GoogleRpcStatus>((value) => GoogleRpcStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10566,7 +10793,7 @@
       followupIntentInfo = (_json['followupIntentInfo'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo>((value) =>
               GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inputContextNames')) {
@@ -10580,7 +10807,8 @@
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessage>((value) =>
-              GoogleCloudDialogflowV2beta1IntentMessage.fromJson(value))
+              GoogleCloudDialogflowV2beta1IntentMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mlDisabled')) {
@@ -10594,14 +10822,16 @@
     }
     if (_json.containsKey('outputContexts')) {
       outputContexts = (_json['outputContexts'] as core.List)
-          .map<GoogleCloudDialogflowV2beta1Context>(
-              (value) => GoogleCloudDialogflowV2beta1Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2beta1Context>((value) =>
+              GoogleCloudDialogflowV2beta1Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentParameter>((value) =>
-              GoogleCloudDialogflowV2beta1IntentParameter.fromJson(value))
+              GoogleCloudDialogflowV2beta1IntentParameter.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFollowupIntentName')) {
@@ -10620,7 +10850,8 @@
     if (_json.containsKey('trainingPhrases')) {
       trainingPhrases = (_json['trainingPhrases'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentTrainingPhrase>((value) =>
-              GoogleCloudDialogflowV2beta1IntentTrainingPhrase.fromJson(value))
+              GoogleCloudDialogflowV2beta1IntentTrainingPhrase.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webhookState')) {
@@ -10825,43 +11056,46 @@
   GoogleCloudDialogflowV2beta1IntentMessage.fromJson(core.Map _json) {
     if (_json.containsKey('basicCard')) {
       basicCard = GoogleCloudDialogflowV2beta1IntentMessageBasicCard.fromJson(
-          _json['basicCard']);
+          _json['basicCard'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('browseCarouselCard')) {
       browseCarouselCard =
           GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard.fromJson(
-              _json['browseCarouselCard']);
+              _json['browseCarouselCard']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('card')) {
-      card =
-          GoogleCloudDialogflowV2beta1IntentMessageCard.fromJson(_json['card']);
+      card = GoogleCloudDialogflowV2beta1IntentMessageCard.fromJson(
+          _json['card'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('carouselSelect')) {
       carouselSelect =
           GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect.fromJson(
-              _json['carouselSelect']);
+              _json['carouselSelect'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('image')) {
       image = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['image']);
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linkOutSuggestion')) {
       linkOutSuggestion =
           GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion.fromJson(
-              _json['linkOutSuggestion']);
+              _json['linkOutSuggestion']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('listSelect')) {
       listSelect = GoogleCloudDialogflowV2beta1IntentMessageListSelect.fromJson(
-          _json['listSelect']);
+          _json['listSelect'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mediaContent')) {
       mediaContent =
           GoogleCloudDialogflowV2beta1IntentMessageMediaContent.fromJson(
-              _json['mediaContent']);
+              _json['mediaContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('platform')) {
@@ -10870,54 +11104,59 @@
     if (_json.containsKey('quickReplies')) {
       quickReplies =
           GoogleCloudDialogflowV2beta1IntentMessageQuickReplies.fromJson(
-              _json['quickReplies']);
+              _json['quickReplies'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rbmCarouselRichCard')) {
       rbmCarouselRichCard =
           GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard.fromJson(
-              _json['rbmCarouselRichCard']);
+              _json['rbmCarouselRichCard']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rbmStandaloneRichCard')) {
       rbmStandaloneRichCard =
           GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard.fromJson(
-              _json['rbmStandaloneRichCard']);
+              _json['rbmStandaloneRichCard']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rbmText')) {
       rbmText = GoogleCloudDialogflowV2beta1IntentMessageRbmText.fromJson(
-          _json['rbmText']);
+          _json['rbmText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('simpleResponses')) {
       simpleResponses =
           GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses.fromJson(
-              _json['simpleResponses']);
+              _json['simpleResponses'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestions')) {
       suggestions =
           GoogleCloudDialogflowV2beta1IntentMessageSuggestions.fromJson(
-              _json['suggestions']);
+              _json['suggestions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableCard')) {
       tableCard = GoogleCloudDialogflowV2beta1IntentMessageTableCard.fromJson(
-          _json['tableCard']);
+          _json['tableCard'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('telephonyPlayAudio')) {
       telephonyPlayAudio =
           GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio.fromJson(
-              _json['telephonyPlayAudio']);
+              _json['telephonyPlayAudio']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('telephonySynthesizeSpeech')) {
       telephonySynthesizeSpeech =
           GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech
-              .fromJson(_json['telephonySynthesizeSpeech']);
+              .fromJson(_json['telephonySynthesizeSpeech']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('telephonyTransferCall')) {
       telephonyTransferCall =
           GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall
-              .fromJson(_json['telephonyTransferCall']);
+              .fromJson(_json['telephonyTransferCall']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text =
-          GoogleCloudDialogflowV2beta1IntentMessageText.fromJson(_json['text']);
+      text = GoogleCloudDialogflowV2beta1IntentMessageText.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11015,7 +11254,7 @@
           .map<GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton>(
               (value) =>
                   GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('formattedText')) {
@@ -11023,7 +11262,7 @@
     }
     if (_json.containsKey('image')) {
       image = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['image']);
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subtitle')) {
       subtitle = _json['subtitle'] as core.String;
@@ -11070,7 +11309,8 @@
     if (_json.containsKey('openUriAction')) {
       openUriAction =
           GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction
-              .fromJson(_json['openUriAction']);
+              .fromJson(_json['openUriAction']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -11152,7 +11392,7 @@
           .map<GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem>(
               (value) =>
                   GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11200,12 +11440,13 @@
     }
     if (_json.containsKey('image')) {
       image = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['image']);
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('openUriAction')) {
       openUriAction =
           GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
-              .fromJson(_json['openUriAction']);
+              .fromJson(_json['openUriAction']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -11292,7 +11533,7 @@
       buttons = (_json['buttons'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageCardButton>((value) =>
               GoogleCloudDialogflowV2beta1IntentMessageCardButton.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imageUri')) {
@@ -11369,7 +11610,7 @@
           .map<GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem>(
               (value) =>
                   GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11406,11 +11647,11 @@
     }
     if (_json.containsKey('image')) {
       image = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['image']);
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('info')) {
       info = GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo.fromJson(
-          _json['info']);
+          _json['info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -11557,7 +11798,7 @@
       items = (_json['items'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageListSelectItem>(
               (value) => GoogleCloudDialogflowV2beta1IntentMessageListSelectItem
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subtitle')) {
@@ -11606,11 +11847,11 @@
     }
     if (_json.containsKey('image')) {
       image = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['image']);
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('info')) {
       info = GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo.fromJson(
-          _json['info']);
+          _json['info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -11657,7 +11898,7 @@
           .map<GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject>(
               (value) =>
                   GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mediaType')) {
@@ -11707,11 +11948,11 @@
     }
     if (_json.containsKey('icon')) {
       icon = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['icon']);
+          _json['icon'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('largeImage')) {
       largeImage = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['largeImage']);
+          _json['largeImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -11799,13 +12040,13 @@
     }
     if (_json.containsKey('media')) {
       media = GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia
-          .fromJson(_json['media']);
+          .fromJson(_json['media'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestions')) {
       suggestions = (_json['suggestions'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion>(
               (value) => GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -11916,7 +12157,7 @@
       cardContents = (_json['cardContents'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent>(
               (value) => GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cardWidth')) {
@@ -11967,7 +12208,7 @@
     if (_json.containsKey('cardContent')) {
       cardContent =
           GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent.fromJson(
-              _json['cardContent']);
+              _json['cardContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cardOrientation')) {
       cardOrientation = _json['cardOrientation'] as core.String;
@@ -12022,12 +12263,13 @@
     if (_json.containsKey('dial')) {
       dial =
           GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial
-              .fromJson(_json['dial']);
+              .fromJson(_json['dial'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('openUrl')) {
       openUrl =
           GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri
-              .fromJson(_json['openUrl']);
+              .fromJson(
+                  _json['openUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('postbackData')) {
       postbackData = _json['postbackData'] as core.String;
@@ -12035,7 +12277,8 @@
     if (_json.containsKey('shareLocation')) {
       shareLocation =
           GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation
-              .fromJson(_json['shareLocation']);
+              .fromJson(_json['shareLocation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -12182,12 +12425,12 @@
     if (_json.containsKey('action')) {
       action =
           GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction.fromJson(
-              _json['action']);
+              _json['action'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reply')) {
       reply =
           GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply.fromJson(
-              _json['reply']);
+              _json['reply'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12219,7 +12462,7 @@
       rbmSuggestion = (_json['rbmSuggestion'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion>(
               (value) => GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -12336,7 +12579,7 @@
       simpleResponses = (_json['simpleResponses'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse>(
               (value) => GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12387,7 +12630,7 @@
       suggestions = (_json['suggestions'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageSuggestion>((value) =>
               GoogleCloudDialogflowV2beta1IntentMessageSuggestion.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12431,7 +12674,7 @@
           .map<GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton>(
               (value) =>
                   GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('columnProperties')) {
@@ -12439,18 +12682,18 @@
           .map<GoogleCloudDialogflowV2beta1IntentMessageColumnProperties>(
               (value) =>
                   GoogleCloudDialogflowV2beta1IntentMessageColumnProperties
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('image')) {
       image = GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
-          _json['image']);
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageTableCardRow>((value) =>
               GoogleCloudDialogflowV2beta1IntentMessageTableCardRow.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subtitle')) {
@@ -12525,7 +12768,7 @@
       cells = (_json['cells'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessageTableCardCell>(
               (value) => GoogleCloudDialogflowV2beta1IntentMessageTableCardCell
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dividerAfter')) {
@@ -12803,7 +13046,7 @@
       parts = (_json['parts'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart>((value) =>
               GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timesAddedCount')) {
@@ -12900,7 +13143,7 @@
       answers = (_json['answers'] as core.List)
           .map<GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer>((value) =>
               GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13032,7 +13275,8 @@
     if (_json.containsKey('annotatedConversationDataset')) {
       annotatedConversationDataset =
           GoogleCloudDialogflowV2beta1AnnotatedConversationDataset.fromJson(
-              _json['annotatedConversationDataset']);
+              _json['annotatedConversationDataset']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13076,7 +13320,8 @@
       core.Map _json) {
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('source')) {
@@ -13214,20 +13459,23 @@
     }
     if (_json.containsKey('diagnosticInfo')) {
       diagnosticInfo = commons.mapMap<core.Object, core.Object>(
-          _json['diagnosticInfo'].cast<core.String, core.Object>(),
+          (_json['diagnosticInfo'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessage>((value) =>
-              GoogleCloudDialogflowV2beta1IntentMessage.fromJson(value))
+              GoogleCloudDialogflowV2beta1IntentMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fulfillmentText')) {
       fulfillmentText = _json['fulfillmentText'] as core.String;
     }
     if (_json.containsKey('intent')) {
-      intent = GoogleCloudDialogflowV2beta1Intent.fromJson(_json['intent']);
+      intent = GoogleCloudDialogflowV2beta1Intent.fromJson(
+          _json['intent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('intentDetectionConfidence')) {
       intentDetectionConfidence =
@@ -13235,20 +13483,22 @@
     }
     if (_json.containsKey('knowledgeAnswers')) {
       knowledgeAnswers = GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(
-          _json['knowledgeAnswers']);
+          _json['knowledgeAnswers'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
     }
     if (_json.containsKey('outputContexts')) {
       outputContexts = (_json['outputContexts'] as core.List)
-          .map<GoogleCloudDialogflowV2beta1Context>(
-              (value) => GoogleCloudDialogflowV2beta1Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2beta1Context>((value) =>
+              GoogleCloudDialogflowV2beta1Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Object, core.Object>(
-          _json['parameters'].cast<core.String, core.Object>(),
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('queryText')) {
@@ -13257,7 +13507,8 @@
     if (_json.containsKey('sentimentAnalysisResult')) {
       sentimentAnalysisResult =
           GoogleCloudDialogflowV2beta1SentimentAnalysisResult.fromJson(
-              _json['sentimentAnalysisResult']);
+              _json['sentimentAnalysisResult']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('speechRecognitionConfidence')) {
       speechRecognitionConfidence =
@@ -13265,7 +13516,8 @@
     }
     if (_json.containsKey('webhookPayload')) {
       webhookPayload = commons.mapMap<core.Object, core.Object>(
-          _json['webhookPayload'].cast<core.String, core.Object>(),
+          (_json['webhookPayload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('webhookSource')) {
@@ -13381,7 +13633,7 @@
   GoogleCloudDialogflowV2beta1SentimentAnalysisResult.fromJson(core.Map _json) {
     if (_json.containsKey('queryTextSentiment')) {
       queryTextSentiment = GoogleCloudDialogflowV2beta1Sentiment.fromJson(
-          _json['queryTextSentiment']);
+          _json['queryTextSentiment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13441,7 +13693,8 @@
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
           .map<GoogleCloudDialogflowV2beta1EntityTypeEntity>((value) =>
-              GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(value))
+              GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entityOverrideMode')) {
@@ -13497,7 +13750,7 @@
     if (_json.containsKey('messageInfo')) {
       messageInfo =
           GoogleCloudDialogflowV2beta1SmartMessagingEntryInfo.fromJson(
-              _json['messageInfo']);
+              _json['messageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -13599,17 +13852,19 @@
     if (_json.containsKey('alternativeQueryResults')) {
       alternativeQueryResults = (_json['alternativeQueryResults'] as core.List)
           .map<GoogleCloudDialogflowV2beta1QueryResult>((value) =>
-              GoogleCloudDialogflowV2beta1QueryResult.fromJson(value))
+              GoogleCloudDialogflowV2beta1QueryResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('originalDetectIntentRequest')) {
       originalDetectIntentRequest =
           GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest.fromJson(
-              _json['originalDetectIntentRequest']);
+              _json['originalDetectIntentRequest']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryResult')) {
       queryResult = GoogleCloudDialogflowV2beta1QueryResult.fromJson(
-          _json['queryResult']);
+          _json['queryResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responseId')) {
       responseId = _json['responseId'] as core.String;
@@ -13711,12 +13966,13 @@
     }
     if (_json.containsKey('followupEventInput')) {
       followupEventInput = GoogleCloudDialogflowV2beta1EventInput.fromJson(
-          _json['followupEventInput']);
+          _json['followupEventInput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fulfillmentMessages')) {
       fulfillmentMessages = (_json['fulfillmentMessages'] as core.List)
           .map<GoogleCloudDialogflowV2beta1IntentMessage>((value) =>
-              GoogleCloudDialogflowV2beta1IntentMessage.fromJson(value))
+              GoogleCloudDialogflowV2beta1IntentMessage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fulfillmentText')) {
@@ -13724,19 +13980,22 @@
     }
     if (_json.containsKey('outputContexts')) {
       outputContexts = (_json['outputContexts'] as core.List)
-          .map<GoogleCloudDialogflowV2beta1Context>(
-              (value) => GoogleCloudDialogflowV2beta1Context.fromJson(value))
+          .map<GoogleCloudDialogflowV2beta1Context>((value) =>
+              GoogleCloudDialogflowV2beta1Context.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('sessionEntityTypes')) {
       sessionEntityTypes = (_json['sessionEntityTypes'] as core.List)
           .map<GoogleCloudDialogflowV2beta1SessionEntityType>((value) =>
-              GoogleCloudDialogflowV2beta1SessionEntityType.fromJson(value))
+              GoogleCloudDialogflowV2beta1SessionEntityType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('source')) {
@@ -13948,8 +14207,9 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleLongrunningOperation>(
-              (value) => GoogleLongrunningOperation.fromJson(value))
+          .map<GoogleLongrunningOperation>((value) =>
+              GoogleLongrunningOperation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14010,11 +14270,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -14022,7 +14284,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -14098,7 +14361,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/digitalassetlinks/v1.dart b/generated/googleapis/lib/digitalassetlinks/v1.dart
index 0870c67..a901905 100644
--- a/generated/googleapis/lib/digitalassetlinks/v1.dart
+++ b/generated/googleapis/lib/digitalassetlinks/v1.dart
@@ -221,7 +221,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CheckResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          CheckResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -346,7 +349,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          ListResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -374,7 +380,8 @@
 
   AndroidAppAsset.fromJson(core.Map _json) {
     if (_json.containsKey('certificate')) {
-      certificate = CertificateInfo.fromJson(_json['certificate']);
+      certificate = CertificateInfo.fromJson(
+          _json['certificate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('packageName')) {
       packageName = _json['packageName'] as core.String;
@@ -408,10 +415,12 @@
 
   Asset.fromJson(core.Map _json) {
     if (_json.containsKey('androidApp')) {
-      androidApp = AndroidAppAsset.fromJson(_json['androidApp']);
+      androidApp = AndroidAppAsset.fromJson(
+          _json['androidApp'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('web')) {
-      web = WebAsset.fromJson(_json['web']);
+      web = WebAsset.fromJson(
+          _json['web'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -558,7 +567,8 @@
     }
     if (_json.containsKey('statements')) {
       statements = (_json['statements'] as core.List)
-          .map<Statement>((value) => Statement.fromJson(value))
+          .map<Statement>((value) =>
+              Statement.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -612,10 +622,12 @@
       relation = _json['relation'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = Asset.fromJson(_json['source']);
+      source = Asset.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('target')) {
-      target = Asset.fromJson(_json['target']);
+      target = Asset.fromJson(
+          _json['target'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/discovery/v1.dart b/generated/googleapis/lib/discovery/v1.dart
index 0f02eb0..d4eeda5 100644
--- a/generated/googleapis/lib/discovery/v1.dart
+++ b/generated/googleapis/lib/discovery/v1.dart
@@ -103,7 +103,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RestDescription.fromJson(data));
+    return _response.then(
+      (data) =>
+          RestDescription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve the list of APIs supported at this endpoint.
@@ -157,7 +160,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DirectoryList.fromJson(data));
+    return _response.then(
+      (data) =>
+          DirectoryList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -245,7 +251,8 @@
       documentationLink = _json['documentationLink'] as core.String;
     }
     if (_json.containsKey('icons')) {
-      icons = DirectoryListItemsIcons.fromJson(_json['icons']);
+      icons = DirectoryListItemsIcons.fromJson(
+          _json['icons'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -332,8 +339,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<DirectoryListItems>(
-              (value) => DirectoryListItems.fromJson(value))
+          .map<DirectoryListItems>((value) => DirectoryListItems.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -425,8 +432,8 @@
     }
     if (_json.containsKey('map')) {
       map = (_json['map'] as core.List)
-          .map<JsonSchemaVariantMap>(
-              (value) => JsonSchemaVariantMap.fromJson(value))
+          .map<JsonSchemaVariantMap>((value) => JsonSchemaVariantMap.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -525,10 +532,12 @@
       P_ref = _json['\$ref'] as core.String;
     }
     if (_json.containsKey('additionalProperties')) {
-      additionalProperties = JsonSchema.fromJson(_json['additionalProperties']);
+      additionalProperties = JsonSchema.fromJson(
+          _json['additionalProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annotations')) {
-      annotations = JsonSchemaAnnotations.fromJson(_json['annotations']);
+      annotations = JsonSchemaAnnotations.fromJson(
+          _json['annotations'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('default')) {
       default_ = _json['default'] as core.String;
@@ -553,7 +562,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('items')) {
-      items = JsonSchema.fromJson(_json['items']);
+      items = JsonSchema.fromJson(
+          _json['items'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -569,8 +579,10 @@
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.Map, JsonSchema>(
-          _json['properties'].cast<core.String, core.Map>(),
-          (core.Map item) => JsonSchema.fromJson(item));
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('readOnly')) {
       readOnly = _json['readOnly'] as core.bool;
@@ -585,7 +597,8 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('variant')) {
-      variant = JsonSchemaVariant.fromJson(_json['variant']);
+      variant = JsonSchemaVariant.fromJson(
+          _json['variant'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -689,9 +702,10 @@
   RestDescriptionAuthOauth2.fromJson(core.Map _json) {
     if (_json.containsKey('scopes')) {
       scopes = commons.mapMap<core.Map, RestDescriptionAuthOauth2ScopesValue>(
-          _json['scopes'].cast<core.String, core.Map>(),
-          (core.Map item) =>
-              RestDescriptionAuthOauth2ScopesValue.fromJson(item));
+          (_json['scopes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => RestDescriptionAuthOauth2ScopesValue.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -715,7 +729,8 @@
 
   RestDescriptionAuth.fromJson(core.Map _json) {
     if (_json.containsKey('oauth2')) {
-      oauth2 = RestDescriptionAuthOauth2.fromJson(_json['oauth2']);
+      oauth2 = RestDescriptionAuthOauth2.fromJson(
+          _json['oauth2'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -855,7 +870,8 @@
 
   RestDescription.fromJson(core.Map _json) {
     if (_json.containsKey('auth')) {
-      auth = RestDescriptionAuth.fromJson(_json['auth']);
+      auth = RestDescriptionAuth.fromJson(
+          _json['auth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('basePath')) {
       basePath = _json['basePath'] as core.String;
@@ -891,7 +907,8 @@
           .toList();
     }
     if (_json.containsKey('icons')) {
-      icons = RestDescriptionIcons.fromJson(_json['icons']);
+      icons = RestDescriptionIcons.fromJson(
+          _json['icons'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -906,8 +923,10 @@
     }
     if (_json.containsKey('methods')) {
       methods = commons.mapMap<core.Map, RestMethod>(
-          _json['methods'].cast<core.String, core.Map>(),
-          (core.Map item) => RestMethod.fromJson(item));
+          (_json['methods'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              RestMethod.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -923,16 +942,20 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Map, JsonSchema>(
-          _json['parameters'].cast<core.String, core.Map>(),
-          (core.Map item) => JsonSchema.fromJson(item));
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('protocol')) {
       protocol = _json['protocol'] as core.String;
     }
     if (_json.containsKey('resources')) {
       resources = commons.mapMap<core.Map, RestResource>(
-          _json['resources'].cast<core.String, core.Map>(),
-          (core.Map item) => RestResource.fromJson(item));
+          (_json['resources'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => RestResource.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('revision')) {
       revision = _json['revision'] as core.String;
@@ -942,8 +965,10 @@
     }
     if (_json.containsKey('schemas')) {
       schemas = commons.mapMap<core.Map, JsonSchema>(
-          _json['schemas'].cast<core.String, core.Map>(),
-          (core.Map item) => JsonSchema.fromJson(item));
+          (_json['schemas'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('servicePath')) {
       servicePath = _json['servicePath'] as core.String;
@@ -1139,11 +1164,12 @@
 
   RestMethodMediaUploadProtocols.fromJson(core.Map _json) {
     if (_json.containsKey('resumable')) {
-      resumable =
-          RestMethodMediaUploadProtocolsResumable.fromJson(_json['resumable']);
+      resumable = RestMethodMediaUploadProtocolsResumable.fromJson(
+          _json['resumable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('simple')) {
-      simple = RestMethodMediaUploadProtocolsSimple.fromJson(_json['simple']);
+      simple = RestMethodMediaUploadProtocolsSimple.fromJson(
+          _json['simple'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1182,7 +1208,8 @@
       maxSize = _json['maxSize'] as core.String;
     }
     if (_json.containsKey('protocols')) {
-      protocols = RestMethodMediaUploadProtocols.fromJson(_json['protocols']);
+      protocols = RestMethodMediaUploadProtocols.fromJson(
+          _json['protocols'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1323,7 +1350,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('mediaUpload')) {
-      mediaUpload = RestMethodMediaUpload.fromJson(_json['mediaUpload']);
+      mediaUpload = RestMethodMediaUpload.fromJson(
+          _json['mediaUpload'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameterOrder')) {
       parameterOrder = (_json['parameterOrder'] as core.List)
@@ -1332,17 +1360,21 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = commons.mapMap<core.Map, JsonSchema>(
-          _json['parameters'].cast<core.String, core.Map>(),
-          (core.Map item) => JsonSchema.fromJson(item));
+          (_json['parameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              JsonSchema.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('path')) {
       path = _json['path'] as core.String;
     }
     if (_json.containsKey('request')) {
-      request = RestMethodRequest.fromJson(_json['request']);
+      request = RestMethodRequest.fromJson(
+          _json['request'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('response')) {
-      response = RestMethodResponse.fromJson(_json['response']);
+      response = RestMethodResponse.fromJson(
+          _json['response'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scopes')) {
       scopes = (_json['scopes'] as core.List)
@@ -1428,13 +1460,17 @@
   RestResource.fromJson(core.Map _json) {
     if (_json.containsKey('methods')) {
       methods = commons.mapMap<core.Map, RestMethod>(
-          _json['methods'].cast<core.String, core.Map>(),
-          (core.Map item) => RestMethod.fromJson(item));
+          (_json['methods'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              RestMethod.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('resources')) {
       resources = commons.mapMap<core.Map, RestResource>(
-          _json['resources'].cast<core.String, core.Map>(),
-          (core.Map item) => RestResource.fromJson(item));
+          (_json['resources'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => RestResource.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
diff --git a/generated/googleapis/lib/displayvideo/v1.dart b/generated/googleapis/lib/displayvideo/v1.dart
index 321edd8..7319078 100644
--- a/generated/googleapis/lib/displayvideo/v1.dart
+++ b/generated/googleapis/lib/displayvideo/v1.dart
@@ -177,7 +177,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AuditAdvertiserResponse.fromJson(data));
+    return _response.then(
+      (data) => AuditAdvertiserResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Bulk edits targeting options under a single advertiser. The operation will
@@ -239,8 +242,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BulkEditAdvertiserAssignedTargetingOptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditAdvertiserAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists assigned targeting options of an advertiser across targeting types.
@@ -332,8 +337,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BulkListAdvertiserAssignedTargetingOptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkListAdvertiserAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new advertiser. Returns the newly created advertiser if
@@ -382,7 +389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Advertiser.fromJson(data));
+    return _response.then(
+      (data) =>
+          Advertiser.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an advertiser. Deleting an advertiser will delete all of its child
@@ -434,7 +444,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an advertiser.
@@ -484,7 +496,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Advertiser.fromJson(data));
+    return _response.then(
+      (data) =>
+          Advertiser.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists advertisers that are accessible to the current user. The order is
@@ -575,7 +590,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAdvertisersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAdvertisersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing advertiser. Returns the updated advertiser if
@@ -639,7 +657,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Advertiser.fromJson(data));
+    return _response.then(
+      (data) =>
+          Advertiser.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -717,7 +738,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreateAssetResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateAssetResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -782,7 +806,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Campaign.fromJson(data));
+    return _response.then(
+      (data) => Campaign.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a campaign. A deleted campaign cannot be recovered.
@@ -843,7 +869,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a campaign.
@@ -903,7 +931,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Campaign.fromJson(data));
+    return _response.then(
+      (data) => Campaign.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists campaigns in an advertiser. The order is defined by the order_by
@@ -996,7 +1026,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCampaignsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCampaignsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing campaign. Returns the updated campaign if successful.
@@ -1069,7 +1102,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Campaign.fromJson(data));
+    return _response.then(
+      (data) => Campaign.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1142,7 +1177,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a channel for a partner or advertiser.
@@ -1207,7 +1244,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists channels for a partner or advertiser.
@@ -1302,7 +1341,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListChannelsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListChannelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a channel. Returns the updated channel if successful.
@@ -1379,7 +1421,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1454,7 +1498,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BulkEditSitesResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditSitesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a site in a channel.
@@ -1526,7 +1573,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Site.fromJson(data));
+    return _response.then(
+      (data) => Site.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a site from a channel.
@@ -1600,7 +1649,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists sites in a channel.
@@ -1704,7 +1755,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSitesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSitesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1769,7 +1823,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a creative. Returns error code `NOT_FOUND` if the creative does
@@ -1830,7 +1886,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a creative.
@@ -1890,7 +1948,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists creatives in an advertiser. The order is defined by the order_by
@@ -2005,7 +2065,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCreativesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCreativesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing creative. Returns the updated creative if successful.
@@ -2078,7 +2141,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Creative.fromJson(data));
+    return _response.then(
+      (data) => Creative.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2144,7 +2209,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InsertionOrder.fromJson(data));
+    return _response.then(
+      (data) =>
+          InsertionOrder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an insertion order. Returns error code `NOT_FOUND` if the
@@ -2206,7 +2274,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an insertion order. Returns error code `NOT_FOUND` if the insertion
@@ -2267,7 +2337,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InsertionOrder.fromJson(data));
+    return _response.then(
+      (data) =>
+          InsertionOrder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists insertion orders in an advertiser. The order is defined by the
@@ -2369,7 +2442,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInsertionOrdersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInsertionOrdersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing insertion order. Returns the updated insertion order
@@ -2443,7 +2519,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InsertionOrder.fromJson(data));
+    return _response.then(
+      (data) =>
+          InsertionOrder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2526,8 +2605,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BulkEditLineItemAssignedTargetingOptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditLineItemAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists assigned targeting options of a line item across targeting types.
@@ -2634,8 +2715,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BulkListLineItemAssignedTargetingOptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkListLineItemAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new line item. Returns the newly created line item if
@@ -2694,7 +2777,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LineItem.fromJson(data));
+    return _response.then(
+      (data) => LineItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a line item. Returns error code `NOT_FOUND` if the line item does
@@ -2755,7 +2840,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a line item.
@@ -2815,7 +2902,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LineItem.fromJson(data));
+    return _response.then(
+      (data) => LineItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists line items in an advertiser. The order is defined by the order_by
@@ -2922,7 +3011,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLineItemsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLineItemsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing line item. Returns the updated line item if
@@ -2996,7 +3088,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LineItem.fromJson(data));
+    return _response.then(
+      (data) => LineItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3174,7 +3268,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedTargetingOption.fromJson(data));
+    return _response.then(
+      (data) => AssignedTargetingOption.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an assigned targeting option from a line item.
@@ -3335,7 +3432,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single targeting option assigned to a line item.
@@ -3497,7 +3596,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedTargetingOption.fromJson(data));
+    return _response.then(
+      (data) => AssignedTargetingOption.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the targeting options assigned to a line item.
@@ -3691,7 +3793,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListLineItemAssignedTargetingOptionsResponse.fromJson(data));
+      (data) => ListLineItemAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3760,7 +3864,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LocationList.fromJson(data));
+    return _response.then(
+      (data) =>
+          LocationList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a location list.
@@ -3820,7 +3927,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LocationList.fromJson(data));
+    return _response.then(
+      (data) =>
+          LocationList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists location lists based on a given advertiser id.
@@ -3911,7 +4021,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationListsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationListsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a location list. Returns the updated location list if successful.
@@ -3983,7 +4096,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LocationList.fromJson(data));
+    return _response.then(
+      (data) =>
+          LocationList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4062,8 +4178,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BulkEditAssignedLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditAssignedLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an assignment between a location and a location list.
@@ -4129,7 +4247,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedLocation.fromJson(data));
+    return _response.then(
+      (data) => AssignedLocation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the assignment between a location and a location list.
@@ -4198,7 +4319,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists locations assigned to a location list.
@@ -4295,8 +4418,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAssignedLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAssignedLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4367,7 +4492,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NegativeKeywordList.fromJson(data));
+    return _response.then(
+      (data) => NegativeKeywordList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a negative keyword list given an advertiser ID and a negative
@@ -4429,7 +4557,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a negative keyword list given an advertiser ID and a negative keyword
@@ -4491,7 +4621,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NegativeKeywordList.fromJson(data));
+    return _response.then(
+      (data) => NegativeKeywordList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists negative keyword lists based on a given advertiser id.
@@ -4560,8 +4693,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListNegativeKeywordListsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListNegativeKeywordListsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a negative keyword list. Returns the updated negative keyword list
@@ -4634,7 +4769,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NegativeKeywordList.fromJson(data));
+    return _response.then(
+      (data) => NegativeKeywordList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4715,8 +4853,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BulkEditNegativeKeywordsResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditNegativeKeywordsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a negative keyword in a negative keyword list.
@@ -4783,7 +4923,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NegativeKeyword.fromJson(data));
+    return _response.then(
+      (data) =>
+          NegativeKeyword.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a negative keyword from a negative keyword list.
@@ -4853,7 +4996,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists negative keywords in a negative keyword list.
@@ -4952,8 +5097,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListNegativeKeywordsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListNegativeKeywordsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5120,7 +5267,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedTargetingOption.fromJson(data));
+    return _response.then(
+      (data) => AssignedTargetingOption.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an assigned targeting option from an advertiser.
@@ -5270,7 +5420,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single targeting option assigned to an advertiser.
@@ -5421,7 +5573,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedTargetingOption.fromJson(data));
+    return _response.then(
+      (data) => AssignedTargetingOption.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the targeting options assigned to an advertiser.
@@ -5600,8 +5755,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        ListAdvertiserAssignedTargetingOptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAdvertiserAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5672,7 +5829,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CombinedAudience.fromJson(data));
+    return _response.then(
+      (data) => CombinedAudience.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists combined audiences. The order is defined by the order_by parameter.
@@ -5766,8 +5926,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListCombinedAudiencesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCombinedAudiencesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5840,7 +6002,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomBiddingAlgorithm.fromJson(data));
+    return _response.then(
+      (data) => CustomBiddingAlgorithm.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists custom bidding algorithms that are accessible to the current user
@@ -5945,8 +6110,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListCustomBiddingAlgorithmsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCustomBiddingAlgorithmsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6009,7 +6176,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists custom lists. The order is defined by the order_by parameter.
@@ -6096,7 +6266,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCustomListsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCustomListsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6169,7 +6342,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FirstAndThirdPartyAudience.fromJson(data));
+    return _response.then(
+      (data) => FirstAndThirdPartyAudience.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists first and third party audiences. The order is defined by the
@@ -6266,8 +6442,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListFirstAndThirdPartyAudiencesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFirstAndThirdPartyAudiencesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6331,7 +6509,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          FloodlightGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing Floodlight group. Returns the updated Floodlight group
@@ -6401,7 +6582,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FloodlightGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          FloodlightGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6471,7 +6655,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleAudience.fromJson(data));
+    return _response.then(
+      (data) =>
+          GoogleAudience.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists Google audiences. The order is defined by the order_by parameter.
@@ -6565,7 +6752,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGoogleAudiencesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGoogleAudiencesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6641,7 +6831,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InventorySourceGroup.fromJson(data));
+    return _response.then(
+      (data) => InventorySourceGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an inventory source group.
@@ -6706,7 +6899,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an inventory source group.
@@ -6773,7 +6968,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InventorySourceGroup.fromJson(data));
+    return _response.then(
+      (data) => InventorySourceGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists inventory source groups that are accessible to the current user. The
@@ -6869,8 +7067,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListInventorySourceGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInventorySourceGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an inventory source group. Returns the updated inventory source
@@ -6947,7 +7147,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InventorySourceGroup.fromJson(data));
+    return _response.then(
+      (data) => InventorySourceGroup.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7019,7 +7222,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => BulkEditAssignedInventorySourcesResponse.fromJson(data));
+      (data) => BulkEditAssignedInventorySourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an assignment between an inventory source and an inventory source
@@ -7094,7 +7299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedInventorySource.fromJson(data));
+    return _response.then(
+      (data) => AssignedInventorySource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the assignment between an inventory source and an inventory source
@@ -7173,7 +7381,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists inventory sources assigned to an inventory source group.
@@ -7280,8 +7490,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAssignedInventorySourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAssignedInventorySourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7345,7 +7557,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InventorySource.fromJson(data));
+    return _response.then(
+      (data) =>
+          InventorySource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists inventory sources that are accessible to the current user. The order
@@ -7445,8 +7660,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListInventorySourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInventorySourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7517,7 +7734,10 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => GoogleBytestreamMedia.fromJson(data));
+      return _response.then(
+        (data) => GoogleBytestreamMedia.fromJson(
+            data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -7593,8 +7813,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BulkEditPartnerAssignedTargetingOptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditPartnerAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a partner.
@@ -7643,7 +7865,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Partner.fromJson(data));
+    return _response.then(
+      (data) => Partner.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists partners that are accessible to the current user. The order is
@@ -7724,7 +7948,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListPartnersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPartnersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7797,7 +8024,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a channel for a partner or advertiser.
@@ -7862,7 +8091,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists channels for a partner or advertiser.
@@ -7957,7 +8188,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListChannelsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListChannelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a channel. Returns the updated channel if successful.
@@ -8034,7 +8268,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8109,7 +8345,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BulkEditSitesResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditSitesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a site in a channel.
@@ -8181,7 +8420,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Site.fromJson(data));
+    return _response.then(
+      (data) => Site.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a site from a channel.
@@ -8255,7 +8496,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists sites in a channel.
@@ -8359,7 +8602,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSitesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSitesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -8525,7 +8771,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedTargetingOption.fromJson(data));
+    return _response.then(
+      (data) => AssignedTargetingOption.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an assigned targeting option from a partner.
@@ -8675,7 +8924,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single targeting option assigned to a partner.
@@ -8826,7 +9077,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AssignedTargetingOption.fromJson(data));
+    return _response.then(
+      (data) => AssignedTargetingOption.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the targeting options assigned to a partner.
@@ -9006,7 +9260,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListPartnerAssignedTargetingOptionsResponse.fromJson(data));
+      (data) => ListPartnerAssignedTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9071,7 +9327,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9128,7 +9386,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9290,7 +9550,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TargetingOption.fromJson(data));
+    return _response.then(
+      (data) =>
+          TargetingOption.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists targeting options of a given type.
@@ -9472,8 +9735,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListTargetingOptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTargetingOptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -9541,8 +9806,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BulkEditAssignedUserRolesResponse.fromJson(data));
+    return _response.then(
+      (data) => BulkEditAssignedUserRolesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new user. Returns the newly created user if successful.
@@ -9590,7 +9857,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a user.
@@ -9639,7 +9908,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a user.
@@ -9688,7 +9959,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists users that are accessible to the current user. If two users have
@@ -9784,7 +10057,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListUsersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUsersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing user. Returns the updated user if successful.
@@ -9845,7 +10121,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => User.fromJson(data));
+    return _response.then(
+      (data) => User.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -10049,19 +10327,19 @@
 
   Advertiser.fromJson(core.Map _json) {
     if (_json.containsKey('adServerConfig')) {
-      adServerConfig =
-          AdvertiserAdServerConfig.fromJson(_json['adServerConfig']);
+      adServerConfig = AdvertiserAdServerConfig.fromJson(
+          _json['adServerConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('advertiserId')) {
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('creativeConfig')) {
-      creativeConfig =
-          AdvertiserCreativeConfig.fromJson(_json['creativeConfig']);
+      creativeConfig = AdvertiserCreativeConfig.fromJson(
+          _json['creativeConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataAccessConfig')) {
-      dataAccessConfig =
-          AdvertiserDataAccessConfig.fromJson(_json['dataAccessConfig']);
+      dataAccessConfig = AdvertiserDataAccessConfig.fromJson(
+          _json['dataAccessConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -10070,11 +10348,12 @@
       entityStatus = _json['entityStatus'] as core.String;
     }
     if (_json.containsKey('generalConfig')) {
-      generalConfig = AdvertiserGeneralConfig.fromJson(_json['generalConfig']);
+      generalConfig = AdvertiserGeneralConfig.fromJson(
+          _json['generalConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('integrationDetails')) {
-      integrationDetails =
-          IntegrationDetails.fromJson(_json['integrationDetails']);
+      integrationDetails = IntegrationDetails.fromJson(
+          _json['integrationDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -10083,8 +10362,8 @@
       partnerId = _json['partnerId'] as core.String;
     }
     if (_json.containsKey('servingConfig')) {
-      servingConfig =
-          AdvertiserTargetingConfig.fromJson(_json['servingConfig']);
+      servingConfig = AdvertiserTargetingConfig.fromJson(
+          _json['servingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -10146,11 +10425,12 @@
 
   AdvertiserAdServerConfig.fromJson(core.Map _json) {
     if (_json.containsKey('cmHybridConfig')) {
-      cmHybridConfig = CmHybridConfig.fromJson(_json['cmHybridConfig']);
+      cmHybridConfig = CmHybridConfig.fromJson(
+          _json['cmHybridConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('thirdPartyOnlyConfig')) {
-      thirdPartyOnlyConfig =
-          ThirdPartyOnlyConfig.fromJson(_json['thirdPartyOnlyConfig']);
+      thirdPartyOnlyConfig = ThirdPartyOnlyConfig.fromJson(
+          _json['thirdPartyOnlyConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10236,7 +10516,8 @@
 
   AdvertiserDataAccessConfig.fromJson(core.Map _json) {
     if (_json.containsKey('sdfConfig')) {
-      sdfConfig = AdvertiserSdfConfig.fromJson(_json['sdfConfig']);
+      sdfConfig = AdvertiserSdfConfig.fromJson(
+          _json['sdfConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10331,7 +10612,8 @@
       overridePartnerSdfConfig = _json['overridePartnerSdfConfig'] as core.bool;
     }
     if (_json.containsKey('sdfConfig')) {
-      sdfConfig = SdfConfig.fromJson(_json['sdfConfig']);
+      sdfConfig = SdfConfig.fromJson(
+          _json['sdfConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10699,7 +10981,8 @@
 
   AssetAssociation.fromJson(core.Map _json) {
     if (_json.containsKey('asset')) {
-      asset = Asset.fromJson(_json['asset']);
+      asset =
+          Asset.fromJson(_json['asset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('role')) {
       role = _json['role'] as core.String;
@@ -11092,15 +11375,15 @@
   AssignedTargetingOption.fromJson(core.Map _json) {
     if (_json.containsKey('ageRangeDetails')) {
       ageRangeDetails = AgeRangeAssignedTargetingOptionDetails.fromJson(
-          _json['ageRangeDetails']);
+          _json['ageRangeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appCategoryDetails')) {
       appCategoryDetails = AppCategoryAssignedTargetingOptionDetails.fromJson(
-          _json['appCategoryDetails']);
+          _json['appCategoryDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appDetails')) {
-      appDetails =
-          AppAssignedTargetingOptionDetails.fromJson(_json['appDetails']);
+      appDetails = AppAssignedTargetingOptionDetails.fromJson(
+          _json['appDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('assignedTargetingOptionId')) {
       assignedTargetingOptionId =
@@ -11109,78 +11392,86 @@
     if (_json.containsKey('audienceGroupDetails')) {
       audienceGroupDetails =
           AudienceGroupAssignedTargetingOptionDetails.fromJson(
-              _json['audienceGroupDetails']);
+              _json['audienceGroupDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('authorizedSellerStatusDetails')) {
       authorizedSellerStatusDetails =
           AuthorizedSellerStatusAssignedTargetingOptionDetails.fromJson(
-              _json['authorizedSellerStatusDetails']);
+              _json['authorizedSellerStatusDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('browserDetails')) {
       browserDetails = BrowserAssignedTargetingOptionDetails.fromJson(
-          _json['browserDetails']);
+          _json['browserDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('carrierAndIspDetails')) {
       carrierAndIspDetails =
           CarrierAndIspAssignedTargetingOptionDetails.fromJson(
-              _json['carrierAndIspDetails']);
+              _json['carrierAndIspDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('categoryDetails')) {
       categoryDetails = CategoryAssignedTargetingOptionDetails.fromJson(
-          _json['categoryDetails']);
+          _json['categoryDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('channelDetails')) {
       channelDetails = ChannelAssignedTargetingOptionDetails.fromJson(
-          _json['channelDetails']);
+          _json['channelDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentInstreamPositionDetails')) {
       contentInstreamPositionDetails =
           ContentInstreamPositionAssignedTargetingOptionDetails.fromJson(
-              _json['contentInstreamPositionDetails']);
+              _json['contentInstreamPositionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentOutstreamPositionDetails')) {
       contentOutstreamPositionDetails =
           ContentOutstreamPositionAssignedTargetingOptionDetails.fromJson(
-              _json['contentOutstreamPositionDetails']);
+              _json['contentOutstreamPositionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dayAndTimeDetails')) {
       dayAndTimeDetails = DayAndTimeAssignedTargetingOptionDetails.fromJson(
-          _json['dayAndTimeDetails']);
+          _json['dayAndTimeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceMakeModelDetails')) {
       deviceMakeModelDetails =
           DeviceMakeModelAssignedTargetingOptionDetails.fromJson(
-              _json['deviceMakeModelDetails']);
+              _json['deviceMakeModelDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceTypeDetails')) {
       deviceTypeDetails = DeviceTypeAssignedTargetingOptionDetails.fromJson(
-          _json['deviceTypeDetails']);
+          _json['deviceTypeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('digitalContentLabelExclusionDetails')) {
       digitalContentLabelExclusionDetails =
           DigitalContentLabelAssignedTargetingOptionDetails.fromJson(
-              _json['digitalContentLabelExclusionDetails']);
+              _json['digitalContentLabelExclusionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('environmentDetails')) {
       environmentDetails = EnvironmentAssignedTargetingOptionDetails.fromJson(
-          _json['environmentDetails']);
+          _json['environmentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exchangeDetails')) {
       exchangeDetails = ExchangeAssignedTargetingOptionDetails.fromJson(
-          _json['exchangeDetails']);
+          _json['exchangeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('genderDetails')) {
-      genderDetails =
-          GenderAssignedTargetingOptionDetails.fromJson(_json['genderDetails']);
+      genderDetails = GenderAssignedTargetingOptionDetails.fromJson(
+          _json['genderDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('geoRegionDetails')) {
       geoRegionDetails = GeoRegionAssignedTargetingOptionDetails.fromJson(
-          _json['geoRegionDetails']);
+          _json['geoRegionDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('householdIncomeDetails')) {
       householdIncomeDetails =
           HouseholdIncomeAssignedTargetingOptionDetails.fromJson(
-              _json['householdIncomeDetails']);
+              _json['householdIncomeDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inheritance')) {
       inheritance = _json['inheritance'] as core.String;
@@ -11188,20 +11479,22 @@
     if (_json.containsKey('inventorySourceDetails')) {
       inventorySourceDetails =
           InventorySourceAssignedTargetingOptionDetails.fromJson(
-              _json['inventorySourceDetails']);
+              _json['inventorySourceDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inventorySourceGroupDetails')) {
       inventorySourceGroupDetails =
           InventorySourceGroupAssignedTargetingOptionDetails.fromJson(
-              _json['inventorySourceGroupDetails']);
+              _json['inventorySourceGroupDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keywordDetails')) {
       keywordDetails = KeywordAssignedTargetingOptionDetails.fromJson(
-          _json['keywordDetails']);
+          _json['keywordDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageDetails')) {
       languageDetails = LanguageAssignedTargetingOptionDetails.fromJson(
-          _json['languageDetails']);
+          _json['languageDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -11209,41 +11502,48 @@
     if (_json.containsKey('negativeKeywordListDetails')) {
       negativeKeywordListDetails =
           NegativeKeywordListAssignedTargetingOptionDetails.fromJson(
-              _json['negativeKeywordListDetails']);
+              _json['negativeKeywordListDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('onScreenPositionDetails')) {
       onScreenPositionDetails =
           OnScreenPositionAssignedTargetingOptionDetails.fromJson(
-              _json['onScreenPositionDetails']);
+              _json['onScreenPositionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operatingSystemDetails')) {
       operatingSystemDetails =
           OperatingSystemAssignedTargetingOptionDetails.fromJson(
-              _json['operatingSystemDetails']);
+              _json['operatingSystemDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parentalStatusDetails')) {
       parentalStatusDetails =
           ParentalStatusAssignedTargetingOptionDetails.fromJson(
-              _json['parentalStatusDetails']);
+              _json['parentalStatusDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('proximityLocationListDetails')) {
       proximityLocationListDetails =
           ProximityLocationListAssignedTargetingOptionDetails.fromJson(
-              _json['proximityLocationListDetails']);
+              _json['proximityLocationListDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('regionalLocationListDetails')) {
       regionalLocationListDetails =
           RegionalLocationListAssignedTargetingOptionDetails.fromJson(
-              _json['regionalLocationListDetails']);
+              _json['regionalLocationListDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sensitiveCategoryExclusionDetails')) {
       sensitiveCategoryExclusionDetails =
           SensitiveCategoryAssignedTargetingOptionDetails.fromJson(
-              _json['sensitiveCategoryExclusionDetails']);
+              _json['sensitiveCategoryExclusionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subExchangeDetails')) {
       subExchangeDetails = SubExchangeAssignedTargetingOptionDetails.fromJson(
-          _json['subExchangeDetails']);
+          _json['subExchangeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetingType')) {
       targetingType = _json['targetingType'] as core.String;
@@ -11251,25 +11551,28 @@
     if (_json.containsKey('thirdPartyVerifierDetails')) {
       thirdPartyVerifierDetails =
           ThirdPartyVerifierAssignedTargetingOptionDetails.fromJson(
-              _json['thirdPartyVerifierDetails']);
+              _json['thirdPartyVerifierDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('urlDetails')) {
-      urlDetails =
-          UrlAssignedTargetingOptionDetails.fromJson(_json['urlDetails']);
+      urlDetails = UrlAssignedTargetingOptionDetails.fromJson(
+          _json['urlDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userRewardedContentDetails')) {
       userRewardedContentDetails =
           UserRewardedContentAssignedTargetingOptionDetails.fromJson(
-              _json['userRewardedContentDetails']);
+              _json['userRewardedContentDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('videoPlayerSizeDetails')) {
       videoPlayerSizeDetails =
           VideoPlayerSizeAssignedTargetingOptionDetails.fromJson(
-              _json['videoPlayerSizeDetails']);
+              _json['videoPlayerSizeDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('viewabilityDetails')) {
       viewabilityDetails = ViewabilityAssignedTargetingOptionDetails.fromJson(
-          _json['viewabilityDetails']);
+          _json['viewabilityDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11545,30 +11848,36 @@
     if (_json.containsKey('excludedFirstAndThirdPartyAudienceGroup')) {
       excludedFirstAndThirdPartyAudienceGroup =
           FirstAndThirdPartyAudienceGroup.fromJson(
-              _json['excludedFirstAndThirdPartyAudienceGroup']);
+              _json['excludedFirstAndThirdPartyAudienceGroup']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('excludedGoogleAudienceGroup')) {
-      excludedGoogleAudienceGroup =
-          GoogleAudienceGroup.fromJson(_json['excludedGoogleAudienceGroup']);
+      excludedGoogleAudienceGroup = GoogleAudienceGroup.fromJson(
+          _json['excludedGoogleAudienceGroup']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('includedCombinedAudienceGroup')) {
       includedCombinedAudienceGroup = CombinedAudienceGroup.fromJson(
-          _json['includedCombinedAudienceGroup']);
+          _json['includedCombinedAudienceGroup']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('includedCustomListGroup')) {
-      includedCustomListGroup =
-          CustomListGroup.fromJson(_json['includedCustomListGroup']);
+      includedCustomListGroup = CustomListGroup.fromJson(
+          _json['includedCustomListGroup']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('includedFirstAndThirdPartyAudienceGroups')) {
       includedFirstAndThirdPartyAudienceGroups =
           (_json['includedFirstAndThirdPartyAudienceGroups'] as core.List)
-              .map<FirstAndThirdPartyAudienceGroup>(
-                  (value) => FirstAndThirdPartyAudienceGroup.fromJson(value))
+              .map<FirstAndThirdPartyAudienceGroup>((value) =>
+                  FirstAndThirdPartyAudienceGroup.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('includedGoogleAudienceGroup')) {
-      includedGoogleAudienceGroup =
-          GoogleAudienceGroup.fromJson(_json['includedGoogleAudienceGroup']);
+      includedGoogleAudienceGroup = GoogleAudienceGroup.fromJson(
+          _json['includedGoogleAudienceGroup']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11859,15 +12168,17 @@
 
   BiddingStrategy.fromJson(core.Map _json) {
     if (_json.containsKey('fixedBid')) {
-      fixedBid = FixedBidStrategy.fromJson(_json['fixedBid']);
+      fixedBid = FixedBidStrategy.fromJson(
+          _json['fixedBid'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maximizeSpendAutoBid')) {
-      maximizeSpendAutoBid =
-          MaximizeSpendBidStrategy.fromJson(_json['maximizeSpendAutoBid']);
+      maximizeSpendAutoBid = MaximizeSpendBidStrategy.fromJson(
+          _json['maximizeSpendAutoBid'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('performanceGoalAutoBid')) {
-      performanceGoalAutoBid =
-          PerformanceGoalBidStrategy.fromJson(_json['performanceGoalAutoBid']);
+      performanceGoalAutoBid = PerformanceGoalBidStrategy.fromJson(
+          _json['performanceGoalAutoBid']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11969,14 +12280,16 @@
   BulkEditAdvertiserAssignedTargetingOptionsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('createRequests')) {
       createRequests = (_json['createRequests'] as core.List)
-          .map<CreateAssignedTargetingOptionsRequest>(
-              (value) => CreateAssignedTargetingOptionsRequest.fromJson(value))
+          .map<CreateAssignedTargetingOptionsRequest>((value) =>
+              CreateAssignedTargetingOptionsRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deleteRequests')) {
       deleteRequests = (_json['deleteRequests'] as core.List)
-          .map<DeleteAssignedTargetingOptionsRequest>(
-              (value) => DeleteAssignedTargetingOptionsRequest.fromJson(value))
+          .map<DeleteAssignedTargetingOptionsRequest>((value) =>
+              DeleteAssignedTargetingOptionsRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12006,8 +12319,9 @@
     if (_json.containsKey('createdAssignedTargetingOptions')) {
       createdAssignedTargetingOptions =
           (_json['createdAssignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -12050,8 +12364,9 @@
     if (_json.containsKey('createdAssignedInventorySources')) {
       createdAssignedInventorySources =
           (_json['createdAssignedInventorySources'] as core.List)
-              .map<AssignedInventorySource>(
-                  (value) => AssignedInventorySource.fromJson(value))
+              .map<AssignedInventorySource>((value) =>
+                  AssignedInventorySource.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('deletedAssignedInventorySources')) {
@@ -12098,8 +12413,9 @@
     if (_json.containsKey('assignedInventorySources')) {
       assignedInventorySources =
           (_json['assignedInventorySources'] as core.List)
-              .map<AssignedInventorySource>(
-                  (value) => AssignedInventorySource.fromJson(value))
+              .map<AssignedInventorySource>((value) =>
+                  AssignedInventorySource.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -12128,10 +12444,11 @@
 
   BulkEditAssignedLocationsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('createdAssignedLocations')) {
-      createdAssignedLocations = (_json['createdAssignedLocations']
-              as core.List)
-          .map<AssignedLocation>((value) => AssignedLocation.fromJson(value))
-          .toList();
+      createdAssignedLocations =
+          (_json['createdAssignedLocations'] as core.List)
+              .map<AssignedLocation>((value) => AssignedLocation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
     if (_json.containsKey('deletedAssignedLocations')) {
       deletedAssignedLocations =
@@ -12165,7 +12482,8 @@
   BulkEditAssignedLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assignedLocations')) {
       assignedLocations = (_json['assignedLocations'] as core.List)
-          .map<AssignedLocation>((value) => AssignedLocation.fromJson(value))
+          .map<AssignedLocation>((value) => AssignedLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12195,10 +12513,11 @@
 
   BulkEditAssignedUserRolesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('createdAssignedUserRoles')) {
-      createdAssignedUserRoles = (_json['createdAssignedUserRoles']
-              as core.List)
-          .map<AssignedUserRole>((value) => AssignedUserRole.fromJson(value))
-          .toList();
+      createdAssignedUserRoles =
+          (_json['createdAssignedUserRoles'] as core.List)
+              .map<AssignedUserRole>((value) => AssignedUserRole.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
     if (_json.containsKey('deletedAssignedUserRoles')) {
       deletedAssignedUserRoles =
@@ -12230,10 +12549,11 @@
 
   BulkEditAssignedUserRolesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('createdAssignedUserRoles')) {
-      createdAssignedUserRoles = (_json['createdAssignedUserRoles']
-              as core.List)
-          .map<AssignedUserRole>((value) => AssignedUserRole.fromJson(value))
-          .toList();
+      createdAssignedUserRoles =
+          (_json['createdAssignedUserRoles'] as core.List)
+              .map<AssignedUserRole>((value) => AssignedUserRole.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
   }
 
@@ -12262,14 +12582,16 @@
   BulkEditLineItemAssignedTargetingOptionsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('createRequests')) {
       createRequests = (_json['createRequests'] as core.List)
-          .map<CreateAssignedTargetingOptionsRequest>(
-              (value) => CreateAssignedTargetingOptionsRequest.fromJson(value))
+          .map<CreateAssignedTargetingOptionsRequest>((value) =>
+              CreateAssignedTargetingOptionsRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deleteRequests')) {
       deleteRequests = (_json['deleteRequests'] as core.List)
-          .map<DeleteAssignedTargetingOptionsRequest>(
-              (value) => DeleteAssignedTargetingOptionsRequest.fromJson(value))
+          .map<DeleteAssignedTargetingOptionsRequest>((value) =>
+              DeleteAssignedTargetingOptionsRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12299,8 +12621,9 @@
     if (_json.containsKey('createdAssignedTargetingOptions')) {
       createdAssignedTargetingOptions =
           (_json['createdAssignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -12331,7 +12654,8 @@
   BulkEditNegativeKeywordsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('createdNegativeKeywords')) {
       createdNegativeKeywords = (_json['createdNegativeKeywords'] as core.List)
-          .map<NegativeKeyword>((value) => NegativeKeyword.fromJson(value))
+          .map<NegativeKeyword>((value) => NegativeKeyword.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deletedNegativeKeywords')) {
@@ -12365,7 +12689,8 @@
   BulkEditNegativeKeywordsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('negativeKeywords')) {
       negativeKeywords = (_json['negativeKeywords'] as core.List)
-          .map<NegativeKeyword>((value) => NegativeKeyword.fromJson(value))
+          .map<NegativeKeyword>((value) => NegativeKeyword.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12397,14 +12722,16 @@
   BulkEditPartnerAssignedTargetingOptionsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('createRequests')) {
       createRequests = (_json['createRequests'] as core.List)
-          .map<CreateAssignedTargetingOptionsRequest>(
-              (value) => CreateAssignedTargetingOptionsRequest.fromJson(value))
+          .map<CreateAssignedTargetingOptionsRequest>((value) =>
+              CreateAssignedTargetingOptionsRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deleteRequests')) {
       deleteRequests = (_json['deleteRequests'] as core.List)
-          .map<DeleteAssignedTargetingOptionsRequest>(
-              (value) => DeleteAssignedTargetingOptionsRequest.fromJson(value))
+          .map<DeleteAssignedTargetingOptionsRequest>((value) =>
+              DeleteAssignedTargetingOptionsRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12434,8 +12761,9 @@
     if (_json.containsKey('createdAssignedTargetingOptions')) {
       createdAssignedTargetingOptions =
           (_json['createdAssignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -12473,7 +12801,8 @@
     }
     if (_json.containsKey('createdSites')) {
       createdSites = (_json['createdSites'] as core.List)
-          .map<Site>((value) => Site.fromJson(value))
+          .map<Site>((value) =>
+              Site.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deletedSites')) {
@@ -12516,7 +12845,8 @@
   BulkEditSitesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('sites')) {
       sites = (_json['sites'] as core.List)
-          .map<Site>((value) => Site.fromJson(value))
+          .map<Site>((value) =>
+              Site.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12547,8 +12877,9 @@
     if (_json.containsKey('assignedTargetingOptions')) {
       assignedTargetingOptions =
           (_json['assignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -12586,8 +12917,9 @@
     if (_json.containsKey('assignedTargetingOptions')) {
       assignedTargetingOptions =
           (_json['assignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -12663,10 +12995,12 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('campaignFlight')) {
-      campaignFlight = CampaignFlight.fromJson(_json['campaignFlight']);
+      campaignFlight = CampaignFlight.fromJson(
+          _json['campaignFlight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('campaignGoal')) {
-      campaignGoal = CampaignGoal.fromJson(_json['campaignGoal']);
+      campaignGoal = CampaignGoal.fromJson(
+          _json['campaignGoal'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('campaignId')) {
       campaignId = _json['campaignId'] as core.String;
@@ -12678,7 +13012,8 @@
       entityStatus = _json['entityStatus'] as core.String;
     }
     if (_json.containsKey('frequencyCap')) {
-      frequencyCap = FrequencyCap.fromJson(_json['frequencyCap']);
+      frequencyCap = FrequencyCap.fromJson(
+          _json['frequencyCap'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -12743,7 +13078,8 @@
 
   CampaignFlight.fromJson(core.Map _json) {
     if (_json.containsKey('plannedDates')) {
-      plannedDates = DateRange.fromJson(_json['plannedDates']);
+      plannedDates = DateRange.fromJson(
+          _json['plannedDates'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('plannedSpendAmountMicros')) {
       plannedSpendAmountMicros =
@@ -12790,7 +13126,8 @@
       campaignGoalType = _json['campaignGoalType'] as core.String;
     }
     if (_json.containsKey('performanceGoal')) {
-      performanceGoal = PerformanceGoal.fromJson(_json['performanceGoal']);
+      performanceGoal = PerformanceGoal.fromJson(
+          _json['performanceGoal'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13229,8 +13566,9 @@
   CombinedAudienceGroup.fromJson(core.Map _json) {
     if (_json.containsKey('settings')) {
       settings = (_json['settings'] as core.List)
-          .map<CombinedAudienceTargetingSetting>(
-              (value) => CombinedAudienceTargetingSetting.fromJson(value))
+          .map<CombinedAudienceTargetingSetting>((value) =>
+              CombinedAudienceTargetingSetting.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13459,8 +13797,9 @@
     if (_json.containsKey('floodlightActivityConfigs')) {
       floodlightActivityConfigs =
           (_json['floodlightActivityConfigs'] as core.List)
-              .map<TrackingFloodlightActivityConfig>(
-                  (value) => TrackingFloodlightActivityConfig.fromJson(value))
+              .map<TrackingFloodlightActivityConfig>((value) =>
+                  TrackingFloodlightActivityConfig.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('postViewCountPercentageMillis')) {
@@ -13545,7 +13884,8 @@
 
   CreateAssetResponse.fromJson(core.Map _json) {
     if (_json.containsKey('asset')) {
-      asset = Asset.fromJson(_json['asset']);
+      asset =
+          Asset.fromJson(_json['asset'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13652,8 +13992,9 @@
     if (_json.containsKey('assignedTargetingOptions')) {
       assignedTargetingOptions =
           (_json['assignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('targetingType')) {
@@ -13716,15 +14057,17 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('idFilter')) {
-      idFilter = IdFilter.fromJson(_json['idFilter']);
+      idFilter = IdFilter.fromJson(
+          _json['idFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inventorySourceFilter')) {
-      inventorySourceFilter =
-          InventorySourceFilter.fromJson(_json['inventorySourceFilter']);
+      inventorySourceFilter = InventorySourceFilter.fromJson(
+          _json['inventorySourceFilter']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parentEntityFilter')) {
-      parentEntityFilter =
-          ParentEntityFilter.fromJson(_json['parentEntityFilter']);
+      parentEntityFilter = ParentEntityFilter.fromJson(
+          _json['parentEntityFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('partnerId')) {
       partnerId = _json['partnerId'] as core.String;
@@ -14125,7 +14468,8 @@
   Creative.fromJson(core.Map _json) {
     if (_json.containsKey('additionalDimensions')) {
       additionalDimensions = (_json['additionalDimensions'] as core.List)
-          .map<Dimensions>((value) => Dimensions.fromJson(value))
+          .map<Dimensions>((value) =>
+              Dimensions.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('advertiserId')) {
@@ -14136,14 +14480,16 @@
     }
     if (_json.containsKey('assets')) {
       assets = (_json['assets'] as core.List)
-          .map<AssetAssociation>((value) => AssetAssociation.fromJson(value))
+          .map<AssetAssociation>((value) => AssetAssociation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('cmPlacementId')) {
       cmPlacementId = _json['cmPlacementId'] as core.String;
     }
     if (_json.containsKey('cmTrackingAd')) {
-      cmTrackingAd = CmTrackingAd.fromJson(_json['cmTrackingAd']);
+      cmTrackingAd = CmTrackingAd.fromJson(
+          _json['cmTrackingAd'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('companionCreativeIds')) {
       companionCreativeIds = (_json['companionCreativeIds'] as core.List)
@@ -14152,7 +14498,8 @@
     }
     if (_json.containsKey('counterEvents')) {
       counterEvents = (_json['counterEvents'] as core.List)
-          .map<CounterEvent>((value) => CounterEvent.fromJson(value))
+          .map<CounterEvent>((value) => CounterEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('createTime')) {
@@ -14170,7 +14517,8 @@
       creativeType = _json['creativeType'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = Dimensions.fromJson(_json['dimensions']);
+      dimensions = Dimensions.fromJson(
+          _json['dimensions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -14183,7 +14531,8 @@
     }
     if (_json.containsKey('exitEvents')) {
       exitEvents = (_json['exitEvents'] as core.List)
-          .map<ExitEvent>((value) => ExitEvent.fromJson(value))
+          .map<ExitEvent>((value) =>
+              ExitEvent.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('expandOnHover')) {
@@ -14222,10 +14571,12 @@
       notes = _json['notes'] as core.String;
     }
     if (_json.containsKey('obaIcon')) {
-      obaIcon = ObaIcon.fromJson(_json['obaIcon']);
+      obaIcon = ObaIcon.fromJson(
+          _json['obaIcon'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressOffset')) {
-      progressOffset = AudioVideoOffset.fromJson(_json['progressOffset']);
+      progressOffset = AudioVideoOffset.fromJson(
+          _json['progressOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requireHtml5')) {
       requireHtml5 = _json['requireHtml5'] as core.bool;
@@ -14238,10 +14589,12 @@
           _json['requirePingForAttribution'] as core.bool;
     }
     if (_json.containsKey('reviewStatus')) {
-      reviewStatus = ReviewStatusInfo.fromJson(_json['reviewStatus']);
+      reviewStatus = ReviewStatusInfo.fromJson(
+          _json['reviewStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skipOffset')) {
-      skipOffset = AudioVideoOffset.fromJson(_json['skipOffset']);
+      skipOffset = AudioVideoOffset.fromJson(
+          _json['skipOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skippable')) {
       skippable = _json['skippable'] as core.bool;
@@ -14251,12 +14604,14 @@
     }
     if (_json.containsKey('thirdPartyUrls')) {
       thirdPartyUrls = (_json['thirdPartyUrls'] as core.List)
-          .map<ThirdPartyUrl>((value) => ThirdPartyUrl.fromJson(value))
+          .map<ThirdPartyUrl>((value) => ThirdPartyUrl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timerEvents')) {
       timerEvents = (_json['timerEvents'] as core.List)
-          .map<TimerEvent>((value) => TimerEvent.fromJson(value))
+          .map<TimerEvent>((value) =>
+              TimerEvent.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('trackerUrls')) {
@@ -14266,11 +14621,13 @@
     }
     if (_json.containsKey('transcodes')) {
       transcodes = (_json['transcodes'] as core.List)
-          .map<Transcode>((value) => Transcode.fromJson(value))
+          .map<Transcode>((value) =>
+              Transcode.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('universalAdId')) {
-      universalAdId = UniversalAdId.fromJson(_json['universalAdId']);
+      universalAdId = UniversalAdId.fromJson(
+          _json['universalAdId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -14492,11 +14849,12 @@
     }
     if (_json.containsKey('displayCreativeConfig')) {
       displayCreativeConfig = InventorySourceDisplayCreativeConfig.fromJson(
-          _json['displayCreativeConfig']);
+          _json['displayCreativeConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('videoCreativeConfig')) {
       videoCreativeConfig = InventorySourceVideoCreativeConfig.fromJson(
-          _json['videoCreativeConfig']);
+          _json['videoCreativeConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14671,8 +15029,9 @@
   CustomListGroup.fromJson(core.Map _json) {
     if (_json.containsKey('settings')) {
       settings = (_json['settings'] as core.List)
-          .map<CustomListTargetingSetting>(
-              (value) => CustomListTargetingSetting.fromJson(value))
+          .map<CustomListTargetingSetting>((value) =>
+              CustomListTargetingSetting.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14774,10 +15133,12 @@
 
   DateRange.fromJson(core.Map _json) {
     if (_json.containsKey('endDate')) {
-      endDate = Date.fromJson(_json['endDate']);
+      endDate = Date.fromJson(
+          _json['endDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startDate')) {
-      startDate = Date.fromJson(_json['startDate']);
+      startDate = Date.fromJson(
+          _json['startDate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15254,8 +15615,8 @@
 
   DoubleVerify.fromJson(core.Map _json) {
     if (_json.containsKey('appStarRating')) {
-      appStarRating =
-          DoubleVerifyAppStarRating.fromJson(_json['appStarRating']);
+      appStarRating = DoubleVerifyAppStarRating.fromJson(
+          _json['appStarRating'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('avoidedAgeRatings')) {
       avoidedAgeRatings = (_json['avoidedAgeRatings'] as core.List)
@@ -15264,19 +15625,20 @@
     }
     if (_json.containsKey('brandSafetyCategories')) {
       brandSafetyCategories = DoubleVerifyBrandSafetyCategories.fromJson(
-          _json['brandSafetyCategories']);
+          _json['brandSafetyCategories']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayViewability')) {
-      displayViewability =
-          DoubleVerifyDisplayViewability.fromJson(_json['displayViewability']);
+      displayViewability = DoubleVerifyDisplayViewability.fromJson(
+          _json['displayViewability'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fraudInvalidTraffic')) {
       fraudInvalidTraffic = DoubleVerifyFraudInvalidTraffic.fromJson(
-          _json['fraudInvalidTraffic']);
+          _json['fraudInvalidTraffic'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('videoViewability')) {
-      videoViewability =
-          DoubleVerifyVideoViewability.fromJson(_json['videoViewability']);
+      videoViewability = DoubleVerifyVideoViewability.fromJson(
+          _json['videoViewability'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15725,8 +16087,9 @@
   ExchangeConfig.fromJson(core.Map _json) {
     if (_json.containsKey('enabledExchanges')) {
       enabledExchanges = (_json['enabledExchanges'] as core.List)
-          .map<ExchangeConfigEnabledExchange>(
-              (value) => ExchangeConfigEnabledExchange.fromJson(value))
+          .map<ExchangeConfigEnabledExchange>((value) =>
+              ExchangeConfigEnabledExchange.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16335,7 +16698,8 @@
     if (_json.containsKey('settings')) {
       settings = (_json['settings'] as core.List)
           .map<FirstAndThirdPartyAudienceTargetingSetting>((value) =>
-              FirstAndThirdPartyAudienceTargetingSetting.fromJson(value))
+              FirstAndThirdPartyAudienceTargetingSetting.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16497,11 +16861,12 @@
   FloodlightGroup.fromJson(core.Map _json) {
     if (_json.containsKey('activeViewConfig')) {
       activeViewConfig = ActiveViewVideoViewabilityMetricConfig.fromJson(
-          _json['activeViewConfig']);
+          _json['activeViewConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customVariables')) {
       customVariables = commons.mapMap<core.Object, core.Object>(
-          _json['customVariables'].cast<core.String, core.Object>(),
+          (_json['customVariables'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('displayName')) {
@@ -16511,7 +16876,8 @@
       floodlightGroupId = _json['floodlightGroupId'] as core.String;
     }
     if (_json.containsKey('lookbackWindow')) {
-      lookbackWindow = LookbackWindow.fromJson(_json['lookbackWindow']);
+      lookbackWindow = LookbackWindow.fromJson(
+          _json['lookbackWindow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -16927,8 +17293,9 @@
   GoogleAudienceGroup.fromJson(core.Map _json) {
     if (_json.containsKey('settings')) {
       settings = (_json['settings'] as core.List)
-          .map<GoogleAudienceTargetingSetting>(
-              (value) => GoogleAudienceTargetingSetting.fromJson(value))
+          .map<GoogleAudienceTargetingSetting>((value) =>
+              GoogleAudienceTargetingSetting.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17244,10 +17611,12 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('bidStrategy')) {
-      bidStrategy = BiddingStrategy.fromJson(_json['bidStrategy']);
+      bidStrategy = BiddingStrategy.fromJson(
+          _json['bidStrategy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('budget')) {
-      budget = InsertionOrderBudget.fromJson(_json['budget']);
+      budget = InsertionOrderBudget.fromJson(
+          _json['budget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('campaignId')) {
       campaignId = _json['campaignId'] as core.String;
@@ -17259,28 +17628,32 @@
       entityStatus = _json['entityStatus'] as core.String;
     }
     if (_json.containsKey('frequencyCap')) {
-      frequencyCap = FrequencyCap.fromJson(_json['frequencyCap']);
+      frequencyCap = FrequencyCap.fromJson(
+          _json['frequencyCap'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertionOrderId')) {
       insertionOrderId = _json['insertionOrderId'] as core.String;
     }
     if (_json.containsKey('integrationDetails')) {
-      integrationDetails =
-          IntegrationDetails.fromJson(_json['integrationDetails']);
+      integrationDetails = IntegrationDetails.fromJson(
+          _json['integrationDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pacing')) {
-      pacing = Pacing.fromJson(_json['pacing']);
+      pacing = Pacing.fromJson(
+          _json['pacing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('partnerCosts')) {
       partnerCosts = (_json['partnerCosts'] as core.List)
-          .map<PartnerCost>((value) => PartnerCost.fromJson(value))
+          .map<PartnerCost>((value) => PartnerCost.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('performanceGoal')) {
-      performanceGoal = PerformanceGoal.fromJson(_json['performanceGoal']);
+      performanceGoal = PerformanceGoal.fromJson(
+          _json['performanceGoal'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -17377,8 +17750,9 @@
     }
     if (_json.containsKey('budgetSegments')) {
       budgetSegments = (_json['budgetSegments'] as core.List)
-          .map<InsertionOrderBudgetSegment>(
-              (value) => InsertionOrderBudgetSegment.fromJson(value))
+          .map<InsertionOrderBudgetSegment>((value) =>
+              InsertionOrderBudgetSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('budgetUnit')) {
@@ -17437,7 +17811,8 @@
       campaignBudgetId = _json['campaignBudgetId'] as core.String;
     }
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -17844,7 +18219,8 @@
     }
     if (_json.containsKey('creativeConfigs')) {
       creativeConfigs = (_json['creativeConfigs'] as core.List)
-          .map<CreativeConfig>((value) => CreativeConfig.fromJson(value))
+          .map<CreativeConfig>((value) => CreativeConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dealId')) {
@@ -17872,13 +18248,16 @@
       publisherName = _json['publisherName'] as core.String;
     }
     if (_json.containsKey('rateDetails')) {
-      rateDetails = RateDetails.fromJson(_json['rateDetails']);
+      rateDetails = RateDetails.fromJson(
+          _json['rateDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = InventorySourceStatus.fromJson(_json['status']);
+      status = InventorySourceStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeRange')) {
-      timeRange = TimeRange.fromJson(_json['timeRange']);
+      timeRange = TimeRange.fromJson(
+          _json['timeRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -17969,7 +18348,8 @@
 
   InventorySourceDisplayCreativeConfig.fromJson(core.Map _json) {
     if (_json.containsKey('creativeSize')) {
-      creativeSize = Dimensions.fromJson(_json['creativeSize']);
+      creativeSize = Dimensions.fromJson(
+          _json['creativeSize'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -18422,17 +18802,19 @@
       advertiserId = _json['advertiserId'] as core.String;
     }
     if (_json.containsKey('bidStrategy')) {
-      bidStrategy = BiddingStrategy.fromJson(_json['bidStrategy']);
+      bidStrategy = BiddingStrategy.fromJson(
+          _json['bidStrategy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('budget')) {
-      budget = LineItemBudget.fromJson(_json['budget']);
+      budget = LineItemBudget.fromJson(
+          _json['budget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('campaignId')) {
       campaignId = _json['campaignId'] as core.String;
     }
     if (_json.containsKey('conversionCounting')) {
-      conversionCounting =
-          ConversionCountingConfig.fromJson(_json['conversionCounting']);
+      conversionCounting = ConversionCountingConfig.fromJson(
+          _json['conversionCounting'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('creativeIds')) {
       creativeIds = (_json['creativeIds'] as core.List)
@@ -18446,17 +18828,19 @@
       entityStatus = _json['entityStatus'] as core.String;
     }
     if (_json.containsKey('flight')) {
-      flight = LineItemFlight.fromJson(_json['flight']);
+      flight = LineItemFlight.fromJson(
+          _json['flight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frequencyCap')) {
-      frequencyCap = FrequencyCap.fromJson(_json['frequencyCap']);
+      frequencyCap = FrequencyCap.fromJson(
+          _json['frequencyCap'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertionOrderId')) {
       insertionOrderId = _json['insertionOrderId'] as core.String;
     }
     if (_json.containsKey('integrationDetails')) {
-      integrationDetails =
-          IntegrationDetails.fromJson(_json['integrationDetails']);
+      integrationDetails = IntegrationDetails.fromJson(
+          _json['integrationDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inventorySourceIds')) {
       inventorySourceIds = (_json['inventorySourceIds'] as core.List)
@@ -18473,16 +18857,18 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pacing')) {
-      pacing = Pacing.fromJson(_json['pacing']);
+      pacing = Pacing.fromJson(
+          _json['pacing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('partnerCosts')) {
       partnerCosts = (_json['partnerCosts'] as core.List)
-          .map<PartnerCost>((value) => PartnerCost.fromJson(value))
+          .map<PartnerCost>((value) => PartnerCost.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('partnerRevenueModel')) {
-      partnerRevenueModel =
-          PartnerRevenueModel.fromJson(_json['partnerRevenueModel']);
+      partnerRevenueModel = PartnerRevenueModel.fromJson(
+          _json['partnerRevenueModel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -18656,7 +19042,8 @@
 
   LineItemFlight.fromJson(core.Map _json) {
     if (_json.containsKey('dateRange')) {
-      dateRange = DateRange.fromJson(_json['dateRange']);
+      dateRange = DateRange.fromJson(
+          _json['dateRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('flightDateType')) {
       flightDateType = _json['flightDateType'] as core.String;
@@ -18693,8 +19080,9 @@
     if (_json.containsKey('assignedTargetingOptions')) {
       assignedTargetingOptions =
           (_json['assignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18729,7 +19117,8 @@
   ListAdvertisersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('advertisers')) {
       advertisers = (_json['advertisers'] as core.List)
-          .map<Advertiser>((value) => Advertiser.fromJson(value))
+          .map<Advertiser>((value) =>
+              Advertiser.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18767,8 +19156,9 @@
     if (_json.containsKey('assignedInventorySources')) {
       assignedInventorySources =
           (_json['assignedInventorySources'] as core.List)
-              .map<AssignedInventorySource>(
-                  (value) => AssignedInventorySource.fromJson(value))
+              .map<AssignedInventorySource>((value) =>
+                  AssignedInventorySource.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18804,7 +19194,8 @@
   ListAssignedLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assignedLocations')) {
       assignedLocations = (_json['assignedLocations'] as core.List)
-          .map<AssignedLocation>((value) => AssignedLocation.fromJson(value))
+          .map<AssignedLocation>((value) => AssignedLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18839,7 +19230,8 @@
   ListCampaignsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('campaigns')) {
       campaigns = (_json['campaigns'] as core.List)
-          .map<Campaign>((value) => Campaign.fromJson(value))
+          .map<Campaign>((value) =>
+              Campaign.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18873,7 +19265,8 @@
   ListChannelsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('channels')) {
       channels = (_json['channels'] as core.List)
-          .map<Channel>((value) => Channel.fromJson(value))
+          .map<Channel>((value) =>
+              Channel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18907,7 +19300,8 @@
   ListCombinedAudiencesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('combinedAudiences')) {
       combinedAudiences = (_json['combinedAudiences'] as core.List)
-          .map<CombinedAudience>((value) => CombinedAudience.fromJson(value))
+          .map<CombinedAudience>((value) => CombinedAudience.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18943,7 +19337,8 @@
   ListCreativesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('creatives')) {
       creatives = (_json['creatives'] as core.List)
-          .map<Creative>((value) => Creative.fromJson(value))
+          .map<Creative>((value) =>
+              Creative.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -18978,8 +19373,9 @@
   ListCustomBiddingAlgorithmsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('customBiddingAlgorithms')) {
       customBiddingAlgorithms = (_json['customBiddingAlgorithms'] as core.List)
-          .map<CustomBiddingAlgorithm>(
-              (value) => CustomBiddingAlgorithm.fromJson(value))
+          .map<CustomBiddingAlgorithm>((value) =>
+              CustomBiddingAlgorithm.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19014,7 +19410,8 @@
   ListCustomListsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('customLists')) {
       customLists = (_json['customLists'] as core.List)
-          .map<CustomList>((value) => CustomList.fromJson(value))
+          .map<CustomList>((value) =>
+              CustomList.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19052,8 +19449,9 @@
     if (_json.containsKey('firstAndThirdPartyAudiences')) {
       firstAndThirdPartyAudiences =
           (_json['firstAndThirdPartyAudiences'] as core.List)
-              .map<FirstAndThirdPartyAudience>(
-                  (value) => FirstAndThirdPartyAudience.fromJson(value))
+              .map<FirstAndThirdPartyAudience>((value) =>
+                  FirstAndThirdPartyAudience.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19088,7 +19486,8 @@
   ListGoogleAudiencesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('googleAudiences')) {
       googleAudiences = (_json['googleAudiences'] as core.List)
-          .map<GoogleAudience>((value) => GoogleAudience.fromJson(value))
+          .map<GoogleAudience>((value) => GoogleAudience.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19123,7 +19522,8 @@
   ListInsertionOrdersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('insertionOrders')) {
       insertionOrders = (_json['insertionOrders'] as core.List)
-          .map<InsertionOrder>((value) => InsertionOrder.fromJson(value))
+          .map<InsertionOrder>((value) => InsertionOrder.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19159,8 +19559,8 @@
   ListInventorySourceGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('inventorySourceGroups')) {
       inventorySourceGroups = (_json['inventorySourceGroups'] as core.List)
-          .map<InventorySourceGroup>(
-              (value) => InventorySourceGroup.fromJson(value))
+          .map<InventorySourceGroup>((value) => InventorySourceGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19195,7 +19595,8 @@
   ListInventorySourcesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('inventorySources')) {
       inventorySources = (_json['inventorySources'] as core.List)
-          .map<InventorySource>((value) => InventorySource.fromJson(value))
+          .map<InventorySource>((value) => InventorySource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19234,8 +19635,9 @@
     if (_json.containsKey('assignedTargetingOptions')) {
       assignedTargetingOptions =
           (_json['assignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19270,7 +19672,8 @@
   ListLineItemsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('lineItems')) {
       lineItems = (_json['lineItems'] as core.List)
-          .map<LineItem>((value) => LineItem.fromJson(value))
+          .map<LineItem>((value) =>
+              LineItem.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19304,7 +19707,8 @@
   ListLocationListsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locationLists')) {
       locationLists = (_json['locationLists'] as core.List)
-          .map<LocationList>((value) => LocationList.fromJson(value))
+          .map<LocationList>((value) => LocationList.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19340,8 +19744,8 @@
   ListNegativeKeywordListsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('negativeKeywordLists')) {
       negativeKeywordLists = (_json['negativeKeywordLists'] as core.List)
-          .map<NegativeKeywordList>(
-              (value) => NegativeKeywordList.fromJson(value))
+          .map<NegativeKeywordList>((value) => NegativeKeywordList.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19377,7 +19781,8 @@
   ListNegativeKeywordsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('negativeKeywords')) {
       negativeKeywords = (_json['negativeKeywords'] as core.List)
-          .map<NegativeKeyword>((value) => NegativeKeyword.fromJson(value))
+          .map<NegativeKeyword>((value) => NegativeKeyword.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19415,8 +19820,9 @@
     if (_json.containsKey('assignedTargetingOptions')) {
       assignedTargetingOptions =
           (_json['assignedTargetingOptions'] as core.List)
-              .map<AssignedTargetingOption>(
-                  (value) => AssignedTargetingOption.fromJson(value))
+              .map<AssignedTargetingOption>((value) =>
+                  AssignedTargetingOption.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -19454,7 +19860,8 @@
     }
     if (_json.containsKey('partners')) {
       partners = (_json['partners'] as core.List)
-          .map<Partner>((value) => Partner.fromJson(value))
+          .map<Partner>((value) =>
+              Partner.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -19489,7 +19896,8 @@
     }
     if (_json.containsKey('sites')) {
       sites = (_json['sites'] as core.List)
-          .map<Site>((value) => Site.fromJson(value))
+          .map<Site>((value) =>
+              Site.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -19524,7 +19932,8 @@
     }
     if (_json.containsKey('targetingOptions')) {
       targetingOptions = (_json['targetingOptions'] as core.List)
-          .map<TargetingOption>((value) => TargetingOption.fromJson(value))
+          .map<TargetingOption>((value) => TargetingOption.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -19560,7 +19969,8 @@
     }
     if (_json.containsKey('users')) {
       users = (_json['users'] as core.List)
-          .map<User>((value) => User.fromJson(value))
+          .map<User>((value) =>
+              User.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -19982,7 +20392,8 @@
       clickTrackingUrl = _json['clickTrackingUrl'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = Dimensions.fromJson(_json['dimensions']);
+      dimensions = Dimensions.fromJson(
+          _json['dimensions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('landingPageUrl')) {
       landingPageUrl = _json['landingPageUrl'] as core.String;
@@ -20217,11 +20628,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -20229,7 +20642,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -20529,11 +20943,12 @@
 
   Partner.fromJson(core.Map _json) {
     if (_json.containsKey('adServerConfig')) {
-      adServerConfig = PartnerAdServerConfig.fromJson(_json['adServerConfig']);
+      adServerConfig = PartnerAdServerConfig.fromJson(
+          _json['adServerConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataAccessConfig')) {
-      dataAccessConfig =
-          PartnerDataAccessConfig.fromJson(_json['dataAccessConfig']);
+      dataAccessConfig = PartnerDataAccessConfig.fromJson(
+          _json['dataAccessConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -20542,10 +20957,12 @@
       entityStatus = _json['entityStatus'] as core.String;
     }
     if (_json.containsKey('exchangeConfig')) {
-      exchangeConfig = ExchangeConfig.fromJson(_json['exchangeConfig']);
+      exchangeConfig = ExchangeConfig.fromJson(
+          _json['exchangeConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('generalConfig')) {
-      generalConfig = PartnerGeneralConfig.fromJson(_json['generalConfig']);
+      generalConfig = PartnerGeneralConfig.fromJson(
+          _json['generalConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -20600,8 +21017,8 @@
 
   PartnerAdServerConfig.fromJson(core.Map _json) {
     if (_json.containsKey('measurementConfig')) {
-      measurementConfig =
-          MeasurementConfig.fromJson(_json['measurementConfig']);
+      measurementConfig = MeasurementConfig.fromJson(
+          _json['measurementConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -20760,7 +21177,8 @@
 
   PartnerDataAccessConfig.fromJson(core.Map _json) {
     if (_json.containsKey('sdfConfig')) {
-      sdfConfig = SdfConfig.fromJson(_json['sdfConfig']);
+      sdfConfig = SdfConfig.fromJson(
+          _json['sdfConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -21152,10 +21570,12 @@
       inventorySourceRateType = _json['inventorySourceRateType'] as core.String;
     }
     if (_json.containsKey('minimumSpend')) {
-      minimumSpend = Money.fromJson(_json['minimumSpend']);
+      minimumSpend = Money.fromJson(
+          _json['minimumSpend'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rate')) {
-      rate = Money.fromJson(_json['rate']);
+      rate =
+          Money.fromJson(_json['rate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unitsPurchased')) {
       unitsPurchased = _json['unitsPurchased'] as core.String;
@@ -21274,14 +21694,14 @@
     }
     if (_json.containsKey('exchangeReviewStatuses')) {
       exchangeReviewStatuses = (_json['exchangeReviewStatuses'] as core.List)
-          .map<ExchangeReviewStatus>(
-              (value) => ExchangeReviewStatus.fromJson(value))
+          .map<ExchangeReviewStatus>((value) => ExchangeReviewStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('publisherReviewStatuses')) {
       publisherReviewStatuses = (_json['publisherReviewStatuses'] as core.List)
-          .map<PublisherReviewStatus>(
-              (value) => PublisherReviewStatus.fromJson(value))
+          .map<PublisherReviewStatus>((value) => PublisherReviewStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -21654,7 +22074,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -21899,100 +22320,110 @@
 
   TargetingOption.fromJson(core.Map _json) {
     if (_json.containsKey('ageRangeDetails')) {
-      ageRangeDetails =
-          AgeRangeTargetingOptionDetails.fromJson(_json['ageRangeDetails']);
+      ageRangeDetails = AgeRangeTargetingOptionDetails.fromJson(
+          _json['ageRangeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appCategoryDetails')) {
       appCategoryDetails = AppCategoryTargetingOptionDetails.fromJson(
-          _json['appCategoryDetails']);
+          _json['appCategoryDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('authorizedSellerStatusDetails')) {
       authorizedSellerStatusDetails =
           AuthorizedSellerStatusTargetingOptionDetails.fromJson(
-              _json['authorizedSellerStatusDetails']);
+              _json['authorizedSellerStatusDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('browserDetails')) {
-      browserDetails =
-          BrowserTargetingOptionDetails.fromJson(_json['browserDetails']);
+      browserDetails = BrowserTargetingOptionDetails.fromJson(
+          _json['browserDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('carrierAndIspDetails')) {
       carrierAndIspDetails = CarrierAndIspTargetingOptionDetails.fromJson(
-          _json['carrierAndIspDetails']);
+          _json['carrierAndIspDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('categoryDetails')) {
-      categoryDetails =
-          CategoryTargetingOptionDetails.fromJson(_json['categoryDetails']);
+      categoryDetails = CategoryTargetingOptionDetails.fromJson(
+          _json['categoryDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentInstreamPositionDetails')) {
       contentInstreamPositionDetails =
           ContentInstreamPositionTargetingOptionDetails.fromJson(
-              _json['contentInstreamPositionDetails']);
+              _json['contentInstreamPositionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentOutstreamPositionDetails')) {
       contentOutstreamPositionDetails =
           ContentOutstreamPositionTargetingOptionDetails.fromJson(
-              _json['contentOutstreamPositionDetails']);
+              _json['contentOutstreamPositionDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceMakeModelDetails')) {
       deviceMakeModelDetails = DeviceMakeModelTargetingOptionDetails.fromJson(
-          _json['deviceMakeModelDetails']);
+          _json['deviceMakeModelDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceTypeDetails')) {
-      deviceTypeDetails =
-          DeviceTypeTargetingOptionDetails.fromJson(_json['deviceTypeDetails']);
+      deviceTypeDetails = DeviceTypeTargetingOptionDetails.fromJson(
+          _json['deviceTypeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('digitalContentLabelDetails')) {
       digitalContentLabelDetails =
           DigitalContentLabelTargetingOptionDetails.fromJson(
-              _json['digitalContentLabelDetails']);
+              _json['digitalContentLabelDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('environmentDetails')) {
       environmentDetails = EnvironmentTargetingOptionDetails.fromJson(
-          _json['environmentDetails']);
+          _json['environmentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exchangeDetails')) {
-      exchangeDetails =
-          ExchangeTargetingOptionDetails.fromJson(_json['exchangeDetails']);
+      exchangeDetails = ExchangeTargetingOptionDetails.fromJson(
+          _json['exchangeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('genderDetails')) {
-      genderDetails =
-          GenderTargetingOptionDetails.fromJson(_json['genderDetails']);
+      genderDetails = GenderTargetingOptionDetails.fromJson(
+          _json['genderDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('geoRegionDetails')) {
-      geoRegionDetails =
-          GeoRegionTargetingOptionDetails.fromJson(_json['geoRegionDetails']);
+      geoRegionDetails = GeoRegionTargetingOptionDetails.fromJson(
+          _json['geoRegionDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('householdIncomeDetails')) {
       householdIncomeDetails = HouseholdIncomeTargetingOptionDetails.fromJson(
-          _json['householdIncomeDetails']);
+          _json['householdIncomeDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageDetails')) {
-      languageDetails =
-          LanguageTargetingOptionDetails.fromJson(_json['languageDetails']);
+      languageDetails = LanguageTargetingOptionDetails.fromJson(
+          _json['languageDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('onScreenPositionDetails')) {
       onScreenPositionDetails = OnScreenPositionTargetingOptionDetails.fromJson(
-          _json['onScreenPositionDetails']);
+          _json['onScreenPositionDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operatingSystemDetails')) {
       operatingSystemDetails = OperatingSystemTargetingOptionDetails.fromJson(
-          _json['operatingSystemDetails']);
+          _json['operatingSystemDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parentalStatusDetails')) {
       parentalStatusDetails = ParentalStatusTargetingOptionDetails.fromJson(
-          _json['parentalStatusDetails']);
+          _json['parentalStatusDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sensitiveCategoryDetails')) {
       sensitiveCategoryDetails =
           SensitiveCategoryTargetingOptionDetails.fromJson(
-              _json['sensitiveCategoryDetails']);
+              _json['sensitiveCategoryDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subExchangeDetails')) {
       subExchangeDetails = SubExchangeTargetingOptionDetails.fromJson(
-          _json['subExchangeDetails']);
+          _json['subExchangeDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetingOptionId')) {
       targetingOptionId = _json['targetingOptionId'] as core.String;
@@ -22003,15 +22434,17 @@
     if (_json.containsKey('userRewardedContentDetails')) {
       userRewardedContentDetails =
           UserRewardedContentTargetingOptionDetails.fromJson(
-              _json['userRewardedContentDetails']);
+              _json['userRewardedContentDetails']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('videoPlayerSizeDetails')) {
       videoPlayerSizeDetails = VideoPlayerSizeTargetingOptionDetails.fromJson(
-          _json['videoPlayerSizeDetails']);
+          _json['videoPlayerSizeDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('viewabilityDetails')) {
       viewabilityDetails = ViewabilityTargetingOptionDetails.fromJson(
-          _json['viewabilityDetails']);
+          _json['viewabilityDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -22218,14 +22651,16 @@
 
   ThirdPartyVerifierAssignedTargetingOptionDetails.fromJson(core.Map _json) {
     if (_json.containsKey('adloox')) {
-      adloox = Adloox.fromJson(_json['adloox']);
+      adloox = Adloox.fromJson(
+          _json['adloox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doubleVerify')) {
-      doubleVerify = DoubleVerify.fromJson(_json['doubleVerify']);
+      doubleVerify = DoubleVerify.fromJson(
+          _json['doubleVerify'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('integralAdScience')) {
-      integralAdScience =
-          IntegralAdScience.fromJson(_json['integralAdScience']);
+      integralAdScience = IntegralAdScience.fromJson(
+          _json['integralAdScience'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -22394,7 +22829,8 @@
       bitRateKbps = _json['bitRateKbps'] as core.String;
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = Dimensions.fromJson(_json['dimensions']);
+      dimensions = Dimensions.fromJson(
+          _json['dimensions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileSizeBytes')) {
       fileSizeBytes = _json['fileSizeBytes'] as core.String;
@@ -22551,7 +22987,8 @@
   User.fromJson(core.Map _json) {
     if (_json.containsKey('assignedUserRoles')) {
       assignedUserRoles = (_json['assignedUserRoles'] as core.List)
-          .map<AssignedUserRole>((value) => AssignedUserRole.fromJson(value))
+          .map<AssignedUserRole>((value) => AssignedUserRole.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('displayName')) {
diff --git a/generated/googleapis/lib/dlp/v2.dart b/generated/googleapis/lib/dlp/v2.dart
index 98378af..28c3457 100644
--- a/generated/googleapis/lib/dlp/v2.dart
+++ b/generated/googleapis/lib/dlp/v2.dart
@@ -127,8 +127,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -218,8 +220,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -313,8 +317,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a DeidentifyTemplate. See
@@ -367,7 +373,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a DeidentifyTemplate. See
@@ -420,8 +429,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists DeidentifyTemplates. See
@@ -518,8 +529,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the DeidentifyTemplate. See
@@ -578,8 +591,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -658,8 +673,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an InspectTemplate. See
@@ -712,7 +729,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an InspectTemplate. See
@@ -765,8 +785,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists InspectTemplates. See
@@ -863,8 +885,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the InspectTemplate. See
@@ -922,8 +946,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1018,8 +1044,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a DeidentifyTemplate. See
@@ -1073,7 +1101,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a DeidentifyTemplate. See
@@ -1127,8 +1158,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists DeidentifyTemplates. See
@@ -1225,8 +1258,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the DeidentifyTemplate. See
@@ -1286,8 +1321,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1366,8 +1403,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an InspectTemplate. See
@@ -1421,7 +1460,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an InspectTemplate. See
@@ -1475,8 +1517,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists InspectTemplates. See
@@ -1573,8 +1617,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the InspectTemplate. See
@@ -1633,8 +1679,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1712,8 +1760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a stored infoType. See
@@ -1767,7 +1817,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a stored infoType. See
@@ -1820,8 +1873,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists stored infoTypes. See
@@ -1920,7 +1975,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the stored infoType by creating a new version. The existing
@@ -1980,8 +2037,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2059,8 +2118,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a stored infoType. See
@@ -2113,7 +2174,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a stored infoType. See
@@ -2165,8 +2229,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists stored infoTypes. See
@@ -2265,7 +2331,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the stored infoType by creating a new version. The existing
@@ -2324,8 +2392,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2425,7 +2495,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finds potentially sensitive info in content. This method has limits on
@@ -2498,7 +2570,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2InspectContentResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2InspectContentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Re-identifies content that has been de-identified. See
@@ -2567,7 +2641,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2646,8 +2722,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a DeidentifyTemplate. See
@@ -2700,7 +2778,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a DeidentifyTemplate. See
@@ -2753,8 +2834,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists DeidentifyTemplates. See
@@ -2851,8 +2934,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the DeidentifyTemplate. See
@@ -2911,8 +2996,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2976,7 +3063,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new job to inspect storage or calculate risk metrics. See
@@ -3046,7 +3136,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GooglePrivacyDlpV2DlpJob.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DlpJob.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running DlpJob. This method indicates that the client is no
@@ -3098,7 +3191,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running DlpJob. See
@@ -3149,7 +3245,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GooglePrivacyDlpV2DlpJob.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DlpJob.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists DlpJobs that match the specified filter in the request. See
@@ -3273,8 +3372,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3351,8 +3452,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2RedactImageResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2RedactImageResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3431,8 +3534,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an InspectTemplate. See
@@ -3485,7 +3590,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an InspectTemplate. See
@@ -3538,8 +3646,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists InspectTemplates. See
@@ -3636,8 +3746,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the InspectTemplate. See
@@ -3695,8 +3807,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3760,7 +3874,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GooglePrivacyDlpV2DlpJob.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DlpJob.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a job trigger to run DLP actions such as scanning storage for
@@ -3828,8 +3945,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2JobTrigger.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2JobTrigger.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a job trigger. See
@@ -3880,7 +3999,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a job trigger. See
@@ -3931,8 +4053,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2JobTrigger.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2JobTrigger.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists job triggers. See
@@ -4048,7 +4172,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a job trigger. See
@@ -4105,8 +4231,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2JobTrigger.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2JobTrigger.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4207,7 +4335,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finds potentially sensitive info in content. This method has limits on
@@ -4280,7 +4410,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2InspectContentResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2InspectContentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Re-identifies content that has been de-identified. See
@@ -4349,7 +4481,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4428,8 +4562,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a DeidentifyTemplate. See
@@ -4483,7 +4619,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a DeidentifyTemplate. See
@@ -4537,8 +4676,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists DeidentifyTemplates. See
@@ -4635,8 +4776,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the DeidentifyTemplate. See
@@ -4696,8 +4839,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4762,7 +4907,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new job to inspect storage or calculate risk metrics. See
@@ -4832,7 +4980,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GooglePrivacyDlpV2DlpJob.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DlpJob.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running DlpJob. This method indicates that the client is no
@@ -4884,7 +5035,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finish a running hybrid DlpJob. Triggers the finalization steps and
@@ -4943,7 +5097,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running DlpJob. See
@@ -4994,7 +5151,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GooglePrivacyDlpV2DlpJob.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DlpJob.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inspect hybrid content and store findings to a job. To review the findings
@@ -5056,8 +5216,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2HybridInspectResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2HybridInspectResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists DlpJobs that match the specified filter in the request. See
@@ -5181,8 +5343,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5260,8 +5424,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2RedactImageResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2RedactImageResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5340,8 +5506,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an InspectTemplate. See
@@ -5395,7 +5563,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an InspectTemplate. See
@@ -5449,8 +5620,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists InspectTemplates. See
@@ -5547,8 +5720,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the InspectTemplate. See
@@ -5607,8 +5782,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2InspectTemplate.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2InspectTemplate.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5673,7 +5850,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GooglePrivacyDlpV2DlpJob.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2DlpJob.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a job trigger to run DLP actions such as scanning storage for
@@ -5741,8 +5921,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2JobTrigger.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2JobTrigger.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a job trigger. See
@@ -5794,7 +5976,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a job trigger. See
@@ -5846,8 +6031,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2JobTrigger.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2JobTrigger.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inspect hybrid content and store findings to a trigger. The inspection
@@ -5910,8 +6097,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2HybridInspectResponse.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2HybridInspectResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists job triggers. See
@@ -6027,7 +6216,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a job trigger. See
@@ -6085,8 +6276,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2JobTrigger.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2JobTrigger.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6164,8 +6357,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a stored infoType. See
@@ -6219,7 +6414,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a stored infoType. See
@@ -6272,8 +6470,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists stored infoTypes. See
@@ -6372,7 +6572,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the stored infoType by creating a new version. The existing
@@ -6432,8 +6634,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6511,8 +6715,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a stored infoType. See
@@ -6565,7 +6771,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a stored infoType. See
@@ -6617,8 +6826,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists stored infoTypes. See
@@ -6717,7 +6928,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(data));
+      (data) => GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the stored infoType by creating a new version. The existing
@@ -6776,8 +6989,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GooglePrivacyDlpV2StoredInfoType.fromJson(data));
+    return _response.then(
+      (data) => GooglePrivacyDlpV2StoredInfoType.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6809,27 +7024,30 @@
   GooglePrivacyDlpV2Action.fromJson(core.Map _json) {
     if (_json.containsKey('jobNotificationEmails')) {
       jobNotificationEmails = GooglePrivacyDlpV2JobNotificationEmails.fromJson(
-          _json['jobNotificationEmails']);
+          _json['jobNotificationEmails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pubSub')) {
-      pubSub = GooglePrivacyDlpV2PublishToPubSub.fromJson(_json['pubSub']);
+      pubSub = GooglePrivacyDlpV2PublishToPubSub.fromJson(
+          _json['pubSub'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publishFindingsToCloudDataCatalog')) {
       publishFindingsToCloudDataCatalog =
           GooglePrivacyDlpV2PublishFindingsToCloudDataCatalog.fromJson(
-              _json['publishFindingsToCloudDataCatalog']);
+              _json['publishFindingsToCloudDataCatalog']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publishSummaryToCscc')) {
       publishSummaryToCscc = GooglePrivacyDlpV2PublishSummaryToCscc.fromJson(
-          _json['publishSummaryToCscc']);
+          _json['publishSummaryToCscc'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publishToStackdriver')) {
       publishToStackdriver = GooglePrivacyDlpV2PublishToStackdriver.fromJson(
-          _json['publishToStackdriver']);
+          _json['publishToStackdriver'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('saveFindings')) {
-      saveFindings =
-          GooglePrivacyDlpV2SaveFindings.fromJson(_json['saveFindings']);
+      saveFindings = GooglePrivacyDlpV2SaveFindings.fromJson(
+          _json['saveFindings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6907,41 +7125,44 @@
     if (_json.containsKey('categoricalStatsResult')) {
       categoricalStatsResult =
           GooglePrivacyDlpV2CategoricalStatsResult.fromJson(
-              _json['categoricalStatsResult']);
+              _json['categoricalStatsResult']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deltaPresenceEstimationResult')) {
       deltaPresenceEstimationResult =
           GooglePrivacyDlpV2DeltaPresenceEstimationResult.fromJson(
-              _json['deltaPresenceEstimationResult']);
+              _json['deltaPresenceEstimationResult']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kAnonymityResult')) {
       kAnonymityResult = GooglePrivacyDlpV2KAnonymityResult.fromJson(
-          _json['kAnonymityResult']);
+          _json['kAnonymityResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kMapEstimationResult')) {
       kMapEstimationResult = GooglePrivacyDlpV2KMapEstimationResult.fromJson(
-          _json['kMapEstimationResult']);
+          _json['kMapEstimationResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lDiversityResult')) {
       lDiversityResult = GooglePrivacyDlpV2LDiversityResult.fromJson(
-          _json['lDiversityResult']);
+          _json['lDiversityResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('numericalStatsResult')) {
       numericalStatsResult = GooglePrivacyDlpV2NumericalStatsResult.fromJson(
-          _json['numericalStatsResult']);
+          _json['numericalStatsResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestedOptions')) {
       requestedOptions =
           GooglePrivacyDlpV2RequestedRiskAnalysisOptions.fromJson(
-              _json['requestedOptions']);
+              _json['requestedOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestedPrivacyMetric')) {
       requestedPrivacyMetric = GooglePrivacyDlpV2PrivacyMetric.fromJson(
-          _json['requestedPrivacyMetric']);
+          _json['requestedPrivacyMetric']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestedSourceTable')) {
       requestedSourceTable = GooglePrivacyDlpV2BigQueryTable.fromJson(
-          _json['requestedSourceTable']);
+          _json['requestedSourceTable'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7001,16 +7222,18 @@
   GooglePrivacyDlpV2AuxiliaryTable.fromJson(core.Map _json) {
     if (_json.containsKey('quasiIds')) {
       quasiIds = (_json['quasiIds'] as core.List)
-          .map<GooglePrivacyDlpV2QuasiIdField>(
-              (value) => GooglePrivacyDlpV2QuasiIdField.fromJson(value))
+          .map<GooglePrivacyDlpV2QuasiIdField>((value) =>
+              GooglePrivacyDlpV2QuasiIdField.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('relativeFrequency')) {
-      relativeFrequency =
-          GooglePrivacyDlpV2FieldId.fromJson(_json['relativeFrequency']);
+      relativeFrequency = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['relativeFrequency'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('table')) {
-      table = GooglePrivacyDlpV2BigQueryTable.fromJson(_json['table']);
+      table = GooglePrivacyDlpV2BigQueryTable.fromJson(
+          _json['table'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7041,10 +7264,12 @@
 
   GooglePrivacyDlpV2BigQueryField.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('table')) {
-      table = GooglePrivacyDlpV2BigQueryTable.fromJson(_json['table']);
+      table = GooglePrivacyDlpV2BigQueryTable.fromJson(
+          _json['table'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7079,8 +7304,8 @@
       rowNumber = _json['rowNumber'] as core.String;
     }
     if (_json.containsKey('tableReference')) {
-      tableReference =
-          GooglePrivacyDlpV2BigQueryTable.fromJson(_json['tableReference']);
+      tableReference = GooglePrivacyDlpV2BigQueryTable.fromJson(
+          _json['tableReference'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7139,14 +7364,16 @@
   GooglePrivacyDlpV2BigQueryOptions.fromJson(core.Map _json) {
     if (_json.containsKey('excludedFields')) {
       excludedFields = (_json['excludedFields'] as core.List)
-          .map<GooglePrivacyDlpV2FieldId>(
-              (value) => GooglePrivacyDlpV2FieldId.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldId>((value) =>
+              GooglePrivacyDlpV2FieldId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('identifyingFields')) {
       identifyingFields = (_json['identifyingFields'] as core.List)
-          .map<GooglePrivacyDlpV2FieldId>(
-              (value) => GooglePrivacyDlpV2FieldId.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldId>((value) =>
+              GooglePrivacyDlpV2FieldId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rowsLimit')) {
@@ -7159,8 +7386,8 @@
       sampleMethod = _json['sampleMethod'] as core.String;
     }
     if (_json.containsKey('tableReference')) {
-      tableReference =
-          GooglePrivacyDlpV2BigQueryTable.fromJson(_json['tableReference']);
+      tableReference = GooglePrivacyDlpV2BigQueryTable.fromJson(
+          _json['tableReference'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7298,14 +7525,16 @@
 
   GooglePrivacyDlpV2Bucket.fromJson(core.Map _json) {
     if (_json.containsKey('max')) {
-      max = GooglePrivacyDlpV2Value.fromJson(_json['max']);
+      max = GooglePrivacyDlpV2Value.fromJson(
+          _json['max'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('min')) {
-      min = GooglePrivacyDlpV2Value.fromJson(_json['min']);
+      min = GooglePrivacyDlpV2Value.fromJson(
+          _json['min'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replacementValue')) {
-      replacementValue =
-          GooglePrivacyDlpV2Value.fromJson(_json['replacementValue']);
+      replacementValue = GooglePrivacyDlpV2Value.fromJson(
+          _json['replacementValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7341,8 +7570,9 @@
   GooglePrivacyDlpV2BucketingConfig.fromJson(core.Map _json) {
     if (_json.containsKey('buckets')) {
       buckets = (_json['buckets'] as core.List)
-          .map<GooglePrivacyDlpV2Bucket>(
-              (value) => GooglePrivacyDlpV2Bucket.fromJson(value))
+          .map<GooglePrivacyDlpV2Bucket>((value) =>
+              GooglePrivacyDlpV2Bucket.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7432,7 +7662,8 @@
 
   GooglePrivacyDlpV2CategoricalStatsConfig.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7474,8 +7705,9 @@
     }
     if (_json.containsKey('bucketValues')) {
       bucketValues = (_json['bucketValues'] as core.List)
-          .map<GooglePrivacyDlpV2ValueFrequency>(
-              (value) => GooglePrivacyDlpV2ValueFrequency.fromJson(value))
+          .map<GooglePrivacyDlpV2ValueFrequency>((value) =>
+              GooglePrivacyDlpV2ValueFrequency.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('valueFrequencyLowerBound')) {
@@ -7520,11 +7752,12 @@
 
   GooglePrivacyDlpV2CategoricalStatsResult.fromJson(core.Map _json) {
     if (_json.containsKey('valueFrequencyHistogramBuckets')) {
-      valueFrequencyHistogramBuckets = (_json['valueFrequencyHistogramBuckets']
-              as core.List)
-          .map<GooglePrivacyDlpV2CategoricalStatsHistogramBucket>((value) =>
-              GooglePrivacyDlpV2CategoricalStatsHistogramBucket.fromJson(value))
-          .toList();
+      valueFrequencyHistogramBuckets =
+          (_json['valueFrequencyHistogramBuckets'] as core.List)
+              .map<GooglePrivacyDlpV2CategoricalStatsHistogramBucket>((value) =>
+                  GooglePrivacyDlpV2CategoricalStatsHistogramBucket.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
   }
 
@@ -7574,8 +7807,9 @@
   GooglePrivacyDlpV2CharacterMaskConfig.fromJson(core.Map _json) {
     if (_json.containsKey('charactersToIgnore')) {
       charactersToIgnore = (_json['charactersToIgnore'] as core.List)
-          .map<GooglePrivacyDlpV2CharsToIgnore>(
-              (value) => GooglePrivacyDlpV2CharsToIgnore.fromJson(value))
+          .map<GooglePrivacyDlpV2CharsToIgnore>((value) =>
+              GooglePrivacyDlpV2CharsToIgnore.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maskingCharacter')) {
@@ -7720,7 +7954,8 @@
       bytesLimitPerFilePercent = _json['bytesLimitPerFilePercent'] as core.int;
     }
     if (_json.containsKey('fileSet')) {
-      fileSet = GooglePrivacyDlpV2FileSet.fromJson(_json['fileSet']);
+      fileSet = GooglePrivacyDlpV2FileSet.fromJson(
+          _json['fileSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileTypes')) {
       fileTypes = (_json['fileTypes'] as core.List)
@@ -7931,13 +8166,15 @@
 
   GooglePrivacyDlpV2Condition.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operator')) {
       operator = _json['operator'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = GooglePrivacyDlpV2Value.fromJson(_json['value']);
+      value = GooglePrivacyDlpV2Value.fromJson(
+          _json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7966,8 +8203,9 @@
   GooglePrivacyDlpV2Conditions.fromJson(core.Map _json) {
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<GooglePrivacyDlpV2Condition>(
-              (value) => GooglePrivacyDlpV2Condition.fromJson(value))
+          .map<GooglePrivacyDlpV2Condition>((value) =>
+              GooglePrivacyDlpV2Condition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8087,10 +8325,12 @@
 
   GooglePrivacyDlpV2ContentItem.fromJson(core.Map _json) {
     if (_json.containsKey('byteItem')) {
-      byteItem = GooglePrivacyDlpV2ByteContentItem.fromJson(_json['byteItem']);
+      byteItem = GooglePrivacyDlpV2ByteContentItem.fromJson(
+          _json['byteItem'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('table')) {
-      table = GooglePrivacyDlpV2Table.fromJson(_json['table']);
+      table = GooglePrivacyDlpV2Table.fromJson(
+          _json['table'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -8159,19 +8399,19 @@
     }
     if (_json.containsKey('documentLocation')) {
       documentLocation = GooglePrivacyDlpV2DocumentLocation.fromJson(
-          _json['documentLocation']);
+          _json['documentLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageLocation')) {
-      imageLocation =
-          GooglePrivacyDlpV2ImageLocation.fromJson(_json['imageLocation']);
+      imageLocation = GooglePrivacyDlpV2ImageLocation.fromJson(
+          _json['imageLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadataLocation')) {
       metadataLocation = GooglePrivacyDlpV2MetadataLocation.fromJson(
-          _json['metadataLocation']);
+          _json['metadataLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recordLocation')) {
-      recordLocation =
-          GooglePrivacyDlpV2RecordLocation.fromJson(_json['recordLocation']);
+      recordLocation = GooglePrivacyDlpV2RecordLocation.fromJson(
+          _json['recordLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8221,7 +8461,7 @@
   GooglePrivacyDlpV2CreateDeidentifyTemplateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deidentifyTemplate')) {
       deidentifyTemplate = GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
-          _json['deidentifyTemplate']);
+          _json['deidentifyTemplate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -8268,8 +8508,8 @@
 
   GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(core.Map _json) {
     if (_json.containsKey('inspectJob')) {
-      inspectJob =
-          GooglePrivacyDlpV2InspectJobConfig.fromJson(_json['inspectJob']);
+      inspectJob = GooglePrivacyDlpV2InspectJobConfig.fromJson(
+          _json['inspectJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobId')) {
       jobId = _json['jobId'] as core.String;
@@ -8278,8 +8518,8 @@
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('riskJob')) {
-      riskJob =
-          GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(_json['riskJob']);
+      riskJob = GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(
+          _json['riskJob'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8319,8 +8559,8 @@
 
   GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('inspectTemplate')) {
-      inspectTemplate =
-          GooglePrivacyDlpV2InspectTemplate.fromJson(_json['inspectTemplate']);
+      inspectTemplate = GooglePrivacyDlpV2InspectTemplate.fromJson(
+          _json['inspectTemplate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -8363,7 +8603,8 @@
 
   GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(core.Map _json) {
     if (_json.containsKey('jobTrigger')) {
-      jobTrigger = GooglePrivacyDlpV2JobTrigger.fromJson(_json['jobTrigger']);
+      jobTrigger = GooglePrivacyDlpV2JobTrigger.fromJson(
+          _json['jobTrigger'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -8406,7 +8647,8 @@
 
   GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(_json['config']);
+      config = GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -8480,14 +8722,16 @@
 
   GooglePrivacyDlpV2CryptoDeterministicConfig.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
-      context = GooglePrivacyDlpV2FieldId.fromJson(_json['context']);
+      context = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cryptoKey')) {
-      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(_json['cryptoKey']);
+      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(
+          _json['cryptoKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('surrogateInfoType')) {
-      surrogateInfoType =
-          GooglePrivacyDlpV2InfoType.fromJson(_json['surrogateInfoType']);
+      surrogateInfoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['surrogateInfoType'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8520,7 +8764,8 @@
 
   GooglePrivacyDlpV2CryptoHashConfig.fromJson(core.Map _json) {
     if (_json.containsKey('cryptoKey')) {
-      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(_json['cryptoKey']);
+      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(
+          _json['cryptoKey'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8551,16 +8796,16 @@
 
   GooglePrivacyDlpV2CryptoKey.fromJson(core.Map _json) {
     if (_json.containsKey('kmsWrapped')) {
-      kmsWrapped =
-          GooglePrivacyDlpV2KmsWrappedCryptoKey.fromJson(_json['kmsWrapped']);
+      kmsWrapped = GooglePrivacyDlpV2KmsWrappedCryptoKey.fromJson(
+          _json['kmsWrapped'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transient')) {
-      transient =
-          GooglePrivacyDlpV2TransientCryptoKey.fromJson(_json['transient']);
+      transient = GooglePrivacyDlpV2TransientCryptoKey.fromJson(
+          _json['transient'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unwrapped')) {
-      unwrapped =
-          GooglePrivacyDlpV2UnwrappedCryptoKey.fromJson(_json['unwrapped']);
+      unwrapped = GooglePrivacyDlpV2UnwrappedCryptoKey.fromJson(
+          _json['unwrapped'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8659,10 +8904,12 @@
       commonAlphabet = _json['commonAlphabet'] as core.String;
     }
     if (_json.containsKey('context')) {
-      context = GooglePrivacyDlpV2FieldId.fromJson(_json['context']);
+      context = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cryptoKey')) {
-      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(_json['cryptoKey']);
+      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(
+          _json['cryptoKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAlphabet')) {
       customAlphabet = _json['customAlphabet'] as core.String;
@@ -8671,8 +8918,8 @@
       radix = _json['radix'] as core.int;
     }
     if (_json.containsKey('surrogateInfoType')) {
-      surrogateInfoType =
-          GooglePrivacyDlpV2InfoType.fromJson(_json['surrogateInfoType']);
+      surrogateInfoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['surrogateInfoType'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8756,31 +9003,36 @@
   GooglePrivacyDlpV2CustomInfoType.fromJson(core.Map _json) {
     if (_json.containsKey('detectionRules')) {
       detectionRules = (_json['detectionRules'] as core.List)
-          .map<GooglePrivacyDlpV2DetectionRule>(
-              (value) => GooglePrivacyDlpV2DetectionRule.fromJson(value))
+          .map<GooglePrivacyDlpV2DetectionRule>((value) =>
+              GooglePrivacyDlpV2DetectionRule.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dictionary')) {
-      dictionary = GooglePrivacyDlpV2Dictionary.fromJson(_json['dictionary']);
+      dictionary = GooglePrivacyDlpV2Dictionary.fromJson(
+          _json['dictionary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exclusionType')) {
       exclusionType = _json['exclusionType'] as core.String;
     }
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('likelihood')) {
       likelihood = _json['likelihood'] as core.String;
     }
     if (_json.containsKey('regex')) {
-      regex = GooglePrivacyDlpV2Regex.fromJson(_json['regex']);
+      regex = GooglePrivacyDlpV2Regex.fromJson(
+          _json['regex'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('storedType')) {
-      storedType = GooglePrivacyDlpV2StoredType.fromJson(_json['storedType']);
+      storedType = GooglePrivacyDlpV2StoredType.fromJson(
+          _json['storedType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('surrogateType')) {
-      surrogateType =
-          GooglePrivacyDlpV2SurrogateType.fromJson(_json['surrogateType']);
+      surrogateType = GooglePrivacyDlpV2SurrogateType.fromJson(
+          _json['surrogateType'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8824,7 +9076,8 @@
 
   GooglePrivacyDlpV2DatastoreKey.fromJson(core.Map _json) {
     if (_json.containsKey('entityKey')) {
-      entityKey = GooglePrivacyDlpV2Key.fromJson(_json['entityKey']);
+      entityKey = GooglePrivacyDlpV2Key.fromJson(
+          _json['entityKey'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8850,11 +9103,12 @@
 
   GooglePrivacyDlpV2DatastoreOptions.fromJson(core.Map _json) {
     if (_json.containsKey('kind')) {
-      kind = GooglePrivacyDlpV2KindExpression.fromJson(_json['kind']);
+      kind = GooglePrivacyDlpV2KindExpression.fromJson(
+          _json['kind'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('partitionId')) {
-      partitionId =
-          GooglePrivacyDlpV2PartitionId.fromJson(_json['partitionId']);
+      partitionId = GooglePrivacyDlpV2PartitionId.fromJson(
+          _json['partitionId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8898,10 +9152,12 @@
 
   GooglePrivacyDlpV2DateShiftConfig.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
-      context = GooglePrivacyDlpV2FieldId.fromJson(_json['context']);
+      context = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cryptoKey')) {
-      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(_json['cryptoKey']);
+      cryptoKey = GooglePrivacyDlpV2CryptoKey.fromJson(
+          _json['cryptoKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lowerBoundDays')) {
       lowerBoundDays = _json['lowerBoundDays'] as core.int;
@@ -8957,16 +9213,19 @@
 
   GooglePrivacyDlpV2DateTime.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = GoogleTypeDate.fromJson(_json['date']);
+      date = GoogleTypeDate.fromJson(
+          _json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dayOfWeek')) {
       dayOfWeek = _json['dayOfWeek'] as core.String;
     }
     if (_json.containsKey('time')) {
-      time = GoogleTypeTimeOfDay.fromJson(_json['time']);
+      time = GoogleTypeTimeOfDay.fromJson(
+          _json['time'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeZone')) {
-      timeZone = GooglePrivacyDlpV2TimeZone.fromJson(_json['timeZone']);
+      timeZone = GooglePrivacyDlpV2TimeZone.fromJson(
+          _json['timeZone'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9009,16 +9268,19 @@
     if (_json.containsKey('infoTypeTransformations')) {
       infoTypeTransformations =
           GooglePrivacyDlpV2InfoTypeTransformations.fromJson(
-              _json['infoTypeTransformations']);
+              _json['infoTypeTransformations']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recordTransformations')) {
       recordTransformations = GooglePrivacyDlpV2RecordTransformations.fromJson(
-          _json['recordTransformations']);
+          _json['recordTransformations']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transformationErrorHandling')) {
       transformationErrorHandling =
           GooglePrivacyDlpV2TransformationErrorHandling.fromJson(
-              _json['transformationErrorHandling']);
+              _json['transformationErrorHandling']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9074,20 +9336,21 @@
   GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deidentifyConfig')) {
       deidentifyConfig = GooglePrivacyDlpV2DeidentifyConfig.fromJson(
-          _json['deidentifyConfig']);
+          _json['deidentifyConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deidentifyTemplateName')) {
       deidentifyTemplateName = _json['deidentifyTemplateName'] as core.String;
     }
     if (_json.containsKey('inspectConfig')) {
-      inspectConfig =
-          GooglePrivacyDlpV2InspectConfig.fromJson(_json['inspectConfig']);
+      inspectConfig = GooglePrivacyDlpV2InspectConfig.fromJson(
+          _json['inspectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inspectTemplateName')) {
       inspectTemplateName = _json['inspectTemplateName'] as core.String;
     }
     if (_json.containsKey('item')) {
-      item = GooglePrivacyDlpV2ContentItem.fromJson(_json['item']);
+      item = GooglePrivacyDlpV2ContentItem.fromJson(
+          _json['item'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -9130,11 +9393,12 @@
 
   GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(core.Map _json) {
     if (_json.containsKey('item')) {
-      item = GooglePrivacyDlpV2ContentItem.fromJson(_json['item']);
+      item = GooglePrivacyDlpV2ContentItem.fromJson(
+          _json['item'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('overview')) {
-      overview =
-          GooglePrivacyDlpV2TransformationOverview.fromJson(_json['overview']);
+      overview = GooglePrivacyDlpV2TransformationOverview.fromJson(
+          _json['overview'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9181,7 +9445,7 @@
     }
     if (_json.containsKey('deidentifyConfig')) {
       deidentifyConfig = GooglePrivacyDlpV2DeidentifyConfig.fromJson(
-          _json['deidentifyConfig']);
+          _json['deidentifyConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -9245,14 +9509,16 @@
   GooglePrivacyDlpV2DeltaPresenceEstimationConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auxiliaryTables')) {
       auxiliaryTables = (_json['auxiliaryTables'] as core.List)
-          .map<GooglePrivacyDlpV2StatisticalTable>(
-              (value) => GooglePrivacyDlpV2StatisticalTable.fromJson(value))
+          .map<GooglePrivacyDlpV2StatisticalTable>((value) =>
+              GooglePrivacyDlpV2StatisticalTable.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('quasiIds')) {
       quasiIds = (_json['quasiIds'] as core.List)
-          .map<GooglePrivacyDlpV2QuasiId>(
-              (value) => GooglePrivacyDlpV2QuasiId.fromJson(value))
+          .map<GooglePrivacyDlpV2QuasiId>((value) =>
+              GooglePrivacyDlpV2QuasiId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('regionCode')) {
@@ -9313,7 +9579,7 @@
       bucketValues = (_json['bucketValues'] as core.List)
           .map<GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues>(
               (value) => GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxProbability')) {
@@ -9371,8 +9637,9 @@
     }
     if (_json.containsKey('quasiIdsValues')) {
       quasiIdsValues = (_json['quasiIdsValues'] as core.List)
-          .map<GooglePrivacyDlpV2Value>(
-              (value) => GooglePrivacyDlpV2Value.fromJson(value))
+          .map<GooglePrivacyDlpV2Value>((value) =>
+              GooglePrivacyDlpV2Value.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9412,7 +9679,8 @@
               .map<GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket>(
                   (value) =>
                       GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket
-                          .fromJson(value))
+                          .fromJson(
+                              value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -9441,8 +9709,8 @@
 
   GooglePrivacyDlpV2DetectionRule.fromJson(core.Map _json) {
     if (_json.containsKey('hotwordRule')) {
-      hotwordRule =
-          GooglePrivacyDlpV2HotwordRule.fromJson(_json['hotwordRule']);
+      hotwordRule = GooglePrivacyDlpV2HotwordRule.fromJson(
+          _json['hotwordRule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9487,10 +9755,11 @@
   GooglePrivacyDlpV2Dictionary.fromJson(core.Map _json) {
     if (_json.containsKey('cloudStoragePath')) {
       cloudStoragePath = GooglePrivacyDlpV2CloudStoragePath.fromJson(
-          _json['cloudStoragePath']);
+          _json['cloudStoragePath'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('wordList')) {
-      wordList = GooglePrivacyDlpV2WordList.fromJson(_json['wordList']);
+      wordList = GooglePrivacyDlpV2WordList.fromJson(
+          _json['wordList'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9566,13 +9835,14 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<GooglePrivacyDlpV2Error>(
-              (value) => GooglePrivacyDlpV2Error.fromJson(value))
+          .map<GooglePrivacyDlpV2Error>((value) =>
+              GooglePrivacyDlpV2Error.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inspectDetails')) {
       inspectDetails = GooglePrivacyDlpV2InspectDataSourceDetails.fromJson(
-          _json['inspectDetails']);
+          _json['inspectDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobTriggerName')) {
       jobTriggerName = _json['jobTriggerName'] as core.String;
@@ -9582,7 +9852,7 @@
     }
     if (_json.containsKey('riskDetails')) {
       riskDetails = GooglePrivacyDlpV2AnalyzeDataSourceRiskDetails.fromJson(
-          _json['riskDetails']);
+          _json['riskDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -9667,7 +9937,8 @@
 
   GooglePrivacyDlpV2EntityId.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9693,7 +9964,8 @@
 
   GooglePrivacyDlpV2Error.fromJson(core.Map _json) {
     if (_json.containsKey('details')) {
-      details = GoogleRpcStatus.fromJson(_json['details']);
+      details = GoogleRpcStatus.fromJson(
+          _json['details'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestamps')) {
       timestamps = (_json['timestamps'] as core.List)
@@ -9730,8 +10002,9 @@
   GooglePrivacyDlpV2ExcludeInfoTypes.fromJson(core.Map _json) {
     if (_json.containsKey('infoTypes')) {
       infoTypes = (_json['infoTypes'] as core.List)
-          .map<GooglePrivacyDlpV2InfoType>(
-              (value) => GooglePrivacyDlpV2InfoType.fromJson(value))
+          .map<GooglePrivacyDlpV2InfoType>((value) =>
+              GooglePrivacyDlpV2InfoType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9777,17 +10050,19 @@
 
   GooglePrivacyDlpV2ExclusionRule.fromJson(core.Map _json) {
     if (_json.containsKey('dictionary')) {
-      dictionary = GooglePrivacyDlpV2Dictionary.fromJson(_json['dictionary']);
+      dictionary = GooglePrivacyDlpV2Dictionary.fromJson(
+          _json['dictionary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('excludeInfoTypes')) {
       excludeInfoTypes = GooglePrivacyDlpV2ExcludeInfoTypes.fromJson(
-          _json['excludeInfoTypes']);
+          _json['excludeInfoTypes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('matchingType')) {
       matchingType = _json['matchingType'] as core.String;
     }
     if (_json.containsKey('regex')) {
-      regex = GooglePrivacyDlpV2Regex.fromJson(_json['regex']);
+      regex = GooglePrivacyDlpV2Regex.fromJson(
+          _json['regex'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9825,7 +10100,8 @@
 
   GooglePrivacyDlpV2Expressions.fromJson(core.Map _json) {
     if (_json.containsKey('conditions')) {
-      conditions = GooglePrivacyDlpV2Conditions.fromJson(_json['conditions']);
+      conditions = GooglePrivacyDlpV2Conditions.fromJson(
+          _json['conditions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logicalOperator')) {
       logicalOperator = _json['logicalOperator'] as core.String;
@@ -9890,24 +10166,27 @@
 
   GooglePrivacyDlpV2FieldTransformation.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition =
-          GooglePrivacyDlpV2RecordCondition.fromJson(_json['condition']);
+      condition = GooglePrivacyDlpV2RecordCondition.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<GooglePrivacyDlpV2FieldId>(
-              (value) => GooglePrivacyDlpV2FieldId.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldId>((value) =>
+              GooglePrivacyDlpV2FieldId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('infoTypeTransformations')) {
       infoTypeTransformations =
           GooglePrivacyDlpV2InfoTypeTransformations.fromJson(
-              _json['infoTypeTransformations']);
+              _json['infoTypeTransformations']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('primitiveTransformation')) {
       primitiveTransformation =
           GooglePrivacyDlpV2PrimitiveTransformation.fromJson(
-              _json['primitiveTransformation']);
+              _json['primitiveTransformation']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9949,7 +10228,7 @@
   GooglePrivacyDlpV2FileSet.fromJson(core.Map _json) {
     if (_json.containsKey('regexFileSet')) {
       regexFileSet = GooglePrivacyDlpV2CloudStorageRegexFileSet.fromJson(
-          _json['regexFileSet']);
+          _json['regexFileSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -10034,7 +10313,8 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobCreateTime')) {
       jobCreateTime = _json['jobCreateTime'] as core.String;
@@ -10044,14 +10324,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('likelihood')) {
       likelihood = _json['likelihood'] as core.String;
     }
     if (_json.containsKey('location')) {
-      location = GooglePrivacyDlpV2Location.fromJson(_json['location']);
+      location = GooglePrivacyDlpV2Location.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -10060,7 +10342,8 @@
       quote = _json['quote'] as core.String;
     }
     if (_json.containsKey('quoteInfo')) {
-      quoteInfo = GooglePrivacyDlpV2QuoteInfo.fromJson(_json['quoteInfo']);
+      quoteInfo = GooglePrivacyDlpV2QuoteInfo.fromJson(
+          _json['quoteInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceName')) {
       resourceName = _json['resourceName'] as core.String;
@@ -10133,8 +10416,9 @@
   GooglePrivacyDlpV2FindingLimits.fromJson(core.Map _json) {
     if (_json.containsKey('maxFindingsPerInfoType')) {
       maxFindingsPerInfoType = (_json['maxFindingsPerInfoType'] as core.List)
-          .map<GooglePrivacyDlpV2InfoTypeLimit>(
-              (value) => GooglePrivacyDlpV2InfoTypeLimit.fromJson(value))
+          .map<GooglePrivacyDlpV2InfoTypeLimit>((value) =>
+              GooglePrivacyDlpV2InfoTypeLimit.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxFindingsPerItem')) {
@@ -10211,10 +10495,12 @@
       bucketSize = (_json['bucketSize'] as core.num).toDouble();
     }
     if (_json.containsKey('lowerBound')) {
-      lowerBound = GooglePrivacyDlpV2Value.fromJson(_json['lowerBound']);
+      lowerBound = GooglePrivacyDlpV2Value.fromJson(
+          _json['lowerBound'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('upperBound')) {
-      upperBound = GooglePrivacyDlpV2Value.fromJson(_json['upperBound']);
+      upperBound = GooglePrivacyDlpV2Value.fromJson(
+          _json['upperBound'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10256,14 +10542,16 @@
 
   GooglePrivacyDlpV2HotwordRule.fromJson(core.Map _json) {
     if (_json.containsKey('hotwordRegex')) {
-      hotwordRegex = GooglePrivacyDlpV2Regex.fromJson(_json['hotwordRegex']);
+      hotwordRegex = GooglePrivacyDlpV2Regex.fromJson(
+          _json['hotwordRegex'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('likelihoodAdjustment')) {
       likelihoodAdjustment = GooglePrivacyDlpV2LikelihoodAdjustment.fromJson(
-          _json['likelihoodAdjustment']);
+          _json['likelihoodAdjustment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('proximity')) {
-      proximity = GooglePrivacyDlpV2Proximity.fromJson(_json['proximity']);
+      proximity = GooglePrivacyDlpV2Proximity.fromJson(
+          _json['proximity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10296,10 +10584,11 @@
   GooglePrivacyDlpV2HybridContentItem.fromJson(core.Map _json) {
     if (_json.containsKey('findingDetails')) {
       findingDetails = GooglePrivacyDlpV2HybridFindingDetails.fromJson(
-          _json['findingDetails']);
+          _json['findingDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('item')) {
-      item = GooglePrivacyDlpV2ContentItem.fromJson(_json['item']);
+      item = GooglePrivacyDlpV2ContentItem.fromJson(
+          _json['item'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10353,23 +10642,24 @@
 
   GooglePrivacyDlpV2HybridFindingDetails.fromJson(core.Map _json) {
     if (_json.containsKey('containerDetails')) {
-      containerDetails =
-          GooglePrivacyDlpV2Container.fromJson(_json['containerDetails']);
+      containerDetails = GooglePrivacyDlpV2Container.fromJson(
+          _json['containerDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileOffset')) {
       fileOffset = _json['fileOffset'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('rowOffset')) {
       rowOffset = _json['rowOffset'] as core.String;
     }
     if (_json.containsKey('tableOptions')) {
-      tableOptions =
-          GooglePrivacyDlpV2TableOptions.fromJson(_json['tableOptions']);
+      tableOptions = GooglePrivacyDlpV2TableOptions.fromJson(
+          _json['tableOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10403,8 +10693,8 @@
 
   GooglePrivacyDlpV2HybridInspectDlpJobRequest.fromJson(core.Map _json) {
     if (_json.containsKey('hybridItem')) {
-      hybridItem =
-          GooglePrivacyDlpV2HybridContentItem.fromJson(_json['hybridItem']);
+      hybridItem = GooglePrivacyDlpV2HybridContentItem.fromJson(
+          _json['hybridItem'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10426,8 +10716,8 @@
 
   GooglePrivacyDlpV2HybridInspectJobTriggerRequest.fromJson(core.Map _json) {
     if (_json.containsKey('hybridItem')) {
-      hybridItem =
-          GooglePrivacyDlpV2HybridContentItem.fromJson(_json['hybridItem']);
+      hybridItem = GooglePrivacyDlpV2HybridContentItem.fromJson(
+          _json['hybridItem'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10534,7 +10824,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('requiredFindingLabelKeys')) {
@@ -10544,8 +10835,8 @@
               .toList();
     }
     if (_json.containsKey('tableOptions')) {
-      tableOptions =
-          GooglePrivacyDlpV2TableOptions.fromJson(_json['tableOptions']);
+      tableOptions = GooglePrivacyDlpV2TableOptions.fromJson(
+          _json['tableOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10578,8 +10869,9 @@
   GooglePrivacyDlpV2ImageLocation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBoxes')) {
       boundingBoxes = (_json['boundingBoxes'] as core.List)
-          .map<GooglePrivacyDlpV2BoundingBox>(
-              (value) => GooglePrivacyDlpV2BoundingBox.fromJson(value))
+          .map<GooglePrivacyDlpV2BoundingBox>((value) =>
+              GooglePrivacyDlpV2BoundingBox.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10614,14 +10906,15 @@
 
   GooglePrivacyDlpV2ImageRedactionConfig.fromJson(core.Map _json) {
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('redactAllText')) {
       redactAllText = _json['redactAllText'] as core.bool;
     }
     if (_json.containsKey('redactionColor')) {
-      redactionColor =
-          GooglePrivacyDlpV2Color.fromJson(_json['redactionColor']);
+      redactionColor = GooglePrivacyDlpV2Color.fromJson(
+          _json['redactionColor'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10734,7 +11027,8 @@
 
   GooglePrivacyDlpV2InfoTypeLimit.fromJson(core.Map _json) {
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxFindings')) {
       maxFindings = _json['maxFindings'] as core.int;
@@ -10768,7 +11062,8 @@
       count = _json['count'] as core.String;
     }
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10800,14 +11095,16 @@
   GooglePrivacyDlpV2InfoTypeTransformation.fromJson(core.Map _json) {
     if (_json.containsKey('infoTypes')) {
       infoTypes = (_json['infoTypes'] as core.List)
-          .map<GooglePrivacyDlpV2InfoType>(
-              (value) => GooglePrivacyDlpV2InfoType.fromJson(value))
+          .map<GooglePrivacyDlpV2InfoType>((value) =>
+              GooglePrivacyDlpV2InfoType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('primitiveTransformation')) {
       primitiveTransformation =
           GooglePrivacyDlpV2PrimitiveTransformation.fromJson(
-              _json['primitiveTransformation']);
+              _json['primitiveTransformation']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10837,7 +11134,8 @@
     if (_json.containsKey('transformations')) {
       transformations = (_json['transformations'] as core.List)
           .map<GooglePrivacyDlpV2InfoTypeTransformation>((value) =>
-              GooglePrivacyDlpV2InfoTypeTransformation.fromJson(value))
+              GooglePrivacyDlpV2InfoTypeTransformation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10910,8 +11208,9 @@
     }
     if (_json.containsKey('customInfoTypes')) {
       customInfoTypes = (_json['customInfoTypes'] as core.List)
-          .map<GooglePrivacyDlpV2CustomInfoType>(
-              (value) => GooglePrivacyDlpV2CustomInfoType.fromJson(value))
+          .map<GooglePrivacyDlpV2CustomInfoType>((value) =>
+              GooglePrivacyDlpV2CustomInfoType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('excludeInfoTypes')) {
@@ -10922,20 +11221,23 @@
     }
     if (_json.containsKey('infoTypes')) {
       infoTypes = (_json['infoTypes'] as core.List)
-          .map<GooglePrivacyDlpV2InfoType>(
-              (value) => GooglePrivacyDlpV2InfoType.fromJson(value))
+          .map<GooglePrivacyDlpV2InfoType>((value) =>
+              GooglePrivacyDlpV2InfoType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('limits')) {
-      limits = GooglePrivacyDlpV2FindingLimits.fromJson(_json['limits']);
+      limits = GooglePrivacyDlpV2FindingLimits.fromJson(
+          _json['limits'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minLikelihood')) {
       minLikelihood = _json['minLikelihood'] as core.String;
     }
     if (_json.containsKey('ruleSet')) {
       ruleSet = (_json['ruleSet'] as core.List)
-          .map<GooglePrivacyDlpV2InspectionRuleSet>(
-              (value) => GooglePrivacyDlpV2InspectionRuleSet.fromJson(value))
+          .map<GooglePrivacyDlpV2InspectionRuleSet>((value) =>
+              GooglePrivacyDlpV2InspectionRuleSet.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10994,14 +11296,15 @@
 
   GooglePrivacyDlpV2InspectContentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('inspectConfig')) {
-      inspectConfig =
-          GooglePrivacyDlpV2InspectConfig.fromJson(_json['inspectConfig']);
+      inspectConfig = GooglePrivacyDlpV2InspectConfig.fromJson(
+          _json['inspectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inspectTemplateName')) {
       inspectTemplateName = _json['inspectTemplateName'] as core.String;
     }
     if (_json.containsKey('item')) {
-      item = GooglePrivacyDlpV2ContentItem.fromJson(_json['item']);
+      item = GooglePrivacyDlpV2ContentItem.fromJson(
+          _json['item'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -11035,7 +11338,8 @@
 
   GooglePrivacyDlpV2InspectContentResponse.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = GooglePrivacyDlpV2InspectResult.fromJson(_json['result']);
+      result = GooglePrivacyDlpV2InspectResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11061,10 +11365,11 @@
   GooglePrivacyDlpV2InspectDataSourceDetails.fromJson(core.Map _json) {
     if (_json.containsKey('requestedOptions')) {
       requestedOptions = GooglePrivacyDlpV2RequestedOptions.fromJson(
-          _json['requestedOptions']);
+          _json['requestedOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('result')) {
-      result = GooglePrivacyDlpV2Result.fromJson(_json['result']);
+      result = GooglePrivacyDlpV2Result.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11101,20 +11406,21 @@
   GooglePrivacyDlpV2InspectJobConfig.fromJson(core.Map _json) {
     if (_json.containsKey('actions')) {
       actions = (_json['actions'] as core.List)
-          .map<GooglePrivacyDlpV2Action>(
-              (value) => GooglePrivacyDlpV2Action.fromJson(value))
+          .map<GooglePrivacyDlpV2Action>((value) =>
+              GooglePrivacyDlpV2Action.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inspectConfig')) {
-      inspectConfig =
-          GooglePrivacyDlpV2InspectConfig.fromJson(_json['inspectConfig']);
+      inspectConfig = GooglePrivacyDlpV2InspectConfig.fromJson(
+          _json['inspectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inspectTemplateName')) {
       inspectTemplateName = _json['inspectTemplateName'] as core.String;
     }
     if (_json.containsKey('storageConfig')) {
-      storageConfig =
-          GooglePrivacyDlpV2StorageConfig.fromJson(_json['storageConfig']);
+      storageConfig = GooglePrivacyDlpV2StorageConfig.fromJson(
+          _json['storageConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11154,8 +11460,9 @@
   GooglePrivacyDlpV2InspectResult.fromJson(core.Map _json) {
     if (_json.containsKey('findings')) {
       findings = (_json['findings'] as core.List)
-          .map<GooglePrivacyDlpV2Finding>(
-              (value) => GooglePrivacyDlpV2Finding.fromJson(value))
+          .map<GooglePrivacyDlpV2Finding>((value) =>
+              GooglePrivacyDlpV2Finding.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('findingsTruncated')) {
@@ -11213,8 +11520,8 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('inspectConfig')) {
-      inspectConfig =
-          GooglePrivacyDlpV2InspectConfig.fromJson(_json['inspectConfig']);
+      inspectConfig = GooglePrivacyDlpV2InspectConfig.fromJson(
+          _json['inspectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -11261,12 +11568,12 @@
 
   GooglePrivacyDlpV2InspectionRule.fromJson(core.Map _json) {
     if (_json.containsKey('exclusionRule')) {
-      exclusionRule =
-          GooglePrivacyDlpV2ExclusionRule.fromJson(_json['exclusionRule']);
+      exclusionRule = GooglePrivacyDlpV2ExclusionRule.fromJson(
+          _json['exclusionRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hotwordRule')) {
-      hotwordRule =
-          GooglePrivacyDlpV2HotwordRule.fromJson(_json['hotwordRule']);
+      hotwordRule = GooglePrivacyDlpV2HotwordRule.fromJson(
+          _json['hotwordRule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11297,14 +11604,16 @@
   GooglePrivacyDlpV2InspectionRuleSet.fromJson(core.Map _json) {
     if (_json.containsKey('infoTypes')) {
       infoTypes = (_json['infoTypes'] as core.List)
-          .map<GooglePrivacyDlpV2InfoType>(
-              (value) => GooglePrivacyDlpV2InfoType.fromJson(value))
+          .map<GooglePrivacyDlpV2InfoType>((value) =>
+              GooglePrivacyDlpV2InfoType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<GooglePrivacyDlpV2InspectionRule>(
-              (value) => GooglePrivacyDlpV2InspectionRule.fromJson(value))
+          .map<GooglePrivacyDlpV2InspectionRule>((value) =>
+              GooglePrivacyDlpV2InspectionRule.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11395,13 +11704,14 @@
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<GooglePrivacyDlpV2Error>(
-              (value) => GooglePrivacyDlpV2Error.fromJson(value))
+          .map<GooglePrivacyDlpV2Error>((value) =>
+              GooglePrivacyDlpV2Error.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inspectJob')) {
-      inspectJob =
-          GooglePrivacyDlpV2InspectJobConfig.fromJson(_json['inspectJob']);
+      inspectJob = GooglePrivacyDlpV2InspectJobConfig.fromJson(
+          _json['inspectJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastRunTime')) {
       lastRunTime = _json['lastRunTime'] as core.String;
@@ -11414,8 +11724,9 @@
     }
     if (_json.containsKey('triggers')) {
       triggers = (_json['triggers'] as core.List)
-          .map<GooglePrivacyDlpV2Trigger>(
-              (value) => GooglePrivacyDlpV2Trigger.fromJson(value))
+          .map<GooglePrivacyDlpV2Trigger>((value) =>
+              GooglePrivacyDlpV2Trigger.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('updateTime')) {
@@ -11482,12 +11793,14 @@
 
   GooglePrivacyDlpV2KAnonymityConfig.fromJson(core.Map _json) {
     if (_json.containsKey('entityId')) {
-      entityId = GooglePrivacyDlpV2EntityId.fromJson(_json['entityId']);
+      entityId = GooglePrivacyDlpV2EntityId.fromJson(
+          _json['entityId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quasiIds')) {
       quasiIds = (_json['quasiIds'] as core.List)
-          .map<GooglePrivacyDlpV2FieldId>(
-              (value) => GooglePrivacyDlpV2FieldId.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldId>((value) =>
+              GooglePrivacyDlpV2FieldId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11523,8 +11836,9 @@
     }
     if (_json.containsKey('quasiIdsValues')) {
       quasiIdsValues = (_json['quasiIdsValues'] as core.List)
-          .map<GooglePrivacyDlpV2Value>(
-              (value) => GooglePrivacyDlpV2Value.fromJson(value))
+          .map<GooglePrivacyDlpV2Value>((value) =>
+              GooglePrivacyDlpV2Value.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11572,7 +11886,8 @@
     if (_json.containsKey('bucketValues')) {
       bucketValues = (_json['bucketValues'] as core.List)
           .map<GooglePrivacyDlpV2KAnonymityEquivalenceClass>((value) =>
-              GooglePrivacyDlpV2KAnonymityEquivalenceClass.fromJson(value))
+              GooglePrivacyDlpV2KAnonymityEquivalenceClass.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('equivalenceClassSizeLowerBound')) {
@@ -11620,7 +11935,8 @@
       equivalenceClassHistogramBuckets =
           (_json['equivalenceClassHistogramBuckets'] as core.List)
               .map<GooglePrivacyDlpV2KAnonymityHistogramBucket>((value) =>
-                  GooglePrivacyDlpV2KAnonymityHistogramBucket.fromJson(value))
+                  GooglePrivacyDlpV2KAnonymityHistogramBucket.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -11663,14 +11979,16 @@
   GooglePrivacyDlpV2KMapEstimationConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auxiliaryTables')) {
       auxiliaryTables = (_json['auxiliaryTables'] as core.List)
-          .map<GooglePrivacyDlpV2AuxiliaryTable>(
-              (value) => GooglePrivacyDlpV2AuxiliaryTable.fromJson(value))
+          .map<GooglePrivacyDlpV2AuxiliaryTable>((value) =>
+              GooglePrivacyDlpV2AuxiliaryTable.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('quasiIds')) {
       quasiIds = (_json['quasiIds'] as core.List)
-          .map<GooglePrivacyDlpV2TaggedField>(
-              (value) => GooglePrivacyDlpV2TaggedField.fromJson(value))
+          .map<GooglePrivacyDlpV2TaggedField>((value) =>
+              GooglePrivacyDlpV2TaggedField.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('regionCode')) {
@@ -11729,7 +12047,8 @@
     if (_json.containsKey('bucketValues')) {
       bucketValues = (_json['bucketValues'] as core.List)
           .map<GooglePrivacyDlpV2KMapEstimationQuasiIdValues>((value) =>
-              GooglePrivacyDlpV2KMapEstimationQuasiIdValues.fromJson(value))
+              GooglePrivacyDlpV2KMapEstimationQuasiIdValues.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxAnonymity')) {
@@ -11778,8 +12097,9 @@
     }
     if (_json.containsKey('quasiIdsValues')) {
       quasiIdsValues = (_json['quasiIdsValues'] as core.List)
-          .map<GooglePrivacyDlpV2Value>(
-              (value) => GooglePrivacyDlpV2Value.fromJson(value))
+          .map<GooglePrivacyDlpV2Value>((value) =>
+              GooglePrivacyDlpV2Value.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11815,7 +12135,8 @@
     if (_json.containsKey('kMapEstimationHistogram')) {
       kMapEstimationHistogram = (_json['kMapEstimationHistogram'] as core.List)
           .map<GooglePrivacyDlpV2KMapEstimationHistogramBucket>((value) =>
-              GooglePrivacyDlpV2KMapEstimationHistogramBucket.fromJson(value))
+              GooglePrivacyDlpV2KMapEstimationHistogramBucket.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11852,13 +12173,14 @@
 
   GooglePrivacyDlpV2Key.fromJson(core.Map _json) {
     if (_json.containsKey('partitionId')) {
-      partitionId =
-          GooglePrivacyDlpV2PartitionId.fromJson(_json['partitionId']);
+      partitionId = GooglePrivacyDlpV2PartitionId.fromJson(
+          _json['partitionId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('path')) {
       path = (_json['path'] as core.List)
-          .map<GooglePrivacyDlpV2PathElement>(
-              (value) => GooglePrivacyDlpV2PathElement.fromJson(value))
+          .map<GooglePrivacyDlpV2PathElement>((value) =>
+              GooglePrivacyDlpV2PathElement.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11953,13 +12275,14 @@
   GooglePrivacyDlpV2LDiversityConfig.fromJson(core.Map _json) {
     if (_json.containsKey('quasiIds')) {
       quasiIds = (_json['quasiIds'] as core.List)
-          .map<GooglePrivacyDlpV2FieldId>(
-              (value) => GooglePrivacyDlpV2FieldId.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldId>((value) =>
+              GooglePrivacyDlpV2FieldId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sensitiveAttribute')) {
-      sensitiveAttribute =
-          GooglePrivacyDlpV2FieldId.fromJson(_json['sensitiveAttribute']);
+      sensitiveAttribute = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['sensitiveAttribute'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12002,14 +12325,16 @@
     }
     if (_json.containsKey('quasiIdsValues')) {
       quasiIdsValues = (_json['quasiIdsValues'] as core.List)
-          .map<GooglePrivacyDlpV2Value>(
-              (value) => GooglePrivacyDlpV2Value.fromJson(value))
+          .map<GooglePrivacyDlpV2Value>((value) =>
+              GooglePrivacyDlpV2Value.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('topSensitiveValues')) {
       topSensitiveValues = (_json['topSensitiveValues'] as core.List)
-          .map<GooglePrivacyDlpV2ValueFrequency>(
-              (value) => GooglePrivacyDlpV2ValueFrequency.fromJson(value))
+          .map<GooglePrivacyDlpV2ValueFrequency>((value) =>
+              GooglePrivacyDlpV2ValueFrequency.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12066,7 +12391,8 @@
     if (_json.containsKey('bucketValues')) {
       bucketValues = (_json['bucketValues'] as core.List)
           .map<GooglePrivacyDlpV2LDiversityEquivalenceClass>((value) =>
-              GooglePrivacyDlpV2LDiversityEquivalenceClass.fromJson(value))
+              GooglePrivacyDlpV2LDiversityEquivalenceClass.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sensitiveValueFrequencyLowerBound')) {
@@ -12116,7 +12442,8 @@
       sensitiveValueFrequencyHistogramBuckets =
           (_json['sensitiveValueFrequencyHistogramBuckets'] as core.List)
               .map<GooglePrivacyDlpV2LDiversityHistogramBucket>((value) =>
-                  GooglePrivacyDlpV2LDiversityHistogramBucket.fromJson(value))
+                  GooglePrivacyDlpV2LDiversityHistogramBucket.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -12156,16 +12483,16 @@
 
   GooglePrivacyDlpV2LargeCustomDictionaryConfig.fromJson(core.Map _json) {
     if (_json.containsKey('bigQueryField')) {
-      bigQueryField =
-          GooglePrivacyDlpV2BigQueryField.fromJson(_json['bigQueryField']);
+      bigQueryField = GooglePrivacyDlpV2BigQueryField.fromJson(
+          _json['bigQueryField'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cloudStorageFileSet')) {
       cloudStorageFileSet = GooglePrivacyDlpV2CloudStorageFileSet.fromJson(
-          _json['cloudStorageFileSet']);
+          _json['cloudStorageFileSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputPath')) {
-      outputPath =
-          GooglePrivacyDlpV2CloudStoragePath.fromJson(_json['outputPath']);
+      outputPath = GooglePrivacyDlpV2CloudStoragePath.fromJson(
+          _json['outputPath'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12283,8 +12610,9 @@
   GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deidentifyTemplates')) {
       deidentifyTemplates = (_json['deidentifyTemplates'] as core.List)
-          .map<GooglePrivacyDlpV2DeidentifyTemplate>(
-              (value) => GooglePrivacyDlpV2DeidentifyTemplate.fromJson(value))
+          .map<GooglePrivacyDlpV2DeidentifyTemplate>((value) =>
+              GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -12318,8 +12646,9 @@
   GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<GooglePrivacyDlpV2DlpJob>(
-              (value) => GooglePrivacyDlpV2DlpJob.fromJson(value))
+          .map<GooglePrivacyDlpV2DlpJob>((value) =>
+              GooglePrivacyDlpV2DlpJob.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -12349,8 +12678,9 @@
   GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('infoTypes')) {
       infoTypes = (_json['infoTypes'] as core.List)
-          .map<GooglePrivacyDlpV2InfoTypeDescription>(
-              (value) => GooglePrivacyDlpV2InfoTypeDescription.fromJson(value))
+          .map<GooglePrivacyDlpV2InfoTypeDescription>((value) =>
+              GooglePrivacyDlpV2InfoTypeDescription.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12378,8 +12708,9 @@
   GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('inspectTemplates')) {
       inspectTemplates = (_json['inspectTemplates'] as core.List)
-          .map<GooglePrivacyDlpV2InspectTemplate>(
-              (value) => GooglePrivacyDlpV2InspectTemplate.fromJson(value))
+          .map<GooglePrivacyDlpV2InspectTemplate>((value) =>
+              GooglePrivacyDlpV2InspectTemplate.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -12414,8 +12745,9 @@
   GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobTriggers')) {
       jobTriggers = (_json['jobTriggers'] as core.List)
-          .map<GooglePrivacyDlpV2JobTrigger>(
-              (value) => GooglePrivacyDlpV2JobTrigger.fromJson(value))
+          .map<GooglePrivacyDlpV2JobTrigger>((value) =>
+              GooglePrivacyDlpV2JobTrigger.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -12453,8 +12785,9 @@
     }
     if (_json.containsKey('storedInfoTypes')) {
       storedInfoTypes = (_json['storedInfoTypes'] as core.List)
-          .map<GooglePrivacyDlpV2StoredInfoType>(
-              (value) => GooglePrivacyDlpV2StoredInfoType.fromJson(value))
+          .map<GooglePrivacyDlpV2StoredInfoType>((value) =>
+              GooglePrivacyDlpV2StoredInfoType.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12495,19 +12828,22 @@
 
   GooglePrivacyDlpV2Location.fromJson(core.Map _json) {
     if (_json.containsKey('byteRange')) {
-      byteRange = GooglePrivacyDlpV2Range.fromJson(_json['byteRange']);
+      byteRange = GooglePrivacyDlpV2Range.fromJson(
+          _json['byteRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('codepointRange')) {
-      codepointRange =
-          GooglePrivacyDlpV2Range.fromJson(_json['codepointRange']);
+      codepointRange = GooglePrivacyDlpV2Range.fromJson(
+          _json['codepointRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('container')) {
-      container = GooglePrivacyDlpV2Container.fromJson(_json['container']);
+      container = GooglePrivacyDlpV2Container.fromJson(
+          _json['container'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentLocations')) {
       contentLocations = (_json['contentLocations'] as core.List)
-          .map<GooglePrivacyDlpV2ContentLocation>(
-              (value) => GooglePrivacyDlpV2ContentLocation.fromJson(value))
+          .map<GooglePrivacyDlpV2ContentLocation>((value) =>
+              GooglePrivacyDlpV2ContentLocation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12562,7 +12898,7 @@
   GooglePrivacyDlpV2MetadataLocation.fromJson(core.Map _json) {
     if (_json.containsKey('storageLabel')) {
       storageLabel = GooglePrivacyDlpV2StorageMetadataLabel.fromJson(
-          _json['storageLabel']);
+          _json['storageLabel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -12592,7 +12928,8 @@
 
   GooglePrivacyDlpV2NumericalStatsConfig.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12621,15 +12958,18 @@
 
   GooglePrivacyDlpV2NumericalStatsResult.fromJson(core.Map _json) {
     if (_json.containsKey('maxValue')) {
-      maxValue = GooglePrivacyDlpV2Value.fromJson(_json['maxValue']);
+      maxValue = GooglePrivacyDlpV2Value.fromJson(
+          _json['maxValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minValue')) {
-      minValue = GooglePrivacyDlpV2Value.fromJson(_json['minValue']);
+      minValue = GooglePrivacyDlpV2Value.fromJson(
+          _json['minValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('quantileValues')) {
       quantileValues = (_json['quantileValues'] as core.List)
-          .map<GooglePrivacyDlpV2Value>(
-              (value) => GooglePrivacyDlpV2Value.fromJson(value))
+          .map<GooglePrivacyDlpV2Value>((value) =>
+              GooglePrivacyDlpV2Value.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12693,7 +13033,8 @@
       outputSchema = _json['outputSchema'] as core.String;
     }
     if (_json.containsKey('table')) {
-      table = GooglePrivacyDlpV2BigQueryTable.fromJson(_json['table']);
+      table = GooglePrivacyDlpV2BigQueryTable.fromJson(
+          _json['table'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12828,52 +13169,56 @@
 
   GooglePrivacyDlpV2PrimitiveTransformation.fromJson(core.Map _json) {
     if (_json.containsKey('bucketingConfig')) {
-      bucketingConfig =
-          GooglePrivacyDlpV2BucketingConfig.fromJson(_json['bucketingConfig']);
+      bucketingConfig = GooglePrivacyDlpV2BucketingConfig.fromJson(
+          _json['bucketingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('characterMaskConfig')) {
       characterMaskConfig = GooglePrivacyDlpV2CharacterMaskConfig.fromJson(
-          _json['characterMaskConfig']);
+          _json['characterMaskConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cryptoDeterministicConfig')) {
       cryptoDeterministicConfig =
           GooglePrivacyDlpV2CryptoDeterministicConfig.fromJson(
-              _json['cryptoDeterministicConfig']);
+              _json['cryptoDeterministicConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cryptoHashConfig')) {
       cryptoHashConfig = GooglePrivacyDlpV2CryptoHashConfig.fromJson(
-          _json['cryptoHashConfig']);
+          _json['cryptoHashConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cryptoReplaceFfxFpeConfig')) {
       cryptoReplaceFfxFpeConfig =
           GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig.fromJson(
-              _json['cryptoReplaceFfxFpeConfig']);
+              _json['cryptoReplaceFfxFpeConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dateShiftConfig')) {
-      dateShiftConfig =
-          GooglePrivacyDlpV2DateShiftConfig.fromJson(_json['dateShiftConfig']);
+      dateShiftConfig = GooglePrivacyDlpV2DateShiftConfig.fromJson(
+          _json['dateShiftConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fixedSizeBucketingConfig')) {
       fixedSizeBucketingConfig =
           GooglePrivacyDlpV2FixedSizeBucketingConfig.fromJson(
-              _json['fixedSizeBucketingConfig']);
+              _json['fixedSizeBucketingConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('redactConfig')) {
-      redactConfig =
-          GooglePrivacyDlpV2RedactConfig.fromJson(_json['redactConfig']);
+      redactConfig = GooglePrivacyDlpV2RedactConfig.fromJson(
+          _json['redactConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceConfig')) {
-      replaceConfig =
-          GooglePrivacyDlpV2ReplaceValueConfig.fromJson(_json['replaceConfig']);
+      replaceConfig = GooglePrivacyDlpV2ReplaceValueConfig.fromJson(
+          _json['replaceConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceWithInfoTypeConfig')) {
       replaceWithInfoTypeConfig =
           GooglePrivacyDlpV2ReplaceWithInfoTypeConfig.fromJson(
-              _json['replaceWithInfoTypeConfig']);
+              _json['replaceWithInfoTypeConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timePartConfig')) {
-      timePartConfig =
-          GooglePrivacyDlpV2TimePartConfig.fromJson(_json['timePartConfig']);
+      timePartConfig = GooglePrivacyDlpV2TimePartConfig.fromJson(
+          _json['timePartConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12942,28 +13287,30 @@
     if (_json.containsKey('categoricalStatsConfig')) {
       categoricalStatsConfig =
           GooglePrivacyDlpV2CategoricalStatsConfig.fromJson(
-              _json['categoricalStatsConfig']);
+              _json['categoricalStatsConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deltaPresenceEstimationConfig')) {
       deltaPresenceEstimationConfig =
           GooglePrivacyDlpV2DeltaPresenceEstimationConfig.fromJson(
-              _json['deltaPresenceEstimationConfig']);
+              _json['deltaPresenceEstimationConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kAnonymityConfig')) {
       kAnonymityConfig = GooglePrivacyDlpV2KAnonymityConfig.fromJson(
-          _json['kAnonymityConfig']);
+          _json['kAnonymityConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kMapEstimationConfig')) {
       kMapEstimationConfig = GooglePrivacyDlpV2KMapEstimationConfig.fromJson(
-          _json['kMapEstimationConfig']);
+          _json['kMapEstimationConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lDiversityConfig')) {
       lDiversityConfig = GooglePrivacyDlpV2LDiversityConfig.fromJson(
-          _json['lDiversityConfig']);
+          _json['lDiversityConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('numericalStatsConfig')) {
       numericalStatsConfig = GooglePrivacyDlpV2NumericalStatsConfig.fromJson(
-          _json['numericalStatsConfig']);
+          _json['numericalStatsConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13140,13 +13487,16 @@
       customTag = _json['customTag'] as core.String;
     }
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inferred')) {
-      inferred = GoogleProtobufEmpty.fromJson(_json['inferred']);
+      inferred = GoogleProtobufEmpty.fromJson(
+          _json['inferred'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13184,7 +13534,8 @@
       customTag = _json['customTag'] as core.String;
     }
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13218,7 +13569,8 @@
       customTag = _json['customTag'] as core.String;
     }
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13243,7 +13595,8 @@
 
   GooglePrivacyDlpV2QuoteInfo.fromJson(core.Map _json) {
     if (_json.containsKey('dateTime')) {
-      dateTime = GooglePrivacyDlpV2DateTime.fromJson(_json['dateTime']);
+      dateTime = GooglePrivacyDlpV2DateTime.fromJson(
+          _json['dateTime'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13297,8 +13650,8 @@
 
   GooglePrivacyDlpV2RecordCondition.fromJson(core.Map _json) {
     if (_json.containsKey('expressions')) {
-      expressions =
-          GooglePrivacyDlpV2Expressions.fromJson(_json['expressions']);
+      expressions = GooglePrivacyDlpV2Expressions.fromJson(
+          _json['expressions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13324,12 +13677,12 @@
 
   GooglePrivacyDlpV2RecordKey.fromJson(core.Map _json) {
     if (_json.containsKey('bigQueryKey')) {
-      bigQueryKey =
-          GooglePrivacyDlpV2BigQueryKey.fromJson(_json['bigQueryKey']);
+      bigQueryKey = GooglePrivacyDlpV2BigQueryKey.fromJson(
+          _json['bigQueryKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('datastoreKey')) {
-      datastoreKey =
-          GooglePrivacyDlpV2DatastoreKey.fromJson(_json['datastoreKey']);
+      datastoreKey = GooglePrivacyDlpV2DatastoreKey.fromJson(
+          _json['datastoreKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('idValues')) {
       idValues = (_json['idValues'] as core.List)
@@ -13368,14 +13721,16 @@
 
   GooglePrivacyDlpV2RecordLocation.fromJson(core.Map _json) {
     if (_json.containsKey('fieldId')) {
-      fieldId = GooglePrivacyDlpV2FieldId.fromJson(_json['fieldId']);
+      fieldId = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['fieldId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recordKey')) {
-      recordKey = GooglePrivacyDlpV2RecordKey.fromJson(_json['recordKey']);
+      recordKey = GooglePrivacyDlpV2RecordKey.fromJson(
+          _json['recordKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableLocation')) {
-      tableLocation =
-          GooglePrivacyDlpV2TableLocation.fromJson(_json['tableLocation']);
+      tableLocation = GooglePrivacyDlpV2TableLocation.fromJson(
+          _json['tableLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13405,8 +13760,8 @@
 
   GooglePrivacyDlpV2RecordSuppression.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition =
-          GooglePrivacyDlpV2RecordCondition.fromJson(_json['condition']);
+      condition = GooglePrivacyDlpV2RecordCondition.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13434,14 +13789,16 @@
   GooglePrivacyDlpV2RecordTransformations.fromJson(core.Map _json) {
     if (_json.containsKey('fieldTransformations')) {
       fieldTransformations = (_json['fieldTransformations'] as core.List)
-          .map<GooglePrivacyDlpV2FieldTransformation>(
-              (value) => GooglePrivacyDlpV2FieldTransformation.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldTransformation>((value) =>
+              GooglePrivacyDlpV2FieldTransformation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('recordSuppressions')) {
       recordSuppressions = (_json['recordSuppressions'] as core.List)
-          .map<GooglePrivacyDlpV2RecordSuppression>(
-              (value) => GooglePrivacyDlpV2RecordSuppression.fromJson(value))
+          .map<GooglePrivacyDlpV2RecordSuppression>((value) =>
+              GooglePrivacyDlpV2RecordSuppression.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13499,20 +13856,22 @@
 
   GooglePrivacyDlpV2RedactImageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('byteItem')) {
-      byteItem = GooglePrivacyDlpV2ByteContentItem.fromJson(_json['byteItem']);
+      byteItem = GooglePrivacyDlpV2ByteContentItem.fromJson(
+          _json['byteItem'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageRedactionConfigs')) {
       imageRedactionConfigs = (_json['imageRedactionConfigs'] as core.List)
-          .map<GooglePrivacyDlpV2ImageRedactionConfig>(
-              (value) => GooglePrivacyDlpV2ImageRedactionConfig.fromJson(value))
+          .map<GooglePrivacyDlpV2ImageRedactionConfig>((value) =>
+              GooglePrivacyDlpV2ImageRedactionConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('includeFindings')) {
       includeFindings = _json['includeFindings'] as core.bool;
     }
     if (_json.containsKey('inspectConfig')) {
-      inspectConfig =
-          GooglePrivacyDlpV2InspectConfig.fromJson(_json['inspectConfig']);
+      inspectConfig = GooglePrivacyDlpV2InspectConfig.fromJson(
+          _json['inspectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
@@ -13568,8 +13927,8 @@
       extractedText = _json['extractedText'] as core.String;
     }
     if (_json.containsKey('inspectResult')) {
-      inspectResult =
-          GooglePrivacyDlpV2InspectResult.fromJson(_json['inspectResult']);
+      inspectResult = GooglePrivacyDlpV2InspectResult.fromJson(
+          _json['inspectResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('redactedImage')) {
       redactedImage = _json['redactedImage'] as core.String;
@@ -13668,21 +14027,22 @@
 
   GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('inspectConfig')) {
-      inspectConfig =
-          GooglePrivacyDlpV2InspectConfig.fromJson(_json['inspectConfig']);
+      inspectConfig = GooglePrivacyDlpV2InspectConfig.fromJson(
+          _json['inspectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inspectTemplateName')) {
       inspectTemplateName = _json['inspectTemplateName'] as core.String;
     }
     if (_json.containsKey('item')) {
-      item = GooglePrivacyDlpV2ContentItem.fromJson(_json['item']);
+      item = GooglePrivacyDlpV2ContentItem.fromJson(
+          _json['item'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationId')) {
       locationId = _json['locationId'] as core.String;
     }
     if (_json.containsKey('reidentifyConfig')) {
       reidentifyConfig = GooglePrivacyDlpV2DeidentifyConfig.fromJson(
-          _json['reidentifyConfig']);
+          _json['reidentifyConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reidentifyTemplateName')) {
       reidentifyTemplateName = _json['reidentifyTemplateName'] as core.String;
@@ -13725,11 +14085,12 @@
 
   GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(core.Map _json) {
     if (_json.containsKey('item')) {
-      item = GooglePrivacyDlpV2ContentItem.fromJson(_json['item']);
+      item = GooglePrivacyDlpV2ContentItem.fromJson(
+          _json['item'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('overview')) {
-      overview =
-          GooglePrivacyDlpV2TransformationOverview.fromJson(_json['overview']);
+      overview = GooglePrivacyDlpV2TransformationOverview.fromJson(
+          _json['overview'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13754,7 +14115,8 @@
 
   GooglePrivacyDlpV2ReplaceValueConfig.fromJson(core.Map _json) {
     if (_json.containsKey('newValue')) {
-      newValue = GooglePrivacyDlpV2Value.fromJson(_json['newValue']);
+      newValue = GooglePrivacyDlpV2Value.fromJson(
+          _json['newValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13794,12 +14156,13 @@
 
   GooglePrivacyDlpV2RequestedOptions.fromJson(core.Map _json) {
     if (_json.containsKey('jobConfig')) {
-      jobConfig =
-          GooglePrivacyDlpV2InspectJobConfig.fromJson(_json['jobConfig']);
+      jobConfig = GooglePrivacyDlpV2InspectJobConfig.fromJson(
+          _json['jobConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('snapshotInspectTemplate')) {
       snapshotInspectTemplate = GooglePrivacyDlpV2InspectTemplate.fromJson(
-          _json['snapshotInspectTemplate']);
+          _json['snapshotInspectTemplate']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13824,8 +14187,8 @@
 
   GooglePrivacyDlpV2RequestedRiskAnalysisOptions.fromJson(core.Map _json) {
     if (_json.containsKey('jobConfig')) {
-      jobConfig =
-          GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(_json['jobConfig']);
+      jobConfig = GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(
+          _json['jobConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13861,12 +14224,13 @@
   GooglePrivacyDlpV2Result.fromJson(core.Map _json) {
     if (_json.containsKey('hybridStats')) {
       hybridStats = GooglePrivacyDlpV2HybridInspectStatistics.fromJson(
-          _json['hybridStats']);
+          _json['hybridStats'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('infoTypeStats')) {
       infoTypeStats = (_json['infoTypeStats'] as core.List)
-          .map<GooglePrivacyDlpV2InfoTypeStats>(
-              (value) => GooglePrivacyDlpV2InfoTypeStats.fromJson(value))
+          .map<GooglePrivacyDlpV2InfoTypeStats>((value) =>
+              GooglePrivacyDlpV2InfoTypeStats.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('processedBytes')) {
@@ -13914,17 +14278,18 @@
   GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(core.Map _json) {
     if (_json.containsKey('actions')) {
       actions = (_json['actions'] as core.List)
-          .map<GooglePrivacyDlpV2Action>(
-              (value) => GooglePrivacyDlpV2Action.fromJson(value))
+          .map<GooglePrivacyDlpV2Action>((value) =>
+              GooglePrivacyDlpV2Action.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('privacyMetric')) {
-      privacyMetric =
-          GooglePrivacyDlpV2PrivacyMetric.fromJson(_json['privacyMetric']);
+      privacyMetric = GooglePrivacyDlpV2PrivacyMetric.fromJson(
+          _json['privacyMetric'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceTable')) {
-      sourceTable =
-          GooglePrivacyDlpV2BigQueryTable.fromJson(_json['sourceTable']);
+      sourceTable = GooglePrivacyDlpV2BigQueryTable.fromJson(
+          _json['sourceTable'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13953,8 +14318,9 @@
   GooglePrivacyDlpV2Row.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<GooglePrivacyDlpV2Value>(
-              (value) => GooglePrivacyDlpV2Value.fromJson(value))
+          .map<GooglePrivacyDlpV2Value>((value) =>
+              GooglePrivacyDlpV2Value.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13979,8 +14345,8 @@
 
   GooglePrivacyDlpV2SaveFindings.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
-      outputConfig =
-          GooglePrivacyDlpV2OutputStorageConfig.fromJson(_json['outputConfig']);
+      outputConfig = GooglePrivacyDlpV2OutputStorageConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14042,16 +14408,18 @@
   GooglePrivacyDlpV2StatisticalTable.fromJson(core.Map _json) {
     if (_json.containsKey('quasiIds')) {
       quasiIds = (_json['quasiIds'] as core.List)
-          .map<GooglePrivacyDlpV2QuasiIdentifierField>(
-              (value) => GooglePrivacyDlpV2QuasiIdentifierField.fromJson(value))
+          .map<GooglePrivacyDlpV2QuasiIdentifierField>((value) =>
+              GooglePrivacyDlpV2QuasiIdentifierField.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('relativeFrequency')) {
-      relativeFrequency =
-          GooglePrivacyDlpV2FieldId.fromJson(_json['relativeFrequency']);
+      relativeFrequency = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['relativeFrequency'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('table')) {
-      table = GooglePrivacyDlpV2BigQueryTable.fromJson(_json['table']);
+      table = GooglePrivacyDlpV2BigQueryTable.fromJson(
+          _json['table'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14091,24 +14459,24 @@
 
   GooglePrivacyDlpV2StorageConfig.fromJson(core.Map _json) {
     if (_json.containsKey('bigQueryOptions')) {
-      bigQueryOptions =
-          GooglePrivacyDlpV2BigQueryOptions.fromJson(_json['bigQueryOptions']);
+      bigQueryOptions = GooglePrivacyDlpV2BigQueryOptions.fromJson(
+          _json['bigQueryOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cloudStorageOptions')) {
       cloudStorageOptions = GooglePrivacyDlpV2CloudStorageOptions.fromJson(
-          _json['cloudStorageOptions']);
+          _json['cloudStorageOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('datastoreOptions')) {
       datastoreOptions = GooglePrivacyDlpV2DatastoreOptions.fromJson(
-          _json['datastoreOptions']);
+          _json['datastoreOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hybridOptions')) {
-      hybridOptions =
-          GooglePrivacyDlpV2HybridOptions.fromJson(_json['hybridOptions']);
+      hybridOptions = GooglePrivacyDlpV2HybridOptions.fromJson(
+          _json['hybridOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timespanConfig')) {
-      timespanConfig =
-          GooglePrivacyDlpV2TimespanConfig.fromJson(_json['timespanConfig']);
+      timespanConfig = GooglePrivacyDlpV2TimespanConfig.fromJson(
+          _json['timespanConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14172,7 +14540,7 @@
   GooglePrivacyDlpV2StoredInfoType.fromJson(core.Map _json) {
     if (_json.containsKey('currentVersion')) {
       currentVersion = GooglePrivacyDlpV2StoredInfoTypeVersion.fromJson(
-          _json['currentVersion']);
+          _json['currentVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -14180,7 +14548,8 @@
     if (_json.containsKey('pendingVersions')) {
       pendingVersions = (_json['pendingVersions'] as core.List)
           .map<GooglePrivacyDlpV2StoredInfoTypeVersion>((value) =>
-              GooglePrivacyDlpV2StoredInfoTypeVersion.fromJson(value))
+              GooglePrivacyDlpV2StoredInfoTypeVersion.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14227,7 +14596,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('dictionary')) {
-      dictionary = GooglePrivacyDlpV2Dictionary.fromJson(_json['dictionary']);
+      dictionary = GooglePrivacyDlpV2Dictionary.fromJson(
+          _json['dictionary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -14235,10 +14605,12 @@
     if (_json.containsKey('largeCustomDictionary')) {
       largeCustomDictionary =
           GooglePrivacyDlpV2LargeCustomDictionaryConfig.fromJson(
-              _json['largeCustomDictionary']);
+              _json['largeCustomDictionary']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('regex')) {
-      regex = GooglePrivacyDlpV2Regex.fromJson(_json['regex']);
+      regex = GooglePrivacyDlpV2Regex.fromJson(
+          _json['regex'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14274,7 +14646,8 @@
     if (_json.containsKey('largeCustomDictionary')) {
       largeCustomDictionary =
           GooglePrivacyDlpV2LargeCustomDictionaryStats.fromJson(
-              _json['largeCustomDictionary']);
+              _json['largeCustomDictionary']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14330,22 +14703,25 @@
 
   GooglePrivacyDlpV2StoredInfoTypeVersion.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(_json['config']);
+      config = GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<GooglePrivacyDlpV2Error>(
-              (value) => GooglePrivacyDlpV2Error.fromJson(value))
+          .map<GooglePrivacyDlpV2Error>((value) =>
+              GooglePrivacyDlpV2Error.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('stats')) {
-      stats = GooglePrivacyDlpV2StoredInfoTypeStats.fromJson(_json['stats']);
+      stats = GooglePrivacyDlpV2StoredInfoTypeStats.fromJson(
+          _json['stats'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14485,14 +14861,15 @@
   GooglePrivacyDlpV2Table.fromJson(core.Map _json) {
     if (_json.containsKey('headers')) {
       headers = (_json['headers'] as core.List)
-          .map<GooglePrivacyDlpV2FieldId>(
-              (value) => GooglePrivacyDlpV2FieldId.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldId>((value) =>
+              GooglePrivacyDlpV2FieldId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<GooglePrivacyDlpV2Row>(
-              (value) => GooglePrivacyDlpV2Row.fromJson(value))
+          .map<GooglePrivacyDlpV2Row>((value) => GooglePrivacyDlpV2Row.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14549,8 +14926,9 @@
   GooglePrivacyDlpV2TableOptions.fromJson(core.Map _json) {
     if (_json.containsKey('identifyingFields')) {
       identifyingFields = (_json['identifyingFields'] as core.List)
-          .map<GooglePrivacyDlpV2FieldId>(
-              (value) => GooglePrivacyDlpV2FieldId.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldId>((value) =>
+              GooglePrivacyDlpV2FieldId.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14593,13 +14971,16 @@
       customTag = _json['customTag'] as core.String;
     }
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inferred')) {
-      inferred = GoogleProtobufEmpty.fromJson(_json['inferred']);
+      inferred = GoogleProtobufEmpty.fromJson(
+          _json['inferred'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14730,8 +15111,8 @@
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('timestampField')) {
-      timestampField =
-          GooglePrivacyDlpV2FieldId.fromJson(_json['timestampField']);
+      timestampField = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['timestampField'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14773,10 +15154,11 @@
   GooglePrivacyDlpV2TransformationErrorHandling.fromJson(core.Map _json) {
     if (_json.containsKey('leaveUntransformed')) {
       leaveUntransformed = GooglePrivacyDlpV2LeaveUntransformed.fromJson(
-          _json['leaveUntransformed']);
+          _json['leaveUntransformed'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('throwError')) {
-      throwError = GooglePrivacyDlpV2ThrowError.fromJson(_json['throwError']);
+      throwError = GooglePrivacyDlpV2ThrowError.fromJson(
+          _json['throwError'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14806,7 +15188,8 @@
     if (_json.containsKey('transformationSummaries')) {
       transformationSummaries = (_json['transformationSummaries'] as core.List)
           .map<GooglePrivacyDlpV2TransformationSummary>((value) =>
-              GooglePrivacyDlpV2TransformationSummary.fromJson(value))
+              GooglePrivacyDlpV2TransformationSummary.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('transformedBytes')) {
@@ -14857,30 +15240,34 @@
 
   GooglePrivacyDlpV2TransformationSummary.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = GooglePrivacyDlpV2FieldId.fromJson(_json['field']);
+      field = GooglePrivacyDlpV2FieldId.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fieldTransformations')) {
       fieldTransformations = (_json['fieldTransformations'] as core.List)
-          .map<GooglePrivacyDlpV2FieldTransformation>(
-              (value) => GooglePrivacyDlpV2FieldTransformation.fromJson(value))
+          .map<GooglePrivacyDlpV2FieldTransformation>((value) =>
+              GooglePrivacyDlpV2FieldTransformation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('infoType')) {
-      infoType = GooglePrivacyDlpV2InfoType.fromJson(_json['infoType']);
+      infoType = GooglePrivacyDlpV2InfoType.fromJson(
+          _json['infoType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recordSuppress')) {
-      recordSuppress =
-          GooglePrivacyDlpV2RecordSuppression.fromJson(_json['recordSuppress']);
+      recordSuppress = GooglePrivacyDlpV2RecordSuppression.fromJson(
+          _json['recordSuppress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<GooglePrivacyDlpV2SummaryResult>(
-              (value) => GooglePrivacyDlpV2SummaryResult.fromJson(value))
+          .map<GooglePrivacyDlpV2SummaryResult>((value) =>
+              GooglePrivacyDlpV2SummaryResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('transformation')) {
       transformation = GooglePrivacyDlpV2PrimitiveTransformation.fromJson(
-          _json['transformation']);
+          _json['transformation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transformedBytes')) {
       transformedBytes = _json['transformedBytes'] as core.String;
@@ -14958,10 +15345,12 @@
 
   GooglePrivacyDlpV2Trigger.fromJson(core.Map _json) {
     if (_json.containsKey('manual')) {
-      manual = GooglePrivacyDlpV2Manual.fromJson(_json['manual']);
+      manual = GooglePrivacyDlpV2Manual.fromJson(
+          _json['manual'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('schedule')) {
-      schedule = GooglePrivacyDlpV2Schedule.fromJson(_json['schedule']);
+      schedule = GooglePrivacyDlpV2Schedule.fromJson(
+          _json['schedule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15019,7 +15408,7 @@
   GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deidentifyTemplate')) {
       deidentifyTemplate = GooglePrivacyDlpV2DeidentifyTemplate.fromJson(
-          _json['deidentifyTemplate']);
+          _json['deidentifyTemplate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -15050,8 +15439,8 @@
 
   GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('inspectTemplate')) {
-      inspectTemplate =
-          GooglePrivacyDlpV2InspectTemplate.fromJson(_json['inspectTemplate']);
+      inspectTemplate = GooglePrivacyDlpV2InspectTemplate.fromJson(
+          _json['inspectTemplate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -15082,7 +15471,8 @@
 
   GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(core.Map _json) {
     if (_json.containsKey('jobTrigger')) {
-      jobTrigger = GooglePrivacyDlpV2JobTrigger.fromJson(_json['jobTrigger']);
+      jobTrigger = GooglePrivacyDlpV2JobTrigger.fromJson(
+          _json['jobTrigger'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -15115,7 +15505,8 @@
 
   GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(_json['config']);
+      config = GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -15180,7 +15571,8 @@
       booleanValue = _json['booleanValue'] as core.bool;
     }
     if (_json.containsKey('dateValue')) {
-      dateValue = GoogleTypeDate.fromJson(_json['dateValue']);
+      dateValue = GoogleTypeDate.fromJson(
+          _json['dateValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dayOfWeekValue')) {
       dayOfWeekValue = _json['dayOfWeekValue'] as core.String;
@@ -15195,7 +15587,8 @@
       stringValue = _json['stringValue'] as core.String;
     }
     if (_json.containsKey('timeValue')) {
-      timeValue = GoogleTypeTimeOfDay.fromJson(_json['timeValue']);
+      timeValue = GoogleTypeTimeOfDay.fromJson(
+          _json['timeValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampValue')) {
       timestampValue = _json['timestampValue'] as core.String;
@@ -15247,7 +15640,8 @@
       count = _json['count'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = GooglePrivacyDlpV2Value.fromJson(_json['value']);
+      value = GooglePrivacyDlpV2Value.fromJson(
+          _json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15339,7 +15733,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/dns/v1.dart b/generated/googleapis/lib/dns/v1.dart
index 3c25e2f..f6a816d 100644
--- a/generated/googleapis/lib/dns/v1.dart
+++ b/generated/googleapis/lib/dns/v1.dart
@@ -142,7 +142,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Change.fromJson(data));
+    return _response.then(
+      (data) => Change.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Fetch the representation of an existing Change.
@@ -217,7 +219,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Change.fromJson(data));
+    return _response.then(
+      (data) => Change.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enumerate Changes to a ResourceRecordSet collection.
@@ -304,7 +308,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChangesListResponse.fromJson(data));
+    return _response.then(
+      (data) => ChangesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -392,7 +399,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DnsKey.fromJson(data));
+    return _response.then(
+      (data) => DnsKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enumerate DnsKeys to a ResourceRecordSet collection.
@@ -473,7 +482,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DnsKeysListResponse.fromJson(data));
+    return _response.then(
+      (data) => DnsKeysListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -553,7 +565,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enumerate Operations for the given ManagedZone.
@@ -635,8 +649,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ManagedZoneOperationsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ManagedZoneOperationsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -706,7 +722,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedZone.fromJson(data));
+    return _response.then(
+      (data) =>
+          ManagedZone.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a previously created ManagedZone.
@@ -772,7 +791,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Fetch the representation of an existing ManagedZone.
@@ -838,7 +859,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedZone.fromJson(data));
+    return _response.then(
+      (data) =>
+          ManagedZone.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enumerate ManagedZones that have been created but not yet deleted.
@@ -908,7 +932,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedZonesListResponse.fromJson(data));
+    return _response.then(
+      (data) => ManagedZonesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Apply a partial update to an existing ManagedZone.
@@ -980,7 +1007,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an existing ManagedZone.
@@ -1052,7 +1081,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1122,7 +1153,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a previously created Policy. Will fail if the policy is still being
@@ -1189,7 +1222,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Fetch the representation of an existing Policy.
@@ -1255,7 +1290,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enumerate all Policies associated with a project.
@@ -1319,7 +1356,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PoliciesListResponse.fromJson(data));
+    return _response.then(
+      (data) => PoliciesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Apply a partial update to an existing Policy.
@@ -1391,7 +1431,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PoliciesPatchResponse.fromJson(data));
+    return _response.then(
+      (data) => PoliciesPatchResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update an existing Policy.
@@ -1463,7 +1506,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PoliciesUpdateResponse.fromJson(data));
+    return _response.then(
+      (data) => PoliciesUpdateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1525,7 +1571,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1619,8 +1667,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ResourceRecordSetsListResponse.fromJson(data));
+    return _response.then(
+      (data) => ResourceRecordSetsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1662,12 +1712,14 @@
   Change.fromJson(core.Map _json) {
     if (_json.containsKey('additions')) {
       additions = (_json['additions'] as core.List)
-          .map<ResourceRecordSet>((value) => ResourceRecordSet.fromJson(value))
+          .map<ResourceRecordSet>((value) => ResourceRecordSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deletions')) {
       deletions = (_json['deletions'] as core.List)
-          .map<ResourceRecordSet>((value) => ResourceRecordSet.fromJson(value))
+          .map<ResourceRecordSet>((value) => ResourceRecordSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -1740,11 +1792,13 @@
   ChangesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('changes')) {
       changes = (_json['changes'] as core.List)
-          .map<Change>((value) => Change.fromJson(value))
+          .map<Change>((value) =>
+              Change.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -1844,7 +1898,8 @@
     }
     if (_json.containsKey('digests')) {
       digests = (_json['digests'] as core.List)
-          .map<DnsKeyDigest>((value) => DnsKeyDigest.fromJson(value))
+          .map<DnsKeyDigest>((value) => DnsKeyDigest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -2030,11 +2085,13 @@
   DnsKeysListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dnsKeys')) {
       dnsKeys = (_json['dnsKeys'] as core.List)
-          .map<DnsKey>((value) => DnsKey.fromJson(value))
+          .map<DnsKey>((value) =>
+              DnsKey.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -2140,11 +2197,12 @@
       dnsName = _json['dnsName'] as core.String;
     }
     if (_json.containsKey('dnssecConfig')) {
-      dnssecConfig = ManagedZoneDnsSecConfig.fromJson(_json['dnssecConfig']);
+      dnssecConfig = ManagedZoneDnsSecConfig.fromJson(
+          _json['dnssecConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('forwardingConfig')) {
-      forwardingConfig =
-          ManagedZoneForwardingConfig.fromJson(_json['forwardingConfig']);
+      forwardingConfig = ManagedZoneForwardingConfig.fromJson(
+          _json['forwardingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -2154,7 +2212,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -2169,15 +2228,17 @@
           .toList();
     }
     if (_json.containsKey('peeringConfig')) {
-      peeringConfig = ManagedZonePeeringConfig.fromJson(_json['peeringConfig']);
+      peeringConfig = ManagedZonePeeringConfig.fromJson(
+          _json['peeringConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('privateVisibilityConfig')) {
       privateVisibilityConfig = ManagedZonePrivateVisibilityConfig.fromJson(
-          _json['privateVisibilityConfig']);
+          _json['privateVisibilityConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reverseLookupConfig')) {
-      reverseLookupConfig =
-          ManagedZoneReverseLookupConfig.fromJson(_json['reverseLookupConfig']);
+      reverseLookupConfig = ManagedZoneReverseLookupConfig.fromJson(
+          _json['reverseLookupConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visibility')) {
       visibility = _json['visibility'] as core.String;
@@ -2260,7 +2321,8 @@
   ManagedZoneDnsSecConfig.fromJson(core.Map _json) {
     if (_json.containsKey('defaultKeySpecs')) {
       defaultKeySpecs = (_json['defaultKeySpecs'] as core.List)
-          .map<DnsKeySpec>((value) => DnsKeySpec.fromJson(value))
+          .map<DnsKeySpec>((value) =>
+              DnsKeySpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2309,7 +2371,8 @@
     if (_json.containsKey('targetNameServers')) {
       targetNameServers = (_json['targetNameServers'] as core.List)
           .map<ManagedZoneForwardingConfigNameServerTarget>((value) =>
-              ManagedZoneForwardingConfigNameServerTarget.fromJson(value))
+              ManagedZoneForwardingConfigNameServerTarget.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2396,7 +2459,8 @@
 
   ManagedZoneOperationsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -2406,7 +2470,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2443,7 +2508,7 @@
     }
     if (_json.containsKey('targetNetwork')) {
       targetNetwork = ManagedZonePeeringConfigTargetNetwork.fromJson(
-          _json['targetNetwork']);
+          _json['targetNetwork'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2517,7 +2582,8 @@
     if (_json.containsKey('networks')) {
       networks = (_json['networks'] as core.List)
           .map<ManagedZonePrivateVisibilityConfigNetwork>((value) =>
-              ManagedZonePrivateVisibilityConfigNetwork.fromJson(value))
+              ManagedZonePrivateVisibilityConfigNetwork.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2609,14 +2675,16 @@
 
   ManagedZonesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('managedZones')) {
       managedZones = (_json['managedZones'] as core.List)
-          .map<ManagedZone>((value) => ManagedZone.fromJson(value))
+          .map<ManagedZone>((value) => ManagedZone.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2687,7 +2755,8 @@
 
   Operation.fromJson(core.Map _json) {
     if (_json.containsKey('dnsKeyContext')) {
-      dnsKeyContext = OperationDnsKeyContext.fromJson(_json['dnsKeyContext']);
+      dnsKeyContext = OperationDnsKeyContext.fromJson(
+          _json['dnsKeyContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -2708,7 +2777,8 @@
       user = _json['user'] as core.String;
     }
     if (_json.containsKey('zoneContext')) {
-      zoneContext = OperationManagedZoneContext.fromJson(_json['zoneContext']);
+      zoneContext = OperationManagedZoneContext.fromJson(
+          _json['zoneContext'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2753,10 +2823,12 @@
 
   OperationDnsKeyContext.fromJson(core.Map _json) {
     if (_json.containsKey('newValue')) {
-      newValue = DnsKey.fromJson(_json['newValue']);
+      newValue = DnsKey.fromJson(
+          _json['newValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oldValue')) {
-      oldValue = DnsKey.fromJson(_json['oldValue']);
+      oldValue = DnsKey.fromJson(
+          _json['oldValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2783,10 +2855,12 @@
 
   OperationManagedZoneContext.fromJson(core.Map _json) {
     if (_json.containsKey('newValue')) {
-      newValue = ManagedZone.fromJson(_json['newValue']);
+      newValue = ManagedZone.fromJson(
+          _json['newValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oldValue')) {
-      oldValue = ManagedZone.fromJson(_json['oldValue']);
+      oldValue = ManagedZone.fromJson(
+          _json['oldValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2826,7 +2900,8 @@
 
   PoliciesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -2836,7 +2911,8 @@
     }
     if (_json.containsKey('policies')) {
       policies = (_json['policies'] as core.List)
-          .map<Policy>((value) => Policy.fromJson(value))
+          .map<Policy>((value) =>
+              Policy.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2867,10 +2943,12 @@
 
   PoliciesPatchResponse.fromJson(core.Map _json) {
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2894,10 +2972,12 @@
 
   PoliciesUpdateResponse.fromJson(core.Map _json) {
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2950,7 +3030,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('alternativeNameServerConfig')) {
       alternativeNameServerConfig = PolicyAlternativeNameServerConfig.fromJson(
-          _json['alternativeNameServerConfig']);
+          _json['alternativeNameServerConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -2972,7 +3053,8 @@
     }
     if (_json.containsKey('networks')) {
       networks = (_json['networks'] as core.List)
-          .map<PolicyNetwork>((value) => PolicyNetwork.fromJson(value))
+          .map<PolicyNetwork>((value) => PolicyNetwork.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3027,7 +3109,8 @@
     if (_json.containsKey('targetNameServers')) {
       targetNameServers = (_json['targetNameServers'] as core.List)
           .map<PolicyAlternativeNameServerConfigTargetNameServer>((value) =>
-              PolicyAlternativeNameServerConfigTargetNameServer.fromJson(value))
+              PolicyAlternativeNameServerConfigTargetNameServer.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3151,7 +3234,8 @@
       number = _json['number'] as core.String;
     }
     if (_json.containsKey('quota')) {
-      quota = Quota.fromJson(_json['quota']);
+      quota =
+          Quota.fromJson(_json['quota'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3272,7 +3356,8 @@
     }
     if (_json.containsKey('whitelistedKeySpecs')) {
       whitelistedKeySpecs = (_json['whitelistedKeySpecs'] as core.List)
-          .map<DnsKeySpec>((value) => DnsKeySpec.fromJson(value))
+          .map<DnsKeySpec>((value) =>
+              DnsKeySpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3426,7 +3511,8 @@
 
   ResourceRecordSetsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('header')) {
-      header = ResponseHeader.fromJson(_json['header']);
+      header = ResponseHeader.fromJson(
+          _json['header'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -3436,7 +3522,8 @@
     }
     if (_json.containsKey('rrsets')) {
       rrsets = (_json['rrsets'] as core.List)
-          .map<ResourceRecordSet>((value) => ResourceRecordSet.fromJson(value))
+          .map<ResourceRecordSet>((value) => ResourceRecordSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/docs/v1.dart b/generated/googleapis/lib/docs/v1.dart
index 8294a00..7a286b4 100644
--- a/generated/googleapis/lib/docs/v1.dart
+++ b/generated/googleapis/lib/docs/v1.dart
@@ -132,7 +132,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchUpdateDocumentResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchUpdateDocumentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a blank document using the title given in the request. Other
@@ -182,7 +185,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Document.fromJson(data));
+    return _response.then(
+      (data) => Document.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest version of the specified document.
@@ -255,7 +260,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Document.fromJson(data));
+    return _response.then(
+      (data) => Document.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -301,11 +308,15 @@
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
       suggestedTextStyleChanges = commons.mapMap<core.Map, SuggestedTextStyle>(
-          _json['suggestedTextStyleChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedTextStyle.fromJson(item));
+          (_json['suggestedTextStyleChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -345,7 +356,8 @@
 
   Background.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = OptionalColor.fromJson(_json['color']);
+      color = OptionalColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -396,11 +408,13 @@
   BatchUpdateDocumentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('requests')) {
       requests = (_json['requests'] as core.List)
-          .map<Request>((value) => Request.fromJson(value))
+          .map<Request>((value) =>
+              Request.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('writeControl')) {
-      writeControl = WriteControl.fromJson(_json['writeControl']);
+      writeControl = WriteControl.fromJson(
+          _json['writeControl'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -436,11 +450,13 @@
     }
     if (_json.containsKey('replies')) {
       replies = (_json['replies'] as core.List)
-          .map<Response>((value) => Response.fromJson(value))
+          .map<Response>((value) =>
+              Response.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('writeControl')) {
-      writeControl = WriteControl.fromJson(_json['writeControl']);
+      writeControl = WriteControl.fromJson(
+          _json['writeControl'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -471,7 +487,8 @@
   Body.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
       content = (_json['content'] as core.List)
-          .map<StructuralElement>((value) => StructuralElement.fromJson(value))
+          .map<StructuralElement>((value) => StructuralElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -506,7 +523,8 @@
       nestingLevel = _json['nestingLevel'] as core.int;
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -549,8 +567,9 @@
       nestingLevelSuggested = _json['nestingLevelSuggested'] as core.bool;
     }
     if (_json.containsKey('textStyleSuggestionState')) {
-      textStyleSuggestionState =
-          TextStyleSuggestionState.fromJson(_json['textStyleSuggestionState']);
+      textStyleSuggestionState = TextStyleSuggestionState.fromJson(
+          _json['textStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -578,7 +597,8 @@
 
   Color.fromJson(core.Map _json) {
     if (_json.containsKey('rgbColor')) {
-      rgbColor = RgbColor.fromJson(_json['rgbColor']);
+      rgbColor = RgbColor.fromJson(
+          _json['rgbColor'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -627,11 +647,15 @@
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
       suggestedTextStyleChanges = commons.mapMap<core.Map, SuggestedTextStyle>(
-          _json['suggestedTextStyleChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedTextStyle.fromJson(item));
+          (_json['suggestedTextStyleChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -678,7 +702,8 @@
 
   CreateFooterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('sectionBreakLocation')) {
-      sectionBreakLocation = Location.fromJson(_json['sectionBreakLocation']);
+      sectionBreakLocation = Location.fromJson(
+          _json['sectionBreakLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -742,11 +767,12 @@
 
   CreateFootnoteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('endOfSegmentLocation')) {
-      endOfSegmentLocation =
-          EndOfSegmentLocation.fromJson(_json['endOfSegmentLocation']);
+      endOfSegmentLocation = EndOfSegmentLocation.fromJson(
+          _json['endOfSegmentLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
-      location = Location.fromJson(_json['location']);
+      location = Location.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -806,7 +832,8 @@
 
   CreateHeaderRequest.fromJson(core.Map _json) {
     if (_json.containsKey('sectionBreakLocation')) {
-      sectionBreakLocation = Location.fromJson(_json['sectionBreakLocation']);
+      sectionBreakLocation = Location.fromJson(
+          _json['sectionBreakLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -864,7 +891,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -965,7 +993,8 @@
       bulletPreset = _json['bulletPreset'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1134,7 +1163,8 @@
 
   DeleteContentRangeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1242,7 +1272,8 @@
 
   DeleteParagraphBulletsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1290,8 +1321,8 @@
 
   DeleteTableColumnRequest.fromJson(core.Map _json) {
     if (_json.containsKey('tableCellLocation')) {
-      tableCellLocation =
-          TableCellLocation.fromJson(_json['tableCellLocation']);
+      tableCellLocation = TableCellLocation.fromJson(
+          _json['tableCellLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1316,8 +1347,8 @@
 
   DeleteTableRowRequest.fromJson(core.Map _json) {
     if (_json.containsKey('tableCellLocation')) {
-      tableCellLocation =
-          TableCellLocation.fromJson(_json['tableCellLocation']);
+      tableCellLocation = TableCellLocation.fromJson(
+          _json['tableCellLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1448,51 +1479,68 @@
 
   Document.fromJson(core.Map _json) {
     if (_json.containsKey('body')) {
-      body = Body.fromJson(_json['body']);
+      body =
+          Body.fromJson(_json['body'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentId')) {
       documentId = _json['documentId'] as core.String;
     }
     if (_json.containsKey('documentStyle')) {
-      documentStyle = DocumentStyle.fromJson(_json['documentStyle']);
+      documentStyle = DocumentStyle.fromJson(
+          _json['documentStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('footers')) {
       footers = commons.mapMap<core.Map, Footer>(
-          _json['footers'].cast<core.String, core.Map>(),
-          (core.Map item) => Footer.fromJson(item));
+          (_json['footers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Footer.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('footnotes')) {
       footnotes = commons.mapMap<core.Map, Footnote>(
-          _json['footnotes'].cast<core.String, core.Map>(),
-          (core.Map item) => Footnote.fromJson(item));
+          (_json['footnotes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Footnote.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.Map, Header>(
-          _json['headers'].cast<core.String, core.Map>(),
-          (core.Map item) => Header.fromJson(item));
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Header.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('inlineObjects')) {
       inlineObjects = commons.mapMap<core.Map, InlineObject>(
-          _json['inlineObjects'].cast<core.String, core.Map>(),
-          (core.Map item) => InlineObject.fromJson(item));
+          (_json['inlineObjects'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => InlineObject.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('lists')) {
       lists = commons.mapMap<core.Map, List>(
-          _json['lists'].cast<core.String, core.Map>(),
-          (core.Map item) => List.fromJson(item));
+          (_json['lists'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              List.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('namedRanges')) {
       namedRanges = commons.mapMap<core.Map, NamedRanges>(
-          _json['namedRanges'].cast<core.String, core.Map>(),
-          (core.Map item) => NamedRanges.fromJson(item));
+          (_json['namedRanges'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NamedRanges.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('namedStyles')) {
-      namedStyles = NamedStyles.fromJson(_json['namedStyles']);
+      namedStyles = NamedStyles.fromJson(
+          _json['namedStyles'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positionedObjects')) {
       positionedObjects = commons.mapMap<core.Map, PositionedObject>(
-          _json['positionedObjects'].cast<core.String, core.Map>(),
-          (core.Map item) => PositionedObject.fromJson(item));
+          (_json['positionedObjects'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => PositionedObject.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('revisionId')) {
       revisionId = _json['revisionId'] as core.String;
@@ -1500,16 +1548,20 @@
     if (_json.containsKey('suggestedDocumentStyleChanges')) {
       suggestedDocumentStyleChanges =
           commons.mapMap<core.Map, SuggestedDocumentStyle>(
-              _json['suggestedDocumentStyleChanges']
+              (_json['suggestedDocumentStyleChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) => SuggestedDocumentStyle.fromJson(item));
+              (core.Map item) => SuggestedDocumentStyle.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('suggestedNamedStylesChanges')) {
       suggestedNamedStylesChanges =
           commons.mapMap<core.Map, SuggestedNamedStyles>(
-              _json['suggestedNamedStylesChanges']
+              (_json['suggestedNamedStylesChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) => SuggestedNamedStyles.fromJson(item));
+              (core.Map item) => SuggestedNamedStyles.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('suggestionsViewMode')) {
       suggestionsViewMode = _json['suggestionsViewMode'] as core.String;
@@ -1682,7 +1734,8 @@
 
   DocumentStyle.fromJson(core.Map _json) {
     if (_json.containsKey('background')) {
-      background = Background.fromJson(_json['background']);
+      background = Background.fromJson(
+          _json['background'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultFooterId')) {
       defaultFooterId = _json['defaultFooterId'] as core.String;
@@ -1703,28 +1756,35 @@
       firstPageHeaderId = _json['firstPageHeaderId'] as core.String;
     }
     if (_json.containsKey('marginBottom')) {
-      marginBottom = Dimension.fromJson(_json['marginBottom']);
+      marginBottom = Dimension.fromJson(
+          _json['marginBottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginFooter')) {
-      marginFooter = Dimension.fromJson(_json['marginFooter']);
+      marginFooter = Dimension.fromJson(
+          _json['marginFooter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginHeader')) {
-      marginHeader = Dimension.fromJson(_json['marginHeader']);
+      marginHeader = Dimension.fromJson(
+          _json['marginHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginLeft')) {
-      marginLeft = Dimension.fromJson(_json['marginLeft']);
+      marginLeft = Dimension.fromJson(
+          _json['marginLeft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginRight')) {
-      marginRight = Dimension.fromJson(_json['marginRight']);
+      marginRight = Dimension.fromJson(
+          _json['marginRight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginTop')) {
-      marginTop = Dimension.fromJson(_json['marginTop']);
+      marginTop = Dimension.fromJson(
+          _json['marginTop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageNumberStart')) {
       pageNumberStart = _json['pageNumberStart'] as core.int;
     }
     if (_json.containsKey('pageSize')) {
-      pageSize = Size.fromJson(_json['pageSize']);
+      pageSize = Size.fromJson(
+          _json['pageSize'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useCustomHeaderFooterMargins')) {
       useCustomHeaderFooterMargins =
@@ -1864,7 +1924,8 @@
   DocumentStyleSuggestionState.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundSuggestionState')) {
       backgroundSuggestionState = BackgroundSuggestionState.fromJson(
-          _json['backgroundSuggestionState']);
+          _json['backgroundSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('defaultFooterIdSuggested')) {
       defaultFooterIdSuggested = _json['defaultFooterIdSuggested'] as core.bool;
@@ -1910,8 +1971,9 @@
       pageNumberStartSuggested = _json['pageNumberStartSuggested'] as core.bool;
     }
     if (_json.containsKey('pageSizeSuggestionState')) {
-      pageSizeSuggestionState =
-          SizeSuggestionState.fromJson(_json['pageSizeSuggestionState']);
+      pageSizeSuggestionState = SizeSuggestionState.fromJson(
+          _json['pageSizeSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useCustomHeaderFooterMarginsSuggested')) {
       useCustomHeaderFooterMarginsSuggested =
@@ -2067,33 +2129,41 @@
     }
     if (_json.containsKey('embeddedDrawingProperties')) {
       embeddedDrawingProperties = EmbeddedDrawingProperties.fromJson(
-          _json['embeddedDrawingProperties']);
+          _json['embeddedDrawingProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('embeddedObjectBorder')) {
-      embeddedObjectBorder =
-          EmbeddedObjectBorder.fromJson(_json['embeddedObjectBorder']);
+      embeddedObjectBorder = EmbeddedObjectBorder.fromJson(
+          _json['embeddedObjectBorder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageProperties')) {
-      imageProperties = ImageProperties.fromJson(_json['imageProperties']);
+      imageProperties = ImageProperties.fromJson(
+          _json['imageProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linkedContentReference')) {
-      linkedContentReference =
-          LinkedContentReference.fromJson(_json['linkedContentReference']);
+      linkedContentReference = LinkedContentReference.fromJson(
+          _json['linkedContentReference']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginBottom')) {
-      marginBottom = Dimension.fromJson(_json['marginBottom']);
+      marginBottom = Dimension.fromJson(
+          _json['marginBottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginLeft')) {
-      marginLeft = Dimension.fromJson(_json['marginLeft']);
+      marginLeft = Dimension.fromJson(
+          _json['marginLeft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginRight')) {
-      marginRight = Dimension.fromJson(_json['marginRight']);
+      marginRight = Dimension.fromJson(
+          _json['marginRight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginTop')) {
-      marginTop = Dimension.fromJson(_json['marginTop']);
+      marginTop = Dimension.fromJson(
+          _json['marginTop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -2171,7 +2241,8 @@
 
   EmbeddedObjectBorder.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = OptionalColor.fromJson(_json['color']);
+      color = OptionalColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dashStyle')) {
       dashStyle = _json['dashStyle'] as core.String;
@@ -2180,7 +2251,8 @@
       propertyState = _json['propertyState'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = Dimension.fromJson(_json['width']);
+      width = Dimension.fromJson(
+          _json['width'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2305,21 +2377,25 @@
     if (_json.containsKey('embeddedDrawingPropertiesSuggestionState')) {
       embeddedDrawingPropertiesSuggestionState =
           EmbeddedDrawingPropertiesSuggestionState.fromJson(
-              _json['embeddedDrawingPropertiesSuggestionState']);
+              _json['embeddedDrawingPropertiesSuggestionState']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('embeddedObjectBorderSuggestionState')) {
       embeddedObjectBorderSuggestionState =
           EmbeddedObjectBorderSuggestionState.fromJson(
-              _json['embeddedObjectBorderSuggestionState']);
+              _json['embeddedObjectBorderSuggestionState']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imagePropertiesSuggestionState')) {
       imagePropertiesSuggestionState = ImagePropertiesSuggestionState.fromJson(
-          _json['imagePropertiesSuggestionState']);
+          _json['imagePropertiesSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linkedContentReferenceSuggestionState')) {
       linkedContentReferenceSuggestionState =
           LinkedContentReferenceSuggestionState.fromJson(
-              _json['linkedContentReferenceSuggestionState']);
+              _json['linkedContentReferenceSuggestionState']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginBottomSuggested')) {
       marginBottomSuggested = _json['marginBottomSuggested'] as core.bool;
@@ -2334,8 +2410,8 @@
       marginTopSuggested = _json['marginTopSuggested'] as core.bool;
     }
     if (_json.containsKey('sizeSuggestionState')) {
-      sizeSuggestionState =
-          SizeSuggestionState.fromJson(_json['sizeSuggestionState']);
+      sizeSuggestionState = SizeSuggestionState.fromJson(
+          _json['sizeSuggestionState'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('titleSuggested')) {
       titleSuggested = _json['titleSuggested'] as core.bool;
@@ -2461,7 +2537,8 @@
   Footer.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
       content = (_json['content'] as core.List)
-          .map<StructuralElement>((value) => StructuralElement.fromJson(value))
+          .map<StructuralElement>((value) => StructuralElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('footerId')) {
@@ -2495,7 +2572,8 @@
   Footnote.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
       content = (_json['content'] as core.List)
-          .map<StructuralElement>((value) => StructuralElement.fromJson(value))
+          .map<StructuralElement>((value) => StructuralElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('footnoteId')) {
@@ -2563,11 +2641,15 @@
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
       suggestedTextStyleChanges = commons.mapMap<core.Map, SuggestedTextStyle>(
-          _json['suggestedTextStyleChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedTextStyle.fromJson(item));
+          (_json['suggestedTextStyleChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2612,7 +2694,8 @@
   Header.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
       content = (_json['content'] as core.List)
-          .map<StructuralElement>((value) => StructuralElement.fromJson(value))
+          .map<StructuralElement>((value) => StructuralElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('headerId')) {
@@ -2668,11 +2751,15 @@
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
       suggestedTextStyleChanges = commons.mapMap<core.Map, SuggestedTextStyle>(
-          _json['suggestedTextStyleChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedTextStyle.fromJson(item));
+          (_json['suggestedTextStyleChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2743,7 +2830,8 @@
       contrast = (_json['contrast'] as core.num).toDouble();
     }
     if (_json.containsKey('cropProperties')) {
-      cropProperties = CropProperties.fromJson(_json['cropProperties']);
+      cropProperties = CropProperties.fromJson(
+          _json['cropProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceUri')) {
       sourceUri = _json['sourceUri'] as core.String;
@@ -2823,7 +2911,8 @@
     }
     if (_json.containsKey('cropPropertiesSuggestionState')) {
       cropPropertiesSuggestionState = CropPropertiesSuggestionState.fromJson(
-          _json['cropPropertiesSuggestionState']);
+          _json['cropPropertiesSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceUriSuggested')) {
       sourceUriSuggested = _json['sourceUriSuggested'] as core.bool;
@@ -2887,8 +2976,9 @@
 
   InlineObject.fromJson(core.Map _json) {
     if (_json.containsKey('inlineObjectProperties')) {
-      inlineObjectProperties =
-          InlineObjectProperties.fromJson(_json['inlineObjectProperties']);
+      inlineObjectProperties = InlineObjectProperties.fromJson(
+          _json['inlineObjectProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
@@ -2901,10 +2991,11 @@
     if (_json.containsKey('suggestedInlineObjectPropertiesChanges')) {
       suggestedInlineObjectPropertiesChanges =
           commons.mapMap<core.Map, SuggestedInlineObjectProperties>(
-              _json['suggestedInlineObjectPropertiesChanges']
+              (_json['suggestedInlineObjectPropertiesChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) =>
-                  SuggestedInlineObjectProperties.fromJson(item));
+              (core.Map item) => SuggestedInlineObjectProperties.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('suggestedInsertionId')) {
       suggestedInsertionId = _json['suggestedInsertionId'] as core.String;
@@ -2978,11 +3069,15 @@
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
       suggestedTextStyleChanges = commons.mapMap<core.Map, SuggestedTextStyle>(
-          _json['suggestedTextStyleChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedTextStyle.fromJson(item));
+          (_json['suggestedTextStyleChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3019,7 +3114,8 @@
 
   InlineObjectProperties.fromJson(core.Map _json) {
     if (_json.containsKey('embeddedObject')) {
-      embeddedObject = EmbeddedObject.fromJson(_json['embeddedObject']);
+      embeddedObject = EmbeddedObject.fromJson(
+          _json['embeddedObject'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3045,7 +3141,8 @@
   InlineObjectPropertiesSuggestionState.fromJson(core.Map _json) {
     if (_json.containsKey('embeddedObjectSuggestionState')) {
       embeddedObjectSuggestionState = EmbeddedObjectSuggestionState.fromJson(
-          _json['embeddedObjectSuggestionState']);
+          _json['embeddedObjectSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3094,14 +3191,16 @@
 
   InsertInlineImageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('endOfSegmentLocation')) {
-      endOfSegmentLocation =
-          EndOfSegmentLocation.fromJson(_json['endOfSegmentLocation']);
+      endOfSegmentLocation = EndOfSegmentLocation.fromJson(
+          _json['endOfSegmentLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
-      location = Location.fromJson(_json['location']);
+      location = Location.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectSize')) {
-      objectSize = Size.fromJson(_json['objectSize']);
+      objectSize = Size.fromJson(
+          _json['objectSize'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uri')) {
       uri = _json['uri'] as core.String;
@@ -3189,11 +3288,12 @@
 
   InsertPageBreakRequest.fromJson(core.Map _json) {
     if (_json.containsKey('endOfSegmentLocation')) {
-      endOfSegmentLocation =
-          EndOfSegmentLocation.fromJson(_json['endOfSegmentLocation']);
+      endOfSegmentLocation = EndOfSegmentLocation.fromJson(
+          _json['endOfSegmentLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
-      location = Location.fromJson(_json['location']);
+      location = Location.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3239,11 +3339,12 @@
 
   InsertSectionBreakRequest.fromJson(core.Map _json) {
     if (_json.containsKey('endOfSegmentLocation')) {
-      endOfSegmentLocation =
-          EndOfSegmentLocation.fromJson(_json['endOfSegmentLocation']);
+      endOfSegmentLocation = EndOfSegmentLocation.fromJson(
+          _json['endOfSegmentLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
-      location = Location.fromJson(_json['location']);
+      location = Location.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sectionType')) {
       sectionType = _json['sectionType'] as core.String;
@@ -3284,8 +3385,8 @@
       insertRight = _json['insertRight'] as core.bool;
     }
     if (_json.containsKey('tableCellLocation')) {
-      tableCellLocation =
-          TableCellLocation.fromJson(_json['tableCellLocation']);
+      tableCellLocation = TableCellLocation.fromJson(
+          _json['tableCellLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3330,11 +3431,12 @@
       columns = _json['columns'] as core.int;
     }
     if (_json.containsKey('endOfSegmentLocation')) {
-      endOfSegmentLocation =
-          EndOfSegmentLocation.fromJson(_json['endOfSegmentLocation']);
+      endOfSegmentLocation = EndOfSegmentLocation.fromJson(
+          _json['endOfSegmentLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
-      location = Location.fromJson(_json['location']);
+      location = Location.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = _json['rows'] as core.int;
@@ -3378,8 +3480,8 @@
       insertBelow = _json['insertBelow'] as core.bool;
     }
     if (_json.containsKey('tableCellLocation')) {
-      tableCellLocation =
-          TableCellLocation.fromJson(_json['tableCellLocation']);
+      tableCellLocation = TableCellLocation.fromJson(
+          _json['tableCellLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3424,11 +3526,12 @@
 
   InsertTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('endOfSegmentLocation')) {
-      endOfSegmentLocation =
-          EndOfSegmentLocation.fromJson(_json['endOfSegmentLocation']);
+      endOfSegmentLocation = EndOfSegmentLocation.fromJson(
+          _json['endOfSegmentLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
-      location = Location.fromJson(_json['location']);
+      location = Location.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -3499,8 +3602,8 @@
 
   LinkedContentReference.fromJson(core.Map _json) {
     if (_json.containsKey('sheetsChartReference')) {
-      sheetsChartReference =
-          SheetsChartReference.fromJson(_json['sheetsChartReference']);
+      sheetsChartReference = SheetsChartReference.fromJson(
+          _json['sheetsChartReference'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3527,7 +3630,8 @@
     if (_json.containsKey('sheetsChartReferenceSuggestionState')) {
       sheetsChartReferenceSuggestionState =
           SheetsChartReferenceSuggestionState.fromJson(
-              _json['sheetsChartReferenceSuggestionState']);
+              _json['sheetsChartReferenceSuggestionState']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3563,7 +3667,8 @@
 
   List.fromJson(core.Map _json) {
     if (_json.containsKey('listProperties')) {
-      listProperties = ListProperties.fromJson(_json['listProperties']);
+      listProperties = ListProperties.fromJson(
+          _json['listProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestedDeletionIds')) {
       suggestedDeletionIds = (_json['suggestedDeletionIds'] as core.List)
@@ -3576,9 +3681,11 @@
     if (_json.containsKey('suggestedListPropertiesChanges')) {
       suggestedListPropertiesChanges =
           commons.mapMap<core.Map, SuggestedListProperties>(
-              _json['suggestedListPropertiesChanges']
+              (_json['suggestedListPropertiesChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) => SuggestedListProperties.fromJson(item));
+              (core.Map item) => SuggestedListProperties.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -3618,7 +3725,8 @@
   ListProperties.fromJson(core.Map _json) {
     if (_json.containsKey('nestingLevels')) {
       nestingLevels = (_json['nestingLevels'] as core.List)
-          .map<NestingLevel>((value) => NestingLevel.fromJson(value))
+          .map<NestingLevel>((value) => NestingLevel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3649,8 +3757,9 @@
     if (_json.containsKey('nestingLevelsSuggestionStates')) {
       nestingLevelsSuggestionStates =
           (_json['nestingLevelsSuggestionStates'] as core.List)
-              .map<NestingLevelSuggestionState>(
-                  (value) => NestingLevelSuggestionState.fromJson(value))
+              .map<NestingLevelSuggestionState>((value) =>
+                  NestingLevelSuggestionState.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -3713,7 +3822,8 @@
 
   MergeTableCellsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('tableRange')) {
-      tableRange = TableRange.fromJson(_json['tableRange']);
+      tableRange = TableRange.fromJson(
+          _json['tableRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3756,7 +3866,8 @@
     }
     if (_json.containsKey('ranges')) {
       ranges = (_json['ranges'] as core.List)
-          .map<Range>((value) => Range.fromJson(value))
+          .map<Range>((value) =>
+              Range.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3792,7 +3903,8 @@
     }
     if (_json.containsKey('namedRanges')) {
       namedRanges = (_json['namedRanges'] as core.List)
-          .map<NamedRange>((value) => NamedRange.fromJson(value))
+          .map<NamedRange>((value) =>
+              NamedRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3841,10 +3953,12 @@
       namedStyleType = _json['namedStyleType'] as core.String;
     }
     if (_json.containsKey('paragraphStyle')) {
-      paragraphStyle = ParagraphStyle.fromJson(_json['paragraphStyle']);
+      paragraphStyle = ParagraphStyle.fromJson(
+          _json['paragraphStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3897,11 +4011,13 @@
     }
     if (_json.containsKey('paragraphStyleSuggestionState')) {
       paragraphStyleSuggestionState = ParagraphStyleSuggestionState.fromJson(
-          _json['paragraphStyleSuggestionState']);
+          _json['paragraphStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textStyleSuggestionState')) {
-      textStyleSuggestionState =
-          TextStyleSuggestionState.fromJson(_json['textStyleSuggestionState']);
+      textStyleSuggestionState = TextStyleSuggestionState.fromJson(
+          _json['textStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3933,7 +4049,8 @@
   NamedStyles.fromJson(core.Map _json) {
     if (_json.containsKey('styles')) {
       styles = (_json['styles'] as core.List)
-          .map<NamedStyle>((value) => NamedStyle.fromJson(value))
+          .map<NamedStyle>((value) =>
+              NamedStyle.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3960,8 +4077,9 @@
   NamedStylesSuggestionState.fromJson(core.Map _json) {
     if (_json.containsKey('stylesSuggestionStates')) {
       stylesSuggestionStates = (_json['stylesSuggestionStates'] as core.List)
-          .map<NamedStyleSuggestionState>(
-              (value) => NamedStyleSuggestionState.fromJson(value))
+          .map<NamedStyleSuggestionState>((value) =>
+              NamedStyleSuggestionState.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4074,16 +4192,19 @@
       glyphType = _json['glyphType'] as core.String;
     }
     if (_json.containsKey('indentFirstLine')) {
-      indentFirstLine = Dimension.fromJson(_json['indentFirstLine']);
+      indentFirstLine = Dimension.fromJson(
+          _json['indentFirstLine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indentStart')) {
-      indentStart = Dimension.fromJson(_json['indentStart']);
+      indentStart = Dimension.fromJson(
+          _json['indentStart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startNumber')) {
       startNumber = _json['startNumber'] as core.int;
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4171,8 +4292,9 @@
       startNumberSuggested = _json['startNumberSuggested'] as core.bool;
     }
     if (_json.containsKey('textStyleSuggestionState')) {
-      textStyleSuggestionState =
-          TextStyleSuggestionState.fromJson(_json['textStyleSuggestionState']);
+      textStyleSuggestionState = TextStyleSuggestionState.fromJson(
+          _json['textStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4240,7 +4362,8 @@
 
   OptionalColor.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4289,11 +4412,15 @@
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
       suggestedTextStyleChanges = commons.mapMap<core.Map, SuggestedTextStyle>(
-          _json['suggestedTextStyleChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedTextStyle.fromJson(item));
+          (_json['suggestedTextStyleChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4349,15 +4476,18 @@
 
   Paragraph.fromJson(core.Map _json) {
     if (_json.containsKey('bullet')) {
-      bullet = Bullet.fromJson(_json['bullet']);
+      bullet = Bullet.fromJson(
+          _json['bullet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('elements')) {
       elements = (_json['elements'] as core.List)
-          .map<ParagraphElement>((value) => ParagraphElement.fromJson(value))
+          .map<ParagraphElement>((value) => ParagraphElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('paragraphStyle')) {
-      paragraphStyle = ParagraphStyle.fromJson(_json['paragraphStyle']);
+      paragraphStyle = ParagraphStyle.fromJson(
+          _json['paragraphStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positionedObjectIds')) {
       positionedObjectIds = (_json['positionedObjectIds'] as core.List)
@@ -4366,20 +4496,28 @@
     }
     if (_json.containsKey('suggestedBulletChanges')) {
       suggestedBulletChanges = commons.mapMap<core.Map, SuggestedBullet>(
-          _json['suggestedBulletChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedBullet.fromJson(item));
+          (_json['suggestedBulletChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedBullet.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('suggestedParagraphStyleChanges')) {
       suggestedParagraphStyleChanges =
           commons.mapMap<core.Map, SuggestedParagraphStyle>(
-              _json['suggestedParagraphStyleChanges']
+              (_json['suggestedParagraphStyleChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) => SuggestedParagraphStyle.fromJson(item));
+              (core.Map item) => SuggestedParagraphStyle.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('suggestedPositionedObjectIds')) {
       suggestedPositionedObjectIds = commons.mapMap<core.Map, ObjectReferences>(
-          _json['suggestedPositionedObjectIds'].cast<core.String, core.Map>(),
-          (core.Map item) => ObjectReferences.fromJson(item));
+          (_json['suggestedPositionedObjectIds']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ObjectReferences.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -4444,16 +4582,19 @@
 
   ParagraphBorder.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = OptionalColor.fromJson(_json['color']);
+      color = OptionalColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dashStyle')) {
       dashStyle = _json['dashStyle'] as core.String;
     }
     if (_json.containsKey('padding')) {
-      padding = Dimension.fromJson(_json['padding']);
+      padding = Dimension.fromJson(
+          _json['padding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
-      width = Dimension.fromJson(_json['width']);
+      width = Dimension.fromJson(
+          _json['width'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4513,36 +4654,42 @@
 
   ParagraphElement.fromJson(core.Map _json) {
     if (_json.containsKey('autoText')) {
-      autoText = AutoText.fromJson(_json['autoText']);
+      autoText = AutoText.fromJson(
+          _json['autoText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('columnBreak')) {
-      columnBreak = ColumnBreak.fromJson(_json['columnBreak']);
+      columnBreak = ColumnBreak.fromJson(
+          _json['columnBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endIndex')) {
       endIndex = _json['endIndex'] as core.int;
     }
     if (_json.containsKey('equation')) {
-      equation = Equation.fromJson(_json['equation']);
+      equation = Equation.fromJson(
+          _json['equation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('footnoteReference')) {
-      footnoteReference =
-          FootnoteReference.fromJson(_json['footnoteReference']);
+      footnoteReference = FootnoteReference.fromJson(
+          _json['footnoteReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('horizontalRule')) {
-      horizontalRule = HorizontalRule.fromJson(_json['horizontalRule']);
+      horizontalRule = HorizontalRule.fromJson(
+          _json['horizontalRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inlineObjectElement')) {
-      inlineObjectElement =
-          InlineObjectElement.fromJson(_json['inlineObjectElement']);
+      inlineObjectElement = InlineObjectElement.fromJson(
+          _json['inlineObjectElement'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageBreak')) {
-      pageBreak = PageBreak.fromJson(_json['pageBreak']);
+      pageBreak = PageBreak.fromJson(
+          _json['pageBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startIndex')) {
       startIndex = _json['startIndex'] as core.int;
     }
     if (_json.containsKey('textRun')) {
-      textRun = TextRun.fromJson(_json['textRun']);
+      textRun = TextRun.fromJson(
+          _json['textRun'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4733,19 +4880,24 @@
       avoidWidowAndOrphan = _json['avoidWidowAndOrphan'] as core.bool;
     }
     if (_json.containsKey('borderBetween')) {
-      borderBetween = ParagraphBorder.fromJson(_json['borderBetween']);
+      borderBetween = ParagraphBorder.fromJson(
+          _json['borderBetween'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderBottom')) {
-      borderBottom = ParagraphBorder.fromJson(_json['borderBottom']);
+      borderBottom = ParagraphBorder.fromJson(
+          _json['borderBottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderLeft')) {
-      borderLeft = ParagraphBorder.fromJson(_json['borderLeft']);
+      borderLeft = ParagraphBorder.fromJson(
+          _json['borderLeft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderRight')) {
-      borderRight = ParagraphBorder.fromJson(_json['borderRight']);
+      borderRight = ParagraphBorder.fromJson(
+          _json['borderRight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderTop')) {
-      borderTop = ParagraphBorder.fromJson(_json['borderTop']);
+      borderTop = ParagraphBorder.fromJson(
+          _json['borderTop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('direction')) {
       direction = _json['direction'] as core.String;
@@ -4754,13 +4906,16 @@
       headingId = _json['headingId'] as core.String;
     }
     if (_json.containsKey('indentEnd')) {
-      indentEnd = Dimension.fromJson(_json['indentEnd']);
+      indentEnd = Dimension.fromJson(
+          _json['indentEnd'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indentFirstLine')) {
-      indentFirstLine = Dimension.fromJson(_json['indentFirstLine']);
+      indentFirstLine = Dimension.fromJson(
+          _json['indentFirstLine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indentStart')) {
-      indentStart = Dimension.fromJson(_json['indentStart']);
+      indentStart = Dimension.fromJson(
+          _json['indentStart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keepLinesTogether')) {
       keepLinesTogether = _json['keepLinesTogether'] as core.bool;
@@ -4775,20 +4930,24 @@
       namedStyleType = _json['namedStyleType'] as core.String;
     }
     if (_json.containsKey('shading')) {
-      shading = Shading.fromJson(_json['shading']);
+      shading = Shading.fromJson(
+          _json['shading'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spaceAbove')) {
-      spaceAbove = Dimension.fromJson(_json['spaceAbove']);
+      spaceAbove = Dimension.fromJson(
+          _json['spaceAbove'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spaceBelow')) {
-      spaceBelow = Dimension.fromJson(_json['spaceBelow']);
+      spaceBelow = Dimension.fromJson(
+          _json['spaceBelow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spacingMode')) {
       spacingMode = _json['spacingMode'] as core.String;
     }
     if (_json.containsKey('tabStops')) {
       tabStops = (_json['tabStops'] as core.List)
-          .map<TabStop>((value) => TabStop.fromJson(value))
+          .map<TabStop>((value) =>
+              TabStop.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4981,8 +5140,9 @@
       namedStyleTypeSuggested = _json['namedStyleTypeSuggested'] as core.bool;
     }
     if (_json.containsKey('shadingSuggestionState')) {
-      shadingSuggestionState =
-          ShadingSuggestionState.fromJson(_json['shadingSuggestionState']);
+      shadingSuggestionState = ShadingSuggestionState.fromJson(
+          _json['shadingSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spaceAboveSuggested')) {
       spaceAboveSuggested = _json['spaceAboveSuggested'] as core.bool;
@@ -5092,7 +5252,8 @@
     }
     if (_json.containsKey('positionedObjectProperties')) {
       positionedObjectProperties = PositionedObjectProperties.fromJson(
-          _json['positionedObjectProperties']);
+          _json['positionedObjectProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestedDeletionIds')) {
       suggestedDeletionIds = (_json['suggestedDeletionIds'] as core.List)
@@ -5105,10 +5266,11 @@
     if (_json.containsKey('suggestedPositionedObjectPropertiesChanges')) {
       suggestedPositionedObjectPropertiesChanges =
           commons.mapMap<core.Map, SuggestedPositionedObjectProperties>(
-              _json['suggestedPositionedObjectPropertiesChanges']
+              (_json['suggestedPositionedObjectPropertiesChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) =>
-                  SuggestedPositionedObjectProperties.fromJson(item));
+              (core.Map item) => SuggestedPositionedObjectProperties.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -5172,10 +5334,12 @@
       layout = _json['layout'] as core.String;
     }
     if (_json.containsKey('leftOffset')) {
-      leftOffset = Dimension.fromJson(_json['leftOffset']);
+      leftOffset = Dimension.fromJson(
+          _json['leftOffset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('topOffset')) {
-      topOffset = Dimension.fromJson(_json['topOffset']);
+      topOffset = Dimension.fromJson(
+          _json['topOffset'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5249,10 +5413,12 @@
 
   PositionedObjectProperties.fromJson(core.Map _json) {
     if (_json.containsKey('embeddedObject')) {
-      embeddedObject = EmbeddedObject.fromJson(_json['embeddedObject']);
+      embeddedObject = EmbeddedObject.fromJson(
+          _json['embeddedObject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positioning')) {
-      positioning = PositionedObjectPositioning.fromJson(_json['positioning']);
+      positioning = PositionedObjectPositioning.fromJson(
+          _json['positioning'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5285,12 +5451,14 @@
   PositionedObjectPropertiesSuggestionState.fromJson(core.Map _json) {
     if (_json.containsKey('embeddedObjectSuggestionState')) {
       embeddedObjectSuggestionState = EmbeddedObjectSuggestionState.fromJson(
-          _json['embeddedObjectSuggestionState']);
+          _json['embeddedObjectSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positioningSuggestionState')) {
       positioningSuggestionState =
           PositionedObjectPositioningSuggestionState.fromJson(
-              _json['positioningSuggestionState']);
+              _json['positioningSuggestionState']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5365,7 +5533,8 @@
 
   ReplaceAllTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('containsText')) {
-      containsText = SubstringMatchCriteria.fromJson(_json['containsText']);
+      containsText = SubstringMatchCriteria.fromJson(
+          _json['containsText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceText')) {
       replaceText = _json['replaceText'] as core.String;
@@ -5611,121 +5780,137 @@
 
   Request.fromJson(core.Map _json) {
     if (_json.containsKey('createFooter')) {
-      createFooter = CreateFooterRequest.fromJson(_json['createFooter']);
+      createFooter = CreateFooterRequest.fromJson(
+          _json['createFooter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createFootnote')) {
-      createFootnote = CreateFootnoteRequest.fromJson(_json['createFootnote']);
+      createFootnote = CreateFootnoteRequest.fromJson(
+          _json['createFootnote'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createHeader')) {
-      createHeader = CreateHeaderRequest.fromJson(_json['createHeader']);
+      createHeader = CreateHeaderRequest.fromJson(
+          _json['createHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createNamedRange')) {
-      createNamedRange =
-          CreateNamedRangeRequest.fromJson(_json['createNamedRange']);
+      createNamedRange = CreateNamedRangeRequest.fromJson(
+          _json['createNamedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createParagraphBullets')) {
       createParagraphBullets = CreateParagraphBulletsRequest.fromJson(
-          _json['createParagraphBullets']);
+          _json['createParagraphBullets']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteContentRange')) {
-      deleteContentRange =
-          DeleteContentRangeRequest.fromJson(_json['deleteContentRange']);
+      deleteContentRange = DeleteContentRangeRequest.fromJson(
+          _json['deleteContentRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteFooter')) {
-      deleteFooter = DeleteFooterRequest.fromJson(_json['deleteFooter']);
+      deleteFooter = DeleteFooterRequest.fromJson(
+          _json['deleteFooter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteHeader')) {
-      deleteHeader = DeleteHeaderRequest.fromJson(_json['deleteHeader']);
+      deleteHeader = DeleteHeaderRequest.fromJson(
+          _json['deleteHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteNamedRange')) {
-      deleteNamedRange =
-          DeleteNamedRangeRequest.fromJson(_json['deleteNamedRange']);
+      deleteNamedRange = DeleteNamedRangeRequest.fromJson(
+          _json['deleteNamedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteParagraphBullets')) {
       deleteParagraphBullets = DeleteParagraphBulletsRequest.fromJson(
-          _json['deleteParagraphBullets']);
+          _json['deleteParagraphBullets']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deletePositionedObject')) {
       deletePositionedObject = DeletePositionedObjectRequest.fromJson(
-          _json['deletePositionedObject']);
+          _json['deletePositionedObject']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteTableColumn')) {
-      deleteTableColumn =
-          DeleteTableColumnRequest.fromJson(_json['deleteTableColumn']);
+      deleteTableColumn = DeleteTableColumnRequest.fromJson(
+          _json['deleteTableColumn'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteTableRow')) {
-      deleteTableRow = DeleteTableRowRequest.fromJson(_json['deleteTableRow']);
+      deleteTableRow = DeleteTableRowRequest.fromJson(
+          _json['deleteTableRow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertInlineImage')) {
-      insertInlineImage =
-          InsertInlineImageRequest.fromJson(_json['insertInlineImage']);
+      insertInlineImage = InsertInlineImageRequest.fromJson(
+          _json['insertInlineImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertPageBreak')) {
-      insertPageBreak =
-          InsertPageBreakRequest.fromJson(_json['insertPageBreak']);
+      insertPageBreak = InsertPageBreakRequest.fromJson(
+          _json['insertPageBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertSectionBreak')) {
-      insertSectionBreak =
-          InsertSectionBreakRequest.fromJson(_json['insertSectionBreak']);
+      insertSectionBreak = InsertSectionBreakRequest.fromJson(
+          _json['insertSectionBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertTable')) {
-      insertTable = InsertTableRequest.fromJson(_json['insertTable']);
+      insertTable = InsertTableRequest.fromJson(
+          _json['insertTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertTableColumn')) {
-      insertTableColumn =
-          InsertTableColumnRequest.fromJson(_json['insertTableColumn']);
+      insertTableColumn = InsertTableColumnRequest.fromJson(
+          _json['insertTableColumn'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertTableRow')) {
-      insertTableRow = InsertTableRowRequest.fromJson(_json['insertTableRow']);
+      insertTableRow = InsertTableRowRequest.fromJson(
+          _json['insertTableRow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertText')) {
-      insertText = InsertTextRequest.fromJson(_json['insertText']);
+      insertText = InsertTextRequest.fromJson(
+          _json['insertText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mergeTableCells')) {
-      mergeTableCells =
-          MergeTableCellsRequest.fromJson(_json['mergeTableCells']);
+      mergeTableCells = MergeTableCellsRequest.fromJson(
+          _json['mergeTableCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllText')) {
-      replaceAllText = ReplaceAllTextRequest.fromJson(_json['replaceAllText']);
+      replaceAllText = ReplaceAllTextRequest.fromJson(
+          _json['replaceAllText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceImage')) {
-      replaceImage = ReplaceImageRequest.fromJson(_json['replaceImage']);
+      replaceImage = ReplaceImageRequest.fromJson(
+          _json['replaceImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceNamedRangeContent')) {
       replaceNamedRangeContent = ReplaceNamedRangeContentRequest.fromJson(
-          _json['replaceNamedRangeContent']);
+          _json['replaceNamedRangeContent']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unmergeTableCells')) {
-      unmergeTableCells =
-          UnmergeTableCellsRequest.fromJson(_json['unmergeTableCells']);
+      unmergeTableCells = UnmergeTableCellsRequest.fromJson(
+          _json['unmergeTableCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateDocumentStyle')) {
-      updateDocumentStyle =
-          UpdateDocumentStyleRequest.fromJson(_json['updateDocumentStyle']);
+      updateDocumentStyle = UpdateDocumentStyleRequest.fromJson(
+          _json['updateDocumentStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateParagraphStyle')) {
-      updateParagraphStyle =
-          UpdateParagraphStyleRequest.fromJson(_json['updateParagraphStyle']);
+      updateParagraphStyle = UpdateParagraphStyleRequest.fromJson(
+          _json['updateParagraphStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateSectionStyle')) {
-      updateSectionStyle =
-          UpdateSectionStyleRequest.fromJson(_json['updateSectionStyle']);
+      updateSectionStyle = UpdateSectionStyleRequest.fromJson(
+          _json['updateSectionStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTableCellStyle')) {
-      updateTableCellStyle =
-          UpdateTableCellStyleRequest.fromJson(_json['updateTableCellStyle']);
+      updateTableCellStyle = UpdateTableCellStyleRequest.fromJson(
+          _json['updateTableCellStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTableColumnProperties')) {
       updateTableColumnProperties = UpdateTableColumnPropertiesRequest.fromJson(
-          _json['updateTableColumnProperties']);
+          _json['updateTableColumnProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTableRowStyle')) {
-      updateTableRowStyle =
-          UpdateTableRowStyleRequest.fromJson(_json['updateTableRowStyle']);
+      updateTableRowStyle = UpdateTableRowStyleRequest.fromJson(
+          _json['updateTableRowStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTextStyle')) {
-      updateTextStyle =
-          UpdateTextStyleRequest.fromJson(_json['updateTextStyle']);
+      updateTextStyle = UpdateTextStyleRequest.fromJson(
+          _json['updateTextStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5859,28 +6044,33 @@
 
   Response.fromJson(core.Map _json) {
     if (_json.containsKey('createFooter')) {
-      createFooter = CreateFooterResponse.fromJson(_json['createFooter']);
+      createFooter = CreateFooterResponse.fromJson(
+          _json['createFooter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createFootnote')) {
-      createFootnote = CreateFootnoteResponse.fromJson(_json['createFootnote']);
+      createFootnote = CreateFootnoteResponse.fromJson(
+          _json['createFootnote'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createHeader')) {
-      createHeader = CreateHeaderResponse.fromJson(_json['createHeader']);
+      createHeader = CreateHeaderResponse.fromJson(
+          _json['createHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createNamedRange')) {
-      createNamedRange =
-          CreateNamedRangeResponse.fromJson(_json['createNamedRange']);
+      createNamedRange = CreateNamedRangeResponse.fromJson(
+          _json['createNamedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertInlineImage')) {
-      insertInlineImage =
-          InsertInlineImageResponse.fromJson(_json['insertInlineImage']);
+      insertInlineImage = InsertInlineImageResponse.fromJson(
+          _json['insertInlineImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertInlineSheetsChart')) {
       insertInlineSheetsChart = InsertInlineSheetsChartResponse.fromJson(
-          _json['insertInlineSheetsChart']);
+          _json['insertInlineSheetsChart']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllText')) {
-      replaceAllText = ReplaceAllTextResponse.fromJson(_json['replaceAllText']);
+      replaceAllText = ReplaceAllTextResponse.fromJson(
+          _json['replaceAllText'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5972,7 +6162,8 @@
 
   SectionBreak.fromJson(core.Map _json) {
     if (_json.containsKey('sectionStyle')) {
-      sectionStyle = SectionStyle.fromJson(_json['sectionStyle']);
+      sectionStyle = SectionStyle.fromJson(
+          _json['sectionStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestedDeletionIds')) {
       suggestedDeletionIds = (_json['suggestedDeletionIds'] as core.List)
@@ -6013,10 +6204,12 @@
 
   SectionColumnProperties.fromJson(core.Map _json) {
     if (_json.containsKey('paddingEnd')) {
-      paddingEnd = Dimension.fromJson(_json['paddingEnd']);
+      paddingEnd = Dimension.fromJson(
+          _json['paddingEnd'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
-      width = Dimension.fromJson(_json['width']);
+      width = Dimension.fromJson(
+          _json['width'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6178,8 +6371,9 @@
   SectionStyle.fromJson(core.Map _json) {
     if (_json.containsKey('columnProperties')) {
       columnProperties = (_json['columnProperties'] as core.List)
-          .map<SectionColumnProperties>(
-              (value) => SectionColumnProperties.fromJson(value))
+          .map<SectionColumnProperties>((value) =>
+              SectionColumnProperties.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('columnSeparatorStyle')) {
@@ -6207,22 +6401,28 @@
       firstPageHeaderId = _json['firstPageHeaderId'] as core.String;
     }
     if (_json.containsKey('marginBottom')) {
-      marginBottom = Dimension.fromJson(_json['marginBottom']);
+      marginBottom = Dimension.fromJson(
+          _json['marginBottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginFooter')) {
-      marginFooter = Dimension.fromJson(_json['marginFooter']);
+      marginFooter = Dimension.fromJson(
+          _json['marginFooter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginHeader')) {
-      marginHeader = Dimension.fromJson(_json['marginHeader']);
+      marginHeader = Dimension.fromJson(
+          _json['marginHeader'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginLeft')) {
-      marginLeft = Dimension.fromJson(_json['marginLeft']);
+      marginLeft = Dimension.fromJson(
+          _json['marginLeft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginRight')) {
-      marginRight = Dimension.fromJson(_json['marginRight']);
+      marginRight = Dimension.fromJson(
+          _json['marginRight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('marginTop')) {
-      marginTop = Dimension.fromJson(_json['marginTop']);
+      marginTop = Dimension.fromJson(
+          _json['marginTop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageNumberStart')) {
       pageNumberStart = _json['pageNumberStart'] as core.int;
@@ -6305,7 +6505,8 @@
 
   Shading.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = OptionalColor.fromJson(_json['backgroundColor']);
+      backgroundColor = OptionalColor.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6419,10 +6620,12 @@
 
   Size.fromJson(core.Map _json) {
     if (_json.containsKey('height')) {
-      height = Dimension.fromJson(_json['height']);
+      height = Dimension.fromJson(
+          _json['height'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
-      width = Dimension.fromJson(_json['width']);
+      width = Dimension.fromJson(
+          _json['width'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6501,19 +6704,23 @@
       endIndex = _json['endIndex'] as core.int;
     }
     if (_json.containsKey('paragraph')) {
-      paragraph = Paragraph.fromJson(_json['paragraph']);
+      paragraph = Paragraph.fromJson(
+          _json['paragraph'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sectionBreak')) {
-      sectionBreak = SectionBreak.fromJson(_json['sectionBreak']);
+      sectionBreak = SectionBreak.fromJson(
+          _json['sectionBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startIndex')) {
       startIndex = _json['startIndex'] as core.int;
     }
     if (_json.containsKey('table')) {
-      table = Table.fromJson(_json['table']);
+      table =
+          Table.fromJson(_json['table'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableOfContents')) {
-      tableOfContents = TableOfContents.fromJson(_json['tableOfContents']);
+      tableOfContents = TableOfContents.fromJson(
+          _json['tableOfContents'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6588,11 +6795,13 @@
 
   SuggestedBullet.fromJson(core.Map _json) {
     if (_json.containsKey('bullet')) {
-      bullet = Bullet.fromJson(_json['bullet']);
+      bullet = Bullet.fromJson(
+          _json['bullet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bulletSuggestionState')) {
-      bulletSuggestionState =
-          BulletSuggestionState.fromJson(_json['bulletSuggestionState']);
+      bulletSuggestionState = BulletSuggestionState.fromJson(
+          _json['bulletSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6623,11 +6832,13 @@
 
   SuggestedDocumentStyle.fromJson(core.Map _json) {
     if (_json.containsKey('documentStyle')) {
-      documentStyle = DocumentStyle.fromJson(_json['documentStyle']);
+      documentStyle = DocumentStyle.fromJson(
+          _json['documentStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentStyleSuggestionState')) {
       documentStyleSuggestionState = DocumentStyleSuggestionState.fromJson(
-          _json['documentStyleSuggestionState']);
+          _json['documentStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6660,13 +6871,15 @@
 
   SuggestedInlineObjectProperties.fromJson(core.Map _json) {
     if (_json.containsKey('inlineObjectProperties')) {
-      inlineObjectProperties =
-          InlineObjectProperties.fromJson(_json['inlineObjectProperties']);
+      inlineObjectProperties = InlineObjectProperties.fromJson(
+          _json['inlineObjectProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inlineObjectPropertiesSuggestionState')) {
       inlineObjectPropertiesSuggestionState =
           InlineObjectPropertiesSuggestionState.fromJson(
-              _json['inlineObjectPropertiesSuggestionState']);
+              _json['inlineObjectPropertiesSuggestionState']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6698,11 +6911,13 @@
 
   SuggestedListProperties.fromJson(core.Map _json) {
     if (_json.containsKey('listProperties')) {
-      listProperties = ListProperties.fromJson(_json['listProperties']);
+      listProperties = ListProperties.fromJson(
+          _json['listProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('listPropertiesSuggestionState')) {
       listPropertiesSuggestionState = ListPropertiesSuggestionState.fromJson(
-          _json['listPropertiesSuggestionState']);
+          _json['listPropertiesSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6734,11 +6949,13 @@
 
   SuggestedNamedStyles.fromJson(core.Map _json) {
     if (_json.containsKey('namedStyles')) {
-      namedStyles = NamedStyles.fromJson(_json['namedStyles']);
+      namedStyles = NamedStyles.fromJson(
+          _json['namedStyles'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('namedStylesSuggestionState')) {
       namedStylesSuggestionState = NamedStylesSuggestionState.fromJson(
-          _json['namedStylesSuggestionState']);
+          _json['namedStylesSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6769,11 +6986,13 @@
 
   SuggestedParagraphStyle.fromJson(core.Map _json) {
     if (_json.containsKey('paragraphStyle')) {
-      paragraphStyle = ParagraphStyle.fromJson(_json['paragraphStyle']);
+      paragraphStyle = ParagraphStyle.fromJson(
+          _json['paragraphStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('paragraphStyleSuggestionState')) {
       paragraphStyleSuggestionState = ParagraphStyleSuggestionState.fromJson(
-          _json['paragraphStyleSuggestionState']);
+          _json['paragraphStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6808,12 +7027,14 @@
   SuggestedPositionedObjectProperties.fromJson(core.Map _json) {
     if (_json.containsKey('positionedObjectProperties')) {
       positionedObjectProperties = PositionedObjectProperties.fromJson(
-          _json['positionedObjectProperties']);
+          _json['positionedObjectProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positionedObjectPropertiesSuggestionState')) {
       positionedObjectPropertiesSuggestionState =
           PositionedObjectPropertiesSuggestionState.fromJson(
-              _json['positionedObjectPropertiesSuggestionState']);
+              _json['positionedObjectPropertiesSuggestionState']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6845,11 +7066,13 @@
 
   SuggestedTableCellStyle.fromJson(core.Map _json) {
     if (_json.containsKey('tableCellStyle')) {
-      tableCellStyle = TableCellStyle.fromJson(_json['tableCellStyle']);
+      tableCellStyle = TableCellStyle.fromJson(
+          _json['tableCellStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableCellStyleSuggestionState')) {
       tableCellStyleSuggestionState = TableCellStyleSuggestionState.fromJson(
-          _json['tableCellStyleSuggestionState']);
+          _json['tableCellStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6881,11 +7104,13 @@
 
   SuggestedTableRowStyle.fromJson(core.Map _json) {
     if (_json.containsKey('tableRowStyle')) {
-      tableRowStyle = TableRowStyle.fromJson(_json['tableRowStyle']);
+      tableRowStyle = TableRowStyle.fromJson(
+          _json['tableRowStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableRowStyleSuggestionState')) {
       tableRowStyleSuggestionState = TableRowStyleSuggestionState.fromJson(
-          _json['tableRowStyleSuggestionState']);
+          _json['tableRowStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6917,11 +7142,13 @@
 
   SuggestedTextStyle.fromJson(core.Map _json) {
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textStyleSuggestionState')) {
-      textStyleSuggestionState =
-          TextStyleSuggestionState.fromJson(_json['textStyleSuggestionState']);
+      textStyleSuggestionState = TextStyleSuggestionState.fromJson(
+          _json['textStyleSuggestionState']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6959,7 +7186,8 @@
       alignment = _json['alignment'] as core.String;
     }
     if (_json.containsKey('offset')) {
-      offset = Dimension.fromJson(_json['offset']);
+      offset = Dimension.fromJson(
+          _json['offset'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7020,11 +7248,13 @@
     }
     if (_json.containsKey('tableRows')) {
       tableRows = (_json['tableRows'] as core.List)
-          .map<TableRow>((value) => TableRow.fromJson(value))
+          .map<TableRow>((value) =>
+              TableRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tableStyle')) {
-      tableStyle = TableStyle.fromJson(_json['tableStyle']);
+      tableStyle = TableStyle.fromJson(
+          _json['tableStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7083,7 +7313,8 @@
   TableCell.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
       content = (_json['content'] as core.List)
-          .map<StructuralElement>((value) => StructuralElement.fromJson(value))
+          .map<StructuralElement>((value) => StructuralElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('endIndex')) {
@@ -7105,12 +7336,15 @@
     if (_json.containsKey('suggestedTableCellStyleChanges')) {
       suggestedTableCellStyleChanges =
           commons.mapMap<core.Map, SuggestedTableCellStyle>(
-              _json['suggestedTableCellStyleChanges']
+              (_json['suggestedTableCellStyleChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) => SuggestedTableCellStyle.fromJson(item));
+              (core.Map item) => SuggestedTableCellStyle.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('tableCellStyle')) {
-      tableCellStyle = TableCellStyle.fromJson(_json['tableCellStyle']);
+      tableCellStyle = TableCellStyle.fromJson(
+          _json['tableCellStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7168,13 +7402,15 @@
 
   TableCellBorder.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = OptionalColor.fromJson(_json['color']);
+      color = OptionalColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dashStyle')) {
       dashStyle = _json['dashStyle'] as core.String;
     }
     if (_json.containsKey('width')) {
-      width = Dimension.fromJson(_json['width']);
+      width = Dimension.fromJson(
+          _json['width'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7216,7 +7452,8 @@
       rowIndex = _json['rowIndex'] as core.int;
     }
     if (_json.containsKey('tableStartLocation')) {
-      tableStartLocation = Location.fromJson(_json['tableStartLocation']);
+      tableStartLocation = Location.fromJson(
+          _json['tableStartLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7290,19 +7527,24 @@
 
   TableCellStyle.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = OptionalColor.fromJson(_json['backgroundColor']);
+      backgroundColor = OptionalColor.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderBottom')) {
-      borderBottom = TableCellBorder.fromJson(_json['borderBottom']);
+      borderBottom = TableCellBorder.fromJson(
+          _json['borderBottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderLeft')) {
-      borderLeft = TableCellBorder.fromJson(_json['borderLeft']);
+      borderLeft = TableCellBorder.fromJson(
+          _json['borderLeft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderRight')) {
-      borderRight = TableCellBorder.fromJson(_json['borderRight']);
+      borderRight = TableCellBorder.fromJson(
+          _json['borderRight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borderTop')) {
-      borderTop = TableCellBorder.fromJson(_json['borderTop']);
+      borderTop = TableCellBorder.fromJson(
+          _json['borderTop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('columnSpan')) {
       columnSpan = _json['columnSpan'] as core.int;
@@ -7311,16 +7553,20 @@
       contentAlignment = _json['contentAlignment'] as core.String;
     }
     if (_json.containsKey('paddingBottom')) {
-      paddingBottom = Dimension.fromJson(_json['paddingBottom']);
+      paddingBottom = Dimension.fromJson(
+          _json['paddingBottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('paddingLeft')) {
-      paddingLeft = Dimension.fromJson(_json['paddingLeft']);
+      paddingLeft = Dimension.fromJson(
+          _json['paddingLeft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('paddingRight')) {
-      paddingRight = Dimension.fromJson(_json['paddingRight']);
+      paddingRight = Dimension.fromJson(
+          _json['paddingRight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('paddingTop')) {
-      paddingTop = Dimension.fromJson(_json['paddingTop']);
+      paddingTop = Dimension.fromJson(
+          _json['paddingTop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rowSpan')) {
       rowSpan = _json['rowSpan'] as core.int;
@@ -7514,7 +7760,8 @@
 
   TableColumnProperties.fromJson(core.Map _json) {
     if (_json.containsKey('width')) {
-      width = Dimension.fromJson(_json['width']);
+      width = Dimension.fromJson(
+          _json['width'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('widthType')) {
       widthType = _json['widthType'] as core.String;
@@ -7552,7 +7799,8 @@
   TableOfContents.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
       content = (_json['content'] as core.List)
-          .map<StructuralElement>((value) => StructuralElement.fromJson(value))
+          .map<StructuralElement>((value) => StructuralElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('suggestedDeletionIds')) {
@@ -7609,8 +7857,8 @@
       rowSpan = _json['rowSpan'] as core.int;
     }
     if (_json.containsKey('tableCellLocation')) {
-      tableCellLocation =
-          TableCellLocation.fromJson(_json['tableCellLocation']);
+      tableCellLocation = TableCellLocation.fromJson(
+          _json['tableCellLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7679,17 +7927,21 @@
     if (_json.containsKey('suggestedTableRowStyleChanges')) {
       suggestedTableRowStyleChanges =
           commons.mapMap<core.Map, SuggestedTableRowStyle>(
-              _json['suggestedTableRowStyleChanges']
+              (_json['suggestedTableRowStyleChanges']
+                      as core.Map<core.String, core.dynamic>)
                   .cast<core.String, core.Map>(),
-              (core.Map item) => SuggestedTableRowStyle.fromJson(item));
+              (core.Map item) => SuggestedTableRowStyle.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('tableCells')) {
       tableCells = (_json['tableCells'] as core.List)
-          .map<TableCell>((value) => TableCell.fromJson(value))
+          .map<TableCell>((value) =>
+              TableCell.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tableRowStyle')) {
-      tableRowStyle = TableRowStyle.fromJson(_json['tableRowStyle']);
+      tableRowStyle = TableRowStyle.fromJson(
+          _json['tableRowStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7734,7 +7986,8 @@
 
   TableRowStyle.fromJson(core.Map _json) {
     if (_json.containsKey('minRowHeight')) {
-      minRowHeight = Dimension.fromJson(_json['minRowHeight']);
+      minRowHeight = Dimension.fromJson(
+          _json['minRowHeight'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7783,8 +8036,8 @@
   TableStyle.fromJson(core.Map _json) {
     if (_json.containsKey('tableColumnProperties')) {
       tableColumnProperties = (_json['tableColumnProperties'] as core.List)
-          .map<TableColumnProperties>(
-              (value) => TableColumnProperties.fromJson(value))
+          .map<TableColumnProperties>((value) => TableColumnProperties.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7839,11 +8092,15 @@
     }
     if (_json.containsKey('suggestedTextStyleChanges')) {
       suggestedTextStyleChanges = commons.mapMap<core.Map, SuggestedTextStyle>(
-          _json['suggestedTextStyleChanges'].cast<core.String, core.Map>(),
-          (core.Map item) => SuggestedTextStyle.fromJson(item));
+          (_json['suggestedTextStyleChanges']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SuggestedTextStyle.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7950,7 +8207,8 @@
 
   TextStyle.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = OptionalColor.fromJson(_json['backgroundColor']);
+      backgroundColor = OptionalColor.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('baselineOffset')) {
       baselineOffset = _json['baselineOffset'] as core.String;
@@ -7959,16 +8217,19 @@
       bold = _json['bold'] as core.bool;
     }
     if (_json.containsKey('fontSize')) {
-      fontSize = Dimension.fromJson(_json['fontSize']);
+      fontSize = Dimension.fromJson(
+          _json['fontSize'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('foregroundColor')) {
-      foregroundColor = OptionalColor.fromJson(_json['foregroundColor']);
+      foregroundColor = OptionalColor.fromJson(
+          _json['foregroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('italic')) {
       italic = _json['italic'] as core.bool;
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('smallCaps')) {
       smallCaps = _json['smallCaps'] as core.bool;
@@ -7980,8 +8241,8 @@
       underline = _json['underline'] as core.bool;
     }
     if (_json.containsKey('weightedFontFamily')) {
-      weightedFontFamily =
-          WeightedFontFamily.fromJson(_json['weightedFontFamily']);
+      weightedFontFamily = WeightedFontFamily.fromJson(
+          _json['weightedFontFamily'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8154,7 +8415,8 @@
 
   UnmergeTableCellsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('tableRange')) {
-      tableRange = TableRange.fromJson(_json['tableRange']);
+      tableRange = TableRange.fromJson(
+          _json['tableRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8184,7 +8446,8 @@
 
   UpdateDocumentStyleRequest.fromJson(core.Map _json) {
     if (_json.containsKey('documentStyle')) {
-      documentStyle = DocumentStyle.fromJson(_json['documentStyle']);
+      documentStyle = DocumentStyle.fromJson(
+          _json['documentStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
@@ -8227,10 +8490,12 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('paragraphStyle')) {
-      paragraphStyle = ParagraphStyle.fromJson(_json['paragraphStyle']);
+      paragraphStyle = ParagraphStyle.fromJson(
+          _json['paragraphStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8273,10 +8538,12 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sectionStyle')) {
-      sectionStyle = SectionStyle.fromJson(_json['sectionStyle']);
+      sectionStyle = SectionStyle.fromJson(
+          _json['sectionStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8329,13 +8596,16 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('tableCellStyle')) {
-      tableCellStyle = TableCellStyle.fromJson(_json['tableCellStyle']);
+      tableCellStyle = TableCellStyle.fromJson(
+          _json['tableCellStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableRange')) {
-      tableRange = TableRange.fromJson(_json['tableRange']);
+      tableRange = TableRange.fromJson(
+          _json['tableRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableStartLocation')) {
-      tableStartLocation = Location.fromJson(_json['tableStartLocation']);
+      tableStartLocation = Location.fromJson(
+          _json['tableStartLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8389,11 +8659,13 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('tableColumnProperties')) {
-      tableColumnProperties =
-          TableColumnProperties.fromJson(_json['tableColumnProperties']);
+      tableColumnProperties = TableColumnProperties.fromJson(
+          _json['tableColumnProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableStartLocation')) {
-      tableStartLocation = Location.fromJson(_json['tableStartLocation']);
+      tableStartLocation = Location.fromJson(
+          _json['tableStartLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8445,10 +8717,12 @@
           .toList();
     }
     if (_json.containsKey('tableRowStyle')) {
-      tableRowStyle = TableRowStyle.fromJson(_json['tableRowStyle']);
+      tableRowStyle = TableRowStyle.fromJson(
+          _json['tableRowStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableStartLocation')) {
-      tableStartLocation = Location.fromJson(_json['tableStartLocation']);
+      tableStartLocation = Location.fromJson(
+          _json['tableStartLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8499,10 +8773,12 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textStyle')) {
-      textStyle = TextStyle.fromJson(_json['textStyle']);
+      textStyle = TextStyle.fromJson(
+          _json['textStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/domainsrdap/v1.dart b/generated/googleapis/lib/domainsrdap/v1.dart
index 75160cf..91db2d7 100644
--- a/generated/googleapis/lib/domainsrdap/v1.dart
+++ b/generated/googleapis/lib/domainsrdap/v1.dart
@@ -100,7 +100,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RdapResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RdapResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -155,7 +158,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -210,7 +215,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RdapResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RdapResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -274,7 +282,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RdapResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RdapResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -329,7 +340,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RdapResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RdapResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -378,7 +392,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RdapResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RdapResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// The RDAP API recognizes this command from the RDAP specification but does
@@ -421,7 +438,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RdapResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RdapResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get help information for the RDAP API, including links to documentation.
@@ -463,7 +483,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// The RDAP API recognizes this command from the RDAP specification but does
@@ -506,7 +528,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// The RDAP API recognizes this command from the RDAP specification but does
@@ -549,7 +573,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RdapResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RdapResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -604,7 +631,8 @@
       extensions = (_json['extensions'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -731,7 +759,8 @@
     }
     if (_json.containsKey('links')) {
       links = (_json['links'] as core.List)
-          .map<Link>((value) => Link.fromJson(value))
+          .map<Link>((value) =>
+              Link.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -796,14 +825,16 @@
       errorCode = _json['errorCode'] as core.int;
     }
     if (_json.containsKey('jsonResponse')) {
-      jsonResponse = HttpBody.fromJson(_json['jsonResponse']);
+      jsonResponse = HttpBody.fromJson(
+          _json['jsonResponse'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lang')) {
       lang = _json['lang'] as core.String;
     }
     if (_json.containsKey('notices')) {
       notices = (_json['notices'] as core.List)
-          .map<Notice>((value) => Notice.fromJson(value))
+          .map<Notice>((value) =>
+              Notice.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rdapConformance')) {
diff --git a/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart b/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart
index 5822eab..744552b 100644
--- a/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart
+++ b/generated/googleapis/lib/doubleclickbidmanager/v1_1.dart
@@ -102,7 +102,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DownloadLineItemsResponse.fromJson(data));
+    return _response.then(
+      (data) => DownloadLineItemsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Uploads line items in CSV format. YouTube & partners line items are not
@@ -151,7 +154,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UploadLineItemsResponse.fromJson(data));
+    return _response.then(
+      (data) => UploadLineItemsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -212,7 +218,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Query.fromJson(data));
+    return _response.then(
+      (data) => Query.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a stored query as well as the associated stored reports.
@@ -260,7 +268,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves a stored query.
@@ -308,7 +318,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Query.fromJson(data));
+    return _response.then(
+      (data) => Query.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves stored queries.
@@ -363,7 +375,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListQueriesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListQueriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs a stored query to generate a report.
@@ -423,7 +438,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -490,7 +507,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListReportsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListReportsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -544,7 +564,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DownloadResponse.fromJson(data));
+    return _response.then(
+      (data) => DownloadResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -573,7 +596,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<Rule>((value) => Rule.fromJson(value))
+          .map<Rule>((value) =>
+              Rule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -604,7 +628,8 @@
   DisjunctiveMatchStatement.fromJson(core.Map _json) {
     if (_json.containsKey('eventFilters')) {
       eventFilters = (_json['eventFilters'] as core.List)
-          .map<EventFilter>((value) => EventFilter.fromJson(value))
+          .map<EventFilter>((value) => EventFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -845,8 +870,8 @@
 
   EventFilter.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionFilter')) {
-      dimensionFilter =
-          PathQueryOptionsFilter.fromJson(_json['dimensionFilter']);
+      dimensionFilter = PathQueryOptionsFilter.fromJson(
+          _json['dimensionFilter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1175,7 +1200,8 @@
     }
     if (_json.containsKey('queries')) {
       queries = (_json['queries'] as core.List)
-          .map<Query>((value) => Query.fromJson(value))
+          .map<Query>((value) =>
+              Query.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1218,7 +1244,8 @@
     }
     if (_json.containsKey('reports')) {
       reports = (_json['reports'] as core.List)
-          .map<Report>((value) => Report.fromJson(value))
+          .map<Report>((value) =>
+              Report.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1256,7 +1283,8 @@
           _json['includeOnlyTargetedUserLists'] as core.bool;
     }
     if (_json.containsKey('pathQueryOptions')) {
-      pathQueryOptions = PathQueryOptions.fromJson(_json['pathQueryOptions']);
+      pathQueryOptions = PathQueryOptions.fromJson(
+          _json['pathQueryOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1332,7 +1360,8 @@
   Parameters.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<FilterPair>((value) => FilterPair.fromJson(value))
+          .map<FilterPair>((value) =>
+              FilterPair.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('groupBys')) {
@@ -1349,7 +1378,8 @@
           .toList();
     }
     if (_json.containsKey('options')) {
-      options = Options.fromJson(_json['options']);
+      options = Options.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1402,7 +1432,8 @@
   PathFilter.fromJson(core.Map _json) {
     if (_json.containsKey('eventFilters')) {
       eventFilters = (_json['eventFilters'] as core.List)
-          .map<EventFilter>((value) => EventFilter.fromJson(value))
+          .map<EventFilter>((value) => EventFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pathMatchPosition')) {
@@ -1436,11 +1467,13 @@
 
   PathQueryOptions.fromJson(core.Map _json) {
     if (_json.containsKey('channelGrouping')) {
-      channelGrouping = ChannelGrouping.fromJson(_json['channelGrouping']);
+      channelGrouping = ChannelGrouping.fromJson(
+          _json['channelGrouping'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pathFilters')) {
       pathFilters = (_json['pathFilters'] as core.List)
-          .map<PathFilter>((value) => PathFilter.fromJson(value))
+          .map<PathFilter>((value) =>
+              PathFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1807,10 +1840,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = QueryMetadata.fromJson(_json['metadata']);
+      metadata = QueryMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('params')) {
-      params = Parameters.fromJson(_json['params']);
+      params = Parameters.fromJson(
+          _json['params'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryId')) {
       queryId = _json['queryId'] as core.String;
@@ -1822,7 +1857,8 @@
       reportDataStartTimeMs = _json['reportDataStartTimeMs'] as core.String;
     }
     if (_json.containsKey('schedule')) {
-      schedule = QuerySchedule.fromJson(_json['schedule']);
+      schedule = QuerySchedule.fromJson(
+          _json['schedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timezoneCode')) {
       timezoneCode = _json['timezoneCode'] as core.String;
@@ -2089,13 +2125,16 @@
 
   Report.fromJson(core.Map _json) {
     if (_json.containsKey('key')) {
-      key = ReportKey.fromJson(_json['key']);
+      key = ReportKey.fromJson(
+          _json['key'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata = ReportMetadata.fromJson(_json['metadata']);
+      metadata = ReportMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('params')) {
-      params = Parameters.fromJson(_json['params']);
+      params = Parameters.fromJson(
+          _json['params'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2214,7 +2253,8 @@
       reportDataStartTimeMs = _json['reportDataStartTimeMs'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = ReportStatus.fromJson(_json['status']);
+      status = ReportStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2262,7 +2302,8 @@
 
   ReportStatus.fromJson(core.Map _json) {
     if (_json.containsKey('failure')) {
-      failure = ReportFailure.fromJson(_json['failure']);
+      failure = ReportFailure.fromJson(
+          _json['failure'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('finishTimeMs')) {
       finishTimeMs = _json['finishTimeMs'] as core.String;
@@ -2378,8 +2419,9 @@
     if (_json.containsKey('disjunctiveMatchStatements')) {
       disjunctiveMatchStatements =
           (_json['disjunctiveMatchStatements'] as core.List)
-              .map<DisjunctiveMatchStatement>(
-                  (value) => DisjunctiveMatchStatement.fromJson(value))
+              .map<DisjunctiveMatchStatement>((value) =>
+                  DisjunctiveMatchStatement.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('name')) {
@@ -2528,7 +2570,8 @@
 
   UploadLineItemsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('uploadStatus')) {
-      uploadStatus = UploadStatus.fromJson(_json['uploadStatus']);
+      uploadStatus = UploadStatus.fromJson(
+          _json['uploadStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2559,7 +2602,8 @@
     }
     if (_json.containsKey('rowStatus')) {
       rowStatus = (_json['rowStatus'] as core.List)
-          .map<RowStatus>((value) => RowStatus.fromJson(value))
+          .map<RowStatus>((value) =>
+              RowStatus.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/doubleclicksearch/v2.dart b/generated/googleapis/lib/doubleclicksearch/v2.dart
index 2aa3068..f225434 100644
--- a/generated/googleapis/lib/doubleclicksearch/v2.dart
+++ b/generated/googleapis/lib/doubleclicksearch/v2.dart
@@ -186,7 +186,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ConversionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ConversionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a batch of new conversions into DoubleClick Search.
@@ -234,7 +237,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ConversionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ConversionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a batch of conversions in DoubleClick Search.
@@ -282,7 +288,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ConversionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ConversionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the availabilities of a batch of floodlight activities in
@@ -331,7 +340,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UpdateAvailabilityResponse.fromJson(data));
+    return _response.then(
+      (data) => UpdateAvailabilityResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -385,7 +397,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Polls for the status of a report request.
@@ -434,7 +448,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Downloads a report file encoded in UTF-8.
@@ -498,7 +514,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => null);
+      return _response.then(
+        (data) => null,
+      );
     } else {
       return _response;
     }
@@ -549,7 +567,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -613,7 +633,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedColumnList.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedColumnList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -859,12 +882,14 @@
     }
     if (_json.containsKey('customDimension')) {
       customDimension = (_json['customDimension'] as core.List)
-          .map<CustomDimension>((value) => CustomDimension.fromJson(value))
+          .map<CustomDimension>((value) => CustomDimension.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('customMetric')) {
       customMetric = (_json['customMetric'] as core.List)
-          .map<CustomMetric>((value) => CustomMetric.fromJson(value))
+          .map<CustomMetric>((value) => CustomMetric.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deviceType')) {
@@ -1041,7 +1066,8 @@
   ConversionList.fromJson(core.Map _json) {
     if (_json.containsKey('conversion')) {
       conversion = (_json['conversion'] as core.List)
-          .map<Conversion>((value) => Conversion.fromJson(value))
+          .map<Conversion>((value) =>
+              Conversion.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1197,7 +1223,8 @@
   Report.fromJson(core.Map _json) {
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
-          .map<ReportFiles>((value) => ReportFiles.fromJson(value))
+          .map<ReportFiles>((value) => ReportFiles.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -1210,14 +1237,16 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('request')) {
-      request = ReportRequest.fromJson(_json['request']);
+      request = ReportRequest.fromJson(
+          _json['request'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rowCount')) {
       rowCount = _json['rowCount'] as core.int;
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<ReportRow>((value) => ReportRow.fromJson(value))
+          .map<ReportRow>((value) =>
+              ReportRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('statisticsCurrencyCode')) {
@@ -1407,7 +1436,8 @@
 
   ReportRequestFilters.fromJson(core.Map _json) {
     if (_json.containsKey('column')) {
-      column = ReportApiColumnSpec.fromJson(_json['column']);
+      column = ReportApiColumnSpec.fromJson(
+          _json['column'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operator')) {
       operator = _json['operator'] as core.String;
@@ -1446,7 +1476,8 @@
 
   ReportRequestOrderBy.fromJson(core.Map _json) {
     if (_json.containsKey('column')) {
-      column = ReportApiColumnSpec.fromJson(_json['column']);
+      column = ReportApiColumnSpec.fromJson(
+          _json['column'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortOrder')) {
       sortOrder = _json['sortOrder'] as core.String;
@@ -1674,8 +1705,8 @@
   ReportRequest.fromJson(core.Map _json) {
     if (_json.containsKey('columns')) {
       columns = (_json['columns'] as core.List)
-          .map<ReportApiColumnSpec>(
-              (value) => ReportApiColumnSpec.fromJson(value))
+          .map<ReportApiColumnSpec>((value) => ReportApiColumnSpec.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('downloadFormat')) {
@@ -1683,8 +1714,8 @@
     }
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<ReportRequestFilters>(
-              (value) => ReportRequestFilters.fromJson(value))
+          .map<ReportRequestFilters>((value) => ReportRequestFilters.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('includeDeletedEntities')) {
@@ -1698,12 +1729,13 @@
     }
     if (_json.containsKey('orderBy')) {
       orderBy = (_json['orderBy'] as core.List)
-          .map<ReportRequestOrderBy>(
-              (value) => ReportRequestOrderBy.fromJson(value))
+          .map<ReportRequestOrderBy>((value) => ReportRequestOrderBy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reportScope')) {
-      reportScope = ReportRequestReportScope.fromJson(_json['reportScope']);
+      reportScope = ReportRequestReportScope.fromJson(
+          _json['reportScope'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reportType')) {
       reportType = _json['reportType'] as core.String;
@@ -1718,7 +1750,8 @@
       statisticsCurrency = _json['statisticsCurrency'] as core.String;
     }
     if (_json.containsKey('timeRange')) {
-      timeRange = ReportRequestTimeRange.fromJson(_json['timeRange']);
+      timeRange = ReportRequestTimeRange.fromJson(
+          _json['timeRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('verifySingleTimeZone')) {
       verifySingleTimeZone = _json['verifySingleTimeZone'] as core.bool;
@@ -1869,7 +1902,8 @@
   SavedColumnList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SavedColumn>((value) => SavedColumn.fromJson(value))
+          .map<SavedColumn>((value) => SavedColumn.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1899,7 +1933,8 @@
   UpdateAvailabilityRequest.fromJson(core.Map _json) {
     if (_json.containsKey('availabilities')) {
       availabilities = (_json['availabilities'] as core.List)
-          .map<Availability>((value) => Availability.fromJson(value))
+          .map<Availability>((value) => Availability.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1924,7 +1959,8 @@
   UpdateAvailabilityResponse.fromJson(core.Map _json) {
     if (_json.containsKey('availabilities')) {
       availabilities = (_json['availabilities'] as core.List)
-          .map<Availability>((value) => Availability.fromJson(value))
+          .map<Availability>((value) => Availability.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/drive/v2.dart b/generated/googleapis/lib/drive/v2.dart
index 252990f..a37c009 100644
--- a/generated/googleapis/lib/drive/v2.dart
+++ b/generated/googleapis/lib/drive/v2.dart
@@ -166,7 +166,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => About.fromJson(data));
+    return _response.then(
+      (data) => About.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -220,7 +222,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => App.fromJson(data));
+    return _response.then(
+      (data) => App.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a user's installed apps.
@@ -290,7 +294,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppList.fromJson(data));
+    return _response.then(
+      (data) => AppList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -370,7 +376,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Change.fromJson(data));
+    return _response.then(
+      (data) => Change.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the starting pageToken for listing future changes.
@@ -438,7 +446,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StartPageToken.fromJson(data));
+    return _response.then(
+      (data) =>
+          StartPageToken.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the changes for a user or shared drive.
@@ -583,7 +594,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChangeList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChangeList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Subscribe to changes for a user.
@@ -734,7 +748,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -788,7 +804,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -860,7 +878,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a specific child reference.
@@ -917,7 +937,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChildReference.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChildReference.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a file into a folder.
@@ -996,7 +1019,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChildReference.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChildReference.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a folder's children.
@@ -1075,7 +1101,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChildList.fromJson(data));
+    return _response.then(
+      (data) => ChildList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1138,7 +1166,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a comment by ID.
@@ -1202,7 +1232,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new comment on the given file.
@@ -1256,7 +1288,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a file's comments.
@@ -1334,7 +1368,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing comment.
@@ -1397,7 +1434,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing comment.
@@ -1460,7 +1499,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1515,7 +1556,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a shared drive's metadata by ID.
@@ -1571,7 +1614,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Hides a shared drive from the default view.
@@ -1619,7 +1664,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new shared drive.
@@ -1678,7 +1725,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the user's shared drives.
@@ -1747,7 +1796,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DriveList.fromJson(data));
+    return _response.then(
+      (data) => DriveList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restores a shared drive to the default view.
@@ -1795,7 +1846,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the metadata for a shared drive.
@@ -1857,7 +1910,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1996,7 +2051,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a file by ID. Skips the trash. The currently
@@ -2069,7 +2126,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Permanently deletes all of the user's trashed files.
@@ -2121,7 +2180,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Exports a Google Doc to the requested MIME type and returns the exported
@@ -2184,7 +2245,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => null);
+      return _response.then(
+        (data) => null,
+      );
     } else {
       return _response;
     }
@@ -2244,7 +2307,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GeneratedIds.fromJson(data));
+    return _response.then(
+      (data) =>
+          GeneratedIds.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a file's metadata by ID.
@@ -2356,7 +2422,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => File.fromJson(data));
+      return _response.then(
+        (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -2512,7 +2580,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the user's files.
@@ -2673,7 +2743,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FileList.fromJson(data));
+    return _response.then(
+      (data) => FileList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates file metadata and/or content. This method supports patch
@@ -2868,7 +2940,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Set the file's updated time to the current server time.
@@ -2936,7 +3010,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves a file to the trash. The currently authenticated user must own the
@@ -3010,7 +3086,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restores a file from the trash. The currently authenticated user must own
@@ -3080,7 +3158,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates file metadata and/or content.
@@ -3293,7 +3373,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Subscribe to changes on a file
@@ -3411,7 +3493,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => Channel.fromJson(data));
+      return _response.then(
+        (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -3486,7 +3570,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a specific parent reference.
@@ -3543,7 +3629,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ParentReference.fromJson(data));
+    return _response.then(
+      (data) =>
+          ParentReference.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds a parent folder for a file.
@@ -3622,7 +3711,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ParentReference.fromJson(data));
+    return _response.then(
+      (data) =>
+          ParentReference.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a file's parents.
@@ -3670,7 +3762,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ParentList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ParentList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3755,7 +3850,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a permission by ID.
@@ -3834,7 +3931,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the permission ID for an email address.
@@ -3882,7 +3982,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PermissionId.fromJson(data));
+    return _response.then(
+      (data) =>
+          PermissionId.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a permission for a file or shared drive.
@@ -3994,7 +4097,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a file's or shared drive's permissions.
@@ -4089,7 +4195,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PermissionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          PermissionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a permission using patch semantics.
@@ -4188,7 +4297,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a permission.
@@ -4287,7 +4399,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4356,7 +4471,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a property by its key.
@@ -4419,7 +4536,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Property.fromJson(data));
+    return _response.then(
+      (data) => Property.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds a property to a file, or updates it if it already exists.
@@ -4473,7 +4592,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Property.fromJson(data));
+    return _response.then(
+      (data) => Property.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a file's properties.
@@ -4521,7 +4642,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PropertyList.fromJson(data));
+    return _response.then(
+      (data) =>
+          PropertyList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a property.
@@ -4591,7 +4715,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Property.fromJson(data));
+    return _response.then(
+      (data) => Property.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a property.
@@ -4661,7 +4787,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Property.fromJson(data));
+    return _response.then(
+      (data) => Property.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4732,7 +4860,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a reply.
@@ -4804,7 +4934,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentReply.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentReply.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new reply to the given comment.
@@ -4868,7 +5001,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentReply.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentReply.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all of the replies to a comment.
@@ -4949,7 +5085,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentReplyList.fromJson(data));
+    return _response.then(
+      (data) => CommentReplyList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing reply.
@@ -5020,7 +5159,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentReply.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentReply.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing reply.
@@ -5091,7 +5233,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentReply.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentReply.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5157,7 +5302,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a specific revision.
@@ -5214,7 +5361,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Revision.fromJson(data));
+    return _response.then(
+      (data) => Revision.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a file's revisions.
@@ -5277,7 +5426,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevisionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RevisionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a revision.
@@ -5340,7 +5492,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Revision.fromJson(data));
+    return _response.then(
+      (data) => Revision.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a revision.
@@ -5403,7 +5557,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Revision.fromJson(data));
+    return _response.then(
+      (data) => Revision.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5457,7 +5613,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Deprecated use drives.get instead.
@@ -5513,7 +5671,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDrive.fromJson(data));
+    return _response.then(
+      (data) => TeamDrive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated use drives.insert instead.
@@ -5572,7 +5732,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDrive.fromJson(data));
+    return _response.then(
+      (data) => TeamDrive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated use drives.list instead.
@@ -5641,7 +5803,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDriveList.fromJson(data));
+    return _response.then(
+      (data) =>
+          TeamDriveList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated use drives.update instead.
@@ -5703,7 +5868,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDrive.fromJson(data));
+    return _response.then(
+      (data) => TeamDrive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5751,8 +5918,9 @@
   AboutAdditionalRoleInfo.fromJson(core.Map _json) {
     if (_json.containsKey('roleSets')) {
       roleSets = (_json['roleSets'] as core.List)
-          .map<AboutAdditionalRoleInfoRoleSets>(
-              (value) => AboutAdditionalRoleInfoRoleSets.fromJson(value))
+          .map<AboutAdditionalRoleInfoRoleSets>((value) =>
+              AboutAdditionalRoleInfoRoleSets.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -6107,8 +6275,9 @@
   About.fromJson(core.Map _json) {
     if (_json.containsKey('additionalRoleInfo')) {
       additionalRoleInfo = (_json['additionalRoleInfo'] as core.List)
-          .map<AboutAdditionalRoleInfo>(
-              (value) => AboutAdditionalRoleInfo.fromJson(value))
+          .map<AboutAdditionalRoleInfo>((value) =>
+              AboutAdditionalRoleInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('canCreateDrives')) {
@@ -6122,7 +6291,8 @@
     }
     if (_json.containsKey('driveThemes')) {
       driveThemes = (_json['driveThemes'] as core.List)
-          .map<AboutDriveThemes>((value) => AboutDriveThemes.fromJson(value))
+          .map<AboutDriveThemes>((value) => AboutDriveThemes.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -6130,13 +6300,14 @@
     }
     if (_json.containsKey('exportFormats')) {
       exportFormats = (_json['exportFormats'] as core.List)
-          .map<AboutExportFormats>(
-              (value) => AboutExportFormats.fromJson(value))
+          .map<AboutExportFormats>((value) => AboutExportFormats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('features')) {
       features = (_json['features'] as core.List)
-          .map<AboutFeatures>((value) => AboutFeatures.fromJson(value))
+          .map<AboutFeatures>((value) => AboutFeatures.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('folderColorPalette')) {
@@ -6146,8 +6317,8 @@
     }
     if (_json.containsKey('importFormats')) {
       importFormats = (_json['importFormats'] as core.List)
-          .map<AboutImportFormats>(
-              (value) => AboutImportFormats.fromJson(value))
+          .map<AboutImportFormats>((value) => AboutImportFormats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('isCurrentAppInstalled')) {
@@ -6164,8 +6335,8 @@
     }
     if (_json.containsKey('maxUploadSizes')) {
       maxUploadSizes = (_json['maxUploadSizes'] as core.List)
-          .map<AboutMaxUploadSizes>(
-              (value) => AboutMaxUploadSizes.fromJson(value))
+          .map<AboutMaxUploadSizes>((value) => AboutMaxUploadSizes.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -6176,8 +6347,9 @@
     }
     if (_json.containsKey('quotaBytesByService')) {
       quotaBytesByService = (_json['quotaBytesByService'] as core.List)
-          .map<AboutQuotaBytesByService>(
-              (value) => AboutQuotaBytesByService.fromJson(value))
+          .map<AboutQuotaBytesByService>((value) =>
+              AboutQuotaBytesByService.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('quotaBytesTotal')) {
@@ -6206,12 +6378,13 @@
     }
     if (_json.containsKey('teamDriveThemes')) {
       teamDriveThemes = (_json['teamDriveThemes'] as core.List)
-          .map<AboutTeamDriveThemes>(
-              (value) => AboutTeamDriveThemes.fromJson(value))
+          .map<AboutTeamDriveThemes>((value) => AboutTeamDriveThemes.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6454,7 +6627,8 @@
     }
     if (_json.containsKey('icons')) {
       icons = (_json['icons'] as core.List)
-          .map<AppIcons>((value) => AppIcons.fromJson(value))
+          .map<AppIcons>((value) =>
+              AppIcons.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -6634,7 +6808,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<App>((value) => App.fromJson(value))
+          .map<App>((value) =>
+              App.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6721,13 +6896,15 @@
       deleted = _json['deleted'] as core.bool;
     }
     if (_json.containsKey('drive')) {
-      drive = Drive.fromJson(_json['drive']);
+      drive =
+          Drive.fromJson(_json['drive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveId')) {
       driveId = _json['driveId'] as core.String;
     }
     if (_json.containsKey('file')) {
-      file = File.fromJson(_json['file']);
+      file =
+          File.fromJson(_json['file'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileId')) {
       fileId = _json['fileId'] as core.String;
@@ -6746,7 +6923,8 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('teamDrive')) {
-      teamDrive = TeamDrive.fromJson(_json['teamDrive']);
+      teamDrive = TeamDrive.fromJson(
+          _json['teamDrive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('teamDriveId')) {
       teamDriveId = _json['teamDriveId'] as core.String;
@@ -6840,7 +7018,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Change>((value) => Change.fromJson(value))
+          .map<Change>((value) =>
+              Change.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6946,7 +7125,8 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.String, core.String>(
-          _json['params'].cast<core.String, core.String>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('payload')) {
@@ -7034,7 +7214,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ChildReference>((value) => ChildReference.fromJson(value))
+          .map<ChildReference>((value) => ChildReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7221,7 +7402,8 @@
       anchor = _json['anchor'] as core.String;
     }
     if (_json.containsKey('author')) {
-      author = User.fromJson(_json['author']);
+      author =
+          User.fromJson(_json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('commentId')) {
       commentId = _json['commentId'] as core.String;
@@ -7230,7 +7412,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('context')) {
-      context = CommentContext.fromJson(_json['context']);
+      context = CommentContext.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createdDate')) {
       createdDate = core.DateTime.parse(_json['createdDate'] as core.String);
@@ -7255,7 +7438,8 @@
     }
     if (_json.containsKey('replies')) {
       replies = (_json['replies'] as core.List)
-          .map<CommentReply>((value) => CommentReply.fromJson(value))
+          .map<CommentReply>((value) => CommentReply.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selfLink')) {
@@ -7343,7 +7527,8 @@
   CommentList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Comment>((value) => Comment.fromJson(value))
+          .map<Comment>((value) =>
+              Comment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7424,7 +7609,8 @@
 
   CommentReply.fromJson(core.Map _json) {
     if (_json.containsKey('author')) {
-      author = User.fromJson(_json['author']);
+      author =
+          User.fromJson(_json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -7511,7 +7697,8 @@
   CommentReplyList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CommentReply>((value) => CommentReply.fromJson(value))
+          .map<CommentReply>((value) => CommentReply.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7582,7 +7769,8 @@
       reason = _json['reason'] as core.String;
     }
     if (_json.containsKey('restrictingUser')) {
-      restrictingUser = User.fromJson(_json['restrictingUser']);
+      restrictingUser = User.fromJson(
+          _json['restrictingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('restrictionDate')) {
       restrictionDate =
@@ -7979,14 +8167,15 @@
 
   Drive.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundImageFile')) {
-      backgroundImageFile =
-          DriveBackgroundImageFile.fromJson(_json['backgroundImageFile']);
+      backgroundImageFile = DriveBackgroundImageFile.fromJson(
+          _json['backgroundImageFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundImageLink')) {
       backgroundImageLink = _json['backgroundImageLink'] as core.String;
     }
     if (_json.containsKey('capabilities')) {
-      capabilities = DriveCapabilities.fromJson(_json['capabilities']);
+      capabilities = DriveCapabilities.fromJson(
+          _json['capabilities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorRgb')) {
       colorRgb = _json['colorRgb'] as core.String;
@@ -8007,7 +8196,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('restrictions')) {
-      restrictions = DriveRestrictions.fromJson(_json['restrictions']);
+      restrictions = DriveRestrictions.fromJson(
+          _json['restrictions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('themeId')) {
       themeId = _json['themeId'] as core.String;
@@ -8073,7 +8263,8 @@
   DriveList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Drive>((value) => Drive.fromJson(value))
+          .map<Drive>((value) =>
+              Drive.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -8608,7 +8799,8 @@
       lens = _json['lens'] as core.String;
     }
     if (_json.containsKey('location')) {
-      location = FileImageMediaMetadataLocation.fromJson(_json['location']);
+      location = FileImageMediaMetadataLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxApertureValue')) {
       maxApertureValue = (_json['maxApertureValue'] as core.num).toDouble();
@@ -9201,12 +9393,13 @@
       canReadRevisions = _json['canReadRevisions'] as core.bool;
     }
     if (_json.containsKey('capabilities')) {
-      capabilities = FileCapabilities.fromJson(_json['capabilities']);
+      capabilities = FileCapabilities.fromJson(
+          _json['capabilities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentRestrictions')) {
       contentRestrictions = (_json['contentRestrictions'] as core.List)
-          .map<ContentRestriction>(
-              (value) => ContentRestriction.fromJson(value))
+          .map<ContentRestriction>((value) => ContentRestriction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('copyRequiresWriterPermission')) {
@@ -9245,7 +9438,8 @@
     }
     if (_json.containsKey('exportLinks')) {
       exportLinks = commons.mapMap<core.String, core.String>(
-          _json['exportLinks'].cast<core.String, core.String>(),
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('fileExtension')) {
@@ -9276,11 +9470,12 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('imageMediaMetadata')) {
-      imageMediaMetadata =
-          FileImageMediaMetadata.fromJson(_json['imageMediaMetadata']);
+      imageMediaMetadata = FileImageMediaMetadata.fromJson(
+          _json['imageMediaMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indexableText')) {
-      indexableText = FileIndexableText.fromJson(_json['indexableText']);
+      indexableText = FileIndexableText.fromJson(
+          _json['indexableText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isAppAuthorized')) {
       isAppAuthorized = _json['isAppAuthorized'] as core.bool;
@@ -9289,10 +9484,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('labels')) {
-      labels = FileLabels.fromJson(_json['labels']);
+      labels = FileLabels.fromJson(
+          _json['labels'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastModifyingUser')) {
-      lastModifyingUser = User.fromJson(_json['lastModifyingUser']);
+      lastModifyingUser = User.fromJson(
+          _json['lastModifyingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastModifyingUserName')) {
       lastModifyingUserName = _json['lastModifyingUserName'] as core.String;
@@ -9320,7 +9517,8 @@
     }
     if (_json.containsKey('openWithLinks')) {
       openWithLinks = commons.mapMap<core.String, core.String>(
-          _json['openWithLinks'].cast<core.String, core.String>(),
+          (_json['openWithLinks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('originalFilename')) {
@@ -9336,12 +9534,14 @@
     }
     if (_json.containsKey('owners')) {
       owners = (_json['owners'] as core.List)
-          .map<User>((value) => User.fromJson(value))
+          .map<User>((value) =>
+              User.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parents')) {
       parents = (_json['parents'] as core.List)
-          .map<ParentReference>((value) => ParentReference.fromJson(value))
+          .map<ParentReference>((value) => ParentReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('permissionIds')) {
@@ -9351,12 +9551,14 @@
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<Permission>((value) => Permission.fromJson(value))
+          .map<Permission>((value) =>
+              Permission.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<Property>((value) => Property.fromJson(value))
+          .map<Property>((value) =>
+              Property.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('quotaBytesUsed')) {
@@ -9376,10 +9578,12 @@
           core.DateTime.parse(_json['sharedWithMeDate'] as core.String);
     }
     if (_json.containsKey('sharingUser')) {
-      sharingUser = User.fromJson(_json['sharingUser']);
+      sharingUser = User.fromJson(
+          _json['sharingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shortcutDetails')) {
-      shortcutDetails = FileShortcutDetails.fromJson(_json['shortcutDetails']);
+      shortcutDetails = FileShortcutDetails.fromJson(
+          _json['shortcutDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spaces')) {
       spaces = (_json['spaces'] as core.List)
@@ -9390,7 +9594,8 @@
       teamDriveId = _json['teamDriveId'] as core.String;
     }
     if (_json.containsKey('thumbnail')) {
-      thumbnail = FileThumbnail.fromJson(_json['thumbnail']);
+      thumbnail = FileThumbnail.fromJson(
+          _json['thumbnail'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('thumbnailLink')) {
       thumbnailLink = _json['thumbnailLink'] as core.String;
@@ -9405,17 +9610,19 @@
       trashedDate = core.DateTime.parse(_json['trashedDate'] as core.String);
     }
     if (_json.containsKey('trashingUser')) {
-      trashingUser = User.fromJson(_json['trashingUser']);
+      trashingUser = User.fromJson(
+          _json['trashingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userPermission')) {
-      userPermission = Permission.fromJson(_json['userPermission']);
+      userPermission = Permission.fromJson(
+          _json['userPermission'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
       version = _json['version'] as core.String;
     }
     if (_json.containsKey('videoMediaMetadata')) {
-      videoMediaMetadata =
-          FileVideoMediaMetadata.fromJson(_json['videoMediaMetadata']);
+      videoMediaMetadata = FileVideoMediaMetadata.fromJson(
+          _json['videoMediaMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webContentLink')) {
       webContentLink = _json['webContentLink'] as core.String;
@@ -9689,7 +9896,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<File>((value) => File.fromJson(value))
+          .map<File>((value) =>
+              File.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9797,7 +10005,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ParentReference>((value) => ParentReference.fromJson(value))
+          .map<ParentReference>((value) => ParentReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10144,8 +10353,9 @@
     }
     if (_json.containsKey('permissionDetails')) {
       permissionDetails = (_json['permissionDetails'] as core.List)
-          .map<PermissionPermissionDetails>(
-              (value) => PermissionPermissionDetails.fromJson(value))
+          .map<PermissionPermissionDetails>((value) =>
+              PermissionPermissionDetails.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('photoLink')) {
@@ -10158,11 +10368,12 @@
       selfLink = _json['selfLink'] as core.String;
     }
     if (_json.containsKey('teamDrivePermissionDetails')) {
-      teamDrivePermissionDetails = (_json['teamDrivePermissionDetails']
-              as core.List)
-          .map<PermissionTeamDrivePermissionDetails>(
-              (value) => PermissionTeamDrivePermissionDetails.fromJson(value))
-          .toList();
+      teamDrivePermissionDetails =
+          (_json['teamDrivePermissionDetails'] as core.List)
+              .map<PermissionTeamDrivePermissionDetails>((value) =>
+                  PermissionTeamDrivePermissionDetails.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -10302,7 +10513,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Permission>((value) => Permission.fromJson(value))
+          .map<Permission>((value) =>
+              Permission.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10435,7 +10647,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Property>((value) => Property.fromJson(value))
+          .map<Property>((value) =>
+              Property.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -10541,7 +10754,8 @@
     }
     if (_json.containsKey('exportLinks')) {
       exportLinks = commons.mapMap<core.String, core.String>(
-          _json['exportLinks'].cast<core.String, core.String>(),
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('fileSize')) {
@@ -10554,7 +10768,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifyingUser')) {
-      lastModifyingUser = User.fromJson(_json['lastModifyingUser']);
+      lastModifyingUser = User.fromJson(
+          _json['lastModifyingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastModifyingUserName')) {
       lastModifyingUserName = _json['lastModifyingUserName'] as core.String;
@@ -10680,7 +10895,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Revision>((value) => Revision.fromJson(value))
+          .map<Revision>((value) =>
+              Revision.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11118,14 +11334,15 @@
 
   TeamDrive.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundImageFile')) {
-      backgroundImageFile =
-          TeamDriveBackgroundImageFile.fromJson(_json['backgroundImageFile']);
+      backgroundImageFile = TeamDriveBackgroundImageFile.fromJson(
+          _json['backgroundImageFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundImageLink')) {
       backgroundImageLink = _json['backgroundImageLink'] as core.String;
     }
     if (_json.containsKey('capabilities')) {
-      capabilities = TeamDriveCapabilities.fromJson(_json['capabilities']);
+      capabilities = TeamDriveCapabilities.fromJson(
+          _json['capabilities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorRgb')) {
       colorRgb = _json['colorRgb'] as core.String;
@@ -11143,7 +11360,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('restrictions')) {
-      restrictions = TeamDriveRestrictions.fromJson(_json['restrictions']);
+      restrictions = TeamDriveRestrictions.fromJson(
+          _json['restrictions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('themeId')) {
       themeId = _json['themeId'] as core.String;
@@ -11202,7 +11420,8 @@
   TeamDriveList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TeamDrive>((value) => TeamDrive.fromJson(value))
+          .map<TeamDrive>((value) =>
+              TeamDrive.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11290,7 +11509,8 @@
       permissionId = _json['permissionId'] as core.String;
     }
     if (_json.containsKey('picture')) {
-      picture = UserPicture.fromJson(_json['picture']);
+      picture = UserPicture.fromJson(
+          _json['picture'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/drive/v3.dart b/generated/googleapis/lib/drive/v3.dart
index b40df63..92c87e7 100644
--- a/generated/googleapis/lib/drive/v3.dart
+++ b/generated/googleapis/lib/drive/v3.dart
@@ -137,7 +137,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => About.fromJson(data));
+    return _response.then(
+      (data) => About.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -211,7 +213,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StartPageToken.fromJson(data));
+    return _response.then(
+      (data) =>
+          StartPageToken.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the changes for a user or shared drive.
@@ -352,7 +357,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChangeList.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChangeList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Subscribes to changes for a user.
@@ -499,7 +507,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -553,7 +563,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -613,7 +625,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a comment.
@@ -670,7 +684,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a comment by ID.
@@ -734,7 +750,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a file's comments.
@@ -811,7 +829,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentList.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a comment with patch semantics.
@@ -874,7 +895,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -939,7 +962,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a shared drive for which the user is an organizer. The
@@ -988,7 +1013,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a shared drive's metadata by ID.
@@ -1044,7 +1071,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Hides a shared drive from the default view.
@@ -1092,7 +1121,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the user's shared drives.
@@ -1161,7 +1192,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DriveList.fromJson(data));
+    return _response.then(
+      (data) => DriveList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restores a shared drive to the default view.
@@ -1209,7 +1242,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the metadate for a shared drive.
@@ -1271,7 +1306,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Drive.fromJson(data));
+    return _response.then(
+      (data) => Drive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1387,7 +1424,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new file.
@@ -1516,7 +1555,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a file owned by the user without moving it to the
@@ -1590,7 +1631,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Permanently deletes all of the user's trashed files.
@@ -1642,7 +1685,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Exports a Google Doc to the requested MIME type and returns the exported
@@ -1705,7 +1750,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => null);
+      return _response.then(
+        (data) => null,
+      );
     } else {
       return _response;
     }
@@ -1765,7 +1812,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GeneratedIds.fromJson(data));
+    return _response.then(
+      (data) =>
+          GeneratedIds.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a file's metadata or content by ID.
@@ -1854,7 +1904,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => File.fromJson(data));
+      return _response.then(
+        (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -2014,7 +2066,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FileList.fromJson(data));
+    return _response.then(
+      (data) => FileList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a file's metadata and/or content. This method supports patch
@@ -2157,7 +2211,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => File.fromJson(data));
+    return _response.then(
+      (data) => File.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Subscribes to changes to a file
@@ -2252,7 +2308,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => Channel.fromJson(data));
+      return _response.then(
+        (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -2382,7 +2440,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a permission.
@@ -2461,7 +2522,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a permission by ID.
@@ -2540,7 +2603,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a file's or shared drive's permissions.
@@ -2635,7 +2701,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PermissionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          PermissionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a permission with patch semantics.
@@ -2734,7 +2803,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Permission.fromJson(data));
+    return _response.then(
+      (data) =>
+          Permission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2804,7 +2876,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Reply.fromJson(data));
+    return _response.then(
+      (data) => Reply.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a reply.
@@ -2869,7 +2943,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a reply by ID.
@@ -2941,7 +3017,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Reply.fromJson(data));
+    return _response.then(
+      (data) => Reply.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists a comment's replies.
@@ -3021,7 +3099,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReplyList.fromJson(data));
+    return _response.then(
+      (data) => ReplyList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a reply with patch semantics.
@@ -3092,7 +3172,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Reply.fromJson(data));
+    return _response.then(
+      (data) => Reply.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3158,7 +3240,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a revision's metadata or content by ID.
@@ -3236,7 +3320,10 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => Revision.fromJson(data));
+      return _response.then(
+        (data) =>
+            Revision.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -3302,7 +3389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevisionList.fromJson(data));
+    return _response.then(
+      (data) =>
+          RevisionList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a revision with patch semantics.
@@ -3365,7 +3455,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Revision.fromJson(data));
+    return _response.then(
+      (data) => Revision.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3430,7 +3522,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDrive.fromJson(data));
+    return _response.then(
+      (data) => TeamDrive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated use drives.delete instead.
@@ -3478,7 +3572,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Deprecated use drives.get instead.
@@ -3534,7 +3630,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDrive.fromJson(data));
+    return _response.then(
+      (data) => TeamDrive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated use drives.list instead.
@@ -3603,7 +3701,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDriveList.fromJson(data));
+    return _response.then(
+      (data) =>
+          TeamDriveList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated use drives.update instead
@@ -3665,7 +3766,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TeamDrive.fromJson(data));
+    return _response.then(
+      (data) => TeamDrive.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3854,12 +3957,14 @@
     }
     if (_json.containsKey('driveThemes')) {
       driveThemes = (_json['driveThemes'] as core.List)
-          .map<AboutDriveThemes>((value) => AboutDriveThemes.fromJson(value))
+          .map<AboutDriveThemes>((value) => AboutDriveThemes.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('exportFormats')) {
       exportFormats = commons.mapMap<core.List, core.List<core.String>>(
-          _json['exportFormats'].cast<core.String, core.List>(),
+          (_json['exportFormats'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.List>(),
           (core.List item) => (item as core.List)
               .map<core.String>((value) => value as core.String)
               .toList());
@@ -3871,7 +3976,8 @@
     }
     if (_json.containsKey('importFormats')) {
       importFormats = commons.mapMap<core.List, core.List<core.String>>(
-          _json['importFormats'].cast<core.String, core.List>(),
+          (_json['importFormats'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.List>(),
           (core.List item) => (item as core.List)
               .map<core.String>((value) => value as core.String)
               .toList());
@@ -3881,23 +3987,26 @@
     }
     if (_json.containsKey('maxImportSizes')) {
       maxImportSizes = commons.mapMap<core.String, core.String>(
-          _json['maxImportSizes'].cast<core.String, core.String>(),
+          (_json['maxImportSizes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('maxUploadSize')) {
       maxUploadSize = _json['maxUploadSize'] as core.String;
     }
     if (_json.containsKey('storageQuota')) {
-      storageQuota = AboutStorageQuota.fromJson(_json['storageQuota']);
+      storageQuota = AboutStorageQuota.fromJson(
+          _json['storageQuota'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('teamDriveThemes')) {
       teamDriveThemes = (_json['teamDriveThemes'] as core.List)
-          .map<AboutTeamDriveThemes>(
-              (value) => AboutTeamDriveThemes.fromJson(value))
+          .map<AboutTeamDriveThemes>((value) => AboutTeamDriveThemes.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3995,13 +4104,15 @@
       changeType = _json['changeType'] as core.String;
     }
     if (_json.containsKey('drive')) {
-      drive = Drive.fromJson(_json['drive']);
+      drive =
+          Drive.fromJson(_json['drive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveId')) {
       driveId = _json['driveId'] as core.String;
     }
     if (_json.containsKey('file')) {
-      file = File.fromJson(_json['file']);
+      file =
+          File.fromJson(_json['file'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileId')) {
       fileId = _json['fileId'] as core.String;
@@ -4013,7 +4124,8 @@
       removed = _json['removed'] as core.bool;
     }
     if (_json.containsKey('teamDrive')) {
-      teamDrive = TeamDrive.fromJson(_json['teamDrive']);
+      teamDrive = TeamDrive.fromJson(
+          _json['teamDrive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('teamDriveId')) {
       teamDriveId = _json['teamDriveId'] as core.String;
@@ -4090,7 +4202,8 @@
   ChangeList.fromJson(core.Map _json) {
     if (_json.containsKey('changes')) {
       changes = (_json['changes'] as core.List)
-          .map<Change>((value) => Change.fromJson(value))
+          .map<Change>((value) =>
+              Change.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4175,7 +4288,8 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.String, core.String>(
-          _json['params'].cast<core.String, core.String>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('payload')) {
@@ -4318,7 +4432,8 @@
       anchor = _json['anchor'] as core.String;
     }
     if (_json.containsKey('author')) {
-      author = User.fromJson(_json['author']);
+      author =
+          User.fromJson(_json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -4342,12 +4457,13 @@
       modifiedTime = core.DateTime.parse(_json['modifiedTime'] as core.String);
     }
     if (_json.containsKey('quotedFileContent')) {
-      quotedFileContent =
-          CommentQuotedFileContent.fromJson(_json['quotedFileContent']);
+      quotedFileContent = CommentQuotedFileContent.fromJson(
+          _json['quotedFileContent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replies')) {
       replies = (_json['replies'] as core.List)
-          .map<Reply>((value) => Reply.fromJson(value))
+          .map<Reply>((value) =>
+              Reply.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resolved')) {
@@ -4418,7 +4534,8 @@
   CommentList.fromJson(core.Map _json) {
     if (_json.containsKey('comments')) {
       comments = (_json['comments'] as core.List)
-          .map<Comment>((value) => Comment.fromJson(value))
+          .map<Comment>((value) =>
+              Comment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4477,7 +4594,8 @@
       reason = _json['reason'] as core.String;
     }
     if (_json.containsKey('restrictingUser')) {
-      restrictingUser = User.fromJson(_json['restrictingUser']);
+      restrictingUser = User.fromJson(
+          _json['restrictingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('restrictionTime')) {
       restrictionTime =
@@ -4875,14 +4993,15 @@
 
   Drive.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundImageFile')) {
-      backgroundImageFile =
-          DriveBackgroundImageFile.fromJson(_json['backgroundImageFile']);
+      backgroundImageFile = DriveBackgroundImageFile.fromJson(
+          _json['backgroundImageFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundImageLink')) {
       backgroundImageLink = _json['backgroundImageLink'] as core.String;
     }
     if (_json.containsKey('capabilities')) {
-      capabilities = DriveCapabilities.fromJson(_json['capabilities']);
+      capabilities = DriveCapabilities.fromJson(
+          _json['capabilities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorRgb')) {
       colorRgb = _json['colorRgb'] as core.String;
@@ -4903,7 +5022,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('restrictions')) {
-      restrictions = DriveRestrictions.fromJson(_json['restrictions']);
+      restrictions = DriveRestrictions.fromJson(
+          _json['restrictions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('themeId')) {
       themeId = _json['themeId'] as core.String;
@@ -4970,7 +5090,8 @@
   DriveList.fromJson(core.Map _json) {
     if (_json.containsKey('drives')) {
       drives = (_json['drives'] as core.List)
-          .map<Drive>((value) => Drive.fromJson(value))
+          .map<Drive>((value) =>
+              Drive.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -5410,7 +5531,8 @@
       indexableText = _json['indexableText'] as core.String;
     }
     if (_json.containsKey('thumbnail')) {
-      thumbnail = FileContentHintsThumbnail.fromJson(_json['thumbnail']);
+      thumbnail = FileContentHintsThumbnail.fromJson(
+          _json['thumbnail'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5573,7 +5695,8 @@
       lens = _json['lens'] as core.String;
     }
     if (_json.containsKey('location')) {
-      location = FileImageMediaMetadataLocation.fromJson(_json['location']);
+      location = FileImageMediaMetadataLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxApertureValue')) {
       maxApertureValue = (_json['maxApertureValue'] as core.num).toDouble();
@@ -5987,19 +6110,22 @@
   File.fromJson(core.Map _json) {
     if (_json.containsKey('appProperties')) {
       appProperties = commons.mapMap<core.String, core.String>(
-          _json['appProperties'].cast<core.String, core.String>(),
+          (_json['appProperties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('capabilities')) {
-      capabilities = FileCapabilities.fromJson(_json['capabilities']);
+      capabilities = FileCapabilities.fromJson(
+          _json['capabilities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentHints')) {
-      contentHints = FileContentHints.fromJson(_json['contentHints']);
+      contentHints = FileContentHints.fromJson(
+          _json['contentHints'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentRestrictions')) {
       contentRestrictions = (_json['contentRestrictions'] as core.List)
-          .map<ContentRestriction>(
-              (value) => ContentRestriction.fromJson(value))
+          .map<ContentRestriction>((value) => ContentRestriction.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('copyRequiresWriterPermission')) {
@@ -6020,7 +6146,8 @@
     }
     if (_json.containsKey('exportLinks')) {
       exportLinks = commons.mapMap<core.String, core.String>(
-          _json['exportLinks'].cast<core.String, core.String>(),
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('fileExtension')) {
@@ -6048,8 +6175,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('imageMediaMetadata')) {
-      imageMediaMetadata =
-          FileImageMediaMetadata.fromJson(_json['imageMediaMetadata']);
+      imageMediaMetadata = FileImageMediaMetadata.fromJson(
+          _json['imageMediaMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isAppAuthorized')) {
       isAppAuthorized = _json['isAppAuthorized'] as core.bool;
@@ -6058,7 +6185,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifyingUser')) {
-      lastModifyingUser = User.fromJson(_json['lastModifyingUser']);
+      lastModifyingUser = User.fromJson(
+          _json['lastModifyingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('md5Checksum')) {
       md5Checksum = _json['md5Checksum'] as core.String;
@@ -6087,7 +6215,8 @@
     }
     if (_json.containsKey('owners')) {
       owners = (_json['owners'] as core.List)
-          .map<User>((value) => User.fromJson(value))
+          .map<User>((value) =>
+              User.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parents')) {
@@ -6102,12 +6231,14 @@
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<Permission>((value) => Permission.fromJson(value))
+          .map<Permission>((value) =>
+              Permission.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.String, core.String>(
-          _json['properties'].cast<core.String, core.String>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('quotaBytesUsed')) {
@@ -6121,10 +6252,12 @@
           core.DateTime.parse(_json['sharedWithMeTime'] as core.String);
     }
     if (_json.containsKey('sharingUser')) {
-      sharingUser = User.fromJson(_json['sharingUser']);
+      sharingUser = User.fromJson(
+          _json['sharingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shortcutDetails')) {
-      shortcutDetails = FileShortcutDetails.fromJson(_json['shortcutDetails']);
+      shortcutDetails = FileShortcutDetails.fromJson(
+          _json['shortcutDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('size')) {
       size = _json['size'] as core.String;
@@ -6153,14 +6286,15 @@
       trashedTime = core.DateTime.parse(_json['trashedTime'] as core.String);
     }
     if (_json.containsKey('trashingUser')) {
-      trashingUser = User.fromJson(_json['trashingUser']);
+      trashingUser = User.fromJson(
+          _json['trashingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
       version = _json['version'] as core.String;
     }
     if (_json.containsKey('videoMediaMetadata')) {
-      videoMediaMetadata =
-          FileVideoMediaMetadata.fromJson(_json['videoMediaMetadata']);
+      videoMediaMetadata = FileVideoMediaMetadata.fromJson(
+          _json['videoMediaMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('viewedByMe')) {
       viewedByMe = _json['viewedByMe'] as core.bool;
@@ -6391,7 +6525,8 @@
   FileList.fromJson(core.Map _json) {
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
-          .map<File>((value) => File.fromJson(value))
+          .map<File>((value) =>
+              File.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('incompleteSearch')) {
@@ -6680,8 +6815,9 @@
     }
     if (_json.containsKey('permissionDetails')) {
       permissionDetails = (_json['permissionDetails'] as core.List)
-          .map<PermissionPermissionDetails>(
-              (value) => PermissionPermissionDetails.fromJson(value))
+          .map<PermissionPermissionDetails>((value) =>
+              PermissionPermissionDetails.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('photoLink')) {
@@ -6691,11 +6827,12 @@
       role = _json['role'] as core.String;
     }
     if (_json.containsKey('teamDrivePermissionDetails')) {
-      teamDrivePermissionDetails = (_json['teamDrivePermissionDetails']
-              as core.List)
-          .map<PermissionTeamDrivePermissionDetails>(
-              (value) => PermissionTeamDrivePermissionDetails.fromJson(value))
-          .toList();
+      teamDrivePermissionDetails =
+          (_json['teamDrivePermissionDetails'] as core.List)
+              .map<PermissionTeamDrivePermissionDetails>((value) =>
+                  PermissionTeamDrivePermissionDetails.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -6782,7 +6919,8 @@
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<Permission>((value) => Permission.fromJson(value))
+          .map<Permission>((value) =>
+              Permission.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6845,7 +6983,8 @@
       action = _json['action'] as core.String;
     }
     if (_json.containsKey('author')) {
-      author = User.fromJson(_json['author']);
+      author =
+          User.fromJson(_json['author'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('content')) {
       content = _json['content'] as core.String;
@@ -6930,7 +7069,8 @@
     }
     if (_json.containsKey('replies')) {
       replies = (_json['replies'] as core.List)
-          .map<Reply>((value) => Reply.fromJson(value))
+          .map<Reply>((value) =>
+              Reply.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7010,7 +7150,8 @@
   Revision.fromJson(core.Map _json) {
     if (_json.containsKey('exportLinks')) {
       exportLinks = commons.mapMap<core.String, core.String>(
-          _json['exportLinks'].cast<core.String, core.String>(),
+          (_json['exportLinks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('id')) {
@@ -7023,7 +7164,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lastModifyingUser')) {
-      lastModifyingUser = User.fromJson(_json['lastModifyingUser']);
+      lastModifyingUser = User.fromJson(
+          _json['lastModifyingUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('md5Checksum')) {
       md5Checksum = _json['md5Checksum'] as core.String;
@@ -7129,7 +7271,8 @@
     }
     if (_json.containsKey('revisions')) {
       revisions = (_json['revisions'] as core.List)
-          .map<Revision>((value) => Revision.fromJson(value))
+          .map<Revision>((value) =>
+              Revision.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7553,14 +7696,15 @@
 
   TeamDrive.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundImageFile')) {
-      backgroundImageFile =
-          TeamDriveBackgroundImageFile.fromJson(_json['backgroundImageFile']);
+      backgroundImageFile = TeamDriveBackgroundImageFile.fromJson(
+          _json['backgroundImageFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundImageLink')) {
       backgroundImageLink = _json['backgroundImageLink'] as core.String;
     }
     if (_json.containsKey('capabilities')) {
-      capabilities = TeamDriveCapabilities.fromJson(_json['capabilities']);
+      capabilities = TeamDriveCapabilities.fromJson(
+          _json['capabilities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorRgb')) {
       colorRgb = _json['colorRgb'] as core.String;
@@ -7578,7 +7722,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('restrictions')) {
-      restrictions = TeamDriveRestrictions.fromJson(_json['restrictions']);
+      restrictions = TeamDriveRestrictions.fromJson(
+          _json['restrictions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('themeId')) {
       themeId = _json['themeId'] as core.String;
@@ -7648,7 +7793,8 @@
     }
     if (_json.containsKey('teamDrives')) {
       teamDrives = (_json['teamDrives'] as core.List)
-          .map<TeamDrive>((value) => TeamDrive.fromJson(value))
+          .map<TeamDrive>((value) =>
+              TeamDrive.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/driveactivity/v2.dart b/generated/googleapis/lib/driveactivity/v2.dart
index 79f7638..c5b3eb8 100644
--- a/generated/googleapis/lib/driveactivity/v2.dart
+++ b/generated/googleapis/lib/driveactivity/v2.dart
@@ -101,7 +101,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => QueryDriveActivityResponse.fromJson(data));
+    return _response.then(
+      (data) => QueryDriveActivityResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -128,16 +131,20 @@
 
   Action.fromJson(core.Map _json) {
     if (_json.containsKey('actor')) {
-      actor = Actor.fromJson(_json['actor']);
+      actor =
+          Actor.fromJson(_json['actor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detail')) {
-      detail = ActionDetail.fromJson(_json['detail']);
+      detail = ActionDetail.fromJson(
+          _json['detail'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('target')) {
-      target = Target.fromJson(_json['target']);
+      target = Target.fromJson(
+          _json['target'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeRange')) {
-      timeRange = TimeRange.fromJson(_json['timeRange']);
+      timeRange = TimeRange.fromJson(
+          _json['timeRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
@@ -204,37 +211,48 @@
 
   ActionDetail.fromJson(core.Map _json) {
     if (_json.containsKey('comment')) {
-      comment = Comment.fromJson(_json['comment']);
+      comment = Comment.fromJson(
+          _json['comment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('create')) {
-      create = Create.fromJson(_json['create']);
+      create = Create.fromJson(
+          _json['create'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delete')) {
-      delete = Delete.fromJson(_json['delete']);
+      delete = Delete.fromJson(
+          _json['delete'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dlpChange')) {
-      dlpChange = DataLeakPreventionChange.fromJson(_json['dlpChange']);
+      dlpChange = DataLeakPreventionChange.fromJson(
+          _json['dlpChange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('edit')) {
-      edit = Edit.fromJson(_json['edit']);
+      edit =
+          Edit.fromJson(_json['edit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('move')) {
-      move = Move.fromJson(_json['move']);
+      move =
+          Move.fromJson(_json['move'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('permissionChange')) {
-      permissionChange = PermissionChange.fromJson(_json['permissionChange']);
+      permissionChange = PermissionChange.fromJson(
+          _json['permissionChange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reference')) {
-      reference = ApplicationReference.fromJson(_json['reference']);
+      reference = ApplicationReference.fromJson(
+          _json['reference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rename')) {
-      rename = Rename.fromJson(_json['rename']);
+      rename = Rename.fromJson(
+          _json['rename'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('restore')) {
-      restore = Restore.fromJson(_json['restore']);
+      restore = Restore.fromJson(
+          _json['restore'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('settingsChange')) {
-      settingsChange = SettingsChange.fromJson(_json['settingsChange']);
+      settingsChange = SettingsChange.fromJson(
+          _json['settingsChange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -298,19 +316,24 @@
 
   Actor.fromJson(core.Map _json) {
     if (_json.containsKey('administrator')) {
-      administrator = Administrator.fromJson(_json['administrator']);
+      administrator = Administrator.fromJson(
+          _json['administrator'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('anonymous')) {
-      anonymous = AnonymousUser.fromJson(_json['anonymous']);
+      anonymous = AnonymousUser.fromJson(
+          _json['anonymous'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('impersonation')) {
-      impersonation = Impersonation.fromJson(_json['impersonation']);
+      impersonation = Impersonation.fromJson(
+          _json['impersonation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('system')) {
-      system = SystemEvent.fromJson(_json['system']);
+      system = SystemEvent.fromJson(
+          _json['system'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -425,7 +448,8 @@
 
   Assignment.fromJson(core.Map _json) {
     if (_json.containsKey('assignedUser')) {
-      assignedUser = User.fromJson(_json['assignedUser']);
+      assignedUser = User.fromJson(
+          _json['assignedUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subtype')) {
       subtype = _json['subtype'] as core.String;
@@ -462,18 +486,22 @@
 
   Comment.fromJson(core.Map _json) {
     if (_json.containsKey('assignment')) {
-      assignment = Assignment.fromJson(_json['assignment']);
+      assignment = Assignment.fromJson(
+          _json['assignment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mentionedUsers')) {
       mentionedUsers = (_json['mentionedUsers'] as core.List)
-          .map<User>((value) => User.fromJson(value))
+          .map<User>((value) =>
+              User.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('post')) {
-      post = Post.fromJson(_json['post']);
+      post =
+          Post.fromJson(_json['post'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestion')) {
-      suggestion = Suggestion.fromJson(_json['suggestion']);
+      suggestion = Suggestion.fromJson(
+          _json['suggestion'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -512,10 +540,12 @@
 
   ConsolidationStrategy.fromJson(core.Map _json) {
     if (_json.containsKey('legacy')) {
-      legacy = Legacy.fromJson(_json['legacy']);
+      legacy = Legacy.fromJson(
+          _json['legacy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('none')) {
-      none = NoConsolidation.fromJson(_json['none']);
+      none = NoConsolidation.fromJson(
+          _json['none'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -540,7 +570,8 @@
 
   Copy.fromJson(core.Map _json) {
     if (_json.containsKey('originalObject')) {
-      originalObject = TargetReference.fromJson(_json['originalObject']);
+      originalObject = TargetReference.fromJson(
+          _json['originalObject'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -571,13 +602,15 @@
 
   Create.fromJson(core.Map _json) {
     if (_json.containsKey('copy')) {
-      copy = Copy.fromJson(_json['copy']);
+      copy =
+          Copy.fromJson(_json['copy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('new')) {
-      new_ = New.fromJson(_json['new']);
+      new_ = New.fromJson(_json['new'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('upload')) {
-      upload = Upload.fromJson(_json['upload']);
+      upload = Upload.fromJson(
+          _json['upload'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -715,7 +748,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('root')) {
-      root = DriveItem.fromJson(_json['root']);
+      root = DriveItem.fromJson(
+          _json['root'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -771,24 +805,29 @@
   DriveActivity.fromJson(core.Map _json) {
     if (_json.containsKey('actions')) {
       actions = (_json['actions'] as core.List)
-          .map<Action>((value) => Action.fromJson(value))
+          .map<Action>((value) =>
+              Action.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('actors')) {
       actors = (_json['actors'] as core.List)
-          .map<Actor>((value) => Actor.fromJson(value))
+          .map<Actor>((value) =>
+              Actor.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('primaryActionDetail')) {
-      primaryActionDetail = ActionDetail.fromJson(_json['primaryActionDetail']);
+      primaryActionDetail = ActionDetail.fromJson(
+          _json['primaryActionDetail'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targets')) {
       targets = (_json['targets'] as core.List)
-          .map<Target>((value) => Target.fromJson(value))
+          .map<Target>((value) =>
+              Target.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeRange')) {
-      timeRange = TimeRange.fromJson(_json['timeRange']);
+      timeRange = TimeRange.fromJson(
+          _json['timeRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
@@ -891,16 +930,20 @@
 
   DriveItem.fromJson(core.Map _json) {
     if (_json.containsKey('driveFile')) {
-      driveFile = DriveFile.fromJson(_json['driveFile']);
+      driveFile = DriveFile.fromJson(
+          _json['driveFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveFolder')) {
-      driveFolder = DriveFolder.fromJson(_json['driveFolder']);
+      driveFolder = DriveFolder.fromJson(
+          _json['driveFolder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('file')) {
-      file = File.fromJson(_json['file']);
+      file =
+          File.fromJson(_json['file'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('folder')) {
-      folder = Folder.fromJson(_json['folder']);
+      folder = Folder.fromJson(
+          _json['folder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -909,7 +952,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('owner')) {
-      owner = Owner.fromJson(_json['owner']);
+      owner =
+          Owner.fromJson(_json['owner'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -970,16 +1014,20 @@
 
   DriveItemReference.fromJson(core.Map _json) {
     if (_json.containsKey('driveFile')) {
-      driveFile = DriveFile.fromJson(_json['driveFile']);
+      driveFile = DriveFile.fromJson(
+          _json['driveFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveFolder')) {
-      driveFolder = DriveFolder.fromJson(_json['driveFolder']);
+      driveFolder = DriveFolder.fromJson(
+          _json['driveFolder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('file')) {
-      file = File.fromJson(_json['file']);
+      file =
+          File.fromJson(_json['file'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('folder')) {
-      folder = Folder.fromJson(_json['folder']);
+      folder = Folder.fromJson(
+          _json['folder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1107,7 +1155,8 @@
       linkToDiscussion = _json['linkToDiscussion'] as core.String;
     }
     if (_json.containsKey('parent')) {
-      parent = DriveItem.fromJson(_json['parent']);
+      parent = DriveItem.fromJson(
+          _json['parent'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1201,7 +1250,8 @@
 
   Impersonation.fromJson(core.Map _json) {
     if (_json.containsKey('impersonatedUser')) {
-      impersonatedUser = User.fromJson(_json['impersonatedUser']);
+      impersonatedUser = User.fromJson(
+          _json['impersonatedUser'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1278,12 +1328,14 @@
   Move.fromJson(core.Map _json) {
     if (_json.containsKey('addedParents')) {
       addedParents = (_json['addedParents'] as core.List)
-          .map<TargetReference>((value) => TargetReference.fromJson(value))
+          .map<TargetReference>((value) => TargetReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('removedParents')) {
       removedParents = (_json['removedParents'] as core.List)
-          .map<TargetReference>((value) => TargetReference.fromJson(value))
+          .map<TargetReference>((value) => TargetReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1348,16 +1400,20 @@
 
   Owner.fromJson(core.Map _json) {
     if (_json.containsKey('domain')) {
-      domain = Domain.fromJson(_json['domain']);
+      domain = Domain.fromJson(
+          _json['domain'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('drive')) {
-      drive = DriveReference.fromJson(_json['drive']);
+      drive = DriveReference.fromJson(
+          _json['drive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('teamDrive')) {
-      teamDrive = TeamDriveReference.fromJson(_json['teamDrive']);
+      teamDrive = TeamDriveReference.fromJson(
+          _json['teamDrive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1424,19 +1480,23 @@
       allowDiscovery = _json['allowDiscovery'] as core.bool;
     }
     if (_json.containsKey('anyone')) {
-      anyone = Anyone.fromJson(_json['anyone']);
+      anyone = Anyone.fromJson(
+          _json['anyone'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('domain')) {
-      domain = Domain.fromJson(_json['domain']);
+      domain = Domain.fromJson(
+          _json['domain'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('group')) {
-      group = Group.fromJson(_json['group']);
+      group =
+          Group.fromJson(_json['group'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('role')) {
       role = _json['role'] as core.String;
     }
     if (_json.containsKey('user')) {
-      user = User.fromJson(_json['user']);
+      user =
+          User.fromJson(_json['user'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1477,12 +1537,14 @@
   PermissionChange.fromJson(core.Map _json) {
     if (_json.containsKey('addedPermissions')) {
       addedPermissions = (_json['addedPermissions'] as core.List)
-          .map<Permission>((value) => Permission.fromJson(value))
+          .map<Permission>((value) =>
+              Permission.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('removedPermissions')) {
       removedPermissions = (_json['removedPermissions'] as core.List)
-          .map<Permission>((value) => Permission.fromJson(value))
+          .map<Permission>((value) =>
+              Permission.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1575,8 +1637,9 @@
       ancestorName = _json['ancestorName'] as core.String;
     }
     if (_json.containsKey('consolidationStrategy')) {
-      consolidationStrategy =
-          ConsolidationStrategy.fromJson(_json['consolidationStrategy']);
+      consolidationStrategy = ConsolidationStrategy.fromJson(
+          _json['consolidationStrategy']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filter')) {
       filter = _json['filter'] as core.String;
@@ -1630,7 +1693,8 @@
   QueryDriveActivityResponse.fromJson(core.Map _json) {
     if (_json.containsKey('activities')) {
       activities = (_json['activities'] as core.List)
-          .map<DriveActivity>((value) => DriveActivity.fromJson(value))
+          .map<DriveActivity>((value) => DriveActivity.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1762,7 +1826,8 @@
   SettingsChange.fromJson(core.Map _json) {
     if (_json.containsKey('restrictionChanges')) {
       restrictionChanges = (_json['restrictionChanges'] as core.List)
-          .map<RestrictionChange>((value) => RestrictionChange.fromJson(value))
+          .map<RestrictionChange>((value) => RestrictionChange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1855,16 +1920,20 @@
 
   Target.fromJson(core.Map _json) {
     if (_json.containsKey('drive')) {
-      drive = Drive.fromJson(_json['drive']);
+      drive =
+          Drive.fromJson(_json['drive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveItem')) {
-      driveItem = DriveItem.fromJson(_json['driveItem']);
+      driveItem = DriveItem.fromJson(
+          _json['driveItem'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fileComment')) {
-      fileComment = FileComment.fromJson(_json['fileComment']);
+      fileComment = FileComment.fromJson(
+          _json['fileComment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('teamDrive')) {
-      teamDrive = TeamDrive.fromJson(_json['teamDrive']);
+      teamDrive = TeamDrive.fromJson(
+          _json['teamDrive'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1901,13 +1970,16 @@
 
   TargetReference.fromJson(core.Map _json) {
     if (_json.containsKey('drive')) {
-      drive = DriveReference.fromJson(_json['drive']);
+      drive = DriveReference.fromJson(
+          _json['drive'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('driveItem')) {
-      driveItem = DriveItemReference.fromJson(_json['driveItem']);
+      driveItem = DriveItemReference.fromJson(
+          _json['driveItem'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('teamDrive')) {
-      teamDrive = TeamDriveReference.fromJson(_json['teamDrive']);
+      teamDrive = TeamDriveReference.fromJson(
+          _json['teamDrive'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1944,7 +2016,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('root')) {
-      root = DriveItem.fromJson(_json['root']);
+      root = DriveItem.fromJson(
+          _json['root'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -2071,13 +2144,16 @@
 
   User.fromJson(core.Map _json) {
     if (_json.containsKey('deletedUser')) {
-      deletedUser = DeletedUser.fromJson(_json['deletedUser']);
+      deletedUser = DeletedUser.fromJson(
+          _json['deletedUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('knownUser')) {
-      knownUser = KnownUser.fromJson(_json['knownUser']);
+      knownUser = KnownUser.fromJson(
+          _json['knownUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unknownUser')) {
-      unknownUser = UnknownUser.fromJson(_json['unknownUser']);
+      unknownUser = UnknownUser.fromJson(
+          _json['unknownUser'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/fcm/v1.dart b/generated/googleapis/lib/fcm/v1.dart
index 4a92971..2efd17b 100644
--- a/generated/googleapis/lib/fcm/v1.dart
+++ b/generated/googleapis/lib/fcm/v1.dart
@@ -122,7 +122,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -193,17 +195,20 @@
     }
     if (_json.containsKey('data')) {
       data = commons.mapMap<core.String, core.String>(
-          _json['data'].cast<core.String, core.String>(),
+          (_json['data'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('directBootOk')) {
       directBootOk = _json['directBootOk'] as core.bool;
     }
     if (_json.containsKey('fcmOptions')) {
-      fcmOptions = AndroidFcmOptions.fromJson(_json['fcmOptions']);
+      fcmOptions = AndroidFcmOptions.fromJson(
+          _json['fcmOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('notification')) {
-      notification = AndroidNotification.fromJson(_json['notification']);
+      notification = AndroidNotification.fromJson(
+          _json['notification'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('priority')) {
       priority = _json['priority'] as core.String;
@@ -492,7 +497,8 @@
       image = _json['image'] as core.String;
     }
     if (_json.containsKey('lightSettings')) {
-      lightSettings = LightSettings.fromJson(_json['lightSettings']);
+      lightSettings = LightSettings.fromJson(
+          _json['lightSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('localOnly')) {
       localOnly = _json['localOnly'] as core.bool;
@@ -642,16 +648,19 @@
 
   ApnsConfig.fromJson(core.Map _json) {
     if (_json.containsKey('fcmOptions')) {
-      fcmOptions = ApnsFcmOptions.fromJson(_json['fcmOptions']);
+      fcmOptions = ApnsFcmOptions.fromJson(
+          _json['fcmOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('payload')) {
       payload = commons.mapMap<core.Object, core.Object>(
-          _json['payload'].cast<core.String, core.Object>(),
+          (_json['payload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -850,7 +859,8 @@
 
   LightSettings.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lightOffDuration')) {
       lightOffDuration = _json['lightOffDuration'] as core.String;
@@ -919,27 +929,32 @@
 
   Message.fromJson(core.Map _json) {
     if (_json.containsKey('android')) {
-      android = AndroidConfig.fromJson(_json['android']);
+      android = AndroidConfig.fromJson(
+          _json['android'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('apns')) {
-      apns = ApnsConfig.fromJson(_json['apns']);
+      apns = ApnsConfig.fromJson(
+          _json['apns'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('condition')) {
       condition = _json['condition'] as core.String;
     }
     if (_json.containsKey('data')) {
       data = commons.mapMap<core.String, core.String>(
-          _json['data'].cast<core.String, core.String>(),
+          (_json['data'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('fcmOptions')) {
-      fcmOptions = FcmOptions.fromJson(_json['fcmOptions']);
+      fcmOptions = FcmOptions.fromJson(
+          _json['fcmOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('notification')) {
-      notification = Notification.fromJson(_json['notification']);
+      notification = Notification.fromJson(
+          _json['notification'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('token')) {
       token = _json['token'] as core.String;
@@ -948,7 +963,8 @@
       topic = _json['topic'] as core.String;
     }
     if (_json.containsKey('webpush')) {
-      webpush = WebpushConfig.fromJson(_json['webpush']);
+      webpush = WebpushConfig.fromJson(
+          _json['webpush'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1045,7 +1061,8 @@
 
   SendMessageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('validateOnly')) {
       validateOnly = _json['validateOnly'] as core.bool;
@@ -1094,20 +1111,24 @@
   WebpushConfig.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
       data = commons.mapMap<core.String, core.String>(
-          _json['data'].cast<core.String, core.String>(),
+          (_json['data'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('fcmOptions')) {
-      fcmOptions = WebpushFcmOptions.fromJson(_json['fcmOptions']);
+      fcmOptions = WebpushFcmOptions.fromJson(
+          _json['fcmOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('notification')) {
       notification = commons.mapMap<core.Object, core.Object>(
-          _json['notification'].cast<core.String, core.Object>(),
+          (_json['notification'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
diff --git a/generated/googleapis/lib/file/v1.dart b/generated/googleapis/lib/file/v1.dart
index f34179f..2d4408f 100644
--- a/generated/googleapis/lib/file/v1.dart
+++ b/generated/googleapis/lib/file/v1.dart
@@ -114,7 +114,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -191,7 +193,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -263,7 +268,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an instance.
@@ -314,7 +321,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a specific instance.
@@ -365,7 +374,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Instance.fromJson(data));
+    return _response.then(
+      (data) => Instance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all instances in a project for either a specified location or for
@@ -446,7 +457,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInstancesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the settings of a specific instance.
@@ -511,7 +525,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -582,7 +598,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -635,7 +653,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -687,7 +707,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -763,7 +785,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -923,33 +948,39 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('maintenancePolicyNames')) {
       maintenancePolicyNames = commons.mapMap<core.String, core.String>(
-          _json['maintenancePolicyNames'].cast<core.String, core.String>(),
+          (_json['maintenancePolicyNames']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('maintenanceSchedules')) {
       maintenanceSchedules = commons.mapMap<core.Map,
               GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule>(
-          _json['maintenanceSchedules'].cast<core.String, core.Map>(),
+          (_json['maintenanceSchedules'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
           (core.Map item) =>
               GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-                  .fromJson(item));
+                  .fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('maintenanceSettings')) {
       maintenanceSettings =
           GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings
-              .fromJson(_json['maintenanceSettings']);
+              .fromJson(_json['maintenanceSettings']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('producerMetadata')) {
       producerMetadata = commons.mapMap<core.String, core.String>(
-          _json['producerMetadata'].cast<core.String, core.String>(),
+          (_json['producerMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('provisionedResources')) {
@@ -957,7 +988,7 @@
           .map<GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('slmInstanceTemplate')) {
@@ -966,11 +997,12 @@
     if (_json.containsKey('sloMetadata')) {
       sloMetadata =
           GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata.fromJson(
-              _json['sloMetadata']);
+              _json['sloMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareVersions')) {
       softwareVersions = commons.mapMap<core.String, core.String>(
-          _json['softwareVersions'].cast<core.String, core.String>(),
+          (_json['softwareVersions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('state')) {
@@ -1151,7 +1183,7 @@
           .map<GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('location')) {
@@ -1350,14 +1382,15 @@
     if (_json.containsKey('eligibility')) {
       eligibility =
           GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
-              .fromJson(_json['eligibility']);
+              .fromJson(
+                  _json['eligibility'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exclusions')) {
       exclusions = (_json['exclusions'] as core.List)
           .map<GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nodes')) {
@@ -1365,7 +1398,7 @@
           .map<GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tier')) {
@@ -1464,12 +1497,14 @@
     }
     if (_json.containsKey('fileShares')) {
       fileShares = (_json['fileShares'] as core.List)
-          .map<FileShareConfig>((value) => FileShareConfig.fromJson(value))
+          .map<FileShareConfig>((value) => FileShareConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -1477,7 +1512,8 @@
     }
     if (_json.containsKey('networks')) {
       networks = (_json['networks'] as core.List)
-          .map<NetworkConfig>((value) => NetworkConfig.fromJson(value))
+          .map<NetworkConfig>((value) => NetworkConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
@@ -1548,7 +1584,8 @@
   ListInstancesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1589,7 +1626,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1625,7 +1663,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1674,7 +1713,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1682,7 +1722,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1818,11 +1859,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1830,7 +1873,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1968,7 +2012,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/firebasedynamiclinks/v1.dart b/generated/googleapis/lib/firebasedynamiclinks/v1.dart
index d1c4b45..02980c4 100644
--- a/generated/googleapis/lib/firebasedynamiclinks/v1.dart
+++ b/generated/googleapis/lib/firebasedynamiclinks/v1.dart
@@ -108,8 +108,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CreateManagedShortLinkResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateManagedShortLinkResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -168,8 +170,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CreateShortDynamicLinkResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateShortDynamicLinkResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -238,7 +242,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DynamicLinkStats.fromJson(data));
+    return _response.then(
+      (data) => DynamicLinkStats.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get iOS strong/weak-match info for post-install attribution.
@@ -286,8 +293,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetIosPostInstallAttributionResponse.fromJson(data));
+    return _response.then(
+      (data) => GetIosPostInstallAttributionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get iOS reopen attribution for app universal link open deeplinking.
@@ -335,8 +344,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetIosReopenAttributionResponse.fromJson(data));
+    return _response.then(
+      (data) => GetIosReopenAttributionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -352,12 +363,13 @@
 
   AnalyticsInfo.fromJson(core.Map _json) {
     if (_json.containsKey('googlePlayAnalytics')) {
-      googlePlayAnalytics =
-          GooglePlayAnalytics.fromJson(_json['googlePlayAnalytics']);
+      googlePlayAnalytics = GooglePlayAnalytics.fromJson(
+          _json['googlePlayAnalytics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('itunesConnectAnalytics')) {
-      itunesConnectAnalytics =
-          ITunesConnectAnalytics.fromJson(_json['itunesConnectAnalytics']);
+      itunesConnectAnalytics = ITunesConnectAnalytics.fromJson(
+          _json['itunesConnectAnalytics']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -452,7 +464,8 @@
 
   CreateManagedShortLinkRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dynamicLinkInfo')) {
-      dynamicLinkInfo = DynamicLinkInfo.fromJson(_json['dynamicLinkInfo']);
+      dynamicLinkInfo = DynamicLinkInfo.fromJson(
+          _json['dynamicLinkInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('longDynamicLink')) {
       longDynamicLink = _json['longDynamicLink'] as core.String;
@@ -464,7 +477,8 @@
       sdkVersion = _json['sdkVersion'] as core.String;
     }
     if (_json.containsKey('suffix')) {
-      suffix = Suffix.fromJson(_json['suffix']);
+      suffix = Suffix.fromJson(
+          _json['suffix'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -504,15 +518,16 @@
 
   CreateManagedShortLinkResponse.fromJson(core.Map _json) {
     if (_json.containsKey('managedShortLink')) {
-      managedShortLink = ManagedShortLink.fromJson(_json['managedShortLink']);
+      managedShortLink = ManagedShortLink.fromJson(
+          _json['managedShortLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('previewLink')) {
       previewLink = _json['previewLink'] as core.String;
     }
     if (_json.containsKey('warning')) {
       warning = (_json['warning'] as core.List)
-          .map<DynamicLinkWarning>(
-              (value) => DynamicLinkWarning.fromJson(value))
+          .map<DynamicLinkWarning>((value) => DynamicLinkWarning.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -555,7 +570,8 @@
 
   CreateShortDynamicLinkRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dynamicLinkInfo')) {
-      dynamicLinkInfo = DynamicLinkInfo.fromJson(_json['dynamicLinkInfo']);
+      dynamicLinkInfo = DynamicLinkInfo.fromJson(
+          _json['dynamicLinkInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('longDynamicLink')) {
       longDynamicLink = _json['longDynamicLink'] as core.String;
@@ -564,7 +580,8 @@
       sdkVersion = _json['sdkVersion'] as core.String;
     }
     if (_json.containsKey('suffix')) {
-      suffix = Suffix.fromJson(_json['suffix']);
+      suffix = Suffix.fromJson(
+          _json['suffix'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -608,8 +625,8 @@
     }
     if (_json.containsKey('warning')) {
       warning = (_json['warning'] as core.List)
-          .map<DynamicLinkWarning>(
-              (value) => DynamicLinkWarning.fromJson(value))
+          .map<DynamicLinkWarning>((value) => DynamicLinkWarning.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -837,13 +854,16 @@
 
   DynamicLinkInfo.fromJson(core.Map _json) {
     if (_json.containsKey('analyticsInfo')) {
-      analyticsInfo = AnalyticsInfo.fromJson(_json['analyticsInfo']);
+      analyticsInfo = AnalyticsInfo.fromJson(
+          _json['analyticsInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('androidInfo')) {
-      androidInfo = AndroidInfo.fromJson(_json['androidInfo']);
+      androidInfo = AndroidInfo.fromJson(
+          _json['androidInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('desktopInfo')) {
-      desktopInfo = DesktopInfo.fromJson(_json['desktopInfo']);
+      desktopInfo = DesktopInfo.fromJson(
+          _json['desktopInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('domainUriPrefix')) {
       domainUriPrefix = _json['domainUriPrefix'] as core.String;
@@ -852,17 +872,19 @@
       dynamicLinkDomain = _json['dynamicLinkDomain'] as core.String;
     }
     if (_json.containsKey('iosInfo')) {
-      iosInfo = IosInfo.fromJson(_json['iosInfo']);
+      iosInfo = IosInfo.fromJson(
+          _json['iosInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
       link = _json['link'] as core.String;
     }
     if (_json.containsKey('navigationInfo')) {
-      navigationInfo = NavigationInfo.fromJson(_json['navigationInfo']);
+      navigationInfo = NavigationInfo.fromJson(
+          _json['navigationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('socialMetaTagInfo')) {
-      socialMetaTagInfo =
-          SocialMetaTagInfo.fromJson(_json['socialMetaTagInfo']);
+      socialMetaTagInfo = SocialMetaTagInfo.fromJson(
+          _json['socialMetaTagInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -909,8 +931,8 @@
   DynamicLinkStats.fromJson(core.Map _json) {
     if (_json.containsKey('linkEventStats')) {
       linkEventStats = (_json['linkEventStats'] as core.List)
-          .map<DynamicLinkEventStat>(
-              (value) => DynamicLinkEventStat.fromJson(value))
+          .map<DynamicLinkEventStat>((value) => DynamicLinkEventStat.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1067,7 +1089,8 @@
       bundleId = _json['bundleId'] as core.String;
     }
     if (_json.containsKey('device')) {
-      device = DeviceInfo.fromJson(_json['device']);
+      device = DeviceInfo.fromJson(
+          _json['device'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iosVersion')) {
       iosVersion = _json['iosVersion'] as core.String;
@@ -1688,7 +1711,8 @@
           .toList();
     }
     if (_json.containsKey('info')) {
-      info = DynamicLinkInfo.fromJson(_json['info']);
+      info = DynamicLinkInfo.fromJson(
+          _json['info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
       link = _json['link'] as core.String;
diff --git a/generated/googleapis/lib/firebaserules/v1.dart b/generated/googleapis/lib/firebaserules/v1.dart
index f6e3879..bbffe22 100644
--- a/generated/googleapis/lib/firebaserules/v1.dart
+++ b/generated/googleapis/lib/firebaserules/v1.dart
@@ -132,7 +132,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestRulesetResponse.fromJson(data));
+    return _response.then(
+      (data) => TestRulesetResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -209,7 +212,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Release.fromJson(data));
+    return _response.then(
+      (data) => Release.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a `Release` by resource name.
@@ -259,7 +264,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a `Release` by name.
@@ -309,7 +316,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Release.fromJson(data));
+    return _response.then(
+      (data) => Release.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the `Release` executable to use when enforcing rules.
@@ -375,8 +384,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetReleaseExecutableResponse.fromJson(data));
+    return _response.then(
+      (data) => GetReleaseExecutableResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List the `Release` values for a project. This list may optionally be
@@ -464,7 +475,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListReleasesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListReleasesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a `Release` via PATCH. Only updates to the `ruleset_name` and
@@ -522,7 +536,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Release.fromJson(data));
+    return _response.then(
+      (data) => Release.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -589,7 +605,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Ruleset.fromJson(data));
+    return _response.then(
+      (data) => Ruleset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a `Ruleset` by resource name. If the `Ruleset` is referenced by a
@@ -640,7 +658,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a `Ruleset` by name including the full `Source` contents.
@@ -690,7 +710,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Ruleset.fromJson(data));
+    return _response.then(
+      (data) => Ruleset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List `Ruleset` metadata only and optionally filter the results by
@@ -767,7 +789,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRulesetsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRulesetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -786,7 +811,8 @@
 
   Arg.fromJson(core.Map _json) {
     if (_json.containsKey('anyValue')) {
-      anyValue = Empty.fromJson(_json['anyValue']);
+      anyValue = Empty.fromJson(
+          _json['anyValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exactValue')) {
       exactValue = _json['exactValue'] as core.Object;
@@ -840,15 +866,18 @@
   ExpressionReport.fromJson(core.Map _json) {
     if (_json.containsKey('children')) {
       children = (_json['children'] as core.List)
-          .map<ExpressionReport>((value) => ExpressionReport.fromJson(value))
+          .map<ExpressionReport>((value) => ExpressionReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourcePosition')) {
-      sourcePosition = SourcePosition.fromJson(_json['sourcePosition']);
+      sourcePosition = SourcePosition.fromJson(
+          _json['sourcePosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<ValueCount>((value) => ValueCount.fromJson(value))
+          .map<ValueCount>((value) =>
+              ValueCount.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -977,14 +1006,16 @@
   FunctionMock.fromJson(core.Map _json) {
     if (_json.containsKey('args')) {
       args = (_json['args'] as core.List)
-          .map<Arg>((value) => Arg.fromJson(value))
+          .map<Arg>((value) =>
+              Arg.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('function')) {
       function = _json['function'] as core.String;
     }
     if (_json.containsKey('result')) {
-      result = Result.fromJson(_json['result']);
+      result = Result.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1119,7 +1150,8 @@
       severity = _json['severity'] as core.String;
     }
     if (_json.containsKey('sourcePosition')) {
-      sourcePosition = SourcePosition.fromJson(_json['sourcePosition']);
+      sourcePosition = SourcePosition.fromJson(
+          _json['sourcePosition'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1155,7 +1187,8 @@
     }
     if (_json.containsKey('releases')) {
       releases = (_json['releases'] as core.List)
-          .map<Release>((value) => Release.fromJson(value))
+          .map<Release>((value) =>
+              Release.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1189,7 +1222,8 @@
     }
     if (_json.containsKey('rulesets')) {
       rulesets = (_json['rulesets'] as core.List)
-          .map<Ruleset>((value) => Ruleset.fromJson(value))
+          .map<Ruleset>((value) =>
+              Ruleset.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1313,7 +1347,8 @@
 
   Result.fromJson(core.Map _json) {
     if (_json.containsKey('undefined')) {
-      undefined = Empty.fromJson(_json['undefined']);
+      undefined = Empty.fromJson(
+          _json['undefined'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.Object;
@@ -1355,13 +1390,15 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = Metadata.fromJson(_json['metadata']);
+      metadata = Metadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1393,7 +1430,8 @@
   Source.fromJson(core.Map _json) {
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
-          .map<File>((value) => File.fromJson(value))
+          .map<File>((value) =>
+              File.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1537,7 +1575,8 @@
     }
     if (_json.containsKey('functionMocks')) {
       functionMocks = (_json['functionMocks'] as core.List)
-          .map<FunctionMock>((value) => FunctionMock.fromJson(value))
+          .map<FunctionMock>((value) => FunctionMock.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pathEncoding')) {
@@ -1628,16 +1667,19 @@
           .toList();
     }
     if (_json.containsKey('errorPosition')) {
-      errorPosition = SourcePosition.fromJson(_json['errorPosition']);
+      errorPosition = SourcePosition.fromJson(
+          _json['errorPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('expressionReports')) {
       expressionReports = (_json['expressionReports'] as core.List)
-          .map<ExpressionReport>((value) => ExpressionReport.fromJson(value))
+          .map<ExpressionReport>((value) => ExpressionReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('functionCalls')) {
       functionCalls = (_json['functionCalls'] as core.List)
-          .map<FunctionCall>((value) => FunctionCall.fromJson(value))
+          .map<FunctionCall>((value) => FunctionCall.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('state')) {
@@ -1645,7 +1687,8 @@
     }
     if (_json.containsKey('visitedExpressions')) {
       visitedExpressions = (_json['visitedExpressions'] as core.List)
-          .map<VisitedExpression>((value) => VisitedExpression.fromJson(value))
+          .map<VisitedExpression>((value) => VisitedExpression.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1690,10 +1733,12 @@
 
   TestRulesetRequest.fromJson(core.Map _json) {
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('testSuite')) {
-      testSuite = TestSuite.fromJson(_json['testSuite']);
+      testSuite = TestSuite.fromJson(
+          _json['testSuite'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1725,12 +1770,14 @@
   TestRulesetResponse.fromJson(core.Map _json) {
     if (_json.containsKey('issues')) {
       issues = (_json['issues'] as core.List)
-          .map<Issue>((value) => Issue.fromJson(value))
+          .map<Issue>((value) =>
+              Issue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('testResults')) {
       testResults = (_json['testResults'] as core.List)
-          .map<TestResult>((value) => TestResult.fromJson(value))
+          .map<TestResult>((value) =>
+              TestResult.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1761,7 +1808,8 @@
   TestSuite.fromJson(core.Map _json) {
     if (_json.containsKey('testCases')) {
       testCases = (_json['testCases'] as core.List)
-          .map<TestCase>((value) => TestCase.fromJson(value))
+          .map<TestCase>((value) =>
+              TestCase.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1787,7 +1835,8 @@
 
   UpdateReleaseRequest.fromJson(core.Map _json) {
     if (_json.containsKey('release')) {
-      release = Release.fromJson(_json['release']);
+      release = Release.fromJson(
+          _json['release'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -1856,7 +1905,8 @@
 
   VisitedExpression.fromJson(core.Map _json) {
     if (_json.containsKey('sourcePosition')) {
-      sourcePosition = SourcePosition.fromJson(_json['sourcePosition']);
+      sourcePosition = SourcePosition.fromJson(
+          _json['sourcePosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.Object;
diff --git a/generated/googleapis/lib/firestore/v1.dart b/generated/googleapis/lib/firestore/v1.dart
index 4c78b61..fcf3c2b 100644
--- a/generated/googleapis/lib/firestore/v1.dart
+++ b/generated/googleapis/lib/firestore/v1.dart
@@ -137,7 +137,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports documents into Google Cloud Firestore. Existing documents with the
@@ -199,7 +202,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -270,7 +276,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleFirestoreAdminV1Field.fromJson(data));
+    return _response.then(
+      (data) => GoogleFirestoreAdminV1Field.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the field configuration and metadata for this database. Currently,
@@ -348,7 +357,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleFirestoreAdminV1ListFieldsResponse.fromJson(data));
+      (data) => GoogleFirestoreAdminV1ListFieldsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a field configuration. Currently, field updates apply only to
@@ -438,7 +449,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -506,7 +520,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a composite index.
@@ -557,7 +574,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a composite index.
@@ -608,7 +627,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleFirestoreAdminV1Index.fromJson(data));
+    return _response.then(
+      (data) => GoogleFirestoreAdminV1Index.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists composite indexes.
@@ -681,7 +703,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleFirestoreAdminV1ListIndexesResponse.fromJson(data));
+      (data) => GoogleFirestoreAdminV1ListIndexesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -747,7 +771,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchGetDocumentsResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetDocumentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Applies a batch of write operations. The BatchWrite method does not apply
@@ -810,7 +837,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchWriteResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchWriteResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts a new transaction.
@@ -868,7 +898,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BeginTransactionResponse.fromJson(data));
+    return _response.then(
+      (data) => BeginTransactionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Commits a transaction, while optionally updating documents.
@@ -926,7 +959,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommitResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommitResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new document.
@@ -1007,7 +1043,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Document.fromJson(data));
+    return _response.then(
+      (data) => Document.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a document.
@@ -1073,7 +1111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single document.
@@ -1145,7 +1185,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Document.fromJson(data));
+    return _response.then(
+      (data) => Document.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists documents.
@@ -1259,7 +1301,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDocumentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDocumentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the collection IDs underneath a document.
@@ -1320,7 +1365,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCollectionIdsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCollectionIdsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Listens to changes.
@@ -1378,7 +1426,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListenResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          ListenResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Partitions a query by returning partition cursors that can be used to run
@@ -1441,7 +1492,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PartitionQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => PartitionQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates or inserts a document.
@@ -1526,7 +1580,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Document.fromJson(data));
+    return _response.then(
+      (data) => Document.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rolls back a transaction.
@@ -1584,7 +1640,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs a query.
@@ -1645,7 +1703,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RunQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => RunQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Streams batches of document updates and deletes, in order.
@@ -1704,7 +1765,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WriteResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          WriteResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1775,7 +1839,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -1828,7 +1894,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1880,7 +1948,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1956,8 +2027,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleLongrunningListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2013,7 +2086,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -2081,7 +2156,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2095,7 +2173,8 @@
   ArrayValue.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<Value>((value) => Value.fromJson(value))
+          .map<Value>((value) =>
+              Value.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2150,10 +2229,12 @@
           .toList();
     }
     if (_json.containsKey('mask')) {
-      mask = DocumentMask.fromJson(_json['mask']);
+      mask = DocumentMask.fromJson(
+          _json['mask'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('newTransaction')) {
-      newTransaction = TransactionOptions.fromJson(_json['newTransaction']);
+      newTransaction = TransactionOptions.fromJson(
+          _json['newTransaction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readTime')) {
       readTime = _json['readTime'] as core.String;
@@ -2214,7 +2295,8 @@
 
   BatchGetDocumentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('found')) {
-      found = Document.fromJson(_json['found']);
+      found = Document.fromJson(
+          _json['found'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('missing')) {
       missing = _json['missing'] as core.String;
@@ -2260,12 +2342,14 @@
   BatchWriteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('writes')) {
       writes = (_json['writes'] as core.List)
-          .map<Write>((value) => Write.fromJson(value))
+          .map<Write>((value) =>
+              Write.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2297,12 +2381,14 @@
   BatchWriteResponse.fromJson(core.Map _json) {
     if (_json.containsKey('status')) {
       status = (_json['status'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('writeResults')) {
       writeResults = (_json['writeResults'] as core.List)
-          .map<WriteResult>((value) => WriteResult.fromJson(value))
+          .map<WriteResult>((value) => WriteResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2329,7 +2415,8 @@
 
   BeginTransactionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = TransactionOptions.fromJson(_json['options']);
+      options = TransactionOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2427,7 +2514,8 @@
     }
     if (_json.containsKey('writes')) {
       writes = (_json['writes'] as core.List)
-          .map<Write>((value) => Write.fromJson(value))
+          .map<Write>((value) =>
+              Write.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2462,7 +2550,8 @@
     }
     if (_json.containsKey('writeResults')) {
       writeResults = (_json['writeResults'] as core.List)
-          .map<WriteResult>((value) => WriteResult.fromJson(value))
+          .map<WriteResult>((value) => WriteResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2497,7 +2586,8 @@
   CompositeFilter.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<Filter>((value) => Filter.fromJson(value))
+          .map<Filter>((value) =>
+              Filter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('op')) {
@@ -2536,7 +2626,8 @@
     }
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<Value>((value) => Value.fromJson(value))
+          .map<Value>((value) =>
+              Value.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2596,8 +2687,10 @@
     }
     if (_json.containsKey('fields')) {
       fields = commons.mapMap<core.Map, Value>(
-          _json['fields'].cast<core.String, core.Map>(),
-          (core.Map item) => Value.fromJson(item));
+          (_json['fields'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Value.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2646,7 +2739,8 @@
 
   DocumentChange.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('removedTargetIds')) {
       removedTargetIds = (_json['removedTargetIds'] as core.List)
@@ -2814,7 +2908,8 @@
     }
     if (_json.containsKey('fieldTransforms')) {
       fieldTransforms = (_json['fieldTransforms'] as core.List)
-          .map<FieldTransform>((value) => FieldTransform.fromJson(value))
+          .map<FieldTransform>((value) => FieldTransform.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2952,13 +3047,15 @@
 
   FieldFilter.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = FieldReference.fromJson(_json['field']);
+      field = FieldReference.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('op')) {
       op = _json['op'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = Value.fromJson(_json['value']);
+      value =
+          Value.fromJson(_json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3069,23 +3166,27 @@
 
   FieldTransform.fromJson(core.Map _json) {
     if (_json.containsKey('appendMissingElements')) {
-      appendMissingElements =
-          ArrayValue.fromJson(_json['appendMissingElements']);
+      appendMissingElements = ArrayValue.fromJson(_json['appendMissingElements']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fieldPath')) {
       fieldPath = _json['fieldPath'] as core.String;
     }
     if (_json.containsKey('increment')) {
-      increment = Value.fromJson(_json['increment']);
+      increment = Value.fromJson(
+          _json['increment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maximum')) {
-      maximum = Value.fromJson(_json['maximum']);
+      maximum = Value.fromJson(
+          _json['maximum'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minimum')) {
-      minimum = Value.fromJson(_json['minimum']);
+      minimum = Value.fromJson(
+          _json['minimum'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('removeAllFromArray')) {
-      removeAllFromArray = ArrayValue.fromJson(_json['removeAllFromArray']);
+      removeAllFromArray = ArrayValue.fromJson(
+          _json['removeAllFromArray'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('setToServerValue')) {
       setToServerValue = _json['setToServerValue'] as core.String;
@@ -3134,13 +3235,16 @@
 
   Filter.fromJson(core.Map _json) {
     if (_json.containsKey('compositeFilter')) {
-      compositeFilter = CompositeFilter.fromJson(_json['compositeFilter']);
+      compositeFilter = CompositeFilter.fromJson(
+          _json['compositeFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fieldFilter')) {
-      fieldFilter = FieldFilter.fromJson(_json['fieldFilter']);
+      fieldFilter = FieldFilter.fromJson(
+          _json['fieldFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unaryFilter')) {
-      unaryFilter = UnaryFilter.fromJson(_json['unaryFilter']);
+      unaryFilter = UnaryFilter.fromJson(
+          _json['unaryFilter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3215,12 +3319,12 @@
       outputUriPrefix = _json['outputUriPrefix'] as core.String;
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressDocuments')) {
-      progressDocuments =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressDocuments']);
+      progressDocuments = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressDocuments'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -3352,8 +3456,8 @@
 
   GoogleFirestoreAdminV1Field.fromJson(core.Map _json) {
     if (_json.containsKey('indexConfig')) {
-      indexConfig =
-          GoogleFirestoreAdminV1IndexConfig.fromJson(_json['indexConfig']);
+      indexConfig = GoogleFirestoreAdminV1IndexConfig.fromJson(
+          _json['indexConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3422,17 +3526,18 @@
     }
     if (_json.containsKey('indexConfigDeltas')) {
       indexConfigDeltas = (_json['indexConfigDeltas'] as core.List)
-          .map<GoogleFirestoreAdminV1IndexConfigDelta>(
-              (value) => GoogleFirestoreAdminV1IndexConfigDelta.fromJson(value))
+          .map<GoogleFirestoreAdminV1IndexConfigDelta>((value) =>
+              GoogleFirestoreAdminV1IndexConfigDelta.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressDocuments')) {
-      progressDocuments =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressDocuments']);
+      progressDocuments = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressDocuments'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -3526,12 +3631,12 @@
       operationState = _json['operationState'] as core.String;
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressDocuments')) {
-      progressDocuments =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressDocuments']);
+      progressDocuments = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressDocuments'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -3660,8 +3765,9 @@
   GoogleFirestoreAdminV1Index.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<GoogleFirestoreAdminV1IndexField>(
-              (value) => GoogleFirestoreAdminV1IndexField.fromJson(value))
+          .map<GoogleFirestoreAdminV1IndexField>((value) =>
+              GoogleFirestoreAdminV1IndexField.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3723,8 +3829,9 @@
     }
     if (_json.containsKey('indexes')) {
       indexes = (_json['indexes'] as core.List)
-          .map<GoogleFirestoreAdminV1Index>(
-              (value) => GoogleFirestoreAdminV1Index.fromJson(value))
+          .map<GoogleFirestoreAdminV1Index>((value) =>
+              GoogleFirestoreAdminV1Index.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reverting')) {
@@ -3773,7 +3880,8 @@
       changeType = _json['changeType'] as core.String;
     }
     if (_json.containsKey('index')) {
-      index = GoogleFirestoreAdminV1Index.fromJson(_json['index']);
+      index = GoogleFirestoreAdminV1Index.fromJson(
+          _json['index'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3886,12 +3994,12 @@
       index = _json['index'] as core.String;
     }
     if (_json.containsKey('progressBytes')) {
-      progressBytes =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressBytes']);
+      progressBytes = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressBytes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('progressDocuments')) {
-      progressDocuments =
-          GoogleFirestoreAdminV1Progress.fromJson(_json['progressDocuments']);
+      progressDocuments = GoogleFirestoreAdminV1Progress.fromJson(
+          _json['progressDocuments'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -3939,8 +4047,9 @@
   GoogleFirestoreAdminV1ListFieldsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<GoogleFirestoreAdminV1Field>(
-              (value) => GoogleFirestoreAdminV1Field.fromJson(value))
+          .map<GoogleFirestoreAdminV1Field>((value) =>
+              GoogleFirestoreAdminV1Field.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3974,8 +4083,9 @@
   GoogleFirestoreAdminV1ListIndexesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('indexes')) {
       indexes = (_json['indexes'] as core.List)
-          .map<GoogleFirestoreAdminV1Index>(
-              (value) => GoogleFirestoreAdminV1Index.fromJson(value))
+          .map<GoogleFirestoreAdminV1Index>((value) =>
+              GoogleFirestoreAdminV1Index.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4071,8 +4181,9 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleLongrunningOperation>(
-              (value) => GoogleLongrunningOperation.fromJson(value))
+          .map<GoogleLongrunningOperation>((value) =>
+              GoogleLongrunningOperation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4133,11 +4244,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4145,7 +4258,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4282,7 +4396,8 @@
   ListDocumentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('documents')) {
       documents = (_json['documents'] as core.List)
-          .map<Document>((value) => Document.fromJson(value))
+          .map<Document>((value) =>
+              Document.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4315,7 +4430,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4350,11 +4466,13 @@
 
   ListenRequest.fromJson(core.Map _json) {
     if (_json.containsKey('addTarget')) {
-      addTarget = Target.fromJson(_json['addTarget']);
+      addTarget = Target.fromJson(
+          _json['addTarget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('removeTarget')) {
@@ -4401,19 +4519,24 @@
 
   ListenResponse.fromJson(core.Map _json) {
     if (_json.containsKey('documentChange')) {
-      documentChange = DocumentChange.fromJson(_json['documentChange']);
+      documentChange = DocumentChange.fromJson(
+          _json['documentChange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentDelete')) {
-      documentDelete = DocumentDelete.fromJson(_json['documentDelete']);
+      documentDelete = DocumentDelete.fromJson(
+          _json['documentDelete'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentRemove')) {
-      documentRemove = DocumentRemove.fromJson(_json['documentRemove']);
+      documentRemove = DocumentRemove.fromJson(
+          _json['documentRemove'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filter')) {
-      filter = ExistenceFilter.fromJson(_json['filter']);
+      filter = ExistenceFilter.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetChange')) {
-      targetChange = TargetChange.fromJson(_json['targetChange']);
+      targetChange = TargetChange.fromJson(
+          _json['targetChange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4470,7 +4593,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -4478,7 +4602,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4520,8 +4645,10 @@
   MapValue.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = commons.mapMap<core.Map, Value>(
-          _json['fields'].cast<core.String, core.Map>(),
-          (core.Map item) => Value.fromJson(item));
+          (_json['fields'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Value.fromJson(item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -4555,7 +4682,8 @@
       direction = _json['direction'] as core.String;
     }
     if (_json.containsKey('field')) {
-      field = FieldReference.fromJson(_json['field']);
+      field = FieldReference.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4618,7 +4746,8 @@
       partitionCount = _json['partitionCount'] as core.String;
     }
     if (_json.containsKey('structuredQuery')) {
-      structuredQuery = StructuredQuery.fromJson(_json['structuredQuery']);
+      structuredQuery = StructuredQuery.fromJson(
+          _json['structuredQuery'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4667,7 +4796,8 @@
     }
     if (_json.containsKey('partitions')) {
       partitions = (_json['partitions'] as core.List)
-          .map<Cursor>((value) => Cursor.fromJson(value))
+          .map<Cursor>((value) =>
+              Cursor.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4728,7 +4858,8 @@
   Projection.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<FieldReference>((value) => FieldReference.fromJson(value))
+          .map<FieldReference>((value) => FieldReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4761,7 +4892,8 @@
       parent = _json['parent'] as core.String;
     }
     if (_json.containsKey('structuredQuery')) {
-      structuredQuery = StructuredQuery.fromJson(_json['structuredQuery']);
+      structuredQuery = StructuredQuery.fromJson(
+          _json['structuredQuery'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4885,13 +5017,15 @@
 
   RunQueryRequest.fromJson(core.Map _json) {
     if (_json.containsKey('newTransaction')) {
-      newTransaction = TransactionOptions.fromJson(_json['newTransaction']);
+      newTransaction = TransactionOptions.fromJson(
+          _json['newTransaction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readTime')) {
       readTime = _json['readTime'] as core.String;
     }
     if (_json.containsKey('structuredQuery')) {
-      structuredQuery = StructuredQuery.fromJson(_json['structuredQuery']);
+      structuredQuery = StructuredQuery.fromJson(
+          _json['structuredQuery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transaction')) {
       transaction = _json['transaction'] as core.String;
@@ -4949,7 +5083,8 @@
 
   RunQueryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readTime')) {
       readTime = _json['readTime'] as core.String;
@@ -5012,7 +5147,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -5078,12 +5214,13 @@
 
   StructuredQuery.fromJson(core.Map _json) {
     if (_json.containsKey('endAt')) {
-      endAt = Cursor.fromJson(_json['endAt']);
+      endAt = Cursor.fromJson(
+          _json['endAt'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('from')) {
       from = (_json['from'] as core.List)
-          .map<CollectionSelector>(
-              (value) => CollectionSelector.fromJson(value))
+          .map<CollectionSelector>((value) => CollectionSelector.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('limit')) {
@@ -5094,17 +5231,21 @@
     }
     if (_json.containsKey('orderBy')) {
       orderBy = (_json['orderBy'] as core.List)
-          .map<Order>((value) => Order.fromJson(value))
+          .map<Order>((value) =>
+              Order.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('select')) {
-      select = Projection.fromJson(_json['select']);
+      select = Projection.fromJson(
+          _json['select'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startAt')) {
-      startAt = Cursor.fromJson(_json['startAt']);
+      startAt = Cursor.fromJson(
+          _json['startAt'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('where')) {
-      where = Filter.fromJson(_json['where']);
+      where = Filter.fromJson(
+          _json['where'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5172,13 +5313,15 @@
 
   Target.fromJson(core.Map _json) {
     if (_json.containsKey('documents')) {
-      documents = DocumentsTarget.fromJson(_json['documents']);
+      documents = DocumentsTarget.fromJson(
+          _json['documents'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('once')) {
       once = _json['once'] as core.bool;
     }
     if (_json.containsKey('query')) {
-      query = QueryTarget.fromJson(_json['query']);
+      query = QueryTarget.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readTime')) {
       readTime = _json['readTime'] as core.String;
@@ -5265,7 +5408,8 @@
 
   TargetChange.fromJson(core.Map _json) {
     if (_json.containsKey('cause')) {
-      cause = Status.fromJson(_json['cause']);
+      cause = Status.fromJson(
+          _json['cause'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readTime')) {
       readTime = _json['readTime'] as core.String;
@@ -5316,10 +5460,12 @@
 
   TransactionOptions.fromJson(core.Map _json) {
     if (_json.containsKey('readOnly')) {
-      readOnly = ReadOnly.fromJson(_json['readOnly']);
+      readOnly = ReadOnly.fromJson(
+          _json['readOnly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readWrite')) {
-      readWrite = ReadWrite.fromJson(_json['readWrite']);
+      readWrite = ReadWrite.fromJson(
+          _json['readWrite'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5357,7 +5503,8 @@
 
   UnaryFilter.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
-      field = FieldReference.fromJson(_json['field']);
+      field = FieldReference.fromJson(
+          _json['field'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('op')) {
       op = _json['op'] as core.String;
@@ -5430,7 +5577,8 @@
 
   Value.fromJson(core.Map _json) {
     if (_json.containsKey('arrayValue')) {
-      arrayValue = ArrayValue.fromJson(_json['arrayValue']);
+      arrayValue = ArrayValue.fromJson(
+          _json['arrayValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('booleanValue')) {
       booleanValue = _json['booleanValue'] as core.bool;
@@ -5442,13 +5590,15 @@
       doubleValue = (_json['doubleValue'] as core.num).toDouble();
     }
     if (_json.containsKey('geoPointValue')) {
-      geoPointValue = LatLng.fromJson(_json['geoPointValue']);
+      geoPointValue = LatLng.fromJson(
+          _json['geoPointValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('integerValue')) {
       integerValue = _json['integerValue'] as core.String;
     }
     if (_json.containsKey('mapValue')) {
-      mapValue = MapValue.fromJson(_json['mapValue']);
+      mapValue = MapValue.fromJson(
+          _json['mapValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nullValue')) {
       nullValue = _json['nullValue'] as core.String;
@@ -5538,23 +5688,28 @@
 
   Write.fromJson(core.Map _json) {
     if (_json.containsKey('currentDocument')) {
-      currentDocument = Precondition.fromJson(_json['currentDocument']);
+      currentDocument = Precondition.fromJson(
+          _json['currentDocument'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delete')) {
       delete = _json['delete'] as core.String;
     }
     if (_json.containsKey('transform')) {
-      transform = DocumentTransform.fromJson(_json['transform']);
+      transform = DocumentTransform.fromJson(
+          _json['transform'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('update')) {
-      update = Document.fromJson(_json['update']);
+      update = Document.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
-      updateMask = DocumentMask.fromJson(_json['updateMask']);
+      updateMask = DocumentMask.fromJson(
+          _json['updateMask'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTransforms')) {
       updateTransforms = (_json['updateTransforms'] as core.List)
-          .map<FieldTransform>((value) => FieldTransform.fromJson(value))
+          .map<FieldTransform>((value) => FieldTransform.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5625,7 +5780,8 @@
   WriteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('streamId')) {
@@ -5636,7 +5792,8 @@
     }
     if (_json.containsKey('writes')) {
       writes = (_json['writes'] as core.List)
-          .map<Write>((value) => Write.fromJson(value))
+          .map<Write>((value) =>
+              Write.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5699,7 +5856,8 @@
     }
     if (_json.containsKey('writeResults')) {
       writeResults = (_json['writeResults'] as core.List)
-          .map<WriteResult>((value) => WriteResult.fromJson(value))
+          .map<WriteResult>((value) => WriteResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5739,7 +5897,8 @@
   WriteResult.fromJson(core.Map _json) {
     if (_json.containsKey('transformResults')) {
       transformResults = (_json['transformResults'] as core.List)
-          .map<Value>((value) => Value.fromJson(value))
+          .map<Value>((value) =>
+              Value.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('updateTime')) {
diff --git a/generated/googleapis/lib/fitness/v1.dart b/generated/googleapis/lib/fitness/v1.dart
index 6dda893..c1470bf 100644
--- a/generated/googleapis/lib/fitness/v1.dart
+++ b/generated/googleapis/lib/fitness/v1.dart
@@ -224,7 +224,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataSource.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataSource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified data source. The request will fail if the data
@@ -282,7 +285,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataSource.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataSource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the specified data source.
@@ -339,7 +345,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataSource.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataSource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all data sources that are visible to the developer, using the OAuth
@@ -398,7 +407,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDataSourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDataSourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified data source. The dataStreamId, dataType, type,
@@ -463,7 +475,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DataSource.fromJson(data));
+    return _response.then(
+      (data) =>
+          DataSource.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -544,8 +559,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListDataPointChangesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDataPointChangesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -640,7 +657,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns a dataset containing all data points whose start and end times
@@ -731,7 +750,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds data points to a dataset. The dataset need not be previously created.
@@ -817,7 +838,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -881,7 +904,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AggregateResponse.fromJson(data));
+    return _response.then(
+      (data) => AggregateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -951,7 +977,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Lists sessions previously created.
@@ -1044,7 +1072,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSessionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSessionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates or insert a given session.
@@ -1114,7 +1145,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Session.fromJson(data));
+    return _response.then(
+      (data) => Session.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1164,14 +1197,16 @@
     }
     if (_json.containsKey('dataset')) {
       dataset = (_json['dataset'] as core.List)
-          .map<Dataset>((value) => Dataset.fromJson(value))
+          .map<Dataset>((value) =>
+              Dataset.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('endTimeMillis')) {
       endTimeMillis = _json['endTimeMillis'] as core.String;
     }
     if (_json.containsKey('session')) {
-      session = Session.fromJson(_json['session']);
+      session = Session.fromJson(
+          _json['session'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTimeMillis')) {
       startTimeMillis = _json['startTimeMillis'] as core.String;
@@ -1293,22 +1328,26 @@
   AggregateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('aggregateBy')) {
       aggregateBy = (_json['aggregateBy'] as core.List)
-          .map<AggregateBy>((value) => AggregateBy.fromJson(value))
+          .map<AggregateBy>((value) => AggregateBy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bucketByActivitySegment')) {
-      bucketByActivitySegment =
-          BucketByActivity.fromJson(_json['bucketByActivitySegment']);
+      bucketByActivitySegment = BucketByActivity.fromJson(
+          _json['bucketByActivitySegment']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bucketByActivityType')) {
-      bucketByActivityType =
-          BucketByActivity.fromJson(_json['bucketByActivityType']);
+      bucketByActivityType = BucketByActivity.fromJson(
+          _json['bucketByActivityType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bucketBySession')) {
-      bucketBySession = BucketBySession.fromJson(_json['bucketBySession']);
+      bucketBySession = BucketBySession.fromJson(
+          _json['bucketBySession'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bucketByTime')) {
-      bucketByTime = BucketByTime.fromJson(_json['bucketByTime']);
+      bucketByTime = BucketByTime.fromJson(
+          _json['bucketByTime'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTimeMillis')) {
       endTimeMillis = _json['endTimeMillis'] as core.String;
@@ -1364,7 +1403,8 @@
   AggregateResponse.fromJson(core.Map _json) {
     if (_json.containsKey('bucket')) {
       bucket = (_json['bucket'] as core.List)
-          .map<AggregateBucket>((value) => AggregateBucket.fromJson(value))
+          .map<AggregateBucket>((value) => AggregateBucket.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1502,7 +1542,8 @@
       durationMillis = _json['durationMillis'] as core.String;
     }
     if (_json.containsKey('period')) {
-      period = BucketByTimePeriod.fromJson(_json['period']);
+      period = BucketByTimePeriod.fromJson(
+          _json['period'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1630,7 +1671,8 @@
     }
     if (_json.containsKey('value')) {
       value = (_json['value'] as core.List)
-          .map<Value>((value) => Value.fromJson(value))
+          .map<Value>((value) =>
+              Value.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1743,7 +1785,8 @@
 
   DataSource.fromJson(core.Map _json) {
     if (_json.containsKey('application')) {
-      application = Application.fromJson(_json['application']);
+      application = Application.fromJson(
+          _json['application'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataQualityStandard')) {
       dataQualityStandard = (_json['dataQualityStandard'] as core.List)
@@ -1757,10 +1800,12 @@
       dataStreamName = _json['dataStreamName'] as core.String;
     }
     if (_json.containsKey('dataType')) {
-      dataType = DataType.fromJson(_json['dataType']);
+      dataType = DataType.fromJson(
+          _json['dataType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('device')) {
-      device = Device.fromJson(_json['device']);
+      device = Device.fromJson(
+          _json['device'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1813,7 +1858,8 @@
   DataType.fromJson(core.Map _json) {
     if (_json.containsKey('field')) {
       field = (_json['field'] as core.List)
-          .map<DataTypeField>((value) => DataTypeField.fromJson(value))
+          .map<DataTypeField>((value) => DataTypeField.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -1931,7 +1977,8 @@
     }
     if (_json.containsKey('point')) {
       point = (_json['point'] as core.List)
-          .map<DataPoint>((value) => DataPoint.fromJson(value))
+          .map<DataPoint>((value) =>
+              DataPoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2061,12 +2108,14 @@
     }
     if (_json.containsKey('deletedDataPoint')) {
       deletedDataPoint = (_json['deletedDataPoint'] as core.List)
-          .map<DataPoint>((value) => DataPoint.fromJson(value))
+          .map<DataPoint>((value) =>
+              DataPoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('insertedDataPoint')) {
       insertedDataPoint = (_json['insertedDataPoint'] as core.List)
-          .map<DataPoint>((value) => DataPoint.fromJson(value))
+          .map<DataPoint>((value) =>
+              DataPoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2103,7 +2152,8 @@
   ListDataSourcesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dataSource')) {
       dataSource = (_json['dataSource'] as core.List)
-          .map<DataSource>((value) => DataSource.fromJson(value))
+          .map<DataSource>((value) =>
+              DataSource.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2140,7 +2190,8 @@
   ListSessionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deletedSession')) {
       deletedSession = (_json['deletedSession'] as core.List)
-          .map<Session>((value) => Session.fromJson(value))
+          .map<Session>((value) =>
+              Session.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('hasMoreData')) {
@@ -2151,7 +2202,8 @@
     }
     if (_json.containsKey('session')) {
       session = (_json['session'] as core.List)
-          .map<Session>((value) => Session.fromJson(value))
+          .map<Session>((value) =>
+              Session.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2243,7 +2295,8 @@
       activityType = _json['activityType'] as core.int;
     }
     if (_json.containsKey('application')) {
-      application = Application.fromJson(_json['application']);
+      application = Application.fromJson(
+          _json['application'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -2330,7 +2383,8 @@
     }
     if (_json.containsKey('mapVal')) {
       mapVal = (_json['mapVal'] as core.List)
-          .map<ValueMapValEntry>((value) => ValueMapValEntry.fromJson(value))
+          .map<ValueMapValEntry>((value) => ValueMapValEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('stringVal')) {
@@ -2367,7 +2421,8 @@
       key = _json['key'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = MapValue.fromJson(_json['value']);
+      value = MapValue.fromJson(
+          _json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/games/v1.dart b/generated/googleapis/lib/games/v1.dart
index f52f0f7..650a7e0 100644
--- a/generated/googleapis/lib/games/v1.dart
+++ b/generated/googleapis/lib/games/v1.dart
@@ -132,8 +132,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AchievementDefinitionsListResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementDefinitionsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -205,8 +207,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AchievementIncrementResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementIncrementResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the progress for all your application's achievements for the
@@ -292,8 +296,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PlayerAchievementListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerAchievementListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the state of the achievement with the given ID to `REVEALED` for the
@@ -344,7 +350,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AchievementRevealResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementRevealResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the steps for the currently authenticated player towards unlocking an
@@ -404,8 +413,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AchievementSetStepsAtLeastResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementSetStepsAtLeastResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unlocks this achievement for the currently authenticated player.
@@ -455,7 +466,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AchievementUnlockResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementUnlockResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates multiple achievements for the currently authenticated player.
@@ -503,8 +517,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AchievementUpdateMultipleResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementUpdateMultipleResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -581,7 +597,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Application.fromJson(data));
+    return _response.then(
+      (data) =>
+          Application.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Indicate that the currently authenticated user is playing your
@@ -624,7 +643,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Verifies the auth token provided with this request is for the application
@@ -677,7 +698,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ApplicationVerifyResponse.fromJson(data));
+    return _response.then(
+      (data) => ApplicationVerifyResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -747,7 +771,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlayerEventListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerEventListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of the event definitions in this application.
@@ -810,7 +837,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EventDefinitionListResponse.fromJson(data));
+    return _response.then(
+      (data) => EventDefinitionListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Records a batch of changes to the number of times events have occurred for
@@ -866,7 +896,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EventUpdateResponse.fromJson(data));
+    return _response.then(
+      (data) => EventUpdateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -928,7 +961,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Leaderboard.fromJson(data));
+    return _response.then(
+      (data) =>
+          Leaderboard.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the leaderboard metadata for your application.
@@ -991,7 +1027,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LeaderboardListResponse.fromJson(data));
+    return _response.then(
+      (data) => LeaderboardListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1039,7 +1078,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MetagameConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          MetagameConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List play data aggregated per category for the player corresponding to
@@ -1123,7 +1165,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CategoryListResponse.fromJson(data));
+    return _response.then(
+      (data) => CategoryListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1186,7 +1231,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Player.fromJson(data));
+    return _response.then(
+      (data) => Player.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the collection of players for the currently authenticated user.
@@ -1263,7 +1310,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlayerListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1322,7 +1372,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevisionCheckResponse.fromJson(data));
+    return _response.then(
+      (data) => RevisionCheckResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1442,8 +1495,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PlayerLeaderboardScoreListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerLeaderboardScoreListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the scores in a leaderboard, starting from the top.
@@ -1538,7 +1593,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LeaderboardScores.fromJson(data));
+    return _response.then(
+      (data) => LeaderboardScores.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the scores in a leaderboard around (and including) a player's score.
@@ -1649,7 +1707,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LeaderboardScores.fromJson(data));
+    return _response.then(
+      (data) => LeaderboardScores.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submits a score to the specified leaderboard.
@@ -1727,7 +1788,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlayerScoreResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerScoreResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submits multiple scores to leaderboards.
@@ -1782,7 +1846,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlayerScoreListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerScoreListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1843,7 +1910,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Snapshot.fromJson(data));
+    return _response.then(
+      (data) => Snapshot.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of snapshots created by your application for the player
@@ -1916,7 +1985,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SnapshotListResponse.fromJson(data));
+    return _response.then(
+      (data) => SnapshotListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1965,7 +2037,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => StatsResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          StatsResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2128,8 +2203,8 @@
   AchievementDefinitionsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AchievementDefinition>(
-              (value) => AchievementDefinition.fromJson(value))
+          .map<AchievementDefinition>((value) => AchievementDefinition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2326,8 +2401,9 @@
     }
     if (_json.containsKey('updates')) {
       updates = (_json['updates'] as core.List)
-          .map<AchievementUpdateRequest>(
-              (value) => AchievementUpdateRequest.fromJson(value))
+          .map<AchievementUpdateRequest>((value) =>
+              AchievementUpdateRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2361,8 +2437,9 @@
     }
     if (_json.containsKey('updatedAchievements')) {
       updatedAchievements = (_json['updatedAchievements'] as core.List)
-          .map<AchievementUpdateResponse>(
-              (value) => AchievementUpdateResponse.fromJson(value))
+          .map<AchievementUpdateResponse>((value) =>
+              AchievementUpdateResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2414,15 +2491,16 @@
       achievementId = _json['achievementId'] as core.String;
     }
     if (_json.containsKey('incrementPayload')) {
-      incrementPayload =
-          GamesAchievementIncrement.fromJson(_json['incrementPayload']);
+      incrementPayload = GamesAchievementIncrement.fromJson(
+          _json['incrementPayload'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('setStepsAtLeastPayload')) {
       setStepsAtLeastPayload = GamesAchievementSetStepsAtLeast.fromJson(
-          _json['setStepsAtLeastPayload']);
+          _json['setStepsAtLeastPayload']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateType')) {
       updateType = _json['updateType'] as core.String;
@@ -2575,14 +2653,16 @@
     }
     if (_json.containsKey('assets')) {
       assets = (_json['assets'] as core.List)
-          .map<ImageAsset>((value) => ImageAsset.fromJson(value))
+          .map<ImageAsset>((value) =>
+              ImageAsset.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('author')) {
       author = _json['author'] as core.String;
     }
     if (_json.containsKey('category')) {
-      category = ApplicationCategory.fromJson(_json['category']);
+      category = ApplicationCategory.fromJson(
+          _json['category'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -2597,7 +2677,8 @@
     }
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2803,7 +2884,8 @@
   CategoryListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Category>((value) => Category.fromJson(value))
+          .map<Category>((value) =>
+              Category.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -2865,7 +2947,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = EventPeriodRange.fromJson(_json['range']);
+      range = EventPeriodRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2954,7 +3037,8 @@
   EventDefinition.fromJson(core.Map _json) {
     if (_json.containsKey('childEvents')) {
       childEvents = (_json['childEvents'] as core.List)
-          .map<EventChild>((value) => EventChild.fromJson(value))
+          .map<EventChild>((value) =>
+              EventChild.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('description')) {
@@ -3028,7 +3112,8 @@
   EventDefinitionListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<EventDefinition>((value) => EventDefinition.fromJson(value))
+          .map<EventDefinition>((value) => EventDefinition.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3116,12 +3201,13 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('timePeriod')) {
-      timePeriod = EventPeriodRange.fromJson(_json['timePeriod']);
+      timePeriod = EventPeriodRange.fromJson(
+          _json['timePeriod'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updates')) {
       updates = (_json['updates'] as core.List)
-          .map<EventUpdateRequest>(
-              (value) => EventUpdateRequest.fromJson(value))
+          .map<EventUpdateRequest>((value) => EventUpdateRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3218,7 +3304,8 @@
     }
     if (_json.containsKey('timePeriods')) {
       timePeriods = (_json['timePeriods'] as core.List)
-          .map<EventPeriodUpdate>((value) => EventPeriodUpdate.fromJson(value))
+          .map<EventPeriodUpdate>((value) => EventPeriodUpdate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3303,14 +3390,15 @@
   EventUpdateResponse.fromJson(core.Map _json) {
     if (_json.containsKey('batchFailures')) {
       batchFailures = (_json['batchFailures'] as core.List)
-          .map<EventBatchRecordFailure>(
-              (value) => EventBatchRecordFailure.fromJson(value))
+          .map<EventBatchRecordFailure>((value) =>
+              EventBatchRecordFailure.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('eventFailures')) {
       eventFailures = (_json['eventFailures'] as core.List)
-          .map<EventRecordFailure>(
-              (value) => EventRecordFailure.fromJson(value))
+          .map<EventRecordFailure>((value) => EventRecordFailure.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -3318,7 +3406,8 @@
     }
     if (_json.containsKey('playerEvents')) {
       playerEvents = (_json['playerEvents'] as core.List)
-          .map<PlayerEvent>((value) => PlayerEvent.fromJson(value))
+          .map<PlayerEvent>((value) => PlayerEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3518,11 +3607,12 @@
       acquisitionUri = _json['acquisitionUri'] as core.String;
     }
     if (_json.containsKey('androidInstance')) {
-      androidInstance =
-          InstanceAndroidDetails.fromJson(_json['androidInstance']);
+      androidInstance = InstanceAndroidDetails.fromJson(
+          _json['androidInstance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iosInstance')) {
-      iosInstance = InstanceIosDetails.fromJson(_json['iosInstance']);
+      iosInstance = InstanceIosDetails.fromJson(
+          _json['iosInstance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -3540,7 +3630,8 @@
       turnBasedPlay = _json['turnBasedPlay'] as core.bool;
     }
     if (_json.containsKey('webInstance')) {
-      webInstance = InstanceWebDetails.fromJson(_json['webInstance']);
+      webInstance = InstanceWebDetails.fromJson(
+          _json['webInstance'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3872,7 +3963,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('player')) {
-      player = Player.fromJson(_json['player']);
+      player = Player.fromJson(
+          _json['player'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scoreRank')) {
       scoreRank = _json['scoreRank'] as core.String;
@@ -3941,7 +4033,8 @@
   LeaderboardListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Leaderboard>((value) => Leaderboard.fromJson(value))
+          .map<Leaderboard>((value) => Leaderboard.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4056,7 +4149,8 @@
   LeaderboardScores.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<LeaderboardEntry>((value) => LeaderboardEntry.fromJson(value))
+          .map<LeaderboardEntry>((value) => LeaderboardEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4069,7 +4163,8 @@
       numScores = _json['numScores'] as core.String;
     }
     if (_json.containsKey('playerScore')) {
-      playerScore = LeaderboardEntry.fromJson(_json['playerScore']);
+      playerScore = LeaderboardEntry.fromJson(
+          _json['playerScore'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
@@ -4124,7 +4219,8 @@
     }
     if (_json.containsKey('playerLevels')) {
       playerLevels = (_json['playerLevels'] as core.List)
-          .map<PlayerLevel>((value) => PlayerLevel.fromJson(value))
+          .map<PlayerLevel>((value) => PlayerLevel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4242,7 +4338,8 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('experienceInfo')) {
-      experienceInfo = PlayerExperienceInfo.fromJson(_json['experienceInfo']);
+      experienceInfo = PlayerExperienceInfo.fromJson(
+          _json['experienceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('friendStatus')) {
       friendStatus = _json['friendStatus'] as core.String;
@@ -4251,7 +4348,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('name')) {
-      name = PlayerName.fromJson(_json['name']);
+      name = PlayerName.fromJson(
+          _json['name'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('originalPlayerId')) {
       originalPlayerId = _json['originalPlayerId'] as core.String;
@@ -4260,7 +4358,8 @@
       playerId = _json['playerId'] as core.String;
     }
     if (_json.containsKey('profileSettings')) {
-      profileSettings = ProfileSettings.fromJson(_json['profileSettings']);
+      profileSettings = ProfileSettings.fromJson(
+          _json['profileSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -4411,7 +4510,8 @@
   PlayerAchievementListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PlayerAchievement>((value) => PlayerAchievement.fromJson(value))
+          .map<PlayerAchievement>((value) => PlayerAchievement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4515,7 +4615,8 @@
   PlayerEventListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PlayerEvent>((value) => PlayerEvent.fromJson(value))
+          .map<PlayerEvent>((value) => PlayerEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4568,7 +4669,8 @@
       currentExperiencePoints = _json['currentExperiencePoints'] as core.String;
     }
     if (_json.containsKey('currentLevel')) {
-      currentLevel = PlayerLevel.fromJson(_json['currentLevel']);
+      currentLevel = PlayerLevel.fromJson(
+          _json['currentLevel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -4578,7 +4680,8 @@
           _json['lastLevelUpTimestampMillis'] as core.String;
     }
     if (_json.containsKey('nextLevel')) {
-      nextLevel = PlayerLevel.fromJson(_json['nextLevel']);
+      nextLevel = PlayerLevel.fromJson(
+          _json['nextLevel'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4648,7 +4751,8 @@
 
   PlayerLeaderboardScore.fromJson(core.Map _json) {
     if (_json.containsKey('friendsRank')) {
-      friendsRank = LeaderboardScoreRank.fromJson(_json['friendsRank']);
+      friendsRank = LeaderboardScoreRank.fromJson(
+          _json['friendsRank'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
@@ -4657,7 +4761,8 @@
       leaderboardId = _json['leaderboard_id'] as core.String;
     }
     if (_json.containsKey('publicRank')) {
-      publicRank = LeaderboardScoreRank.fromJson(_json['publicRank']);
+      publicRank = LeaderboardScoreRank.fromJson(
+          _json['publicRank'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scoreString')) {
       scoreString = _json['scoreString'] as core.String;
@@ -4669,7 +4774,8 @@
       scoreValue = _json['scoreValue'] as core.String;
     }
     if (_json.containsKey('socialRank')) {
-      socialRank = LeaderboardScoreRank.fromJson(_json['socialRank']);
+      socialRank = LeaderboardScoreRank.fromJson(
+          _json['socialRank'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeSpan')) {
       timeSpan = _json['timeSpan'] as core.String;
@@ -4735,8 +4841,9 @@
   PlayerLeaderboardScoreListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PlayerLeaderboardScore>(
-              (value) => PlayerLeaderboardScore.fromJson(value))
+          .map<PlayerLeaderboardScore>((value) =>
+              PlayerLeaderboardScore.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4746,7 +4853,8 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('player')) {
-      player = Player.fromJson(_json['player']);
+      player = Player.fromJson(
+          _json['player'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4835,7 +4943,8 @@
   PlayerListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Player>((value) => Player.fromJson(value))
+          .map<Player>((value) =>
+              Player.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4943,8 +5052,8 @@
     }
     if (_json.containsKey('submittedScores')) {
       submittedScores = (_json['submittedScores'] as core.List)
-          .map<PlayerScoreResponse>(
-              (value) => PlayerScoreResponse.fromJson(value))
+          .map<PlayerScoreResponse>((value) => PlayerScoreResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5009,7 +5118,8 @@
     }
     if (_json.containsKey('unbeatenScores')) {
       unbeatenScores = (_json['unbeatenScores'] as core.List)
-          .map<PlayerScore>((value) => PlayerScore.fromJson(value))
+          .map<PlayerScore>((value) => PlayerScore.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5056,7 +5166,8 @@
     }
     if (_json.containsKey('scores')) {
       scores = (_json['scores'] as core.List)
-          .map<ScoreSubmission>((value) => ScoreSubmission.fromJson(value))
+          .map<ScoreSubmission>((value) => ScoreSubmission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5281,7 +5392,8 @@
 
   Snapshot.fromJson(core.Map _json) {
     if (_json.containsKey('coverImage')) {
-      coverImage = SnapshotImage.fromJson(_json['coverImage']);
+      coverImage = SnapshotImage.fromJson(
+          _json['coverImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -5432,7 +5544,8 @@
   SnapshotListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Snapshot>((value) => Snapshot.fromJson(value))
+          .map<Snapshot>((value) =>
+              Snapshot.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/gamesconfiguration/v1configuration.dart b/generated/googleapis/lib/gamesconfiguration/v1configuration.dart
index 2a3b858..5cc47fd 100644
--- a/generated/googleapis/lib/gamesconfiguration/v1configuration.dart
+++ b/generated/googleapis/lib/gamesconfiguration/v1configuration.dart
@@ -113,7 +113,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves the metadata of the achievement configuration with the given ID.
@@ -162,7 +164,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AchievementConfiguration.fromJson(data));
+    return _response.then(
+      (data) => AchievementConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Insert a new achievement configuration in this application.
@@ -219,7 +224,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AchievementConfiguration.fromJson(data));
+    return _response.then(
+      (data) => AchievementConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of the achievement configurations in this application.
@@ -284,8 +292,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AchievementConfigurationListResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementConfigurationListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the metadata of the achievement configuration with the given ID.
@@ -340,7 +350,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AchievementConfiguration.fromJson(data));
+    return _response.then(
+      (data) => AchievementConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -421,7 +434,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImageConfiguration.fromJson(data));
+    return _response.then(
+      (data) => ImageConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -477,7 +493,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves the metadata of the leaderboard configuration with the given ID.
@@ -526,7 +544,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LeaderboardConfiguration.fromJson(data));
+    return _response.then(
+      (data) => LeaderboardConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Insert a new leaderboard configuration in this application.
@@ -583,7 +604,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LeaderboardConfiguration.fromJson(data));
+    return _response.then(
+      (data) => LeaderboardConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of the leaderboard configurations in this application.
@@ -648,8 +672,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LeaderboardConfigurationListResponse.fromJson(data));
+    return _response.then(
+      (data) => LeaderboardConfigurationListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the metadata of the leaderboard configuration with the given ID.
@@ -704,7 +730,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LeaderboardConfiguration.fromJson(data));
+    return _response.then(
+      (data) => LeaderboardConfiguration.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -750,7 +779,8 @@
       achievementType = _json['achievementType'] as core.String;
     }
     if (_json.containsKey('draft')) {
-      draft = AchievementConfigurationDetail.fromJson(_json['draft']);
+      draft = AchievementConfigurationDetail.fromJson(
+          _json['draft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -762,7 +792,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('published')) {
-      published = AchievementConfigurationDetail.fromJson(_json['published']);
+      published = AchievementConfigurationDetail.fromJson(
+          _json['published'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stepsToUnlock')) {
       stepsToUnlock = _json['stepsToUnlock'] as core.int;
@@ -827,7 +858,8 @@
 
   AchievementConfigurationDetail.fromJson(core.Map _json) {
     if (_json.containsKey('description')) {
-      description = LocalizedStringBundle.fromJson(_json['description']);
+      description = LocalizedStringBundle.fromJson(
+          _json['description'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iconUrl')) {
       iconUrl = _json['iconUrl'] as core.String;
@@ -836,7 +868,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('name')) {
-      name = LocalizedStringBundle.fromJson(_json['name']);
+      name = LocalizedStringBundle.fromJson(
+          _json['name'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pointValue')) {
       pointValue = _json['pointValue'] as core.int;
@@ -887,8 +920,9 @@
   AchievementConfigurationListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<AchievementConfiguration>(
-              (value) => AchievementConfiguration.fromJson(value))
+          .map<AchievementConfiguration>((value) =>
+              AchievementConfiguration.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -946,22 +980,28 @@
 
   GamesNumberAffixConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('few')) {
-      few = LocalizedStringBundle.fromJson(_json['few']);
+      few = LocalizedStringBundle.fromJson(
+          _json['few'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('many')) {
-      many = LocalizedStringBundle.fromJson(_json['many']);
+      many = LocalizedStringBundle.fromJson(
+          _json['many'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('one')) {
-      one = LocalizedStringBundle.fromJson(_json['one']);
+      one = LocalizedStringBundle.fromJson(
+          _json['one'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('other')) {
-      other = LocalizedStringBundle.fromJson(_json['other']);
+      other = LocalizedStringBundle.fromJson(
+          _json['other'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('two')) {
-      two = LocalizedStringBundle.fromJson(_json['two']);
+      two = LocalizedStringBundle.fromJson(
+          _json['two'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zero')) {
-      zero = LocalizedStringBundle.fromJson(_json['zero']);
+      zero = LocalizedStringBundle.fromJson(
+          _json['zero'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1025,7 +1065,8 @@
       numberFormatType = _json['numberFormatType'] as core.String;
     }
     if (_json.containsKey('suffix')) {
-      suffix = GamesNumberAffixConfiguration.fromJson(_json['suffix']);
+      suffix = GamesNumberAffixConfiguration.fromJson(
+          _json['suffix'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1136,7 +1177,8 @@
 
   LeaderboardConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('draft')) {
-      draft = LeaderboardConfigurationDetail.fromJson(_json['draft']);
+      draft = LeaderboardConfigurationDetail.fromJson(
+          _json['draft'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -1145,7 +1187,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('published')) {
-      published = LeaderboardConfigurationDetail.fromJson(_json['published']);
+      published = LeaderboardConfigurationDetail.fromJson(
+          _json['published'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scoreMax')) {
       scoreMax = _json['scoreMax'] as core.String;
@@ -1219,11 +1262,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('name')) {
-      name = LocalizedStringBundle.fromJson(_json['name']);
+      name = LocalizedStringBundle.fromJson(
+          _json['name'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scoreFormat')) {
-      scoreFormat =
-          GamesNumberFormatConfiguration.fromJson(_json['scoreFormat']);
+      scoreFormat = GamesNumberFormatConfiguration.fromJson(
+          _json['scoreFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortRank')) {
       sortRank = _json['sortRank'] as core.int;
@@ -1268,8 +1312,9 @@
   LeaderboardConfigurationListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<LeaderboardConfiguration>(
-              (value) => LeaderboardConfiguration.fromJson(value))
+          .map<LeaderboardConfiguration>((value) =>
+              LeaderboardConfiguration.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1353,7 +1398,8 @@
     }
     if (_json.containsKey('translations')) {
       translations = (_json['translations'] as core.List)
-          .map<LocalizedString>((value) => LocalizedString.fromJson(value))
+          .map<LocalizedString>((value) => LocalizedString.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/gamesmanagement/v1management.dart b/generated/googleapis/lib/gamesmanagement/v1management.dart
index 0d8c791..7d3f1cd 100644
--- a/generated/googleapis/lib/gamesmanagement/v1management.dart
+++ b/generated/googleapis/lib/gamesmanagement/v1management.dart
@@ -107,7 +107,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AchievementResetResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementResetResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resets all achievements for the currently authenticated player for your
@@ -151,7 +154,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AchievementResetAllResponse.fromJson(data));
+    return _response.then(
+      (data) => AchievementResetAllResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resets all draft achievements for all players. This method is only
@@ -194,7 +200,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets the achievement with the given ID for all players. This method is
@@ -246,7 +254,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets achievements with the given IDs for all players. This method is
@@ -296,7 +306,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -368,7 +380,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HiddenPlayerList.fromJson(data));
+    return _response.then(
+      (data) => HiddenPlayerList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -426,7 +441,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets all player progress on all events for the currently authenticated
@@ -470,7 +487,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets all draft events for all players. This method is only available to
@@ -513,7 +532,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets the event with the given ID for all players. This method is only
@@ -565,7 +586,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets events with the given IDs for all players. This method is only
@@ -615,7 +638,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -681,7 +706,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Unhide the given player's leaderboard scores from the given application.
@@ -741,7 +768,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -799,7 +828,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlayerScoreResetResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerScoreResetResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resets all scores for all leaderboards for the currently authenticated
@@ -843,7 +875,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlayerScoreResetAllResponse.fromJson(data));
+    return _response.then(
+      (data) => PlayerScoreResetAllResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resets scores for all draft leaderboards for all players. This method is
@@ -886,7 +921,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets scores for the leaderboard with the given ID for all players. This
@@ -938,7 +975,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Resets scores for the leaderboards with the given IDs for all players.
@@ -988,7 +1027,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -1009,8 +1050,9 @@
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<AchievementResetResponse>(
-              (value) => AchievementResetResponse.fromJson(value))
+          .map<AchievementResetResponse>((value) =>
+              AchievementResetResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1170,14 +1212,16 @@
       currentExperiencePoints = _json['currentExperiencePoints'] as core.String;
     }
     if (_json.containsKey('currentLevel')) {
-      currentLevel = GamesPlayerLevelResource.fromJson(_json['currentLevel']);
+      currentLevel = GamesPlayerLevelResource.fromJson(
+          _json['currentLevel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastLevelUpTimestampMillis')) {
       lastLevelUpTimestampMillis =
           _json['lastLevelUpTimestampMillis'] as core.String;
     }
     if (_json.containsKey('nextLevel')) {
-      nextLevel = GamesPlayerLevelResource.fromJson(_json['nextLevel']);
+      nextLevel = GamesPlayerLevelResource.fromJson(
+          _json['nextLevel'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1261,7 +1305,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('player')) {
-      player = Player.fromJson(_json['player']);
+      player = Player.fromJson(
+          _json['player'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1297,7 +1342,8 @@
   HiddenPlayerList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<HiddenPlayer>((value) => HiddenPlayer.fromJson(value))
+          .map<HiddenPlayer>((value) => HiddenPlayer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1414,14 +1460,15 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('experienceInfo')) {
-      experienceInfo =
-          GamesPlayerExperienceInfoResource.fromJson(_json['experienceInfo']);
+      experienceInfo = GamesPlayerExperienceInfoResource.fromJson(
+          _json['experienceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('name')) {
-      name = PlayerName.fromJson(_json['name']);
+      name = PlayerName.fromJson(
+          _json['name'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('originalPlayerId')) {
       originalPlayerId = _json['originalPlayerId'] as core.String;
@@ -1430,7 +1477,8 @@
       playerId = _json['playerId'] as core.String;
     }
     if (_json.containsKey('profileSettings')) {
-      profileSettings = ProfileSettings.fromJson(_json['profileSettings']);
+      profileSettings = ProfileSettings.fromJson(
+          _json['profileSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -1493,8 +1541,9 @@
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<PlayerScoreResetResponse>(
-              (value) => PlayerScoreResetResponse.fromJson(value))
+          .map<PlayerScoreResetResponse>((value) =>
+              PlayerScoreResetResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/genomics/v1.dart b/generated/googleapis/lib/genomics/v1.dart
index a01b51f..ac35920 100644
--- a/generated/googleapis/lib/genomics/v1.dart
+++ b/generated/googleapis/lib/genomics/v1.dart
@@ -113,7 +113,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -165,7 +167,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request.
@@ -254,7 +258,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -375,7 +382,8 @@
     }
     if (_json.containsKey('portMappings')) {
       portMappings = commons.mapMap<core.int, core.int>(
-          _json['portMappings'].cast<core.String, core.int>(),
+          (_json['portMappings'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.int>(),
           (core.int item) => item as core.int);
     }
   }
@@ -522,7 +530,8 @@
     }
     if (_json.containsKey('details')) {
       details = commons.mapMap<core.Object, core.Object>(
-          _json['details'].cast<core.String, core.Object>(),
+          (_json['details'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('timestamp')) {
@@ -673,7 +682,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -726,11 +736,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -738,7 +750,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -860,12 +873,14 @@
     }
     if (_json.containsKey('events')) {
       events = (_json['events'] as core.List)
-          .map<OperationEvent>((value) => OperationEvent.fromJson(value))
+          .map<OperationEvent>((value) => OperationEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('projectId')) {
@@ -873,12 +888,14 @@
     }
     if (_json.containsKey('request')) {
       request = commons.mapMap<core.Object, core.Object>(
-          _json['request'].cast<core.String, core.Object>(),
+          (_json['request'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('runtimeMetadata')) {
       runtimeMetadata = commons.mapMap<core.Object, core.Object>(
-          _json['runtimeMetadata'].cast<core.String, core.Object>(),
+          (_json['runtimeMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('startTime')) {
@@ -988,7 +1005,8 @@
 
   RuntimeMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('computeEngine')) {
-      computeEngine = ComputeEngine.fromJson(_json['computeEngine']);
+      computeEngine = ComputeEngine.fromJson(
+          _json['computeEngine'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1033,7 +1051,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/gmail/v1.dart b/generated/googleapis/lib/gmail/v1.dart
index 4ddba63..354b3fd 100644
--- a/generated/googleapis/lib/gmail/v1.dart
+++ b/generated/googleapis/lib/gmail/v1.dart
@@ -167,7 +167,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Profile.fromJson(data));
+    return _response.then(
+      (data) => Profile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stop receiving push notifications for the given user mailbox.
@@ -217,7 +219,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Set up or update a push notification watch on the given user mailbox.
@@ -273,7 +277,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WatchResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          WatchResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -357,7 +364,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Draft.fromJson(data));
+    return _response.then(
+      (data) => Draft.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Immediately and permanently deletes the specified draft. Does not simply
@@ -416,7 +425,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified draft.
@@ -491,7 +502,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Draft.fromJson(data));
+    return _response.then(
+      (data) => Draft.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the drafts in the user's mailbox.
@@ -570,7 +583,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDraftsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDraftsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sends the specified, existing draft to the recipients in the `To`, `Cc`,
@@ -649,7 +665,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replaces a draft's content.
@@ -736,7 +754,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Draft.fromJson(data));
+    return _response.then(
+      (data) => Draft.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -835,7 +855,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListHistoryResponse.fromJson(data));
+    return _response.then(
+      (data) => ListHistoryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -898,7 +921,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Label.fromJson(data));
+    return _response.then(
+      (data) => Label.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Immediately and permanently deletes the specified label and removes it
@@ -957,7 +982,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified label.
@@ -1015,7 +1042,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Label.fromJson(data));
+    return _response.then(
+      (data) => Label.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all labels in the user's mailbox.
@@ -1066,7 +1095,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLabelsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLabelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch the specified label.
@@ -1130,7 +1162,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Label.fromJson(data));
+    return _response.then(
+      (data) => Label.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified label.
@@ -1194,7 +1228,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Label.fromJson(data));
+    return _response.then(
+      (data) => Label.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1261,7 +1297,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Modifies the labels on the specified messages.
@@ -1318,7 +1356,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Immediately and permanently deletes the specified message. This operation
@@ -1377,7 +1417,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified message.
@@ -1459,7 +1501,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports a message into only this user's mailbox, with standard email
@@ -1573,7 +1617,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Directly inserts a message into only this user's mailbox similar to `IMAP
@@ -1672,7 +1718,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the messages in the user's mailbox.
@@ -1759,7 +1807,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListMessagesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListMessagesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the labels on the specified message.
@@ -1824,7 +1875,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sends the specified message to the recipients in the `To`, `Cc`, and `Bcc`
@@ -1903,7 +1956,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves the specified message to the trash.
@@ -1962,7 +2017,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes the specified message from the trash.
@@ -2021,7 +2078,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2094,7 +2153,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MessagePartBody.fromJson(data));
+    return _response.then(
+      (data) =>
+          MessagePartBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2160,7 +2222,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoForwarding.fromJson(data));
+    return _response.then(
+      (data) =>
+          AutoForwarding.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets IMAP settings.
@@ -2211,7 +2276,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImapSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          ImapSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets language settings.
@@ -2262,7 +2330,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LanguageSettings.fromJson(data));
+    return _response.then(
+      (data) => LanguageSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets POP settings.
@@ -2313,7 +2384,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PopSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          PopSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets vacation responder settings.
@@ -2364,7 +2438,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VacationSettings.fromJson(data));
+    return _response.then(
+      (data) => VacationSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the auto-forwarding setting for the specified account. A verified
@@ -2424,7 +2501,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AutoForwarding.fromJson(data));
+    return _response.then(
+      (data) =>
+          AutoForwarding.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates IMAP settings.
@@ -2481,7 +2561,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImapSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          ImapSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates language settings. If successful, the return object contains the
@@ -2542,7 +2625,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LanguageSettings.fromJson(data));
+    return _response.then(
+      (data) => LanguageSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates POP settings.
@@ -2599,7 +2685,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PopSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          PopSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates vacation responder settings.
@@ -2656,7 +2745,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VacationSettings.fromJson(data));
+    return _response.then(
+      (data) => VacationSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2730,7 +2822,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Delegate.fromJson(data));
+    return _response.then(
+      (data) => Delegate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes the specified delegate (which can be of any verification status),
@@ -2793,7 +2887,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified delegate. Note that a delegate user must be referred to
@@ -2855,7 +2951,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Delegate.fromJson(data));
+    return _response.then(
+      (data) => Delegate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the delegates for the specified account. This method is only
@@ -2908,7 +3006,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDelegatesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDelegatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2972,7 +3073,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filter.fromJson(data));
+    return _response.then(
+      (data) => Filter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a filter.
@@ -3030,7 +3133,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a filter.
@@ -3088,7 +3193,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Filter.fromJson(data));
+    return _response.then(
+      (data) => Filter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the message filters of a Gmail user.
@@ -3139,7 +3246,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFiltersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFiltersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3207,7 +3317,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ForwardingAddress.fromJson(data));
+    return _response.then(
+      (data) => ForwardingAddress.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified forwarding address and revokes any verification that
@@ -3267,7 +3380,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified forwarding address.
@@ -3325,7 +3440,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ForwardingAddress.fromJson(data));
+    return _response.then(
+      (data) => ForwardingAddress.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the forwarding addresses for the specified account.
@@ -3376,8 +3494,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListForwardingAddressesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListForwardingAddressesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3452,7 +3572,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SendAs.fromJson(data));
+    return _response.then(
+      (data) => SendAs.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified send-as alias. Revokes any verification that may
@@ -3512,7 +3634,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified send-as alias. Fails with an HTTP 404 error if the
@@ -3571,7 +3695,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SendAs.fromJson(data));
+    return _response.then(
+      (data) => SendAs.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the send-as aliases for the specified account. The result includes
@@ -3624,7 +3750,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSendAsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSendAsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch the specified send-as alias.
@@ -3688,7 +3817,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SendAs.fromJson(data));
+    return _response.then(
+      (data) => SendAs.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a send-as alias. If a signature is provided, Gmail will sanitize
@@ -3755,7 +3886,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SendAs.fromJson(data));
+    return _response.then(
+      (data) => SendAs.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sends a verification email to the specified send-as alias address. The
@@ -3816,7 +3949,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -3890,7 +4025,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified S/MIME config for the specified send-as alias.
@@ -3957,7 +4094,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SmimeInfo.fromJson(data));
+    return _response.then(
+      (data) => SmimeInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Insert (upload) the given S/MIME config for the specified send-as alias.
@@ -4024,7 +4163,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SmimeInfo.fromJson(data));
+    return _response.then(
+      (data) => SmimeInfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists S/MIME configs for the specified send-as alias.
@@ -4084,7 +4225,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSmimeInfoResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSmimeInfoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the default S/MIME config for the specified send-as alias.
@@ -4152,7 +4296,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -4217,7 +4363,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets the specified thread.
@@ -4295,7 +4443,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Thread.fromJson(data));
+    return _response.then(
+      (data) => Thread.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the threads in the user's mailbox.
@@ -4382,7 +4532,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListThreadsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListThreadsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the labels applied to the thread. This applies to all messages in
@@ -4448,7 +4601,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Thread.fromJson(data));
+    return _response.then(
+      (data) => Thread.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves the specified thread to the trash.
@@ -4507,7 +4662,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Thread.fromJson(data));
+    return _response.then(
+      (data) => Thread.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes the specified thread from the trash.
@@ -4566,7 +4723,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Thread.fromJson(data));
+    return _response.then(
+      (data) => Thread.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4744,7 +4903,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4776,10 +4936,12 @@
 
   Filter.fromJson(core.Map _json) {
     if (_json.containsKey('action')) {
-      action = FilterAction.fromJson(_json['action']);
+      action = FilterAction.fromJson(
+          _json['action'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('criteria')) {
-      criteria = FilterCriteria.fromJson(_json['criteria']);
+      criteria = FilterCriteria.fromJson(
+          _json['criteria'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -5019,30 +5181,32 @@
     }
     if (_json.containsKey('labelsAdded')) {
       labelsAdded = (_json['labelsAdded'] as core.List)
-          .map<HistoryLabelAdded>((value) => HistoryLabelAdded.fromJson(value))
+          .map<HistoryLabelAdded>((value) => HistoryLabelAdded.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labelsRemoved')) {
       labelsRemoved = (_json['labelsRemoved'] as core.List)
-          .map<HistoryLabelRemoved>(
-              (value) => HistoryLabelRemoved.fromJson(value))
+          .map<HistoryLabelRemoved>((value) => HistoryLabelRemoved.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
-          .map<Message>((value) => Message.fromJson(value))
+          .map<Message>((value) =>
+              Message.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('messagesAdded')) {
       messagesAdded = (_json['messagesAdded'] as core.List)
-          .map<HistoryMessageAdded>(
-              (value) => HistoryMessageAdded.fromJson(value))
+          .map<HistoryMessageAdded>((value) => HistoryMessageAdded.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('messagesDeleted')) {
       messagesDeleted = (_json['messagesDeleted'] as core.List)
-          .map<HistoryMessageDeleted>(
-              (value) => HistoryMessageDeleted.fromJson(value))
+          .map<HistoryMessageDeleted>((value) => HistoryMessageDeleted.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5089,7 +5253,8 @@
           .toList();
     }
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5119,7 +5284,8 @@
           .toList();
     }
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5142,7 +5308,8 @@
 
   HistoryMessageAdded.fromJson(core.Map _json) {
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5162,7 +5329,8 @@
 
   HistoryMessageDeleted.fromJson(core.Map _json) {
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5292,7 +5460,8 @@
 
   Label.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = LabelColor.fromJson(_json['color']);
+      color = LabelColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -5462,7 +5631,8 @@
   ListDelegatesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('delegates')) {
       delegates = (_json['delegates'] as core.List)
-          .map<Delegate>((value) => Delegate.fromJson(value))
+          .map<Delegate>((value) =>
+              Delegate.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5493,7 +5663,8 @@
   ListDraftsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('drafts')) {
       drafts = (_json['drafts'] as core.List)
-          .map<Draft>((value) => Draft.fromJson(value))
+          .map<Draft>((value) =>
+              Draft.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5529,7 +5700,8 @@
   ListFiltersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('filter')) {
       filter = (_json['filter'] as core.List)
-          .map<Filter>((value) => Filter.fromJson(value))
+          .map<Filter>((value) =>
+              Filter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5553,7 +5725,8 @@
   ListForwardingAddressesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('forwardingAddresses')) {
       forwardingAddresses = (_json['forwardingAddresses'] as core.List)
-          .map<ForwardingAddress>((value) => ForwardingAddress.fromJson(value))
+          .map<ForwardingAddress>((value) => ForwardingAddress.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5584,7 +5757,8 @@
   ListHistoryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('history')) {
       history = (_json['history'] as core.List)
-          .map<History>((value) => History.fromJson(value))
+          .map<History>((value) =>
+              History.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('historyId')) {
@@ -5621,7 +5795,8 @@
   ListLabelsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<Label>((value) => Label.fromJson(value))
+          .map<Label>((value) =>
+              Label.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5652,7 +5827,8 @@
   ListMessagesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
-          .map<Message>((value) => Message.fromJson(value))
+          .map<Message>((value) =>
+              Message.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5688,7 +5864,8 @@
   ListSendAsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('sendAs')) {
       sendAs = (_json['sendAs'] as core.List)
-          .map<SendAs>((value) => SendAs.fromJson(value))
+          .map<SendAs>((value) =>
+              SendAs.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5711,7 +5888,8 @@
   ListSmimeInfoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('smimeInfo')) {
       smimeInfo = (_json['smimeInfo'] as core.List)
-          .map<SmimeInfo>((value) => SmimeInfo.fromJson(value))
+          .map<SmimeInfo>((value) =>
+              SmimeInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5748,7 +5926,8 @@
     }
     if (_json.containsKey('threads')) {
       threads = (_json['threads'] as core.List)
-          .map<Thread>((value) => Thread.fromJson(value))
+          .map<Thread>((value) =>
+              Thread.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5832,7 +6011,8 @@
           .toList();
     }
     if (_json.containsKey('payload')) {
-      payload = MessagePart.fromJson(_json['payload']);
+      payload = MessagePart.fromJson(
+          _json['payload'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('raw')) {
       raw = _json['raw'] as core.String;
@@ -5912,14 +6092,16 @@
 
   MessagePart.fromJson(core.Map _json) {
     if (_json.containsKey('body')) {
-      body = MessagePartBody.fromJson(_json['body']);
+      body = MessagePartBody.fromJson(
+          _json['body'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filename')) {
       filename = _json['filename'] as core.String;
     }
     if (_json.containsKey('headers')) {
       headers = (_json['headers'] as core.List)
-          .map<MessagePartHeader>((value) => MessagePartHeader.fromJson(value))
+          .map<MessagePartHeader>((value) => MessagePartHeader.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mimeType')) {
@@ -5930,7 +6112,8 @@
     }
     if (_json.containsKey('parts')) {
       parts = (_json['parts'] as core.List)
-          .map<MessagePart>((value) => MessagePart.fromJson(value))
+          .map<MessagePart>((value) => MessagePart.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6283,7 +6466,8 @@
       signature = _json['signature'] as core.String;
     }
     if (_json.containsKey('smtpMsa')) {
-      smtpMsa = SmtpMsa.fromJson(_json['smtpMsa']);
+      smtpMsa = SmtpMsa.fromJson(
+          _json['smtpMsa'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('treatAsAlias')) {
       treatAsAlias = _json['treatAsAlias'] as core.bool;
@@ -6509,7 +6693,8 @@
     }
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
-          .map<Message>((value) => Message.fromJson(value))
+          .map<Message>((value) =>
+              Message.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('snippet')) {
diff --git a/generated/googleapis/lib/groupsmigration/v1.dart b/generated/googleapis/lib/groupsmigration/v1.dart
index e11e2c8..db31d51 100644
--- a/generated/googleapis/lib/groupsmigration/v1.dart
+++ b/generated/googleapis/lib/groupsmigration/v1.dart
@@ -119,7 +119,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Groups.fromJson(data));
+    return _response.then(
+      (data) => Groups.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
diff --git a/generated/googleapis/lib/groupssettings/v1.dart b/generated/googleapis/lib/groupssettings/v1.dart
index 2b8c040..eefc3ac 100644
--- a/generated/googleapis/lib/groupssettings/v1.dart
+++ b/generated/googleapis/lib/groupssettings/v1.dart
@@ -97,7 +97,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Groups.fromJson(data));
+    return _response.then(
+      (data) => Groups.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource. This method supports patch semantics.
@@ -151,7 +153,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Groups.fromJson(data));
+    return _response.then(
+      (data) => Groups.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -205,7 +209,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Groups.fromJson(data));
+    return _response.then(
+      (data) => Groups.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
diff --git a/generated/googleapis/lib/healthcare/v1.dart b/generated/googleapis/lib/healthcare/v1.dart
index 71db618..52e2d15 100644
--- a/generated/googleapis/lib/healthcare/v1.dart
+++ b/generated/googleapis/lib/healthcare/v1.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -179,7 +181,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -262,7 +267,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new dataset containing de-identified data from the source
@@ -327,7 +334,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified health dataset and all data contained in the
@@ -379,7 +388,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets any metadata associated with a dataset.
@@ -429,7 +440,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -497,7 +510,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the health datasets in the current project.
@@ -562,7 +577,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDatasetsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDatasetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates dataset metadata.
@@ -626,7 +644,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Dataset.fromJson(data));
+    return _response.then(
+      (data) => Dataset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -687,7 +707,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -750,7 +772,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -824,7 +849,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DicomStore.fromJson(data));
+    return _response.then(
+      (data) =>
+          DicomStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// De-identifies data from the source store and writes it to the destination
@@ -890,7 +918,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified DICOM store and removes all images that are
@@ -941,7 +971,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Exports data to the specified destination by copying it from the DICOM
@@ -1002,7 +1034,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified DICOM store.
@@ -1052,7 +1086,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DicomStore.fromJson(data));
+    return _response.then(
+      (data) =>
+          DicomStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -1121,7 +1158,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports data into the DICOM store by copying it from the specified source.
@@ -1182,7 +1221,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the DICOM stores in the given dataset.
@@ -1255,7 +1296,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDicomStoresResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDicomStoresResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified DICOM store.
@@ -1320,7 +1364,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DicomStore.fromJson(data));
+    return _response.then(
+      (data) =>
+          DicomStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// SearchForInstances returns a list of matching instances. See [Search
@@ -1392,7 +1439,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// SearchForSeries returns a list of matching series. See [Search
@@ -1463,7 +1512,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// SearchForStudies returns a list of matching studies. See [Search
@@ -1534,7 +1585,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1596,7 +1649,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// StoreInstances stores DICOM instances associated with study instance
@@ -1672,7 +1727,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1736,7 +1793,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1816,7 +1876,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveStudyMetadata returns instance associated with the given study
@@ -1887,7 +1949,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveStudy returns all instances within the given study. See
@@ -1957,7 +2021,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// SearchForInstances returns a list of matching instances. See [Search
@@ -2029,7 +2095,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// SearchForSeries returns a list of matching series. See [Search
@@ -2100,7 +2168,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// StoreInstances stores DICOM instances associated with study instance
@@ -2176,7 +2246,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2260,7 +2332,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveSeriesMetadata returns instance associated with the given study
@@ -2331,7 +2405,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveSeries returns all instances within the given study and series.
@@ -2401,7 +2477,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// SearchForInstances returns a list of matching instances. See [Search
@@ -2473,7 +2551,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2555,7 +2635,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveInstance returns instance associated with the given study, series,
@@ -2628,7 +2710,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveInstanceMetadata returns instance associated with the given study,
@@ -2702,7 +2786,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveRenderedInstance returns instance associated with the given study,
@@ -2776,7 +2862,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2856,7 +2944,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// RetrieveRenderedFrames returns instances associated with the given study,
@@ -2929,7 +3019,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3003,7 +3095,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FhirStore.fromJson(data));
+    return _response.then(
+      (data) => FhirStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// De-identifies data from the source store and writes it to the destination
@@ -3066,7 +3160,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified FHIR store and removes all resources within it.
@@ -3116,7 +3212,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Export resources from the FHIR store to the specified destination. This
@@ -3181,7 +3279,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the configuration of the specified FHIR store.
@@ -3231,7 +3331,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FhirStore.fromJson(data));
+    return _response.then(
+      (data) => FhirStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -3300,7 +3402,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Imports resources to the FHIR store by loading data from the specified
@@ -3408,7 +3512,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the FHIR stores in the given dataset.
@@ -3481,7 +3587,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFhirStoresResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFhirStoresResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the configuration of the specified FHIR store.
@@ -3546,7 +3655,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FhirStore.fromJson(data));
+    return _response.then(
+      (data) => FhirStore.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -3608,7 +3719,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -3672,7 +3785,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3800,7 +3916,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes all the historical versions of a resource (excluding the current
@@ -3855,7 +3973,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the FHIR capability statement
@@ -3920,7 +4040,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a FHIR resource. Implements the FHIR standard create interaction
@@ -4005,7 +4127,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a FHIR resource. Implements the FHIR standard delete interaction
@@ -4064,7 +4188,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Executes all the requests in the given Bundle. Implements the FHIR
@@ -4146,7 +4272,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the versions of a resource (including the current version and
@@ -4248,7 +4376,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates part of an existing resource by applying the operations specified
@@ -4319,7 +4449,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the contents of a FHIR resource. Implements the FHIR standard read
@@ -4386,7 +4518,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches for resources in the given FHIR store according to criteria
@@ -4487,7 +4621,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the entire contents of a resource. Implements the FHIR standard
@@ -4560,7 +4696,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the contents of a version (current or historical) of a FHIR resource
@@ -4621,7 +4759,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HttpBody.fromJson(data));
+    return _response.then(
+      (data) => HttpBody.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4695,7 +4835,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Hl7V2Store.fromJson(data));
+    return _response.then(
+      (data) =>
+          Hl7V2Store.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified HL7v2 store and removes all messages that it
@@ -4746,7 +4889,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified HL7v2 store.
@@ -4796,7 +4941,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Hl7V2Store.fromJson(data));
+    return _response.then(
+      (data) =>
+          Hl7V2Store.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -4865,7 +5013,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the HL7v2 stores in the given dataset.
@@ -4938,7 +5088,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListHl7V2StoresResponse.fromJson(data));
+    return _response.then(
+      (data) => ListHl7V2StoresResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the HL7v2 store.
@@ -5003,7 +5156,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Hl7V2Store.fromJson(data));
+    return _response.then(
+      (data) =>
+          Hl7V2Store.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -5065,7 +5221,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -5129,7 +5287,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5199,7 +5360,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an HL7v2 message.
@@ -5249,7 +5412,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an HL7v2 message.
@@ -5314,7 +5479,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Parses and stores an HL7v2 message. This method triggers an asynchronous
@@ -5380,7 +5547,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IngestMessageResponse.fromJson(data));
+    return _response.then(
+      (data) => IngestMessageResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the messages in the given HL7v2 store with support for
@@ -5495,7 +5665,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListMessagesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListMessagesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the message. The contents of the message in Message.data and data
@@ -5565,7 +5738,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Message.fromJson(data));
+    return _response.then(
+      (data) => Message.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5636,7 +5811,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -5688,7 +5865,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -5764,7 +5943,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5798,7 +5980,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -5912,7 +6095,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -5984,7 +6168,8 @@
 
   CreateMessageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6120,16 +6305,20 @@
 
   DeidentifyConfig.fromJson(core.Map _json) {
     if (_json.containsKey('dicom')) {
-      dicom = DicomConfig.fromJson(_json['dicom']);
+      dicom = DicomConfig.fromJson(
+          _json['dicom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fhir')) {
-      fhir = FhirConfig.fromJson(_json['fhir']);
+      fhir = FhirConfig.fromJson(
+          _json['fhir'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('image')) {
-      image = ImageConfig.fromJson(_json['image']);
+      image = ImageConfig.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text = TextConfig.fromJson(_json['text']);
+      text = TextConfig.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6166,7 +6355,8 @@
 
   DeidentifyDatasetRequest.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = DeidentifyConfig.fromJson(_json['config']);
+      config = DeidentifyConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationDataset')) {
       destinationDataset = _json['destinationDataset'] as core.String;
@@ -6207,13 +6397,15 @@
 
   DeidentifyDicomStoreRequest.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = DeidentifyConfig.fromJson(_json['config']);
+      config = DeidentifyConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationStore')) {
       destinationStore = _json['destinationStore'] as core.String;
     }
     if (_json.containsKey('filterConfig')) {
-      filterConfig = DicomFilterConfig.fromJson(_json['filterConfig']);
+      filterConfig = DicomFilterConfig.fromJson(
+          _json['filterConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6255,13 +6447,15 @@
 
   DeidentifyFhirStoreRequest.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = DeidentifyConfig.fromJson(_json['config']);
+      config = DeidentifyConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('destinationStore')) {
       destinationStore = _json['destinationStore'] as core.String;
     }
     if (_json.containsKey('resourceFilter')) {
-      resourceFilter = FhirFilter.fromJson(_json['resourceFilter']);
+      resourceFilter = FhirFilter.fromJson(
+          _json['resourceFilter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6336,10 +6530,12 @@
       filterProfile = _json['filterProfile'] as core.String;
     }
     if (_json.containsKey('keepList')) {
-      keepList = TagFilterList.fromJson(_json['keepList']);
+      keepList = TagFilterList.fromJson(
+          _json['keepList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('removeList')) {
-      removeList = TagFilterList.fromJson(_json['removeList']);
+      removeList = TagFilterList.fromJson(
+          _json['removeList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skipIdRedaction')) {
       skipIdRedaction = _json['skipIdRedaction'] as core.bool;
@@ -6417,15 +6613,16 @@
   DicomStore.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('notificationConfig')) {
-      notificationConfig =
-          NotificationConfig.fromJson(_json['notificationConfig']);
+      notificationConfig = NotificationConfig.fromJson(
+          _json['notificationConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6483,11 +6680,12 @@
     if (_json.containsKey('bigqueryDestination')) {
       bigqueryDestination =
           GoogleCloudHealthcareV1DicomBigQueryDestination.fromJson(
-              _json['bigqueryDestination']);
+              _json['bigqueryDestination']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gcsDestination')) {
       gcsDestination = GoogleCloudHealthcareV1DicomGcsDestination.fromJson(
-          _json['gcsDestination']);
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6537,11 +6735,12 @@
     if (_json.containsKey('bigqueryDestination')) {
       bigqueryDestination =
           GoogleCloudHealthcareV1FhirBigQueryDestination.fromJson(
-              _json['bigqueryDestination']);
+              _json['bigqueryDestination']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gcsDestination')) {
       gcsDestination = GoogleCloudHealthcareV1FhirGcsDestination.fromJson(
-          _json['gcsDestination']);
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6653,7 +6852,8 @@
   FhirConfig.fromJson(core.Map _json) {
     if (_json.containsKey('fieldMetadataList')) {
       fieldMetadataList = (_json['fieldMetadataList'] as core.List)
-          .map<FieldMetadata>((value) => FieldMetadata.fromJson(value))
+          .map<FieldMetadata>((value) => FieldMetadata.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6678,7 +6878,8 @@
 
   FhirFilter.fromJson(core.Map _json) {
     if (_json.containsKey('resources')) {
-      resources = Resources.fromJson(_json['resources']);
+      resources = Resources.fromJson(
+          _json['resources'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6786,19 +6987,21 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('notificationConfig')) {
-      notificationConfig =
-          NotificationConfig.fromJson(_json['notificationConfig']);
+      notificationConfig = NotificationConfig.fromJson(
+          _json['notificationConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('streamConfigs')) {
       streamConfigs = (_json['streamConfigs'] as core.List)
-          .map<StreamConfig>((value) => StreamConfig.fromJson(value))
+          .map<StreamConfig>((value) => StreamConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -7062,7 +7265,8 @@
       force = _json['force'] as core.bool;
     }
     if (_json.containsKey('schemaConfig')) {
-      schemaConfig = SchemaConfig.fromJson(_json['schemaConfig']);
+      schemaConfig = SchemaConfig.fromJson(
+          _json['schemaConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7246,7 +7450,8 @@
   Hl7V2Store.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -7254,12 +7459,14 @@
     }
     if (_json.containsKey('notificationConfigs')) {
       notificationConfigs = (_json['notificationConfigs'] as core.List)
-          .map<Hl7V2NotificationConfig>(
-              (value) => Hl7V2NotificationConfig.fromJson(value))
+          .map<Hl7V2NotificationConfig>((value) =>
+              Hl7V2NotificationConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parserConfig')) {
-      parserConfig = ParserConfig.fromJson(_json['parserConfig']);
+      parserConfig = ParserConfig.fromJson(
+          _json['parserConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rejectDuplicateMessage')) {
       rejectDuplicateMessage = _json['rejectDuplicateMessage'] as core.bool;
@@ -7339,7 +7546,8 @@
       extensions = (_json['extensions'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -7400,8 +7608,8 @@
 
   ImportDicomDataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('gcsSource')) {
-      gcsSource =
-          GoogleCloudHealthcareV1DicomGcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GoogleCloudHealthcareV1DicomGcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7460,8 +7668,8 @@
       contentStructure = _json['contentStructure'] as core.String;
     }
     if (_json.containsKey('gcsSource')) {
-      gcsSource =
-          GoogleCloudHealthcareV1FhirGcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GoogleCloudHealthcareV1FhirGcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7519,14 +7727,16 @@
 
   InfoTypeTransformation.fromJson(core.Map _json) {
     if (_json.containsKey('characterMaskConfig')) {
-      characterMaskConfig =
-          CharacterMaskConfig.fromJson(_json['characterMaskConfig']);
+      characterMaskConfig = CharacterMaskConfig.fromJson(
+          _json['characterMaskConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cryptoHashConfig')) {
-      cryptoHashConfig = CryptoHashConfig.fromJson(_json['cryptoHashConfig']);
+      cryptoHashConfig = CryptoHashConfig.fromJson(
+          _json['cryptoHashConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dateShiftConfig')) {
-      dateShiftConfig = DateShiftConfig.fromJson(_json['dateShiftConfig']);
+      dateShiftConfig = DateShiftConfig.fromJson(
+          _json['dateShiftConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('infoTypes')) {
       infoTypes = (_json['infoTypes'] as core.List)
@@ -7534,11 +7744,13 @@
           .toList();
     }
     if (_json.containsKey('redactConfig')) {
-      redactConfig = RedactConfig.fromJson(_json['redactConfig']);
+      redactConfig = RedactConfig.fromJson(
+          _json['redactConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceWithInfoTypeConfig')) {
       replaceWithInfoTypeConfig = ReplaceWithInfoTypeConfig.fromJson(
-          _json['replaceWithInfoTypeConfig']);
+          _json['replaceWithInfoTypeConfig']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7575,7 +7787,8 @@
 
   IngestMessageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7610,7 +7823,8 @@
       hl7Ack = _json['hl7Ack'] as core.String;
     }
     if (_json.containsKey('message')) {
-      message = Message.fromJson(_json['message']);
+      message = Message.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7640,7 +7854,8 @@
   ListDatasetsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('datasets')) {
       datasets = (_json['datasets'] as core.List)
-          .map<Dataset>((value) => Dataset.fromJson(value))
+          .map<Dataset>((value) =>
+              Dataset.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7675,7 +7890,8 @@
   ListDicomStoresResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dicomStores')) {
       dicomStores = (_json['dicomStores'] as core.List)
-          .map<DicomStore>((value) => DicomStore.fromJson(value))
+          .map<DicomStore>((value) =>
+              DicomStore.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7711,7 +7927,8 @@
   ListFhirStoresResponse.fromJson(core.Map _json) {
     if (_json.containsKey('fhirStores')) {
       fhirStores = (_json['fhirStores'] as core.List)
-          .map<FhirStore>((value) => FhirStore.fromJson(value))
+          .map<FhirStore>((value) =>
+              FhirStore.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7746,7 +7963,8 @@
   ListHl7V2StoresResponse.fromJson(core.Map _json) {
     if (_json.containsKey('hl7V2Stores')) {
       hl7V2Stores = (_json['hl7V2Stores'] as core.List)
-          .map<Hl7V2Store>((value) => Hl7V2Store.fromJson(value))
+          .map<Hl7V2Store>((value) =>
+              Hl7V2Store.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7780,7 +7998,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7815,7 +8034,8 @@
   ListMessagesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('hl7V2Messages')) {
       hl7V2Messages = (_json['hl7V2Messages'] as core.List)
-          .map<Message>((value) => Message.fromJson(value))
+          .map<Message>((value) =>
+              Message.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7852,7 +8072,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7901,7 +8122,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -7909,7 +8131,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -7996,7 +8219,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('messageType')) {
@@ -8006,11 +8230,13 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parsedData')) {
-      parsedData = ParsedData.fromJson(_json['parsedData']);
+      parsedData = ParsedData.fromJson(
+          _json['parsedData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('patientIds')) {
       patientIds = (_json['patientIds'] as core.List)
-          .map<PatientId>((value) => PatientId.fromJson(value))
+          .map<PatientId>((value) =>
+              PatientId.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sendFacility')) {
@@ -8135,11 +8361,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -8147,7 +8375,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -8204,7 +8433,8 @@
       cancelRequested = _json['cancelRequested'] as core.bool;
     }
     if (_json.containsKey('counter')) {
-      counter = ProgressCounter.fromJson(_json['counter']);
+      counter = ProgressCounter.fromJson(
+          _json['counter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -8250,7 +8480,8 @@
   ParsedData.fromJson(core.Map _json) {
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
-          .map<Segment>((value) => Segment.fromJson(value))
+          .map<Segment>((value) =>
+              Segment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8414,12 +8645,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -8643,7 +8876,8 @@
   Segment.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = commons.mapMap<core.String, core.String>(
-          _json['fields'].cast<core.String, core.String>(),
+          (_json['fields'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('segmentId')) {
@@ -8686,7 +8920,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -8737,7 +8972,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -8806,7 +9042,8 @@
     if (_json.containsKey('bigqueryDestination')) {
       bigqueryDestination =
           GoogleCloudHealthcareV1FhirBigQueryDestination.fromJson(
-              _json['bigqueryDestination']);
+              _json['bigqueryDestination']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceTypes')) {
       resourceTypes = (_json['resourceTypes'] as core.List)
@@ -8916,8 +9153,9 @@
   TextConfig.fromJson(core.Map _json) {
     if (_json.containsKey('transformations')) {
       transformations = (_json['transformations'] as core.List)
-          .map<InfoTypeTransformation>(
-              (value) => InfoTypeTransformation.fromJson(value))
+          .map<InfoTypeTransformation>((value) =>
+              InfoTypeTransformation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/homegraph/v1.dart b/generated/googleapis/lib/homegraph/v1.dart
index 33cb460..620fcf1 100644
--- a/generated/googleapis/lib/homegraph/v1.dart
+++ b/generated/googleapis/lib/homegraph/v1.dart
@@ -109,7 +109,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -166,7 +168,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => QueryResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          QueryResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reports device state and optionally sends device notifications. Called by
@@ -225,8 +230,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ReportStateAndNotificationResponse.fromJson(data));
+    return _response.then(
+      (data) => ReportStateAndNotificationResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Requests Google to send an `action.devices.SYNC`
@@ -279,7 +286,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RequestSyncDevicesResponse.fromJson(data));
+    return _response.then(
+      (data) => RequestSyncDevicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets all the devices associated with the given third-party user. The
@@ -330,7 +340,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SyncResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SyncResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -451,22 +464,26 @@
   Device.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
       attributes = commons.mapMap<core.Object, core.Object>(
-          _json['attributes'].cast<core.String, core.Object>(),
+          (_json['attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('customData')) {
       customData = commons.mapMap<core.Object, core.Object>(
-          _json['customData'].cast<core.String, core.Object>(),
+          (_json['customData'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('deviceInfo')) {
-      deviceInfo = DeviceInfo.fromJson(_json['deviceInfo']);
+      deviceInfo = DeviceInfo.fromJson(
+          _json['deviceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('name')) {
-      name = DeviceNames.fromJson(_json['name']);
+      name = DeviceNames.fromJson(
+          _json['name'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('notificationSupportedByAgent')) {
       notificationSupportedByAgent =
@@ -474,8 +491,8 @@
     }
     if (_json.containsKey('otherDeviceIds')) {
       otherDeviceIds = (_json['otherDeviceIds'] as core.List)
-          .map<AgentOtherDeviceId>(
-              (value) => AgentOtherDeviceId.fromJson(value))
+          .map<AgentOtherDeviceId>((value) => AgentOtherDeviceId.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('roomHint')) {
@@ -673,7 +690,8 @@
     }
     if (_json.containsKey('inputs')) {
       inputs = (_json['inputs'] as core.List)
-          .map<QueryRequestInput>((value) => QueryRequestInput.fromJson(value))
+          .map<QueryRequestInput>((value) => QueryRequestInput.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestId')) {
@@ -705,7 +723,8 @@
 
   QueryRequestInput.fromJson(core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload = QueryRequestPayload.fromJson(_json['payload']);
+      payload = QueryRequestPayload.fromJson(
+          _json['payload'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -728,7 +747,8 @@
   QueryRequestPayload.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<AgentDeviceId>((value) => AgentDeviceId.fromJson(value))
+          .map<AgentDeviceId>((value) => AgentDeviceId.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -761,7 +781,8 @@
 
   QueryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload = QueryResponsePayload.fromJson(_json['payload']);
+      payload = QueryResponsePayload.fromJson(
+          _json['payload'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestId')) {
       requestId = _json['requestId'] as core.String;
@@ -794,9 +815,11 @@
   QueryResponsePayload.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
       devices = commons.mapMap<core.Map, core.Map<core.String, core.Object>>(
-          _json['devices'].cast<core.String, core.Map>(),
+          (_json['devices'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
           (core.Map item) => commons.mapMap<core.Object, core.Object>(
-              item.cast<core.String, core.Object>(),
+              (item as core.Map<core.String, core.dynamic>)
+                  .cast<core.String, core.Object>(),
               (core.Object item) => item as core.Object));
     }
   }
@@ -833,12 +856,14 @@
   ReportStateAndNotificationDevice.fromJson(core.Map _json) {
     if (_json.containsKey('notifications')) {
       notifications = commons.mapMap<core.Object, core.Object>(
-          _json['notifications'].cast<core.String, core.Object>(),
+          (_json['notifications'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('states')) {
       states = commons.mapMap<core.Object, core.Object>(
-          _json['states'].cast<core.String, core.Object>(),
+          (_json['states'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -896,7 +921,8 @@
       followUpToken = _json['followUpToken'] as core.String;
     }
     if (_json.containsKey('payload')) {
-      payload = StateAndNotificationPayload.fromJson(_json['payload']);
+      payload = StateAndNotificationPayload.fromJson(
+          _json['payload'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestId')) {
       requestId = _json['requestId'] as core.String;
@@ -1009,7 +1035,8 @@
 
   StateAndNotificationPayload.fromJson(core.Map _json) {
     if (_json.containsKey('devices')) {
-      devices = ReportStateAndNotificationDevice.fromJson(_json['devices']);
+      devices = ReportStateAndNotificationDevice.fromJson(
+          _json['devices'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1077,7 +1104,8 @@
 
   SyncResponse.fromJson(core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload = SyncResponsePayload.fromJson(_json['payload']);
+      payload = SyncResponsePayload.fromJson(
+          _json['payload'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestId')) {
       requestId = _json['requestId'] as core.String;
@@ -1112,7 +1140,8 @@
     }
     if (_json.containsKey('devices')) {
       devices = (_json['devices'] as core.List)
-          .map<Device>((value) => Device.fromJson(value))
+          .map<Device>((value) =>
+              Device.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/iam/v1.dart b/generated/googleapis/lib/iam/v1.dart
index f3ae9dc..ad1845b 100644
--- a/generated/googleapis/lib/iam/v1.dart
+++ b/generated/googleapis/lib/iam/v1.dart
@@ -111,7 +111,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LintPolicyResponse.fromJson(data));
+    return _response.then(
+      (data) => LintPolicyResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of services that allow you to opt into audit logs that are
@@ -161,8 +164,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => QueryAuditableServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => QueryAuditableServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -247,7 +252,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a custom Role. When you delete a custom role, the following
@@ -325,7 +332,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the definition of a Role.
@@ -395,7 +404,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists every predefined Role that IAM supports, or every custom role that
@@ -497,7 +508,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRolesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRolesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the definition of a custom Role.
@@ -574,7 +588,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a custom Role.
@@ -645,7 +661,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -701,8 +719,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => QueryTestablePermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => QueryTestablePermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -787,7 +807,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a custom Role. When you delete a custom role, the following
@@ -865,7 +887,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the definition of a Role.
@@ -935,7 +959,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists every predefined Role that IAM supports, or every custom role that
@@ -1037,7 +1063,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRolesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRolesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the definition of a custom Role.
@@ -1114,7 +1143,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a custom Role.
@@ -1185,7 +1216,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1253,7 +1286,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServiceAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a ServiceAccount. **Warning:** After you delete a service account,
@@ -1316,7 +1352,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Disables a ServiceAccount immediately. If an application uses the service
@@ -1386,7 +1424,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables a ServiceAccount that was disabled by DisableServiceAccount. If
@@ -1449,7 +1489,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a ServiceAccount.
@@ -1502,7 +1544,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServiceAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the IAM policy that is attached to a ServiceAccount. This IAM policy
@@ -1576,7 +1621,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists every ServiceAccount that belongs to a specific project.
@@ -1644,7 +1691,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServiceAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServiceAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a ServiceAccount.
@@ -1710,7 +1760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServiceAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the IAM policy that is attached to a ServiceAccount. Use this method
@@ -1779,7 +1832,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// **Note:** This method is deprecated and will stop working on July 1, 2021.
@@ -1847,7 +1902,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SignBlobResponse.fromJson(data));
+    return _response.then(
+      (data) => SignBlobResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// **Note:** This method is deprecated and will stop working on July 1, 2021.
@@ -1915,7 +1973,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SignJwtResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SignJwtResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Tests whether the caller has the specified permissions on a
@@ -1975,7 +2036,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restores a deleted ServiceAccount. **Important:** It is not always
@@ -2036,8 +2100,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => UndeleteServiceAccountResponse.fromJson(data));
+    return _response.then(
+      (data) => UndeleteServiceAccountResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// **Note:** We are in the process of deprecating this method. Use
@@ -2105,7 +2171,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServiceAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2171,7 +2240,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccountKey.fromJson(data));
+    return _response.then(
+      (data) => ServiceAccountKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a ServiceAccountKey. Deleting a service account key does not
@@ -2228,7 +2300,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a ServiceAccountKey.
@@ -2294,7 +2368,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccountKey.fromJson(data));
+    return _response.then(
+      (data) => ServiceAccountKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists every ServiceAccountKey for a service account.
@@ -2355,8 +2432,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListServiceAccountKeysResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServiceAccountKeysResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a ServiceAccountKey, using a public key that you provide.
@@ -2416,7 +2495,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccountKey.fromJson(data));
+    return _response.then(
+      (data) => ServiceAccountKey.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2492,7 +2574,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Role.fromJson(data));
+    return _response.then(
+      (data) => Role.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists every predefined Role that IAM supports, or every custom role that
@@ -2593,7 +2677,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRolesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRolesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists roles that can be granted on a Google Cloud resource. A role is
@@ -2643,7 +2730,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => QueryGrantableRolesResponse.fromJson(data));
+    return _response.then(
+      (data) => QueryGrantableRolesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2658,7 +2748,8 @@
 
   AdminAuditData.fromJson(core.Map _json) {
     if (_json.containsKey('permissionDelta')) {
-      permissionDelta = PermissionDelta.fromJson(_json['permissionDelta']);
+      permissionDelta = PermissionDelta.fromJson(
+          _json['permissionDelta'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2701,7 +2792,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -2732,7 +2824,8 @@
 
   AuditData.fromJson(core.Map _json) {
     if (_json.containsKey('policyDelta')) {
-      policyDelta = PolicyDelta.fromJson(_json['policyDelta']);
+      policyDelta = PolicyDelta.fromJson(
+          _json['policyDelta'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2868,7 +2961,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -2926,7 +3020,8 @@
       action = _json['action'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('member')) {
       member = _json['member'] as core.String;
@@ -2968,7 +3063,8 @@
 
   CreateRoleRequest.fromJson(core.Map _json) {
     if (_json.containsKey('role')) {
-      role = Role.fromJson(_json['role']);
+      role =
+          Role.fromJson(_json['role'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('roleId')) {
       roleId = _json['roleId'] as core.String;
@@ -3051,7 +3147,8 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('serviceAccount')) {
-      serviceAccount = ServiceAccount.fromJson(_json['serviceAccount']);
+      serviceAccount = ServiceAccount.fromJson(
+          _json['serviceAccount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3199,7 +3296,8 @@
 
   LintPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fullResourceName')) {
       fullResourceName = _json['fullResourceName'] as core.String;
@@ -3229,7 +3327,8 @@
   LintPolicyResponse.fromJson(core.Map _json) {
     if (_json.containsKey('lintResults')) {
       lintResults = (_json['lintResults'] as core.List)
-          .map<LintResult>((value) => LintResult.fromJson(value))
+          .map<LintResult>((value) =>
+              LintResult.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3361,7 +3460,8 @@
     }
     if (_json.containsKey('roles')) {
       roles = (_json['roles'] as core.List)
-          .map<Role>((value) => Role.fromJson(value))
+          .map<Role>((value) =>
+              Role.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3388,7 +3488,8 @@
   ListServiceAccountKeysResponse.fromJson(core.Map _json) {
     if (_json.containsKey('keys')) {
       keys = (_json['keys'] as core.List)
-          .map<ServiceAccountKey>((value) => ServiceAccountKey.fromJson(value))
+          .map<ServiceAccountKey>((value) => ServiceAccountKey.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3416,7 +3517,8 @@
   ListServiceAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accounts')) {
       accounts = (_json['accounts'] as core.List)
-          .map<ServiceAccount>((value) => ServiceAccount.fromJson(value))
+          .map<ServiceAccount>((value) => ServiceAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3449,7 +3551,8 @@
 
   PatchServiceAccountRequest.fromJson(core.Map _json) {
     if (_json.containsKey('serviceAccount')) {
-      serviceAccount = ServiceAccount.fromJson(_json['serviceAccount']);
+      serviceAccount = ServiceAccount.fromJson(
+          _json['serviceAccount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -3678,12 +3781,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -3723,7 +3828,8 @@
   PolicyDelta.fromJson(core.Map _json) {
     if (_json.containsKey('bindingDeltas')) {
       bindingDeltas = (_json['bindingDeltas'] as core.List)
-          .map<BindingDelta>((value) => BindingDelta.fromJson(value))
+          .map<BindingDelta>((value) => BindingDelta.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3773,7 +3879,8 @@
   QueryAuditableServicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<AuditableService>((value) => AuditableService.fromJson(value))
+          .map<AuditableService>((value) => AuditableService.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3862,7 +3969,8 @@
     }
     if (_json.containsKey('roles')) {
       roles = (_json['roles'] as core.List)
-          .map<Role>((value) => Role.fromJson(value))
+          .map<Role>((value) =>
+              Role.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3941,7 +4049,8 @@
     }
     if (_json.containsKey('permissions')) {
       permissions = (_json['permissions'] as core.List)
-          .map<Permission>((value) => Permission.fromJson(value))
+          .map<Permission>((value) =>
+              Permission.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4351,7 +4460,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -4617,7 +4727,8 @@
 
   UndeleteServiceAccountResponse.fromJson(core.Map _json) {
     if (_json.containsKey('restoredAccount')) {
-      restoredAccount = ServiceAccount.fromJson(_json['restoredAccount']);
+      restoredAccount = ServiceAccount.fromJson(
+          _json['restoredAccount'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/iamcredentials/v1.dart b/generated/googleapis/lib/iamcredentials/v1.dart
index 931f9e4..468bf3b 100644
--- a/generated/googleapis/lib/iamcredentials/v1.dart
+++ b/generated/googleapis/lib/iamcredentials/v1.dart
@@ -121,7 +121,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GenerateAccessTokenResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateAccessTokenResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Generates an OpenID Connect ID token for a service account.
@@ -181,7 +184,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GenerateIdTokenResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateIdTokenResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Signs a blob using a service account's system-managed private key.
@@ -239,7 +245,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SignBlobResponse.fromJson(data));
+    return _response.then(
+      (data) => SignBlobResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Signs a JWT using a service account's system-managed private key.
@@ -297,7 +306,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SignJwtResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SignJwtResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
diff --git a/generated/googleapis/lib/iap/v1.dart b/generated/googleapis/lib/iap/v1.dart
index 0893e9d..8a5b6a0 100644
--- a/generated/googleapis/lib/iap/v1.dart
+++ b/generated/googleapis/lib/iap/v1.dart
@@ -124,7 +124,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Brand.fromJson(data));
+    return _response.then(
+      (data) => Brand.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the OAuth brand of the project.
@@ -174,7 +176,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Brand.fromJson(data));
+    return _response.then(
+      (data) => Brand.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the existing brands for the project.
@@ -224,7 +228,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBrandsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBrandsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -293,7 +300,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IdentityAwareProxyClient.fromJson(data));
+    return _response.then(
+      (data) => IdentityAwareProxyClient.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an Identity Aware Proxy (IAP) OAuth client. Useful for removing
@@ -347,7 +357,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an Identity Aware Proxy (IAP) OAuth client. Requires that the
@@ -400,7 +412,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IdentityAwareProxyClient.fromJson(data));
+    return _response.then(
+      (data) => IdentityAwareProxyClient.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the existing clients for the brand.
@@ -471,8 +486,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListIdentityAwareProxyClientsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListIdentityAwareProxyClientsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resets an Identity Aware Proxy (IAP) OAuth client secret. Useful if the
@@ -532,7 +549,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IdentityAwareProxyClient.fromJson(data));
+    return _response.then(
+      (data) => IdentityAwareProxyClient.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -599,7 +619,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the IAP settings on a particular IAP protected resource.
@@ -651,7 +673,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IapSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          IapSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy for an Identity-Aware Proxy protected
@@ -713,7 +738,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the Identity-Aware Proxy
@@ -775,7 +802,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the IAP settings on a particular IAP protected resource. It
@@ -840,7 +870,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => IapSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          IapSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -888,17 +921,21 @@
 
   AccessSettings.fromJson(core.Map _json) {
     if (_json.containsKey('corsSettings')) {
-      corsSettings = CorsSettings.fromJson(_json['corsSettings']);
+      corsSettings = CorsSettings.fromJson(
+          _json['corsSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gcipSettings')) {
-      gcipSettings = GcipSettings.fromJson(_json['gcipSettings']);
+      gcipSettings = GcipSettings.fromJson(
+          _json['gcipSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oauthSettings')) {
-      oauthSettings = OAuthSettings.fromJson(_json['oauthSettings']);
+      oauthSettings = OAuthSettings.fromJson(
+          _json['oauthSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('policyDelegationSettings')) {
-      policyDelegationSettings =
-          PolicyDelegationSettings.fromJson(_json['policyDelegationSettings']);
+      policyDelegationSettings = PolicyDelegationSettings.fromJson(
+          _json['policyDelegationSettings']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -936,14 +973,16 @@
 
   ApplicationSettings.fromJson(core.Map _json) {
     if (_json.containsKey('accessDeniedPageSettings')) {
-      accessDeniedPageSettings =
-          AccessDeniedPageSettings.fromJson(_json['accessDeniedPageSettings']);
+      accessDeniedPageSettings = AccessDeniedPageSettings.fromJson(
+          _json['accessDeniedPageSettings']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cookieDomain')) {
       cookieDomain = _json['cookieDomain'] as core.String;
     }
     if (_json.containsKey('csmSettings')) {
-      csmSettings = CsmSettings.fromJson(_json['csmSettings']);
+      csmSettings = CsmSettings.fromJson(
+          _json['csmSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1019,7 +1058,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1288,7 +1328,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1344,11 +1385,12 @@
 
   IapSettings.fromJson(core.Map _json) {
     if (_json.containsKey('accessSettings')) {
-      accessSettings = AccessSettings.fromJson(_json['accessSettings']);
+      accessSettings = AccessSettings.fromJson(
+          _json['accessSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('applicationSettings')) {
-      applicationSettings =
-          ApplicationSettings.fromJson(_json['applicationSettings']);
+      applicationSettings = ApplicationSettings.fromJson(
+          _json['applicationSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1420,7 +1462,8 @@
   ListBrandsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('brands')) {
       brands = (_json['brands'] as core.List)
-          .map<Brand>((value) => Brand.fromJson(value))
+          .map<Brand>((value) =>
+              Brand.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1449,8 +1492,9 @@
     if (_json.containsKey('identityAwareProxyClients')) {
       identityAwareProxyClients =
           (_json['identityAwareProxyClients'] as core.List)
-              .map<IdentityAwareProxyClient>(
-                  (value) => IdentityAwareProxyClient.fromJson(value))
+              .map<IdentityAwareProxyClient>((value) =>
+                  IdentityAwareProxyClient.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1589,7 +1633,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -1646,10 +1691,12 @@
       iamServiceName = _json['iamServiceName'] as core.String;
     }
     if (_json.containsKey('policyName')) {
-      policyName = PolicyName.fromJson(_json['policyName']);
+      policyName = PolicyName.fromJson(
+          _json['policyName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resource')) {
-      resource = Resource.fromJson(_json['resource']);
+      resource = Resource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1775,7 +1822,8 @@
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -1819,7 +1867,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/identitytoolkit/v3.dart b/generated/googleapis/lib/identitytoolkit/v3.dart
index 969f957..2c64816 100644
--- a/generated/googleapis/lib/identitytoolkit/v3.dart
+++ b/generated/googleapis/lib/identitytoolkit/v3.dart
@@ -102,7 +102,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CreateAuthUriResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateAuthUriResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete user account.
@@ -150,7 +153,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeleteAccountResponse.fromJson(data));
+    return _response.then(
+      (data) => DeleteAccountResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Batch download user accounts.
@@ -198,7 +204,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DownloadAccountResponse.fromJson(data));
+    return _response.then(
+      (data) => DownloadAccountResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reset password for a user.
@@ -246,7 +255,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EmailLinkSigninResponse.fromJson(data));
+    return _response.then(
+      (data) => EmailLinkSigninResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the account info.
@@ -294,7 +306,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetAccountInfoResponse.fromJson(data));
+    return _response.then(
+      (data) => GetAccountInfoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a code for user action confirmation.
@@ -342,8 +357,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GetOobConfirmationCodeResponse.fromJson(data));
+    return _response.then(
+      (data) => GetOobConfirmationCodeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get project configuration.
@@ -398,8 +415,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        IdentitytoolkitRelyingpartyGetProjectConfigResponse.fromJson(data));
+    return _response.then(
+      (data) => IdentitytoolkitRelyingpartyGetProjectConfigResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get token signing public key.
@@ -441,8 +460,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(data));
+    return _response.then(
+      (data) => IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get recaptcha secure param.
@@ -484,7 +505,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetRecaptchaParamResponse.fromJson(data));
+    return _response.then(
+      (data) => GetRecaptchaParamResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reset password for a user.
@@ -532,7 +556,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResetPasswordResponse.fromJson(data));
+    return _response.then(
+      (data) => ResetPasswordResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Send SMS verification code.
@@ -582,8 +609,11 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        IdentitytoolkitRelyingpartySendVerificationCodeResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          IdentitytoolkitRelyingpartySendVerificationCodeResponse.fromJson(
+              data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Set account info for a user.
@@ -631,7 +661,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SetAccountInfoResponse.fromJson(data));
+    return _response.then(
+      (data) => SetAccountInfoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Set project configuration.
@@ -680,8 +713,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        IdentitytoolkitRelyingpartySetProjectConfigResponse.fromJson(data));
+    return _response.then(
+      (data) => IdentitytoolkitRelyingpartySetProjectConfigResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sign out user.
@@ -729,8 +764,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        IdentitytoolkitRelyingpartySignOutUserResponse.fromJson(data));
+    return _response.then(
+      (data) => IdentitytoolkitRelyingpartySignOutUserResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Signup new user.
@@ -778,7 +815,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SignupNewUserResponse.fromJson(data));
+    return _response.then(
+      (data) => SignupNewUserResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Batch upload existing user accounts.
@@ -826,7 +866,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UploadAccountResponse.fromJson(data));
+    return _response.then(
+      (data) => UploadAccountResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Verifies the assertion returned by the IdP.
@@ -874,7 +917,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VerifyAssertionResponse.fromJson(data));
+    return _response.then(
+      (data) => VerifyAssertionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Verifies the developer asserted ID token.
@@ -922,7 +968,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VerifyCustomTokenResponse.fromJson(data));
+    return _response.then(
+      (data) => VerifyCustomTokenResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Verifies the user entered password.
@@ -970,7 +1019,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VerifyPasswordResponse.fromJson(data));
+    return _response.then(
+      (data) => VerifyPasswordResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Verifies ownership of a phone number and creates/updates the user account
@@ -1020,8 +1072,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse.fromJson(data));
+    return _response.then(
+      (data) => IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1169,7 +1223,8 @@
     }
     if (_json.containsKey('users')) {
       users = (_json['users'] as core.List)
-          .map<UserInfo>((value) => UserInfo.fromJson(value))
+          .map<UserInfo>((value) =>
+              UserInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1348,7 +1403,8 @@
     }
     if (_json.containsKey('users')) {
       users = (_json['users'] as core.List)
-          .map<UserInfo>((value) => UserInfo.fromJson(value))
+          .map<UserInfo>((value) =>
+              UserInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1531,7 +1587,8 @@
     }
     if (_json.containsKey('customParameter')) {
       customParameter = commons.mapMap<core.String, core.String>(
-          _json['customParameter'].cast<core.String, core.String>(),
+          (_json['customParameter'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('hostedDomain')) {
@@ -1869,8 +1926,8 @@
           .toList();
     }
     if (_json.containsKey('changeEmailTemplate')) {
-      changeEmailTemplate =
-          EmailTemplate.fromJson(_json['changeEmailTemplate']);
+      changeEmailTemplate = EmailTemplate.fromJson(
+          _json['changeEmailTemplate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dynamicLinksDomain')) {
       dynamicLinksDomain = _json['dynamicLinksDomain'] as core.String;
@@ -1880,26 +1937,29 @@
     }
     if (_json.containsKey('idpConfig')) {
       idpConfig = (_json['idpConfig'] as core.List)
-          .map<IdpConfig>((value) => IdpConfig.fromJson(value))
+          .map<IdpConfig>((value) =>
+              IdpConfig.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('legacyResetPasswordTemplate')) {
-      legacyResetPasswordTemplate =
-          EmailTemplate.fromJson(_json['legacyResetPasswordTemplate']);
+      legacyResetPasswordTemplate = EmailTemplate.fromJson(
+          _json['legacyResetPasswordTemplate']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('resetPasswordTemplate')) {
-      resetPasswordTemplate =
-          EmailTemplate.fromJson(_json['resetPasswordTemplate']);
+      resetPasswordTemplate = EmailTemplate.fromJson(
+          _json['resetPasswordTemplate']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useEmailSending')) {
       useEmailSending = _json['useEmailSending'] as core.bool;
     }
     if (_json.containsKey('verifyEmailTemplate')) {
-      verifyEmailTemplate =
-          EmailTemplate.fromJson(_json['verifyEmailTemplate']);
+      verifyEmailTemplate = EmailTemplate.fromJson(
+          _json['verifyEmailTemplate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2383,8 +2443,8 @@
           .toList();
     }
     if (_json.containsKey('changeEmailTemplate')) {
-      changeEmailTemplate =
-          EmailTemplate.fromJson(_json['changeEmailTemplate']);
+      changeEmailTemplate = EmailTemplate.fromJson(
+          _json['changeEmailTemplate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delegatedProjectNumber')) {
       delegatedProjectNumber = _json['delegatedProjectNumber'] as core.String;
@@ -2394,23 +2454,26 @@
     }
     if (_json.containsKey('idpConfig')) {
       idpConfig = (_json['idpConfig'] as core.List)
-          .map<IdpConfig>((value) => IdpConfig.fromJson(value))
+          .map<IdpConfig>((value) =>
+              IdpConfig.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('legacyResetPasswordTemplate')) {
-      legacyResetPasswordTemplate =
-          EmailTemplate.fromJson(_json['legacyResetPasswordTemplate']);
+      legacyResetPasswordTemplate = EmailTemplate.fromJson(
+          _json['legacyResetPasswordTemplate']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resetPasswordTemplate')) {
-      resetPasswordTemplate =
-          EmailTemplate.fromJson(_json['resetPasswordTemplate']);
+      resetPasswordTemplate = EmailTemplate.fromJson(
+          _json['resetPasswordTemplate']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useEmailSending')) {
       useEmailSending = _json['useEmailSending'] as core.bool;
     }
     if (_json.containsKey('verifyEmailTemplate')) {
-      verifyEmailTemplate =
-          EmailTemplate.fromJson(_json['verifyEmailTemplate']);
+      verifyEmailTemplate = EmailTemplate.fromJson(
+          _json['verifyEmailTemplate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2768,7 +2831,8 @@
     }
     if (_json.containsKey('users')) {
       users = (_json['users'] as core.List)
-          .map<UserInfo>((value) => UserInfo.fromJson(value))
+          .map<UserInfo>((value) =>
+              UserInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3679,8 +3743,9 @@
     }
     if (_json.containsKey('providerUserInfo')) {
       providerUserInfo = (_json['providerUserInfo'] as core.List)
-          .map<SetAccountInfoResponseProviderUserInfo>(
-              (value) => SetAccountInfoResponseProviderUserInfo.fromJson(value))
+          .map<SetAccountInfoResponseProviderUserInfo>((value) =>
+              SetAccountInfoResponseProviderUserInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('refreshToken')) {
@@ -3852,8 +3917,9 @@
   UploadAccountResponse.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
       error = (_json['error'] as core.List)
-          .map<UploadAccountResponseError>(
-              (value) => UploadAccountResponseError.fromJson(value))
+          .map<UploadAccountResponseError>((value) =>
+              UploadAccountResponseError.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -4075,8 +4141,9 @@
     }
     if (_json.containsKey('providerUserInfo')) {
       providerUserInfo = (_json['providerUserInfo'] as core.List)
-          .map<UserInfoProviderUserInfo>(
-              (value) => UserInfoProviderUserInfo.fromJson(value))
+          .map<UserInfoProviderUserInfo>((value) =>
+              UserInfoProviderUserInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rawPassword')) {
diff --git a/generated/googleapis/lib/indexing/v3.dart b/generated/googleapis/lib/indexing/v3.dart
index e7f2296..bea139c 100644
--- a/generated/googleapis/lib/indexing/v3.dart
+++ b/generated/googleapis/lib/indexing/v3.dart
@@ -101,7 +101,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UrlNotificationMetadata.fromJson(data));
+    return _response.then(
+      (data) => UrlNotificationMetadata.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Notifies that a URL has been updated or deleted.
@@ -149,8 +152,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PublishUrlNotificationResponse.fromJson(data));
+    return _response.then(
+      (data) => PublishUrlNotificationResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -163,8 +168,9 @@
 
   PublishUrlNotificationResponse.fromJson(core.Map _json) {
     if (_json.containsKey('urlNotificationMetadata')) {
-      urlNotificationMetadata =
-          UrlNotificationMetadata.fromJson(_json['urlNotificationMetadata']);
+      urlNotificationMetadata = UrlNotificationMetadata.fromJson(
+          _json['urlNotificationMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -241,10 +247,12 @@
 
   UrlNotificationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('latestRemove')) {
-      latestRemove = UrlNotification.fromJson(_json['latestRemove']);
+      latestRemove = UrlNotification.fromJson(
+          _json['latestRemove'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('latestUpdate')) {
-      latestUpdate = UrlNotification.fromJson(_json['latestUpdate']);
+      latestUpdate = UrlNotification.fromJson(
+          _json['latestUpdate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
diff --git a/generated/googleapis/lib/jobs/v2.dart b/generated/googleapis/lib/jobs/v2.dart
index 47ed21b..6c0fb12 100644
--- a/generated/googleapis/lib/jobs/v2.dart
+++ b/generated/googleapis/lib/jobs/v2.dart
@@ -105,7 +105,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Company.fromJson(data));
+    return _response.then(
+      (data) => Company.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified company.
@@ -155,7 +157,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified company.
@@ -205,7 +209,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Company.fromJson(data));
+    return _response.then(
+      (data) => Company.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all companies associated with a Cloud Talent Solution account.
@@ -269,7 +275,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCompaniesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCompaniesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified company. Company names can't be updated. To update a
@@ -341,7 +350,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Company.fromJson(data));
+    return _response.then(
+      (data) => Company.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -440,7 +451,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCompanyJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCompanyJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -494,7 +508,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new job. Typically, the job becomes searchable within 10
@@ -543,7 +559,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified job. Typically, the job becomes unsearchable within
@@ -603,7 +621,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated. Use BatchDeleteJobs instead. Deletes the specified job by
@@ -654,7 +674,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified job, whose status is OPEN or recently EXPIRED
@@ -705,7 +727,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deprecated. Use SearchJobsRequest.histogram_facets instead to make a
@@ -759,7 +783,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetHistogramResponse.fromJson(data));
+    return _response.then(
+      (data) => GetHistogramResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists jobs by filter.
@@ -834,7 +861,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates specified job. Typically, updated contents become visible in
@@ -893,7 +923,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches for jobs using the provided SearchJobsRequest. This call
@@ -943,7 +975,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches for jobs using the provided SearchJobsRequest. This API call is
@@ -997,7 +1032,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1104,7 +1142,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CompleteQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => CompleteQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1180,7 +1221,8 @@
       count = _json['count'] as core.int;
     }
     if (_json.containsKey('range')) {
-      range = BucketRange.fromJson(_json['range']);
+      range = BucketRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1211,7 +1253,8 @@
 
   CommuteInfo.fromJson(core.Map _json) {
     if (_json.containsKey('jobLocation')) {
-      jobLocation = JobLocation.fromJson(_json['jobLocation']);
+      jobLocation = JobLocation.fromJson(
+          _json['jobLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('travelDuration')) {
       travelDuration = _json['travelDuration'] as core.String;
@@ -1288,7 +1331,8 @@
       roadTraffic = _json['roadTraffic'] as core.String;
     }
     if (_json.containsKey('startLocation')) {
-      startLocation = LatLng.fromJson(_json['startLocation']);
+      startLocation = LatLng.fromJson(
+          _json['startLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('travelTime')) {
       travelTime = _json['travelTime'] as core.String;
@@ -1431,7 +1475,8 @@
     }
     if (_json.containsKey('companyInfoSources')) {
       companyInfoSources = (_json['companyInfoSources'] as core.List)
-          .map<CompanyInfoSource>((value) => CompanyInfoSource.fromJson(value))
+          .map<CompanyInfoSource>((value) => CompanyInfoSource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('companySize')) {
@@ -1479,8 +1524,9 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('structuredCompanyHqLocation')) {
-      structuredCompanyHqLocation =
-          JobLocation.fromJson(_json['structuredCompanyHqLocation']);
+      structuredCompanyHqLocation = JobLocation.fromJson(
+          _json['structuredCompanyHqLocation']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suspended')) {
       suspended = _json['suspended'] as core.bool;
@@ -1665,7 +1711,8 @@
 
   CompensationEntry.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Money.fromJson(_json['amount']);
+      amount = Money.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -1675,7 +1722,8 @@
           (_json['expectedUnitsPerYear'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
-      range = CompensationRange.fromJson(_json['range']);
+      range = CompensationRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1752,7 +1800,8 @@
           _json['includeJobsWithUnspecifiedCompensationRange'] as core.bool;
     }
     if (_json.containsKey('range')) {
-      range = CompensationRange.fromJson(_json['range']);
+      range = CompensationRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1807,8 +1856,8 @@
 
   CompensationHistogramRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bucketingOption')) {
-      bucketingOption =
-          NumericBucketingOption.fromJson(_json['bucketingOption']);
+      bucketingOption = NumericBucketingOption.fromJson(
+          _json['bucketingOption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1848,7 +1897,8 @@
 
   CompensationHistogramResult.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = NumericBucketingResult.fromJson(_json['result']);
+      result = NumericBucketingResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1918,26 +1968,30 @@
 
   CompensationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Money.fromJson(_json['amount']);
+      amount = Money.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annualizedBaseCompensationRange')) {
-      annualizedBaseCompensationRange =
-          CompensationRange.fromJson(_json['annualizedBaseCompensationRange']);
+      annualizedBaseCompensationRange = CompensationRange.fromJson(
+          _json['annualizedBaseCompensationRange']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annualizedTotalCompensationRange')) {
-      annualizedTotalCompensationRange =
-          CompensationRange.fromJson(_json['annualizedTotalCompensationRange']);
+      annualizedTotalCompensationRange = CompensationRange.fromJson(
+          _json['annualizedTotalCompensationRange']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<CompensationEntry>((value) => CompensationEntry.fromJson(value))
+          .map<CompensationEntry>((value) => CompensationEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('max')) {
-      max = Money.fromJson(_json['max']);
+      max = Money.fromJson(_json['max'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('min')) {
-      min = Money.fromJson(_json['min']);
+      min = Money.fromJson(_json['min'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1989,10 +2043,10 @@
 
   CompensationRange.fromJson(core.Map _json) {
     if (_json.containsKey('max')) {
-      max = Money.fromJson(_json['max']);
+      max = Money.fromJson(_json['max'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('min')) {
-      min = Money.fromJson(_json['min']);
+      min = Money.fromJson(_json['min'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2022,11 +2076,13 @@
   CompleteQueryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('completionResults')) {
       completionResults = (_json['completionResults'] as core.List)
-          .map<CompletionResult>((value) => CompletionResult.fromJson(value))
+          .map<CompletionResult>((value) => CompletionResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2109,11 +2165,11 @@
           _json['disableStreetAddressResolution'] as core.bool;
     }
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('processingOptions')) {
-      processingOptions =
-          JobProcessingOptions.fromJson(_json['processingOptions']);
+      processingOptions = JobProcessingOptions.fromJson(
+          _json['processingOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2163,7 +2219,8 @@
       longValue = _json['longValue'] as core.String;
     }
     if (_json.containsKey('stringValues')) {
-      stringValues = StringValues.fromJson(_json['stringValues']);
+      stringValues = StringValues.fromJson(
+          _json['stringValues'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2208,7 +2265,8 @@
     }
     if (_json.containsKey('longValueHistogramBucketingOption')) {
       longValueHistogramBucketingOption = NumericBucketingOption.fromJson(
-          _json['longValueHistogramBucketingOption']);
+          _json['longValueHistogramBucketingOption']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stringValueHistogram')) {
       stringValueHistogram = _json['stringValueHistogram'] as core.bool;
@@ -2251,12 +2309,15 @@
       key = _json['key'] as core.String;
     }
     if (_json.containsKey('longValueHistogramResult')) {
-      longValueHistogramResult =
-          NumericBucketingResult.fromJson(_json['longValueHistogramResult']);
+      longValueHistogramResult = NumericBucketingResult.fromJson(
+          _json['longValueHistogramResult']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stringValueHistogramResult')) {
       stringValueHistogramResult = commons.mapMap<core.int, core.int>(
-          _json['stringValueHistogramResult'].cast<core.String, core.int>(),
+          (_json['stringValueHistogramResult']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.int>(),
           (core.int item) => item as core.int);
     }
   }
@@ -2409,7 +2470,8 @@
       disableFastProcess = _json['disableFastProcess'] as core.bool;
     }
     if (_json.containsKey('filter')) {
-      filter = Filter.fromJson(_json['filter']);
+      filter = Filter.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2536,7 +2598,7 @@
   ExtendedCompensationFilter.fromJson(core.Map _json) {
     if (_json.containsKey('compensationRange')) {
       compensationRange = ExtendedCompensationInfoCompensationRange.fromJson(
-          _json['compensationRange']);
+          _json['compensationRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('compensationUnits')) {
       compensationUnits = (_json['compensationUnits'] as core.List)
@@ -2612,7 +2674,8 @@
     if (_json.containsKey('annualizedBaseCompensationRange')) {
       annualizedBaseCompensationRange =
           ExtendedCompensationInfoCompensationRange.fromJson(
-              _json['annualizedBaseCompensationRange']);
+              _json['annualizedBaseCompensationRange']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annualizedBaseCompensationUnspecified')) {
       annualizedBaseCompensationUnspecified =
@@ -2621,7 +2684,8 @@
     if (_json.containsKey('annualizedTotalCompensationRange')) {
       annualizedTotalCompensationRange =
           ExtendedCompensationInfoCompensationRange.fromJson(
-              _json['annualizedTotalCompensationRange']);
+              _json['annualizedTotalCompensationRange']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annualizedTotalCompensationUnspecified')) {
       annualizedTotalCompensationUnspecified =
@@ -2633,7 +2697,8 @@
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<ExtendedCompensationInfoCompensationEntry>((value) =>
-              ExtendedCompensationInfoCompensationEntry.fromJson(value))
+              ExtendedCompensationInfoCompensationEntry.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2726,18 +2791,19 @@
 
   ExtendedCompensationInfoCompensationEntry.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = ExtendedCompensationInfoDecimal.fromJson(_json['amount']);
+      amount = ExtendedCompensationInfoDecimal.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('expectedUnitsPerYear')) {
       expectedUnitsPerYear = ExtendedCompensationInfoDecimal.fromJson(
-          _json['expectedUnitsPerYear']);
+          _json['expectedUnitsPerYear'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('range')) {
-      range =
-          ExtendedCompensationInfoCompensationRange.fromJson(_json['range']);
+      range = ExtendedCompensationInfoCompensationRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -2789,10 +2855,12 @@
 
   ExtendedCompensationInfoCompensationRange.fromJson(core.Map _json) {
     if (_json.containsKey('max')) {
-      max = ExtendedCompensationInfoDecimal.fromJson(_json['max']);
+      max = ExtendedCompensationInfoDecimal.fromJson(
+          _json['max'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('min')) {
-      min = ExtendedCompensationInfoDecimal.fromJson(_json['min']);
+      min = ExtendedCompensationInfoDecimal.fromJson(
+          _json['min'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2906,13 +2974,16 @@
       allowBroadening = _json['allowBroadening'] as core.bool;
     }
     if (_json.containsKey('filters')) {
-      filters = JobFilters.fromJson(_json['filters']);
+      filters = JobFilters.fromJson(
+          _json['filters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = JobQuery.fromJson(_json['query']);
+      query = JobQuery.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestMetadata')) {
-      requestMetadata = RequestMetadata.fromJson(_json['requestMetadata']);
+      requestMetadata = RequestMetadata.fromJson(
+          _json['requestMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchTypes')) {
       searchTypes = (_json['searchTypes'] as core.List)
@@ -2957,11 +3028,13 @@
 
   GetHistogramResponse.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<HistogramResult>((value) => HistogramResult.fromJson(value))
+          .map<HistogramResult>((value) => HistogramResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2990,8 +3063,9 @@
   GoogleCloudTalentV4BatchCreateJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobResults')) {
       jobResults = (_json['jobResults'] as core.List)
-          .map<GoogleCloudTalentV4JobResult>(
-              (value) => GoogleCloudTalentV4JobResult.fromJson(value))
+          .map<GoogleCloudTalentV4JobResult>((value) =>
+              GoogleCloudTalentV4JobResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3017,8 +3091,9 @@
   GoogleCloudTalentV4BatchDeleteJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobResults')) {
       jobResults = (_json['jobResults'] as core.List)
-          .map<GoogleCloudTalentV4JobResult>(
-              (value) => GoogleCloudTalentV4JobResult.fromJson(value))
+          .map<GoogleCloudTalentV4JobResult>((value) =>
+              GoogleCloudTalentV4JobResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3145,8 +3220,9 @@
   GoogleCloudTalentV4BatchUpdateJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobResults')) {
       jobResults = (_json['jobResults'] as core.List)
-          .map<GoogleCloudTalentV4JobResult>(
-              (value) => GoogleCloudTalentV4JobResult.fromJson(value))
+          .map<GoogleCloudTalentV4JobResult>((value) =>
+              GoogleCloudTalentV4JobResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3187,18 +3263,20 @@
     if (_json.containsKey('annualizedBaseCompensationRange')) {
       annualizedBaseCompensationRange =
           GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
-              _json['annualizedBaseCompensationRange']);
+              _json['annualizedBaseCompensationRange']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annualizedTotalCompensationRange')) {
       annualizedTotalCompensationRange =
           GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
-              _json['annualizedTotalCompensationRange']);
+              _json['annualizedTotalCompensationRange']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<GoogleCloudTalentV4CompensationInfoCompensationEntry>((value) =>
               GoogleCloudTalentV4CompensationInfoCompensationEntry.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3277,7 +3355,8 @@
   GoogleCloudTalentV4CompensationInfoCompensationEntry.fromJson(
       core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Money.fromJson(_json['amount']);
+      amount = Money.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -3288,7 +3367,7 @@
     }
     if (_json.containsKey('range')) {
       range = GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
-          _json['range']);
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -3339,10 +3418,12 @@
   GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
       core.Map _json) {
     if (_json.containsKey('maxCompensation')) {
-      maxCompensation = Money.fromJson(_json['maxCompensation']);
+      maxCompensation = Money.fromJson(
+          _json['maxCompensation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minCompensation')) {
-      minCompensation = Money.fromJson(_json['minCompensation']);
+      minCompensation = Money.fromJson(
+          _json['minCompensation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3664,7 +3745,7 @@
     }
     if (_json.containsKey('applicationInfo')) {
       applicationInfo = GoogleCloudTalentV4JobApplicationInfo.fromJson(
-          _json['applicationInfo']);
+          _json['applicationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('company')) {
       company = _json['company'] as core.String;
@@ -3674,14 +3755,15 @@
     }
     if (_json.containsKey('compensationInfo')) {
       compensationInfo = GoogleCloudTalentV4CompensationInfo.fromJson(
-          _json['compensationInfo']);
+          _json['compensationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributes')) {
       customAttributes =
           commons.mapMap<core.Map, GoogleCloudTalentV4CustomAttribute>(
-              _json['customAttributes'].cast<core.String, core.Map>(),
-              (core.Map item) =>
-                  GoogleCloudTalentV4CustomAttribute.fromJson(item));
+              (_json['customAttributes'] as core.Map<core.String, core.dynamic>)
+                  .cast<core.String, core.Map>(),
+              (core.Map item) => GoogleCloudTalentV4CustomAttribute.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('degreeTypes')) {
       degreeTypes = (_json['degreeTypes'] as core.List)
@@ -3692,8 +3774,8 @@
       department = _json['department'] as core.String;
     }
     if (_json.containsKey('derivedInfo')) {
-      derivedInfo =
-          GoogleCloudTalentV4JobDerivedInfo.fromJson(_json['derivedInfo']);
+      derivedInfo = GoogleCloudTalentV4JobDerivedInfo.fromJson(
+          _json['derivedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -3743,7 +3825,7 @@
     }
     if (_json.containsKey('processingOptions')) {
       processingOptions = GoogleCloudTalentV4JobProcessingOptions.fromJson(
-          _json['processingOptions']);
+          _json['processingOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('promotionValue')) {
       promotionValue = _json['promotionValue'] as core.int;
@@ -3935,8 +4017,9 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<GoogleCloudTalentV4Location>(
-              (value) => GoogleCloudTalentV4Location.fromJson(value))
+          .map<GoogleCloudTalentV4Location>((value) =>
+              GoogleCloudTalentV4Location.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4010,10 +4093,12 @@
 
   GoogleCloudTalentV4JobResult.fromJson(core.Map _json) {
     if (_json.containsKey('job')) {
-      job = GoogleCloudTalentV4Job.fromJson(_json['job']);
+      job = GoogleCloudTalentV4Job.fromJson(
+          _json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4073,13 +4158,15 @@
 
   GoogleCloudTalentV4Location.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationType')) {
       locationType = _json['locationType'] as core.String;
     }
     if (_json.containsKey('postalAddress')) {
-      postalAddress = PostalAddress.fromJson(_json['postalAddress']);
+      postalAddress = PostalAddress.fromJson(
+          _json['postalAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('radiusMiles')) {
       radiusMiles = (_json['radiusMiles'] as core.num).toDouble();
@@ -4125,15 +4212,17 @@
     if (_json.containsKey('compensationHistogramFacets')) {
       compensationHistogramFacets =
           (_json['compensationHistogramFacets'] as core.List)
-              .map<CompensationHistogramRequest>(
-                  (value) => CompensationHistogramRequest.fromJson(value))
+              .map<CompensationHistogramRequest>((value) =>
+                  CompensationHistogramRequest.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('customAttributeHistogramFacets')) {
       customAttributeHistogramFacets =
           (_json['customAttributeHistogramFacets'] as core.List)
-              .map<CustomAttributeHistogramRequest>(
-                  (value) => CustomAttributeHistogramRequest.fromJson(value))
+              .map<CustomAttributeHistogramRequest>((value) =>
+                  CustomAttributeHistogramRequest.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('simpleHistogramFacets')) {
@@ -4240,7 +4329,8 @@
     }
     if (_json.containsKey('values')) {
       values = commons.mapMap<core.int, core.int>(
-          _json['values'].cast<core.String, core.int>(),
+          (_json['values'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.int>(),
           (core.int item) => item as core.int);
     }
   }
@@ -4278,20 +4368,23 @@
     if (_json.containsKey('compensationHistogramResults')) {
       compensationHistogramResults =
           (_json['compensationHistogramResults'] as core.List)
-              .map<CompensationHistogramResult>(
-                  (value) => CompensationHistogramResult.fromJson(value))
+              .map<CompensationHistogramResult>((value) =>
+                  CompensationHistogramResult.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('customAttributeHistogramResults')) {
       customAttributeHistogramResults =
           (_json['customAttributeHistogramResults'] as core.List)
-              .map<CustomAttributeHistogramResult>(
-                  (value) => CustomAttributeHistogramResult.fromJson(value))
+              .map<CustomAttributeHistogramResult>((value) =>
+                  CustomAttributeHistogramResult.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('simpleHistogramResults')) {
       simpleHistogramResults = (_json['simpleHistogramResults'] as core.List)
-          .map<HistogramResult>((value) => HistogramResult.fromJson(value))
+          .map<HistogramResult>((value) => HistogramResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4653,15 +4746,18 @@
       companyTitle = _json['companyTitle'] as core.String;
     }
     if (_json.containsKey('compensationInfo')) {
-      compensationInfo = CompensationInfo.fromJson(_json['compensationInfo']);
+      compensationInfo = CompensationInfo.fromJson(
+          _json['compensationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('customAttributes')) {
       customAttributes = commons.mapMap<core.Map, CustomAttribute>(
-          _json['customAttributes'].cast<core.String, core.Map>(),
-          (core.Map item) => CustomAttribute.fromJson(item));
+          (_json['customAttributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => CustomAttribute.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('department')) {
       department = _json['department'] as core.String;
@@ -4683,29 +4779,36 @@
           .toList();
     }
     if (_json.containsKey('endDate')) {
-      endDate = Date.fromJson(_json['endDate']);
+      endDate = Date.fromJson(
+          _json['endDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('expireTime')) {
       expireTime = _json['expireTime'] as core.String;
     }
     if (_json.containsKey('expiryDate')) {
-      expiryDate = Date.fromJson(_json['expiryDate']);
+      expiryDate = Date.fromJson(
+          _json['expiryDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('extendedCompensationInfo')) {
-      extendedCompensationInfo =
-          ExtendedCompensationInfo.fromJson(_json['extendedCompensationInfo']);
+      extendedCompensationInfo = ExtendedCompensationInfo.fromJson(
+          _json['extendedCompensationInfo']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filterableCustomFields')) {
       filterableCustomFields = commons.mapMap<core.Map, CustomField>(
-          _json['filterableCustomFields'].cast<core.String, core.Map>(),
-          (core.Map item) => CustomField.fromJson(item));
+          (_json['filterableCustomFields']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => CustomField.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('incentives')) {
       incentives = _json['incentives'] as core.String;
     }
     if (_json.containsKey('jobLocations')) {
       jobLocations = (_json['jobLocations'] as core.List)
-          .map<JobLocation>((value) => JobLocation.fromJson(value))
+          .map<JobLocation>((value) => JobLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('jobTitle')) {
@@ -4729,7 +4832,8 @@
       promotionValue = _json['promotionValue'] as core.int;
     }
     if (_json.containsKey('publishDate')) {
-      publishDate = Date.fromJson(_json['publishDate']);
+      publishDate = Date.fromJson(
+          _json['publishDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('qualifications')) {
       qualifications = _json['qualifications'] as core.String;
@@ -4747,12 +4851,16 @@
       responsibilities = _json['responsibilities'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = Date.fromJson(_json['startDate']);
+      startDate = Date.fromJson(
+          _json['startDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unindexedCustomFields')) {
       unindexedCustomFields = commons.mapMap<core.Map, CustomField>(
-          _json['unindexedCustomFields'].cast<core.String, core.Map>(),
-          (core.Map item) => CustomField.fromJson(item));
+          (_json['unindexedCustomFields']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => CustomField.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -5014,7 +5122,8 @@
           .toList();
     }
     if (_json.containsKey('commuteFilter')) {
-      commuteFilter = CommutePreference.fromJson(_json['commuteFilter']);
+      commuteFilter = CommutePreference.fromJson(
+          _json['commuteFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('companyNames')) {
       companyNames = (_json['companyNames'] as core.List)
@@ -5027,16 +5136,18 @@
           .toList();
     }
     if (_json.containsKey('compensationFilter')) {
-      compensationFilter =
-          CompensationFilter.fromJson(_json['compensationFilter']);
+      compensationFilter = CompensationFilter.fromJson(
+          _json['compensationFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributeFilter')) {
       customAttributeFilter = _json['customAttributeFilter'] as core.String;
     }
     if (_json.containsKey('customFieldFilters')) {
       customFieldFilters = commons.mapMap<core.Map, CustomFieldFilter>(
-          _json['customFieldFilters'].cast<core.String, core.Map>(),
-          (core.Map item) => CustomFieldFilter.fromJson(item));
+          (_json['customFieldFilters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => CustomFieldFilter.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('disableSpellCheck')) {
       disableSpellCheck = _json['disableSpellCheck'] as core.bool;
@@ -5048,7 +5159,8 @@
     }
     if (_json.containsKey('extendedCompensationFilter')) {
       extendedCompensationFilter = ExtendedCompensationFilter.fromJson(
-          _json['extendedCompensationFilter']);
+          _json['extendedCompensationFilter']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCodes')) {
       languageCodes = (_json['languageCodes'] as core.List)
@@ -5057,7 +5169,8 @@
     }
     if (_json.containsKey('locationFilters')) {
       locationFilters = (_json['locationFilters'] as core.List)
-          .map<LocationFilter>((value) => LocationFilter.fromJson(value))
+          .map<LocationFilter>((value) => LocationFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('publishDateRange')) {
@@ -5170,13 +5283,15 @@
 
   JobLocation.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationType')) {
       locationType = _json['locationType'] as core.String;
     }
     if (_json.containsKey('postalAddress')) {
-      postalAddress = PostalAddress.fromJson(_json['postalAddress']);
+      postalAddress = PostalAddress.fromJson(
+          _json['postalAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('radiusMeters')) {
       radiusMeters = (_json['radiusMeters'] as core.num).toDouble();
@@ -5347,7 +5462,8 @@
           .toList();
     }
     if (_json.containsKey('commuteFilter')) {
-      commuteFilter = CommutePreference.fromJson(_json['commuteFilter']);
+      commuteFilter = CommutePreference.fromJson(
+          _json['commuteFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('companyDisplayNames')) {
       companyDisplayNames = (_json['companyDisplayNames'] as core.List)
@@ -5360,8 +5476,8 @@
           .toList();
     }
     if (_json.containsKey('compensationFilter')) {
-      compensationFilter =
-          CompensationFilter.fromJson(_json['compensationFilter']);
+      compensationFilter = CompensationFilter.fromJson(
+          _json['compensationFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributeFilter')) {
       customAttributeFilter = _json['customAttributeFilter'] as core.String;
@@ -5381,7 +5497,8 @@
     }
     if (_json.containsKey('locationFilters')) {
       locationFilters = (_json['locationFilters'] as core.List)
-          .map<LocationFilter>((value) => LocationFilter.fromJson(value))
+          .map<LocationFilter>((value) => LocationFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('publishDateRange')) {
@@ -5486,11 +5603,13 @@
   ListCompaniesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('companies')) {
       companies = (_json['companies'] as core.List)
-          .map<Company>((value) => Company.fromJson(value))
+          .map<Company>((value) =>
+              Company.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -5536,11 +5655,13 @@
   ListCompanyJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<Job>((value) => Job.fromJson(value))
+          .map<Job>((value) =>
+              Job.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -5586,11 +5707,13 @@
   ListJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<Job>((value) => Job.fromJson(value))
+          .map<Job>((value) =>
+              Job.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -5657,7 +5780,8 @@
       isTelecommute = _json['isTelecommute'] as core.bool;
     }
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5716,10 +5840,11 @@
 
   MatchingJob.fromJson(core.Map _json) {
     if (_json.containsKey('commuteInfo')) {
-      commuteInfo = CommuteInfo.fromJson(_json['commuteInfo']);
+      commuteInfo = CommuteInfo.fromJson(
+          _json['commuteInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobSummary')) {
       jobSummary = _json['jobSummary'] as core.String;
@@ -5771,8 +5896,10 @@
   MendelDebugInput.fromJson(core.Map _json) {
     if (_json.containsKey('namespacedDebugInput')) {
       namespacedDebugInput = commons.mapMap<core.Map, NamespacedDebugInput>(
-          _json['namespacedDebugInput'].cast<core.String, core.Map>(),
-          (core.Map item) => NamespacedDebugInput.fromJson(item));
+          (_json['namespacedDebugInput'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NamespacedDebugInput.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -5978,12 +6105,14 @@
     }
     if (_json.containsKey('forcedFlags')) {
       forcedFlags = commons.mapMap<core.String, core.String>(
-          _json['forcedFlags'].cast<core.String, core.String>(),
+          (_json['forcedFlags'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('forcedRollouts')) {
       forcedRollouts = commons.mapMap<core.bool, core.bool>(
-          _json['forcedRollouts'].cast<core.String, core.bool>(),
+          (_json['forcedRollouts'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.bool>(),
           (core.bool item) => item as core.bool);
     }
   }
@@ -6095,7 +6224,8 @@
   NumericBucketingResult.fromJson(core.Map _json) {
     if (_json.containsKey('counts')) {
       counts = (_json['counts'] as core.List)
-          .map<BucketizedCount>((value) => BucketizedCount.fromJson(value))
+          .map<BucketizedCount>((value) => BucketizedCount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxValue')) {
@@ -6334,7 +6464,8 @@
 
   RequestMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('deviceInfo')) {
-      deviceInfo = DeviceInfo.fromJson(_json['deviceInfo']);
+      deviceInfo = DeviceInfo.fromJson(
+          _json['deviceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('domain')) {
       domain = _json['domain'] as core.String;
@@ -6579,10 +6710,12 @@
       enablePreciseResultSize = _json['enablePreciseResultSize'] as core.bool;
     }
     if (_json.containsKey('filters')) {
-      filters = JobFilters.fromJson(_json['filters']);
+      filters = JobFilters.fromJson(
+          _json['filters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('histogramFacets')) {
-      histogramFacets = HistogramFacets.fromJson(_json['histogramFacets']);
+      histogramFacets = HistogramFacets.fromJson(
+          _json['histogramFacets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobView')) {
       jobView = _json['jobView'] as core.String;
@@ -6603,10 +6736,12 @@
       pageToken = _json['pageToken'] as core.String;
     }
     if (_json.containsKey('query')) {
-      query = JobQuery.fromJson(_json['query']);
+      query = JobQuery.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestMetadata')) {
-      requestMetadata = RequestMetadata.fromJson(_json['requestMetadata']);
+      requestMetadata = RequestMetadata.fromJson(
+          _json['requestMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortBy')) {
       sortBy = _json['sortBy'] as core.String;
@@ -6732,31 +6867,35 @@
 
   SearchJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('appliedCommuteFilter')) {
-      appliedCommuteFilter =
-          CommutePreference.fromJson(_json['appliedCommuteFilter']);
+      appliedCommuteFilter = CommutePreference.fromJson(
+          _json['appliedCommuteFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appliedJobLocationFilters')) {
       appliedJobLocationFilters =
           (_json['appliedJobLocationFilters'] as core.List)
-              .map<JobLocation>((value) => JobLocation.fromJson(value))
+              .map<JobLocation>((value) => JobLocation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('estimatedTotalSize')) {
       estimatedTotalSize = _json['estimatedTotalSize'] as core.String;
     }
     if (_json.containsKey('histogramResults')) {
-      histogramResults = HistogramResults.fromJson(_json['histogramResults']);
+      histogramResults = HistogramResults.fromJson(
+          _json['histogramResults'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobView')) {
       jobView = _json['jobView'] as core.String;
     }
     if (_json.containsKey('matchingJobs')) {
       matchingJobs = (_json['matchingJobs'] as core.List)
-          .map<MatchingJob>((value) => MatchingJob.fromJson(value))
+          .map<MatchingJob>((value) => MatchingJob.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -6766,7 +6905,8 @@
           _json['numJobsFromBroadenedQuery'] as core.int;
     }
     if (_json.containsKey('spellResult')) {
-      spellResult = SpellingCorrection.fromJson(_json['spellResult']);
+      spellResult = SpellingCorrection.fromJson(
+          _json['spellResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('totalSize')) {
       totalSize = _json['totalSize'] as core.String;
@@ -6877,7 +7017,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -6961,11 +7102,11 @@
           _json['disableStreetAddressResolution'] as core.bool;
     }
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('processingOptions')) {
-      processingOptions =
-          JobProcessingOptions.fromJson(_json['processingOptions']);
+      processingOptions = JobProcessingOptions.fromJson(
+          _json['processingOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateJobFields')) {
       updateJobFields = _json['updateJobFields'] as core.String;
diff --git a/generated/googleapis/lib/jobs/v3.dart b/generated/googleapis/lib/jobs/v3.dart
index 54cf73d..8591743 100644
--- a/generated/googleapis/lib/jobs/v3.dart
+++ b/generated/googleapis/lib/jobs/v3.dart
@@ -188,7 +188,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CompleteQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => CompleteQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -257,7 +260,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ClientEvent.fromJson(data));
+    return _response.then(
+      (data) =>
+          ClientEvent.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -322,7 +328,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Company.fromJson(data));
+    return _response.then(
+      (data) => Company.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes specified company. Prerequisite: The company has no jobs
@@ -374,7 +382,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves specified company.
@@ -425,7 +435,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Company.fromJson(data));
+    return _response.then(
+      (data) => Company.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all companies associated with the service account.
@@ -499,7 +511,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCompaniesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCompaniesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates specified company. Company names can't be updated. To update a
@@ -559,7 +574,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Company.fromJson(data));
+    return _response.then(
+      (data) => Company.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -624,7 +641,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new job. Typically, the job becomes searchable within 10
@@ -682,7 +701,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified job. Typically, the job becomes unsearchable within
@@ -734,7 +755,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves the specified job, whose status is OPEN or recently EXPIRED
@@ -786,7 +809,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists jobs by filter.
@@ -883,7 +908,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates specified job. Typically, updated contents become visible in
@@ -944,7 +972,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches for jobs using the provided SearchJobsRequest. This call
@@ -1005,7 +1035,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Searches for jobs using the provided SearchJobsRequest. This API call is
@@ -1070,7 +1103,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1201,7 +1237,8 @@
       count = _json['count'] as core.int;
     }
     if (_json.containsKey('range')) {
-      range = BucketRange.fromJson(_json['range']);
+      range = BucketRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1263,11 +1300,13 @@
     }
     if (_json.containsKey('extraInfo')) {
       extraInfo = commons.mapMap<core.String, core.String>(
-          _json['extraInfo'].cast<core.String, core.String>(),
+          (_json['extraInfo'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('jobEvent')) {
-      jobEvent = JobEvent.fromJson(_json['jobEvent']);
+      jobEvent = JobEvent.fromJson(
+          _json['jobEvent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parentEventId')) {
       parentEventId = _json['parentEventId'] as core.String;
@@ -1356,13 +1395,15 @@
       commuteMethod = _json['commuteMethod'] as core.String;
     }
     if (_json.containsKey('departureTime')) {
-      departureTime = TimeOfDay.fromJson(_json['departureTime']);
+      departureTime = TimeOfDay.fromJson(
+          _json['departureTime'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('roadTraffic')) {
       roadTraffic = _json['roadTraffic'] as core.String;
     }
     if (_json.containsKey('startCoordinates')) {
-      startCoordinates = LatLng.fromJson(_json['startCoordinates']);
+      startCoordinates = LatLng.fromJson(
+          _json['startCoordinates'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('travelDuration')) {
       travelDuration = _json['travelDuration'] as core.String;
@@ -1408,7 +1449,8 @@
 
   CommuteInfo.fromJson(core.Map _json) {
     if (_json.containsKey('jobLocation')) {
-      jobLocation = Location.fromJson(_json['jobLocation']);
+      jobLocation = Location.fromJson(
+          _json['jobLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('travelDuration')) {
       travelDuration = _json['travelDuration'] as core.String;
@@ -1506,7 +1548,8 @@
       careerSiteUri = _json['careerSiteUri'] as core.String;
     }
     if (_json.containsKey('derivedInfo')) {
-      derivedInfo = CompanyDerivedInfo.fromJson(_json['derivedInfo']);
+      derivedInfo = CompanyDerivedInfo.fromJson(
+          _json['derivedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -1602,7 +1645,8 @@
 
   CompanyDerivedInfo.fromJson(core.Map _json) {
     if (_json.containsKey('headquartersLocation')) {
-      headquartersLocation = Location.fromJson(_json['headquartersLocation']);
+      headquartersLocation = Location.fromJson(
+          _json['headquartersLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1671,7 +1715,8 @@
 
   CompensationEntry.fromJson(core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Money.fromJson(_json['amount']);
+      amount = Money.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -1681,7 +1726,8 @@
           (_json['expectedUnitsPerYear'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
-      range = CompensationRange.fromJson(_json['range']);
+      range = CompensationRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1759,7 +1805,8 @@
           _json['includeJobsWithUnspecifiedCompensationRange'] as core.bool;
     }
     if (_json.containsKey('range')) {
-      range = CompensationRange.fromJson(_json['range']);
+      range = CompensationRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1814,8 +1861,8 @@
 
   CompensationHistogramRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bucketingOption')) {
-      bucketingOption =
-          NumericBucketingOption.fromJson(_json['bucketingOption']);
+      bucketingOption = NumericBucketingOption.fromJson(
+          _json['bucketingOption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1855,7 +1902,8 @@
 
   CompensationHistogramResult.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = NumericBucketingResult.fromJson(_json['result']);
+      result = NumericBucketingResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1897,16 +1945,19 @@
 
   CompensationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('annualizedBaseCompensationRange')) {
-      annualizedBaseCompensationRange =
-          CompensationRange.fromJson(_json['annualizedBaseCompensationRange']);
+      annualizedBaseCompensationRange = CompensationRange.fromJson(
+          _json['annualizedBaseCompensationRange']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annualizedTotalCompensationRange')) {
-      annualizedTotalCompensationRange =
-          CompensationRange.fromJson(_json['annualizedTotalCompensationRange']);
+      annualizedTotalCompensationRange = CompensationRange.fromJson(
+          _json['annualizedTotalCompensationRange']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<CompensationEntry>((value) => CompensationEntry.fromJson(value))
+          .map<CompensationEntry>((value) => CompensationEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1944,10 +1995,12 @@
 
   CompensationRange.fromJson(core.Map _json) {
     if (_json.containsKey('maxCompensation')) {
-      maxCompensation = Money.fromJson(_json['maxCompensation']);
+      maxCompensation = Money.fromJson(
+          _json['maxCompensation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minCompensation')) {
-      minCompensation = Money.fromJson(_json['minCompensation']);
+      minCompensation = Money.fromJson(
+          _json['minCompensation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1977,11 +2030,13 @@
   CompleteQueryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('completionResults')) {
       completionResults = (_json['completionResults'] as core.List)
-          .map<CompletionResult>((value) => CompletionResult.fromJson(value))
+          .map<CompletionResult>((value) => CompletionResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2053,7 +2108,8 @@
 
   CreateClientEventRequest.fromJson(core.Map _json) {
     if (_json.containsKey('clientEvent')) {
-      clientEvent = ClientEvent.fromJson(_json['clientEvent']);
+      clientEvent = ClientEvent.fromJson(
+          _json['clientEvent'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2075,7 +2131,8 @@
 
   CreateCompanyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('company')) {
-      company = Company.fromJson(_json['company']);
+      company = Company.fromJson(
+          _json['company'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2097,7 +2154,7 @@
 
   CreateJobRequest.fromJson(core.Map _json) {
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2192,7 +2249,8 @@
     }
     if (_json.containsKey('longValueHistogramBucketingOption')) {
       longValueHistogramBucketingOption = NumericBucketingOption.fromJson(
-          _json['longValueHistogramBucketingOption']);
+          _json['longValueHistogramBucketingOption']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stringValueHistogram')) {
       stringValueHistogram = _json['stringValueHistogram'] as core.bool;
@@ -2235,12 +2293,15 @@
       key = _json['key'] as core.String;
     }
     if (_json.containsKey('longValueHistogramResult')) {
-      longValueHistogramResult =
-          NumericBucketingResult.fromJson(_json['longValueHistogramResult']);
+      longValueHistogramResult = NumericBucketingResult.fromJson(
+          _json['longValueHistogramResult']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stringValueHistogramResult')) {
       stringValueHistogramResult = commons.mapMap<core.int, core.int>(
-          _json['stringValueHistogramResult'].cast<core.String, core.int>(),
+          (_json['stringValueHistogramResult']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.int>(),
           (core.int item) => item as core.int);
     }
   }
@@ -2335,8 +2396,9 @@
   GoogleCloudTalentV4BatchCreateJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobResults')) {
       jobResults = (_json['jobResults'] as core.List)
-          .map<GoogleCloudTalentV4JobResult>(
-              (value) => GoogleCloudTalentV4JobResult.fromJson(value))
+          .map<GoogleCloudTalentV4JobResult>((value) =>
+              GoogleCloudTalentV4JobResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2362,8 +2424,9 @@
   GoogleCloudTalentV4BatchDeleteJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobResults')) {
       jobResults = (_json['jobResults'] as core.List)
-          .map<GoogleCloudTalentV4JobResult>(
-              (value) => GoogleCloudTalentV4JobResult.fromJson(value))
+          .map<GoogleCloudTalentV4JobResult>((value) =>
+              GoogleCloudTalentV4JobResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2490,8 +2553,9 @@
   GoogleCloudTalentV4BatchUpdateJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobResults')) {
       jobResults = (_json['jobResults'] as core.List)
-          .map<GoogleCloudTalentV4JobResult>(
-              (value) => GoogleCloudTalentV4JobResult.fromJson(value))
+          .map<GoogleCloudTalentV4JobResult>((value) =>
+              GoogleCloudTalentV4JobResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2532,18 +2596,20 @@
     if (_json.containsKey('annualizedBaseCompensationRange')) {
       annualizedBaseCompensationRange =
           GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
-              _json['annualizedBaseCompensationRange']);
+              _json['annualizedBaseCompensationRange']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annualizedTotalCompensationRange')) {
       annualizedTotalCompensationRange =
           GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
-              _json['annualizedTotalCompensationRange']);
+              _json['annualizedTotalCompensationRange']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
           .map<GoogleCloudTalentV4CompensationInfoCompensationEntry>((value) =>
               GoogleCloudTalentV4CompensationInfoCompensationEntry.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2622,7 +2688,8 @@
   GoogleCloudTalentV4CompensationInfoCompensationEntry.fromJson(
       core.Map _json) {
     if (_json.containsKey('amount')) {
-      amount = Money.fromJson(_json['amount']);
+      amount = Money.fromJson(
+          _json['amount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -2633,7 +2700,7 @@
     }
     if (_json.containsKey('range')) {
       range = GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
-          _json['range']);
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -2684,10 +2751,12 @@
   GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
       core.Map _json) {
     if (_json.containsKey('maxCompensation')) {
-      maxCompensation = Money.fromJson(_json['maxCompensation']);
+      maxCompensation = Money.fromJson(
+          _json['maxCompensation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minCompensation')) {
-      minCompensation = Money.fromJson(_json['minCompensation']);
+      minCompensation = Money.fromJson(
+          _json['minCompensation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3009,7 +3078,7 @@
     }
     if (_json.containsKey('applicationInfo')) {
       applicationInfo = GoogleCloudTalentV4JobApplicationInfo.fromJson(
-          _json['applicationInfo']);
+          _json['applicationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('company')) {
       company = _json['company'] as core.String;
@@ -3019,14 +3088,15 @@
     }
     if (_json.containsKey('compensationInfo')) {
       compensationInfo = GoogleCloudTalentV4CompensationInfo.fromJson(
-          _json['compensationInfo']);
+          _json['compensationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributes')) {
       customAttributes =
           commons.mapMap<core.Map, GoogleCloudTalentV4CustomAttribute>(
-              _json['customAttributes'].cast<core.String, core.Map>(),
-              (core.Map item) =>
-                  GoogleCloudTalentV4CustomAttribute.fromJson(item));
+              (_json['customAttributes'] as core.Map<core.String, core.dynamic>)
+                  .cast<core.String, core.Map>(),
+              (core.Map item) => GoogleCloudTalentV4CustomAttribute.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('degreeTypes')) {
       degreeTypes = (_json['degreeTypes'] as core.List)
@@ -3037,8 +3107,8 @@
       department = _json['department'] as core.String;
     }
     if (_json.containsKey('derivedInfo')) {
-      derivedInfo =
-          GoogleCloudTalentV4JobDerivedInfo.fromJson(_json['derivedInfo']);
+      derivedInfo = GoogleCloudTalentV4JobDerivedInfo.fromJson(
+          _json['derivedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -3088,7 +3158,7 @@
     }
     if (_json.containsKey('processingOptions')) {
       processingOptions = GoogleCloudTalentV4JobProcessingOptions.fromJson(
-          _json['processingOptions']);
+          _json['processingOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('promotionValue')) {
       promotionValue = _json['promotionValue'] as core.int;
@@ -3280,8 +3350,9 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<GoogleCloudTalentV4Location>(
-              (value) => GoogleCloudTalentV4Location.fromJson(value))
+          .map<GoogleCloudTalentV4Location>((value) =>
+              GoogleCloudTalentV4Location.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3355,10 +3426,12 @@
 
   GoogleCloudTalentV4JobResult.fromJson(core.Map _json) {
     if (_json.containsKey('job')) {
-      job = GoogleCloudTalentV4Job.fromJson(_json['job']);
+      job = GoogleCloudTalentV4Job.fromJson(
+          _json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3418,13 +3491,15 @@
 
   GoogleCloudTalentV4Location.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationType')) {
       locationType = _json['locationType'] as core.String;
     }
     if (_json.containsKey('postalAddress')) {
-      postalAddress = PostalAddress.fromJson(_json['postalAddress']);
+      postalAddress = PostalAddress.fromJson(
+          _json['postalAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('radiusMiles')) {
       radiusMiles = (_json['radiusMiles'] as core.num).toDouble();
@@ -3469,15 +3544,17 @@
     if (_json.containsKey('compensationHistogramFacets')) {
       compensationHistogramFacets =
           (_json['compensationHistogramFacets'] as core.List)
-              .map<CompensationHistogramRequest>(
-                  (value) => CompensationHistogramRequest.fromJson(value))
+              .map<CompensationHistogramRequest>((value) =>
+                  CompensationHistogramRequest.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('customAttributeHistogramFacets')) {
       customAttributeHistogramFacets =
           (_json['customAttributeHistogramFacets'] as core.List)
-              .map<CustomAttributeHistogramRequest>(
-                  (value) => CustomAttributeHistogramRequest.fromJson(value))
+              .map<CustomAttributeHistogramRequest>((value) =>
+                  CustomAttributeHistogramRequest.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('simpleHistogramFacets')) {
@@ -3564,7 +3641,8 @@
     }
     if (_json.containsKey('values')) {
       values = commons.mapMap<core.int, core.int>(
-          _json['values'].cast<core.String, core.int>(),
+          (_json['values'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.int>(),
           (core.int item) => item as core.int);
     }
   }
@@ -3602,20 +3680,23 @@
     if (_json.containsKey('compensationHistogramResults')) {
       compensationHistogramResults =
           (_json['compensationHistogramResults'] as core.List)
-              .map<CompensationHistogramResult>(
-                  (value) => CompensationHistogramResult.fromJson(value))
+              .map<CompensationHistogramResult>((value) =>
+                  CompensationHistogramResult.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('customAttributeHistogramResults')) {
       customAttributeHistogramResults =
           (_json['customAttributeHistogramResults'] as core.List)
-              .map<CustomAttributeHistogramResult>(
-                  (value) => CustomAttributeHistogramResult.fromJson(value))
+              .map<CustomAttributeHistogramResult>((value) =>
+                  CustomAttributeHistogramResult.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('simpleHistogramResults')) {
       simpleHistogramResults = (_json['simpleHistogramResults'] as core.List)
-          .map<HistogramResult>((value) => HistogramResult.fromJson(value))
+          .map<HistogramResult>((value) => HistogramResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3877,7 +3958,8 @@
           .toList();
     }
     if (_json.containsKey('applicationInfo')) {
-      applicationInfo = ApplicationInfo.fromJson(_json['applicationInfo']);
+      applicationInfo = ApplicationInfo.fromJson(
+          _json['applicationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('companyDisplayName')) {
       companyDisplayName = _json['companyDisplayName'] as core.String;
@@ -3886,12 +3968,15 @@
       companyName = _json['companyName'] as core.String;
     }
     if (_json.containsKey('compensationInfo')) {
-      compensationInfo = CompensationInfo.fromJson(_json['compensationInfo']);
+      compensationInfo = CompensationInfo.fromJson(
+          _json['compensationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributes')) {
       customAttributes = commons.mapMap<core.Map, CustomAttribute>(
-          _json['customAttributes'].cast<core.String, core.Map>(),
-          (core.Map item) => CustomAttribute.fromJson(item));
+          (_json['customAttributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => CustomAttribute.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('degreeTypes')) {
       degreeTypes = (_json['degreeTypes'] as core.List)
@@ -3902,7 +3987,8 @@
       department = _json['department'] as core.String;
     }
     if (_json.containsKey('derivedInfo')) {
-      derivedInfo = JobDerivedInfo.fromJson(_json['derivedInfo']);
+      derivedInfo = JobDerivedInfo.fromJson(
+          _json['derivedInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -3951,8 +4037,8 @@
       postingUpdateTime = _json['postingUpdateTime'] as core.String;
     }
     if (_json.containsKey('processingOptions')) {
-      processingOptions =
-          ProcessingOptions.fromJson(_json['processingOptions']);
+      processingOptions = ProcessingOptions.fromJson(
+          _json['processingOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('promotionValue')) {
       promotionValue = _json['promotionValue'] as core.int;
@@ -4091,7 +4177,8 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4311,7 +4398,8 @@
 
   JobQuery.fromJson(core.Map _json) {
     if (_json.containsKey('commuteFilter')) {
-      commuteFilter = CommuteFilter.fromJson(_json['commuteFilter']);
+      commuteFilter = CommuteFilter.fromJson(
+          _json['commuteFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('companyDisplayNames')) {
       companyDisplayNames = (_json['companyDisplayNames'] as core.List)
@@ -4324,8 +4412,8 @@
           .toList();
     }
     if (_json.containsKey('compensationFilter')) {
-      compensationFilter =
-          CompensationFilter.fromJson(_json['compensationFilter']);
+      compensationFilter = CompensationFilter.fromJson(
+          _json['compensationFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customAttributeFilter')) {
       customAttributeFilter = _json['customAttributeFilter'] as core.String;
@@ -4350,11 +4438,13 @@
     }
     if (_json.containsKey('locationFilters')) {
       locationFilters = (_json['locationFilters'] as core.List)
-          .map<LocationFilter>((value) => LocationFilter.fromJson(value))
+          .map<LocationFilter>((value) => LocationFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('publishTimeRange')) {
-      publishTimeRange = TimestampRange.fromJson(_json['publishTimeRange']);
+      publishTimeRange = TimestampRange.fromJson(
+          _json['publishTimeRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
       query = _json['query'] as core.String;
@@ -4461,11 +4551,13 @@
   ListCompaniesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('companies')) {
       companies = (_json['companies'] as core.List)
-          .map<Company>((value) => Company.fromJson(value))
+          .map<Company>((value) =>
+              Company.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -4505,11 +4597,13 @@
   ListJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<Job>((value) => Job.fromJson(value))
+          .map<Job>((value) =>
+              Job.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
@@ -4576,13 +4670,15 @@
 
   Location.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationType')) {
       locationType = _json['locationType'] as core.String;
     }
     if (_json.containsKey('postalAddress')) {
-      postalAddress = PostalAddress.fromJson(_json['postalAddress']);
+      postalAddress = PostalAddress.fromJson(
+          _json['postalAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('radiusInMiles')) {
       radiusInMiles = (_json['radiusInMiles'] as core.num).toDouble();
@@ -4661,7 +4757,8 @@
       distanceInMiles = (_json['distanceInMiles'] as core.num).toDouble();
     }
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('regionCode')) {
       regionCode = _json['regionCode'] as core.String;
@@ -4719,10 +4816,11 @@
 
   MatchingJob.fromJson(core.Map _json) {
     if (_json.containsKey('commuteInfo')) {
-      commuteInfo = CommuteInfo.fromJson(_json['commuteInfo']);
+      commuteInfo = CommuteInfo.fromJson(
+          _json['commuteInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobSummary')) {
       jobSummary = _json['jobSummary'] as core.String;
@@ -4774,8 +4872,10 @@
   MendelDebugInput.fromJson(core.Map _json) {
     if (_json.containsKey('namespacedDebugInput')) {
       namespacedDebugInput = commons.mapMap<core.Map, NamespacedDebugInput>(
-          _json['namespacedDebugInput'].cast<core.String, core.Map>(),
-          (core.Map item) => NamespacedDebugInput.fromJson(item));
+          (_json['namespacedDebugInput'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NamespacedDebugInput.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -4981,12 +5081,14 @@
     }
     if (_json.containsKey('forcedFlags')) {
       forcedFlags = commons.mapMap<core.String, core.String>(
-          _json['forcedFlags'].cast<core.String, core.String>(),
+          (_json['forcedFlags'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('forcedRollouts')) {
       forcedRollouts = commons.mapMap<core.bool, core.bool>(
-          _json['forcedRollouts'].cast<core.String, core.bool>(),
+          (_json['forcedRollouts'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.bool>(),
           (core.bool item) => item as core.bool);
     }
   }
@@ -5098,7 +5200,8 @@
   NumericBucketingResult.fromJson(core.Map _json) {
     if (_json.containsKey('counts')) {
       counts = (_json['counts'] as core.List)
-          .map<BucketizedCount>((value) => BucketizedCount.fromJson(value))
+          .map<BucketizedCount>((value) => BucketizedCount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxValue')) {
@@ -5379,7 +5482,8 @@
 
   RequestMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('deviceInfo')) {
-      deviceInfo = DeviceInfo.fromJson(_json['deviceInfo']);
+      deviceInfo = DeviceInfo.fromJson(
+          _json['deviceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('domain')) {
       domain = _json['domain'] as core.String;
@@ -5576,10 +5680,12 @@
       enableBroadening = _json['enableBroadening'] as core.bool;
     }
     if (_json.containsKey('histogramFacets')) {
-      histogramFacets = HistogramFacets.fromJson(_json['histogramFacets']);
+      histogramFacets = HistogramFacets.fromJson(
+          _json['histogramFacets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobQuery')) {
-      jobQuery = JobQuery.fromJson(_json['jobQuery']);
+      jobQuery = JobQuery.fromJson(
+          _json['jobQuery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobView')) {
       jobView = _json['jobView'] as core.String;
@@ -5597,7 +5703,8 @@
       pageToken = _json['pageToken'] as core.String;
     }
     if (_json.containsKey('requestMetadata')) {
-      requestMetadata = RequestMetadata.fromJson(_json['requestMetadata']);
+      requestMetadata = RequestMetadata.fromJson(
+          _json['requestMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requirePreciseResultSize')) {
       requirePreciseResultSize = _json['requirePreciseResultSize'] as core.bool;
@@ -5704,26 +5811,31 @@
       estimatedTotalSize = _json['estimatedTotalSize'] as core.int;
     }
     if (_json.containsKey('histogramResults')) {
-      histogramResults = HistogramResults.fromJson(_json['histogramResults']);
+      histogramResults = HistogramResults.fromJson(
+          _json['histogramResults'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationFilters')) {
       locationFilters = (_json['locationFilters'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('matchingJobs')) {
       matchingJobs = (_json['matchingJobs'] as core.List)
-          .map<MatchingJob>((value) => MatchingJob.fromJson(value))
+          .map<MatchingJob>((value) => MatchingJob.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResponseMetadata.fromJson(_json['metadata']);
+      metadata = ResponseMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextPageToken')) {
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('spellCorrection')) {
-      spellCorrection = SpellingCorrection.fromJson(_json['spellCorrection']);
+      spellCorrection = SpellingCorrection.fromJson(
+          _json['spellCorrection'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('totalSize')) {
       totalSize = _json['totalSize'] as core.int;
@@ -5828,7 +5940,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -5952,7 +6065,8 @@
 
   UpdateCompanyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('company')) {
-      company = Company.fromJson(_json['company']);
+      company = Company.fromJson(
+          _json['company'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -5987,7 +6101,7 @@
 
   UpdateJobRequest.fromJson(core.Map _json) {
     if (_json.containsKey('job')) {
-      job = Job.fromJson(_json['job']);
+      job = Job.fromJson(_json['job'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
diff --git a/generated/googleapis/lib/kgsearch/v1.dart b/generated/googleapis/lib/kgsearch/v1.dart
index 25543ef..2d7f097 100644
--- a/generated/googleapis/lib/kgsearch/v1.dart
+++ b/generated/googleapis/lib/kgsearch/v1.dart
@@ -135,7 +135,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SearchResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
diff --git a/generated/googleapis/lib/language/v1.dart b/generated/googleapis/lib/language/v1.dart
index 04c3521..af5b409 100644
--- a/generated/googleapis/lib/language/v1.dart
+++ b/generated/googleapis/lib/language/v1.dart
@@ -105,7 +105,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AnalyzeEntitiesResponse.fromJson(data));
+    return _response.then(
+      (data) => AnalyzeEntitiesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finds entities, similar to AnalyzeEntities in the text and analyzes
@@ -154,8 +157,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => AnalyzeEntitySentimentResponse.fromJson(data));
+    return _response.then(
+      (data) => AnalyzeEntitySentimentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Analyzes the sentiment of the provided text.
@@ -203,7 +208,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AnalyzeSentimentResponse.fromJson(data));
+    return _response.then(
+      (data) => AnalyzeSentimentResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Analyzes the syntax of the text and provides sentence boundaries and
@@ -253,7 +261,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AnalyzeSyntaxResponse.fromJson(data));
+    return _response.then(
+      (data) => AnalyzeSyntaxResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// A convenience method that provides all the features that analyzeSentiment,
@@ -302,7 +313,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AnnotateTextResponse.fromJson(data));
+    return _response.then(
+      (data) => AnnotateTextResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Classifies a document into categories.
@@ -350,7 +364,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ClassifyTextResponse.fromJson(data));
+    return _response.then(
+      (data) => ClassifyTextResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -378,7 +395,8 @@
 
   AnalyzeEntitiesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encodingType')) {
       encodingType = _json['encodingType'] as core.String;
@@ -412,7 +430,8 @@
   AnalyzeEntitiesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
-          .map<Entity>((value) => Entity.fromJson(value))
+          .map<Entity>((value) =>
+              Entity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('language')) {
@@ -456,7 +475,8 @@
 
   AnalyzeEntitySentimentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encodingType')) {
       encodingType = _json['encodingType'] as core.String;
@@ -490,7 +510,8 @@
   AnalyzeEntitySentimentResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
-          .map<Entity>((value) => Entity.fromJson(value))
+          .map<Entity>((value) =>
+              Entity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('language')) {
@@ -534,7 +555,8 @@
 
   AnalyzeSentimentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encodingType')) {
       encodingType = _json['encodingType'] as core.String;
@@ -570,14 +592,16 @@
 
   AnalyzeSentimentResponse.fromJson(core.Map _json) {
     if (_json.containsKey('documentSentiment')) {
-      documentSentiment = Sentiment.fromJson(_json['documentSentiment']);
+      documentSentiment = Sentiment.fromJson(
+          _json['documentSentiment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('language')) {
       language = _json['language'] as core.String;
     }
     if (_json.containsKey('sentences')) {
       sentences = (_json['sentences'] as core.List)
-          .map<Sentence>((value) => Sentence.fromJson(value))
+          .map<Sentence>((value) =>
+              Sentence.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -621,7 +645,8 @@
 
   AnalyzeSyntaxRequest.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encodingType')) {
       encodingType = _json['encodingType'] as core.String;
@@ -661,12 +686,14 @@
     }
     if (_json.containsKey('sentences')) {
       sentences = (_json['sentences'] as core.List)
-          .map<Sentence>((value) => Sentence.fromJson(value))
+          .map<Sentence>((value) =>
+              Sentence.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tokens')) {
       tokens = (_json['tokens'] as core.List)
-          .map<Token>((value) => Token.fromJson(value))
+          .map<Token>((value) =>
+              Token.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -714,13 +741,15 @@
 
   AnnotateTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('encodingType')) {
       encodingType = _json['encodingType'] as core.String;
     }
     if (_json.containsKey('features')) {
-      features = Features.fromJson(_json['features']);
+      features = Features.fromJson(
+          _json['features'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -771,16 +800,19 @@
   AnnotateTextResponse.fromJson(core.Map _json) {
     if (_json.containsKey('categories')) {
       categories = (_json['categories'] as core.List)
-          .map<ClassificationCategory>(
-              (value) => ClassificationCategory.fromJson(value))
+          .map<ClassificationCategory>((value) =>
+              ClassificationCategory.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('documentSentiment')) {
-      documentSentiment = Sentiment.fromJson(_json['documentSentiment']);
+      documentSentiment = Sentiment.fromJson(
+          _json['documentSentiment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entities')) {
       entities = (_json['entities'] as core.List)
-          .map<Entity>((value) => Entity.fromJson(value))
+          .map<Entity>((value) =>
+              Entity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('language')) {
@@ -788,12 +820,14 @@
     }
     if (_json.containsKey('sentences')) {
       sentences = (_json['sentences'] as core.List)
-          .map<Sentence>((value) => Sentence.fromJson(value))
+          .map<Sentence>((value) =>
+              Sentence.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tokens')) {
       tokens = (_json['tokens'] as core.List)
-          .map<Token>((value) => Token.fromJson(value))
+          .map<Token>((value) =>
+              Token.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -864,7 +898,8 @@
 
   ClassifyTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('document')) {
-      document = Document.fromJson(_json['document']);
+      document = Document.fromJson(
+          _json['document'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -887,8 +922,9 @@
   ClassifyTextResponse.fromJson(core.Map _json) {
     if (_json.containsKey('categories')) {
       categories = (_json['categories'] as core.List)
-          .map<ClassificationCategory>(
-              (value) => ClassificationCategory.fromJson(value))
+          .map<ClassificationCategory>((value) =>
+              ClassificationCategory.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1154,12 +1190,14 @@
   Entity.fromJson(core.Map _json) {
     if (_json.containsKey('mentions')) {
       mentions = (_json['mentions'] as core.List)
-          .map<EntityMention>((value) => EntityMention.fromJson(value))
+          .map<EntityMention>((value) => EntityMention.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.String, core.String>(
-          _json['metadata'].cast<core.String, core.String>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -1169,7 +1207,8 @@
       salience = (_json['salience'] as core.num).toDouble();
     }
     if (_json.containsKey('sentiment')) {
-      sentiment = Sentiment.fromJson(_json['sentiment']);
+      sentiment = Sentiment.fromJson(
+          _json['sentiment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1223,10 +1262,12 @@
 
   EntityMention.fromJson(core.Map _json) {
     if (_json.containsKey('sentiment')) {
-      sentiment = Sentiment.fromJson(_json['sentiment']);
+      sentiment = Sentiment.fromJson(
+          _json['sentiment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text = TextSpan.fromJson(_json['text']);
+      text = TextSpan.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1548,10 +1589,12 @@
 
   Sentence.fromJson(core.Map _json) {
     if (_json.containsKey('sentiment')) {
-      sentiment = Sentiment.fromJson(_json['sentiment']);
+      sentiment = Sentiment.fromJson(
+          _json['sentiment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text = TextSpan.fromJson(_json['text']);
+      text = TextSpan.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1634,7 +1677,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -1709,16 +1753,19 @@
 
   Token.fromJson(core.Map _json) {
     if (_json.containsKey('dependencyEdge')) {
-      dependencyEdge = DependencyEdge.fromJson(_json['dependencyEdge']);
+      dependencyEdge = DependencyEdge.fromJson(
+          _json['dependencyEdge'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lemma')) {
       lemma = _json['lemma'] as core.String;
     }
     if (_json.containsKey('partOfSpeech')) {
-      partOfSpeech = PartOfSpeech.fromJson(_json['partOfSpeech']);
+      partOfSpeech = PartOfSpeech.fromJson(
+          _json['partOfSpeech'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text = TextSpan.fromJson(_json['text']);
+      text = TextSpan.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/libraryagent/v1.dart b/generated/googleapis/lib/libraryagent/v1.dart
index 5f2bee2..8716577 100644
--- a/generated/googleapis/lib/libraryagent/v1.dart
+++ b/generated/googleapis/lib/libraryagent/v1.dart
@@ -99,8 +99,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleExampleLibraryagentV1Shelf.fromJson(data));
+    return _response.then(
+      (data) => GoogleExampleLibraryagentV1Shelf.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists shelves. The order is unspecified but deterministic. Newly created
@@ -159,8 +161,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleExampleLibraryagentV1ListShelvesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleExampleLibraryagentV1ListShelvesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -218,8 +222,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleExampleLibraryagentV1Book.fromJson(data));
+    return _response.then(
+      (data) => GoogleExampleLibraryagentV1Book.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a book. Returns NOT_FOUND if the book does not exist.
@@ -268,8 +274,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleExampleLibraryagentV1Book.fromJson(data));
+    return _response.then(
+      (data) => GoogleExampleLibraryagentV1Book.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists books in a shelf. The order is unspecified but deterministic. Newly
@@ -336,7 +344,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleExampleLibraryagentV1ListBooksResponse.fromJson(data));
+      (data) => GoogleExampleLibraryagentV1ListBooksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Return a book to the library. Returns the book if it is returned to the
@@ -387,8 +397,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleExampleLibraryagentV1Book.fromJson(data));
+    return _response.then(
+      (data) => GoogleExampleLibraryagentV1Book.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -458,8 +470,9 @@
   GoogleExampleLibraryagentV1ListBooksResponse.fromJson(core.Map _json) {
     if (_json.containsKey('books')) {
       books = (_json['books'] as core.List)
-          .map<GoogleExampleLibraryagentV1Book>(
-              (value) => GoogleExampleLibraryagentV1Book.fromJson(value))
+          .map<GoogleExampleLibraryagentV1Book>((value) =>
+              GoogleExampleLibraryagentV1Book.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -497,8 +510,9 @@
     }
     if (_json.containsKey('shelves')) {
       shelves = (_json['shelves'] as core.List)
-          .map<GoogleExampleLibraryagentV1Shelf>(
-              (value) => GoogleExampleLibraryagentV1Shelf.fromJson(value))
+          .map<GoogleExampleLibraryagentV1Shelf>((value) =>
+              GoogleExampleLibraryagentV1Shelf.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/licensing/v1.dart b/generated/googleapis/lib/licensing/v1.dart
index edb1b5b..73ae80b 100644
--- a/generated/googleapis/lib/licensing/v1.dart
+++ b/generated/googleapis/lib/licensing/v1.dart
@@ -123,7 +123,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Get a specific user's license by product SKU.
@@ -194,7 +196,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicenseAssignment.fromJson(data));
+    return _response.then(
+      (data) => LicenseAssignment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Assign a license.
@@ -260,7 +265,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicenseAssignment.fromJson(data));
+    return _response.then(
+      (data) => LicenseAssignment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all users assigned licenses for a specific product SKU.
@@ -338,7 +346,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicenseAssignmentList.fromJson(data));
+    return _response.then(
+      (data) => LicenseAssignmentList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all users assigned licenses for a specific product SKU.
@@ -425,7 +436,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicenseAssignmentList.fromJson(data));
+    return _response.then(
+      (data) => LicenseAssignmentList.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch a Licensing info via Apiary Patch Orchestration
@@ -502,7 +516,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicenseAssignment.fromJson(data));
+    return _response.then(
+      (data) => LicenseAssignment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reassign a user's product SKU with a different SKU in the same product.
@@ -579,7 +596,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LicenseAssignment.fromJson(data));
+    return _response.then(
+      (data) => LicenseAssignment.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -720,7 +740,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<LicenseAssignment>((value) => LicenseAssignment.fromJson(value))
+          .map<LicenseAssignment>((value) => LicenseAssignment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/logging/v2.dart b/generated/googleapis/lib/logging/v2.dart
index 6e7bf74..65b4e24 100644
--- a/generated/googleapis/lib/logging/v2.dart
+++ b/generated/googleapis/lib/logging/v2.dart
@@ -153,7 +153,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -222,7 +224,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an exclusion.
@@ -276,7 +281,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the description of an exclusion.
@@ -330,7 +337,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the exclusions in a parent resource.
@@ -400,7 +410,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListExclusionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListExclusionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes one or more properties of an existing exclusion.
@@ -471,7 +484,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -555,7 +571,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a bucket. Moves the bucket to the DELETE_REQUESTED state. After 7
@@ -612,7 +630,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists buckets (Beta).
@@ -685,7 +705,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBucketsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBucketsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a bucket. This method replaces the following fields in the
@@ -764,7 +787,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a bucket. A bucket that has been deleted may be undeleted within
@@ -826,7 +851,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -892,7 +919,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the logs in projects, organizations, folders, or billing accounts.
@@ -961,7 +990,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLogsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLogsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1044,7 +1076,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a sink. If the sink has a unique writer_identity, then that
@@ -1100,7 +1134,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a sink.
@@ -1154,7 +1190,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists sinks.
@@ -1222,7 +1260,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSinksResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSinksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -1313,7 +1354,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -1404,7 +1447,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1461,7 +1506,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLogEntriesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLogEntriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Writes log entries to Logging. This API method is the only way to send log
@@ -1513,7 +1561,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WriteLogEntriesResponse.fromJson(data));
+    return _response.then(
+      (data) => WriteLogEntriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1581,7 +1632,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an exclusion.
@@ -1635,7 +1689,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the description of an exclusion.
@@ -1689,7 +1745,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the exclusions in a parent resource.
@@ -1759,7 +1818,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListExclusionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListExclusionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes one or more properties of an existing exclusion.
@@ -1830,7 +1892,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1912,7 +1977,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an exclusion.
@@ -1966,7 +2034,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the description of an exclusion.
@@ -2020,7 +2090,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the exclusions in a parent resource.
@@ -2090,7 +2163,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListExclusionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListExclusionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes one or more properties of an existing exclusion.
@@ -2161,7 +2237,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2245,7 +2324,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a bucket. Moves the bucket to the DELETE_REQUESTED state. After 7
@@ -2301,7 +2382,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a bucket (Beta).
@@ -2355,7 +2438,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists buckets (Beta).
@@ -2428,7 +2513,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBucketsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBucketsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a bucket. This method replaces the following fields in the
@@ -2506,7 +2594,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a bucket. A bucket that has been deleted may be undeleted within
@@ -2567,7 +2657,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2632,7 +2724,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the logs in projects, organizations, folders, or billing accounts.
@@ -2701,7 +2795,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLogsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLogsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2783,7 +2880,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a sink. If the sink has a unique writer_identity, then that
@@ -2839,7 +2938,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a sink.
@@ -2893,7 +2994,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists sinks.
@@ -2961,7 +3064,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSinksResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSinksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -3052,7 +3158,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -3143,7 +3251,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3226,7 +3336,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a bucket. Moves the bucket to the DELETE_REQUESTED state. After 7
@@ -3282,7 +3394,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a bucket (Beta).
@@ -3336,7 +3450,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists buckets (Beta).
@@ -3409,7 +3525,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBucketsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBucketsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a bucket. This method replaces the following fields in the
@@ -3487,7 +3606,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a bucket. A bucket that has been deleted may be undeleted within
@@ -3548,7 +3669,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3613,7 +3736,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the logs in projects, organizations, folders, or billing accounts.
@@ -3682,7 +3807,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLogsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLogsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3749,7 +3877,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListMonitoredResourceDescriptorsResponse.fromJson(data));
+      (data) => ListMonitoredResourceDescriptorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3827,7 +3957,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CmekSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          CmekSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the Logs Router CMEK settings for the given resource.Note: CMEK
@@ -3908,7 +4041,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CmekSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          CmekSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3977,7 +4113,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an exclusion.
@@ -4031,7 +4170,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the description of an exclusion.
@@ -4085,7 +4226,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the exclusions in a parent resource.
@@ -4155,7 +4299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListExclusionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListExclusionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes one or more properties of an existing exclusion.
@@ -4226,7 +4373,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4310,7 +4460,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a bucket. Moves the bucket to the DELETE_REQUESTED state. After 7
@@ -4367,7 +4519,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a bucket (Beta).
@@ -4422,7 +4576,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists buckets (Beta).
@@ -4495,7 +4651,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBucketsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBucketsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a bucket. This method replaces the following fields in the
@@ -4574,7 +4733,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a bucket. A bucket that has been deleted may be undeleted within
@@ -4636,7 +4797,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4702,7 +4865,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the logs in projects, organizations, folders, or billing accounts.
@@ -4771,7 +4936,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLogsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLogsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4854,7 +5022,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a sink. If the sink has a unique writer_identity, then that
@@ -4910,7 +5080,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a sink.
@@ -4964,7 +5136,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists sinks.
@@ -5032,7 +5206,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSinksResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSinksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -5123,7 +5300,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -5214,7 +5393,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5298,7 +5479,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an exclusion.
@@ -5352,7 +5536,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the description of an exclusion.
@@ -5406,7 +5592,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the exclusions in a parent resource.
@@ -5476,7 +5665,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListExclusionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListExclusionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Changes one or more properties of an existing exclusion.
@@ -5547,7 +5739,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogExclusion.fromJson(data));
+    return _response.then(
+      (data) =>
+          LogExclusion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5631,7 +5826,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a bucket. Moves the bucket to the DELETE_REQUESTED state. After 7
@@ -5687,7 +5884,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a bucket (Beta).
@@ -5741,7 +5940,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists buckets (Beta).
@@ -5814,7 +6015,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBucketsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBucketsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a bucket. This method replaces the following fields in the
@@ -5892,7 +6096,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogBucket.fromJson(data));
+    return _response.then(
+      (data) => LogBucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a bucket. A bucket that has been deleted may be undeleted within
@@ -5953,7 +6159,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6018,7 +6226,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the logs in projects, organizations, folders, or billing accounts.
@@ -6087,7 +6297,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLogsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLogsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6151,7 +6364,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogMetric.fromJson(data));
+    return _response.then(
+      (data) => LogMetric.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a logs-based metric.
@@ -6201,7 +6416,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a logs-based metric.
@@ -6251,7 +6468,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogMetric.fromJson(data));
+    return _response.then(
+      (data) => LogMetric.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists logs-based metrics.
@@ -6319,7 +6538,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLogMetricsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLogMetricsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates or updates a logs-based metric.
@@ -6378,7 +6600,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogMetric.fromJson(data));
+    return _response.then(
+      (data) => LogMetric.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6460,7 +6684,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a sink. If the sink has a unique writer_identity, then that
@@ -6516,7 +6742,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a sink.
@@ -6570,7 +6798,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists sinks.
@@ -6638,7 +6868,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSinksResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSinksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -6729,7 +6962,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -6820,7 +7055,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6902,7 +7139,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a sink. If the sink has a unique writer_identity, then that
@@ -6958,7 +7197,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a sink.
@@ -7012,7 +7253,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists sinks.
@@ -7080,7 +7323,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSinksResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSinksResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a sink. This method replaces the following fields in the existing
@@ -7171,7 +7417,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LogSink.fromJson(data));
+    return _response.then(
+      (data) => LogSink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7240,7 +7488,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CmekSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          CmekSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the Logs Router CMEK settings for the given resource.Note: CMEK
@@ -7321,7 +7572,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CmekSettings.fromJson(data));
+    return _response.then(
+      (data) =>
+          CmekSettings.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -7397,13 +7651,16 @@
 
   BucketOptions.fromJson(core.Map _json) {
     if (_json.containsKey('explicitBuckets')) {
-      explicitBuckets = Explicit.fromJson(_json['explicitBuckets']);
+      explicitBuckets = Explicit.fromJson(
+          _json['explicitBuckets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exponentialBuckets')) {
-      exponentialBuckets = Exponential.fromJson(_json['exponentialBuckets']);
+      exponentialBuckets = Exponential.fromJson(
+          _json['exponentialBuckets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linearBuckets')) {
-      linearBuckets = Linear.fromJson(_json['linearBuckets']);
+      linearBuckets = Linear.fromJson(
+          _json['linearBuckets'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7850,7 +8107,8 @@
   ListBucketsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('buckets')) {
       buckets = (_json['buckets'] as core.List)
-          .map<LogBucket>((value) => LogBucket.fromJson(value))
+          .map<LogBucket>((value) =>
+              LogBucket.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -7885,7 +8143,8 @@
   ListExclusionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('exclusions')) {
       exclusions = (_json['exclusions'] as core.List)
-          .map<LogExclusion>((value) => LogExclusion.fromJson(value))
+          .map<LogExclusion>((value) => LogExclusion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8022,7 +8281,8 @@
   ListLogEntriesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<LogEntry>((value) => LogEntry.fromJson(value))
+          .map<LogEntry>((value) =>
+              LogEntry.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8057,7 +8317,8 @@
   ListLogMetricsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<LogMetric>((value) => LogMetric.fromJson(value))
+          .map<LogMetric>((value) =>
+              LogMetric.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -8131,8 +8392,9 @@
     }
     if (_json.containsKey('resourceDescriptors')) {
       resourceDescriptors = (_json['resourceDescriptors'] as core.List)
-          .map<MonitoredResourceDescriptor>(
-              (value) => MonitoredResourceDescriptor.fromJson(value))
+          .map<MonitoredResourceDescriptor>((value) =>
+              MonitoredResourceDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8168,7 +8430,8 @@
     }
     if (_json.containsKey('sinks')) {
       sinks = (_json['sinks'] as core.List)
-          .map<LogSink>((value) => LogSink.fromJson(value))
+          .map<LogSink>((value) =>
+              LogSink.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8415,46 +8678,54 @@
 
   LogEntry.fromJson(core.Map _json) {
     if (_json.containsKey('httpRequest')) {
-      httpRequest = HttpRequest.fromJson(_json['httpRequest']);
+      httpRequest = HttpRequest.fromJson(
+          _json['httpRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertId')) {
       insertId = _json['insertId'] as core.String;
     }
     if (_json.containsKey('jsonPayload')) {
       jsonPayload = commons.mapMap<core.Object, core.Object>(
-          _json['jsonPayload'].cast<core.String, core.Object>(),
+          (_json['jsonPayload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('logName')) {
       logName = _json['logName'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = MonitoredResourceMetadata.fromJson(_json['metadata']);
+      metadata = MonitoredResourceMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operation')) {
-      operation = LogEntryOperation.fromJson(_json['operation']);
+      operation = LogEntryOperation.fromJson(
+          _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protoPayload')) {
       protoPayload = commons.mapMap<core.Object, core.Object>(
-          _json['protoPayload'].cast<core.String, core.Object>(),
+          (_json['protoPayload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('receiveTimestamp')) {
       receiveTimestamp = _json['receiveTimestamp'] as core.String;
     }
     if (_json.containsKey('resource')) {
-      resource = MonitoredResource.fromJson(_json['resource']);
+      resource = MonitoredResource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('severity')) {
       severity = _json['severity'] as core.String;
     }
     if (_json.containsKey('sourceLocation')) {
-      sourceLocation = LogEntrySourceLocation.fromJson(_json['sourceLocation']);
+      sourceLocation = LogEntrySourceLocation.fromJson(
+          _json['sourceLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spanId')) {
       spanId = _json['spanId'] as core.String;
@@ -8754,7 +9025,8 @@
       severity = _json['severity'] as core.String;
     }
     if (_json.containsKey('sourceLocation')) {
-      sourceLocation = SourceLocation.fromJson(_json['sourceLocation']);
+      sourceLocation = SourceLocation.fromJson(
+          _json['sourceLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('time')) {
       time = _json['time'] as core.String;
@@ -8878,7 +9150,8 @@
 
   LogMetric.fromJson(core.Map _json) {
     if (_json.containsKey('bucketOptions')) {
-      bucketOptions = BucketOptions.fromJson(_json['bucketOptions']);
+      bucketOptions = BucketOptions.fromJson(
+          _json['bucketOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -8891,11 +9164,13 @@
     }
     if (_json.containsKey('labelExtractors')) {
       labelExtractors = commons.mapMap<core.String, core.String>(
-          _json['labelExtractors'].cast<core.String, core.String>(),
+          (_json['labelExtractors'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('metricDescriptor')) {
-      metricDescriptor = MetricDescriptor.fromJson(_json['metricDescriptor']);
+      metricDescriptor = MetricDescriptor.fromJson(
+          _json['metricDescriptor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -9037,7 +9312,8 @@
 
   LogSink.fromJson(core.Map _json) {
     if (_json.containsKey('bigqueryOptions')) {
-      bigqueryOptions = BigQueryOptions.fromJson(_json['bigqueryOptions']);
+      bigqueryOptions = BigQueryOptions.fromJson(
+          _json['bigqueryOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -9053,7 +9329,8 @@
     }
     if (_json.containsKey('exclusions')) {
       exclusions = (_json['exclusions'] as core.List)
-          .map<LogExclusion>((value) => LogExclusion.fromJson(value))
+          .map<LogExclusion>((value) => LogExclusion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('filter')) {
@@ -9294,14 +9571,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
       launchStage = _json['launchStage'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = MetricDescriptorMetadata.fromJson(_json['metadata']);
+      metadata = MetricDescriptorMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricKind')) {
       metricKind = _json['metricKind'] as core.String;
@@ -9467,7 +9746,8 @@
   MonitoredResource.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('type')) {
@@ -9585,7 +9865,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
@@ -9648,12 +9929,14 @@
   MonitoredResourceMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('systemLabels')) {
       systemLabels = commons.mapMap<core.Object, core.Object>(
-          _json['systemLabels'].cast<core.String, core.Object>(),
+          (_json['systemLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('userLabels')) {
       userLabels = commons.mapMap<core.String, core.String>(
-          _json['userLabels'].cast<core.String, core.String>(),
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -9830,7 +10113,8 @@
     }
     if (_json.containsKey('line')) {
       line = (_json['line'] as core.List)
-          .map<LogLine>((value) => LogLine.fromJson(value))
+          .map<LogLine>((value) =>
+              LogLine.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('megaCycles')) {
@@ -9862,7 +10146,8 @@
     }
     if (_json.containsKey('sourceReference')) {
       sourceReference = (_json['sourceReference'] as core.List)
-          .map<SourceReference>((value) => SourceReference.fromJson(value))
+          .map<SourceReference>((value) => SourceReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startTime')) {
@@ -10165,12 +10450,14 @@
     }
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<LogEntry>((value) => LogEntry.fromJson(value))
+          .map<LogEntry>((value) =>
+              LogEntry.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('logName')) {
@@ -10180,7 +10467,8 @@
       partialSuccess = _json['partialSuccess'] as core.bool;
     }
     if (_json.containsKey('resource')) {
-      resource = MonitoredResource.fromJson(_json['resource']);
+      resource = MonitoredResource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/managedidentities/v1.dart b/generated/googleapis/lib/managedidentities/v1.dart
index f7fd2a9..66452c3 100644
--- a/generated/googleapis/lib/managedidentities/v1.dart
+++ b/generated/googleapis/lib/managedidentities/v1.dart
@@ -113,7 +113,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -190,7 +192,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -267,7 +272,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a Microsoft AD domain.
@@ -337,7 +344,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a domain.
@@ -387,7 +396,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes an AD trust.
@@ -445,7 +456,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a domain.
@@ -495,7 +508,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Domain.fromJson(data));
+    return _response.then(
+      (data) => Domain.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -563,7 +578,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists domains in a project.
@@ -646,7 +663,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDomainsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDomainsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the metadata and configuration of a domain.
@@ -711,7 +731,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the DNS conditional forwarder.
@@ -770,7 +792,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resets a domain's administrator password.
@@ -828,7 +852,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResetAdminPasswordResponse.fromJson(data));
+    return _response.then(
+      (data) => ResetAdminPasswordResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -889,7 +916,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -952,7 +981,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Validates a trust state, that the target domain is reachable, and that the
@@ -1012,7 +1044,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1083,7 +1117,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -1136,7 +1172,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1188,7 +1226,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1263,7 +1303,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1276,7 +1319,8 @@
 
   AttachTrustRequest.fromJson(core.Map _json) {
     if (_json.containsKey('trust')) {
-      trust = Trust.fromJson(_json['trust']);
+      trust =
+          Trust.fromJson(_json['trust'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1346,7 +1390,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1399,7 +1444,8 @@
 
   DetachTrustRequest.fromJson(core.Map _json) {
     if (_json.containsKey('trust')) {
-      trust = Trust.fromJson(_json['trust']);
+      trust =
+          Trust.fromJson(_json['trust'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1492,7 +1538,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locations')) {
@@ -1514,7 +1561,8 @@
     }
     if (_json.containsKey('trusts')) {
       trusts = (_json['trusts'] as core.List)
-          .map<Trust>((value) => Trust.fromJson(value))
+          .map<Trust>((value) =>
+              Trust.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('updateTime')) {
@@ -1952,33 +2000,39 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('maintenancePolicyNames')) {
       maintenancePolicyNames = commons.mapMap<core.String, core.String>(
-          _json['maintenancePolicyNames'].cast<core.String, core.String>(),
+          (_json['maintenancePolicyNames']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('maintenanceSchedules')) {
       maintenanceSchedules = commons.mapMap<core.Map,
               GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule>(
-          _json['maintenanceSchedules'].cast<core.String, core.Map>(),
+          (_json['maintenanceSchedules'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
           (core.Map item) =>
               GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
-                  .fromJson(item));
+                  .fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('maintenanceSettings')) {
       maintenanceSettings =
           GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings
-              .fromJson(_json['maintenanceSettings']);
+              .fromJson(_json['maintenanceSettings']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('producerMetadata')) {
       producerMetadata = commons.mapMap<core.String, core.String>(
-          _json['producerMetadata'].cast<core.String, core.String>(),
+          (_json['producerMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('provisionedResources')) {
@@ -1986,7 +2040,7 @@
           .map<GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('slmInstanceTemplate')) {
@@ -1995,11 +2049,12 @@
     if (_json.containsKey('sloMetadata')) {
       sloMetadata =
           GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata.fromJson(
-              _json['sloMetadata']);
+              _json['sloMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareVersions')) {
       softwareVersions = commons.mapMap<core.String, core.String>(
-          _json['softwareVersions'].cast<core.String, core.String>(),
+          (_json['softwareVersions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('state')) {
@@ -2180,7 +2235,7 @@
           .map<GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('location')) {
@@ -2379,14 +2434,15 @@
     if (_json.containsKey('eligibility')) {
       eligibility =
           GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
-              .fromJson(_json['eligibility']);
+              .fromJson(
+                  _json['eligibility'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exclusions')) {
       exclusions = (_json['exclusions'] as core.List)
           .map<GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nodes')) {
@@ -2394,7 +2450,7 @@
           .map<GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata>(
               (value) =>
                   GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tier')) {
@@ -2437,7 +2493,8 @@
   ListDomainsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('domains')) {
       domains = (_json['domains'] as core.List)
-          .map<Domain>((value) => Domain.fromJson(value))
+          .map<Domain>((value) =>
+              Domain.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2478,7 +2535,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2514,7 +2572,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2563,7 +2622,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -2571,7 +2631,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2644,11 +2705,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2656,7 +2719,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2838,7 +2902,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -2947,7 +3012,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2992,7 +3058,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3217,7 +3284,8 @@
 
   ValidateTrustRequest.fromJson(core.Map _json) {
     if (_json.containsKey('trust')) {
-      trust = Trust.fromJson(_json['trust']);
+      trust =
+          Trust.fromJson(_json['trust'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/manufacturers/v1.dart b/generated/googleapis/lib/manufacturers/v1.dart
index 131a6b3..18ea7e7 100644
--- a/generated/googleapis/lib/manufacturers/v1.dart
+++ b/generated/googleapis/lib/manufacturers/v1.dart
@@ -125,7 +125,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the product from a Manufacturer Center account, including product
@@ -202,7 +204,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the products in a Manufacturer Center account.
@@ -273,7 +277,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListProductsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListProductsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts or updates the attributes of the product in a Manufacturer Center
@@ -356,7 +363,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -511,7 +520,8 @@
   Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('additionalImageLink')) {
       additionalImageLink = (_json['additionalImageLink'] as core.List)
-          .map<Image>((value) => Image.fromJson(value))
+          .map<Image>((value) =>
+              Image.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('ageGroup')) {
@@ -521,13 +531,15 @@
       brand = _json['brand'] as core.String;
     }
     if (_json.containsKey('capacity')) {
-      capacity = Capacity.fromJson(_json['capacity']);
+      capacity = Capacity.fromJson(
+          _json['capacity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('color')) {
       color = _json['color'] as core.String;
     }
     if (_json.containsKey('count')) {
-      count = Count.fromJson(_json['count']);
+      count =
+          Count.fromJson(_json['count'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -542,8 +554,8 @@
     }
     if (_json.containsKey('featureDescription')) {
       featureDescription = (_json['featureDescription'] as core.List)
-          .map<FeatureDescription>(
-              (value) => FeatureDescription.fromJson(value))
+          .map<FeatureDescription>((value) => FeatureDescription.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('flavor')) {
@@ -561,7 +573,8 @@
           .toList();
     }
     if (_json.containsKey('imageLink')) {
-      imageLink = Image.fromJson(_json['imageLink']);
+      imageLink = Image.fromJson(
+          _json['imageLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('includedDestination')) {
       includedDestination = (_json['includedDestination'] as core.List)
@@ -582,7 +595,8 @@
     }
     if (_json.containsKey('productDetail')) {
       productDetail = (_json['productDetail'] as core.List)
-          .map<ProductDetail>((value) => ProductDetail.fromJson(value))
+          .map<ProductDetail>((value) => ProductDetail.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productLine')) {
@@ -620,7 +634,8 @@
       sizeType = _json['sizeType'] as core.String;
     }
     if (_json.containsKey('suggestedRetailPrice')) {
-      suggestedRetailPrice = Price.fromJson(_json['suggestedRetailPrice']);
+      suggestedRetailPrice = Price.fromJson(
+          _json['suggestedRetailPrice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetClientId')) {
       targetClientId = _json['targetClientId'] as core.String;
@@ -892,7 +907,8 @@
       headline = _json['headline'] as core.String;
     }
     if (_json.containsKey('image')) {
-      image = Image.fromJson(_json['image']);
+      image =
+          Image.fromJson(_json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -1099,7 +1115,8 @@
     }
     if (_json.containsKey('products')) {
       products = (_json['products'] as core.List)
-          .map<Product>((value) => Product.fromJson(value))
+          .map<Product>((value) =>
+              Product.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1187,19 +1204,22 @@
 
   Product.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = Attributes.fromJson(_json['attributes']);
+      attributes = Attributes.fromJson(
+          _json['attributes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentLanguage')) {
       contentLanguage = _json['contentLanguage'] as core.String;
     }
     if (_json.containsKey('destinationStatuses')) {
       destinationStatuses = (_json['destinationStatuses'] as core.List)
-          .map<DestinationStatus>((value) => DestinationStatus.fromJson(value))
+          .map<DestinationStatus>((value) => DestinationStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('issues')) {
       issues = (_json['issues'] as core.List)
-          .map<Issue>((value) => Issue.fromJson(value))
+          .map<Issue>((value) =>
+              Issue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
diff --git a/generated/googleapis/lib/ml/v1.dart b/generated/googleapis/lib/ml/v1.dart
index 27ade3c..7c76dd1 100644
--- a/generated/googleapis/lib/ml/v1.dart
+++ b/generated/googleapis/lib/ml/v1.dart
@@ -118,7 +118,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the service account information associated with your project. You need
@@ -171,8 +174,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudMlV1GetConfigResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1GetConfigResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Performs online prediction on the data in the request. {% dynamic include
@@ -230,7 +235,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleApiHttpBody.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiHttpBody.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -291,7 +299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a training or a batch prediction job.
@@ -346,7 +357,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Job.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Job.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Describes a job.
@@ -395,7 +409,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Job.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Job.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -463,7 +480,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleIamV1Policy.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1Policy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the jobs in the project. If there are no jobs that match the request
@@ -542,8 +562,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudMlV1ListJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1ListJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a specific job resource. Currently the only supported fields to
@@ -614,7 +636,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Job.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Job.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -675,7 +700,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleIamV1Policy.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1Policy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -738,8 +766,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleIamV1TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -801,7 +831,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Location.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Location.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all locations that provides at least one type of CMLE capability.
@@ -870,8 +903,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudMlV1ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -936,7 +971,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -988,7 +1026,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1062,7 +1103,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Study.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Study.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a study.
@@ -1111,7 +1155,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a study.
@@ -1160,7 +1207,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Study.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Study.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the studies in a region for an associated project.
@@ -1211,8 +1261,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudMlV1ListStudiesResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1ListStudiesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1278,7 +1330,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Trial.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Trial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Checks whether a trial should stop or not. Returns a long-running
@@ -1338,7 +1393,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks a trial as complete.
@@ -1394,7 +1452,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Trial.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Trial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds a user provided trial to a study.
@@ -1449,7 +1510,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Trial.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Trial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a trial.
@@ -1499,7 +1563,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a trial.
@@ -1549,7 +1616,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Trial.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Trial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the trials associated with a study.
@@ -1598,8 +1668,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudMlV1ListTrialsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1ListTrialsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stops a trial.
@@ -1655,7 +1727,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Trial.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Trial.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds one or more trials to a study, with parameter values suggested by AI
@@ -1715,7 +1790,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1781,7 +1859,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Model.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Model.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a model. You can only delete a model if there are no versions in
@@ -1831,7 +1912,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a model, including its name, the description (if
@@ -1882,7 +1966,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Model.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Model.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -1950,7 +2037,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleIamV1Policy.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1Policy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the models in a project. Each project can contain multiple models,
@@ -2026,8 +2116,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudMlV1ListModelsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1ListModelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a specific model resource. Currently the only supported fields to
@@ -2095,7 +2187,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -2156,7 +2251,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleIamV1Policy.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1Policy.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -2219,8 +2317,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleIamV1TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleIamV1TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2289,7 +2389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a model version. Each model can have multiple versions deployed
@@ -2342,7 +2445,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a model version. Models can have multiple versions.
@@ -2393,7 +2499,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Version.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Version.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets basic information about all the versions of a model. If you expect
@@ -2470,8 +2579,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudMlV1ListVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1ListVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified Version resource. Currently the only update-able
@@ -2542,7 +2653,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Designates a version to be the default for the model. The default version
@@ -2604,7 +2718,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleCloudMlV1Version.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudMlV1Version.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2668,7 +2785,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -2719,7 +2839,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -2795,8 +2918,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleLongrunningListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2851,7 +2976,8 @@
       extensions = (_json['extensions'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3276,28 +3402,31 @@
     if (_json.containsKey('categoricalValueSpec')) {
       categoricalValueSpec =
           GoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec.fromJson(
-              _json['categoricalValueSpec']);
+              _json['categoricalValueSpec']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('childParameterSpecs')) {
       childParameterSpecs = (_json['childParameterSpecs'] as core.List)
           .map<GoogleCloudMlV1StudyConfigParameterSpec>((value) =>
-              GoogleCloudMlV1StudyConfigParameterSpec.fromJson(value))
+              GoogleCloudMlV1StudyConfigParameterSpec.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('discreteValueSpec')) {
       discreteValueSpec =
           GoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec.fromJson(
-              _json['discreteValueSpec']);
+              _json['discreteValueSpec']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doubleValueSpec')) {
       doubleValueSpec =
           GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec.fromJson(
-              _json['doubleValueSpec']);
+              _json['doubleValueSpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('integerValueSpec')) {
       integerValueSpec =
           GoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec.fromJson(
-              _json['integerValueSpec']);
+              _json['integerValueSpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameter')) {
       parameter = _json['parameter'] as core.String;
@@ -3305,17 +3434,20 @@
     if (_json.containsKey('parentCategoricalValues')) {
       parentCategoricalValues =
           GoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec
-              .fromJson(_json['parentCategoricalValues']);
+              .fromJson(_json['parentCategoricalValues']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parentDiscreteValues')) {
       parentDiscreteValues =
           GoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec
-              .fromJson(_json['parentDiscreteValues']);
+              .fromJson(_json['parentDiscreteValues']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parentIntValues')) {
       parentIntValues =
           GoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec
-              .fromJson(_json['parentIntValues']);
+              .fromJson(_json['parentIntValues']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scaleType')) {
       scaleType = _json['scaleType'] as core.String;
@@ -3469,7 +3601,8 @@
 
   GoogleCloudMlV1AddTrialMeasurementRequest.fromJson(core.Map _json) {
     if (_json.containsKey('measurement')) {
-      measurement = GoogleCloudMlV1Measurement.fromJson(_json['measurement']);
+      measurement = GoogleCloudMlV1Measurement.fromJson(
+          _json['measurement'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3543,12 +3676,14 @@
     if (_json.containsKey('decayCurveStoppingConfig')) {
       decayCurveStoppingConfig =
           GoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig
-              .fromJson(_json['decayCurveStoppingConfig']);
+              .fromJson(_json['decayCurveStoppingConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('medianAutomatedStoppingConfig')) {
       medianAutomatedStoppingConfig =
           GoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig
-              .fromJson(_json['medianAutomatedStoppingConfig']);
+              .fromJson(_json['medianAutomatedStoppingConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3785,8 +3920,8 @@
 
   GoogleCloudMlV1CompleteTrialRequest.fromJson(core.Map _json) {
     if (_json.containsKey('finalMeasurement')) {
-      finalMeasurement =
-          GoogleCloudMlV1Measurement.fromJson(_json['finalMeasurement']);
+      finalMeasurement = GoogleCloudMlV1Measurement.fromJson(
+          _json['finalMeasurement'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('infeasibleReason')) {
       infeasibleReason = _json['infeasibleReason'] as core.String;
@@ -3909,8 +4044,8 @@
     }
     if (_json.containsKey('env')) {
       env = (_json['env'] as core.List)
-          .map<GoogleCloudMlV1EnvVar>(
-              (value) => GoogleCloudMlV1EnvVar.fromJson(value))
+          .map<GoogleCloudMlV1EnvVar>((value) => GoogleCloudMlV1EnvVar.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('image')) {
@@ -3918,8 +4053,9 @@
     }
     if (_json.containsKey('ports')) {
       ports = (_json['ports'] as core.List)
-          .map<GoogleCloudMlV1ContainerPort>(
-              (value) => GoogleCloudMlV1ContainerPort.fromJson(value))
+          .map<GoogleCloudMlV1ContainerPort>((value) =>
+              GoogleCloudMlV1ContainerPort.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4016,7 +4152,8 @@
 
   GoogleCloudMlV1ExplainRequest.fromJson(core.Map _json) {
     if (_json.containsKey('httpBody')) {
-      httpBody = GoogleApiHttpBody.fromJson(_json['httpBody']);
+      httpBody = GoogleApiHttpBody.fromJson(
+          _json['httpBody'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4056,16 +4193,18 @@
     if (_json.containsKey('integratedGradientsAttribution')) {
       integratedGradientsAttribution =
           GoogleCloudMlV1IntegratedGradientsAttribution.fromJson(
-              _json['integratedGradientsAttribution']);
+              _json['integratedGradientsAttribution']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sampledShapleyAttribution')) {
       sampledShapleyAttribution =
           GoogleCloudMlV1SampledShapleyAttribution.fromJson(
-              _json['sampledShapleyAttribution']);
+              _json['sampledShapleyAttribution']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('xraiAttribution')) {
-      xraiAttribution =
-          GoogleCloudMlV1XraiAttribution.fromJson(_json['xraiAttribution']);
+      xraiAttribution = GoogleCloudMlV1XraiAttribution.fromJson(
+          _json['xraiAttribution'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4099,7 +4238,8 @@
 
   GoogleCloudMlV1GetConfigResponse.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = GoogleCloudMlV1Config.fromJson(_json['config']);
+      config = GoogleCloudMlV1Config.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceAccount')) {
       serviceAccount = _json['serviceAccount'] as core.String;
@@ -4178,12 +4318,13 @@
       allMetrics = (_json['allMetrics'] as core.List)
           .map<GoogleCloudMlV1HyperparameterOutputHyperparameterMetric>(
               (value) => GoogleCloudMlV1HyperparameterOutputHyperparameterMetric
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('builtInAlgorithmOutput')) {
       builtInAlgorithmOutput = GoogleCloudMlV1BuiltInAlgorithmOutput.fromJson(
-          _json['builtInAlgorithmOutput']);
+          _json['builtInAlgorithmOutput']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -4191,11 +4332,12 @@
     if (_json.containsKey('finalMetric')) {
       finalMetric =
           GoogleCloudMlV1HyperparameterOutputHyperparameterMetric.fromJson(
-              _json['finalMetric']);
+              _json['finalMetric'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hyperparameters')) {
       hyperparameters = commons.mapMap<core.String, core.String>(
-          _json['hyperparameters'].cast<core.String, core.String>(),
+          (_json['hyperparameters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('isTrialStoppedEarly')) {
@@ -4332,8 +4474,9 @@
     }
     if (_json.containsKey('params')) {
       params = (_json['params'] as core.List)
-          .map<GoogleCloudMlV1ParameterSpec>(
-              (value) => GoogleCloudMlV1ParameterSpec.fromJson(value))
+          .map<GoogleCloudMlV1ParameterSpec>((value) =>
+              GoogleCloudMlV1ParameterSpec.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resumePreviousJobId')) {
@@ -4486,16 +4629,17 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('predictionInput')) {
-      predictionInput =
-          GoogleCloudMlV1PredictionInput.fromJson(_json['predictionInput']);
+      predictionInput = GoogleCloudMlV1PredictionInput.fromJson(
+          _json['predictionInput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('predictionOutput')) {
-      predictionOutput =
-          GoogleCloudMlV1PredictionOutput.fromJson(_json['predictionOutput']);
+      predictionOutput = GoogleCloudMlV1PredictionOutput.fromJson(
+          _json['predictionOutput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -4504,12 +4648,12 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('trainingInput')) {
-      trainingInput =
-          GoogleCloudMlV1TrainingInput.fromJson(_json['trainingInput']);
+      trainingInput = GoogleCloudMlV1TrainingInput.fromJson(
+          _json['trainingInput'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trainingOutput')) {
-      trainingOutput =
-          GoogleCloudMlV1TrainingOutput.fromJson(_json['trainingOutput']);
+      trainingOutput = GoogleCloudMlV1TrainingOutput.fromJson(
+          _json['trainingOutput'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4569,8 +4713,8 @@
   GoogleCloudMlV1ListJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<GoogleCloudMlV1Job>(
-              (value) => GoogleCloudMlV1Job.fromJson(value))
+          .map<GoogleCloudMlV1Job>((value) => GoogleCloudMlV1Job.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4603,8 +4747,9 @@
   GoogleCloudMlV1ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<GoogleCloudMlV1Location>(
-              (value) => GoogleCloudMlV1Location.fromJson(value))
+          .map<GoogleCloudMlV1Location>((value) =>
+              GoogleCloudMlV1Location.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4638,8 +4783,8 @@
   GoogleCloudMlV1ListModelsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('models')) {
       models = (_json['models'] as core.List)
-          .map<GoogleCloudMlV1Model>(
-              (value) => GoogleCloudMlV1Model.fromJson(value))
+          .map<GoogleCloudMlV1Model>((value) => GoogleCloudMlV1Model.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4668,8 +4813,8 @@
   GoogleCloudMlV1ListStudiesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('studies')) {
       studies = (_json['studies'] as core.List)
-          .map<GoogleCloudMlV1Study>(
-              (value) => GoogleCloudMlV1Study.fromJson(value))
+          .map<GoogleCloudMlV1Study>((value) => GoogleCloudMlV1Study.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4693,8 +4838,8 @@
   GoogleCloudMlV1ListTrialsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('trials')) {
       trials = (_json['trials'] as core.List)
-          .map<GoogleCloudMlV1Trial>(
-              (value) => GoogleCloudMlV1Trial.fromJson(value))
+          .map<GoogleCloudMlV1Trial>((value) => GoogleCloudMlV1Trial.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4725,8 +4870,9 @@
     }
     if (_json.containsKey('versions')) {
       versions = (_json['versions'] as core.List)
-          .map<GoogleCloudMlV1Version>(
-              (value) => GoogleCloudMlV1Version.fromJson(value))
+          .map<GoogleCloudMlV1Version>((value) =>
+              GoogleCloudMlV1Version.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4753,8 +4899,9 @@
   GoogleCloudMlV1Location.fromJson(core.Map _json) {
     if (_json.containsKey('capabilities')) {
       capabilities = (_json['capabilities'] as core.List)
-          .map<GoogleCloudMlV1Capability>(
-              (value) => GoogleCloudMlV1Capability.fromJson(value))
+          .map<GoogleCloudMlV1Capability>((value) =>
+              GoogleCloudMlV1Capability.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -4821,8 +4968,9 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<GoogleCloudMlV1MeasurementMetric>(
-              (value) => GoogleCloudMlV1MeasurementMetric.fromJson(value))
+          .map<GoogleCloudMlV1MeasurementMetric>((value) =>
+              GoogleCloudMlV1MeasurementMetric.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('stepCount')) {
@@ -4913,7 +5061,8 @@
 
   GoogleCloudMlV1Model.fromJson(core.Map _json) {
     if (_json.containsKey('defaultVersion')) {
-      defaultVersion = GoogleCloudMlV1Version.fromJson(_json['defaultVersion']);
+      defaultVersion = GoogleCloudMlV1Version.fromJson(
+          _json['defaultVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -4923,7 +5072,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -5025,7 +5175,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('modelName')) {
@@ -5041,7 +5192,8 @@
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('version')) {
-      version = GoogleCloudMlV1Version.fromJson(_json['version']);
+      version = GoogleCloudMlV1Version.fromJson(
+          _json['version'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5196,7 +5348,8 @@
 
   GoogleCloudMlV1PredictRequest.fromJson(core.Map _json) {
     if (_json.containsKey('httpBody')) {
-      httpBody = GoogleApiHttpBody.fromJson(_json['httpBody']);
+      httpBody = GoogleApiHttpBody.fromJson(
+          _json['httpBody'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5478,8 +5631,8 @@
 
   GoogleCloudMlV1ReplicaConfig.fromJson(core.Map _json) {
     if (_json.containsKey('acceleratorConfig')) {
-      acceleratorConfig =
-          GoogleCloudMlV1AcceleratorConfig.fromJson(_json['acceleratorConfig']);
+      acceleratorConfig = GoogleCloudMlV1AcceleratorConfig.fromJson(
+          _json['acceleratorConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('containerArgs')) {
       containerArgs = (_json['containerArgs'] as core.List)
@@ -5755,7 +5908,8 @@
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('studyConfig')) {
-      studyConfig = GoogleCloudMlV1StudyConfig.fromJson(_json['studyConfig']);
+      studyConfig = GoogleCloudMlV1StudyConfig.fromJson(
+          _json['studyConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5810,18 +5964,21 @@
     }
     if (_json.containsKey('automatedStoppingConfig')) {
       automatedStoppingConfig = GoogleCloudMlV1AutomatedStoppingConfig.fromJson(
-          _json['automatedStoppingConfig']);
+          _json['automatedStoppingConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<GoogleCloudMlV1StudyConfigMetricSpec>(
-              (value) => GoogleCloudMlV1StudyConfigMetricSpec.fromJson(value))
+          .map<GoogleCloudMlV1StudyConfigMetricSpec>((value) =>
+              GoogleCloudMlV1StudyConfigMetricSpec.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
           .map<GoogleCloudMlV1StudyConfigParameterSpec>((value) =>
-              GoogleCloudMlV1StudyConfigParameterSpec.fromJson(value))
+              GoogleCloudMlV1StudyConfigParameterSpec.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5963,8 +6120,8 @@
     }
     if (_json.containsKey('trials')) {
       trials = (_json['trials'] as core.List)
-          .map<GoogleCloudMlV1Trial>(
-              (value) => GoogleCloudMlV1Trial.fromJson(value))
+          .map<GoogleCloudMlV1Trial>((value) => GoogleCloudMlV1Trial.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6235,12 +6392,12 @@
           .toList();
     }
     if (_json.containsKey('encryptionConfig')) {
-      encryptionConfig =
-          GoogleCloudMlV1EncryptionConfig.fromJson(_json['encryptionConfig']);
+      encryptionConfig = GoogleCloudMlV1EncryptionConfig.fromJson(
+          _json['encryptionConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('evaluatorConfig')) {
-      evaluatorConfig =
-          GoogleCloudMlV1ReplicaConfig.fromJson(_json['evaluatorConfig']);
+      evaluatorConfig = GoogleCloudMlV1ReplicaConfig.fromJson(
+          _json['evaluatorConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('evaluatorCount')) {
       evaluatorCount = _json['evaluatorCount'] as core.String;
@@ -6249,15 +6406,15 @@
       evaluatorType = _json['evaluatorType'] as core.String;
     }
     if (_json.containsKey('hyperparameters')) {
-      hyperparameters =
-          GoogleCloudMlV1HyperparameterSpec.fromJson(_json['hyperparameters']);
+      hyperparameters = GoogleCloudMlV1HyperparameterSpec.fromJson(
+          _json['hyperparameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('jobDir')) {
       jobDir = _json['jobDir'] as core.String;
     }
     if (_json.containsKey('masterConfig')) {
-      masterConfig =
-          GoogleCloudMlV1ReplicaConfig.fromJson(_json['masterConfig']);
+      masterConfig = GoogleCloudMlV1ReplicaConfig.fromJson(
+          _json['masterConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('masterType')) {
       masterType = _json['masterType'] as core.String;
@@ -6271,8 +6428,9 @@
           .toList();
     }
     if (_json.containsKey('parameterServerConfig')) {
-      parameterServerConfig =
-          GoogleCloudMlV1ReplicaConfig.fromJson(_json['parameterServerConfig']);
+      parameterServerConfig = GoogleCloudMlV1ReplicaConfig.fromJson(
+          _json['parameterServerConfig']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameterServerCount')) {
       parameterServerCount = _json['parameterServerCount'] as core.String;
@@ -6296,7 +6454,8 @@
       scaleTier = _json['scaleTier'] as core.String;
     }
     if (_json.containsKey('scheduling')) {
-      scheduling = GoogleCloudMlV1Scheduling.fromJson(_json['scheduling']);
+      scheduling = GoogleCloudMlV1Scheduling.fromJson(
+          _json['scheduling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceAccount')) {
       serviceAccount = _json['serviceAccount'] as core.String;
@@ -6305,8 +6464,8 @@
       useChiefInTfConfig = _json['useChiefInTfConfig'] as core.bool;
     }
     if (_json.containsKey('workerConfig')) {
-      workerConfig =
-          GoogleCloudMlV1ReplicaConfig.fromJson(_json['workerConfig']);
+      workerConfig = GoogleCloudMlV1ReplicaConfig.fromJson(
+          _json['workerConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workerCount')) {
       workerCount = _json['workerCount'] as core.String;
@@ -6431,7 +6590,8 @@
   GoogleCloudMlV1TrainingOutput.fromJson(core.Map _json) {
     if (_json.containsKey('builtInAlgorithmOutput')) {
       builtInAlgorithmOutput = GoogleCloudMlV1BuiltInAlgorithmOutput.fromJson(
-          _json['builtInAlgorithmOutput']);
+          _json['builtInAlgorithmOutput']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('completedTrialCount')) {
       completedTrialCount = _json['completedTrialCount'] as core.String;
@@ -6451,8 +6611,9 @@
     }
     if (_json.containsKey('trials')) {
       trials = (_json['trials'] as core.List)
-          .map<GoogleCloudMlV1HyperparameterOutput>(
-              (value) => GoogleCloudMlV1HyperparameterOutput.fromJson(value))
+          .map<GoogleCloudMlV1HyperparameterOutput>((value) =>
+              GoogleCloudMlV1HyperparameterOutput.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6540,16 +6701,17 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('finalMeasurement')) {
-      finalMeasurement =
-          GoogleCloudMlV1Measurement.fromJson(_json['finalMeasurement']);
+      finalMeasurement = GoogleCloudMlV1Measurement.fromJson(
+          _json['finalMeasurement'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('infeasibleReason')) {
       infeasibleReason = _json['infeasibleReason'] as core.String;
     }
     if (_json.containsKey('measurements')) {
       measurements = (_json['measurements'] as core.List)
-          .map<GoogleCloudMlV1Measurement>(
-              (value) => GoogleCloudMlV1Measurement.fromJson(value))
+          .map<GoogleCloudMlV1Measurement>((value) =>
+              GoogleCloudMlV1Measurement.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -6557,8 +6719,9 @@
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<GoogleCloudMlV1TrialParameter>(
-              (value) => GoogleCloudMlV1TrialParameter.fromJson(value))
+          .map<GoogleCloudMlV1TrialParameter>((value) =>
+              GoogleCloudMlV1TrialParameter.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startTime')) {
@@ -6812,14 +6975,16 @@
 
   GoogleCloudMlV1Version.fromJson(core.Map _json) {
     if (_json.containsKey('acceleratorConfig')) {
-      acceleratorConfig =
-          GoogleCloudMlV1AcceleratorConfig.fromJson(_json['acceleratorConfig']);
+      acceleratorConfig = GoogleCloudMlV1AcceleratorConfig.fromJson(
+          _json['acceleratorConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('autoScaling')) {
-      autoScaling = GoogleCloudMlV1AutoScaling.fromJson(_json['autoScaling']);
+      autoScaling = GoogleCloudMlV1AutoScaling.fromJson(
+          _json['autoScaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('container')) {
-      container = GoogleCloudMlV1ContainerSpec.fromJson(_json['container']);
+      container = GoogleCloudMlV1ContainerSpec.fromJson(
+          _json['container'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
@@ -6837,8 +7002,8 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('explanationConfig')) {
-      explanationConfig =
-          GoogleCloudMlV1ExplanationConfig.fromJson(_json['explanationConfig']);
+      explanationConfig = GoogleCloudMlV1ExplanationConfig.fromJson(
+          _json['explanationConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('framework')) {
       framework = _json['framework'] as core.String;
@@ -6848,7 +7013,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lastUseTime')) {
@@ -6858,8 +7024,8 @@
       machineType = _json['machineType'] as core.String;
     }
     if (_json.containsKey('manualScaling')) {
-      manualScaling =
-          GoogleCloudMlV1ManualScaling.fromJson(_json['manualScaling']);
+      manualScaling = GoogleCloudMlV1ManualScaling.fromJson(
+          _json['manualScaling'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -6877,10 +7043,11 @@
     }
     if (_json.containsKey('requestLoggingConfig')) {
       requestLoggingConfig = GoogleCloudMlV1RequestLoggingConfig.fromJson(
-          _json['requestLoggingConfig']);
+          _json['requestLoggingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('routes')) {
-      routes = GoogleCloudMlV1RouteMap.fromJson(_json['routes']);
+      routes = GoogleCloudMlV1RouteMap.fromJson(
+          _json['routes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('runtimeVersion')) {
       runtimeVersion = _json['runtimeVersion'] as core.String;
@@ -7028,8 +7195,9 @@
   GoogleIamV1AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<GoogleIamV1AuditLogConfig>(
-              (value) => GoogleIamV1AuditLogConfig.fromJson(value))
+          .map<GoogleIamV1AuditLogConfig>((value) =>
+              GoogleIamV1AuditLogConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -7150,7 +7318,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = GoogleTypeExpr.fromJson(_json['condition']);
+      condition = GoogleTypeExpr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -7259,14 +7428,15 @@
   GoogleIamV1Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<GoogleIamV1AuditConfig>(
-              (value) => GoogleIamV1AuditConfig.fromJson(value))
+          .map<GoogleIamV1AuditConfig>((value) =>
+              GoogleIamV1AuditConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<GoogleIamV1Binding>(
-              (value) => GoogleIamV1Binding.fromJson(value))
+          .map<GoogleIamV1Binding>((value) => GoogleIamV1Binding.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -7313,7 +7483,8 @@
 
   GoogleIamV1SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = GoogleIamV1Policy.fromJson(_json['policy']);
+      policy = GoogleIamV1Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -7400,8 +7571,9 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleLongrunningOperation>(
-              (value) => GoogleLongrunningOperation.fromJson(value))
+          .map<GoogleLongrunningOperation>((value) =>
+              GoogleLongrunningOperation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7462,11 +7634,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -7474,7 +7648,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -7550,7 +7725,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/monitoring/v3.dart b/generated/googleapis/lib/monitoring/v3.dart
index 2830e6a..2c3f38d 100644
--- a/generated/googleapis/lib/monitoring/v3.dart
+++ b/generated/googleapis/lib/monitoring/v3.dart
@@ -160,7 +160,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AlertPolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          AlertPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an alerting policy.
@@ -211,7 +214,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single alerting policy.
@@ -261,7 +266,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AlertPolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          AlertPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the existing alerting policies for the workspace.
@@ -350,7 +358,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAlertPoliciesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAlertPoliciesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an alerting policy. You can either replace the entire policy with
@@ -434,7 +445,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AlertPolicy.fromJson(data));
+    return _response.then(
+      (data) =>
+          AlertPolicy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -501,8 +515,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CreateCollectdTimeSeriesResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateCollectdTimeSeriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -574,7 +590,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an existing group.
@@ -632,7 +650,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single group.
@@ -682,7 +702,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the existing groups.
@@ -777,7 +799,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing group. You can change any group attributes except
@@ -844,7 +869,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -942,7 +969,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGroupMembersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGroupMembersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1008,7 +1038,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MetricDescriptor.fromJson(data));
+    return _response.then(
+      (data) => MetricDescriptor.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a metric descriptor. Only user-created custom metrics
@@ -1061,7 +1094,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single metric descriptor. This method does not require a Workspace.
@@ -1114,7 +1149,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MetricDescriptor.fromJson(data));
+    return _response.then(
+      (data) => MetricDescriptor.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists metric descriptors that match a filter. This method does not require
@@ -1195,8 +1233,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListMetricDescriptorsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListMetricDescriptorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1257,7 +1297,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MonitoredResourceDescriptor.fromJson(data));
+    return _response.then(
+      (data) => MonitoredResourceDescriptor.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists monitored resource descriptors that match a filter. This method does
@@ -1338,7 +1381,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListMonitoredResourceDescriptorsResponse.fromJson(data));
+      (data) => ListMonitoredResourceDescriptorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1398,8 +1443,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => NotificationChannelDescriptor.fromJson(data));
+    return _response.then(
+      (data) => NotificationChannelDescriptor.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the descriptors for supported channel types. The use of descriptors
@@ -1472,7 +1519,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => ListNotificationChannelDescriptorsResponse.fromJson(data));
+      (data) => ListNotificationChannelDescriptorsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1542,7 +1591,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationChannel.fromJson(data));
+    return _response.then(
+      (data) => NotificationChannel.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a notification channel.
@@ -1602,7 +1654,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single notification channel. The channel includes the relevant
@@ -1657,7 +1711,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationChannel.fromJson(data));
+    return _response.then(
+      (data) => NotificationChannel.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Requests a verification code for an already verified channel that can then
@@ -1736,8 +1793,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GetNotificationChannelVerificationCodeResponse.fromJson(data));
+    return _response.then(
+      (data) => GetNotificationChannelVerificationCodeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the notification channels that have been created for the project.
@@ -1827,8 +1886,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListNotificationChannelsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListNotificationChannelsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a notification channel. Fields not specified in the field mask
@@ -1892,7 +1953,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationChannel.fromJson(data));
+    return _response.then(
+      (data) => NotificationChannel.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Causes a verification code to be delivered to the channel. The code can
@@ -1951,7 +2015,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Verifies a NotificationChannel by proving receipt of the code delivered to
@@ -2008,7 +2074,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationChannel.fromJson(data));
+    return _response.then(
+      (data) => NotificationChannel.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2075,7 +2144,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists time series that match a filter. This method does not require a
@@ -2416,7 +2487,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTimeSeriesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTimeSeriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Queries time series using Monitoring Query Language. This method does not
@@ -2475,7 +2549,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => QueryTimeSeriesResponse.fromJson(data));
+    return _response.then(
+      (data) => QueryTimeSeriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2540,7 +2617,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UptimeCheckConfig.fromJson(data));
+    return _response.then(
+      (data) => UptimeCheckConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an Uptime check configuration. Note that this method will fail if
@@ -2592,7 +2672,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a single Uptime check configuration.
@@ -2642,7 +2724,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UptimeCheckConfig.fromJson(data));
+    return _response.then(
+      (data) => UptimeCheckConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the existing valid Uptime check configurations for the project
@@ -2713,8 +2798,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListUptimeCheckConfigsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUptimeCheckConfigsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an Uptime check configuration. You can either replace the entire
@@ -2786,7 +2873,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UptimeCheckConfig.fromJson(data));
+    return _response.then(
+      (data) => UptimeCheckConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2860,7 +2950,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Soft delete this Service.
@@ -2910,7 +3002,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the named Service.
@@ -2960,7 +3054,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List Services for this workspace.
@@ -3046,7 +3142,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update this Service.
@@ -3109,7 +3208,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3182,7 +3283,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceLevelObjective.fromJson(data));
+    return _response.then(
+      (data) => ServiceLevelObjective.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete the given ServiceLevelObjective.
@@ -3234,7 +3338,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a ServiceLevelObjective by name.
@@ -3304,7 +3410,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceLevelObjective.fromJson(data));
+    return _response.then(
+      (data) => ServiceLevelObjective.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List the ServiceLevelObjectives for the given Service.
@@ -3398,8 +3507,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListServiceLevelObjectivesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServiceLevelObjectivesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the given ServiceLevelObjective.
@@ -3463,7 +3574,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceLevelObjective.fromJson(data));
+    return _response.then(
+      (data) => ServiceLevelObjective.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3529,7 +3643,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListUptimeCheckIpsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUptimeCheckIpsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3888,23 +4005,27 @@
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('creationRecord')) {
-      creationRecord = MutationRecord.fromJson(_json['creationRecord']);
+      creationRecord = MutationRecord.fromJson(
+          _json['creationRecord'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('documentation')) {
-      documentation = Documentation.fromJson(_json['documentation']);
+      documentation = Documentation.fromJson(
+          _json['documentation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enabled')) {
       enabled = _json['enabled'] as core.bool;
     }
     if (_json.containsKey('mutationRecord')) {
-      mutationRecord = MutationRecord.fromJson(_json['mutationRecord']);
+      mutationRecord = MutationRecord.fromJson(
+          _json['mutationRecord'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3916,11 +4037,13 @@
     }
     if (_json.containsKey('userLabels')) {
       userLabels = commons.mapMap<core.String, core.String>(
-          _json['userLabels'].cast<core.String, core.String>(),
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('validity')) {
-      validity = Status.fromJson(_json['validity']);
+      validity = Status.fromJson(
+          _json['validity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4074,10 +4197,12 @@
 
   BasicSli.fromJson(core.Map _json) {
     if (_json.containsKey('availability')) {
-      availability = AvailabilityCriteria.fromJson(_json['availability']);
+      availability = AvailabilityCriteria.fromJson(
+          _json['availability'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('latency')) {
-      latency = LatencyCriteria.fromJson(_json['latency']);
+      latency = LatencyCriteria.fromJson(
+          _json['latency'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = (_json['location'] as core.List)
@@ -4144,13 +4269,16 @@
 
   BucketOptions.fromJson(core.Map _json) {
     if (_json.containsKey('explicitBuckets')) {
-      explicitBuckets = Explicit.fromJson(_json['explicitBuckets']);
+      explicitBuckets = Explicit.fromJson(
+          _json['explicitBuckets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exponentialBuckets')) {
-      exponentialBuckets = Exponential.fromJson(_json['exponentialBuckets']);
+      exponentialBuckets = Exponential.fromJson(
+          _json['exponentialBuckets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linearBuckets')) {
-      linearBuckets = Linear.fromJson(_json['linearBuckets']);
+      linearBuckets = Linear.fromJson(
+          _json['linearBuckets'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4284,8 +4412,10 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Map, TypedValue>(
-          _json['metadata'].cast<core.String, core.Map>(),
-          (core.Map item) => TypedValue.fromJson(item));
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              TypedValue.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('plugin')) {
       plugin = _json['plugin'] as core.String;
@@ -4304,7 +4434,8 @@
     }
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<CollectdValue>((value) => CollectdValue.fromJson(value))
+          .map<CollectdValue>((value) => CollectdValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4359,15 +4490,16 @@
 
   CollectdPayloadError.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('index')) {
       index = _json['index'] as core.int;
     }
     if (_json.containsKey('valueErrors')) {
       valueErrors = (_json['valueErrors'] as core.List)
-          .map<CollectdValueError>(
-              (value) => CollectdValueError.fromJson(value))
+          .map<CollectdValueError>((value) => CollectdValueError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4421,7 +4553,8 @@
       dataSourceType = _json['dataSourceType'] as core.String;
     }
     if (_json.containsKey('value')) {
-      value = TypedValue.fromJson(_json['value']);
+      value = TypedValue.fromJson(
+          _json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4453,7 +4586,8 @@
 
   CollectdValueError.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('index')) {
       index = _json['index'] as core.int;
@@ -4512,16 +4646,18 @@
 
   Condition.fromJson(core.Map _json) {
     if (_json.containsKey('conditionAbsent')) {
-      conditionAbsent = MetricAbsence.fromJson(_json['conditionAbsent']);
+      conditionAbsent = MetricAbsence.fromJson(
+          _json['conditionAbsent'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('conditionMonitoringQueryLanguage')) {
       conditionMonitoringQueryLanguage =
           MonitoringQueryLanguageCondition.fromJson(
-              _json['conditionMonitoringQueryLanguage']);
+              _json['conditionMonitoringQueryLanguage']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('conditionThreshold')) {
-      conditionThreshold =
-          MetricThreshold.fromJson(_json['conditionThreshold']);
+      conditionThreshold = MetricThreshold.fromJson(
+          _json['conditionThreshold'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
@@ -4624,14 +4760,16 @@
   CreateCollectdTimeSeriesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('collectdPayloads')) {
       collectdPayloads = (_json['collectdPayloads'] as core.List)
-          .map<CollectdPayload>((value) => CollectdPayload.fromJson(value))
+          .map<CollectdPayload>((value) => CollectdPayload.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('collectdVersion')) {
       collectdVersion = _json['collectdVersion'] as core.String;
     }
     if (_json.containsKey('resource')) {
-      resource = MonitoredResource.fromJson(_json['resource']);
+      resource = MonitoredResource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4670,12 +4808,13 @@
   CreateCollectdTimeSeriesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('payloadErrors')) {
       payloadErrors = (_json['payloadErrors'] as core.List)
-          .map<CollectdPayloadError>(
-              (value) => CollectdPayloadError.fromJson(value))
+          .map<CollectdPayloadError>((value) => CollectdPayloadError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('summary')) {
-      summary = CreateTimeSeriesSummary.fromJson(_json['summary']);
+      summary = CreateTimeSeriesSummary.fromJson(
+          _json['summary'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4707,7 +4846,8 @@
   CreateTimeSeriesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('timeSeries')) {
       timeSeries = (_json['timeSeries'] as core.List)
-          .map<TimeSeries>((value) => TimeSeries.fromJson(value))
+          .map<TimeSeries>((value) =>
+              TimeSeries.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4737,7 +4877,8 @@
   CreateTimeSeriesSummary.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
       errors = (_json['errors'] as core.List)
-          .map<Error>((value) => Error.fromJson(value))
+          .map<Error>((value) =>
+              Error.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('successPointCount')) {
@@ -4837,21 +4978,24 @@
           .toList();
     }
     if (_json.containsKey('bucketOptions')) {
-      bucketOptions = BucketOptions.fromJson(_json['bucketOptions']);
+      bucketOptions = BucketOptions.fromJson(
+          _json['bucketOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('count')) {
       count = _json['count'] as core.String;
     }
     if (_json.containsKey('exemplars')) {
       exemplars = (_json['exemplars'] as core.List)
-          .map<Exemplar>((value) => Exemplar.fromJson(value))
+          .map<Exemplar>((value) =>
+              Exemplar.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mean')) {
       mean = (_json['mean'] as core.num).toDouble();
     }
     if (_json.containsKey('range')) {
-      range = Range.fromJson(_json['range']);
+      range =
+          Range.fromJson(_json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sumOfSquaredDeviation')) {
       sumOfSquaredDeviation =
@@ -4908,7 +5052,8 @@
       distributionFilter = _json['distributionFilter'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = GoogleMonitoringV3Range.fromJson(_json['range']);
+      range = GoogleMonitoringV3Range.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4980,7 +5125,8 @@
   DroppedLabels.fromJson(core.Map _json) {
     if (_json.containsKey('label')) {
       label = commons.mapMap<core.String, core.String>(
-          _json['label'].cast<core.String, core.String>(),
+          (_json['label'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -5027,7 +5173,8 @@
       pointCount = _json['pointCount'] as core.int;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5074,7 +5221,8 @@
       attachments = (_json['attachments'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -5260,7 +5408,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('packed')) {
@@ -5571,7 +5720,8 @@
 
   HttpCheck.fromJson(core.Map _json) {
     if (_json.containsKey('authInfo')) {
-      authInfo = BasicAuthentication.fromJson(_json['authInfo']);
+      authInfo = BasicAuthentication.fromJson(
+          _json['authInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('body')) {
       body = _json['body'] as core.String;
@@ -5581,7 +5731,8 @@
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('maskHeaders')) {
@@ -5905,7 +6056,8 @@
   ListAlertPoliciesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('alertPolicies')) {
       alertPolicies = (_json['alertPolicies'] as core.List)
-          .map<AlertPolicy>((value) => AlertPolicy.fromJson(value))
+          .map<AlertPolicy>((value) => AlertPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5950,7 +6102,8 @@
   ListGroupMembersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
-          .map<MonitoredResource>((value) => MonitoredResource.fromJson(value))
+          .map<MonitoredResource>((value) => MonitoredResource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5991,7 +6144,8 @@
   ListGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('group')) {
       group = (_json['group'] as core.List)
-          .map<Group>((value) => Group.fromJson(value))
+          .map<Group>((value) =>
+              Group.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6027,7 +6181,8 @@
   ListMetricDescriptorsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('metricDescriptors')) {
       metricDescriptors = (_json['metricDescriptors'] as core.List)
-          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(value))
+          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6067,8 +6222,9 @@
     }
     if (_json.containsKey('resourceDescriptors')) {
       resourceDescriptors = (_json['resourceDescriptors'] as core.List)
-          .map<MonitoredResourceDescriptor>(
-              (value) => MonitoredResourceDescriptor.fromJson(value))
+          .map<MonitoredResourceDescriptor>((value) =>
+              MonitoredResourceDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6102,8 +6258,9 @@
   ListNotificationChannelDescriptorsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('channelDescriptors')) {
       channelDescriptors = (_json['channelDescriptors'] as core.List)
-          .map<NotificationChannelDescriptor>(
-              (value) => NotificationChannelDescriptor.fromJson(value))
+          .map<NotificationChannelDescriptor>((value) =>
+              NotificationChannelDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6146,8 +6303,8 @@
     }
     if (_json.containsKey('notificationChannels')) {
       notificationChannels = (_json['notificationChannels'] as core.List)
-          .map<NotificationChannel>(
-              (value) => NotificationChannel.fromJson(value))
+          .map<NotificationChannel>((value) => NotificationChannel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalSize')) {
@@ -6189,8 +6346,8 @@
     }
     if (_json.containsKey('serviceLevelObjectives')) {
       serviceLevelObjectives = (_json['serviceLevelObjectives'] as core.List)
-          .map<ServiceLevelObjective>(
-              (value) => ServiceLevelObjective.fromJson(value))
+          .map<ServiceLevelObjective>((value) => ServiceLevelObjective.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6226,7 +6383,8 @@
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<Service>((value) => Service.fromJson(value))
+          .map<Service>((value) =>
+              Service.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6269,7 +6427,8 @@
   ListTimeSeriesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('executionErrors')) {
       executionErrors = (_json['executionErrors'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6277,7 +6436,8 @@
     }
     if (_json.containsKey('timeSeries')) {
       timeSeries = (_json['timeSeries'] as core.List)
-          .map<TimeSeries>((value) => TimeSeries.fromJson(value))
+          .map<TimeSeries>((value) =>
+              TimeSeries.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('unit')) {
@@ -6331,7 +6491,8 @@
     }
     if (_json.containsKey('uptimeCheckConfigs')) {
       uptimeCheckConfigs = (_json['uptimeCheckConfigs'] as core.List)
-          .map<UptimeCheckConfig>((value) => UptimeCheckConfig.fromJson(value))
+          .map<UptimeCheckConfig>((value) => UptimeCheckConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6374,7 +6535,8 @@
     }
     if (_json.containsKey('uptimeCheckIps')) {
       uptimeCheckIps = (_json['uptimeCheckIps'] as core.List)
-          .map<UptimeCheckIp>((value) => UptimeCheckIp.fromJson(value))
+          .map<UptimeCheckIp>((value) => UptimeCheckIp.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6451,7 +6613,8 @@
   Metric.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('type')) {
@@ -6516,7 +6679,8 @@
   MetricAbsence.fromJson(core.Map _json) {
     if (_json.containsKey('aggregations')) {
       aggregations = (_json['aggregations'] as core.List)
-          .map<Aggregation>((value) => Aggregation.fromJson(value))
+          .map<Aggregation>((value) => Aggregation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('duration')) {
@@ -6526,7 +6690,8 @@
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('trigger')) {
-      trigger = Trigger.fromJson(_json['trigger']);
+      trigger = Trigger.fromJson(
+          _json['trigger'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6710,14 +6875,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
       launchStage = _json['launchStage'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = MetricDescriptorMetadata.fromJson(_json['metadata']);
+      metadata = MetricDescriptorMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricKind')) {
       metricKind = _json['metricKind'] as core.String;
@@ -6873,7 +7040,8 @@
 
   MetricRange.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GoogleMonitoringV3Range.fromJson(_json['range']);
+      range = GoogleMonitoringV3Range.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeSeries')) {
       timeSeries = _json['timeSeries'] as core.String;
@@ -6982,7 +7150,8 @@
   MetricThreshold.fromJson(core.Map _json) {
     if (_json.containsKey('aggregations')) {
       aggregations = (_json['aggregations'] as core.List)
-          .map<Aggregation>((value) => Aggregation.fromJson(value))
+          .map<Aggregation>((value) => Aggregation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('comparison')) {
@@ -6990,7 +7159,8 @@
     }
     if (_json.containsKey('denominatorAggregations')) {
       denominatorAggregations = (_json['denominatorAggregations'] as core.List)
-          .map<Aggregation>((value) => Aggregation.fromJson(value))
+          .map<Aggregation>((value) => Aggregation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('denominatorFilter')) {
@@ -7006,7 +7176,8 @@
       thresholdValue = (_json['thresholdValue'] as core.num).toDouble();
     }
     if (_json.containsKey('trigger')) {
-      trigger = Trigger.fromJson(_json['trigger']);
+      trigger = Trigger.fromJson(
+          _json['trigger'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7069,7 +7240,8 @@
   MonitoredResource.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('type')) {
@@ -7170,7 +7342,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
@@ -7233,12 +7406,14 @@
   MonitoredResourceMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('systemLabels')) {
       systemLabels = commons.mapMap<core.Object, core.Object>(
-          _json['systemLabels'].cast<core.String, core.Object>(),
+          (_json['systemLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('userLabels')) {
       userLabels = commons.mapMap<core.String, core.String>(
-          _json['userLabels'].cast<core.String, core.String>(),
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -7289,7 +7464,8 @@
       query = _json['query'] as core.String;
     }
     if (_json.containsKey('trigger')) {
-      trigger = Trigger.fromJson(_json['trigger']);
+      trigger = Trigger.fromJson(
+          _json['trigger'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7429,7 +7605,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -7440,7 +7617,8 @@
     }
     if (_json.containsKey('userLabels')) {
       userLabels = commons.mapMap<core.String, core.String>(
-          _json['userLabels'].cast<core.String, core.String>(),
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('verificationStatus')) {
@@ -7553,7 +7731,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
@@ -7617,7 +7796,8 @@
     }
     if (_json.containsKey('value')) {
       value = commons.mapMap<core.Object, core.Object>(
-          _json['value'].cast<core.String, core.Object>(),
+          (_json['value'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -7650,10 +7830,12 @@
 
   PerformanceThreshold.fromJson(core.Map _json) {
     if (_json.containsKey('basicSliPerformance')) {
-      basicSliPerformance = BasicSli.fromJson(_json['basicSliPerformance']);
+      basicSliPerformance = BasicSli.fromJson(
+          _json['basicSliPerformance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('performance')) {
-      performance = RequestBasedSli.fromJson(_json['performance']);
+      performance = RequestBasedSli.fromJson(
+          _json['performance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('threshold')) {
       threshold = (_json['threshold'] as core.num).toDouble();
@@ -7694,10 +7876,12 @@
 
   Point.fromJson(core.Map _json) {
     if (_json.containsKey('interval')) {
-      interval = TimeInterval.fromJson(_json['interval']);
+      interval = TimeInterval.fromJson(
+          _json['interval'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
-      value = TypedValue.fromJson(_json['value']);
+      value = TypedValue.fromJson(
+          _json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7727,11 +7911,13 @@
 
   PointData.fromJson(core.Map _json) {
     if (_json.containsKey('timeInterval')) {
-      timeInterval = TimeInterval.fromJson(_json['timeInterval']);
+      timeInterval = TimeInterval.fromJson(
+          _json['timeInterval'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<TypedValue>((value) => TypedValue.fromJson(value))
+          .map<TypedValue>((value) =>
+              TypedValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7818,17 +8004,19 @@
     }
     if (_json.containsKey('partialErrors')) {
       partialErrors = (_json['partialErrors'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeSeriesData')) {
       timeSeriesData = (_json['timeSeriesData'] as core.List)
-          .map<TimeSeriesData>((value) => TimeSeriesData.fromJson(value))
+          .map<TimeSeriesData>((value) => TimeSeriesData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timeSeriesDescriptor')) {
-      timeSeriesDescriptor =
-          TimeSeriesDescriptor.fromJson(_json['timeSeriesDescriptor']);
+      timeSeriesDescriptor = TimeSeriesDescriptor.fromJson(
+          _json['timeSeriesDescriptor'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7899,10 +8087,12 @@
 
   RequestBasedSli.fromJson(core.Map _json) {
     if (_json.containsKey('distributionCut')) {
-      distributionCut = DistributionCut.fromJson(_json['distributionCut']);
+      distributionCut = DistributionCut.fromJson(
+          _json['distributionCut'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('goodTotalRatio')) {
-      goodTotalRatio = TimeSeriesRatio.fromJson(_json['goodTotalRatio']);
+      goodTotalRatio = TimeSeriesRatio.fromJson(
+          _json['goodTotalRatio'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8005,28 +8195,34 @@
 
   Service.fromJson(core.Map _json) {
     if (_json.containsKey('appEngine')) {
-      appEngine = AppEngine.fromJson(_json['appEngine']);
+      appEngine = AppEngine.fromJson(
+          _json['appEngine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cloudEndpoints')) {
-      cloudEndpoints = CloudEndpoints.fromJson(_json['cloudEndpoints']);
+      cloudEndpoints = CloudEndpoints.fromJson(
+          _json['cloudEndpoints'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clusterIstio')) {
-      clusterIstio = ClusterIstio.fromJson(_json['clusterIstio']);
+      clusterIstio = ClusterIstio.fromJson(
+          _json['clusterIstio'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('custom')) {
-      custom = Custom.fromJson(_json['custom']);
+      custom = Custom.fromJson(
+          _json['custom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('meshIstio')) {
-      meshIstio = MeshIstio.fromJson(_json['meshIstio']);
+      meshIstio = MeshIstio.fromJson(
+          _json['meshIstio'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('telemetry')) {
-      telemetry = Telemetry.fromJson(_json['telemetry']);
+      telemetry = Telemetry.fromJson(
+          _json['telemetry'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8087,13 +8283,16 @@
 
   ServiceLevelIndicator.fromJson(core.Map _json) {
     if (_json.containsKey('basicSli')) {
-      basicSli = BasicSli.fromJson(_json['basicSli']);
+      basicSli = BasicSli.fromJson(
+          _json['basicSli'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestBased')) {
-      requestBased = RequestBasedSli.fromJson(_json['requestBased']);
+      requestBased = RequestBasedSli.fromJson(
+          _json['requestBased'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('windowsBased')) {
-      windowsBased = WindowsBasedSli.fromJson(_json['windowsBased']);
+      windowsBased = WindowsBasedSli.fromJson(
+          _json['windowsBased'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8176,8 +8375,9 @@
       rollingPeriod = _json['rollingPeriod'] as core.String;
     }
     if (_json.containsKey('serviceLevelIndicator')) {
-      serviceLevelIndicator =
-          ServiceLevelIndicator.fromJson(_json['serviceLevelIndicator']);
+      serviceLevelIndicator = ServiceLevelIndicator.fromJson(
+          _json['serviceLevelIndicator']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8290,7 +8490,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -8490,21 +8691,25 @@
 
   TimeSeries.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = MonitoredResourceMetadata.fromJson(_json['metadata']);
+      metadata = MonitoredResourceMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metric')) {
-      metric = Metric.fromJson(_json['metric']);
+      metric = Metric.fromJson(
+          _json['metric'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricKind')) {
       metricKind = _json['metricKind'] as core.String;
     }
     if (_json.containsKey('points')) {
       points = (_json['points'] as core.List)
-          .map<Point>((value) => Point.fromJson(value))
+          .map<Point>((value) =>
+              Point.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resource')) {
-      resource = MonitoredResource.fromJson(_json['resource']);
+      resource = MonitoredResource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unit')) {
       unit = _json['unit'] as core.String;
@@ -8558,12 +8763,14 @@
   TimeSeriesData.fromJson(core.Map _json) {
     if (_json.containsKey('labelValues')) {
       labelValues = (_json['labelValues'] as core.List)
-          .map<LabelValue>((value) => LabelValue.fromJson(value))
+          .map<LabelValue>((value) =>
+              LabelValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pointData')) {
       pointData = (_json['pointData'] as core.List)
-          .map<PointData>((value) => PointData.fromJson(value))
+          .map<PointData>((value) =>
+              PointData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8594,12 +8801,14 @@
   TimeSeriesDescriptor.fromJson(core.Map _json) {
     if (_json.containsKey('labelDescriptors')) {
       labelDescriptors = (_json['labelDescriptors'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pointDescriptors')) {
       pointDescriptors = (_json['pointDescriptors'] as core.List)
-          .map<ValueDescriptor>((value) => ValueDescriptor.fromJson(value))
+          .map<ValueDescriptor>((value) => ValueDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8735,7 +8944,8 @@
   Type.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<Field>((value) => Field.fromJson(value))
+          .map<Field>((value) =>
+              Field.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -8748,11 +8958,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -8808,7 +9020,8 @@
       boolValue = _json['boolValue'] as core.bool;
     }
     if (_json.containsKey('distributionValue')) {
-      distributionValue = Distribution.fromJson(_json['distributionValue']);
+      distributionValue = Distribution.fromJson(
+          _json['distributionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doubleValue')) {
       doubleValue = (_json['doubleValue'] as core.num).toDouble();
@@ -8912,26 +9125,29 @@
   UptimeCheckConfig.fromJson(core.Map _json) {
     if (_json.containsKey('contentMatchers')) {
       contentMatchers = (_json['contentMatchers'] as core.List)
-          .map<ContentMatcher>((value) => ContentMatcher.fromJson(value))
+          .map<ContentMatcher>((value) => ContentMatcher.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('httpCheck')) {
-      httpCheck = HttpCheck.fromJson(_json['httpCheck']);
+      httpCheck = HttpCheck.fromJson(
+          _json['httpCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('internalCheckers')) {
       internalCheckers = (_json['internalCheckers'] as core.List)
-          .map<InternalChecker>((value) => InternalChecker.fromJson(value))
+          .map<InternalChecker>((value) => InternalChecker.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('isInternal')) {
       isInternal = _json['isInternal'] as core.bool;
     }
     if (_json.containsKey('monitoredResource')) {
-      monitoredResource =
-          MonitoredResource.fromJson(_json['monitoredResource']);
+      monitoredResource = MonitoredResource.fromJson(
+          _json['monitoredResource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8940,7 +9156,8 @@
       period = _json['period'] as core.String;
     }
     if (_json.containsKey('resourceGroup')) {
-      resourceGroup = ResourceGroup.fromJson(_json['resourceGroup']);
+      resourceGroup = ResourceGroup.fromJson(
+          _json['resourceGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selectedRegions')) {
       selectedRegions = (_json['selectedRegions'] as core.List)
@@ -8948,7 +9165,8 @@
           .toList();
     }
     if (_json.containsKey('tcpCheck')) {
-      tcpCheck = TcpCheck.fromJson(_json['tcpCheck']);
+      tcpCheck = TcpCheck.fromJson(
+          _json['tcpCheck'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeout')) {
       timeout = _json['timeout'] as core.String;
@@ -9185,14 +9403,17 @@
       goodBadMetricFilter = _json['goodBadMetricFilter'] as core.String;
     }
     if (_json.containsKey('goodTotalRatioThreshold')) {
-      goodTotalRatioThreshold =
-          PerformanceThreshold.fromJson(_json['goodTotalRatioThreshold']);
+      goodTotalRatioThreshold = PerformanceThreshold.fromJson(
+          _json['goodTotalRatioThreshold']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricMeanInRange')) {
-      metricMeanInRange = MetricRange.fromJson(_json['metricMeanInRange']);
+      metricMeanInRange = MetricRange.fromJson(
+          _json['metricMeanInRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricSumInRange')) {
-      metricSumInRange = MetricRange.fromJson(_json['metricSumInRange']);
+      metricSumInRange = MetricRange.fromJson(
+          _json['metricSumInRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('windowPeriod')) {
       windowPeriod = _json['windowPeriod'] as core.String;
diff --git a/generated/googleapis/lib/networkmanagement/v1.dart b/generated/googleapis/lib/networkmanagement/v1.dart
index e805b23..2f50df9 100644
--- a/generated/googleapis/lib/networkmanagement/v1.dart
+++ b/generated/googleapis/lib/networkmanagement/v1.dart
@@ -112,7 +112,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -180,7 +182,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -277,7 +282,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a specific `ConnectivityTest`.
@@ -328,7 +335,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a specific Connectivity Test.
@@ -379,7 +388,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ConnectivityTest.fromJson(data));
+    return _response.then(
+      (data) => ConnectivityTest.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -448,7 +460,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Connectivity Tests owned by a project.
@@ -534,8 +548,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListConnectivityTestsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListConnectivityTestsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the configuration of an existing `ConnectivityTest`. After you
@@ -609,7 +625,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rerun an existing `ConnectivityTest`. After the user triggers the rerun,
@@ -674,7 +692,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -736,7 +756,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -800,7 +822,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -871,7 +896,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -924,7 +951,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -976,7 +1005,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1052,7 +1083,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1143,7 +1177,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -1257,7 +1292,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1371,14 +1407,16 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('destination')) {
-      destination = Endpoint.fromJson(_json['destination']);
+      destination = Endpoint.fromJson(
+          _json['destination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('displayName')) {
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -1388,8 +1426,8 @@
       protocol = _json['protocol'] as core.String;
     }
     if (_json.containsKey('reachabilityDetails')) {
-      reachabilityDetails =
-          ReachabilityDetails.fromJson(_json['reachabilityDetails']);
+      reachabilityDetails = ReachabilityDetails.fromJson(
+          _json['reachabilityDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('relatedProjects')) {
       relatedProjects = (_json['relatedProjects'] as core.List)
@@ -1397,7 +1435,8 @@
           .toList();
     }
     if (_json.containsKey('source')) {
-      source = Endpoint.fromJson(_json['source']);
+      source = Endpoint.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -2117,7 +2156,8 @@
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ConnectivityTest>((value) => ConnectivityTest.fromJson(value))
+          .map<ConnectivityTest>((value) => ConnectivityTest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('unreachable')) {
@@ -2155,7 +2195,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2191,7 +2232,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2324,8 +2366,8 @@
     }
     if (_json.containsKey('backends')) {
       backends = (_json['backends'] as core.List)
-          .map<LoadBalancerBackend>(
-              (value) => LoadBalancerBackend.fromJson(value))
+          .map<LoadBalancerBackend>((value) => LoadBalancerBackend.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('healthCheckUri')) {
@@ -2389,7 +2431,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -2397,7 +2440,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2510,11 +2554,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -2522,7 +2568,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2704,12 +2751,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -2776,14 +2825,16 @@
 
   ReachabilityDetails.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('result')) {
       result = _json['result'] as core.String;
     }
     if (_json.containsKey('traces')) {
       traces = (_json['traces'] as core.List)
-          .map<Trace>((value) => Trace.fromJson(value))
+          .map<Trace>((value) =>
+              Trace.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('verifyTime')) {
@@ -2965,7 +3016,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -3016,7 +3068,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3139,55 +3192,68 @@
 
   Step.fromJson(core.Map _json) {
     if (_json.containsKey('abort')) {
-      abort = AbortInfo.fromJson(_json['abort']);
+      abort = AbortInfo.fromJson(
+          _json['abort'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('causesDrop')) {
       causesDrop = _json['causesDrop'] as core.bool;
     }
     if (_json.containsKey('deliver')) {
-      deliver = DeliverInfo.fromJson(_json['deliver']);
+      deliver = DeliverInfo.fromJson(
+          _json['deliver'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('drop')) {
-      drop = DropInfo.fromJson(_json['drop']);
+      drop = DropInfo.fromJson(
+          _json['drop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endpoint')) {
-      endpoint = EndpointInfo.fromJson(_json['endpoint']);
+      endpoint = EndpointInfo.fromJson(
+          _json['endpoint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('firewall')) {
-      firewall = FirewallInfo.fromJson(_json['firewall']);
+      firewall = FirewallInfo.fromJson(
+          _json['firewall'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('forward')) {
-      forward = ForwardInfo.fromJson(_json['forward']);
+      forward = ForwardInfo.fromJson(
+          _json['forward'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('forwardingRule')) {
-      forwardingRule = ForwardingRuleInfo.fromJson(_json['forwardingRule']);
+      forwardingRule = ForwardingRuleInfo.fromJson(
+          _json['forwardingRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('instance')) {
-      instance = InstanceInfo.fromJson(_json['instance']);
+      instance = InstanceInfo.fromJson(
+          _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('loadBalancer')) {
-      loadBalancer = LoadBalancerInfo.fromJson(_json['loadBalancer']);
+      loadBalancer = LoadBalancerInfo.fromJson(
+          _json['loadBalancer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('network')) {
-      network = NetworkInfo.fromJson(_json['network']);
+      network = NetworkInfo.fromJson(
+          _json['network'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('route')) {
-      route = RouteInfo.fromJson(_json['route']);
+      route = RouteInfo.fromJson(
+          _json['route'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('vpnGateway')) {
-      vpnGateway = VpnGatewayInfo.fromJson(_json['vpnGateway']);
+      vpnGateway = VpnGatewayInfo.fromJson(
+          _json['vpnGateway'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('vpnTunnel')) {
-      vpnTunnel = VpnTunnelInfo.fromJson(_json['vpnTunnel']);
+      vpnTunnel = VpnTunnelInfo.fromJson(
+          _json['vpnTunnel'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3325,11 +3391,13 @@
 
   Trace.fromJson(core.Map _json) {
     if (_json.containsKey('endpointInfo')) {
-      endpointInfo = EndpointInfo.fromJson(_json['endpointInfo']);
+      endpointInfo = EndpointInfo.fromJson(
+          _json['endpointInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('steps')) {
       steps = (_json['steps'] as core.List)
-          .map<Step>((value) => Step.fromJson(value))
+          .map<Step>((value) =>
+              Step.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/oauth2/v2.dart b/generated/googleapis/lib/oauth2/v2.dart
index fb7c2ec..cd3677d 100644
--- a/generated/googleapis/lib/oauth2/v2.dart
+++ b/generated/googleapis/lib/oauth2/v2.dart
@@ -102,7 +102,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tokeninfo.fromJson(data));
+    return _response.then(
+      (data) => Tokeninfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -150,7 +152,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Userinfo.fromJson(data));
+    return _response.then(
+      (data) => Userinfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -204,7 +208,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Userinfo.fromJson(data));
+    return _response.then(
+      (data) => Userinfo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
diff --git a/generated/googleapis/lib/osconfig/v1.dart b/generated/googleapis/lib/osconfig/v1.dart
index d5e5f23..38e2f96 100644
--- a/generated/googleapis/lib/osconfig/v1.dart
+++ b/generated/googleapis/lib/osconfig/v1.dart
@@ -130,7 +130,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PatchDeployment.fromJson(data));
+    return _response.then(
+      (data) =>
+          PatchDeployment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete an OS Config patch deployment.
@@ -180,7 +183,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get an OS Config patch deployment.
@@ -230,7 +235,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PatchDeployment.fromJson(data));
+    return _response.then(
+      (data) =>
+          PatchDeployment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a page of OS Config patch deployments.
@@ -297,8 +305,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListPatchDeploymentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPatchDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -365,7 +375,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PatchJob.fromJson(data));
+    return _response.then(
+      (data) => PatchJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patch VM instances by creating and running a patch job.
@@ -423,7 +435,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PatchJob.fromJson(data));
+    return _response.then(
+      (data) => PatchJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the patch job. This can be used to track the progress of an ongoing
@@ -474,7 +488,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PatchJob.fromJson(data));
+    return _response.then(
+      (data) => PatchJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a list of patch jobs.
@@ -545,7 +561,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListPatchJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPatchJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -626,8 +645,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListPatchJobInstanceDetailsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPatchJobInstanceDetailsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -728,12 +749,13 @@
 
   ExecStep.fromJson(core.Map _json) {
     if (_json.containsKey('linuxExecStepConfig')) {
-      linuxExecStepConfig =
-          ExecStepConfig.fromJson(_json['linuxExecStepConfig']);
+      linuxExecStepConfig = ExecStepConfig.fromJson(
+          _json['linuxExecStepConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('windowsExecStepConfig')) {
-      windowsExecStepConfig =
-          ExecStepConfig.fromJson(_json['windowsExecStepConfig']);
+      windowsExecStepConfig = ExecStepConfig.fromJson(
+          _json['windowsExecStepConfig']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -784,7 +806,8 @@
           .toList();
     }
     if (_json.containsKey('gcsObject')) {
-      gcsObject = GcsObject.fromJson(_json['gcsObject']);
+      gcsObject = GcsObject.fromJson(
+          _json['gcsObject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('interpreter')) {
       interpreter = _json['interpreter'] as core.String;
@@ -856,13 +879,16 @@
       duration = _json['duration'] as core.String;
     }
     if (_json.containsKey('instanceFilter')) {
-      instanceFilter = PatchInstanceFilter.fromJson(_json['instanceFilter']);
+      instanceFilter = PatchInstanceFilter.fromJson(
+          _json['instanceFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('patchConfig')) {
-      patchConfig = PatchConfig.fromJson(_json['patchConfig']);
+      patchConfig = PatchConfig.fromJson(
+          _json['patchConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rollout')) {
-      rollout = PatchRollout.fromJson(_json['rollout']);
+      rollout = PatchRollout.fromJson(
+          _json['rollout'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -998,7 +1024,8 @@
     }
     if (_json.containsKey('patchDeployments')) {
       patchDeployments = (_json['patchDeployments'] as core.List)
-          .map<PatchDeployment>((value) => PatchDeployment.fromJson(value))
+          .map<PatchDeployment>((value) => PatchDeployment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1032,8 +1059,9 @@
     }
     if (_json.containsKey('patchJobInstanceDetails')) {
       patchJobInstanceDetails = (_json['patchJobInstanceDetails'] as core.List)
-          .map<PatchJobInstanceDetails>(
-              (value) => PatchJobInstanceDetails.fromJson(value))
+          .map<PatchJobInstanceDetails>((value) =>
+              PatchJobInstanceDetails.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1067,7 +1095,8 @@
     }
     if (_json.containsKey('patchJobs')) {
       patchJobs = (_json['patchJobs'] as core.List)
-          .map<PatchJob>((value) => PatchJob.fromJson(value))
+          .map<PatchJob>((value) =>
+              PatchJob.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1103,7 +1132,8 @@
       monthDay = _json['monthDay'] as core.int;
     }
     if (_json.containsKey('weekDayOfMonth')) {
-      weekDayOfMonth = WeekDayOfMonth.fromJson(_json['weekDayOfMonth']);
+      weekDayOfMonth = WeekDayOfMonth.fromJson(
+          _json['weekDayOfMonth'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1186,28 +1216,35 @@
 
   PatchConfig.fromJson(core.Map _json) {
     if (_json.containsKey('apt')) {
-      apt = AptSettings.fromJson(_json['apt']);
+      apt = AptSettings.fromJson(
+          _json['apt'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('goo')) {
-      goo = GooSettings.fromJson(_json['goo']);
+      goo = GooSettings.fromJson(
+          _json['goo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('postStep')) {
-      postStep = ExecStep.fromJson(_json['postStep']);
+      postStep = ExecStep.fromJson(
+          _json['postStep'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('preStep')) {
-      preStep = ExecStep.fromJson(_json['preStep']);
+      preStep = ExecStep.fromJson(
+          _json['preStep'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rebootConfig')) {
       rebootConfig = _json['rebootConfig'] as core.String;
     }
     if (_json.containsKey('windowsUpdate')) {
-      windowsUpdate = WindowsUpdateSettings.fromJson(_json['windowsUpdate']);
+      windowsUpdate = WindowsUpdateSettings.fromJson(
+          _json['windowsUpdate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('yum')) {
-      yum = YumSettings.fromJson(_json['yum']);
+      yum = YumSettings.fromJson(
+          _json['yum'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zypper')) {
-      zypper = ZypperSettings.fromJson(_json['zypper']);
+      zypper = ZypperSettings.fromJson(
+          _json['zypper'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1302,7 +1339,8 @@
       duration = _json['duration'] as core.String;
     }
     if (_json.containsKey('instanceFilter')) {
-      instanceFilter = PatchInstanceFilter.fromJson(_json['instanceFilter']);
+      instanceFilter = PatchInstanceFilter.fromJson(
+          _json['instanceFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastExecuteTime')) {
       lastExecuteTime = _json['lastExecuteTime'] as core.String;
@@ -1311,17 +1349,20 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('oneTimeSchedule')) {
-      oneTimeSchedule = OneTimeSchedule.fromJson(_json['oneTimeSchedule']);
+      oneTimeSchedule = OneTimeSchedule.fromJson(
+          _json['oneTimeSchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('patchConfig')) {
-      patchConfig = PatchConfig.fromJson(_json['patchConfig']);
+      patchConfig = PatchConfig.fromJson(
+          _json['patchConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recurringSchedule')) {
-      recurringSchedule =
-          RecurringSchedule.fromJson(_json['recurringSchedule']);
+      recurringSchedule = RecurringSchedule.fromJson(
+          _json['recurringSchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rollout')) {
-      rollout = PatchRollout.fromJson(_json['rollout']);
+      rollout = PatchRollout.fromJson(
+          _json['rollout'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -1402,8 +1443,9 @@
     }
     if (_json.containsKey('groupLabels')) {
       groupLabels = (_json['groupLabels'] as core.List)
-          .map<PatchInstanceFilterGroupLabel>(
-              (value) => PatchInstanceFilterGroupLabel.fromJson(value))
+          .map<PatchInstanceFilterGroupLabel>((value) =>
+              PatchInstanceFilterGroupLabel.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('instanceNamePrefixes')) {
@@ -1462,7 +1504,8 @@
   PatchInstanceFilterGroupLabel.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -1566,16 +1609,19 @@
     }
     if (_json.containsKey('instanceDetailsSummary')) {
       instanceDetailsSummary = PatchJobInstanceDetailsSummary.fromJson(
-          _json['instanceDetailsSummary']);
+          _json['instanceDetailsSummary']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('instanceFilter')) {
-      instanceFilter = PatchInstanceFilter.fromJson(_json['instanceFilter']);
+      instanceFilter = PatchInstanceFilter.fromJson(
+          _json['instanceFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('patchConfig')) {
-      patchConfig = PatchConfig.fromJson(_json['patchConfig']);
+      patchConfig = PatchConfig.fromJson(
+          _json['patchConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('patchDeployment')) {
       patchDeployment = _json['patchDeployment'] as core.String;
@@ -1584,7 +1630,8 @@
       percentComplete = (_json['percentComplete'] as core.num).toDouble();
     }
     if (_json.containsKey('rollout')) {
-      rollout = PatchRollout.fromJson(_json['rollout']);
+      rollout = PatchRollout.fromJson(
+          _json['rollout'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -1928,7 +1975,8 @@
 
   PatchRollout.fromJson(core.Map _json) {
     if (_json.containsKey('disruptionBudget')) {
-      disruptionBudget = FixedOrPercent.fromJson(_json['disruptionBudget']);
+      disruptionBudget = FixedOrPercent.fromJson(
+          _json['disruptionBudget'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mode')) {
       mode = _json['mode'] as core.String;
@@ -1998,7 +2046,8 @@
       lastExecuteTime = _json['lastExecuteTime'] as core.String;
     }
     if (_json.containsKey('monthly')) {
-      monthly = MonthlySchedule.fromJson(_json['monthly']);
+      monthly = MonthlySchedule.fromJson(
+          _json['monthly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextExecuteTime')) {
       nextExecuteTime = _json['nextExecuteTime'] as core.String;
@@ -2007,13 +2056,16 @@
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('timeOfDay')) {
-      timeOfDay = TimeOfDay.fromJson(_json['timeOfDay']);
+      timeOfDay = TimeOfDay.fromJson(
+          _json['timeOfDay'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeZone')) {
-      timeZone = TimeZone.fromJson(_json['timeZone']);
+      timeZone = TimeZone.fromJson(
+          _json['timeZone'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('weekly')) {
-      weekly = WeeklySchedule.fromJson(_json['weekly']);
+      weekly = WeeklySchedule.fromJson(
+          _json['weekly'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/oslogin/v1.dart b/generated/googleapis/lib/oslogin/v1.dart
index 554ed09..9473a3a 100644
--- a/generated/googleapis/lib/oslogin/v1.dart
+++ b/generated/googleapis/lib/oslogin/v1.dart
@@ -120,7 +120,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LoginProfile.fromJson(data));
+    return _response.then(
+      (data) =>
+          LoginProfile.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds an SSH public key and returns the profile information. Default POSIX
@@ -185,7 +188,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ImportSshPublicKeyResponse.fromJson(data));
+    return _response.then(
+      (data) => ImportSshPublicKeyResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -243,7 +249,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -301,7 +309,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves an SSH public key.
@@ -352,7 +362,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SshPublicKey.fromJson(data));
+    return _response.then(
+      (data) =>
+          SshPublicKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an SSH public key and returns the profile information. This method
@@ -417,7 +430,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SshPublicKey.fromJson(data));
+    return _response.then(
+      (data) =>
+          SshPublicKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -454,7 +470,8 @@
       details = _json['details'] as core.String;
     }
     if (_json.containsKey('loginProfile')) {
-      loginProfile = LoginProfile.fromJson(_json['loginProfile']);
+      loginProfile = LoginProfile.fromJson(
+          _json['loginProfile'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -490,13 +507,16 @@
     }
     if (_json.containsKey('posixAccounts')) {
       posixAccounts = (_json['posixAccounts'] as core.List)
-          .map<PosixAccount>((value) => PosixAccount.fromJson(value))
+          .map<PosixAccount>((value) => PosixAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sshPublicKeys')) {
       sshPublicKeys = commons.mapMap<core.Map, SshPublicKey>(
-          _json['sshPublicKeys'].cast<core.String, core.Map>(),
-          (core.Map item) => SshPublicKey.fromJson(item));
+          (_json['sshPublicKeys'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => SshPublicKey.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
diff --git a/generated/googleapis/lib/pagespeedonline/v5.dart b/generated/googleapis/lib/pagespeedonline/v5.dart
index 4ce91d4..2844a4e 100644
--- a/generated/googleapis/lib/pagespeedonline/v5.dart
+++ b/generated/googleapis/lib/pagespeedonline/v5.dart
@@ -143,8 +143,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PagespeedApiPagespeedResponseV5.fromJson(data));
+    return _response.then(
+      (data) => PagespeedApiPagespeedResponseV5.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -253,19 +255,24 @@
 
   Categories.fromJson(core.Map _json) {
     if (_json.containsKey('accessibility')) {
-      accessibility = LighthouseCategoryV5.fromJson(_json['accessibility']);
+      accessibility = LighthouseCategoryV5.fromJson(
+          _json['accessibility'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('best-practices')) {
-      best_practices = LighthouseCategoryV5.fromJson(_json['best-practices']);
+      best_practices = LighthouseCategoryV5.fromJson(
+          _json['best-practices'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('performance')) {
-      performance = LighthouseCategoryV5.fromJson(_json['performance']);
+      performance = LighthouseCategoryV5.fromJson(
+          _json['performance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pwa')) {
-      pwa = LighthouseCategoryV5.fromJson(_json['pwa']);
+      pwa = LighthouseCategoryV5.fromJson(
+          _json['pwa'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('seo')) {
-      seo = LighthouseCategoryV5.fromJson(_json['seo']);
+      seo = LighthouseCategoryV5.fromJson(
+          _json['seo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -424,8 +431,9 @@
 
   I18n.fromJson(core.Map _json) {
     if (_json.containsKey('rendererFormattedStrings')) {
-      rendererFormattedStrings =
-          RendererFormattedStrings.fromJson(_json['rendererFormattedStrings']);
+      rendererFormattedStrings = RendererFormattedStrings.fromJson(
+          _json['rendererFormattedStrings']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -492,7 +500,8 @@
     }
     if (_json.containsKey('details')) {
       details = commons.mapMap<core.Object, core.Object>(
-          _json['details'].cast<core.String, core.Object>(),
+          (_json['details'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('displayValue')) {
@@ -592,7 +601,8 @@
   LighthouseCategoryV5.fromJson(core.Map _json) {
     if (_json.containsKey('auditRefs')) {
       auditRefs = (_json['auditRefs'] as core.List)
-          .map<AuditRefs>((value) => AuditRefs.fromJson(value))
+          .map<AuditRefs>((value) =>
+              AuditRefs.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('description')) {
@@ -692,22 +702,29 @@
   LighthouseResultV5.fromJson(core.Map _json) {
     if (_json.containsKey('audits')) {
       audits = commons.mapMap<core.Map, LighthouseAuditResultV5>(
-          _json['audits'].cast<core.String, core.Map>(),
-          (core.Map item) => LighthouseAuditResultV5.fromJson(item));
+          (_json['audits'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => LighthouseAuditResultV5.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('categories')) {
-      categories = Categories.fromJson(_json['categories']);
+      categories = Categories.fromJson(
+          _json['categories'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('categoryGroups')) {
       categoryGroups = commons.mapMap<core.Map, CategoryGroupV5>(
-          _json['categoryGroups'].cast<core.String, core.Map>(),
-          (core.Map item) => CategoryGroupV5.fromJson(item));
+          (_json['categoryGroups'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => CategoryGroupV5.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('configSettings')) {
-      configSettings = ConfigSettings.fromJson(_json['configSettings']);
+      configSettings = ConfigSettings.fromJson(
+          _json['configSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('environment')) {
-      environment = Environment.fromJson(_json['environment']);
+      environment = Environment.fromJson(
+          _json['environment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fetchTime')) {
       fetchTime = _json['fetchTime'] as core.String;
@@ -716,7 +733,8 @@
       finalUrl = _json['finalUrl'] as core.String;
     }
     if (_json.containsKey('i18n')) {
-      i18n = I18n.fromJson(_json['i18n']);
+      i18n =
+          I18n.fromJson(_json['i18n'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lighthouseVersion')) {
       lighthouseVersion = _json['lighthouseVersion'] as core.String;
@@ -730,15 +748,18 @@
           .toList();
     }
     if (_json.containsKey('runtimeError')) {
-      runtimeError = RuntimeError.fromJson(_json['runtimeError']);
+      runtimeError = RuntimeError.fromJson(
+          _json['runtimeError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stackPacks')) {
       stackPacks = (_json['stackPacks'] as core.List)
-          .map<StackPack>((value) => StackPack.fromJson(value))
+          .map<StackPack>((value) =>
+              StackPack.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('timing')) {
-      timing = Timing.fromJson(_json['timing']);
+      timing = Timing.fromJson(
+          _json['timing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userAgent')) {
       userAgent = _json['userAgent'] as core.String;
@@ -828,8 +849,10 @@
     }
     if (_json.containsKey('metrics')) {
       metrics = commons.mapMap<core.Map, UserPageLoadMetricV5>(
-          _json['metrics'].cast<core.String, core.Map>(),
-          (core.Map item) => UserPageLoadMetricV5.fromJson(item));
+          (_json['metrics'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => UserPageLoadMetricV5.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('origin_fallback')) {
       originFallback = _json['origin_fallback'] as core.bool;
@@ -905,18 +928,21 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('lighthouseResult')) {
-      lighthouseResult = LighthouseResultV5.fromJson(_json['lighthouseResult']);
+      lighthouseResult = LighthouseResultV5.fromJson(
+          _json['lighthouseResult'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('loadingExperience')) {
-      loadingExperience =
-          PagespeedApiLoadingExperienceV5.fromJson(_json['loadingExperience']);
+      loadingExperience = PagespeedApiLoadingExperienceV5.fromJson(
+          _json['loadingExperience'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('originLoadingExperience')) {
       originLoadingExperience = PagespeedApiLoadingExperienceV5.fromJson(
-          _json['originLoadingExperience']);
+          _json['originLoadingExperience']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('version')) {
-      version = PagespeedVersion.fromJson(_json['version']);
+      version = PagespeedVersion.fromJson(
+          _json['version'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1196,7 +1222,8 @@
   StackPack.fromJson(core.Map _json) {
     if (_json.containsKey('descriptions')) {
       descriptions = commons.mapMap<core.String, core.String>(
-          _json['descriptions'].cast<core.String, core.String>(),
+          (_json['descriptions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('iconDataURL')) {
@@ -1279,7 +1306,8 @@
     }
     if (_json.containsKey('distributions')) {
       distributions = (_json['distributions'] as core.List)
-          .map<Bucket>((value) => Bucket.fromJson(value))
+          .map<Bucket>((value) =>
+              Bucket.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('formFactor')) {
diff --git a/generated/googleapis/lib/people/v1.dart b/generated/googleapis/lib/people/v1.dart
index e6bca27..5caec1b 100644
--- a/generated/googleapis/lib/people/v1.dart
+++ b/generated/googleapis/lib/people/v1.dart
@@ -157,8 +157,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchGetContactGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetContactGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new contact group owned by the authenticated user.
@@ -206,7 +208,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContactGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          ContactGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete an existing contact group owned by the authenticated user by
@@ -264,7 +269,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a specific contact group owned by the authenticated user by specifying
@@ -321,7 +328,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContactGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          ContactGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all contact groups owned by the authenticated user. Members of the
@@ -388,7 +398,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListContactGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListContactGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update the name of an existing contact group owned by the authenticated
@@ -446,7 +459,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContactGroup.fromJson(data));
+    return _response.then(
+      (data) =>
+          ContactGroup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -514,8 +530,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ModifyContactGroupMembersResponse.fromJson(data));
+    return _response.then(
+      (data) => ModifyContactGroupMembersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -580,7 +598,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Person.fromJson(data));
+    return _response.then(
+      (data) => Person.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all "Other contacts", that is contacts that are not in a contact
@@ -669,7 +689,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOtherContactsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOtherContactsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -750,7 +773,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Person.fromJson(data));
+    return _response.then(
+      (data) => Person.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a contact person. Any non-contact data will not be deleted.
@@ -801,7 +826,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a contact's photo.
@@ -874,7 +901,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeleteContactPhotoResponse.fromJson(data));
+    return _response.then(
+      (data) => DeleteContactPhotoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Provides information about a person by specifying a resource name. Use
@@ -958,7 +988,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Person.fromJson(data));
+    return _response.then(
+      (data) => Person.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Provides information about a list of specific people by specifying a list
@@ -1044,7 +1076,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetPeopleResponse.fromJson(data));
+    return _response.then(
+      (data) => GetPeopleResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Provides a list of domain profiles and domain contacts in the
@@ -1149,7 +1184,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDirectoryPeopleResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDirectoryPeopleResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Provides a list of domain profiles and domain contacts in the
@@ -1243,8 +1281,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SearchDirectoryPeopleResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchDirectoryPeopleResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update contact data for an existing contact person. Any non-contact data
@@ -1350,7 +1390,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Person.fromJson(data));
+    return _response.then(
+      (data) => Person.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a contact's photo.
@@ -1407,7 +1449,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UpdateContactPhotoResponse.fromJson(data));
+    return _response.then(
+      (data) => UpdateContactPhotoResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1546,7 +1591,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListConnectionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListConnectionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1615,7 +1663,8 @@
       formattedValue = _json['formattedValue'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('poBox')) {
       poBox = _json['poBox'] as core.String;
@@ -1696,7 +1745,8 @@
       ageRange = _json['ageRange'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1722,8 +1772,8 @@
   BatchGetContactGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<ContactGroupResponse>(
-              (value) => ContactGroupResponse.fromJson(value))
+          .map<ContactGroupResponse>((value) => ContactGroupResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1759,7 +1809,8 @@
       contentType = _json['contentType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -1798,10 +1849,12 @@
 
   Birthday.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -1835,7 +1888,8 @@
 
   BraggingRights.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -1877,7 +1931,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -1924,7 +1979,8 @@
       key = _json['key'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -2006,7 +2062,8 @@
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = ContactGroupMetadata.fromJson(_json['metadata']);
+      metadata = ContactGroupMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2132,13 +2189,15 @@
 
   ContactGroupResponse.fromJson(core.Map _json) {
     if (_json.containsKey('contactGroup')) {
-      contactGroup = ContactGroup.fromJson(_json['contactGroup']);
+      contactGroup = ContactGroup.fromJson(
+          _json['contactGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestedResourceName')) {
       requestedResourceName = _json['requestedResourceName'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2229,7 +2288,8 @@
       default_ = _json['default'] as core.bool;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -2260,7 +2320,8 @@
 
   CreateContactGroupRequest.fromJson(core.Map _json) {
     if (_json.containsKey('contactGroup')) {
-      contactGroup = ContactGroup.fromJson(_json['contactGroup']);
+      contactGroup = ContactGroup.fromJson(
+          _json['contactGroup'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2334,7 +2395,8 @@
 
   DeleteContactPhotoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('person')) {
-      person = Person.fromJson(_json['person']);
+      person = Person.fromJson(
+          _json['person'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2398,7 +2460,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -2467,13 +2530,15 @@
 
   Event.fromJson(core.Map _json) {
     if (_json.containsKey('date')) {
-      date = Date.fromJson(_json['date']);
+      date =
+          Date.fromJson(_json['date'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('formattedType')) {
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -2522,7 +2587,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -2571,7 +2637,8 @@
       primary = _json['primary'] as core.bool;
     }
     if (_json.containsKey('source')) {
-      source = Source.fromJson(_json['source']);
+      source = Source.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('verified')) {
       verified = _json['verified'] as core.bool;
@@ -2605,7 +2672,8 @@
 
   FileAs.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -2653,7 +2721,8 @@
       formattedValue = _json['formattedValue'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -2688,7 +2757,8 @@
   GetPeopleResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<PersonResponse>((value) => PersonResponse.fromJson(value))
+          .map<PersonResponse>((value) => PersonResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2737,7 +2807,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protocol')) {
       protocol = _json['protocol'] as core.String;
@@ -2786,7 +2857,8 @@
 
   Interest.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -2832,7 +2904,8 @@
   ListConnectionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('connections')) {
       connections = (_json['connections'] as core.List)
-          .map<Person>((value) => Person.fromJson(value))
+          .map<Person>((value) =>
+              Person.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2891,7 +2964,8 @@
   ListContactGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('contactGroups')) {
       contactGroups = (_json['contactGroups'] as core.List)
-          .map<ContactGroup>((value) => ContactGroup.fromJson(value))
+          .map<ContactGroup>((value) => ContactGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2949,7 +3023,8 @@
     }
     if (_json.containsKey('people')) {
       people = (_json['people'] as core.List)
-          .map<Person>((value) => Person.fromJson(value))
+          .map<Person>((value) =>
+              Person.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2996,7 +3071,8 @@
     }
     if (_json.containsKey('otherContacts')) {
       otherContacts = (_json['otherContacts'] as core.List)
-          .map<Person>((value) => Person.fromJson(value))
+          .map<Person>((value) =>
+              Person.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3030,7 +3106,8 @@
 
   Locale.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -3095,7 +3172,8 @@
       floorSection = _json['floorSection'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -3151,14 +3229,17 @@
 
   Membership.fromJson(core.Map _json) {
     if (_json.containsKey('contactGroupMembership')) {
-      contactGroupMembership =
-          ContactGroupMembership.fromJson(_json['contactGroupMembership']);
+      contactGroupMembership = ContactGroupMembership.fromJson(
+          _json['contactGroupMembership']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('domainMembership')) {
-      domainMembership = DomainMembership.fromJson(_json['domainMembership']);
+      domainMembership = DomainMembership.fromJson(
+          _json['domainMembership'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3213,7 +3294,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -3390,7 +3472,8 @@
       honorificSuffix = _json['honorificSuffix'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('middleName')) {
       middleName = _json['middleName'] as core.String;
@@ -3494,7 +3577,8 @@
 
   Nickname.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -3531,7 +3615,8 @@
 
   Occupation.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -3613,7 +3698,8 @@
       domain = _json['domain'] as core.String;
     }
     if (_json.containsKey('endDate')) {
-      endDate = Date.fromJson(_json['endDate']);
+      endDate = Date.fromJson(
+          _json['endDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('formattedType')) {
       formattedType = _json['formattedType'] as core.String;
@@ -3625,7 +3711,8 @@
       location = _json['location'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3634,7 +3721,8 @@
       phoneticName = _json['phoneticName'] as core.String;
     }
     if (_json.containsKey('startDate')) {
-      startDate = Date.fromJson(_json['startDate']);
+      startDate = Date.fromJson(
+          _json['startDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('symbol')) {
       symbol = _json['symbol'] as core.String;
@@ -3832,7 +3920,8 @@
   Person.fromJson(core.Map _json) {
     if (_json.containsKey('addresses')) {
       addresses = (_json['addresses'] as core.List)
-          .map<Address>((value) => Address.fromJson(value))
+          .map<Address>((value) =>
+              Address.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('ageRange')) {
@@ -3840,42 +3929,50 @@
     }
     if (_json.containsKey('ageRanges')) {
       ageRanges = (_json['ageRanges'] as core.List)
-          .map<AgeRangeType>((value) => AgeRangeType.fromJson(value))
+          .map<AgeRangeType>((value) => AgeRangeType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('biographies')) {
       biographies = (_json['biographies'] as core.List)
-          .map<Biography>((value) => Biography.fromJson(value))
+          .map<Biography>((value) =>
+              Biography.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('birthdays')) {
       birthdays = (_json['birthdays'] as core.List)
-          .map<Birthday>((value) => Birthday.fromJson(value))
+          .map<Birthday>((value) =>
+              Birthday.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('braggingRights')) {
       braggingRights = (_json['braggingRights'] as core.List)
-          .map<BraggingRights>((value) => BraggingRights.fromJson(value))
+          .map<BraggingRights>((value) => BraggingRights.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('calendarUrls')) {
       calendarUrls = (_json['calendarUrls'] as core.List)
-          .map<CalendarUrl>((value) => CalendarUrl.fromJson(value))
+          .map<CalendarUrl>((value) => CalendarUrl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('clientData')) {
       clientData = (_json['clientData'] as core.List)
-          .map<ClientData>((value) => ClientData.fromJson(value))
+          .map<ClientData>((value) =>
+              ClientData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('coverPhotos')) {
       coverPhotos = (_json['coverPhotos'] as core.List)
-          .map<CoverPhoto>((value) => CoverPhoto.fromJson(value))
+          .map<CoverPhoto>((value) =>
+              CoverPhoto.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('emailAddresses')) {
       emailAddresses = (_json['emailAddresses'] as core.List)
-          .map<EmailAddress>((value) => EmailAddress.fromJson(value))
+          .map<EmailAddress>((value) => EmailAddress.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -3883,107 +3980,126 @@
     }
     if (_json.containsKey('events')) {
       events = (_json['events'] as core.List)
-          .map<Event>((value) => Event.fromJson(value))
+          .map<Event>((value) =>
+              Event.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('externalIds')) {
       externalIds = (_json['externalIds'] as core.List)
-          .map<ExternalId>((value) => ExternalId.fromJson(value))
+          .map<ExternalId>((value) =>
+              ExternalId.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fileAses')) {
       fileAses = (_json['fileAses'] as core.List)
-          .map<FileAs>((value) => FileAs.fromJson(value))
+          .map<FileAs>((value) =>
+              FileAs.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('genders')) {
       genders = (_json['genders'] as core.List)
-          .map<Gender>((value) => Gender.fromJson(value))
+          .map<Gender>((value) =>
+              Gender.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imClients')) {
       imClients = (_json['imClients'] as core.List)
-          .map<ImClient>((value) => ImClient.fromJson(value))
+          .map<ImClient>((value) =>
+              ImClient.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('interests')) {
       interests = (_json['interests'] as core.List)
-          .map<Interest>((value) => Interest.fromJson(value))
+          .map<Interest>((value) =>
+              Interest.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('locales')) {
       locales = (_json['locales'] as core.List)
-          .map<Locale>((value) => Locale.fromJson(value))
+          .map<Locale>((value) =>
+              Locale.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('memberships')) {
       memberships = (_json['memberships'] as core.List)
-          .map<Membership>((value) => Membership.fromJson(value))
+          .map<Membership>((value) =>
+              Membership.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
-      metadata = PersonMetadata.fromJson(_json['metadata']);
+      metadata = PersonMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('miscKeywords')) {
       miscKeywords = (_json['miscKeywords'] as core.List)
-          .map<MiscKeyword>((value) => MiscKeyword.fromJson(value))
+          .map<MiscKeyword>((value) => MiscKeyword.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('names')) {
       names = (_json['names'] as core.List)
-          .map<Name>((value) => Name.fromJson(value))
+          .map<Name>((value) =>
+              Name.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nicknames')) {
       nicknames = (_json['nicknames'] as core.List)
-          .map<Nickname>((value) => Nickname.fromJson(value))
+          .map<Nickname>((value) =>
+              Nickname.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('occupations')) {
       occupations = (_json['occupations'] as core.List)
-          .map<Occupation>((value) => Occupation.fromJson(value))
+          .map<Occupation>((value) =>
+              Occupation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('organizations')) {
       organizations = (_json['organizations'] as core.List)
-          .map<Organization>((value) => Organization.fromJson(value))
+          .map<Organization>((value) => Organization.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('phoneNumbers')) {
       phoneNumbers = (_json['phoneNumbers'] as core.List)
-          .map<PhoneNumber>((value) => PhoneNumber.fromJson(value))
+          .map<PhoneNumber>((value) => PhoneNumber.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('photos')) {
       photos = (_json['photos'] as core.List)
-          .map<Photo>((value) => Photo.fromJson(value))
+          .map<Photo>((value) =>
+              Photo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('relations')) {
       relations = (_json['relations'] as core.List)
-          .map<Relation>((value) => Relation.fromJson(value))
+          .map<Relation>((value) =>
+              Relation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('relationshipInterests')) {
       relationshipInterests = (_json['relationshipInterests'] as core.List)
-          .map<RelationshipInterest>(
-              (value) => RelationshipInterest.fromJson(value))
+          .map<RelationshipInterest>((value) => RelationshipInterest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('relationshipStatuses')) {
       relationshipStatuses = (_json['relationshipStatuses'] as core.List)
-          .map<RelationshipStatus>(
-              (value) => RelationshipStatus.fromJson(value))
+          .map<RelationshipStatus>((value) => RelationshipStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('residences')) {
       residences = (_json['residences'] as core.List)
-          .map<Residence>((value) => Residence.fromJson(value))
+          .map<Residence>((value) =>
+              Residence.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resourceName')) {
@@ -3991,27 +4107,32 @@
     }
     if (_json.containsKey('sipAddresses')) {
       sipAddresses = (_json['sipAddresses'] as core.List)
-          .map<SipAddress>((value) => SipAddress.fromJson(value))
+          .map<SipAddress>((value) =>
+              SipAddress.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('skills')) {
       skills = (_json['skills'] as core.List)
-          .map<Skill>((value) => Skill.fromJson(value))
+          .map<Skill>((value) =>
+              Skill.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('taglines')) {
       taglines = (_json['taglines'] as core.List)
-          .map<Tagline>((value) => Tagline.fromJson(value))
+          .map<Tagline>((value) =>
+              Tagline.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('urls')) {
       urls = (_json['urls'] as core.List)
-          .map<Url>((value) => Url.fromJson(value))
+          .map<Url>((value) =>
+              Url.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('userDefined')) {
       userDefined = (_json['userDefined'] as core.List)
-          .map<UserDefined>((value) => UserDefined.fromJson(value))
+          .map<UserDefined>((value) => UserDefined.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4202,7 +4323,8 @@
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<Source>((value) => Source.fromJson(value))
+          .map<Source>((value) =>
+              Source.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4253,13 +4375,15 @@
       httpStatusCode = _json['httpStatusCode'] as core.int;
     }
     if (_json.containsKey('person')) {
-      person = Person.fromJson(_json['person']);
+      person = Person.fromJson(
+          _json['person'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestedResourceName')) {
       requestedResourceName = _json['requestedResourceName'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4314,7 +4438,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -4368,7 +4493,8 @@
       default_ = _json['default'] as core.bool;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -4453,7 +4579,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('person')) {
       person = _json['person'] as core.String;
@@ -4503,7 +4630,8 @@
       formattedValue = _json['formattedValue'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -4548,7 +4676,8 @@
       formattedValue = _json['formattedValue'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -4590,7 +4719,8 @@
       current = _json['current'] as core.bool;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -4633,7 +4763,8 @@
     }
     if (_json.containsKey('people')) {
       people = (_json['people'] as core.List)
-          .map<Person>((value) => Person.fromJson(value))
+          .map<Person>((value) =>
+              Person.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalSize')) {
@@ -4681,7 +4812,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -4721,7 +4853,8 @@
 
   Skill.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -4788,7 +4921,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('profileMetadata')) {
-      profileMetadata = ProfileMetadata.fromJson(_json['profileMetadata']);
+      profileMetadata = ProfileMetadata.fromJson(
+          _json['profileMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -4851,7 +4985,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -4888,7 +5023,8 @@
 
   Tagline.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
@@ -4917,7 +5053,8 @@
 
   UpdateContactGroupRequest.fromJson(core.Map _json) {
     if (_json.containsKey('contactGroup')) {
-      contactGroup = ContactGroup.fromJson(_json['contactGroup']);
+      contactGroup = ContactGroup.fromJson(
+          _json['contactGroup'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4999,7 +5136,8 @@
 
   UpdateContactPhotoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('person')) {
-      person = Person.fromJson(_json['person']);
+      person = Person.fromJson(
+          _json['person'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5037,7 +5175,8 @@
       formattedType = _json['formattedType'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -5083,7 +5222,8 @@
       key = _json['key'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = FieldMetadata.fromJson(_json['metadata']);
+      metadata = FieldMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('value')) {
       value = _json['value'] as core.String;
diff --git a/generated/googleapis/lib/playcustomapp/v1.dart b/generated/googleapis/lib/playcustomapp/v1.dart
index a50ad8c..a80ee47 100644
--- a/generated/googleapis/lib/playcustomapp/v1.dart
+++ b/generated/googleapis/lib/playcustomapp/v1.dart
@@ -135,7 +135,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomApp.fromJson(data));
+    return _response.then(
+      (data) => CustomApp.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
diff --git a/generated/googleapis/lib/policytroubleshooter/v1.dart b/generated/googleapis/lib/policytroubleshooter/v1.dart
index c806992..889f831 100644
--- a/generated/googleapis/lib/policytroubleshooter/v1.dart
+++ b/generated/googleapis/lib/policytroubleshooter/v1.dart
@@ -99,9 +99,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse.fromJson(
-            data));
+    return _response.then(
+      (data) => GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse
+          .fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -242,15 +243,17 @@
       access = _json['access'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = GoogleTypeExpr.fromJson(_json['condition']);
+      condition = GoogleTypeExpr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('memberships')) {
       memberships = commons.mapMap<core.Map,
               GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership>(
-          _json['memberships'].cast<core.String, core.Map>(),
+          (_json['memberships'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
           (core.Map item) =>
               GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership
-                  .fromJson(item));
+                  .fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('relevance')) {
       relevance = _json['relevance'] as core.String;
@@ -407,14 +410,15 @@
       bindingExplanations = (_json['bindingExplanations'] as core.List)
           .map<GoogleCloudPolicytroubleshooterV1BindingExplanation>((value) =>
               GoogleCloudPolicytroubleshooterV1BindingExplanation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullResourceName')) {
       fullResourceName = _json['fullResourceName'] as core.String;
     }
     if (_json.containsKey('policy')) {
-      policy = GoogleIamV1Policy.fromJson(_json['policy']);
+      policy = GoogleIamV1Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('relevance')) {
       relevance = _json['relevance'] as core.String;
@@ -455,7 +459,7 @@
       core.Map _json) {
     if (_json.containsKey('accessTuple')) {
       accessTuple = GoogleCloudPolicytroubleshooterV1AccessTuple.fromJson(
-          _json['accessTuple']);
+          _json['accessTuple'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -502,7 +506,8 @@
     if (_json.containsKey('explainedPolicies')) {
       explainedPolicies = (_json['explainedPolicies'] as core.List)
           .map<GoogleCloudPolicytroubleshooterV1ExplainedPolicy>((value) =>
-              GoogleCloudPolicytroubleshooterV1ExplainedPolicy.fromJson(value))
+              GoogleCloudPolicytroubleshooterV1ExplainedPolicy.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -550,8 +555,9 @@
   GoogleIamV1AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<GoogleIamV1AuditLogConfig>(
-              (value) => GoogleIamV1AuditLogConfig.fromJson(value))
+          .map<GoogleIamV1AuditLogConfig>((value) =>
+              GoogleIamV1AuditLogConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -665,7 +671,8 @@
 
   GoogleIamV1Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = GoogleTypeExpr.fromJson(_json['condition']);
+      condition = GoogleTypeExpr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -771,14 +778,15 @@
   GoogleIamV1Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<GoogleIamV1AuditConfig>(
-              (value) => GoogleIamV1AuditConfig.fromJson(value))
+          .map<GoogleIamV1AuditConfig>((value) =>
+              GoogleIamV1AuditConfig.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<GoogleIamV1Binding>(
-              (value) => GoogleIamV1Binding.fromJson(value))
+          .map<GoogleIamV1Binding>((value) => GoogleIamV1Binding.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
diff --git a/generated/googleapis/lib/poly/v1.dart b/generated/googleapis/lib/poly/v1.dart
index 71c99b0..a3a3b94 100644
--- a/generated/googleapis/lib/poly/v1.dart
+++ b/generated/googleapis/lib/poly/v1.dart
@@ -100,7 +100,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Asset.fromJson(data));
+    return _response.then(
+      (data) => Asset.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all public, remixable assets. These are assets with an access level
@@ -218,7 +220,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAssetsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAssetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -338,7 +343,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListUserAssetsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUserAssetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -434,7 +442,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLikedAssetsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLikedAssetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -536,7 +547,8 @@
     }
     if (_json.containsKey('formats')) {
       formats = (_json['formats'] as core.List)
-          .map<Format>((value) => Format.fromJson(value))
+          .map<Format>((value) =>
+              Format.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('isCurated')) {
@@ -552,14 +564,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('presentationParams')) {
-      presentationParams =
-          PresentationParams.fromJson(_json['presentationParams']);
+      presentationParams = PresentationParams.fromJson(
+          _json['presentationParams'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('remixInfo')) {
-      remixInfo = RemixInfo.fromJson(_json['remixInfo']);
+      remixInfo = RemixInfo.fromJson(
+          _json['remixInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('thumbnail')) {
-      thumbnail = File.fromJson(_json['thumbnail']);
+      thumbnail = File.fromJson(
+          _json['thumbnail'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -672,10 +686,12 @@
       filePath = _json['filePath'] as core.String;
     }
     if (_json.containsKey('imageError')) {
-      imageError = ImageError.fromJson(_json['imageError']);
+      imageError = ImageError.fromJson(
+          _json['imageError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objParseError')) {
-      objParseError = ObjParseError.fromJson(_json['objParseError']);
+      objParseError = ObjParseError.fromJson(
+          _json['objParseError'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -774,18 +790,21 @@
 
   Format.fromJson(core.Map _json) {
     if (_json.containsKey('formatComplexity')) {
-      formatComplexity = FormatComplexity.fromJson(_json['formatComplexity']);
+      formatComplexity = FormatComplexity.fromJson(
+          _json['formatComplexity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('formatType')) {
       formatType = _json['formatType'] as core.String;
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<File>((value) => File.fromJson(value))
+          .map<File>((value) =>
+              File.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('root')) {
-      root = File.fromJson(_json['root']);
+      root =
+          File.fromJson(_json['root'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -898,7 +917,8 @@
   ListAssetsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assets')) {
       assets = (_json['assets'] as core.List)
-          .map<Asset>((value) => Asset.fromJson(value))
+          .map<Asset>((value) =>
+              Asset.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -943,7 +963,8 @@
   ListLikedAssetsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('assets')) {
       assets = (_json['assets'] as core.List)
-          .map<Asset>((value) => Asset.fromJson(value))
+          .map<Asset>((value) =>
+              Asset.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -994,7 +1015,8 @@
     }
     if (_json.containsKey('userAssets')) {
       userAssets = (_json['userAssets'] as core.List)
-          .map<UserAsset>((value) => UserAsset.fromJson(value))
+          .map<UserAsset>((value) =>
+              UserAsset.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1173,7 +1195,8 @@
       colorSpace = _json['colorSpace'] as core.String;
     }
     if (_json.containsKey('orientingRotation')) {
-      orientingRotation = Quaternion.fromJson(_json['orientingRotation']);
+      orientingRotation = Quaternion.fromJson(
+          _json['orientingRotation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1299,8 +1322,8 @@
     }
     if (_json.containsKey('assetImportMessages')) {
       assetImportMessages = (_json['assetImportMessages'] as core.List)
-          .map<AssetImportMessage>(
-              (value) => AssetImportMessage.fromJson(value))
+          .map<AssetImportMessage>((value) => AssetImportMessage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('publishUrl')) {
@@ -1336,7 +1359,8 @@
 
   UserAsset.fromJson(core.Map _json) {
     if (_json.containsKey('asset')) {
-      asset = Asset.fromJson(_json['asset']);
+      asset =
+          Asset.fromJson(_json['asset'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/pubsub/v1.dart b/generated/googleapis/lib/pubsub/v1.dart
index 759dce1..c85f197 100644
--- a/generated/googleapis/lib/pubsub/v1.dart
+++ b/generated/googleapis/lib/pubsub/v1.dart
@@ -139,7 +139,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Snapshot.fromJson(data));
+    return _response.then(
+      (data) => Snapshot.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes an existing snapshot. Snapshots are used in [Seek]
@@ -197,7 +199,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the configuration details of a snapshot. Snapshots are used in Seek
@@ -250,7 +254,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Snapshot.fromJson(data));
+    return _response.then(
+      (data) => Snapshot.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -318,7 +324,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the existing snapshots. Snapshots are used in [Seek](
@@ -388,7 +396,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSnapshotsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSnapshotsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing snapshot. Snapshots are used in Seek operations, which
@@ -446,7 +457,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Snapshot.fromJson(data));
+    return _response.then(
+      (data) => Snapshot.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -507,7 +520,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -570,7 +585,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -639,7 +657,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a subscription to a given topic. See the [resource name rules]
@@ -707,7 +727,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an existing subscription. All messages retained in the
@@ -761,7 +784,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Detaches a subscription from this topic. All messages retained in the
@@ -816,7 +841,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DetachSubscriptionResponse.fromJson(data));
+    return _response.then(
+      (data) => DetachSubscriptionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the configuration details of a subscription.
@@ -866,7 +894,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -934,7 +965,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists matching subscriptions.
@@ -1000,7 +1033,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSubscriptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSubscriptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the ack deadline for a specific message. This method is useful to
@@ -1062,7 +1098,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies the `PushConfig` for a specified subscription. This may be used
@@ -1124,7 +1162,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing subscription. Note that certain properties of a
@@ -1185,7 +1225,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Pulls messages from the server. The server may return `UNAVAILABLE` if
@@ -1245,7 +1288,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PullResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          PullResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Seeks an existing subscription to a point in time or to a given snapshot,
@@ -1308,7 +1354,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SeekResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          SeekResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1369,7 +1418,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1432,7 +1483,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1504,7 +1558,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Topic.fromJson(data));
+    return _response.then(
+      (data) => Topic.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the topic with the given name. Returns `NOT_FOUND` if the topic
@@ -1558,7 +1614,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the configuration of a topic.
@@ -1608,7 +1666,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Topic.fromJson(data));
+    return _response.then(
+      (data) => Topic.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -1676,7 +1736,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists matching topics.
@@ -1741,7 +1803,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTopicsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTopicsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing topic. Note that certain properties of a topic are not
@@ -1802,7 +1867,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Topic.fromJson(data));
+    return _response.then(
+      (data) => Topic.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds one or more messages to the topic. Returns `NOT_FOUND` if the topic
@@ -1859,7 +1926,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PublishResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          PublishResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1920,7 +1990,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1983,7 +2055,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2059,7 +2134,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTopicSnapshotsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTopicSnapshotsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2133,8 +2211,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListTopicSubscriptionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTopicSubscriptionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2221,7 +2301,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -2271,7 +2352,8 @@
   CreateSnapshotRequest.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('subscription')) {
@@ -2483,7 +2565,8 @@
     }
     if (_json.containsKey('snapshots')) {
       snapshots = (_json['snapshots'] as core.List)
-          .map<Snapshot>((value) => Snapshot.fromJson(value))
+          .map<Snapshot>((value) =>
+              Snapshot.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2518,7 +2601,8 @@
     }
     if (_json.containsKey('subscriptions')) {
       subscriptions = (_json['subscriptions'] as core.List)
-          .map<Subscription>((value) => Subscription.fromJson(value))
+          .map<Subscription>((value) => Subscription.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2623,7 +2707,8 @@
     }
     if (_json.containsKey('topics')) {
       topics = (_json['topics'] as core.List)
-          .map<Topic>((value) => Topic.fromJson(value))
+          .map<Topic>((value) =>
+              Topic.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2722,7 +2807,8 @@
 
   ModifyPushConfigRequest.fromJson(core.Map _json) {
     if (_json.containsKey('pushConfig')) {
-      pushConfig = PushConfig.fromJson(_json['pushConfig']);
+      pushConfig = PushConfig.fromJson(
+          _json['pushConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2852,7 +2938,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -2888,7 +2975,8 @@
   PublishRequest.fromJson(core.Map _json) {
     if (_json.containsKey('messages')) {
       messages = (_json['messages'] as core.List)
-          .map<PubsubMessage>((value) => PubsubMessage.fromJson(value))
+          .map<PubsubMessage>((value) => PubsubMessage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2975,7 +3063,8 @@
   PubsubMessage.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
       attributes = commons.mapMap<core.String, core.String>(
-          _json['attributes'].cast<core.String, core.String>(),
+          (_json['attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('data')) {
@@ -3065,7 +3154,8 @@
   PullResponse.fromJson(core.Map _json) {
     if (_json.containsKey('receivedMessages')) {
       receivedMessages = (_json['receivedMessages'] as core.List)
-          .map<ReceivedMessage>((value) => ReceivedMessage.fromJson(value))
+          .map<ReceivedMessage>((value) => ReceivedMessage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3111,11 +3201,13 @@
   PushConfig.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
       attributes = commons.mapMap<core.String, core.String>(
-          _json['attributes'].cast<core.String, core.String>(),
+          (_json['attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('oidcToken')) {
-      oidcToken = OidcToken.fromJson(_json['oidcToken']);
+      oidcToken = OidcToken.fromJson(
+          _json['oidcToken'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pushEndpoint')) {
       pushEndpoint = _json['pushEndpoint'] as core.String;
@@ -3168,7 +3260,8 @@
       deliveryAttempt = _json['deliveryAttempt'] as core.int;
     }
     if (_json.containsKey('message')) {
-      message = PubsubMessage.fromJson(_json['message']);
+      message = PubsubMessage.fromJson(
+          _json['message'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3294,7 +3387,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3343,7 +3437,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -3476,7 +3571,8 @@
       ackDeadlineSeconds = _json['ackDeadlineSeconds'] as core.int;
     }
     if (_json.containsKey('deadLetterPolicy')) {
-      deadLetterPolicy = DeadLetterPolicy.fromJson(_json['deadLetterPolicy']);
+      deadLetterPolicy = DeadLetterPolicy.fromJson(
+          _json['deadLetterPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detached')) {
       detached = _json['detached'] as core.bool;
@@ -3485,14 +3581,16 @@
       enableMessageOrdering = _json['enableMessageOrdering'] as core.bool;
     }
     if (_json.containsKey('expirationPolicy')) {
-      expirationPolicy = ExpirationPolicy.fromJson(_json['expirationPolicy']);
+      expirationPolicy = ExpirationPolicy.fromJson(
+          _json['expirationPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filter')) {
       filter = _json['filter'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('messageRetentionDuration')) {
@@ -3503,13 +3601,15 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pushConfig')) {
-      pushConfig = PushConfig.fromJson(_json['pushConfig']);
+      pushConfig = PushConfig.fromJson(
+          _json['pushConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retainAckedMessages')) {
       retainAckedMessages = _json['retainAckedMessages'] as core.bool;
     }
     if (_json.containsKey('retryPolicy')) {
-      retryPolicy = RetryPolicy.fromJson(_json['retryPolicy']);
+      retryPolicy = RetryPolicy.fromJson(
+          _json['retryPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('topic')) {
       topic = _json['topic'] as core.String;
@@ -3645,12 +3745,13 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('messageStoragePolicy')) {
-      messageStoragePolicy =
-          MessageStoragePolicy.fromJson(_json['messageStoragePolicy']);
+      messageStoragePolicy = MessageStoragePolicy.fromJson(
+          _json['messageStoragePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3688,7 +3789,8 @@
 
   UpdateSnapshotRequest.fromJson(core.Map _json) {
     if (_json.containsKey('snapshot')) {
-      snapshot = Snapshot.fromJson(_json['snapshot']);
+      snapshot = Snapshot.fromJson(
+          _json['snapshot'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -3720,7 +3822,8 @@
 
   UpdateSubscriptionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('subscription')) {
-      subscription = Subscription.fromJson(_json['subscription']);
+      subscription = Subscription.fromJson(
+          _json['subscription'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -3755,7 +3858,8 @@
 
   UpdateTopicRequest.fromJson(core.Map _json) {
     if (_json.containsKey('topic')) {
-      topic = Topic.fromJson(_json['topic']);
+      topic =
+          Topic.fromJson(_json['topic'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
diff --git a/generated/googleapis/lib/recommender/v1.dart b/generated/googleapis/lib/recommender/v1.dart
index 90cd918..480156d 100644
--- a/generated/googleapis/lib/recommender/v1.dart
+++ b/generated/googleapis/lib/recommender/v1.dart
@@ -131,8 +131,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudRecommenderV1Insight.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudRecommenderV1Insight.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists insights for a Cloud project. Requires the recommender.*.list IAM
@@ -215,7 +217,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => GoogleCloudRecommenderV1ListInsightsResponse.fromJson(data));
+      (data) => GoogleCloudRecommenderV1ListInsightsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks the Insight State as Accepted. Users can use this method to indicate
@@ -277,8 +281,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudRecommenderV1Insight.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudRecommenderV1Insight.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -347,8 +353,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudRecommenderV1Recommendation.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudRecommenderV1Recommendation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists recommendations for a Cloud project. Requires the recommender.*.list
@@ -432,8 +440,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        GoogleCloudRecommenderV1ListRecommendationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudRecommenderV1ListRecommendationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks the Recommendation State as Claimed. Users can use this method to
@@ -496,8 +506,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudRecommenderV1Recommendation.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudRecommenderV1Recommendation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks the Recommendation State as Failed. Users can use this method to
@@ -560,8 +572,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudRecommenderV1Recommendation.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudRecommenderV1Recommendation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Marks the Recommendation State as Succeeded. Users can use this method to
@@ -626,8 +640,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleCloudRecommenderV1Recommendation.fromJson(data));
+    return _response.then(
+      (data) => GoogleCloudRecommenderV1Recommendation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -645,7 +661,8 @@
 
   GoogleCloudRecommenderV1CostProjection.fromJson(core.Map _json) {
     if (_json.containsKey('cost')) {
-      cost = GoogleTypeMoney.fromJson(_json['cost']);
+      cost = GoogleTypeMoney.fromJson(
+          _json['cost'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duration')) {
       duration = _json['duration'] as core.String;
@@ -689,7 +706,7 @@
     }
     if (_json.containsKey('costProjection')) {
       costProjection = GoogleCloudRecommenderV1CostProjection.fromJson(
-          _json['costProjection']);
+          _json['costProjection'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -765,7 +782,7 @@
               as core.List)
           .map<GoogleCloudRecommenderV1InsightRecommendationReference>(
               (value) => GoogleCloudRecommenderV1InsightRecommendationReference
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('category')) {
@@ -773,7 +790,8 @@
     }
     if (_json.containsKey('content')) {
       content = commons.mapMap<core.Object, core.Object>(
-          _json['content'].cast<core.String, core.Object>(),
+          (_json['content'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('description')) {
@@ -795,8 +813,8 @@
       observationPeriod = _json['observationPeriod'] as core.String;
     }
     if (_json.containsKey('stateInfo')) {
-      stateInfo =
-          GoogleCloudRecommenderV1InsightStateInfo.fromJson(_json['stateInfo']);
+      stateInfo = GoogleCloudRecommenderV1InsightStateInfo.fromJson(
+          _json['stateInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetResources')) {
       targetResources = (_json['targetResources'] as core.List)
@@ -896,7 +914,8 @@
     }
     if (_json.containsKey('stateMetadata')) {
       stateMetadata = commons.mapMap<core.String, core.String>(
-          _json['stateMetadata'].cast<core.String, core.String>(),
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -927,8 +946,9 @@
   GoogleCloudRecommenderV1ListInsightsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('insights')) {
       insights = (_json['insights'] as core.List)
-          .map<GoogleCloudRecommenderV1Insight>(
-              (value) => GoogleCloudRecommenderV1Insight.fromJson(value))
+          .map<GoogleCloudRecommenderV1Insight>((value) =>
+              GoogleCloudRecommenderV1Insight.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -965,8 +985,9 @@
     }
     if (_json.containsKey('recommendations')) {
       recommendations = (_json['recommendations'] as core.List)
-          .map<GoogleCloudRecommenderV1Recommendation>(
-              (value) => GoogleCloudRecommenderV1Recommendation.fromJson(value))
+          .map<GoogleCloudRecommenderV1Recommendation>((value) =>
+              GoogleCloudRecommenderV1Recommendation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1001,7 +1022,8 @@
     }
     if (_json.containsKey('stateMetadata')) {
       stateMetadata = commons.mapMap<core.String, core.String>(
-          _json['stateMetadata'].cast<core.String, core.String>(),
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -1037,7 +1059,8 @@
     }
     if (_json.containsKey('stateMetadata')) {
       stateMetadata = commons.mapMap<core.String, core.String>(
-          _json['stateMetadata'].cast<core.String, core.String>(),
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -1073,7 +1096,8 @@
     }
     if (_json.containsKey('stateMetadata')) {
       stateMetadata = commons.mapMap<core.String, core.String>(
-          _json['stateMetadata'].cast<core.String, core.String>(),
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -1109,7 +1133,8 @@
     }
     if (_json.containsKey('stateMetadata')) {
       stateMetadata = commons.mapMap<core.String, core.String>(
-          _json['stateMetadata'].cast<core.String, core.String>(),
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -1207,15 +1232,18 @@
     }
     if (_json.containsKey('pathFilters')) {
       pathFilters = commons.mapMap<core.Object, core.Object>(
-          _json['pathFilters'].cast<core.String, core.Object>(),
+          (_json['pathFilters'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('pathValueMatchers')) {
       pathValueMatchers =
           commons.mapMap<core.Map, GoogleCloudRecommenderV1ValueMatcher>(
-              _json['pathValueMatchers'].cast<core.String, core.Map>(),
-              (core.Map item) =>
-                  GoogleCloudRecommenderV1ValueMatcher.fromJson(item));
+              (_json['pathValueMatchers']
+                      as core.Map<core.String, core.dynamic>)
+                  .cast<core.String, core.Map>(),
+              (core.Map item) => GoogleCloudRecommenderV1ValueMatcher.fromJson(
+                  item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('resource')) {
       resource = _json['resource'] as core.String;
@@ -1233,8 +1261,8 @@
       value = _json['value'] as core.Object;
     }
     if (_json.containsKey('valueMatcher')) {
-      valueMatcher =
-          GoogleCloudRecommenderV1ValueMatcher.fromJson(_json['valueMatcher']);
+      valueMatcher = GoogleCloudRecommenderV1ValueMatcher.fromJson(
+          _json['valueMatcher'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1288,8 +1316,9 @@
   GoogleCloudRecommenderV1OperationGroup.fromJson(core.Map _json) {
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleCloudRecommenderV1Operation>(
-              (value) => GoogleCloudRecommenderV1Operation.fromJson(value))
+          .map<GoogleCloudRecommenderV1Operation>((value) =>
+              GoogleCloudRecommenderV1Operation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1354,20 +1383,21 @@
   GoogleCloudRecommenderV1Recommendation.fromJson(core.Map _json) {
     if (_json.containsKey('additionalImpact')) {
       additionalImpact = (_json['additionalImpact'] as core.List)
-          .map<GoogleCloudRecommenderV1Impact>(
-              (value) => GoogleCloudRecommenderV1Impact.fromJson(value))
+          .map<GoogleCloudRecommenderV1Impact>((value) =>
+              GoogleCloudRecommenderV1Impact.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('associatedInsights')) {
       associatedInsights = (_json['associatedInsights'] as core.List)
           .map<GoogleCloudRecommenderV1RecommendationInsightReference>(
               (value) => GoogleCloudRecommenderV1RecommendationInsightReference
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('content')) {
       content = GoogleCloudRecommenderV1RecommendationContent.fromJson(
-          _json['content']);
+          _json['content'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('description')) {
       description = _json['description'] as core.String;
@@ -1382,15 +1412,15 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('primaryImpact')) {
-      primaryImpact =
-          GoogleCloudRecommenderV1Impact.fromJson(_json['primaryImpact']);
+      primaryImpact = GoogleCloudRecommenderV1Impact.fromJson(
+          _json['primaryImpact'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recommenderSubtype')) {
       recommenderSubtype = _json['recommenderSubtype'] as core.String;
     }
     if (_json.containsKey('stateInfo')) {
       stateInfo = GoogleCloudRecommenderV1RecommendationStateInfo.fromJson(
-          _json['stateInfo']);
+          _json['stateInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1444,8 +1474,9 @@
   GoogleCloudRecommenderV1RecommendationContent.fromJson(core.Map _json) {
     if (_json.containsKey('operationGroups')) {
       operationGroups = (_json['operationGroups'] as core.List)
-          .map<GoogleCloudRecommenderV1OperationGroup>(
-              (value) => GoogleCloudRecommenderV1OperationGroup.fromJson(value))
+          .map<GoogleCloudRecommenderV1OperationGroup>((value) =>
+              GoogleCloudRecommenderV1OperationGroup.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1517,7 +1548,8 @@
     }
     if (_json.containsKey('stateMetadata')) {
       stateMetadata = commons.mapMap<core.String, core.String>(
-          _json['stateMetadata'].cast<core.String, core.String>(),
+          (_json['stateMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
diff --git a/generated/googleapis/lib/redis/v1.dart b/generated/googleapis/lib/redis/v1.dart
index 7961287..105a315 100644
--- a/generated/googleapis/lib/redis/v1.dart
+++ b/generated/googleapis/lib/redis/v1.dart
@@ -113,7 +113,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -181,7 +183,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -263,7 +268,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a specific Redis instance. Instance stops serving and data is
@@ -316,7 +323,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Export Redis instance data into a Redis RDB format file in Cloud Storage.
@@ -377,7 +386,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Initiates a failover of the primary node to current replica node for a
@@ -436,7 +447,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a specific Redis instance.
@@ -488,7 +501,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Instance.fromJson(data));
+    return _response.then(
+      (data) => Instance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Import a Redis RDB snapshot file from Cloud Storage into a Redis instance.
@@ -550,7 +565,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Redis instances owned by a project in either the specified
@@ -623,7 +640,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInstancesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the metadata and configuration of a specific Redis instance.
@@ -698,7 +718,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Upgrades Redis instance to the newer Redis version specified in the
@@ -757,7 +779,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -822,7 +846,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -875,7 +901,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -927,7 +955,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1003,7 +1033,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1034,7 +1067,8 @@
 
   ExportInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
-      outputConfig = OutputConfig.fromJson(_json['outputConfig']);
+      outputConfig = OutputConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1141,8 +1175,10 @@
   GoogleCloudRedisV1LocationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('availableZones')) {
       availableZones = commons.mapMap<core.Map, GoogleCloudRedisV1ZoneMetadata>(
-          _json['availableZones'].cast<core.String, core.Map>(),
-          (core.Map item) => GoogleCloudRedisV1ZoneMetadata.fromJson(item));
+          (_json['availableZones'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => GoogleCloudRedisV1ZoneMetadata.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -1257,7 +1293,8 @@
 
   ImportInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('inputConfig')) {
-      inputConfig = InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1279,7 +1316,8 @@
 
   InputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('gcsSource')) {
-      gcsSource = GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1439,7 +1477,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1459,7 +1498,8 @@
     }
     if (_json.containsKey('redisConfigs')) {
       redisConfigs = commons.mapMap<core.String, core.String>(
-          _json['redisConfigs'].cast<core.String, core.String>(),
+          (_json['redisConfigs'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('redisVersion')) {
@@ -1567,7 +1607,8 @@
   ListInstancesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1608,7 +1649,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1644,7 +1686,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1695,7 +1738,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1703,7 +1747,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1780,11 +1825,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1792,7 +1839,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1827,7 +1875,8 @@
 
   OutputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('gcsDestination')) {
-      gcsDestination = GcsDestination.fromJson(_json['gcsDestination']);
+      gcsDestination = GcsDestination.fromJson(
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1872,7 +1921,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/remotebuildexecution/v2.dart b/generated/googleapis/lib/remotebuildexecution/v2.dart
index 53a008c..858da8d 100644
--- a/generated/googleapis/lib/remotebuildexecution/v2.dart
+++ b/generated/googleapis/lib/remotebuildexecution/v2.dart
@@ -152,8 +152,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BuildBazelRemoteExecutionV2ActionResult.fromJson(data));
+    return _response.then(
+      (data) => BuildBazelRemoteExecutionV2ActionResult.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Upload a new execution result. In order to allow the server to perform
@@ -251,8 +253,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BuildBazelRemoteExecutionV2ActionResult.fromJson(data));
+    return _response.then(
+      (data) => BuildBazelRemoteExecutionV2ActionResult.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -359,7 +363,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -435,8 +442,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BuildBazelRemoteExecutionV2BatchReadBlobsResponse.fromJson(data));
+    return _response.then(
+      (data) => BuildBazelRemoteExecutionV2BatchReadBlobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Upload many blobs at once. The server may enforce a limit of the combined
@@ -507,8 +516,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse.fromJson(data));
+    return _response.then(
+      (data) => BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Determine if blobs are present in the CAS. Clients can use this API before
@@ -573,8 +584,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) =>
-        BuildBazelRemoteExecutionV2FindMissingBlobsResponse.fromJson(data));
+    return _response.then(
+      (data) => BuildBazelRemoteExecutionV2FindMissingBlobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Fetch the entire directory tree rooted at a node. This request must be
@@ -677,7 +690,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => BuildBazelRemoteExecutionV2GetTreeResponse.fromJson(data));
+      (data) => BuildBazelRemoteExecutionV2GetTreeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -745,7 +760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -812,7 +830,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => BuildBazelRemoteExecutionV2ServerCapabilities.fromJson(data));
+      (data) => BuildBazelRemoteExecutionV2ServerCapabilities.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -873,15 +893,15 @@
 
   BuildBazelRemoteExecutionV2Action.fromJson(core.Map _json) {
     if (_json.containsKey('commandDigest')) {
-      commandDigest =
-          BuildBazelRemoteExecutionV2Digest.fromJson(_json['commandDigest']);
+      commandDigest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['commandDigest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doNotCache')) {
       doNotCache = _json['doNotCache'] as core.bool;
     }
     if (_json.containsKey('inputRootDigest')) {
-      inputRootDigest =
-          BuildBazelRemoteExecutionV2Digest.fromJson(_json['inputRootDigest']);
+      inputRootDigest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['inputRootDigest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputNodeProperties')) {
       outputNodeProperties = (_json['outputNodeProperties'] as core.List)
@@ -1063,7 +1083,8 @@
     if (_json.containsKey('executionMetadata')) {
       executionMetadata =
           BuildBazelRemoteExecutionV2ExecutedActionMetadata.fromJson(
-              _json['executionMetadata']);
+              _json['executionMetadata']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exitCode')) {
       exitCode = _json['exitCode'] as core.int;
@@ -1071,43 +1092,48 @@
     if (_json.containsKey('outputDirectories')) {
       outputDirectories = (_json['outputDirectories'] as core.List)
           .map<BuildBazelRemoteExecutionV2OutputDirectory>((value) =>
-              BuildBazelRemoteExecutionV2OutputDirectory.fromJson(value))
+              BuildBazelRemoteExecutionV2OutputDirectory.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('outputDirectorySymlinks')) {
       outputDirectorySymlinks = (_json['outputDirectorySymlinks'] as core.List)
           .map<BuildBazelRemoteExecutionV2OutputSymlink>((value) =>
-              BuildBazelRemoteExecutionV2OutputSymlink.fromJson(value))
+              BuildBazelRemoteExecutionV2OutputSymlink.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('outputFileSymlinks')) {
       outputFileSymlinks = (_json['outputFileSymlinks'] as core.List)
           .map<BuildBazelRemoteExecutionV2OutputSymlink>((value) =>
-              BuildBazelRemoteExecutionV2OutputSymlink.fromJson(value))
+              BuildBazelRemoteExecutionV2OutputSymlink.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('outputFiles')) {
       outputFiles = (_json['outputFiles'] as core.List)
-          .map<BuildBazelRemoteExecutionV2OutputFile>(
-              (value) => BuildBazelRemoteExecutionV2OutputFile.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2OutputFile>((value) =>
+              BuildBazelRemoteExecutionV2OutputFile.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('outputSymlinks')) {
       outputSymlinks = (_json['outputSymlinks'] as core.List)
           .map<BuildBazelRemoteExecutionV2OutputSymlink>((value) =>
-              BuildBazelRemoteExecutionV2OutputSymlink.fromJson(value))
+              BuildBazelRemoteExecutionV2OutputSymlink.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('stderrDigest')) {
-      stderrDigest =
-          BuildBazelRemoteExecutionV2Digest.fromJson(_json['stderrDigest']);
+      stderrDigest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['stderrDigest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stderrRaw')) {
       stderrRaw = _json['stderrRaw'] as core.String;
     }
     if (_json.containsKey('stdoutDigest')) {
-      stdoutDigest =
-          BuildBazelRemoteExecutionV2Digest.fromJson(_json['stdoutDigest']);
+      stdoutDigest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['stdoutDigest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stdoutRaw')) {
       stdoutRaw = _json['stdoutRaw'] as core.String;
@@ -1168,8 +1194,9 @@
   BuildBazelRemoteExecutionV2BatchReadBlobsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('digests')) {
       digests = (_json['digests'] as core.List)
-          .map<BuildBazelRemoteExecutionV2Digest>(
-              (value) => BuildBazelRemoteExecutionV2Digest.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2Digest>((value) =>
+              BuildBazelRemoteExecutionV2Digest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1197,7 +1224,7 @@
           .map<BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse>(
               (value) =>
                   BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1236,10 +1263,12 @@
       data = _json['data'] as core.String;
     }
     if (_json.containsKey('digest')) {
-      digest = BuildBazelRemoteExecutionV2Digest.fromJson(_json['digest']);
+      digest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = GoogleRpcStatus.fromJson(_json['status']);
+      status = GoogleRpcStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1271,7 +1300,7 @@
           .map<BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest>(
               (value) =>
                   BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1307,7 +1336,8 @@
       data = _json['data'] as core.String;
     }
     if (_json.containsKey('digest')) {
-      digest = BuildBazelRemoteExecutionV2Digest.fromJson(_json['digest']);
+      digest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1337,7 +1367,7 @@
           .map<BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse>(
               (value) =>
                   BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1364,10 +1394,12 @@
   BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse.fromJson(
       core.Map _json) {
     if (_json.containsKey('digest')) {
-      digest = BuildBazelRemoteExecutionV2Digest.fromJson(_json['digest']);
+      digest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = GoogleRpcStatus.fromJson(_json['status']);
+      status = GoogleRpcStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1417,12 +1449,14 @@
     if (_json.containsKey('actionCacheUpdateCapabilities')) {
       actionCacheUpdateCapabilities =
           BuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities.fromJson(
-              _json['actionCacheUpdateCapabilities']);
+              _json['actionCacheUpdateCapabilities']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cachePriorityCapabilities')) {
       cachePriorityCapabilities =
           BuildBazelRemoteExecutionV2PriorityCapabilities.fromJson(
-              _json['cachePriorityCapabilities']);
+              _json['cachePriorityCapabilities']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('digestFunction')) {
       digestFunction = (_json['digestFunction'] as core.List)
@@ -1567,7 +1601,7 @@
       environmentVariables = (_json['environmentVariables'] as core.List)
           .map<BuildBazelRemoteExecutionV2CommandEnvironmentVariable>((value) =>
               BuildBazelRemoteExecutionV2CommandEnvironmentVariable.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('outputDirectories')) {
@@ -1586,8 +1620,8 @@
           .toList();
     }
     if (_json.containsKey('platform')) {
-      platform =
-          BuildBazelRemoteExecutionV2Platform.fromJson(_json['platform']);
+      platform = BuildBazelRemoteExecutionV2Platform.fromJson(
+          _json['platform'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workingDirectory')) {
       workingDirectory = _json['workingDirectory'] as core.String;
@@ -1756,25 +1790,29 @@
     if (_json.containsKey('directories')) {
       directories = (_json['directories'] as core.List)
           .map<BuildBazelRemoteExecutionV2DirectoryNode>((value) =>
-              BuildBazelRemoteExecutionV2DirectoryNode.fromJson(value))
+              BuildBazelRemoteExecutionV2DirectoryNode.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
-          .map<BuildBazelRemoteExecutionV2FileNode>(
-              (value) => BuildBazelRemoteExecutionV2FileNode.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2FileNode>((value) =>
+              BuildBazelRemoteExecutionV2FileNode.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nodeProperties')) {
       nodeProperties = (_json['nodeProperties'] as core.List)
           .map<BuildBazelRemoteExecutionV2NodeProperty>((value) =>
-              BuildBazelRemoteExecutionV2NodeProperty.fromJson(value))
+              BuildBazelRemoteExecutionV2NodeProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('symlinks')) {
       symlinks = (_json['symlinks'] as core.List)
-          .map<BuildBazelRemoteExecutionV2SymlinkNode>(
-              (value) => BuildBazelRemoteExecutionV2SymlinkNode.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2SymlinkNode>((value) =>
+              BuildBazelRemoteExecutionV2SymlinkNode.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1813,7 +1851,8 @@
 
   BuildBazelRemoteExecutionV2DirectoryNode.fromJson(core.Map _json) {
     if (_json.containsKey('digest')) {
-      digest = BuildBazelRemoteExecutionV2Digest.fromJson(_json['digest']);
+      digest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1859,8 +1898,8 @@
 
   BuildBazelRemoteExecutionV2ExecuteOperationMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('actionDigest')) {
-      actionDigest =
-          BuildBazelRemoteExecutionV2Digest.fromJson(_json['actionDigest']);
+      actionDigest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['actionDigest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stage')) {
       stage = _json['stage'] as core.String;
@@ -1923,17 +1962,18 @@
 
   BuildBazelRemoteExecutionV2ExecuteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('actionDigest')) {
-      actionDigest =
-          BuildBazelRemoteExecutionV2Digest.fromJson(_json['actionDigest']);
+      actionDigest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['actionDigest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('executionPolicy')) {
       executionPolicy = BuildBazelRemoteExecutionV2ExecutionPolicy.fromJson(
-          _json['executionPolicy']);
+          _json['executionPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resultsCachePolicy')) {
       resultsCachePolicy =
           BuildBazelRemoteExecutionV2ResultsCachePolicy.fromJson(
-              _json['resultsCachePolicy']);
+              _json['resultsCachePolicy']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skipCacheLookup')) {
       skipCacheLookup = _json['skipCacheLookup'] as core.bool;
@@ -2002,16 +2042,19 @@
       message = _json['message'] as core.String;
     }
     if (_json.containsKey('result')) {
-      result =
-          BuildBazelRemoteExecutionV2ActionResult.fromJson(_json['result']);
+      result = BuildBazelRemoteExecutionV2ActionResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serverLogs')) {
       serverLogs = commons.mapMap<core.Map, BuildBazelRemoteExecutionV2LogFile>(
-          _json['serverLogs'].cast<core.String, core.Map>(),
-          (core.Map item) => BuildBazelRemoteExecutionV2LogFile.fromJson(item));
+          (_json['serverLogs'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => BuildBazelRemoteExecutionV2LogFile.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('status')) {
-      status = GoogleRpcStatus.fromJson(_json['status']);
+      status = GoogleRpcStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2183,7 +2226,8 @@
     if (_json.containsKey('executionPriorityCapabilities')) {
       executionPriorityCapabilities =
           BuildBazelRemoteExecutionV2PriorityCapabilities.fromJson(
-              _json['executionPriorityCapabilities']);
+              _json['executionPriorityCapabilities']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('supportedNodeProperties')) {
       supportedNodeProperties = (_json['supportedNodeProperties'] as core.List)
@@ -2259,7 +2303,8 @@
 
   BuildBazelRemoteExecutionV2FileNode.fromJson(core.Map _json) {
     if (_json.containsKey('digest')) {
-      digest = BuildBazelRemoteExecutionV2Digest.fromJson(_json['digest']);
+      digest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isExecutable')) {
       isExecutable = _json['isExecutable'] as core.bool;
@@ -2270,7 +2315,8 @@
     if (_json.containsKey('nodeProperties')) {
       nodeProperties = (_json['nodeProperties'] as core.List)
           .map<BuildBazelRemoteExecutionV2NodeProperty>((value) =>
-              BuildBazelRemoteExecutionV2NodeProperty.fromJson(value))
+              BuildBazelRemoteExecutionV2NodeProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2304,8 +2350,9 @@
   BuildBazelRemoteExecutionV2FindMissingBlobsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('blobDigests')) {
       blobDigests = (_json['blobDigests'] as core.List)
-          .map<BuildBazelRemoteExecutionV2Digest>(
-              (value) => BuildBazelRemoteExecutionV2Digest.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2Digest>((value) =>
+              BuildBazelRemoteExecutionV2Digest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2330,8 +2377,9 @@
   BuildBazelRemoteExecutionV2FindMissingBlobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('missingBlobDigests')) {
       missingBlobDigests = (_json['missingBlobDigests'] as core.List)
-          .map<BuildBazelRemoteExecutionV2Digest>(
-              (value) => BuildBazelRemoteExecutionV2Digest.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2Digest>((value) =>
+              BuildBazelRemoteExecutionV2Digest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2361,8 +2409,9 @@
   BuildBazelRemoteExecutionV2GetTreeResponse.fromJson(core.Map _json) {
     if (_json.containsKey('directories')) {
       directories = (_json['directories'] as core.List)
-          .map<BuildBazelRemoteExecutionV2Directory>(
-              (value) => BuildBazelRemoteExecutionV2Directory.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2Directory>((value) =>
+              BuildBazelRemoteExecutionV2Directory.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2399,7 +2448,8 @@
 
   BuildBazelRemoteExecutionV2LogFile.fromJson(core.Map _json) {
     if (_json.containsKey('digest')) {
-      digest = BuildBazelRemoteExecutionV2Digest.fromJson(_json['digest']);
+      digest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('humanReadable')) {
       humanReadable = _json['humanReadable'] as core.bool;
@@ -2470,8 +2520,8 @@
       path = _json['path'] as core.String;
     }
     if (_json.containsKey('treeDigest')) {
-      treeDigest =
-          BuildBazelRemoteExecutionV2Digest.fromJson(_json['treeDigest']);
+      treeDigest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['treeDigest'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2525,7 +2575,8 @@
       contents = _json['contents'] as core.String;
     }
     if (_json.containsKey('digest')) {
-      digest = BuildBazelRemoteExecutionV2Digest.fromJson(_json['digest']);
+      digest = BuildBazelRemoteExecutionV2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isExecutable')) {
       isExecutable = _json['isExecutable'] as core.bool;
@@ -2533,7 +2584,8 @@
     if (_json.containsKey('nodeProperties')) {
       nodeProperties = (_json['nodeProperties'] as core.List)
           .map<BuildBazelRemoteExecutionV2NodeProperty>((value) =>
-              BuildBazelRemoteExecutionV2NodeProperty.fromJson(value))
+              BuildBazelRemoteExecutionV2NodeProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('path')) {
@@ -2589,7 +2641,8 @@
     if (_json.containsKey('nodeProperties')) {
       nodeProperties = (_json['nodeProperties'] as core.List)
           .map<BuildBazelRemoteExecutionV2NodeProperty>((value) =>
-              BuildBazelRemoteExecutionV2NodeProperty.fromJson(value))
+              BuildBazelRemoteExecutionV2NodeProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('path')) {
@@ -2633,7 +2686,8 @@
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
           .map<BuildBazelRemoteExecutionV2PlatformProperty>((value) =>
-              BuildBazelRemoteExecutionV2PlatformProperty.fromJson(value))
+              BuildBazelRemoteExecutionV2PlatformProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2703,7 +2757,7 @@
           .map<BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange>(
               (value) =>
                   BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2784,8 +2838,8 @@
       correlatedInvocationsId = _json['correlatedInvocationsId'] as core.String;
     }
     if (_json.containsKey('toolDetails')) {
-      toolDetails =
-          BuildBazelRemoteExecutionV2ToolDetails.fromJson(_json['toolDetails']);
+      toolDetails = BuildBazelRemoteExecutionV2ToolDetails.fromJson(
+          _json['toolDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('toolInvocationId')) {
       toolInvocationId = _json['toolInvocationId'] as core.String;
@@ -2861,22 +2915,25 @@
   BuildBazelRemoteExecutionV2ServerCapabilities.fromJson(core.Map _json) {
     if (_json.containsKey('cacheCapabilities')) {
       cacheCapabilities = BuildBazelRemoteExecutionV2CacheCapabilities.fromJson(
-          _json['cacheCapabilities']);
+          _json['cacheCapabilities'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deprecatedApiVersion')) {
-      deprecatedApiVersion =
-          BuildBazelSemverSemVer.fromJson(_json['deprecatedApiVersion']);
+      deprecatedApiVersion = BuildBazelSemverSemVer.fromJson(
+          _json['deprecatedApiVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('executionCapabilities')) {
       executionCapabilities =
           BuildBazelRemoteExecutionV2ExecutionCapabilities.fromJson(
-              _json['executionCapabilities']);
+              _json['executionCapabilities']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('highApiVersion')) {
-      highApiVersion = BuildBazelSemverSemVer.fromJson(_json['highApiVersion']);
+      highApiVersion = BuildBazelSemverSemVer.fromJson(
+          _json['highApiVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lowApiVersion')) {
-      lowApiVersion = BuildBazelSemverSemVer.fromJson(_json['lowApiVersion']);
+      lowApiVersion = BuildBazelSemverSemVer.fromJson(
+          _json['lowApiVersion'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2926,7 +2983,8 @@
     if (_json.containsKey('nodeProperties')) {
       nodeProperties = (_json['nodeProperties'] as core.List)
           .map<BuildBazelRemoteExecutionV2NodeProperty>((value) =>
-              BuildBazelRemoteExecutionV2NodeProperty.fromJson(value))
+              BuildBazelRemoteExecutionV2NodeProperty.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('target')) {
@@ -2998,12 +3056,14 @@
   BuildBazelRemoteExecutionV2Tree.fromJson(core.Map _json) {
     if (_json.containsKey('children')) {
       children = (_json['children'] as core.List)
-          .map<BuildBazelRemoteExecutionV2Directory>(
-              (value) => BuildBazelRemoteExecutionV2Directory.fromJson(value))
+          .map<BuildBazelRemoteExecutionV2Directory>((value) =>
+              BuildBazelRemoteExecutionV2Directory.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('root')) {
-      root = BuildBazelRemoteExecutionV2Directory.fromJson(_json['root']);
+      root = BuildBazelRemoteExecutionV2Directory.fromJson(
+          _json['root'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3364,11 +3424,11 @@
     }
     if (_json.containsKey('diskUsage')) {
       diskUsage = GoogleDevtoolsRemotebuildbotResourceUsageStat.fromJson(
-          _json['diskUsage']);
+          _json['diskUsage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('memoryUsage')) {
       memoryUsage = GoogleDevtoolsRemotebuildbotResourceUsageStat.fromJson(
-          _json['memoryUsage']);
+          _json['memoryUsage'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3501,7 +3561,7 @@
     if (_json.containsKey('instance')) {
       instance =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance.fromJson(
-              _json['instance']);
+              _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('instanceId')) {
       instanceId = _json['instanceId'] as core.String;
@@ -3554,7 +3614,7 @@
     if (_json.containsKey('workerPool')) {
       workerPool =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool.fromJson(
-              _json['workerPool']);
+              _json['workerPool'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3684,42 +3744,50 @@
     if (_json.containsKey('containerImageSources')) {
       containerImageSources =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['containerImageSources']);
+              .fromJson(_json['containerImageSources']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dockerAddCapabilities')) {
       dockerAddCapabilities =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['dockerAddCapabilities']);
+              .fromJson(_json['dockerAddCapabilities']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dockerChrootPath')) {
       dockerChrootPath =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['dockerChrootPath']);
+              .fromJson(_json['dockerChrootPath']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dockerNetwork')) {
       dockerNetwork =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['dockerNetwork']);
+              .fromJson(_json['dockerNetwork']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dockerPrivileged')) {
       dockerPrivileged =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['dockerPrivileged']);
+              .fromJson(_json['dockerPrivileged']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dockerRunAsRoot')) {
       dockerRunAsRoot =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['dockerRunAsRoot']);
+              .fromJson(_json['dockerRunAsRoot']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dockerRuntime')) {
       dockerRuntime =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['dockerRuntime']);
+              .fromJson(_json['dockerRuntime']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dockerSiblingContainers')) {
       dockerSiblingContainers =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
-              .fromJson(_json['dockerSiblingContainers']);
+              .fromJson(_json['dockerSiblingContainers']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linuxIsolation')) {
       linuxIsolation = _json['linuxIsolation'] as core.String;
@@ -3893,7 +3961,7 @@
     if (_json.containsKey('featurePolicy')) {
       featurePolicy =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy.fromJson(
-              _json['featurePolicy']);
+              _json['featurePolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -3964,7 +4032,7 @@
       instances = (_json['instances'] as core.List)
           .map<GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance>(
               (value) => GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4038,7 +4106,7 @@
           .map<GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool>(
               (value) =>
                   GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4113,7 +4181,7 @@
     if (_json.containsKey('instance')) {
       instance =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance.fromJson(
-              _json['instance']);
+              _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('loggingEnabled')) {
       loggingEnabled = _json['loggingEnabled'] as core.bool;
@@ -4168,7 +4236,7 @@
     if (_json.containsKey('workerPool')) {
       workerPool =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool.fromJson(
-              _json['workerPool']);
+              _json['workerPool'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4244,7 +4312,8 @@
     if (_json.containsKey('accelerator')) {
       accelerator =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig
-              .fromJson(_json['accelerator']);
+              .fromJson(
+                  _json['accelerator'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diskSizeGb')) {
       diskSizeGb = _json['diskSizeGb'] as core.String;
@@ -4254,7 +4323,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('machineType')) {
@@ -4275,7 +4345,8 @@
     if (_json.containsKey('soleTenancy')) {
       soleTenancy =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig
-              .fromJson(_json['soleTenancy']);
+              .fromJson(
+                  _json['soleTenancy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('vmImage')) {
       vmImage = _json['vmImage'] as core.String;
@@ -4368,7 +4439,7 @@
     if (_json.containsKey('autoscale')) {
       autoscale =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale.fromJson(
-              _json['autoscale']);
+              _json['autoscale'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('channel')) {
       channel = _json['channel'] as core.String;
@@ -4382,7 +4453,7 @@
     if (_json.containsKey('workerConfig')) {
       workerConfig =
           GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig.fromJson(
-              _json['workerConfig']);
+              _json['workerConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workerCount')) {
       workerCount = _json['workerCount'] as core.String;
@@ -4484,8 +4555,8 @@
       contents = _json['contents'] as core.String;
     }
     if (_json.containsKey('digest')) {
-      digest =
-          GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(_json['digest']);
+      digest = GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4522,8 +4593,8 @@
       exitCode = _json['exitCode'] as core.int;
     }
     if (_json.containsKey('outputs')) {
-      outputs =
-          GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(_json['outputs']);
+      outputs = GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(
+          _json['outputs'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4624,19 +4695,21 @@
       metadata = (_json['metadata'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
     if (_json.containsKey('outputs')) {
-      outputs =
-          GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(_json['outputs']);
+      outputs = GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(
+          _json['outputs'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('overhead')) {
       overhead = _json['overhead'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = GoogleRpcStatus.fromJson(_json['status']);
+      status = GoogleRpcStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4682,15 +4755,15 @@
     if (_json.containsKey('expectedOutputs')) {
       expectedOutputs =
           GoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs.fromJson(
-              _json['expectedOutputs']);
+              _json['expectedOutputs'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputs')) {
       inputs = GoogleDevtoolsRemoteworkersV1test2CommandTaskInputs.fromJson(
-          _json['inputs']);
+          _json['inputs'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeouts')) {
       timeouts = GoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts.fromJson(
-          _json['timeouts']);
+          _json['timeouts'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4760,19 +4833,21 @@
           .map<GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable>(
               (value) =>
                   GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
           .map<GoogleDevtoolsRemoteworkersV1test2Digest>((value) =>
-              GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(value))
+              GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inlineBlobs')) {
       inlineBlobs = (_json['inlineBlobs'] as core.List)
-          .map<GoogleDevtoolsRemoteworkersV1test2Blob>(
-              (value) => GoogleDevtoolsRemoteworkersV1test2Blob.fromJson(value))
+          .map<GoogleDevtoolsRemoteworkersV1test2Blob>((value) =>
+              GoogleDevtoolsRemoteworkersV1test2Blob.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('workingDirectory')) {
@@ -5007,13 +5082,14 @@
       directories = (_json['directories'] as core.List)
           .map<GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata>((value) =>
               GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
           .map<GoogleDevtoolsRemoteworkersV1test2FileMetadata>((value) =>
-              GoogleDevtoolsRemoteworkersV1test2FileMetadata.fromJson(value))
+              GoogleDevtoolsRemoteworkersV1test2FileMetadata.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5045,8 +5121,8 @@
 
   GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('digest')) {
-      digest =
-          GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(_json['digest']);
+      digest = GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('path')) {
       path = _json['path'] as core.String;
@@ -5099,8 +5175,8 @@
       contents = _json['contents'] as core.String;
     }
     if (_json.containsKey('digest')) {
-      digest =
-          GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(_json['digest']);
+      digest = GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(
+          _json['digest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isExecutable')) {
       isExecutable = _json['isExecutable'] as core.bool;
@@ -5172,11 +5248,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -5184,7 +5262,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -5242,7 +5321,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/reseller/v1.dart b/generated/googleapis/lib/reseller/v1.dart
index 4ff281e..c4ae4af 100644
--- a/generated/googleapis/lib/reseller/v1.dart
+++ b/generated/googleapis/lib/reseller/v1.dart
@@ -107,7 +107,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Customer.fromJson(data));
+    return _response.then(
+      (data) => Customer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Order a new customer's account.
@@ -166,7 +168,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Customer.fromJson(data));
+    return _response.then(
+      (data) => Customer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a customer account's settings. This method supports patch
@@ -224,7 +228,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Customer.fromJson(data));
+    return _response.then(
+      (data) => Customer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a customer account's settings.
@@ -281,7 +287,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Customer.fromJson(data));
+    return _response.then(
+      (data) => Customer.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -329,8 +337,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ResellernotifyGetwatchdetailsResponse.fromJson(data));
+    return _response.then(
+      (data) => ResellernotifyGetwatchdetailsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Registers a Reseller for receiving notifications.
@@ -379,7 +389,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResellernotifyResource.fromJson(data));
+    return _response.then(
+      (data) => ResellernotifyResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Unregisters a Reseller for receiving notifications.
@@ -428,7 +441,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResellernotifyResource.fromJson(data));
+    return _response.then(
+      (data) => ResellernotifyResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -499,7 +515,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a subscription plan. Use this method to update a plan for a 30-day
@@ -572,7 +591,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a user license's renewal settings. This is applicable for accounts
@@ -644,7 +666,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Update a subscription's user license settings.
@@ -715,7 +740,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Cancel, suspend, or transfer a subscription to direct.
@@ -795,7 +823,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Get a specific subscription.
@@ -859,7 +889,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create or transfer a subscription.
@@ -929,7 +962,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List of subscriptions managed by the reseller. The list can be all
@@ -1021,7 +1057,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscriptions.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscriptions.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Immediately move a 30-day free trial subscription to a paid service
@@ -1087,7 +1126,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Suspends an active subscription.
@@ -1152,7 +1194,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1317,7 +1362,8 @@
       purchaseOrderId = _json['purchaseOrderId'] as core.String;
     }
     if (_json.containsKey('seats')) {
-      seats = Seats.fromJson(_json['seats']);
+      seats =
+          Seats.fromJson(_json['seats'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1403,7 +1449,8 @@
       phoneNumber = _json['phoneNumber'] as core.String;
     }
     if (_json.containsKey('postalAddress')) {
-      postalAddress = Address.fromJson(_json['postalAddress']);
+      postalAddress = Address.fromJson(
+          _json['postalAddress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceUiUrl')) {
       resourceUiUrl = _json['resourceUiUrl'] as core.String;
@@ -1668,7 +1715,7 @@
   SubscriptionPlan.fromJson(core.Map _json) {
     if (_json.containsKey('commitmentInterval')) {
       commitmentInterval = SubscriptionPlanCommitmentInterval.fromJson(
-          _json['commitmentInterval']);
+          _json['commitmentInterval'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('isCommitmentPlan')) {
       isCommitmentPlan = _json['isCommitmentPlan'] as core.bool;
@@ -1885,19 +1932,22 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('plan')) {
-      plan = SubscriptionPlan.fromJson(_json['plan']);
+      plan = SubscriptionPlan.fromJson(
+          _json['plan'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('purchaseOrderId')) {
       purchaseOrderId = _json['purchaseOrderId'] as core.String;
     }
     if (_json.containsKey('renewalSettings')) {
-      renewalSettings = RenewalSettings.fromJson(_json['renewalSettings']);
+      renewalSettings = RenewalSettings.fromJson(
+          _json['renewalSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceUiUrl')) {
       resourceUiUrl = _json['resourceUiUrl'] as core.String;
     }
     if (_json.containsKey('seats')) {
-      seats = Seats.fromJson(_json['seats']);
+      seats =
+          Seats.fromJson(_json['seats'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('skuId')) {
       skuId = _json['skuId'] as core.String;
@@ -1917,11 +1967,12 @@
           .toList();
     }
     if (_json.containsKey('transferInfo')) {
-      transferInfo = SubscriptionTransferInfo.fromJson(_json['transferInfo']);
+      transferInfo = SubscriptionTransferInfo.fromJson(
+          _json['transferInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trialSettings')) {
-      trialSettings =
-          SubscriptionTrialSettings.fromJson(_json['trialSettings']);
+      trialSettings = SubscriptionTrialSettings.fromJson(
+          _json['trialSettings'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2009,7 +2060,8 @@
     }
     if (_json.containsKey('subscriptions')) {
       subscriptions = (_json['subscriptions'] as core.List)
-          .map<Subscription>((value) => Subscription.fromJson(value))
+          .map<Subscription>((value) => Subscription.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/run/v1.dart b/generated/googleapis/lib/run/v1.dart
index 14ffd38..749c62e 100644
--- a/generated/googleapis/lib/run/v1.dart
+++ b/generated/googleapis/lib/run/v1.dart
@@ -135,8 +135,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAuthorizedDomainsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAuthorizedDomainsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -194,7 +196,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Configuration.fromJson(data));
+    return _response.then(
+      (data) =>
+          Configuration.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List configurations.
@@ -294,7 +299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListConfigurationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListConfigurationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -360,7 +368,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainMapping.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainMapping.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a domain mapping.
@@ -432,7 +443,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Status.fromJson(data));
+    return _response.then(
+      (data) => Status.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get information about a domain mapping.
@@ -483,7 +496,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainMapping.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainMapping.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List domain mappings.
@@ -583,7 +599,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDomainMappingsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDomainMappingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -662,7 +681,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Status.fromJson(data));
+    return _response.then(
+      (data) => Status.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get information about a revision.
@@ -713,7 +734,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Revision.fromJson(data));
+    return _response.then(
+      (data) => Revision.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List revisions.
@@ -813,7 +836,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRevisionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRevisionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -871,7 +897,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Route.fromJson(data));
+    return _response.then(
+      (data) => Route.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List routes.
@@ -970,7 +998,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRoutesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRoutesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1035,7 +1066,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a service. This will cause the Service to stop serving traffic and
@@ -1108,7 +1141,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Status.fromJson(data));
+    return _response.then(
+      (data) => Status.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get information about a service.
@@ -1159,7 +1194,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List services.
@@ -1259,7 +1296,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replace a service. Only the spec and metadata labels and annotations are
@@ -1319,7 +1359,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1401,8 +1443,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAuthorizedDomainsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAuthorizedDomainsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1490,7 +1534,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1561,8 +1608,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAuthorizedDomainsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAuthorizedDomainsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1620,7 +1669,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Configuration.fromJson(data));
+    return _response.then(
+      (data) =>
+          Configuration.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List configurations.
@@ -1720,7 +1772,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListConfigurationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListConfigurationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1786,7 +1841,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainMapping.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainMapping.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a domain mapping.
@@ -1858,7 +1916,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Status.fromJson(data));
+    return _response.then(
+      (data) => Status.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get information about a domain mapping.
@@ -1909,7 +1969,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DomainMapping.fromJson(data));
+    return _response.then(
+      (data) =>
+          DomainMapping.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List domain mappings.
@@ -2009,7 +2072,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDomainMappingsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDomainMappingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2088,7 +2154,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Status.fromJson(data));
+    return _response.then(
+      (data) => Status.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get information about a revision.
@@ -2139,7 +2207,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Revision.fromJson(data));
+    return _response.then(
+      (data) => Revision.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List revisions.
@@ -2238,7 +2308,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRevisionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRevisionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2295,7 +2368,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Route.fromJson(data));
+    return _response.then(
+      (data) => Route.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List routes.
@@ -2392,7 +2467,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListRoutesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListRoutesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2456,7 +2534,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a service. This will cause the Service to stop serving traffic and
@@ -2528,7 +2608,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Status.fromJson(data));
+    return _response.then(
+      (data) => Status.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get information about a service.
@@ -2578,7 +2660,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the IAM Access Control policy currently in effect for the given Cloud
@@ -2646,7 +2730,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List services.
@@ -2745,7 +2831,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Replace a service. Only the spec and metadata labels and annotations are
@@ -2804,7 +2893,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the IAM Access control policy for the specified Service. Overwrites
@@ -2864,7 +2955,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified Project. There are
@@ -2924,7 +3017,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2979,7 +3075,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -3127,7 +3224,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -3175,8 +3273,8 @@
 
   ConfigMapEnvSource.fromJson(core.Map _json) {
     if (_json.containsKey('localObjectReference')) {
-      localObjectReference =
-          LocalObjectReference.fromJson(_json['localObjectReference']);
+      localObjectReference = LocalObjectReference.fromJson(
+          _json['localObjectReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3227,8 +3325,8 @@
       key = _json['key'] as core.String;
     }
     if (_json.containsKey('localObjectReference')) {
-      localObjectReference =
-          LocalObjectReference.fromJson(_json['localObjectReference']);
+      localObjectReference = LocalObjectReference.fromJson(
+          _json['localObjectReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -3295,7 +3393,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<KeyToPath>((value) => KeyToPath.fromJson(value))
+          .map<KeyToPath>((value) =>
+              KeyToPath.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3358,13 +3457,16 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ObjectMeta.fromJson(_json['metadata']);
+      metadata = ObjectMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = ConfigurationSpec.fromJson(_json['spec']);
+      spec = ConfigurationSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = ConfigurationStatus.fromJson(_json['status']);
+      status = ConfigurationStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3408,7 +3510,8 @@
 
   ConfigurationSpec.fromJson(core.Map _json) {
     if (_json.containsKey('template')) {
-      template = RevisionTemplate.fromJson(_json['template']);
+      template = RevisionTemplate.fromJson(
+          _json['template'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3450,8 +3553,9 @@
   ConfigurationStatus.fromJson(core.Map _json) {
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<GoogleCloudRunV1Condition>(
-              (value) => GoogleCloudRunV1Condition.fromJson(value))
+          .map<GoogleCloudRunV1Condition>((value) =>
+              GoogleCloudRunV1Condition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('latestCreatedRevisionName')) {
@@ -3603,12 +3707,14 @@
     }
     if (_json.containsKey('env')) {
       env = (_json['env'] as core.List)
-          .map<EnvVar>((value) => EnvVar.fromJson(value))
+          .map<EnvVar>((value) =>
+              EnvVar.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('envFrom')) {
       envFrom = (_json['envFrom'] as core.List)
-          .map<EnvFromSource>((value) => EnvFromSource.fromJson(value))
+          .map<EnvFromSource>((value) => EnvFromSource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('image')) {
@@ -3618,24 +3724,29 @@
       imagePullPolicy = _json['imagePullPolicy'] as core.String;
     }
     if (_json.containsKey('livenessProbe')) {
-      livenessProbe = Probe.fromJson(_json['livenessProbe']);
+      livenessProbe = Probe.fromJson(
+          _json['livenessProbe'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('ports')) {
       ports = (_json['ports'] as core.List)
-          .map<ContainerPort>((value) => ContainerPort.fromJson(value))
+          .map<ContainerPort>((value) => ContainerPort.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('readinessProbe')) {
-      readinessProbe = Probe.fromJson(_json['readinessProbe']);
+      readinessProbe = Probe.fromJson(
+          _json['readinessProbe'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resources')) {
-      resources = ResourceRequirements.fromJson(_json['resources']);
+      resources = ResourceRequirements.fromJson(
+          _json['resources'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('securityContext')) {
-      securityContext = SecurityContext.fromJson(_json['securityContext']);
+      securityContext = SecurityContext.fromJson(
+          _json['securityContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('terminationMessagePath')) {
       terminationMessagePath = _json['terminationMessagePath'] as core.String;
@@ -3646,7 +3757,8 @@
     }
     if (_json.containsKey('volumeMounts')) {
       volumeMounts = (_json['volumeMounts'] as core.List)
-          .map<VolumeMount>((value) => VolumeMount.fromJson(value))
+          .map<VolumeMount>((value) => VolumeMount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('workingDir')) {
@@ -3780,13 +3892,16 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ObjectMeta.fromJson(_json['metadata']);
+      metadata = ObjectMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = DomainMappingSpec.fromJson(_json['spec']);
+      spec = DomainMappingSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = DomainMappingStatus.fromJson(_json['status']);
+      status = DomainMappingStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3889,8 +4004,9 @@
   DomainMappingStatus.fromJson(core.Map _json) {
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<GoogleCloudRunV1Condition>(
-              (value) => GoogleCloudRunV1Condition.fromJson(value))
+          .map<GoogleCloudRunV1Condition>((value) =>
+              GoogleCloudRunV1Condition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mappedRouteName')) {
@@ -3901,7 +4017,8 @@
     }
     if (_json.containsKey('resourceRecords')) {
       resourceRecords = (_json['resourceRecords'] as core.List)
-          .map<ResourceRecord>((value) => ResourceRecord.fromJson(value))
+          .map<ResourceRecord>((value) => ResourceRecord.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('url')) {
@@ -3951,13 +4068,15 @@
 
   EnvFromSource.fromJson(core.Map _json) {
     if (_json.containsKey('configMapRef')) {
-      configMapRef = ConfigMapEnvSource.fromJson(_json['configMapRef']);
+      configMapRef = ConfigMapEnvSource.fromJson(
+          _json['configMapRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prefix')) {
       prefix = _json['prefix'] as core.String;
     }
     if (_json.containsKey('secretRef')) {
-      secretRef = SecretEnvSource.fromJson(_json['secretRef']);
+      secretRef = SecretEnvSource.fromJson(
+          _json['secretRef'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4004,7 +4123,8 @@
       value = _json['value'] as core.String;
     }
     if (_json.containsKey('valueFrom')) {
-      valueFrom = EnvVarSource.fromJson(_json['valueFrom']);
+      valueFrom = EnvVarSource.fromJson(
+          _json['valueFrom'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4038,10 +4158,12 @@
 
   EnvVarSource.fromJson(core.Map _json) {
     if (_json.containsKey('configMapKeyRef')) {
-      configMapKeyRef = ConfigMapKeySelector.fromJson(_json['configMapKeyRef']);
+      configMapKeyRef = ConfigMapKeySelector.fromJson(
+          _json['configMapKeyRef'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secretKeyRef')) {
-      secretKeyRef = SecretKeySelector.fromJson(_json['secretKeyRef']);
+      secretKeyRef = SecretKeySelector.fromJson(
+          _json['secretKeyRef'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4258,7 +4380,8 @@
     }
     if (_json.containsKey('httpHeaders')) {
       httpHeaders = (_json['httpHeaders'] as core.List)
-          .map<HTTPHeader>((value) => HTTPHeader.fromJson(value))
+          .map<HTTPHeader>((value) =>
+              HTTPHeader.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('path')) {
@@ -4383,7 +4506,8 @@
   ListAuthorizedDomainsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('domains')) {
       domains = (_json['domains'] as core.List)
-          .map<AuthorizedDomain>((value) => AuthorizedDomain.fromJson(value))
+          .map<AuthorizedDomain>((value) => AuthorizedDomain.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4428,14 +4552,16 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Configuration>((value) => Configuration.fromJson(value))
+          .map<Configuration>((value) => Configuration.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ListMeta.fromJson(_json['metadata']);
+      metadata = ListMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unreachable')) {
       unreachable = (_json['unreachable'] as core.List)
@@ -4490,14 +4616,16 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<DomainMapping>((value) => DomainMapping.fromJson(value))
+          .map<DomainMapping>((value) => DomainMapping.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ListMeta.fromJson(_json['metadata']);
+      metadata = ListMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unreachable')) {
       unreachable = (_json['unreachable'] as core.List)
@@ -4540,7 +4668,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -4640,14 +4769,16 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Revision>((value) => Revision.fromJson(value))
+          .map<Revision>((value) =>
+              Revision.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ListMeta.fromJson(_json['metadata']);
+      metadata = ListMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unreachable')) {
       unreachable = (_json['unreachable'] as core.List)
@@ -4702,14 +4833,16 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Route>((value) => Route.fromJson(value))
+          .map<Route>((value) =>
+              Route.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ListMeta.fromJson(_json['metadata']);
+      metadata = ListMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unreachable')) {
       unreachable = (_json['unreachable'] as core.List)
@@ -4764,14 +4897,16 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Service>((value) => Service.fromJson(value))
+          .map<Service>((value) =>
+              Service.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ListMeta.fromJson(_json['metadata']);
+      metadata = ListMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unreachable')) {
       unreachable = (_json['unreachable'] as core.List)
@@ -4859,7 +4994,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -4867,7 +5003,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -5026,7 +5163,8 @@
   ObjectMeta.fromJson(core.Map _json) {
     if (_json.containsKey('annotations')) {
       annotations = commons.mapMap<core.String, core.String>(
-          _json['annotations'].cast<core.String, core.String>(),
+          (_json['annotations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('clusterName')) {
@@ -5055,7 +5193,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -5066,7 +5205,8 @@
     }
     if (_json.containsKey('ownerReferences')) {
       ownerReferences = (_json['ownerReferences'] as core.List)
-          .map<OwnerReference>((value) => OwnerReference.fromJson(value))
+          .map<OwnerReference>((value) => OwnerReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resourceVersion')) {
@@ -5287,12 +5427,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -5373,13 +5515,15 @@
 
   Probe.fromJson(core.Map _json) {
     if (_json.containsKey('exec')) {
-      exec = ExecAction.fromJson(_json['exec']);
+      exec = ExecAction.fromJson(
+          _json['exec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('failureThreshold')) {
       failureThreshold = _json['failureThreshold'] as core.int;
     }
     if (_json.containsKey('httpGet')) {
-      httpGet = HTTPGetAction.fromJson(_json['httpGet']);
+      httpGet = HTTPGetAction.fromJson(
+          _json['httpGet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('initialDelaySeconds')) {
       initialDelaySeconds = _json['initialDelaySeconds'] as core.int;
@@ -5391,7 +5535,8 @@
       successThreshold = _json['successThreshold'] as core.int;
     }
     if (_json.containsKey('tcpSocket')) {
-      tcpSocket = TCPSocketAction.fromJson(_json['tcpSocket']);
+      tcpSocket = TCPSocketAction.fromJson(
+          _json['tcpSocket'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeoutSeconds')) {
       timeoutSeconds = _json['timeoutSeconds'] as core.int;
@@ -5499,12 +5644,14 @@
   ResourceRequirements.fromJson(core.Map _json) {
     if (_json.containsKey('limits')) {
       limits = commons.mapMap<core.String, core.String>(
-          _json['limits'].cast<core.String, core.String>(),
+          (_json['limits'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('requests')) {
       requests = commons.mapMap<core.String, core.String>(
-          _json['requests'].cast<core.String, core.String>(),
+          (_json['requests'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -5553,13 +5700,16 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ObjectMeta.fromJson(_json['metadata']);
+      metadata = ObjectMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = RevisionSpec.fromJson(_json['spec']);
+      spec = RevisionSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = RevisionStatus.fromJson(_json['status']);
+      status = RevisionStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5623,7 +5773,8 @@
     }
     if (_json.containsKey('containers')) {
       containers = (_json['containers'] as core.List)
-          .map<Container>((value) => Container.fromJson(value))
+          .map<Container>((value) =>
+              Container.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceAccountName')) {
@@ -5634,7 +5785,8 @@
     }
     if (_json.containsKey('volumes')) {
       volumes = (_json['volumes'] as core.List)
-          .map<Volume>((value) => Volume.fromJson(value))
+          .map<Volume>((value) =>
+              Volume.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5696,8 +5848,9 @@
   RevisionStatus.fromJson(core.Map _json) {
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<GoogleCloudRunV1Condition>(
-              (value) => GoogleCloudRunV1Condition.fromJson(value))
+          .map<GoogleCloudRunV1Condition>((value) =>
+              GoogleCloudRunV1Condition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imageDigest')) {
@@ -5755,10 +5908,12 @@
 
   RevisionTemplate.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = ObjectMeta.fromJson(_json['metadata']);
+      metadata = ObjectMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = RevisionSpec.fromJson(_json['spec']);
+      spec = RevisionSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5810,13 +5965,16 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ObjectMeta.fromJson(_json['metadata']);
+      metadata = ObjectMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = RouteSpec.fromJson(_json['spec']);
+      spec = RouteSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = RouteStatus.fromJson(_json['status']);
+      status = RouteStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5853,7 +6011,8 @@
   RouteSpec.fromJson(core.Map _json) {
     if (_json.containsKey('traffic')) {
       traffic = (_json['traffic'] as core.List)
-          .map<TrafficTarget>((value) => TrafficTarget.fromJson(value))
+          .map<TrafficTarget>((value) => TrafficTarget.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5903,12 +6062,14 @@
 
   RouteStatus.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = Addressable.fromJson(_json['address']);
+      address = Addressable.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<GoogleCloudRunV1Condition>(
-              (value) => GoogleCloudRunV1Condition.fromJson(value))
+          .map<GoogleCloudRunV1Condition>((value) =>
+              GoogleCloudRunV1Condition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('observedGeneration')) {
@@ -5916,7 +6077,8 @@
     }
     if (_json.containsKey('traffic')) {
       traffic = (_json['traffic'] as core.List)
-          .map<TrafficTarget>((value) => TrafficTarget.fromJson(value))
+          .map<TrafficTarget>((value) => TrafficTarget.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('url')) {
@@ -5966,8 +6128,8 @@
 
   SecretEnvSource.fromJson(core.Map _json) {
     if (_json.containsKey('localObjectReference')) {
-      localObjectReference =
-          LocalObjectReference.fromJson(_json['localObjectReference']);
+      localObjectReference = LocalObjectReference.fromJson(
+          _json['localObjectReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -6018,8 +6180,8 @@
       key = _json['key'] as core.String;
     }
     if (_json.containsKey('localObjectReference')) {
-      localObjectReference =
-          LocalObjectReference.fromJson(_json['localObjectReference']);
+      localObjectReference = LocalObjectReference.fromJson(
+          _json['localObjectReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -6086,7 +6248,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<KeyToPath>((value) => KeyToPath.fromJson(value))
+          .map<KeyToPath>((value) =>
+              KeyToPath.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('optional')) {
@@ -6183,13 +6346,16 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ObjectMeta.fromJson(_json['metadata']);
+      metadata = ObjectMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = ServiceSpec.fromJson(_json['spec']);
+      spec = ServiceSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = ServiceStatus.fromJson(_json['status']);
+      status = ServiceStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6229,11 +6395,13 @@
 
   ServiceSpec.fromJson(core.Map _json) {
     if (_json.containsKey('template')) {
-      template = RevisionTemplate.fromJson(_json['template']);
+      template = RevisionTemplate.fromJson(
+          _json['template'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('traffic')) {
       traffic = (_json['traffic'] as core.List)
-          .map<TrafficTarget>((value) => TrafficTarget.fromJson(value))
+          .map<TrafficTarget>((value) => TrafficTarget.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6295,12 +6463,14 @@
 
   ServiceStatus.fromJson(core.Map _json) {
     if (_json.containsKey('address')) {
-      address = Addressable.fromJson(_json['address']);
+      address = Addressable.fromJson(
+          _json['address'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('conditions')) {
       conditions = (_json['conditions'] as core.List)
-          .map<GoogleCloudRunV1Condition>(
-              (value) => GoogleCloudRunV1Condition.fromJson(value))
+          .map<GoogleCloudRunV1Condition>((value) =>
+              GoogleCloudRunV1Condition.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('latestCreatedRevisionName')) {
@@ -6315,7 +6485,8 @@
     }
     if (_json.containsKey('traffic')) {
       traffic = (_json['traffic'] as core.List)
-          .map<TrafficTarget>((value) => TrafficTarget.fromJson(value))
+          .map<TrafficTarget>((value) => TrafficTarget.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('url')) {
@@ -6367,7 +6538,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -6422,13 +6594,15 @@
       code = _json['code'] as core.int;
     }
     if (_json.containsKey('details')) {
-      details = StatusDetails.fromJson(_json['details']);
+      details = StatusDetails.fromJson(
+          _json['details'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('message')) {
       message = _json['message'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ListMeta.fromJson(_json['metadata']);
+      metadata = ListMeta.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reason')) {
       reason = _json['reason'] as core.String;
@@ -6551,7 +6725,8 @@
   StatusDetails.fromJson(core.Map _json) {
     if (_json.containsKey('causes')) {
       causes = (_json['causes'] as core.List)
-          .map<StatusCause>((value) => StatusCause.fromJson(value))
+          .map<StatusCause>((value) => StatusCause.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('group')) {
@@ -6784,13 +6959,15 @@
 
   Volume.fromJson(core.Map _json) {
     if (_json.containsKey('configMap')) {
-      configMap = ConfigMapVolumeSource.fromJson(_json['configMap']);
+      configMap = ConfigMapVolumeSource.fromJson(
+          _json['configMap'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('secret')) {
-      secret = SecretVolumeSource.fromJson(_json['secret']);
+      secret = SecretVolumeSource.fromJson(
+          _json['secret'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/runtimeconfig/v1.dart b/generated/googleapis/lib/runtimeconfig/v1.dart
index 5d981bf..a73194b 100644
--- a/generated/googleapis/lib/runtimeconfig/v1.dart
+++ b/generated/googleapis/lib/runtimeconfig/v1.dart
@@ -119,7 +119,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -171,7 +173,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -246,7 +250,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -298,7 +305,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -359,11 +367,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -371,7 +381,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -429,7 +440,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/safebrowsing/v4.dart b/generated/googleapis/lib/safebrowsing/v4.dart
index b1253e7..60e0a3b 100644
--- a/generated/googleapis/lib/safebrowsing/v4.dart
+++ b/generated/googleapis/lib/safebrowsing/v4.dart
@@ -120,7 +120,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FindFullHashesResponse.fromJson(data));
+    return _response.then(
+      (data) => FindFullHashesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -186,8 +189,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => FetchThreatListUpdatesResponse.fromJson(data));
+    return _response.then(
+      (data) => FetchThreatListUpdatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -241,7 +246,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FindFullHashesResponse.fromJson(data));
+    return _response.then(
+      (data) => FindFullHashesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -296,7 +304,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -352,8 +362,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => FetchThreatListUpdatesResponse.fromJson(data));
+    return _response.then(
+      (data) => FetchThreatListUpdatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -401,7 +413,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListThreatListsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListThreatListsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -455,7 +470,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FindThreatMatchesResponse.fromJson(data));
+    return _response.then(
+      (data) => FindThreatMatchesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -629,11 +647,13 @@
 
   FetchThreatListUpdatesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('client')) {
-      client = ClientInfo.fromJson(_json['client']);
+      client = ClientInfo.fromJson(
+          _json['client'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('listUpdateRequests')) {
       listUpdateRequests = (_json['listUpdateRequests'] as core.List)
-          .map<ListUpdateRequest>((value) => ListUpdateRequest.fromJson(value))
+          .map<ListUpdateRequest>((value) => ListUpdateRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -664,8 +684,8 @@
   FetchThreatListUpdatesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('listUpdateResponses')) {
       listUpdateResponses = (_json['listUpdateResponses'] as core.List)
-          .map<ListUpdateResponse>(
-              (value) => ListUpdateResponse.fromJson(value))
+          .map<ListUpdateResponse>((value) => ListUpdateResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('minimumWaitDuration')) {
@@ -705,10 +725,12 @@
 
   FindFullHashesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('apiClient')) {
-      apiClient = ClientInfo.fromJson(_json['apiClient']);
+      apiClient = ClientInfo.fromJson(
+          _json['apiClient'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('client')) {
-      client = ClientInfo.fromJson(_json['client']);
+      client = ClientInfo.fromJson(
+          _json['client'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clientStates')) {
       clientStates = (_json['clientStates'] as core.List)
@@ -716,7 +738,8 @@
           .toList();
     }
     if (_json.containsKey('threatInfo')) {
-      threatInfo = ThreatInfo.fromJson(_json['threatInfo']);
+      threatInfo = ThreatInfo.fromJson(
+          _json['threatInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -756,7 +779,8 @@
   FindFullHashesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('matches')) {
       matches = (_json['matches'] as core.List)
-          .map<ThreatMatch>((value) => ThreatMatch.fromJson(value))
+          .map<ThreatMatch>((value) => ThreatMatch.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('minimumWaitDuration')) {
@@ -794,10 +818,12 @@
 
   FindThreatMatchesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('client')) {
-      client = ClientInfo.fromJson(_json['client']);
+      client = ClientInfo.fromJson(
+          _json['client'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('threatInfo')) {
-      threatInfo = ThreatInfo.fromJson(_json['threatInfo']);
+      threatInfo = ThreatInfo.fromJson(
+          _json['threatInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -822,7 +848,8 @@
   FindThreatMatchesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('matches')) {
       matches = (_json['matches'] as core.List)
-          .map<ThreatMatch>((value) => ThreatMatch.fromJson(value))
+          .map<ThreatMatch>((value) => ThreatMatch.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -845,8 +872,8 @@
   ListThreatListsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('threatLists')) {
       threatLists = (_json['threatLists'] as core.List)
-          .map<ThreatListDescriptor>(
-              (value) => ThreatListDescriptor.fromJson(value))
+          .map<ThreatListDescriptor>((value) => ThreatListDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -933,7 +960,8 @@
 
   ListUpdateRequest.fromJson(core.Map _json) {
     if (_json.containsKey('constraints')) {
-      constraints = Constraints.fromJson(_json['constraints']);
+      constraints = Constraints.fromJson(
+          _json['constraints'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('platformType')) {
       platformType = _json['platformType'] as core.String;
@@ -1066,11 +1094,13 @@
   ListUpdateResponse.fromJson(core.Map _json) {
     if (_json.containsKey('additions')) {
       additions = (_json['additions'] as core.List)
-          .map<ThreatEntrySet>((value) => ThreatEntrySet.fromJson(value))
+          .map<ThreatEntrySet>((value) => ThreatEntrySet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('checksum')) {
-      checksum = Checksum.fromJson(_json['checksum']);
+      checksum = Checksum.fromJson(
+          _json['checksum'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('newClientState')) {
       newClientState = _json['newClientState'] as core.String;
@@ -1080,7 +1110,8 @@
     }
     if (_json.containsKey('removals')) {
       removals = (_json['removals'] as core.List)
-          .map<ThreatEntrySet>((value) => ThreatEntrySet.fromJson(value))
+          .map<ThreatEntrySet>((value) => ThreatEntrySet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('responseType')) {
@@ -1365,7 +1396,8 @@
   ThreatEntryMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('entries')) {
       entries = (_json['entries'] as core.List)
-          .map<MetadataEntry>((value) => MetadataEntry.fromJson(value))
+          .map<MetadataEntry>((value) => MetadataEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1413,16 +1445,20 @@
       compressionType = _json['compressionType'] as core.String;
     }
     if (_json.containsKey('rawHashes')) {
-      rawHashes = RawHashes.fromJson(_json['rawHashes']);
+      rawHashes = RawHashes.fromJson(
+          _json['rawHashes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rawIndices')) {
-      rawIndices = RawIndices.fromJson(_json['rawIndices']);
+      rawIndices = RawIndices.fromJson(
+          _json['rawIndices'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('riceHashes')) {
-      riceHashes = RiceDeltaEncoding.fromJson(_json['riceHashes']);
+      riceHashes = RiceDeltaEncoding.fromJson(
+          _json['riceHashes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('riceIndices')) {
-      riceIndices = RiceDeltaEncoding.fromJson(_json['riceIndices']);
+      riceIndices = RiceDeltaEncoding.fromJson(
+          _json['riceIndices'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1507,24 +1543,28 @@
 
   ThreatHit.fromJson(core.Map _json) {
     if (_json.containsKey('clientInfo')) {
-      clientInfo = ClientInfo.fromJson(_json['clientInfo']);
+      clientInfo = ClientInfo.fromJson(
+          _json['clientInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entry')) {
-      entry = ThreatEntry.fromJson(_json['entry']);
+      entry = ThreatEntry.fromJson(
+          _json['entry'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('platformType')) {
       platformType = _json['platformType'] as core.String;
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ThreatSource>((value) => ThreatSource.fromJson(value))
+          .map<ThreatSource>((value) => ThreatSource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('threatType')) {
       threatType = _json['threatType'] as core.String;
     }
     if (_json.containsKey('userInfo')) {
-      userInfo = UserInfo.fromJson(_json['userInfo']);
+      userInfo = UserInfo.fromJson(
+          _json['userInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1577,7 +1617,8 @@
     }
     if (_json.containsKey('threatEntries')) {
       threatEntries = (_json['threatEntries'] as core.List)
-          .map<ThreatEntry>((value) => ThreatEntry.fromJson(value))
+          .map<ThreatEntry>((value) => ThreatEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('threatEntryTypes')) {
@@ -1772,11 +1813,12 @@
       platformType = _json['platformType'] as core.String;
     }
     if (_json.containsKey('threat')) {
-      threat = ThreatEntry.fromJson(_json['threat']);
+      threat = ThreatEntry.fromJson(
+          _json['threat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('threatEntryMetadata')) {
-      threatEntryMetadata =
-          ThreatEntryMetadata.fromJson(_json['threatEntryMetadata']);
+      threatEntryMetadata = ThreatEntryMetadata.fromJson(
+          _json['threatEntryMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('threatEntryType')) {
       threatEntryType = _json['threatEntryType'] as core.String;
diff --git a/generated/googleapis/lib/script/v1.dart b/generated/googleapis/lib/script/v1.dart
index 4a5cc97..02c9ced 100644
--- a/generated/googleapis/lib/script/v1.dart
+++ b/generated/googleapis/lib/script/v1.dart
@@ -248,7 +248,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListUserProcessesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUserProcessesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List information about a script's executed processes, such as process type
@@ -374,7 +377,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListScriptProcessesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListScriptProcessesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -434,7 +440,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a script project's metadata.
@@ -482,7 +490,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Project.fromJson(data));
+    return _response.then(
+      (data) => Project.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the content of the script project, including the code source and
@@ -540,7 +550,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Content.fromJson(data));
+    return _response.then(
+      (data) => Content.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get metrics data for scripts, such as number of executions and active
@@ -610,7 +622,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Metrics.fromJson(data));
+    return _response.then(
+      (data) => Metrics.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the content of the specified script project. This content is
@@ -670,7 +684,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Content.fromJson(data));
+    return _response.then(
+      (data) => Content.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -733,7 +749,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Deployment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Deployment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a deployment of an Apps Script project.
@@ -790,7 +809,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a deployment of an Apps Script project.
@@ -847,7 +868,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Deployment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Deployment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the deployments of an Apps Script project.
@@ -912,7 +936,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDeploymentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDeploymentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a deployment of an Apps Script project.
@@ -975,7 +1002,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Deployment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Deployment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1039,7 +1069,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Version.fromJson(data));
+    return _response.then(
+      (data) => Version.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a version of a script project.
@@ -1096,7 +1128,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Version.fromJson(data));
+    return _response.then(
+      (data) => Version.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List the versions of a script project.
@@ -1161,7 +1195,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1234,7 +1271,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1253,7 +1292,8 @@
   Content.fromJson(core.Map _json) {
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
-          .map<File>((value) => File.fromJson(value))
+          .map<File>((value) =>
+              File.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('scriptId')) {
@@ -1324,14 +1364,16 @@
 
   Deployment.fromJson(core.Map _json) {
     if (_json.containsKey('deploymentConfig')) {
-      deploymentConfig = DeploymentConfig.fromJson(_json['deploymentConfig']);
+      deploymentConfig = DeploymentConfig.fromJson(
+          _json['deploymentConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deploymentId')) {
       deploymentId = _json['deploymentId'] as core.String;
     }
     if (_json.containsKey('entryPoints')) {
       entryPoints = (_json['entryPoints'] as core.List)
-          .map<EntryPoint>((value) => EntryPoint.fromJson(value))
+          .map<EntryPoint>((value) =>
+              EntryPoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('updateTime')) {
@@ -1448,17 +1490,19 @@
 
   EntryPoint.fromJson(core.Map _json) {
     if (_json.containsKey('addOn')) {
-      addOn = GoogleAppsScriptTypeAddOnEntryPoint.fromJson(_json['addOn']);
+      addOn = GoogleAppsScriptTypeAddOnEntryPoint.fromJson(
+          _json['addOn'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entryPointType')) {
       entryPointType = _json['entryPointType'] as core.String;
     }
     if (_json.containsKey('executionApi')) {
       executionApi = GoogleAppsScriptTypeExecutionApiEntryPoint.fromJson(
-          _json['executionApi']);
+          _json['executionApi'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webApp')) {
-      webApp = GoogleAppsScriptTypeWebAppEntryPoint.fromJson(_json['webApp']);
+      webApp = GoogleAppsScriptTypeWebAppEntryPoint.fromJson(
+          _json['webApp'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1490,7 +1534,8 @@
 
   ExecuteStreamResponse.fromJson(core.Map _json) {
     if (_json.containsKey('result')) {
-      result = ScriptExecutionResult.fromJson(_json['result']);
+      result = ScriptExecutionResult.fromJson(
+          _json['result'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1534,8 +1579,9 @@
     if (_json.containsKey('scriptStackTraceElements')) {
       scriptStackTraceElements =
           (_json['scriptStackTraceElements'] as core.List)
-              .map<ScriptStackTraceElement>(
-                  (value) => ScriptStackTraceElement.fromJson(value))
+              .map<ScriptStackTraceElement>((value) =>
+                  ScriptStackTraceElement.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -1706,12 +1752,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('functionSet')) {
-      functionSet =
-          GoogleAppsScriptTypeFunctionSet.fromJson(_json['functionSet']);
+      functionSet = GoogleAppsScriptTypeFunctionSet.fromJson(
+          _json['functionSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastModifyUser')) {
-      lastModifyUser =
-          GoogleAppsScriptTypeUser.fromJson(_json['lastModifyUser']);
+      lastModifyUser = GoogleAppsScriptTypeUser.fromJson(
+          _json['lastModifyUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1867,7 +1913,7 @@
   GoogleAppsScriptTypeExecutionApiEntryPoint.fromJson(core.Map _json) {
     if (_json.containsKey('entryPointConfig')) {
       entryPointConfig = GoogleAppsScriptTypeExecutionApiConfig.fromJson(
-          _json['entryPointConfig']);
+          _json['entryPointConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1912,8 +1958,9 @@
   GoogleAppsScriptTypeFunctionSet.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<GoogleAppsScriptTypeFunction>(
-              (value) => GoogleAppsScriptTypeFunction.fromJson(value))
+          .map<GoogleAppsScriptTypeFunction>((value) =>
+              GoogleAppsScriptTypeFunction.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2141,8 +2188,8 @@
 
   GoogleAppsScriptTypeWebAppEntryPoint.fromJson(core.Map _json) {
     if (_json.containsKey('entryPointConfig')) {
-      entryPointConfig =
-          GoogleAppsScriptTypeWebAppConfig.fromJson(_json['entryPointConfig']);
+      entryPointConfig = GoogleAppsScriptTypeWebAppConfig.fromJson(
+          _json['entryPointConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('url')) {
       url = _json['url'] as core.String;
@@ -2175,7 +2222,8 @@
   ListDeploymentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deployments')) {
       deployments = (_json['deployments'] as core.List)
-          .map<Deployment>((value) => Deployment.fromJson(value))
+          .map<Deployment>((value) =>
+              Deployment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2213,8 +2261,9 @@
     }
     if (_json.containsKey('processes')) {
       processes = (_json['processes'] as core.List)
-          .map<GoogleAppsScriptTypeProcess>(
-              (value) => GoogleAppsScriptTypeProcess.fromJson(value))
+          .map<GoogleAppsScriptTypeProcess>((value) =>
+              GoogleAppsScriptTypeProcess.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2248,8 +2297,9 @@
     }
     if (_json.containsKey('processes')) {
       processes = (_json['processes'] as core.List)
-          .map<GoogleAppsScriptTypeProcess>(
-              (value) => GoogleAppsScriptTypeProcess.fromJson(value))
+          .map<GoogleAppsScriptTypeProcess>((value) =>
+              GoogleAppsScriptTypeProcess.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2276,7 +2326,8 @@
   ListValue.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<Value>((value) => Value.fromJson(value))
+          .map<Value>((value) =>
+              Value.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2307,7 +2358,8 @@
     }
     if (_json.containsKey('versions')) {
       versions = (_json['versions'] as core.List)
-          .map<Version>((value) => Version.fromJson(value))
+          .map<Version>((value) =>
+              Version.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2341,17 +2393,20 @@
   Metrics.fromJson(core.Map _json) {
     if (_json.containsKey('activeUsers')) {
       activeUsers = (_json['activeUsers'] as core.List)
-          .map<MetricsValue>((value) => MetricsValue.fromJson(value))
+          .map<MetricsValue>((value) => MetricsValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('failedExecutions')) {
       failedExecutions = (_json['failedExecutions'] as core.List)
-          .map<MetricsValue>((value) => MetricsValue.fromJson(value))
+          .map<MetricsValue>((value) => MetricsValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalExecutions')) {
       totalExecutions = (_json['totalExecutions'] as core.List)
-          .map<MetricsValue>((value) => MetricsValue.fromJson(value))
+          .map<MetricsValue>((value) => MetricsValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2457,11 +2512,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2513,11 +2570,12 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('creator')) {
-      creator = GoogleAppsScriptTypeUser.fromJson(_json['creator']);
+      creator = GoogleAppsScriptTypeUser.fromJson(
+          _json['creator'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lastModifyUser')) {
-      lastModifyUser =
-          GoogleAppsScriptTypeUser.fromJson(_json['lastModifyUser']);
+      lastModifyUser = GoogleAppsScriptTypeUser.fromJson(
+          _json['lastModifyUser'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parentId')) {
       parentId = _json['parentId'] as core.String;
@@ -2569,7 +2627,8 @@
 
   ScriptExecutionResult.fromJson(core.Map _json) {
     if (_json.containsKey('returnValue')) {
-      returnValue = Value.fromJson(_json['returnValue']);
+      returnValue = Value.fromJson(
+          _json['returnValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2644,7 +2703,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -2679,8 +2739,10 @@
   Struct.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = commons.mapMap<core.Map, Value>(
-          _json['fields'].cast<core.String, core.Map>(),
-          (core.Map item) => Value.fromJson(item));
+          (_json['fields'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Value.fromJson(item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -2704,7 +2766,8 @@
 
   UpdateDeploymentRequest.fromJson(core.Map _json) {
     if (_json.containsKey('deploymentConfig')) {
-      deploymentConfig = DeploymentConfig.fromJson(_json['deploymentConfig']);
+      deploymentConfig = DeploymentConfig.fromJson(
+          _json['deploymentConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2772,7 +2835,8 @@
       dateValue = _json['dateValue'] as core.String;
     }
     if (_json.containsKey('listValue')) {
-      listValue = ListValue.fromJson(_json['listValue']);
+      listValue = ListValue.fromJson(
+          _json['listValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nullValue')) {
       nullValue = _json['nullValue'] as core.String;
@@ -2782,14 +2846,16 @@
     }
     if (_json.containsKey('protoValue')) {
       protoValue = commons.mapMap<core.Object, core.Object>(
-          _json['protoValue'].cast<core.String, core.Object>(),
+          (_json['protoValue'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('stringValue')) {
       stringValue = _json['stringValue'] as core.String;
     }
     if (_json.containsKey('structValue')) {
-      structValue = Struct.fromJson(_json['structValue']);
+      structValue = Struct.fromJson(
+          _json['structValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/searchconsole/v1.dart b/generated/googleapis/lib/searchconsole/v1.dart
index 81af7c0..73829c5 100644
--- a/generated/googleapis/lib/searchconsole/v1.dart
+++ b/generated/googleapis/lib/searchconsole/v1.dart
@@ -120,8 +120,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SearchAnalyticsQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchAnalyticsQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -186,7 +188,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves information about a specific sitemap.
@@ -245,7 +249,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WmxSitemap.fromJson(data));
+    return _response.then(
+      (data) =>
+          WmxSitemap.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the [sitemaps-entries](/webmaster-tools/v3/sitemaps) submitted for
@@ -305,7 +312,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SitemapsListResponse.fromJson(data));
+    return _response.then(
+      (data) => SitemapsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submits a sitemap for a site.
@@ -364,7 +374,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -418,7 +430,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   ///  Removes a site from the set of the user's Search Console sites.
@@ -467,7 +481,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   ///  Retrieves information about specific site.
@@ -516,7 +532,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WmxSite.fromJson(data));
+    return _response.then(
+      (data) => WmxSite.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   ///  Lists the user's Search Console sites.
@@ -558,7 +576,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SitesListResponse.fromJson(data));
+    return _response.then(
+      (data) => SitesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -622,8 +643,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => RunMobileFriendlyTestResponse.fromJson(data));
+    return _response.then(
+      (data) => RunMobileFriendlyTestResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -747,8 +770,8 @@
   ApiDimensionFilterGroup.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<ApiDimensionFilter>(
-              (value) => ApiDimensionFilter.fromJson(value))
+          .map<ApiDimensionFilter>((value) => ApiDimensionFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('groupType')) {
@@ -878,7 +901,8 @@
 
   ResourceIssue.fromJson(core.Map _json) {
     if (_json.containsKey('blockedResource')) {
-      blockedResource = BlockedResource.fromJson(_json['blockedResource']);
+      blockedResource = BlockedResource.fromJson(
+          _json['blockedResource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -953,20 +977,23 @@
     }
     if (_json.containsKey('mobileFriendlyIssues')) {
       mobileFriendlyIssues = (_json['mobileFriendlyIssues'] as core.List)
-          .map<MobileFriendlyIssue>(
-              (value) => MobileFriendlyIssue.fromJson(value))
+          .map<MobileFriendlyIssue>((value) => MobileFriendlyIssue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('resourceIssues')) {
       resourceIssues = (_json['resourceIssues'] as core.List)
-          .map<ResourceIssue>((value) => ResourceIssue.fromJson(value))
+          .map<ResourceIssue>((value) => ResourceIssue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('screenshot')) {
-      screenshot = Image.fromJson(_json['screenshot']);
+      screenshot = Image.fromJson(
+          _json['screenshot'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('testStatus')) {
-      testStatus = TestStatus.fromJson(_json['testStatus']);
+      testStatus = TestStatus.fromJson(
+          _json['testStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1056,8 +1083,9 @@
     }
     if (_json.containsKey('dimensionFilterGroups')) {
       dimensionFilterGroups = (_json['dimensionFilterGroups'] as core.List)
-          .map<ApiDimensionFilterGroup>(
-              (value) => ApiDimensionFilterGroup.fromJson(value))
+          .map<ApiDimensionFilterGroup>((value) =>
+              ApiDimensionFilterGroup.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
@@ -1135,7 +1163,8 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<ApiDataRow>((value) => ApiDataRow.fromJson(value))
+          .map<ApiDataRow>((value) =>
+              ApiDataRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1163,7 +1192,8 @@
   SitemapsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('sitemap')) {
       sitemap = (_json['sitemap'] as core.List)
-          .map<WmxSitemap>((value) => WmxSitemap.fromJson(value))
+          .map<WmxSitemap>((value) =>
+              WmxSitemap.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1189,7 +1219,8 @@
   SitesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('siteEntry')) {
       siteEntry = (_json['siteEntry'] as core.List)
-          .map<WmxSite>((value) => WmxSite.fromJson(value))
+          .map<WmxSite>((value) =>
+              WmxSite.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1333,7 +1364,8 @@
   WmxSitemap.fromJson(core.Map _json) {
     if (_json.containsKey('contents')) {
       contents = (_json['contents'] as core.List)
-          .map<WmxSitemapContent>((value) => WmxSitemapContent.fromJson(value))
+          .map<WmxSitemapContent>((value) => WmxSitemapContent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('errors')) {
diff --git a/generated/googleapis/lib/secretmanager/v1.dart b/generated/googleapis/lib/secretmanager/v1.dart
index 3130d09..1225173 100644
--- a/generated/googleapis/lib/secretmanager/v1.dart
+++ b/generated/googleapis/lib/secretmanager/v1.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -179,7 +181,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -247,7 +252,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecretVersion.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecretVersion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new Secret containing no SecretVersions.
@@ -313,7 +321,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Secret.fromJson(data));
+    return _response.then(
+      (data) => Secret.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Secret.
@@ -363,7 +373,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets metadata for a given Secret.
@@ -413,7 +425,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Secret.fromJson(data));
+    return _response.then(
+      (data) => Secret.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a secret. Returns empty policy if the
@@ -481,7 +495,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists Secrets.
@@ -547,7 +563,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSecretsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSecretsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates metadata of an existing Secret.
@@ -609,7 +628,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Secret.fromJson(data));
+    return _response.then(
+      (data) => Secret.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified secret. Replaces any
@@ -670,7 +691,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has for the specified secret. If the
@@ -733,7 +756,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -791,7 +817,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AccessSecretVersionResponse.fromJson(data));
+    return _response.then(
+      (data) => AccessSecretVersionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Destroys a SecretVersion. Sets the state of the SecretVersion to DESTROYED
@@ -848,7 +877,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecretVersion.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecretVersion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Disables a SecretVersion. Sets the state of the SecretVersion to DISABLED.
@@ -904,7 +936,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecretVersion.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecretVersion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables a SecretVersion. Sets the state of the SecretVersion to ENABLED.
@@ -960,7 +995,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecretVersion.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecretVersion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets metadata for a SecretVersion. `projects / * /secrets / *
@@ -1012,7 +1050,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecretVersion.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecretVersion.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists SecretVersions. This call does not return secret data.
@@ -1078,7 +1119,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSecretVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSecretVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1098,7 +1142,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('payload')) {
-      payload = SecretPayload.fromJson(_json['payload']);
+      payload = SecretPayload.fromJson(
+          _json['payload'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1123,7 +1168,8 @@
 
   AddSecretVersionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('payload')) {
-      payload = SecretPayload.fromJson(_json['payload']);
+      payload = SecretPayload.fromJson(
+          _json['payload'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1166,7 +1212,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -1245,7 +1292,8 @@
   Automatic.fromJson(core.Map _json) {
     if (_json.containsKey('customerManagedEncryption')) {
       customerManagedEncryption = CustomerManagedEncryption.fromJson(
-          _json['customerManagedEncryption']);
+          _json['customerManagedEncryption']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1270,7 +1318,8 @@
   AutomaticStatus.fromJson(core.Map _json) {
     if (_json.containsKey('customerManagedEncryption')) {
       customerManagedEncryption = CustomerManagedEncryptionStatus.fromJson(
-          _json['customerManagedEncryption']);
+          _json['customerManagedEncryption']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1340,7 +1389,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -1563,7 +1613,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1607,7 +1658,8 @@
     }
     if (_json.containsKey('versions')) {
       versions = (_json['versions'] as core.List)
-          .map<SecretVersion>((value) => SecretVersion.fromJson(value))
+          .map<SecretVersion>((value) => SecretVersion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1647,7 +1699,8 @@
     }
     if (_json.containsKey('secrets')) {
       secrets = (_json['secrets'] as core.List)
-          .map<Secret>((value) => Secret.fromJson(value))
+          .map<Secret>((value) =>
+              Secret.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalSize')) {
@@ -1702,7 +1755,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1710,7 +1764,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1818,12 +1873,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -1871,7 +1928,8 @@
   Replica.fromJson(core.Map _json) {
     if (_json.containsKey('customerManagedEncryption')) {
       customerManagedEncryption = CustomerManagedEncryption.fromJson(
-          _json['customerManagedEncryption']);
+          _json['customerManagedEncryption']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -1905,7 +1963,8 @@
   ReplicaStatus.fromJson(core.Map _json) {
     if (_json.containsKey('customerManagedEncryption')) {
       customerManagedEncryption = CustomerManagedEncryptionStatus.fromJson(
-          _json['customerManagedEncryption']);
+          _json['customerManagedEncryption']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -1936,10 +1995,12 @@
 
   Replication.fromJson(core.Map _json) {
     if (_json.containsKey('automatic')) {
-      automatic = Automatic.fromJson(_json['automatic']);
+      automatic = Automatic.fromJson(
+          _json['automatic'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userManaged')) {
-      userManaged = UserManaged.fromJson(_json['userManaged']);
+      userManaged = UserManaged.fromJson(
+          _json['userManaged'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1971,10 +2032,12 @@
 
   ReplicationStatus.fromJson(core.Map _json) {
     if (_json.containsKey('automatic')) {
-      automatic = AutomaticStatus.fromJson(_json['automatic']);
+      automatic = AutomaticStatus.fromJson(
+          _json['automatic'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userManaged')) {
-      userManaged = UserManagedStatus.fromJson(_json['userManaged']);
+      userManaged = UserManagedStatus.fromJson(
+          _json['userManaged'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2023,14 +2086,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('replication')) {
-      replication = Replication.fromJson(_json['replication']);
+      replication = Replication.fromJson(
+          _json['replication'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2121,8 +2186,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('replicationStatus')) {
-      replicationStatus =
-          ReplicationStatus.fromJson(_json['replicationStatus']);
+      replicationStatus = ReplicationStatus.fromJson(
+          _json['replicationStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -2167,7 +2232,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -2249,7 +2315,8 @@
   UserManaged.fromJson(core.Map _json) {
     if (_json.containsKey('replicas')) {
       replicas = (_json['replicas'] as core.List)
-          .map<Replica>((value) => Replica.fromJson(value))
+          .map<Replica>((value) =>
+              Replica.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2274,7 +2341,8 @@
   UserManagedStatus.fromJson(core.Map _json) {
     if (_json.containsKey('replicas')) {
       replicas = (_json['replicas'] as core.List)
-          .map<ReplicaStatus>((value) => ReplicaStatus.fromJson(value))
+          .map<ReplicaStatus>((value) => ReplicaStatus.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/securitycenter/v1.dart b/generated/googleapis/lib/securitycenter/v1.dart
index 55abc13..2040ef5 100644
--- a/generated/googleapis/lib/securitycenter/v1.dart
+++ b/generated/googleapis/lib/securitycenter/v1.dart
@@ -110,7 +110,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrganizationSettings.fromJson(data));
+    return _response.then(
+      (data) => OrganizationSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an organization's settings.
@@ -174,7 +177,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => OrganizationSettings.fromJson(data));
+    return _response.then(
+      (data) => OrganizationSettings.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -240,7 +246,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GroupAssetsResponse.fromJson(data));
+    return _response.then(
+      (data) => GroupAssetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists an organization's assets.
@@ -402,7 +411,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAssetsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAssetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Runs asset discovery. The discovery is tracked with a long-running
@@ -463,7 +475,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates security marks.
@@ -540,7 +554,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecurityMarks.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecurityMarks.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -613,7 +630,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationConfig.fromJson(data));
+    return _response.then(
+      (data) => NotificationConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a notification config.
@@ -663,7 +683,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a notification config.
@@ -713,7 +735,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationConfig.fromJson(data));
+    return _response.then(
+      (data) => NotificationConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists notification configs.
@@ -781,8 +806,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListNotificationConfigsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListNotificationConfigsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a notification config. The following update fields are allowed:
@@ -848,7 +875,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => NotificationConfig.fromJson(data));
+    return _response.then(
+      (data) => NotificationConfig.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -912,7 +942,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -964,7 +996,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1015,7 +1049,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1090,7 +1126,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1157,7 +1196,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Source.fromJson(data));
+    return _response.then(
+      (data) => Source.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a source.
@@ -1207,7 +1248,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Source.fromJson(data));
+    return _response.then(
+      (data) => Source.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy on the specified Source.
@@ -1266,7 +1309,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all sources belonging to an organization.
@@ -1332,7 +1377,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSourcesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSourcesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a source.
@@ -1396,7 +1444,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Source.fromJson(data));
+    return _response.then(
+      (data) => Source.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified Source.
@@ -1455,7 +1505,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the permissions that a caller has on the specified source.
@@ -1514,7 +1566,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1587,7 +1642,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Finding.fromJson(data));
+    return _response.then(
+      (data) => Finding.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Filters an organization or source's findings and groups them by their
@@ -1649,7 +1706,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GroupFindingsResponse.fromJson(data));
+    return _response.then(
+      (data) => GroupFindingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists an organization or source's findings. To list across all sources
@@ -1803,7 +1863,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFindingsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFindingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates or updates a finding. The corresponding source must exist for a
@@ -1873,7 +1936,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Finding.fromJson(data));
+    return _response.then(
+      (data) => Finding.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the state of a finding.
@@ -1932,7 +1997,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Finding.fromJson(data));
+    return _response.then(
+      (data) => Finding.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates security marks.
@@ -2009,7 +2076,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SecurityMarks.fromJson(data));
+    return _response.then(
+      (data) =>
+          SecurityMarks.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2059,22 +2129,26 @@
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('iamPolicy')) {
-      iamPolicy = IamPolicy.fromJson(_json['iamPolicy']);
+      iamPolicy = IamPolicy.fromJson(
+          _json['iamPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('resourceProperties')) {
       resourceProperties = commons.mapMap<core.Object, core.Object>(
-          _json['resourceProperties'].cast<core.String, core.Object>(),
+          (_json['resourceProperties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('securityCenterProperties')) {
-      securityCenterProperties =
-          SecurityCenterProperties.fromJson(_json['securityCenterProperties']);
+      securityCenterProperties = SecurityCenterProperties.fromJson(
+          _json['securityCenterProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('securityMarks')) {
-      securityMarks = SecurityMarks.fromJson(_json['securityMarks']);
+      securityMarks = SecurityMarks.fromJson(
+          _json['securityMarks'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -2178,7 +2252,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -2292,7 +2367,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -2498,11 +2574,13 @@
       resourceName = _json['resourceName'] as core.String;
     }
     if (_json.containsKey('securityMarks')) {
-      securityMarks = SecurityMarks.fromJson(_json['securityMarks']);
+      securityMarks = SecurityMarks.fromJson(
+          _json['securityMarks'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceProperties')) {
       sourceProperties = commons.mapMap<core.Object, core.Object>(
-          _json['sourceProperties'].cast<core.String, core.Object>(),
+          (_json['sourceProperties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('state')) {
@@ -2556,7 +2634,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2612,14 +2691,15 @@
 
   GoogleCloudSecuritycenterV1NotificationMessage.fromJson(core.Map _json) {
     if (_json.containsKey('finding')) {
-      finding = Finding.fromJson(_json['finding']);
+      finding = Finding.fromJson(
+          _json['finding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('notificationConfigName')) {
       notificationConfigName = _json['notificationConfigName'] as core.String;
     }
     if (_json.containsKey('resource')) {
-      resource =
-          GoogleCloudSecuritycenterV1Resource.fromJson(_json['resource']);
+      resource = GoogleCloudSecuritycenterV1Resource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2878,14 +2958,15 @@
     }
     if (_json.containsKey('securityMarks')) {
       securityMarks = GoogleCloudSecuritycenterV1p1beta1SecurityMarks.fromJson(
-          _json['securityMarks']);
+          _json['securityMarks'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('severity')) {
       severity = _json['severity'] as core.String;
     }
     if (_json.containsKey('sourceProperties')) {
       sourceProperties = commons.mapMap<core.Object, core.Object>(
-          _json['sourceProperties'].cast<core.String, core.Object>(),
+          (_json['sourceProperties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('state')) {
@@ -2948,15 +3029,15 @@
   GoogleCloudSecuritycenterV1p1beta1NotificationMessage.fromJson(
       core.Map _json) {
     if (_json.containsKey('finding')) {
-      finding =
-          GoogleCloudSecuritycenterV1p1beta1Finding.fromJson(_json['finding']);
+      finding = GoogleCloudSecuritycenterV1p1beta1Finding.fromJson(
+          _json['finding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('notificationConfigName')) {
       notificationConfigName = _json['notificationConfigName'] as core.String;
     }
     if (_json.containsKey('resource')) {
       resource = GoogleCloudSecuritycenterV1p1beta1Resource.fromJson(
-          _json['resource']);
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3098,7 +3179,8 @@
   GoogleCloudSecuritycenterV1p1beta1SecurityMarks.fromJson(core.Map _json) {
     if (_json.containsKey('marks')) {
       marks = commons.mapMap<core.String, core.String>(
-          _json['marks'].cast<core.String, core.String>(),
+          (_json['marks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -3275,7 +3357,8 @@
   GroupAssetsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('groupByResults')) {
       groupByResults = (_json['groupByResults'] as core.List)
-          .map<GroupResult>((value) => GroupResult.fromJson(value))
+          .map<GroupResult>((value) => GroupResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3449,7 +3532,8 @@
   GroupFindingsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('groupByResults')) {
       groupByResults = (_json['groupByResults'] as core.List)
-          .map<GroupResult>((value) => GroupResult.fromJson(value))
+          .map<GroupResult>((value) => GroupResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3501,7 +3585,8 @@
     }
     if (_json.containsKey('properties')) {
       properties = commons.mapMap<core.Object, core.Object>(
-          _json['properties'].cast<core.String, core.Object>(),
+          (_json['properties'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3563,7 +3648,8 @@
   ListAssetsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('listAssetsResults')) {
       listAssetsResults = (_json['listAssetsResults'] as core.List)
-          .map<ListAssetsResult>((value) => ListAssetsResult.fromJson(value))
+          .map<ListAssetsResult>((value) => ListAssetsResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3614,7 +3700,8 @@
 
   ListAssetsResult.fromJson(core.Map _json) {
     if (_json.containsKey('asset')) {
-      asset = Asset.fromJson(_json['asset']);
+      asset =
+          Asset.fromJson(_json['asset'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stateChange')) {
       stateChange = _json['stateChange'] as core.String;
@@ -3653,8 +3740,8 @@
   ListFindingsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('listFindingsResults')) {
       listFindingsResults = (_json['listFindingsResults'] as core.List)
-          .map<ListFindingsResult>(
-              (value) => ListFindingsResult.fromJson(value))
+          .map<ListFindingsResult>((value) => ListFindingsResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3712,10 +3799,12 @@
 
   ListFindingsResult.fromJson(core.Map _json) {
     if (_json.containsKey('finding')) {
-      finding = Finding.fromJson(_json['finding']);
+      finding = Finding.fromJson(
+          _json['finding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resource')) {
-      resource = Resource.fromJson(_json['resource']);
+      resource = Resource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stateChange')) {
       stateChange = _json['stateChange'] as core.String;
@@ -3754,8 +3843,8 @@
     }
     if (_json.containsKey('notificationConfigs')) {
       notificationConfigs = (_json['notificationConfigs'] as core.List)
-          .map<NotificationConfig>(
-              (value) => NotificationConfig.fromJson(value))
+          .map<NotificationConfig>((value) => NotificationConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3789,7 +3878,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3823,7 +3913,8 @@
     }
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<Source>((value) => Source.fromJson(value))
+          .map<Source>((value) =>
+              Source.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3880,7 +3971,8 @@
       serviceAccount = _json['serviceAccount'] as core.String;
     }
     if (_json.containsKey('streamingConfig')) {
-      streamingConfig = StreamingConfig.fromJson(_json['streamingConfig']);
+      streamingConfig = StreamingConfig.fromJson(
+          _json['streamingConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3949,11 +4041,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -3961,7 +4055,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4008,8 +4103,8 @@
 
   OrganizationSettings.fromJson(core.Map _json) {
     if (_json.containsKey('assetDiscoveryConfig')) {
-      assetDiscoveryConfig =
-          AssetDiscoveryConfig.fromJson(_json['assetDiscoveryConfig']);
+      assetDiscoveryConfig = AssetDiscoveryConfig.fromJson(
+          _json['assetDiscoveryConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enableAssetDiscovery')) {
       enableAssetDiscovery = _json['enableAssetDiscovery'] as core.bool;
@@ -4113,12 +4208,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -4344,7 +4441,8 @@
   SecurityMarks.fromJson(core.Map _json) {
     if (_json.containsKey('marks')) {
       marks = commons.mapMap<core.String, core.String>(
-          _json['marks'].cast<core.String, core.String>(),
+          (_json['marks'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -4418,7 +4516,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -4520,7 +4619,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/serviceconsumermanagement/v1.dart b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
index 68c60d1..0ee9055 100644
--- a/generated/googleapis/lib/serviceconsumermanagement/v1.dart
+++ b/generated/googleapis/lib/serviceconsumermanagement/v1.dart
@@ -114,7 +114,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -166,7 +168,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -217,7 +221,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -292,7 +298,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -386,7 +395,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchTenancyUnitsResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchTenancyUnitsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -455,7 +467,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Apply a configuration to an existing tenant project. This project must
@@ -526,7 +540,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Attach an existing project to the tenancy unit as a new tenant resource.
@@ -593,7 +609,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a tenancy unit with no tenant resources. If tenancy unit already
@@ -658,7 +676,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TenancyUnit.fromJson(data));
+    return _response.then(
+      (data) =>
+          TenancyUnit.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a tenancy unit. Before you delete the tenancy unit, there should be
@@ -708,7 +729,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified project resource identified by a tenant resource
@@ -773,7 +796,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Find the tenancy unit for a managed service and service consumer. This
@@ -855,7 +880,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTenancyUnitsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTenancyUnitsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes the specified project resource identified by a tenant resource
@@ -919,7 +947,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Attempts to undelete a previously deleted tenant project. The project must
@@ -981,7 +1011,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1000,7 +1032,8 @@
 
   AddTenantProjectRequest.fromJson(core.Map _json) {
     if (_json.containsKey('projectConfig')) {
-      projectConfig = TenantProjectConfig.fromJson(_json['projectConfig']);
+      projectConfig = TenantProjectConfig.fromJson(
+          _json['projectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tag')) {
       tag = _json['tag'] as core.String;
@@ -1072,12 +1105,14 @@
   Api.fromJson(core.Map _json) {
     if (_json.containsKey('methods')) {
       methods = (_json['methods'] as core.List)
-          .map<Method>((value) => Method.fromJson(value))
+          .map<Method>((value) =>
+              Method.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mixins')) {
       mixins = (_json['mixins'] as core.List)
-          .map<Mixin>((value) => Mixin.fromJson(value))
+          .map<Mixin>((value) =>
+              Mixin.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -1085,11 +1120,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -1138,7 +1175,8 @@
 
   ApplyTenantProjectConfigRequest.fromJson(core.Map _json) {
     if (_json.containsKey('projectConfig')) {
-      projectConfig = TenantProjectConfig.fromJson(_json['projectConfig']);
+      projectConfig = TenantProjectConfig.fromJson(
+          _json['projectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tag')) {
       tag = _json['tag'] as core.String;
@@ -1275,7 +1313,8 @@
     }
     if (_json.containsKey('jwtLocations')) {
       jwtLocations = (_json['jwtLocations'] as core.List)
-          .map<JwtLocation>((value) => JwtLocation.fromJson(value))
+          .map<JwtLocation>((value) => JwtLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1367,13 +1406,14 @@
   Authentication.fromJson(core.Map _json) {
     if (_json.containsKey('providers')) {
       providers = (_json['providers'] as core.List)
-          .map<AuthProvider>((value) => AuthProvider.fromJson(value))
+          .map<AuthProvider>((value) => AuthProvider.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<AuthenticationRule>(
-              (value) => AuthenticationRule.fromJson(value))
+          .map<AuthenticationRule>((value) => AuthenticationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1416,11 +1456,13 @@
       allowWithoutCredential = _json['allowWithoutCredential'] as core.bool;
     }
     if (_json.containsKey('oauth')) {
-      oauth = OAuthRequirements.fromJson(_json['oauth']);
+      oauth = OAuthRequirements.fromJson(
+          _json['oauth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requirements')) {
       requirements = (_json['requirements'] as core.List)
-          .map<AuthRequirement>((value) => AuthRequirement.fromJson(value))
+          .map<AuthRequirement>((value) => AuthRequirement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -1458,7 +1500,8 @@
   Backend.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<BackendRule>((value) => BackendRule.fromJson(value))
+          .map<BackendRule>((value) => BackendRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1642,8 +1685,8 @@
   Billing.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<BillingDestination>(
-              (value) => BillingDestination.fromJson(value))
+          .map<BillingDestination>((value) => BillingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1755,7 +1798,8 @@
   Context.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<ContextRule>((value) => ContextRule.fromJson(value))
+          .map<ContextRule>((value) => ContextRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1912,7 +1956,8 @@
   CustomError.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(value))
+          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('types')) {
@@ -2087,12 +2132,14 @@
     }
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<DocumentationRule>((value) => DocumentationRule.fromJson(value))
+          .map<DocumentationRule>((value) => DocumentationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceRootUrl')) {
@@ -2286,7 +2333,8 @@
   Enum.fromJson(core.Map _json) {
     if (_json.containsKey('enumvalue')) {
       enumvalue = (_json['enumvalue'] as core.List)
-          .map<EnumValue>((value) => EnumValue.fromJson(value))
+          .map<EnumValue>((value) =>
+              EnumValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -2294,11 +2342,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -2348,7 +2398,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2453,7 +2504,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('packed')) {
@@ -2523,7 +2575,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2730,7 +2783,8 @@
   HttpRule.fromJson(core.Map _json) {
     if (_json.containsKey('additionalBindings')) {
       additionalBindings = (_json['additionalBindings'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('allowHalfDuplex')) {
@@ -2740,7 +2794,8 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('custom')) {
-      custom = CustomHttpPattern.fromJson(_json['custom']);
+      custom = CustomHttpPattern.fromJson(
+          _json['custom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delete')) {
       delete = _json['delete'] as core.String;
@@ -2910,7 +2965,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2943,7 +2999,8 @@
     }
     if (_json.containsKey('tenancyUnits')) {
       tenancyUnits = (_json['tenancyUnits'] as core.List)
-          .map<TenancyUnit>((value) => TenancyUnit.fromJson(value))
+          .map<TenancyUnit>((value) => TenancyUnit.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2996,7 +3053,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3052,14 +3110,14 @@
   Logging.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3150,7 +3208,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestStreaming')) {
@@ -3362,14 +3421,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
       launchStage = _json['launchStage'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = MetricDescriptorMetadata.fromJson(_json['metadata']);
+      metadata = MetricDescriptorMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricKind')) {
       metricKind = _json['metricKind'] as core.String;
@@ -3527,7 +3588,8 @@
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
       metricCosts = commons.mapMap<core.String, core.String>(
-          _json['metricCosts'].cast<core.String, core.String>(),
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('selector')) {
@@ -3688,7 +3750,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
@@ -3772,14 +3835,14 @@
   Monitoring.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3915,11 +3978,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -3927,7 +3992,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3979,7 +4045,8 @@
     }
     if (_json.containsKey('value')) {
       value = commons.mapMap<core.Object, core.Object>(
-          _json['value'].cast<core.String, core.Object>(),
+          (_json['value'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4028,7 +4095,8 @@
     }
     if (_json.containsKey('subpages')) {
       subpages = (_json['subpages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4119,12 +4187,14 @@
   Quota.fromJson(core.Map _json) {
     if (_json.containsKey('limits')) {
       limits = (_json['limits'] as core.List)
-          .map<QuotaLimit>((value) => QuotaLimit.fromJson(value))
+          .map<QuotaLimit>((value) =>
+              QuotaLimit.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metricRules')) {
       metricRules = (_json['metricRules'] as core.List)
-          .map<MetricRule>((value) => MetricRule.fromJson(value))
+          .map<MetricRule>((value) =>
+              MetricRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4240,7 +4310,8 @@
     }
     if (_json.containsKey('values')) {
       values = commons.mapMap<core.String, core.String>(
-          _json['values'].cast<core.String, core.String>(),
+          (_json['values'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -4319,7 +4390,8 @@
     }
     if (_json.containsKey('tenancyUnits')) {
       tenancyUnits = (_json['tenancyUnits'] as core.List)
-          .map<TenancyUnit>((value) => TenancyUnit.fromJson(value))
+          .map<TenancyUnit>((value) => TenancyUnit.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4462,70 +4534,86 @@
   Service.fromJson(core.Map _json) {
     if (_json.containsKey('apis')) {
       apis = (_json['apis'] as core.List)
-          .map<Api>((value) => Api.fromJson(value))
+          .map<Api>((value) =>
+              Api.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('authentication')) {
-      authentication = Authentication.fromJson(_json['authentication']);
+      authentication = Authentication.fromJson(
+          _json['authentication'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backend')) {
-      backend = Backend.fromJson(_json['backend']);
+      backend = Backend.fromJson(
+          _json['backend'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('billing')) {
-      billing = Billing.fromJson(_json['billing']);
+      billing = Billing.fromJson(
+          _json['billing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('configVersion')) {
       configVersion = _json['configVersion'] as core.int;
     }
     if (_json.containsKey('context')) {
-      context = Context.fromJson(_json['context']);
+      context = Context.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('control')) {
-      control = Control.fromJson(_json['control']);
+      control = Control.fromJson(
+          _json['control'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customError')) {
-      customError = CustomError.fromJson(_json['customError']);
+      customError = CustomError.fromJson(
+          _json['customError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentation')) {
-      documentation = Documentation.fromJson(_json['documentation']);
+      documentation = Documentation.fromJson(
+          _json['documentation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endpoints')) {
       endpoints = (_json['endpoints'] as core.List)
-          .map<Endpoint>((value) => Endpoint.fromJson(value))
+          .map<Endpoint>((value) =>
+              Endpoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('enums')) {
       enums = (_json['enums'] as core.List)
-          .map<Enum>((value) => Enum.fromJson(value))
+          .map<Enum>((value) =>
+              Enum.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('http')) {
-      http = Http.fromJson(_json['http']);
+      http =
+          Http.fromJson(_json['http'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('logging')) {
-      logging = Logging.fromJson(_json['logging']);
+      logging = Logging.fromJson(
+          _json['logging'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logs')) {
       logs = (_json['logs'] as core.List)
-          .map<LogDescriptor>((value) => LogDescriptor.fromJson(value))
+          .map<LogDescriptor>((value) => LogDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(value))
+          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoredResources')) {
       monitoredResources = (_json['monitoredResources'] as core.List)
-          .map<MonitoredResourceDescriptor>(
-              (value) => MonitoredResourceDescriptor.fromJson(value))
+          .map<MonitoredResourceDescriptor>((value) =>
+              MonitoredResourceDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoring')) {
-      monitoring = Monitoring.fromJson(_json['monitoring']);
+      monitoring = Monitoring.fromJson(
+          _json['monitoring'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -4534,17 +4622,21 @@
       producerProjectId = _json['producerProjectId'] as core.String;
     }
     if (_json.containsKey('quota')) {
-      quota = Quota.fromJson(_json['quota']);
+      quota =
+          Quota.fromJson(_json['quota'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceInfo')) {
-      sourceInfo = SourceInfo.fromJson(_json['sourceInfo']);
+      sourceInfo = SourceInfo.fromJson(
+          _json['sourceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemParameters')) {
-      systemParameters = SystemParameters.fromJson(_json['systemParameters']);
+      systemParameters = SystemParameters.fromJson(
+          _json['systemParameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemTypes')) {
       systemTypes = (_json['systemTypes'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -4552,11 +4644,13 @@
     }
     if (_json.containsKey('types')) {
       types = (_json['types'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('usage')) {
-      usage = Usage.fromJson(_json['usage']);
+      usage =
+          Usage.fromJson(_json['usage'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4772,7 +4866,8 @@
       sourceFiles = (_json['sourceFiles'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -4819,7 +4914,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -4906,7 +5002,8 @@
   SystemParameterRule.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<SystemParameter>((value) => SystemParameter.fromJson(value))
+          .map<SystemParameter>((value) => SystemParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -4949,8 +5046,8 @@
   SystemParameters.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<SystemParameterRule>(
-              (value) => SystemParameterRule.fromJson(value))
+          .map<SystemParameterRule>((value) => SystemParameterRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5002,7 +5099,8 @@
     }
     if (_json.containsKey('tenantResources')) {
       tenantResources = (_json['tenantResources'] as core.List)
-          .map<TenantResource>((value) => TenantResource.fromJson(value))
+          .map<TenantResource>((value) => TenantResource.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5062,19 +5160,21 @@
 
   TenantProjectConfig.fromJson(core.Map _json) {
     if (_json.containsKey('billingConfig')) {
-      billingConfig = BillingConfig.fromJson(_json['billingConfig']);
+      billingConfig = BillingConfig.fromJson(
+          _json['billingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('folder')) {
       folder = _json['folder'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('serviceAccountConfig')) {
-      serviceAccountConfig =
-          ServiceAccountConfig.fromJson(_json['serviceAccountConfig']);
+      serviceAccountConfig = ServiceAccountConfig.fromJson(
+          _json['serviceAccountConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
@@ -5082,8 +5182,8 @@
           .toList();
     }
     if (_json.containsKey('tenantProjectPolicy')) {
-      tenantProjectPolicy =
-          TenantProjectPolicy.fromJson(_json['tenantProjectPolicy']);
+      tenantProjectPolicy = TenantProjectPolicy.fromJson(
+          _json['tenantProjectPolicy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5126,7 +5226,8 @@
   TenantProjectPolicy.fromJson(core.Map _json) {
     if (_json.containsKey('policyBindings')) {
       policyBindings = (_json['policyBindings'] as core.List)
-          .map<PolicyBinding>((value) => PolicyBinding.fromJson(value))
+          .map<PolicyBinding>((value) => PolicyBinding.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5218,7 +5319,8 @@
   Type.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<Field>((value) => Field.fromJson(value))
+          .map<Field>((value) =>
+              Field.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -5231,11 +5333,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -5325,11 +5429,13 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<UsageRule>((value) => UsageRule.fromJson(value))
+          .map<UsageRule>((value) =>
+              UsageRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceIdentity')) {
-      serviceIdentity = ServiceIdentity.fromJson(_json['serviceIdentity']);
+      serviceIdentity = ServiceIdentity.fromJson(
+          _json['serviceIdentity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5442,8 +5548,8 @@
   V1Beta1BatchCreateProducerOverridesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
-          .map<V1Beta1QuotaOverride>(
-              (value) => V1Beta1QuotaOverride.fromJson(value))
+          .map<V1Beta1QuotaOverride>((value) => V1Beta1QuotaOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5500,7 +5606,8 @@
 
   V1Beta1GenerateServiceIdentityResponse.fromJson(core.Map _json) {
     if (_json.containsKey('identity')) {
-      identity = V1Beta1ServiceIdentity.fromJson(_json['identity']);
+      identity = V1Beta1ServiceIdentity.fromJson(
+          _json['identity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5523,8 +5630,8 @@
   V1Beta1ImportProducerOverridesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
-          .map<V1Beta1QuotaOverride>(
-              (value) => V1Beta1QuotaOverride.fromJson(value))
+          .map<V1Beta1QuotaOverride>((value) => V1Beta1QuotaOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5548,8 +5655,9 @@
   V1Beta1ImportProducerQuotaPoliciesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('policies')) {
       policies = (_json['policies'] as core.List)
-          .map<V1Beta1ProducerQuotaPolicy>(
-              (value) => V1Beta1ProducerQuotaPolicy.fromJson(value))
+          .map<V1Beta1ProducerQuotaPolicy>((value) =>
+              V1Beta1ProducerQuotaPolicy.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5611,7 +5719,8 @@
     }
     if (_json.containsKey('dimensions')) {
       dimensions = commons.mapMap<core.String, core.String>(
-          _json['dimensions'].cast<core.String, core.String>(),
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('metric')) {
@@ -5701,7 +5810,8 @@
     }
     if (_json.containsKey('dimensions')) {
       dimensions = commons.mapMap<core.String, core.String>(
-          _json['dimensions'].cast<core.String, core.String>(),
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('metric')) {
@@ -5919,7 +6029,8 @@
       attachStatus = _json['attachStatus'] as core.String;
     }
     if (_json.containsKey('identity')) {
-      identity = V1DefaultIdentity.fromJson(_json['identity']);
+      identity = V1DefaultIdentity.fromJson(
+          _json['identity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('role')) {
       role = _json['role'] as core.String;
@@ -5952,7 +6063,8 @@
 
   V1GenerateServiceAccountResponse.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
-      account = V1ServiceAccount.fromJson(_json['account']);
+      account = V1ServiceAccount.fromJson(
+          _json['account'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/servicecontrol/v1.dart b/generated/googleapis/lib/servicecontrol/v1.dart
index 8df7bf4..754e7c4 100644
--- a/generated/googleapis/lib/servicecontrol/v1.dart
+++ b/generated/googleapis/lib/servicecontrol/v1.dart
@@ -119,7 +119,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AllocateQuotaResponse.fromJson(data));
+    return _response.then(
+      (data) => AllocateQuotaResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Checks whether an operation on a service should be allowed to proceed
@@ -188,7 +191,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CheckResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          CheckResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reports operation results to Google Service Control, such as logs and
@@ -257,7 +263,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReportResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReportResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -302,7 +311,8 @@
 
   AllocateQuotaRequest.fromJson(core.Map _json) {
     if (_json.containsKey('allocateOperation')) {
-      allocateOperation = QuotaOperation.fromJson(_json['allocateOperation']);
+      allocateOperation = QuotaOperation.fromJson(
+          _json['allocateOperation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceConfigId')) {
       serviceConfigId = _json['serviceConfigId'] as core.String;
@@ -350,18 +360,21 @@
   AllocateQuotaResponse.fromJson(core.Map _json) {
     if (_json.containsKey('allocateErrors')) {
       allocateErrors = (_json['allocateErrors'] as core.List)
-          .map<QuotaError>((value) => QuotaError.fromJson(value))
+          .map<QuotaError>((value) =>
+              QuotaError.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('allocateInfo')) {
-      allocateInfo = AllocateInfo.fromJson(_json['allocateInfo']);
+      allocateInfo = AllocateInfo.fromJson(
+          _json['allocateInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operationId')) {
       operationId = _json['operationId'] as core.String;
     }
     if (_json.containsKey('quotaMetrics')) {
       quotaMetrics = (_json['quotaMetrics'] as core.List)
-          .map<MetricValueSet>((value) => MetricValueSet.fromJson(value))
+          .map<MetricValueSet>((value) => MetricValueSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceConfigId')) {
@@ -413,7 +426,8 @@
       intValue = _json['intValue'] as core.String;
     }
     if (_json.containsKey('stringValue')) {
-      stringValue = TruncatableString.fromJson(_json['stringValue']);
+      stringValue = TruncatableString.fromJson(
+          _json['stringValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -451,8 +465,10 @@
   Attributes.fromJson(core.Map _json) {
     if (_json.containsKey('attributeMap')) {
       attributeMap = commons.mapMap<core.Map, AttributeValue>(
-          _json['attributeMap'].cast<core.String, core.Map>(),
-          (core.Map item) => AttributeValue.fromJson(item));
+          (_json['attributeMap'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => AttributeValue.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('droppedAttributesCount')) {
       droppedAttributesCount = _json['droppedAttributesCount'] as core.int;
@@ -561,17 +577,19 @@
 
   AuditLog.fromJson(core.Map _json) {
     if (_json.containsKey('authenticationInfo')) {
-      authenticationInfo =
-          AuthenticationInfo.fromJson(_json['authenticationInfo']);
+      authenticationInfo = AuthenticationInfo.fromJson(
+          _json['authenticationInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('authorizationInfo')) {
       authorizationInfo = (_json['authorizationInfo'] as core.List)
-          .map<AuthorizationInfo>((value) => AuthorizationInfo.fromJson(value))
+          .map<AuthorizationInfo>((value) => AuthorizationInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('methodName')) {
@@ -582,38 +600,46 @@
     }
     if (_json.containsKey('request')) {
       request = commons.mapMap<core.Object, core.Object>(
-          _json['request'].cast<core.String, core.Object>(),
+          (_json['request'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('requestMetadata')) {
-      requestMetadata = RequestMetadata.fromJson(_json['requestMetadata']);
+      requestMetadata = RequestMetadata.fromJson(
+          _json['requestMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceLocation')) {
-      resourceLocation = ResourceLocation.fromJson(_json['resourceLocation']);
+      resourceLocation = ResourceLocation.fromJson(
+          _json['resourceLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resourceName')) {
       resourceName = _json['resourceName'] as core.String;
     }
     if (_json.containsKey('resourceOriginalState')) {
       resourceOriginalState = commons.mapMap<core.Object, core.Object>(
-          _json['resourceOriginalState'].cast<core.String, core.Object>(),
+          (_json['resourceOriginalState']
+                  as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('serviceData')) {
       serviceData = commons.mapMap<core.Object, core.Object>(
-          _json['serviceData'].cast<core.String, core.Object>(),
+          (_json['serviceData'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('serviceName')) {
       serviceName = _json['serviceName'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -732,7 +758,8 @@
     }
     if (_json.containsKey('claims')) {
       claims = commons.mapMap<core.Object, core.Object>(
-          _json['claims'].cast<core.String, core.Object>(),
+          (_json['claims'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('presenter')) {
@@ -818,8 +845,9 @@
     if (_json.containsKey('serviceAccountDelegationInfo')) {
       serviceAccountDelegationInfo =
           (_json['serviceAccountDelegationInfo'] as core.List)
-              .map<ServiceAccountDelegationInfo>(
-                  (value) => ServiceAccountDelegationInfo.fromJson(value))
+              .map<ServiceAccountDelegationInfo>((value) =>
+                  ServiceAccountDelegationInfo.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('serviceAccountKeyName')) {
@@ -827,7 +855,8 @@
     }
     if (_json.containsKey('thirdPartyPrincipal')) {
       thirdPartyPrincipal = commons.mapMap<core.Object, core.Object>(
-          _json['thirdPartyPrincipal'].cast<core.String, core.Object>(),
+          (_json['thirdPartyPrincipal'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -888,7 +917,8 @@
       resource = _json['resource'] as core.String;
     }
     if (_json.containsKey('resourceAttributes')) {
-      resourceAttributes = Resource.fromJson(_json['resourceAttributes']);
+      resourceAttributes = Resource.fromJson(
+          _json['resourceAttributes'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1006,7 +1036,8 @@
       detail = _json['detail'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subject')) {
       subject = _json['subject'] as core.String;
@@ -1045,7 +1076,8 @@
 
   CheckInfo.fromJson(core.Map _json) {
     if (_json.containsKey('consumerInfo')) {
-      consumerInfo = ConsumerInfo.fromJson(_json['consumerInfo']);
+      consumerInfo = ConsumerInfo.fromJson(
+          _json['consumerInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unusedArguments')) {
       unusedArguments = (_json['unusedArguments'] as core.List)
@@ -1089,7 +1121,8 @@
 
   CheckRequest.fromJson(core.Map _json) {
     if (_json.containsKey('operation')) {
-      operation = Operation.fromJson(_json['operation']);
+      operation = Operation.fromJson(
+          _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestProjectSettings')) {
       requestProjectSettings = _json['requestProjectSettings'] as core.bool;
@@ -1148,17 +1181,20 @@
   CheckResponse.fromJson(core.Map _json) {
     if (_json.containsKey('checkErrors')) {
       checkErrors = (_json['checkErrors'] as core.List)
-          .map<CheckError>((value) => CheckError.fromJson(value))
+          .map<CheckError>((value) =>
+              CheckError.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('checkInfo')) {
-      checkInfo = CheckInfo.fromJson(_json['checkInfo']);
+      checkInfo = CheckInfo.fromJson(
+          _json['checkInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('operationId')) {
       operationId = _json['operationId'] as core.String;
     }
     if (_json.containsKey('quotaInfo')) {
-      quotaInfo = QuotaInfo.fromJson(_json['quotaInfo']);
+      quotaInfo = QuotaInfo.fromJson(
+          _json['quotaInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceConfigId')) {
       serviceConfigId = _json['serviceConfigId'] as core.String;
@@ -1308,18 +1344,21 @@
     }
     if (_json.containsKey('exemplars')) {
       exemplars = (_json['exemplars'] as core.List)
-          .map<Exemplar>((value) => Exemplar.fromJson(value))
+          .map<Exemplar>((value) =>
+              Exemplar.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('explicitBuckets')) {
-      explicitBuckets = ExplicitBuckets.fromJson(_json['explicitBuckets']);
+      explicitBuckets = ExplicitBuckets.fromJson(
+          _json['explicitBuckets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('exponentialBuckets')) {
-      exponentialBuckets =
-          ExponentialBuckets.fromJson(_json['exponentialBuckets']);
+      exponentialBuckets = ExponentialBuckets.fromJson(
+          _json['exponentialBuckets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linearBuckets')) {
-      linearBuckets = LinearBuckets.fromJson(_json['linearBuckets']);
+      linearBuckets = LinearBuckets.fromJson(
+          _json['linearBuckets'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maximum')) {
       maximum = (_json['maximum'] as core.num).toDouble();
@@ -1403,7 +1442,8 @@
       attachments = (_json['attachments'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -1527,7 +1567,8 @@
     }
     if (_json.containsKey('serviceMetadata')) {
       serviceMetadata = commons.mapMap<core.Object, core.Object>(
-          _json['serviceMetadata'].cast<core.String, core.Object>(),
+          (_json['serviceMetadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1827,36 +1868,42 @@
 
   LogEntry.fromJson(core.Map _json) {
     if (_json.containsKey('httpRequest')) {
-      httpRequest = HttpRequest.fromJson(_json['httpRequest']);
+      httpRequest = HttpRequest.fromJson(
+          _json['httpRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertId')) {
       insertId = _json['insertId'] as core.String;
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('operation')) {
-      operation = LogEntryOperation.fromJson(_json['operation']);
+      operation = LogEntryOperation.fromJson(
+          _json['operation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protoPayload')) {
       protoPayload = commons.mapMap<core.Object, core.Object>(
-          _json['protoPayload'].cast<core.String, core.Object>(),
+          (_json['protoPayload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('severity')) {
       severity = _json['severity'] as core.String;
     }
     if (_json.containsKey('sourceLocation')) {
-      sourceLocation = LogEntrySourceLocation.fromJson(_json['sourceLocation']);
+      sourceLocation = LogEntrySourceLocation.fromJson(
+          _json['sourceLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('structPayload')) {
       structPayload = commons.mapMap<core.Object, core.Object>(
-          _json['structPayload'].cast<core.String, core.Object>(),
+          (_json['structPayload'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('textPayload')) {
@@ -2057,7 +2104,8 @@
       boolValue = _json['boolValue'] as core.bool;
     }
     if (_json.containsKey('distributionValue')) {
-      distributionValue = Distribution.fromJson(_json['distributionValue']);
+      distributionValue = Distribution.fromJson(
+          _json['distributionValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('doubleValue')) {
       doubleValue = (_json['doubleValue'] as core.num).toDouble();
@@ -2070,11 +2118,13 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('moneyValue')) {
-      moneyValue = Money.fromJson(_json['moneyValue']);
+      moneyValue = Money.fromJson(
+          _json['moneyValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -2135,7 +2185,8 @@
     }
     if (_json.containsKey('metricValues')) {
       metricValues = (_json['metricValues'] as core.List)
-          .map<MetricValue>((value) => MetricValue.fromJson(value))
+          .map<MetricValue>((value) => MetricValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2308,7 +2359,8 @@
       extensions = (_json['extensions'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -2317,17 +2369,20 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('logEntries')) {
       logEntries = (_json['logEntries'] as core.List)
-          .map<LogEntry>((value) => LogEntry.fromJson(value))
+          .map<LogEntry>((value) =>
+              LogEntry.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metricValueSets')) {
       metricValueSets = (_json['metricValueSets'] as core.List)
-          .map<MetricValueSet>((value) => MetricValueSet.fromJson(value))
+          .map<MetricValueSet>((value) => MetricValueSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('operationId')) {
@@ -2337,11 +2392,13 @@
       operationName = _json['operationName'] as core.String;
     }
     if (_json.containsKey('quotaProperties')) {
-      quotaProperties = QuotaProperties.fromJson(_json['quotaProperties']);
+      quotaProperties = QuotaProperties.fromJson(
+          _json['quotaProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resources')) {
       resources = (_json['resources'] as core.List)
-          .map<ResourceInfo>((value) => ResourceInfo.fromJson(value))
+          .map<ResourceInfo>((value) => ResourceInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startTime')) {
@@ -2349,12 +2406,14 @@
     }
     if (_json.containsKey('traceSpans')) {
       traceSpans = (_json['traceSpans'] as core.List)
-          .map<TraceSpan>((value) => TraceSpan.fromJson(value))
+          .map<TraceSpan>((value) =>
+              TraceSpan.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('userLabels')) {
       userLabels = commons.mapMap<core.String, core.String>(
-          _json['userLabels'].cast<core.String, core.String>(),
+          (_json['userLabels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -2440,7 +2499,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('port')) {
@@ -2584,12 +2644,14 @@
     }
     if (_json.containsKey('quotaConsumed')) {
       quotaConsumed = commons.mapMap<core.int, core.int>(
-          _json['quotaConsumed'].cast<core.String, core.int>(),
+          (_json['quotaConsumed'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.int>(),
           (core.int item) => item as core.int);
     }
     if (_json.containsKey('quotaMetrics')) {
       quotaMetrics = (_json['quotaMetrics'] as core.List)
-          .map<MetricValueSet>((value) => MetricValueSet.fromJson(value))
+          .map<MetricValueSet>((value) => MetricValueSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2687,7 +2749,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('methodName')) {
@@ -2698,7 +2761,8 @@
     }
     if (_json.containsKey('quotaMetrics')) {
       quotaMetrics = (_json['quotaMetrics'] as core.List)
-          .map<MetricValueSet>((value) => MetricValueSet.fromJson(value))
+          .map<MetricValueSet>((value) => MetricValueSet.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('quotaMode')) {
@@ -2779,7 +2843,8 @@
       operationId = _json['operationId'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2810,7 +2875,8 @@
       operationId = _json['operationId'] as core.String;
     }
     if (_json.containsKey('quotaInfo')) {
-      quotaInfo = QuotaInfo.fromJson(_json['quotaInfo']);
+      quotaInfo = QuotaInfo.fromJson(
+          _json['quotaInfo'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2847,7 +2913,8 @@
   ReportRequest.fromJson(core.Map _json) {
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceConfigId')) {
@@ -2901,12 +2968,14 @@
   ReportResponse.fromJson(core.Map _json) {
     if (_json.containsKey('reportErrors')) {
       reportErrors = (_json['reportErrors'] as core.List)
-          .map<ReportError>((value) => ReportError.fromJson(value))
+          .map<ReportError>((value) => ReportError.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('reportInfos')) {
       reportInfos = (_json['reportInfos'] as core.List)
-          .map<ReportInfo>((value) => ReportInfo.fromJson(value))
+          .map<ReportInfo>((value) =>
+              ReportInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceConfigId')) {
@@ -2992,11 +3061,13 @@
 
   Request.fromJson(core.Map _json) {
     if (_json.containsKey('auth')) {
-      auth = Auth.fromJson(_json['auth']);
+      auth =
+          Auth.fromJson(_json['auth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headers')) {
       headers = commons.mapMap<core.String, core.String>(
-          _json['headers'].cast<core.String, core.String>(),
+          (_json['headers'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('host')) {
@@ -3129,10 +3200,12 @@
       callerSuppliedUserAgent = _json['callerSuppliedUserAgent'] as core.String;
     }
     if (_json.containsKey('destinationAttributes')) {
-      destinationAttributes = Peer.fromJson(_json['destinationAttributes']);
+      destinationAttributes = Peer.fromJson(_json['destinationAttributes']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestAttributes')) {
-      requestAttributes = Request.fromJson(_json['requestAttributes']);
+      requestAttributes = Request.fromJson(
+          _json['requestAttributes'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3191,7 +3264,8 @@
   Resource.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -3319,12 +3393,12 @@
 
   ServiceAccountDelegationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('firstPartyPrincipal')) {
-      firstPartyPrincipal =
-          FirstPartyPrincipal.fromJson(_json['firstPartyPrincipal']);
+      firstPartyPrincipal = FirstPartyPrincipal.fromJson(
+          _json['firstPartyPrincipal'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('thirdPartyPrincipal')) {
-      thirdPartyPrincipal =
-          ThirdPartyPrincipal.fromJson(_json['thirdPartyPrincipal']);
+      thirdPartyPrincipal = ThirdPartyPrincipal.fromJson(
+          _json['thirdPartyPrincipal'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3401,7 +3475,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -3438,7 +3513,8 @@
   ThirdPartyPrincipal.fromJson(core.Map _json) {
     if (_json.containsKey('thirdPartyClaims')) {
       thirdPartyClaims = commons.mapMap<core.Object, core.Object>(
-          _json['thirdPartyClaims'].cast<core.String, core.Object>(),
+          (_json['thirdPartyClaims'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3532,13 +3608,15 @@
 
   TraceSpan.fromJson(core.Map _json) {
     if (_json.containsKey('attributes')) {
-      attributes = Attributes.fromJson(_json['attributes']);
+      attributes = Attributes.fromJson(
+          _json['attributes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('childSpanCount')) {
       childSpanCount = _json['childSpanCount'] as core.int;
     }
     if (_json.containsKey('displayName')) {
-      displayName = TruncatableString.fromJson(_json['displayName']);
+      displayName = TruncatableString.fromJson(
+          _json['displayName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
@@ -3562,7 +3640,8 @@
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/servicemanagement/v1.dart b/generated/googleapis/lib/servicemanagement/v1.dart
index 5a463fd..258de9e 100644
--- a/generated/googleapis/lib/servicemanagement/v1.dart
+++ b/generated/googleapis/lib/servicemanagement/v1.dart
@@ -115,7 +115,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists service operations that match the specified filter in the request.
@@ -194,7 +196,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -260,7 +265,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a managed service. This method will change the service to the
@@ -313,7 +320,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables a service for a project, so it can be used for the project. See
@@ -372,7 +381,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Generates and returns a report (errors, warnings and changes from existing
@@ -428,8 +439,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GenerateConfigReportResponse.fromJson(data));
+    return _response.then(
+      (data) => GenerateConfigReportResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a managed service. Authentication is required unless the service is
@@ -480,7 +493,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ManagedService.fromJson(data));
+    return _response.then(
+      (data) =>
+          ManagedService.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a service configuration (version) for a managed service.
@@ -553,7 +569,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -613,7 +631,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists managed services. Returns all public services. For authenticated
@@ -688,7 +708,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -749,7 +772,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -812,7 +837,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Revives a previously deleted managed service. The method restores the
@@ -867,7 +895,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -935,7 +965,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a service configuration (version) for a managed service.
@@ -1009,7 +1041,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Service.fromJson(data));
+    return _response.then(
+      (data) => Service.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the history of the service configuration for a managed service, from
@@ -1075,7 +1109,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServiceConfigsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServiceConfigsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new service configuration (version) for a managed service based
@@ -1140,7 +1177,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1207,7 +1246,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -1268,7 +1309,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -1331,7 +1374,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1404,7 +1450,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a service configuration rollout.
@@ -1463,7 +1511,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Rollout.fromJson(data));
+    return _response.then(
+      (data) => Rollout.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the history of the service configuration rollouts for a managed
@@ -1540,7 +1590,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServiceRolloutsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServiceRolloutsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1621,12 +1674,14 @@
   Api.fromJson(core.Map _json) {
     if (_json.containsKey('methods')) {
       methods = (_json['methods'] as core.List)
-          .map<Method>((value) => Method.fromJson(value))
+          .map<Method>((value) =>
+              Method.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mixins')) {
       mixins = (_json['mixins'] as core.List)
-          .map<Mixin>((value) => Mixin.fromJson(value))
+          .map<Mixin>((value) =>
+              Mixin.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -1634,11 +1689,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -1705,7 +1762,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -1841,7 +1899,8 @@
     }
     if (_json.containsKey('jwtLocations')) {
       jwtLocations = (_json['jwtLocations'] as core.List)
-          .map<JwtLocation>((value) => JwtLocation.fromJson(value))
+          .map<JwtLocation>((value) => JwtLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1933,13 +1992,14 @@
   Authentication.fromJson(core.Map _json) {
     if (_json.containsKey('providers')) {
       providers = (_json['providers'] as core.List)
-          .map<AuthProvider>((value) => AuthProvider.fromJson(value))
+          .map<AuthProvider>((value) => AuthProvider.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<AuthenticationRule>(
-              (value) => AuthenticationRule.fromJson(value))
+          .map<AuthenticationRule>((value) => AuthenticationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1982,11 +2042,13 @@
       allowWithoutCredential = _json['allowWithoutCredential'] as core.bool;
     }
     if (_json.containsKey('oauth')) {
-      oauth = OAuthRequirements.fromJson(_json['oauth']);
+      oauth = OAuthRequirements.fromJson(
+          _json['oauth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requirements')) {
       requirements = (_json['requirements'] as core.List)
-          .map<AuthRequirement>((value) => AuthRequirement.fromJson(value))
+          .map<AuthRequirement>((value) => AuthRequirement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -2024,7 +2086,8 @@
   Backend.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<BackendRule>((value) => BackendRule.fromJson(value))
+          .map<BackendRule>((value) => BackendRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2208,8 +2271,8 @@
   Billing.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<BillingDestination>(
-              (value) => BillingDestination.fromJson(value))
+          .map<BillingDestination>((value) => BillingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2310,7 +2373,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -2353,7 +2417,8 @@
   ChangeReport.fromJson(core.Map _json) {
     if (_json.containsKey('configChanges')) {
       configChanges = (_json['configChanges'] as core.List)
-          .map<ConfigChange>((value) => ConfigChange.fromJson(value))
+          .map<ConfigChange>((value) => ConfigChange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2411,7 +2476,8 @@
   ConfigChange.fromJson(core.Map _json) {
     if (_json.containsKey('advices')) {
       advices = (_json['advices'] as core.List)
-          .map<Advice>((value) => Advice.fromJson(value))
+          .map<Advice>((value) =>
+              Advice.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('changeType')) {
@@ -2551,7 +2617,8 @@
   ConfigSource.fromJson(core.Map _json) {
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
-          .map<ConfigFile>((value) => ConfigFile.fromJson(value))
+          .map<ConfigFile>((value) =>
+              ConfigFile.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -2595,7 +2662,8 @@
   Context.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<ContextRule>((value) => ContextRule.fromJson(value))
+          .map<ContextRule>((value) => ContextRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2723,7 +2791,8 @@
   CustomError.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(value))
+          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('types')) {
@@ -2948,12 +3017,14 @@
     }
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<DocumentationRule>((value) => DocumentationRule.fromJson(value))
+          .map<DocumentationRule>((value) => DocumentationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceRootUrl')) {
@@ -3168,7 +3239,8 @@
   Enum.fromJson(core.Map _json) {
     if (_json.containsKey('enumvalue')) {
       enumvalue = (_json['enumvalue'] as core.List)
-          .map<EnumValue>((value) => EnumValue.fromJson(value))
+          .map<EnumValue>((value) =>
+              EnumValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3176,11 +3248,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -3230,7 +3304,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3403,7 +3478,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('packed')) {
@@ -3507,12 +3583,14 @@
   GenerateConfigReportRequest.fromJson(core.Map _json) {
     if (_json.containsKey('newConfig')) {
       newConfig = commons.mapMap<core.Object, core.Object>(
-          _json['newConfig'].cast<core.String, core.Object>(),
+          (_json['newConfig'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('oldConfig')) {
       oldConfig = commons.mapMap<core.Object, core.Object>(
-          _json['oldConfig'].cast<core.String, core.Object>(),
+          (_json['oldConfig'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -3550,12 +3628,14 @@
   GenerateConfigReportResponse.fromJson(core.Map _json) {
     if (_json.containsKey('changeReports')) {
       changeReports = (_json['changeReports'] as core.List)
-          .map<ChangeReport>((value) => ChangeReport.fromJson(value))
+          .map<ChangeReport>((value) => ChangeReport.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('diagnostics')) {
       diagnostics = (_json['diagnostics'] as core.List)
-          .map<Diagnostic>((value) => Diagnostic.fromJson(value))
+          .map<Diagnostic>((value) =>
+              Diagnostic.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('id')) {
@@ -3596,7 +3676,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3660,7 +3741,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3867,7 +3949,8 @@
   HttpRule.fromJson(core.Map _json) {
     if (_json.containsKey('additionalBindings')) {
       additionalBindings = (_json['additionalBindings'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('allowHalfDuplex')) {
@@ -3877,7 +3960,8 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('custom')) {
-      custom = CustomHttpPattern.fromJson(_json['custom']);
+      custom = CustomHttpPattern.fromJson(
+          _json['custom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delete')) {
       delete = _json['delete'] as core.String;
@@ -4047,7 +4131,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4080,7 +4165,8 @@
     }
     if (_json.containsKey('serviceConfigs')) {
       serviceConfigs = (_json['serviceConfigs'] as core.List)
-          .map<Service>((value) => Service.fromJson(value))
+          .map<Service>((value) =>
+              Service.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4114,7 +4200,8 @@
     }
     if (_json.containsKey('rollouts')) {
       rollouts = (_json['rollouts'] as core.List)
-          .map<Rollout>((value) => Rollout.fromJson(value))
+          .map<Rollout>((value) =>
+              Rollout.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4147,7 +4234,8 @@
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<ManagedService>((value) => ManagedService.fromJson(value))
+          .map<ManagedService>((value) => ManagedService.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4199,7 +4287,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -4255,14 +4344,14 @@
   Logging.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4386,7 +4475,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestStreaming')) {
@@ -4598,14 +4688,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
       launchStage = _json['launchStage'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = MetricDescriptorMetadata.fromJson(_json['metadata']);
+      metadata = MetricDescriptorMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricKind')) {
       metricKind = _json['metricKind'] as core.String;
@@ -4763,7 +4855,8 @@
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
       metricCosts = commons.mapMap<core.String, core.String>(
-          _json['metricCosts'].cast<core.String, core.String>(),
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('selector')) {
@@ -4924,7 +5017,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
@@ -5008,14 +5102,14 @@
   Monitoring.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5151,11 +5245,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -5163,7 +5259,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -5220,7 +5317,8 @@
     }
     if (_json.containsKey('steps')) {
       steps = (_json['steps'] as core.List)
-          .map<Step>((value) => Step.fromJson(value))
+          .map<Step>((value) =>
+              Step.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5269,7 +5367,8 @@
     }
     if (_json.containsKey('value')) {
       value = commons.mapMap<core.Object, core.Object>(
-          _json['value'].cast<core.String, core.Object>(),
+          (_json['value'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -5318,7 +5417,8 @@
     }
     if (_json.containsKey('subpages')) {
       subpages = (_json['subpages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5417,12 +5517,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -5487,12 +5589,14 @@
   Quota.fromJson(core.Map _json) {
     if (_json.containsKey('limits')) {
       limits = (_json['limits'] as core.List)
-          .map<QuotaLimit>((value) => QuotaLimit.fromJson(value))
+          .map<QuotaLimit>((value) =>
+              QuotaLimit.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metricRules')) {
       metricRules = (_json['metricRules'] as core.List)
-          .map<MetricRule>((value) => MetricRule.fromJson(value))
+          .map<MetricRule>((value) =>
+              MetricRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5608,7 +5712,8 @@
     }
     if (_json.containsKey('values')) {
       values = commons.mapMap<core.String, core.String>(
-          _json['values'].cast<core.String, core.String>(),
+          (_json['values'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -5748,8 +5853,9 @@
       createdBy = _json['createdBy'] as core.String;
     }
     if (_json.containsKey('deleteServiceStrategy')) {
-      deleteServiceStrategy =
-          DeleteServiceStrategy.fromJson(_json['deleteServiceStrategy']);
+      deleteServiceStrategy = DeleteServiceStrategy.fromJson(
+          _json['deleteServiceStrategy']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rolloutId')) {
       rolloutId = _json['rolloutId'] as core.String;
@@ -5761,8 +5867,9 @@
       status = _json['status'] as core.String;
     }
     if (_json.containsKey('trafficPercentStrategy')) {
-      trafficPercentStrategy =
-          TrafficPercentStrategy.fromJson(_json['trafficPercentStrategy']);
+      trafficPercentStrategy = TrafficPercentStrategy.fromJson(
+          _json['trafficPercentStrategy']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5918,70 +6025,86 @@
   Service.fromJson(core.Map _json) {
     if (_json.containsKey('apis')) {
       apis = (_json['apis'] as core.List)
-          .map<Api>((value) => Api.fromJson(value))
+          .map<Api>((value) =>
+              Api.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('authentication')) {
-      authentication = Authentication.fromJson(_json['authentication']);
+      authentication = Authentication.fromJson(
+          _json['authentication'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backend')) {
-      backend = Backend.fromJson(_json['backend']);
+      backend = Backend.fromJson(
+          _json['backend'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('billing')) {
-      billing = Billing.fromJson(_json['billing']);
+      billing = Billing.fromJson(
+          _json['billing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('configVersion')) {
       configVersion = _json['configVersion'] as core.int;
     }
     if (_json.containsKey('context')) {
-      context = Context.fromJson(_json['context']);
+      context = Context.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('control')) {
-      control = Control.fromJson(_json['control']);
+      control = Control.fromJson(
+          _json['control'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customError')) {
-      customError = CustomError.fromJson(_json['customError']);
+      customError = CustomError.fromJson(
+          _json['customError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentation')) {
-      documentation = Documentation.fromJson(_json['documentation']);
+      documentation = Documentation.fromJson(
+          _json['documentation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endpoints')) {
       endpoints = (_json['endpoints'] as core.List)
-          .map<Endpoint>((value) => Endpoint.fromJson(value))
+          .map<Endpoint>((value) =>
+              Endpoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('enums')) {
       enums = (_json['enums'] as core.List)
-          .map<Enum>((value) => Enum.fromJson(value))
+          .map<Enum>((value) =>
+              Enum.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('http')) {
-      http = Http.fromJson(_json['http']);
+      http =
+          Http.fromJson(_json['http'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('logging')) {
-      logging = Logging.fromJson(_json['logging']);
+      logging = Logging.fromJson(
+          _json['logging'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logs')) {
       logs = (_json['logs'] as core.List)
-          .map<LogDescriptor>((value) => LogDescriptor.fromJson(value))
+          .map<LogDescriptor>((value) => LogDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(value))
+          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoredResources')) {
       monitoredResources = (_json['monitoredResources'] as core.List)
-          .map<MonitoredResourceDescriptor>(
-              (value) => MonitoredResourceDescriptor.fromJson(value))
+          .map<MonitoredResourceDescriptor>((value) =>
+              MonitoredResourceDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoring')) {
-      monitoring = Monitoring.fromJson(_json['monitoring']);
+      monitoring = Monitoring.fromJson(
+          _json['monitoring'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5990,17 +6113,21 @@
       producerProjectId = _json['producerProjectId'] as core.String;
     }
     if (_json.containsKey('quota')) {
-      quota = Quota.fromJson(_json['quota']);
+      quota =
+          Quota.fromJson(_json['quota'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceInfo')) {
-      sourceInfo = SourceInfo.fromJson(_json['sourceInfo']);
+      sourceInfo = SourceInfo.fromJson(
+          _json['sourceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemParameters')) {
-      systemParameters = SystemParameters.fromJson(_json['systemParameters']);
+      systemParameters = SystemParameters.fromJson(
+          _json['systemParameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemTypes')) {
       systemTypes = (_json['systemTypes'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -6008,11 +6135,13 @@
     }
     if (_json.containsKey('types')) {
       types = (_json['types'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('usage')) {
-      usage = Usage.fromJson(_json['usage']);
+      usage =
+          Usage.fromJson(_json['usage'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6169,7 +6298,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -6227,7 +6357,8 @@
       sourceFiles = (_json['sourceFiles'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -6274,7 +6405,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -6351,7 +6483,8 @@
 
   SubmitConfigSourceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('configSource')) {
-      configSource = ConfigSource.fromJson(_json['configSource']);
+      configSource = ConfigSource.fromJson(
+          _json['configSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('validateOnly')) {
       validateOnly = _json['validateOnly'] as core.bool;
@@ -6379,7 +6512,8 @@
 
   SubmitConfigSourceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('serviceConfig')) {
-      serviceConfig = Service.fromJson(_json['serviceConfig']);
+      serviceConfig = Service.fromJson(
+          _json['serviceConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6455,7 +6589,8 @@
   SystemParameterRule.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<SystemParameter>((value) => SystemParameter.fromJson(value))
+          .map<SystemParameter>((value) => SystemParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -6498,8 +6633,8 @@
   SystemParameters.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<SystemParameterRule>(
-              (value) => SystemParameterRule.fromJson(value))
+          .map<SystemParameterRule>((value) => SystemParameterRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6586,7 +6721,8 @@
   TrafficPercentStrategy.fromJson(core.Map _json) {
     if (_json.containsKey('percentages')) {
       percentages = commons.mapMap<core.num, core.double>(
-          _json['percentages'].cast<core.String, core.num>(),
+          (_json['percentages'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.num>(),
           (core.num item) => (item as core.num).toDouble());
     }
   }
@@ -6628,7 +6764,8 @@
   Type.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<Field>((value) => Field.fromJson(value))
+          .map<Field>((value) =>
+              Field.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -6641,11 +6778,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -6685,7 +6824,8 @@
 
   UndeleteServiceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('service')) {
-      service = ManagedService.fromJson(_json['service']);
+      service = ManagedService.fromJson(
+          _json['service'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6734,11 +6874,13 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<UsageRule>((value) => UsageRule.fromJson(value))
+          .map<UsageRule>((value) =>
+              UsageRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceIdentity')) {
-      serviceIdentity = ServiceIdentity.fromJson(_json['serviceIdentity']);
+      serviceIdentity = ServiceIdentity.fromJson(
+          _json['serviceIdentity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/servicenetworking/v1.dart b/generated/googleapis/lib/servicenetworking/v1.dart
index 5f6d08d..46bd2c9 100644
--- a/generated/googleapis/lib/servicenetworking/v1.dart
+++ b/generated/googleapis/lib/servicenetworking/v1.dart
@@ -118,7 +118,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -170,7 +172,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -221,7 +225,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -296,7 +302,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -383,7 +392,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Disables VPC service controls for a connection.
@@ -442,7 +453,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enables VPC service controls for a connection.
@@ -501,7 +514,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Service producers can use this method to find a currently unused range
@@ -565,7 +580,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Service producers use this method to validate if the consumer provided
@@ -627,8 +644,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ValidateConsumerConfigResponse.fromJson(data));
+    return _response.then(
+      (data) => ValidateConsumerConfigResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -700,7 +719,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List the private connections that are configured in a service consumer's
@@ -767,7 +788,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListConnectionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListConnectionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the allocated ranges that are assigned to a connection.
@@ -841,7 +865,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -908,7 +934,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Service producers can use this method to remove DNS record sets from
@@ -968,7 +996,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Service producers can use this method to update DNS record sets from
@@ -1028,7 +1058,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1096,7 +1128,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Service producers can use this method to remove private DNS zones in the
@@ -1157,7 +1191,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1264,7 +1300,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a peered DNS domain.
@@ -1322,7 +1360,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists peered DNS domains for a connection.
@@ -1381,8 +1421,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListPeeredDnsDomainsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPeeredDnsDomainsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1449,7 +1491,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1491,7 +1535,8 @@
       consumerNetwork = _json['consumerNetwork'] as core.String;
     }
     if (_json.containsKey('dnsRecordSet')) {
-      dnsRecordSet = DnsRecordSet.fromJson(_json['dnsRecordSet']);
+      dnsRecordSet = DnsRecordSet.fromJson(
+          _json['dnsRecordSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -1589,10 +1634,12 @@
 
   AddDnsZoneResponse.fromJson(core.Map _json) {
     if (_json.containsKey('consumerPeeringZone')) {
-      consumerPeeringZone = DnsZone.fromJson(_json['consumerPeeringZone']);
+      consumerPeeringZone = DnsZone.fromJson(
+          _json['consumerPeeringZone'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('producerPrivateZone')) {
-      producerPrivateZone = DnsZone.fromJson(_json['producerPrivateZone']);
+      producerPrivateZone = DnsZone.fromJson(
+          _json['producerPrivateZone'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1642,7 +1689,8 @@
     }
     if (_json.containsKey('policyBinding')) {
       policyBinding = (_json['policyBinding'] as core.List)
-          .map<PolicyBinding>((value) => PolicyBinding.fromJson(value))
+          .map<PolicyBinding>((value) => PolicyBinding.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1671,7 +1719,8 @@
   AddRolesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('policyBinding')) {
       policyBinding = (_json['policyBinding'] as core.List)
-          .map<PolicyBinding>((value) => PolicyBinding.fromJson(value))
+          .map<PolicyBinding>((value) => PolicyBinding.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1847,12 +1896,14 @@
   Api.fromJson(core.Map _json) {
     if (_json.containsKey('methods')) {
       methods = (_json['methods'] as core.List)
-          .map<Method>((value) => Method.fromJson(value))
+          .map<Method>((value) =>
+              Method.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mixins')) {
       mixins = (_json['mixins'] as core.List)
-          .map<Mixin>((value) => Mixin.fromJson(value))
+          .map<Mixin>((value) =>
+              Mixin.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -1860,11 +1911,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -1973,7 +2026,8 @@
     }
     if (_json.containsKey('jwtLocations')) {
       jwtLocations = (_json['jwtLocations'] as core.List)
-          .map<JwtLocation>((value) => JwtLocation.fromJson(value))
+          .map<JwtLocation>((value) => JwtLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2065,13 +2119,14 @@
   Authentication.fromJson(core.Map _json) {
     if (_json.containsKey('providers')) {
       providers = (_json['providers'] as core.List)
-          .map<AuthProvider>((value) => AuthProvider.fromJson(value))
+          .map<AuthProvider>((value) => AuthProvider.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<AuthenticationRule>(
-              (value) => AuthenticationRule.fromJson(value))
+          .map<AuthenticationRule>((value) => AuthenticationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2114,11 +2169,13 @@
       allowWithoutCredential = _json['allowWithoutCredential'] as core.bool;
     }
     if (_json.containsKey('oauth')) {
-      oauth = OAuthRequirements.fromJson(_json['oauth']);
+      oauth = OAuthRequirements.fromJson(
+          _json['oauth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requirements')) {
       requirements = (_json['requirements'] as core.List)
-          .map<AuthRequirement>((value) => AuthRequirement.fromJson(value))
+          .map<AuthRequirement>((value) => AuthRequirement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -2156,7 +2213,8 @@
   Backend.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<BackendRule>((value) => BackendRule.fromJson(value))
+          .map<BackendRule>((value) => BackendRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2340,8 +2398,8 @@
   Billing.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<BillingDestination>(
-              (value) => BillingDestination.fromJson(value))
+          .map<BillingDestination>((value) => BillingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2519,7 +2577,8 @@
   Context.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<ContextRule>((value) => ContextRule.fromJson(value))
+          .map<ContextRule>((value) => ContextRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2647,7 +2706,8 @@
   CustomError.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(value))
+          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('types')) {
@@ -2926,12 +2986,14 @@
     }
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<DocumentationRule>((value) => DocumentationRule.fromJson(value))
+          .map<DocumentationRule>((value) => DocumentationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceRootUrl')) {
@@ -3149,7 +3211,8 @@
   Enum.fromJson(core.Map _json) {
     if (_json.containsKey('enumvalue')) {
       enumvalue = (_json['enumvalue'] as core.List)
-          .map<EnumValue>((value) => EnumValue.fromJson(value))
+          .map<EnumValue>((value) =>
+              EnumValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3157,11 +3220,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -3211,7 +3276,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3316,7 +3382,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('packed')) {
@@ -3439,7 +3506,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3646,7 +3714,8 @@
   HttpRule.fromJson(core.Map _json) {
     if (_json.containsKey('additionalBindings')) {
       additionalBindings = (_json['additionalBindings'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('allowHalfDuplex')) {
@@ -3656,7 +3725,8 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('custom')) {
-      custom = CustomHttpPattern.fromJson(_json['custom']);
+      custom = CustomHttpPattern.fromJson(
+          _json['custom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delete')) {
       delete = _json['delete'] as core.String;
@@ -3821,7 +3891,8 @@
   ListConnectionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('connections')) {
       connections = (_json['connections'] as core.List)
-          .map<Connection>((value) => Connection.fromJson(value))
+          .map<Connection>((value) =>
+              Connection.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3852,7 +3923,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3879,7 +3951,8 @@
   ListPeeredDnsDomainsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('peeredDnsDomains')) {
       peeredDnsDomains = (_json['peeredDnsDomains'] as core.List)
-          .map<PeeredDnsDomain>((value) => PeeredDnsDomain.fromJson(value))
+          .map<PeeredDnsDomain>((value) => PeeredDnsDomain.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3929,7 +4002,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3985,14 +4059,14 @@
   Logging.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4083,7 +4157,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestStreaming')) {
@@ -4295,14 +4370,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
       launchStage = _json['launchStage'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = MetricDescriptorMetadata.fromJson(_json['metadata']);
+      metadata = MetricDescriptorMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricKind')) {
       metricKind = _json['metricKind'] as core.String;
@@ -4460,7 +4537,8 @@
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
       metricCosts = commons.mapMap<core.String, core.String>(
-          _json['metricCosts'].cast<core.String, core.String>(),
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('selector')) {
@@ -4621,7 +4699,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
@@ -4705,14 +4784,14 @@
   Monitoring.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4848,11 +4927,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4860,7 +4941,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4912,7 +4994,8 @@
     }
     if (_json.containsKey('value')) {
       value = commons.mapMap<core.Object, core.Object>(
-          _json['value'].cast<core.String, core.Object>(),
+          (_json['value'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4961,7 +5044,8 @@
     }
     if (_json.containsKey('subpages')) {
       subpages = (_json['subpages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5104,12 +5188,14 @@
   Quota.fromJson(core.Map _json) {
     if (_json.containsKey('limits')) {
       limits = (_json['limits'] as core.List)
-          .map<QuotaLimit>((value) => QuotaLimit.fromJson(value))
+          .map<QuotaLimit>((value) =>
+              QuotaLimit.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metricRules')) {
       metricRules = (_json['metricRules'] as core.List)
-          .map<MetricRule>((value) => MetricRule.fromJson(value))
+          .map<MetricRule>((value) =>
+              MetricRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5225,7 +5311,8 @@
     }
     if (_json.containsKey('values')) {
       values = commons.mapMap<core.String, core.String>(
-          _json['values'].cast<core.String, core.String>(),
+          (_json['values'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -5380,7 +5467,8 @@
       consumerNetwork = _json['consumerNetwork'] as core.String;
     }
     if (_json.containsKey('dnsRecordSet')) {
-      dnsRecordSet = DnsRecordSet.fromJson(_json['dnsRecordSet']);
+      dnsRecordSet = DnsRecordSet.fromJson(
+          _json['dnsRecordSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -5697,70 +5785,86 @@
   Service.fromJson(core.Map _json) {
     if (_json.containsKey('apis')) {
       apis = (_json['apis'] as core.List)
-          .map<Api>((value) => Api.fromJson(value))
+          .map<Api>((value) =>
+              Api.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('authentication')) {
-      authentication = Authentication.fromJson(_json['authentication']);
+      authentication = Authentication.fromJson(
+          _json['authentication'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backend')) {
-      backend = Backend.fromJson(_json['backend']);
+      backend = Backend.fromJson(
+          _json['backend'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('billing')) {
-      billing = Billing.fromJson(_json['billing']);
+      billing = Billing.fromJson(
+          _json['billing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('configVersion')) {
       configVersion = _json['configVersion'] as core.int;
     }
     if (_json.containsKey('context')) {
-      context = Context.fromJson(_json['context']);
+      context = Context.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('control')) {
-      control = Control.fromJson(_json['control']);
+      control = Control.fromJson(
+          _json['control'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customError')) {
-      customError = CustomError.fromJson(_json['customError']);
+      customError = CustomError.fromJson(
+          _json['customError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentation')) {
-      documentation = Documentation.fromJson(_json['documentation']);
+      documentation = Documentation.fromJson(
+          _json['documentation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endpoints')) {
       endpoints = (_json['endpoints'] as core.List)
-          .map<Endpoint>((value) => Endpoint.fromJson(value))
+          .map<Endpoint>((value) =>
+              Endpoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('enums')) {
       enums = (_json['enums'] as core.List)
-          .map<Enum>((value) => Enum.fromJson(value))
+          .map<Enum>((value) =>
+              Enum.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('http')) {
-      http = Http.fromJson(_json['http']);
+      http =
+          Http.fromJson(_json['http'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('logging')) {
-      logging = Logging.fromJson(_json['logging']);
+      logging = Logging.fromJson(
+          _json['logging'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logs')) {
       logs = (_json['logs'] as core.List)
-          .map<LogDescriptor>((value) => LogDescriptor.fromJson(value))
+          .map<LogDescriptor>((value) => LogDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(value))
+          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoredResources')) {
       monitoredResources = (_json['monitoredResources'] as core.List)
-          .map<MonitoredResourceDescriptor>(
-              (value) => MonitoredResourceDescriptor.fromJson(value))
+          .map<MonitoredResourceDescriptor>((value) =>
+              MonitoredResourceDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoring')) {
-      monitoring = Monitoring.fromJson(_json['monitoring']);
+      monitoring = Monitoring.fromJson(
+          _json['monitoring'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -5769,17 +5873,21 @@
       producerProjectId = _json['producerProjectId'] as core.String;
     }
     if (_json.containsKey('quota')) {
-      quota = Quota.fromJson(_json['quota']);
+      quota =
+          Quota.fromJson(_json['quota'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceInfo')) {
-      sourceInfo = SourceInfo.fromJson(_json['sourceInfo']);
+      sourceInfo = SourceInfo.fromJson(
+          _json['sourceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemParameters')) {
-      systemParameters = SystemParameters.fromJson(_json['systemParameters']);
+      systemParameters = SystemParameters.fromJson(
+          _json['systemParameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemTypes')) {
       systemTypes = (_json['systemTypes'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -5787,11 +5895,13 @@
     }
     if (_json.containsKey('types')) {
       types = (_json['types'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('usage')) {
-      usage = Usage.fromJson(_json['usage']);
+      usage =
+          Usage.fromJson(_json['usage'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5970,7 +6080,8 @@
       sourceFiles = (_json['sourceFiles'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -6017,7 +6128,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -6157,7 +6269,8 @@
   SystemParameterRule.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<SystemParameter>((value) => SystemParameter.fromJson(value))
+          .map<SystemParameter>((value) => SystemParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -6200,8 +6313,8 @@
   SystemParameters.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<SystemParameterRule>(
-              (value) => SystemParameterRule.fromJson(value))
+          .map<SystemParameterRule>((value) => SystemParameterRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6243,7 +6356,8 @@
   Type.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<Field>((value) => Field.fromJson(value))
+          .map<Field>((value) =>
+              Field.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -6256,11 +6370,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -6335,11 +6451,12 @@
       consumerNetwork = _json['consumerNetwork'] as core.String;
     }
     if (_json.containsKey('existingDnsRecordSet')) {
-      existingDnsRecordSet =
-          DnsRecordSet.fromJson(_json['existingDnsRecordSet']);
+      existingDnsRecordSet = DnsRecordSet.fromJson(
+          _json['existingDnsRecordSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('newDnsRecordSet')) {
-      newDnsRecordSet = DnsRecordSet.fromJson(_json['newDnsRecordSet']);
+      newDnsRecordSet = DnsRecordSet.fromJson(
+          _json['newDnsRecordSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zone')) {
       zone = _json['zone'] as core.String;
@@ -6400,11 +6517,13 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<UsageRule>((value) => UsageRule.fromJson(value))
+          .map<UsageRule>((value) =>
+              UsageRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceIdentity')) {
-      serviceIdentity = ServiceIdentity.fromJson(_json['serviceIdentity']);
+      serviceIdentity = ServiceIdentity.fromJson(
+          _json['serviceIdentity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6511,10 +6630,12 @@
       consumerNetwork = _json['consumerNetwork'] as core.String;
     }
     if (_json.containsKey('consumerProject')) {
-      consumerProject = ConsumerProject.fromJson(_json['consumerProject']);
+      consumerProject = ConsumerProject.fromJson(
+          _json['consumerProject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rangeReservation')) {
-      rangeReservation = RangeReservation.fromJson(_json['rangeReservation']);
+      rangeReservation = RangeReservation.fromJson(
+          _json['rangeReservation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('validateNetwork')) {
       validateNetwork = _json['validateNetwork'] as core.bool;
diff --git a/generated/googleapis/lib/serviceusage/v1.dart b/generated/googleapis/lib/serviceusage/v1.dart
index 770ddc1..423a920 100644
--- a/generated/googleapis/lib/serviceusage/v1.dart
+++ b/generated/googleapis/lib/serviceusage/v1.dart
@@ -123,7 +123,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -175,7 +177,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -226,7 +230,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -300,7 +306,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -368,7 +377,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the service configurations and enabled states for a given list of
@@ -432,7 +443,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchGetServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Disable a service so that it can no longer be used with a project. This
@@ -495,7 +509,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Enable a service so that it can be used with a project.
@@ -555,7 +571,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the service configuration and enabled state for a given service.
@@ -607,8 +625,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleApiServiceusageV1Service.fromJson(data));
+    return _response.then(
+      (data) => GoogleApiServiceusageV1Service.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all services available to the specified project, and the current
@@ -689,7 +709,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListServicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListServicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -736,7 +759,8 @@
     }
     if (_json.containsKey('dimensions')) {
       dimensions = commons.mapMap<core.String, core.String>(
-          _json['dimensions'].cast<core.String, core.String>(),
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('metric')) {
@@ -830,12 +854,14 @@
   Api.fromJson(core.Map _json) {
     if (_json.containsKey('methods')) {
       methods = (_json['methods'] as core.List)
-          .map<Method>((value) => Method.fromJson(value))
+          .map<Method>((value) =>
+              Method.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mixins')) {
       mixins = (_json['mixins'] as core.List)
-          .map<Mixin>((value) => Mixin.fromJson(value))
+          .map<Mixin>((value) =>
+              Mixin.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -843,11 +869,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -956,7 +984,8 @@
     }
     if (_json.containsKey('jwtLocations')) {
       jwtLocations = (_json['jwtLocations'] as core.List)
-          .map<JwtLocation>((value) => JwtLocation.fromJson(value))
+          .map<JwtLocation>((value) => JwtLocation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1048,13 +1077,14 @@
   Authentication.fromJson(core.Map _json) {
     if (_json.containsKey('providers')) {
       providers = (_json['providers'] as core.List)
-          .map<AuthProvider>((value) => AuthProvider.fromJson(value))
+          .map<AuthProvider>((value) => AuthProvider.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<AuthenticationRule>(
-              (value) => AuthenticationRule.fromJson(value))
+          .map<AuthenticationRule>((value) => AuthenticationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1097,11 +1127,13 @@
       allowWithoutCredential = _json['allowWithoutCredential'] as core.bool;
     }
     if (_json.containsKey('oauth')) {
-      oauth = OAuthRequirements.fromJson(_json['oauth']);
+      oauth = OAuthRequirements.fromJson(
+          _json['oauth'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requirements')) {
       requirements = (_json['requirements'] as core.List)
-          .map<AuthRequirement>((value) => AuthRequirement.fromJson(value))
+          .map<AuthRequirement>((value) => AuthRequirement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -1139,7 +1171,8 @@
   Backend.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<BackendRule>((value) => BackendRule.fromJson(value))
+          .map<BackendRule>((value) => BackendRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1305,7 +1338,8 @@
   BatchCreateAdminOverridesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
-          .map<QuotaOverride>((value) => QuotaOverride.fromJson(value))
+          .map<QuotaOverride>((value) => QuotaOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1329,7 +1363,8 @@
   BatchCreateConsumerOverridesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
-          .map<QuotaOverride>((value) => QuotaOverride.fromJson(value))
+          .map<QuotaOverride>((value) => QuotaOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1388,13 +1423,15 @@
   BatchEnableServicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('failures')) {
       failures = (_json['failures'] as core.List)
-          .map<EnableFailure>((value) => EnableFailure.fromJson(value))
+          .map<EnableFailure>((value) => EnableFailure.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<GoogleApiServiceusageV1Service>(
-              (value) => GoogleApiServiceusageV1Service.fromJson(value))
+          .map<GoogleApiServiceusageV1Service>((value) =>
+              GoogleApiServiceusageV1Service.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1421,8 +1458,9 @@
   BatchGetServicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<GoogleApiServiceusageV1Service>(
-              (value) => GoogleApiServiceusageV1Service.fromJson(value))
+          .map<GoogleApiServiceusageV1Service>((value) =>
+              GoogleApiServiceusageV1Service.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1464,8 +1502,8 @@
   Billing.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<BillingDestination>(
-              (value) => BillingDestination.fromJson(value))
+          .map<BillingDestination>((value) => BillingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1554,7 +1592,8 @@
   Context.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<ContextRule>((value) => ContextRule.fromJson(value))
+          .map<ContextRule>((value) => ContextRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1682,7 +1721,8 @@
   CustomError.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(value))
+          .map<CustomErrorRule>((value) => CustomErrorRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('types')) {
@@ -1821,7 +1861,8 @@
 
   DisableServiceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('service')) {
-      service = GoogleApiServiceusageV1Service.fromJson(_json['service']);
+      service = GoogleApiServiceusageV1Service.fromJson(
+          _json['service'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1901,12 +1942,14 @@
     }
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<DocumentationRule>((value) => DocumentationRule.fromJson(value))
+          .map<DocumentationRule>((value) => DocumentationRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceRootUrl')) {
@@ -2061,7 +2104,8 @@
 
   EnableServiceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('service')) {
-      service = GoogleApiServiceusageV1Service.fromJson(_json['service']);
+      service = GoogleApiServiceusageV1Service.fromJson(
+          _json['service'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2169,7 +2213,8 @@
   Enum.fromJson(core.Map _json) {
     if (_json.containsKey('enumvalue')) {
       enumvalue = (_json['enumvalue'] as core.List)
-          .map<EnumValue>((value) => EnumValue.fromJson(value))
+          .map<EnumValue>((value) =>
+              EnumValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -2177,11 +2222,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -2231,7 +2278,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2336,7 +2384,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('packed')) {
@@ -2401,7 +2450,8 @@
 
   GetServiceIdentityResponse.fromJson(core.Map _json) {
     if (_json.containsKey('identity')) {
-      identity = ServiceIdentity.fromJson(_json['identity']);
+      identity = ServiceIdentity.fromJson(
+          _json['identity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -2545,70 +2595,86 @@
   GoogleApiService.fromJson(core.Map _json) {
     if (_json.containsKey('apis')) {
       apis = (_json['apis'] as core.List)
-          .map<Api>((value) => Api.fromJson(value))
+          .map<Api>((value) =>
+              Api.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('authentication')) {
-      authentication = Authentication.fromJson(_json['authentication']);
+      authentication = Authentication.fromJson(
+          _json['authentication'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backend')) {
-      backend = Backend.fromJson(_json['backend']);
+      backend = Backend.fromJson(
+          _json['backend'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('billing')) {
-      billing = Billing.fromJson(_json['billing']);
+      billing = Billing.fromJson(
+          _json['billing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('configVersion')) {
       configVersion = _json['configVersion'] as core.int;
     }
     if (_json.containsKey('context')) {
-      context = Context.fromJson(_json['context']);
+      context = Context.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('control')) {
-      control = Control.fromJson(_json['control']);
+      control = Control.fromJson(
+          _json['control'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customError')) {
-      customError = CustomError.fromJson(_json['customError']);
+      customError = CustomError.fromJson(
+          _json['customError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentation')) {
-      documentation = Documentation.fromJson(_json['documentation']);
+      documentation = Documentation.fromJson(
+          _json['documentation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endpoints')) {
       endpoints = (_json['endpoints'] as core.List)
-          .map<Endpoint>((value) => Endpoint.fromJson(value))
+          .map<Endpoint>((value) =>
+              Endpoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('enums')) {
       enums = (_json['enums'] as core.List)
-          .map<Enum>((value) => Enum.fromJson(value))
+          .map<Enum>((value) =>
+              Enum.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('http')) {
-      http = Http.fromJson(_json['http']);
+      http =
+          Http.fromJson(_json['http'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('logging')) {
-      logging = Logging.fromJson(_json['logging']);
+      logging = Logging.fromJson(
+          _json['logging'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('logs')) {
       logs = (_json['logs'] as core.List)
-          .map<LogDescriptor>((value) => LogDescriptor.fromJson(value))
+          .map<LogDescriptor>((value) => LogDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metrics')) {
       metrics = (_json['metrics'] as core.List)
-          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(value))
+          .map<MetricDescriptor>((value) => MetricDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoredResources')) {
       monitoredResources = (_json['monitoredResources'] as core.List)
-          .map<MonitoredResourceDescriptor>(
-              (value) => MonitoredResourceDescriptor.fromJson(value))
+          .map<MonitoredResourceDescriptor>((value) =>
+              MonitoredResourceDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoring')) {
-      monitoring = Monitoring.fromJson(_json['monitoring']);
+      monitoring = Monitoring.fromJson(
+          _json['monitoring'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2617,17 +2683,21 @@
       producerProjectId = _json['producerProjectId'] as core.String;
     }
     if (_json.containsKey('quota')) {
-      quota = Quota.fromJson(_json['quota']);
+      quota =
+          Quota.fromJson(_json['quota'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceInfo')) {
-      sourceInfo = SourceInfo.fromJson(_json['sourceInfo']);
+      sourceInfo = SourceInfo.fromJson(
+          _json['sourceInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemParameters')) {
-      systemParameters = SystemParameters.fromJson(_json['systemParameters']);
+      systemParameters = SystemParameters.fromJson(
+          _json['systemParameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('systemTypes')) {
       systemTypes = (_json['systemTypes'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -2635,11 +2705,13 @@
     }
     if (_json.containsKey('types')) {
       types = (_json['types'] as core.List)
-          .map<Type>((value) => Type.fromJson(value))
+          .map<Type>((value) =>
+              Type.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('usage')) {
-      usage = Usage.fromJson(_json['usage']);
+      usage =
+          Usage.fromJson(_json['usage'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2835,7 +2907,8 @@
 
   GoogleApiServiceusageV1Service.fromJson(core.Map _json) {
     if (_json.containsKey('config')) {
-      config = GoogleApiServiceusageV1ServiceConfig.fromJson(_json['config']);
+      config = GoogleApiServiceusageV1ServiceConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -2909,40 +2982,48 @@
   GoogleApiServiceusageV1ServiceConfig.fromJson(core.Map _json) {
     if (_json.containsKey('apis')) {
       apis = (_json['apis'] as core.List)
-          .map<Api>((value) => Api.fromJson(value))
+          .map<Api>((value) =>
+              Api.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('authentication')) {
-      authentication = Authentication.fromJson(_json['authentication']);
+      authentication = Authentication.fromJson(
+          _json['authentication'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('documentation')) {
-      documentation = Documentation.fromJson(_json['documentation']);
+      documentation = Documentation.fromJson(
+          _json['documentation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endpoints')) {
       endpoints = (_json['endpoints'] as core.List)
-          .map<Endpoint>((value) => Endpoint.fromJson(value))
+          .map<Endpoint>((value) =>
+              Endpoint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoredResources')) {
       monitoredResources = (_json['monitoredResources'] as core.List)
-          .map<MonitoredResourceDescriptor>(
-              (value) => MonitoredResourceDescriptor.fromJson(value))
+          .map<MonitoredResourceDescriptor>((value) =>
+              MonitoredResourceDescriptor.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('monitoring')) {
-      monitoring = Monitoring.fromJson(_json['monitoring']);
+      monitoring = Monitoring.fromJson(
+          _json['monitoring'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('quota')) {
-      quota = Quota.fromJson(_json['quota']);
+      quota =
+          Quota.fromJson(_json['quota'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
     }
     if (_json.containsKey('usage')) {
-      usage = Usage.fromJson(_json['usage']);
+      usage =
+          Usage.fromJson(_json['usage'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3003,7 +3084,7 @@
       core.Map _json) {
     if (_json.containsKey('identity')) {
       identity = GoogleApiServiceusageV1beta1ServiceIdentity.fromJson(
-          _json['identity']);
+          _json['identity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -3079,7 +3160,8 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3286,7 +3368,8 @@
   HttpRule.fromJson(core.Map _json) {
     if (_json.containsKey('additionalBindings')) {
       additionalBindings = (_json['additionalBindings'] as core.List)
-          .map<HttpRule>((value) => HttpRule.fromJson(value))
+          .map<HttpRule>((value) =>
+              HttpRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('allowHalfDuplex')) {
@@ -3296,7 +3379,8 @@
       body = _json['body'] as core.String;
     }
     if (_json.containsKey('custom')) {
-      custom = CustomHttpPattern.fromJson(_json['custom']);
+      custom = CustomHttpPattern.fromJson(
+          _json['custom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('delete')) {
       delete = _json['delete'] as core.String;
@@ -3371,7 +3455,8 @@
   ImportAdminOverridesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
-          .map<QuotaOverride>((value) => QuotaOverride.fromJson(value))
+          .map<QuotaOverride>((value) => QuotaOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3395,7 +3480,8 @@
   ImportAdminQuotaPoliciesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('policies')) {
       policies = (_json['policies'] as core.List)
-          .map<AdminQuotaPolicy>((value) => AdminQuotaPolicy.fromJson(value))
+          .map<AdminQuotaPolicy>((value) => AdminQuotaPolicy.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3419,7 +3505,8 @@
   ImportConsumerOverridesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('overrides')) {
       overrides = (_json['overrides'] as core.List)
-          .map<QuotaOverride>((value) => QuotaOverride.fromJson(value))
+          .map<QuotaOverride>((value) => QuotaOverride.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3538,7 +3625,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3571,8 +3659,9 @@
     }
     if (_json.containsKey('services')) {
       services = (_json['services'] as core.List)
-          .map<GoogleApiServiceusageV1Service>(
-              (value) => GoogleApiServiceusageV1Service.fromJson(value))
+          .map<GoogleApiServiceusageV1Service>((value) =>
+              GoogleApiServiceusageV1Service.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3624,7 +3713,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3680,14 +3770,14 @@
   Logging.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<LoggingDestination>(
-              (value) => LoggingDestination.fromJson(value))
+          .map<LoggingDestination>((value) => LoggingDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3778,7 +3868,8 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestStreaming')) {
@@ -3990,14 +4081,16 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
       launchStage = _json['launchStage'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = MetricDescriptorMetadata.fromJson(_json['metadata']);
+      metadata = MetricDescriptorMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metricKind')) {
       metricKind = _json['metricKind'] as core.String;
@@ -4155,7 +4248,8 @@
   MetricRule.fromJson(core.Map _json) {
     if (_json.containsKey('metricCosts')) {
       metricCosts = commons.mapMap<core.String, core.String>(
-          _json['metricCosts'].cast<core.String, core.String>(),
+          (_json['metricCosts'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('selector')) {
@@ -4316,7 +4410,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = (_json['labels'] as core.List)
-          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(value))
+          .map<LabelDescriptor>((value) => LabelDescriptor.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('launchStage')) {
@@ -4400,14 +4495,14 @@
   Monitoring.fromJson(core.Map _json) {
     if (_json.containsKey('consumerDestinations')) {
       consumerDestinations = (_json['consumerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('producerDestinations')) {
       producerDestinations = (_json['producerDestinations'] as core.List)
-          .map<MonitoringDestination>(
-              (value) => MonitoringDestination.fromJson(value))
+          .map<MonitoringDestination>((value) => MonitoringDestination.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4543,11 +4638,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -4555,7 +4652,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4632,7 +4730,8 @@
     }
     if (_json.containsKey('value')) {
       value = commons.mapMap<core.Object, core.Object>(
-          _json['value'].cast<core.String, core.Object>(),
+          (_json['value'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -4681,7 +4780,8 @@
     }
     if (_json.containsKey('subpages')) {
       subpages = (_json['subpages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4736,12 +4836,14 @@
   Quota.fromJson(core.Map _json) {
     if (_json.containsKey('limits')) {
       limits = (_json['limits'] as core.List)
-          .map<QuotaLimit>((value) => QuotaLimit.fromJson(value))
+          .map<QuotaLimit>((value) =>
+              QuotaLimit.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('metricRules')) {
       metricRules = (_json['metricRules'] as core.List)
-          .map<MetricRule>((value) => MetricRule.fromJson(value))
+          .map<MetricRule>((value) =>
+              MetricRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4857,7 +4959,8 @@
     }
     if (_json.containsKey('values')) {
       values = commons.mapMap<core.String, core.String>(
-          _json['values'].cast<core.String, core.String>(),
+          (_json['values'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -4952,7 +5055,8 @@
     }
     if (_json.containsKey('dimensions')) {
       dimensions = commons.mapMap<core.String, core.String>(
-          _json['dimensions'].cast<core.String, core.String>(),
+          (_json['dimensions'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('metric')) {
@@ -5066,7 +5170,8 @@
       sourceFiles = (_json['sourceFiles'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -5113,7 +5218,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -5200,7 +5306,8 @@
   SystemParameterRule.fromJson(core.Map _json) {
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<SystemParameter>((value) => SystemParameter.fromJson(value))
+          .map<SystemParameter>((value) => SystemParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('selector')) {
@@ -5243,8 +5350,8 @@
   SystemParameters.fromJson(core.Map _json) {
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<SystemParameterRule>(
-              (value) => SystemParameterRule.fromJson(value))
+          .map<SystemParameterRule>((value) => SystemParameterRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5286,7 +5393,8 @@
   Type.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<Field>((value) => Field.fromJson(value))
+          .map<Field>((value) =>
+              Field.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -5299,11 +5407,13 @@
     }
     if (_json.containsKey('options')) {
       options = (_json['options'] as core.List)
-          .map<Option>((value) => Option.fromJson(value))
+          .map<Option>((value) =>
+              Option.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sourceContext')) {
-      sourceContext = SourceContext.fromJson(_json['sourceContext']);
+      sourceContext = SourceContext.fromJson(
+          _json['sourceContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syntax')) {
       syntax = _json['syntax'] as core.String;
@@ -5370,12 +5480,13 @@
     }
     if (_json.containsKey('rules')) {
       rules = (_json['rules'] as core.List)
-          .map<UsageRule>((value) => UsageRule.fromJson(value))
+          .map<UsageRule>((value) =>
+              UsageRule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('serviceIdentity')) {
-      serviceIdentity =
-          GoogleApiServiceIdentity.fromJson(_json['serviceIdentity']);
+      serviceIdentity = GoogleApiServiceIdentity.fromJson(
+          _json['serviceIdentity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/sheets/v4.dart b/generated/googleapis/lib/sheets/v4.dart
index c8c1424..cc2e871 100644
--- a/generated/googleapis/lib/sheets/v4.dart
+++ b/generated/googleapis/lib/sheets/v4.dart
@@ -139,8 +139,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchUpdateSpreadsheetResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchUpdateSpreadsheetResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a spreadsheet, returning the newly created spreadsheet.
@@ -188,7 +190,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Spreadsheet.fromJson(data));
+    return _response.then(
+      (data) =>
+          Spreadsheet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the spreadsheet at the given ID. The caller must specify the
@@ -259,7 +264,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Spreadsheet.fromJson(data));
+    return _response.then(
+      (data) =>
+          Spreadsheet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the spreadsheet at the given ID. The caller must specify the
@@ -326,7 +334,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Spreadsheet.fromJson(data));
+    return _response.then(
+      (data) =>
+          Spreadsheet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -391,7 +402,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DeveloperMetadata.fromJson(data));
+    return _response.then(
+      (data) => DeveloperMetadata.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns all developer metadata matching the specified DataFilter. If the
@@ -451,8 +465,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SearchDeveloperMetadataResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchDeveloperMetadataResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -524,7 +540,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SheetProperties.fromJson(data));
+    return _response.then(
+      (data) =>
+          SheetProperties.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -682,7 +701,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AppendValuesResponse.fromJson(data));
+    return _response.then(
+      (data) => AppendValuesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Clears one or more ranges of values from a spreadsheet. The caller must
@@ -741,7 +763,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchClearValuesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchClearValuesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Clears one or more ranges of values from a spreadsheet. The caller must
@@ -801,8 +826,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchClearValuesByDataFilterResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchClearValuesByDataFilterResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns one or more ranges of values from a spreadsheet. The caller must
@@ -913,7 +940,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchGetValuesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetValuesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns one or more ranges of values that match the specified data
@@ -972,8 +1002,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchGetValuesByDataFilterResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetValuesByDataFilterResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets values in one or more ranges of a spreadsheet. The caller must
@@ -1031,7 +1063,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchUpdateValuesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchUpdateValuesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets values in one or more ranges of a spreadsheet. The caller must
@@ -1089,8 +1124,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchUpdateValuesByDataFilterResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchUpdateValuesByDataFilterResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Clears values from a spreadsheet. The caller must specify the spreadsheet
@@ -1156,7 +1193,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ClearValuesResponse.fromJson(data));
+    return _response.then(
+      (data) => ClearValuesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a range of values from a spreadsheet. The caller must specify the
@@ -1268,7 +1308,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ValueRange.fromJson(data));
+    return _response.then(
+      (data) =>
+          ValueRange.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets values in a range of a spreadsheet. The caller must specify the
@@ -1400,7 +1443,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UpdateValuesResponse.fromJson(data));
+    return _response.then(
+      (data) => UpdateValuesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1415,7 +1461,8 @@
 
   AddBandingRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bandedRange')) {
-      bandedRange = BandedRange.fromJson(_json['bandedRange']);
+      bandedRange = BandedRange.fromJson(
+          _json['bandedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1437,7 +1484,8 @@
 
   AddBandingResponse.fromJson(core.Map _json) {
     if (_json.containsKey('bandedRange')) {
-      bandedRange = BandedRange.fromJson(_json['bandedRange']);
+      bandedRange = BandedRange.fromJson(
+          _json['bandedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1462,7 +1510,8 @@
 
   AddChartRequest.fromJson(core.Map _json) {
     if (_json.containsKey('chart')) {
-      chart = EmbeddedChart.fromJson(_json['chart']);
+      chart = EmbeddedChart.fromJson(
+          _json['chart'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1484,7 +1533,8 @@
 
   AddChartResponse.fromJson(core.Map _json) {
     if (_json.containsKey('chart')) {
-      chart = EmbeddedChart.fromJson(_json['chart']);
+      chart = EmbeddedChart.fromJson(
+          _json['chart'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1513,7 +1563,8 @@
       index = _json['index'] as core.int;
     }
     if (_json.containsKey('rule')) {
-      rule = ConditionalFormatRule.fromJson(_json['rule']);
+      rule = ConditionalFormatRule.fromJson(
+          _json['rule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1541,7 +1592,8 @@
 
   AddDataSourceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataSource')) {
-      dataSource = DataSource.fromJson(_json['dataSource']);
+      dataSource = DataSource.fromJson(
+          _json['dataSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1566,11 +1618,12 @@
 
   AddDataSourceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSource')) {
-      dataSource = DataSource.fromJson(_json['dataSource']);
+      dataSource = DataSource.fromJson(
+          _json['dataSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1607,7 +1660,8 @@
 
   AddDimensionGroupRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = DimensionRange.fromJson(_json['range']);
+      range = DimensionRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1630,7 +1684,8 @@
   AddDimensionGroupResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionGroups')) {
       dimensionGroups = (_json['dimensionGroups'] as core.List)
-          .map<DimensionGroup>((value) => DimensionGroup.fromJson(value))
+          .map<DimensionGroup>((value) => DimensionGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1656,7 +1711,8 @@
 
   AddFilterViewRequest.fromJson(core.Map _json) {
     if (_json.containsKey('filter')) {
-      filter = FilterView.fromJson(_json['filter']);
+      filter = FilterView.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1678,7 +1734,8 @@
 
   AddFilterViewResponse.fromJson(core.Map _json) {
     if (_json.containsKey('filter')) {
-      filter = FilterView.fromJson(_json['filter']);
+      filter = FilterView.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1702,7 +1759,8 @@
 
   AddNamedRangeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('namedRange')) {
-      namedRange = NamedRange.fromJson(_json['namedRange']);
+      namedRange = NamedRange.fromJson(
+          _json['namedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1724,7 +1782,8 @@
 
   AddNamedRangeResponse.fromJson(core.Map _json) {
     if (_json.containsKey('namedRange')) {
-      namedRange = NamedRange.fromJson(_json['namedRange']);
+      namedRange = NamedRange.fromJson(
+          _json['namedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1748,7 +1807,8 @@
 
   AddProtectedRangeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('protectedRange')) {
-      protectedRange = ProtectedRange.fromJson(_json['protectedRange']);
+      protectedRange = ProtectedRange.fromJson(
+          _json['protectedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1770,7 +1830,8 @@
 
   AddProtectedRangeResponse.fromJson(core.Map _json) {
     if (_json.containsKey('protectedRange')) {
-      protectedRange = ProtectedRange.fromJson(_json['protectedRange']);
+      protectedRange = ProtectedRange.fromJson(
+          _json['protectedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1798,7 +1859,8 @@
 
   AddSheetRequest.fromJson(core.Map _json) {
     if (_json.containsKey('properties')) {
-      properties = SheetProperties.fromJson(_json['properties']);
+      properties = SheetProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1820,7 +1882,8 @@
 
   AddSheetResponse.fromJson(core.Map _json) {
     if (_json.containsKey('properties')) {
-      properties = SheetProperties.fromJson(_json['properties']);
+      properties = SheetProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1845,7 +1908,8 @@
 
   AddSlicerRequest.fromJson(core.Map _json) {
     if (_json.containsKey('slicer')) {
-      slicer = Slicer.fromJson(_json['slicer']);
+      slicer = Slicer.fromJson(
+          _json['slicer'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1867,7 +1931,8 @@
 
   AddSlicerResponse.fromJson(core.Map _json) {
     if (_json.containsKey('slicer')) {
-      slicer = Slicer.fromJson(_json['slicer']);
+      slicer = Slicer.fromJson(
+          _json['slicer'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1903,7 +1968,8 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<RowData>((value) => RowData.fromJson(value))
+          .map<RowData>((value) =>
+              RowData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sheetId')) {
@@ -1992,7 +2058,8 @@
       tableRange = _json['tableRange'] as core.String;
     }
     if (_json.containsKey('updates')) {
-      updates = UpdateValuesResponse.fromJson(_json['updates']);
+      updates = UpdateValuesResponse.fromJson(
+          _json['updates'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2030,11 +2097,12 @@
 
   AutoFillRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceAndDestination')) {
-      sourceAndDestination =
-          SourceAndDestination.fromJson(_json['sourceAndDestination']);
+      sourceAndDestination = SourceAndDestination.fromJson(
+          _json['sourceAndDestination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('useAlternateSeries')) {
       useAlternateSeries = _json['useAlternateSeries'] as core.bool;
@@ -2070,10 +2138,12 @@
   AutoResizeDimensionsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceSheetDimensions')) {
       dataSourceSheetDimensions = DataSourceSheetDimensionRange.fromJson(
-          _json['dataSourceSheetDimensions']);
+          _json['dataSourceSheetDimensions']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensions')) {
-      dimensions = DimensionRange.fromJson(_json['dimensions']);
+      dimensions = DimensionRange.fromJson(
+          _json['dimensions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2114,13 +2184,16 @@
       bandedRangeId = _json['bandedRangeId'] as core.int;
     }
     if (_json.containsKey('columnProperties')) {
-      columnProperties = BandingProperties.fromJson(_json['columnProperties']);
+      columnProperties = BandingProperties.fromJson(
+          _json['columnProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rowProperties')) {
-      rowProperties = BandingProperties.fromJson(_json['rowProperties']);
+      rowProperties = BandingProperties.fromJson(
+          _json['rowProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2197,28 +2270,36 @@
 
   BandingProperties.fromJson(core.Map _json) {
     if (_json.containsKey('firstBandColor')) {
-      firstBandColor = Color.fromJson(_json['firstBandColor']);
+      firstBandColor = Color.fromJson(
+          _json['firstBandColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('firstBandColorStyle')) {
-      firstBandColorStyle = ColorStyle.fromJson(_json['firstBandColorStyle']);
+      firstBandColorStyle = ColorStyle.fromJson(
+          _json['firstBandColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('footerColor')) {
-      footerColor = Color.fromJson(_json['footerColor']);
+      footerColor = Color.fromJson(
+          _json['footerColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('footerColorStyle')) {
-      footerColorStyle = ColorStyle.fromJson(_json['footerColorStyle']);
+      footerColorStyle = ColorStyle.fromJson(
+          _json['footerColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headerColor')) {
-      headerColor = Color.fromJson(_json['headerColor']);
+      headerColor = Color.fromJson(
+          _json['headerColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headerColorStyle')) {
-      headerColorStyle = ColorStyle.fromJson(_json['headerColorStyle']);
+      headerColorStyle = ColorStyle.fromJson(
+          _json['headerColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secondBandColor')) {
-      secondBandColor = Color.fromJson(_json['secondBandColor']);
+      secondBandColor = Color.fromJson(
+          _json['secondBandColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secondBandColorStyle')) {
-      secondBandColorStyle = ColorStyle.fromJson(_json['secondBandColorStyle']);
+      secondBandColorStyle = ColorStyle.fromJson(
+          _json['secondBandColorStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2302,22 +2383,28 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('negativeColor')) {
-      negativeColor = Color.fromJson(_json['negativeColor']);
+      negativeColor = Color.fromJson(
+          _json['negativeColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('negativeColorStyle')) {
-      negativeColorStyle = ColorStyle.fromJson(_json['negativeColorStyle']);
+      negativeColorStyle = ColorStyle.fromJson(
+          _json['negativeColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('position')) {
-      position = TextPosition.fromJson(_json['position']);
+      position = TextPosition.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positiveColor')) {
-      positiveColor = Color.fromJson(_json['positiveColor']);
+      positiveColor = Color.fromJson(
+          _json['positiveColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positiveColorStyle')) {
-      positiveColorStyle = ColorStyle.fromJson(_json['positiveColorStyle']);
+      positiveColorStyle = ColorStyle.fromJson(
+          _json['positiveColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textFormat')) {
-      textFormat = TextFormat.fromJson(_json['textFormat']);
+      textFormat = TextFormat.fromJson(
+          _json['textFormat'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2385,7 +2472,8 @@
 
   BasicChartAxis.fromJson(core.Map _json) {
     if (_json.containsKey('format')) {
-      format = TextFormat.fromJson(_json['format']);
+      format = TextFormat.fromJson(
+          _json['format'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('position')) {
       position = _json['position'] as core.String;
@@ -2394,11 +2482,12 @@
       title = _json['title'] as core.String;
     }
     if (_json.containsKey('titleTextPosition')) {
-      titleTextPosition = TextPosition.fromJson(_json['titleTextPosition']);
+      titleTextPosition = TextPosition.fromJson(
+          _json['titleTextPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('viewWindowOptions')) {
-      viewWindowOptions =
-          ChartAxisViewWindowOptions.fromJson(_json['viewWindowOptions']);
+      viewWindowOptions = ChartAxisViewWindowOptions.fromJson(
+          _json['viewWindowOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2437,7 +2526,8 @@
 
   BasicChartDomain.fromJson(core.Map _json) {
     if (_json.containsKey('domain')) {
-      domain = ChartData.fromJson(_json['domain']);
+      domain = ChartData.fromJson(
+          _json['domain'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reversed')) {
       reversed = _json['reversed'] as core.bool;
@@ -2512,16 +2602,20 @@
 
   BasicChartSeries.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorStyle')) {
-      colorStyle = ColorStyle.fromJson(_json['colorStyle']);
+      colorStyle = ColorStyle.fromJson(
+          _json['colorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineStyle')) {
-      lineStyle = LineStyle.fromJson(_json['lineStyle']);
+      lineStyle = LineStyle.fromJson(
+          _json['lineStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('series')) {
-      series = ChartData.fromJson(_json['series']);
+      series = ChartData.fromJson(
+          _json['series'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetAxis')) {
       targetAxis = _json['targetAxis'] as core.String;
@@ -2633,7 +2727,8 @@
   BasicChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('axis')) {
       axis = (_json['axis'] as core.List)
-          .map<BasicChartAxis>((value) => BasicChartAxis.fromJson(value))
+          .map<BasicChartAxis>((value) => BasicChartAxis.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('chartType')) {
@@ -2644,7 +2739,8 @@
     }
     if (_json.containsKey('domains')) {
       domains = (_json['domains'] as core.List)
-          .map<BasicChartDomain>((value) => BasicChartDomain.fromJson(value))
+          .map<BasicChartDomain>((value) => BasicChartDomain.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('headerCount')) {
@@ -2661,7 +2757,8 @@
     }
     if (_json.containsKey('series')) {
       series = (_json['series'] as core.List)
-          .map<BasicChartSeries>((value) => BasicChartSeries.fromJson(value))
+          .map<BasicChartSeries>((value) => BasicChartSeries.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('stackedType')) {
@@ -2735,20 +2832,25 @@
   BasicFilter.fromJson(core.Map _json) {
     if (_json.containsKey('criteria')) {
       criteria = commons.mapMap<core.Map, FilterCriteria>(
-          _json['criteria'].cast<core.String, core.Map>(),
-          (core.Map item) => FilterCriteria.fromJson(item));
+          (_json['criteria'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => FilterCriteria.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('filterSpecs')) {
       filterSpecs = (_json['filterSpecs'] as core.List)
-          .map<FilterSpec>((value) => FilterSpec.fromJson(value))
+          .map<FilterSpec>((value) =>
+              FilterSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortSpecs')) {
       sortSpecs = (_json['sortSpecs'] as core.List)
-          .map<SortSpec>((value) => SortSpec.fromJson(value))
+          .map<SortSpec>((value) =>
+              SortSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2785,7 +2887,8 @@
   BatchClearValuesByDataFilterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilters')) {
       dataFilters = (_json['dataFilters'] as core.List)
-          .map<DataFilter>((value) => DataFilter.fromJson(value))
+          .map<DataFilter>((value) =>
+              DataFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2950,7 +3053,8 @@
   BatchGetValuesByDataFilterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilters')) {
       dataFilters = (_json['dataFilters'] as core.List)
-          .map<DataFilter>((value) => DataFilter.fromJson(value))
+          .map<DataFilter>((value) =>
+              DataFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dateTimeRenderOption')) {
@@ -3000,7 +3104,8 @@
     }
     if (_json.containsKey('valueRanges')) {
       valueRanges = (_json['valueRanges'] as core.List)
-          .map<MatchedValueRange>((value) => MatchedValueRange.fromJson(value))
+          .map<MatchedValueRange>((value) => MatchedValueRange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3035,7 +3140,8 @@
     }
     if (_json.containsKey('valueRanges')) {
       valueRanges = (_json['valueRanges'] as core.List)
-          .map<ValueRange>((value) => ValueRange.fromJson(value))
+          .map<ValueRange>((value) =>
+              ValueRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3081,7 +3187,8 @@
     }
     if (_json.containsKey('requests')) {
       requests = (_json['requests'] as core.List)
-          .map<Request>((value) => Request.fromJson(value))
+          .map<Request>((value) =>
+              Request.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('responseIncludeGridData')) {
@@ -3130,14 +3237,16 @@
   BatchUpdateSpreadsheetResponse.fromJson(core.Map _json) {
     if (_json.containsKey('replies')) {
       replies = (_json['replies'] as core.List)
-          .map<Response>((value) => Response.fromJson(value))
+          .map<Response>((value) =>
+              Response.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('spreadsheetId')) {
       spreadsheetId = _json['spreadsheetId'] as core.String;
     }
     if (_json.containsKey('updatedSpreadsheet')) {
-      updatedSpreadsheet = Spreadsheet.fromJson(_json['updatedSpreadsheet']);
+      updatedSpreadsheet = Spreadsheet.fromJson(
+          _json['updatedSpreadsheet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3223,8 +3332,8 @@
   BatchUpdateValuesByDataFilterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<DataFilterValueRange>(
-              (value) => DataFilterValueRange.fromJson(value))
+          .map<DataFilterValueRange>((value) => DataFilterValueRange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('includeValuesInResponse')) {
@@ -3291,8 +3400,9 @@
   BatchUpdateValuesByDataFilterResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<UpdateValuesByDataFilterResponse>(
-              (value) => UpdateValuesByDataFilterResponse.fromJson(value))
+          .map<UpdateValuesByDataFilterResponse>((value) =>
+              UpdateValuesByDataFilterResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('spreadsheetId')) {
@@ -3401,7 +3511,8 @@
   BatchUpdateValuesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<ValueRange>((value) => ValueRange.fromJson(value))
+          .map<ValueRange>((value) =>
+              ValueRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('includeValuesInResponse')) {
@@ -3469,8 +3580,8 @@
   BatchUpdateValuesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<UpdateValuesResponse>(
-              (value) => UpdateValuesResponse.fromJson(value))
+          .map<UpdateValuesResponse>((value) => UpdateValuesResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('spreadsheetId')) {
@@ -3533,10 +3644,12 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('querySpec')) {
-      querySpec = BigQueryQuerySpec.fromJson(_json['querySpec']);
+      querySpec = BigQueryQuerySpec.fromJson(
+          _json['querySpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableSpec')) {
-      tableSpec = BigQueryTableSpec.fromJson(_json['tableSpec']);
+      tableSpec = BigQueryTableSpec.fromJson(
+          _json['tableSpec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3744,7 +3857,8 @@
     }
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<ConditionValue>((value) => ConditionValue.fromJson(value))
+          .map<ConditionValue>((value) => ConditionValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3776,10 +3890,12 @@
 
   BooleanRule.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = BooleanCondition.fromJson(_json['condition']);
+      condition = BooleanCondition.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('format')) {
-      format = CellFormat.fromJson(_json['format']);
+      format = CellFormat.fromJson(
+          _json['format'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3825,10 +3941,12 @@
 
   Border.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorStyle')) {
-      colorStyle = ColorStyle.fromJson(_json['colorStyle']);
+      colorStyle = ColorStyle.fromJson(
+          _json['colorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('style')) {
       style = _json['style'] as core.String;
@@ -3874,16 +3992,20 @@
 
   Borders.fromJson(core.Map _json) {
     if (_json.containsKey('bottom')) {
-      bottom = Border.fromJson(_json['bottom']);
+      bottom = Border.fromJson(
+          _json['bottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('left')) {
-      left = Border.fromJson(_json['left']);
+      left =
+          Border.fromJson(_json['left'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('right')) {
-      right = Border.fromJson(_json['right']);
+      right = Border.fromJson(
+          _json['right'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('top')) {
-      top = Border.fromJson(_json['top']);
+      top =
+          Border.fromJson(_json['top'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3967,14 +4089,17 @@
 
   BubbleChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('bubbleBorderColor')) {
-      bubbleBorderColor = Color.fromJson(_json['bubbleBorderColor']);
+      bubbleBorderColor = Color.fromJson(
+          _json['bubbleBorderColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bubbleBorderColorStyle')) {
-      bubbleBorderColorStyle =
-          ColorStyle.fromJson(_json['bubbleBorderColorStyle']);
+      bubbleBorderColorStyle = ColorStyle.fromJson(
+          _json['bubbleBorderColorStyle']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bubbleLabels')) {
-      bubbleLabels = ChartData.fromJson(_json['bubbleLabels']);
+      bubbleLabels = ChartData.fromJson(
+          _json['bubbleLabels'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bubbleMaxRadiusSize')) {
       bubbleMaxRadiusSize = _json['bubbleMaxRadiusSize'] as core.int;
@@ -3986,22 +4111,27 @@
       bubbleOpacity = (_json['bubbleOpacity'] as core.num).toDouble();
     }
     if (_json.containsKey('bubbleSizes')) {
-      bubbleSizes = ChartData.fromJson(_json['bubbleSizes']);
+      bubbleSizes = ChartData.fromJson(
+          _json['bubbleSizes'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bubbleTextStyle')) {
-      bubbleTextStyle = TextFormat.fromJson(_json['bubbleTextStyle']);
+      bubbleTextStyle = TextFormat.fromJson(
+          _json['bubbleTextStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('domain')) {
-      domain = ChartData.fromJson(_json['domain']);
+      domain = ChartData.fromJson(
+          _json['domain'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupIds')) {
-      groupIds = ChartData.fromJson(_json['groupIds']);
+      groupIds = ChartData.fromJson(
+          _json['groupIds'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('legendPosition')) {
       legendPosition = _json['legendPosition'] as core.String;
     }
     if (_json.containsKey('series')) {
-      series = ChartData.fromJson(_json['series']);
+      series = ChartData.fromJson(
+          _json['series'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4062,11 +4192,13 @@
   CandlestickChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<CandlestickData>((value) => CandlestickData.fromJson(value))
+          .map<CandlestickData>((value) => CandlestickData.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('domain')) {
-      domain = CandlestickDomain.fromJson(_json['domain']);
+      domain = CandlestickDomain.fromJson(
+          _json['domain'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4107,16 +4239,20 @@
 
   CandlestickData.fromJson(core.Map _json) {
     if (_json.containsKey('closeSeries')) {
-      closeSeries = CandlestickSeries.fromJson(_json['closeSeries']);
+      closeSeries = CandlestickSeries.fromJson(
+          _json['closeSeries'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('highSeries')) {
-      highSeries = CandlestickSeries.fromJson(_json['highSeries']);
+      highSeries = CandlestickSeries.fromJson(
+          _json['highSeries'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lowSeries')) {
-      lowSeries = CandlestickSeries.fromJson(_json['lowSeries']);
+      lowSeries = CandlestickSeries.fromJson(
+          _json['lowSeries'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('openSeries')) {
-      openSeries = CandlestickSeries.fromJson(_json['openSeries']);
+      openSeries = CandlestickSeries.fromJson(
+          _json['openSeries'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4150,7 +4286,8 @@
 
   CandlestickDomain.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
-      data = ChartData.fromJson(_json['data']);
+      data = ChartData.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reversed')) {
       reversed = _json['reversed'] as core.bool;
@@ -4178,7 +4315,8 @@
 
   CandlestickSeries.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
-      data = ChartData.fromJson(_json['data']);
+      data = ChartData.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4262,20 +4400,24 @@
 
   CellData.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceFormula')) {
-      dataSourceFormula =
-          DataSourceFormula.fromJson(_json['dataSourceFormula']);
+      dataSourceFormula = DataSourceFormula.fromJson(
+          _json['dataSourceFormula'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceTable')) {
-      dataSourceTable = DataSourceTable.fromJson(_json['dataSourceTable']);
+      dataSourceTable = DataSourceTable.fromJson(
+          _json['dataSourceTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataValidation')) {
-      dataValidation = DataValidationRule.fromJson(_json['dataValidation']);
+      dataValidation = DataValidationRule.fromJson(
+          _json['dataValidation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('effectiveFormat')) {
-      effectiveFormat = CellFormat.fromJson(_json['effectiveFormat']);
+      effectiveFormat = CellFormat.fromJson(
+          _json['effectiveFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('effectiveValue')) {
-      effectiveValue = ExtendedValue.fromJson(_json['effectiveValue']);
+      effectiveValue = ExtendedValue.fromJson(
+          _json['effectiveValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('formattedValue')) {
       formattedValue = _json['formattedValue'] as core.String;
@@ -4287,18 +4429,22 @@
       note = _json['note'] as core.String;
     }
     if (_json.containsKey('pivotTable')) {
-      pivotTable = PivotTable.fromJson(_json['pivotTable']);
+      pivotTable = PivotTable.fromJson(
+          _json['pivotTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textFormatRuns')) {
       textFormatRuns = (_json['textFormatRuns'] as core.List)
-          .map<TextFormatRun>((value) => TextFormatRun.fromJson(value))
+          .map<TextFormatRun>((value) => TextFormatRun.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('userEnteredFormat')) {
-      userEnteredFormat = CellFormat.fromJson(_json['userEnteredFormat']);
+      userEnteredFormat = CellFormat.fromJson(
+          _json['userEnteredFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('userEnteredValue')) {
-      userEnteredValue = ExtendedValue.fromJson(_json['userEnteredValue']);
+      userEnteredValue = ExtendedValue.fromJson(
+          _json['userEnteredValue'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4432,13 +4578,16 @@
 
   CellFormat.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = Color.fromJson(_json['backgroundColor']);
+      backgroundColor = Color.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundColorStyle')) {
-      backgroundColorStyle = ColorStyle.fromJson(_json['backgroundColorStyle']);
+      backgroundColorStyle = ColorStyle.fromJson(
+          _json['backgroundColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('borders')) {
-      borders = Borders.fromJson(_json['borders']);
+      borders = Borders.fromJson(
+          _json['borders'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('horizontalAlignment')) {
       horizontalAlignment = _json['horizontalAlignment'] as core.String;
@@ -4447,19 +4596,23 @@
       hyperlinkDisplayType = _json['hyperlinkDisplayType'] as core.String;
     }
     if (_json.containsKey('numberFormat')) {
-      numberFormat = NumberFormat.fromJson(_json['numberFormat']);
+      numberFormat = NumberFormat.fromJson(
+          _json['numberFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('padding')) {
-      padding = Padding.fromJson(_json['padding']);
+      padding = Padding.fromJson(
+          _json['padding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textDirection')) {
       textDirection = _json['textDirection'] as core.String;
     }
     if (_json.containsKey('textFormat')) {
-      textFormat = TextFormat.fromJson(_json['textFormat']);
+      textFormat = TextFormat.fromJson(
+          _json['textFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textRotation')) {
-      textRotation = TextRotation.fromJson(_json['textRotation']);
+      textRotation = TextRotation.fromJson(
+          _json['textRotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('verticalAlignment')) {
       verticalAlignment = _json['verticalAlignment'] as core.String;
@@ -4628,14 +4781,16 @@
       aggregateType = _json['aggregateType'] as core.String;
     }
     if (_json.containsKey('columnReference')) {
-      columnReference =
-          DataSourceColumnReference.fromJson(_json['columnReference']);
+      columnReference = DataSourceColumnReference.fromJson(
+          _json['columnReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupRule')) {
-      groupRule = ChartGroupRule.fromJson(_json['groupRule']);
+      groupRule = ChartGroupRule.fromJson(
+          _json['groupRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceRange')) {
-      sourceRange = ChartSourceRange.fromJson(_json['sourceRange']);
+      sourceRange = ChartSourceRange.fromJson(
+          _json['sourceRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4725,10 +4880,12 @@
 
   ChartGroupRule.fromJson(core.Map _json) {
     if (_json.containsKey('dateTimeRule')) {
-      dateTimeRule = ChartDateTimeRule.fromJson(_json['dateTimeRule']);
+      dateTimeRule = ChartDateTimeRule.fromJson(
+          _json['dateTimeRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('histogramRule')) {
-      histogramRule = ChartHistogramRule.fromJson(_json['histogramRule']);
+      histogramRule = ChartHistogramRule.fromJson(
+          _json['histogramRule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4807,7 +4964,8 @@
   ChartSourceRange.fromJson(core.Map _json) {
     if (_json.containsKey('sources')) {
       sources = (_json['sources'] as core.List)
-          .map<GridRange>((value) => GridRange.fromJson(value))
+          .map<GridRange>((value) =>
+              GridRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4919,28 +5077,34 @@
       altText = _json['altText'] as core.String;
     }
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = Color.fromJson(_json['backgroundColor']);
+      backgroundColor = Color.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundColorStyle')) {
-      backgroundColorStyle = ColorStyle.fromJson(_json['backgroundColorStyle']);
+      backgroundColorStyle = ColorStyle.fromJson(
+          _json['backgroundColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('basicChart')) {
-      basicChart = BasicChartSpec.fromJson(_json['basicChart']);
+      basicChart = BasicChartSpec.fromJson(
+          _json['basicChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bubbleChart')) {
-      bubbleChart = BubbleChartSpec.fromJson(_json['bubbleChart']);
+      bubbleChart = BubbleChartSpec.fromJson(
+          _json['bubbleChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('candlestickChart')) {
-      candlestickChart =
-          CandlestickChartSpec.fromJson(_json['candlestickChart']);
+      candlestickChart = CandlestickChartSpec.fromJson(
+          _json['candlestickChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceChartProperties')) {
       dataSourceChartProperties = DataSourceChartProperties.fromJson(
-          _json['dataSourceChartProperties']);
+          _json['dataSourceChartProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filterSpecs')) {
       filterSpecs = (_json['filterSpecs'] as core.List)
-          .map<FilterSpec>((value) => FilterSpec.fromJson(value))
+          .map<FilterSpec>((value) =>
+              FilterSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fontName')) {
@@ -4950,49 +5114,59 @@
       hiddenDimensionStrategy = _json['hiddenDimensionStrategy'] as core.String;
     }
     if (_json.containsKey('histogramChart')) {
-      histogramChart = HistogramChartSpec.fromJson(_json['histogramChart']);
+      histogramChart = HistogramChartSpec.fromJson(
+          _json['histogramChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maximized')) {
       maximized = _json['maximized'] as core.bool;
     }
     if (_json.containsKey('orgChart')) {
-      orgChart = OrgChartSpec.fromJson(_json['orgChart']);
+      orgChart = OrgChartSpec.fromJson(
+          _json['orgChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pieChart')) {
-      pieChart = PieChartSpec.fromJson(_json['pieChart']);
+      pieChart = PieChartSpec.fromJson(
+          _json['pieChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scorecardChart')) {
-      scorecardChart = ScorecardChartSpec.fromJson(_json['scorecardChart']);
+      scorecardChart = ScorecardChartSpec.fromJson(
+          _json['scorecardChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortSpecs')) {
       sortSpecs = (_json['sortSpecs'] as core.List)
-          .map<SortSpec>((value) => SortSpec.fromJson(value))
+          .map<SortSpec>((value) =>
+              SortSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subtitle')) {
       subtitle = _json['subtitle'] as core.String;
     }
     if (_json.containsKey('subtitleTextFormat')) {
-      subtitleTextFormat = TextFormat.fromJson(_json['subtitleTextFormat']);
+      subtitleTextFormat = TextFormat.fromJson(
+          _json['subtitleTextFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subtitleTextPosition')) {
-      subtitleTextPosition =
-          TextPosition.fromJson(_json['subtitleTextPosition']);
+      subtitleTextPosition = TextPosition.fromJson(
+          _json['subtitleTextPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
     }
     if (_json.containsKey('titleTextFormat')) {
-      titleTextFormat = TextFormat.fromJson(_json['titleTextFormat']);
+      titleTextFormat = TextFormat.fromJson(
+          _json['titleTextFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('titleTextPosition')) {
-      titleTextPosition = TextPosition.fromJson(_json['titleTextPosition']);
+      titleTextPosition = TextPosition.fromJson(
+          _json['titleTextPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('treemapChart')) {
-      treemapChart = TreemapChartSpec.fromJson(_json['treemapChart']);
+      treemapChart = TreemapChartSpec.fromJson(
+          _json['treemapChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('waterfallChart')) {
-      waterfallChart = WaterfallChartSpec.fromJson(_json['waterfallChart']);
+      waterfallChart = WaterfallChartSpec.fromJson(
+          _json['waterfallChart'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5271,7 +5445,8 @@
 
   ColorStyle.fromJson(core.Map _json) {
     if (_json.containsKey('rgbColor')) {
-      rgbColor = Color.fromJson(_json['rgbColor']);
+      rgbColor = Color.fromJson(
+          _json['rgbColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('themeColor')) {
       themeColor = _json['themeColor'] as core.String;
@@ -5350,14 +5525,17 @@
 
   ConditionalFormatRule.fromJson(core.Map _json) {
     if (_json.containsKey('booleanRule')) {
-      booleanRule = BooleanRule.fromJson(_json['booleanRule']);
+      booleanRule = BooleanRule.fromJson(
+          _json['booleanRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gradientRule')) {
-      gradientRule = GradientRule.fromJson(_json['gradientRule']);
+      gradientRule = GradientRule.fromJson(
+          _json['gradientRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ranges')) {
       ranges = (_json['ranges'] as core.List)
-          .map<GridRange>((value) => GridRange.fromJson(value))
+          .map<GridRange>((value) =>
+              GridRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5413,7 +5591,8 @@
 
   CopyPasteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('destination')) {
-      destination = GridRange.fromJson(_json['destination']);
+      destination = GridRange.fromJson(
+          _json['destination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pasteOrientation')) {
       pasteOrientation = _json['pasteOrientation'] as core.String;
@@ -5422,7 +5601,8 @@
       pasteType = _json['pasteType'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = GridRange.fromJson(_json['source']);
+      source = GridRange.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5476,8 +5656,8 @@
 
   CreateDeveloperMetadataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('developerMetadata')) {
-      developerMetadata =
-          DeveloperMetadata.fromJson(_json['developerMetadata']);
+      developerMetadata = DeveloperMetadata.fromJson(
+          _json['developerMetadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5499,8 +5679,8 @@
 
   CreateDeveloperMetadataResponse.fromJson(core.Map _json) {
     if (_json.containsKey('developerMetadata')) {
-      developerMetadata =
-          DeveloperMetadata.fromJson(_json['developerMetadata']);
+      developerMetadata = DeveloperMetadata.fromJson(
+          _json['developerMetadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5539,13 +5719,15 @@
 
   CutPasteRequest.fromJson(core.Map _json) {
     if (_json.containsKey('destination')) {
-      destination = GridCoordinate.fromJson(_json['destination']);
+      destination = GridCoordinate.fromJson(
+          _json['destination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pasteType')) {
       pasteType = _json['pasteType'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = GridRange.fromJson(_json['source']);
+      source = GridRange.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5676,11 +5858,13 @@
       a1Range = _json['a1Range'] as core.String;
     }
     if (_json.containsKey('developerMetadataLookup')) {
-      developerMetadataLookup =
-          DeveloperMetadataLookup.fromJson(_json['developerMetadataLookup']);
+      developerMetadataLookup = DeveloperMetadataLookup.fromJson(
+          _json['developerMetadataLookup']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gridRange')) {
-      gridRange = GridRange.fromJson(_json['gridRange']);
+      gridRange = GridRange.fromJson(
+          _json['gridRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5724,7 +5908,8 @@
 
   DataFilterValueRange.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilter')) {
-      dataFilter = DataFilter.fromJson(_json['dataFilter']);
+      dataFilter = DataFilter.fromJson(
+          _json['dataFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('majorDimension')) {
       majorDimension = _json['majorDimension'] as core.String;
@@ -5776,7 +5961,8 @@
   DataSource.fromJson(core.Map _json) {
     if (_json.containsKey('calculatedColumns')) {
       calculatedColumns = (_json['calculatedColumns'] as core.List)
-          .map<DataSourceColumn>((value) => DataSourceColumn.fromJson(value))
+          .map<DataSourceColumn>((value) => DataSourceColumn.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dataSourceId')) {
@@ -5786,7 +5972,8 @@
       sheetId = _json['sheetId'] as core.int;
     }
     if (_json.containsKey('spec')) {
-      spec = DataSourceSpec.fromJson(_json['spec']);
+      spec = DataSourceSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5821,8 +6008,8 @@
 
   DataSourceChartProperties.fromJson(core.Map _json) {
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceId')) {
       dataSourceId = _json['dataSourceId'] as core.String;
@@ -5856,7 +6043,8 @@
       formula = _json['formula'] as core.String;
     }
     if (_json.containsKey('reference')) {
-      reference = DataSourceColumnReference.fromJson(_json['reference']);
+      reference = DataSourceColumnReference.fromJson(
+          _json['reference'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5906,8 +6094,8 @@
 
   DataSourceFormula.fromJson(core.Map _json) {
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceId')) {
       dataSourceId = _json['dataSourceId'] as core.String;
@@ -5950,16 +6138,19 @@
       chartId = _json['chartId'] as core.int;
     }
     if (_json.containsKey('dataSourceFormulaCell')) {
-      dataSourceFormulaCell =
-          GridCoordinate.fromJson(_json['dataSourceFormulaCell']);
+      dataSourceFormulaCell = GridCoordinate.fromJson(
+          _json['dataSourceFormulaCell']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourcePivotTableAnchorCell')) {
-      dataSourcePivotTableAnchorCell =
-          GridCoordinate.fromJson(_json['dataSourcePivotTableAnchorCell']);
+      dataSourcePivotTableAnchorCell = GridCoordinate.fromJson(
+          _json['dataSourcePivotTableAnchorCell']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceTableAnchorCell')) {
-      dataSourceTableAnchorCell =
-          GridCoordinate.fromJson(_json['dataSourceTableAnchorCell']);
+      dataSourceTableAnchorCell = GridCoordinate.fromJson(
+          _json['dataSourceTableAnchorCell']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sheetId')) {
       sheetId = _json['sheetId'] as core.String;
@@ -5998,8 +6189,9 @@
   DataSourceObjectReferences.fromJson(core.Map _json) {
     if (_json.containsKey('references')) {
       references = (_json['references'] as core.List)
-          .map<DataSourceObjectReference>(
-              (value) => DataSourceObjectReference.fromJson(value))
+          .map<DataSourceObjectReference>((value) =>
+              DataSourceObjectReference.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6037,7 +6229,8 @@
       namedRangeId = _json['namedRangeId'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6067,7 +6260,8 @@
 
   DataSourceRefreshDailySchedule.fromJson(core.Map _json) {
     if (_json.containsKey('startTime')) {
-      startTime = TimeOfDay.fromJson(_json['startTime']);
+      startTime = TimeOfDay.fromJson(
+          _json['startTime'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6101,7 +6295,8 @@
           .toList();
     }
     if (_json.containsKey('startTime')) {
-      startTime = TimeOfDay.fromJson(_json['startTime']);
+      startTime = TimeOfDay.fromJson(
+          _json['startTime'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6149,25 +6344,26 @@
 
   DataSourceRefreshSchedule.fromJson(core.Map _json) {
     if (_json.containsKey('dailySchedule')) {
-      dailySchedule =
-          DataSourceRefreshDailySchedule.fromJson(_json['dailySchedule']);
+      dailySchedule = DataSourceRefreshDailySchedule.fromJson(
+          _json['dailySchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enabled')) {
       enabled = _json['enabled'] as core.bool;
     }
     if (_json.containsKey('monthlySchedule')) {
-      monthlySchedule =
-          DataSourceRefreshMonthlySchedule.fromJson(_json['monthlySchedule']);
+      monthlySchedule = DataSourceRefreshMonthlySchedule.fromJson(
+          _json['monthlySchedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nextRun')) {
-      nextRun = Interval.fromJson(_json['nextRun']);
+      nextRun = Interval.fromJson(
+          _json['nextRun'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('refreshScope')) {
       refreshScope = _json['refreshScope'] as core.String;
     }
     if (_json.containsKey('weeklySchedule')) {
-      weeklySchedule =
-          DataSourceRefreshWeeklySchedule.fromJson(_json['weeklySchedule']);
+      weeklySchedule = DataSourceRefreshWeeklySchedule.fromJson(
+          _json['weeklySchedule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6215,7 +6411,8 @@
           .toList();
     }
     if (_json.containsKey('startTime')) {
-      startTime = TimeOfDay.fromJson(_json['startTime']);
+      startTime = TimeOfDay.fromJson(
+          _json['startTime'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6244,8 +6441,9 @@
   DataSourceSheetDimensionRange.fromJson(core.Map _json) {
     if (_json.containsKey('columnReferences')) {
       columnReferences = (_json['columnReferences'] as core.List)
-          .map<DataSourceColumnReference>(
-              (value) => DataSourceColumnReference.fromJson(value))
+          .map<DataSourceColumnReference>((value) =>
+              DataSourceColumnReference.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('sheetId')) {
@@ -6283,12 +6481,13 @@
   DataSourceSheetProperties.fromJson(core.Map _json) {
     if (_json.containsKey('columns')) {
       columns = (_json['columns'] as core.List)
-          .map<DataSourceColumn>((value) => DataSourceColumn.fromJson(value))
+          .map<DataSourceColumn>((value) => DataSourceColumn.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceId')) {
       dataSourceId = _json['dataSourceId'] as core.String;
@@ -6323,12 +6522,13 @@
 
   DataSourceSpec.fromJson(core.Map _json) {
     if (_json.containsKey('bigQuery')) {
-      bigQuery = BigQueryDataSourceSpec.fromJson(_json['bigQuery']);
+      bigQuery = BigQueryDataSourceSpec.fromJson(
+          _json['bigQuery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parameters')) {
       parameters = (_json['parameters'] as core.List)
-          .map<DataSourceParameter>(
-              (value) => DataSourceParameter.fromJson(value))
+          .map<DataSourceParameter>((value) => DataSourceParameter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6389,20 +6589,22 @@
     }
     if (_json.containsKey('columns')) {
       columns = (_json['columns'] as core.List)
-          .map<DataSourceColumnReference>(
-              (value) => DataSourceColumnReference.fromJson(value))
+          .map<DataSourceColumnReference>((value) =>
+              DataSourceColumnReference.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceId')) {
       dataSourceId = _json['dataSourceId'] as core.String;
     }
     if (_json.containsKey('filterSpecs')) {
       filterSpecs = (_json['filterSpecs'] as core.List)
-          .map<FilterSpec>((value) => FilterSpec.fromJson(value))
+          .map<FilterSpec>((value) =>
+              FilterSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rowLimit')) {
@@ -6410,7 +6612,8 @@
     }
     if (_json.containsKey('sortSpecs')) {
       sortSpecs = (_json['sortSpecs'] as core.List)
-          .map<SortSpec>((value) => SortSpec.fromJson(value))
+          .map<SortSpec>((value) =>
+              SortSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6462,7 +6665,8 @@
 
   DataValidationRule.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = BooleanCondition.fromJson(_json['condition']);
+      condition = BooleanCondition.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputMessage')) {
       inputMessage = _json['inputMessage'] as core.String;
@@ -6615,7 +6819,8 @@
 
   DeleteConditionalFormatRuleResponse.fromJson(core.Map _json) {
     if (_json.containsKey('rule')) {
-      rule = ConditionalFormatRule.fromJson(_json['rule']);
+      rule = ConditionalFormatRule.fromJson(
+          _json['rule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6661,7 +6866,8 @@
 
   DeleteDeveloperMetadataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilter')) {
-      dataFilter = DataFilter.fromJson(_json['dataFilter']);
+      dataFilter = DataFilter.fromJson(
+          _json['dataFilter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6683,10 +6889,11 @@
 
   DeleteDeveloperMetadataResponse.fromJson(core.Map _json) {
     if (_json.containsKey('deletedDeveloperMetadata')) {
-      deletedDeveloperMetadata = (_json['deletedDeveloperMetadata']
-              as core.List)
-          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(value))
-          .toList();
+      deletedDeveloperMetadata =
+          (_json['deletedDeveloperMetadata'] as core.List)
+              .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
+              .toList();
     }
   }
 
@@ -6712,7 +6919,8 @@
 
   DeleteDimensionGroupRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = DimensionRange.fromJson(_json['range']);
+      range = DimensionRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6735,7 +6943,8 @@
   DeleteDimensionGroupResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionGroups')) {
       dimensionGroups = (_json['dimensionGroups'] as core.List)
-          .map<DimensionGroup>((value) => DimensionGroup.fromJson(value))
+          .map<DimensionGroup>((value) => DimensionGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6759,7 +6968,8 @@
 
   DeleteDimensionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = DimensionRange.fromJson(_json['range']);
+      range = DimensionRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6794,11 +7004,13 @@
   DeleteDuplicatesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('comparisonColumns')) {
       comparisonColumns = (_json['comparisonColumns'] as core.List)
-          .map<DimensionRange>((value) => DimensionRange.fromJson(value))
+          .map<DimensionRange>((value) => DimensionRange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6943,7 +7155,8 @@
 
   DeleteRangeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shiftDimension')) {
       shiftDimension = _json['shiftDimension'] as core.String;
@@ -7023,7 +7236,8 @@
 
   DeveloperMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('location')) {
-      location = DeveloperMetadataLocation.fromJson(_json['location']);
+      location = DeveloperMetadataLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadataId')) {
       metadataId = _json['metadataId'] as core.int;
@@ -7086,7 +7300,8 @@
 
   DeveloperMetadataLocation.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionRange')) {
-      dimensionRange = DimensionRange.fromJson(_json['dimensionRange']);
+      dimensionRange = DimensionRange.fromJson(
+          _json['dimensionRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationType')) {
       locationType = _json['locationType'] as core.String;
@@ -7212,8 +7427,8 @@
       metadataKey = _json['metadataKey'] as core.String;
     }
     if (_json.containsKey('metadataLocation')) {
-      metadataLocation =
-          DeveloperMetadataLocation.fromJson(_json['metadataLocation']);
+      metadataLocation = DeveloperMetadataLocation.fromJson(
+          _json['metadataLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadataValue')) {
       metadataValue = _json['metadataValue'] as core.String;
@@ -7280,7 +7495,8 @@
       depth = _json['depth'] as core.int;
     }
     if (_json.containsKey('range')) {
-      range = DimensionRange.fromJson(_json['range']);
+      range = DimensionRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7321,11 +7537,13 @@
   DimensionProperties.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceColumnReference')) {
       dataSourceColumnReference = DataSourceColumnReference.fromJson(
-          _json['dataSourceColumnReference']);
+          _json['dataSourceColumnReference']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('developerMetadata')) {
       developerMetadata = (_json['developerMetadata'] as core.List)
-          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(value))
+          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('hiddenByFilter')) {
@@ -7447,7 +7665,8 @@
 
   DuplicateFilterViewResponse.fromJson(core.Map _json) {
     if (_json.containsKey('filter')) {
-      filter = FilterView.fromJson(_json['filter']);
+      filter = FilterView.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7524,7 +7743,8 @@
 
   DuplicateSheetResponse.fromJson(core.Map _json) {
     if (_json.containsKey('properties')) {
-      properties = SheetProperties.fromJson(_json['properties']);
+      properties = SheetProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7600,10 +7820,12 @@
       chartId = _json['chartId'] as core.int;
     }
     if (_json.containsKey('position')) {
-      position = EmbeddedObjectPosition.fromJson(_json['position']);
+      position = EmbeddedObjectPosition.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spec')) {
-      spec = ChartSpec.fromJson(_json['spec']);
+      spec = ChartSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7642,7 +7864,8 @@
       newSheet = _json['newSheet'] as core.bool;
     }
     if (_json.containsKey('overlayPosition')) {
-      overlayPosition = OverlayPosition.fromJson(_json['overlayPosition']);
+      overlayPosition = OverlayPosition.fromJson(
+          _json['overlayPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sheetId')) {
       sheetId = _json['sheetId'] as core.int;
@@ -7734,7 +7957,8 @@
       boolValue = _json['boolValue'] as core.bool;
     }
     if (_json.containsKey('errorValue')) {
-      errorValue = ErrorValue.fromJson(_json['errorValue']);
+      errorValue = ErrorValue.fromJson(
+          _json['errorValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('formulaValue')) {
       formulaValue = _json['formulaValue'] as core.String;
@@ -7802,7 +8026,8 @@
 
   FilterCriteria.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = BooleanCondition.fromJson(_json['condition']);
+      condition = BooleanCondition.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hiddenValues')) {
       hiddenValues = (_json['hiddenValues'] as core.List)
@@ -7810,18 +8035,22 @@
           .toList();
     }
     if (_json.containsKey('visibleBackgroundColor')) {
-      visibleBackgroundColor = Color.fromJson(_json['visibleBackgroundColor']);
+      visibleBackgroundColor = Color.fromJson(_json['visibleBackgroundColor']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visibleBackgroundColorStyle')) {
-      visibleBackgroundColorStyle =
-          ColorStyle.fromJson(_json['visibleBackgroundColorStyle']);
+      visibleBackgroundColorStyle = ColorStyle.fromJson(
+          _json['visibleBackgroundColorStyle']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visibleForegroundColor')) {
-      visibleForegroundColor = Color.fromJson(_json['visibleForegroundColor']);
+      visibleForegroundColor = Color.fromJson(_json['visibleForegroundColor']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visibleForegroundColorStyle')) {
-      visibleForegroundColorStyle =
-          ColorStyle.fromJson(_json['visibleForegroundColorStyle']);
+      visibleForegroundColorStyle = ColorStyle.fromJson(
+          _json['visibleForegroundColorStyle']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7870,10 +8099,12 @@
     }
     if (_json.containsKey('dataSourceColumnReference')) {
       dataSourceColumnReference = DataSourceColumnReference.fromJson(
-          _json['dataSourceColumnReference']);
+          _json['dataSourceColumnReference']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filterCriteria')) {
-      filterCriteria = FilterCriteria.fromJson(_json['filterCriteria']);
+      filterCriteria = FilterCriteria.fromJson(
+          _json['filterCriteria'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7927,12 +8158,15 @@
   FilterView.fromJson(core.Map _json) {
     if (_json.containsKey('criteria')) {
       criteria = commons.mapMap<core.Map, FilterCriteria>(
-          _json['criteria'].cast<core.String, core.Map>(),
-          (core.Map item) => FilterCriteria.fromJson(item));
+          (_json['criteria'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => FilterCriteria.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('filterSpecs')) {
       filterSpecs = (_json['filterSpecs'] as core.List)
-          .map<FilterSpec>((value) => FilterSpec.fromJson(value))
+          .map<FilterSpec>((value) =>
+              FilterSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('filterViewId')) {
@@ -7942,11 +8176,13 @@
       namedRangeId = _json['namedRangeId'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortSpecs')) {
       sortSpecs = (_json['sortSpecs'] as core.List)
-          .map<SortSpec>((value) => SortSpec.fromJson(value))
+          .map<SortSpec>((value) =>
+              SortSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -8040,7 +8276,8 @@
       matchEntireCell = _json['matchEntireCell'] as core.bool;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replacement')) {
       replacement = _json['replacement'] as core.String;
@@ -8161,7 +8398,8 @@
   GetSpreadsheetByDataFilterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilters')) {
       dataFilters = (_json['dataFilters'] as core.List)
-          .map<DataFilter>((value) => DataFilter.fromJson(value))
+          .map<DataFilter>((value) =>
+              DataFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('includeGridData')) {
@@ -8199,13 +8437,16 @@
 
   GradientRule.fromJson(core.Map _json) {
     if (_json.containsKey('maxpoint')) {
-      maxpoint = InterpolationPoint.fromJson(_json['maxpoint']);
+      maxpoint = InterpolationPoint.fromJson(
+          _json['maxpoint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('midpoint')) {
-      midpoint = InterpolationPoint.fromJson(_json['midpoint']);
+      midpoint = InterpolationPoint.fromJson(
+          _json['midpoint'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minpoint')) {
-      minpoint = InterpolationPoint.fromJson(_json['minpoint']);
+      minpoint = InterpolationPoint.fromJson(
+          _json['minpoint'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8290,19 +8531,20 @@
   GridData.fromJson(core.Map _json) {
     if (_json.containsKey('columnMetadata')) {
       columnMetadata = (_json['columnMetadata'] as core.List)
-          .map<DimensionProperties>(
-              (value) => DimensionProperties.fromJson(value))
+          .map<DimensionProperties>((value) => DimensionProperties.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rowData')) {
       rowData = (_json['rowData'] as core.List)
-          .map<RowData>((value) => RowData.fromJson(value))
+          .map<RowData>((value) =>
+              RowData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rowMetadata')) {
       rowMetadata = (_json['rowMetadata'] as core.List)
-          .map<DimensionProperties>(
-              (value) => DimensionProperties.fromJson(value))
+          .map<DimensionProperties>((value) => DimensionProperties.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('startColumn')) {
@@ -8537,7 +8779,8 @@
     }
     if (_json.containsKey('series')) {
       series = (_json['series'] as core.List)
-          .map<HistogramSeries>((value) => HistogramSeries.fromJson(value))
+          .map<HistogramSeries>((value) => HistogramSeries.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('showItemDividers')) {
@@ -8643,13 +8886,16 @@
 
   HistogramSeries.fromJson(core.Map _json) {
     if (_json.containsKey('barColor')) {
-      barColor = Color.fromJson(_json['barColor']);
+      barColor = Color.fromJson(
+          _json['barColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('barColorStyle')) {
-      barColorStyle = ColorStyle.fromJson(_json['barColorStyle']);
+      barColorStyle = ColorStyle.fromJson(
+          _json['barColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('data')) {
-      data = ChartData.fromJson(_json['data']);
+      data = ChartData.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8692,7 +8938,8 @@
       inheritFromBefore = _json['inheritFromBefore'] as core.bool;
     }
     if (_json.containsKey('range')) {
-      range = DimensionRange.fromJson(_json['range']);
+      range = DimensionRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8726,7 +8973,8 @@
 
   InsertRangeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shiftDimension')) {
       shiftDimension = _json['shiftDimension'] as core.String;
@@ -8783,10 +9031,12 @@
 
   InterpolationPoint.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorStyle')) {
-      colorStyle = ColorStyle.fromJson(_json['colorStyle']);
+      colorStyle = ColorStyle.fromJson(
+          _json['colorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -8898,10 +9148,12 @@
 
   KeyValueFormat.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = TextPosition.fromJson(_json['position']);
+      position = TextPosition.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textFormat')) {
-      textFormat = TextFormat.fromJson(_json['textFormat']);
+      textFormat = TextFormat.fromJson(
+          _json['textFormat'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8983,7 +9235,8 @@
   ManualRule.fromJson(core.Map _json) {
     if (_json.containsKey('groups')) {
       groups = (_json['groups'] as core.List)
-          .map<ManualRuleGroup>((value) => ManualRuleGroup.fromJson(value))
+          .map<ManualRuleGroup>((value) => ManualRuleGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9014,11 +9267,13 @@
 
   ManualRuleGroup.fromJson(core.Map _json) {
     if (_json.containsKey('groupName')) {
-      groupName = ExtendedValue.fromJson(_json['groupName']);
+      groupName = ExtendedValue.fromJson(
+          _json['groupName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ExtendedValue>((value) => ExtendedValue.fromJson(value))
+          .map<ExtendedValue>((value) => ExtendedValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9049,12 +9304,13 @@
   MatchedDeveloperMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilters')) {
       dataFilters = (_json['dataFilters'] as core.List)
-          .map<DataFilter>((value) => DataFilter.fromJson(value))
+          .map<DataFilter>((value) =>
+              DataFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('developerMetadata')) {
-      developerMetadata =
-          DeveloperMetadata.fromJson(_json['developerMetadata']);
+      developerMetadata = DeveloperMetadata.fromJson(
+          _json['developerMetadata'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9084,11 +9340,13 @@
   MatchedValueRange.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilters')) {
       dataFilters = (_json['dataFilters'] as core.List)
-          .map<DataFilter>((value) => DataFilter.fromJson(value))
+          .map<DataFilter>((value) =>
+              DataFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('valueRange')) {
-      valueRange = ValueRange.fromJson(_json['valueRange']);
+      valueRange = ValueRange.fromJson(
+          _json['valueRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9124,7 +9382,8 @@
       mergeType = _json['mergeType'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9163,7 +9422,8 @@
       destinationIndex = _json['destinationIndex'] as core.int;
     }
     if (_json.containsKey('source')) {
-      source = DimensionRange.fromJson(_json['source']);
+      source = DimensionRange.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9200,7 +9460,8 @@
       namedRangeId = _json['namedRangeId'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9313,29 +9574,36 @@
 
   OrgChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('labels')) {
-      labels = ChartData.fromJson(_json['labels']);
+      labels = ChartData.fromJson(
+          _json['labels'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nodeColor')) {
-      nodeColor = Color.fromJson(_json['nodeColor']);
+      nodeColor = Color.fromJson(
+          _json['nodeColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nodeColorStyle')) {
-      nodeColorStyle = ColorStyle.fromJson(_json['nodeColorStyle']);
+      nodeColorStyle = ColorStyle.fromJson(
+          _json['nodeColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('nodeSize')) {
       nodeSize = _json['nodeSize'] as core.String;
     }
     if (_json.containsKey('parentLabels')) {
-      parentLabels = ChartData.fromJson(_json['parentLabels']);
+      parentLabels = ChartData.fromJson(
+          _json['parentLabels'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selectedNodeColor')) {
-      selectedNodeColor = Color.fromJson(_json['selectedNodeColor']);
+      selectedNodeColor = Color.fromJson(
+          _json['selectedNodeColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selectedNodeColorStyle')) {
-      selectedNodeColorStyle =
-          ColorStyle.fromJson(_json['selectedNodeColorStyle']);
+      selectedNodeColorStyle = ColorStyle.fromJson(
+          _json['selectedNodeColorStyle']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tooltips')) {
-      tooltips = ChartData.fromJson(_json['tooltips']);
+      tooltips = ChartData.fromJson(
+          _json['tooltips'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9392,7 +9660,8 @@
 
   OverlayPosition.fromJson(core.Map _json) {
     if (_json.containsKey('anchorCell')) {
-      anchorCell = GridCoordinate.fromJson(_json['anchorCell']);
+      anchorCell = GridCoordinate.fromJson(
+          _json['anchorCell'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('heightPixels')) {
       heightPixels = _json['heightPixels'] as core.int;
@@ -9510,7 +9779,8 @@
 
   PasteDataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('coordinate')) {
-      coordinate = GridCoordinate.fromJson(_json['coordinate']);
+      coordinate = GridCoordinate.fromJson(
+          _json['coordinate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('data')) {
       data = _json['data'] as core.String;
@@ -9576,7 +9846,8 @@
 
   PieChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('domain')) {
-      domain = ChartData.fromJson(_json['domain']);
+      domain = ChartData.fromJson(
+          _json['domain'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('legendPosition')) {
       legendPosition = _json['legendPosition'] as core.String;
@@ -9585,7 +9856,8 @@
       pieHole = (_json['pieHole'] as core.num).toDouble();
     }
     if (_json.containsKey('series')) {
-      series = ChartData.fromJson(_json['series']);
+      series = ChartData.fromJson(
+          _json['series'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('threeDimensional')) {
       threeDimensional = _json['threeDimensional'] as core.bool;
@@ -9657,10 +9929,12 @@
     }
     if (_json.containsKey('dataSourceColumnReference')) {
       dataSourceColumnReference = DataSourceColumnReference.fromJson(
-          _json['dataSourceColumnReference']);
+          _json['dataSourceColumnReference']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filterCriteria')) {
-      filterCriteria = PivotFilterCriteria.fromJson(_json['filterCriteria']);
+      filterCriteria = PivotFilterCriteria.fromJson(
+          _json['filterCriteria'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9741,13 +10015,16 @@
   PivotGroup.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceColumnReference')) {
       dataSourceColumnReference = DataSourceColumnReference.fromJson(
-          _json['dataSourceColumnReference']);
+          _json['dataSourceColumnReference']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupLimit')) {
-      groupLimit = PivotGroupLimit.fromJson(_json['groupLimit']);
+      groupLimit = PivotGroupLimit.fromJson(
+          _json['groupLimit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupRule')) {
-      groupRule = PivotGroupRule.fromJson(_json['groupRule']);
+      groupRule = PivotGroupRule.fromJson(
+          _json['groupRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('label')) {
       label = _json['label'] as core.String;
@@ -9765,12 +10042,14 @@
       sourceColumnOffset = _json['sourceColumnOffset'] as core.int;
     }
     if (_json.containsKey('valueBucket')) {
-      valueBucket = PivotGroupSortValueBucket.fromJson(_json['valueBucket']);
+      valueBucket = PivotGroupSortValueBucket.fromJson(
+          _json['valueBucket'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('valueMetadata')) {
       valueMetadata = (_json['valueMetadata'] as core.List)
-          .map<PivotGroupValueMetadata>(
-              (value) => PivotGroupValueMetadata.fromJson(value))
+          .map<PivotGroupValueMetadata>((value) =>
+              PivotGroupValueMetadata.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9867,13 +10146,16 @@
 
   PivotGroupRule.fromJson(core.Map _json) {
     if (_json.containsKey('dateTimeRule')) {
-      dateTimeRule = DateTimeRule.fromJson(_json['dateTimeRule']);
+      dateTimeRule = DateTimeRule.fromJson(
+          _json['dateTimeRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('histogramRule')) {
-      histogramRule = HistogramRule.fromJson(_json['histogramRule']);
+      histogramRule = HistogramRule.fromJson(
+          _json['histogramRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('manualRule')) {
-      manualRule = ManualRule.fromJson(_json['manualRule']);
+      manualRule = ManualRule.fromJson(
+          _json['manualRule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9913,7 +10195,8 @@
   PivotGroupSortValueBucket.fromJson(core.Map _json) {
     if (_json.containsKey('buckets')) {
       buckets = (_json['buckets'] as core.List)
-          .map<ExtendedValue>((value) => ExtendedValue.fromJson(value))
+          .map<ExtendedValue>((value) => ExtendedValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('valuesIndex')) {
@@ -9949,7 +10232,8 @@
       collapsed = _json['collapsed'] as core.bool;
     }
     if (_json.containsKey('value')) {
-      value = ExtendedValue.fromJson(_json['value']);
+      value = ExtendedValue.fromJson(
+          _json['value'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10011,40 +10295,47 @@
   PivotTable.fromJson(core.Map _json) {
     if (_json.containsKey('columns')) {
       columns = (_json['columns'] as core.List)
-          .map<PivotGroup>((value) => PivotGroup.fromJson(value))
+          .map<PivotGroup>((value) =>
+              PivotGroup.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('criteria')) {
       criteria = commons.mapMap<core.Map, PivotFilterCriteria>(
-          _json['criteria'].cast<core.String, core.Map>(),
-          (core.Map item) => PivotFilterCriteria.fromJson(item));
+          (_json['criteria'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => PivotFilterCriteria.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceId')) {
       dataSourceId = _json['dataSourceId'] as core.String;
     }
     if (_json.containsKey('filterSpecs')) {
       filterSpecs = (_json['filterSpecs'] as core.List)
-          .map<PivotFilterSpec>((value) => PivotFilterSpec.fromJson(value))
+          .map<PivotFilterSpec>((value) => PivotFilterSpec.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<PivotGroup>((value) => PivotGroup.fromJson(value))
+          .map<PivotGroup>((value) =>
+              PivotGroup.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('source')) {
-      source = GridRange.fromJson(_json['source']);
+      source = GridRange.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('valueLayout')) {
       valueLayout = _json['valueLayout'] as core.String;
     }
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<PivotValue>((value) => PivotValue.fromJson(value))
+          .map<PivotValue>((value) =>
+              PivotValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10150,7 +10441,8 @@
     }
     if (_json.containsKey('dataSourceColumnReference')) {
       dataSourceColumnReference = DataSourceColumnReference.fromJson(
-          _json['dataSourceColumnReference']);
+          _json['dataSourceColumnReference']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('formula')) {
       formula = _json['formula'] as core.String;
@@ -10236,7 +10528,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('editors')) {
-      editors = Editors.fromJson(_json['editors']);
+      editors = Editors.fromJson(
+          _json['editors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('namedRangeId')) {
       namedRangeId = _json['namedRangeId'] as core.String;
@@ -10245,14 +10538,16 @@
       protectedRangeId = _json['protectedRangeId'] as core.int;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requestingUserCanEdit')) {
       requestingUserCanEdit = _json['requestingUserCanEdit'] as core.bool;
     }
     if (_json.containsKey('unprotectedRanges')) {
       unprotectedRanges = (_json['unprotectedRanges'] as core.List)
-          .map<GridRange>((value) => GridRange.fromJson(value))
+          .map<GridRange>((value) =>
+              GridRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('warningOnly')) {
@@ -10300,7 +10595,8 @@
 
   RandomizeRangeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10325,11 +10621,12 @@
 
   RefreshDataSourceObjectExecutionStatus.fromJson(core.Map _json) {
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reference')) {
-      reference = DataSourceObjectReference.fromJson(_json['reference']);
+      reference = DataSourceObjectReference.fromJson(
+          _json['reference'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10379,7 +10676,8 @@
       isAll = _json['isAll'] as core.bool;
     }
     if (_json.containsKey('references')) {
-      references = DataSourceObjectReferences.fromJson(_json['references']);
+      references = DataSourceObjectReferences.fromJson(
+          _json['references'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10413,8 +10711,9 @@
   RefreshDataSourceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('statuses')) {
       statuses = (_json['statuses'] as core.List)
-          .map<RefreshDataSourceObjectExecutionStatus>(
-              (value) => RefreshDataSourceObjectExecutionStatus.fromJson(value))
+          .map<RefreshDataSourceObjectExecutionStatus>((value) =>
+              RefreshDataSourceObjectExecutionStatus.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10453,13 +10752,15 @@
 
   RepeatCellRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cell')) {
-      cell = CellData.fromJson(_json['cell']);
+      cell = CellData.fromJson(
+          _json['cell'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10678,231 +10979,271 @@
 
   Request.fromJson(core.Map _json) {
     if (_json.containsKey('addBanding')) {
-      addBanding = AddBandingRequest.fromJson(_json['addBanding']);
+      addBanding = AddBandingRequest.fromJson(
+          _json['addBanding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addChart')) {
-      addChart = AddChartRequest.fromJson(_json['addChart']);
+      addChart = AddChartRequest.fromJson(
+          _json['addChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addConditionalFormatRule')) {
       addConditionalFormatRule = AddConditionalFormatRuleRequest.fromJson(
-          _json['addConditionalFormatRule']);
+          _json['addConditionalFormatRule']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addDataSource')) {
-      addDataSource = AddDataSourceRequest.fromJson(_json['addDataSource']);
+      addDataSource = AddDataSourceRequest.fromJson(
+          _json['addDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addDimensionGroup')) {
-      addDimensionGroup =
-          AddDimensionGroupRequest.fromJson(_json['addDimensionGroup']);
+      addDimensionGroup = AddDimensionGroupRequest.fromJson(
+          _json['addDimensionGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addFilterView')) {
-      addFilterView = AddFilterViewRequest.fromJson(_json['addFilterView']);
+      addFilterView = AddFilterViewRequest.fromJson(
+          _json['addFilterView'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addNamedRange')) {
-      addNamedRange = AddNamedRangeRequest.fromJson(_json['addNamedRange']);
+      addNamedRange = AddNamedRangeRequest.fromJson(
+          _json['addNamedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addProtectedRange')) {
-      addProtectedRange =
-          AddProtectedRangeRequest.fromJson(_json['addProtectedRange']);
+      addProtectedRange = AddProtectedRangeRequest.fromJson(
+          _json['addProtectedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addSheet')) {
-      addSheet = AddSheetRequest.fromJson(_json['addSheet']);
+      addSheet = AddSheetRequest.fromJson(
+          _json['addSheet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addSlicer')) {
-      addSlicer = AddSlicerRequest.fromJson(_json['addSlicer']);
+      addSlicer = AddSlicerRequest.fromJson(
+          _json['addSlicer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appendCells')) {
-      appendCells = AppendCellsRequest.fromJson(_json['appendCells']);
+      appendCells = AppendCellsRequest.fromJson(
+          _json['appendCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appendDimension')) {
-      appendDimension =
-          AppendDimensionRequest.fromJson(_json['appendDimension']);
+      appendDimension = AppendDimensionRequest.fromJson(
+          _json['appendDimension'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('autoFill')) {
-      autoFill = AutoFillRequest.fromJson(_json['autoFill']);
+      autoFill = AutoFillRequest.fromJson(
+          _json['autoFill'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('autoResizeDimensions')) {
-      autoResizeDimensions =
-          AutoResizeDimensionsRequest.fromJson(_json['autoResizeDimensions']);
+      autoResizeDimensions = AutoResizeDimensionsRequest.fromJson(
+          _json['autoResizeDimensions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('clearBasicFilter')) {
-      clearBasicFilter =
-          ClearBasicFilterRequest.fromJson(_json['clearBasicFilter']);
+      clearBasicFilter = ClearBasicFilterRequest.fromJson(
+          _json['clearBasicFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('copyPaste')) {
-      copyPaste = CopyPasteRequest.fromJson(_json['copyPaste']);
+      copyPaste = CopyPasteRequest.fromJson(
+          _json['copyPaste'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createDeveloperMetadata')) {
       createDeveloperMetadata = CreateDeveloperMetadataRequest.fromJson(
-          _json['createDeveloperMetadata']);
+          _json['createDeveloperMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cutPaste')) {
-      cutPaste = CutPasteRequest.fromJson(_json['cutPaste']);
+      cutPaste = CutPasteRequest.fromJson(
+          _json['cutPaste'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteBanding')) {
-      deleteBanding = DeleteBandingRequest.fromJson(_json['deleteBanding']);
+      deleteBanding = DeleteBandingRequest.fromJson(
+          _json['deleteBanding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteConditionalFormatRule')) {
       deleteConditionalFormatRule = DeleteConditionalFormatRuleRequest.fromJson(
-          _json['deleteConditionalFormatRule']);
+          _json['deleteConditionalFormatRule']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDataSource')) {
-      deleteDataSource =
-          DeleteDataSourceRequest.fromJson(_json['deleteDataSource']);
+      deleteDataSource = DeleteDataSourceRequest.fromJson(
+          _json['deleteDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDeveloperMetadata')) {
       deleteDeveloperMetadata = DeleteDeveloperMetadataRequest.fromJson(
-          _json['deleteDeveloperMetadata']);
+          _json['deleteDeveloperMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDimension')) {
-      deleteDimension =
-          DeleteDimensionRequest.fromJson(_json['deleteDimension']);
+      deleteDimension = DeleteDimensionRequest.fromJson(
+          _json['deleteDimension'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDimensionGroup')) {
-      deleteDimensionGroup =
-          DeleteDimensionGroupRequest.fromJson(_json['deleteDimensionGroup']);
+      deleteDimensionGroup = DeleteDimensionGroupRequest.fromJson(
+          _json['deleteDimensionGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDuplicates')) {
-      deleteDuplicates =
-          DeleteDuplicatesRequest.fromJson(_json['deleteDuplicates']);
+      deleteDuplicates = DeleteDuplicatesRequest.fromJson(
+          _json['deleteDuplicates'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteEmbeddedObject')) {
-      deleteEmbeddedObject =
-          DeleteEmbeddedObjectRequest.fromJson(_json['deleteEmbeddedObject']);
+      deleteEmbeddedObject = DeleteEmbeddedObjectRequest.fromJson(
+          _json['deleteEmbeddedObject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteFilterView')) {
-      deleteFilterView =
-          DeleteFilterViewRequest.fromJson(_json['deleteFilterView']);
+      deleteFilterView = DeleteFilterViewRequest.fromJson(
+          _json['deleteFilterView'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteNamedRange')) {
-      deleteNamedRange =
-          DeleteNamedRangeRequest.fromJson(_json['deleteNamedRange']);
+      deleteNamedRange = DeleteNamedRangeRequest.fromJson(
+          _json['deleteNamedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteProtectedRange')) {
-      deleteProtectedRange =
-          DeleteProtectedRangeRequest.fromJson(_json['deleteProtectedRange']);
+      deleteProtectedRange = DeleteProtectedRangeRequest.fromJson(
+          _json['deleteProtectedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteRange')) {
-      deleteRange = DeleteRangeRequest.fromJson(_json['deleteRange']);
+      deleteRange = DeleteRangeRequest.fromJson(
+          _json['deleteRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteSheet')) {
-      deleteSheet = DeleteSheetRequest.fromJson(_json['deleteSheet']);
+      deleteSheet = DeleteSheetRequest.fromJson(
+          _json['deleteSheet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duplicateFilterView')) {
-      duplicateFilterView =
-          DuplicateFilterViewRequest.fromJson(_json['duplicateFilterView']);
+      duplicateFilterView = DuplicateFilterViewRequest.fromJson(
+          _json['duplicateFilterView'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duplicateSheet')) {
-      duplicateSheet = DuplicateSheetRequest.fromJson(_json['duplicateSheet']);
+      duplicateSheet = DuplicateSheetRequest.fromJson(
+          _json['duplicateSheet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('findReplace')) {
-      findReplace = FindReplaceRequest.fromJson(_json['findReplace']);
+      findReplace = FindReplaceRequest.fromJson(
+          _json['findReplace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertDimension')) {
-      insertDimension =
-          InsertDimensionRequest.fromJson(_json['insertDimension']);
+      insertDimension = InsertDimensionRequest.fromJson(
+          _json['insertDimension'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertRange')) {
-      insertRange = InsertRangeRequest.fromJson(_json['insertRange']);
+      insertRange = InsertRangeRequest.fromJson(
+          _json['insertRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mergeCells')) {
-      mergeCells = MergeCellsRequest.fromJson(_json['mergeCells']);
+      mergeCells = MergeCellsRequest.fromJson(
+          _json['mergeCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('moveDimension')) {
-      moveDimension = MoveDimensionRequest.fromJson(_json['moveDimension']);
+      moveDimension = MoveDimensionRequest.fromJson(
+          _json['moveDimension'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pasteData')) {
-      pasteData = PasteDataRequest.fromJson(_json['pasteData']);
+      pasteData = PasteDataRequest.fromJson(
+          _json['pasteData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('randomizeRange')) {
-      randomizeRange = RandomizeRangeRequest.fromJson(_json['randomizeRange']);
+      randomizeRange = RandomizeRangeRequest.fromJson(
+          _json['randomizeRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('refreshDataSource')) {
-      refreshDataSource =
-          RefreshDataSourceRequest.fromJson(_json['refreshDataSource']);
+      refreshDataSource = RefreshDataSourceRequest.fromJson(
+          _json['refreshDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('repeatCell')) {
-      repeatCell = RepeatCellRequest.fromJson(_json['repeatCell']);
+      repeatCell = RepeatCellRequest.fromJson(
+          _json['repeatCell'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('setBasicFilter')) {
-      setBasicFilter = SetBasicFilterRequest.fromJson(_json['setBasicFilter']);
+      setBasicFilter = SetBasicFilterRequest.fromJson(
+          _json['setBasicFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('setDataValidation')) {
-      setDataValidation =
-          SetDataValidationRequest.fromJson(_json['setDataValidation']);
+      setDataValidation = SetDataValidationRequest.fromJson(
+          _json['setDataValidation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortRange')) {
-      sortRange = SortRangeRequest.fromJson(_json['sortRange']);
+      sortRange = SortRangeRequest.fromJson(
+          _json['sortRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textToColumns')) {
-      textToColumns = TextToColumnsRequest.fromJson(_json['textToColumns']);
+      textToColumns = TextToColumnsRequest.fromJson(
+          _json['textToColumns'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trimWhitespace')) {
-      trimWhitespace = TrimWhitespaceRequest.fromJson(_json['trimWhitespace']);
+      trimWhitespace = TrimWhitespaceRequest.fromJson(
+          _json['trimWhitespace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unmergeCells')) {
-      unmergeCells = UnmergeCellsRequest.fromJson(_json['unmergeCells']);
+      unmergeCells = UnmergeCellsRequest.fromJson(
+          _json['unmergeCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateBanding')) {
-      updateBanding = UpdateBandingRequest.fromJson(_json['updateBanding']);
+      updateBanding = UpdateBandingRequest.fromJson(
+          _json['updateBanding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateBorders')) {
-      updateBorders = UpdateBordersRequest.fromJson(_json['updateBorders']);
+      updateBorders = UpdateBordersRequest.fromJson(
+          _json['updateBorders'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateCells')) {
-      updateCells = UpdateCellsRequest.fromJson(_json['updateCells']);
+      updateCells = UpdateCellsRequest.fromJson(
+          _json['updateCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateChartSpec')) {
-      updateChartSpec =
-          UpdateChartSpecRequest.fromJson(_json['updateChartSpec']);
+      updateChartSpec = UpdateChartSpecRequest.fromJson(
+          _json['updateChartSpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateConditionalFormatRule')) {
       updateConditionalFormatRule = UpdateConditionalFormatRuleRequest.fromJson(
-          _json['updateConditionalFormatRule']);
+          _json['updateConditionalFormatRule']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateDataSource')) {
-      updateDataSource =
-          UpdateDataSourceRequest.fromJson(_json['updateDataSource']);
+      updateDataSource = UpdateDataSourceRequest.fromJson(
+          _json['updateDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateDeveloperMetadata')) {
       updateDeveloperMetadata = UpdateDeveloperMetadataRequest.fromJson(
-          _json['updateDeveloperMetadata']);
+          _json['updateDeveloperMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateDimensionGroup')) {
-      updateDimensionGroup =
-          UpdateDimensionGroupRequest.fromJson(_json['updateDimensionGroup']);
+      updateDimensionGroup = UpdateDimensionGroupRequest.fromJson(
+          _json['updateDimensionGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateDimensionProperties')) {
       updateDimensionProperties = UpdateDimensionPropertiesRequest.fromJson(
-          _json['updateDimensionProperties']);
+          _json['updateDimensionProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateEmbeddedObjectPosition')) {
       updateEmbeddedObjectPosition =
           UpdateEmbeddedObjectPositionRequest.fromJson(
-              _json['updateEmbeddedObjectPosition']);
+              _json['updateEmbeddedObjectPosition']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateFilterView')) {
-      updateFilterView =
-          UpdateFilterViewRequest.fromJson(_json['updateFilterView']);
+      updateFilterView = UpdateFilterViewRequest.fromJson(
+          _json['updateFilterView'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateNamedRange')) {
-      updateNamedRange =
-          UpdateNamedRangeRequest.fromJson(_json['updateNamedRange']);
+      updateNamedRange = UpdateNamedRangeRequest.fromJson(
+          _json['updateNamedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateProtectedRange')) {
-      updateProtectedRange =
-          UpdateProtectedRangeRequest.fromJson(_json['updateProtectedRange']);
+      updateProtectedRange = UpdateProtectedRangeRequest.fromJson(
+          _json['updateProtectedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateSheetProperties')) {
-      updateSheetProperties =
-          UpdateSheetPropertiesRequest.fromJson(_json['updateSheetProperties']);
+      updateSheetProperties = UpdateSheetPropertiesRequest.fromJson(
+          _json['updateSheetProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateSlicerSpec')) {
-      updateSlicerSpec =
-          UpdateSlicerSpecRequest.fromJson(_json['updateSlicerSpec']);
+      updateSlicerSpec = UpdateSlicerSpecRequest.fromJson(
+          _json['updateSlicerSpec'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateSpreadsheetProperties')) {
       updateSpreadsheetProperties = UpdateSpreadsheetPropertiesRequest.fromJson(
-          _json['updateSpreadsheetProperties']);
+          _json['updateSpreadsheetProperties']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11183,89 +11524,105 @@
 
   Response.fromJson(core.Map _json) {
     if (_json.containsKey('addBanding')) {
-      addBanding = AddBandingResponse.fromJson(_json['addBanding']);
+      addBanding = AddBandingResponse.fromJson(
+          _json['addBanding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addChart')) {
-      addChart = AddChartResponse.fromJson(_json['addChart']);
+      addChart = AddChartResponse.fromJson(
+          _json['addChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addDataSource')) {
-      addDataSource = AddDataSourceResponse.fromJson(_json['addDataSource']);
+      addDataSource = AddDataSourceResponse.fromJson(
+          _json['addDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addDimensionGroup')) {
-      addDimensionGroup =
-          AddDimensionGroupResponse.fromJson(_json['addDimensionGroup']);
+      addDimensionGroup = AddDimensionGroupResponse.fromJson(
+          _json['addDimensionGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addFilterView')) {
-      addFilterView = AddFilterViewResponse.fromJson(_json['addFilterView']);
+      addFilterView = AddFilterViewResponse.fromJson(
+          _json['addFilterView'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addNamedRange')) {
-      addNamedRange = AddNamedRangeResponse.fromJson(_json['addNamedRange']);
+      addNamedRange = AddNamedRangeResponse.fromJson(
+          _json['addNamedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addProtectedRange')) {
-      addProtectedRange =
-          AddProtectedRangeResponse.fromJson(_json['addProtectedRange']);
+      addProtectedRange = AddProtectedRangeResponse.fromJson(
+          _json['addProtectedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addSheet')) {
-      addSheet = AddSheetResponse.fromJson(_json['addSheet']);
+      addSheet = AddSheetResponse.fromJson(
+          _json['addSheet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('addSlicer')) {
-      addSlicer = AddSlicerResponse.fromJson(_json['addSlicer']);
+      addSlicer = AddSlicerResponse.fromJson(
+          _json['addSlicer'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createDeveloperMetadata')) {
       createDeveloperMetadata = CreateDeveloperMetadataResponse.fromJson(
-          _json['createDeveloperMetadata']);
+          _json['createDeveloperMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteConditionalFormatRule')) {
       deleteConditionalFormatRule =
           DeleteConditionalFormatRuleResponse.fromJson(
-              _json['deleteConditionalFormatRule']);
+              _json['deleteConditionalFormatRule']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDeveloperMetadata')) {
       deleteDeveloperMetadata = DeleteDeveloperMetadataResponse.fromJson(
-          _json['deleteDeveloperMetadata']);
+          _json['deleteDeveloperMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDimensionGroup')) {
-      deleteDimensionGroup =
-          DeleteDimensionGroupResponse.fromJson(_json['deleteDimensionGroup']);
+      deleteDimensionGroup = DeleteDimensionGroupResponse.fromJson(
+          _json['deleteDimensionGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteDuplicates')) {
-      deleteDuplicates =
-          DeleteDuplicatesResponse.fromJson(_json['deleteDuplicates']);
+      deleteDuplicates = DeleteDuplicatesResponse.fromJson(
+          _json['deleteDuplicates'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duplicateFilterView')) {
-      duplicateFilterView =
-          DuplicateFilterViewResponse.fromJson(_json['duplicateFilterView']);
+      duplicateFilterView = DuplicateFilterViewResponse.fromJson(
+          _json['duplicateFilterView'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duplicateSheet')) {
-      duplicateSheet = DuplicateSheetResponse.fromJson(_json['duplicateSheet']);
+      duplicateSheet = DuplicateSheetResponse.fromJson(
+          _json['duplicateSheet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('findReplace')) {
-      findReplace = FindReplaceResponse.fromJson(_json['findReplace']);
+      findReplace = FindReplaceResponse.fromJson(
+          _json['findReplace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('refreshDataSource')) {
-      refreshDataSource =
-          RefreshDataSourceResponse.fromJson(_json['refreshDataSource']);
+      refreshDataSource = RefreshDataSourceResponse.fromJson(
+          _json['refreshDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trimWhitespace')) {
-      trimWhitespace = TrimWhitespaceResponse.fromJson(_json['trimWhitespace']);
+      trimWhitespace = TrimWhitespaceResponse.fromJson(
+          _json['trimWhitespace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateConditionalFormatRule')) {
       updateConditionalFormatRule =
           UpdateConditionalFormatRuleResponse.fromJson(
-              _json['updateConditionalFormatRule']);
+              _json['updateConditionalFormatRule']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateDataSource')) {
-      updateDataSource =
-          UpdateDataSourceResponse.fromJson(_json['updateDataSource']);
+      updateDataSource = UpdateDataSourceResponse.fromJson(
+          _json['updateDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateDeveloperMetadata')) {
       updateDeveloperMetadata = UpdateDeveloperMetadataResponse.fromJson(
-          _json['updateDeveloperMetadata']);
+          _json['updateDeveloperMetadata']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateEmbeddedObjectPosition')) {
       updateEmbeddedObjectPosition =
           UpdateEmbeddedObjectPositionResponse.fromJson(
-              _json['updateEmbeddedObjectPosition']);
+              _json['updateEmbeddedObjectPosition']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11357,7 +11714,8 @@
   RowData.fromJson(core.Map _json) {
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
-          .map<CellData>((value) => CellData.fromJson(value))
+          .map<CellData>((value) =>
+              CellData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11431,21 +11789,24 @@
       aggregateType = _json['aggregateType'] as core.String;
     }
     if (_json.containsKey('baselineValueData')) {
-      baselineValueData = ChartData.fromJson(_json['baselineValueData']);
+      baselineValueData = ChartData.fromJson(
+          _json['baselineValueData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('baselineValueFormat')) {
-      baselineValueFormat =
-          BaselineValueFormat.fromJson(_json['baselineValueFormat']);
+      baselineValueFormat = BaselineValueFormat.fromJson(
+          _json['baselineValueFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customFormatOptions')) {
-      customFormatOptions =
-          ChartCustomNumberFormatOptions.fromJson(_json['customFormatOptions']);
+      customFormatOptions = ChartCustomNumberFormatOptions.fromJson(
+          _json['customFormatOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keyValueData')) {
-      keyValueData = ChartData.fromJson(_json['keyValueData']);
+      keyValueData = ChartData.fromJson(
+          _json['keyValueData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('keyValueFormat')) {
-      keyValueFormat = KeyValueFormat.fromJson(_json['keyValueFormat']);
+      keyValueFormat = KeyValueFormat.fromJson(
+          _json['keyValueFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('numberFormatSource')) {
       numberFormatSource = _json['numberFormatSource'] as core.String;
@@ -11498,7 +11859,8 @@
   SearchDeveloperMetadataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilters')) {
       dataFilters = (_json['dataFilters'] as core.List)
-          .map<DataFilter>((value) => DataFilter.fromJson(value))
+          .map<DataFilter>((value) =>
+              DataFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11524,8 +11886,9 @@
     if (_json.containsKey('matchedDeveloperMetadata')) {
       matchedDeveloperMetadata =
           (_json['matchedDeveloperMetadata'] as core.List)
-              .map<MatchedDeveloperMetadata>(
-                  (value) => MatchedDeveloperMetadata.fromJson(value))
+              .map<MatchedDeveloperMetadata>((value) =>
+                  MatchedDeveloperMetadata.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -11549,7 +11912,8 @@
 
   SetBasicFilterRequest.fromJson(core.Map _json) {
     if (_json.containsKey('filter')) {
-      filter = BasicFilter.fromJson(_json['filter']);
+      filter = BasicFilter.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11576,10 +11940,12 @@
 
   SetDataValidationRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rule')) {
-      rule = DataValidationRule.fromJson(_json['rule']);
+      rule = DataValidationRule.fromJson(
+          _json['rule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11650,64 +12016,76 @@
   Sheet.fromJson(core.Map _json) {
     if (_json.containsKey('bandedRanges')) {
       bandedRanges = (_json['bandedRanges'] as core.List)
-          .map<BandedRange>((value) => BandedRange.fromJson(value))
+          .map<BandedRange>((value) => BandedRange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('basicFilter')) {
-      basicFilter = BasicFilter.fromJson(_json['basicFilter']);
+      basicFilter = BasicFilter.fromJson(
+          _json['basicFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('charts')) {
       charts = (_json['charts'] as core.List)
-          .map<EmbeddedChart>((value) => EmbeddedChart.fromJson(value))
+          .map<EmbeddedChart>((value) => EmbeddedChart.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('columnGroups')) {
       columnGroups = (_json['columnGroups'] as core.List)
-          .map<DimensionGroup>((value) => DimensionGroup.fromJson(value))
+          .map<DimensionGroup>((value) => DimensionGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('conditionalFormats')) {
       conditionalFormats = (_json['conditionalFormats'] as core.List)
-          .map<ConditionalFormatRule>(
-              (value) => ConditionalFormatRule.fromJson(value))
+          .map<ConditionalFormatRule>((value) => ConditionalFormatRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('data')) {
       data = (_json['data'] as core.List)
-          .map<GridData>((value) => GridData.fromJson(value))
+          .map<GridData>((value) =>
+              GridData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('developerMetadata')) {
       developerMetadata = (_json['developerMetadata'] as core.List)
-          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(value))
+          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('filterViews')) {
       filterViews = (_json['filterViews'] as core.List)
-          .map<FilterView>((value) => FilterView.fromJson(value))
+          .map<FilterView>((value) =>
+              FilterView.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('merges')) {
       merges = (_json['merges'] as core.List)
-          .map<GridRange>((value) => GridRange.fromJson(value))
+          .map<GridRange>((value) =>
+              GridRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('properties')) {
-      properties = SheetProperties.fromJson(_json['properties']);
+      properties = SheetProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('protectedRanges')) {
       protectedRanges = (_json['protectedRanges'] as core.List)
-          .map<ProtectedRange>((value) => ProtectedRange.fromJson(value))
+          .map<ProtectedRange>((value) => ProtectedRange.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rowGroups')) {
       rowGroups = (_json['rowGroups'] as core.List)
-          .map<DimensionGroup>((value) => DimensionGroup.fromJson(value))
+          .map<DimensionGroup>((value) => DimensionGroup.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('slicers')) {
       slicers = (_json['slicers'] as core.List)
-          .map<Slicer>((value) => Slicer.fromJson(value))
+          .map<Slicer>((value) =>
+              Slicer.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11823,10 +12201,12 @@
   SheetProperties.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceSheetProperties')) {
       dataSourceSheetProperties = DataSourceSheetProperties.fromJson(
-          _json['dataSourceSheetProperties']);
+          _json['dataSourceSheetProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gridProperties')) {
-      gridProperties = GridProperties.fromJson(_json['gridProperties']);
+      gridProperties = GridProperties.fromJson(
+          _json['gridProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hidden')) {
       hidden = _json['hidden'] as core.bool;
@@ -11844,10 +12224,12 @@
       sheetType = _json['sheetType'] as core.String;
     }
     if (_json.containsKey('tabColor')) {
-      tabColor = Color.fromJson(_json['tabColor']);
+      tabColor = Color.fromJson(
+          _json['tabColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tabColorStyle')) {
-      tabColorStyle = ColorStyle.fromJson(_json['tabColorStyle']);
+      tabColorStyle = ColorStyle.fromJson(
+          _json['tabColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -11907,13 +12289,15 @@
 
   Slicer.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = EmbeddedObjectPosition.fromJson(_json['position']);
+      position = EmbeddedObjectPosition.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('slicerId')) {
       slicerId = _json['slicerId'] as core.int;
     }
     if (_json.containsKey('spec')) {
-      spec = SlicerSpec.fromJson(_json['spec']);
+      spec = SlicerSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11977,25 +12361,30 @@
       applyToPivotTables = _json['applyToPivotTables'] as core.bool;
     }
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = Color.fromJson(_json['backgroundColor']);
+      backgroundColor = Color.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundColorStyle')) {
-      backgroundColorStyle = ColorStyle.fromJson(_json['backgroundColorStyle']);
+      backgroundColorStyle = ColorStyle.fromJson(
+          _json['backgroundColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('columnIndex')) {
       columnIndex = _json['columnIndex'] as core.int;
     }
     if (_json.containsKey('dataRange')) {
-      dataRange = GridRange.fromJson(_json['dataRange']);
+      dataRange = GridRange.fromJson(
+          _json['dataRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filterCriteria')) {
-      filterCriteria = FilterCriteria.fromJson(_json['filterCriteria']);
+      filterCriteria = FilterCriteria.fromJson(
+          _json['filterCriteria'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('horizontalAlignment')) {
       horizontalAlignment = _json['horizontalAlignment'] as core.String;
     }
     if (_json.containsKey('textFormat')) {
-      textFormat = TextFormat.fromJson(_json['textFormat']);
+      textFormat = TextFormat.fromJson(
+          _json['textFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -12048,11 +12437,13 @@
 
   SortRangeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortSpecs')) {
       sortSpecs = (_json['sortSpecs'] as core.List)
-          .map<SortSpec>((value) => SortSpec.fromJson(value))
+          .map<SortSpec>((value) =>
+              SortSpec.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12108,23 +12499,28 @@
 
   SortSpec.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = Color.fromJson(_json['backgroundColor']);
+      backgroundColor = Color.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('backgroundColorStyle')) {
-      backgroundColorStyle = ColorStyle.fromJson(_json['backgroundColorStyle']);
+      backgroundColorStyle = ColorStyle.fromJson(
+          _json['backgroundColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSourceColumnReference')) {
       dataSourceColumnReference = DataSourceColumnReference.fromJson(
-          _json['dataSourceColumnReference']);
+          _json['dataSourceColumnReference']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dimensionIndex')) {
       dimensionIndex = _json['dimensionIndex'] as core.int;
     }
     if (_json.containsKey('foregroundColor')) {
-      foregroundColor = Color.fromJson(_json['foregroundColor']);
+      foregroundColor = Color.fromJson(
+          _json['foregroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('foregroundColorStyle')) {
-      foregroundColorStyle = ColorStyle.fromJson(_json['foregroundColorStyle']);
+      foregroundColorStyle = ColorStyle.fromJson(
+          _json['foregroundColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sortOrder')) {
       sortOrder = _json['sortOrder'] as core.String;
@@ -12185,7 +12581,8 @@
       fillLength = _json['fillLength'] as core.int;
     }
     if (_json.containsKey('source')) {
-      source = GridRange.fromJson(_json['source']);
+      source = GridRange.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12235,31 +12632,37 @@
   Spreadsheet.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceSchedules')) {
       dataSourceSchedules = (_json['dataSourceSchedules'] as core.List)
-          .map<DataSourceRefreshSchedule>(
-              (value) => DataSourceRefreshSchedule.fromJson(value))
+          .map<DataSourceRefreshSchedule>((value) =>
+              DataSourceRefreshSchedule.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dataSources')) {
       dataSources = (_json['dataSources'] as core.List)
-          .map<DataSource>((value) => DataSource.fromJson(value))
+          .map<DataSource>((value) =>
+              DataSource.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('developerMetadata')) {
       developerMetadata = (_json['developerMetadata'] as core.List)
-          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(value))
+          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('namedRanges')) {
       namedRanges = (_json['namedRanges'] as core.List)
-          .map<NamedRange>((value) => NamedRange.fromJson(value))
+          .map<NamedRange>((value) =>
+              NamedRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('properties')) {
-      properties = SpreadsheetProperties.fromJson(_json['properties']);
+      properties = SpreadsheetProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sheets')) {
       sheets = (_json['sheets'] as core.List)
-          .map<Sheet>((value) => Sheet.fromJson(value))
+          .map<Sheet>((value) =>
+              Sheet.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('spreadsheetId')) {
@@ -12351,17 +12754,20 @@
       autoRecalc = _json['autoRecalc'] as core.String;
     }
     if (_json.containsKey('defaultFormat')) {
-      defaultFormat = CellFormat.fromJson(_json['defaultFormat']);
+      defaultFormat = CellFormat.fromJson(
+          _json['defaultFormat'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iterativeCalculationSettings')) {
       iterativeCalculationSettings = IterativeCalculationSettings.fromJson(
-          _json['iterativeCalculationSettings']);
+          _json['iterativeCalculationSettings']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locale')) {
       locale = _json['locale'] as core.String;
     }
     if (_json.containsKey('spreadsheetTheme')) {
-      spreadsheetTheme = SpreadsheetTheme.fromJson(_json['spreadsheetTheme']);
+      spreadsheetTheme = SpreadsheetTheme.fromJson(
+          _json['spreadsheetTheme'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeZone')) {
       timeZone = _json['timeZone'] as core.String;
@@ -12416,7 +12822,8 @@
     }
     if (_json.containsKey('themeColors')) {
       themeColors = (_json['themeColors'] as core.List)
-          .map<ThemeColorPair>((value) => ThemeColorPair.fromJson(value))
+          .map<ThemeColorPair>((value) => ThemeColorPair.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12475,10 +12882,12 @@
       fontSize = _json['fontSize'] as core.int;
     }
     if (_json.containsKey('foregroundColor')) {
-      foregroundColor = Color.fromJson(_json['foregroundColor']);
+      foregroundColor = Color.fromJson(
+          _json['foregroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('foregroundColorStyle')) {
-      foregroundColorStyle = ColorStyle.fromJson(_json['foregroundColorStyle']);
+      foregroundColorStyle = ColorStyle.fromJson(
+          _json['foregroundColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('italic')) {
       italic = _json['italic'] as core.bool;
@@ -12534,7 +12943,8 @@
 
   TextFormatRun.fromJson(core.Map _json) {
     if (_json.containsKey('format')) {
-      format = TextFormat.fromJson(_json['format']);
+      format = TextFormat.fromJson(
+          _json['format'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startIndex')) {
       startIndex = _json['startIndex'] as core.int;
@@ -12649,7 +13059,8 @@
       delimiterType = _json['delimiterType'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = GridRange.fromJson(_json['source']);
+      source = GridRange.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12692,7 +13103,8 @@
 
   ThemeColorPair.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = ColorStyle.fromJson(_json['color']);
+      color = ColorStyle.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorType')) {
       colorType = _json['colorType'] as core.String;
@@ -12806,28 +13218,36 @@
 
   TreemapChartColorScale.fromJson(core.Map _json) {
     if (_json.containsKey('maxValueColor')) {
-      maxValueColor = Color.fromJson(_json['maxValueColor']);
+      maxValueColor = Color.fromJson(
+          _json['maxValueColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxValueColorStyle')) {
-      maxValueColorStyle = ColorStyle.fromJson(_json['maxValueColorStyle']);
+      maxValueColorStyle = ColorStyle.fromJson(
+          _json['maxValueColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('midValueColor')) {
-      midValueColor = Color.fromJson(_json['midValueColor']);
+      midValueColor = Color.fromJson(
+          _json['midValueColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('midValueColorStyle')) {
-      midValueColorStyle = ColorStyle.fromJson(_json['midValueColorStyle']);
+      midValueColorStyle = ColorStyle.fromJson(
+          _json['midValueColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minValueColor')) {
-      minValueColor = Color.fromJson(_json['minValueColor']);
+      minValueColor = Color.fromJson(
+          _json['minValueColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minValueColorStyle')) {
-      minValueColorStyle = ColorStyle.fromJson(_json['minValueColorStyle']);
+      minValueColorStyle = ColorStyle.fromJson(
+          _json['minValueColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('noDataColor')) {
-      noDataColor = Color.fromJson(_json['noDataColor']);
+      noDataColor = Color.fromJson(
+          _json['noDataColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('noDataColorStyle')) {
-      noDataColorStyle = ColorStyle.fromJson(_json['noDataColorStyle']);
+      noDataColorStyle = ColorStyle.fromJson(
+          _json['noDataColorStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12933,16 +13353,20 @@
 
   TreemapChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('colorData')) {
-      colorData = ChartData.fromJson(_json['colorData']);
+      colorData = ChartData.fromJson(
+          _json['colorData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorScale')) {
-      colorScale = TreemapChartColorScale.fromJson(_json['colorScale']);
+      colorScale = TreemapChartColorScale.fromJson(
+          _json['colorScale'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headerColor')) {
-      headerColor = Color.fromJson(_json['headerColor']);
+      headerColor = Color.fromJson(
+          _json['headerColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headerColorStyle')) {
-      headerColorStyle = ColorStyle.fromJson(_json['headerColorStyle']);
+      headerColorStyle = ColorStyle.fromJson(
+          _json['headerColorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hideTooltips')) {
       hideTooltips = _json['hideTooltips'] as core.bool;
@@ -12951,7 +13375,8 @@
       hintedLevels = _json['hintedLevels'] as core.int;
     }
     if (_json.containsKey('labels')) {
-      labels = ChartData.fromJson(_json['labels']);
+      labels = ChartData.fromJson(
+          _json['labels'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('levels')) {
       levels = _json['levels'] as core.int;
@@ -12963,13 +13388,16 @@
       minValue = (_json['minValue'] as core.num).toDouble();
     }
     if (_json.containsKey('parentLabels')) {
-      parentLabels = ChartData.fromJson(_json['parentLabels']);
+      parentLabels = ChartData.fromJson(
+          _json['parentLabels'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sizeData')) {
-      sizeData = ChartData.fromJson(_json['sizeData']);
+      sizeData = ChartData.fromJson(
+          _json['sizeData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textFormat')) {
-      textFormat = TextFormat.fromJson(_json['textFormat']);
+      textFormat = TextFormat.fromJson(
+          _json['textFormat'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13032,7 +13460,8 @@
 
   TrimWhitespaceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13078,7 +13507,8 @@
 
   UnmergeCellsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13105,7 +13535,8 @@
 
   UpdateBandingRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bandedRange')) {
-      bandedRange = BandedRange.fromJson(_json['bandedRange']);
+      bandedRange = BandedRange.fromJson(
+          _json['bandedRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
@@ -13156,25 +13587,32 @@
 
   UpdateBordersRequest.fromJson(core.Map _json) {
     if (_json.containsKey('bottom')) {
-      bottom = Border.fromJson(_json['bottom']);
+      bottom = Border.fromJson(
+          _json['bottom'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('innerHorizontal')) {
-      innerHorizontal = Border.fromJson(_json['innerHorizontal']);
+      innerHorizontal = Border.fromJson(
+          _json['innerHorizontal'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('innerVertical')) {
-      innerVertical = Border.fromJson(_json['innerVertical']);
+      innerVertical = Border.fromJson(
+          _json['innerVertical'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('left')) {
-      left = Border.fromJson(_json['left']);
+      left =
+          Border.fromJson(_json['left'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('right')) {
-      right = Border.fromJson(_json['right']);
+      right = Border.fromJson(
+          _json['right'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('top')) {
-      top = Border.fromJson(_json['top']);
+      top =
+          Border.fromJson(_json['top'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13231,15 +13669,18 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('range')) {
-      range = GridRange.fromJson(_json['range']);
+      range = GridRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<RowData>((value) => RowData.fromJson(value))
+          .map<RowData>((value) =>
+              RowData.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('start')) {
-      start = GridCoordinate.fromJson(_json['start']);
+      start = GridCoordinate.fromJson(
+          _json['start'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13277,7 +13718,8 @@
       chartId = _json['chartId'] as core.int;
     }
     if (_json.containsKey('spec')) {
-      spec = ChartSpec.fromJson(_json['spec']);
+      spec = ChartSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13319,7 +13761,8 @@
       newIndex = _json['newIndex'] as core.int;
     }
     if (_json.containsKey('rule')) {
-      rule = ConditionalFormatRule.fromJson(_json['rule']);
+      rule = ConditionalFormatRule.fromJson(
+          _json['rule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sheetId')) {
       sheetId = _json['sheetId'] as core.int;
@@ -13368,13 +13811,15 @@
       newIndex = _json['newIndex'] as core.int;
     }
     if (_json.containsKey('newRule')) {
-      newRule = ConditionalFormatRule.fromJson(_json['newRule']);
+      newRule = ConditionalFormatRule.fromJson(
+          _json['newRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('oldIndex')) {
       oldIndex = _json['oldIndex'] as core.int;
     }
     if (_json.containsKey('oldRule')) {
-      oldRule = ConditionalFormatRule.fromJson(_json['oldRule']);
+      oldRule = ConditionalFormatRule.fromJson(
+          _json['oldRule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13413,7 +13858,8 @@
 
   UpdateDataSourceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataSource')) {
-      dataSource = DataSource.fromJson(_json['dataSource']);
+      dataSource = DataSource.fromJson(
+          _json['dataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
@@ -13444,11 +13890,12 @@
 
   UpdateDataSourceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dataExecutionStatus')) {
-      dataExecutionStatus =
-          DataExecutionStatus.fromJson(_json['dataExecutionStatus']);
+      dataExecutionStatus = DataExecutionStatus.fromJson(
+          _json['dataExecutionStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('dataSource')) {
-      dataSource = DataSource.fromJson(_json['dataSource']);
+      dataSource = DataSource.fromJson(
+          _json['dataSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13487,12 +13934,13 @@
   UpdateDeveloperMetadataRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilters')) {
       dataFilters = (_json['dataFilters'] as core.List)
-          .map<DataFilter>((value) => DataFilter.fromJson(value))
+          .map<DataFilter>((value) =>
+              DataFilter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('developerMetadata')) {
-      developerMetadata =
-          DeveloperMetadata.fromJson(_json['developerMetadata']);
+      developerMetadata = DeveloperMetadata.fromJson(
+          _json['developerMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
@@ -13525,7 +13973,8 @@
   UpdateDeveloperMetadataResponse.fromJson(core.Map _json) {
     if (_json.containsKey('developerMetadata')) {
       developerMetadata = (_json['developerMetadata'] as core.List)
-          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(value))
+          .map<DeveloperMetadata>((value) => DeveloperMetadata.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13555,7 +14004,8 @@
 
   UpdateDimensionGroupRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dimensionGroup')) {
-      dimensionGroup = DimensionGroup.fromJson(_json['dimensionGroup']);
+      dimensionGroup = DimensionGroup.fromJson(
+          _json['dimensionGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
@@ -13594,17 +14044,19 @@
 
   UpdateDimensionPropertiesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('dataSourceSheetRange')) {
-      dataSourceSheetRange =
-          DataSourceSheetDimensionRange.fromJson(_json['dataSourceSheetRange']);
+      dataSourceSheetRange = DataSourceSheetDimensionRange.fromJson(
+          _json['dataSourceSheetRange'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = DimensionProperties.fromJson(_json['properties']);
+      properties = DimensionProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('range')) {
-      range = DimensionRange.fromJson(_json['range']);
+      range = DimensionRange.fromJson(
+          _json['range'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13652,7 +14104,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('newPosition')) {
-      newPosition = EmbeddedObjectPosition.fromJson(_json['newPosition']);
+      newPosition = EmbeddedObjectPosition.fromJson(
+          _json['newPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.int;
@@ -13683,7 +14136,8 @@
 
   UpdateEmbeddedObjectPositionResponse.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = EmbeddedObjectPosition.fromJson(_json['position']);
+      position = EmbeddedObjectPosition.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13713,7 +14167,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('filter')) {
-      filter = FilterView.fromJson(_json['filter']);
+      filter = FilterView.fromJson(
+          _json['filter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13746,7 +14201,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('namedRange')) {
-      namedRange = NamedRange.fromJson(_json['namedRange']);
+      namedRange = NamedRange.fromJson(
+          _json['namedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13779,7 +14235,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('protectedRange')) {
-      protectedRange = ProtectedRange.fromJson(_json['protectedRange']);
+      protectedRange = ProtectedRange.fromJson(
+          _json['protectedRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13812,7 +14269,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = SheetProperties.fromJson(_json['properties']);
+      properties = SheetProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13852,7 +14310,8 @@
       slicerId = _json['slicerId'] as core.int;
     }
     if (_json.containsKey('spec')) {
-      spec = SlicerSpec.fromJson(_json['spec']);
+      spec = SlicerSpec.fromJson(
+          _json['spec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13888,7 +14347,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('properties')) {
-      properties = SpreadsheetProperties.fromJson(_json['properties']);
+      properties = SpreadsheetProperties.fromJson(
+          _json['properties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13931,7 +14391,8 @@
 
   UpdateValuesByDataFilterResponse.fromJson(core.Map _json) {
     if (_json.containsKey('dataFilter')) {
-      dataFilter = DataFilter.fromJson(_json['dataFilter']);
+      dataFilter = DataFilter.fromJson(
+          _json['dataFilter'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updatedCells')) {
       updatedCells = _json['updatedCells'] as core.int;
@@ -13940,7 +14401,8 @@
       updatedColumns = _json['updatedColumns'] as core.int;
     }
     if (_json.containsKey('updatedData')) {
-      updatedData = ValueRange.fromJson(_json['updatedData']);
+      updatedData = ValueRange.fromJson(
+          _json['updatedData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updatedRange')) {
       updatedRange = _json['updatedRange'] as core.String;
@@ -14008,7 +14470,8 @@
       updatedColumns = _json['updatedColumns'] as core.int;
     }
     if (_json.containsKey('updatedData')) {
-      updatedData = ValueRange.fromJson(_json['updatedData']);
+      updatedData = ValueRange.fromJson(
+          _json['updatedData'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updatedRange')) {
       updatedRange = _json['updatedRange'] as core.String;
@@ -14125,10 +14588,12 @@
 
   WaterfallChartColumnStyle.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('colorStyle')) {
-      colorStyle = ColorStyle.fromJson(_json['colorStyle']);
+      colorStyle = ColorStyle.fromJson(
+          _json['colorStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('label')) {
       label = _json['label'] as core.String;
@@ -14210,7 +14675,8 @@
 
   WaterfallChartDomain.fromJson(core.Map _json) {
     if (_json.containsKey('data')) {
-      data = ChartData.fromJson(_json['data']);
+      data = ChartData.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reversed')) {
       reversed = _json['reversed'] as core.bool;
@@ -14258,27 +14724,29 @@
   WaterfallChartSeries.fromJson(core.Map _json) {
     if (_json.containsKey('customSubtotals')) {
       customSubtotals = (_json['customSubtotals'] as core.List)
-          .map<WaterfallChartCustomSubtotal>(
-              (value) => WaterfallChartCustomSubtotal.fromJson(value))
+          .map<WaterfallChartCustomSubtotal>((value) =>
+              WaterfallChartCustomSubtotal.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('data')) {
-      data = ChartData.fromJson(_json['data']);
+      data = ChartData.fromJson(
+          _json['data'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hideTrailingSubtotal')) {
       hideTrailingSubtotal = _json['hideTrailingSubtotal'] as core.bool;
     }
     if (_json.containsKey('negativeColumnsStyle')) {
-      negativeColumnsStyle =
-          WaterfallChartColumnStyle.fromJson(_json['negativeColumnsStyle']);
+      negativeColumnsStyle = WaterfallChartColumnStyle.fromJson(
+          _json['negativeColumnsStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('positiveColumnsStyle')) {
-      positiveColumnsStyle =
-          WaterfallChartColumnStyle.fromJson(_json['positiveColumnsStyle']);
+      positiveColumnsStyle = WaterfallChartColumnStyle.fromJson(
+          _json['positiveColumnsStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subtotalColumnsStyle')) {
-      subtotalColumnsStyle =
-          WaterfallChartColumnStyle.fromJson(_json['subtotalColumnsStyle']);
+      subtotalColumnsStyle = WaterfallChartColumnStyle.fromJson(
+          _json['subtotalColumnsStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14336,10 +14804,12 @@
 
   WaterfallChartSpec.fromJson(core.Map _json) {
     if (_json.containsKey('connectorLineStyle')) {
-      connectorLineStyle = LineStyle.fromJson(_json['connectorLineStyle']);
+      connectorLineStyle = LineStyle.fromJson(
+          _json['connectorLineStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('domain')) {
-      domain = WaterfallChartDomain.fromJson(_json['domain']);
+      domain = WaterfallChartDomain.fromJson(
+          _json['domain'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('firstValueIsTotal')) {
       firstValueIsTotal = _json['firstValueIsTotal'] as core.bool;
@@ -14349,8 +14819,8 @@
     }
     if (_json.containsKey('series')) {
       series = (_json['series'] as core.List)
-          .map<WaterfallChartSeries>(
-              (value) => WaterfallChartSeries.fromJson(value))
+          .map<WaterfallChartSeries>((value) => WaterfallChartSeries.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('stackedType')) {
diff --git a/generated/googleapis/lib/siteverification/v1.dart b/generated/googleapis/lib/siteverification/v1.dart
index a013a83..99a72a3 100644
--- a/generated/googleapis/lib/siteverification/v1.dart
+++ b/generated/googleapis/lib/siteverification/v1.dart
@@ -101,7 +101,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Get the most current data for a website or domain.
@@ -149,8 +151,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SiteVerificationWebResourceResource.fromJson(data));
+    return _response.then(
+      (data) => SiteVerificationWebResourceResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get a verification token for placing on a website or domain.
@@ -199,7 +203,9 @@
       downloadOptions: _downloadOptions,
     );
     return _response.then(
-        (data) => SiteVerificationWebResourceGettokenResponse.fromJson(data));
+      (data) => SiteVerificationWebResourceGettokenResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Attempt verification of a website or domain.
@@ -254,8 +260,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SiteVerificationWebResourceResource.fromJson(data));
+    return _response.then(
+      (data) => SiteVerificationWebResourceResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Get the list of your verified websites and domains.
@@ -297,8 +305,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SiteVerificationWebResourceListResponse.fromJson(data));
+    return _response.then(
+      (data) => SiteVerificationWebResourceListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modify the list of owners for your website or domain. This method supports
@@ -353,8 +363,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SiteVerificationWebResourceResource.fromJson(data));
+    return _response.then(
+      (data) => SiteVerificationWebResourceResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modify the list of owners for your website or domain.
@@ -408,8 +420,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SiteVerificationWebResourceResource.fromJson(data));
+    return _response.then(
+      (data) => SiteVerificationWebResourceResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -459,7 +473,7 @@
   SiteVerificationWebResourceGettokenRequest.fromJson(core.Map _json) {
     if (_json.containsKey('site')) {
       site = SiteVerificationWebResourceGettokenRequestSite.fromJson(
-          _json['site']);
+          _json['site'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('verificationMethod')) {
       verificationMethod = _json['verificationMethod'] as core.String;
@@ -522,8 +536,9 @@
   SiteVerificationWebResourceListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SiteVerificationWebResourceResource>(
-              (value) => SiteVerificationWebResourceResource.fromJson(value))
+          .map<SiteVerificationWebResourceResource>((value) =>
+              SiteVerificationWebResourceResource.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -592,7 +607,8 @@
           .toList();
     }
     if (_json.containsKey('site')) {
-      site = SiteVerificationWebResourceResourceSite.fromJson(_json['site']);
+      site = SiteVerificationWebResourceResourceSite.fromJson(
+          _json['site'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/slides/v1.dart b/generated/googleapis/lib/slides/v1.dart
index 718e577..b415f09 100644
--- a/generated/googleapis/lib/slides/v1.dart
+++ b/generated/googleapis/lib/slides/v1.dart
@@ -145,8 +145,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => BatchUpdatePresentationResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchUpdatePresentationResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a blank presentation using the title given in the request. If a
@@ -198,7 +200,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Presentation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Presentation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest version of the specified presentation.
@@ -248,7 +253,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Presentation.fromJson(data));
+    return _response.then(
+      (data) =>
+          Presentation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -312,7 +320,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Page.fromJson(data));
+    return _response.then(
+      (data) => Page.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Generates a thumbnail of the latest version of the specified page in the
@@ -400,7 +410,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Thumbnail.fromJson(data));
+    return _response.then(
+      (data) => Thumbnail.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -513,7 +525,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('style')) {
-      style = TextStyle.fromJson(_json['style']);
+      style = TextStyle.fromJson(
+          _json['style'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -548,11 +561,13 @@
   BatchUpdatePresentationRequest.fromJson(core.Map _json) {
     if (_json.containsKey('requests')) {
       requests = (_json['requests'] as core.List)
-          .map<Request>((value) => Request.fromJson(value))
+          .map<Request>((value) =>
+              Request.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('writeControl')) {
-      writeControl = WriteControl.fromJson(_json['writeControl']);
+      writeControl = WriteControl.fromJson(
+          _json['writeControl'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -588,11 +603,13 @@
     }
     if (_json.containsKey('replies')) {
       replies = (_json['replies'] as core.List)
-          .map<Response>((value) => Response.fromJson(value))
+          .map<Response>((value) =>
+              Response.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('writeControl')) {
-      writeControl = WriteControl.fromJson(_json['writeControl']);
+      writeControl = WriteControl.fromJson(
+          _json['writeControl'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -629,7 +646,8 @@
 
   Bullet.fromJson(core.Map _json) {
     if (_json.containsKey('bulletStyle')) {
-      bulletStyle = TextStyle.fromJson(_json['bulletStyle']);
+      bulletStyle = TextStyle.fromJson(
+          _json['bulletStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('glyph')) {
       glyph = _json['glyph'] as core.String;
@@ -670,7 +688,8 @@
   ColorScheme.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
       colors = (_json['colors'] as core.List)
-          .map<ThemeColorPair>((value) => ThemeColorPair.fromJson(value))
+          .map<ThemeColorPair>((value) => ThemeColorPair.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -704,7 +723,8 @@
       alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('color')) {
-      color = OpaqueColor.fromJson(_json['color']);
+      color = OpaqueColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('position')) {
       position = (_json['position'] as core.num).toDouble();
@@ -758,8 +778,8 @@
 
   CreateImageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('elementProperties')) {
-      elementProperties =
-          PageElementProperties.fromJson(_json['elementProperties']);
+      elementProperties = PageElementProperties.fromJson(
+          _json['elementProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
@@ -852,8 +872,8 @@
       category = _json['category'] as core.String;
     }
     if (_json.containsKey('elementProperties')) {
-      elementProperties =
-          PageElementProperties.fromJson(_json['elementProperties']);
+      elementProperties = PageElementProperties.fromJson(
+          _json['elementProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineCategory')) {
       lineCategory = _json['lineCategory'] as core.String;
@@ -973,13 +993,15 @@
       bulletPreset = _json['bulletPreset'] as core.String;
     }
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('textRange')) {
-      textRange = Range.fromJson(_json['textRange']);
+      textRange = Range.fromJson(
+          _json['textRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1284,8 +1306,8 @@
 
   CreateShapeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('elementProperties')) {
-      elementProperties =
-          PageElementProperties.fromJson(_json['elementProperties']);
+      elementProperties = PageElementProperties.fromJson(
+          _json['elementProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
@@ -1373,8 +1395,8 @@
       chartId = _json['chartId'] as core.int;
     }
     if (_json.containsKey('elementProperties')) {
-      elementProperties =
-          PageElementProperties.fromJson(_json['elementProperties']);
+      elementProperties = PageElementProperties.fromJson(
+          _json['elementProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linkingMode')) {
       linkingMode = _json['linkingMode'] as core.String;
@@ -1471,13 +1493,14 @@
     }
     if (_json.containsKey('placeholderIdMappings')) {
       placeholderIdMappings = (_json['placeholderIdMappings'] as core.List)
-          .map<LayoutPlaceholderIdMapping>(
-              (value) => LayoutPlaceholderIdMapping.fromJson(value))
+          .map<LayoutPlaceholderIdMapping>((value) =>
+              LayoutPlaceholderIdMapping.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('slideLayoutReference')) {
-      slideLayoutReference =
-          LayoutReference.fromJson(_json['slideLayoutReference']);
+      slideLayoutReference = LayoutReference.fromJson(
+          _json['slideLayoutReference'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1553,8 +1576,8 @@
       columns = _json['columns'] as core.int;
     }
     if (_json.containsKey('elementProperties')) {
-      elementProperties =
-          PageElementProperties.fromJson(_json['elementProperties']);
+      elementProperties = PageElementProperties.fromJson(
+          _json['elementProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
@@ -1643,8 +1666,8 @@
 
   CreateVideoRequest.fromJson(core.Map _json) {
     if (_json.containsKey('elementProperties')) {
-      elementProperties =
-          PageElementProperties.fromJson(_json['elementProperties']);
+      elementProperties = PageElementProperties.fromJson(
+          _json['elementProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -1821,13 +1844,15 @@
 
   DeleteParagraphBulletsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('textRange')) {
-      textRange = Range.fromJson(_json['textRange']);
+      textRange = Range.fromJson(
+          _json['textRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1861,7 +1886,8 @@
 
   DeleteTableColumnRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableObjectId')) {
       tableObjectId = _json['tableObjectId'] as core.String;
@@ -1895,7 +1921,8 @@
 
   DeleteTableRowRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableObjectId')) {
       tableObjectId = _json['tableObjectId'] as core.String;
@@ -1940,13 +1967,15 @@
 
   DeleteTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('textRange')) {
-      textRange = Range.fromJson(_json['textRange']);
+      textRange = Range.fromJson(
+          _json['textRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2035,7 +2064,8 @@
     }
     if (_json.containsKey('objectIds')) {
       objectIds = commons.mapMap<core.String, core.String>(
-          _json['objectIds'].cast<core.String, core.String>(),
+          (_json['objectIds'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
   }
@@ -2084,7 +2114,8 @@
   Group.fromJson(core.Map _json) {
     if (_json.containsKey('children')) {
       children = (_json['children'] as core.List)
-          .map<PageElement>((value) => PageElement.fromJson(value))
+          .map<PageElement>((value) => PageElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2185,7 +2216,8 @@
       contentUrl = _json['contentUrl'] as core.String;
     }
     if (_json.containsKey('imageProperties')) {
-      imageProperties = ImageProperties.fromJson(_json['imageProperties']);
+      imageProperties = ImageProperties.fromJson(
+          _json['imageProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceUrl')) {
       sourceUrl = _json['sourceUrl'] as core.String;
@@ -2250,19 +2282,24 @@
       contrast = (_json['contrast'] as core.num).toDouble();
     }
     if (_json.containsKey('cropProperties')) {
-      cropProperties = CropProperties.fromJson(_json['cropProperties']);
+      cropProperties = CropProperties.fromJson(
+          _json['cropProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outline')) {
-      outline = Outline.fromJson(_json['outline']);
+      outline = Outline.fromJson(
+          _json['outline'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recolor')) {
-      recolor = Recolor.fromJson(_json['recolor']);
+      recolor = Recolor.fromJson(
+          _json['recolor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shadow')) {
-      shadow = Shadow.fromJson(_json['shadow']);
+      shadow = Shadow.fromJson(
+          _json['shadow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transparency')) {
       transparency = (_json['transparency'] as core.num).toDouble();
@@ -2322,7 +2359,8 @@
 
   InsertTableColumnsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertRight')) {
       insertRight = _json['insertRight'] as core.bool;
@@ -2375,7 +2413,8 @@
 
   InsertTableRowsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertBelow')) {
       insertBelow = _json['insertBelow'] as core.bool;
@@ -2438,7 +2477,8 @@
 
   InsertTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertionIndex')) {
       insertionIndex = _json['insertionIndex'] as core.int;
@@ -2496,7 +2536,8 @@
 
   LayoutPlaceholderIdMapping.fromJson(core.Map _json) {
     if (_json.containsKey('layoutPlaceholder')) {
-      layoutPlaceholder = Placeholder.fromJson(_json['layoutPlaceholder']);
+      layoutPlaceholder = Placeholder.fromJson(
+          _json['layoutPlaceholder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('layoutPlaceholderObjectId')) {
       layoutPlaceholderObjectId =
@@ -2656,7 +2697,8 @@
       lineCategory = _json['lineCategory'] as core.String;
     }
     if (_json.containsKey('lineProperties')) {
-      lineProperties = LineProperties.fromJson(_json['lineProperties']);
+      lineProperties = LineProperties.fromJson(
+          _json['lineProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineType')) {
       lineType = _json['lineType'] as core.String;
@@ -2729,7 +2771,8 @@
 
   LineFill.fromJson(core.Map _json) {
     if (_json.containsKey('solidFill')) {
-      solidFill = SolidFill.fromJson(_json['solidFill']);
+      solidFill = SolidFill.fromJson(
+          _json['solidFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2830,22 +2873,27 @@
       endArrow = _json['endArrow'] as core.String;
     }
     if (_json.containsKey('endConnection')) {
-      endConnection = LineConnection.fromJson(_json['endConnection']);
+      endConnection = LineConnection.fromJson(
+          _json['endConnection'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineFill')) {
-      lineFill = LineFill.fromJson(_json['lineFill']);
+      lineFill = LineFill.fromJson(
+          _json['lineFill'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startArrow')) {
       startArrow = _json['startArrow'] as core.String;
     }
     if (_json.containsKey('startConnection')) {
-      startConnection = LineConnection.fromJson(_json['startConnection']);
+      startConnection = LineConnection.fromJson(
+          _json['startConnection'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('weight')) {
-      weight = Dimension.fromJson(_json['weight']);
+      weight = Dimension.fromJson(
+          _json['weight'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2957,8 +3005,10 @@
     }
     if (_json.containsKey('nestingLevel')) {
       nestingLevel = commons.mapMap<core.Map, NestingLevel>(
-          _json['nestingLevel'].cast<core.String, core.Map>(),
-          (core.Map item) => NestingLevel.fromJson(item));
+          (_json['nestingLevel'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => NestingLevel.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -3018,7 +3068,8 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('tableRange')) {
-      tableRange = TableRange.fromJson(_json['tableRange']);
+      tableRange = TableRange.fromJson(
+          _json['tableRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3044,7 +3095,8 @@
 
   NestingLevel.fromJson(core.Map _json) {
     if (_json.containsKey('bulletStyle')) {
-      bulletStyle = TextStyle.fromJson(_json['bulletStyle']);
+      bulletStyle = TextStyle.fromJson(
+          _json['bulletStyle'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3117,7 +3169,8 @@
 
   OpaqueColor.fromJson(core.Map _json) {
     if (_json.containsKey('rgbColor')) {
-      rgbColor = RgbColor.fromJson(_json['rgbColor']);
+      rgbColor = RgbColor.fromJson(
+          _json['rgbColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('themeColor')) {
       themeColor = _json['themeColor'] as core.String;
@@ -3146,7 +3199,8 @@
 
   OptionalColor.fromJson(core.Map _json) {
     if (_json.containsKey('opaqueColor')) {
-      opaqueColor = OpaqueColor.fromJson(_json['opaqueColor']);
+      opaqueColor = OpaqueColor.fromJson(
+          _json['opaqueColor'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3218,13 +3272,15 @@
       dashStyle = _json['dashStyle'] as core.String;
     }
     if (_json.containsKey('outlineFill')) {
-      outlineFill = OutlineFill.fromJson(_json['outlineFill']);
+      outlineFill = OutlineFill.fromJson(
+          _json['outlineFill'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('propertyState')) {
       propertyState = _json['propertyState'] as core.String;
     }
     if (_json.containsKey('weight')) {
-      weight = Dimension.fromJson(_json['weight']);
+      weight = Dimension.fromJson(
+          _json['weight'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3255,7 +3311,8 @@
 
   OutlineFill.fromJson(core.Map _json) {
     if (_json.containsKey('solidFill')) {
-      solidFill = SolidFill.fromJson(_json['solidFill']);
+      solidFill = SolidFill.fromJson(
+          _json['solidFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3318,24 +3375,29 @@
 
   Page.fromJson(core.Map _json) {
     if (_json.containsKey('layoutProperties')) {
-      layoutProperties = LayoutProperties.fromJson(_json['layoutProperties']);
+      layoutProperties = LayoutProperties.fromJson(
+          _json['layoutProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('masterProperties')) {
-      masterProperties = MasterProperties.fromJson(_json['masterProperties']);
+      masterProperties = MasterProperties.fromJson(
+          _json['masterProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('notesProperties')) {
-      notesProperties = NotesProperties.fromJson(_json['notesProperties']);
+      notesProperties = NotesProperties.fromJson(
+          _json['notesProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('pageElements')) {
       pageElements = (_json['pageElements'] as core.List)
-          .map<PageElement>((value) => PageElement.fromJson(value))
+          .map<PageElement>((value) => PageElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageProperties')) {
-      pageProperties = PageProperties.fromJson(_json['pageProperties']);
+      pageProperties = PageProperties.fromJson(
+          _json['pageProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageType')) {
       pageType = _json['pageType'] as core.String;
@@ -3344,7 +3406,8 @@
       revisionId = _json['revisionId'] as core.String;
     }
     if (_json.containsKey('slideProperties')) {
-      slideProperties = SlideProperties.fromJson(_json['slideProperties']);
+      slideProperties = SlideProperties.fromJson(
+          _json['slideProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3421,11 +3484,12 @@
       propertyState = _json['propertyState'] as core.String;
     }
     if (_json.containsKey('solidFill')) {
-      solidFill = SolidFill.fromJson(_json['solidFill']);
+      solidFill = SolidFill.fromJson(
+          _json['solidFill'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stretchedPictureFill')) {
-      stretchedPictureFill =
-          StretchedPictureFill.fromJson(_json['stretchedPictureFill']);
+      stretchedPictureFill = StretchedPictureFill.fromJson(
+          _json['stretchedPictureFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3502,40 +3566,50 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('elementGroup')) {
-      elementGroup = Group.fromJson(_json['elementGroup']);
+      elementGroup = Group.fromJson(
+          _json['elementGroup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('image')) {
-      image = Image.fromJson(_json['image']);
+      image =
+          Image.fromJson(_json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('line')) {
-      line = Line.fromJson(_json['line']);
+      line =
+          Line.fromJson(_json['line'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('shape')) {
-      shape = Shape.fromJson(_json['shape']);
+      shape =
+          Shape.fromJson(_json['shape'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sheetsChart')) {
-      sheetsChart = SheetsChart.fromJson(_json['sheetsChart']);
+      sheetsChart = SheetsChart.fromJson(
+          _json['sheetsChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('table')) {
-      table = Table.fromJson(_json['table']);
+      table =
+          Table.fromJson(_json['table'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
     }
     if (_json.containsKey('transform')) {
-      transform = AffineTransform.fromJson(_json['transform']);
+      transform = AffineTransform.fromJson(
+          _json['transform'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('video')) {
-      video = Video.fromJson(_json['video']);
+      video =
+          Video.fromJson(_json['video'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('wordArt')) {
-      wordArt = WordArt.fromJson(_json['wordArt']);
+      wordArt = WordArt.fromJson(
+          _json['wordArt'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3604,10 +3678,12 @@
       pageObjectId = _json['pageObjectId'] as core.String;
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transform')) {
-      transform = AffineTransform.fromJson(_json['transform']);
+      transform = AffineTransform.fromJson(
+          _json['transform'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3650,11 +3726,12 @@
 
   PageProperties.fromJson(core.Map _json) {
     if (_json.containsKey('colorScheme')) {
-      colorScheme = ColorScheme.fromJson(_json['colorScheme']);
+      colorScheme = ColorScheme.fromJson(
+          _json['colorScheme'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageBackgroundFill')) {
-      pageBackgroundFill =
-          PageBackgroundFill.fromJson(_json['pageBackgroundFill']);
+      pageBackgroundFill = PageBackgroundFill.fromJson(
+          _json['pageBackgroundFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3683,10 +3760,12 @@
 
   ParagraphMarker.fromJson(core.Map _json) {
     if (_json.containsKey('bullet')) {
-      bullet = Bullet.fromJson(_json['bullet']);
+      bullet = Bullet.fromJson(
+          _json['bullet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('style')) {
-      style = ParagraphStyle.fromJson(_json['style']);
+      style = ParagraphStyle.fromJson(
+          _json['style'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3777,22 +3856,27 @@
       direction = _json['direction'] as core.String;
     }
     if (_json.containsKey('indentEnd')) {
-      indentEnd = Dimension.fromJson(_json['indentEnd']);
+      indentEnd = Dimension.fromJson(
+          _json['indentEnd'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indentFirstLine')) {
-      indentFirstLine = Dimension.fromJson(_json['indentFirstLine']);
+      indentFirstLine = Dimension.fromJson(
+          _json['indentFirstLine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indentStart')) {
-      indentStart = Dimension.fromJson(_json['indentStart']);
+      indentStart = Dimension.fromJson(
+          _json['indentStart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('lineSpacing')) {
       lineSpacing = (_json['lineSpacing'] as core.num).toDouble();
     }
     if (_json.containsKey('spaceAbove')) {
-      spaceAbove = Dimension.fromJson(_json['spaceAbove']);
+      spaceAbove = Dimension.fromJson(
+          _json['spaceAbove'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spaceBelow')) {
-      spaceBelow = Dimension.fromJson(_json['spaceBelow']);
+      spaceBelow = Dimension.fromJson(
+          _json['spaceBelow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spacingMode')) {
       spacingMode = _json['spacingMode'] as core.String;
@@ -3952,7 +4036,8 @@
   Presentation.fromJson(core.Map _json) {
     if (_json.containsKey('layouts')) {
       layouts = (_json['layouts'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('locale')) {
@@ -3960,14 +4045,17 @@
     }
     if (_json.containsKey('masters')) {
       masters = (_json['masters'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('notesMaster')) {
-      notesMaster = Page.fromJson(_json['notesMaster']);
+      notesMaster = Page.fromJson(
+          _json['notesMaster'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageSize')) {
-      pageSize = Size.fromJson(_json['pageSize']);
+      pageSize = Size.fromJson(
+          _json['pageSize'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('presentationId')) {
       presentationId = _json['presentationId'] as core.String;
@@ -3977,7 +4065,8 @@
     }
     if (_json.containsKey('slides')) {
       slides = (_json['slides'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('title')) {
@@ -4140,7 +4229,8 @@
     }
     if (_json.containsKey('recolorStops')) {
       recolorStops = (_json['recolorStops'] as core.List)
-          .map<ColorStop>((value) => ColorStop.fromJson(value))
+          .map<ColorStop>((value) =>
+              ColorStop.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4238,7 +4328,8 @@
 
   ReplaceAllShapesWithImageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('containsText')) {
-      containsText = SubstringMatchCriteria.fromJson(_json['containsText']);
+      containsText = SubstringMatchCriteria.fromJson(
+          _json['containsText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageReplaceMethod')) {
       imageReplaceMethod = _json['imageReplaceMethod'] as core.String;
@@ -4338,7 +4429,8 @@
       chartId = _json['chartId'] as core.int;
     }
     if (_json.containsKey('containsText')) {
-      containsText = SubstringMatchCriteria.fromJson(_json['containsText']);
+      containsText = SubstringMatchCriteria.fromJson(
+          _json['containsText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('linkingMode')) {
       linkingMode = _json['linkingMode'] as core.String;
@@ -4414,7 +4506,8 @@
 
   ReplaceAllTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('containsText')) {
-      containsText = SubstringMatchCriteria.fromJson(_json['containsText']);
+      containsText = SubstringMatchCriteria.fromJson(
+          _json['containsText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pageObjectIds')) {
       pageObjectIds = (_json['pageObjectIds'] as core.List)
@@ -4654,162 +4747,191 @@
 
   Request.fromJson(core.Map _json) {
     if (_json.containsKey('createImage')) {
-      createImage = CreateImageRequest.fromJson(_json['createImage']);
+      createImage = CreateImageRequest.fromJson(
+          _json['createImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createLine')) {
-      createLine = CreateLineRequest.fromJson(_json['createLine']);
+      createLine = CreateLineRequest.fromJson(
+          _json['createLine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createParagraphBullets')) {
       createParagraphBullets = CreateParagraphBulletsRequest.fromJson(
-          _json['createParagraphBullets']);
+          _json['createParagraphBullets']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createShape')) {
-      createShape = CreateShapeRequest.fromJson(_json['createShape']);
+      createShape = CreateShapeRequest.fromJson(
+          _json['createShape'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createSheetsChart')) {
-      createSheetsChart =
-          CreateSheetsChartRequest.fromJson(_json['createSheetsChart']);
+      createSheetsChart = CreateSheetsChartRequest.fromJson(
+          _json['createSheetsChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createSlide')) {
-      createSlide = CreateSlideRequest.fromJson(_json['createSlide']);
+      createSlide = CreateSlideRequest.fromJson(
+          _json['createSlide'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTable')) {
-      createTable = CreateTableRequest.fromJson(_json['createTable']);
+      createTable = CreateTableRequest.fromJson(
+          _json['createTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createVideo')) {
-      createVideo = CreateVideoRequest.fromJson(_json['createVideo']);
+      createVideo = CreateVideoRequest.fromJson(
+          _json['createVideo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteObject')) {
-      deleteObject = DeleteObjectRequest.fromJson(_json['deleteObject']);
+      deleteObject = DeleteObjectRequest.fromJson(
+          _json['deleteObject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteParagraphBullets')) {
       deleteParagraphBullets = DeleteParagraphBulletsRequest.fromJson(
-          _json['deleteParagraphBullets']);
+          _json['deleteParagraphBullets']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteTableColumn')) {
-      deleteTableColumn =
-          DeleteTableColumnRequest.fromJson(_json['deleteTableColumn']);
+      deleteTableColumn = DeleteTableColumnRequest.fromJson(
+          _json['deleteTableColumn'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteTableRow')) {
-      deleteTableRow = DeleteTableRowRequest.fromJson(_json['deleteTableRow']);
+      deleteTableRow = DeleteTableRowRequest.fromJson(
+          _json['deleteTableRow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deleteText')) {
-      deleteText = DeleteTextRequest.fromJson(_json['deleteText']);
+      deleteText = DeleteTextRequest.fromJson(
+          _json['deleteText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duplicateObject')) {
-      duplicateObject =
-          DuplicateObjectRequest.fromJson(_json['duplicateObject']);
+      duplicateObject = DuplicateObjectRequest.fromJson(
+          _json['duplicateObject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupObjects')) {
-      groupObjects = GroupObjectsRequest.fromJson(_json['groupObjects']);
+      groupObjects = GroupObjectsRequest.fromJson(
+          _json['groupObjects'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertTableColumns')) {
-      insertTableColumns =
-          InsertTableColumnsRequest.fromJson(_json['insertTableColumns']);
+      insertTableColumns = InsertTableColumnsRequest.fromJson(
+          _json['insertTableColumns'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertTableRows')) {
-      insertTableRows =
-          InsertTableRowsRequest.fromJson(_json['insertTableRows']);
+      insertTableRows = InsertTableRowsRequest.fromJson(
+          _json['insertTableRows'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertText')) {
-      insertText = InsertTextRequest.fromJson(_json['insertText']);
+      insertText = InsertTextRequest.fromJson(
+          _json['insertText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mergeTableCells')) {
-      mergeTableCells =
-          MergeTableCellsRequest.fromJson(_json['mergeTableCells']);
+      mergeTableCells = MergeTableCellsRequest.fromJson(
+          _json['mergeTableCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('refreshSheetsChart')) {
-      refreshSheetsChart =
-          RefreshSheetsChartRequest.fromJson(_json['refreshSheetsChart']);
+      refreshSheetsChart = RefreshSheetsChartRequest.fromJson(
+          _json['refreshSheetsChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllShapesWithImage')) {
       replaceAllShapesWithImage = ReplaceAllShapesWithImageRequest.fromJson(
-          _json['replaceAllShapesWithImage']);
+          _json['replaceAllShapesWithImage']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllShapesWithSheetsChart')) {
       replaceAllShapesWithSheetsChart =
           ReplaceAllShapesWithSheetsChartRequest.fromJson(
-              _json['replaceAllShapesWithSheetsChart']);
+              _json['replaceAllShapesWithSheetsChart']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllText')) {
-      replaceAllText = ReplaceAllTextRequest.fromJson(_json['replaceAllText']);
+      replaceAllText = ReplaceAllTextRequest.fromJson(
+          _json['replaceAllText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceImage')) {
-      replaceImage = ReplaceImageRequest.fromJson(_json['replaceImage']);
+      replaceImage = ReplaceImageRequest.fromJson(
+          _json['replaceImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rerouteLine')) {
-      rerouteLine = RerouteLineRequest.fromJson(_json['rerouteLine']);
+      rerouteLine = RerouteLineRequest.fromJson(
+          _json['rerouteLine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ungroupObjects')) {
-      ungroupObjects = UngroupObjectsRequest.fromJson(_json['ungroupObjects']);
+      ungroupObjects = UngroupObjectsRequest.fromJson(
+          _json['ungroupObjects'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('unmergeTableCells')) {
-      unmergeTableCells =
-          UnmergeTableCellsRequest.fromJson(_json['unmergeTableCells']);
+      unmergeTableCells = UnmergeTableCellsRequest.fromJson(
+          _json['unmergeTableCells'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateImageProperties')) {
-      updateImageProperties =
-          UpdateImagePropertiesRequest.fromJson(_json['updateImageProperties']);
+      updateImageProperties = UpdateImagePropertiesRequest.fromJson(
+          _json['updateImageProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateLineCategory')) {
-      updateLineCategory =
-          UpdateLineCategoryRequest.fromJson(_json['updateLineCategory']);
+      updateLineCategory = UpdateLineCategoryRequest.fromJson(
+          _json['updateLineCategory'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateLineProperties')) {
-      updateLineProperties =
-          UpdateLinePropertiesRequest.fromJson(_json['updateLineProperties']);
+      updateLineProperties = UpdateLinePropertiesRequest.fromJson(
+          _json['updateLineProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updatePageElementAltText')) {
       updatePageElementAltText = UpdatePageElementAltTextRequest.fromJson(
-          _json['updatePageElementAltText']);
+          _json['updatePageElementAltText']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updatePageElementTransform')) {
       updatePageElementTransform = UpdatePageElementTransformRequest.fromJson(
-          _json['updatePageElementTransform']);
+          _json['updatePageElementTransform']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updatePageElementsZOrder')) {
       updatePageElementsZOrder = UpdatePageElementsZOrderRequest.fromJson(
-          _json['updatePageElementsZOrder']);
+          _json['updatePageElementsZOrder']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updatePageProperties')) {
-      updatePageProperties =
-          UpdatePagePropertiesRequest.fromJson(_json['updatePageProperties']);
+      updatePageProperties = UpdatePagePropertiesRequest.fromJson(
+          _json['updatePageProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateParagraphStyle')) {
-      updateParagraphStyle =
-          UpdateParagraphStyleRequest.fromJson(_json['updateParagraphStyle']);
+      updateParagraphStyle = UpdateParagraphStyleRequest.fromJson(
+          _json['updateParagraphStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateShapeProperties')) {
-      updateShapeProperties =
-          UpdateShapePropertiesRequest.fromJson(_json['updateShapeProperties']);
+      updateShapeProperties = UpdateShapePropertiesRequest.fromJson(
+          _json['updateShapeProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateSlidesPosition')) {
-      updateSlidesPosition =
-          UpdateSlidesPositionRequest.fromJson(_json['updateSlidesPosition']);
+      updateSlidesPosition = UpdateSlidesPositionRequest.fromJson(
+          _json['updateSlidesPosition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTableBorderProperties')) {
       updateTableBorderProperties = UpdateTableBorderPropertiesRequest.fromJson(
-          _json['updateTableBorderProperties']);
+          _json['updateTableBorderProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTableCellProperties')) {
       updateTableCellProperties = UpdateTableCellPropertiesRequest.fromJson(
-          _json['updateTableCellProperties']);
+          _json['updateTableCellProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTableColumnProperties')) {
       updateTableColumnProperties = UpdateTableColumnPropertiesRequest.fromJson(
-          _json['updateTableColumnProperties']);
+          _json['updateTableColumnProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTableRowProperties')) {
       updateTableRowProperties = UpdateTableRowPropertiesRequest.fromJson(
-          _json['updateTableRowProperties']);
+          _json['updateTableRowProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTextStyle')) {
-      updateTextStyle =
-          UpdateTextStyleRequest.fromJson(_json['updateTextStyle']);
+      updateTextStyle = UpdateTextStyleRequest.fromJson(
+          _json['updateTextStyle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateVideoProperties')) {
-      updateVideoProperties =
-          UpdateVideoPropertiesRequest.fromJson(_json['updateVideoProperties']);
+      updateVideoProperties = UpdateVideoPropertiesRequest.fromJson(
+          _json['updateVideoProperties']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5019,45 +5141,55 @@
 
   Response.fromJson(core.Map _json) {
     if (_json.containsKey('createImage')) {
-      createImage = CreateImageResponse.fromJson(_json['createImage']);
+      createImage = CreateImageResponse.fromJson(
+          _json['createImage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createLine')) {
-      createLine = CreateLineResponse.fromJson(_json['createLine']);
+      createLine = CreateLineResponse.fromJson(
+          _json['createLine'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createShape')) {
-      createShape = CreateShapeResponse.fromJson(_json['createShape']);
+      createShape = CreateShapeResponse.fromJson(
+          _json['createShape'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createSheetsChart')) {
-      createSheetsChart =
-          CreateSheetsChartResponse.fromJson(_json['createSheetsChart']);
+      createSheetsChart = CreateSheetsChartResponse.fromJson(
+          _json['createSheetsChart'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createSlide')) {
-      createSlide = CreateSlideResponse.fromJson(_json['createSlide']);
+      createSlide = CreateSlideResponse.fromJson(
+          _json['createSlide'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTable')) {
-      createTable = CreateTableResponse.fromJson(_json['createTable']);
+      createTable = CreateTableResponse.fromJson(
+          _json['createTable'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createVideo')) {
-      createVideo = CreateVideoResponse.fromJson(_json['createVideo']);
+      createVideo = CreateVideoResponse.fromJson(
+          _json['createVideo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('duplicateObject')) {
-      duplicateObject =
-          DuplicateObjectResponse.fromJson(_json['duplicateObject']);
+      duplicateObject = DuplicateObjectResponse.fromJson(
+          _json['duplicateObject'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupObjects')) {
-      groupObjects = GroupObjectsResponse.fromJson(_json['groupObjects']);
+      groupObjects = GroupObjectsResponse.fromJson(
+          _json['groupObjects'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllShapesWithImage')) {
       replaceAllShapesWithImage = ReplaceAllShapesWithImageResponse.fromJson(
-          _json['replaceAllShapesWithImage']);
+          _json['replaceAllShapesWithImage']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllShapesWithSheetsChart')) {
       replaceAllShapesWithSheetsChart =
           ReplaceAllShapesWithSheetsChartResponse.fromJson(
-              _json['replaceAllShapesWithSheetsChart']);
+              _json['replaceAllShapesWithSheetsChart']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replaceAllText')) {
-      replaceAllText = ReplaceAllTextResponse.fromJson(_json['replaceAllText']);
+      replaceAllText = ReplaceAllTextResponse.fromJson(
+          _json['replaceAllText'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5222,10 +5354,12 @@
       alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('blurRadius')) {
-      blurRadius = Dimension.fromJson(_json['blurRadius']);
+      blurRadius = Dimension.fromJson(
+          _json['blurRadius'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('color')) {
-      color = OpaqueColor.fromJson(_json['color']);
+      color = OpaqueColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('propertyState')) {
       propertyState = _json['propertyState'] as core.String;
@@ -5234,7 +5368,8 @@
       rotateWithShape = _json['rotateWithShape'] as core.bool;
     }
     if (_json.containsKey('transform')) {
-      transform = AffineTransform.fromJson(_json['transform']);
+      transform = AffineTransform.fromJson(
+          _json['transform'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -5555,16 +5690,19 @@
 
   Shape.fromJson(core.Map _json) {
     if (_json.containsKey('placeholder')) {
-      placeholder = Placeholder.fromJson(_json['placeholder']);
+      placeholder = Placeholder.fromJson(
+          _json['placeholder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shapeProperties')) {
-      shapeProperties = ShapeProperties.fromJson(_json['shapeProperties']);
+      shapeProperties = ShapeProperties.fromJson(
+          _json['shapeProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shapeType')) {
       shapeType = _json['shapeType'] as core.String;
     }
     if (_json.containsKey('text')) {
-      text = TextContent.fromJson(_json['text']);
+      text = TextContent.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5622,7 +5760,8 @@
       propertyState = _json['propertyState'] as core.String;
     }
     if (_json.containsKey('solidFill')) {
-      solidFill = SolidFill.fromJson(_json['solidFill']);
+      solidFill = SolidFill.fromJson(
+          _json['solidFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5688,17 +5827,20 @@
       contentAlignment = _json['contentAlignment'] as core.String;
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outline')) {
-      outline = Outline.fromJson(_json['outline']);
+      outline = Outline.fromJson(
+          _json['outline'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shadow')) {
-      shadow = Shadow.fromJson(_json['shadow']);
+      shadow = Shadow.fromJson(
+          _json['shadow'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shapeBackgroundFill')) {
-      shapeBackgroundFill =
-          ShapeBackgroundFill.fromJson(_json['shapeBackgroundFill']);
+      shapeBackgroundFill = ShapeBackgroundFill.fromJson(
+          _json['shapeBackgroundFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5751,8 +5893,9 @@
       contentUrl = _json['contentUrl'] as core.String;
     }
     if (_json.containsKey('sheetsChartProperties')) {
-      sheetsChartProperties =
-          SheetsChartProperties.fromJson(_json['sheetsChartProperties']);
+      sheetsChartProperties = SheetsChartProperties.fromJson(
+          _json['sheetsChartProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('spreadsheetId')) {
       spreadsheetId = _json['spreadsheetId'] as core.String;
@@ -5786,8 +5929,8 @@
 
   SheetsChartProperties.fromJson(core.Map _json) {
     if (_json.containsKey('chartImageProperties')) {
-      chartImageProperties =
-          ImageProperties.fromJson(_json['chartImageProperties']);
+      chartImageProperties = ImageProperties.fromJson(
+          _json['chartImageProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5812,10 +5955,12 @@
 
   Size.fromJson(core.Map _json) {
     if (_json.containsKey('height')) {
-      height = Dimension.fromJson(_json['height']);
+      height = Dimension.fromJson(
+          _json['height'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
-      width = Dimension.fromJson(_json['width']);
+      width = Dimension.fromJson(
+          _json['width'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5862,7 +6007,8 @@
       masterObjectId = _json['masterObjectId'] as core.String;
     }
     if (_json.containsKey('notesPage')) {
-      notesPage = Page.fromJson(_json['notesPage']);
+      notesPage = Page.fromJson(
+          _json['notesPage'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5902,7 +6048,8 @@
       alpha = (_json['alpha'] as core.num).toDouble();
     }
     if (_json.containsKey('color')) {
-      color = OpaqueColor.fromJson(_json['color']);
+      color = OpaqueColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5941,7 +6088,8 @@
       contentUrl = _json['contentUrl'] as core.String;
     }
     if (_json.containsKey('size')) {
-      size = Size.fromJson(_json['size']);
+      size =
+          Size.fromJson(_json['size'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6026,7 +6174,8 @@
     }
     if (_json.containsKey('horizontalBorderRows')) {
       horizontalBorderRows = (_json['horizontalBorderRows'] as core.List)
-          .map<TableBorderRow>((value) => TableBorderRow.fromJson(value))
+          .map<TableBorderRow>((value) => TableBorderRow.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rows')) {
@@ -6034,18 +6183,20 @@
     }
     if (_json.containsKey('tableColumns')) {
       tableColumns = (_json['tableColumns'] as core.List)
-          .map<TableColumnProperties>(
-              (value) => TableColumnProperties.fromJson(value))
+          .map<TableColumnProperties>((value) => TableColumnProperties.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tableRows')) {
       tableRows = (_json['tableRows'] as core.List)
-          .map<TableRow>((value) => TableRow.fromJson(value))
+          .map<TableRow>((value) =>
+              TableRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('verticalBorderRows')) {
       verticalBorderRows = (_json['verticalBorderRows'] as core.List)
-          .map<TableBorderRow>((value) => TableBorderRow.fromJson(value))
+          .map<TableBorderRow>((value) => TableBorderRow.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6089,11 +6240,13 @@
 
   TableBorderCell.fromJson(core.Map _json) {
     if (_json.containsKey('location')) {
-      location = TableCellLocation.fromJson(_json['location']);
+      location = TableCellLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableBorderProperties')) {
-      tableBorderProperties =
-          TableBorderProperties.fromJson(_json['tableBorderProperties']);
+      tableBorderProperties = TableBorderProperties.fromJson(
+          _json['tableBorderProperties']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6118,7 +6271,8 @@
 
   TableBorderFill.fromJson(core.Map _json) {
     if (_json.containsKey('solidFill')) {
-      solidFill = SolidFill.fromJson(_json['solidFill']);
+      solidFill = SolidFill.fromJson(
+          _json['solidFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6163,10 +6317,12 @@
       dashStyle = _json['dashStyle'] as core.String;
     }
     if (_json.containsKey('tableBorderFill')) {
-      tableBorderFill = TableBorderFill.fromJson(_json['tableBorderFill']);
+      tableBorderFill = TableBorderFill.fromJson(
+          _json['tableBorderFill'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('weight')) {
-      weight = Dimension.fromJson(_json['weight']);
+      weight = Dimension.fromJson(
+          _json['weight'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6196,7 +6352,8 @@
   TableBorderRow.fromJson(core.Map _json) {
     if (_json.containsKey('tableBorderCells')) {
       tableBorderCells = (_json['tableBorderCells'] as core.List)
-          .map<TableBorderCell>((value) => TableBorderCell.fromJson(value))
+          .map<TableBorderCell>((value) => TableBorderCell.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6235,17 +6392,19 @@
       columnSpan = _json['columnSpan'] as core.int;
     }
     if (_json.containsKey('location')) {
-      location = TableCellLocation.fromJson(_json['location']);
+      location = TableCellLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rowSpan')) {
       rowSpan = _json['rowSpan'] as core.int;
     }
     if (_json.containsKey('tableCellProperties')) {
-      tableCellProperties =
-          TableCellProperties.fromJson(_json['tableCellProperties']);
+      tableCellProperties = TableCellProperties.fromJson(
+          _json['tableCellProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
-      text = TextContent.fromJson(_json['text']);
+      text = TextContent.fromJson(
+          _json['text'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6306,7 +6465,8 @@
       propertyState = _json['propertyState'] as core.String;
     }
     if (_json.containsKey('solidFill')) {
-      solidFill = SolidFill.fromJson(_json['solidFill']);
+      solidFill = SolidFill.fromJson(
+          _json['solidFill'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6380,8 +6540,9 @@
       contentAlignment = _json['contentAlignment'] as core.String;
     }
     if (_json.containsKey('tableCellBackgroundFill')) {
-      tableCellBackgroundFill =
-          TableCellBackgroundFill.fromJson(_json['tableCellBackgroundFill']);
+      tableCellBackgroundFill = TableCellBackgroundFill.fromJson(
+          _json['tableCellBackgroundFill']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6406,7 +6567,8 @@
 
   TableColumnProperties.fromJson(core.Map _json) {
     if (_json.containsKey('columnWidth')) {
-      columnWidth = Dimension.fromJson(_json['columnWidth']);
+      columnWidth = Dimension.fromJson(
+          _json['columnWidth'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6442,7 +6604,8 @@
       columnSpan = _json['columnSpan'] as core.int;
     }
     if (_json.containsKey('location')) {
-      location = TableCellLocation.fromJson(_json['location']);
+      location = TableCellLocation.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rowSpan')) {
       rowSpan = _json['rowSpan'] as core.int;
@@ -6482,16 +6645,18 @@
 
   TableRow.fromJson(core.Map _json) {
     if (_json.containsKey('rowHeight')) {
-      rowHeight = Dimension.fromJson(_json['rowHeight']);
+      rowHeight = Dimension.fromJson(
+          _json['rowHeight'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableCells')) {
       tableCells = (_json['tableCells'] as core.List)
-          .map<TableCell>((value) => TableCell.fromJson(value))
+          .map<TableCell>((value) =>
+              TableCell.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tableRowProperties')) {
-      tableRowProperties =
-          TableRowProperties.fromJson(_json['tableRowProperties']);
+      tableRowProperties = TableRowProperties.fromJson(
+          _json['tableRowProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6521,7 +6686,8 @@
 
   TableRowProperties.fromJson(core.Map _json) {
     if (_json.containsKey('minRowHeight')) {
-      minRowHeight = Dimension.fromJson(_json['minRowHeight']);
+      minRowHeight = Dimension.fromJson(
+          _json['minRowHeight'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6549,12 +6715,15 @@
   TextContent.fromJson(core.Map _json) {
     if (_json.containsKey('lists')) {
       lists = commons.mapMap<core.Map, List>(
-          _json['lists'].cast<core.String, core.Map>(),
-          (core.Map item) => List.fromJson(item));
+          (_json['lists'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              List.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('textElements')) {
       textElements = (_json['textElements'] as core.List)
-          .map<TextElement>((value) => TextElement.fromJson(value))
+          .map<TextElement>((value) => TextElement.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6605,19 +6774,22 @@
 
   TextElement.fromJson(core.Map _json) {
     if (_json.containsKey('autoText')) {
-      autoText = AutoText.fromJson(_json['autoText']);
+      autoText = AutoText.fromJson(
+          _json['autoText'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endIndex')) {
       endIndex = _json['endIndex'] as core.int;
     }
     if (_json.containsKey('paragraphMarker')) {
-      paragraphMarker = ParagraphMarker.fromJson(_json['paragraphMarker']);
+      paragraphMarker = ParagraphMarker.fromJson(
+          _json['paragraphMarker'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startIndex')) {
       startIndex = _json['startIndex'] as core.int;
     }
     if (_json.containsKey('textRun')) {
-      textRun = TextRun.fromJson(_json['textRun']);
+      textRun = TextRun.fromJson(
+          _json['textRun'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6658,7 +6830,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('style')) {
-      style = TextStyle.fromJson(_json['style']);
+      style = TextStyle.fromJson(
+          _json['style'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6778,7 +6951,8 @@
 
   TextStyle.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundColor')) {
-      backgroundColor = OptionalColor.fromJson(_json['backgroundColor']);
+      backgroundColor = OptionalColor.fromJson(
+          _json['backgroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('baselineOffset')) {
       baselineOffset = _json['baselineOffset'] as core.String;
@@ -6790,16 +6964,19 @@
       fontFamily = _json['fontFamily'] as core.String;
     }
     if (_json.containsKey('fontSize')) {
-      fontSize = Dimension.fromJson(_json['fontSize']);
+      fontSize = Dimension.fromJson(
+          _json['fontSize'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('foregroundColor')) {
-      foregroundColor = OptionalColor.fromJson(_json['foregroundColor']);
+      foregroundColor = OptionalColor.fromJson(
+          _json['foregroundColor'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('italic')) {
       italic = _json['italic'] as core.bool;
     }
     if (_json.containsKey('link')) {
-      link = Link.fromJson(_json['link']);
+      link =
+          Link.fromJson(_json['link'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('smallCaps')) {
       smallCaps = _json['smallCaps'] as core.bool;
@@ -6811,8 +6988,8 @@
       underline = _json['underline'] as core.bool;
     }
     if (_json.containsKey('weightedFontFamily')) {
-      weightedFontFamily =
-          WeightedFontFamily.fromJson(_json['weightedFontFamily']);
+      weightedFontFamily = WeightedFontFamily.fromJson(
+          _json['weightedFontFamily'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6890,7 +7067,8 @@
 
   ThemeColorPair.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = RgbColor.fromJson(_json['color']);
+      color = RgbColor.fromJson(
+          _json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -7001,7 +7179,8 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('tableRange')) {
-      tableRange = TableRange.fromJson(_json['tableRange']);
+      tableRange = TableRange.fromJson(
+          _json['tableRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7041,7 +7220,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('imageProperties')) {
-      imageProperties = ImageProperties.fromJson(_json['imageProperties']);
+      imageProperties = ImageProperties.fromJson(
+          _json['imageProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
@@ -7126,7 +7306,8 @@
       fields = _json['fields'] as core.String;
     }
     if (_json.containsKey('lineProperties')) {
-      lineProperties = LineProperties.fromJson(_json['lineProperties']);
+      lineProperties = LineProperties.fromJson(
+          _json['lineProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectId')) {
       objectId = _json['objectId'] as core.String;
@@ -7224,7 +7405,8 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('transform')) {
-      transform = AffineTransform.fromJson(_json['transform']);
+      transform = AffineTransform.fromJson(
+          _json['transform'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7317,7 +7499,8 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('pageProperties')) {
-      pageProperties = PageProperties.fromJson(_json['pageProperties']);
+      pageProperties = PageProperties.fromJson(
+          _json['pageProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7365,7 +7548,8 @@
 
   UpdateParagraphStyleRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
@@ -7374,10 +7558,12 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('style')) {
-      style = ParagraphStyle.fromJson(_json['style']);
+      style = ParagraphStyle.fromJson(
+          _json['style'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textRange')) {
-      textRange = Range.fromJson(_json['textRange']);
+      textRange = Range.fromJson(
+          _json['textRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7429,7 +7615,8 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('shapeProperties')) {
-      shapeProperties = ShapeProperties.fromJson(_json['shapeProperties']);
+      shapeProperties = ShapeProperties.fromJson(
+          _json['shapeProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7534,11 +7721,13 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('tableBorderProperties')) {
-      tableBorderProperties =
-          TableBorderProperties.fromJson(_json['tableBorderProperties']);
+      tableBorderProperties = TableBorderProperties.fromJson(
+          _json['tableBorderProperties']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableRange')) {
-      tableRange = TableRange.fromJson(_json['tableRange']);
+      tableRange = TableRange.fromJson(
+          _json['tableRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7595,11 +7784,12 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('tableCellProperties')) {
-      tableCellProperties =
-          TableCellProperties.fromJson(_json['tableCellProperties']);
+      tableCellProperties = TableCellProperties.fromJson(
+          _json['tableCellProperties'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tableRange')) {
-      tableRange = TableRange.fromJson(_json['tableRange']);
+      tableRange = TableRange.fromJson(
+          _json['tableRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7658,8 +7848,9 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('tableColumnProperties')) {
-      tableColumnProperties =
-          TableColumnProperties.fromJson(_json['tableColumnProperties']);
+      tableColumnProperties = TableColumnProperties.fromJson(
+          _json['tableColumnProperties']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7716,8 +7907,8 @@
           .toList();
     }
     if (_json.containsKey('tableRowProperties')) {
-      tableRowProperties =
-          TableRowProperties.fromJson(_json['tableRowProperties']);
+      tableRowProperties = TableRowProperties.fromJson(
+          _json['tableRowProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7773,7 +7964,8 @@
 
   UpdateTextStyleRequest.fromJson(core.Map _json) {
     if (_json.containsKey('cellLocation')) {
-      cellLocation = TableCellLocation.fromJson(_json['cellLocation']);
+      cellLocation = TableCellLocation.fromJson(
+          _json['cellLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('fields')) {
       fields = _json['fields'] as core.String;
@@ -7782,10 +7974,12 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('style')) {
-      style = TextStyle.fromJson(_json['style']);
+      style = TextStyle.fromJson(
+          _json['style'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textRange')) {
-      textRange = Range.fromJson(_json['textRange']);
+      textRange = Range.fromJson(
+          _json['textRange'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7837,7 +8031,8 @@
       objectId = _json['objectId'] as core.String;
     }
     if (_json.containsKey('videoProperties')) {
-      videoProperties = VideoProperties.fromJson(_json['videoProperties']);
+      videoProperties = VideoProperties.fromJson(
+          _json['videoProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7888,7 +8083,8 @@
       url = _json['url'] as core.String;
     }
     if (_json.containsKey('videoProperties')) {
-      videoProperties = VideoProperties.fromJson(_json['videoProperties']);
+      videoProperties = VideoProperties.fromJson(
+          _json['videoProperties'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7949,7 +8145,8 @@
       mute = _json['mute'] as core.bool;
     }
     if (_json.containsKey('outline')) {
-      outline = Outline.fromJson(_json['outline']);
+      outline = Outline.fromJson(
+          _json['outline'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('start')) {
       start = _json['start'] as core.int;
diff --git a/generated/googleapis/lib/sourcerepo/v1.dart b/generated/googleapis/lib/sourcerepo/v1.dart
index 10d2c1b..4c3118c 100644
--- a/generated/googleapis/lib/sourcerepo/v1.dart
+++ b/generated/googleapis/lib/sourcerepo/v1.dart
@@ -113,7 +113,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProjectConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProjectConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the Cloud Source Repositories configuration of the project.
@@ -169,7 +172,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProjectConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProjectConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -232,7 +238,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Repo.fromJson(data));
+    return _response.then(
+      (data) => Repo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a repo.
@@ -282,7 +290,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns information about a repo.
@@ -332,7 +342,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Repo.fromJson(data));
+    return _response.then(
+      (data) => Repo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a resource. Returns an empty policy if
@@ -400,7 +412,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns all repos belonging to a project. The sizes of the repos are not
@@ -466,7 +480,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListReposResponse.fromJson(data));
+    return _response.then(
+      (data) => ListReposResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates information about a repo.
@@ -522,7 +539,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Repo.fromJson(data));
+    return _response.then(
+      (data) => Repo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on the specified resource. Replaces any
@@ -582,7 +601,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Synchronize a connected repo. The response contains SyncRepoMetadata in
@@ -639,7 +660,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that a caller has on the specified resource. If the
@@ -700,7 +723,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -734,7 +760,8 @@
   AuditConfig.fromJson(core.Map _json) {
     if (_json.containsKey('auditLogConfigs')) {
       auditLogConfigs = (_json['auditLogConfigs'] as core.List)
-          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(value))
+          .map<AuditLogConfig>((value) => AuditLogConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('service')) {
@@ -848,7 +875,8 @@
 
   Binding.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -979,7 +1007,8 @@
     }
     if (_json.containsKey('repos')) {
       repos = (_json['repos'] as core.List)
-          .map<Repo>((value) => Repo.fromJson(value))
+          .map<Repo>((value) =>
+              Repo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1086,11 +1115,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1098,7 +1129,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1203,12 +1235,14 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('auditConfigs')) {
       auditConfigs = (_json['auditConfigs'] as core.List)
-          .map<AuditConfig>((value) => AuditConfig.fromJson(value))
+          .map<AuditConfig>((value) => AuditConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -1261,8 +1295,10 @@
     }
     if (_json.containsKey('pubsubConfigs')) {
       pubsubConfigs = commons.mapMap<core.Map, PubsubConfig>(
-          _json['pubsubConfigs'].cast<core.String, core.Map>(),
-          (core.Map item) => PubsubConfig.fromJson(item));
+          (_json['pubsubConfigs'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => PubsubConfig.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
   }
 
@@ -1359,15 +1395,18 @@
 
   Repo.fromJson(core.Map _json) {
     if (_json.containsKey('mirrorConfig')) {
-      mirrorConfig = MirrorConfig.fromJson(_json['mirrorConfig']);
+      mirrorConfig = MirrorConfig.fromJson(
+          _json['mirrorConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('pubsubConfigs')) {
       pubsubConfigs = commons.mapMap<core.Map, PubsubConfig>(
-          _json['pubsubConfigs'].cast<core.String, core.Map>(),
-          (core.Map item) => PubsubConfig.fromJson(item));
+          (_json['pubsubConfigs'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => PubsubConfig.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('size')) {
       size = _json['size'] as core.String;
@@ -1417,7 +1456,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -1468,7 +1508,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -1622,7 +1663,8 @@
 
   UpdateProjectConfigRequest.fromJson(core.Map _json) {
     if (_json.containsKey('projectConfig')) {
-      projectConfig = ProjectConfig.fromJson(_json['projectConfig']);
+      projectConfig = ProjectConfig.fromJson(
+          _json['projectConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
@@ -1655,7 +1697,8 @@
 
   UpdateRepoRequest.fromJson(core.Map _json) {
     if (_json.containsKey('repo')) {
-      repo = Repo.fromJson(_json['repo']);
+      repo =
+          Repo.fromJson(_json['repo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
diff --git a/generated/googleapis/lib/spanner/v1.dart b/generated/googleapis/lib/spanner/v1.dart
index c3ed8c9..2511a9d 100644
--- a/generated/googleapis/lib/spanner/v1.dart
+++ b/generated/googleapis/lib/spanner/v1.dart
@@ -120,7 +120,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => InstanceConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          InstanceConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the supported instance configurations for a given project.
@@ -187,7 +190,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInstanceConfigsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInstanceConfigsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -279,7 +285,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an instance. Immediately upon completion of the request: * Billing
@@ -332,7 +340,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a particular instance.
@@ -390,7 +400,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Instance.fromJson(data));
+    return _response.then(
+      (data) => Instance.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for an instance resource. Returns an empty
@@ -451,7 +463,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all instances in the given project.
@@ -532,7 +546,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListInstancesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListInstancesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an instance, and begins allocating or releasing resources as
@@ -610,7 +627,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on an instance resource. Replaces any
@@ -671,7 +690,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that the caller has on the specified instance
@@ -734,7 +755,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -846,8 +870,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListBackupOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBackupOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -932,7 +958,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a pending or completed Backup.
@@ -982,7 +1010,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets metadata on a pending or completed Backup.
@@ -1032,7 +1062,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Backup.fromJson(data));
+    return _response.then(
+      (data) => Backup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a database or backup resource. Returns
@@ -1095,7 +1127,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists completed and pending backups. Backups returned are ordered by
@@ -1188,7 +1222,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListBackupsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListBackupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a pending or completed Backup.
@@ -1260,7 +1297,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Backup.fromJson(data));
+    return _response.then(
+      (data) => Backup.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on a database or backup resource. Replaces
@@ -1323,7 +1362,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that the caller has on the specified database or
@@ -1388,7 +1429,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1453,7 +1497,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -1506,7 +1552,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1558,7 +1606,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1634,7 +1684,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1744,8 +1797,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListDatabaseOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDatabaseOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1818,7 +1873,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Drops (aka deletes) a Cloud Spanner database. Completed backups for the
@@ -1869,7 +1926,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the state of a Cloud Spanner database.
@@ -1920,7 +1979,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Database.fromJson(data));
+    return _response.then(
+      (data) => Database.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns the schema of a Cloud Spanner database as a list of formatted DDL
@@ -1973,7 +2034,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetDatabaseDdlResponse.fromJson(data));
+    return _response.then(
+      (data) => GetDatabaseDdlResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the access control policy for a database or backup resource. Returns
@@ -2037,7 +2101,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists Cloud Spanner databases.
@@ -2102,7 +2168,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListDatabasesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListDatabasesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Create a new database by restoring from a completed backup. The new
@@ -2173,7 +2242,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the access control policy on a database or backup resource. Replaces
@@ -2237,7 +2308,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns permissions that the caller has on the specified database or
@@ -2303,7 +2376,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the schema of a Cloud Spanner database by
@@ -2363,7 +2439,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2428,7 +2506,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -2481,7 +2561,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -2533,7 +2615,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -2609,7 +2693,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2676,7 +2763,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchCreateSessionsResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchCreateSessionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Begins a new transaction. This step can often be skipped: Read, ExecuteSql
@@ -2735,7 +2825,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Transaction.fromJson(data));
+    return _response.then(
+      (data) =>
+          Transaction.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Commits a transaction. The request includes the mutations to be applied to
@@ -2803,7 +2896,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommitResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommitResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new session. A session can be used to perform transactions that
@@ -2872,7 +2968,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Session.fromJson(data));
+    return _response.then(
+      (data) => Session.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Ends a session, releasing server resources associated with it. This will
@@ -2924,7 +3022,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Executes a batch of SQL DML statements. This method allows many statements
@@ -2990,7 +3090,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ExecuteBatchDmlResponse.fromJson(data));
+    return _response.then(
+      (data) => ExecuteBatchDmlResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Executes an SQL statement, returning all results in a single reply. This
@@ -3056,7 +3159,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResultSet.fromJson(data));
+    return _response.then(
+      (data) => ResultSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Like ExecuteSql, except returns the result set as a stream. Unlike
@@ -3118,7 +3223,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PartialResultSet.fromJson(data));
+    return _response.then(
+      (data) => PartialResultSet.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a session. Returns `NOT_FOUND` if the session does not exist. This is
@@ -3169,7 +3277,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Session.fromJson(data));
+    return _response.then(
+      (data) => Session.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all sessions in a given database.
@@ -3246,7 +3356,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSessionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSessionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a set of partition tokens that can be used to execute a query
@@ -3313,7 +3426,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PartitionResponse.fromJson(data));
+    return _response.then(
+      (data) => PartitionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a set of partition tokens that can be used to execute a read
@@ -3382,7 +3498,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PartitionResponse.fromJson(data));
+    return _response.then(
+      (data) => PartitionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reads rows from the database using key lookups and scans, as a simple
@@ -3445,7 +3564,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ResultSet.fromJson(data));
+    return _response.then(
+      (data) => ResultSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rolls back a transaction, releasing any locks it holds. It is a good idea
@@ -3508,7 +3629,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Like Read, except returns the result set as a stream. Unlike Read, there
@@ -3569,7 +3692,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PartialResultSet.fromJson(data));
+    return _response.then(
+      (data) => PartialResultSet.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3634,7 +3760,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -3687,7 +3815,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -3739,7 +3869,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -3814,7 +3946,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3980,7 +4115,8 @@
       sessionCount = _json['sessionCount'] as core.int;
     }
     if (_json.containsKey('sessionTemplate')) {
-      sessionTemplate = Session.fromJson(_json['sessionTemplate']);
+      sessionTemplate = Session.fromJson(
+          _json['sessionTemplate'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4006,7 +4142,8 @@
   BatchCreateSessionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('session')) {
       session = (_json['session'] as core.List)
-          .map<Session>((value) => Session.fromJson(value))
+          .map<Session>((value) =>
+              Session.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4029,7 +4166,8 @@
 
   BeginTransactionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = TransactionOptions.fromJson(_json['options']);
+      options = TransactionOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4099,7 +4237,8 @@
       bindingId = _json['bindingId'] as core.String;
     }
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -4209,12 +4348,13 @@
   CommitRequest.fromJson(core.Map _json) {
     if (_json.containsKey('mutations')) {
       mutations = (_json['mutations'] as core.List)
-          .map<Mutation>((value) => Mutation.fromJson(value))
+          .map<Mutation>((value) =>
+              Mutation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('singleUseTransaction')) {
-      singleUseTransaction =
-          TransactionOptions.fromJson(_json['singleUseTransaction']);
+      singleUseTransaction = TransactionOptions.fromJson(
+          _json['singleUseTransaction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transactionId')) {
       transactionId = _json['transactionId'] as core.String;
@@ -4293,7 +4433,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('progress')) {
-      progress = OperationProgress.fromJson(_json['progress']);
+      progress = OperationProgress.fromJson(
+          _json['progress'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4403,7 +4544,8 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('instance')) {
-      instance = Instance.fromJson(_json['instance']);
+      instance = Instance.fromJson(
+          _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -4442,7 +4584,8 @@
 
   CreateInstanceRequest.fromJson(core.Map _json) {
     if (_json.containsKey('instance')) {
-      instance = Instance.fromJson(_json['instance']);
+      instance = Instance.fromJson(
+          _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('instanceId')) {
       instanceId = _json['instanceId'] as core.String;
@@ -4470,7 +4613,8 @@
 
   CreateSessionRequest.fromJson(core.Map _json) {
     if (_json.containsKey('session')) {
-      session = Session.fromJson(_json['session']);
+      session = Session.fromJson(
+          _json['session'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4522,7 +4666,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('restoreInfo')) {
-      restoreInfo = RestoreInfo.fromJson(_json['restoreInfo']);
+      restoreInfo = RestoreInfo.fromJson(
+          _json['restoreInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
@@ -4563,7 +4708,8 @@
 
   Delete.fromJson(core.Map _json) {
     if (_json.containsKey('keySet')) {
-      keySet = KeySet.fromJson(_json['keySet']);
+      keySet = KeySet.fromJson(
+          _json['keySet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('table')) {
       table = _json['table'] as core.String;
@@ -4632,11 +4778,13 @@
     }
     if (_json.containsKey('statements')) {
       statements = (_json['statements'] as core.List)
-          .map<Statement>((value) => Statement.fromJson(value))
+          .map<Statement>((value) =>
+              Statement.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('transaction')) {
-      transaction = TransactionSelector.fromJson(_json['transaction']);
+      transaction = TransactionSelector.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4687,11 +4835,13 @@
   ExecuteBatchDmlResponse.fromJson(core.Map _json) {
     if (_json.containsKey('resultSets')) {
       resultSets = (_json['resultSets'] as core.List)
-          .map<ResultSet>((value) => ResultSet.fromJson(value))
+          .map<ResultSet>((value) =>
+              ResultSet.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4798,12 +4948,15 @@
   ExecuteSqlRequest.fromJson(core.Map _json) {
     if (_json.containsKey('paramTypes')) {
       paramTypes = commons.mapMap<core.Map, Type>(
-          _json['paramTypes'].cast<core.String, core.Map>(),
-          (core.Map item) => Type.fromJson(item));
+          (_json['paramTypes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Type.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.Object, core.Object>(
-          _json['params'].cast<core.String, core.Object>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('partitionToken')) {
@@ -4813,7 +4966,8 @@
       queryMode = _json['queryMode'] as core.String;
     }
     if (_json.containsKey('queryOptions')) {
-      queryOptions = QueryOptions.fromJson(_json['queryOptions']);
+      queryOptions = QueryOptions.fromJson(
+          _json['queryOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resumeToken')) {
       resumeToken = _json['resumeToken'] as core.String;
@@ -4825,7 +4979,8 @@
       sql = _json['sql'] as core.String;
     }
     if (_json.containsKey('transaction')) {
-      transaction = TransactionSelector.fromJson(_json['transaction']);
+      transaction = TransactionSelector.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4952,7 +5107,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('type')) {
-      type = Type.fromJson(_json['type']);
+      type =
+          Type.fromJson(_json['type'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5003,7 +5159,8 @@
 
   GetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('options')) {
-      options = GetPolicyOptions.fromJson(_json['options']);
+      options = GetPolicyOptions.fromJson(
+          _json['options'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5116,7 +5273,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -5182,7 +5340,8 @@
     }
     if (_json.containsKey('replicas')) {
       replicas = (_json['replicas'] as core.List)
-          .map<ReplicaInfo>((value) => ReplicaInfo.fromJson(value))
+          .map<ReplicaInfo>((value) => ReplicaInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5346,7 +5505,8 @@
     }
     if (_json.containsKey('ranges')) {
       ranges = (_json['ranges'] as core.List)
-          .map<KeyRange>((value) => KeyRange.fromJson(value))
+          .map<KeyRange>((value) =>
+              KeyRange.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5389,7 +5549,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5422,7 +5583,8 @@
   ListBackupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('backups')) {
       backups = (_json['backups'] as core.List)
-          .map<Backup>((value) => Backup.fromJson(value))
+          .map<Backup>((value) =>
+              Backup.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5461,7 +5623,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5492,7 +5655,8 @@
   ListDatabasesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('databases')) {
       databases = (_json['databases'] as core.List)
-          .map<Database>((value) => Database.fromJson(value))
+          .map<Database>((value) =>
+              Database.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5526,7 +5690,8 @@
   ListInstanceConfigsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('instanceConfigs')) {
       instanceConfigs = (_json['instanceConfigs'] as core.List)
-          .map<InstanceConfig>((value) => InstanceConfig.fromJson(value))
+          .map<InstanceConfig>((value) => InstanceConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5561,7 +5726,8 @@
   ListInstancesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('instances')) {
       instances = (_json['instances'] as core.List)
-          .map<Instance>((value) => Instance.fromJson(value))
+          .map<Instance>((value) =>
+              Instance.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -5597,7 +5763,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5631,7 +5798,8 @@
     }
     if (_json.containsKey('sessions')) {
       sessions = (_json['sessions'] as core.List)
-          .map<Session>((value) => Session.fromJson(value))
+          .map<Session>((value) =>
+              Session.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5684,19 +5852,24 @@
 
   Mutation.fromJson(core.Map _json) {
     if (_json.containsKey('delete')) {
-      delete = Delete.fromJson(_json['delete']);
+      delete = Delete.fromJson(
+          _json['delete'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insert')) {
-      insert = Write.fromJson(_json['insert']);
+      insert = Write.fromJson(
+          _json['insert'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('insertOrUpdate')) {
-      insertOrUpdate = Write.fromJson(_json['insertOrUpdate']);
+      insertOrUpdate = Write.fromJson(
+          _json['insertOrUpdate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('replace')) {
-      replace = Write.fromJson(_json['replace']);
+      replace = Write.fromJson(
+          _json['replace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('update')) {
-      update = Write.fromJson(_json['update']);
+      update = Write.fromJson(
+          _json['update'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5765,11 +5938,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -5777,7 +5952,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -5864,7 +6040,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('progress')) {
-      progress = OperationProgress.fromJson(_json['progress']);
+      progress = OperationProgress.fromJson(
+          _json['progress'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5959,13 +6136,15 @@
       chunkedValue = _json['chunkedValue'] as core.bool;
     }
     if (_json.containsKey('metadata')) {
-      metadata = ResultSetMetadata.fromJson(_json['metadata']);
+      metadata = ResultSetMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resumeToken')) {
       resumeToken = _json['resumeToken'] as core.String;
     }
     if (_json.containsKey('stats')) {
-      stats = ResultSetStats.fromJson(_json['stats']);
+      stats = ResultSetStats.fromJson(
+          _json['stats'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('values')) {
       values = (_json['values'] as core.List)
@@ -6110,22 +6289,27 @@
   PartitionQueryRequest.fromJson(core.Map _json) {
     if (_json.containsKey('paramTypes')) {
       paramTypes = commons.mapMap<core.Map, Type>(
-          _json['paramTypes'].cast<core.String, core.Map>(),
-          (core.Map item) => Type.fromJson(item));
+          (_json['paramTypes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Type.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.Object, core.Object>(
-          _json['params'].cast<core.String, core.Object>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('partitionOptions')) {
-      partitionOptions = PartitionOptions.fromJson(_json['partitionOptions']);
+      partitionOptions = PartitionOptions.fromJson(
+          _json['partitionOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sql')) {
       sql = _json['sql'] as core.String;
     }
     if (_json.containsKey('transaction')) {
-      transaction = TransactionSelector.fromJson(_json['transaction']);
+      transaction = TransactionSelector.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6191,16 +6375,19 @@
       index = _json['index'] as core.String;
     }
     if (_json.containsKey('keySet')) {
-      keySet = KeySet.fromJson(_json['keySet']);
+      keySet = KeySet.fromJson(
+          _json['keySet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('partitionOptions')) {
-      partitionOptions = PartitionOptions.fromJson(_json['partitionOptions']);
+      partitionOptions = PartitionOptions.fromJson(
+          _json['partitionOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('table')) {
       table = _json['table'] as core.String;
     }
     if (_json.containsKey('transaction')) {
-      transaction = TransactionSelector.fromJson(_json['transaction']);
+      transaction = TransactionSelector.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6241,11 +6428,13 @@
   PartitionResponse.fromJson(core.Map _json) {
     if (_json.containsKey('partitions')) {
       partitions = (_json['partitions'] as core.List)
-          .map<Partition>((value) => Partition.fromJson(value))
+          .map<Partition>((value) =>
+              Partition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('transaction')) {
-      transaction = Transaction.fromJson(_json['transaction']);
+      transaction = Transaction.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6328,7 +6517,8 @@
   PlanNode.fromJson(core.Map _json) {
     if (_json.containsKey('childLinks')) {
       childLinks = (_json['childLinks'] as core.List)
-          .map<ChildLink>((value) => ChildLink.fromJson(value))
+          .map<ChildLink>((value) =>
+              ChildLink.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('displayName')) {
@@ -6336,7 +6526,8 @@
     }
     if (_json.containsKey('executionStats')) {
       executionStats = commons.mapMap<core.Object, core.Object>(
-          _json['executionStats'].cast<core.String, core.Object>(),
+          (_json['executionStats'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('index')) {
@@ -6347,12 +6538,13 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('shortRepresentation')) {
-      shortRepresentation =
-          ShortRepresentation.fromJson(_json['shortRepresentation']);
+      shortRepresentation = ShortRepresentation.fromJson(
+          _json['shortRepresentation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6459,7 +6651,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<Binding>((value) => Binding.fromJson(value))
+          .map<Binding>((value) =>
+              Binding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -6532,7 +6725,8 @@
   QueryPlan.fromJson(core.Map _json) {
     if (_json.containsKey('planNodes')) {
       planNodes = (_json['planNodes'] as core.List)
-          .map<PlanNode>((value) => PlanNode.fromJson(value))
+          .map<PlanNode>((value) =>
+              PlanNode.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6712,7 +6906,8 @@
       index = _json['index'] as core.String;
     }
     if (_json.containsKey('keySet')) {
-      keySet = KeySet.fromJson(_json['keySet']);
+      keySet = KeySet.fromJson(
+          _json['keySet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('limit')) {
       limit = _json['limit'] as core.String;
@@ -6727,7 +6922,8 @@
       table = _json['table'] as core.String;
     }
     if (_json.containsKey('transaction')) {
-      transaction = TransactionSelector.fromJson(_json['transaction']);
+      transaction = TransactionSelector.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6876,7 +7072,8 @@
 
   RestoreDatabaseMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('backupInfo')) {
-      backupInfo = BackupInfo.fromJson(_json['backupInfo']);
+      backupInfo = BackupInfo.fromJson(
+          _json['backupInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cancelTime')) {
       cancelTime = _json['cancelTime'] as core.String;
@@ -6889,7 +7086,8 @@
           _json['optimizeDatabaseOperationName'] as core.String;
     }
     if (_json.containsKey('progress')) {
-      progress = OperationProgress.fromJson(_json['progress']);
+      progress = OperationProgress.fromJson(
+          _json['progress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceType')) {
       sourceType = _json['sourceType'] as core.String;
@@ -6970,7 +7168,8 @@
 
   RestoreInfo.fromJson(core.Map _json) {
     if (_json.containsKey('backupInfo')) {
-      backupInfo = BackupInfo.fromJson(_json['backupInfo']);
+      backupInfo = BackupInfo.fromJson(
+          _json['backupInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceType')) {
       sourceType = _json['sourceType'] as core.String;
@@ -7015,7 +7214,8 @@
 
   ResultSet.fromJson(core.Map _json) {
     if (_json.containsKey('metadata')) {
-      metadata = ResultSetMetadata.fromJson(_json['metadata']);
+      metadata = ResultSetMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
@@ -7025,7 +7225,8 @@
           .toList();
     }
     if (_json.containsKey('stats')) {
-      stats = ResultSetStats.fromJson(_json['stats']);
+      stats = ResultSetStats.fromJson(
+          _json['stats'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7061,10 +7262,12 @@
 
   ResultSetMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('rowType')) {
-      rowType = StructType.fromJson(_json['rowType']);
+      rowType = StructType.fromJson(
+          _json['rowType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transaction')) {
-      transaction = Transaction.fromJson(_json['transaction']);
+      transaction = Transaction.fromJson(
+          _json['transaction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7105,11 +7308,13 @@
 
   ResultSetStats.fromJson(core.Map _json) {
     if (_json.containsKey('queryPlan')) {
-      queryPlan = QueryPlan.fromJson(_json['queryPlan']);
+      queryPlan = QueryPlan.fromJson(
+          _json['queryPlan'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('queryStats')) {
       queryStats = commons.mapMap<core.Object, core.Object>(
-          _json['queryStats'].cast<core.String, core.Object>(),
+          (_json['queryStats'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('rowCountExact')) {
@@ -7199,7 +7404,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -7237,7 +7443,8 @@
 
   SetIamPolicyRequest.fromJson(core.Map _json) {
     if (_json.containsKey('policy')) {
-      policy = Policy.fromJson(_json['policy']);
+      policy = Policy.fromJson(
+          _json['policy'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7270,7 +7477,8 @@
     }
     if (_json.containsKey('subqueries')) {
       subqueries = commons.mapMap<core.int, core.int>(
-          _json['subqueries'].cast<core.String, core.int>(),
+          (_json['subqueries'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.int>(),
           (core.int item) => item as core.int);
     }
   }
@@ -7317,12 +7525,15 @@
   Statement.fromJson(core.Map _json) {
     if (_json.containsKey('paramTypes')) {
       paramTypes = commons.mapMap<core.Map, Type>(
-          _json['paramTypes'].cast<core.String, core.Map>(),
-          (core.Map item) => Type.fromJson(item));
+          (_json['paramTypes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) =>
+              Type.fromJson(item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.Object, core.Object>(
-          _json['params'].cast<core.String, core.Object>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('sql')) {
@@ -7379,7 +7590,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -7417,7 +7629,8 @@
   StructType.fromJson(core.Map _json) {
     if (_json.containsKey('fields')) {
       fields = (_json['fields'] as core.List)
-          .map<Field>((value) => Field.fromJson(value))
+          .map<Field>((value) =>
+              Field.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7712,13 +7925,16 @@
 
   TransactionOptions.fromJson(core.Map _json) {
     if (_json.containsKey('partitionedDml')) {
-      partitionedDml = PartitionedDml.fromJson(_json['partitionedDml']);
+      partitionedDml = PartitionedDml.fromJson(
+          _json['partitionedDml'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readOnly')) {
-      readOnly = ReadOnly.fromJson(_json['readOnly']);
+      readOnly = ReadOnly.fromJson(
+          _json['readOnly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('readWrite')) {
-      readWrite = ReadWrite.fromJson(_json['readWrite']);
+      readWrite = ReadWrite.fromJson(
+          _json['readWrite'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7763,13 +7979,15 @@
 
   TransactionSelector.fromJson(core.Map _json) {
     if (_json.containsKey('begin')) {
-      begin = TransactionOptions.fromJson(_json['begin']);
+      begin = TransactionOptions.fromJson(
+          _json['begin'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('singleUse')) {
-      singleUse = TransactionOptions.fromJson(_json['singleUse']);
+      singleUse = TransactionOptions.fromJson(
+          _json['singleUse'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7830,13 +8048,15 @@
 
   Type.fromJson(core.Map _json) {
     if (_json.containsKey('arrayElementType')) {
-      arrayElementType = Type.fromJson(_json['arrayElementType']);
+      arrayElementType = Type.fromJson(
+          _json['arrayElementType'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('code')) {
       code = _json['code'] as core.String;
     }
     if (_json.containsKey('structType')) {
-      structType = StructType.fromJson(_json['structType']);
+      structType = StructType.fromJson(
+          _json['structType'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7981,7 +8201,8 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('instance')) {
-      instance = Instance.fromJson(_json['instance']);
+      instance = Instance.fromJson(
+          _json['instance'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -8025,7 +8246,8 @@
       fieldMask = _json['fieldMask'] as core.String;
     }
     if (_json.containsKey('instance')) {
-      instance = Instance.fromJson(_json['instance']);
+      instance = Instance.fromJson(
+          _json['instance'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/speech/v1.dart b/generated/googleapis/lib/speech/v1.dart
index 9f68a5a..9d75eed 100644
--- a/generated/googleapis/lib/speech/v1.dart
+++ b/generated/googleapis/lib/speech/v1.dart
@@ -102,7 +102,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -176,7 +178,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -254,7 +259,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -330,7 +337,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -389,7 +399,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Performs synchronous speech recognition: receive results after all audio
@@ -438,7 +450,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RecognizeResponse.fromJson(data));
+    return _response.then(
+      (data) => RecognizeResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -458,7 +473,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -542,10 +558,12 @@
 
   LongRunningRecognizeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('audio')) {
-      audio = RecognitionAudio.fromJson(_json['audio']);
+      audio = RecognitionAudio.fromJson(
+          _json['audio'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('config')) {
-      config = RecognitionConfig.fromJson(_json['config']);
+      config = RecognitionConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -576,8 +594,9 @@
   LongRunningRecognizeResponse.fromJson(core.Map _json) {
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<SpeechRecognitionResult>(
-              (value) => SpeechRecognitionResult.fromJson(value))
+          .map<SpeechRecognitionResult>((value) =>
+              SpeechRecognitionResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -635,11 +654,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -647,7 +668,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -862,8 +884,8 @@
       audioChannelCount = _json['audioChannelCount'] as core.int;
     }
     if (_json.containsKey('diarizationConfig')) {
-      diarizationConfig =
-          SpeakerDiarizationConfig.fromJson(_json['diarizationConfig']);
+      diarizationConfig = SpeakerDiarizationConfig.fromJson(
+          _json['diarizationConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('enableAutomaticPunctuation')) {
       enableAutomaticPunctuation =
@@ -886,7 +908,8 @@
       maxAlternatives = _json['maxAlternatives'] as core.int;
     }
     if (_json.containsKey('metadata')) {
-      metadata = RecognitionMetadata.fromJson(_json['metadata']);
+      metadata = RecognitionMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('model')) {
       model = _json['model'] as core.String;
@@ -899,7 +922,8 @@
     }
     if (_json.containsKey('speechContexts')) {
       speechContexts = (_json['speechContexts'] as core.List)
-          .map<SpeechContext>((value) => SpeechContext.fromJson(value))
+          .map<SpeechContext>((value) => SpeechContext.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('useEnhanced')) {
@@ -1102,10 +1126,12 @@
 
   RecognizeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('audio')) {
-      audio = RecognitionAudio.fromJson(_json['audio']);
+      audio = RecognitionAudio.fromJson(
+          _json['audio'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('config')) {
-      config = RecognitionConfig.fromJson(_json['config']);
+      config = RecognitionConfig.fromJson(
+          _json['config'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1134,8 +1160,9 @@
   RecognizeResponse.fromJson(core.Map _json) {
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<SpeechRecognitionResult>(
-              (value) => SpeechRecognitionResult.fromJson(value))
+          .map<SpeechRecognitionResult>((value) =>
+              SpeechRecognitionResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1268,7 +1295,8 @@
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<WordInfo>((value) => WordInfo.fromJson(value))
+          .map<WordInfo>((value) =>
+              WordInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1306,8 +1334,9 @@
   SpeechRecognitionResult.fromJson(core.Map _json) {
     if (_json.containsKey('alternatives')) {
       alternatives = (_json['alternatives'] as core.List)
-          .map<SpeechRecognitionAlternative>(
-              (value) => SpeechRecognitionAlternative.fromJson(value))
+          .map<SpeechRecognitionAlternative>((value) =>
+              SpeechRecognitionAlternative.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('channelTag')) {
@@ -1360,7 +1389,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/storage/v1.dart b/generated/googleapis/lib/storage/v1.dart
index 93cc921..d5c9bb2 100644
--- a/generated/googleapis/lib/storage/v1.dart
+++ b/generated/googleapis/lib/storage/v1.dart
@@ -159,7 +159,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns the ACL entry for the specified entity on the specified bucket.
@@ -232,7 +234,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BucketAccessControl.fromJson(data));
+    return _response.then(
+      (data) => BucketAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new ACL entry on the specified bucket.
@@ -300,7 +305,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BucketAccessControl.fromJson(data));
+    return _response.then(
+      (data) => BucketAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves ACL entries on the specified bucket.
@@ -362,7 +370,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BucketAccessControls.fromJson(data));
+    return _response.then(
+      (data) => BucketAccessControls.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches an ACL entry on the specified bucket.
@@ -441,7 +452,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BucketAccessControl.fromJson(data));
+    return _response.then(
+      (data) => BucketAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an ACL entry on the specified bucket.
@@ -520,7 +534,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BucketAccessControl.fromJson(data));
+    return _response.then(
+      (data) => BucketAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -602,7 +619,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns metadata for the specified bucket.
@@ -689,7 +708,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bucket.fromJson(data));
+    return _response.then(
+      (data) => Bucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns an IAM policy for the specified bucket.
@@ -761,7 +782,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new bucket.
@@ -876,7 +899,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bucket.fromJson(data));
+    return _response.then(
+      (data) => Bucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of buckets for a given project.
@@ -967,7 +992,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Buckets.fromJson(data));
+    return _response.then(
+      (data) => Buckets.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Locks retention policy on a bucket.
@@ -1039,7 +1066,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bucket.fromJson(data));
+    return _response.then(
+      (data) => Bucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a bucket. Changes to the bucket will be readable immediately after
@@ -1169,7 +1198,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bucket.fromJson(data));
+    return _response.then(
+      (data) => Bucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an IAM policy for the specified bucket.
@@ -1237,7 +1268,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Tests a set of permissions on the given bucket to see which, if any, are
@@ -1309,7 +1342,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a bucket. Changes to the bucket will be readable immediately after
@@ -1439,7 +1475,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Bucket.fromJson(data));
+    return _response.then(
+      (data) => Bucket.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1493,7 +1531,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -1574,7 +1614,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns the default object ACL entry for the specified entity on the
@@ -1648,7 +1690,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new default object ACL entry on the specified bucket.
@@ -1717,7 +1762,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves default object ACL entries on the specified bucket.
@@ -1794,7 +1842,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControls.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControls.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches a default object ACL entry on the specified bucket.
@@ -1873,7 +1924,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a default object ACL entry on the specified bucket.
@@ -1952,7 +2006,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2029,7 +2086,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// View a notification configuration.
@@ -2100,7 +2159,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Notification.fromJson(data));
+    return _response.then(
+      (data) =>
+          Notification.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a notification subscription for a given bucket.
@@ -2170,7 +2232,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Notification.fromJson(data));
+    return _response.then(
+      (data) =>
+          Notification.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of notification subscriptions for a given bucket.
@@ -2234,7 +2299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Notifications.fromJson(data));
+    return _response.then(
+      (data) =>
+          Notifications.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2331,7 +2399,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns the ACL entry for the specified entity on the specified object.
@@ -2420,7 +2490,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new ACL entry on the specified object.
@@ -2506,7 +2579,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves ACL entries on the specified object.
@@ -2586,7 +2662,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControls.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControls.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches an ACL entry on the specified object.
@@ -2681,7 +2760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an ACL entry on the specified object.
@@ -2776,7 +2858,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ObjectAccessControl.fromJson(data));
+    return _response.then(
+      (data) => ObjectAccessControl.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2906,7 +2991,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Object.fromJson(data));
+    return _response.then(
+      (data) => Object.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Copies a source object to a destination object. Optionally overrides
@@ -3117,7 +3204,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Object.fromJson(data));
+    return _response.then(
+      (data) => Object.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an object and its metadata. Deletions are permanent if versioning
@@ -3228,7 +3317,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves an object or its metadata.
@@ -3360,7 +3451,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => Object.fromJson(data));
+      return _response.then(
+        (data) => Object.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -3443,7 +3536,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stores a new object and metadata.
@@ -3621,7 +3716,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Object.fromJson(data));
+    return _response.then(
+      (data) => Object.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of objects matching the criteria.
@@ -3758,7 +3855,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Objects.fromJson(data));
+    return _response.then(
+      (data) => Objects.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Patches an object's metadata.
@@ -3902,7 +4001,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Object.fromJson(data));
+    return _response.then(
+      (data) => Object.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Rewrites a source object to a destination object. Optionally overrides
@@ -4133,7 +4234,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RewriteResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          RewriteResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an IAM policy for the specified object.
@@ -4219,7 +4323,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Policy.fromJson(data));
+    return _response.then(
+      (data) => Policy.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Tests a set of permissions on the given object to see which, if any, are
@@ -4307,7 +4413,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestIamPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => TestIamPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an object's metadata.
@@ -4451,7 +4560,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Object.fromJson(data));
+    return _response.then(
+      (data) => Object.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Watch for changes on all objects in a bucket.
@@ -4594,7 +4705,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4674,7 +4787,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HmacKey.fromJson(data));
+    return _response.then(
+      (data) => HmacKey.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an HMAC key.
@@ -4737,7 +4852,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves an HMAC key's metadata
@@ -4800,7 +4917,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HmacKeyMetadata.fromJson(data));
+    return _response.then(
+      (data) =>
+          HmacKeyMetadata.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of HMAC keys matching the criteria.
@@ -4886,7 +5006,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HmacKeysMetadata.fromJson(data));
+    return _response.then(
+      (data) => HmacKeysMetadata.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the state of an HMAC key. See the HMAC Key resource descriptor for
@@ -4956,7 +5079,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HmacKeyMetadata.fromJson(data));
+    return _response.then(
+      (data) =>
+          HmacKeyMetadata.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5027,7 +5153,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ServiceAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          ServiceAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5225,12 +5354,13 @@
   BucketIamConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('bucketPolicyOnly')) {
       bucketPolicyOnly = BucketIamConfigurationBucketPolicyOnly.fromJson(
-          _json['bucketPolicyOnly']);
+          _json['bucketPolicyOnly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uniformBucketLevelAccess')) {
       uniformBucketLevelAccess =
           BucketIamConfigurationUniformBucketLevelAccess.fromJson(
-              _json['uniformBucketLevelAccess']);
+              _json['uniformBucketLevelAccess']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5426,10 +5556,12 @@
 
   BucketLifecycleRule.fromJson(core.Map _json) {
     if (_json.containsKey('action')) {
-      action = BucketLifecycleRuleAction.fromJson(_json['action']);
+      action = BucketLifecycleRuleAction.fromJson(
+          _json['action'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('condition')) {
-      condition = BucketLifecycleRuleCondition.fromJson(_json['condition']);
+      condition = BucketLifecycleRuleCondition.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5457,8 +5589,8 @@
   BucketLifecycle.fromJson(core.Map _json) {
     if (_json.containsKey('rule')) {
       rule = (_json['rule'] as core.List)
-          .map<BucketLifecycleRule>(
-              (value) => BucketLifecycleRule.fromJson(value))
+          .map<BucketLifecycleRule>((value) => BucketLifecycleRule.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5773,16 +5905,18 @@
   Bucket.fromJson(core.Map _json) {
     if (_json.containsKey('acl')) {
       acl = (_json['acl'] as core.List)
-          .map<BucketAccessControl>(
-              (value) => BucketAccessControl.fromJson(value))
+          .map<BucketAccessControl>((value) => BucketAccessControl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('billing')) {
-      billing = BucketBilling.fromJson(_json['billing']);
+      billing = BucketBilling.fromJson(
+          _json['billing'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cors')) {
       cors = (_json['cors'] as core.List)
-          .map<BucketCors>((value) => BucketCors.fromJson(value))
+          .map<BucketCors>((value) =>
+              BucketCors.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('defaultEventBasedHold')) {
@@ -5790,19 +5924,20 @@
     }
     if (_json.containsKey('defaultObjectAcl')) {
       defaultObjectAcl = (_json['defaultObjectAcl'] as core.List)
-          .map<ObjectAccessControl>(
-              (value) => ObjectAccessControl.fromJson(value))
+          .map<ObjectAccessControl>((value) => ObjectAccessControl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('encryption')) {
-      encryption = BucketEncryption.fromJson(_json['encryption']);
+      encryption = BucketEncryption.fromJson(
+          _json['encryption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('iamConfiguration')) {
-      iamConfiguration =
-          BucketIamConfiguration.fromJson(_json['iamConfiguration']);
+      iamConfiguration = BucketIamConfiguration.fromJson(
+          _json['iamConfiguration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -5812,11 +5947,13 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('lifecycle')) {
-      lifecycle = BucketLifecycle.fromJson(_json['lifecycle']);
+      lifecycle = BucketLifecycle.fromJson(
+          _json['lifecycle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('location')) {
       location = _json['location'] as core.String;
@@ -5825,7 +5962,8 @@
       locationType = _json['locationType'] as core.String;
     }
     if (_json.containsKey('logging')) {
-      logging = BucketLogging.fromJson(_json['logging']);
+      logging = BucketLogging.fromJson(
+          _json['logging'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metageneration')) {
       metageneration = _json['metageneration'] as core.String;
@@ -5834,14 +5972,15 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('owner')) {
-      owner = BucketOwner.fromJson(_json['owner']);
+      owner = BucketOwner.fromJson(
+          _json['owner'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectNumber')) {
       projectNumber = _json['projectNumber'] as core.String;
     }
     if (_json.containsKey('retentionPolicy')) {
-      retentionPolicy =
-          BucketRetentionPolicy.fromJson(_json['retentionPolicy']);
+      retentionPolicy = BucketRetentionPolicy.fromJson(
+          _json['retentionPolicy'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('selfLink')) {
       selfLink = _json['selfLink'] as core.String;
@@ -5856,10 +5995,12 @@
       updated = core.DateTime.parse(_json['updated'] as core.String);
     }
     if (_json.containsKey('versioning')) {
-      versioning = BucketVersioning.fromJson(_json['versioning']);
+      versioning = BucketVersioning.fromJson(
+          _json['versioning'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('website')) {
-      website = BucketWebsite.fromJson(_json['website']);
+      website = BucketWebsite.fromJson(
+          _json['website'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('zoneAffinity')) {
       zoneAffinity = (_json['zoneAffinity'] as core.List)
@@ -6064,8 +6205,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('projectTeam')) {
-      projectTeam =
-          BucketAccessControlProjectTeam.fromJson(_json['projectTeam']);
+      projectTeam = BucketAccessControlProjectTeam.fromJson(
+          _json['projectTeam'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('role')) {
       role = _json['role'] as core.String;
@@ -6128,8 +6269,8 @@
   BucketAccessControls.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<BucketAccessControl>(
-              (value) => BucketAccessControl.fromJson(value))
+          .map<BucketAccessControl>((value) => BucketAccessControl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6167,7 +6308,8 @@
   Buckets.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Bucket>((value) => Bucket.fromJson(value))
+          .map<Bucket>((value) =>
+              Bucket.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6246,7 +6388,8 @@
     }
     if (_json.containsKey('params')) {
       params = commons.mapMap<core.String, core.String>(
-          _json['params'].cast<core.String, core.String>(),
+          (_json['params'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('payload')) {
@@ -6349,7 +6492,8 @@
     if (_json.containsKey('objectPreconditions')) {
       objectPreconditions =
           ComposeRequestSourceObjectsObjectPreconditions.fromJson(
-              _json['objectPreconditions']);
+              _json['objectPreconditions']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6383,15 +6527,17 @@
 
   ComposeRequest.fromJson(core.Map _json) {
     if (_json.containsKey('destination')) {
-      destination = Object.fromJson(_json['destination']);
+      destination = Object.fromJson(
+          _json['destination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('sourceObjects')) {
       sourceObjects = (_json['sourceObjects'] as core.List)
-          .map<ComposeRequestSourceObjects>(
-              (value) => ComposeRequestSourceObjects.fromJson(value))
+          .map<ComposeRequestSourceObjects>((value) =>
+              ComposeRequestSourceObjects.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6487,7 +6633,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('metadata')) {
-      metadata = HmacKeyMetadata.fromJson(_json['metadata']);
+      metadata = HmacKeyMetadata.fromJson(
+          _json['metadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('secret')) {
       secret = _json['secret'] as core.String;
@@ -6631,7 +6778,8 @@
   HmacKeysMetadata.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<HmacKeyMetadata>((value) => HmacKeyMetadata.fromJson(value))
+          .map<HmacKeyMetadata>((value) => HmacKeyMetadata.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6696,7 +6844,8 @@
   Notification.fromJson(core.Map _json) {
     if (_json.containsKey('custom_attributes')) {
       customAttributes = commons.mapMap<core.String, core.String>(
-          _json['custom_attributes'].cast<core.String, core.String>(),
+          (_json['custom_attributes'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('etag')) {
@@ -6774,7 +6923,8 @@
   Notifications.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Notification>((value) => Notification.fromJson(value))
+          .map<Notification>((value) => Notification.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -6996,8 +7146,8 @@
   Object.fromJson(core.Map _json) {
     if (_json.containsKey('acl')) {
       acl = (_json['acl'] as core.List)
-          .map<ObjectAccessControl>(
-              (value) => ObjectAccessControl.fromJson(value))
+          .map<ObjectAccessControl>((value) => ObjectAccessControl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bucket')) {
@@ -7028,8 +7178,8 @@
       customTime = core.DateTime.parse(_json['customTime'] as core.String);
     }
     if (_json.containsKey('customerEncryption')) {
-      customerEncryption =
-          ObjectCustomerEncryption.fromJson(_json['customerEncryption']);
+      customerEncryption = ObjectCustomerEncryption.fromJson(
+          _json['customerEncryption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -7057,7 +7207,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.String, core.String>(
-          _json['metadata'].cast<core.String, core.String>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('metageneration')) {
@@ -7067,7 +7218,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('owner')) {
-      owner = ObjectOwner.fromJson(_json['owner']);
+      owner = ObjectOwner.fromJson(
+          _json['owner'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('retentionExpirationTime')) {
       retentionExpirationTime =
@@ -7324,8 +7476,8 @@
       object = _json['object'] as core.String;
     }
     if (_json.containsKey('projectTeam')) {
-      projectTeam =
-          ObjectAccessControlProjectTeam.fromJson(_json['projectTeam']);
+      projectTeam = ObjectAccessControlProjectTeam.fromJson(
+          _json['projectTeam'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('role')) {
       role = _json['role'] as core.String;
@@ -7394,8 +7546,8 @@
   ObjectAccessControls.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ObjectAccessControl>(
-              (value) => ObjectAccessControl.fromJson(value))
+          .map<ObjectAccessControl>((value) => ObjectAccessControl.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7437,7 +7589,8 @@
   Objects.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Object>((value) => Object.fromJson(value))
+          .map<Object>((value) =>
+              Object.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7531,7 +7684,8 @@
 
   PolicyBindings.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
-      condition = Expr.fromJson(_json['condition']);
+      condition = Expr.fromJson(
+          _json['condition'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('members')) {
       members = (_json['members'] as core.List)
@@ -7594,7 +7748,8 @@
   Policy.fromJson(core.Map _json) {
     if (_json.containsKey('bindings')) {
       bindings = (_json['bindings'] as core.List)
-          .map<PolicyBindings>((value) => PolicyBindings.fromJson(value))
+          .map<PolicyBindings>((value) => PolicyBindings.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('etag')) {
@@ -7671,7 +7826,8 @@
       objectSize = _json['objectSize'] as core.String;
     }
     if (_json.containsKey('resource')) {
-      resource = Object.fromJson(_json['resource']);
+      resource = Object.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('rewriteToken')) {
       rewriteToken = _json['rewriteToken'] as core.String;
diff --git a/generated/googleapis/lib/storagetransfer/v1.dart b/generated/googleapis/lib/storagetransfer/v1.dart
index e5ff85a..cd00313 100644
--- a/generated/googleapis/lib/storagetransfer/v1.dart
+++ b/generated/googleapis/lib/storagetransfer/v1.dart
@@ -112,7 +112,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleServiceAccount.fromJson(data));
+    return _response.then(
+      (data) => GoogleServiceAccount.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -166,7 +169,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferJob.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a transfer job.
@@ -222,7 +228,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferJob.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists transfer jobs.
@@ -289,7 +298,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTransferJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTransferJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a transfer job. Updating a job's transfer spec does not affect
@@ -347,7 +359,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TransferJob.fromJson(data));
+    return _response.then(
+      (data) =>
+          TransferJob.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -426,7 +441,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -477,7 +494,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists transfer operations.
@@ -553,7 +572,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Pauses a transfer operation.
@@ -608,7 +630,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resumes a transfer operation that is paused.
@@ -663,7 +687,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -716,7 +742,8 @@
 
   AwsS3Data.fromJson(core.Map _json) {
     if (_json.containsKey('awsAccessKey')) {
-      awsAccessKey = AwsAccessKey.fromJson(_json['awsAccessKey']);
+      awsAccessKey = AwsAccessKey.fromJson(
+          _json['awsAccessKey'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bucketName')) {
       bucketName = _json['bucketName'] as core.String;
@@ -757,7 +784,8 @@
 
   AzureBlobStorageData.fromJson(core.Map _json) {
     if (_json.containsKey('azureCredentials')) {
-      azureCredentials = AzureCredentials.fromJson(_json['azureCredentials']);
+      azureCredentials = AzureCredentials.fromJson(
+          _json['azureCredentials'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('container')) {
       container = _json['container'] as core.String;
@@ -1027,7 +1055,8 @@
     }
     if (_json.containsKey('errorLogEntries')) {
       errorLogEntries = (_json['errorLogEntries'] as core.List)
-          .map<ErrorLogEntry>((value) => ErrorLogEntry.fromJson(value))
+          .map<ErrorLogEntry>((value) => ErrorLogEntry.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1160,7 +1189,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1193,7 +1223,8 @@
     }
     if (_json.containsKey('transferJobs')) {
       transferJobs = (_json['transferJobs'] as core.List)
-          .map<TransferJob>((value) => TransferJob.fromJson(value))
+          .map<TransferJob>((value) => TransferJob.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1430,11 +1461,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1442,7 +1475,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1533,13 +1567,16 @@
 
   Schedule.fromJson(core.Map _json) {
     if (_json.containsKey('scheduleEndDate')) {
-      scheduleEndDate = Date.fromJson(_json['scheduleEndDate']);
+      scheduleEndDate = Date.fromJson(
+          _json['scheduleEndDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scheduleStartDate')) {
-      scheduleStartDate = Date.fromJson(_json['scheduleStartDate']);
+      scheduleStartDate = Date.fromJson(
+          _json['scheduleStartDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTimeOfDay')) {
-      startTimeOfDay = TimeOfDay.fromJson(_json['startTimeOfDay']);
+      startTimeOfDay = TimeOfDay.fromJson(
+          _json['startTimeOfDay'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1590,7 +1627,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -1912,20 +1950,22 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('notificationConfig')) {
-      notificationConfig =
-          NotificationConfig.fromJson(_json['notificationConfig']);
+      notificationConfig = NotificationConfig.fromJson(
+          _json['notificationConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('schedule')) {
-      schedule = Schedule.fromJson(_json['schedule']);
+      schedule = Schedule.fromJson(
+          _json['schedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
     }
     if (_json.containsKey('transferSpec')) {
-      transferSpec = TransferSpec.fromJson(_json['transferSpec']);
+      transferSpec = TransferSpec.fromJson(
+          _json['transferSpec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2010,22 +2050,24 @@
 
   TransferOperation.fromJson(core.Map _json) {
     if (_json.containsKey('counters')) {
-      counters = TransferCounters.fromJson(_json['counters']);
+      counters = TransferCounters.fromJson(
+          _json['counters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('errorBreakdowns')) {
       errorBreakdowns = (_json['errorBreakdowns'] as core.List)
-          .map<ErrorSummary>((value) => ErrorSummary.fromJson(value))
+          .map<ErrorSummary>((value) => ErrorSummary.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('notificationConfig')) {
-      notificationConfig =
-          NotificationConfig.fromJson(_json['notificationConfig']);
+      notificationConfig = NotificationConfig.fromJson(
+          _json['notificationConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectId')) {
       projectId = _json['projectId'] as core.String;
@@ -2040,7 +2082,8 @@
       transferJobName = _json['transferJobName'] as core.String;
     }
     if (_json.containsKey('transferSpec')) {
-      transferSpec = TransferSpec.fromJson(_json['transferSpec']);
+      transferSpec = TransferSpec.fromJson(
+          _json['transferSpec'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2161,26 +2204,33 @@
 
   TransferSpec.fromJson(core.Map _json) {
     if (_json.containsKey('awsS3DataSource')) {
-      awsS3DataSource = AwsS3Data.fromJson(_json['awsS3DataSource']);
+      awsS3DataSource = AwsS3Data.fromJson(
+          _json['awsS3DataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('azureBlobStorageDataSource')) {
-      azureBlobStorageDataSource =
-          AzureBlobStorageData.fromJson(_json['azureBlobStorageDataSource']);
+      azureBlobStorageDataSource = AzureBlobStorageData.fromJson(
+          _json['azureBlobStorageDataSource']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gcsDataSink')) {
-      gcsDataSink = GcsData.fromJson(_json['gcsDataSink']);
+      gcsDataSink = GcsData.fromJson(
+          _json['gcsDataSink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('gcsDataSource')) {
-      gcsDataSource = GcsData.fromJson(_json['gcsDataSource']);
+      gcsDataSource = GcsData.fromJson(
+          _json['gcsDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('httpDataSource')) {
-      httpDataSource = HttpData.fromJson(_json['httpDataSource']);
+      httpDataSource = HttpData.fromJson(
+          _json['httpDataSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectConditions')) {
-      objectConditions = ObjectConditions.fromJson(_json['objectConditions']);
+      objectConditions = ObjectConditions.fromJson(
+          _json['objectConditions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('transferOptions')) {
-      transferOptions = TransferOptions.fromJson(_json['transferOptions']);
+      transferOptions = TransferOptions.fromJson(
+          _json['transferOptions'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2239,7 +2289,8 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('transferJob')) {
-      transferJob = TransferJob.fromJson(_json['transferJob']);
+      transferJob = TransferJob.fromJson(
+          _json['transferJob'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTransferJobFieldMask')) {
       updateTransferJobFieldMask =
diff --git a/generated/googleapis/lib/streetviewpublish/v1.dart b/generated/googleapis/lib/streetviewpublish/v1.dart
index 8da5850..48e4adc 100644
--- a/generated/googleapis/lib/streetviewpublish/v1.dart
+++ b/generated/googleapis/lib/streetviewpublish/v1.dart
@@ -111,7 +111,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Photo.fromJson(data));
+    return _response.then(
+      (data) => Photo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Photo and its metadata. This method returns the following error
@@ -162,7 +164,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the metadata of the specified Photo. This method returns the
@@ -236,7 +240,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Photo.fromJson(data));
+    return _response.then(
+      (data) => Photo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates an upload session to start uploading photo bytes. The method uses
@@ -296,7 +302,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UploadRef.fromJson(data));
+    return _response.then(
+      (data) => UploadRef.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the metadata of a Photo, such as pose, place association,
@@ -374,7 +382,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Photo.fromJson(data));
+    return _response.then(
+      (data) => Photo.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -433,7 +443,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchDeletePhotosResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchDeletePhotosResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the metadata of the specified Photo batch. Note that if
@@ -509,7 +522,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchGetPhotosResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchGetPhotosResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the metadata of Photos, such as pose, place association,
@@ -569,7 +585,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchUpdatePhotosResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchUpdatePhotosResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all the Photos that belong to the user. *Note:* Recently created
@@ -659,7 +678,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListPhotosResponse.fromJson(data));
+    return _response.then(
+      (data) => ListPhotosResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -699,7 +721,8 @@
   BatchDeletePhotosResponse.fromJson(core.Map _json) {
     if (_json.containsKey('status')) {
       status = (_json['status'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -724,7 +747,8 @@
   BatchGetPhotosResponse.fromJson(core.Map _json) {
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<PhotoResponse>((value) => PhotoResponse.fromJson(value))
+          .map<PhotoResponse>((value) => PhotoResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -749,8 +773,8 @@
   BatchUpdatePhotosRequest.fromJson(core.Map _json) {
     if (_json.containsKey('updatePhotoRequests')) {
       updatePhotoRequests = (_json['updatePhotoRequests'] as core.List)
-          .map<UpdatePhotoRequest>(
-              (value) => UpdatePhotoRequest.fromJson(value))
+          .map<UpdatePhotoRequest>((value) => UpdatePhotoRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -776,7 +800,8 @@
   BatchUpdatePhotosResponse.fromJson(core.Map _json) {
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<PhotoResponse>((value) => PhotoResponse.fromJson(value))
+          .map<PhotoResponse>((value) => PhotoResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -800,7 +825,8 @@
 
   Connection.fromJson(core.Map _json) {
     if (_json.containsKey('target')) {
-      target = PhotoId.fromJson(_json['target']);
+      target = PhotoId.fromJson(
+          _json['target'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -918,7 +944,8 @@
     }
     if (_json.containsKey('photos')) {
       photos = (_json['photos'] as core.List)
-          .map<Photo>((value) => Photo.fromJson(value))
+          .map<Photo>((value) =>
+              Photo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -979,11 +1006,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -991,7 +1020,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1086,7 +1116,8 @@
     }
     if (_json.containsKey('connections')) {
       connections = (_json['connections'] as core.List)
-          .map<Connection>((value) => Connection.fromJson(value))
+          .map<Connection>((value) =>
+              Connection.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('downloadUrl')) {
@@ -1096,15 +1127,18 @@
       mapsPublishStatus = _json['mapsPublishStatus'] as core.String;
     }
     if (_json.containsKey('photoId')) {
-      photoId = PhotoId.fromJson(_json['photoId']);
+      photoId = PhotoId.fromJson(
+          _json['photoId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('places')) {
       places = (_json['places'] as core.List)
-          .map<Place>((value) => Place.fromJson(value))
+          .map<Place>((value) =>
+              Place.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pose')) {
-      pose = Pose.fromJson(_json['pose']);
+      pose =
+          Pose.fromJson(_json['pose'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('shareLink')) {
       shareLink = _json['shareLink'] as core.String;
@@ -1116,7 +1150,8 @@
       transferStatus = _json['transferStatus'] as core.String;
     }
     if (_json.containsKey('uploadReference')) {
-      uploadReference = UploadRef.fromJson(_json['uploadReference']);
+      uploadReference = UploadRef.fromJson(
+          _json['uploadReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('viewCount')) {
       viewCount = _json['viewCount'] as core.String;
@@ -1202,10 +1237,12 @@
 
   PhotoResponse.fromJson(core.Map _json) {
     if (_json.containsKey('photo')) {
-      photo = Photo.fromJson(_json['photo']);
+      photo =
+          Photo.fromJson(_json['photo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1316,10 +1353,12 @@
       heading = (_json['heading'] as core.num).toDouble();
     }
     if (_json.containsKey('latLngPair')) {
-      latLngPair = LatLng.fromJson(_json['latLngPair']);
+      latLngPair = LatLng.fromJson(
+          _json['latLngPair'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('level')) {
-      level = Level.fromJson(_json['level']);
+      level =
+          Level.fromJson(_json['level'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pitch')) {
       pitch = (_json['pitch'] as core.num).toDouble();
@@ -1388,7 +1427,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -1435,7 +1475,8 @@
 
   UpdatePhotoRequest.fromJson(core.Map _json) {
     if (_json.containsKey('photo')) {
-      photo = Photo.fromJson(_json['photo']);
+      photo =
+          Photo.fromJson(_json['photo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateMask')) {
       updateMask = _json['updateMask'] as core.String;
diff --git a/generated/googleapis/lib/tagmanager/v1.dart b/generated/googleapis/lib/tagmanager/v1.dart
index 0d85682..058ba0c 100644
--- a/generated/googleapis/lib/tagmanager/v1.dart
+++ b/generated/googleapis/lib/tagmanager/v1.dart
@@ -129,7 +129,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Accounts that a user has access to.
@@ -171,7 +173,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Account.
@@ -233,7 +238,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -314,7 +321,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Container.fromJson(data));
+    return _response.then(
+      (data) => Container.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Container.
@@ -371,7 +380,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a Container.
@@ -428,7 +439,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Container.fromJson(data));
+    return _response.then(
+      (data) => Container.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Containers that belongs to a GTM Account.
@@ -478,7 +491,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListContainersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListContainersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Container.
@@ -548,7 +564,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Container.fromJson(data));
+    return _response.then(
+      (data) => Container.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -619,7 +637,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Environment.
@@ -684,7 +705,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Environment.
@@ -749,7 +772,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Environments of a GTM Container.
@@ -807,7 +833,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListEnvironmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListEnvironmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Environment.
@@ -885,7 +914,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -959,7 +991,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Folder.
@@ -1024,7 +1058,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Folder.
@@ -1089,7 +1125,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Folders of a Container.
@@ -1147,7 +1185,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFoldersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFoldersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Folder.
@@ -1225,7 +1266,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1298,7 +1341,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FolderEntities.fromJson(data));
+    return _response.then(
+      (data) =>
+          FolderEntities.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1394,7 +1440,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -1473,7 +1521,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1544,7 +1595,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tag.fromJson(data));
+    return _response.then(
+      (data) => Tag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Tag.
@@ -1609,7 +1662,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Tag.
@@ -1674,7 +1729,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tag.fromJson(data));
+    return _response.then(
+      (data) => Tag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Tags of a Container.
@@ -1732,7 +1789,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTagsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTagsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Tag.
@@ -1810,7 +1870,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tag.fromJson(data));
+    return _response.then(
+      (data) => Tag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1881,7 +1943,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Trigger.fromJson(data));
+    return _response.then(
+      (data) => Trigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Trigger.
@@ -1946,7 +2010,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Trigger.
@@ -2011,7 +2077,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Trigger.fromJson(data));
+    return _response.then(
+      (data) => Trigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Triggers of a Container.
@@ -2069,7 +2137,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTriggersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTriggersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Trigger.
@@ -2147,7 +2218,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Trigger.fromJson(data));
+    return _response.then(
+      (data) => Trigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2218,7 +2291,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variable.fromJson(data));
+    return _response.then(
+      (data) => Variable.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Variable.
@@ -2283,7 +2358,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Variable.
@@ -2348,7 +2425,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variable.fromJson(data));
+    return _response.then(
+      (data) => Variable.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Variables of a Container.
@@ -2406,7 +2485,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListVariablesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListVariablesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Variable.
@@ -2484,7 +2566,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variable.fromJson(data));
+    return _response.then(
+      (data) => Variable.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2555,8 +2639,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CreateContainerVersionResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateContainerVersionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Container Version.
@@ -2621,7 +2707,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a Container Version.
@@ -2687,7 +2775,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Container Versions of a GTM Container.
@@ -2757,8 +2848,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListContainerVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListContainerVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Publishes a Container Version.
@@ -2831,8 +2924,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PublishContainerVersionResponse.fromJson(data));
+    return _response.then(
+      (data) => PublishContainerVersionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Restores a Container Version. This will overwrite the container's current
@@ -2901,7 +2996,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a Container Version.
@@ -2967,7 +3065,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Container Version.
@@ -3045,7 +3146,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3108,7 +3212,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserAccess.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserAccess.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a user from the account, revoking access to it and all of its
@@ -3166,7 +3273,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a user's Account & Container Permissions.
@@ -3223,7 +3332,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserAccess.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserAccess.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all users that have access to the account along with Account and
@@ -3274,7 +3386,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAccountUsersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAccountUsersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a user's Account & Container Permissions.
@@ -3337,7 +3452,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserAccess.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserAccess.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3455,7 +3573,8 @@
   Condition.fromJson(core.Map _json) {
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -3699,7 +3818,8 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('container')) {
-      container = Container.fromJson(_json['container']);
+      container = Container.fromJson(
+          _json['container'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('containerId')) {
       containerId = _json['containerId'] as core.String;
@@ -3715,12 +3835,14 @@
     }
     if (_json.containsKey('folder')) {
       folder = (_json['folder'] as core.List)
-          .map<Folder>((value) => Folder.fromJson(value))
+          .map<Folder>((value) =>
+              Folder.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('macro')) {
       macro = (_json['macro'] as core.List)
-          .map<Macro>((value) => Macro.fromJson(value))
+          .map<Macro>((value) =>
+              Macro.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3731,22 +3853,26 @@
     }
     if (_json.containsKey('rule')) {
       rule = (_json['rule'] as core.List)
-          .map<Rule>((value) => Rule.fromJson(value))
+          .map<Rule>((value) =>
+              Rule.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tag')) {
       tag = (_json['tag'] as core.List)
-          .map<Tag>((value) => Tag.fromJson(value))
+          .map<Tag>((value) =>
+              Tag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('trigger')) {
       trigger = (_json['trigger'] as core.List)
-          .map<Trigger>((value) => Trigger.fromJson(value))
+          .map<Trigger>((value) =>
+              Trigger.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('variable')) {
       variable = (_json['variable'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3958,7 +4084,8 @@
       compilerError = _json['compilerError'] as core.bool;
     }
     if (_json.containsKey('containerVersion')) {
-      containerVersion = ContainerVersion.fromJson(_json['containerVersion']);
+      containerVersion = ContainerVersion.fromJson(
+          _json['containerVersion'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4190,17 +4317,20 @@
   FolderEntities.fromJson(core.Map _json) {
     if (_json.containsKey('tag')) {
       tag = (_json['tag'] as core.List)
-          .map<Tag>((value) => Tag.fromJson(value))
+          .map<Tag>((value) =>
+              Tag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('trigger')) {
       trigger = (_json['trigger'] as core.List)
-          .map<Trigger>((value) => Trigger.fromJson(value))
+          .map<Trigger>((value) =>
+              Trigger.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('variable')) {
       variable = (_json['variable'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4230,7 +4360,8 @@
   ListAccountUsersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('userAccess')) {
       userAccess = (_json['userAccess'] as core.List)
-          .map<UserAccess>((value) => UserAccess.fromJson(value))
+          .map<UserAccess>((value) =>
+              UserAccess.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4254,7 +4385,8 @@
   ListAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accounts')) {
       accounts = (_json['accounts'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4281,13 +4413,15 @@
   ListContainerVersionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('containerVersion')) {
       containerVersion = (_json['containerVersion'] as core.List)
-          .map<ContainerVersion>((value) => ContainerVersion.fromJson(value))
+          .map<ContainerVersion>((value) => ContainerVersion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('containerVersionHeader')) {
       containerVersionHeader = (_json['containerVersionHeader'] as core.List)
-          .map<ContainerVersionHeader>(
-              (value) => ContainerVersionHeader.fromJson(value))
+          .map<ContainerVersionHeader>((value) =>
+              ContainerVersionHeader.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4316,7 +4450,8 @@
   ListContainersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('containers')) {
       containers = (_json['containers'] as core.List)
-          .map<Container>((value) => Container.fromJson(value))
+          .map<Container>((value) =>
+              Container.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4340,7 +4475,8 @@
   ListEnvironmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('environments')) {
       environments = (_json['environments'] as core.List)
-          .map<Environment>((value) => Environment.fromJson(value))
+          .map<Environment>((value) => Environment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4365,7 +4501,8 @@
   ListFoldersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('folders')) {
       folders = (_json['folders'] as core.List)
-          .map<Folder>((value) => Folder.fromJson(value))
+          .map<Folder>((value) =>
+              Folder.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4389,7 +4526,8 @@
   ListTagsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('tags')) {
       tags = (_json['tags'] as core.List)
-          .map<Tag>((value) => Tag.fromJson(value))
+          .map<Tag>((value) =>
+              Tag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4413,7 +4551,8 @@
   ListTriggersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('triggers')) {
       triggers = (_json['triggers'] as core.List)
-          .map<Trigger>((value) => Trigger.fromJson(value))
+          .map<Trigger>((value) =>
+              Trigger.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4437,7 +4576,8 @@
   ListVariablesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('variables')) {
       variables = (_json['variables'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4544,7 +4684,8 @@
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
@@ -4678,12 +4819,14 @@
     }
     if (_json.containsKey('list')) {
       list = (_json['list'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('map')) {
       map = (_json['map'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -4730,7 +4873,8 @@
       compilerError = _json['compilerError'] as core.bool;
     }
     if (_json.containsKey('containerVersion')) {
-      containerVersion = ContainerVersion.fromJson(_json['containerVersion']);
+      containerVersion = ContainerVersion.fromJson(
+          _json['containerVersion'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4783,7 +4927,8 @@
     }
     if (_json.containsKey('condition')) {
       condition = (_json['condition'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('containerId')) {
@@ -5005,7 +5150,8 @@
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
@@ -5015,7 +5161,8 @@
       paused = _json['paused'] as core.bool;
     }
     if (_json.containsKey('priority')) {
-      priority = Parameter.fromJson(_json['priority']);
+      priority = Parameter.fromJson(
+          _json['priority'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scheduleEndMs')) {
       scheduleEndMs = _json['scheduleEndMs'] as core.String;
@@ -5025,7 +5172,8 @@
     }
     if (_json.containsKey('setupTag')) {
       setupTag = (_json['setupTag'] as core.List)
-          .map<SetupTag>((value) => SetupTag.fromJson(value))
+          .map<SetupTag>((value) =>
+              SetupTag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tagFiringOption')) {
@@ -5036,7 +5184,8 @@
     }
     if (_json.containsKey('teardownTag')) {
       teardownTag = (_json['teardownTag'] as core.List)
-          .map<TeardownTag>((value) => TeardownTag.fromJson(value))
+          .map<TeardownTag>((value) => TeardownTag.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -5329,69 +5478,82 @@
     }
     if (_json.containsKey('autoEventFilter')) {
       autoEventFilter = (_json['autoEventFilter'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('checkValidation')) {
-      checkValidation = Parameter.fromJson(_json['checkValidation']);
+      checkValidation = Parameter.fromJson(
+          _json['checkValidation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('containerId')) {
       containerId = _json['containerId'] as core.String;
     }
     if (_json.containsKey('continuousTimeMinMilliseconds')) {
-      continuousTimeMinMilliseconds =
-          Parameter.fromJson(_json['continuousTimeMinMilliseconds']);
+      continuousTimeMinMilliseconds = Parameter.fromJson(
+          _json['continuousTimeMinMilliseconds']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customEventFilter')) {
       customEventFilter = (_json['customEventFilter'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('eventName')) {
-      eventName = Parameter.fromJson(_json['eventName']);
+      eventName = Parameter.fromJson(
+          _json['eventName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filter')) {
       filter = (_json['filter'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fingerprint')) {
       fingerprint = _json['fingerprint'] as core.String;
     }
     if (_json.containsKey('horizontalScrollPercentageList')) {
-      horizontalScrollPercentageList =
-          Parameter.fromJson(_json['horizontalScrollPercentageList']);
+      horizontalScrollPercentageList = Parameter.fromJson(
+          _json['horizontalScrollPercentageList']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('interval')) {
-      interval = Parameter.fromJson(_json['interval']);
+      interval = Parameter.fromJson(
+          _json['interval'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('intervalSeconds')) {
-      intervalSeconds = Parameter.fromJson(_json['intervalSeconds']);
+      intervalSeconds = Parameter.fromJson(
+          _json['intervalSeconds'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('limit')) {
-      limit = Parameter.fromJson(_json['limit']);
+      limit = Parameter.fromJson(
+          _json['limit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxTimerLengthSeconds')) {
-      maxTimerLengthSeconds =
-          Parameter.fromJson(_json['maxTimerLengthSeconds']);
+      maxTimerLengthSeconds = Parameter.fromJson(_json['maxTimerLengthSeconds']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
       parentFolderId = _json['parentFolderId'] as core.String;
     }
     if (_json.containsKey('selector')) {
-      selector = Parameter.fromJson(_json['selector']);
+      selector = Parameter.fromJson(
+          _json['selector'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('totalTimeMinMilliseconds')) {
-      totalTimeMinMilliseconds =
-          Parameter.fromJson(_json['totalTimeMinMilliseconds']);
+      totalTimeMinMilliseconds = Parameter.fromJson(
+          _json['totalTimeMinMilliseconds']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('triggerId')) {
       triggerId = _json['triggerId'] as core.String;
@@ -5400,26 +5562,33 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('uniqueTriggerId')) {
-      uniqueTriggerId = Parameter.fromJson(_json['uniqueTriggerId']);
+      uniqueTriggerId = Parameter.fromJson(
+          _json['uniqueTriggerId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('verticalScrollPercentageList')) {
-      verticalScrollPercentageList =
-          Parameter.fromJson(_json['verticalScrollPercentageList']);
+      verticalScrollPercentageList = Parameter.fromJson(
+          _json['verticalScrollPercentageList']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visibilitySelector')) {
-      visibilitySelector = Parameter.fromJson(_json['visibilitySelector']);
+      visibilitySelector = Parameter.fromJson(
+          _json['visibilitySelector'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visiblePercentageMax')) {
-      visiblePercentageMax = Parameter.fromJson(_json['visiblePercentageMax']);
+      visiblePercentageMax = Parameter.fromJson(
+          _json['visiblePercentageMax'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visiblePercentageMin')) {
-      visiblePercentageMin = Parameter.fromJson(_json['visiblePercentageMin']);
+      visiblePercentageMin = Parameter.fromJson(
+          _json['visiblePercentageMin'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('waitForTags')) {
-      waitForTags = Parameter.fromJson(_json['waitForTags']);
+      waitForTags = Parameter.fromJson(
+          _json['waitForTags'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('waitForTagsTimeout')) {
-      waitForTagsTimeout = Parameter.fromJson(_json['waitForTagsTimeout']);
+      waitForTagsTimeout = Parameter.fromJson(
+          _json['waitForTagsTimeout'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5543,14 +5712,16 @@
 
   UserAccess.fromJson(core.Map _json) {
     if (_json.containsKey('accountAccess')) {
-      accountAccess = AccountAccess.fromJson(_json['accountAccess']);
+      accountAccess = AccountAccess.fromJson(
+          _json['accountAccess'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('accountId')) {
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('containerAccess')) {
       containerAccess = (_json['containerAccess'] as core.List)
-          .map<ContainerAccess>((value) => ContainerAccess.fromJson(value))
+          .map<ContainerAccess>((value) => ContainerAccess.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('emailAddress')) {
@@ -5675,7 +5846,8 @@
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
diff --git a/generated/googleapis/lib/tagmanager/v2.dart b/generated/googleapis/lib/tagmanager/v2.dart
index e168a2a..1fa791c 100644
--- a/generated/googleapis/lib/tagmanager/v2.dart
+++ b/generated/googleapis/lib/tagmanager/v2.dart
@@ -129,7 +129,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Accounts that a user has access to.
@@ -177,7 +179,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Account.
@@ -239,7 +244,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Account.fromJson(data));
+    return _response.then(
+      (data) => Account.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -313,7 +320,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Container.fromJson(data));
+    return _response.then(
+      (data) => Container.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Container.
@@ -363,7 +372,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a Container.
@@ -413,7 +424,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Container.fromJson(data));
+    return _response.then(
+      (data) => Container.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Containers that belongs to a GTM Account.
@@ -471,7 +484,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListContainersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListContainersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Container.
@@ -534,7 +550,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Container.fromJson(data));
+    return _response.then(
+      (data) => Container.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -599,7 +617,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Environment.
@@ -650,7 +671,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Environment.
@@ -701,7 +724,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Environments of a GTM Container.
@@ -759,7 +785,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListEnvironmentsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListEnvironmentsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Re-generates the authorization code for a GTM Environment.
@@ -818,7 +847,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Environment.
@@ -882,7 +914,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Environment.fromJson(data));
+    return _response.then(
+      (data) =>
+          Environment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -941,7 +976,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersionHeader.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersionHeader.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Container Versions of a GTM Container.
@@ -1005,8 +1043,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListContainerVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListContainerVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1064,7 +1104,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a Container Version.
@@ -1122,7 +1164,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the live (i.e. published) container version
@@ -1174,7 +1219,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Publishes a Container Version.
@@ -1234,8 +1282,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => PublishContainerVersionResponse.fromJson(data));
+    return _response.then(
+      (data) => PublishContainerVersionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Sets the latest version used for synchronization of workspaces when
@@ -1289,7 +1339,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes a Container Version.
@@ -1342,7 +1395,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Container Version.
@@ -1406,7 +1462,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ContainerVersion.fromJson(data));
+    return _response.then(
+      (data) => ContainerVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1487,7 +1546,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Workspace.fromJson(data));
+    return _response.then(
+      (data) => Workspace.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a Container Version from the entities present in the workspace,
@@ -1548,8 +1609,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CreateContainerVersionResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateContainerVersionResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a Workspace.
@@ -1600,7 +1663,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a Workspace.
@@ -1651,7 +1716,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Workspace.fromJson(data));
+    return _response.then(
+      (data) => Workspace.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Finds conflicting and modified entities in the workspace.
@@ -1704,7 +1771,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetWorkspaceStatusResponse.fromJson(data));
+    return _response.then(
+      (data) => GetWorkspaceStatusResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all Workspaces that belong to a GTM Container.
@@ -1762,7 +1832,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListWorkspacesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListWorkspacesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Quick previews a workspace by creating a fake container version from all
@@ -1816,7 +1889,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => QuickPreviewResponse.fromJson(data));
+    return _response.then(
+      (data) => QuickPreviewResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Resolves a merge conflict for a workspace entity by updating it to the
@@ -1883,7 +1959,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Syncs a workspace to the latest container version by updating all
@@ -1938,7 +2016,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SyncWorkspaceResponse.fromJson(data));
+    return _response.then(
+      (data) => SyncWorkspaceResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a Workspace.
@@ -2002,7 +2083,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Workspace.fromJson(data));
+    return _response.then(
+      (data) => Workspace.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2069,8 +2152,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => CreateBuiltInVariableResponse.fromJson(data));
+    return _response.then(
+      (data) => CreateBuiltInVariableResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes one or more GTM Built-In Variables.
@@ -2127,7 +2212,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Lists all the enabled Built-In Variables of a GTM Container.
@@ -2186,8 +2273,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListEnabledBuiltInVariablesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListEnabledBuiltInVariablesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts changes to a GTM Built-In Variables in a GTM Workspace.
@@ -2357,8 +2446,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => RevertBuiltInVariableResponse.fromJson(data));
+    return _response.then(
+      (data) => RevertBuiltInVariableResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2424,7 +2515,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Folder.
@@ -2475,7 +2568,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// List all entities in a GTM Folder.
@@ -2534,7 +2629,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => FolderEntities.fromJson(data));
+    return _response.then(
+      (data) =>
+          FolderEntities.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a GTM Folder.
@@ -2585,7 +2683,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Folders of a Container.
@@ -2644,7 +2744,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFoldersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFoldersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves entities to a GTM Folder.
@@ -2721,7 +2824,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Reverts changes to a GTM Folder in a GTM Workspace.
@@ -2781,7 +2886,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevertFolderResponse.fromJson(data));
+    return _response.then(
+      (data) => RevertFolderResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Folder.
@@ -2845,7 +2953,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Folder.fromJson(data));
+    return _response.then(
+      (data) => Folder.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2911,7 +3021,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tag.fromJson(data));
+    return _response.then(
+      (data) => Tag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Tag.
@@ -2962,7 +3074,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Tag.
@@ -3013,7 +3127,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tag.fromJson(data));
+    return _response.then(
+      (data) => Tag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Tags of a Container.
@@ -3072,7 +3188,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTagsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTagsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts changes to a GTM Tag in a GTM Workspace.
@@ -3132,7 +3251,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevertTagResponse.fromJson(data));
+    return _response.then(
+      (data) => RevertTagResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Tag.
@@ -3196,7 +3318,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tag.fromJson(data));
+    return _response.then(
+      (data) => Tag.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3262,7 +3386,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomTemplate.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomTemplate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Template.
@@ -3313,7 +3440,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Template.
@@ -3364,7 +3493,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomTemplate.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomTemplate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Templates of a GTM container workspace.
@@ -3423,7 +3555,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTemplatesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTemplatesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts changes to a GTM Template in a GTM Workspace.
@@ -3483,7 +3618,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevertTemplateResponse.fromJson(data));
+    return _response.then(
+      (data) => RevertTemplateResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Template.
@@ -3547,7 +3685,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CustomTemplate.fromJson(data));
+    return _response.then(
+      (data) =>
+          CustomTemplate.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3613,7 +3754,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Trigger.fromJson(data));
+    return _response.then(
+      (data) => Trigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Trigger.
@@ -3664,7 +3807,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Trigger.
@@ -3715,7 +3860,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Trigger.fromJson(data));
+    return _response.then(
+      (data) => Trigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Triggers of a Container.
@@ -3774,7 +3921,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListTriggersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTriggersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts changes to a GTM Trigger in a GTM Workspace.
@@ -3834,7 +3984,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevertTriggerResponse.fromJson(data));
+    return _response.then(
+      (data) => RevertTriggerResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Trigger.
@@ -3898,7 +4051,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Trigger.fromJson(data));
+    return _response.then(
+      (data) => Trigger.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3964,7 +4119,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variable.fromJson(data));
+    return _response.then(
+      (data) => Variable.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Variable.
@@ -4015,7 +4172,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Variable.
@@ -4066,7 +4225,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variable.fromJson(data));
+    return _response.then(
+      (data) => Variable.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Variables of a Container.
@@ -4125,7 +4286,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListVariablesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListVariablesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts changes to a GTM Variable in a GTM Workspace.
@@ -4185,7 +4349,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevertVariableResponse.fromJson(data));
+    return _response.then(
+      (data) => RevertVariableResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Variable.
@@ -4249,7 +4416,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Variable.fromJson(data));
+    return _response.then(
+      (data) => Variable.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4315,7 +4484,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Zone.fromJson(data));
+    return _response.then(
+      (data) => Zone.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a GTM Zone.
@@ -4366,7 +4537,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a GTM Zone.
@@ -4417,7 +4590,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Zone.fromJson(data));
+    return _response.then(
+      (data) => Zone.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists all GTM Zones of a GTM container workspace.
@@ -4476,7 +4651,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListZonesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListZonesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reverts changes to a GTM Zone in a GTM Workspace.
@@ -4536,7 +4714,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RevertZoneResponse.fromJson(data));
+    return _response.then(
+      (data) => RevertZoneResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a GTM Zone.
@@ -4600,7 +4781,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Zone.fromJson(data));
+    return _response.then(
+      (data) => Zone.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4664,7 +4847,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserPermission.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserPermission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a user from the account, revoking access to it and all of its
@@ -4715,7 +4901,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Gets a user's Account & Container access.
@@ -4765,7 +4953,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserPermission.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserPermission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List all users that have access to the account along with Account and
@@ -4824,7 +5015,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListUserPermissionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListUserPermissionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a user's Account & Container access.
@@ -4880,7 +5074,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => UserPermission.fromJson(data));
+    return _response.then(
+      (data) =>
+          UserPermission.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5238,7 +5435,8 @@
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
@@ -5341,7 +5539,8 @@
   Condition.fromJson(core.Map _json) {
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -5584,16 +5783,19 @@
     }
     if (_json.containsKey('builtInVariable')) {
       builtInVariable = (_json['builtInVariable'] as core.List)
-          .map<BuiltInVariable>((value) => BuiltInVariable.fromJson(value))
+          .map<BuiltInVariable>((value) => BuiltInVariable.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('client')) {
       client = (_json['client'] as core.List)
-          .map<Client>((value) => Client.fromJson(value))
+          .map<Client>((value) =>
+              Client.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('container')) {
-      container = Container.fromJson(_json['container']);
+      container = Container.fromJson(
+          _json['container'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('containerId')) {
       containerId = _json['containerId'] as core.String;
@@ -5603,7 +5805,8 @@
     }
     if (_json.containsKey('customTemplate')) {
       customTemplate = (_json['customTemplate'] as core.List)
-          .map<CustomTemplate>((value) => CustomTemplate.fromJson(value))
+          .map<CustomTemplate>((value) => CustomTemplate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('deleted')) {
@@ -5617,7 +5820,8 @@
     }
     if (_json.containsKey('folder')) {
       folder = (_json['folder'] as core.List)
-          .map<Folder>((value) => Folder.fromJson(value))
+          .map<Folder>((value) =>
+              Folder.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -5628,7 +5832,8 @@
     }
     if (_json.containsKey('tag')) {
       tag = (_json['tag'] as core.List)
-          .map<Tag>((value) => Tag.fromJson(value))
+          .map<Tag>((value) =>
+              Tag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tagManagerUrl')) {
@@ -5636,17 +5841,20 @@
     }
     if (_json.containsKey('trigger')) {
       trigger = (_json['trigger'] as core.List)
-          .map<Trigger>((value) => Trigger.fromJson(value))
+          .map<Trigger>((value) =>
+              Trigger.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('variable')) {
       variable = (_json['variable'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('zone')) {
       zone = (_json['zone'] as core.List)
-          .map<Zone>((value) => Zone.fromJson(value))
+          .map<Zone>((value) =>
+              Zone.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5852,7 +6060,8 @@
   CreateBuiltInVariableResponse.fromJson(core.Map _json) {
     if (_json.containsKey('builtInVariable')) {
       builtInVariable = (_json['builtInVariable'] as core.List)
-          .map<BuiltInVariable>((value) => BuiltInVariable.fromJson(value))
+          .map<BuiltInVariable>((value) => BuiltInVariable.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5922,13 +6131,15 @@
       compilerError = _json['compilerError'] as core.bool;
     }
     if (_json.containsKey('containerVersion')) {
-      containerVersion = ContainerVersion.fromJson(_json['containerVersion']);
+      containerVersion = ContainerVersion.fromJson(
+          _json['containerVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('newWorkspacePath')) {
       newWorkspacePath = _json['newWorkspacePath'] as core.String;
     }
     if (_json.containsKey('syncStatus')) {
-      syncStatus = SyncStatus.fromJson(_json['syncStatus']);
+      syncStatus = SyncStatus.fromJson(
+          _json['syncStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5996,7 +6207,8 @@
       fingerprint = _json['fingerprint'] as core.String;
     }
     if (_json.containsKey('galleryReference')) {
-      galleryReference = GalleryReference.fromJson(_json['galleryReference']);
+      galleryReference = GalleryReference.fromJson(
+          _json['galleryReference'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -6085,16 +6297,19 @@
       changeStatus = _json['changeStatus'] as core.String;
     }
     if (_json.containsKey('folder')) {
-      folder = Folder.fromJson(_json['folder']);
+      folder = Folder.fromJson(
+          _json['folder'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tag')) {
-      tag = Tag.fromJson(_json['tag']);
+      tag = Tag.fromJson(_json['tag'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trigger')) {
-      trigger = Trigger.fromJson(_json['trigger']);
+      trigger = Trigger.fromJson(
+          _json['trigger'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('variable')) {
-      variable = Variable.fromJson(_json['variable']);
+      variable = Variable.fromJson(
+          _json['variable'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6405,17 +6620,20 @@
     }
     if (_json.containsKey('tag')) {
       tag = (_json['tag'] as core.List)
-          .map<Tag>((value) => Tag.fromJson(value))
+          .map<Tag>((value) =>
+              Tag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('trigger')) {
       trigger = (_json['trigger'] as core.List)
-          .map<Trigger>((value) => Trigger.fromJson(value))
+          .map<Trigger>((value) =>
+              Trigger.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('variable')) {
       variable = (_json['variable'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6522,12 +6740,14 @@
   GetWorkspaceStatusResponse.fromJson(core.Map _json) {
     if (_json.containsKey('mergeConflict')) {
       mergeConflict = (_json['mergeConflict'] as core.List)
-          .map<MergeConflict>((value) => MergeConflict.fromJson(value))
+          .map<MergeConflict>((value) => MergeConflict.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('workspaceChange')) {
       workspaceChange = (_json['workspaceChange'] as core.List)
-          .map<Entity>((value) => Entity.fromJson(value))
+          .map<Entity>((value) =>
+              Entity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6559,7 +6779,8 @@
   ListAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
       account = (_json['account'] as core.List)
-          .map<Account>((value) => Account.fromJson(value))
+          .map<Account>((value) =>
+              Account.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6592,8 +6813,9 @@
   ListContainerVersionsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('containerVersionHeader')) {
       containerVersionHeader = (_json['containerVersionHeader'] as core.List)
-          .map<ContainerVersionHeader>(
-              (value) => ContainerVersionHeader.fromJson(value))
+          .map<ContainerVersionHeader>((value) =>
+              ContainerVersionHeader.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6627,7 +6849,8 @@
   ListContainersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('container')) {
       container = (_json['container'] as core.List)
-          .map<Container>((value) => Container.fromJson(value))
+          .map<Container>((value) =>
+              Container.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6660,7 +6883,8 @@
   ListEnabledBuiltInVariablesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('builtInVariable')) {
       builtInVariable = (_json['builtInVariable'] as core.List)
-          .map<BuiltInVariable>((value) => BuiltInVariable.fromJson(value))
+          .map<BuiltInVariable>((value) => BuiltInVariable.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6694,7 +6918,8 @@
   ListEnvironmentsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('environment')) {
       environment = (_json['environment'] as core.List)
-          .map<Environment>((value) => Environment.fromJson(value))
+          .map<Environment>((value) => Environment.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6728,7 +6953,8 @@
   ListFoldersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('folder')) {
       folder = (_json['folder'] as core.List)
-          .map<Folder>((value) => Folder.fromJson(value))
+          .map<Folder>((value) =>
+              Folder.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -6764,7 +6990,8 @@
     }
     if (_json.containsKey('tag')) {
       tag = (_json['tag'] as core.List)
-          .map<Tag>((value) => Tag.fromJson(value))
+          .map<Tag>((value) =>
+              Tag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6796,7 +7023,8 @@
     }
     if (_json.containsKey('template')) {
       template = (_json['template'] as core.List)
-          .map<CustomTemplate>((value) => CustomTemplate.fromJson(value))
+          .map<CustomTemplate>((value) => CustomTemplate.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6829,7 +7057,8 @@
     }
     if (_json.containsKey('trigger')) {
       trigger = (_json['trigger'] as core.List)
-          .map<Trigger>((value) => Trigger.fromJson(value))
+          .map<Trigger>((value) =>
+              Trigger.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6862,7 +7091,8 @@
     }
     if (_json.containsKey('userPermission')) {
       userPermission = (_json['userPermission'] as core.List)
-          .map<UserPermission>((value) => UserPermission.fromJson(value))
+          .map<UserPermission>((value) => UserPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6896,7 +7126,8 @@
     }
     if (_json.containsKey('variable')) {
       variable = (_json['variable'] as core.List)
-          .map<Variable>((value) => Variable.fromJson(value))
+          .map<Variable>((value) =>
+              Variable.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6929,7 +7160,8 @@
     }
     if (_json.containsKey('workspace')) {
       workspace = (_json['workspace'] as core.List)
-          .map<Workspace>((value) => Workspace.fromJson(value))
+          .map<Workspace>((value) =>
+              Workspace.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6961,7 +7193,8 @@
     }
     if (_json.containsKey('zone')) {
       zone = (_json['zone'] as core.List)
-          .map<Zone>((value) => Zone.fromJson(value))
+          .map<Zone>((value) =>
+              Zone.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6994,10 +7227,12 @@
 
   MergeConflict.fromJson(core.Map _json) {
     if (_json.containsKey('entityInBaseVersion')) {
-      entityInBaseVersion = Entity.fromJson(_json['entityInBaseVersion']);
+      entityInBaseVersion = Entity.fromJson(
+          _json['entityInBaseVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('entityInWorkspace')) {
-      entityInWorkspace = Entity.fromJson(_json['entityInWorkspace']);
+      entityInWorkspace = Entity.fromJson(
+          _json['entityInWorkspace'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7087,12 +7322,14 @@
     }
     if (_json.containsKey('list')) {
       list = (_json['list'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('map')) {
       map = (_json['map'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -7139,7 +7376,8 @@
       compilerError = _json['compilerError'] as core.bool;
     }
     if (_json.containsKey('containerVersion')) {
-      containerVersion = ContainerVersion.fromJson(_json['containerVersion']);
+      containerVersion = ContainerVersion.fromJson(
+          _json['containerVersion'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7174,10 +7412,12 @@
       compilerError = _json['compilerError'] as core.bool;
     }
     if (_json.containsKey('containerVersion')) {
-      containerVersion = ContainerVersion.fromJson(_json['containerVersion']);
+      containerVersion = ContainerVersion.fromJson(
+          _json['containerVersion'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('syncStatus')) {
-      syncStatus = SyncStatus.fromJson(_json['syncStatus']);
+      syncStatus = SyncStatus.fromJson(
+          _json['syncStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7229,7 +7469,8 @@
 
   RevertFolderResponse.fromJson(core.Map _json) {
     if (_json.containsKey('folder')) {
-      folder = Folder.fromJson(_json['folder']);
+      folder = Folder.fromJson(
+          _json['folder'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7253,7 +7494,7 @@
 
   RevertTagResponse.fromJson(core.Map _json) {
     if (_json.containsKey('tag')) {
-      tag = Tag.fromJson(_json['tag']);
+      tag = Tag.fromJson(_json['tag'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7277,7 +7518,8 @@
 
   RevertTemplateResponse.fromJson(core.Map _json) {
     if (_json.containsKey('template')) {
-      template = CustomTemplate.fromJson(_json['template']);
+      template = CustomTemplate.fromJson(
+          _json['template'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7301,7 +7543,8 @@
 
   RevertTriggerResponse.fromJson(core.Map _json) {
     if (_json.containsKey('trigger')) {
-      trigger = Trigger.fromJson(_json['trigger']);
+      trigger = Trigger.fromJson(
+          _json['trigger'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7325,7 +7568,8 @@
 
   RevertVariableResponse.fromJson(core.Map _json) {
     if (_json.containsKey('variable')) {
-      variable = Variable.fromJson(_json['variable']);
+      variable = Variable.fromJson(
+          _json['variable'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7349,7 +7593,8 @@
 
   RevertZoneResponse.fromJson(core.Map _json) {
     if (_json.containsKey('zone')) {
-      zone = Zone.fromJson(_json['zone']);
+      zone =
+          Zone.fromJson(_json['zone'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7443,11 +7688,13 @@
   SyncWorkspaceResponse.fromJson(core.Map _json) {
     if (_json.containsKey('mergeConflict')) {
       mergeConflict = (_json['mergeConflict'] as core.List)
-          .map<MergeConflict>((value) => MergeConflict.fromJson(value))
+          .map<MergeConflict>((value) => MergeConflict.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('syncStatus')) {
-      syncStatus = SyncStatus.fromJson(_json['syncStatus']);
+      syncStatus = SyncStatus.fromJson(
+          _json['syncStatus'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7628,7 +7875,8 @@
       liveOnly = _json['liveOnly'] as core.bool;
     }
     if (_json.containsKey('monitoringMetadata')) {
-      monitoringMetadata = Parameter.fromJson(_json['monitoringMetadata']);
+      monitoringMetadata = Parameter.fromJson(
+          _json['monitoringMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('monitoringMetadataTagNameKey')) {
       monitoringMetadataTagNameKey =
@@ -7642,7 +7890,8 @@
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
@@ -7655,7 +7904,8 @@
       paused = _json['paused'] as core.bool;
     }
     if (_json.containsKey('priority')) {
-      priority = Parameter.fromJson(_json['priority']);
+      priority = Parameter.fromJson(
+          _json['priority'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scheduleEndMs')) {
       scheduleEndMs = _json['scheduleEndMs'] as core.String;
@@ -7665,7 +7915,8 @@
     }
     if (_json.containsKey('setupTag')) {
       setupTag = (_json['setupTag'] as core.List)
-          .map<SetupTag>((value) => SetupTag.fromJson(value))
+          .map<SetupTag>((value) =>
+              SetupTag.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tagFiringOption')) {
@@ -7679,7 +7930,8 @@
     }
     if (_json.containsKey('teardownTag')) {
       teardownTag = (_json['teardownTag'] as core.List)
-          .map<TeardownTag>((value) => TeardownTag.fromJson(value))
+          .map<TeardownTag>((value) => TeardownTag.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('type')) {
@@ -8024,51 +8276,61 @@
     }
     if (_json.containsKey('autoEventFilter')) {
       autoEventFilter = (_json['autoEventFilter'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('checkValidation')) {
-      checkValidation = Parameter.fromJson(_json['checkValidation']);
+      checkValidation = Parameter.fromJson(
+          _json['checkValidation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('containerId')) {
       containerId = _json['containerId'] as core.String;
     }
     if (_json.containsKey('continuousTimeMinMilliseconds')) {
-      continuousTimeMinMilliseconds =
-          Parameter.fromJson(_json['continuousTimeMinMilliseconds']);
+      continuousTimeMinMilliseconds = Parameter.fromJson(
+          _json['continuousTimeMinMilliseconds']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('customEventFilter')) {
       customEventFilter = (_json['customEventFilter'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('eventName')) {
-      eventName = Parameter.fromJson(_json['eventName']);
+      eventName = Parameter.fromJson(
+          _json['eventName'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filter')) {
       filter = (_json['filter'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fingerprint')) {
       fingerprint = _json['fingerprint'] as core.String;
     }
     if (_json.containsKey('horizontalScrollPercentageList')) {
-      horizontalScrollPercentageList =
-          Parameter.fromJson(_json['horizontalScrollPercentageList']);
+      horizontalScrollPercentageList = Parameter.fromJson(
+          _json['horizontalScrollPercentageList']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('interval')) {
-      interval = Parameter.fromJson(_json['interval']);
+      interval = Parameter.fromJson(
+          _json['interval'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('intervalSeconds')) {
-      intervalSeconds = Parameter.fromJson(_json['intervalSeconds']);
+      intervalSeconds = Parameter.fromJson(
+          _json['intervalSeconds'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('limit')) {
-      limit = Parameter.fromJson(_json['limit']);
+      limit = Parameter.fromJson(
+          _json['limit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxTimerLengthSeconds')) {
-      maxTimerLengthSeconds =
-          Parameter.fromJson(_json['maxTimerLengthSeconds']);
+      maxTimerLengthSeconds = Parameter.fromJson(_json['maxTimerLengthSeconds']
+          as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8078,7 +8340,8 @@
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
@@ -8088,14 +8351,16 @@
       path = _json['path'] as core.String;
     }
     if (_json.containsKey('selector')) {
-      selector = Parameter.fromJson(_json['selector']);
+      selector = Parameter.fromJson(
+          _json['selector'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tagManagerUrl')) {
       tagManagerUrl = _json['tagManagerUrl'] as core.String;
     }
     if (_json.containsKey('totalTimeMinMilliseconds')) {
-      totalTimeMinMilliseconds =
-          Parameter.fromJson(_json['totalTimeMinMilliseconds']);
+      totalTimeMinMilliseconds = Parameter.fromJson(
+          _json['totalTimeMinMilliseconds']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('triggerId')) {
       triggerId = _json['triggerId'] as core.String;
@@ -8104,26 +8369,33 @@
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('uniqueTriggerId')) {
-      uniqueTriggerId = Parameter.fromJson(_json['uniqueTriggerId']);
+      uniqueTriggerId = Parameter.fromJson(
+          _json['uniqueTriggerId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('verticalScrollPercentageList')) {
-      verticalScrollPercentageList =
-          Parameter.fromJson(_json['verticalScrollPercentageList']);
+      verticalScrollPercentageList = Parameter.fromJson(
+          _json['verticalScrollPercentageList']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visibilitySelector')) {
-      visibilitySelector = Parameter.fromJson(_json['visibilitySelector']);
+      visibilitySelector = Parameter.fromJson(
+          _json['visibilitySelector'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visiblePercentageMax')) {
-      visiblePercentageMax = Parameter.fromJson(_json['visiblePercentageMax']);
+      visiblePercentageMax = Parameter.fromJson(
+          _json['visiblePercentageMax'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visiblePercentageMin')) {
-      visiblePercentageMin = Parameter.fromJson(_json['visiblePercentageMin']);
+      visiblePercentageMin = Parameter.fromJson(
+          _json['visiblePercentageMin'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('waitForTags')) {
-      waitForTags = Parameter.fromJson(_json['waitForTags']);
+      waitForTags = Parameter.fromJson(
+          _json['waitForTags'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('waitForTagsTimeout')) {
-      waitForTagsTimeout = Parameter.fromJson(_json['waitForTagsTimeout']);
+      waitForTagsTimeout = Parameter.fromJson(
+          _json['waitForTagsTimeout'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workspaceId')) {
       workspaceId = _json['workspaceId'] as core.String;
@@ -8262,14 +8534,16 @@
 
   UserPermission.fromJson(core.Map _json) {
     if (_json.containsKey('accountAccess')) {
-      accountAccess = AccountAccess.fromJson(_json['accountAccess']);
+      accountAccess = AccountAccess.fromJson(
+          _json['accountAccess'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('accountId')) {
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('containerAccess')) {
       containerAccess = (_json['containerAccess'] as core.List)
-          .map<ContainerAccess>((value) => ContainerAccess.fromJson(value))
+          .map<ContainerAccess>((value) => ContainerAccess.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('emailAddress')) {
@@ -8400,7 +8674,8 @@
       fingerprint = _json['fingerprint'] as core.String;
     }
     if (_json.containsKey('formatValue')) {
-      formatValue = VariableFormatValue.fromJson(_json['formatValue']);
+      formatValue = VariableFormatValue.fromJson(
+          _json['formatValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -8410,7 +8685,8 @@
     }
     if (_json.containsKey('parameter')) {
       parameter = (_json['parameter'] as core.List)
-          .map<Parameter>((value) => Parameter.fromJson(value))
+          .map<Parameter>((value) =>
+              Parameter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('parentFolderId')) {
@@ -8524,17 +8800,21 @@
       caseConversionType = _json['caseConversionType'] as core.String;
     }
     if (_json.containsKey('convertFalseToValue')) {
-      convertFalseToValue = Parameter.fromJson(_json['convertFalseToValue']);
+      convertFalseToValue = Parameter.fromJson(
+          _json['convertFalseToValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('convertNullToValue')) {
-      convertNullToValue = Parameter.fromJson(_json['convertNullToValue']);
+      convertNullToValue = Parameter.fromJson(
+          _json['convertNullToValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('convertTrueToValue')) {
-      convertTrueToValue = Parameter.fromJson(_json['convertTrueToValue']);
+      convertTrueToValue = Parameter.fromJson(
+          _json['convertTrueToValue'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('convertUndefinedToValue')) {
-      convertUndefinedToValue =
-          Parameter.fromJson(_json['convertUndefinedToValue']);
+      convertUndefinedToValue = Parameter.fromJson(
+          _json['convertUndefinedToValue']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8695,12 +8975,13 @@
       accountId = _json['accountId'] as core.String;
     }
     if (_json.containsKey('boundary')) {
-      boundary = ZoneBoundary.fromJson(_json['boundary']);
+      boundary = ZoneBoundary.fromJson(
+          _json['boundary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('childContainer')) {
       childContainer = (_json['childContainer'] as core.List)
-          .map<ZoneChildContainer>(
-              (value) => ZoneChildContainer.fromJson(value))
+          .map<ZoneChildContainer>((value) => ZoneChildContainer.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('containerId')) {
@@ -8722,7 +9003,8 @@
       tagManagerUrl = _json['tagManagerUrl'] as core.String;
     }
     if (_json.containsKey('typeRestriction')) {
-      typeRestriction = ZoneTypeRestriction.fromJson(_json['typeRestriction']);
+      typeRestriction = ZoneTypeRestriction.fromJson(
+          _json['typeRestriction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('workspaceId')) {
       workspaceId = _json['workspaceId'] as core.String;
@@ -8789,7 +9071,8 @@
   ZoneBoundary.fromJson(core.Map _json) {
     if (_json.containsKey('condition')) {
       condition = (_json['condition'] as core.List)
-          .map<Condition>((value) => Condition.fromJson(value))
+          .map<Condition>((value) =>
+              Condition.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('customEvaluationTriggerId')) {
diff --git a/generated/googleapis/lib/tasks/v1.dart b/generated/googleapis/lib/tasks/v1.dart
index 0baabea..367187c 100644
--- a/generated/googleapis/lib/tasks/v1.dart
+++ b/generated/googleapis/lib/tasks/v1.dart
@@ -102,7 +102,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns the authenticated user's specified task list.
@@ -151,7 +153,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TaskList.fromJson(data));
+    return _response.then(
+      (data) => TaskList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new task list and adds it to the authenticated user's task
@@ -200,7 +204,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TaskList.fromJson(data));
+    return _response.then(
+      (data) => TaskList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns all the authenticated user's task lists.
@@ -255,7 +261,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TaskLists.fromJson(data));
+    return _response.then(
+      (data) => TaskLists.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the authenticated user's specified task list. This method supports
@@ -311,7 +319,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TaskList.fromJson(data));
+    return _response.then(
+      (data) => TaskList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the authenticated user's specified task list.
@@ -366,7 +376,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TaskList.fromJson(data));
+    return _response.then(
+      (data) => TaskList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -424,7 +436,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Deletes the specified task from the task list.
@@ -481,7 +495,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Returns the specified task.
@@ -538,7 +554,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new task on the specified task list.
@@ -609,7 +627,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns all tasks in the specified task list.
@@ -733,7 +753,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Tasks.fromJson(data));
+    return _response.then(
+      (data) => Tasks.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Moves the specified task to another position in the task list. This can
@@ -808,7 +830,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified task. This method supports patch semantics.
@@ -871,7 +895,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified task.
@@ -934,7 +960,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Task.fromJson(data));
+    return _response.then(
+      (data) => Task.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1063,7 +1091,8 @@
     }
     if (_json.containsKey('links')) {
       links = (_json['links'] as core.List)
-          .map<TaskLinks>((value) => TaskLinks.fromJson(value))
+          .map<TaskLinks>((value) =>
+              TaskLinks.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('notes')) {
@@ -1228,7 +1257,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<TaskList>((value) => TaskList.fromJson(value))
+          .map<TaskList>((value) =>
+              TaskList.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1278,7 +1308,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Task>((value) => Task.fromJson(value))
+          .map<Task>((value) =>
+              Task.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/testing/v1.dart b/generated/googleapis/lib/testing/v1.dart
index ccd13e2..e43283e 100644
--- a/generated/googleapis/lib/testing/v1.dart
+++ b/generated/googleapis/lib/testing/v1.dart
@@ -107,7 +107,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GetApkDetailsResponse.fromJson(data));
+    return _response.then(
+      (data) => GetApkDetailsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -186,7 +189,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CancelTestMatrixResponse.fromJson(data));
+    return _response.then(
+      (data) => CancelTestMatrixResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates and runs a matrix of tests according to the given specifications.
@@ -256,7 +262,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestMatrix.fromJson(data));
+    return _response.then(
+      (data) =>
+          TestMatrix.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Checks the status of a test matrix. May return any of the following
@@ -316,7 +325,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestMatrix.fromJson(data));
+    return _response.then(
+      (data) =>
+          TestMatrix.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -393,7 +405,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestEnvironmentCatalog.fromJson(data));
+    return _response.then(
+      (data) => TestEnvironmentCatalog.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -406,7 +421,8 @@
 
   Account.fromJson(core.Map _json) {
     if (_json.containsKey('googleAuto')) {
-      googleAuto = GoogleAuto.fromJson(_json['googleAuto']);
+      googleAuto = GoogleAuto.fromJson(
+          _json['googleAuto'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -488,16 +504,18 @@
   AndroidDeviceCatalog.fromJson(core.Map _json) {
     if (_json.containsKey('models')) {
       models = (_json['models'] as core.List)
-          .map<AndroidModel>((value) => AndroidModel.fromJson(value))
+          .map<AndroidModel>((value) => AndroidModel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('runtimeConfiguration')) {
-      runtimeConfiguration =
-          AndroidRuntimeConfiguration.fromJson(_json['runtimeConfiguration']);
+      runtimeConfiguration = AndroidRuntimeConfiguration.fromJson(
+          _json['runtimeConfiguration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('versions')) {
       versions = (_json['versions'] as core.List)
-          .map<AndroidVersion>((value) => AndroidVersion.fromJson(value))
+          .map<AndroidVersion>((value) => AndroidVersion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -527,7 +545,8 @@
   AndroidDeviceList.fromJson(core.Map _json) {
     if (_json.containsKey('androidDevices')) {
       androidDevices = (_json['androidDevices'] as core.List)
-          .map<AndroidDevice>((value) => AndroidDevice.fromJson(value))
+          .map<AndroidDevice>((value) => AndroidDevice.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -601,10 +620,12 @@
 
   AndroidInstrumentationTest.fromJson(core.Map _json) {
     if (_json.containsKey('appApk')) {
-      appApk = FileReference.fromJson(_json['appApk']);
+      appApk = FileReference.fromJson(
+          _json['appApk'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appBundle')) {
-      appBundle = AppBundle.fromJson(_json['appBundle']);
+      appBundle = AppBundle.fromJson(
+          _json['appBundle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appPackageId')) {
       appPackageId = _json['appPackageId'] as core.String;
@@ -613,10 +634,12 @@
       orchestratorOption = _json['orchestratorOption'] as core.String;
     }
     if (_json.containsKey('shardingOption')) {
-      shardingOption = ShardingOption.fromJson(_json['shardingOption']);
+      shardingOption = ShardingOption.fromJson(
+          _json['shardingOption'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('testApk')) {
-      testApk = FileReference.fromJson(_json['testApk']);
+      testApk = FileReference.fromJson(
+          _json['testApk'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('testPackageId')) {
       testPackageId = _json['testPackageId'] as core.String;
@@ -951,10 +974,12 @@
 
   AndroidRoboTest.fromJson(core.Map _json) {
     if (_json.containsKey('appApk')) {
-      appApk = FileReference.fromJson(_json['appApk']);
+      appApk = FileReference.fromJson(
+          _json['appApk'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appBundle')) {
-      appBundle = AppBundle.fromJson(_json['appBundle']);
+      appBundle = AppBundle.fromJson(
+          _json['appBundle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appInitialActivity')) {
       appInitialActivity = _json['appInitialActivity'] as core.String;
@@ -970,16 +995,18 @@
     }
     if (_json.containsKey('roboDirectives')) {
       roboDirectives = (_json['roboDirectives'] as core.List)
-          .map<RoboDirective>((value) => RoboDirective.fromJson(value))
+          .map<RoboDirective>((value) => RoboDirective.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('roboScript')) {
-      roboScript = FileReference.fromJson(_json['roboScript']);
+      roboScript = FileReference.fromJson(
+          _json['roboScript'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startingIntents')) {
       startingIntents = (_json['startingIntents'] as core.List)
-          .map<RoboStartingIntent>(
-              (value) => RoboStartingIntent.fromJson(value))
+          .map<RoboStartingIntent>((value) => RoboStartingIntent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1032,12 +1059,14 @@
   AndroidRuntimeConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('locales')) {
       locales = (_json['locales'] as core.List)
-          .map<Locale>((value) => Locale.fromJson(value))
+          .map<Locale>((value) =>
+              Locale.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('orientations')) {
       orientations = (_json['orientations'] as core.List)
-          .map<Orientation>((value) => Orientation.fromJson(value))
+          .map<Orientation>((value) => Orientation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1085,10 +1114,12 @@
 
   AndroidTestLoop.fromJson(core.Map _json) {
     if (_json.containsKey('appApk')) {
-      appApk = FileReference.fromJson(_json['appApk']);
+      appApk = FileReference.fromJson(
+          _json['appApk'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appBundle')) {
-      appBundle = AppBundle.fromJson(_json['appBundle']);
+      appBundle = AppBundle.fromJson(
+          _json['appBundle'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('appPackageId')) {
       appPackageId = _json['appPackageId'] as core.String;
@@ -1161,13 +1192,15 @@
       codeName = _json['codeName'] as core.String;
     }
     if (_json.containsKey('distribution')) {
-      distribution = Distribution.fromJson(_json['distribution']);
+      distribution = Distribution.fromJson(
+          _json['distribution'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('releaseDate')) {
-      releaseDate = Date.fromJson(_json['releaseDate']);
+      releaseDate = Date.fromJson(
+          _json['releaseDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tags')) {
       tags = (_json['tags'] as core.List)
@@ -1219,7 +1252,8 @@
 
   Apk.fromJson(core.Map _json) {
     if (_json.containsKey('location')) {
-      location = FileReference.fromJson(_json['location']);
+      location = FileReference.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('packageName')) {
       packageName = _json['packageName'] as core.String;
@@ -1247,7 +1281,8 @@
 
   ApkDetail.fromJson(core.Map _json) {
     if (_json.containsKey('apkManifest')) {
-      apkManifest = ApkManifest.fromJson(_json['apkManifest']);
+      apkManifest = ApkManifest.fromJson(
+          _json['apkManifest'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1287,7 +1322,8 @@
     }
     if (_json.containsKey('intentFilters')) {
       intentFilters = (_json['intentFilters'] as core.List)
-          .map<IntentFilter>((value) => IntentFilter.fromJson(value))
+          .map<IntentFilter>((value) => IntentFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('maxSdkVersion')) {
@@ -1341,7 +1377,8 @@
 
   AppBundle.fromJson(core.Map _json) {
     if (_json.containsKey('bundleLocation')) {
-      bundleLocation = FileReference.fromJson(_json['bundleLocation']);
+      bundleLocation = FileReference.fromJson(
+          _json['bundleLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1417,7 +1454,8 @@
   ClientInfo.fromJson(core.Map _json) {
     if (_json.containsKey('clientInfoDetails')) {
       clientInfoDetails = (_json['clientInfoDetails'] as core.List)
-          .map<ClientInfoDetail>((value) => ClientInfoDetail.fromJson(value))
+          .map<ClientInfoDetail>((value) => ClientInfoDetail.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -1533,10 +1571,12 @@
 
   DeviceFile.fromJson(core.Map _json) {
     if (_json.containsKey('obbFile')) {
-      obbFile = ObbFile.fromJson(_json['obbFile']);
+      obbFile = ObbFile.fromJson(
+          _json['obbFile'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('regularFile')) {
-      regularFile = RegularFile.fromJson(_json['regularFile']);
+      regularFile = RegularFile.fromJson(
+          _json['regularFile'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1574,7 +1614,8 @@
 
   DeviceIpBlock.fromJson(core.Map _json) {
     if (_json.containsKey('addedDate')) {
-      addedDate = Date.fromJson(_json['addedDate']);
+      addedDate = Date.fromJson(
+          _json['addedDate'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('block')) {
       block = _json['block'] as core.String;
@@ -1609,7 +1650,8 @@
   DeviceIpBlockCatalog.fromJson(core.Map _json) {
     if (_json.containsKey('ipBlocks')) {
       ipBlocks = (_json['ipBlocks'] as core.List)
-          .map<DeviceIpBlock>((value) => DeviceIpBlock.fromJson(value))
+          .map<DeviceIpBlock>((value) => DeviceIpBlock.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1668,10 +1710,12 @@
 
   Environment.fromJson(core.Map _json) {
     if (_json.containsKey('androidDevice')) {
-      androidDevice = AndroidDevice.fromJson(_json['androidDevice']);
+      androidDevice = AndroidDevice.fromJson(
+          _json['androidDevice'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iosDevice')) {
-      iosDevice = IosDevice.fromJson(_json['iosDevice']);
+      iosDevice = IosDevice.fromJson(
+          _json['iosDevice'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1703,14 +1747,16 @@
 
   EnvironmentMatrix.fromJson(core.Map _json) {
     if (_json.containsKey('androidDeviceList')) {
-      androidDeviceList =
-          AndroidDeviceList.fromJson(_json['androidDeviceList']);
+      androidDeviceList = AndroidDeviceList.fromJson(
+          _json['androidDeviceList'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('androidMatrix')) {
-      androidMatrix = AndroidMatrix.fromJson(_json['androidMatrix']);
+      androidMatrix = AndroidMatrix.fromJson(
+          _json['androidMatrix'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iosDeviceList')) {
-      iosDeviceList = IosDeviceList.fromJson(_json['iosDeviceList']);
+      iosDeviceList = IosDeviceList.fromJson(
+          _json['iosDeviceList'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1793,7 +1839,8 @@
 
   GetApkDetailsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('apkDetail')) {
-      apkDetail = ApkDetail.fromJson(_json['apkDetail']);
+      apkDetail = ApkDetail.fromJson(
+          _json['apkDetail'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1966,21 +2013,24 @@
   IosDeviceCatalog.fromJson(core.Map _json) {
     if (_json.containsKey('models')) {
       models = (_json['models'] as core.List)
-          .map<IosModel>((value) => IosModel.fromJson(value))
+          .map<IosModel>((value) =>
+              IosModel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('runtimeConfiguration')) {
-      runtimeConfiguration =
-          IosRuntimeConfiguration.fromJson(_json['runtimeConfiguration']);
+      runtimeConfiguration = IosRuntimeConfiguration.fromJson(
+          _json['runtimeConfiguration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('versions')) {
       versions = (_json['versions'] as core.List)
-          .map<IosVersion>((value) => IosVersion.fromJson(value))
+          .map<IosVersion>((value) =>
+              IosVersion.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('xcodeVersions')) {
       xcodeVersions = (_json['xcodeVersions'] as core.List)
-          .map<XcodeVersion>((value) => XcodeVersion.fromJson(value))
+          .map<XcodeVersion>((value) => XcodeVersion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2023,7 +2073,8 @@
       bundleId = _json['bundleId'] as core.String;
     }
     if (_json.containsKey('content')) {
-      content = FileReference.fromJson(_json['content']);
+      content = FileReference.fromJson(
+          _json['content'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('devicePath')) {
       devicePath = _json['devicePath'] as core.String;
@@ -2055,7 +2106,8 @@
   IosDeviceList.fromJson(core.Map _json) {
     if (_json.containsKey('iosDevices')) {
       iosDevices = (_json['iosDevices'] as core.List)
-          .map<IosDevice>((value) => IosDevice.fromJson(value))
+          .map<IosDevice>((value) =>
+              IosDevice.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2191,12 +2243,14 @@
   IosRuntimeConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('locales')) {
       locales = (_json['locales'] as core.List)
-          .map<Locale>((value) => Locale.fromJson(value))
+          .map<Locale>((value) =>
+              Locale.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('orientations')) {
       orientations = (_json['orientations'] as core.List)
-          .map<Orientation>((value) => Orientation.fromJson(value))
+          .map<Orientation>((value) => Orientation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2235,7 +2289,8 @@
       appBundleId = _json['appBundleId'] as core.String;
     }
     if (_json.containsKey('appIpa')) {
-      appIpa = FileReference.fromJson(_json['appIpa']);
+      appIpa = FileReference.fromJson(
+          _json['appIpa'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('scenarios')) {
       scenarios = (_json['scenarios'] as core.List)
@@ -2284,7 +2339,8 @@
   IosTestSetup.fromJson(core.Map _json) {
     if (_json.containsKey('additionalIpas')) {
       additionalIpas = (_json['additionalIpas'] as core.List)
-          .map<FileReference>((value) => FileReference.fromJson(value))
+          .map<FileReference>((value) => FileReference.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('networkProfile')) {
@@ -2292,12 +2348,14 @@
     }
     if (_json.containsKey('pullDirectories')) {
       pullDirectories = (_json['pullDirectories'] as core.List)
-          .map<IosDeviceFile>((value) => IosDeviceFile.fromJson(value))
+          .map<IosDeviceFile>((value) => IosDeviceFile.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pushFiles')) {
       pushFiles = (_json['pushFiles'] as core.List)
-          .map<IosDeviceFile>((value) => IosDeviceFile.fromJson(value))
+          .map<IosDeviceFile>((value) => IosDeviceFile.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2428,13 +2486,15 @@
       testSpecialEntitlements = _json['testSpecialEntitlements'] as core.bool;
     }
     if (_json.containsKey('testsZip')) {
-      testsZip = FileReference.fromJson(_json['testsZip']);
+      testsZip = FileReference.fromJson(
+          _json['testsZip'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('xcodeVersion')) {
       xcodeVersion = _json['xcodeVersion'] as core.String;
     }
     if (_json.containsKey('xctestrun')) {
-      xctestrun = FileReference.fromJson(_json['xctestrun']);
+      xctestrun = FileReference.fromJson(
+          _json['xctestrun'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2540,8 +2600,8 @@
   ManualSharding.fromJson(core.Map _json) {
     if (_json.containsKey('testTargetsForShard')) {
       testTargetsForShard = (_json['testTargetsForShard'] as core.List)
-          .map<TestTargetsForShard>(
-              (value) => TestTargetsForShard.fromJson(value))
+          .map<TestTargetsForShard>((value) => TestTargetsForShard.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2570,13 +2630,15 @@
 
   NetworkConfiguration.fromJson(core.Map _json) {
     if (_json.containsKey('downRule')) {
-      downRule = TrafficRule.fromJson(_json['downRule']);
+      downRule = TrafficRule.fromJson(
+          _json['downRule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('upRule')) {
-      upRule = TrafficRule.fromJson(_json['upRule']);
+      upRule = TrafficRule.fromJson(
+          _json['upRule'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2603,8 +2665,8 @@
   NetworkConfigurationCatalog.fromJson(core.Map _json) {
     if (_json.containsKey('configurations')) {
       configurations = (_json['configurations'] as core.List)
-          .map<NetworkConfiguration>(
-              (value) => NetworkConfiguration.fromJson(value))
+          .map<NetworkConfiguration>((value) => NetworkConfiguration.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2633,7 +2695,8 @@
 
   ObbFile.fromJson(core.Map _json) {
     if (_json.containsKey('obb')) {
-      obb = FileReference.fromJson(_json['obb']);
+      obb = FileReference.fromJson(
+          _json['obb'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('obbFileName')) {
       obbFileName = _json['obbFileName'] as core.String;
@@ -2739,7 +2802,8 @@
 
   RegularFile.fromJson(core.Map _json) {
     if (_json.containsKey('content')) {
-      content = FileReference.fromJson(_json['content']);
+      content = FileReference.fromJson(
+          _json['content'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('devicePath')) {
       devicePath = _json['devicePath'] as core.String;
@@ -2778,19 +2842,19 @@
 
   ResultStorage.fromJson(core.Map _json) {
     if (_json.containsKey('googleCloudStorage')) {
-      googleCloudStorage =
-          GoogleCloudStorage.fromJson(_json['googleCloudStorage']);
+      googleCloudStorage = GoogleCloudStorage.fromJson(
+          _json['googleCloudStorage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('resultsUrl')) {
       resultsUrl = _json['resultsUrl'] as core.String;
     }
     if (_json.containsKey('toolResultsExecution')) {
-      toolResultsExecution =
-          ToolResultsExecution.fromJson(_json['toolResultsExecution']);
+      toolResultsExecution = ToolResultsExecution.fromJson(
+          _json['toolResultsExecution'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('toolResultsHistory')) {
-      toolResultsHistory =
-          ToolResultsHistory.fromJson(_json['toolResultsHistory']);
+      toolResultsHistory = ToolResultsHistory.fromJson(
+          _json['toolResultsHistory'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2880,11 +2944,12 @@
 
   RoboStartingIntent.fromJson(core.Map _json) {
     if (_json.containsKey('launcherActivity')) {
-      launcherActivity =
-          LauncherActivityIntent.fromJson(_json['launcherActivity']);
+      launcherActivity = LauncherActivityIntent.fromJson(
+          _json['launcherActivity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startActivity')) {
-      startActivity = StartActivityIntent.fromJson(_json['startActivity']);
+      startActivity = StartActivityIntent.fromJson(
+          _json['startActivity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeout')) {
       timeout = _json['timeout'] as core.String;
@@ -2927,8 +2992,8 @@
       shardIndex = _json['shardIndex'] as core.int;
     }
     if (_json.containsKey('testTargetsForShard')) {
-      testTargetsForShard =
-          TestTargetsForShard.fromJson(_json['testTargetsForShard']);
+      testTargetsForShard = TestTargetsForShard.fromJson(
+          _json['testTargetsForShard'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2960,10 +3025,12 @@
 
   ShardingOption.fromJson(core.Map _json) {
     if (_json.containsKey('manualSharding')) {
-      manualSharding = ManualSharding.fromJson(_json['manualSharding']);
+      manualSharding = ManualSharding.fromJson(
+          _json['manualSharding'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('uniformSharding')) {
-      uniformSharding = UniformSharding.fromJson(_json['uniformSharding']);
+      uniformSharding = UniformSharding.fromJson(
+          _json['uniformSharding'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3100,23 +3167,25 @@
 
   TestEnvironmentCatalog.fromJson(core.Map _json) {
     if (_json.containsKey('androidDeviceCatalog')) {
-      androidDeviceCatalog =
-          AndroidDeviceCatalog.fromJson(_json['androidDeviceCatalog']);
+      androidDeviceCatalog = AndroidDeviceCatalog.fromJson(
+          _json['androidDeviceCatalog'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('deviceIpBlockCatalog')) {
-      deviceIpBlockCatalog =
-          DeviceIpBlockCatalog.fromJson(_json['deviceIpBlockCatalog']);
+      deviceIpBlockCatalog = DeviceIpBlockCatalog.fromJson(
+          _json['deviceIpBlockCatalog'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iosDeviceCatalog')) {
-      iosDeviceCatalog = IosDeviceCatalog.fromJson(_json['iosDeviceCatalog']);
+      iosDeviceCatalog = IosDeviceCatalog.fromJson(
+          _json['iosDeviceCatalog'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('networkConfigurationCatalog')) {
       networkConfigurationCatalog = NetworkConfigurationCatalog.fromJson(
-          _json['networkConfigurationCatalog']);
+          _json['networkConfigurationCatalog']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('softwareCatalog')) {
-      softwareCatalog =
-          ProvidedSoftwareCatalog.fromJson(_json['softwareCatalog']);
+      softwareCatalog = ProvidedSoftwareCatalog.fromJson(
+          _json['softwareCatalog'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3206,7 +3275,8 @@
 
   TestExecution.fromJson(core.Map _json) {
     if (_json.containsKey('environment')) {
-      environment = Environment.fromJson(_json['environment']);
+      environment = Environment.fromJson(
+          _json['environment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -3218,23 +3288,26 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('shard')) {
-      shard = Shard.fromJson(_json['shard']);
+      shard =
+          Shard.fromJson(_json['shard'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('testDetails')) {
-      testDetails = TestDetails.fromJson(_json['testDetails']);
+      testDetails = TestDetails.fromJson(
+          _json['testDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('testSpecification')) {
-      testSpecification =
-          TestSpecification.fromJson(_json['testSpecification']);
+      testSpecification = TestSpecification.fromJson(
+          _json['testSpecification'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
     }
     if (_json.containsKey('toolResultsStep')) {
-      toolResultsStep = ToolResultsStep.fromJson(_json['toolResultsStep']);
+      toolResultsStep = ToolResultsStep.fromJson(
+          _json['toolResultsStep'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3434,11 +3507,12 @@
 
   TestMatrix.fromJson(core.Map _json) {
     if (_json.containsKey('clientInfo')) {
-      clientInfo = ClientInfo.fromJson(_json['clientInfo']);
+      clientInfo = ClientInfo.fromJson(
+          _json['clientInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('environmentMatrix')) {
-      environmentMatrix =
-          EnvironmentMatrix.fromJson(_json['environmentMatrix']);
+      environmentMatrix = EnvironmentMatrix.fromJson(
+          _json['environmentMatrix'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('flakyTestAttempts')) {
       flakyTestAttempts = _json['flakyTestAttempts'] as core.int;
@@ -3453,22 +3527,24 @@
       projectId = _json['projectId'] as core.String;
     }
     if (_json.containsKey('resultStorage')) {
-      resultStorage = ResultStorage.fromJson(_json['resultStorage']);
+      resultStorage = ResultStorage.fromJson(
+          _json['resultStorage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('state')) {
       state = _json['state'] as core.String;
     }
     if (_json.containsKey('testExecutions')) {
       testExecutions = (_json['testExecutions'] as core.List)
-          .map<TestExecution>((value) => TestExecution.fromJson(value))
+          .map<TestExecution>((value) => TestExecution.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('testMatrixId')) {
       testMatrixId = _json['testMatrixId'] as core.String;
     }
     if (_json.containsKey('testSpecification')) {
-      testSpecification =
-          TestSpecification.fromJson(_json['testSpecification']);
+      testSpecification = TestSpecification.fromJson(
+          _json['testSpecification'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestamp')) {
       timestamp = _json['timestamp'] as core.String;
@@ -3562,11 +3638,13 @@
 
   TestSetup.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
-      account = Account.fromJson(_json['account']);
+      account = Account.fromJson(
+          _json['account'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('additionalApks')) {
       additionalApks = (_json['additionalApks'] as core.List)
-          .map<Apk>((value) => Apk.fromJson(value))
+          .map<Apk>((value) =>
+              Apk.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('directoriesToPull')) {
@@ -3579,20 +3657,22 @@
     }
     if (_json.containsKey('environmentVariables')) {
       environmentVariables = (_json['environmentVariables'] as core.List)
-          .map<EnvironmentVariable>(
-              (value) => EnvironmentVariable.fromJson(value))
+          .map<EnvironmentVariable>((value) => EnvironmentVariable.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('filesToPush')) {
       filesToPush = (_json['filesToPush'] as core.List)
-          .map<DeviceFile>((value) => DeviceFile.fromJson(value))
+          .map<DeviceFile>((value) =>
+              DeviceFile.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('networkProfile')) {
       networkProfile = _json['networkProfile'] as core.String;
     }
     if (_json.containsKey('systrace')) {
-      systrace = SystraceSetup.fromJson(_json['systrace']);
+      systrace = SystraceSetup.fromJson(
+          _json['systrace'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3668,13 +3748,16 @@
   TestSpecification.fromJson(core.Map _json) {
     if (_json.containsKey('androidInstrumentationTest')) {
       androidInstrumentationTest = AndroidInstrumentationTest.fromJson(
-          _json['androidInstrumentationTest']);
+          _json['androidInstrumentationTest']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('androidRoboTest')) {
-      androidRoboTest = AndroidRoboTest.fromJson(_json['androidRoboTest']);
+      androidRoboTest = AndroidRoboTest.fromJson(
+          _json['androidRoboTest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('androidTestLoop')) {
-      androidTestLoop = AndroidTestLoop.fromJson(_json['androidTestLoop']);
+      androidTestLoop = AndroidTestLoop.fromJson(
+          _json['androidTestLoop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('disablePerformanceMetrics')) {
       disablePerformanceMetrics =
@@ -3684,16 +3767,20 @@
       disableVideoRecording = _json['disableVideoRecording'] as core.bool;
     }
     if (_json.containsKey('iosTestLoop')) {
-      iosTestLoop = IosTestLoop.fromJson(_json['iosTestLoop']);
+      iosTestLoop = IosTestLoop.fromJson(
+          _json['iosTestLoop'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iosTestSetup')) {
-      iosTestSetup = IosTestSetup.fromJson(_json['iosTestSetup']);
+      iosTestSetup = IosTestSetup.fromJson(
+          _json['iosTestSetup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iosXcTest')) {
-      iosXcTest = IosXcTest.fromJson(_json['iosXcTest']);
+      iosXcTest = IosXcTest.fromJson(
+          _json['iosXcTest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('testSetup')) {
-      testSetup = TestSetup.fromJson(_json['testSetup']);
+      testSetup = TestSetup.fromJson(
+          _json['testSetup'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('testTimeout')) {
       testTimeout = _json['testTimeout'] as core.String;
diff --git a/generated/googleapis/lib/texttospeech/v1.dart b/generated/googleapis/lib/texttospeech/v1.dart
index 600fa69..ce3054e 100644
--- a/generated/googleapis/lib/texttospeech/v1.dart
+++ b/generated/googleapis/lib/texttospeech/v1.dart
@@ -100,7 +100,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SynthesizeSpeechResponse.fromJson(data));
+    return _response.then(
+      (data) => SynthesizeSpeechResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -161,7 +164,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListVoicesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListVoicesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -276,7 +282,8 @@
   ListVoicesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('voices')) {
       voices = (_json['voices'] as core.List)
-          .map<Voice>((value) => Voice.fromJson(value))
+          .map<Voice>((value) =>
+              Voice.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -342,13 +349,16 @@
 
   SynthesizeSpeechRequest.fromJson(core.Map _json) {
     if (_json.containsKey('audioConfig')) {
-      audioConfig = AudioConfig.fromJson(_json['audioConfig']);
+      audioConfig = AudioConfig.fromJson(
+          _json['audioConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('input')) {
-      input = SynthesisInput.fromJson(_json['input']);
+      input = SynthesisInput.fromJson(
+          _json['input'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('voice')) {
-      voice = VoiceSelectionParams.fromJson(_json['voice']);
+      voice = VoiceSelectionParams.fromJson(
+          _json['voice'] as core.Map<core.String, core.dynamic>);
     }
   }
 
diff --git a/generated/googleapis/lib/tpu/v1.dart b/generated/googleapis/lib/tpu/v1.dart
index 7428afb..dbdd28a 100644
--- a/generated/googleapis/lib/tpu/v1.dart
+++ b/generated/googleapis/lib/tpu/v1.dart
@@ -117,7 +117,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -185,7 +187,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -242,7 +247,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AcceleratorType.fromJson(data));
+    return _response.then(
+      (data) =>
+          AcceleratorType.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists accelerator types supported by this API.
@@ -318,8 +326,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListAcceleratorTypesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListAcceleratorTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -387,7 +397,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a node.
@@ -436,7 +448,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the details of a node.
@@ -485,7 +499,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Node.fromJson(data));
+    return _response.then(
+      (data) => Node.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists nodes.
@@ -547,7 +563,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListNodesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListNodesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reimages a node's OS.
@@ -602,7 +621,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Starts a node.
@@ -657,7 +678,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stops a node.
@@ -712,7 +735,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -777,7 +802,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -830,7 +857,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -882,7 +911,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -958,7 +989,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1015,7 +1049,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TensorFlowVersion.fromJson(data));
+    return _response.then(
+      (data) => TensorFlowVersion.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List TensorFlow versions supported by this API.
@@ -1091,8 +1128,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListTensorFlowVersionsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListTensorFlowVersionsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1161,7 +1200,8 @@
   ListAcceleratorTypesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('acceleratorTypes')) {
       acceleratorTypes = (_json['acceleratorTypes'] as core.List)
-          .map<AcceleratorType>((value) => AcceleratorType.fromJson(value))
+          .map<AcceleratorType>((value) => AcceleratorType.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1203,7 +1243,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1242,7 +1283,8 @@
     }
     if (_json.containsKey('nodes')) {
       nodes = (_json['nodes'] as core.List)
-          .map<Node>((value) => Node.fromJson(value))
+          .map<Node>((value) =>
+              Node.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('unreachable')) {
@@ -1283,7 +1325,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1319,7 +1362,8 @@
     }
     if (_json.containsKey('tensorflowVersions')) {
       tensorflowVersions = (_json['tensorflowVersions'] as core.List)
-          .map<TensorFlowVersion>((value) => TensorFlowVersion.fromJson(value))
+          .map<TensorFlowVersion>((value) => TensorFlowVersion.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('unreachable')) {
@@ -1377,7 +1421,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1385,7 +1430,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1574,7 +1620,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('name')) {
@@ -1585,14 +1632,16 @@
     }
     if (_json.containsKey('networkEndpoints')) {
       networkEndpoints = (_json['networkEndpoints'] as core.List)
-          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(value))
+          .map<NetworkEndpoint>((value) => NetworkEndpoint.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('port')) {
       port = _json['port'] as core.String;
     }
     if (_json.containsKey('schedulingConfig')) {
-      schedulingConfig = SchedulingConfig.fromJson(_json['schedulingConfig']);
+      schedulingConfig = SchedulingConfig.fromJson(
+          _json['schedulingConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('serviceAccount')) {
       serviceAccount = _json['serviceAccount'] as core.String;
@@ -1602,7 +1651,8 @@
     }
     if (_json.containsKey('symptoms')) {
       symptoms = (_json['symptoms'] as core.List)
-          .map<Symptom>((value) => Symptom.fromJson(value))
+          .map<Symptom>((value) =>
+              Symptom.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tensorflowVersion')) {
@@ -1718,11 +1768,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1730,7 +1782,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -1935,7 +1988,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/translate/v3.dart b/generated/googleapis/lib/translate/v3.dart
index f01b3b7..49f25a5 100644
--- a/generated/googleapis/lib/translate/v3.dart
+++ b/generated/googleapis/lib/translate/v3.dart
@@ -120,7 +120,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DetectLanguageResponse.fromJson(data));
+    return _response.then(
+      (data) => DetectLanguageResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of supported languages for translation.
@@ -198,7 +201,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SupportedLanguages.fromJson(data));
+    return _response.then(
+      (data) => SupportedLanguages.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Translates input text and returns translated text.
@@ -262,7 +268,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TranslateTextResponse.fromJson(data));
+    return _response.then(
+      (data) => TranslateTextResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -341,7 +350,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Detects the language of text within a request.
@@ -405,7 +416,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => DetectLanguageResponse.fromJson(data));
+    return _response.then(
+      (data) => DetectLanguageResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information about a location.
@@ -454,7 +468,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Location.fromJson(data));
+    return _response.then(
+      (data) => Location.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a list of supported languages for translation.
@@ -532,7 +548,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SupportedLanguages.fromJson(data));
+    return _response.then(
+      (data) => SupportedLanguages.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists information about the supported locations for this service.
@@ -600,7 +619,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListLocationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListLocationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Translates input text and returns translated text.
@@ -664,7 +686,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TranslateTextResponse.fromJson(data));
+    return _response.then(
+      (data) => TranslateTextResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -729,7 +754,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a glossary, or cancels glossary construction if the glossary isn't
@@ -780,7 +807,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a glossary. Returns NOT_FOUND, if the glossary doesn't exist.
@@ -830,7 +859,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Glossary.fromJson(data));
+    return _response.then(
+      (data) => Glossary.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists glossaries in a project. Returns NOT_FOUND, if the project doesn't
@@ -921,7 +952,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGlossariesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGlossariesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -992,7 +1026,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -1045,7 +1081,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -1097,7 +1135,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -1173,7 +1213,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Waits for the specified long-running operation until it is done or reaches
@@ -1237,7 +1280,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1288,26 +1333,32 @@
   BatchTranslateTextRequest.fromJson(core.Map _json) {
     if (_json.containsKey('glossaries')) {
       glossaries = commons.mapMap<core.Map, TranslateTextGlossaryConfig>(
-          _json['glossaries'].cast<core.String, core.Map>(),
-          (core.Map item) => TranslateTextGlossaryConfig.fromJson(item));
+          (_json['glossaries'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => TranslateTextGlossaryConfig.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('inputConfigs')) {
       inputConfigs = (_json['inputConfigs'] as core.List)
-          .map<InputConfig>((value) => InputConfig.fromJson(value))
+          .map<InputConfig>((value) => InputConfig.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('models')) {
       models = commons.mapMap<core.String, core.String>(
-          _json['models'].cast<core.String, core.String>(),
+          (_json['models'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('outputConfig')) {
-      outputConfig = OutputConfig.fromJson(_json['outputConfig']);
+      outputConfig = OutputConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sourceLanguageCode')) {
       sourceLanguageCode = _json['sourceLanguageCode'] as core.String;
@@ -1396,7 +1447,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('mimeType')) {
@@ -1436,7 +1488,8 @@
   DetectLanguageResponse.fromJson(core.Map _json) {
     if (_json.containsKey('languages')) {
       languages = (_json['languages'] as core.List)
-          .map<DetectedLanguage>((value) => DetectedLanguage.fromJson(value))
+          .map<DetectedLanguage>((value) => DetectedLanguage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1583,13 +1636,16 @@
       entryCount = _json['entryCount'] as core.int;
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig = GlossaryInputConfig.fromJson(_json['inputConfig']);
+      inputConfig = GlossaryInputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCodesSet')) {
-      languageCodesSet = LanguageCodesSet.fromJson(_json['languageCodesSet']);
+      languageCodesSet = LanguageCodesSet.fromJson(
+          _json['languageCodesSet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languagePair')) {
-      languagePair = LanguageCodePair.fromJson(_json['languagePair']);
+      languagePair = LanguageCodePair.fromJson(
+          _json['languagePair'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('name')) {
       name = _json['name'] as core.String;
@@ -1647,7 +1703,8 @@
 
   GlossaryInputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('gcsSource')) {
-      gcsSource = GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1686,7 +1743,8 @@
 
   InputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('gcsSource')) {
-      gcsSource = GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -1779,7 +1837,8 @@
   ListGlossariesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('glossaries')) {
       glossaries = (_json['glossaries'] as core.List)
-          .map<Glossary>((value) => Glossary.fromJson(value))
+          .map<Glossary>((value) =>
+              Glossary.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1812,7 +1871,8 @@
   ListLocationsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<Location>((value) => Location.fromJson(value))
+          .map<Location>((value) =>
+              Location.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1848,7 +1908,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1897,7 +1958,8 @@
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('locationId')) {
@@ -1905,7 +1967,8 @@
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1978,11 +2041,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -1990,7 +2055,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -2068,7 +2134,8 @@
 
   OutputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('gcsDestination')) {
-      gcsDestination = GcsDestination.fromJson(_json['gcsDestination']);
+      gcsDestination = GcsDestination.fromJson(
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2113,7 +2180,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -2201,7 +2269,8 @@
   SupportedLanguages.fromJson(core.Map _json) {
     if (_json.containsKey('languages')) {
       languages = (_json['languages'] as core.List)
-          .map<SupportedLanguage>((value) => SupportedLanguage.fromJson(value))
+          .map<SupportedLanguage>((value) => SupportedLanguage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2307,12 +2376,13 @@
           .toList();
     }
     if (_json.containsKey('glossaryConfig')) {
-      glossaryConfig =
-          TranslateTextGlossaryConfig.fromJson(_json['glossaryConfig']);
+      glossaryConfig = TranslateTextGlossaryConfig.fromJson(
+          _json['glossaryConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labels')) {
       labels = commons.mapMap<core.String, core.String>(
-          _json['labels'].cast<core.String, core.String>(),
+          (_json['labels'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('mimeType')) {
@@ -2371,12 +2441,14 @@
   TranslateTextResponse.fromJson(core.Map _json) {
     if (_json.containsKey('glossaryTranslations')) {
       glossaryTranslations = (_json['glossaryTranslations'] as core.List)
-          .map<Translation>((value) => Translation.fromJson(value))
+          .map<Translation>((value) => Translation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('translations')) {
       translations = (_json['translations'] as core.List)
-          .map<Translation>((value) => Translation.fromJson(value))
+          .map<Translation>((value) => Translation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2424,8 +2496,8 @@
       detectedLanguageCode = _json['detectedLanguageCode'] as core.String;
     }
     if (_json.containsKey('glossaryConfig')) {
-      glossaryConfig =
-          TranslateTextGlossaryConfig.fromJson(_json['glossaryConfig']);
+      glossaryConfig = TranslateTextGlossaryConfig.fromJson(
+          _json['glossaryConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('model')) {
       model = _json['model'] as core.String;
diff --git a/generated/googleapis/lib/vault/v1.dart b/generated/googleapis/lib/vault/v1.dart
index 4f72f48..85a6501 100644
--- a/generated/googleapis/lib/vault/v1.dart
+++ b/generated/googleapis/lib/vault/v1.dart
@@ -115,7 +115,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MatterPermission.fromJson(data));
+    return _response.then(
+      (data) => MatterPermission.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Closes the specified matter. Returns matter with updated state.
@@ -170,7 +173,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CloseMatterResponse.fromJson(data));
+    return _response.then(
+      (data) => CloseMatterResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a new matter with the given name and description. The initial
@@ -220,7 +226,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Matter.fromJson(data));
+    return _response.then(
+      (data) => Matter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes the specified matter. Returns matter with updated state.
@@ -268,7 +276,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Matter.fromJson(data));
+    return _response.then(
+      (data) => Matter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the specified matter.
@@ -328,7 +338,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Matter.fromJson(data));
+    return _response.then(
+      (data) => Matter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists matters the user has access to.
@@ -407,7 +419,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListMattersResponse.fromJson(data));
+    return _response.then(
+      (data) => ListMattersResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes an account as a matter collaborator.
@@ -463,7 +478,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Reopens the specified matter. Returns matter with updated state.
@@ -518,7 +535,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReopenMatterResponse.fromJson(data));
+    return _response.then(
+      (data) => ReopenMatterResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Undeletes the specified matter. Returns matter with updated state.
@@ -574,7 +594,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Matter.fromJson(data));
+    return _response.then(
+      (data) => Matter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the specified matter. This updates only the name and description
@@ -630,7 +652,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Matter.fromJson(data));
+    return _response.then(
+      (data) => Matter.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -691,7 +715,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Export.fromJson(data));
+    return _response.then(
+      (data) => Export.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an Export.
@@ -748,7 +774,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets an Export.
@@ -805,7 +833,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Export.fromJson(data));
+    return _response.then(
+      (data) => Export.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists Exports.
@@ -866,7 +896,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListExportsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListExportsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -941,7 +974,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AddHeldAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => AddHeldAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a hold in the given matter.
@@ -996,7 +1032,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Hold.fromJson(data));
+    return _response.then(
+      (data) => Hold.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a hold by ID. This will release any HeldAccounts on this Hold.
@@ -1053,7 +1091,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a hold by ID.
@@ -1124,7 +1164,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Hold.fromJson(data));
+    return _response.then(
+      (data) => Hold.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists holds within a matter. An empty page token in ListHoldsResponse
@@ -1203,7 +1245,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListHoldsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListHoldsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes HeldAccounts from a hold. Returns a list of statuses in the same
@@ -1269,7 +1314,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => RemoveHeldAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => RemoveHeldAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates the OU and/or query parameters of a hold. You cannot add accounts
@@ -1334,7 +1382,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Hold.fromJson(data));
+    return _response.then(
+      (data) => Hold.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1407,7 +1457,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => HeldAccount.fromJson(data));
+    return _response.then(
+      (data) =>
+          HeldAccount.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a HeldAccount from a hold. If this request leaves the hold with no
@@ -1473,7 +1526,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists HeldAccounts for a hold. This will only list individually specified
@@ -1533,7 +1588,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListHeldAccountsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListHeldAccountsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1597,7 +1655,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedQuery.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedQuery.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a saved query by Id.
@@ -1655,7 +1716,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a saved query by Id.
@@ -1713,7 +1776,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SavedQuery.fromJson(data));
+    return _response.then(
+      (data) =>
+          SavedQuery.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists saved queries within a matter. An empty page token in
@@ -1778,7 +1844,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListSavedQueriesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListSavedQueriesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1836,7 +1905,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1877,10 +1948,12 @@
 
   AddHeldAccountResult.fromJson(core.Map _json) {
     if (_json.containsKey('account')) {
-      account = HeldAccount.fromJson(_json['account']);
+      account = HeldAccount.fromJson(
+          _json['account'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = Status.fromJson(_json['status']);
+      status = Status.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1943,8 +2016,8 @@
   AddHeldAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<AddHeldAccountResult>(
-              (value) => AddHeldAccountResult.fromJson(value))
+          .map<AddHeldAccountResult>((value) => AddHeldAccountResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1979,7 +2052,8 @@
       ccMe = _json['ccMe'] as core.bool;
     }
     if (_json.containsKey('matterPermission')) {
-      matterPermission = MatterPermission.fromJson(_json['matterPermission']);
+      matterPermission = MatterPermission.fromJson(
+          _json['matterPermission'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sendEmails')) {
       sendEmails = _json['sendEmails'] as core.bool;
@@ -2024,7 +2098,8 @@
 
   CloseMatterResponse.fromJson(core.Map _json) {
     if (_json.containsKey('matter')) {
-      matter = Matter.fromJson(_json['matter']);
+      matter = Matter.fromJson(
+          _json['matter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2099,7 +2174,8 @@
   CloudStorageSink.fromJson(core.Map _json) {
     if (_json.containsKey('files')) {
       files = (_json['files'] as core.List)
-          .map<CloudStorageFile>((value) => CloudStorageFile.fromJson(value))
+          .map<CloudStorageFile>((value) => CloudStorageFile.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2132,17 +2208,20 @@
 
   CorpusQuery.fromJson(core.Map _json) {
     if (_json.containsKey('driveQuery')) {
-      driveQuery = HeldDriveQuery.fromJson(_json['driveQuery']);
+      driveQuery = HeldDriveQuery.fromJson(
+          _json['driveQuery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupsQuery')) {
-      groupsQuery = HeldGroupsQuery.fromJson(_json['groupsQuery']);
+      groupsQuery = HeldGroupsQuery.fromJson(
+          _json['groupsQuery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hangoutsChatQuery')) {
-      hangoutsChatQuery =
-          HeldHangoutsChatQuery.fromJson(_json['hangoutsChatQuery']);
+      hangoutsChatQuery = HeldHangoutsChatQuery.fromJson(
+          _json['hangoutsChatQuery'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mailQuery')) {
-      mailQuery = HeldMailQuery.fromJson(_json['mailQuery']);
+      mailQuery = HeldMailQuery.fromJson(
+          _json['mailQuery'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2287,13 +2366,15 @@
 
   Export.fromJson(core.Map _json) {
     if (_json.containsKey('cloudStorageSink')) {
-      cloudStorageSink = CloudStorageSink.fromJson(_json['cloudStorageSink']);
+      cloudStorageSink = CloudStorageSink.fromJson(
+          _json['cloudStorageSink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('createTime')) {
       createTime = _json['createTime'] as core.String;
     }
     if (_json.containsKey('exportOptions')) {
-      exportOptions = ExportOptions.fromJson(_json['exportOptions']);
+      exportOptions = ExportOptions.fromJson(
+          _json['exportOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -2305,13 +2386,16 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('query')) {
-      query = Query.fromJson(_json['query']);
+      query =
+          Query.fromJson(_json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('requester')) {
-      requester = UserInfo.fromJson(_json['requester']);
+      requester = UserInfo.fromJson(
+          _json['requester'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('stats')) {
-      stats = ExportStats.fromJson(_json['stats']);
+      stats = ExportStats.fromJson(
+          _json['stats'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
       status = _json['status'] as core.String;
@@ -2381,17 +2465,20 @@
 
   ExportOptions.fromJson(core.Map _json) {
     if (_json.containsKey('driveOptions')) {
-      driveOptions = DriveExportOptions.fromJson(_json['driveOptions']);
+      driveOptions = DriveExportOptions.fromJson(
+          _json['driveOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('groupsOptions')) {
-      groupsOptions = GroupsExportOptions.fromJson(_json['groupsOptions']);
+      groupsOptions = GroupsExportOptions.fromJson(
+          _json['groupsOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hangoutsChatOptions')) {
-      hangoutsChatOptions =
-          HangoutsChatExportOptions.fromJson(_json['hangoutsChatOptions']);
+      hangoutsChatOptions = HangoutsChatExportOptions.fromJson(
+          _json['hangoutsChatOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mailOptions')) {
-      mailOptions = MailExportOptions.fromJson(_json['mailOptions']);
+      mailOptions = MailExportOptions.fromJson(
+          _json['mailOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('region')) {
       region = _json['region'] as core.String;
@@ -2826,7 +2913,8 @@
   Hold.fromJson(core.Map _json) {
     if (_json.containsKey('accounts')) {
       accounts = (_json['accounts'] as core.List)
-          .map<HeldAccount>((value) => HeldAccount.fromJson(value))
+          .map<HeldAccount>((value) => HeldAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('corpus')) {
@@ -2839,10 +2927,12 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('orgUnit')) {
-      orgUnit = HeldOrgUnit.fromJson(_json['orgUnit']);
+      orgUnit = HeldOrgUnit.fromJson(
+          _json['orgUnit'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('query')) {
-      query = CorpusQuery.fromJson(_json['query']);
+      query = CorpusQuery.fromJson(
+          _json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('updateTime')) {
       updateTime = _json['updateTime'] as core.String;
@@ -2889,7 +2979,8 @@
   ListExportsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('exports')) {
       exports = (_json['exports'] as core.List)
-          .map<Export>((value) => Export.fromJson(value))
+          .map<Export>((value) =>
+              Export.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2919,7 +3010,8 @@
   ListHeldAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('accounts')) {
       accounts = (_json['accounts'] as core.List)
-          .map<HeldAccount>((value) => HeldAccount.fromJson(value))
+          .map<HeldAccount>((value) => HeldAccount.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2947,7 +3039,8 @@
   ListHoldsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('holds')) {
       holds = (_json['holds'] as core.List)
-          .map<Hold>((value) => Hold.fromJson(value))
+          .map<Hold>((value) =>
+              Hold.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -2980,7 +3073,8 @@
   ListMattersResponse.fromJson(core.Map _json) {
     if (_json.containsKey('matters')) {
       matters = (_json['matters'] as core.List)
-          .map<Matter>((value) => Matter.fromJson(value))
+          .map<Matter>((value) =>
+              Matter.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -3017,7 +3111,8 @@
     }
     if (_json.containsKey('savedQueries')) {
       savedQueries = (_json['savedQueries'] as core.List)
-          .map<SavedQuery>((value) => SavedQuery.fromJson(value))
+          .map<SavedQuery>((value) =>
+              SavedQuery.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3128,7 +3223,8 @@
     }
     if (_json.containsKey('matterPermissions')) {
       matterPermissions = (_json['matterPermissions'] as core.List)
-          .map<MatterPermission>((value) => MatterPermission.fromJson(value))
+          .map<MatterPermission>((value) => MatterPermission.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -3324,7 +3420,8 @@
 
   Query.fromJson(core.Map _json) {
     if (_json.containsKey('accountInfo')) {
-      accountInfo = AccountInfo.fromJson(_json['accountInfo']);
+      accountInfo = AccountInfo.fromJson(
+          _json['accountInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('corpus')) {
       corpus = _json['corpus'] as core.String;
@@ -3333,38 +3430,44 @@
       dataScope = _json['dataScope'] as core.String;
     }
     if (_json.containsKey('driveOptions')) {
-      driveOptions = DriveOptions.fromJson(_json['driveOptions']);
+      driveOptions = DriveOptions.fromJson(
+          _json['driveOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('endTime')) {
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('hangoutsChatInfo')) {
-      hangoutsChatInfo = HangoutsChatInfo.fromJson(_json['hangoutsChatInfo']);
+      hangoutsChatInfo = HangoutsChatInfo.fromJson(
+          _json['hangoutsChatInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hangoutsChatOptions')) {
-      hangoutsChatOptions =
-          HangoutsChatOptions.fromJson(_json['hangoutsChatOptions']);
+      hangoutsChatOptions = HangoutsChatOptions.fromJson(
+          _json['hangoutsChatOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mailOptions')) {
-      mailOptions = MailOptions.fromJson(_json['mailOptions']);
+      mailOptions = MailOptions.fromJson(
+          _json['mailOptions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('method')) {
       method = _json['method'] as core.String;
     }
     if (_json.containsKey('orgUnitInfo')) {
-      orgUnitInfo = OrgUnitInfo.fromJson(_json['orgUnitInfo']);
+      orgUnitInfo = OrgUnitInfo.fromJson(
+          _json['orgUnitInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('searchMethod')) {
       searchMethod = _json['searchMethod'] as core.String;
     }
     if (_json.containsKey('sharedDriveInfo')) {
-      sharedDriveInfo = SharedDriveInfo.fromJson(_json['sharedDriveInfo']);
+      sharedDriveInfo = SharedDriveInfo.fromJson(
+          _json['sharedDriveInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
     }
     if (_json.containsKey('teamDriveInfo')) {
-      teamDriveInfo = TeamDriveInfo.fromJson(_json['teamDriveInfo']);
+      teamDriveInfo = TeamDriveInfo.fromJson(
+          _json['teamDriveInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('terms')) {
       terms = _json['terms'] as core.String;
@@ -3463,7 +3566,8 @@
   RemoveHeldAccountsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('statuses')) {
       statuses = (_json['statuses'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3522,7 +3626,8 @@
 
   ReopenMatterResponse.fromJson(core.Map _json) {
     if (_json.containsKey('matter')) {
-      matter = Matter.fromJson(_json['matter']);
+      matter = Matter.fromJson(
+          _json['matter'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3568,7 +3673,8 @@
       matterId = _json['matterId'] as core.String;
     }
     if (_json.containsKey('query')) {
-      query = Query.fromJson(_json['query']);
+      query =
+          Query.fromJson(_json['query'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('savedQueryId')) {
       savedQueryId = _json['savedQueryId'] as core.String;
@@ -3652,7 +3758,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/verifiedaccess/v1.dart b/generated/googleapis/lib/verifiedaccess/v1.dart
index 3c2c12a..a0e7d37 100644
--- a/generated/googleapis/lib/verifiedaccess/v1.dart
+++ b/generated/googleapis/lib/verifiedaccess/v1.dart
@@ -98,7 +98,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Challenge.fromJson(data));
+    return _response.then(
+      (data) => Challenge.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// VerifyChallengeResponse API
@@ -146,8 +148,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => VerifyChallengeResponseResult.fromJson(data));
+    return _response.then(
+      (data) => VerifyChallengeResponseResult.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -164,10 +168,12 @@
 
   Challenge.fromJson(core.Map _json) {
     if (_json.containsKey('alternativeChallenge')) {
-      alternativeChallenge = SignedData.fromJson(_json['alternativeChallenge']);
+      alternativeChallenge = SignedData.fromJson(
+          _json['alternativeChallenge'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('challenge')) {
-      challenge = SignedData.fromJson(_json['challenge']);
+      challenge = SignedData.fromJson(
+          _json['challenge'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -260,7 +266,8 @@
 
   VerifyChallengeResponseRequest.fromJson(core.Map _json) {
     if (_json.containsKey('challengeResponse')) {
-      challengeResponse = SignedData.fromJson(_json['challengeResponse']);
+      challengeResponse = SignedData.fromJson(
+          _json['challengeResponse'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('expectedIdentity')) {
       expectedIdentity = _json['expectedIdentity'] as core.String;
diff --git a/generated/googleapis/lib/videointelligence/v1.dart b/generated/googleapis/lib/videointelligence/v1.dart
index 010d58a..e46d30e 100644
--- a/generated/googleapis/lib/videointelligence/v1.dart
+++ b/generated/googleapis/lib/videointelligence/v1.dart
@@ -143,7 +143,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -196,7 +199,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -248,7 +254,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -340,7 +349,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -409,7 +421,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -480,7 +495,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -533,7 +551,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleProtobufEmpty.fromJson(data));
+    return _response.then(
+      (data) => GoogleProtobufEmpty.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -585,7 +606,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -661,8 +685,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => GoogleLongrunningListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -719,7 +745,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GoogleLongrunningOperation.fromJson(data));
+    return _response.then(
+      (data) => GoogleLongrunningOperation.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -738,7 +767,7 @@
       annotationProgress = (_json['annotationProgress'] as core.List)
           .map<GoogleCloudVideointelligenceV1VideoAnnotationProgress>((value) =>
               GoogleCloudVideointelligenceV1VideoAnnotationProgress.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -820,7 +849,7 @@
     }
     if (_json.containsKey('videoContext')) {
       videoContext = GoogleCloudVideointelligenceV1VideoContext.fromJson(
-          _json['videoContext']);
+          _json['videoContext'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -863,7 +892,7 @@
       annotationResults = (_json['annotationResults'] as core.List)
           .map<GoogleCloudVideointelligenceV1VideoAnnotationResults>((value) =>
               GoogleCloudVideointelligenceV1VideoAnnotationResults.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -944,7 +973,7 @@
     }
     if (_json.containsKey('point')) {
       point = GoogleCloudVideointelligenceV1NormalizedVertex.fromJson(
-          _json['point']);
+          _json['point'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1022,7 +1051,7 @@
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1ExplicitContentFrame>((value) =>
               GoogleCloudVideointelligenceV1ExplicitContentFrame.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -1129,23 +1158,27 @@
   GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('categoryEntities')) {
       categoryEntities = (_json['categoryEntities'] as core.List)
-          .map<GoogleCloudVideointelligenceV1Entity>(
-              (value) => GoogleCloudVideointelligenceV1Entity.fromJson(value))
+          .map<GoogleCloudVideointelligenceV1Entity>((value) =>
+              GoogleCloudVideointelligenceV1Entity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entity')) {
-      entity = GoogleCloudVideointelligenceV1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1LabelFrame>((value) =>
-              GoogleCloudVideointelligenceV1LabelFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1LabelFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1LabelSegment>((value) =>
-              GoogleCloudVideointelligenceV1LabelSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1LabelSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -1302,8 +1335,8 @@
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
-      segment =
-          GoogleCloudVideointelligenceV1VideoSegment.fromJson(_json['segment']);
+      segment = GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1338,18 +1371,21 @@
   GoogleCloudVideointelligenceV1LogoRecognitionAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('entity')) {
-      entity = GoogleCloudVideointelligenceV1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
-          .map<GoogleCloudVideointelligenceV1Track>(
-              (value) => GoogleCloudVideointelligenceV1Track.fromJson(value))
+          .map<GoogleCloudVideointelligenceV1Track>((value) =>
+              GoogleCloudVideointelligenceV1Track.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1438,7 +1474,8 @@
     if (_json.containsKey('vertices')) {
       vertices = (_json['vertices'] as core.List)
           .map<GoogleCloudVideointelligenceV1NormalizedVertex>((value) =>
-              GoogleCloudVideointelligenceV1NormalizedVertex.fromJson(value))
+              GoogleCloudVideointelligenceV1NormalizedVertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1520,17 +1557,19 @@
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
-      entity = GoogleCloudVideointelligenceV1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1ObjectTrackingFrame>((value) =>
-              GoogleCloudVideointelligenceV1ObjectTrackingFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1ObjectTrackingFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
-      segment =
-          GoogleCloudVideointelligenceV1VideoSegment.fromJson(_json['segment']);
+      segment = GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trackId')) {
       trackId = _json['trackId'] as core.String;
@@ -1602,7 +1641,8 @@
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -1705,8 +1745,9 @@
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<GoogleCloudVideointelligenceV1WordInfo>(
-              (value) => GoogleCloudVideointelligenceV1WordInfo.fromJson(value))
+          .map<GoogleCloudVideointelligenceV1WordInfo>((value) =>
+              GoogleCloudVideointelligenceV1WordInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1748,7 +1789,7 @@
           .map<GoogleCloudVideointelligenceV1SpeechRecognitionAlternative>(
               (value) =>
                   GoogleCloudVideointelligenceV1SpeechRecognitionAlternative
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('languageCode')) {
@@ -1858,7 +1899,8 @@
     if (_json.containsKey('speechContexts')) {
       speechContexts = (_json['speechContexts'] as core.List)
           .map<GoogleCloudVideointelligenceV1SpeechContext>((value) =>
-              GoogleCloudVideointelligenceV1SpeechContext.fromJson(value))
+              GoogleCloudVideointelligenceV1SpeechContext.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1916,7 +1958,8 @@
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1TextSegment>((value) =>
-              GoogleCloudVideointelligenceV1TextSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1TextSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -1995,7 +2038,8 @@
     if (_json.containsKey('rotatedBoundingBox')) {
       rotatedBoundingBox =
           GoogleCloudVideointelligenceV1NormalizedBoundingPoly.fromJson(
-              _json['rotatedBoundingBox']);
+              _json['rotatedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -2035,12 +2079,13 @@
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1TextFrame>((value) =>
-              GoogleCloudVideointelligenceV1TextFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1TextFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
-      segment =
-          GoogleCloudVideointelligenceV1VideoSegment.fromJson(_json['segment']);
+      segment = GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2081,19 +2126,22 @@
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1DetectedAttribute>((value) =>
-              GoogleCloudVideointelligenceV1DetectedAttribute.fromJson(value))
+              GoogleCloudVideointelligenceV1DetectedAttribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVideointelligenceV1DetectedLandmark>((value) =>
-              GoogleCloudVideointelligenceV1DetectedLandmark.fromJson(value))
+              GoogleCloudVideointelligenceV1DetectedLandmark.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -2138,20 +2186,22 @@
     if (_json.containsKey('attributes')) {
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1DetectedAttribute>((value) =>
-              GoogleCloudVideointelligenceV1DetectedAttribute.fromJson(value))
+              GoogleCloudVideointelligenceV1DetectedAttribute.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('segment')) {
-      segment =
-          GoogleCloudVideointelligenceV1VideoSegment.fromJson(_json['segment']);
+      segment = GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampedObjects')) {
       timestampedObjects = (_json['timestampedObjects'] as core.List)
           .map<GoogleCloudVideointelligenceV1TimestampedObject>((value) =>
-              GoogleCloudVideointelligenceV1TimestampedObject.fromJson(value))
+              GoogleCloudVideointelligenceV1TimestampedObject.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2222,8 +2272,8 @@
       progressPercent = _json['progressPercent'] as core.int;
     }
     if (_json.containsKey('segment')) {
-      segment =
-          GoogleCloudVideointelligenceV1VideoSegment.fromJson(_json['segment']);
+      segment = GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -2328,17 +2378,20 @@
   GoogleCloudVideointelligenceV1VideoAnnotationResults.fromJson(
       core.Map _json) {
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('explicitAnnotation')) {
       explicitAnnotation =
           GoogleCloudVideointelligenceV1ExplicitContentAnnotation.fromJson(
-              _json['explicitAnnotation']);
+              _json['explicitAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frameLabelAnnotations')) {
       frameLabelAnnotations = (_json['frameLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1LabelAnnotation>((value) =>
-              GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(value))
+              GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inputUri')) {
@@ -2349,62 +2402,69 @@
               as core.List)
           .map<GoogleCloudVideointelligenceV1LogoRecognitionAnnotation>(
               (value) => GoogleCloudVideointelligenceV1LogoRecognitionAnnotation
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectAnnotations')) {
       objectAnnotations = (_json['objectAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1ObjectTrackingAnnotation>(
               (value) => GoogleCloudVideointelligenceV1ObjectTrackingAnnotation
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
-      segment =
-          GoogleCloudVideointelligenceV1VideoSegment.fromJson(_json['segment']);
+      segment = GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segmentLabelAnnotations')) {
       segmentLabelAnnotations = (_json['segmentLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1LabelAnnotation>((value) =>
-              GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(value))
+              GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segmentPresenceLabelAnnotations')) {
       segmentPresenceLabelAnnotations =
           (_json['segmentPresenceLabelAnnotations'] as core.List)
               .map<GoogleCloudVideointelligenceV1LabelAnnotation>((value) =>
-                  GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(value))
+                  GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('shotAnnotations')) {
       shotAnnotations = (_json['shotAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotLabelAnnotations')) {
       shotLabelAnnotations = (_json['shotLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1LabelAnnotation>((value) =>
-              GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(value))
+              GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotPresenceLabelAnnotations')) {
       shotPresenceLabelAnnotations =
           (_json['shotPresenceLabelAnnotations'] as core.List)
               .map<GoogleCloudVideointelligenceV1LabelAnnotation>((value) =>
-                  GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(value))
+                  GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('speechTranscriptions')) {
       speechTranscriptions = (_json['speechTranscriptions'] as core.List)
           .map<GoogleCloudVideointelligenceV1SpeechTranscription>((value) =>
-              GoogleCloudVideointelligenceV1SpeechTranscription.fromJson(value))
+              GoogleCloudVideointelligenceV1SpeechTranscription.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1TextAnnotation>((value) =>
-              GoogleCloudVideointelligenceV1TextAnnotation.fromJson(value))
+              GoogleCloudVideointelligenceV1TextAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2502,38 +2562,45 @@
     if (_json.containsKey('explicitContentDetectionConfig')) {
       explicitContentDetectionConfig =
           GoogleCloudVideointelligenceV1ExplicitContentDetectionConfig.fromJson(
-              _json['explicitContentDetectionConfig']);
+              _json['explicitContentDetectionConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelDetectionConfig')) {
       labelDetectionConfig =
           GoogleCloudVideointelligenceV1LabelDetectionConfig.fromJson(
-              _json['labelDetectionConfig']);
+              _json['labelDetectionConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectTrackingConfig')) {
       objectTrackingConfig =
           GoogleCloudVideointelligenceV1ObjectTrackingConfig.fromJson(
-              _json['objectTrackingConfig']);
+              _json['objectTrackingConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotChangeDetectionConfig')) {
       shotChangeDetectionConfig =
           GoogleCloudVideointelligenceV1ShotChangeDetectionConfig.fromJson(
-              _json['shotChangeDetectionConfig']);
+              _json['shotChangeDetectionConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('speechTranscriptionConfig')) {
       speechTranscriptionConfig =
           GoogleCloudVideointelligenceV1SpeechTranscriptionConfig.fromJson(
-              _json['speechTranscriptionConfig']);
+              _json['speechTranscriptionConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textDetectionConfig')) {
       textDetectionConfig =
           GoogleCloudVideointelligenceV1TextDetectionConfig.fromJson(
-              _json['textDetectionConfig']);
+              _json['textDetectionConfig']
+                  as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2690,7 +2757,7 @@
           .map<GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress>(
               (value) =>
                   GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2722,7 +2789,7 @@
           .map<GoogleCloudVideointelligenceV1beta2VideoAnnotationResults>(
               (value) =>
                   GoogleCloudVideointelligenceV1beta2VideoAnnotationResults
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2804,7 +2871,7 @@
     }
     if (_json.containsKey('point')) {
       point = GoogleCloudVideointelligenceV1beta2NormalizedVertex.fromJson(
-          _json['point']);
+          _json['point'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2882,7 +2949,7 @@
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2ExplicitContentFrame>(
               (value) => GoogleCloudVideointelligenceV1beta2ExplicitContentFrame
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -2967,23 +3034,26 @@
     if (_json.containsKey('categoryEntities')) {
       categoryEntities = (_json['categoryEntities'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2Entity>((value) =>
-              GoogleCloudVideointelligenceV1beta2Entity.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2Entity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1beta2Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1beta2Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2LabelFrame>((value) =>
-              GoogleCloudVideointelligenceV1beta2LabelFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2LabelFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2LabelSegment>((value) =>
-              GoogleCloudVideointelligenceV1beta2LabelSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2LabelSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -3061,7 +3131,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3096,19 +3166,21 @@
   GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1beta2Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1beta2Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2Track>((value) =>
-              GoogleCloudVideointelligenceV1beta2Track.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2Track.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3199,7 +3271,7 @@
       vertices = (_json['vertices'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2NormalizedVertex>((value) =>
               GoogleCloudVideointelligenceV1beta2NormalizedVertex.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3281,19 +3353,19 @@
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1beta2Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1beta2Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame>(
               (value) => GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trackId')) {
       trackId = _json['trackId'] as core.String;
@@ -3344,7 +3416,8 @@
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -3394,7 +3467,8 @@
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2WordInfo>((value) =>
-              GoogleCloudVideointelligenceV1beta2WordInfo.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2WordInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3437,7 +3511,7 @@
           .map<GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative>(
               (value) =>
                   GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('languageCode')) {
@@ -3477,7 +3551,8 @@
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2TextSegment>((value) =>
-              GoogleCloudVideointelligenceV1beta2TextSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2TextSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -3519,7 +3594,8 @@
     if (_json.containsKey('rotatedBoundingBox')) {
       rotatedBoundingBox =
           GoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly.fromJson(
-              _json['rotatedBoundingBox']);
+              _json['rotatedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -3559,12 +3635,13 @@
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2TextFrame>((value) =>
-              GoogleCloudVideointelligenceV1beta2TextFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2TextFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3608,20 +3685,21 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2DetectedAttribute>((value) =>
               GoogleCloudVideointelligenceV1beta2DetectedAttribute.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2DetectedLandmark>((value) =>
               GoogleCloudVideointelligenceV1beta2DetectedLandmark.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -3668,7 +3746,7 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2DetectedAttribute>((value) =>
               GoogleCloudVideointelligenceV1beta2DetectedAttribute.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -3676,13 +3754,13 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampedObjects')) {
       timestampedObjects = (_json['timestampedObjects'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2TimestampedObject>((value) =>
               GoogleCloudVideointelligenceV1beta2TimestampedObject.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3754,7 +3832,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -3861,18 +3939,20 @@
   GoogleCloudVideointelligenceV1beta2VideoAnnotationResults.fromJson(
       core.Map _json) {
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('explicitAnnotation')) {
       explicitAnnotation =
           GoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation.fromJson(
-              _json['explicitAnnotation']);
+              _json['explicitAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frameLabelAnnotations')) {
       frameLabelAnnotations = (_json['frameLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1beta2LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inputUri')) {
@@ -3884,7 +3964,7 @@
           .map<GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectAnnotations')) {
@@ -3892,18 +3972,18 @@
           .map<GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segmentLabelAnnotations')) {
       segmentLabelAnnotations = (_json['segmentLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1beta2LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segmentPresenceLabelAnnotations')) {
@@ -3911,20 +3991,21 @@
           (_json['segmentPresenceLabelAnnotations'] as core.List)
               .map<GoogleCloudVideointelligenceV1beta2LabelAnnotation>(
                   (value) => GoogleCloudVideointelligenceV1beta2LabelAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('shotAnnotations')) {
       shotAnnotations = (_json['shotAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotLabelAnnotations')) {
       shotLabelAnnotations = (_json['shotLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1beta2LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotPresenceLabelAnnotations')) {
@@ -3932,20 +4013,21 @@
               as core.List)
           .map<GoogleCloudVideointelligenceV1beta2LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1beta2LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('speechTranscriptions')) {
       speechTranscriptions = (_json['speechTranscriptions'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2SpeechTranscription>(
               (value) => GoogleCloudVideointelligenceV1beta2SpeechTranscription
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1beta2TextAnnotation>((value) =>
-              GoogleCloudVideointelligenceV1beta2TextAnnotation.fromJson(value))
+              GoogleCloudVideointelligenceV1beta2TextAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4134,7 +4216,7 @@
           .map<GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4166,7 +4248,7 @@
           .map<GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4249,7 +4331,7 @@
     }
     if (_json.containsKey('point')) {
       point = GoogleCloudVideointelligenceV1p1beta1NormalizedVertex.fromJson(
-          _json['point']);
+          _json['point'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4328,7 +4410,7 @@
           .map<GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -4414,23 +4496,26 @@
     if (_json.containsKey('categoryEntities')) {
       categoryEntities = (_json['categoryEntities'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1Entity>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1LabelFrame>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1LabelFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1LabelFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1LabelSegment>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1LabelSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1LabelSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -4508,7 +4593,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4543,19 +4628,21 @@
   GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1Track>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1Track.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1Track.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4646,7 +4733,7 @@
       vertices = (_json['vertices'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1NormalizedVertex>((value) =>
               GoogleCloudVideointelligenceV1p1beta1NormalizedVertex.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4729,20 +4816,20 @@
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trackId')) {
       trackId = _json['trackId'] as core.String;
@@ -4793,7 +4880,8 @@
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -4843,7 +4931,8 @@
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1WordInfo>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1WordInfo.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1WordInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4886,7 +4975,7 @@
           .map<GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('languageCode')) {
@@ -4926,7 +5015,8 @@
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1TextSegment>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1TextSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1TextSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -4969,7 +5059,8 @@
     if (_json.containsKey('rotatedBoundingBox')) {
       rotatedBoundingBox =
           GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly.fromJson(
-              _json['rotatedBoundingBox']);
+              _json['rotatedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -5009,12 +5100,13 @@
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1TextFrame>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1TextFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1TextFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5058,20 +5150,21 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1DetectedAttribute>(
               (value) => GoogleCloudVideointelligenceV1p1beta1DetectedAttribute
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1DetectedLandmark>((value) =>
               GoogleCloudVideointelligenceV1p1beta1DetectedLandmark.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -5118,7 +5211,7 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1DetectedAttribute>(
               (value) => GoogleCloudVideointelligenceV1p1beta1DetectedAttribute
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -5126,13 +5219,13 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampedObjects')) {
       timestampedObjects = (_json['timestampedObjects'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1TimestampedObject>(
               (value) => GoogleCloudVideointelligenceV1p1beta1TimestampedObject
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5204,7 +5297,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -5312,18 +5405,20 @@
   GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults.fromJson(
       core.Map _json) {
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('explicitAnnotation')) {
       explicitAnnotation =
           GoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation
-              .fromJson(_json['explicitAnnotation']);
+              .fromJson(_json['explicitAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frameLabelAnnotations')) {
       frameLabelAnnotations = (_json['frameLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p1beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inputUri')) {
@@ -5335,7 +5430,7 @@
           .map<GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectAnnotations')) {
@@ -5343,40 +5438,40 @@
           .map<GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segmentLabelAnnotations')) {
       segmentLabelAnnotations = (_json['segmentLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p1beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segmentPresenceLabelAnnotations')) {
-      segmentPresenceLabelAnnotations =
-          (_json['segmentPresenceLabelAnnotations'] as core.List)
-              .map<GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>(
-                  (value) =>
-                      GoogleCloudVideointelligenceV1p1beta1LabelAnnotation
-                          .fromJson(value))
-              .toList();
+      segmentPresenceLabelAnnotations = (_json[
+              'segmentPresenceLabelAnnotations'] as core.List)
+          .map<GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>((value) =>
+              GoogleCloudVideointelligenceV1p1beta1LabelAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
     if (_json.containsKey('shotAnnotations')) {
       shotAnnotations = (_json['shotAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotLabelAnnotations')) {
       shotLabelAnnotations = (_json['shotLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p1beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotPresenceLabelAnnotations')) {
@@ -5384,7 +5479,7 @@
               as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p1beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('speechTranscriptions')) {
@@ -5392,14 +5487,14 @@
           .map<GoogleCloudVideointelligenceV1p1beta1SpeechTranscription>(
               (value) =>
                   GoogleCloudVideointelligenceV1p1beta1SpeechTranscription
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p1beta1TextAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p1beta1TextAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5588,7 +5683,7 @@
           .map<GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5620,7 +5715,7 @@
           .map<GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5703,7 +5798,7 @@
     }
     if (_json.containsKey('point')) {
       point = GoogleCloudVideointelligenceV1p2beta1NormalizedVertex.fromJson(
-          _json['point']);
+          _json['point'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5782,7 +5877,7 @@
           .map<GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -5868,23 +5963,26 @@
     if (_json.containsKey('categoryEntities')) {
       categoryEntities = (_json['categoryEntities'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1Entity>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1LabelFrame>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1LabelFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1LabelFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1LabelSegment>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1LabelSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1LabelSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -5962,7 +6060,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5997,19 +6095,21 @@
   GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1Track>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1Track.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1Track.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6100,7 +6200,7 @@
       vertices = (_json['vertices'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1NormalizedVertex>((value) =>
               GoogleCloudVideointelligenceV1p2beta1NormalizedVertex.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6183,20 +6283,20 @@
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trackId')) {
       trackId = _json['trackId'] as core.String;
@@ -6247,7 +6347,8 @@
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -6297,7 +6398,8 @@
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1WordInfo>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1WordInfo.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1WordInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6340,7 +6442,7 @@
           .map<GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('languageCode')) {
@@ -6380,7 +6482,8 @@
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1TextSegment>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1TextSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1TextSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -6423,7 +6526,8 @@
     if (_json.containsKey('rotatedBoundingBox')) {
       rotatedBoundingBox =
           GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly.fromJson(
-              _json['rotatedBoundingBox']);
+              _json['rotatedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -6463,12 +6567,13 @@
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1TextFrame>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1TextFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1TextFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6512,20 +6617,21 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1DetectedAttribute>(
               (value) => GoogleCloudVideointelligenceV1p2beta1DetectedAttribute
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1DetectedLandmark>((value) =>
               GoogleCloudVideointelligenceV1p2beta1DetectedLandmark.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -6572,7 +6678,7 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1DetectedAttribute>(
               (value) => GoogleCloudVideointelligenceV1p2beta1DetectedAttribute
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -6580,13 +6686,13 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampedObjects')) {
       timestampedObjects = (_json['timestampedObjects'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1TimestampedObject>(
               (value) => GoogleCloudVideointelligenceV1p2beta1TimestampedObject
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6658,7 +6764,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -6766,18 +6872,20 @@
   GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults.fromJson(
       core.Map _json) {
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('explicitAnnotation')) {
       explicitAnnotation =
           GoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation
-              .fromJson(_json['explicitAnnotation']);
+              .fromJson(_json['explicitAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frameLabelAnnotations')) {
       frameLabelAnnotations = (_json['frameLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p2beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inputUri')) {
@@ -6789,7 +6897,7 @@
           .map<GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectAnnotations')) {
@@ -6797,40 +6905,40 @@
           .map<GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segmentLabelAnnotations')) {
       segmentLabelAnnotations = (_json['segmentLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p2beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segmentPresenceLabelAnnotations')) {
-      segmentPresenceLabelAnnotations =
-          (_json['segmentPresenceLabelAnnotations'] as core.List)
-              .map<GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>(
-                  (value) =>
-                      GoogleCloudVideointelligenceV1p2beta1LabelAnnotation
-                          .fromJson(value))
-              .toList();
+      segmentPresenceLabelAnnotations = (_json[
+              'segmentPresenceLabelAnnotations'] as core.List)
+          .map<GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>((value) =>
+              GoogleCloudVideointelligenceV1p2beta1LabelAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
     if (_json.containsKey('shotAnnotations')) {
       shotAnnotations = (_json['shotAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotLabelAnnotations')) {
       shotLabelAnnotations = (_json['shotLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p2beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotPresenceLabelAnnotations')) {
@@ -6838,7 +6946,7 @@
               as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p2beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('speechTranscriptions')) {
@@ -6846,14 +6954,14 @@
           .map<GoogleCloudVideointelligenceV1p2beta1SpeechTranscription>(
               (value) =>
                   GoogleCloudVideointelligenceV1p2beta1SpeechTranscription
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p2beta1TextAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p2beta1TextAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7042,7 +7150,7 @@
           .map<GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7074,7 +7182,7 @@
           .map<GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7151,7 +7259,7 @@
       celebrityTracks = (_json['celebrityTracks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1CelebrityTrack>((value) =>
               GoogleCloudVideointelligenceV1p3beta1CelebrityTrack.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -7190,12 +7298,12 @@
           .map<GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('faceTrack')) {
       faceTrack = GoogleCloudVideointelligenceV1p3beta1Track.fromJson(
-          _json['faceTrack']);
+          _json['faceTrack'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7280,7 +7388,7 @@
     }
     if (_json.containsKey('point')) {
       point = GoogleCloudVideointelligenceV1p3beta1NormalizedVertex.fromJson(
-          _json['point']);
+          _json['point'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7359,7 +7467,7 @@
           .map<GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -7446,7 +7554,8 @@
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1Track>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1Track.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1Track.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -7495,23 +7604,26 @@
     if (_json.containsKey('categoryEntities')) {
       categoryEntities = (_json['categoryEntities'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1Entity>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1LabelFrame>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1LabelFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1LabelFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1LabelSegment>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1LabelSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1LabelSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -7589,7 +7701,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7624,19 +7736,21 @@
   GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation.fromJson(
       core.Map _json) {
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1Track>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1Track.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1Track.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7727,7 +7841,7 @@
       vertices = (_json['vertices'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1NormalizedVertex>((value) =>
               GoogleCloudVideointelligenceV1p3beta1NormalizedVertex.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7810,20 +7924,20 @@
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('entity')) {
-      entity =
-          GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(_json['entity']);
+      entity = GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trackId')) {
       trackId = _json['trackId'] as core.String;
@@ -7874,7 +7988,8 @@
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -7908,7 +8023,8 @@
     if (_json.containsKey('tracks')) {
       tracks = (_json['tracks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1Track>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1Track.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1Track.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('version')) {
@@ -7942,7 +8058,7 @@
       core.Map _json) {
     if (_json.containsKey('celebrity')) {
       celebrity = GoogleCloudVideointelligenceV1p3beta1Celebrity.fromJson(
-          _json['celebrity']);
+          _json['celebrity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -7992,7 +8108,8 @@
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1WordInfo>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1WordInfo.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1WordInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8035,7 +8152,7 @@
           .map<GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('languageCode')) {
@@ -8080,13 +8197,15 @@
     if (_json.containsKey('annotationResults')) {
       annotationResults =
           GoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults
-              .fromJson(_json['annotationResults']);
+              .fromJson(_json['annotationResults']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('annotationResultsUri')) {
       annotationResultsUri = _json['annotationResultsUri'] as core.String;
     }
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8130,13 +8249,14 @@
     if (_json.containsKey('explicitAnnotation')) {
       explicitAnnotation =
           GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation
-              .fromJson(_json['explicitAnnotation']);
+              .fromJson(_json['explicitAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelAnnotations')) {
       labelAnnotations = (_json['labelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectAnnotations')) {
@@ -8144,13 +8264,14 @@
           .map<GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotAnnotations')) {
       shotAnnotations = (_json['shotAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8195,7 +8316,8 @@
     if (_json.containsKey('segments')) {
       segments = (_json['segments'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1TextSegment>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1TextSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1TextSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -8238,7 +8360,8 @@
     if (_json.containsKey('rotatedBoundingBox')) {
       rotatedBoundingBox =
           GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly.fromJson(
-              _json['rotatedBoundingBox']);
+              _json['rotatedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -8278,12 +8401,13 @@
     if (_json.containsKey('frames')) {
       frames = (_json['frames'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1TextFrame>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1TextFrame.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1TextFrame.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8327,20 +8451,21 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1DetectedAttribute>(
               (value) => GoogleCloudVideointelligenceV1p3beta1DetectedAttribute
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1DetectedLandmark>((value) =>
               GoogleCloudVideointelligenceV1p3beta1DetectedLandmark.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('normalizedBoundingBox')) {
       normalizedBoundingBox =
           GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox.fromJson(
-              _json['normalizedBoundingBox']);
+              _json['normalizedBoundingBox']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timeOffset')) {
       timeOffset = _json['timeOffset'] as core.String;
@@ -8387,7 +8512,7 @@
       attributes = (_json['attributes'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1DetectedAttribute>(
               (value) => GoogleCloudVideointelligenceV1p3beta1DetectedAttribute
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -8395,13 +8520,13 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('timestampedObjects')) {
       timestampedObjects = (_json['timestampedObjects'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1TimestampedObject>(
               (value) => GoogleCloudVideointelligenceV1p3beta1TimestampedObject
-                  .fromJson(value))
+                  .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8476,7 +8601,7 @@
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startTime')) {
       startTime = _json['startTime'] as core.String;
@@ -8598,15 +8723,18 @@
     if (_json.containsKey('celebrityRecognitionAnnotations')) {
       celebrityRecognitionAnnotations =
           GoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation
-              .fromJson(_json['celebrityRecognitionAnnotations']);
+              .fromJson(_json['celebrityRecognitionAnnotations']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('explicitAnnotation')) {
       explicitAnnotation =
           GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation
-              .fromJson(_json['explicitAnnotation']);
+              .fromJson(_json['explicitAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('faceDetectionAnnotations')) {
       faceDetectionAnnotations = (_json['faceDetectionAnnotations']
@@ -8614,14 +8742,14 @@
           .map<GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('frameLabelAnnotations')) {
       frameLabelAnnotations = (_json['frameLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('inputUri')) {
@@ -8633,7 +8761,7 @@
           .map<GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('objectAnnotations')) {
@@ -8641,7 +8769,7 @@
           .map<GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('personDetectionAnnotations')) {
@@ -8650,40 +8778,40 @@
           .map<GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segment')) {
       segment = GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
-          _json['segment']);
+          _json['segment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('segmentLabelAnnotations')) {
       segmentLabelAnnotations = (_json['segmentLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('segmentPresenceLabelAnnotations')) {
-      segmentPresenceLabelAnnotations =
-          (_json['segmentPresenceLabelAnnotations'] as core.List)
-              .map<GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>(
-                  (value) =>
-                      GoogleCloudVideointelligenceV1p3beta1LabelAnnotation
-                          .fromJson(value))
-              .toList();
+      segmentPresenceLabelAnnotations = (_json[
+              'segmentPresenceLabelAnnotations'] as core.List)
+          .map<GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>((value) =>
+              GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
+          .toList();
     }
     if (_json.containsKey('shotAnnotations')) {
       shotAnnotations = (_json['shotAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1VideoSegment>((value) =>
-              GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(value))
+              GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotLabelAnnotations')) {
       shotLabelAnnotations = (_json['shotLabelAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('shotPresenceLabelAnnotations')) {
@@ -8691,7 +8819,7 @@
               as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('speechTranscriptions')) {
@@ -8699,14 +8827,14 @@
           .map<GoogleCloudVideointelligenceV1p3beta1SpeechTranscription>(
               (value) =>
                   GoogleCloudVideointelligenceV1p3beta1SpeechTranscription
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVideointelligenceV1p3beta1TextAnnotation>((value) =>
               GoogleCloudVideointelligenceV1p3beta1TextAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8920,8 +9048,9 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<GoogleLongrunningOperation>(
-              (value) => GoogleLongrunningOperation.fromJson(value))
+          .map<GoogleLongrunningOperation>((value) =>
+              GoogleLongrunningOperation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8982,11 +9111,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = GoogleRpcStatus.fromJson(_json['error']);
+      error = GoogleRpcStatus.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -8994,7 +9125,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -9070,7 +9202,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
diff --git a/generated/googleapis/lib/vision/v1.dart b/generated/googleapis/lib/vision/v1.dart
index 541bfdc..d93e0e9 100644
--- a/generated/googleapis/lib/vision/v1.dart
+++ b/generated/googleapis/lib/vision/v1.dart
@@ -112,7 +112,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchAnnotateFilesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchAnnotateFilesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Run asynchronous image detection and annotation for a list of generic
@@ -165,7 +168,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -219,7 +224,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchAnnotateImagesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchAnnotateImagesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Run asynchronous image detection and annotation for a list of images.
@@ -273,7 +281,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -340,7 +350,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -409,7 +421,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a long-running operation. This method indicates that the client is
@@ -461,7 +475,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets the latest state of a long-running operation. Clients can use this
@@ -512,7 +528,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists operations that match the specified filter in the request. If the
@@ -587,7 +605,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListOperationsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListOperationsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -672,7 +693,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchAnnotateFilesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchAnnotateFilesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Run asynchronous image detection and annotation for a list of generic
@@ -738,7 +762,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -805,7 +831,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchAnnotateImagesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchAnnotateImagesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Run asynchronous image detection and annotation for a list of images.
@@ -872,7 +901,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -963,7 +994,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchAnnotateFilesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchAnnotateFilesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Run asynchronous image detection and annotation for a list of generic
@@ -1029,7 +1063,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1097,7 +1133,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => BatchAnnotateImagesResponse.fromJson(data));
+    return _response.then(
+      (data) => BatchAnnotateImagesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Run asynchronous image detection and annotation for a list of images.
@@ -1164,7 +1203,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1223,7 +1264,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1294,7 +1337,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates and returns a new ProductSet resource. Possible errors: * Returns
@@ -1363,7 +1408,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductSet.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProductSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a ProductSet. Products and ReferenceImages in the
@@ -1416,7 +1464,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information associated with a ProductSet. Possible errors: * Returns
@@ -1468,7 +1518,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductSet.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProductSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Asynchronous API that imports a list of reference images to specified
@@ -1533,7 +1586,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists ProductSets in an unspecified order. Possible errors: * Returns
@@ -1600,7 +1655,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListProductSetsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListProductSetsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Makes changes to a ProductSet resource. Only display_name can be updated
@@ -1669,7 +1727,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ProductSet.fromJson(data));
+    return _response.then(
+      (data) =>
+          ProductSet.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Removes a Product from the specified ProductSet.
@@ -1728,7 +1789,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1804,8 +1867,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListProductsInProductSetResponse.fromJson(data));
+    return _response.then(
+      (data) => ListProductsInProductSetResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1885,7 +1950,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a product and its reference images. Metadata of the
@@ -1938,7 +2005,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information associated with a Product. Possible errors: * Returns
@@ -1989,7 +2058,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists products in an unspecified order. Possible errors: * Returns
@@ -2055,7 +2126,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListProductsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListProductsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Makes changes to a Product resource. Only the `display_name`,
@@ -2128,7 +2202,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Product.fromJson(data));
+    return _response.then(
+      (data) => Product.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Asynchronous API to delete all Products in a ProductSet or all Products
@@ -2202,7 +2278,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2290,7 +2368,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReferenceImage.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReferenceImage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Permanently deletes a reference image. The image metadata will be deleted
@@ -2345,7 +2426,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets information associated with a ReferenceImage. Possible errors: *
@@ -2398,7 +2481,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ReferenceImage.fromJson(data));
+    return _response.then(
+      (data) =>
+          ReferenceImage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists reference images. Possible errors: * Returns NOT_FOUND if the parent
@@ -2468,7 +2554,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListReferenceImagesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListReferenceImagesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2526,7 +2615,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Operation.fromJson(data));
+    return _response.then(
+      (data) => Operation.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2579,14 +2670,17 @@
   AnnotateFileRequest.fromJson(core.Map _json) {
     if (_json.containsKey('features')) {
       features = (_json['features'] as core.List)
-          .map<Feature>((value) => Feature.fromJson(value))
+          .map<Feature>((value) =>
+              Feature.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imageContext')) {
-      imageContext = ImageContext.fromJson(_json['imageContext']);
+      imageContext = ImageContext.fromJson(
+          _json['imageContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig = InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
@@ -2634,15 +2728,17 @@
 
   AnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig = InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<AnnotateImageResponse>(
-              (value) => AnnotateImageResponse.fromJson(value))
+          .map<AnnotateImageResponse>((value) => AnnotateImageResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalPages')) {
@@ -2685,14 +2781,17 @@
   AnnotateImageRequest.fromJson(core.Map _json) {
     if (_json.containsKey('features')) {
       features = (_json['features'] as core.List)
-          .map<Feature>((value) => Feature.fromJson(value))
+          .map<Feature>((value) =>
+              Feature.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('image')) {
-      image = Image.fromJson(_json['image']);
+      image =
+          Image.fromJson(_json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imageContext')) {
-      imageContext = ImageContext.fromJson(_json['imageContext']);
+      imageContext = ImageContext.fromJson(
+          _json['imageContext'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2765,64 +2864,75 @@
 
   AnnotateImageResponse.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
-      context = ImageAnnotationContext.fromJson(_json['context']);
+      context = ImageAnnotationContext.fromJson(
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cropHintsAnnotation')) {
-      cropHintsAnnotation =
-          CropHintsAnnotation.fromJson(_json['cropHintsAnnotation']);
+      cropHintsAnnotation = CropHintsAnnotation.fromJson(
+          _json['cropHintsAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('faceAnnotations')) {
       faceAnnotations = (_json['faceAnnotations'] as core.List)
-          .map<FaceAnnotation>((value) => FaceAnnotation.fromJson(value))
+          .map<FaceAnnotation>((value) => FaceAnnotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullTextAnnotation')) {
-      fullTextAnnotation = TextAnnotation.fromJson(_json['fullTextAnnotation']);
+      fullTextAnnotation = TextAnnotation.fromJson(
+          _json['fullTextAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imagePropertiesAnnotation')) {
-      imagePropertiesAnnotation =
-          ImageProperties.fromJson(_json['imagePropertiesAnnotation']);
+      imagePropertiesAnnotation = ImageProperties.fromJson(
+          _json['imagePropertiesAnnotation']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelAnnotations')) {
       labelAnnotations = (_json['labelAnnotations'] as core.List)
-          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(value))
+          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarkAnnotations')) {
       landmarkAnnotations = (_json['landmarkAnnotations'] as core.List)
-          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(value))
+          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('localizedObjectAnnotations')) {
       localizedObjectAnnotations =
           (_json['localizedObjectAnnotations'] as core.List)
-              .map<LocalizedObjectAnnotation>(
-                  (value) => LocalizedObjectAnnotation.fromJson(value))
+              .map<LocalizedObjectAnnotation>((value) =>
+                  LocalizedObjectAnnotation.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
     if (_json.containsKey('logoAnnotations')) {
       logoAnnotations = (_json['logoAnnotations'] as core.List)
-          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(value))
+          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productSearchResults')) {
-      productSearchResults =
-          ProductSearchResults.fromJson(_json['productSearchResults']);
+      productSearchResults = ProductSearchResults.fromJson(
+          _json['productSearchResults'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('safeSearchAnnotation')) {
-      safeSearchAnnotation =
-          SafeSearchAnnotation.fromJson(_json['safeSearchAnnotation']);
+      safeSearchAnnotation = SafeSearchAnnotation.fromJson(
+          _json['safeSearchAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
-          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(value))
+          .map<EntityAnnotation>((value) => EntityAnnotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webDetection')) {
-      webDetection = WebDetection.fromJson(_json['webDetection']);
+      webDetection = WebDetection.fromJson(
+          _json['webDetection'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2899,17 +3009,21 @@
   AsyncAnnotateFileRequest.fromJson(core.Map _json) {
     if (_json.containsKey('features')) {
       features = (_json['features'] as core.List)
-          .map<Feature>((value) => Feature.fromJson(value))
+          .map<Feature>((value) =>
+              Feature.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('imageContext')) {
-      imageContext = ImageContext.fromJson(_json['imageContext']);
+      imageContext = ImageContext.fromJson(
+          _json['imageContext'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig = InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('outputConfig')) {
-      outputConfig = OutputConfig.fromJson(_json['outputConfig']);
+      outputConfig = OutputConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2940,7 +3054,8 @@
 
   AsyncAnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
-      outputConfig = OutputConfig.fromJson(_json['outputConfig']);
+      outputConfig = OutputConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2974,8 +3089,9 @@
     }
     if (_json.containsKey('requests')) {
       requests = (_json['requests'] as core.List)
-          .map<AsyncAnnotateFileRequest>(
-              (value) => AsyncAnnotateFileRequest.fromJson(value))
+          .map<AsyncAnnotateFileRequest>((value) =>
+              AsyncAnnotateFileRequest.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3003,8 +3119,9 @@
   AsyncBatchAnnotateFilesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<AsyncAnnotateFileResponse>(
-              (value) => AsyncAnnotateFileResponse.fromJson(value))
+          .map<AsyncAnnotateFileResponse>((value) =>
+              AsyncAnnotateFileResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3037,15 +3154,16 @@
 
   AsyncBatchAnnotateImagesRequest.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
-      outputConfig = OutputConfig.fromJson(_json['outputConfig']);
+      outputConfig = OutputConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('parent')) {
       parent = _json['parent'] as core.String;
     }
     if (_json.containsKey('requests')) {
       requests = (_json['requests'] as core.List)
-          .map<AnnotateImageRequest>(
-              (value) => AnnotateImageRequest.fromJson(value))
+          .map<AnnotateImageRequest>((value) => AnnotateImageRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3074,7 +3192,8 @@
 
   AsyncBatchAnnotateImagesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
-      outputConfig = OutputConfig.fromJson(_json['outputConfig']);
+      outputConfig = OutputConfig.fromJson(
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3108,8 +3227,8 @@
     }
     if (_json.containsKey('requests')) {
       requests = (_json['requests'] as core.List)
-          .map<AnnotateFileRequest>(
-              (value) => AnnotateFileRequest.fromJson(value))
+          .map<AnnotateFileRequest>((value) => AnnotateFileRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3137,8 +3256,8 @@
   BatchAnnotateFilesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<AnnotateFileResponse>(
-              (value) => AnnotateFileResponse.fromJson(value))
+          .map<AnnotateFileResponse>((value) => AnnotateFileResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3172,8 +3291,8 @@
     }
     if (_json.containsKey('requests')) {
       requests = (_json['requests'] as core.List)
-          .map<AnnotateImageRequest>(
-              (value) => AnnotateImageRequest.fromJson(value))
+          .map<AnnotateImageRequest>((value) => AnnotateImageRequest.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3200,8 +3319,8 @@
   BatchAnnotateImagesResponse.fromJson(core.Map _json) {
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
-          .map<AnnotateImageResponse>(
-              (value) => AnnotateImageResponse.fromJson(value))
+          .map<AnnotateImageResponse>((value) => AnnotateImageResponse.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3306,18 +3425,21 @@
       blockType = _json['blockType'] as core.String;
     }
     if (_json.containsKey('boundingBox')) {
-      boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
-          .map<Paragraph>((value) => Paragraph.fromJson(value))
+          .map<Paragraph>((value) =>
+              Paragraph.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('property')) {
-      property = TextProperty.fromJson(_json['property']);
+      property = TextProperty.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -3355,12 +3477,14 @@
   BoundingPoly.fromJson(core.Map _json) {
     if (_json.containsKey('normalizedVertices')) {
       normalizedVertices = (_json['normalizedVertices'] as core.List)
-          .map<NormalizedVertex>((value) => NormalizedVertex.fromJson(value))
+          .map<NormalizedVertex>((value) => NormalizedVertex.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('vertices')) {
       vertices = (_json['vertices'] as core.List)
-          .map<Vertex>((value) => Vertex.fromJson(value))
+          .map<Vertex>((value) =>
+              Vertex.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3513,7 +3637,8 @@
 
   ColorInfo.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pixelFraction')) {
       pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
@@ -3555,7 +3680,8 @@
 
   CropHint.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
-      boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
+      boundingPoly = BoundingPoly.fromJson(
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -3590,7 +3716,8 @@
   CropHintsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('cropHints')) {
       cropHints = (_json['cropHints'] as core.List)
-          .map<CropHint>((value) => CropHint.fromJson(value))
+          .map<CropHint>((value) =>
+              CropHint.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3714,7 +3841,8 @@
   DominantColorsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
       colors = (_json['colors'] as core.List)
-          .map<ColorInfo>((value) => ColorInfo.fromJson(value))
+          .map<ColorInfo>((value) =>
+              ColorInfo.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -3794,7 +3922,8 @@
 
   EntityAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
-      boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
+      boundingPoly = BoundingPoly.fromJson(
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -3807,7 +3936,8 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<LocationInfo>((value) => LocationInfo.fromJson(value))
+          .map<LocationInfo>((value) => LocationInfo.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mid')) {
@@ -3815,7 +3945,8 @@
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<Property>((value) => Property.fromJson(value))
+          .map<Property>((value) =>
+              Property.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -3980,14 +4111,16 @@
       blurredLikelihood = _json['blurredLikelihood'] as core.String;
     }
     if (_json.containsKey('boundingPoly')) {
-      boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
+      boundingPoly = BoundingPoly.fromJson(
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectionConfidence')) {
       detectionConfidence =
           (_json['detectionConfidence'] as core.num).toDouble();
     }
     if (_json.containsKey('fdBoundingPoly')) {
-      fdBoundingPoly = BoundingPoly.fromJson(_json['fdBoundingPoly']);
+      fdBoundingPoly = BoundingPoly.fromJson(
+          _json['fdBoundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headwearLikelihood')) {
       headwearLikelihood = _json['headwearLikelihood'] as core.String;
@@ -4001,7 +4134,8 @@
     }
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
-          .map<Landmark>((value) => Landmark.fromJson(value))
+          .map<Landmark>((value) =>
+              Landmark.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('panAngle')) {
@@ -4219,16 +4353,18 @@
 
   GoogleCloudVisionV1p1beta1AnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig =
-          GoogleCloudVisionV1p1beta1InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = GoogleCloudVisionV1p1beta1InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p1beta1AnnotateImageResponse>((value) =>
-              GoogleCloudVisionV1p1beta1AnnotateImageResponse.fromJson(value))
+              GoogleCloudVisionV1p1beta1AnnotateImageResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalPages')) {
@@ -4310,41 +4446,47 @@
   GoogleCloudVisionV1p1beta1AnnotateImageResponse.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
       context = GoogleCloudVisionV1p1beta1ImageAnnotationContext.fromJson(
-          _json['context']);
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cropHintsAnnotation')) {
       cropHintsAnnotation =
           GoogleCloudVisionV1p1beta1CropHintsAnnotation.fromJson(
-              _json['cropHintsAnnotation']);
+              _json['cropHintsAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('faceAnnotations')) {
       faceAnnotations = (_json['faceAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p1beta1FaceAnnotation>((value) =>
-              GoogleCloudVisionV1p1beta1FaceAnnotation.fromJson(value))
+              GoogleCloudVisionV1p1beta1FaceAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullTextAnnotation')) {
       fullTextAnnotation = GoogleCloudVisionV1p1beta1TextAnnotation.fromJson(
-          _json['fullTextAnnotation']);
+          _json['fullTextAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imagePropertiesAnnotation')) {
       imagePropertiesAnnotation =
           GoogleCloudVisionV1p1beta1ImageProperties.fromJson(
-              _json['imagePropertiesAnnotation']);
+              _json['imagePropertiesAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelAnnotations')) {
       labelAnnotations = (_json['labelAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p1beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarkAnnotations')) {
       landmarkAnnotations = (_json['landmarkAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p1beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('localizedObjectAnnotations')) {
@@ -4352,34 +4494,38 @@
               as core.List)
           .map<GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation>((value) =>
               GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('logoAnnotations')) {
       logoAnnotations = (_json['logoAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p1beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productSearchResults')) {
       productSearchResults =
           GoogleCloudVisionV1p1beta1ProductSearchResults.fromJson(
-              _json['productSearchResults']);
+              _json['productSearchResults']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('safeSearchAnnotation')) {
       safeSearchAnnotation =
           GoogleCloudVisionV1p1beta1SafeSearchAnnotation.fromJson(
-              _json['safeSearchAnnotation']);
+              _json['safeSearchAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p1beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webDetection')) {
       webDetection = GoogleCloudVisionV1p1beta1WebDetection.fromJson(
-          _json['webDetection']);
+          _json['webDetection'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4447,7 +4593,7 @@
   GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
       outputConfig = GoogleCloudVisionV1p1beta1OutputConfig.fromJson(
-          _json['outputConfig']);
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4474,7 +4620,7 @@
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse>((value) =>
               GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4525,21 +4671,22 @@
       blockType = _json['blockType'] as core.String;
     }
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1Paragraph>(
-              (value) => GoogleCloudVisionV1p1beta1Paragraph.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1Paragraph>((value) =>
+              GoogleCloudVisionV1p1beta1Paragraph.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -4578,13 +4725,15 @@
     if (_json.containsKey('normalizedVertices')) {
       normalizedVertices = (_json['normalizedVertices'] as core.List)
           .map<GoogleCloudVisionV1p1beta1NormalizedVertex>((value) =>
-              GoogleCloudVisionV1p1beta1NormalizedVertex.fromJson(value))
+              GoogleCloudVisionV1p1beta1NormalizedVertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('vertices')) {
       vertices = (_json['vertices'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1Vertex>(
-              (value) => GoogleCloudVisionV1p1beta1Vertex.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1Vertex>((value) =>
+              GoogleCloudVisionV1p1beta1Vertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4619,7 +4768,8 @@
 
   GoogleCloudVisionV1p1beta1ColorInfo.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pixelFraction')) {
       pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
@@ -4662,7 +4812,7 @@
   GoogleCloudVisionV1p1beta1CropHint.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -4697,8 +4847,9 @@
   GoogleCloudVisionV1p1beta1CropHintsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('cropHints')) {
       cropHints = (_json['cropHints'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1CropHint>(
-              (value) => GoogleCloudVisionV1p1beta1CropHint.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1CropHint>((value) =>
+              GoogleCloudVisionV1p1beta1CropHint.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4722,8 +4873,9 @@
   GoogleCloudVisionV1p1beta1DominantColorsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
       colors = (_json['colors'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1ColorInfo>(
-              (value) => GoogleCloudVisionV1p1beta1ColorInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1ColorInfo>((value) =>
+              GoogleCloudVisionV1p1beta1ColorInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -4786,7 +4938,7 @@
   GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -4799,8 +4951,9 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1LocationInfo>(
-              (value) => GoogleCloudVisionV1p1beta1LocationInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1LocationInfo>((value) =>
+              GoogleCloudVisionV1p1beta1LocationInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mid')) {
@@ -4808,8 +4961,9 @@
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1Property>(
-              (value) => GoogleCloudVisionV1p1beta1Property.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1Property>((value) =>
+              GoogleCloudVisionV1p1beta1Property.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -4975,7 +5129,7 @@
     }
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectionConfidence')) {
       detectionConfidence =
@@ -4983,7 +5137,7 @@
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
-          _json['fdBoundingPoly']);
+          _json['fdBoundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headwearLikelihood')) {
       headwearLikelihood = _json['headwearLikelihood'] as core.String;
@@ -4998,7 +5152,8 @@
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVisionV1p1beta1FaceAnnotationLandmark>((value) =>
-              GoogleCloudVisionV1p1beta1FaceAnnotationLandmark.fromJson(value))
+              GoogleCloudVisionV1p1beta1FaceAnnotationLandmark.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('panAngle')) {
@@ -5123,7 +5278,8 @@
 
   GoogleCloudVisionV1p1beta1FaceAnnotationLandmark.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = GoogleCloudVisionV1p1beta1Position.fromJson(_json['position']);
+      position = GoogleCloudVisionV1p1beta1Position.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -5245,7 +5401,7 @@
     if (_json.containsKey('dominantColors')) {
       dominantColors =
           GoogleCloudVisionV1p1beta1DominantColorsAnnotation.fromJson(
-              _json['dominantColors']);
+              _json['dominantColors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5287,8 +5443,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('gcsSource')) {
-      gcsSource =
-          GoogleCloudVisionV1p1beta1GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GoogleCloudVisionV1p1beta1GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -5334,7 +5490,7 @@
   GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -5380,7 +5536,8 @@
 
   GoogleCloudVisionV1p1beta1LocationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5494,7 +5651,7 @@
     }
     if (_json.containsKey('gcsDestination')) {
       gcsDestination = GoogleCloudVisionV1p1beta1GcsDestination.fromJson(
-          _json['gcsDestination']);
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -5534,8 +5691,9 @@
   GoogleCloudVisionV1p1beta1Page.fromJson(core.Map _json) {
     if (_json.containsKey('blocks')) {
       blocks = (_json['blocks'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1Block>(
-              (value) => GoogleCloudVisionV1p1beta1Block.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1Block>((value) =>
+              GoogleCloudVisionV1p1beta1Block.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -5546,7 +5704,7 @@
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
       width = _json['width'] as core.int;
@@ -5599,20 +5757,21 @@
 
   GoogleCloudVisionV1p1beta1Paragraph.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1Word>(
-              (value) => GoogleCloudVisionV1p1beta1Word.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1Word>((value) =>
+              GoogleCloudVisionV1p1beta1Word.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5728,7 +5887,8 @@
     if (_json.containsKey('productLabels')) {
       productLabels = (_json['productLabels'] as core.List)
           .map<GoogleCloudVisionV1p1beta1ProductKeyValue>((value) =>
-              GoogleCloudVisionV1p1beta1ProductKeyValue.fromJson(value))
+              GoogleCloudVisionV1p1beta1ProductKeyValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5816,14 +5976,14 @@
           .map<GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult>(
               (value) =>
                   GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p1beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p1beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5862,21 +6022,21 @@
       core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectAnnotations')) {
       objectAnnotations = (_json['objectAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation>(
               (value) =>
                   GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p1beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p1beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -5970,7 +6130,8 @@
       image = _json['image'] as core.String;
     }
     if (_json.containsKey('product')) {
-      product = GoogleCloudVisionV1p1beta1Product.fromJson(_json['product']);
+      product = GoogleCloudVisionV1p1beta1Product.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('score')) {
       score = (_json['score'] as core.num).toDouble();
@@ -6157,15 +6318,15 @@
 
   GoogleCloudVisionV1p1beta1Symbol.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -6209,8 +6370,9 @@
   GoogleCloudVisionV1p1beta1TextAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1Page>(
-              (value) => GoogleCloudVisionV1p1beta1Page.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1Page>((value) =>
+              GoogleCloudVisionV1p1beta1Page.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -6320,14 +6482,14 @@
     if (_json.containsKey('detectedBreak')) {
       detectedBreak =
           GoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak.fromJson(
-              _json['detectedBreak']);
+              _json['detectedBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectedLanguages')) {
       detectedLanguages = (_json['detectedLanguages'] as core.List)
           .map<GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage>(
               (value) =>
                   GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6410,37 +6572,43 @@
     if (_json.containsKey('bestGuessLabels')) {
       bestGuessLabels = (_json['bestGuessLabels'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebLabel>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebLabel.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebLabel.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pagesWithMatchingImages')) {
       pagesWithMatchingImages = (_json['pagesWithMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebPage>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebPage.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebPage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('visuallySimilarImages')) {
       visuallySimilarImages = (_json['visuallySimilarImages'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webEntities')) {
       webEntities = (_json['webEntities'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebEntity>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebEntity.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6607,7 +6775,8 @@
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageTitle')) {
@@ -6616,7 +6785,8 @@
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p1beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -6675,20 +6845,21 @@
 
   GoogleCloudVisionV1p1beta1Word.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('symbols')) {
       symbols = (_json['symbols'] as core.List)
-          .map<GoogleCloudVisionV1p1beta1Symbol>(
-              (value) => GoogleCloudVisionV1p1beta1Symbol.fromJson(value))
+          .map<GoogleCloudVisionV1p1beta1Symbol>((value) =>
+              GoogleCloudVisionV1p1beta1Symbol.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -6732,16 +6903,18 @@
 
   GoogleCloudVisionV1p2beta1AnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig =
-          GoogleCloudVisionV1p2beta1InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = GoogleCloudVisionV1p2beta1InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p2beta1AnnotateImageResponse>((value) =>
-              GoogleCloudVisionV1p2beta1AnnotateImageResponse.fromJson(value))
+              GoogleCloudVisionV1p2beta1AnnotateImageResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalPages')) {
@@ -6823,41 +6996,47 @@
   GoogleCloudVisionV1p2beta1AnnotateImageResponse.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
       context = GoogleCloudVisionV1p2beta1ImageAnnotationContext.fromJson(
-          _json['context']);
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cropHintsAnnotation')) {
       cropHintsAnnotation =
           GoogleCloudVisionV1p2beta1CropHintsAnnotation.fromJson(
-              _json['cropHintsAnnotation']);
+              _json['cropHintsAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('faceAnnotations')) {
       faceAnnotations = (_json['faceAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p2beta1FaceAnnotation>((value) =>
-              GoogleCloudVisionV1p2beta1FaceAnnotation.fromJson(value))
+              GoogleCloudVisionV1p2beta1FaceAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullTextAnnotation')) {
       fullTextAnnotation = GoogleCloudVisionV1p2beta1TextAnnotation.fromJson(
-          _json['fullTextAnnotation']);
+          _json['fullTextAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imagePropertiesAnnotation')) {
       imagePropertiesAnnotation =
           GoogleCloudVisionV1p2beta1ImageProperties.fromJson(
-              _json['imagePropertiesAnnotation']);
+              _json['imagePropertiesAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelAnnotations')) {
       labelAnnotations = (_json['labelAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p2beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarkAnnotations')) {
       landmarkAnnotations = (_json['landmarkAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p2beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('localizedObjectAnnotations')) {
@@ -6865,34 +7044,38 @@
               as core.List)
           .map<GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation>((value) =>
               GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('logoAnnotations')) {
       logoAnnotations = (_json['logoAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p2beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productSearchResults')) {
       productSearchResults =
           GoogleCloudVisionV1p2beta1ProductSearchResults.fromJson(
-              _json['productSearchResults']);
+              _json['productSearchResults']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('safeSearchAnnotation')) {
       safeSearchAnnotation =
           GoogleCloudVisionV1p2beta1SafeSearchAnnotation.fromJson(
-              _json['safeSearchAnnotation']);
+              _json['safeSearchAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p2beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webDetection')) {
       webDetection = GoogleCloudVisionV1p2beta1WebDetection.fromJson(
-          _json['webDetection']);
+          _json['webDetection'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6960,7 +7143,7 @@
   GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
       outputConfig = GoogleCloudVisionV1p2beta1OutputConfig.fromJson(
-          _json['outputConfig']);
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6987,7 +7170,7 @@
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse>((value) =>
               GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7038,21 +7221,22 @@
       blockType = _json['blockType'] as core.String;
     }
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1Paragraph>(
-              (value) => GoogleCloudVisionV1p2beta1Paragraph.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1Paragraph>((value) =>
+              GoogleCloudVisionV1p2beta1Paragraph.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7091,13 +7275,15 @@
     if (_json.containsKey('normalizedVertices')) {
       normalizedVertices = (_json['normalizedVertices'] as core.List)
           .map<GoogleCloudVisionV1p2beta1NormalizedVertex>((value) =>
-              GoogleCloudVisionV1p2beta1NormalizedVertex.fromJson(value))
+              GoogleCloudVisionV1p2beta1NormalizedVertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('vertices')) {
       vertices = (_json['vertices'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1Vertex>(
-              (value) => GoogleCloudVisionV1p2beta1Vertex.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1Vertex>((value) =>
+              GoogleCloudVisionV1p2beta1Vertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7132,7 +7318,8 @@
 
   GoogleCloudVisionV1p2beta1ColorInfo.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pixelFraction')) {
       pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
@@ -7175,7 +7362,7 @@
   GoogleCloudVisionV1p2beta1CropHint.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -7210,8 +7397,9 @@
   GoogleCloudVisionV1p2beta1CropHintsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('cropHints')) {
       cropHints = (_json['cropHints'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1CropHint>(
-              (value) => GoogleCloudVisionV1p2beta1CropHint.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1CropHint>((value) =>
+              GoogleCloudVisionV1p2beta1CropHint.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7235,8 +7423,9 @@
   GoogleCloudVisionV1p2beta1DominantColorsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
       colors = (_json['colors'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1ColorInfo>(
-              (value) => GoogleCloudVisionV1p2beta1ColorInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1ColorInfo>((value) =>
+              GoogleCloudVisionV1p2beta1ColorInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -7299,7 +7488,7 @@
   GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -7312,8 +7501,9 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1LocationInfo>(
-              (value) => GoogleCloudVisionV1p2beta1LocationInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1LocationInfo>((value) =>
+              GoogleCloudVisionV1p2beta1LocationInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mid')) {
@@ -7321,8 +7511,9 @@
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1Property>(
-              (value) => GoogleCloudVisionV1p2beta1Property.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1Property>((value) =>
+              GoogleCloudVisionV1p2beta1Property.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -7488,7 +7679,7 @@
     }
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectionConfidence')) {
       detectionConfidence =
@@ -7496,7 +7687,7 @@
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
-          _json['fdBoundingPoly']);
+          _json['fdBoundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headwearLikelihood')) {
       headwearLikelihood = _json['headwearLikelihood'] as core.String;
@@ -7511,7 +7702,8 @@
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVisionV1p2beta1FaceAnnotationLandmark>((value) =>
-              GoogleCloudVisionV1p2beta1FaceAnnotationLandmark.fromJson(value))
+              GoogleCloudVisionV1p2beta1FaceAnnotationLandmark.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('panAngle')) {
@@ -7636,7 +7828,8 @@
 
   GoogleCloudVisionV1p2beta1FaceAnnotationLandmark.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = GoogleCloudVisionV1p2beta1Position.fromJson(_json['position']);
+      position = GoogleCloudVisionV1p2beta1Position.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -7758,7 +7951,7 @@
     if (_json.containsKey('dominantColors')) {
       dominantColors =
           GoogleCloudVisionV1p2beta1DominantColorsAnnotation.fromJson(
-              _json['dominantColors']);
+              _json['dominantColors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7800,8 +7993,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('gcsSource')) {
-      gcsSource =
-          GoogleCloudVisionV1p2beta1GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GoogleCloudVisionV1p2beta1GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -7847,7 +8040,7 @@
   GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -7893,7 +8086,8 @@
 
   GoogleCloudVisionV1p2beta1LocationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8007,7 +8201,7 @@
     }
     if (_json.containsKey('gcsDestination')) {
       gcsDestination = GoogleCloudVisionV1p2beta1GcsDestination.fromJson(
-          _json['gcsDestination']);
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8047,8 +8241,9 @@
   GoogleCloudVisionV1p2beta1Page.fromJson(core.Map _json) {
     if (_json.containsKey('blocks')) {
       blocks = (_json['blocks'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1Block>(
-              (value) => GoogleCloudVisionV1p2beta1Block.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1Block>((value) =>
+              GoogleCloudVisionV1p2beta1Block.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -8059,7 +8254,7 @@
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
       width = _json['width'] as core.int;
@@ -8112,20 +8307,21 @@
 
   GoogleCloudVisionV1p2beta1Paragraph.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1Word>(
-              (value) => GoogleCloudVisionV1p2beta1Word.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1Word>((value) =>
+              GoogleCloudVisionV1p2beta1Word.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8241,7 +8437,8 @@
     if (_json.containsKey('productLabels')) {
       productLabels = (_json['productLabels'] as core.List)
           .map<GoogleCloudVisionV1p2beta1ProductKeyValue>((value) =>
-              GoogleCloudVisionV1p2beta1ProductKeyValue.fromJson(value))
+              GoogleCloudVisionV1p2beta1ProductKeyValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8329,14 +8526,14 @@
           .map<GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult>(
               (value) =>
                   GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p2beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p2beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8375,21 +8572,21 @@
       core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectAnnotations')) {
       objectAnnotations = (_json['objectAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation>(
               (value) =>
                   GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p2beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p2beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8483,7 +8680,8 @@
       image = _json['image'] as core.String;
     }
     if (_json.containsKey('product')) {
-      product = GoogleCloudVisionV1p2beta1Product.fromJson(_json['product']);
+      product = GoogleCloudVisionV1p2beta1Product.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('score')) {
       score = (_json['score'] as core.num).toDouble();
@@ -8670,15 +8868,15 @@
 
   GoogleCloudVisionV1p2beta1Symbol.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -8722,8 +8920,9 @@
   GoogleCloudVisionV1p2beta1TextAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1Page>(
-              (value) => GoogleCloudVisionV1p2beta1Page.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1Page>((value) =>
+              GoogleCloudVisionV1p2beta1Page.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -8833,14 +9032,14 @@
     if (_json.containsKey('detectedBreak')) {
       detectedBreak =
           GoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak.fromJson(
-              _json['detectedBreak']);
+              _json['detectedBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectedLanguages')) {
       detectedLanguages = (_json['detectedLanguages'] as core.List)
           .map<GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage>(
               (value) =>
                   GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8923,37 +9122,43 @@
     if (_json.containsKey('bestGuessLabels')) {
       bestGuessLabels = (_json['bestGuessLabels'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebLabel>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebLabel.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebLabel.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pagesWithMatchingImages')) {
       pagesWithMatchingImages = (_json['pagesWithMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebPage>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebPage.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebPage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('visuallySimilarImages')) {
       visuallySimilarImages = (_json['visuallySimilarImages'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webEntities')) {
       webEntities = (_json['webEntities'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebEntity>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebEntity.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9120,7 +9325,8 @@
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageTitle')) {
@@ -9129,7 +9335,8 @@
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p2beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -9188,20 +9395,21 @@
 
   GoogleCloudVisionV1p2beta1Word.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('symbols')) {
       symbols = (_json['symbols'] as core.List)
-          .map<GoogleCloudVisionV1p2beta1Symbol>(
-              (value) => GoogleCloudVisionV1p2beta1Symbol.fromJson(value))
+          .map<GoogleCloudVisionV1p2beta1Symbol>((value) =>
+              GoogleCloudVisionV1p2beta1Symbol.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9245,16 +9453,18 @@
 
   GoogleCloudVisionV1p3beta1AnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig =
-          GoogleCloudVisionV1p3beta1InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = GoogleCloudVisionV1p3beta1InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p3beta1AnnotateImageResponse>((value) =>
-              GoogleCloudVisionV1p3beta1AnnotateImageResponse.fromJson(value))
+              GoogleCloudVisionV1p3beta1AnnotateImageResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalPages')) {
@@ -9336,41 +9546,47 @@
   GoogleCloudVisionV1p3beta1AnnotateImageResponse.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
       context = GoogleCloudVisionV1p3beta1ImageAnnotationContext.fromJson(
-          _json['context']);
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cropHintsAnnotation')) {
       cropHintsAnnotation =
           GoogleCloudVisionV1p3beta1CropHintsAnnotation.fromJson(
-              _json['cropHintsAnnotation']);
+              _json['cropHintsAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('faceAnnotations')) {
       faceAnnotations = (_json['faceAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p3beta1FaceAnnotation>((value) =>
-              GoogleCloudVisionV1p3beta1FaceAnnotation.fromJson(value))
+              GoogleCloudVisionV1p3beta1FaceAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullTextAnnotation')) {
       fullTextAnnotation = GoogleCloudVisionV1p3beta1TextAnnotation.fromJson(
-          _json['fullTextAnnotation']);
+          _json['fullTextAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imagePropertiesAnnotation')) {
       imagePropertiesAnnotation =
           GoogleCloudVisionV1p3beta1ImageProperties.fromJson(
-              _json['imagePropertiesAnnotation']);
+              _json['imagePropertiesAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelAnnotations')) {
       labelAnnotations = (_json['labelAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p3beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarkAnnotations')) {
       landmarkAnnotations = (_json['landmarkAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p3beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('localizedObjectAnnotations')) {
@@ -9378,34 +9594,38 @@
               as core.List)
           .map<GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation>((value) =>
               GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('logoAnnotations')) {
       logoAnnotations = (_json['logoAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p3beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productSearchResults')) {
       productSearchResults =
           GoogleCloudVisionV1p3beta1ProductSearchResults.fromJson(
-              _json['productSearchResults']);
+              _json['productSearchResults']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('safeSearchAnnotation')) {
       safeSearchAnnotation =
           GoogleCloudVisionV1p3beta1SafeSearchAnnotation.fromJson(
-              _json['safeSearchAnnotation']);
+              _json['safeSearchAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p3beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webDetection')) {
       webDetection = GoogleCloudVisionV1p3beta1WebDetection.fromJson(
-          _json['webDetection']);
+          _json['webDetection'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9473,7 +9693,7 @@
   GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
       outputConfig = GoogleCloudVisionV1p3beta1OutputConfig.fromJson(
-          _json['outputConfig']);
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9500,7 +9720,7 @@
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse>((value) =>
               GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9605,21 +9825,22 @@
       blockType = _json['blockType'] as core.String;
     }
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1Paragraph>(
-              (value) => GoogleCloudVisionV1p3beta1Paragraph.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1Paragraph>((value) =>
+              GoogleCloudVisionV1p3beta1Paragraph.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9658,13 +9879,15 @@
     if (_json.containsKey('normalizedVertices')) {
       normalizedVertices = (_json['normalizedVertices'] as core.List)
           .map<GoogleCloudVisionV1p3beta1NormalizedVertex>((value) =>
-              GoogleCloudVisionV1p3beta1NormalizedVertex.fromJson(value))
+              GoogleCloudVisionV1p3beta1NormalizedVertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('vertices')) {
       vertices = (_json['vertices'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1Vertex>(
-              (value) => GoogleCloudVisionV1p3beta1Vertex.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1Vertex>((value) =>
+              GoogleCloudVisionV1p3beta1Vertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9699,7 +9922,8 @@
 
   GoogleCloudVisionV1p3beta1ColorInfo.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pixelFraction')) {
       pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
@@ -9742,7 +9966,7 @@
   GoogleCloudVisionV1p3beta1CropHint.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -9777,8 +10001,9 @@
   GoogleCloudVisionV1p3beta1CropHintsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('cropHints')) {
       cropHints = (_json['cropHints'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1CropHint>(
-              (value) => GoogleCloudVisionV1p3beta1CropHint.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1CropHint>((value) =>
+              GoogleCloudVisionV1p3beta1CropHint.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9802,8 +10027,9 @@
   GoogleCloudVisionV1p3beta1DominantColorsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
       colors = (_json['colors'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1ColorInfo>(
-              (value) => GoogleCloudVisionV1p3beta1ColorInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1ColorInfo>((value) =>
+              GoogleCloudVisionV1p3beta1ColorInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -9866,7 +10092,7 @@
   GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -9879,8 +10105,9 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1LocationInfo>(
-              (value) => GoogleCloudVisionV1p3beta1LocationInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1LocationInfo>((value) =>
+              GoogleCloudVisionV1p3beta1LocationInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mid')) {
@@ -9888,8 +10115,9 @@
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1Property>(
-              (value) => GoogleCloudVisionV1p3beta1Property.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1Property>((value) =>
+              GoogleCloudVisionV1p3beta1Property.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -10055,7 +10283,7 @@
     }
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectionConfidence')) {
       detectionConfidence =
@@ -10063,7 +10291,7 @@
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
-          _json['fdBoundingPoly']);
+          _json['fdBoundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headwearLikelihood')) {
       headwearLikelihood = _json['headwearLikelihood'] as core.String;
@@ -10078,7 +10306,8 @@
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVisionV1p3beta1FaceAnnotationLandmark>((value) =>
-              GoogleCloudVisionV1p3beta1FaceAnnotationLandmark.fromJson(value))
+              GoogleCloudVisionV1p3beta1FaceAnnotationLandmark.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('panAngle')) {
@@ -10203,7 +10432,8 @@
 
   GoogleCloudVisionV1p3beta1FaceAnnotationLandmark.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = GoogleCloudVisionV1p3beta1Position.fromJson(_json['position']);
+      position = GoogleCloudVisionV1p3beta1Position.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -10325,7 +10555,7 @@
     if (_json.containsKey('dominantColors')) {
       dominantColors =
           GoogleCloudVisionV1p3beta1DominantColorsAnnotation.fromJson(
-              _json['dominantColors']);
+              _json['dominantColors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10357,12 +10587,14 @@
     if (_json.containsKey('referenceImages')) {
       referenceImages = (_json['referenceImages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1ReferenceImage>((value) =>
-              GoogleCloudVisionV1p3beta1ReferenceImage.fromJson(value))
+              GoogleCloudVisionV1p3beta1ReferenceImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('statuses')) {
       statuses = (_json['statuses'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10409,8 +10641,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('gcsSource')) {
-      gcsSource =
-          GoogleCloudVisionV1p3beta1GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GoogleCloudVisionV1p3beta1GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -10456,7 +10688,7 @@
   GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -10502,7 +10734,8 @@
 
   GoogleCloudVisionV1p3beta1LocationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10616,7 +10849,7 @@
     }
     if (_json.containsKey('gcsDestination')) {
       gcsDestination = GoogleCloudVisionV1p3beta1GcsDestination.fromJson(
-          _json['gcsDestination']);
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -10656,8 +10889,9 @@
   GoogleCloudVisionV1p3beta1Page.fromJson(core.Map _json) {
     if (_json.containsKey('blocks')) {
       blocks = (_json['blocks'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1Block>(
-              (value) => GoogleCloudVisionV1p3beta1Block.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1Block>((value) =>
+              GoogleCloudVisionV1p3beta1Block.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -10668,7 +10902,7 @@
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
       width = _json['width'] as core.int;
@@ -10721,20 +10955,21 @@
 
   GoogleCloudVisionV1p3beta1Paragraph.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1Word>(
-              (value) => GoogleCloudVisionV1p3beta1Word.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1Word>((value) =>
+              GoogleCloudVisionV1p3beta1Word.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10850,7 +11085,8 @@
     if (_json.containsKey('productLabels')) {
       productLabels = (_json['productLabels'] as core.List)
           .map<GoogleCloudVisionV1p3beta1ProductKeyValue>((value) =>
-              GoogleCloudVisionV1p3beta1ProductKeyValue.fromJson(value))
+              GoogleCloudVisionV1p3beta1ProductKeyValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10938,14 +11174,14 @@
           .map<GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult>(
               (value) =>
                   GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p3beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p3beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10984,21 +11220,21 @@
       core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectAnnotations')) {
       objectAnnotations = (_json['objectAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation>(
               (value) =>
                   GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p3beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p3beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11092,7 +11328,8 @@
       image = _json['image'] as core.String;
     }
     if (_json.containsKey('product')) {
-      product = GoogleCloudVisionV1p3beta1Product.fromJson(_json['product']);
+      product = GoogleCloudVisionV1p3beta1Product.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('score')) {
       score = (_json['score'] as core.num).toDouble();
@@ -11179,8 +11416,9 @@
   GoogleCloudVisionV1p3beta1ReferenceImage.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPolys')) {
       boundingPolys = (_json['boundingPolys'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1BoundingPoly>(
-              (value) => GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1BoundingPoly>((value) =>
+              GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -11332,15 +11570,15 @@
 
   GoogleCloudVisionV1p3beta1Symbol.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -11384,8 +11622,9 @@
   GoogleCloudVisionV1p3beta1TextAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1Page>(
-              (value) => GoogleCloudVisionV1p3beta1Page.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1Page>((value) =>
+              GoogleCloudVisionV1p3beta1Page.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -11495,14 +11734,14 @@
     if (_json.containsKey('detectedBreak')) {
       detectedBreak =
           GoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak.fromJson(
-              _json['detectedBreak']);
+              _json['detectedBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectedLanguages')) {
       detectedLanguages = (_json['detectedLanguages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage>(
               (value) =>
                   GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11585,37 +11824,43 @@
     if (_json.containsKey('bestGuessLabels')) {
       bestGuessLabels = (_json['bestGuessLabels'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebLabel>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebLabel.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebLabel.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pagesWithMatchingImages')) {
       pagesWithMatchingImages = (_json['pagesWithMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebPage>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebPage.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebPage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('visuallySimilarImages')) {
       visuallySimilarImages = (_json['visuallySimilarImages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webEntities')) {
       webEntities = (_json['webEntities'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebEntity>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebEntity.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11782,7 +12027,8 @@
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageTitle')) {
@@ -11791,7 +12037,8 @@
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p3beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -11850,20 +12097,21 @@
 
   GoogleCloudVisionV1p3beta1Word.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('symbols')) {
       symbols = (_json['symbols'] as core.List)
-          .map<GoogleCloudVisionV1p3beta1Symbol>(
-              (value) => GoogleCloudVisionV1p3beta1Symbol.fromJson(value))
+          .map<GoogleCloudVisionV1p3beta1Symbol>((value) =>
+              GoogleCloudVisionV1p3beta1Symbol.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -11907,16 +12155,18 @@
 
   GoogleCloudVisionV1p4beta1AnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('inputConfig')) {
-      inputConfig =
-          GoogleCloudVisionV1p4beta1InputConfig.fromJson(_json['inputConfig']);
+      inputConfig = GoogleCloudVisionV1p4beta1InputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p4beta1AnnotateImageResponse>((value) =>
-              GoogleCloudVisionV1p4beta1AnnotateImageResponse.fromJson(value))
+              GoogleCloudVisionV1p4beta1AnnotateImageResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('totalPages')) {
@@ -11998,41 +12248,47 @@
   GoogleCloudVisionV1p4beta1AnnotateImageResponse.fromJson(core.Map _json) {
     if (_json.containsKey('context')) {
       context = GoogleCloudVisionV1p4beta1ImageAnnotationContext.fromJson(
-          _json['context']);
+          _json['context'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cropHintsAnnotation')) {
       cropHintsAnnotation =
           GoogleCloudVisionV1p4beta1CropHintsAnnotation.fromJson(
-              _json['cropHintsAnnotation']);
+              _json['cropHintsAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('faceAnnotations')) {
       faceAnnotations = (_json['faceAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p4beta1FaceAnnotation>((value) =>
-              GoogleCloudVisionV1p4beta1FaceAnnotation.fromJson(value))
+              GoogleCloudVisionV1p4beta1FaceAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullTextAnnotation')) {
       fullTextAnnotation = GoogleCloudVisionV1p4beta1TextAnnotation.fromJson(
-          _json['fullTextAnnotation']);
+          _json['fullTextAnnotation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('imagePropertiesAnnotation')) {
       imagePropertiesAnnotation =
           GoogleCloudVisionV1p4beta1ImageProperties.fromJson(
-              _json['imagePropertiesAnnotation']);
+              _json['imagePropertiesAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('labelAnnotations')) {
       labelAnnotations = (_json['labelAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p4beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('landmarkAnnotations')) {
       landmarkAnnotations = (_json['landmarkAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p4beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('localizedObjectAnnotations')) {
@@ -12040,34 +12296,38 @@
               as core.List)
           .map<GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation>((value) =>
               GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('logoAnnotations')) {
       logoAnnotations = (_json['logoAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p4beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('productSearchResults')) {
       productSearchResults =
           GoogleCloudVisionV1p4beta1ProductSearchResults.fromJson(
-              _json['productSearchResults']);
+              _json['productSearchResults']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('safeSearchAnnotation')) {
       safeSearchAnnotation =
           GoogleCloudVisionV1p4beta1SafeSearchAnnotation.fromJson(
-              _json['safeSearchAnnotation']);
+              _json['safeSearchAnnotation']
+                  as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textAnnotations')) {
       textAnnotations = (_json['textAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p4beta1EntityAnnotation>((value) =>
-              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(value))
+              GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webDetection')) {
       webDetection = GoogleCloudVisionV1p4beta1WebDetection.fromJson(
-          _json['webDetection']);
+          _json['webDetection'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12135,7 +12395,7 @@
   GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse.fromJson(core.Map _json) {
     if (_json.containsKey('outputConfig')) {
       outputConfig = GoogleCloudVisionV1p4beta1OutputConfig.fromJson(
-          _json['outputConfig']);
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12162,7 +12422,7 @@
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse>((value) =>
               GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12187,7 +12447,7 @@
       core.Map _json) {
     if (_json.containsKey('outputConfig')) {
       outputConfig = GoogleCloudVisionV1p4beta1OutputConfig.fromJson(
-          _json['outputConfig']);
+          _json['outputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12213,7 +12473,8 @@
     if (_json.containsKey('responses')) {
       responses = (_json['responses'] as core.List)
           .map<GoogleCloudVisionV1p4beta1AnnotateFileResponse>((value) =>
-              GoogleCloudVisionV1p4beta1AnnotateFileResponse.fromJson(value))
+              GoogleCloudVisionV1p4beta1AnnotateFileResponse.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12318,21 +12579,22 @@
       blockType = _json['blockType'] as core.String;
     }
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('paragraphs')) {
       paragraphs = (_json['paragraphs'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1Paragraph>(
-              (value) => GoogleCloudVisionV1p4beta1Paragraph.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1Paragraph>((value) =>
+              GoogleCloudVisionV1p4beta1Paragraph.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12371,13 +12633,15 @@
     if (_json.containsKey('normalizedVertices')) {
       normalizedVertices = (_json['normalizedVertices'] as core.List)
           .map<GoogleCloudVisionV1p4beta1NormalizedVertex>((value) =>
-              GoogleCloudVisionV1p4beta1NormalizedVertex.fromJson(value))
+              GoogleCloudVisionV1p4beta1NormalizedVertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('vertices')) {
       vertices = (_json['vertices'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1Vertex>(
-              (value) => GoogleCloudVisionV1p4beta1Vertex.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1Vertex>((value) =>
+              GoogleCloudVisionV1p4beta1Vertex.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12453,7 +12717,8 @@
 
   GoogleCloudVisionV1p4beta1ColorInfo.fromJson(core.Map _json) {
     if (_json.containsKey('color')) {
-      color = Color.fromJson(_json['color']);
+      color =
+          Color.fromJson(_json['color'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pixelFraction')) {
       pixelFraction = (_json['pixelFraction'] as core.num).toDouble();
@@ -12496,7 +12761,7 @@
   GoogleCloudVisionV1p4beta1CropHint.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -12531,8 +12796,9 @@
   GoogleCloudVisionV1p4beta1CropHintsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('cropHints')) {
       cropHints = (_json['cropHints'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1CropHint>(
-              (value) => GoogleCloudVisionV1p4beta1CropHint.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1CropHint>((value) =>
+              GoogleCloudVisionV1p4beta1CropHint.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12556,8 +12822,9 @@
   GoogleCloudVisionV1p4beta1DominantColorsAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('colors')) {
       colors = (_json['colors'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1ColorInfo>(
-              (value) => GoogleCloudVisionV1p4beta1ColorInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1ColorInfo>((value) =>
+              GoogleCloudVisionV1p4beta1ColorInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -12620,7 +12887,7 @@
   GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -12633,8 +12900,9 @@
     }
     if (_json.containsKey('locations')) {
       locations = (_json['locations'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1LocationInfo>(
-              (value) => GoogleCloudVisionV1p4beta1LocationInfo.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1LocationInfo>((value) =>
+              GoogleCloudVisionV1p4beta1LocationInfo.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('mid')) {
@@ -12642,8 +12910,9 @@
     }
     if (_json.containsKey('properties')) {
       properties = (_json['properties'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1Property>(
-              (value) => GoogleCloudVisionV1p4beta1Property.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1Property>((value) =>
+              GoogleCloudVisionV1p4beta1Property.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -12815,7 +13084,7 @@
     }
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectionConfidence')) {
       detectionConfidence =
@@ -12823,7 +13092,7 @@
     }
     if (_json.containsKey('fdBoundingPoly')) {
       fdBoundingPoly = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
-          _json['fdBoundingPoly']);
+          _json['fdBoundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('headwearLikelihood')) {
       headwearLikelihood = _json['headwearLikelihood'] as core.String;
@@ -12838,7 +13107,8 @@
     if (_json.containsKey('landmarks')) {
       landmarks = (_json['landmarks'] as core.List)
           .map<GoogleCloudVisionV1p4beta1FaceAnnotationLandmark>((value) =>
-              GoogleCloudVisionV1p4beta1FaceAnnotationLandmark.fromJson(value))
+              GoogleCloudVisionV1p4beta1FaceAnnotationLandmark.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('panAngle')) {
@@ -12847,7 +13117,8 @@
     if (_json.containsKey('recognitionResult')) {
       recognitionResult = (_json['recognitionResult'] as core.List)
           .map<GoogleCloudVisionV1p4beta1FaceRecognitionResult>((value) =>
-              GoogleCloudVisionV1p4beta1FaceRecognitionResult.fromJson(value))
+              GoogleCloudVisionV1p4beta1FaceRecognitionResult.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('rollAngle')) {
@@ -12973,7 +13244,8 @@
 
   GoogleCloudVisionV1p4beta1FaceAnnotationLandmark.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = GoogleCloudVisionV1p4beta1Position.fromJson(_json['position']);
+      position = GoogleCloudVisionV1p4beta1Position.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -13004,8 +13276,8 @@
 
   GoogleCloudVisionV1p4beta1FaceRecognitionResult.fromJson(core.Map _json) {
     if (_json.containsKey('celebrity')) {
-      celebrity =
-          GoogleCloudVisionV1p4beta1Celebrity.fromJson(_json['celebrity']);
+      celebrity = GoogleCloudVisionV1p4beta1Celebrity.fromJson(
+          _json['celebrity'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
@@ -13127,7 +13399,7 @@
     if (_json.containsKey('dominantColors')) {
       dominantColors =
           GoogleCloudVisionV1p4beta1DominantColorsAnnotation.fromJson(
-              _json['dominantColors']);
+              _json['dominantColors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13159,12 +13431,14 @@
     if (_json.containsKey('referenceImages')) {
       referenceImages = (_json['referenceImages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1ReferenceImage>((value) =>
-              GoogleCloudVisionV1p4beta1ReferenceImage.fromJson(value))
+              GoogleCloudVisionV1p4beta1ReferenceImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('statuses')) {
       statuses = (_json['statuses'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13211,8 +13485,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('gcsSource')) {
-      gcsSource =
-          GoogleCloudVisionV1p4beta1GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GoogleCloudVisionV1p4beta1GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -13258,7 +13532,7 @@
   GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -13304,7 +13578,8 @@
 
   GoogleCloudVisionV1p4beta1LocationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13418,7 +13693,7 @@
     }
     if (_json.containsKey('gcsDestination')) {
       gcsDestination = GoogleCloudVisionV1p4beta1GcsDestination.fromJson(
-          _json['gcsDestination']);
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13458,8 +13733,9 @@
   GoogleCloudVisionV1p4beta1Page.fromJson(core.Map _json) {
     if (_json.containsKey('blocks')) {
       blocks = (_json['blocks'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1Block>(
-              (value) => GoogleCloudVisionV1p4beta1Block.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1Block>((value) =>
+              GoogleCloudVisionV1p4beta1Block.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -13470,7 +13746,7 @@
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
       width = _json['width'] as core.int;
@@ -13523,20 +13799,21 @@
 
   GoogleCloudVisionV1p4beta1Paragraph.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1Word>(
-              (value) => GoogleCloudVisionV1p4beta1Word.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1Word>((value) =>
+              GoogleCloudVisionV1p4beta1Word.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13652,7 +13929,8 @@
     if (_json.containsKey('productLabels')) {
       productLabels = (_json['productLabels'] as core.List)
           .map<GoogleCloudVisionV1p4beta1ProductKeyValue>((value) =>
-              GoogleCloudVisionV1p4beta1ProductKeyValue.fromJson(value))
+              GoogleCloudVisionV1p4beta1ProductKeyValue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13740,14 +14018,14 @@
           .map<GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult>(
               (value) =>
                   GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p4beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p4beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13786,21 +14064,21 @@
       core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
       boundingPoly = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
-          _json['boundingPoly']);
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectAnnotations')) {
       objectAnnotations = (_json['objectAnnotations'] as core.List)
           .map<GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation>(
               (value) =>
                   GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
           .map<GoogleCloudVisionV1p4beta1ProductSearchResultsResult>((value) =>
               GoogleCloudVisionV1p4beta1ProductSearchResultsResult.fromJson(
-                  value))
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -13894,7 +14172,8 @@
       image = _json['image'] as core.String;
     }
     if (_json.containsKey('product')) {
-      product = GoogleCloudVisionV1p4beta1Product.fromJson(_json['product']);
+      product = GoogleCloudVisionV1p4beta1Product.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('score')) {
       score = (_json['score'] as core.num).toDouble();
@@ -13981,8 +14260,9 @@
   GoogleCloudVisionV1p4beta1ReferenceImage.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPolys')) {
       boundingPolys = (_json['boundingPolys'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1BoundingPoly>(
-              (value) => GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1BoundingPoly>((value) =>
+              GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -14134,15 +14414,15 @@
 
   GoogleCloudVisionV1p4beta1Symbol.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -14186,8 +14466,9 @@
   GoogleCloudVisionV1p4beta1TextAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1Page>(
-              (value) => GoogleCloudVisionV1p4beta1Page.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1Page>((value) =>
+              GoogleCloudVisionV1p4beta1Page.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -14297,14 +14578,14 @@
     if (_json.containsKey('detectedBreak')) {
       detectedBreak =
           GoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak.fromJson(
-              _json['detectedBreak']);
+              _json['detectedBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectedLanguages')) {
       detectedLanguages = (_json['detectedLanguages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage>(
               (value) =>
                   GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage
-                      .fromJson(value))
+                      .fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14387,37 +14668,43 @@
     if (_json.containsKey('bestGuessLabels')) {
       bestGuessLabels = (_json['bestGuessLabels'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebLabel>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebLabel.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebLabel.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pagesWithMatchingImages')) {
       pagesWithMatchingImages = (_json['pagesWithMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebPage>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebPage.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebPage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('visuallySimilarImages')) {
       visuallySimilarImages = (_json['visuallySimilarImages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webEntities')) {
       webEntities = (_json['webEntities'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebEntity>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebEntity.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebEntity.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14584,7 +14871,8 @@
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageTitle')) {
@@ -14593,7 +14881,8 @@
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
           .map<GoogleCloudVisionV1p4beta1WebDetectionWebImage>((value) =>
-              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(value))
+              GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -14652,20 +14941,21 @@
 
   GoogleCloudVisionV1p4beta1Word.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox =
-          GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
       property = GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
-          _json['property']);
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('symbols')) {
       symbols = (_json['symbols'] as core.List)
-          .map<GoogleCloudVisionV1p4beta1Symbol>(
-              (value) => GoogleCloudVisionV1p4beta1Symbol.fromJson(value))
+          .map<GoogleCloudVisionV1p4beta1Symbol>((value) =>
+              GoogleCloudVisionV1p4beta1Symbol.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14703,16 +14993,19 @@
 
   GroupedResult.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
-      boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
+      boundingPoly = BoundingPoly.fromJson(
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectAnnotations')) {
       objectAnnotations = (_json['objectAnnotations'] as core.List)
-          .map<ObjectAnnotation>((value) => ObjectAnnotation.fromJson(value))
+          .map<ObjectAnnotation>((value) => ObjectAnnotation.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<Result>((value) => Result.fromJson(value))
+          .map<Result>((value) =>
+              Result.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14760,7 +15053,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('source')) {
-      source = ImageSource.fromJson(_json['source']);
+      source = ImageSource.fromJson(
+          _json['source'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14837,7 +15131,8 @@
 
   ImageContext.fromJson(core.Map _json) {
     if (_json.containsKey('cropHintsParams')) {
-      cropHintsParams = CropHintsParams.fromJson(_json['cropHintsParams']);
+      cropHintsParams = CropHintsParams.fromJson(
+          _json['cropHintsParams'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageHints')) {
       languageHints = (_json['languageHints'] as core.List)
@@ -14845,15 +15140,16 @@
           .toList();
     }
     if (_json.containsKey('latLongRect')) {
-      latLongRect = LatLongRect.fromJson(_json['latLongRect']);
+      latLongRect = LatLongRect.fromJson(
+          _json['latLongRect'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('productSearchParams')) {
-      productSearchParams =
-          ProductSearchParams.fromJson(_json['productSearchParams']);
+      productSearchParams = ProductSearchParams.fromJson(
+          _json['productSearchParams'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('webDetectionParams')) {
-      webDetectionParams =
-          WebDetectionParams.fromJson(_json['webDetectionParams']);
+      webDetectionParams = WebDetectionParams.fromJson(
+          _json['webDetectionParams'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14887,8 +15183,8 @@
 
   ImageProperties.fromJson(core.Map _json) {
     if (_json.containsKey('dominantColors')) {
-      dominantColors =
-          DominantColorsAnnotation.fromJson(_json['dominantColors']);
+      dominantColors = DominantColorsAnnotation.fromJson(
+          _json['dominantColors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15011,7 +15307,8 @@
 
   ImportProductSetsInputConfig.fromJson(core.Map _json) {
     if (_json.containsKey('gcsSource')) {
-      gcsSource = ImportProductSetsGcsSource.fromJson(_json['gcsSource']);
+      gcsSource = ImportProductSetsGcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15033,7 +15330,8 @@
 
   ImportProductSetsRequest.fromJson(core.Map _json) {
     if (_json.containsKey('inputConfig')) {
-      inputConfig = ImportProductSetsInputConfig.fromJson(_json['inputConfig']);
+      inputConfig = ImportProductSetsInputConfig.fromJson(
+          _json['inputConfig'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15064,12 +15362,14 @@
   ImportProductSetsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('referenceImages')) {
       referenceImages = (_json['referenceImages'] as core.List)
-          .map<ReferenceImage>((value) => ReferenceImage.fromJson(value))
+          .map<ReferenceImage>((value) => ReferenceImage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('statuses')) {
       statuses = (_json['statuses'] as core.List)
-          .map<Status>((value) => Status.fromJson(value))
+          .map<Status>((value) =>
+              Status.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15116,7 +15416,8 @@
       content = _json['content'] as core.String;
     }
     if (_json.containsKey('gcsSource')) {
-      gcsSource = GcsSource.fromJson(_json['gcsSource']);
+      gcsSource = GcsSource.fromJson(
+          _json['gcsSource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('mimeType')) {
       mimeType = _json['mimeType'] as core.String;
@@ -15222,7 +15523,8 @@
 
   Landmark.fromJson(core.Map _json) {
     if (_json.containsKey('position')) {
-      position = Position.fromJson(_json['position']);
+      position = Position.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -15287,10 +15589,12 @@
 
   LatLongRect.fromJson(core.Map _json) {
     if (_json.containsKey('maxLatLng')) {
-      maxLatLng = LatLng.fromJson(_json['maxLatLng']);
+      maxLatLng = LatLng.fromJson(
+          _json['maxLatLng'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('minLatLng')) {
-      minLatLng = LatLng.fromJson(_json['minLatLng']);
+      minLatLng = LatLng.fromJson(
+          _json['minLatLng'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15322,7 +15626,8 @@
     }
     if (_json.containsKey('operations')) {
       operations = (_json['operations'] as core.List)
-          .map<Operation>((value) => Operation.fromJson(value))
+          .map<Operation>((value) =>
+              Operation.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15356,7 +15661,8 @@
     }
     if (_json.containsKey('productSets')) {
       productSets = (_json['productSets'] as core.List)
-          .map<ProductSet>((value) => ProductSet.fromJson(value))
+          .map<ProductSet>((value) =>
+              ProductSet.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15391,7 +15697,8 @@
     }
     if (_json.containsKey('products')) {
       products = (_json['products'] as core.List)
-          .map<Product>((value) => Product.fromJson(value))
+          .map<Product>((value) =>
+              Product.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15425,7 +15732,8 @@
     }
     if (_json.containsKey('products')) {
       products = (_json['products'] as core.List)
-          .map<Product>((value) => Product.fromJson(value))
+          .map<Product>((value) =>
+              Product.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15464,7 +15772,8 @@
     }
     if (_json.containsKey('referenceImages')) {
       referenceImages = (_json['referenceImages'] as core.List)
-          .map<ReferenceImage>((value) => ReferenceImage.fromJson(value))
+          .map<ReferenceImage>((value) => ReferenceImage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -15508,7 +15817,8 @@
 
   LocalizedObjectAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
-      boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
+      boundingPoly = BoundingPoly.fromJson(
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('languageCode')) {
       languageCode = _json['languageCode'] as core.String;
@@ -15554,7 +15864,8 @@
 
   LocationInfo.fromJson(core.Map _json) {
     if (_json.containsKey('latLng')) {
-      latLng = LatLng.fromJson(_json['latLng']);
+      latLng = LatLng.fromJson(
+          _json['latLng'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15694,11 +16005,13 @@
       done = _json['done'] as core.bool;
     }
     if (_json.containsKey('error')) {
-      error = Status.fromJson(_json['error']);
+      error = Status.fromJson(
+          _json['error'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('metadata')) {
       metadata = commons.mapMap<core.Object, core.Object>(
-          _json['metadata'].cast<core.String, core.Object>(),
+          (_json['metadata'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
     if (_json.containsKey('name')) {
@@ -15706,7 +16019,8 @@
     }
     if (_json.containsKey('response')) {
       response = commons.mapMap<core.Object, core.Object>(
-          _json['response'].cast<core.String, core.Object>(),
+          (_json['response'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Object>(),
           (core.Object item) => item as core.Object);
     }
   }
@@ -15800,7 +16114,8 @@
       batchSize = _json['batchSize'] as core.int;
     }
     if (_json.containsKey('gcsDestination')) {
-      gcsDestination = GcsDestination.fromJson(_json['gcsDestination']);
+      gcsDestination = GcsDestination.fromJson(
+          _json['gcsDestination'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15840,7 +16155,8 @@
   Page.fromJson(core.Map _json) {
     if (_json.containsKey('blocks')) {
       blocks = (_json['blocks'] as core.List)
-          .map<Block>((value) => Block.fromJson(value))
+          .map<Block>((value) =>
+              Block.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('confidence')) {
@@ -15850,7 +16166,8 @@
       height = _json['height'] as core.int;
     }
     if (_json.containsKey('property')) {
-      property = TextProperty.fromJson(_json['property']);
+      property = TextProperty.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('width')) {
       width = _json['width'] as core.int;
@@ -15903,17 +16220,20 @@
 
   Paragraph.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
-      property = TextProperty.fromJson(_json['property']);
+      property = TextProperty.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('words')) {
       words = (_json['words'] as core.List)
-          .map<Word>((value) => Word.fromJson(value))
+          .map<Word>((value) =>
+              Word.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16028,7 +16348,8 @@
     }
     if (_json.containsKey('productLabels')) {
       productLabels = (_json['productLabels'] as core.List)
-          .map<KeyValue>((value) => KeyValue.fromJson(value))
+          .map<KeyValue>((value) =>
+              KeyValue.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16088,7 +16409,8 @@
 
   ProductSearchParams.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPoly')) {
-      boundingPoly = BoundingPoly.fromJson(_json['boundingPoly']);
+      boundingPoly = BoundingPoly.fromJson(
+          _json['boundingPoly'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filter')) {
       filter = _json['filter'] as core.String;
@@ -16145,12 +16467,14 @@
     }
     if (_json.containsKey('productGroupedResults')) {
       productGroupedResults = (_json['productGroupedResults'] as core.List)
-          .map<GroupedResult>((value) => GroupedResult.fromJson(value))
+          .map<GroupedResult>((value) => GroupedResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('results')) {
       results = (_json['results'] as core.List)
-          .map<Result>((value) => Result.fromJson(value))
+          .map<Result>((value) =>
+              Result.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16201,7 +16525,8 @@
       displayName = _json['displayName'] as core.String;
     }
     if (_json.containsKey('indexError')) {
-      indexError = Status.fromJson(_json['indexError']);
+      indexError = Status.fromJson(
+          _json['indexError'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('indexTime')) {
       indexTime = _json['indexTime'] as core.String;
@@ -16316,8 +16641,9 @@
       force = _json['force'] as core.bool;
     }
     if (_json.containsKey('productSetPurgeConfig')) {
-      productSetPurgeConfig =
-          ProductSetPurgeConfig.fromJson(_json['productSetPurgeConfig']);
+      productSetPurgeConfig = ProductSetPurgeConfig.fromJson(
+          _json['productSetPurgeConfig']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16361,7 +16687,8 @@
   ReferenceImage.fromJson(core.Map _json) {
     if (_json.containsKey('boundingPolys')) {
       boundingPolys = (_json['boundingPolys'] as core.List)
-          .map<BoundingPoly>((value) => BoundingPoly.fromJson(value))
+          .map<BoundingPoly>((value) => BoundingPoly.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('name')) {
@@ -16432,7 +16759,8 @@
       image = _json['image'] as core.String;
     }
     if (_json.containsKey('product')) {
-      product = Product.fromJson(_json['product']);
+      product = Product.fromJson(
+          _json['product'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('score')) {
       score = (_json['score'] as core.num).toDouble();
@@ -16586,7 +16914,8 @@
       details = (_json['details'] as core.List)
           .map<core.Map<core.String, core.Object>>((value) =>
               commons.mapMap<core.Object, core.Object>(
-                  value.cast<core.String, core.Object>(),
+                  (value as core.Map<core.String, core.dynamic>)
+                      .cast<core.String, core.Object>(),
                   (core.Object item) => item as core.Object))
           .toList();
     }
@@ -16635,13 +16964,15 @@
 
   Symbol.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
-      property = TextProperty.fromJson(_json['property']);
+      property = TextProperty.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('text')) {
       text = _json['text'] as core.String;
@@ -16685,7 +17016,8 @@
   TextAnnotation.fromJson(core.Map _json) {
     if (_json.containsKey('pages')) {
       pages = (_json['pages'] as core.List)
-          .map<Page>((value) => Page.fromJson(value))
+          .map<Page>((value) =>
+              Page.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('text')) {
@@ -16717,11 +17049,13 @@
 
   TextProperty.fromJson(core.Map _json) {
     if (_json.containsKey('detectedBreak')) {
-      detectedBreak = DetectedBreak.fromJson(_json['detectedBreak']);
+      detectedBreak = DetectedBreak.fromJson(
+          _json['detectedBreak'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('detectedLanguages')) {
       detectedLanguages = (_json['detectedLanguages'] as core.List)
-          .map<DetectedLanguage>((value) => DetectedLanguage.fromJson(value))
+          .map<DetectedLanguage>((value) => DetectedLanguage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -16800,32 +17134,38 @@
   WebDetection.fromJson(core.Map _json) {
     if (_json.containsKey('bestGuessLabels')) {
       bestGuessLabels = (_json['bestGuessLabels'] as core.List)
-          .map<WebLabel>((value) => WebLabel.fromJson(value))
+          .map<WebLabel>((value) =>
+              WebLabel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
-          .map<WebImage>((value) => WebImage.fromJson(value))
+          .map<WebImage>((value) =>
+              WebImage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pagesWithMatchingImages')) {
       pagesWithMatchingImages = (_json['pagesWithMatchingImages'] as core.List)
-          .map<WebPage>((value) => WebPage.fromJson(value))
+          .map<WebPage>((value) =>
+              WebPage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
-          .map<WebImage>((value) => WebImage.fromJson(value))
+          .map<WebImage>((value) =>
+              WebImage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('visuallySimilarImages')) {
       visuallySimilarImages = (_json['visuallySimilarImages'] as core.List)
-          .map<WebImage>((value) => WebImage.fromJson(value))
+          .map<WebImage>((value) =>
+              WebImage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('webEntities')) {
       webEntities = (_json['webEntities'] as core.List)
-          .map<WebEntity>((value) => WebEntity.fromJson(value))
+          .map<WebEntity>((value) =>
+              WebEntity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17012,7 +17352,8 @@
   WebPage.fromJson(core.Map _json) {
     if (_json.containsKey('fullMatchingImages')) {
       fullMatchingImages = (_json['fullMatchingImages'] as core.List)
-          .map<WebImage>((value) => WebImage.fromJson(value))
+          .map<WebImage>((value) =>
+              WebImage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('pageTitle')) {
@@ -17020,7 +17361,8 @@
     }
     if (_json.containsKey('partialMatchingImages')) {
       partialMatchingImages = (_json['partialMatchingImages'] as core.List)
-          .map<WebImage>((value) => WebImage.fromJson(value))
+          .map<WebImage>((value) =>
+              WebImage.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('score')) {
@@ -17079,17 +17421,20 @@
 
   Word.fromJson(core.Map _json) {
     if (_json.containsKey('boundingBox')) {
-      boundingBox = BoundingPoly.fromJson(_json['boundingBox']);
+      boundingBox = BoundingPoly.fromJson(
+          _json['boundingBox'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('confidence')) {
       confidence = (_json['confidence'] as core.num).toDouble();
     }
     if (_json.containsKey('property')) {
-      property = TextProperty.fromJson(_json['property']);
+      property = TextProperty.fromJson(
+          _json['property'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('symbols')) {
       symbols = (_json['symbols'] as core.List)
-          .map<Symbol>((value) => Symbol.fromJson(value))
+          .map<Symbol>((value) =>
+              Symbol.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/webfonts/v1.dart b/generated/googleapis/lib/webfonts/v1.dart
index 701bef9..9df2575 100644
--- a/generated/googleapis/lib/webfonts/v1.dart
+++ b/generated/googleapis/lib/webfonts/v1.dart
@@ -101,7 +101,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WebfontList.fromJson(data));
+    return _response.then(
+      (data) =>
+          WebfontList.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -143,7 +146,8 @@
     }
     if (_json.containsKey('files')) {
       files = commons.mapMap<core.String, core.String>(
-          _json['files'].cast<core.String, core.String>(),
+          (_json['files'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.String>(),
           (core.String item) => item as core.String);
     }
     if (_json.containsKey('kind')) {
@@ -211,7 +215,8 @@
   WebfontList.fromJson(core.Map _json) {
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Webfont>((value) => Webfont.fromJson(value))
+          .map<Webfont>((value) =>
+              Webfont.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
diff --git a/generated/googleapis/lib/webmasters/v3.dart b/generated/googleapis/lib/webmasters/v3.dart
index 8bbdd40..842bc0c 100644
--- a/generated/googleapis/lib/webmasters/v3.dart
+++ b/generated/googleapis/lib/webmasters/v3.dart
@@ -119,8 +119,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => SearchAnalyticsQueryResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchAnalyticsQueryResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -185,7 +187,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves information about a specific sitemap.
@@ -244,7 +248,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WmxSitemap.fromJson(data));
+    return _response.then(
+      (data) =>
+          WmxSitemap.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the sitemaps-entries submitted for this site, or included in the
@@ -301,7 +308,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SitemapsListResponse.fromJson(data));
+    return _response.then(
+      (data) => SitemapsListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Submits a sitemap for a site.
@@ -360,7 +370,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -414,7 +426,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Removes a site from the set of the user's Search Console sites.
@@ -465,7 +479,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves information about specific site.
@@ -516,7 +532,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => WmxSite.fromJson(data));
+    return _response.then(
+      (data) => WmxSite.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists the user's Search Console sites.
@@ -558,7 +576,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SitesListResponse.fromJson(data));
+    return _response.then(
+      (data) => SitesListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -655,8 +676,8 @@
   ApiDimensionFilterGroup.fromJson(core.Map _json) {
     if (_json.containsKey('filters')) {
       filters = (_json['filters'] as core.List)
-          .map<ApiDimensionFilter>(
-              (value) => ApiDimensionFilter.fromJson(value))
+          .map<ApiDimensionFilter>((value) => ApiDimensionFilter.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('groupType')) {
@@ -734,8 +755,9 @@
     }
     if (_json.containsKey('dimensionFilterGroups')) {
       dimensionFilterGroups = (_json['dimensionFilterGroups'] as core.List)
-          .map<ApiDimensionFilterGroup>(
-              (value) => ApiDimensionFilterGroup.fromJson(value))
+          .map<ApiDimensionFilterGroup>((value) =>
+              ApiDimensionFilterGroup.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('dimensions')) {
@@ -809,7 +831,8 @@
     }
     if (_json.containsKey('rows')) {
       rows = (_json['rows'] as core.List)
-          .map<ApiDataRow>((value) => ApiDataRow.fromJson(value))
+          .map<ApiDataRow>((value) =>
+              ApiDataRow.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -836,7 +859,8 @@
   SitemapsListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('sitemap')) {
       sitemap = (_json['sitemap'] as core.List)
-          .map<WmxSitemap>((value) => WmxSitemap.fromJson(value))
+          .map<WmxSitemap>((value) =>
+              WmxSitemap.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -861,7 +885,8 @@
   SitesListResponse.fromJson(core.Map _json) {
     if (_json.containsKey('siteEntry')) {
       siteEntry = (_json['siteEntry'] as core.List)
-          .map<WmxSite>((value) => WmxSite.fromJson(value))
+          .map<WmxSite>((value) =>
+              WmxSite.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -945,7 +970,8 @@
   WmxSitemap.fromJson(core.Map _json) {
     if (_json.containsKey('contents')) {
       contents = (_json['contents'] as core.List)
-          .map<WmxSitemapContent>((value) => WmxSitemapContent.fromJson(value))
+          .map<WmxSitemapContent>((value) => WmxSitemapContent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('errors')) {
diff --git a/generated/googleapis/lib/websecurityscanner/v1.dart b/generated/googleapis/lib/websecurityscanner/v1.dart
index ac5d2ad..3223e51 100644
--- a/generated/googleapis/lib/websecurityscanner/v1.dart
+++ b/generated/googleapis/lib/websecurityscanner/v1.dart
@@ -121,7 +121,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ScanConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          ScanConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes an existing ScanConfig and its child resources.
@@ -172,7 +175,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a ScanConfig.
@@ -223,7 +228,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ScanConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          ScanConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists ScanConfigs under a given project.
@@ -291,7 +299,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListScanConfigsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListScanConfigsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates a ScanConfig. This method support partial update of a ScanConfig.
@@ -356,7 +367,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ScanConfig.fromJson(data));
+    return _response.then(
+      (data) =>
+          ScanConfig.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Start a ScanRun according to the given ScanConfig.
@@ -413,7 +427,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ScanRun.fromJson(data));
+    return _response.then(
+      (data) => ScanRun.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -479,7 +495,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ScanRun.fromJson(data));
+    return _response.then(
+      (data) => ScanRun.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists ScanRuns under a given ScanConfig, in descending order of ScanRun
@@ -548,7 +566,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListScanRunsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListScanRunsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Stops a ScanRun. The stopped ScanRun is returned.
@@ -606,7 +627,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ScanRun.fromJson(data));
+    return _response.then(
+      (data) => ScanRun.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -683,7 +706,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListCrawledUrlsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListCrawledUrlsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -745,8 +771,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => ListFindingTypeStatsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFindingTypeStatsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -805,7 +833,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Finding.fromJson(data));
+    return _response.then(
+      (data) => Finding.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// List Findings under a given ScanRun.
@@ -881,7 +911,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListFindingsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListFindingsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -900,13 +933,16 @@
 
   Authentication.fromJson(core.Map _json) {
     if (_json.containsKey('customAccount')) {
-      customAccount = CustomAccount.fromJson(_json['customAccount']);
+      customAccount = CustomAccount.fromJson(
+          _json['customAccount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('googleAccount')) {
-      googleAccount = GoogleAccount.fromJson(_json['googleAccount']);
+      googleAccount = GoogleAccount.fromJson(
+          _json['googleAccount'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('iapCredential')) {
-      iapCredential = IapCredential.fromJson(_json['iapCredential']);
+      iapCredential = IapCredential.fromJson(
+          _json['iapCredential'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1120,7 +1156,8 @@
       findingType = _json['findingType'] as core.String;
     }
     if (_json.containsKey('form')) {
-      form = Form.fromJson(_json['form']);
+      form =
+          Form.fromJson(_json['form'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('frameUrl')) {
       frameUrl = _json['frameUrl'] as core.String;
@@ -1135,7 +1172,8 @@
       name = _json['name'] as core.String;
     }
     if (_json.containsKey('outdatedLibrary')) {
-      outdatedLibrary = OutdatedLibrary.fromJson(_json['outdatedLibrary']);
+      outdatedLibrary = OutdatedLibrary.fromJson(
+          _json['outdatedLibrary'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('reproductionUrl')) {
       reproductionUrl = _json['reproductionUrl'] as core.String;
@@ -1147,19 +1185,19 @@
       trackingId = _json['trackingId'] as core.String;
     }
     if (_json.containsKey('violatingResource')) {
-      violatingResource =
-          ViolatingResource.fromJson(_json['violatingResource']);
+      violatingResource = ViolatingResource.fromJson(
+          _json['violatingResource'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('vulnerableHeaders')) {
-      vulnerableHeaders =
-          VulnerableHeaders.fromJson(_json['vulnerableHeaders']);
+      vulnerableHeaders = VulnerableHeaders.fromJson(
+          _json['vulnerableHeaders'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('vulnerableParameters')) {
-      vulnerableParameters =
-          VulnerableParameters.fromJson(_json['vulnerableParameters']);
+      vulnerableParameters = VulnerableParameters.fromJson(
+          _json['vulnerableParameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('xss')) {
-      xss = Xss.fromJson(_json['xss']);
+      xss = Xss.fromJson(_json['xss'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1360,7 +1398,8 @@
   IapCredential.fromJson(core.Map _json) {
     if (_json.containsKey('iapTestServiceAccountInfo')) {
       iapTestServiceAccountInfo = IapTestServiceAccountInfo.fromJson(
-          _json['iapTestServiceAccountInfo']);
+          _json['iapTestServiceAccountInfo']
+              as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1411,7 +1450,8 @@
   ListCrawledUrlsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('crawledUrls')) {
       crawledUrls = (_json['crawledUrls'] as core.List)
-          .map<CrawledUrl>((value) => CrawledUrl.fromJson(value))
+          .map<CrawledUrl>((value) =>
+              CrawledUrl.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1442,7 +1482,8 @@
   ListFindingTypeStatsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('findingTypeStats')) {
       findingTypeStats = (_json['findingTypeStats'] as core.List)
-          .map<FindingTypeStats>((value) => FindingTypeStats.fromJson(value))
+          .map<FindingTypeStats>((value) => FindingTypeStats.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1471,7 +1512,8 @@
   ListFindingsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('findings')) {
       findings = (_json['findings'] as core.List)
-          .map<Finding>((value) => Finding.fromJson(value))
+          .map<Finding>((value) =>
+              Finding.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1508,7 +1550,8 @@
     }
     if (_json.containsKey('scanConfigs')) {
       scanConfigs = (_json['scanConfigs'] as core.List)
-          .map<ScanConfig>((value) => ScanConfig.fromJson(value))
+          .map<ScanConfig>((value) =>
+              ScanConfig.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1543,7 +1586,8 @@
     }
     if (_json.containsKey('scanRuns')) {
       scanRuns = (_json['scanRuns'] as core.List)
-          .map<ScanRun>((value) => ScanRun.fromJson(value))
+          .map<ScanRun>((value) =>
+              ScanRun.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1670,7 +1714,8 @@
 
   ScanConfig.fromJson(core.Map _json) {
     if (_json.containsKey('authentication')) {
-      authentication = Authentication.fromJson(_json['authentication']);
+      authentication = Authentication.fromJson(
+          _json['authentication'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('blacklistPatterns')) {
       blacklistPatterns = (_json['blacklistPatterns'] as core.List)
@@ -1697,7 +1742,8 @@
       riskLevel = _json['riskLevel'] as core.String;
     }
     if (_json.containsKey('schedule')) {
-      schedule = Schedule.fromJson(_json['schedule']);
+      schedule = Schedule.fromJson(
+          _json['schedule'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('startingUrls')) {
       startingUrls = (_json['startingUrls'] as core.List)
@@ -1938,7 +1984,8 @@
       endTime = _json['endTime'] as core.String;
     }
     if (_json.containsKey('errorTrace')) {
-      errorTrace = ScanRunErrorTrace.fromJson(_json['errorTrace']);
+      errorTrace = ScanRunErrorTrace.fromJson(
+          _json['errorTrace'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('executionState')) {
       executionState = _json['executionState'] as core.String;
@@ -1966,8 +2013,8 @@
     }
     if (_json.containsKey('warningTraces')) {
       warningTraces = (_json['warningTraces'] as core.List)
-          .map<ScanRunWarningTrace>(
-              (value) => ScanRunWarningTrace.fromJson(value))
+          .map<ScanRunWarningTrace>((value) => ScanRunWarningTrace.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -2056,7 +2103,8 @@
       mostCommonHttpErrorCode = _json['mostCommonHttpErrorCode'] as core.int;
     }
     if (_json.containsKey('scanConfigError')) {
-      scanConfigError = ScanConfigError.fromJson(_json['scanConfigError']);
+      scanConfigError = ScanConfigError.fromJson(
+          _json['scanConfigError'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -2220,12 +2268,14 @@
   VulnerableHeaders.fromJson(core.Map _json) {
     if (_json.containsKey('headers')) {
       headers = (_json['headers'] as core.List)
-          .map<Header>((value) => Header.fromJson(value))
+          .map<Header>((value) =>
+              Header.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('missingHeaders')) {
       missingHeaders = (_json['missingHeaders'] as core.List)
-          .map<Header>((value) => Header.fromJson(value))
+          .map<Header>((value) =>
+              Header.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/youtube/v3.dart b/generated/googleapis/lib/youtube/v3.dart
index 718928d..aa79144 100644
--- a/generated/googleapis/lib/youtube/v3.dart
+++ b/generated/googleapis/lib/youtube/v3.dart
@@ -186,7 +186,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => AbuseReport.fromJson(data));
+    return _response.then(
+      (data) =>
+          AbuseReport.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -299,7 +302,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ActivityListResponse.fromJson(data));
+    return _response.then(
+      (data) => ActivityListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -376,7 +382,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Downloads a caption track.
@@ -467,7 +475,9 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => null);
+      return _response.then(
+        (data) => null,
+      );
     } else {
       return _response;
     }
@@ -572,7 +582,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Caption.fromJson(data));
+    return _response.then(
+      (data) => Caption.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -658,7 +670,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CaptionListResponse.fromJson(data));
+    return _response.then(
+      (data) => CaptionListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -761,7 +776,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Caption.fromJson(data));
+    return _response.then(
+      (data) => Caption.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -877,7 +894,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChannelBannerResource.fromJson(data));
+    return _response.then(
+      (data) => ChannelBannerResource.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -947,7 +967,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -1043,7 +1065,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChannelSection.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChannelSection.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -1140,7 +1165,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChannelSectionListResponse.fromJson(data));
+    return _response.then(
+      (data) => ChannelSectionListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -1213,7 +1241,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChannelSection.fromJson(data));
+    return _response.then(
+      (data) =>
+          ChannelSection.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1350,7 +1381,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ChannelListResponse.fromJson(data));
+    return _response.then(
+      (data) => ChannelListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -1426,7 +1460,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Channel.fromJson(data));
+    return _response.then(
+      (data) => Channel.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1489,7 +1525,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentThread.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentThread.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -1623,7 +1662,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentThreadListResponse.fromJson(data));
+    return _response.then(
+      (data) => CommentThreadListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -1681,7 +1723,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentThread.fromJson(data));
+    return _response.then(
+      (data) =>
+          CommentThread.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -1736,7 +1781,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -1793,7 +1840,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -1882,7 +1931,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => CommentListResponse.fromJson(data));
+    return _response.then(
+      (data) => CommentListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Expresses the caller's opinion that one or more comments should be flagged
@@ -1933,7 +1985,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Sets the moderation status of one or more comments.
@@ -2006,7 +2060,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Updates an existing resource.
@@ -2064,7 +2120,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Comment.fromJson(data));
+    return _response.then(
+      (data) => Comment.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2127,7 +2185,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => I18nLanguageListResponse.fromJson(data));
+    return _response.then(
+      (data) => I18nLanguageListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2189,7 +2250,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => I18nRegionListResponse.fromJson(data));
+    return _response.then(
+      (data) => I18nRegionListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -2298,7 +2362,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveBroadcast.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveBroadcast.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Slate and recording control of the live broadcast. Support actions: slate
@@ -2419,7 +2486,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveBroadcast.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveBroadcast.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Delete a given broadcast.
@@ -2506,7 +2576,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new stream for the authenticated user.
@@ -2603,7 +2675,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveBroadcast.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveBroadcast.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve the list of broadcasts associated with the given channel.
@@ -2744,7 +2819,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveBroadcastListResponse.fromJson(data));
+    return _response.then(
+      (data) => LiveBroadcastListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Transition a broadcast to a given status.
@@ -2858,7 +2936,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveBroadcast.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveBroadcast.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing broadcast for the authenticated user.
@@ -2963,7 +3044,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveBroadcast.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveBroadcast.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3018,7 +3102,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -3076,7 +3162,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveChatBan.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveChatBan.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3132,7 +3221,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -3189,7 +3280,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveChatMessage.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveChatMessage.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -3276,7 +3370,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveChatMessageListResponse.fromJson(data));
+    return _response.then(
+      (data) => LiveChatMessageListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3332,7 +3429,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -3390,7 +3489,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveChatModerator.fromJson(data));
+    return _response.then(
+      (data) => LiveChatModerator.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -3464,8 +3566,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => LiveChatModeratorListResponse.fromJson(data));
+    return _response.then(
+      (data) => LiveChatModeratorListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3558,7 +3662,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new stream for the authenticated user.
@@ -3654,7 +3760,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveStream.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveStream.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieve the list of streams associated with the given channel. --
@@ -3771,7 +3880,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveStreamListResponse.fromJson(data));
+    return _response.then(
+      (data) => LiveStreamListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing stream for the authenticated user.
@@ -3871,7 +3983,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => LiveStream.fromJson(data));
+    return _response.then(
+      (data) =>
+          LiveStream.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -3967,7 +4082,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => MemberListResponse.fromJson(data));
+    return _response.then(
+      (data) => MemberListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4025,8 +4143,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => MembershipsLevelListResponse.fromJson(data));
+    return _response.then(
+      (data) => MembershipsLevelListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4096,7 +4216,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -4168,7 +4290,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlaylistItem.fromJson(data));
+    return _response.then(
+      (data) =>
+          PlaylistItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -4272,7 +4397,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlaylistItemListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlaylistItemListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -4354,7 +4482,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlaylistItem.fromJson(data));
+    return _response.then(
+      (data) =>
+          PlaylistItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -4424,7 +4555,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -4519,7 +4652,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Playlist.fromJson(data));
+    return _response.then(
+      (data) => Playlist.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -4651,7 +4786,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => PlaylistListResponse.fromJson(data));
+    return _response.then(
+      (data) => PlaylistListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -4729,7 +4867,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Playlist.fromJson(data));
+    return _response.then(
+      (data) => Playlist.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5053,7 +5193,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SearchListResponse.fromJson(data));
+    return _response.then(
+      (data) => SearchListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5135,7 +5278,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SponsorListResponse.fromJson(data));
+    return _response.then(
+      (data) => SponsorListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5190,7 +5336,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -5247,7 +5395,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Subscription.fromJson(data));
+    return _response.then(
+      (data) =>
+          Subscription.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -5403,7 +5554,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SubscriptionListResponse.fromJson(data));
+    return _response.then(
+      (data) => SubscriptionListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5480,7 +5634,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => SuperChatEventListResponse.fromJson(data));
+    return _response.then(
+      (data) => SuperChatEventListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5541,7 +5698,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => TestItem.fromJson(data));
+    return _response.then(
+      (data) => TestItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5614,7 +5773,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -5671,7 +5832,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ThirdPartyLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          ThirdPartyLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -5739,7 +5903,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ThirdPartyLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          ThirdPartyLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Updates an existing resource.
@@ -5796,7 +5963,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ThirdPartyLink.fromJson(data));
+    return _response.then(
+      (data) =>
+          ThirdPartyLink.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5886,7 +6056,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ThumbnailSetResponse.fromJson(data));
+    return _response.then(
+      (data) => ThumbnailSetResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -5949,8 +6122,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response
-        .then((data) => VideoAbuseReportReasonListResponse.fromJson(data));
+    return _response.then(
+      (data) => VideoAbuseReportReasonListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6026,7 +6201,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VideoCategoryListResponse.fromJson(data));
+    return _response.then(
+      (data) => VideoCategoryListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6096,7 +6274,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Retrieves the ratings that the authorized user gave to a list of specified
@@ -6161,7 +6341,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VideoRatingListResponse.fromJson(data));
+    return _response.then(
+      (data) => VideoRatingListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Inserts a new resource into this collection.
@@ -6297,7 +6480,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Video.fromJson(data));
+    return _response.then(
+      (data) => Video.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Retrieves a list of resources, possibly filtered.
@@ -6455,7 +6640,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => VideoListResponse.fromJson(data));
+    return _response.then(
+      (data) => VideoListResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Adds a like or dislike rating to a video or removes a rating from a video.
@@ -6515,7 +6703,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Report abuse for a video.
@@ -6578,7 +6768,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Updates an existing resource.
@@ -6664,7 +6856,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Video.fromJson(data));
+    return _response.then(
+      (data) => Video.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -6756,7 +6950,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 
   /// Allows removal of channel watermark.
@@ -6820,7 +7016,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => null);
+    return _response.then(
+      (data) => null,
+    );
   }
 }
 
@@ -6835,7 +7033,8 @@
   AbuseReport.fromJson(core.Map _json) {
     if (_json.containsKey('abuseTypes')) {
       abuseTypes = (_json['abuseTypes'] as core.List)
-          .map<AbuseType>((value) => AbuseType.fromJson(value))
+          .map<AbuseType>((value) =>
+              AbuseType.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('description')) {
@@ -6843,11 +7042,13 @@
     }
     if (_json.containsKey('relatedEntities')) {
       relatedEntities = (_json['relatedEntities'] as core.List)
-          .map<RelatedEntity>((value) => RelatedEntity.fromJson(value))
+          .map<RelatedEntity>((value) => RelatedEntity.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('subject')) {
-      subject = Entity.fromJson(_json['subject']);
+      subject = Entity.fromJson(
+          _json['subject'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -6957,7 +7158,8 @@
 
   Activity.fromJson(core.Map _json) {
     if (_json.containsKey('contentDetails')) {
-      contentDetails = ActivityContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = ActivityContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -6969,7 +7171,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = ActivitySnippet.fromJson(_json['snippet']);
+      snippet = ActivitySnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7051,42 +7254,48 @@
 
   ActivityContentDetails.fromJson(core.Map _json) {
     if (_json.containsKey('bulletin')) {
-      bulletin = ActivityContentDetailsBulletin.fromJson(_json['bulletin']);
+      bulletin = ActivityContentDetailsBulletin.fromJson(
+          _json['bulletin'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('channelItem')) {
-      channelItem =
-          ActivityContentDetailsChannelItem.fromJson(_json['channelItem']);
+      channelItem = ActivityContentDetailsChannelItem.fromJson(
+          _json['channelItem'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('comment')) {
-      comment = ActivityContentDetailsComment.fromJson(_json['comment']);
+      comment = ActivityContentDetailsComment.fromJson(
+          _json['comment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('favorite')) {
-      favorite = ActivityContentDetailsFavorite.fromJson(_json['favorite']);
+      favorite = ActivityContentDetailsFavorite.fromJson(
+          _json['favorite'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('like')) {
-      like = ActivityContentDetailsLike.fromJson(_json['like']);
+      like = ActivityContentDetailsLike.fromJson(
+          _json['like'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('playlistItem')) {
-      playlistItem =
-          ActivityContentDetailsPlaylistItem.fromJson(_json['playlistItem']);
+      playlistItem = ActivityContentDetailsPlaylistItem.fromJson(
+          _json['playlistItem'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('promotedItem')) {
-      promotedItem =
-          ActivityContentDetailsPromotedItem.fromJson(_json['promotedItem']);
+      promotedItem = ActivityContentDetailsPromotedItem.fromJson(
+          _json['promotedItem'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recommendation')) {
       recommendation = ActivityContentDetailsRecommendation.fromJson(
-          _json['recommendation']);
+          _json['recommendation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('social')) {
-      social = ActivityContentDetailsSocial.fromJson(_json['social']);
+      social = ActivityContentDetailsSocial.fromJson(
+          _json['social'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subscription')) {
-      subscription =
-          ActivityContentDetailsSubscription.fromJson(_json['subscription']);
+      subscription = ActivityContentDetailsSubscription.fromJson(
+          _json['subscription'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('upload')) {
-      upload = ActivityContentDetailsUpload.fromJson(_json['upload']);
+      upload = ActivityContentDetailsUpload.fromJson(
+          _json['upload'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7139,7 +7348,8 @@
 
   ActivityContentDetailsBulletin.fromJson(core.Map _json) {
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7162,7 +7372,8 @@
 
   ActivityContentDetailsChannelItem.fromJson(core.Map _json) {
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7185,7 +7396,8 @@
 
   ActivityContentDetailsComment.fromJson(core.Map _json) {
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7208,7 +7420,8 @@
 
   ActivityContentDetailsFavorite.fromJson(core.Map _json) {
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7231,7 +7444,8 @@
 
   ActivityContentDetailsLike.fromJson(core.Map _json) {
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7266,7 +7480,8 @@
       playlistItemId = _json['playlistItemId'] as core.String;
     }
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7428,10 +7643,12 @@
       reason = _json['reason'] as core.String;
     }
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('seedResourceId')) {
-      seedResourceId = ResourceId.fromJson(_json['seedResourceId']);
+      seedResourceId = ResourceId.fromJson(
+          _json['seedResourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7486,7 +7703,8 @@
       referenceUrl = _json['referenceUrl'] as core.String;
     }
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -7524,7 +7742,8 @@
 
   ActivityContentDetailsSubscription.fromJson(core.Map _json) {
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7597,7 +7816,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Activity>((value) => Activity.fromJson(value))
+          .map<Activity>((value) =>
+              Activity.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -7607,13 +7827,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -7723,7 +7945,8 @@
       publishedAt = _json['publishedAt'] as core.String;
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -7792,7 +8015,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = CaptionSnippet.fromJson(_json['snippet']);
+      snippet = CaptionSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -7842,7 +8066,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Caption>((value) => Caption.fromJson(value))
+          .map<Caption>((value) =>
+              Caption.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -8084,7 +8309,8 @@
       frameRate = _json['frameRate'] as core.String;
     }
     if (_json.containsKey('ingestionInfo')) {
-      ingestionInfo = IngestionInfo.fromJson(_json['ingestionInfo']);
+      ingestionInfo = IngestionInfo.fromJson(
+          _json['ingestionInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('ingestionType')) {
       ingestionType = _json['ingestionType'] as core.String;
@@ -8169,22 +8395,24 @@
 
   Channel.fromJson(core.Map _json) {
     if (_json.containsKey('auditDetails')) {
-      auditDetails = ChannelAuditDetails.fromJson(_json['auditDetails']);
+      auditDetails = ChannelAuditDetails.fromJson(
+          _json['auditDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('brandingSettings')) {
-      brandingSettings =
-          ChannelBrandingSettings.fromJson(_json['brandingSettings']);
+      brandingSettings = ChannelBrandingSettings.fromJson(
+          _json['brandingSettings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentDetails')) {
-      contentDetails = ChannelContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = ChannelContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentOwnerDetails')) {
-      contentOwnerDetails =
-          ChannelContentOwnerDetails.fromJson(_json['contentOwnerDetails']);
+      contentOwnerDetails = ChannelContentOwnerDetails.fromJson(
+          _json['contentOwnerDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('conversionPings')) {
-      conversionPings =
-          ChannelConversionPings.fromJson(_json['conversionPings']);
+      conversionPings = ChannelConversionPings.fromJson(
+          _json['conversionPings'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -8197,20 +8425,26 @@
     }
     if (_json.containsKey('localizations')) {
       localizations = commons.mapMap<core.Map, ChannelLocalization>(
-          _json['localizations'].cast<core.String, core.Map>(),
-          (core.Map item) => ChannelLocalization.fromJson(item));
+          (_json['localizations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ChannelLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('snippet')) {
-      snippet = ChannelSnippet.fromJson(_json['snippet']);
+      snippet = ChannelSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('statistics')) {
-      statistics = ChannelStatistics.fromJson(_json['statistics']);
+      statistics = ChannelStatistics.fromJson(
+          _json['statistics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = ChannelStatus.fromJson(_json['status']);
+      status = ChannelStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('topicDetails')) {
-      topicDetails = ChannelTopicDetails.fromJson(_json['topicDetails']);
+      topicDetails = ChannelTopicDetails.fromJson(
+          _json['topicDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8364,18 +8598,22 @@
 
   ChannelBrandingSettings.fromJson(core.Map _json) {
     if (_json.containsKey('channel')) {
-      channel = ChannelSettings.fromJson(_json['channel']);
+      channel = ChannelSettings.fromJson(
+          _json['channel'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hints')) {
       hints = (_json['hints'] as core.List)
-          .map<PropertyValue>((value) => PropertyValue.fromJson(value))
+          .map<PropertyValue>((value) => PropertyValue.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('image')) {
-      image = ImageSettings.fromJson(_json['image']);
+      image = ImageSettings.fromJson(
+          _json['image'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('watch')) {
-      watch = WatchSettings.fromJson(_json['watch']);
+      watch = WatchSettings.fromJson(
+          _json['watch'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8473,7 +8711,7 @@
   ChannelContentDetails.fromJson(core.Map _json) {
     if (_json.containsKey('relatedPlaylists')) {
       relatedPlaylists = ChannelContentDetailsRelatedPlaylists.fromJson(
-          _json['relatedPlaylists']);
+          _json['relatedPlaylists'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8575,8 +8813,8 @@
   ChannelConversionPings.fromJson(core.Map _json) {
     if (_json.containsKey('pings')) {
       pings = (_json['pings'] as core.List)
-          .map<ChannelConversionPing>(
-              (value) => ChannelConversionPing.fromJson(value))
+          .map<ChannelConversionPing>((value) => ChannelConversionPing.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -8628,7 +8866,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Channel>((value) => Channel.fromJson(value))
+          .map<Channel>((value) =>
+              Channel.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -8638,13 +8877,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -8793,8 +9034,8 @@
 
   ChannelSection.fromJson(core.Map _json) {
     if (_json.containsKey('contentDetails')) {
-      contentDetails =
-          ChannelSectionContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = ChannelSectionContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -8807,14 +9048,18 @@
     }
     if (_json.containsKey('localizations')) {
       localizations = commons.mapMap<core.Map, ChannelSectionLocalization>(
-          _json['localizations'].cast<core.String, core.Map>(),
-          (core.Map item) => ChannelSectionLocalization.fromJson(item));
+          (_json['localizations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => ChannelSectionLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('snippet')) {
-      snippet = ChannelSectionSnippet.fromJson(_json['snippet']);
+      snippet = ChannelSectionSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targeting')) {
-      targeting = ChannelSectionTargeting.fromJson(_json['targeting']);
+      targeting = ChannelSectionTargeting.fromJson(
+          _json['targeting'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -8911,7 +9156,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ChannelSection>((value) => ChannelSection.fromJson(value))
+          .map<ChannelSection>((value) => ChannelSection.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9021,7 +9267,8 @@
       defaultLanguage = _json['defaultLanguage'] as core.String;
     }
     if (_json.containsKey('localized')) {
-      localized = ChannelSectionLocalization.fromJson(_json['localized']);
+      localized = ChannelSectionLocalization.fromJson(
+          _json['localized'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('position')) {
       position = _json['position'] as core.int;
@@ -9306,13 +9553,15 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('localized')) {
-      localized = ChannelLocalization.fromJson(_json['localized']);
+      localized = ChannelLocalization.fromJson(
+          _json['localized'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publishedAt')) {
       publishedAt = _json['publishedAt'] as core.String;
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -9569,7 +9818,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = CommentSnippet.fromJson(_json['snippet']);
+      snippet = CommentSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9627,7 +9877,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Comment>((value) => Comment.fromJson(value))
+          .map<Comment>((value) =>
+              Comment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9637,10 +9888,12 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -9748,8 +10001,8 @@
 
   CommentSnippet.fromJson(core.Map _json) {
     if (_json.containsKey('authorChannelId')) {
-      authorChannelId =
-          CommentSnippetAuthorChannelId.fromJson(_json['authorChannelId']);
+      authorChannelId = CommentSnippetAuthorChannelId.fromJson(
+          _json['authorChannelId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('authorChannelUrl')) {
       authorChannelUrl = _json['authorChannelUrl'] as core.String;
@@ -9902,10 +10155,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('replies')) {
-      replies = CommentThreadReplies.fromJson(_json['replies']);
+      replies = CommentThreadReplies.fromJson(
+          _json['replies'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('snippet')) {
-      snippet = CommentThreadSnippet.fromJson(_json['snippet']);
+      snippet = CommentThreadSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -9966,7 +10221,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<CommentThread>((value) => CommentThread.fromJson(value))
+          .map<CommentThread>((value) => CommentThread.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -9976,10 +10232,12 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -10028,7 +10286,8 @@
   CommentThreadReplies.fromJson(core.Map _json) {
     if (_json.containsKey('comments')) {
       comments = (_json['comments'] as core.List)
-          .map<Comment>((value) => Comment.fromJson(value))
+          .map<Comment>((value) =>
+              Comment.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -10080,7 +10339,8 @@
       isPublic = _json['isPublic'] as core.bool;
     }
     if (_json.containsKey('topLevelComment')) {
-      topLevelComment = Comment.fromJson(_json['topLevelComment']);
+      topLevelComment = Comment.fromJson(
+          _json['topLevelComment'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('totalReplyCount')) {
       totalReplyCount = _json['totalReplyCount'] as core.int;
@@ -11546,7 +11806,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = I18nLanguageSnippet.fromJson(_json['snippet']);
+      snippet = I18nLanguageSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11597,7 +11858,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<I18nLanguage>((value) => I18nLanguage.fromJson(value))
+          .map<I18nLanguage>((value) => I18nLanguage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11690,7 +11952,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = I18nRegionSnippet.fromJson(_json['snippet']);
+      snippet = I18nRegionSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -11741,7 +12004,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<I18nRegion>((value) => I18nRegion.fromJson(value))
+          .map<I18nRegion>((value) =>
+              I18nRegion.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -11882,8 +12146,8 @@
 
   ImageSettings.fromJson(core.Map _json) {
     if (_json.containsKey('backgroundImageUrl')) {
-      backgroundImageUrl =
-          LocalizedProperty.fromJson(_json['backgroundImageUrl']);
+      backgroundImageUrl = LocalizedProperty.fromJson(
+          _json['backgroundImageUrl'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('bannerExternalUrl')) {
       bannerExternalUrl = _json['bannerExternalUrl'] as core.String;
@@ -11935,19 +12199,23 @@
     }
     if (_json.containsKey('largeBrandedBannerImageImapScript')) {
       largeBrandedBannerImageImapScript = LocalizedProperty.fromJson(
-          _json['largeBrandedBannerImageImapScript']);
+          _json['largeBrandedBannerImageImapScript']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('largeBrandedBannerImageUrl')) {
-      largeBrandedBannerImageUrl =
-          LocalizedProperty.fromJson(_json['largeBrandedBannerImageUrl']);
+      largeBrandedBannerImageUrl = LocalizedProperty.fromJson(
+          _json['largeBrandedBannerImageUrl']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('smallBrandedBannerImageImapScript')) {
       smallBrandedBannerImageImapScript = LocalizedProperty.fromJson(
-          _json['smallBrandedBannerImageImapScript']);
+          _json['smallBrandedBannerImageImapScript']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('smallBrandedBannerImageUrl')) {
-      smallBrandedBannerImageUrl =
-          LocalizedProperty.fromJson(_json['smallBrandedBannerImageUrl']);
+      smallBrandedBannerImageUrl = LocalizedProperty.fromJson(
+          _json['smallBrandedBannerImageUrl']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('trackingImageUrl')) {
       trackingImageUrl = _json['trackingImageUrl'] as core.String;
@@ -12134,13 +12402,15 @@
       imageUrl = _json['imageUrl'] as core.String;
     }
     if (_json.containsKey('position')) {
-      position = InvideoPosition.fromJson(_json['position']);
+      position = InvideoPosition.fromJson(
+          _json['position'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('targetChannelId')) {
       targetChannelId = _json['targetChannelId'] as core.String;
     }
     if (_json.containsKey('timing')) {
-      timing = InvideoTiming.fromJson(_json['timing']);
+      timing = InvideoTiming.fromJson(
+          _json['timing'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12330,8 +12600,8 @@
 
   LiveBroadcast.fromJson(core.Map _json) {
     if (_json.containsKey('contentDetails')) {
-      contentDetails =
-          LiveBroadcastContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = LiveBroadcastContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -12343,13 +12613,16 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = LiveBroadcastSnippet.fromJson(_json['snippet']);
+      snippet = LiveBroadcastSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('statistics')) {
-      statistics = LiveBroadcastStatistics.fromJson(_json['statistics']);
+      statistics = LiveBroadcastStatistics.fromJson(
+          _json['statistics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = LiveBroadcastStatus.fromJson(_json['status']);
+      status = LiveBroadcastStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -12532,7 +12805,8 @@
       mesh = _json['mesh'] as core.String;
     }
     if (_json.containsKey('monitorStream')) {
-      monitorStream = MonitorStreamInfo.fromJson(_json['monitorStream']);
+      monitorStream = MonitorStreamInfo.fromJson(
+          _json['monitorStream'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projection')) {
       projection = _json['projection'] as core.String;
@@ -12639,7 +12913,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<LiveBroadcast>((value) => LiveBroadcast.fromJson(value))
+          .map<LiveBroadcast>((value) => LiveBroadcast.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -12649,13 +12924,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -12775,7 +13052,8 @@
       scheduledStartTime = _json['scheduledStartTime'] as core.String;
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -12979,7 +13257,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = LiveChatBanSnippet.fromJson(_json['snippet']);
+      snippet = LiveChatBanSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13023,8 +13302,8 @@
       banDurationSeconds = _json['banDurationSeconds'] as core.String;
     }
     if (_json.containsKey('bannedUserDetails')) {
-      bannedUserDetails =
-          ChannelProfileDetails.fromJson(_json['bannedUserDetails']);
+      bannedUserDetails = ChannelProfileDetails.fromJson(
+          _json['bannedUserDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('liveChatId')) {
       liveChatId = _json['liveChatId'] as core.String;
@@ -13124,8 +13403,8 @@
 
   LiveChatMessage.fromJson(core.Map _json) {
     if (_json.containsKey('authorDetails')) {
-      authorDetails =
-          LiveChatMessageAuthorDetails.fromJson(_json['authorDetails']);
+      authorDetails = LiveChatMessageAuthorDetails.fromJson(
+          _json['authorDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -13137,7 +13416,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = LiveChatMessageSnippet.fromJson(_json['snippet']);
+      snippet = LiveChatMessageSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13304,7 +13584,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<LiveChatMessage>((value) => LiveChatMessage.fromJson(value))
+          .map<LiveChatMessage>((value) => LiveChatMessage.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -13317,13 +13598,15 @@
       offlineAt = _json['offlineAt'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('pollingIntervalMillis')) {
       pollingIntervalMillis = _json['pollingIntervalMillis'] as core.int;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -13457,7 +13740,8 @@
     }
     if (_json.containsKey('fanFundingEventDetails')) {
       fanFundingEventDetails = LiveChatFanFundingEventDetails.fromJson(
-          _json['fanFundingEventDetails']);
+          _json['fanFundingEventDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('hasDisplayContent')) {
       hasDisplayContent = _json['hasDisplayContent'] as core.bool;
@@ -13467,33 +13751,35 @@
     }
     if (_json.containsKey('messageDeletedDetails')) {
       messageDeletedDetails = LiveChatMessageDeletedDetails.fromJson(
-          _json['messageDeletedDetails']);
+          _json['messageDeletedDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('messageRetractedDetails')) {
       messageRetractedDetails = LiveChatMessageRetractedDetails.fromJson(
-          _json['messageRetractedDetails']);
+          _json['messageRetractedDetails']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publishedAt')) {
       publishedAt = _json['publishedAt'] as core.String;
     }
     if (_json.containsKey('superChatDetails')) {
-      superChatDetails =
-          LiveChatSuperChatDetails.fromJson(_json['superChatDetails']);
+      superChatDetails = LiveChatSuperChatDetails.fromJson(
+          _json['superChatDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('superStickerDetails')) {
-      superStickerDetails =
-          LiveChatSuperStickerDetails.fromJson(_json['superStickerDetails']);
+      superStickerDetails = LiveChatSuperStickerDetails.fromJson(
+          _json['superStickerDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('textMessageDetails')) {
-      textMessageDetails =
-          LiveChatTextMessageDetails.fromJson(_json['textMessageDetails']);
+      textMessageDetails = LiveChatTextMessageDetails.fromJson(
+          _json['textMessageDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
     }
     if (_json.containsKey('userBannedDetails')) {
-      userBannedDetails =
-          LiveChatUserBannedMessageDetails.fromJson(_json['userBannedDetails']);
+      userBannedDetails = LiveChatUserBannedMessageDetails.fromJson(
+          _json['userBannedDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13572,7 +13858,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = LiveChatModeratorSnippet.fromJson(_json['snippet']);
+      snippet = LiveChatModeratorSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13634,7 +13921,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<LiveChatModerator>((value) => LiveChatModerator.fromJson(value))
+          .map<LiveChatModerator>((value) => LiveChatModerator.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -13644,13 +13932,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -13704,8 +13994,8 @@
       liveChatId = _json['liveChatId'] as core.String;
     }
     if (_json.containsKey('moderatorDetails')) {
-      moderatorDetails =
-          ChannelProfileDetails.fromJson(_json['moderatorDetails']);
+      moderatorDetails = ChannelProfileDetails.fromJson(
+          _json['moderatorDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13809,8 +14099,8 @@
       currency = _json['currency'] as core.String;
     }
     if (_json.containsKey('superStickerMetadata')) {
-      superStickerMetadata =
-          SuperStickerMetadata.fromJson(_json['superStickerMetadata']);
+      superStickerMetadata = SuperStickerMetadata.fromJson(
+          _json['superStickerMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tier')) {
       tier = _json['tier'] as core.int;
@@ -13883,8 +14173,8 @@
       banType = _json['banType'] as core.String;
     }
     if (_json.containsKey('bannedUserDetails')) {
-      bannedUserDetails =
-          ChannelProfileDetails.fromJson(_json['bannedUserDetails']);
+      bannedUserDetails = ChannelProfileDetails.fromJson(
+          _json['bannedUserDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -13935,11 +14225,12 @@
 
   LiveStream.fromJson(core.Map _json) {
     if (_json.containsKey('cdn')) {
-      cdn = CdnSettings.fromJson(_json['cdn']);
+      cdn = CdnSettings.fromJson(
+          _json['cdn'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentDetails')) {
-      contentDetails =
-          LiveStreamContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = LiveStreamContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -13951,10 +14242,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = LiveStreamSnippet.fromJson(_json['snippet']);
+      snippet = LiveStreamSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = LiveStreamStatus.fromJson(_json['status']);
+      status = LiveStreamStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14136,8 +14429,9 @@
   LiveStreamHealthStatus.fromJson(core.Map _json) {
     if (_json.containsKey('configurationIssues')) {
       configurationIssues = (_json['configurationIssues'] as core.List)
-          .map<LiveStreamConfigurationIssue>(
-              (value) => LiveStreamConfigurationIssue.fromJson(value))
+          .map<LiveStreamConfigurationIssue>((value) =>
+              LiveStreamConfigurationIssue.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('lastUpdateTimeSeconds')) {
@@ -14202,7 +14496,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<LiveStream>((value) => LiveStream.fromJson(value))
+          .map<LiveStream>((value) =>
+              LiveStream.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -14212,13 +14507,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -14334,7 +14631,8 @@
 
   LiveStreamStatus.fromJson(core.Map _json) {
     if (_json.containsKey('healthStatus')) {
-      healthStatus = LiveStreamHealthStatus.fromJson(_json['healthStatus']);
+      healthStatus = LiveStreamHealthStatus.fromJson(
+          _json['healthStatus'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('streamStatus')) {
       streamStatus = _json['streamStatus'] as core.String;
@@ -14367,11 +14665,13 @@
       default_ = _json['default'] as core.String;
     }
     if (_json.containsKey('defaultLanguage')) {
-      defaultLanguage = LanguageTag.fromJson(_json['defaultLanguage']);
+      defaultLanguage = LanguageTag.fromJson(
+          _json['defaultLanguage'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('localized')) {
       localized = (_json['localized'] as core.List)
-          .map<LocalizedString>((value) => LocalizedString.fromJson(value))
+          .map<LocalizedString>((value) => LocalizedString.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -14442,7 +14742,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = MemberSnippet.fromJson(_json['snippet']);
+      snippet = MemberSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14495,7 +14796,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Member>((value) => Member.fromJson(value))
+          .map<Member>((value) =>
+              Member.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -14505,10 +14807,12 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -14562,11 +14866,12 @@
       creatorChannelId = _json['creatorChannelId'] as core.String;
     }
     if (_json.containsKey('memberDetails')) {
-      memberDetails = ChannelProfileDetails.fromJson(_json['memberDetails']);
+      memberDetails = ChannelProfileDetails.fromJson(
+          _json['memberDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('membershipsDetails')) {
-      membershipsDetails =
-          MembershipsDetails.fromJson(_json['membershipsDetails']);
+      membershipsDetails = MembershipsDetails.fromJson(
+          _json['membershipsDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14621,14 +14926,15 @@
           _json['highestAccessibleLevelDisplayName'] as core.String;
     }
     if (_json.containsKey('membershipsDuration')) {
-      membershipsDuration =
-          MembershipsDuration.fromJson(_json['membershipsDuration']);
+      membershipsDuration = MembershipsDuration.fromJson(
+          _json['membershipsDuration'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('membershipsDurationAtLevels')) {
       membershipsDurationAtLevels =
           (_json['membershipsDurationAtLevels'] as core.List)
-              .map<MembershipsDurationAtLevel>(
-                  (value) => MembershipsDurationAtLevel.fromJson(value))
+              .map<MembershipsDurationAtLevel>((value) =>
+                  MembershipsDurationAtLevel.fromJson(
+                      value as core.Map<core.String, core.dynamic>))
               .toList();
     }
   }
@@ -14762,7 +15068,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = MembershipsLevelSnippet.fromJson(_json['snippet']);
+      snippet = MembershipsLevelSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -14812,7 +15119,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<MembershipsLevel>((value) => MembershipsLevel.fromJson(value))
+          .map<MembershipsLevel>((value) => MembershipsLevel.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -14858,7 +15166,8 @@
       creatorChannelId = _json['creatorChannelId'] as core.String;
     }
     if (_json.containsKey('levelDetails')) {
-      levelDetails = LevelDetails.fromJson(_json['levelDetails']);
+      levelDetails = LevelDetails.fromJson(
+          _json['levelDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15000,7 +15309,8 @@
 
   Playlist.fromJson(core.Map _json) {
     if (_json.containsKey('contentDetails')) {
-      contentDetails = PlaylistContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = PlaylistContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -15013,17 +15323,22 @@
     }
     if (_json.containsKey('localizations')) {
       localizations = commons.mapMap<core.Map, PlaylistLocalization>(
-          _json['localizations'].cast<core.String, core.Map>(),
-          (core.Map item) => PlaylistLocalization.fromJson(item));
+          (_json['localizations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => PlaylistLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('player')) {
-      player = PlaylistPlayer.fromJson(_json['player']);
+      player = PlaylistPlayer.fromJson(
+          _json['player'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('snippet')) {
-      snippet = PlaylistSnippet.fromJson(_json['snippet']);
+      snippet = PlaylistSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = PlaylistStatus.fromJson(_json['status']);
+      status = PlaylistStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15123,8 +15438,8 @@
 
   PlaylistItem.fromJson(core.Map _json) {
     if (_json.containsKey('contentDetails')) {
-      contentDetails =
-          PlaylistItemContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = PlaylistItemContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -15136,10 +15451,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = PlaylistItemSnippet.fromJson(_json['snippet']);
+      snippet = PlaylistItemSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = PlaylistItemStatus.fromJson(_json['status']);
+      status = PlaylistItemStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15273,7 +15590,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<PlaylistItem>((value) => PlaylistItem.fromJson(value))
+          .map<PlaylistItem>((value) => PlaylistItem.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15283,13 +15601,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -15389,10 +15709,12 @@
       publishedAt = _json['publishedAt'] as core.String;
     }
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -15498,7 +15820,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Playlist>((value) => Playlist.fromJson(value))
+          .map<Playlist>((value) =>
+              Playlist.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15508,13 +15831,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -15655,7 +15980,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('localized')) {
-      localized = PlaylistLocalization.fromJson(_json['localized']);
+      localized = PlaylistLocalization.fromJson(
+          _json['localized'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publishedAt')) {
       publishedAt = _json['publishedAt'] as core.String;
@@ -15666,7 +15992,8 @@
           .toList();
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -15769,7 +16096,8 @@
 
   RelatedEntity.fromJson(core.Map _json) {
     if (_json.containsKey('entity')) {
-      entity = Entity.fromJson(_json['entity']);
+      entity = Entity.fromJson(
+          _json['entity'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -15879,7 +16207,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SearchResult>((value) => SearchResult.fromJson(value))
+          .map<SearchResult>((value) => SearchResult.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -15889,7 +16218,8 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
@@ -15898,7 +16228,8 @@
       regionCode = _json['regionCode'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -15970,13 +16301,15 @@
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('id')) {
-      id = ResourceId.fromJson(_json['id']);
+      id = ResourceId.fromJson(
+          _json['id'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = SearchResultSnippet.fromJson(_json['snippet']);
+      snippet = SearchResultSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16053,7 +16386,8 @@
       publishedAt = _json['publishedAt'] as core.String;
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -16111,7 +16445,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = SponsorSnippet.fromJson(_json['snippet']);
+      snippet = SponsorSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16164,7 +16499,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Sponsor>((value) => Sponsor.fromJson(value))
+          .map<Sponsor>((value) =>
+              Sponsor.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -16174,10 +16510,12 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -16238,7 +16576,8 @@
       cumulativeDurationMonths = _json['cumulativeDurationMonths'] as core.int;
     }
     if (_json.containsKey('sponsorDetails')) {
-      sponsorDetails = ChannelProfileDetails.fromJson(_json['sponsorDetails']);
+      sponsorDetails = ChannelProfileDetails.fromJson(
+          _json['sponsorDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('sponsorSince')) {
       sponsorSince = _json['sponsorSince'] as core.String;
@@ -16293,8 +16632,8 @@
 
   Subscription.fromJson(core.Map _json) {
     if (_json.containsKey('contentDetails')) {
-      contentDetails =
-          SubscriptionContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = SubscriptionContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -16306,11 +16645,12 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = SubscriptionSnippet.fromJson(_json['snippet']);
+      snippet = SubscriptionSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('subscriberSnippet')) {
-      subscriberSnippet =
-          SubscriptionSubscriberSnippet.fromJson(_json['subscriberSnippet']);
+      subscriberSnippet = SubscriptionSubscriberSnippet.fromJson(
+          _json['subscriberSnippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16421,7 +16761,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Subscription>((value) => Subscription.fromJson(value))
+          .map<Subscription>((value) => Subscription.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -16431,13 +16772,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -16521,10 +16864,12 @@
       publishedAt = _json['publishedAt'] as core.String;
     }
     if (_json.containsKey('resourceId')) {
-      resourceId = ResourceId.fromJson(_json['resourceId']);
+      resourceId = ResourceId.fromJson(
+          _json['resourceId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -16583,7 +16928,8 @@
       description = _json['description'] as core.String;
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -16637,7 +16983,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = SuperChatEventSnippet.fromJson(_json['snippet']);
+      snippet = SuperChatEventSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16693,7 +17040,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<SuperChatEvent>((value) => SuperChatEvent.fromJson(value))
+          .map<SuperChatEvent>((value) => SuperChatEvent.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -16703,10 +17051,12 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -16807,12 +17157,12 @@
       messageType = _json['messageType'] as core.int;
     }
     if (_json.containsKey('superStickerMetadata')) {
-      superStickerMetadata =
-          SuperStickerMetadata.fromJson(_json['superStickerMetadata']);
+      superStickerMetadata = SuperStickerMetadata.fromJson(
+          _json['superStickerMetadata'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('supporterDetails')) {
-      supporterDetails =
-          ChannelProfileDetails.fromJson(_json['supporterDetails']);
+      supporterDetails = ChannelProfileDetails.fromJson(
+          _json['supporterDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16909,7 +17259,8 @@
       id = _json['id'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = TestItemTestItemSnippet.fromJson(_json['snippet']);
+      snippet = TestItemTestItemSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -16975,10 +17326,12 @@
       linkingToken = _json['linkingToken'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = ThirdPartyLinkSnippet.fromJson(_json['snippet']);
+      snippet = ThirdPartyLinkSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = ThirdPartyLinkStatus.fromJson(_json['status']);
+      status = ThirdPartyLinkStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17022,8 +17375,8 @@
 
   ThirdPartyLinkSnippet.fromJson(core.Map _json) {
     if (_json.containsKey('channelToStoreLink')) {
-      channelToStoreLink =
-          ChannelToStoreLinkDetails.fromJson(_json['channelToStoreLink']);
+      channelToStoreLink = ChannelToStoreLinkDetails.fromJson(
+          _json['channelToStoreLink'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('type')) {
       type = _json['type'] as core.String;
@@ -17131,19 +17484,24 @@
 
   ThumbnailDetails.fromJson(core.Map _json) {
     if (_json.containsKey('default')) {
-      default_ = Thumbnail.fromJson(_json['default']);
+      default_ = Thumbnail.fromJson(
+          _json['default'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('high')) {
-      high = Thumbnail.fromJson(_json['high']);
+      high = Thumbnail.fromJson(
+          _json['high'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('maxres')) {
-      maxres = Thumbnail.fromJson(_json['maxres']);
+      maxres = Thumbnail.fromJson(
+          _json['maxres'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('medium')) {
-      medium = Thumbnail.fromJson(_json['medium']);
+      medium = Thumbnail.fromJson(
+          _json['medium'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('standard')) {
-      standard = Thumbnail.fromJson(_json['standard']);
+      standard = Thumbnail.fromJson(
+          _json['standard'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17196,7 +17554,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<ThumbnailDetails>((value) => ThumbnailDetails.fromJson(value))
+          .map<ThumbnailDetails>((value) => ThumbnailDetails.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17328,16 +17687,19 @@
 
   Video.fromJson(core.Map _json) {
     if (_json.containsKey('ageGating')) {
-      ageGating = VideoAgeGating.fromJson(_json['ageGating']);
+      ageGating = VideoAgeGating.fromJson(
+          _json['ageGating'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('contentDetails')) {
-      contentDetails = VideoContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = VideoContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('fileDetails')) {
-      fileDetails = VideoFileDetails.fromJson(_json['fileDetails']);
+      fileDetails = VideoFileDetails.fromJson(
+          _json['fileDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('id')) {
       id = _json['id'] as core.String;
@@ -17346,46 +17708,55 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('liveStreamingDetails')) {
-      liveStreamingDetails =
-          VideoLiveStreamingDetails.fromJson(_json['liveStreamingDetails']);
+      liveStreamingDetails = VideoLiveStreamingDetails.fromJson(
+          _json['liveStreamingDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('localizations')) {
       localizations = commons.mapMap<core.Map, VideoLocalization>(
-          _json['localizations'].cast<core.String, core.Map>(),
-          (core.Map item) => VideoLocalization.fromJson(item));
+          (_json['localizations'] as core.Map<core.String, core.dynamic>)
+              .cast<core.String, core.Map>(),
+          (core.Map item) => VideoLocalization.fromJson(
+              item as core.Map<core.String, core.dynamic>));
     }
     if (_json.containsKey('monetizationDetails')) {
-      monetizationDetails =
-          VideoMonetizationDetails.fromJson(_json['monetizationDetails']);
+      monetizationDetails = VideoMonetizationDetails.fromJson(
+          _json['monetizationDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('player')) {
-      player = VideoPlayer.fromJson(_json['player']);
+      player = VideoPlayer.fromJson(
+          _json['player'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('processingDetails')) {
-      processingDetails =
-          VideoProcessingDetails.fromJson(_json['processingDetails']);
+      processingDetails = VideoProcessingDetails.fromJson(
+          _json['processingDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('projectDetails')) {
-      projectDetails = VideoProjectDetails.fromJson(_json['projectDetails']);
+      projectDetails = VideoProjectDetails.fromJson(
+          _json['projectDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('recordingDetails')) {
-      recordingDetails =
-          VideoRecordingDetails.fromJson(_json['recordingDetails']);
+      recordingDetails = VideoRecordingDetails.fromJson(
+          _json['recordingDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('snippet')) {
-      snippet = VideoSnippet.fromJson(_json['snippet']);
+      snippet = VideoSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('statistics')) {
-      statistics = VideoStatistics.fromJson(_json['statistics']);
+      statistics = VideoStatistics.fromJson(
+          _json['statistics'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('status')) {
-      status = VideoStatus.fromJson(_json['status']);
+      status = VideoStatus.fromJson(
+          _json['status'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('suggestions')) {
-      suggestions = VideoSuggestions.fromJson(_json['suggestions']);
+      suggestions = VideoSuggestions.fromJson(
+          _json['suggestions'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('topicDetails')) {
-      topicDetails = VideoTopicDetails.fromJson(_json['topicDetails']);
+      topicDetails = VideoTopicDetails.fromJson(
+          _json['topicDetails'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17541,7 +17912,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = VideoAbuseReportReasonSnippet.fromJson(_json['snippet']);
+      snippet = VideoAbuseReportReasonSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17591,8 +17963,9 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<VideoAbuseReportReason>(
-              (value) => VideoAbuseReportReason.fromJson(value))
+          .map<VideoAbuseReportReason>((value) =>
+              VideoAbuseReportReason.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17641,8 +18014,9 @@
     }
     if (_json.containsKey('secondaryReasons')) {
       secondaryReasons = (_json['secondaryReasons'] as core.List)
-          .map<VideoAbuseReportSecondaryReason>(
-              (value) => VideoAbuseReportSecondaryReason.fromJson(value))
+          .map<VideoAbuseReportSecondaryReason>((value) =>
+              VideoAbuseReportSecondaryReason.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -17769,7 +18143,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = VideoCategorySnippet.fromJson(_json['snippet']);
+      snippet = VideoCategorySnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -17833,7 +18208,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<VideoCategory>((value) => VideoCategory.fromJson(value))
+          .map<VideoCategory>((value) => VideoCategory.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -17843,13 +18219,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -17991,10 +18369,12 @@
       caption = _json['caption'] as core.String;
     }
     if (_json.containsKey('contentRating')) {
-      contentRating = ContentRating.fromJson(_json['contentRating']);
+      contentRating = ContentRating.fromJson(
+          _json['contentRating'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('countryRestriction')) {
-      countryRestriction = AccessPolicy.fromJson(_json['countryRestriction']);
+      countryRestriction = AccessPolicy.fromJson(
+          _json['countryRestriction'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('definition')) {
       definition = _json['definition'] as core.String;
@@ -18016,7 +18396,7 @@
     }
     if (_json.containsKey('regionRestriction')) {
       regionRestriction = VideoContentDetailsRegionRestriction.fromJson(
-          _json['regionRestriction']);
+          _json['regionRestriction'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -18153,8 +18533,9 @@
   VideoFileDetails.fromJson(core.Map _json) {
     if (_json.containsKey('audioStreams')) {
       audioStreams = (_json['audioStreams'] as core.List)
-          .map<VideoFileDetailsAudioStream>(
-              (value) => VideoFileDetailsAudioStream.fromJson(value))
+          .map<VideoFileDetailsAudioStream>((value) =>
+              VideoFileDetailsAudioStream.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('bitrateBps')) {
@@ -18180,8 +18561,9 @@
     }
     if (_json.containsKey('videoStreams')) {
       videoStreams = (_json['videoStreams'] as core.List)
-          .map<VideoFileDetailsVideoStream>(
-              (value) => VideoFileDetailsVideoStream.fromJson(value))
+          .map<VideoFileDetailsVideoStream>((value) =>
+              VideoFileDetailsVideoStream.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -18404,7 +18786,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Video>((value) => Video.fromJson(value))
+          .map<Video>((value) =>
+              Video.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -18414,13 +18797,15 @@
       nextPageToken = _json['nextPageToken'] as core.String;
     }
     if (_json.containsKey('pageInfo')) {
-      pageInfo = PageInfo.fromJson(_json['pageInfo']);
+      pageInfo = PageInfo.fromJson(
+          _json['pageInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('prevPageToken')) {
       prevPageToken = _json['prevPageToken'] as core.String;
     }
     if (_json.containsKey('tokenPagination')) {
-      tokenPagination = TokenPagination.fromJson(_json['tokenPagination']);
+      tokenPagination = TokenPagination.fromJson(
+          _json['tokenPagination'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('visitorId')) {
       visitorId = _json['visitorId'] as core.String;
@@ -18584,7 +18969,8 @@
 
   VideoMonetizationDetails.fromJson(core.Map _json) {
     if (_json.containsKey('access')) {
-      access = AccessPolicy.fromJson(_json['access']);
+      access = AccessPolicy.fromJson(
+          _json['access'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -18709,7 +19095,7 @@
     }
     if (_json.containsKey('processingProgress')) {
       processingProgress = VideoProcessingDetailsProcessingProgress.fromJson(
-          _json['processingProgress']);
+          _json['processingProgress'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('processingStatus')) {
       processingStatus = _json['processingStatus'] as core.String;
@@ -18889,7 +19275,8 @@
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<VideoRating>((value) => VideoRating.fromJson(value))
+          .map<VideoRating>((value) => VideoRating.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -18937,7 +19324,8 @@
 
   VideoRecordingDetails.fromJson(core.Map _json) {
     if (_json.containsKey('location')) {
-      location = GeoPoint.fromJson(_json['location']);
+      location = GeoPoint.fromJson(
+          _json['location'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('locationDescription')) {
       locationDescription = _json['locationDescription'] as core.String;
@@ -19039,7 +19427,8 @@
       liveBroadcastContent = _json['liveBroadcastContent'] as core.String;
     }
     if (_json.containsKey('localized')) {
-      localized = VideoLocalization.fromJson(_json['localized']);
+      localized = VideoLocalization.fromJson(
+          _json['localized'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('publishedAt')) {
       publishedAt = _json['publishedAt'] as core.String;
@@ -19050,7 +19439,8 @@
           .toList();
     }
     if (_json.containsKey('thumbnails')) {
-      thumbnails = ThumbnailDetails.fromJson(_json['thumbnails']);
+      thumbnails = ThumbnailDetails.fromJson(
+          _json['thumbnails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('title')) {
       title = _json['title'] as core.String;
@@ -19356,8 +19746,9 @@
     }
     if (_json.containsKey('tagSuggestions')) {
       tagSuggestions = (_json['tagSuggestions'] as core.List)
-          .map<VideoSuggestionsTagSuggestion>(
-              (value) => VideoSuggestionsTagSuggestion.fromJson(value))
+          .map<VideoSuggestionsTagSuggestion>((value) =>
+              VideoSuggestionsTagSuggestion.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/lib/youtubeanalytics/v2.dart b/generated/googleapis/lib/youtubeanalytics/v2.dart
index fb1f4ac..556ce95 100644
--- a/generated/googleapis/lib/youtubeanalytics/v2.dart
+++ b/generated/googleapis/lib/youtubeanalytics/v2.dart
@@ -131,7 +131,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EmptyResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          EmptyResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a group item.
@@ -194,7 +197,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => GroupItem.fromJson(data));
+    return _response.then(
+      (data) => GroupItem.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a collection of group items that match the API request parameters.
@@ -258,7 +263,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGroupItemsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGroupItemsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -328,7 +336,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => EmptyResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          EmptyResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Creates a group.
@@ -391,7 +402,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Returns a collection of groups that match the API request parameters. For
@@ -477,7 +490,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListGroupsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListGroupsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Modifies a group. For example, you could change a group's title.
@@ -540,7 +556,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Group.fromJson(data));
+    return _response.then(
+      (data) => Group.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -696,7 +714,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => QueryResponse.fromJson(data));
+    return _response.then(
+      (data) =>
+          QueryResponse.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -709,7 +730,8 @@
 
   EmptyResponse.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -852,7 +874,8 @@
     }
     if (_json.containsKey('error')) {
       error = (_json['error'] as core.List)
-          .map<ErrorProto>((value) => ErrorProto.fromJson(value))
+          .map<ErrorProto>((value) =>
+              ErrorProto.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('requestId')) {
@@ -901,10 +924,12 @@
 
   Group.fromJson(core.Map _json) {
     if (_json.containsKey('contentDetails')) {
-      contentDetails = GroupContentDetails.fromJson(_json['contentDetails']);
+      contentDetails = GroupContentDetails.fromJson(
+          _json['contentDetails'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -916,7 +941,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('snippet')) {
-      snippet = GroupSnippet.fromJson(_json['snippet']);
+      snippet = GroupSnippet.fromJson(
+          _json['snippet'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1009,7 +1035,8 @@
 
   GroupItem.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
@@ -1024,7 +1051,8 @@
       kind = _json['kind'] as core.String;
     }
     if (_json.containsKey('resource')) {
-      resource = GroupItemResource.fromJson(_json['resource']);
+      resource = GroupItemResource.fromJson(
+          _json['resource'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1137,14 +1165,16 @@
 
   ListGroupItemsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<GroupItem>((value) => GroupItem.fromJson(value))
+          .map<GroupItem>((value) =>
+              GroupItem.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1194,14 +1224,16 @@
 
   ListGroupsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('etag')) {
       etag = _json['etag'] as core.String;
     }
     if (_json.containsKey('items')) {
       items = (_json['items'] as core.List)
-          .map<Group>((value) => Group.fromJson(value))
+          .map<Group>((value) =>
+              Group.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('kind')) {
@@ -1272,12 +1304,14 @@
   QueryResponse.fromJson(core.Map _json) {
     if (_json.containsKey('columnHeaders')) {
       columnHeaders = (_json['columnHeaders'] as core.List)
-          .map<ResultTableColumnHeader>(
-              (value) => ResultTableColumnHeader.fromJson(value))
+          .map<ResultTableColumnHeader>((value) =>
+              ResultTableColumnHeader.fromJson(
+                  value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('errors')) {
-      errors = Errors.fromJson(_json['errors']);
+      errors = Errors.fromJson(
+          _json['errors'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('kind')) {
       kind = _json['kind'] as core.String;
diff --git a/generated/googleapis/lib/youtubereporting/v1.dart b/generated/googleapis/lib/youtubereporting/v1.dart
index 364bae3..4e0913d 100644
--- a/generated/googleapis/lib/youtubereporting/v1.dart
+++ b/generated/googleapis/lib/youtubereporting/v1.dart
@@ -123,7 +123,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Deletes a job.
@@ -179,7 +181,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Empty.fromJson(data));
+    return _response.then(
+      (data) => Empty.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Gets a job.
@@ -235,7 +239,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Job.fromJson(data));
+    return _response.then(
+      (data) => Job.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists jobs.
@@ -309,7 +315,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListJobsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListJobsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -380,7 +389,9 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => Report.fromJson(data));
+    return _response.then(
+      (data) => Report.fromJson(data as core.Map<core.String, core.dynamic>),
+    );
   }
 
   /// Lists reports created by a specific job. Returns NOT_FOUND if the job does
@@ -474,7 +485,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListReportsResponse.fromJson(data));
+    return _response.then(
+      (data) => ListReportsResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -543,7 +557,10 @@
     );
     if (_downloadOptions == null ||
         _downloadOptions == commons.DownloadOptions.Metadata) {
-      return _response.then((data) => GdataMedia.fromJson(data));
+      return _response.then(
+        (data) =>
+            GdataMedia.fromJson(data as core.Map<core.String, core.dynamic>),
+      );
     } else {
       return _response;
     }
@@ -626,7 +643,10 @@
       uploadMedia: _uploadMedia,
       downloadOptions: _downloadOptions,
     );
-    return _response.then((data) => ListReportTypesResponse.fromJson(data));
+    return _response.then(
+      (data) => ListReportTypesResponse.fromJson(
+          data as core.Map<core.String, core.dynamic>),
+    );
   }
 }
 
@@ -799,7 +819,8 @@
       blobRef = _json['blobRef'] as core.String;
     }
     if (_json.containsKey('blobstore2Info')) {
-      blobstore2Info = GdataBlobstore2Info.fromJson(_json['blobstore2Info']);
+      blobstore2Info = GdataBlobstore2Info.fromJson(
+          _json['blobstore2Info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cosmoBinaryReference')) {
       cosmoBinaryReference = _json['cosmoBinaryReference'] as core.String;
@@ -817,7 +838,8 @@
       md5Hash = _json['md5Hash'] as core.String;
     }
     if (_json.containsKey('objectId')) {
-      objectId = GdataObjectId.fromJson(_json['objectId']);
+      objectId = GdataObjectId.fromJson(
+          _json['objectId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('path')) {
       path = _json['path'] as core.String;
@@ -948,14 +970,15 @@
 
   GdataDiffChecksumsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('checksumsLocation')) {
-      checksumsLocation =
-          GdataCompositeMedia.fromJson(_json['checksumsLocation']);
+      checksumsLocation = GdataCompositeMedia.fromJson(
+          _json['checksumsLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('chunkSizeBytes')) {
       chunkSizeBytes = _json['chunkSizeBytes'] as core.String;
     }
     if (_json.containsKey('objectLocation')) {
-      objectLocation = GdataCompositeMedia.fromJson(_json['objectLocation']);
+      objectLocation = GdataCompositeMedia.fromJson(
+          _json['objectLocation'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectSizeBytes')) {
       objectSizeBytes = _json['objectSizeBytes'] as core.String;
@@ -995,7 +1018,8 @@
 
   GdataDiffDownloadResponse.fromJson(core.Map _json) {
     if (_json.containsKey('objectLocation')) {
-      objectLocation = GdataCompositeMedia.fromJson(_json['objectLocation']);
+      objectLocation = GdataCompositeMedia.fromJson(
+          _json['objectLocation'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1023,10 +1047,12 @@
 
   GdataDiffUploadRequest.fromJson(core.Map _json) {
     if (_json.containsKey('checksumsInfo')) {
-      checksumsInfo = GdataCompositeMedia.fromJson(_json['checksumsInfo']);
+      checksumsInfo = GdataCompositeMedia.fromJson(
+          _json['checksumsInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectInfo')) {
-      objectInfo = GdataCompositeMedia.fromJson(_json['objectInfo']);
+      objectInfo = GdataCompositeMedia.fromJson(
+          _json['objectInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('objectVersion')) {
       objectVersion = _json['objectVersion'] as core.String;
@@ -1063,7 +1089,8 @@
       objectVersion = _json['objectVersion'] as core.String;
     }
     if (_json.containsKey('originalObject')) {
-      originalObject = GdataCompositeMedia.fromJson(_json['originalObject']);
+      originalObject = GdataCompositeMedia.fromJson(
+          _json['originalObject'] as core.Map<core.String, core.dynamic>);
     }
   }
 
@@ -1311,19 +1338,21 @@
       blobRef = _json['blobRef'] as core.String;
     }
     if (_json.containsKey('blobstore2Info')) {
-      blobstore2Info = GdataBlobstore2Info.fromJson(_json['blobstore2Info']);
+      blobstore2Info = GdataBlobstore2Info.fromJson(
+          _json['blobstore2Info'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('compositeMedia')) {
       compositeMedia = (_json['compositeMedia'] as core.List)
-          .map<GdataCompositeMedia>(
-              (value) => GdataCompositeMedia.fromJson(value))
+          .map<GdataCompositeMedia>((value) => GdataCompositeMedia.fromJson(
+              value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('contentType')) {
       contentType = _json['contentType'] as core.String;
     }
     if (_json.containsKey('contentTypeInfo')) {
-      contentTypeInfo = GdataContentTypeInfo.fromJson(_json['contentTypeInfo']);
+      contentTypeInfo = GdataContentTypeInfo.fromJson(
+          _json['contentTypeInfo'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('cosmoBinaryReference')) {
       cosmoBinaryReference = _json['cosmoBinaryReference'] as core.String;
@@ -1332,28 +1361,29 @@
       crc32cHash = _json['crc32cHash'] as core.int;
     }
     if (_json.containsKey('diffChecksumsResponse')) {
-      diffChecksumsResponse =
-          GdataDiffChecksumsResponse.fromJson(_json['diffChecksumsResponse']);
+      diffChecksumsResponse = GdataDiffChecksumsResponse.fromJson(
+          _json['diffChecksumsResponse']
+              as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diffDownloadResponse')) {
-      diffDownloadResponse =
-          GdataDiffDownloadResponse.fromJson(_json['diffDownloadResponse']);
+      diffDownloadResponse = GdataDiffDownloadResponse.fromJson(
+          _json['diffDownloadResponse'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diffUploadRequest')) {
-      diffUploadRequest =
-          GdataDiffUploadRequest.fromJson(_json['diffUploadRequest']);
+      diffUploadRequest = GdataDiffUploadRequest.fromJson(
+          _json['diffUploadRequest'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diffUploadResponse')) {
-      diffUploadResponse =
-          GdataDiffUploadResponse.fromJson(_json['diffUploadResponse']);
+      diffUploadResponse = GdataDiffUploadResponse.fromJson(
+          _json['diffUploadResponse'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('diffVersionResponse')) {
-      diffVersionResponse =
-          GdataDiffVersionResponse.fromJson(_json['diffVersionResponse']);
+      diffVersionResponse = GdataDiffVersionResponse.fromJson(
+          _json['diffVersionResponse'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('downloadParameters')) {
-      downloadParameters =
-          GdataDownloadParameters.fromJson(_json['downloadParameters']);
+      downloadParameters = GdataDownloadParameters.fromJson(
+          _json['downloadParameters'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('filename')) {
       filename = _json['filename'] as core.String;
@@ -1380,7 +1410,8 @@
       mediaId = _json['mediaId'] as core.String;
     }
     if (_json.containsKey('objectId')) {
-      objectId = GdataObjectId.fromJson(_json['objectId']);
+      objectId = GdataObjectId.fromJson(
+          _json['objectId'] as core.Map<core.String, core.dynamic>);
     }
     if (_json.containsKey('path')) {
       path = _json['path'] as core.String;
@@ -1624,7 +1655,8 @@
   ListJobsResponse.fromJson(core.Map _json) {
     if (_json.containsKey('jobs')) {
       jobs = (_json['jobs'] as core.List)
-          .map<Job>((value) => Job.fromJson(value))
+          .map<Job>((value) =>
+              Job.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
     if (_json.containsKey('nextPageToken')) {
@@ -1662,7 +1694,8 @@
     }
     if (_json.containsKey('reportTypes')) {
       reportTypes = (_json['reportTypes'] as core.List)
-          .map<ReportType>((value) => ReportType.fromJson(value))
+          .map<ReportType>((value) =>
+              ReportType.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
@@ -1698,7 +1731,8 @@
     }
     if (_json.containsKey('reports')) {
       reports = (_json['reports'] as core.List)
-          .map<Report>((value) => Report.fromJson(value))
+          .map<Report>((value) =>
+              Report.fromJson(value as core.Map<core.String, core.dynamic>))
           .toList();
     }
   }
diff --git a/generated/googleapis/test/abusiveexperiencereport/v1_test.dart b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
index cd0f744..223e62a 100644
--- a/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/abusiveexperiencereport/v1_test.dart
@@ -114,8 +114,8 @@
 
 void checkUnnamed4861(core.List<api.SiteSummaryResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSiteSummaryResponse(o[0]);
-  checkSiteSummaryResponse(o[1]);
+  checkSiteSummaryResponse(o[0] as api.SiteSummaryResponse);
+  checkSiteSummaryResponse(o[1] as api.SiteSummaryResponse);
 }
 
 core.int buildCounterViolatingSitesResponse = 0;
@@ -142,7 +142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteSummaryResponse();
       var od = api.SiteSummaryResponse.fromJson(o.toJson());
-      checkSiteSummaryResponse(od);
+      checkSiteSummaryResponse(od as api.SiteSummaryResponse);
     });
   });
 
@@ -150,7 +150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildViolatingSitesResponse();
       var od = api.ViolatingSitesResponse.fromJson(o.toJson());
-      checkViolatingSitesResponse(od);
+      checkViolatingSitesResponse(od as api.ViolatingSitesResponse);
     });
   });
 
@@ -199,7 +199,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSiteSummaryResponse(response);
+        checkSiteSummaryResponse(response as api.SiteSummaryResponse);
       })));
     });
   });
@@ -245,7 +245,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkViolatingSitesResponse(response);
+        checkViolatingSitesResponse(response as api.ViolatingSitesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
index 07be052..f679457 100644
--- a/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
+++ b/generated/googleapis/test/acceleratedmobilepageurl/v1_test.dart
@@ -163,8 +163,8 @@
 
 void checkUnnamed3237(core.List<api.AmpUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAmpUrl(o[0]);
-  checkAmpUrl(o[1]);
+  checkAmpUrl(o[0] as api.AmpUrl);
+  checkAmpUrl(o[1] as api.AmpUrl);
 }
 
 core.List<api.AmpUrlError> buildUnnamed3238() {
@@ -176,8 +176,8 @@
 
 void checkUnnamed3238(core.List<api.AmpUrlError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAmpUrlError(o[0]);
-  checkAmpUrlError(o[1]);
+  checkAmpUrlError(o[0] as api.AmpUrlError);
+  checkAmpUrlError(o[1] as api.AmpUrlError);
 }
 
 core.int buildCounterBatchGetAmpUrlsResponse = 0;
@@ -206,7 +206,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAmpUrl();
       var od = api.AmpUrl.fromJson(o.toJson());
-      checkAmpUrl(od);
+      checkAmpUrl(od as api.AmpUrl);
     });
   });
 
@@ -214,7 +214,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAmpUrlError();
       var od = api.AmpUrlError.fromJson(o.toJson());
-      checkAmpUrlError(od);
+      checkAmpUrlError(od as api.AmpUrlError);
     });
   });
 
@@ -222,7 +222,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetAmpUrlsRequest();
       var od = api.BatchGetAmpUrlsRequest.fromJson(o.toJson());
-      checkBatchGetAmpUrlsRequest(od);
+      checkBatchGetAmpUrlsRequest(od as api.BatchGetAmpUrlsRequest);
     });
   });
 
@@ -230,7 +230,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetAmpUrlsResponse();
       var od = api.BatchGetAmpUrlsResponse.fromJson(o.toJson());
-      checkBatchGetAmpUrlsResponse(od);
+      checkBatchGetAmpUrlsResponse(od as api.BatchGetAmpUrlsResponse);
     });
   });
 
@@ -241,8 +241,9 @@
       var arg_request = buildBatchGetAmpUrlsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchGetAmpUrlsRequest.fromJson(json);
-        checkBatchGetAmpUrlsRequest(obj);
+        var obj = api.BatchGetAmpUrlsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchGetAmpUrlsRequest(obj as api.BatchGetAmpUrlsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -281,7 +282,7 @@
       res
           .batchGet(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetAmpUrlsResponse(response);
+        checkBatchGetAmpUrlsResponse(response as api.BatchGetAmpUrlsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/accessapproval/v1_test.dart b/generated/googleapis/test/accessapproval/v1_test.dart
index becec3f..99dc8ca 100644
--- a/generated/googleapis/test/accessapproval/v1_test.dart
+++ b/generated/googleapis/test/accessapproval/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed4338(core.List<api.EnrolledService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnrolledService(o[0]);
-  checkEnrolledService(o[1]);
+  checkEnrolledService(o[0] as api.EnrolledService);
+  checkEnrolledService(o[1] as api.EnrolledService);
 }
 
 core.List<core.String> buildUnnamed4339() {
@@ -189,15 +189,16 @@
 void checkApprovalRequest(api.ApprovalRequest o) {
   buildCounterApprovalRequest++;
   if (buildCounterApprovalRequest < 3) {
-    checkApproveDecision(o.approve);
-    checkDismissDecision(o.dismiss);
+    checkApproveDecision(o.approve as api.ApproveDecision);
+    checkDismissDecision(o.dismiss as api.DismissDecision);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.requestTime, unittest.equals('foo'));
     unittest.expect(o.requestedExpiration, unittest.equals('foo'));
-    checkAccessLocations(o.requestedLocations);
-    checkAccessReason(o.requestedReason);
+    checkAccessLocations(o.requestedLocations as api.AccessLocations);
+    checkAccessReason(o.requestedReason as api.AccessReason);
     unittest.expect(o.requestedResourceName, unittest.equals('foo'));
-    checkResourceProperties(o.requestedResourceProperties);
+    checkResourceProperties(
+        o.requestedResourceProperties as api.ResourceProperties);
   }
   buildCounterApprovalRequest--;
 }
@@ -323,8 +324,8 @@
 
 void checkUnnamed4340(core.List<api.ApprovalRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApprovalRequest(o[0]);
-  checkApprovalRequest(o[1]);
+  checkApprovalRequest(o[0] as api.ApprovalRequest);
+  checkApprovalRequest(o[1] as api.ApprovalRequest);
 }
 
 core.int buildCounterListApprovalRequestsResponse = 0;
@@ -372,7 +373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessApprovalSettings();
       var od = api.AccessApprovalSettings.fromJson(o.toJson());
-      checkAccessApprovalSettings(od);
+      checkAccessApprovalSettings(od as api.AccessApprovalSettings);
     });
   });
 
@@ -380,7 +381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessLocations();
       var od = api.AccessLocations.fromJson(o.toJson());
-      checkAccessLocations(od);
+      checkAccessLocations(od as api.AccessLocations);
     });
   });
 
@@ -388,7 +389,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessReason();
       var od = api.AccessReason.fromJson(o.toJson());
-      checkAccessReason(od);
+      checkAccessReason(od as api.AccessReason);
     });
   });
 
@@ -396,7 +397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApprovalRequest();
       var od = api.ApprovalRequest.fromJson(o.toJson());
-      checkApprovalRequest(od);
+      checkApprovalRequest(od as api.ApprovalRequest);
     });
   });
 
@@ -404,7 +405,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildApproveApprovalRequestMessage();
       var od = api.ApproveApprovalRequestMessage.fromJson(o.toJson());
-      checkApproveApprovalRequestMessage(od);
+      checkApproveApprovalRequestMessage(
+          od as api.ApproveApprovalRequestMessage);
     });
   });
 
@@ -412,7 +414,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApproveDecision();
       var od = api.ApproveDecision.fromJson(o.toJson());
-      checkApproveDecision(od);
+      checkApproveDecision(od as api.ApproveDecision);
     });
   });
 
@@ -420,7 +422,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDismissApprovalRequestMessage();
       var od = api.DismissApprovalRequestMessage.fromJson(o.toJson());
-      checkDismissApprovalRequestMessage(od);
+      checkDismissApprovalRequestMessage(
+          od as api.DismissApprovalRequestMessage);
     });
   });
 
@@ -428,7 +431,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDismissDecision();
       var od = api.DismissDecision.fromJson(o.toJson());
-      checkDismissDecision(od);
+      checkDismissDecision(od as api.DismissDecision);
     });
   });
 
@@ -436,7 +439,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -444,7 +447,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnrolledService();
       var od = api.EnrolledService.fromJson(o.toJson());
-      checkEnrolledService(od);
+      checkEnrolledService(od as api.EnrolledService);
     });
   });
 
@@ -452,7 +455,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListApprovalRequestsResponse();
       var od = api.ListApprovalRequestsResponse.fromJson(o.toJson());
-      checkListApprovalRequestsResponse(od);
+      checkListApprovalRequestsResponse(od as api.ListApprovalRequestsResponse);
     });
   });
 
@@ -460,7 +463,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceProperties();
       var od = api.ResourceProperties.fromJson(o.toJson());
-      checkResourceProperties(od);
+      checkResourceProperties(od as api.ResourceProperties);
     });
   });
 
@@ -509,7 +512,7 @@
       res
           .deleteAccessApprovalSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -557,7 +560,7 @@
       res
           .getAccessApprovalSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessApprovalSettings(response);
+        checkAccessApprovalSettings(response as api.AccessApprovalSettings);
       })));
     });
 
@@ -569,8 +572,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessApprovalSettings.fromJson(json);
-        checkAccessApprovalSettings(obj);
+        var obj = api.AccessApprovalSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessApprovalSettings(obj as api.AccessApprovalSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -613,7 +617,7 @@
           .updateAccessApprovalSettings(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessApprovalSettings(response);
+        checkAccessApprovalSettings(response as api.AccessApprovalSettings);
       })));
     });
   });
@@ -626,8 +630,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ApproveApprovalRequestMessage.fromJson(json);
-        checkApproveApprovalRequestMessage(obj);
+        var obj = api.ApproveApprovalRequestMessage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkApproveApprovalRequestMessage(
+            obj as api.ApproveApprovalRequestMessage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -667,7 +673,7 @@
       res
           .approve(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -678,8 +684,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DismissApprovalRequestMessage.fromJson(json);
-        checkDismissApprovalRequestMessage(obj);
+        var obj = api.DismissApprovalRequestMessage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDismissApprovalRequestMessage(
+            obj as api.DismissApprovalRequestMessage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -719,7 +727,7 @@
       res
           .dismiss(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -767,7 +775,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -827,7 +835,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListApprovalRequestsResponse(response);
+        checkListApprovalRequestsResponse(
+            response as api.ListApprovalRequestsResponse);
       })));
     });
   });
@@ -877,7 +886,7 @@
       res
           .deleteAccessApprovalSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -925,7 +934,7 @@
       res
           .getAccessApprovalSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessApprovalSettings(response);
+        checkAccessApprovalSettings(response as api.AccessApprovalSettings);
       })));
     });
 
@@ -937,8 +946,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessApprovalSettings.fromJson(json);
-        checkAccessApprovalSettings(obj);
+        var obj = api.AccessApprovalSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessApprovalSettings(obj as api.AccessApprovalSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -981,7 +991,7 @@
           .updateAccessApprovalSettings(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessApprovalSettings(response);
+        checkAccessApprovalSettings(response as api.AccessApprovalSettings);
       })));
     });
   });
@@ -994,8 +1004,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ApproveApprovalRequestMessage.fromJson(json);
-        checkApproveApprovalRequestMessage(obj);
+        var obj = api.ApproveApprovalRequestMessage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkApproveApprovalRequestMessage(
+            obj as api.ApproveApprovalRequestMessage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1035,7 +1047,7 @@
       res
           .approve(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -1046,8 +1058,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DismissApprovalRequestMessage.fromJson(json);
-        checkDismissApprovalRequestMessage(obj);
+        var obj = api.DismissApprovalRequestMessage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDismissApprovalRequestMessage(
+            obj as api.DismissApprovalRequestMessage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1087,7 +1101,7 @@
       res
           .dismiss(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -1135,7 +1149,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -1195,7 +1209,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListApprovalRequestsResponse(response);
+        checkListApprovalRequestsResponse(
+            response as api.ListApprovalRequestsResponse);
       })));
     });
   });
@@ -1245,7 +1260,7 @@
       res
           .deleteAccessApprovalSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1293,7 +1308,7 @@
       res
           .getAccessApprovalSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessApprovalSettings(response);
+        checkAccessApprovalSettings(response as api.AccessApprovalSettings);
       })));
     });
 
@@ -1305,8 +1320,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessApprovalSettings.fromJson(json);
-        checkAccessApprovalSettings(obj);
+        var obj = api.AccessApprovalSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessApprovalSettings(obj as api.AccessApprovalSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1349,7 +1365,7 @@
           .updateAccessApprovalSettings(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessApprovalSettings(response);
+        checkAccessApprovalSettings(response as api.AccessApprovalSettings);
       })));
     });
   });
@@ -1362,8 +1378,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ApproveApprovalRequestMessage.fromJson(json);
-        checkApproveApprovalRequestMessage(obj);
+        var obj = api.ApproveApprovalRequestMessage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkApproveApprovalRequestMessage(
+            obj as api.ApproveApprovalRequestMessage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1403,7 +1421,7 @@
       res
           .approve(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -1414,8 +1432,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DismissApprovalRequestMessage.fromJson(json);
-        checkDismissApprovalRequestMessage(obj);
+        var obj = api.DismissApprovalRequestMessage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDismissApprovalRequestMessage(
+            obj as api.DismissApprovalRequestMessage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1455,7 +1475,7 @@
       res
           .dismiss(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -1503,7 +1523,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApprovalRequest(response);
+        checkApprovalRequest(response as api.ApprovalRequest);
       })));
     });
 
@@ -1563,7 +1583,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListApprovalRequestsResponse(response);
+        checkListApprovalRequestsResponse(
+            response as api.ListApprovalRequestsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/accesscontextmanager/v1_test.dart b/generated/googleapis/test/accesscontextmanager/v1_test.dart
index 5fa4df8..644113f 100644
--- a/generated/googleapis/test/accesscontextmanager/v1_test.dart
+++ b/generated/googleapis/test/accesscontextmanager/v1_test.dart
@@ -92,8 +92,8 @@
 void checkAccessLevel(api.AccessLevel o) {
   buildCounterAccessLevel++;
   if (buildCounterAccessLevel < 3) {
-    checkBasicLevel(o.basic);
-    checkCustomLevel(o.custom);
+    checkBasicLevel(o.basic as api.BasicLevel);
+    checkCustomLevel(o.custom as api.CustomLevel);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -135,8 +135,8 @@
 
 void checkUnnamed5518(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.int buildCounterBasicLevel = 0;
@@ -203,8 +203,8 @@
 
 void checkUnnamed5519(core.List<api.ServicePerimeter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServicePerimeter(o[0]);
-  checkServicePerimeter(o[1]);
+  checkServicePerimeter(o[0] as api.ServicePerimeter);
+  checkServicePerimeter(o[1] as api.ServicePerimeter);
 }
 
 core.int buildCounterCommitServicePerimetersResponse = 0;
@@ -298,7 +298,7 @@
 void checkCondition(api.Condition o) {
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    checkDevicePolicy(o.devicePolicy);
+    checkDevicePolicy(o.devicePolicy as api.DevicePolicy);
     checkUnnamed5520(o.ipSubnetworks);
     checkUnnamed5521(o.members);
     unittest.expect(o.negate, unittest.isTrue);
@@ -322,7 +322,7 @@
 void checkCustomLevel(api.CustomLevel o) {
   buildCounterCustomLevel++;
   if (buildCounterCustomLevel < 3) {
-    checkExpr(o.expr);
+    checkExpr(o.expr as api.Expr);
   }
   buildCounterCustomLevel--;
 }
@@ -362,8 +362,8 @@
 
 void checkUnnamed5526(core.List<api.OsConstraint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOsConstraint(o[0]);
-  checkOsConstraint(o[1]);
+  checkOsConstraint(o[0] as api.OsConstraint);
+  checkOsConstraint(o[1] as api.OsConstraint);
 }
 
 core.int buildCounterDevicePolicy = 0;
@@ -480,8 +480,8 @@
 
 void checkUnnamed5528(core.List<api.AccessLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccessLevel(o[0]);
-  checkAccessLevel(o[1]);
+  checkAccessLevel(o[0] as api.AccessLevel);
+  checkAccessLevel(o[1] as api.AccessLevel);
 }
 
 core.int buildCounterListAccessLevelsResponse = 0;
@@ -514,8 +514,8 @@
 
 void checkUnnamed5529(core.List<api.AccessPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccessPolicy(o[0]);
-  checkAccessPolicy(o[1]);
+  checkAccessPolicy(o[0] as api.AccessPolicy);
+  checkAccessPolicy(o[1] as api.AccessPolicy);
 }
 
 core.int buildCounterListAccessPoliciesResponse = 0;
@@ -548,8 +548,8 @@
 
 void checkUnnamed5530(core.List<api.GcpUserAccessBinding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGcpUserAccessBinding(o[0]);
-  checkGcpUserAccessBinding(o[1]);
+  checkGcpUserAccessBinding(o[0] as api.GcpUserAccessBinding);
+  checkGcpUserAccessBinding(o[1] as api.GcpUserAccessBinding);
 }
 
 core.int buildCounterListGcpUserAccessBindingsResponse = 0;
@@ -583,8 +583,8 @@
 
 void checkUnnamed5531(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -617,8 +617,8 @@
 
 void checkUnnamed5532(core.List<api.ServicePerimeter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServicePerimeter(o[0]);
-  checkServicePerimeter(o[1]);
+  checkServicePerimeter(o[0] as api.ServicePerimeter);
+  checkServicePerimeter(o[1] as api.ServicePerimeter);
 }
 
 core.int buildCounterListServicePerimetersResponse = 0;
@@ -719,7 +719,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5533(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5534(o.response);
@@ -759,8 +759,8 @@
 
 void checkUnnamed5535(core.List<api.AccessLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccessLevel(o[0]);
-  checkAccessLevel(o[1]);
+  checkAccessLevel(o[0] as api.AccessLevel);
+  checkAccessLevel(o[1] as api.AccessLevel);
 }
 
 core.int buildCounterReplaceAccessLevelsRequest = 0;
@@ -793,8 +793,8 @@
 
 void checkUnnamed5536(core.List<api.AccessLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccessLevel(o[0]);
-  checkAccessLevel(o[1]);
+  checkAccessLevel(o[0] as api.AccessLevel);
+  checkAccessLevel(o[1] as api.AccessLevel);
 }
 
 core.int buildCounterReplaceAccessLevelsResponse = 0;
@@ -825,8 +825,8 @@
 
 void checkUnnamed5537(core.List<api.ServicePerimeter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServicePerimeter(o[0]);
-  checkServicePerimeter(o[1]);
+  checkServicePerimeter(o[0] as api.ServicePerimeter);
+  checkServicePerimeter(o[1] as api.ServicePerimeter);
 }
 
 core.int buildCounterReplaceServicePerimetersRequest = 0;
@@ -860,8 +860,8 @@
 
 void checkUnnamed5538(core.List<api.ServicePerimeter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServicePerimeter(o[0]);
-  checkServicePerimeter(o[1]);
+  checkServicePerimeter(o[0] as api.ServicePerimeter);
+  checkServicePerimeter(o[1] as api.ServicePerimeter);
 }
 
 core.int buildCounterReplaceServicePerimetersResponse = 0;
@@ -907,8 +907,8 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.perimeterType, unittest.equals('foo'));
-    checkServicePerimeterConfig(o.spec);
-    checkServicePerimeterConfig(o.status);
+    checkServicePerimeterConfig(o.spec as api.ServicePerimeterConfig);
+    checkServicePerimeterConfig(o.status as api.ServicePerimeterConfig);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.useExplicitDryRunSpec, unittest.isTrue);
   }
@@ -974,7 +974,8 @@
     checkUnnamed5539(o.accessLevels);
     checkUnnamed5540(o.resources);
     checkUnnamed5541(o.restrictedServices);
-    checkVpcAccessibleServices(o.vpcAccessibleServices);
+    checkVpcAccessibleServices(
+        o.vpcAccessibleServices as api.VpcAccessibleServices);
   }
   buildCounterServicePerimeterConfig--;
 }
@@ -1083,7 +1084,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessLevel();
       var od = api.AccessLevel.fromJson(o.toJson());
-      checkAccessLevel(od);
+      checkAccessLevel(od as api.AccessLevel);
     });
   });
 
@@ -1091,7 +1092,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessPolicy();
       var od = api.AccessPolicy.fromJson(o.toJson());
-      checkAccessPolicy(od);
+      checkAccessPolicy(od as api.AccessPolicy);
     });
   });
 
@@ -1099,7 +1100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicLevel();
       var od = api.BasicLevel.fromJson(o.toJson());
-      checkBasicLevel(od);
+      checkBasicLevel(od as api.BasicLevel);
     });
   });
 
@@ -1107,7 +1108,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -1115,7 +1116,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitServicePerimetersRequest();
       var od = api.CommitServicePerimetersRequest.fromJson(o.toJson());
-      checkCommitServicePerimetersRequest(od);
+      checkCommitServicePerimetersRequest(
+          od as api.CommitServicePerimetersRequest);
     });
   });
 
@@ -1123,7 +1125,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitServicePerimetersResponse();
       var od = api.CommitServicePerimetersResponse.fromJson(o.toJson());
-      checkCommitServicePerimetersResponse(od);
+      checkCommitServicePerimetersResponse(
+          od as api.CommitServicePerimetersResponse);
     });
   });
 
@@ -1131,7 +1134,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCondition();
       var od = api.Condition.fromJson(o.toJson());
-      checkCondition(od);
+      checkCondition(od as api.Condition);
     });
   });
 
@@ -1139,7 +1142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomLevel();
       var od = api.CustomLevel.fromJson(o.toJson());
-      checkCustomLevel(od);
+      checkCustomLevel(od as api.CustomLevel);
     });
   });
 
@@ -1147,7 +1150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevicePolicy();
       var od = api.DevicePolicy.fromJson(o.toJson());
-      checkDevicePolicy(od);
+      checkDevicePolicy(od as api.DevicePolicy);
     });
   });
 
@@ -1155,7 +1158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1163,7 +1166,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1171,7 +1174,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcpUserAccessBinding();
       var od = api.GcpUserAccessBinding.fromJson(o.toJson());
-      checkGcpUserAccessBinding(od);
+      checkGcpUserAccessBinding(od as api.GcpUserAccessBinding);
     });
   });
 
@@ -1179,7 +1182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAccessLevelsResponse();
       var od = api.ListAccessLevelsResponse.fromJson(o.toJson());
-      checkListAccessLevelsResponse(od);
+      checkListAccessLevelsResponse(od as api.ListAccessLevelsResponse);
     });
   });
 
@@ -1187,7 +1190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAccessPoliciesResponse();
       var od = api.ListAccessPoliciesResponse.fromJson(o.toJson());
-      checkListAccessPoliciesResponse(od);
+      checkListAccessPoliciesResponse(od as api.ListAccessPoliciesResponse);
     });
   });
 
@@ -1195,7 +1198,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGcpUserAccessBindingsResponse();
       var od = api.ListGcpUserAccessBindingsResponse.fromJson(o.toJson());
-      checkListGcpUserAccessBindingsResponse(od);
+      checkListGcpUserAccessBindingsResponse(
+          od as api.ListGcpUserAccessBindingsResponse);
     });
   });
 
@@ -1203,7 +1207,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1211,7 +1215,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServicePerimetersResponse();
       var od = api.ListServicePerimetersResponse.fromJson(o.toJson());
-      checkListServicePerimetersResponse(od);
+      checkListServicePerimetersResponse(
+          od as api.ListServicePerimetersResponse);
     });
   });
 
@@ -1219,7 +1224,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1227,7 +1232,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOsConstraint();
       var od = api.OsConstraint.fromJson(o.toJson());
-      checkOsConstraint(od);
+      checkOsConstraint(od as api.OsConstraint);
     });
   });
 
@@ -1235,7 +1240,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAccessLevelsRequest();
       var od = api.ReplaceAccessLevelsRequest.fromJson(o.toJson());
-      checkReplaceAccessLevelsRequest(od);
+      checkReplaceAccessLevelsRequest(od as api.ReplaceAccessLevelsRequest);
     });
   });
 
@@ -1243,7 +1248,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAccessLevelsResponse();
       var od = api.ReplaceAccessLevelsResponse.fromJson(o.toJson());
-      checkReplaceAccessLevelsResponse(od);
+      checkReplaceAccessLevelsResponse(od as api.ReplaceAccessLevelsResponse);
     });
   });
 
@@ -1251,7 +1256,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceServicePerimetersRequest();
       var od = api.ReplaceServicePerimetersRequest.fromJson(o.toJson());
-      checkReplaceServicePerimetersRequest(od);
+      checkReplaceServicePerimetersRequest(
+          od as api.ReplaceServicePerimetersRequest);
     });
   });
 
@@ -1259,7 +1265,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceServicePerimetersResponse();
       var od = api.ReplaceServicePerimetersResponse.fromJson(o.toJson());
-      checkReplaceServicePerimetersResponse(od);
+      checkReplaceServicePerimetersResponse(
+          od as api.ReplaceServicePerimetersResponse);
     });
   });
 
@@ -1267,7 +1274,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServicePerimeter();
       var od = api.ServicePerimeter.fromJson(o.toJson());
-      checkServicePerimeter(od);
+      checkServicePerimeter(od as api.ServicePerimeter);
     });
   });
 
@@ -1275,7 +1282,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServicePerimeterConfig();
       var od = api.ServicePerimeterConfig.fromJson(o.toJson());
-      checkServicePerimeterConfig(od);
+      checkServicePerimeterConfig(od as api.ServicePerimeterConfig);
     });
   });
 
@@ -1283,7 +1290,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1291,7 +1298,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpcAccessibleServices();
       var od = api.VpcAccessibleServices.fromJson(o.toJson());
-      checkVpcAccessibleServices(od);
+      checkVpcAccessibleServices(od as api.VpcAccessibleServices);
     });
   });
 
@@ -1302,8 +1309,9 @@
       var arg_request = buildAccessPolicy();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessPolicy.fromJson(json);
-        checkAccessPolicy(obj);
+        var obj = api.AccessPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessPolicy(obj as api.AccessPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1342,7 +1350,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1390,7 +1398,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1438,7 +1446,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessPolicy(response);
+        checkAccessPolicy(response as api.AccessPolicy);
       })));
     });
 
@@ -1496,7 +1504,8 @@
               parent: arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAccessPoliciesResponse(response);
+        checkListAccessPoliciesResponse(
+            response as api.ListAccessPoliciesResponse);
       })));
     });
 
@@ -1508,8 +1517,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessPolicy.fromJson(json);
-        checkAccessPolicy(obj);
+        var obj = api.AccessPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessPolicy(obj as api.AccessPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1552,7 +1562,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -1565,8 +1575,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessLevel.fromJson(json);
-        checkAccessLevel(obj);
+        var obj = api.AccessLevel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessLevel(obj as api.AccessLevel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1606,7 +1617,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1654,7 +1665,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1706,7 +1717,7 @@
           .get(arg_name,
               accessLevelFormat: arg_accessLevelFormat, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessLevel(response);
+        checkAccessLevel(response as api.AccessLevel);
       })));
     });
 
@@ -1767,7 +1778,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAccessLevelsResponse(response);
+        checkListAccessLevelsResponse(response as api.ListAccessLevelsResponse);
       })));
     });
 
@@ -1779,8 +1790,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessLevel.fromJson(json);
-        checkAccessLevel(obj);
+        var obj = api.AccessLevel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessLevel(obj as api.AccessLevel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1823,7 +1835,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1834,8 +1846,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReplaceAccessLevelsRequest.fromJson(json);
-        checkReplaceAccessLevelsRequest(obj);
+        var obj = api.ReplaceAccessLevelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReplaceAccessLevelsRequest(obj as api.ReplaceAccessLevelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1875,7 +1888,7 @@
       res
           .replaceAll(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -1889,8 +1902,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommitServicePerimetersRequest.fromJson(json);
-        checkCommitServicePerimetersRequest(obj);
+        var obj = api.CommitServicePerimetersRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommitServicePerimetersRequest(
+            obj as api.CommitServicePerimetersRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1930,7 +1945,7 @@
       res
           .commit(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1942,8 +1957,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ServicePerimeter.fromJson(json);
-        checkServicePerimeter(obj);
+        var obj = api.ServicePerimeter.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkServicePerimeter(obj as api.ServicePerimeter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1983,7 +1999,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2032,7 +2048,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2081,7 +2097,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServicePerimeter(response);
+        checkServicePerimeter(response as api.ServicePerimeter);
       })));
     });
 
@@ -2139,7 +2155,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicePerimetersResponse(response);
+        checkListServicePerimetersResponse(
+            response as api.ListServicePerimetersResponse);
       })));
     });
 
@@ -2152,8 +2169,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ServicePerimeter.fromJson(json);
-        checkServicePerimeter(obj);
+        var obj = api.ServicePerimeter.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkServicePerimeter(obj as api.ServicePerimeter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2196,7 +2214,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2208,8 +2226,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReplaceServicePerimetersRequest.fromJson(json);
-        checkReplaceServicePerimetersRequest(obj);
+        var obj = api.ReplaceServicePerimetersRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReplaceServicePerimetersRequest(
+            obj as api.ReplaceServicePerimetersRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2249,7 +2269,7 @@
       res
           .replaceAll(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2262,8 +2282,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2303,7 +2324,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2351,7 +2372,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2399,7 +2420,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2459,7 +2480,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -2473,8 +2494,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GcpUserAccessBinding.fromJson(json);
-        checkGcpUserAccessBinding(obj);
+        var obj = api.GcpUserAccessBinding.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGcpUserAccessBinding(obj as api.GcpUserAccessBinding);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2514,7 +2536,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2563,7 +2585,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2612,7 +2634,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGcpUserAccessBinding(response);
+        checkGcpUserAccessBinding(response as api.GcpUserAccessBinding);
       })));
     });
 
@@ -2671,7 +2693,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGcpUserAccessBindingsResponse(response);
+        checkListGcpUserAccessBindingsResponse(
+            response as api.ListGcpUserAccessBindingsResponse);
       })));
     });
 
@@ -2684,8 +2707,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GcpUserAccessBinding.fromJson(json);
-        checkGcpUserAccessBinding(obj);
+        var obj = api.GcpUserAccessBinding.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGcpUserAccessBinding(obj as api.GcpUserAccessBinding);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2728,7 +2752,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
index 2dd1d2c..b600a8e 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_3_test.dart
@@ -106,8 +106,8 @@
 
 void checkUnnamed1680(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountBidderLocation(o[0]);
-  checkAccountBidderLocation(o[1]);
+  checkAccountBidderLocation(o[0] as api.AccountBidderLocation);
+  checkAccountBidderLocation(o[1] as api.AccountBidderLocation);
 }
 
 core.int buildCounterAccount = 0;
@@ -152,8 +152,8 @@
 
 void checkUnnamed1681(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccountsList = 0;
@@ -224,8 +224,8 @@
 
 void checkUnnamed1683(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBillingInfo(o[0]);
-  checkBillingInfo(o[1]);
+  checkBillingInfo(o[0] as api.BillingInfo);
+  checkBillingInfo(o[1] as api.BillingInfo);
 }
 
 core.int buildCounterBillingInfoList = 0;
@@ -394,8 +394,8 @@
 
 void checkUnnamed1689(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCorrections(o[0]);
-  checkCreativeCorrections(o[1]);
+  checkCreativeCorrections(o[0] as api.CreativeCorrections);
+  checkCreativeCorrections(o[1] as api.CreativeCorrections);
 }
 
 core.List<core.String> buildUnnamed1690() {
@@ -441,8 +441,8 @@
 
 void checkUnnamed1691(core.List<api.CreativeDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeDisapprovalReasons(o[0]);
-  checkCreativeDisapprovalReasons(o[1]);
+  checkCreativeDisapprovalReasons(o[0] as api.CreativeDisapprovalReasons);
+  checkCreativeDisapprovalReasons(o[1] as api.CreativeDisapprovalReasons);
 }
 
 core.int buildCounterCreativeFilteringReasonsReasons = 0;
@@ -476,8 +476,10 @@
 
 void checkUnnamed1692(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeFilteringReasonsReasons(o[0]);
-  checkCreativeFilteringReasonsReasons(o[1]);
+  checkCreativeFilteringReasonsReasons(
+      o[0] as api.CreativeFilteringReasonsReasons);
+  checkCreativeFilteringReasonsReasons(
+      o[1] as api.CreativeFilteringReasonsReasons);
 }
 
 core.int buildCounterCreativeFilteringReasons = 0;
@@ -621,14 +623,14 @@
   buildCounterCreativeNativeAd++;
   if (buildCounterCreativeNativeAd < 3) {
     unittest.expect(o.advertiser, unittest.equals('foo'));
-    checkCreativeNativeAdAppIcon(o.appIcon);
+    checkCreativeNativeAdAppIcon(o.appIcon as api.CreativeNativeAdAppIcon);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.callToAction, unittest.equals('foo'));
     unittest.expect(o.clickTrackingUrl, unittest.equals('foo'));
     unittest.expect(o.headline, unittest.equals('foo'));
-    checkCreativeNativeAdImage(o.image);
+    checkCreativeNativeAdImage(o.image as api.CreativeNativeAdImage);
     checkUnnamed1694(o.impressionTrackingUrl);
-    checkCreativeNativeAdLogo(o.logo);
+    checkCreativeNativeAdLogo(o.logo as api.CreativeNativeAdLogo);
     unittest.expect(o.price, unittest.equals('foo'));
     unittest.expect(o.starRating, unittest.equals(42.0));
   }
@@ -727,7 +729,8 @@
   if (buildCounterCreative < 3) {
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
-    checkCreativeAdTechnologyProviders(o.adTechnologyProviders);
+    checkCreativeAdTechnologyProviders(
+        o.adTechnologyProviders as api.CreativeAdTechnologyProviders);
     checkUnnamed1685(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
@@ -738,11 +741,12 @@
     checkUnnamed1687(o.clickThroughUrl);
     checkUnnamed1689(o.corrections);
     checkUnnamed1691(o.disapprovalReasons);
-    checkCreativeFilteringReasons(o.filteringReasons);
+    checkCreativeFilteringReasons(
+        o.filteringReasons as api.CreativeFilteringReasons);
     unittest.expect(o.height, unittest.equals(42));
     checkUnnamed1693(o.impressionTrackingUrl);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkCreativeNativeAd(o.nativeAd);
+    checkCreativeNativeAd(o.nativeAd as api.CreativeNativeAd);
     checkUnnamed1695(o.productCategories);
     checkUnnamed1696(o.restrictedCategories);
     checkUnnamed1697(o.sensitiveCategories);
@@ -764,8 +768,8 @@
 
 void checkUnnamed1699(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreative(o[0]);
-  checkCreative(o[1]);
+  checkCreative(o[0] as api.Creative);
+  checkCreative(o[1] as api.Creative);
 }
 
 core.int buildCounterCreativesList = 0;
@@ -847,8 +851,8 @@
 
 void checkUnnamed1700(core.List<api.DirectDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDirectDeal(o[0]);
-  checkDirectDeal(o[1]);
+  checkDirectDeal(o[0] as api.DirectDeal);
+  checkDirectDeal(o[1] as api.DirectDeal);
 }
 
 core.int buildCounterDirectDealsList = 0;
@@ -1058,8 +1062,8 @@
 
 void checkUnnamed1705(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerformanceReport(o[0]);
-  checkPerformanceReport(o[1]);
+  checkPerformanceReport(o[0] as api.PerformanceReport);
+  checkPerformanceReport(o[1] as api.PerformanceReport);
 }
 
 core.int buildCounterPerformanceReportList = 0;
@@ -1126,8 +1130,8 @@
 
 void checkUnnamed1707(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigDimensions(o[0]);
-  checkPretargetingConfigDimensions(o[1]);
+  checkPretargetingConfigDimensions(o[0] as api.PretargetingConfigDimensions);
+  checkPretargetingConfigDimensions(o[1] as api.PretargetingConfigDimensions);
 }
 
 core.List<core.String> buildUnnamed1708() {
@@ -1188,8 +1192,10 @@
 
 void checkUnnamed1710(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigExcludedPlacements(o[0]);
-  checkPretargetingConfigExcludedPlacements(o[1]);
+  checkPretargetingConfigExcludedPlacements(
+      o[0] as api.PretargetingConfigExcludedPlacements);
+  checkPretargetingConfigExcludedPlacements(
+      o[1] as api.PretargetingConfigExcludedPlacements);
 }
 
 core.List<core.String> buildUnnamed1711() {
@@ -1313,8 +1319,8 @@
 
 void checkUnnamed1718(core.List<api.PretargetingConfigPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigPlacements(o[0]);
-  checkPretargetingConfigPlacements(o[1]);
+  checkPretargetingConfigPlacements(o[0] as api.PretargetingConfigPlacements);
+  checkPretargetingConfigPlacements(o[1] as api.PretargetingConfigPlacements);
 }
 
 core.List<core.String> buildUnnamed1719() {
@@ -1456,8 +1462,8 @@
 
 void checkUnnamed1724(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfig(o[0]);
-  checkPretargetingConfig(o[1]);
+  checkPretargetingConfig(o[0] as api.PretargetingConfig);
+  checkPretargetingConfig(o[1] as api.PretargetingConfig);
 }
 
 core.int buildCounterPretargetingConfigList = 0;
@@ -1512,7 +1518,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountBidderLocation();
       var od = api.AccountBidderLocation.fromJson(o.toJson());
-      checkAccountBidderLocation(od);
+      checkAccountBidderLocation(od as api.AccountBidderLocation);
     });
   });
 
@@ -1520,7 +1526,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -1528,7 +1534,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsList();
       var od = api.AccountsList.fromJson(o.toJson());
-      checkAccountsList(od);
+      checkAccountsList(od as api.AccountsList);
     });
   });
 
@@ -1536,7 +1542,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingInfo();
       var od = api.BillingInfo.fromJson(o.toJson());
-      checkBillingInfo(od);
+      checkBillingInfo(od as api.BillingInfo);
     });
   });
 
@@ -1544,7 +1550,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingInfoList();
       var od = api.BillingInfoList.fromJson(o.toJson());
-      checkBillingInfoList(od);
+      checkBillingInfoList(od as api.BillingInfoList);
     });
   });
 
@@ -1552,7 +1558,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBudget();
       var od = api.Budget.fromJson(o.toJson());
-      checkBudget(od);
+      checkBudget(od as api.Budget);
     });
   });
 
@@ -1560,7 +1566,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeAdTechnologyProviders();
       var od = api.CreativeAdTechnologyProviders.fromJson(o.toJson());
-      checkCreativeAdTechnologyProviders(od);
+      checkCreativeAdTechnologyProviders(
+          od as api.CreativeAdTechnologyProviders);
     });
   });
 
@@ -1568,7 +1575,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeCorrections();
       var od = api.CreativeCorrections.fromJson(o.toJson());
-      checkCreativeCorrections(od);
+      checkCreativeCorrections(od as api.CreativeCorrections);
     });
   });
 
@@ -1576,7 +1583,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeDisapprovalReasons();
       var od = api.CreativeDisapprovalReasons.fromJson(o.toJson());
-      checkCreativeDisapprovalReasons(od);
+      checkCreativeDisapprovalReasons(od as api.CreativeDisapprovalReasons);
     });
   });
 
@@ -1584,7 +1591,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFilteringReasonsReasons();
       var od = api.CreativeFilteringReasonsReasons.fromJson(o.toJson());
-      checkCreativeFilteringReasonsReasons(od);
+      checkCreativeFilteringReasonsReasons(
+          od as api.CreativeFilteringReasonsReasons);
     });
   });
 
@@ -1592,7 +1600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFilteringReasons();
       var od = api.CreativeFilteringReasons.fromJson(o.toJson());
-      checkCreativeFilteringReasons(od);
+      checkCreativeFilteringReasons(od as api.CreativeFilteringReasons);
     });
   });
 
@@ -1600,7 +1608,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAdAppIcon();
       var od = api.CreativeNativeAdAppIcon.fromJson(o.toJson());
-      checkCreativeNativeAdAppIcon(od);
+      checkCreativeNativeAdAppIcon(od as api.CreativeNativeAdAppIcon);
     });
   });
 
@@ -1608,7 +1616,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAdImage();
       var od = api.CreativeNativeAdImage.fromJson(o.toJson());
-      checkCreativeNativeAdImage(od);
+      checkCreativeNativeAdImage(od as api.CreativeNativeAdImage);
     });
   });
 
@@ -1616,7 +1624,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAdLogo();
       var od = api.CreativeNativeAdLogo.fromJson(o.toJson());
-      checkCreativeNativeAdLogo(od);
+      checkCreativeNativeAdLogo(od as api.CreativeNativeAdLogo);
     });
   });
 
@@ -1624,7 +1632,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAd();
       var od = api.CreativeNativeAd.fromJson(o.toJson());
-      checkCreativeNativeAd(od);
+      checkCreativeNativeAd(od as api.CreativeNativeAd);
     });
   });
 
@@ -1632,7 +1640,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreative();
       var od = api.Creative.fromJson(o.toJson());
-      checkCreative(od);
+      checkCreative(od as api.Creative);
     });
   });
 
@@ -1640,7 +1648,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativesList();
       var od = api.CreativesList.fromJson(o.toJson());
-      checkCreativesList(od);
+      checkCreativesList(od as api.CreativesList);
     });
   });
 
@@ -1648,7 +1656,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectDeal();
       var od = api.DirectDeal.fromJson(o.toJson());
-      checkDirectDeal(od);
+      checkDirectDeal(od as api.DirectDeal);
     });
   });
 
@@ -1656,7 +1664,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectDealsList();
       var od = api.DirectDealsList.fromJson(o.toJson());
-      checkDirectDealsList(od);
+      checkDirectDealsList(od as api.DirectDealsList);
     });
   });
 
@@ -1664,7 +1672,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerformanceReport();
       var od = api.PerformanceReport.fromJson(o.toJson());
-      checkPerformanceReport(od);
+      checkPerformanceReport(od as api.PerformanceReport);
     });
   });
 
@@ -1672,7 +1680,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerformanceReportList();
       var od = api.PerformanceReportList.fromJson(o.toJson());
-      checkPerformanceReportList(od);
+      checkPerformanceReportList(od as api.PerformanceReportList);
     });
   });
 
@@ -1680,7 +1688,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigDimensions();
       var od = api.PretargetingConfigDimensions.fromJson(o.toJson());
-      checkPretargetingConfigDimensions(od);
+      checkPretargetingConfigDimensions(od as api.PretargetingConfigDimensions);
     });
   });
 
@@ -1688,7 +1696,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigExcludedPlacements();
       var od = api.PretargetingConfigExcludedPlacements.fromJson(o.toJson());
-      checkPretargetingConfigExcludedPlacements(od);
+      checkPretargetingConfigExcludedPlacements(
+          od as api.PretargetingConfigExcludedPlacements);
     });
   });
 
@@ -1696,7 +1705,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigPlacements();
       var od = api.PretargetingConfigPlacements.fromJson(o.toJson());
-      checkPretargetingConfigPlacements(od);
+      checkPretargetingConfigPlacements(od as api.PretargetingConfigPlacements);
     });
   });
 
@@ -1704,7 +1713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfig();
       var od = api.PretargetingConfig.fromJson(o.toJson());
-      checkPretargetingConfig(od);
+      checkPretargetingConfig(od as api.PretargetingConfig);
     });
   });
 
@@ -1712,7 +1721,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigList();
       var od = api.PretargetingConfigList.fromJson(o.toJson());
-      checkPretargetingConfigList(od);
+      checkPretargetingConfigList(od as api.PretargetingConfigList);
     });
   });
 
@@ -1766,7 +1775,7 @@
       res
           .get(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -1813,7 +1822,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkAccountsList(response);
+        checkAccountsList(response as api.AccountsList);
       })));
     });
 
@@ -1824,8 +1833,9 @@
       var arg_id = 42;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1870,7 +1880,7 @@
       res
           .patch(arg_request, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -1881,8 +1891,9 @@
       var arg_id = 42;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1927,7 +1938,7 @@
       res
           .update(arg_request, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
   });
@@ -1982,7 +1993,7 @@
       res
           .get(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBillingInfo(response);
+        checkBillingInfo(response as api.BillingInfo);
       })));
     });
 
@@ -2029,7 +2040,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkBillingInfoList(response);
+        checkBillingInfoList(response as api.BillingInfoList);
       })));
     });
   });
@@ -2094,7 +2105,7 @@
       res
           .get(arg_accountId, arg_billingId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBudget(response);
+        checkBudget(response as api.Budget);
       })));
     });
 
@@ -2106,8 +2117,9 @@
       var arg_billingId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Budget.fromJson(json);
-        checkBudget(obj);
+        var obj =
+            api.Budget.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBudget(obj as api.Budget);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2162,7 +2174,7 @@
           .patch(arg_request, arg_accountId, arg_billingId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBudget(response);
+        checkBudget(response as api.Budget);
       })));
     });
 
@@ -2174,8 +2186,9 @@
       var arg_billingId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Budget.fromJson(json);
-        checkBudget(obj);
+        var obj =
+            api.Budget.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBudget(obj as api.Budget);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2230,7 +2243,7 @@
           .update(arg_request, arg_accountId, arg_billingId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBudget(response);
+        checkBudget(response as api.Budget);
       })));
     });
   });
@@ -2295,7 +2308,7 @@
       res
           .get(arg_accountId, arg_buyerCreativeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -2305,8 +2318,9 @@
       var arg_request = buildCreative();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Creative.fromJson(json);
-        checkCreative(obj);
+        var obj =
+            api.Creative.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCreative(obj as api.Creative);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2348,7 +2362,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -2418,7 +2432,7 @@
               statusFilter: arg_statusFilter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativesList(response);
+        checkCreativesList(response as api.CreativesList);
       })));
     });
   });
@@ -2473,7 +2487,7 @@
       res
           .get(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDirectDeal(response);
+        checkDirectDeal(response as api.DirectDeal);
       })));
     });
 
@@ -2520,7 +2534,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkDirectDealsList(response);
+        checkDirectDealsList(response as api.DirectDealsList);
       })));
     });
   });
@@ -2589,7 +2603,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPerformanceReportList(response);
+        checkPerformanceReportList(response as api.PerformanceReportList);
       })));
     });
   });
@@ -2715,7 +2729,7 @@
       res
           .get(arg_accountId, arg_configId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
 
@@ -2726,8 +2740,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PretargetingConfig.fromJson(json);
-        checkPretargetingConfig(obj);
+        var obj = api.PretargetingConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPretargetingConfig(obj as api.PretargetingConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2772,7 +2787,7 @@
       res
           .insert(arg_request, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
 
@@ -2825,7 +2840,7 @@
       res
           .list(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfigList(response);
+        checkPretargetingConfigList(response as api.PretargetingConfigList);
       })));
     });
 
@@ -2837,8 +2852,9 @@
       var arg_configId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PretargetingConfig.fromJson(json);
-        checkPretargetingConfig(obj);
+        var obj = api.PretargetingConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPretargetingConfig(obj as api.PretargetingConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2892,7 +2908,7 @@
       res
           .patch(arg_request, arg_accountId, arg_configId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
 
@@ -2904,8 +2920,9 @@
       var arg_configId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PretargetingConfig.fromJson(json);
-        checkPretargetingConfig(obj);
+        var obj = api.PretargetingConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPretargetingConfig(obj as api.PretargetingConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2960,7 +2977,7 @@
           .update(arg_request, arg_accountId, arg_configId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
   });
diff --git a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
index 882fbb1..a472abd 100644
--- a/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
+++ b/generated/googleapis/test/adexchangebuyer/v1_4_test.dart
@@ -108,8 +108,8 @@
 
 void checkUnnamed1951(core.List<api.AccountBidderLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountBidderLocation(o[0]);
-  checkAccountBidderLocation(o[1]);
+  checkAccountBidderLocation(o[0] as api.AccountBidderLocation);
+  checkAccountBidderLocation(o[1] as api.AccountBidderLocation);
 }
 
 core.int buildCounterAccount = 0;
@@ -156,8 +156,8 @@
 
 void checkUnnamed1952(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccountsList = 0;
@@ -190,8 +190,8 @@
 
 void checkUnnamed1953(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceDeal(o[0]);
-  checkMarketplaceDeal(o[1]);
+  checkMarketplaceDeal(o[0] as api.MarketplaceDeal);
+  checkMarketplaceDeal(o[1] as api.MarketplaceDeal);
 }
 
 core.int buildCounterAddOrderDealsRequest = 0;
@@ -226,8 +226,8 @@
 
 void checkUnnamed1954(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceDeal(o[0]);
-  checkMarketplaceDeal(o[1]);
+  checkMarketplaceDeal(o[0] as api.MarketplaceDeal);
+  checkMarketplaceDeal(o[1] as api.MarketplaceDeal);
 }
 
 core.int buildCounterAddOrderDealsResponse = 0;
@@ -260,8 +260,8 @@
 
 void checkUnnamed1955(core.List<api.MarketplaceNote> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceNote(o[0]);
-  checkMarketplaceNote(o[1]);
+  checkMarketplaceNote(o[0] as api.MarketplaceNote);
+  checkMarketplaceNote(o[1] as api.MarketplaceNote);
 }
 
 core.int buildCounterAddOrderNotesRequest = 0;
@@ -292,8 +292,8 @@
 
 void checkUnnamed1956(core.List<api.MarketplaceNote> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceNote(o[0]);
-  checkMarketplaceNote(o[1]);
+  checkMarketplaceNote(o[0] as api.MarketplaceNote);
+  checkMarketplaceNote(o[1] as api.MarketplaceNote);
 }
 
 core.int buildCounterAddOrderNotesResponse = 0;
@@ -362,8 +362,8 @@
 
 void checkUnnamed1958(core.List<api.BillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBillingInfo(o[0]);
-  checkBillingInfo(o[1]);
+  checkBillingInfo(o[0] as api.BillingInfo);
+  checkBillingInfo(o[1] as api.BillingInfo);
 }
 
 core.int buildCounterBillingInfoList = 0;
@@ -465,8 +465,8 @@
 
 void checkUnnamed1959(core.List<api.Proposal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProposal(o[0]);
-  checkProposal(o[1]);
+  checkProposal(o[0] as api.Proposal);
+  checkProposal(o[1] as api.Proposal);
 }
 
 core.int buildCounterCreateOrdersRequest = 0;
@@ -499,8 +499,8 @@
 
 void checkUnnamed1960(core.List<api.Proposal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProposal(o[0]);
-  checkProposal(o[1]);
+  checkProposal(o[0] as api.Proposal);
+  checkProposal(o[1] as api.Proposal);
 }
 
 core.int buildCounterCreateOrdersResponse = 0;
@@ -668,8 +668,8 @@
 
 void checkUnnamed1968(core.List<api.CreativeCorrectionsContexts> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCorrectionsContexts(o[0]);
-  checkCreativeCorrectionsContexts(o[1]);
+  checkCreativeCorrectionsContexts(o[0] as api.CreativeCorrectionsContexts);
+  checkCreativeCorrectionsContexts(o[1] as api.CreativeCorrectionsContexts);
 }
 
 core.List<core.String> buildUnnamed1969() {
@@ -717,8 +717,8 @@
 
 void checkUnnamed1970(core.List<api.CreativeCorrections> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCorrections(o[0]);
-  checkCreativeCorrections(o[1]);
+  checkCreativeCorrections(o[0] as api.CreativeCorrections);
+  checkCreativeCorrections(o[1] as api.CreativeCorrections);
 }
 
 core.List<core.String> buildUnnamed1971() {
@@ -765,8 +765,10 @@
 
 void checkUnnamed1972(core.List<api.CreativeFilteringReasonsReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeFilteringReasonsReasons(o[0]);
-  checkCreativeFilteringReasonsReasons(o[1]);
+  checkCreativeFilteringReasonsReasons(
+      o[0] as api.CreativeFilteringReasonsReasons);
+  checkCreativeFilteringReasonsReasons(
+      o[1] as api.CreativeFilteringReasonsReasons);
 }
 
 core.int buildCounterCreativeFilteringReasons = 0;
@@ -925,15 +927,15 @@
   buildCounterCreativeNativeAd++;
   if (buildCounterCreativeNativeAd < 3) {
     unittest.expect(o.advertiser, unittest.equals('foo'));
-    checkCreativeNativeAdAppIcon(o.appIcon);
+    checkCreativeNativeAdAppIcon(o.appIcon as api.CreativeNativeAdAppIcon);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.callToAction, unittest.equals('foo'));
     unittest.expect(o.clickLinkUrl, unittest.equals('foo'));
     unittest.expect(o.clickTrackingUrl, unittest.equals('foo'));
     unittest.expect(o.headline, unittest.equals('foo'));
-    checkCreativeNativeAdImage(o.image);
+    checkCreativeNativeAdImage(o.image as api.CreativeNativeAdImage);
     checkUnnamed1975(o.impressionTrackingUrl);
-    checkCreativeNativeAdLogo(o.logo);
+    checkCreativeNativeAdLogo(o.logo as api.CreativeNativeAdLogo);
     unittest.expect(o.price, unittest.equals('foo'));
     unittest.expect(o.starRating, unittest.equals(42.0));
     unittest.expect(o.videoURL, unittest.equals('foo'));
@@ -1055,8 +1057,10 @@
 
 void checkUnnamed1982(core.List<api.CreativeServingRestrictionsContexts> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeServingRestrictionsContexts(o[0]);
-  checkCreativeServingRestrictionsContexts(o[1]);
+  checkCreativeServingRestrictionsContexts(
+      o[0] as api.CreativeServingRestrictionsContexts);
+  checkCreativeServingRestrictionsContexts(
+      o[1] as api.CreativeServingRestrictionsContexts);
 }
 
 core.List<core.String> buildUnnamed1983() {
@@ -1106,8 +1110,10 @@
 void checkUnnamed1984(
     core.List<api.CreativeServingRestrictionsDisapprovalReasons> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeServingRestrictionsDisapprovalReasons(o[0]);
-  checkCreativeServingRestrictionsDisapprovalReasons(o[1]);
+  checkCreativeServingRestrictionsDisapprovalReasons(
+      o[0] as api.CreativeServingRestrictionsDisapprovalReasons);
+  checkCreativeServingRestrictionsDisapprovalReasons(
+      o[1] as api.CreativeServingRestrictionsDisapprovalReasons);
 }
 
 core.int buildCounterCreativeServingRestrictions = 0;
@@ -1142,8 +1148,8 @@
 
 void checkUnnamed1985(core.List<api.CreativeServingRestrictions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeServingRestrictions(o[0]);
-  checkCreativeServingRestrictions(o[1]);
+  checkCreativeServingRestrictions(o[0] as api.CreativeServingRestrictions);
+  checkCreativeServingRestrictions(o[1] as api.CreativeServingRestrictions);
 }
 
 core.List<core.int> buildUnnamed1986() {
@@ -1206,7 +1212,8 @@
     unittest.expect(o.HTMLSnippet, unittest.equals('foo'));
     unittest.expect(o.accountId, unittest.equals(42));
     unittest.expect(o.adChoicesDestinationUrl, unittest.equals('foo'));
-    checkCreativeAdTechnologyProviders(o.adTechnologyProviders);
+    checkCreativeAdTechnologyProviders(
+        o.adTechnologyProviders as api.CreativeAdTechnologyProviders);
     checkUnnamed1962(o.advertiserId);
     unittest.expect(o.advertiserName, unittest.equals('foo'));
     unittest.expect(o.agencyId, unittest.equals('foo'));
@@ -1219,12 +1226,13 @@
     unittest.expect(o.creativeStatusIdentityType, unittest.equals('foo'));
     unittest.expect(o.dealsStatus, unittest.equals('foo'));
     checkUnnamed1971(o.detectedDomains);
-    checkCreativeFilteringReasons(o.filteringReasons);
+    checkCreativeFilteringReasons(
+        o.filteringReasons as api.CreativeFilteringReasons);
     unittest.expect(o.height, unittest.equals(42));
     checkUnnamed1973(o.impressionTrackingUrl);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed1974(o.languages);
-    checkCreativeNativeAd(o.nativeAd);
+    checkCreativeNativeAd(o.nativeAd as api.CreativeNativeAd);
     unittest.expect(o.openAuctionStatus, unittest.equals('foo'));
     checkUnnamed1976(o.productCategories);
     checkUnnamed1977(o.restrictedCategories);
@@ -1271,8 +1279,8 @@
 
 void checkUnnamed1987(core.List<api.CreativeDealIdsDealStatuses> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeDealIdsDealStatuses(o[0]);
-  checkCreativeDealIdsDealStatuses(o[1]);
+  checkCreativeDealIdsDealStatuses(o[0] as api.CreativeDealIdsDealStatuses);
+  checkCreativeDealIdsDealStatuses(o[1] as api.CreativeDealIdsDealStatuses);
 }
 
 core.int buildCounterCreativeDealIds = 0;
@@ -1305,8 +1313,8 @@
 
 void checkUnnamed1988(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreative(o[0]);
-  checkCreative(o[1]);
+  checkCreative(o[0] as api.Creative);
+  checkCreative(o[1] as api.Creative);
 }
 
 core.int buildCounterCreativesList = 0;
@@ -1348,7 +1356,8 @@
   buildCounterDealServingMetadata++;
   if (buildCounterDealServingMetadata < 3) {
     unittest.expect(o.alcoholAdsAllowed, unittest.isTrue);
-    checkDealServingMetadataDealPauseStatus(o.dealPauseStatus);
+    checkDealServingMetadataDealPauseStatus(
+        o.dealPauseStatus as api.DealServingMetadataDealPauseStatus);
   }
   buildCounterDealServingMetadata--;
 }
@@ -1409,12 +1418,16 @@
     unittest.expect(o.brandingType, unittest.equals('foo'));
     unittest.expect(o.crossListedExternalDealIdType, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkPrice(o.estimatedGrossSpend);
+    checkPrice(o.estimatedGrossSpend as api.Price);
     unittest.expect(o.estimatedImpressionsPerDay, unittest.equals('foo'));
-    checkDealTermsGuaranteedFixedPriceTerms(o.guaranteedFixedPriceTerms);
-    checkDealTermsNonGuaranteedAuctionTerms(o.nonGuaranteedAuctionTerms);
-    checkDealTermsNonGuaranteedFixedPriceTerms(o.nonGuaranteedFixedPriceTerms);
-    checkDealTermsRubiconNonGuaranteedTerms(o.rubiconNonGuaranteedTerms);
+    checkDealTermsGuaranteedFixedPriceTerms(
+        o.guaranteedFixedPriceTerms as api.DealTermsGuaranteedFixedPriceTerms);
+    checkDealTermsNonGuaranteedAuctionTerms(
+        o.nonGuaranteedAuctionTerms as api.DealTermsNonGuaranteedAuctionTerms);
+    checkDealTermsNonGuaranteedFixedPriceTerms(o.nonGuaranteedFixedPriceTerms
+        as api.DealTermsNonGuaranteedFixedPriceTerms);
+    checkDealTermsRubiconNonGuaranteedTerms(
+        o.rubiconNonGuaranteedTerms as api.DealTermsRubiconNonGuaranteedTerms);
     unittest.expect(o.sellerTimeZone, unittest.equals('foo'));
   }
   buildCounterDealTerms--;
@@ -1429,8 +1442,8 @@
 
 void checkUnnamed1989(core.List<api.PricePerBuyer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPricePerBuyer(o[0]);
-  checkPricePerBuyer(o[1]);
+  checkPricePerBuyer(o[0] as api.PricePerBuyer);
+  checkPricePerBuyer(o[1] as api.PricePerBuyer);
 }
 
 core.int buildCounterDealTermsGuaranteedFixedPriceTerms = 0;
@@ -1453,7 +1466,8 @@
     api.DealTermsGuaranteedFixedPriceTerms o) {
   buildCounterDealTermsGuaranteedFixedPriceTerms++;
   if (buildCounterDealTermsGuaranteedFixedPriceTerms < 3) {
-    checkDealTermsGuaranteedFixedPriceTermsBillingInfo(o.billingInfo);
+    checkDealTermsGuaranteedFixedPriceTermsBillingInfo(
+        o.billingInfo as api.DealTermsGuaranteedFixedPriceTermsBillingInfo);
     checkUnnamed1989(o.fixedPrices);
     unittest.expect(o.guaranteedImpressions, unittest.equals('foo'));
     unittest.expect(o.guaranteedLooks, unittest.equals('foo'));
@@ -1484,7 +1498,7 @@
     unittest.expect(o.currencyConversionTimeMs, unittest.equals('foo'));
     unittest.expect(o.dfpLineItemId, unittest.equals('foo'));
     unittest.expect(o.originalContractedQuantity, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
   }
   buildCounterDealTermsGuaranteedFixedPriceTermsBillingInfo--;
 }
@@ -1498,8 +1512,8 @@
 
 void checkUnnamed1990(core.List<api.PricePerBuyer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPricePerBuyer(o[0]);
-  checkPricePerBuyer(o[1]);
+  checkPricePerBuyer(o[0] as api.PricePerBuyer);
+  checkPricePerBuyer(o[1] as api.PricePerBuyer);
 }
 
 core.int buildCounterDealTermsNonGuaranteedAuctionTerms = 0;
@@ -1534,8 +1548,8 @@
 
 void checkUnnamed1991(core.List<api.PricePerBuyer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPricePerBuyer(o[0]);
-  checkPricePerBuyer(o[1]);
+  checkPricePerBuyer(o[0] as api.PricePerBuyer);
+  checkPricePerBuyer(o[1] as api.PricePerBuyer);
 }
 
 core.int buildCounterDealTermsNonGuaranteedFixedPriceTerms = 0;
@@ -1576,8 +1590,8 @@
     api.DealTermsRubiconNonGuaranteedTerms o) {
   buildCounterDealTermsRubiconNonGuaranteedTerms++;
   if (buildCounterDealTermsRubiconNonGuaranteedTerms < 3) {
-    checkPrice(o.priorityPrice);
-    checkPrice(o.standardPrice);
+    checkPrice(o.priorityPrice as api.Price);
+    checkPrice(o.standardPrice as api.Price);
   }
   buildCounterDealTermsRubiconNonGuaranteedTerms--;
 }
@@ -1627,8 +1641,8 @@
 
 void checkUnnamed1993(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceDeal(o[0]);
-  checkMarketplaceDeal(o[1]);
+  checkMarketplaceDeal(o[0] as api.MarketplaceDeal);
+  checkMarketplaceDeal(o[1] as api.MarketplaceDeal);
 }
 
 core.int buildCounterDeleteOrderDealsResponse = 0;
@@ -1661,8 +1675,8 @@
 
 void checkUnnamed1994(core.List<api.DeliveryControlFrequencyCap> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeliveryControlFrequencyCap(o[0]);
-  checkDeliveryControlFrequencyCap(o[1]);
+  checkDeliveryControlFrequencyCap(o[0] as api.DeliveryControlFrequencyCap);
+  checkDeliveryControlFrequencyCap(o[1] as api.DeliveryControlFrequencyCap);
 }
 
 core.int buildCounterDeliveryControl = 0;
@@ -1720,8 +1734,8 @@
 
 void checkUnnamed1995(core.List<api.DimensionDimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionDimensionValue(o[0]);
-  checkDimensionDimensionValue(o[1]);
+  checkDimensionDimensionValue(o[0] as api.DimensionDimensionValue);
+  checkDimensionDimensionValue(o[1] as api.DimensionDimensionValue);
 }
 
 core.int buildCounterDimension = 0;
@@ -1777,8 +1791,8 @@
 
 void checkUnnamed1996(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceDeal(o[0]);
-  checkMarketplaceDeal(o[1]);
+  checkMarketplaceDeal(o[0] as api.MarketplaceDeal);
+  checkMarketplaceDeal(o[1] as api.MarketplaceDeal);
 }
 
 core.int buildCounterEditAllOrderDealsRequest = 0;
@@ -1799,7 +1813,7 @@
   buildCounterEditAllOrderDealsRequest++;
   if (buildCounterEditAllOrderDealsRequest < 3) {
     checkUnnamed1996(o.deals);
-    checkProposal(o.proposal);
+    checkProposal(o.proposal as api.Proposal);
     unittest.expect(o.proposalRevisionNumber, unittest.equals('foo'));
     unittest.expect(o.updateAction, unittest.equals('foo'));
   }
@@ -1815,8 +1829,8 @@
 
 void checkUnnamed1997(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceDeal(o[0]);
-  checkMarketplaceDeal(o[1]);
+  checkMarketplaceDeal(o[0] as api.MarketplaceDeal);
+  checkMarketplaceDeal(o[1] as api.MarketplaceDeal);
 }
 
 core.int buildCounterEditAllOrderDealsResponse = 0;
@@ -1849,8 +1863,8 @@
 
 void checkUnnamed1998(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProduct(o[0]);
-  checkProduct(o[1]);
+  checkProduct(o[0] as api.Product);
+  checkProduct(o[1] as api.Product);
 }
 
 core.int buildCounterGetOffersResponse = 0;
@@ -1881,8 +1895,8 @@
 
 void checkUnnamed1999(core.List<api.MarketplaceDeal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceDeal(o[0]);
-  checkMarketplaceDeal(o[1]);
+  checkMarketplaceDeal(o[0] as api.MarketplaceDeal);
+  checkMarketplaceDeal(o[1] as api.MarketplaceDeal);
 }
 
 core.int buildCounterGetOrderDealsResponse = 0;
@@ -1913,8 +1927,8 @@
 
 void checkUnnamed2000(core.List<api.MarketplaceNote> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceNote(o[0]);
-  checkMarketplaceNote(o[1]);
+  checkMarketplaceNote(o[0] as api.MarketplaceNote);
+  checkMarketplaceNote(o[1] as api.MarketplaceNote);
 }
 
 core.int buildCounterGetOrderNotesResponse = 0;
@@ -1945,8 +1959,8 @@
 
 void checkUnnamed2001(core.List<api.Proposal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProposal(o[0]);
-  checkProposal(o[1]);
+  checkProposal(o[0] as api.Proposal);
+  checkProposal(o[1] as api.Proposal);
 }
 
 core.int buildCounterGetOrdersResponse = 0;
@@ -1977,8 +1991,8 @@
 
 void checkUnnamed2002(core.List<api.PublisherProfileApiProto> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPublisherProfileApiProto(o[0]);
-  checkPublisherProfileApiProto(o[1]);
+  checkPublisherProfileApiProto(o[0] as api.PublisherProfileApiProto);
+  checkPublisherProfileApiProto(o[1] as api.PublisherProfileApiProto);
 }
 
 core.int buildCounterGetPublisherProfilesByAccountIdResponse = 0;
@@ -2011,8 +2025,8 @@
 
 void checkUnnamed2003(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContactInformation(o[0]);
-  checkContactInformation(o[1]);
+  checkContactInformation(o[0] as api.ContactInformation);
+  checkContactInformation(o[1] as api.ContactInformation);
 }
 
 core.List<api.SharedTargeting> buildUnnamed2004() {
@@ -2024,8 +2038,8 @@
 
 void checkUnnamed2004(core.List<api.SharedTargeting> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSharedTargeting(o[0]);
-  checkSharedTargeting(o[1]);
+  checkSharedTargeting(o[0] as api.SharedTargeting);
+  checkSharedTargeting(o[1] as api.SharedTargeting);
 }
 
 core.int buildCounterMarketplaceDeal = 0;
@@ -2067,13 +2081,13 @@
 void checkMarketplaceDeal(api.MarketplaceDeal o) {
   buildCounterMarketplaceDeal++;
   if (buildCounterMarketplaceDeal < 3) {
-    checkPrivateData(o.buyerPrivateData);
+    checkPrivateData(o.buyerPrivateData as api.PrivateData);
     unittest.expect(o.creationTimeMs, unittest.equals('foo'));
     unittest.expect(o.creativePreApprovalPolicy, unittest.equals('foo'));
     unittest.expect(o.creativeSafeFrameCompatibility, unittest.equals('foo'));
     unittest.expect(o.dealId, unittest.equals('foo'));
-    checkDealServingMetadata(o.dealServingMetadata);
-    checkDeliveryControl(o.deliveryControl);
+    checkDealServingMetadata(o.dealServingMetadata as api.DealServingMetadata);
+    checkDeliveryControl(o.deliveryControl as api.DeliveryControl);
     unittest.expect(o.externalDealId, unittest.equals('foo'));
     unittest.expect(o.flightEndTimeMs, unittest.equals('foo'));
     unittest.expect(o.flightStartTimeMs, unittest.equals('foo'));
@@ -2091,7 +2105,7 @@
     checkUnnamed2003(o.sellerContacts);
     checkUnnamed2004(o.sharedTargetings);
     unittest.expect(o.syndicationProduct, unittest.equals('foo'));
-    checkDealTerms(o.terms);
+    checkDealTerms(o.terms as api.DealTerms);
     unittest.expect(o.webPropertyCode, unittest.equals('foo'));
   }
   buildCounterMarketplaceDeal--;
@@ -2112,8 +2126,8 @@
 void checkMarketplaceDealParty(api.MarketplaceDealParty o) {
   buildCounterMarketplaceDealParty++;
   if (buildCounterMarketplaceDealParty < 3) {
-    checkBuyer(o.buyer);
-    checkSeller(o.seller);
+    checkBuyer(o.buyer as api.Buyer);
+    checkSeller(o.seller as api.Seller);
   }
   buildCounterMarketplaceDealParty--;
 }
@@ -2137,7 +2151,8 @@
   if (buildCounterMarketplaceLabel < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.createTimeMs, unittest.equals('foo'));
-    checkMarketplaceDealParty(o.deprecatedMarketplaceDealParty);
+    checkMarketplaceDealParty(
+        o.deprecatedMarketplaceDealParty as api.MarketplaceDealParty);
     unittest.expect(o.label, unittest.equals('foo'));
   }
   buildCounterMarketplaceLabel--;
@@ -2383,8 +2398,8 @@
 
 void checkUnnamed2009(core.List<api.PerformanceReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerformanceReport(o[0]);
-  checkPerformanceReport(o[1]);
+  checkPerformanceReport(o[0] as api.PerformanceReport);
+  checkPerformanceReport(o[1] as api.PerformanceReport);
 }
 
 core.int buildCounterPerformanceReportList = 0;
@@ -2451,8 +2466,8 @@
 
 void checkUnnamed2011(core.List<api.PretargetingConfigDimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigDimensions(o[0]);
-  checkPretargetingConfigDimensions(o[1]);
+  checkPretargetingConfigDimensions(o[0] as api.PretargetingConfigDimensions);
+  checkPretargetingConfigDimensions(o[1] as api.PretargetingConfigDimensions);
 }
 
 core.List<core.String> buildUnnamed2012() {
@@ -2513,8 +2528,10 @@
 
 void checkUnnamed2014(core.List<api.PretargetingConfigExcludedPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigExcludedPlacements(o[0]);
-  checkPretargetingConfigExcludedPlacements(o[1]);
+  checkPretargetingConfigExcludedPlacements(
+      o[0] as api.PretargetingConfigExcludedPlacements);
+  checkPretargetingConfigExcludedPlacements(
+      o[1] as api.PretargetingConfigExcludedPlacements);
 }
 
 core.List<core.String> buildUnnamed2015() {
@@ -2638,8 +2655,8 @@
 
 void checkUnnamed2022(core.List<api.PretargetingConfigPlacements> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigPlacements(o[0]);
-  checkPretargetingConfigPlacements(o[1]);
+  checkPretargetingConfigPlacements(o[0] as api.PretargetingConfigPlacements);
+  checkPretargetingConfigPlacements(o[1] as api.PretargetingConfigPlacements);
 }
 
 core.List<core.String> buildUnnamed2023() {
@@ -2754,8 +2771,10 @@
 
 void checkUnnamed2029(core.List<api.PretargetingConfigVideoPlayerSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfigVideoPlayerSizes(o[0]);
-  checkPretargetingConfigVideoPlayerSizes(o[1]);
+  checkPretargetingConfigVideoPlayerSizes(
+      o[0] as api.PretargetingConfigVideoPlayerSizes);
+  checkPretargetingConfigVideoPlayerSizes(
+      o[1] as api.PretargetingConfigVideoPlayerSizes);
 }
 
 core.int buildCounterPretargetingConfig = 0;
@@ -2838,8 +2857,8 @@
 
 void checkUnnamed2030(core.List<api.PretargetingConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPretargetingConfig(o[0]);
-  checkPretargetingConfig(o[1]);
+  checkPretargetingConfig(o[0] as api.PretargetingConfig);
+  checkPretargetingConfig(o[1] as api.PretargetingConfig);
 }
 
 core.int buildCounterPretargetingConfigList = 0;
@@ -2906,9 +2925,9 @@
   buildCounterPricePerBuyer++;
   if (buildCounterPricePerBuyer < 3) {
     unittest.expect(o.auctionTier, unittest.equals('foo'));
-    checkBuyer(o.billedBuyer);
-    checkBuyer(o.buyer);
-    checkPrice(o.price);
+    checkBuyer(o.billedBuyer as api.Buyer);
+    checkBuyer(o.buyer as api.Buyer);
+    checkPrice(o.price as api.Price);
   }
   buildCounterPricePerBuyer--;
 }
@@ -2943,8 +2962,8 @@
 
 void checkUnnamed2031(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContactInformation(o[0]);
-  checkContactInformation(o[1]);
+  checkContactInformation(o[0] as api.ContactInformation);
+  checkContactInformation(o[1] as api.ContactInformation);
 }
 
 core.List<api.MarketplaceLabel> buildUnnamed2032() {
@@ -2956,8 +2975,8 @@
 
 void checkUnnamed2032(core.List<api.MarketplaceLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceLabel(o[0]);
-  checkMarketplaceLabel(o[1]);
+  checkMarketplaceLabel(o[0] as api.MarketplaceLabel);
+  checkMarketplaceLabel(o[1] as api.MarketplaceLabel);
 }
 
 core.List<api.SharedTargeting> buildUnnamed2033() {
@@ -2969,8 +2988,8 @@
 
 void checkUnnamed2033(core.List<api.SharedTargeting> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSharedTargeting(o[0]);
-  checkSharedTargeting(o[1]);
+  checkSharedTargeting(o[0] as api.SharedTargeting);
+  checkSharedTargeting(o[1] as api.SharedTargeting);
 }
 
 core.int buildCounterProduct = 0;
@@ -3013,12 +3032,12 @@
 void checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkBuyer(o.billedBuyer);
-    checkBuyer(o.buyer);
+    checkBuyer(o.billedBuyer as api.Buyer);
+    checkBuyer(o.buyer as api.Buyer);
     unittest.expect(o.creationTimeMs, unittest.equals('foo'));
     checkUnnamed2031(o.creatorContacts);
     unittest.expect(o.creatorRole, unittest.equals('foo'));
-    checkDeliveryControl(o.deliveryControl);
+    checkDeliveryControl(o.deliveryControl as api.DeliveryControl);
     unittest.expect(o.flightEndTimeMs, unittest.equals('foo'));
     unittest.expect(o.flightStartTimeMs, unittest.equals('foo'));
     unittest.expect(o.hasCreatorSignedOff, unittest.isTrue);
@@ -3032,13 +3051,14 @@
     unittest.expect(o.privateAuctionId, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.publisherProfileId, unittest.equals('foo'));
-    checkPublisherProvidedForecast(o.publisherProvidedForecast);
+    checkPublisherProvidedForecast(
+        o.publisherProvidedForecast as api.PublisherProvidedForecast);
     unittest.expect(o.revisionNumber, unittest.equals('foo'));
-    checkSeller(o.seller);
+    checkSeller(o.seller as api.Seller);
     checkUnnamed2033(o.sharedTargetings);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.syndicationProduct, unittest.equals('foo'));
-    checkDealTerms(o.terms);
+    checkDealTerms(o.terms as api.DealTerms);
     unittest.expect(o.webPropertyCode, unittest.equals('foo'));
   }
   buildCounterProduct--;
@@ -3053,8 +3073,8 @@
 
 void checkUnnamed2034(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContactInformation(o[0]);
-  checkContactInformation(o[1]);
+  checkContactInformation(o[0] as api.ContactInformation);
+  checkContactInformation(o[1] as api.ContactInformation);
 }
 
 core.List<core.String> buildUnnamed2035() {
@@ -3079,8 +3099,8 @@
 
 void checkUnnamed2036(core.List<api.MarketplaceLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMarketplaceLabel(o[0]);
-  checkMarketplaceLabel(o[1]);
+  checkMarketplaceLabel(o[0] as api.MarketplaceLabel);
+  checkMarketplaceLabel(o[1] as api.MarketplaceLabel);
 }
 
 core.List<api.ContactInformation> buildUnnamed2037() {
@@ -3092,8 +3112,8 @@
 
 void checkUnnamed2037(core.List<api.ContactInformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContactInformation(o[0]);
-  checkContactInformation(o[1]);
+  checkContactInformation(o[0] as api.ContactInformation);
+  checkContactInformation(o[1] as api.ContactInformation);
 }
 
 core.int buildCounterProposal = 0;
@@ -3132,10 +3152,10 @@
 void checkProposal(api.Proposal o) {
   buildCounterProposal++;
   if (buildCounterProposal < 3) {
-    checkBuyer(o.billedBuyer);
-    checkBuyer(o.buyer);
+    checkBuyer(o.billedBuyer as api.Buyer);
+    checkBuyer(o.buyer as api.Buyer);
     checkUnnamed2034(o.buyerContacts);
-    checkPrivateData(o.buyerPrivateData);
+    checkPrivateData(o.buyerPrivateData as api.PrivateData);
     checkUnnamed2035(o.dbmAdvertiserIds);
     unittest.expect(o.hasBuyerSignedOff, unittest.isTrue);
     unittest.expect(o.hasSellerSignedOff, unittest.isTrue);
@@ -3153,7 +3173,7 @@
     unittest.expect(o.proposalState, unittest.equals('foo'));
     unittest.expect(o.revisionNumber, unittest.equals('foo'));
     unittest.expect(o.revisionTimeMs, unittest.equals('foo'));
-    checkSeller(o.seller);
+    checkSeller(o.seller as api.Seller);
     checkUnnamed2037(o.sellerContacts);
   }
   buildCounterProposal--;
@@ -3181,8 +3201,8 @@
 
 void checkUnnamed2039(core.List<api.MobileApplication> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMobileApplication(o[0]);
-  checkMobileApplication(o[1]);
+  checkMobileApplication(o[0] as api.MobileApplication);
+  checkMobileApplication(o[1] as api.MobileApplication);
 }
 
 core.List<core.String> buildUnnamed2040() {
@@ -3266,10 +3286,11 @@
     checkUnnamed2039(o.publisherApps);
     checkUnnamed2040(o.publisherDomains);
     unittest.expect(o.publisherProfileId, unittest.equals('foo'));
-    checkPublisherProvidedForecast(o.publisherProvidedForecast);
+    checkPublisherProvidedForecast(
+        o.publisherProvidedForecast as api.PublisherProvidedForecast);
     unittest.expect(o.rateCardInfoLink, unittest.equals('foo'));
     unittest.expect(o.samplePageLink, unittest.equals('foo'));
-    checkSeller(o.seller);
+    checkSeller(o.seller as api.Seller);
     unittest.expect(o.state, unittest.equals('foo'));
     checkUnnamed2041(o.topHeadlines);
   }
@@ -3285,8 +3306,8 @@
 
 void checkUnnamed2042(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.int buildCounterPublisherProvidedForecast = 0;
@@ -3342,8 +3363,8 @@
 
 void checkUnnamed2043(core.List<api.TargetingValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetingValue(o[0]);
-  checkTargetingValue(o[1]);
+  checkTargetingValue(o[0] as api.TargetingValue);
+  checkTargetingValue(o[1] as api.TargetingValue);
 }
 
 core.List<api.TargetingValue> buildUnnamed2044() {
@@ -3355,8 +3376,8 @@
 
 void checkUnnamed2044(core.List<api.TargetingValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetingValue(o[0]);
-  checkTargetingValue(o[1]);
+  checkTargetingValue(o[0] as api.TargetingValue);
+  checkTargetingValue(o[1] as api.TargetingValue);
 }
 
 core.int buildCounterSharedTargeting = 0;
@@ -3403,13 +3424,17 @@
 void checkTargetingValue(api.TargetingValue o) {
   buildCounterTargetingValue++;
   if (buildCounterTargetingValue < 3) {
-    checkTargetingValueCreativeSize(o.creativeSizeValue);
-    checkTargetingValueDayPartTargeting(o.dayPartTargetingValue);
-    checkTargetingValueDemogAgeCriteria(o.demogAgeCriteriaValue);
-    checkTargetingValueDemogGenderCriteria(o.demogGenderCriteriaValue);
+    checkTargetingValueCreativeSize(
+        o.creativeSizeValue as api.TargetingValueCreativeSize);
+    checkTargetingValueDayPartTargeting(
+        o.dayPartTargetingValue as api.TargetingValueDayPartTargeting);
+    checkTargetingValueDemogAgeCriteria(
+        o.demogAgeCriteriaValue as api.TargetingValueDemogAgeCriteria);
+    checkTargetingValueDemogGenderCriteria(
+        o.demogGenderCriteriaValue as api.TargetingValueDemogGenderCriteria);
     unittest.expect(o.longValue, unittest.equals('foo'));
-    checkTargetingValueRequestPlatformTargeting(
-        o.requestPlatformTargetingValue);
+    checkTargetingValueRequestPlatformTargeting(o.requestPlatformTargetingValue
+        as api.TargetingValueRequestPlatformTargeting);
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
   buildCounterTargetingValue--;
@@ -3437,8 +3462,8 @@
 
 void checkUnnamed2046(core.List<api.TargetingValueSize> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetingValueSize(o[0]);
-  checkTargetingValueSize(o[1]);
+  checkTargetingValueSize(o[0] as api.TargetingValueSize);
+  checkTargetingValueSize(o[1] as api.TargetingValueSize);
 }
 
 core.int buildCounterTargetingValueCreativeSize = 0;
@@ -3464,7 +3489,7 @@
     checkUnnamed2046(o.companionSizes);
     unittest.expect(o.creativeSizeType, unittest.equals('foo'));
     unittest.expect(o.nativeTemplate, unittest.equals('foo'));
-    checkTargetingValueSize(o.size);
+    checkTargetingValueSize(o.size as api.TargetingValueSize);
     unittest.expect(o.skippableAdType, unittest.equals('foo'));
   }
   buildCounterTargetingValueCreativeSize--;
@@ -3479,8 +3504,10 @@
 
 void checkUnnamed2047(core.List<api.TargetingValueDayPartTargetingDayPart> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetingValueDayPartTargetingDayPart(o[0]);
-  checkTargetingValueDayPartTargetingDayPart(o[1]);
+  checkTargetingValueDayPartTargetingDayPart(
+      o[0] as api.TargetingValueDayPartTargetingDayPart);
+  checkTargetingValueDayPartTargetingDayPart(
+      o[1] as api.TargetingValueDayPartTargetingDayPart);
 }
 
 core.int buildCounterTargetingValueDayPartTargeting = 0;
@@ -3673,7 +3700,7 @@
   buildCounterUpdatePrivateAuctionProposalRequest++;
   if (buildCounterUpdatePrivateAuctionProposalRequest < 3) {
     unittest.expect(o.externalDealId, unittest.equals('foo'));
-    checkMarketplaceNote(o.note);
+    checkMarketplaceNote(o.note as api.MarketplaceNote);
     unittest.expect(o.proposalRevisionNumber, unittest.equals('foo'));
     unittest.expect(o.updateAction, unittest.equals('foo'));
   }
@@ -3711,7 +3738,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountBidderLocation();
       var od = api.AccountBidderLocation.fromJson(o.toJson());
-      checkAccountBidderLocation(od);
+      checkAccountBidderLocation(od as api.AccountBidderLocation);
     });
   });
 
@@ -3719,7 +3746,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -3727,7 +3754,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsList();
       var od = api.AccountsList.fromJson(o.toJson());
-      checkAccountsList(od);
+      checkAccountsList(od as api.AccountsList);
     });
   });
 
@@ -3735,7 +3762,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddOrderDealsRequest();
       var od = api.AddOrderDealsRequest.fromJson(o.toJson());
-      checkAddOrderDealsRequest(od);
+      checkAddOrderDealsRequest(od as api.AddOrderDealsRequest);
     });
   });
 
@@ -3743,7 +3770,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddOrderDealsResponse();
       var od = api.AddOrderDealsResponse.fromJson(o.toJson());
-      checkAddOrderDealsResponse(od);
+      checkAddOrderDealsResponse(od as api.AddOrderDealsResponse);
     });
   });
 
@@ -3751,7 +3778,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddOrderNotesRequest();
       var od = api.AddOrderNotesRequest.fromJson(o.toJson());
-      checkAddOrderNotesRequest(od);
+      checkAddOrderNotesRequest(od as api.AddOrderNotesRequest);
     });
   });
 
@@ -3759,7 +3786,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddOrderNotesResponse();
       var od = api.AddOrderNotesResponse.fromJson(o.toJson());
-      checkAddOrderNotesResponse(od);
+      checkAddOrderNotesResponse(od as api.AddOrderNotesResponse);
     });
   });
 
@@ -3767,7 +3794,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingInfo();
       var od = api.BillingInfo.fromJson(o.toJson());
-      checkBillingInfo(od);
+      checkBillingInfo(od as api.BillingInfo);
     });
   });
 
@@ -3775,7 +3802,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingInfoList();
       var od = api.BillingInfoList.fromJson(o.toJson());
-      checkBillingInfoList(od);
+      checkBillingInfoList(od as api.BillingInfoList);
     });
   });
 
@@ -3783,7 +3810,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBudget();
       var od = api.Budget.fromJson(o.toJson());
-      checkBudget(od);
+      checkBudget(od as api.Budget);
     });
   });
 
@@ -3791,7 +3818,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuyer();
       var od = api.Buyer.fromJson(o.toJson());
-      checkBuyer(od);
+      checkBuyer(od as api.Buyer);
     });
   });
 
@@ -3799,7 +3826,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContactInformation();
       var od = api.ContactInformation.fromJson(o.toJson());
-      checkContactInformation(od);
+      checkContactInformation(od as api.ContactInformation);
     });
   });
 
@@ -3807,7 +3834,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateOrdersRequest();
       var od = api.CreateOrdersRequest.fromJson(o.toJson());
-      checkCreateOrdersRequest(od);
+      checkCreateOrdersRequest(od as api.CreateOrdersRequest);
     });
   });
 
@@ -3815,7 +3842,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateOrdersResponse();
       var od = api.CreateOrdersResponse.fromJson(o.toJson());
-      checkCreateOrdersResponse(od);
+      checkCreateOrdersResponse(od as api.CreateOrdersResponse);
     });
   });
 
@@ -3823,7 +3850,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeAdTechnologyProviders();
       var od = api.CreativeAdTechnologyProviders.fromJson(o.toJson());
-      checkCreativeAdTechnologyProviders(od);
+      checkCreativeAdTechnologyProviders(
+          od as api.CreativeAdTechnologyProviders);
     });
   });
 
@@ -3831,7 +3859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeCorrectionsContexts();
       var od = api.CreativeCorrectionsContexts.fromJson(o.toJson());
-      checkCreativeCorrectionsContexts(od);
+      checkCreativeCorrectionsContexts(od as api.CreativeCorrectionsContexts);
     });
   });
 
@@ -3839,7 +3867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeCorrections();
       var od = api.CreativeCorrections.fromJson(o.toJson());
-      checkCreativeCorrections(od);
+      checkCreativeCorrections(od as api.CreativeCorrections);
     });
   });
 
@@ -3847,7 +3875,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFilteringReasonsReasons();
       var od = api.CreativeFilteringReasonsReasons.fromJson(o.toJson());
-      checkCreativeFilteringReasonsReasons(od);
+      checkCreativeFilteringReasonsReasons(
+          od as api.CreativeFilteringReasonsReasons);
     });
   });
 
@@ -3855,7 +3884,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFilteringReasons();
       var od = api.CreativeFilteringReasons.fromJson(o.toJson());
-      checkCreativeFilteringReasons(od);
+      checkCreativeFilteringReasons(od as api.CreativeFilteringReasons);
     });
   });
 
@@ -3863,7 +3892,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAdAppIcon();
       var od = api.CreativeNativeAdAppIcon.fromJson(o.toJson());
-      checkCreativeNativeAdAppIcon(od);
+      checkCreativeNativeAdAppIcon(od as api.CreativeNativeAdAppIcon);
     });
   });
 
@@ -3871,7 +3900,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAdImage();
       var od = api.CreativeNativeAdImage.fromJson(o.toJson());
-      checkCreativeNativeAdImage(od);
+      checkCreativeNativeAdImage(od as api.CreativeNativeAdImage);
     });
   });
 
@@ -3879,7 +3908,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAdLogo();
       var od = api.CreativeNativeAdLogo.fromJson(o.toJson());
-      checkCreativeNativeAdLogo(od);
+      checkCreativeNativeAdLogo(od as api.CreativeNativeAdLogo);
     });
   });
 
@@ -3887,7 +3916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeNativeAd();
       var od = api.CreativeNativeAd.fromJson(o.toJson());
-      checkCreativeNativeAd(od);
+      checkCreativeNativeAd(od as api.CreativeNativeAd);
     });
   });
 
@@ -3895,7 +3924,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeServingRestrictionsContexts();
       var od = api.CreativeServingRestrictionsContexts.fromJson(o.toJson());
-      checkCreativeServingRestrictionsContexts(od);
+      checkCreativeServingRestrictionsContexts(
+          od as api.CreativeServingRestrictionsContexts);
     });
   });
 
@@ -3905,7 +3935,8 @@
       var o = buildCreativeServingRestrictionsDisapprovalReasons();
       var od = api.CreativeServingRestrictionsDisapprovalReasons.fromJson(
           o.toJson());
-      checkCreativeServingRestrictionsDisapprovalReasons(od);
+      checkCreativeServingRestrictionsDisapprovalReasons(
+          od as api.CreativeServingRestrictionsDisapprovalReasons);
     });
   });
 
@@ -3913,7 +3944,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeServingRestrictions();
       var od = api.CreativeServingRestrictions.fromJson(o.toJson());
-      checkCreativeServingRestrictions(od);
+      checkCreativeServingRestrictions(od as api.CreativeServingRestrictions);
     });
   });
 
@@ -3921,7 +3952,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreative();
       var od = api.Creative.fromJson(o.toJson());
-      checkCreative(od);
+      checkCreative(od as api.Creative);
     });
   });
 
@@ -3929,7 +3960,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeDealIdsDealStatuses();
       var od = api.CreativeDealIdsDealStatuses.fromJson(o.toJson());
-      checkCreativeDealIdsDealStatuses(od);
+      checkCreativeDealIdsDealStatuses(od as api.CreativeDealIdsDealStatuses);
     });
   });
 
@@ -3937,7 +3968,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeDealIds();
       var od = api.CreativeDealIds.fromJson(o.toJson());
-      checkCreativeDealIds(od);
+      checkCreativeDealIds(od as api.CreativeDealIds);
     });
   });
 
@@ -3945,7 +3976,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativesList();
       var od = api.CreativesList.fromJson(o.toJson());
-      checkCreativesList(od);
+      checkCreativesList(od as api.CreativesList);
     });
   });
 
@@ -3953,7 +3984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDealServingMetadata();
       var od = api.DealServingMetadata.fromJson(o.toJson());
-      checkDealServingMetadata(od);
+      checkDealServingMetadata(od as api.DealServingMetadata);
     });
   });
 
@@ -3961,7 +3992,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDealServingMetadataDealPauseStatus();
       var od = api.DealServingMetadataDealPauseStatus.fromJson(o.toJson());
-      checkDealServingMetadataDealPauseStatus(od);
+      checkDealServingMetadataDealPauseStatus(
+          od as api.DealServingMetadataDealPauseStatus);
     });
   });
 
@@ -3969,7 +4001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDealTerms();
       var od = api.DealTerms.fromJson(o.toJson());
-      checkDealTerms(od);
+      checkDealTerms(od as api.DealTerms);
     });
   });
 
@@ -3977,7 +4009,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDealTermsGuaranteedFixedPriceTerms();
       var od = api.DealTermsGuaranteedFixedPriceTerms.fromJson(o.toJson());
-      checkDealTermsGuaranteedFixedPriceTerms(od);
+      checkDealTermsGuaranteedFixedPriceTerms(
+          od as api.DealTermsGuaranteedFixedPriceTerms);
     });
   });
 
@@ -3987,7 +4020,8 @@
       var o = buildDealTermsGuaranteedFixedPriceTermsBillingInfo();
       var od = api.DealTermsGuaranteedFixedPriceTermsBillingInfo.fromJson(
           o.toJson());
-      checkDealTermsGuaranteedFixedPriceTermsBillingInfo(od);
+      checkDealTermsGuaranteedFixedPriceTermsBillingInfo(
+          od as api.DealTermsGuaranteedFixedPriceTermsBillingInfo);
     });
   });
 
@@ -3995,7 +4029,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDealTermsNonGuaranteedAuctionTerms();
       var od = api.DealTermsNonGuaranteedAuctionTerms.fromJson(o.toJson());
-      checkDealTermsNonGuaranteedAuctionTerms(od);
+      checkDealTermsNonGuaranteedAuctionTerms(
+          od as api.DealTermsNonGuaranteedAuctionTerms);
     });
   });
 
@@ -4003,7 +4038,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDealTermsNonGuaranteedFixedPriceTerms();
       var od = api.DealTermsNonGuaranteedFixedPriceTerms.fromJson(o.toJson());
-      checkDealTermsNonGuaranteedFixedPriceTerms(od);
+      checkDealTermsNonGuaranteedFixedPriceTerms(
+          od as api.DealTermsNonGuaranteedFixedPriceTerms);
     });
   });
 
@@ -4011,7 +4047,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDealTermsRubiconNonGuaranteedTerms();
       var od = api.DealTermsRubiconNonGuaranteedTerms.fromJson(o.toJson());
-      checkDealTermsRubiconNonGuaranteedTerms(od);
+      checkDealTermsRubiconNonGuaranteedTerms(
+          od as api.DealTermsRubiconNonGuaranteedTerms);
     });
   });
 
@@ -4019,7 +4056,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteOrderDealsRequest();
       var od = api.DeleteOrderDealsRequest.fromJson(o.toJson());
-      checkDeleteOrderDealsRequest(od);
+      checkDeleteOrderDealsRequest(od as api.DeleteOrderDealsRequest);
     });
   });
 
@@ -4027,7 +4064,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteOrderDealsResponse();
       var od = api.DeleteOrderDealsResponse.fromJson(o.toJson());
-      checkDeleteOrderDealsResponse(od);
+      checkDeleteOrderDealsResponse(od as api.DeleteOrderDealsResponse);
     });
   });
 
@@ -4035,7 +4072,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeliveryControl();
       var od = api.DeliveryControl.fromJson(o.toJson());
-      checkDeliveryControl(od);
+      checkDeliveryControl(od as api.DeliveryControl);
     });
   });
 
@@ -4043,7 +4080,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeliveryControlFrequencyCap();
       var od = api.DeliveryControlFrequencyCap.fromJson(o.toJson());
-      checkDeliveryControlFrequencyCap(od);
+      checkDeliveryControlFrequencyCap(od as api.DeliveryControlFrequencyCap);
     });
   });
 
@@ -4051,7 +4088,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimension();
       var od = api.Dimension.fromJson(o.toJson());
-      checkDimension(od);
+      checkDimension(od as api.Dimension);
     });
   });
 
@@ -4059,7 +4096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionDimensionValue();
       var od = api.DimensionDimensionValue.fromJson(o.toJson());
-      checkDimensionDimensionValue(od);
+      checkDimensionDimensionValue(od as api.DimensionDimensionValue);
     });
   });
 
@@ -4067,7 +4104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEditAllOrderDealsRequest();
       var od = api.EditAllOrderDealsRequest.fromJson(o.toJson());
-      checkEditAllOrderDealsRequest(od);
+      checkEditAllOrderDealsRequest(od as api.EditAllOrderDealsRequest);
     });
   });
 
@@ -4075,7 +4112,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEditAllOrderDealsResponse();
       var od = api.EditAllOrderDealsResponse.fromJson(o.toJson());
-      checkEditAllOrderDealsResponse(od);
+      checkEditAllOrderDealsResponse(od as api.EditAllOrderDealsResponse);
     });
   });
 
@@ -4083,7 +4120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetOffersResponse();
       var od = api.GetOffersResponse.fromJson(o.toJson());
-      checkGetOffersResponse(od);
+      checkGetOffersResponse(od as api.GetOffersResponse);
     });
   });
 
@@ -4091,7 +4128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetOrderDealsResponse();
       var od = api.GetOrderDealsResponse.fromJson(o.toJson());
-      checkGetOrderDealsResponse(od);
+      checkGetOrderDealsResponse(od as api.GetOrderDealsResponse);
     });
   });
 
@@ -4099,7 +4136,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetOrderNotesResponse();
       var od = api.GetOrderNotesResponse.fromJson(o.toJson());
-      checkGetOrderNotesResponse(od);
+      checkGetOrderNotesResponse(od as api.GetOrderNotesResponse);
     });
   });
 
@@ -4107,7 +4144,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetOrdersResponse();
       var od = api.GetOrdersResponse.fromJson(o.toJson());
-      checkGetOrdersResponse(od);
+      checkGetOrdersResponse(od as api.GetOrdersResponse);
     });
   });
 
@@ -4115,7 +4152,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPublisherProfilesByAccountIdResponse();
       var od = api.GetPublisherProfilesByAccountIdResponse.fromJson(o.toJson());
-      checkGetPublisherProfilesByAccountIdResponse(od);
+      checkGetPublisherProfilesByAccountIdResponse(
+          od as api.GetPublisherProfilesByAccountIdResponse);
     });
   });
 
@@ -4123,7 +4161,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMarketplaceDeal();
       var od = api.MarketplaceDeal.fromJson(o.toJson());
-      checkMarketplaceDeal(od);
+      checkMarketplaceDeal(od as api.MarketplaceDeal);
     });
   });
 
@@ -4131,7 +4169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMarketplaceDealParty();
       var od = api.MarketplaceDealParty.fromJson(o.toJson());
-      checkMarketplaceDealParty(od);
+      checkMarketplaceDealParty(od as api.MarketplaceDealParty);
     });
   });
 
@@ -4139,7 +4177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMarketplaceLabel();
       var od = api.MarketplaceLabel.fromJson(o.toJson());
-      checkMarketplaceLabel(od);
+      checkMarketplaceLabel(od as api.MarketplaceLabel);
     });
   });
 
@@ -4147,7 +4185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMarketplaceNote();
       var od = api.MarketplaceNote.fromJson(o.toJson());
-      checkMarketplaceNote(od);
+      checkMarketplaceNote(od as api.MarketplaceNote);
     });
   });
 
@@ -4155,7 +4193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileApplication();
       var od = api.MobileApplication.fromJson(o.toJson());
-      checkMobileApplication(od);
+      checkMobileApplication(od as api.MobileApplication);
     });
   });
 
@@ -4163,7 +4201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerformanceReport();
       var od = api.PerformanceReport.fromJson(o.toJson());
-      checkPerformanceReport(od);
+      checkPerformanceReport(od as api.PerformanceReport);
     });
   });
 
@@ -4171,7 +4209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerformanceReportList();
       var od = api.PerformanceReportList.fromJson(o.toJson());
-      checkPerformanceReportList(od);
+      checkPerformanceReportList(od as api.PerformanceReportList);
     });
   });
 
@@ -4179,7 +4217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigDimensions();
       var od = api.PretargetingConfigDimensions.fromJson(o.toJson());
-      checkPretargetingConfigDimensions(od);
+      checkPretargetingConfigDimensions(od as api.PretargetingConfigDimensions);
     });
   });
 
@@ -4187,7 +4225,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigExcludedPlacements();
       var od = api.PretargetingConfigExcludedPlacements.fromJson(o.toJson());
-      checkPretargetingConfigExcludedPlacements(od);
+      checkPretargetingConfigExcludedPlacements(
+          od as api.PretargetingConfigExcludedPlacements);
     });
   });
 
@@ -4195,7 +4234,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigPlacements();
       var od = api.PretargetingConfigPlacements.fromJson(o.toJson());
-      checkPretargetingConfigPlacements(od);
+      checkPretargetingConfigPlacements(od as api.PretargetingConfigPlacements);
     });
   });
 
@@ -4203,7 +4242,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigVideoPlayerSizes();
       var od = api.PretargetingConfigVideoPlayerSizes.fromJson(o.toJson());
-      checkPretargetingConfigVideoPlayerSizes(od);
+      checkPretargetingConfigVideoPlayerSizes(
+          od as api.PretargetingConfigVideoPlayerSizes);
     });
   });
 
@@ -4211,7 +4251,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfig();
       var od = api.PretargetingConfig.fromJson(o.toJson());
-      checkPretargetingConfig(od);
+      checkPretargetingConfig(od as api.PretargetingConfig);
     });
   });
 
@@ -4219,7 +4259,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPretargetingConfigList();
       var od = api.PretargetingConfigList.fromJson(o.toJson());
-      checkPretargetingConfigList(od);
+      checkPretargetingConfigList(od as api.PretargetingConfigList);
     });
   });
 
@@ -4227,7 +4267,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrice();
       var od = api.Price.fromJson(o.toJson());
-      checkPrice(od);
+      checkPrice(od as api.Price);
     });
   });
 
@@ -4235,7 +4275,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPricePerBuyer();
       var od = api.PricePerBuyer.fromJson(o.toJson());
-      checkPricePerBuyer(od);
+      checkPricePerBuyer(od as api.PricePerBuyer);
     });
   });
 
@@ -4243,7 +4283,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrivateData();
       var od = api.PrivateData.fromJson(o.toJson());
-      checkPrivateData(od);
+      checkPrivateData(od as api.PrivateData);
     });
   });
 
@@ -4251,7 +4291,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProduct();
       var od = api.Product.fromJson(o.toJson());
-      checkProduct(od);
+      checkProduct(od as api.Product);
     });
   });
 
@@ -4259,7 +4299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProposal();
       var od = api.Proposal.fromJson(o.toJson());
-      checkProposal(od);
+      checkProposal(od as api.Proposal);
     });
   });
 
@@ -4267,7 +4307,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublisherProfileApiProto();
       var od = api.PublisherProfileApiProto.fromJson(o.toJson());
-      checkPublisherProfileApiProto(od);
+      checkPublisherProfileApiProto(od as api.PublisherProfileApiProto);
     });
   });
 
@@ -4275,7 +4315,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublisherProvidedForecast();
       var od = api.PublisherProvidedForecast.fromJson(o.toJson());
-      checkPublisherProvidedForecast(od);
+      checkPublisherProvidedForecast(od as api.PublisherProvidedForecast);
     });
   });
 
@@ -4283,7 +4323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSeller();
       var od = api.Seller.fromJson(o.toJson());
-      checkSeller(od);
+      checkSeller(od as api.Seller);
     });
   });
 
@@ -4291,7 +4331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSharedTargeting();
       var od = api.SharedTargeting.fromJson(o.toJson());
-      checkSharedTargeting(od);
+      checkSharedTargeting(od as api.SharedTargeting);
     });
   });
 
@@ -4299,7 +4339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValue();
       var od = api.TargetingValue.fromJson(o.toJson());
-      checkTargetingValue(od);
+      checkTargetingValue(od as api.TargetingValue);
     });
   });
 
@@ -4307,7 +4347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValueCreativeSize();
       var od = api.TargetingValueCreativeSize.fromJson(o.toJson());
-      checkTargetingValueCreativeSize(od);
+      checkTargetingValueCreativeSize(od as api.TargetingValueCreativeSize);
     });
   });
 
@@ -4315,7 +4355,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValueDayPartTargeting();
       var od = api.TargetingValueDayPartTargeting.fromJson(o.toJson());
-      checkTargetingValueDayPartTargeting(od);
+      checkTargetingValueDayPartTargeting(
+          od as api.TargetingValueDayPartTargeting);
     });
   });
 
@@ -4323,7 +4364,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValueDayPartTargetingDayPart();
       var od = api.TargetingValueDayPartTargetingDayPart.fromJson(o.toJson());
-      checkTargetingValueDayPartTargetingDayPart(od);
+      checkTargetingValueDayPartTargetingDayPart(
+          od as api.TargetingValueDayPartTargetingDayPart);
     });
   });
 
@@ -4331,7 +4373,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValueDemogAgeCriteria();
       var od = api.TargetingValueDemogAgeCriteria.fromJson(o.toJson());
-      checkTargetingValueDemogAgeCriteria(od);
+      checkTargetingValueDemogAgeCriteria(
+          od as api.TargetingValueDemogAgeCriteria);
     });
   });
 
@@ -4339,7 +4382,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValueDemogGenderCriteria();
       var od = api.TargetingValueDemogGenderCriteria.fromJson(o.toJson());
-      checkTargetingValueDemogGenderCriteria(od);
+      checkTargetingValueDemogGenderCriteria(
+          od as api.TargetingValueDemogGenderCriteria);
     });
   });
 
@@ -4347,7 +4391,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValueRequestPlatformTargeting();
       var od = api.TargetingValueRequestPlatformTargeting.fromJson(o.toJson());
-      checkTargetingValueRequestPlatformTargeting(od);
+      checkTargetingValueRequestPlatformTargeting(
+          od as api.TargetingValueRequestPlatformTargeting);
     });
   });
 
@@ -4355,7 +4400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingValueSize();
       var od = api.TargetingValueSize.fromJson(o.toJson());
-      checkTargetingValueSize(od);
+      checkTargetingValueSize(od as api.TargetingValueSize);
     });
   });
 
@@ -4363,7 +4408,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdatePrivateAuctionProposalRequest();
       var od = api.UpdatePrivateAuctionProposalRequest.fromJson(o.toJson());
-      checkUpdatePrivateAuctionProposalRequest(od);
+      checkUpdatePrivateAuctionProposalRequest(
+          od as api.UpdatePrivateAuctionProposalRequest);
     });
   });
 
@@ -4417,7 +4463,7 @@
       res
           .get(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -4464,7 +4510,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkAccountsList(response);
+        checkAccountsList(response as api.AccountsList);
       })));
     });
 
@@ -4476,8 +4522,9 @@
       var arg_confirmUnsafeAccountChange = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4526,7 +4573,7 @@
               confirmUnsafeAccountChange: arg_confirmUnsafeAccountChange,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -4538,8 +4585,9 @@
       var arg_confirmUnsafeAccountChange = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4588,7 +4636,7 @@
               confirmUnsafeAccountChange: arg_confirmUnsafeAccountChange,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
   });
@@ -4643,7 +4691,7 @@
       res
           .get(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBillingInfo(response);
+        checkBillingInfo(response as api.BillingInfo);
       })));
     });
 
@@ -4690,7 +4738,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkBillingInfoList(response);
+        checkBillingInfoList(response as api.BillingInfoList);
       })));
     });
   });
@@ -4755,7 +4803,7 @@
       res
           .get(arg_accountId, arg_billingId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBudget(response);
+        checkBudget(response as api.Budget);
       })));
     });
 
@@ -4767,8 +4815,9 @@
       var arg_billingId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Budget.fromJson(json);
-        checkBudget(obj);
+        var obj =
+            api.Budget.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBudget(obj as api.Budget);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4823,7 +4872,7 @@
           .patch(arg_request, arg_accountId, arg_billingId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBudget(response);
+        checkBudget(response as api.Budget);
       })));
     });
 
@@ -4835,8 +4884,9 @@
       var arg_billingId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Budget.fromJson(json);
-        checkBudget(obj);
+        var obj =
+            api.Budget.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBudget(obj as api.Budget);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4891,7 +4941,7 @@
           .update(arg_request, arg_accountId, arg_billingId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBudget(response);
+        checkBudget(response as api.Budget);
       })));
     });
   });
@@ -5028,7 +5078,7 @@
       res
           .get(arg_accountId, arg_buyerCreativeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -5038,8 +5088,9 @@
       var arg_request = buildCreative();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Creative.fromJson(json);
-        checkCreative(obj);
+        var obj =
+            api.Creative.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCreative(obj as api.Creative);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5081,7 +5132,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -5155,7 +5206,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativesList(response);
+        checkCreativesList(response as api.CreativesList);
       })));
     });
 
@@ -5224,7 +5275,7 @@
       res
           .listDeals(arg_accountId, arg_buyerCreativeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeDealIds(response);
+        checkCreativeDealIds(response as api.CreativeDealIds);
       })));
     });
 
@@ -5309,8 +5360,9 @@
       var arg_proposalId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeleteOrderDealsRequest.fromJson(json);
-        checkDeleteOrderDealsRequest(obj);
+        var obj = api.DeleteOrderDealsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeleteOrderDealsRequest(obj as api.DeleteOrderDealsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5361,7 +5413,7 @@
       res
           .delete(arg_request, arg_proposalId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeleteOrderDealsResponse(response);
+        checkDeleteOrderDealsResponse(response as api.DeleteOrderDealsResponse);
       })));
     });
 
@@ -5372,8 +5424,9 @@
       var arg_proposalId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddOrderDealsRequest.fromJson(json);
-        checkAddOrderDealsRequest(obj);
+        var obj = api.AddOrderDealsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddOrderDealsRequest(obj as api.AddOrderDealsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5424,7 +5477,7 @@
       res
           .insert(arg_request, arg_proposalId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddOrderDealsResponse(response);
+        checkAddOrderDealsResponse(response as api.AddOrderDealsResponse);
       })));
     });
 
@@ -5486,7 +5539,7 @@
       res
           .list(arg_proposalId, pqlQuery: arg_pqlQuery, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetOrderDealsResponse(response);
+        checkGetOrderDealsResponse(response as api.GetOrderDealsResponse);
       })));
     });
 
@@ -5497,8 +5550,9 @@
       var arg_proposalId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EditAllOrderDealsRequest.fromJson(json);
-        checkEditAllOrderDealsRequest(obj);
+        var obj = api.EditAllOrderDealsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEditAllOrderDealsRequest(obj as api.EditAllOrderDealsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5549,7 +5603,8 @@
       res
           .update(arg_request, arg_proposalId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEditAllOrderDealsResponse(response);
+        checkEditAllOrderDealsResponse(
+            response as api.EditAllOrderDealsResponse);
       })));
     });
   });
@@ -5562,8 +5617,9 @@
       var arg_proposalId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddOrderNotesRequest.fromJson(json);
-        checkAddOrderNotesRequest(obj);
+        var obj = api.AddOrderNotesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddOrderNotesRequest(obj as api.AddOrderNotesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5614,7 +5670,7 @@
       res
           .insert(arg_request, arg_proposalId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddOrderNotesResponse(response);
+        checkAddOrderNotesResponse(response as api.AddOrderNotesResponse);
       })));
     });
 
@@ -5676,7 +5732,7 @@
       res
           .list(arg_proposalId, pqlQuery: arg_pqlQuery, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetOrderNotesResponse(response);
+        checkGetOrderNotesResponse(response as api.GetOrderNotesResponse);
       })));
     });
   });
@@ -5689,8 +5745,10 @@
       var arg_privateAuctionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdatePrivateAuctionProposalRequest.fromJson(json);
-        checkUpdatePrivateAuctionProposalRequest(obj);
+        var obj = api.UpdatePrivateAuctionProposalRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdatePrivateAuctionProposalRequest(
+            obj as api.UpdatePrivateAuctionProposalRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5809,7 +5867,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPerformanceReportList(response);
+        checkPerformanceReportList(response as api.PerformanceReportList);
       })));
     });
   });
@@ -5935,7 +5993,7 @@
       res
           .get(arg_accountId, arg_configId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
 
@@ -5946,8 +6004,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PretargetingConfig.fromJson(json);
-        checkPretargetingConfig(obj);
+        var obj = api.PretargetingConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPretargetingConfig(obj as api.PretargetingConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5992,7 +6051,7 @@
       res
           .insert(arg_request, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
 
@@ -6045,7 +6104,7 @@
       res
           .list(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfigList(response);
+        checkPretargetingConfigList(response as api.PretargetingConfigList);
       })));
     });
 
@@ -6057,8 +6116,9 @@
       var arg_configId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PretargetingConfig.fromJson(json);
-        checkPretargetingConfig(obj);
+        var obj = api.PretargetingConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPretargetingConfig(obj as api.PretargetingConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6112,7 +6172,7 @@
       res
           .patch(arg_request, arg_accountId, arg_configId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
 
@@ -6124,8 +6184,9 @@
       var arg_configId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PretargetingConfig.fromJson(json);
-        checkPretargetingConfig(obj);
+        var obj = api.PretargetingConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPretargetingConfig(obj as api.PretargetingConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6180,7 +6241,7 @@
           .update(arg_request, arg_accountId, arg_configId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPretargetingConfig(response);
+        checkPretargetingConfig(response as api.PretargetingConfig);
       })));
     });
   });
@@ -6235,7 +6296,7 @@
       res
           .get(arg_productId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -6287,7 +6348,7 @@
       res
           .search(pqlQuery: arg_pqlQuery, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetOffersResponse(response);
+        checkGetOffersResponse(response as api.GetOffersResponse);
       })));
     });
   });
@@ -6342,7 +6403,7 @@
       res
           .get(arg_proposalId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProposal(response);
+        checkProposal(response as api.Proposal);
       })));
     });
 
@@ -6352,8 +6413,9 @@
       var arg_request = buildCreateOrdersRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateOrdersRequest.fromJson(json);
-        checkCreateOrdersRequest(obj);
+        var obj = api.CreateOrdersRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateOrdersRequest(obj as api.CreateOrdersRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6395,7 +6457,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateOrdersResponse(response);
+        checkCreateOrdersResponse(response as api.CreateOrdersResponse);
       })));
     });
 
@@ -6408,8 +6470,9 @@
       var arg_updateAction = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Proposal.fromJson(json);
-        checkProposal(obj);
+        var obj =
+            api.Proposal.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProposal(obj as api.Proposal);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6474,7 +6537,7 @@
               arg_request, arg_proposalId, arg_revisionNumber, arg_updateAction,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProposal(response);
+        checkProposal(response as api.Proposal);
       })));
     });
 
@@ -6526,7 +6589,7 @@
       res
           .search(pqlQuery: arg_pqlQuery, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetOrdersResponse(response);
+        checkGetOrdersResponse(response as api.GetOrdersResponse);
       })));
     });
 
@@ -6596,8 +6659,9 @@
       var arg_updateAction = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Proposal.fromJson(json);
-        checkProposal(obj);
+        var obj =
+            api.Proposal.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProposal(obj as api.Proposal);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6662,7 +6726,7 @@
               arg_request, arg_proposalId, arg_revisionNumber, arg_updateAction,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProposal(response);
+        checkProposal(response as api.Proposal);
       })));
     });
   });
@@ -6724,7 +6788,8 @@
       res
           .list(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetPublisherProfilesByAccountIdResponse(response);
+        checkGetPublisherProfilesByAccountIdResponse(
+            response as api.GetPublisherProfilesByAccountIdResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/adexperiencereport/v1_test.dart b/generated/googleapis/test/adexperiencereport/v1_test.dart
index 2b73c19..1897441 100644
--- a/generated/googleapis/test/adexperiencereport/v1_test.dart
+++ b/generated/googleapis/test/adexperiencereport/v1_test.dart
@@ -134,8 +134,8 @@
 void checkSiteSummaryResponse(api.SiteSummaryResponse o) {
   buildCounterSiteSummaryResponse++;
   if (buildCounterSiteSummaryResponse < 3) {
-    checkPlatformSummary(o.desktopSummary);
-    checkPlatformSummary(o.mobileSummary);
+    checkPlatformSummary(o.desktopSummary as api.PlatformSummary);
+    checkPlatformSummary(o.mobileSummary as api.PlatformSummary);
     unittest.expect(o.reviewedSite, unittest.equals('foo'));
   }
   buildCounterSiteSummaryResponse--;
@@ -150,8 +150,8 @@
 
 void checkUnnamed2637(core.List<api.SiteSummaryResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSiteSummaryResponse(o[0]);
-  checkSiteSummaryResponse(o[1]);
+  checkSiteSummaryResponse(o[0] as api.SiteSummaryResponse);
+  checkSiteSummaryResponse(o[1] as api.SiteSummaryResponse);
 }
 
 core.int buildCounterViolatingSitesResponse = 0;
@@ -178,7 +178,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlatformSummary();
       var od = api.PlatformSummary.fromJson(o.toJson());
-      checkPlatformSummary(od);
+      checkPlatformSummary(od as api.PlatformSummary);
     });
   });
 
@@ -186,7 +186,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteSummaryResponse();
       var od = api.SiteSummaryResponse.fromJson(o.toJson());
-      checkSiteSummaryResponse(od);
+      checkSiteSummaryResponse(od as api.SiteSummaryResponse);
     });
   });
 
@@ -194,7 +194,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildViolatingSitesResponse();
       var od = api.ViolatingSitesResponse.fromJson(o.toJson());
-      checkViolatingSitesResponse(od);
+      checkViolatingSitesResponse(od as api.ViolatingSitesResponse);
     });
   });
 
@@ -243,7 +243,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSiteSummaryResponse(response);
+        checkSiteSummaryResponse(response as api.SiteSummaryResponse);
       })));
     });
   });
@@ -289,7 +289,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkViolatingSitesResponse(response);
+        checkViolatingSitesResponse(response as api.ViolatingSitesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/admin/datatransfer_v1_test.dart b/generated/googleapis/test/admin/datatransfer_v1_test.dart
index 3ab098f..8f06b42 100644
--- a/generated/googleapis/test/admin/datatransfer_v1_test.dart
+++ b/generated/googleapis/test/admin/datatransfer_v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed4811(core.List<api.ApplicationTransferParam> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplicationTransferParam(o[0]);
-  checkApplicationTransferParam(o[1]);
+  checkApplicationTransferParam(o[0] as api.ApplicationTransferParam);
+  checkApplicationTransferParam(o[1] as api.ApplicationTransferParam);
 }
 
 core.int buildCounterApplication = 0;
@@ -123,8 +123,8 @@
 
 void checkUnnamed4812(core.List<api.ApplicationTransferParam> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplicationTransferParam(o[0]);
-  checkApplicationTransferParam(o[1]);
+  checkApplicationTransferParam(o[0] as api.ApplicationTransferParam);
+  checkApplicationTransferParam(o[1] as api.ApplicationTransferParam);
 }
 
 core.int buildCounterApplicationDataTransfer = 0;
@@ -193,8 +193,8 @@
 
 void checkUnnamed4814(core.List<api.Application> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplication(o[0]);
-  checkApplication(o[1]);
+  checkApplication(o[0] as api.Application);
+  checkApplication(o[1] as api.Application);
 }
 
 core.int buildCounterApplicationsListResponse = 0;
@@ -231,8 +231,8 @@
 
 void checkUnnamed4815(core.List<api.ApplicationDataTransfer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplicationDataTransfer(o[0]);
-  checkApplicationDataTransfer(o[1]);
+  checkApplicationDataTransfer(o[0] as api.ApplicationDataTransfer);
+  checkApplicationDataTransfer(o[1] as api.ApplicationDataTransfer);
 }
 
 core.int buildCounterDataTransfer = 0;
@@ -278,8 +278,8 @@
 
 void checkUnnamed4816(core.List<api.DataTransfer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataTransfer(o[0]);
-  checkDataTransfer(o[1]);
+  checkDataTransfer(o[0] as api.DataTransfer);
+  checkDataTransfer(o[1] as api.DataTransfer);
 }
 
 core.int buildCounterDataTransfersListResponse = 0;
@@ -312,7 +312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplication();
       var od = api.Application.fromJson(o.toJson());
-      checkApplication(od);
+      checkApplication(od as api.Application);
     });
   });
 
@@ -320,7 +320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationDataTransfer();
       var od = api.ApplicationDataTransfer.fromJson(o.toJson());
-      checkApplicationDataTransfer(od);
+      checkApplicationDataTransfer(od as api.ApplicationDataTransfer);
     });
   });
 
@@ -328,7 +328,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationTransferParam();
       var od = api.ApplicationTransferParam.fromJson(o.toJson());
-      checkApplicationTransferParam(od);
+      checkApplicationTransferParam(od as api.ApplicationTransferParam);
     });
   });
 
@@ -336,7 +336,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationsListResponse();
       var od = api.ApplicationsListResponse.fromJson(o.toJson());
-      checkApplicationsListResponse(od);
+      checkApplicationsListResponse(od as api.ApplicationsListResponse);
     });
   });
 
@@ -344,7 +344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataTransfer();
       var od = api.DataTransfer.fromJson(o.toJson());
-      checkDataTransfer(od);
+      checkDataTransfer(od as api.DataTransfer);
     });
   });
 
@@ -352,7 +352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataTransfersListResponse();
       var od = api.DataTransfersListResponse.fromJson(o.toJson());
-      checkDataTransfersListResponse(od);
+      checkDataTransfersListResponse(od as api.DataTransfersListResponse);
     });
   });
 
@@ -403,7 +403,7 @@
       res
           .get(arg_applicationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApplication(response);
+        checkApplication(response as api.Application);
       })));
     });
 
@@ -462,7 +462,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApplicationsListResponse(response);
+        checkApplicationsListResponse(response as api.ApplicationsListResponse);
       })));
     });
   });
@@ -514,7 +514,7 @@
       res
           .get(arg_dataTransferId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataTransfer(response);
+        checkDataTransfer(response as api.DataTransfer);
       })));
     });
 
@@ -524,8 +524,9 @@
       var arg_request = buildDataTransfer();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DataTransfer.fromJson(json);
-        checkDataTransfer(obj);
+        var obj = api.DataTransfer.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDataTransfer(obj as api.DataTransfer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -564,7 +565,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataTransfer(response);
+        checkDataTransfer(response as api.DataTransfer);
       })));
     });
 
@@ -634,7 +635,8 @@
               status: arg_status,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataTransfersListResponse(response);
+        checkDataTransfersListResponse(
+            response as api.DataTransfersListResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/admin/directory_v1_test.dart b/generated/googleapis/test/admin/directory_v1_test.dart
index 77c17f8..a4eb6c1 100644
--- a/generated/googleapis/test/admin/directory_v1_test.dart
+++ b/generated/googleapis/test/admin/directory_v1_test.dart
@@ -193,8 +193,8 @@
 
 void checkUnnamed1594(core.List<api.Asp> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAsp(o[0]);
-  checkAsp(o[1]);
+  checkAsp(o[0] as api.Asp);
+  checkAsp(o[1] as api.Asp);
 }
 
 core.int buildCounterAsps = 0;
@@ -254,10 +254,10 @@
 void checkBuilding(api.Building o) {
   buildCounterBuilding++;
   if (buildCounterBuilding < 3) {
-    checkBuildingAddress(o.address);
+    checkBuildingAddress(o.address as api.BuildingAddress);
     unittest.expect(o.buildingId, unittest.equals('foo'));
     unittest.expect(o.buildingName, unittest.equals('foo'));
-    checkBuildingCoordinates(o.coordinates);
+    checkBuildingCoordinates(o.coordinates as api.BuildingCoordinates);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etags, unittest.equals('foo'));
     checkUnnamed1595(o.floorNames);
@@ -340,8 +340,8 @@
 
 void checkUnnamed1597(core.List<api.Building> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuilding(o[0]);
-  checkBuilding(o[1]);
+  checkBuilding(o[0] as api.Building);
+  checkBuilding(o[1] as api.Building);
 }
 
 core.int buildCounterBuildings = 0;
@@ -433,8 +433,8 @@
 
 void checkUnnamed1598(core.List<api.CalendarResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCalendarResource(o[0]);
-  checkCalendarResource(o[1]);
+  checkCalendarResource(o[0] as api.CalendarResource);
+  checkCalendarResource(o[1] as api.CalendarResource);
 }
 
 core.int buildCounterCalendarResources = 0;
@@ -543,8 +543,10 @@
 
 void checkUnnamed1600(core.List<api.ChromeOsDeviceActiveTimeRanges> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceActiveTimeRanges(o[0]);
-  checkChromeOsDeviceActiveTimeRanges(o[1]);
+  checkChromeOsDeviceActiveTimeRanges(
+      o[0] as api.ChromeOsDeviceActiveTimeRanges);
+  checkChromeOsDeviceActiveTimeRanges(
+      o[1] as api.ChromeOsDeviceActiveTimeRanges);
 }
 
 core.int buildCounterChromeOsDeviceCpuStatusReportsCpuTemperatureInfo = 0;
@@ -581,8 +583,10 @@
 void checkUnnamed1601(
     core.List<api.ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceCpuStatusReportsCpuTemperatureInfo(o[0]);
-  checkChromeOsDeviceCpuStatusReportsCpuTemperatureInfo(o[1]);
+  checkChromeOsDeviceCpuStatusReportsCpuTemperatureInfo(
+      o[0] as api.ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo);
+  checkChromeOsDeviceCpuStatusReportsCpuTemperatureInfo(
+      o[1] as api.ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo);
 }
 
 core.List<core.int> buildUnnamed1602() {
@@ -631,8 +635,10 @@
 
 void checkUnnamed1603(core.List<api.ChromeOsDeviceCpuStatusReports> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceCpuStatusReports(o[0]);
-  checkChromeOsDeviceCpuStatusReports(o[1]);
+  checkChromeOsDeviceCpuStatusReports(
+      o[0] as api.ChromeOsDeviceCpuStatusReports);
+  checkChromeOsDeviceCpuStatusReports(
+      o[1] as api.ChromeOsDeviceCpuStatusReports);
 }
 
 core.int buildCounterChromeOsDeviceDeviceFiles = 0;
@@ -670,8 +676,8 @@
 
 void checkUnnamed1604(core.List<api.ChromeOsDeviceDeviceFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceDeviceFiles(o[0]);
-  checkChromeOsDeviceDeviceFiles(o[1]);
+  checkChromeOsDeviceDeviceFiles(o[0] as api.ChromeOsDeviceDeviceFiles);
+  checkChromeOsDeviceDeviceFiles(o[1] as api.ChromeOsDeviceDeviceFiles);
 }
 
 core.int buildCounterChromeOsDeviceDiskVolumeReportsVolumeInfo = 0;
@@ -709,8 +715,10 @@
 void checkUnnamed1605(
     core.List<api.ChromeOsDeviceDiskVolumeReportsVolumeInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceDiskVolumeReportsVolumeInfo(o[0]);
-  checkChromeOsDeviceDiskVolumeReportsVolumeInfo(o[1]);
+  checkChromeOsDeviceDiskVolumeReportsVolumeInfo(
+      o[0] as api.ChromeOsDeviceDiskVolumeReportsVolumeInfo);
+  checkChromeOsDeviceDiskVolumeReportsVolumeInfo(
+      o[1] as api.ChromeOsDeviceDiskVolumeReportsVolumeInfo);
 }
 
 core.int buildCounterChromeOsDeviceDiskVolumeReports = 0;
@@ -742,8 +750,10 @@
 
 void checkUnnamed1606(core.List<api.ChromeOsDeviceDiskVolumeReports> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceDiskVolumeReports(o[0]);
-  checkChromeOsDeviceDiskVolumeReports(o[1]);
+  checkChromeOsDeviceDiskVolumeReports(
+      o[0] as api.ChromeOsDeviceDiskVolumeReports);
+  checkChromeOsDeviceDiskVolumeReports(
+      o[1] as api.ChromeOsDeviceDiskVolumeReports);
 }
 
 core.int buildCounterChromeOsDeviceLastKnownNetwork = 0;
@@ -776,8 +786,10 @@
 
 void checkUnnamed1607(core.List<api.ChromeOsDeviceLastKnownNetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceLastKnownNetwork(o[0]);
-  checkChromeOsDeviceLastKnownNetwork(o[1]);
+  checkChromeOsDeviceLastKnownNetwork(
+      o[0] as api.ChromeOsDeviceLastKnownNetwork);
+  checkChromeOsDeviceLastKnownNetwork(
+      o[1] as api.ChromeOsDeviceLastKnownNetwork);
 }
 
 core.int buildCounterChromeOsDeviceRecentUsers = 0;
@@ -810,8 +822,8 @@
 
 void checkUnnamed1608(core.List<api.ChromeOsDeviceRecentUsers> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceRecentUsers(o[0]);
-  checkChromeOsDeviceRecentUsers(o[1]);
+  checkChromeOsDeviceRecentUsers(o[0] as api.ChromeOsDeviceRecentUsers);
+  checkChromeOsDeviceRecentUsers(o[1] as api.ChromeOsDeviceRecentUsers);
 }
 
 core.List<core.String> buildUnnamed1609() {
@@ -860,8 +872,10 @@
 
 void checkUnnamed1610(core.List<api.ChromeOsDeviceSystemRamFreeReports> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDeviceSystemRamFreeReports(o[0]);
-  checkChromeOsDeviceSystemRamFreeReports(o[1]);
+  checkChromeOsDeviceSystemRamFreeReports(
+      o[0] as api.ChromeOsDeviceSystemRamFreeReports);
+  checkChromeOsDeviceSystemRamFreeReports(
+      o[1] as api.ChromeOsDeviceSystemRamFreeReports);
 }
 
 core.int buildCounterChromeOsDeviceTpmVersionInfo = 0;
@@ -979,7 +993,8 @@
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUnnamed1610(o.systemRamFreeReports);
     unittest.expect(o.systemRamTotal, unittest.equals('foo'));
-    checkChromeOsDeviceTpmVersionInfo(o.tpmVersionInfo);
+    checkChromeOsDeviceTpmVersionInfo(
+        o.tpmVersionInfo as api.ChromeOsDeviceTpmVersionInfo);
     unittest.expect(o.willAutoRenew, unittest.isTrue);
   }
   buildCounterChromeOsDevice--;
@@ -1015,8 +1030,8 @@
 
 void checkUnnamed1611(core.List<api.ChromeOsDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChromeOsDevice(o[0]);
-  checkChromeOsDevice(o[1]);
+  checkChromeOsDevice(o[0] as api.ChromeOsDevice);
+  checkChromeOsDevice(o[1] as api.ChromeOsDevice);
 }
 
 core.int buildCounterChromeOsDevices = 0;
@@ -1107,7 +1122,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
-    checkCustomerPostalAddress(o.postalAddress);
+    checkCustomerPostalAddress(o.postalAddress as api.CustomerPostalAddress);
   }
   buildCounterCustomer--;
 }
@@ -1185,8 +1200,8 @@
 
 void checkUnnamed1613(core.List<api.DomainAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDomainAlias(o[0]);
-  checkDomainAlias(o[1]);
+  checkDomainAlias(o[0] as api.DomainAlias);
+  checkDomainAlias(o[1] as api.DomainAlias);
 }
 
 core.int buildCounterDomainAliases = 0;
@@ -1221,8 +1236,8 @@
 
 void checkUnnamed1614(core.List<api.DomainAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDomainAlias(o[0]);
-  checkDomainAlias(o[1]);
+  checkDomainAlias(o[0] as api.DomainAlias);
+  checkDomainAlias(o[1] as api.DomainAlias);
 }
 
 core.int buildCounterDomains = 0;
@@ -1265,8 +1280,8 @@
 
 void checkUnnamed1615(core.List<api.Domains> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDomains(o[0]);
-  checkDomains(o[1]);
+  checkDomains(o[0] as api.Domains);
+  checkDomains(o[1] as api.Domains);
 }
 
 core.int buildCounterDomains2 = 0;
@@ -1329,7 +1344,7 @@
 void checkFeatureInstance(api.FeatureInstance o) {
   buildCounterFeatureInstance++;
   if (buildCounterFeatureInstance < 3) {
-    checkFeature(o.feature);
+    checkFeature(o.feature as api.Feature);
   }
   buildCounterFeatureInstance--;
 }
@@ -1362,8 +1377,8 @@
 
 void checkUnnamed1616(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFeature(o[0]);
-  checkFeature(o[1]);
+  checkFeature(o[0] as api.Feature);
+  checkFeature(o[1] as api.Feature);
 }
 
 core.int buildCounterFeatures = 0;
@@ -1463,8 +1478,8 @@
 
 void checkUnnamed1619(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroup(o[0]);
-  checkGroup(o[1]);
+  checkGroup(o[0] as api.Group);
+  checkGroup(o[1] as api.Group);
 }
 
 core.int buildCounterGroups = 0;
@@ -1534,8 +1549,8 @@
 
 void checkUnnamed1620(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMember(o[0]);
-  checkMember(o[1]);
+  checkMember(o[0] as api.Member);
+  checkMember(o[1] as api.Member);
 }
 
 core.int buildCounterMembers = 0;
@@ -1631,8 +1646,8 @@
 
 void checkUnnamed1622(core.List<api.MobileDeviceApplications> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMobileDeviceApplications(o[0]);
-  checkMobileDeviceApplications(o[1]);
+  checkMobileDeviceApplications(o[0] as api.MobileDeviceApplications);
+  checkMobileDeviceApplications(o[1] as api.MobileDeviceApplications);
 }
 
 core.List<core.String> buildUnnamed1623() {
@@ -1801,8 +1816,8 @@
 
 void checkUnnamed1626(core.List<api.MobileDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMobileDevice(o[0]);
-  checkMobileDevice(o[1]);
+  checkMobileDevice(o[0] as api.MobileDevice);
+  checkMobileDevice(o[1] as api.MobileDevice);
 }
 
 core.int buildCounterMobileDevices = 0;
@@ -1874,8 +1889,8 @@
 
 void checkUnnamed1627(core.List<api.OrgUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrgUnit(o[0]);
-  checkOrgUnit(o[1]);
+  checkOrgUnit(o[0] as api.OrgUnit);
+  checkOrgUnit(o[1] as api.OrgUnit);
 }
 
 core.int buildCounterOrgUnits = 0;
@@ -1910,8 +1925,8 @@
 
 void checkUnnamed1628(core.List<api.Privilege> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPrivilege(o[0]);
-  checkPrivilege(o[1]);
+  checkPrivilege(o[0] as api.Privilege);
+  checkPrivilege(o[1] as api.Privilege);
 }
 
 core.int buildCounterPrivilege = 0;
@@ -1954,8 +1969,8 @@
 
 void checkUnnamed1629(core.List<api.Privilege> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPrivilege(o[0]);
-  checkPrivilege(o[1]);
+  checkPrivilege(o[0] as api.Privilege);
+  checkPrivilege(o[1] as api.Privilege);
 }
 
 core.int buildCounterPrivileges = 0;
@@ -2011,8 +2026,8 @@
 
 void checkUnnamed1630(core.List<api.RoleRolePrivileges> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoleRolePrivileges(o[0]);
-  checkRoleRolePrivileges(o[1]);
+  checkRoleRolePrivileges(o[0] as api.RoleRolePrivileges);
+  checkRoleRolePrivileges(o[1] as api.RoleRolePrivileges);
 }
 
 core.int buildCounterRole = 0;
@@ -2088,8 +2103,8 @@
 
 void checkUnnamed1631(core.List<api.RoleAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoleAssignment(o[0]);
-  checkRoleAssignment(o[1]);
+  checkRoleAssignment(o[0] as api.RoleAssignment);
+  checkRoleAssignment(o[1] as api.RoleAssignment);
 }
 
 core.int buildCounterRoleAssignments = 0;
@@ -2126,8 +2141,8 @@
 
 void checkUnnamed1632(core.List<api.Role> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRole(o[0]);
-  checkRole(o[1]);
+  checkRole(o[0] as api.Role);
+  checkRole(o[1] as api.Role);
 }
 
 core.int buildCounterRoles = 0;
@@ -2164,8 +2179,8 @@
 
 void checkUnnamed1633(core.List<api.SchemaFieldSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSchemaFieldSpec(o[0]);
-  checkSchemaFieldSpec(o[1]);
+  checkSchemaFieldSpec(o[0] as api.SchemaFieldSpec);
+  checkSchemaFieldSpec(o[1] as api.SchemaFieldSpec);
 }
 
 core.int buildCounterSchema = 0;
@@ -2251,7 +2266,8 @@
     unittest.expect(o.indexed, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.multiValued, unittest.isTrue);
-    checkSchemaFieldSpecNumericIndexingSpec(o.numericIndexingSpec);
+    checkSchemaFieldSpecNumericIndexingSpec(
+        o.numericIndexingSpec as api.SchemaFieldSpecNumericIndexingSpec);
     unittest.expect(o.readAccessType, unittest.equals('foo'));
   }
   buildCounterSchemaFieldSpec--;
@@ -2266,8 +2282,8 @@
 
 void checkUnnamed1634(core.List<api.Schema> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSchema(o[0]);
-  checkSchema(o[1]);
+  checkSchema(o[0] as api.Schema);
+  checkSchema(o[1] as api.Schema);
 }
 
 core.int buildCounterSchemas = 0;
@@ -2348,8 +2364,8 @@
 
 void checkUnnamed1636(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkToken(o[0]);
-  checkToken(o[1]);
+  checkToken(o[0] as api.Token);
+  checkToken(o[1] as api.Token);
 }
 
 core.int buildCounterTokens = 0;
@@ -2397,8 +2413,8 @@
 
 void checkUnnamed1638(core.Map<core.String, api.UserCustomProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserCustomProperties(o['x']);
-  checkUserCustomProperties(o['y']);
+  checkUserCustomProperties(o['x'] as api.UserCustomProperties);
+  checkUserCustomProperties(o['y'] as api.UserCustomProperties);
 }
 
 core.List<core.String> buildUnnamed1639() {
@@ -2596,7 +2612,7 @@
     unittest.expect(casted11['list'], unittest.equals([1, 2, 3]));
     unittest.expect(casted11['bool'], unittest.equals(true));
     unittest.expect(casted11['string'], unittest.equals('foo'));
-    checkUserName(o.name);
+    checkUserName(o.name as api.UserName);
     checkUnnamed1639(o.nonEditableAliases);
     var casted12 = (o.notes) as core.Map;
     unittest.expect(casted12, unittest.hasLength(3));
@@ -3191,8 +3207,8 @@
 
 void checkUnnamed1640(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUser(o[0]);
-  checkUser(o[1]);
+  checkUser(o[0] as api.User);
+  checkUser(o[1] as api.User);
 }
 
 core.int buildCounterUsers = 0;
@@ -3256,8 +3272,8 @@
 
 void checkUnnamed1641(core.List<api.VerificationCode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVerificationCode(o[0]);
-  checkVerificationCode(o[1]);
+  checkVerificationCode(o[0] as api.VerificationCode);
+  checkVerificationCode(o[1] as api.VerificationCode);
 }
 
 core.int buildCounterVerificationCodes = 0;
@@ -3288,7 +3304,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAlias();
       var od = api.Alias.fromJson(o.toJson());
-      checkAlias(od);
+      checkAlias(od as api.Alias);
     });
   });
 
@@ -3296,7 +3312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAliases();
       var od = api.Aliases.fromJson(o.toJson());
-      checkAliases(od);
+      checkAliases(od as api.Aliases);
     });
   });
 
@@ -3304,7 +3320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsp();
       var od = api.Asp.fromJson(o.toJson());
-      checkAsp(od);
+      checkAsp(od as api.Asp);
     });
   });
 
@@ -3312,7 +3328,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsps();
       var od = api.Asps.fromJson(o.toJson());
-      checkAsps(od);
+      checkAsps(od as api.Asps);
     });
   });
 
@@ -3320,7 +3336,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuilding();
       var od = api.Building.fromJson(o.toJson());
-      checkBuilding(od);
+      checkBuilding(od as api.Building);
     });
   });
 
@@ -3328,7 +3344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildingAddress();
       var od = api.BuildingAddress.fromJson(o.toJson());
-      checkBuildingAddress(od);
+      checkBuildingAddress(od as api.BuildingAddress);
     });
   });
 
@@ -3336,7 +3352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildingCoordinates();
       var od = api.BuildingCoordinates.fromJson(o.toJson());
-      checkBuildingCoordinates(od);
+      checkBuildingCoordinates(od as api.BuildingCoordinates);
     });
   });
 
@@ -3344,7 +3360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildings();
       var od = api.Buildings.fromJson(o.toJson());
-      checkBuildings(od);
+      checkBuildings(od as api.Buildings);
     });
   });
 
@@ -3352,7 +3368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendarResource();
       var od = api.CalendarResource.fromJson(o.toJson());
-      checkCalendarResource(od);
+      checkCalendarResource(od as api.CalendarResource);
     });
   });
 
@@ -3360,7 +3376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendarResources();
       var od = api.CalendarResources.fromJson(o.toJson());
-      checkCalendarResources(od);
+      checkCalendarResources(od as api.CalendarResources);
     });
   });
 
@@ -3368,7 +3384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -3376,7 +3392,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceActiveTimeRanges();
       var od = api.ChromeOsDeviceActiveTimeRanges.fromJson(o.toJson());
-      checkChromeOsDeviceActiveTimeRanges(od);
+      checkChromeOsDeviceActiveTimeRanges(
+          od as api.ChromeOsDeviceActiveTimeRanges);
     });
   });
 
@@ -3386,7 +3403,8 @@
       var o = buildChromeOsDeviceCpuStatusReportsCpuTemperatureInfo();
       var od = api.ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo.fromJson(
           o.toJson());
-      checkChromeOsDeviceCpuStatusReportsCpuTemperatureInfo(od);
+      checkChromeOsDeviceCpuStatusReportsCpuTemperatureInfo(
+          od as api.ChromeOsDeviceCpuStatusReportsCpuTemperatureInfo);
     });
   });
 
@@ -3394,7 +3412,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceCpuStatusReports();
       var od = api.ChromeOsDeviceCpuStatusReports.fromJson(o.toJson());
-      checkChromeOsDeviceCpuStatusReports(od);
+      checkChromeOsDeviceCpuStatusReports(
+          od as api.ChromeOsDeviceCpuStatusReports);
     });
   });
 
@@ -3402,7 +3421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceDeviceFiles();
       var od = api.ChromeOsDeviceDeviceFiles.fromJson(o.toJson());
-      checkChromeOsDeviceDeviceFiles(od);
+      checkChromeOsDeviceDeviceFiles(od as api.ChromeOsDeviceDeviceFiles);
     });
   });
 
@@ -3411,7 +3430,8 @@
       var o = buildChromeOsDeviceDiskVolumeReportsVolumeInfo();
       var od =
           api.ChromeOsDeviceDiskVolumeReportsVolumeInfo.fromJson(o.toJson());
-      checkChromeOsDeviceDiskVolumeReportsVolumeInfo(od);
+      checkChromeOsDeviceDiskVolumeReportsVolumeInfo(
+          od as api.ChromeOsDeviceDiskVolumeReportsVolumeInfo);
     });
   });
 
@@ -3419,7 +3439,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceDiskVolumeReports();
       var od = api.ChromeOsDeviceDiskVolumeReports.fromJson(o.toJson());
-      checkChromeOsDeviceDiskVolumeReports(od);
+      checkChromeOsDeviceDiskVolumeReports(
+          od as api.ChromeOsDeviceDiskVolumeReports);
     });
   });
 
@@ -3427,7 +3448,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceLastKnownNetwork();
       var od = api.ChromeOsDeviceLastKnownNetwork.fromJson(o.toJson());
-      checkChromeOsDeviceLastKnownNetwork(od);
+      checkChromeOsDeviceLastKnownNetwork(
+          od as api.ChromeOsDeviceLastKnownNetwork);
     });
   });
 
@@ -3435,7 +3457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceRecentUsers();
       var od = api.ChromeOsDeviceRecentUsers.fromJson(o.toJson());
-      checkChromeOsDeviceRecentUsers(od);
+      checkChromeOsDeviceRecentUsers(od as api.ChromeOsDeviceRecentUsers);
     });
   });
 
@@ -3443,7 +3465,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceSystemRamFreeReports();
       var od = api.ChromeOsDeviceSystemRamFreeReports.fromJson(o.toJson());
-      checkChromeOsDeviceSystemRamFreeReports(od);
+      checkChromeOsDeviceSystemRamFreeReports(
+          od as api.ChromeOsDeviceSystemRamFreeReports);
     });
   });
 
@@ -3451,7 +3474,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceTpmVersionInfo();
       var od = api.ChromeOsDeviceTpmVersionInfo.fromJson(o.toJson());
-      checkChromeOsDeviceTpmVersionInfo(od);
+      checkChromeOsDeviceTpmVersionInfo(od as api.ChromeOsDeviceTpmVersionInfo);
     });
   });
 
@@ -3459,7 +3482,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDevice();
       var od = api.ChromeOsDevice.fromJson(o.toJson());
-      checkChromeOsDevice(od);
+      checkChromeOsDevice(od as api.ChromeOsDevice);
     });
   });
 
@@ -3467,7 +3490,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDeviceAction();
       var od = api.ChromeOsDeviceAction.fromJson(o.toJson());
-      checkChromeOsDeviceAction(od);
+      checkChromeOsDeviceAction(od as api.ChromeOsDeviceAction);
     });
   });
 
@@ -3475,7 +3498,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsDevices();
       var od = api.ChromeOsDevices.fromJson(o.toJson());
-      checkChromeOsDevices(od);
+      checkChromeOsDevices(od as api.ChromeOsDevices);
     });
   });
 
@@ -3483,7 +3506,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChromeOsMoveDevicesToOu();
       var od = api.ChromeOsMoveDevicesToOu.fromJson(o.toJson());
-      checkChromeOsMoveDevicesToOu(od);
+      checkChromeOsMoveDevicesToOu(od as api.ChromeOsMoveDevicesToOu);
     });
   });
 
@@ -3491,7 +3514,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomer();
       var od = api.Customer.fromJson(o.toJson());
-      checkCustomer(od);
+      checkCustomer(od as api.Customer);
     });
   });
 
@@ -3499,7 +3522,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerPostalAddress();
       var od = api.CustomerPostalAddress.fromJson(o.toJson());
-      checkCustomerPostalAddress(od);
+      checkCustomerPostalAddress(od as api.CustomerPostalAddress);
     });
   });
 
@@ -3507,7 +3530,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomainAlias();
       var od = api.DomainAlias.fromJson(o.toJson());
-      checkDomainAlias(od);
+      checkDomainAlias(od as api.DomainAlias);
     });
   });
 
@@ -3515,7 +3538,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomainAliases();
       var od = api.DomainAliases.fromJson(o.toJson());
-      checkDomainAliases(od);
+      checkDomainAliases(od as api.DomainAliases);
     });
   });
 
@@ -3523,7 +3546,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomains();
       var od = api.Domains.fromJson(o.toJson());
-      checkDomains(od);
+      checkDomains(od as api.Domains);
     });
   });
 
@@ -3531,7 +3554,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomains2();
       var od = api.Domains2.fromJson(o.toJson());
-      checkDomains2(od);
+      checkDomains2(od as api.Domains2);
     });
   });
 
@@ -3539,7 +3562,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeature();
       var od = api.Feature.fromJson(o.toJson());
-      checkFeature(od);
+      checkFeature(od as api.Feature);
     });
   });
 
@@ -3547,7 +3570,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeatureInstance();
       var od = api.FeatureInstance.fromJson(o.toJson());
-      checkFeatureInstance(od);
+      checkFeatureInstance(od as api.FeatureInstance);
     });
   });
 
@@ -3555,7 +3578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeatureRename();
       var od = api.FeatureRename.fromJson(o.toJson());
-      checkFeatureRename(od);
+      checkFeatureRename(od as api.FeatureRename);
     });
   });
 
@@ -3563,7 +3586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeatures();
       var od = api.Features.fromJson(o.toJson());
-      checkFeatures(od);
+      checkFeatures(od as api.Features);
     });
   });
 
@@ -3571,7 +3594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroup();
       var od = api.Group.fromJson(o.toJson());
-      checkGroup(od);
+      checkGroup(od as api.Group);
     });
   });
 
@@ -3579,7 +3602,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroups();
       var od = api.Groups.fromJson(o.toJson());
-      checkGroups(od);
+      checkGroups(od as api.Groups);
     });
   });
 
@@ -3587,7 +3610,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMember();
       var od = api.Member.fromJson(o.toJson());
-      checkMember(od);
+      checkMember(od as api.Member);
     });
   });
 
@@ -3595,7 +3618,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembers();
       var od = api.Members.fromJson(o.toJson());
-      checkMembers(od);
+      checkMembers(od as api.Members);
     });
   });
 
@@ -3603,7 +3626,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembersHasMember();
       var od = api.MembersHasMember.fromJson(o.toJson());
-      checkMembersHasMember(od);
+      checkMembersHasMember(od as api.MembersHasMember);
     });
   });
 
@@ -3611,7 +3634,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileDeviceApplications();
       var od = api.MobileDeviceApplications.fromJson(o.toJson());
-      checkMobileDeviceApplications(od);
+      checkMobileDeviceApplications(od as api.MobileDeviceApplications);
     });
   });
 
@@ -3619,7 +3642,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileDevice();
       var od = api.MobileDevice.fromJson(o.toJson());
-      checkMobileDevice(od);
+      checkMobileDevice(od as api.MobileDevice);
     });
   });
 
@@ -3627,7 +3650,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileDeviceAction();
       var od = api.MobileDeviceAction.fromJson(o.toJson());
-      checkMobileDeviceAction(od);
+      checkMobileDeviceAction(od as api.MobileDeviceAction);
     });
   });
 
@@ -3635,7 +3658,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileDevices();
       var od = api.MobileDevices.fromJson(o.toJson());
-      checkMobileDevices(od);
+      checkMobileDevices(od as api.MobileDevices);
     });
   });
 
@@ -3643,7 +3666,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrgUnit();
       var od = api.OrgUnit.fromJson(o.toJson());
-      checkOrgUnit(od);
+      checkOrgUnit(od as api.OrgUnit);
     });
   });
 
@@ -3651,7 +3674,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrgUnits();
       var od = api.OrgUnits.fromJson(o.toJson());
-      checkOrgUnits(od);
+      checkOrgUnits(od as api.OrgUnits);
     });
   });
 
@@ -3659,7 +3682,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrivilege();
       var od = api.Privilege.fromJson(o.toJson());
-      checkPrivilege(od);
+      checkPrivilege(od as api.Privilege);
     });
   });
 
@@ -3667,7 +3690,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrivileges();
       var od = api.Privileges.fromJson(o.toJson());
-      checkPrivileges(od);
+      checkPrivileges(od as api.Privileges);
     });
   });
 
@@ -3675,7 +3698,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoleRolePrivileges();
       var od = api.RoleRolePrivileges.fromJson(o.toJson());
-      checkRoleRolePrivileges(od);
+      checkRoleRolePrivileges(od as api.RoleRolePrivileges);
     });
   });
 
@@ -3683,7 +3706,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRole();
       var od = api.Role.fromJson(o.toJson());
-      checkRole(od);
+      checkRole(od as api.Role);
     });
   });
 
@@ -3691,7 +3714,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoleAssignment();
       var od = api.RoleAssignment.fromJson(o.toJson());
-      checkRoleAssignment(od);
+      checkRoleAssignment(od as api.RoleAssignment);
     });
   });
 
@@ -3699,7 +3722,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoleAssignments();
       var od = api.RoleAssignments.fromJson(o.toJson());
-      checkRoleAssignments(od);
+      checkRoleAssignments(od as api.RoleAssignments);
     });
   });
 
@@ -3707,7 +3730,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoles();
       var od = api.Roles.fromJson(o.toJson());
-      checkRoles(od);
+      checkRoles(od as api.Roles);
     });
   });
 
@@ -3715,7 +3738,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchema();
       var od = api.Schema.fromJson(o.toJson());
-      checkSchema(od);
+      checkSchema(od as api.Schema);
     });
   });
 
@@ -3723,7 +3746,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchemaFieldSpecNumericIndexingSpec();
       var od = api.SchemaFieldSpecNumericIndexingSpec.fromJson(o.toJson());
-      checkSchemaFieldSpecNumericIndexingSpec(od);
+      checkSchemaFieldSpecNumericIndexingSpec(
+          od as api.SchemaFieldSpecNumericIndexingSpec);
     });
   });
 
@@ -3731,7 +3755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchemaFieldSpec();
       var od = api.SchemaFieldSpec.fromJson(o.toJson());
-      checkSchemaFieldSpec(od);
+      checkSchemaFieldSpec(od as api.SchemaFieldSpec);
     });
   });
 
@@ -3739,7 +3763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchemas();
       var od = api.Schemas.fromJson(o.toJson());
-      checkSchemas(od);
+      checkSchemas(od as api.Schemas);
     });
   });
 
@@ -3747,7 +3771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildToken();
       var od = api.Token.fromJson(o.toJson());
-      checkToken(od);
+      checkToken(od as api.Token);
     });
   });
 
@@ -3755,7 +3779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTokens();
       var od = api.Tokens.fromJson(o.toJson());
-      checkTokens(od);
+      checkTokens(od as api.Tokens);
     });
   });
 
@@ -3763,7 +3787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -3771,7 +3795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserAbout();
       var od = api.UserAbout.fromJson(o.toJson());
-      checkUserAbout(od);
+      checkUserAbout(od as api.UserAbout);
     });
   });
 
@@ -3779,7 +3803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserAddress();
       var od = api.UserAddress.fromJson(o.toJson());
-      checkUserAddress(od);
+      checkUserAddress(od as api.UserAddress);
     });
   });
 
@@ -3787,7 +3811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserCustomProperties();
       var od = api.UserCustomProperties.fromJson(o.toJson());
-      checkUserCustomProperties(od);
+      checkUserCustomProperties(od as api.UserCustomProperties);
     });
   });
 
@@ -3795,7 +3819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserEmail();
       var od = api.UserEmail.fromJson(o.toJson());
-      checkUserEmail(od);
+      checkUserEmail(od as api.UserEmail);
     });
   });
 
@@ -3803,7 +3827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserExternalId();
       var od = api.UserExternalId.fromJson(o.toJson());
-      checkUserExternalId(od);
+      checkUserExternalId(od as api.UserExternalId);
     });
   });
 
@@ -3811,7 +3835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserGender();
       var od = api.UserGender.fromJson(o.toJson());
-      checkUserGender(od);
+      checkUserGender(od as api.UserGender);
     });
   });
 
@@ -3819,7 +3843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserIm();
       var od = api.UserIm.fromJson(o.toJson());
-      checkUserIm(od);
+      checkUserIm(od as api.UserIm);
     });
   });
 
@@ -3827,7 +3851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserKeyword();
       var od = api.UserKeyword.fromJson(o.toJson());
-      checkUserKeyword(od);
+      checkUserKeyword(od as api.UserKeyword);
     });
   });
 
@@ -3835,7 +3859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserLanguage();
       var od = api.UserLanguage.fromJson(o.toJson());
-      checkUserLanguage(od);
+      checkUserLanguage(od as api.UserLanguage);
     });
   });
 
@@ -3843,7 +3867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserLocation();
       var od = api.UserLocation.fromJson(o.toJson());
-      checkUserLocation(od);
+      checkUserLocation(od as api.UserLocation);
     });
   });
 
@@ -3851,7 +3875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserMakeAdmin();
       var od = api.UserMakeAdmin.fromJson(o.toJson());
-      checkUserMakeAdmin(od);
+      checkUserMakeAdmin(od as api.UserMakeAdmin);
     });
   });
 
@@ -3859,7 +3883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserName();
       var od = api.UserName.fromJson(o.toJson());
-      checkUserName(od);
+      checkUserName(od as api.UserName);
     });
   });
 
@@ -3867,7 +3891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserOrganization();
       var od = api.UserOrganization.fromJson(o.toJson());
-      checkUserOrganization(od);
+      checkUserOrganization(od as api.UserOrganization);
     });
   });
 
@@ -3875,7 +3899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserPhone();
       var od = api.UserPhone.fromJson(o.toJson());
-      checkUserPhone(od);
+      checkUserPhone(od as api.UserPhone);
     });
   });
 
@@ -3883,7 +3907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserPhoto();
       var od = api.UserPhoto.fromJson(o.toJson());
-      checkUserPhoto(od);
+      checkUserPhoto(od as api.UserPhoto);
     });
   });
 
@@ -3891,7 +3915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserPosixAccount();
       var od = api.UserPosixAccount.fromJson(o.toJson());
-      checkUserPosixAccount(od);
+      checkUserPosixAccount(od as api.UserPosixAccount);
     });
   });
 
@@ -3899,7 +3923,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRelation();
       var od = api.UserRelation.fromJson(o.toJson());
-      checkUserRelation(od);
+      checkUserRelation(od as api.UserRelation);
     });
   });
 
@@ -3907,7 +3931,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserSshPublicKey();
       var od = api.UserSshPublicKey.fromJson(o.toJson());
-      checkUserSshPublicKey(od);
+      checkUserSshPublicKey(od as api.UserSshPublicKey);
     });
   });
 
@@ -3915,7 +3939,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserUndelete();
       var od = api.UserUndelete.fromJson(o.toJson());
-      checkUserUndelete(od);
+      checkUserUndelete(od as api.UserUndelete);
     });
   });
 
@@ -3923,7 +3947,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserWebsite();
       var od = api.UserWebsite.fromJson(o.toJson());
-      checkUserWebsite(od);
+      checkUserWebsite(od as api.UserWebsite);
     });
   });
 
@@ -3931,7 +3955,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsers();
       var od = api.Users.fromJson(o.toJson());
-      checkUsers(od);
+      checkUsers(od as api.Users);
     });
   });
 
@@ -3939,7 +3963,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerificationCode();
       var od = api.VerificationCode.fromJson(o.toJson());
-      checkVerificationCode(od);
+      checkVerificationCode(od as api.VerificationCode);
     });
   });
 
@@ -3947,7 +3971,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerificationCodes();
       var od = api.VerificationCodes.fromJson(o.toJson());
-      checkVerificationCodes(od);
+      checkVerificationCodes(od as api.VerificationCodes);
     });
   });
 
@@ -4066,7 +4090,7 @@
       res
           .get(arg_userKey, arg_codeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAsp(response);
+        checkAsp(response as api.Asp);
       })));
     });
 
@@ -4122,7 +4146,7 @@
       res
           .list(arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAsps(response);
+        checkAsps(response as api.Asps);
       })));
     });
   });
@@ -4134,8 +4158,9 @@
       var arg_request = buildChannel();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4186,8 +4211,9 @@
       var arg_resourceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChromeOsDeviceAction.fromJson(json);
-        checkChromeOsDeviceAction(obj);
+        var obj = api.ChromeOsDeviceAction.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChromeOsDeviceAction(obj as api.ChromeOsDeviceAction);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4307,7 +4333,7 @@
           .get(arg_customerId, arg_deviceId,
               projection: arg_projection, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChromeOsDevice(response);
+        checkChromeOsDevice(response as api.ChromeOsDevice);
       })));
     });
 
@@ -4391,7 +4417,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChromeOsDevices(response);
+        checkChromeOsDevices(response as api.ChromeOsDevices);
       })));
     });
 
@@ -4403,8 +4429,9 @@
       var arg_orgUnitPath = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChromeOsMoveDevicesToOu.fromJson(json);
-        checkChromeOsMoveDevicesToOu(obj);
+        var obj = api.ChromeOsMoveDevicesToOu.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChromeOsMoveDevicesToOu(obj as api.ChromeOsMoveDevicesToOu);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4466,8 +4493,9 @@
       var arg_projection = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChromeOsDevice.fromJson(json);
-        checkChromeOsDevice(obj);
+        var obj = api.ChromeOsDevice.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChromeOsDevice(obj as api.ChromeOsDevice);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4521,7 +4549,7 @@
           .patch(arg_request, arg_customerId, arg_deviceId,
               projection: arg_projection, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChromeOsDevice(response);
+        checkChromeOsDevice(response as api.ChromeOsDevice);
       })));
     });
 
@@ -4534,8 +4562,9 @@
       var arg_projection = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChromeOsDevice.fromJson(json);
-        checkChromeOsDevice(obj);
+        var obj = api.ChromeOsDevice.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChromeOsDevice(obj as api.ChromeOsDevice);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4589,7 +4618,7 @@
           .update(arg_request, arg_customerId, arg_deviceId,
               projection: arg_projection, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChromeOsDevice(response);
+        checkChromeOsDevice(response as api.ChromeOsDevice);
       })));
     });
   });
@@ -4641,7 +4670,7 @@
       res
           .get(arg_customerKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomer(response);
+        checkCustomer(response as api.Customer);
       })));
     });
 
@@ -4652,8 +4681,9 @@
       var arg_customerKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Customer.fromJson(json);
-        checkCustomer(obj);
+        var obj =
+            api.Customer.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCustomer(obj as api.Customer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4695,7 +4725,7 @@
       res
           .patch(arg_request, arg_customerKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomer(response);
+        checkCustomer(response as api.Customer);
       })));
     });
 
@@ -4706,8 +4736,9 @@
       var arg_customerKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Customer.fromJson(json);
-        checkCustomer(obj);
+        var obj =
+            api.Customer.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCustomer(obj as api.Customer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4749,7 +4780,7 @@
       res
           .update(arg_request, arg_customerKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomer(response);
+        checkCustomer(response as api.Customer);
       })));
     });
   });
@@ -4869,7 +4900,7 @@
       res
           .get(arg_customer, arg_domainAliasName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainAlias(response);
+        checkDomainAlias(response as api.DomainAlias);
       })));
     });
 
@@ -4880,8 +4911,9 @@
       var arg_customer = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DomainAlias.fromJson(json);
-        checkDomainAlias(obj);
+        var obj = api.DomainAlias.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDomainAlias(obj as api.DomainAlias);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4929,7 +4961,7 @@
       res
           .insert(arg_request, arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainAlias(response);
+        checkDomainAlias(response as api.DomainAlias);
       })));
     });
 
@@ -4989,7 +5021,7 @@
           .list(arg_customer,
               parentDomainName: arg_parentDomainName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainAliases(response);
+        checkDomainAliases(response as api.DomainAliases);
       })));
     });
   });
@@ -5109,7 +5141,7 @@
       res
           .get(arg_customer, arg_domainName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomains(response);
+        checkDomains(response as api.Domains);
       })));
     });
 
@@ -5120,8 +5152,9 @@
       var arg_customer = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Domains.fromJson(json);
-        checkDomains(obj);
+        var obj =
+            api.Domains.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDomains(obj as api.Domains);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5169,7 +5202,7 @@
       res
           .insert(arg_request, arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomains(response);
+        checkDomains(response as api.Domains);
       })));
     });
 
@@ -5225,7 +5258,7 @@
       res
           .list(arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomains2(response);
+        checkDomains2(response as api.Domains2);
       })));
     });
   });
@@ -5325,7 +5358,7 @@
       res
           .get(arg_groupKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
 
@@ -5335,8 +5368,9 @@
       var arg_request = buildGroup();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5375,7 +5409,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
 
@@ -5452,7 +5486,7 @@
               userKey: arg_userKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroups(response);
+        checkGroups(response as api.Groups);
       })));
     });
 
@@ -5463,8 +5497,9 @@
       var arg_groupKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5506,7 +5541,7 @@
       res
           .patch(arg_request, arg_groupKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
 
@@ -5517,8 +5552,9 @@
       var arg_groupKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5560,7 +5596,7 @@
       res
           .update(arg_request, arg_groupKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
   });
@@ -5631,8 +5667,9 @@
       var arg_groupKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Alias.fromJson(json);
-        checkAlias(obj);
+        var obj =
+            api.Alias.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAlias(obj as api.Alias);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5680,7 +5717,7 @@
       res
           .insert(arg_request, arg_groupKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAlias(response);
+        checkAlias(response as api.Alias);
       })));
     });
 
@@ -5736,7 +5773,7 @@
       res
           .list(arg_groupKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAliases(response);
+        checkAliases(response as api.Aliases);
       })));
     });
   });
@@ -5856,7 +5893,7 @@
       res
           .get(arg_groupKey, arg_memberKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMember(response);
+        checkMember(response as api.Member);
       })));
     });
 
@@ -5916,7 +5953,7 @@
       res
           .hasMember(arg_groupKey, arg_memberKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMembersHasMember(response);
+        checkMembersHasMember(response as api.MembersHasMember);
       })));
     });
 
@@ -5927,8 +5964,9 @@
       var arg_groupKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Member.fromJson(json);
-        checkMember(obj);
+        var obj =
+            api.Member.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMember(obj as api.Member);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5976,7 +6014,7 @@
       res
           .insert(arg_request, arg_groupKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMember(response);
+        checkMember(response as api.Member);
       })));
     });
 
@@ -6048,7 +6086,7 @@
               roles: arg_roles,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMembers(response);
+        checkMembers(response as api.Members);
       })));
     });
 
@@ -6060,8 +6098,9 @@
       var arg_memberKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Member.fromJson(json);
-        checkMember(obj);
+        var obj =
+            api.Member.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMember(obj as api.Member);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6112,7 +6151,7 @@
       res
           .patch(arg_request, arg_groupKey, arg_memberKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMember(response);
+        checkMember(response as api.Member);
       })));
     });
 
@@ -6124,8 +6163,9 @@
       var arg_memberKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Member.fromJson(json);
-        checkMember(obj);
+        var obj =
+            api.Member.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMember(obj as api.Member);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6177,7 +6217,7 @@
           .update(arg_request, arg_groupKey, arg_memberKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMember(response);
+        checkMember(response as api.Member);
       })));
     });
   });
@@ -6191,8 +6231,9 @@
       var arg_resourceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.MobileDeviceAction.fromJson(json);
-        checkMobileDeviceAction(obj);
+        var obj = api.MobileDeviceAction.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkMobileDeviceAction(obj as api.MobileDeviceAction);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6370,7 +6411,7 @@
           .get(arg_customerId, arg_resourceId,
               projection: arg_projection, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMobileDevice(response);
+        checkMobileDevice(response as api.MobileDevice);
       })));
     });
 
@@ -6450,7 +6491,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMobileDevices(response);
+        checkMobileDevices(response as api.MobileDevices);
       })));
     });
   });
@@ -6566,7 +6607,7 @@
       res
           .get(arg_customerId, arg_orgUnitPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgUnit(response);
+        checkOrgUnit(response as api.OrgUnit);
       })));
     });
 
@@ -6577,8 +6618,9 @@
       var arg_customerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrgUnit.fromJson(json);
-        checkOrgUnit(obj);
+        var obj =
+            api.OrgUnit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkOrgUnit(obj as api.OrgUnit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6626,7 +6668,7 @@
       res
           .insert(arg_request, arg_customerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgUnit(response);
+        checkOrgUnit(response as api.OrgUnit);
       })));
     });
 
@@ -6690,7 +6732,7 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgUnits(response);
+        checkOrgUnits(response as api.OrgUnits);
       })));
     });
 
@@ -6702,8 +6744,9 @@
       var arg_orgUnitPath = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrgUnit.fromJson(json);
-        checkOrgUnit(obj);
+        var obj =
+            api.OrgUnit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkOrgUnit(obj as api.OrgUnit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6753,7 +6796,7 @@
           .patch(arg_request, arg_customerId, arg_orgUnitPath,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgUnit(response);
+        checkOrgUnit(response as api.OrgUnit);
       })));
     });
 
@@ -6765,8 +6808,9 @@
       var arg_orgUnitPath = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrgUnit.fromJson(json);
-        checkOrgUnit(obj);
+        var obj =
+            api.OrgUnit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkOrgUnit(obj as api.OrgUnit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6816,7 +6860,7 @@
           .update(arg_request, arg_customerId, arg_orgUnitPath,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgUnit(response);
+        checkOrgUnit(response as api.OrgUnit);
       })));
     });
   });
@@ -6874,7 +6918,7 @@
       res
           .list(arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPrivileges(response);
+        checkPrivileges(response as api.Privileges);
       })));
     });
   });
@@ -6994,7 +7038,7 @@
       res
           .get(arg_customer, arg_buildingId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuilding(response);
+        checkBuilding(response as api.Building);
       })));
     });
 
@@ -7006,8 +7050,9 @@
       var arg_coordinatesSource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Building.fromJson(json);
-        checkBuilding(obj);
+        var obj =
+            api.Building.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBuilding(obj as api.Building);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7058,7 +7103,7 @@
           .insert(arg_request, arg_customer,
               coordinatesSource: arg_coordinatesSource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuilding(response);
+        checkBuilding(response as api.Building);
       })));
     });
 
@@ -7123,7 +7168,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildings(response);
+        checkBuildings(response as api.Buildings);
       })));
     });
 
@@ -7136,8 +7181,9 @@
       var arg_coordinatesSource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Building.fromJson(json);
-        checkBuilding(obj);
+        var obj =
+            api.Building.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBuilding(obj as api.Building);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7191,7 +7237,7 @@
           .patch(arg_request, arg_customer, arg_buildingId,
               coordinatesSource: arg_coordinatesSource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuilding(response);
+        checkBuilding(response as api.Building);
       })));
     });
 
@@ -7204,8 +7250,9 @@
       var arg_coordinatesSource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Building.fromJson(json);
-        checkBuilding(obj);
+        var obj =
+            api.Building.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBuilding(obj as api.Building);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7259,7 +7306,7 @@
           .update(arg_request, arg_customer, arg_buildingId,
               coordinatesSource: arg_coordinatesSource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuilding(response);
+        checkBuilding(response as api.Building);
       })));
     });
   });
@@ -7379,7 +7426,7 @@
       res
           .get(arg_customer, arg_calendarResourceId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarResource(response);
+        checkCalendarResource(response as api.CalendarResource);
       })));
     });
 
@@ -7390,8 +7437,9 @@
       var arg_customer = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CalendarResource.fromJson(json);
-        checkCalendarResource(obj);
+        var obj = api.CalendarResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCalendarResource(obj as api.CalendarResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7439,7 +7487,7 @@
       res
           .insert(arg_request, arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarResource(response);
+        checkCalendarResource(response as api.CalendarResource);
       })));
     });
 
@@ -7511,7 +7559,7 @@
               query: arg_query,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarResources(response);
+        checkCalendarResources(response as api.CalendarResources);
       })));
     });
 
@@ -7523,8 +7571,9 @@
       var arg_calendarResourceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CalendarResource.fromJson(json);
-        checkCalendarResource(obj);
+        var obj = api.CalendarResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCalendarResource(obj as api.CalendarResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7576,7 +7625,7 @@
           .patch(arg_request, arg_customer, arg_calendarResourceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarResource(response);
+        checkCalendarResource(response as api.CalendarResource);
       })));
     });
 
@@ -7588,8 +7637,9 @@
       var arg_calendarResourceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CalendarResource.fromJson(json);
-        checkCalendarResource(obj);
+        var obj = api.CalendarResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCalendarResource(obj as api.CalendarResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7641,7 +7691,7 @@
           .update(arg_request, arg_customer, arg_calendarResourceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarResource(response);
+        checkCalendarResource(response as api.CalendarResource);
       })));
     });
   });
@@ -7761,7 +7811,7 @@
       res
           .get(arg_customer, arg_featureKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeature(response);
+        checkFeature(response as api.Feature);
       })));
     });
 
@@ -7772,8 +7822,9 @@
       var arg_customer = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Feature.fromJson(json);
-        checkFeature(obj);
+        var obj =
+            api.Feature.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFeature(obj as api.Feature);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7821,7 +7872,7 @@
       res
           .insert(arg_request, arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeature(response);
+        checkFeature(response as api.Feature);
       })));
     });
 
@@ -7886,7 +7937,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeatures(response);
+        checkFeatures(response as api.Features);
       })));
     });
 
@@ -7898,8 +7949,9 @@
       var arg_featureKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Feature.fromJson(json);
-        checkFeature(obj);
+        var obj =
+            api.Feature.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFeature(obj as api.Feature);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7951,7 +8003,7 @@
           .patch(arg_request, arg_customer, arg_featureKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeature(response);
+        checkFeature(response as api.Feature);
       })));
     });
 
@@ -7963,8 +8015,9 @@
       var arg_oldName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FeatureRename.fromJson(json);
-        checkFeatureRename(obj);
+        var obj = api.FeatureRename.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFeatureRename(obj as api.FeatureRename);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8031,8 +8084,9 @@
       var arg_featureKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Feature.fromJson(json);
-        checkFeature(obj);
+        var obj =
+            api.Feature.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFeature(obj as api.Feature);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8084,7 +8138,7 @@
           .update(arg_request, arg_customer, arg_featureKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeature(response);
+        checkFeature(response as api.Feature);
       })));
     });
   });
@@ -8204,7 +8258,7 @@
       res
           .get(arg_customer, arg_roleAssignmentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoleAssignment(response);
+        checkRoleAssignment(response as api.RoleAssignment);
       })));
     });
 
@@ -8215,8 +8269,9 @@
       var arg_customer = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RoleAssignment.fromJson(json);
-        checkRoleAssignment(obj);
+        var obj = api.RoleAssignment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRoleAssignment(obj as api.RoleAssignment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8264,7 +8319,7 @@
       res
           .insert(arg_request, arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoleAssignment(response);
+        checkRoleAssignment(response as api.RoleAssignment);
       })));
     });
 
@@ -8336,7 +8391,7 @@
               userKey: arg_userKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoleAssignments(response);
+        checkRoleAssignments(response as api.RoleAssignments);
       })));
     });
   });
@@ -8456,7 +8511,7 @@
       res
           .get(arg_customer, arg_roleId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -8467,8 +8522,9 @@
       var arg_customer = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Role.fromJson(json);
-        checkRole(obj);
+        var obj =
+            api.Role.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRole(obj as api.Role);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8516,7 +8572,7 @@
       res
           .insert(arg_request, arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -8581,7 +8637,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoles(response);
+        checkRoles(response as api.Roles);
       })));
     });
 
@@ -8593,8 +8649,9 @@
       var arg_roleId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Role.fromJson(json);
-        checkRole(obj);
+        var obj =
+            api.Role.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRole(obj as api.Role);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8645,7 +8702,7 @@
       res
           .patch(arg_request, arg_customer, arg_roleId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -8657,8 +8714,9 @@
       var arg_roleId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Role.fromJson(json);
-        checkRole(obj);
+        var obj =
+            api.Role.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRole(obj as api.Role);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8709,7 +8767,7 @@
       res
           .update(arg_request, arg_customer, arg_roleId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
   });
@@ -8829,7 +8887,7 @@
       res
           .get(arg_customerId, arg_schemaKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSchema(response);
+        checkSchema(response as api.Schema);
       })));
     });
 
@@ -8840,8 +8898,9 @@
       var arg_customerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Schema.fromJson(json);
-        checkSchema(obj);
+        var obj =
+            api.Schema.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSchema(obj as api.Schema);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8889,7 +8948,7 @@
       res
           .insert(arg_request, arg_customerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSchema(response);
+        checkSchema(response as api.Schema);
       })));
     });
 
@@ -8945,7 +9004,7 @@
       res
           .list(arg_customerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSchemas(response);
+        checkSchemas(response as api.Schemas);
       })));
     });
 
@@ -8957,8 +9016,9 @@
       var arg_schemaKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Schema.fromJson(json);
-        checkSchema(obj);
+        var obj =
+            api.Schema.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSchema(obj as api.Schema);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9010,7 +9070,7 @@
           .patch(arg_request, arg_customerId, arg_schemaKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSchema(response);
+        checkSchema(response as api.Schema);
       })));
     });
 
@@ -9022,8 +9082,9 @@
       var arg_schemaKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Schema.fromJson(json);
-        checkSchema(obj);
+        var obj =
+            api.Schema.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSchema(obj as api.Schema);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9075,7 +9136,7 @@
           .update(arg_request, arg_customerId, arg_schemaKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSchema(response);
+        checkSchema(response as api.Schema);
       })));
     });
   });
@@ -9195,7 +9256,7 @@
       res
           .get(arg_userKey, arg_clientId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkToken(response);
+        checkToken(response as api.Token);
       })));
     });
 
@@ -9251,7 +9312,7 @@
       res
           .list(arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTokens(response);
+        checkTokens(response as api.Tokens);
       })));
     });
   });
@@ -9420,7 +9481,7 @@
               viewType: arg_viewType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -9430,8 +9491,9 @@
       var arg_request = buildUser();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.User.fromJson(json);
-        checkUser(obj);
+        var obj =
+            api.User.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUser(obj as api.User);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9470,7 +9532,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -9559,7 +9621,7 @@
               viewType: arg_viewType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsers(response);
+        checkUsers(response as api.Users);
       })));
     });
 
@@ -9570,8 +9632,9 @@
       var arg_userKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserMakeAdmin.fromJson(json);
-        checkUserMakeAdmin(obj);
+        var obj = api.UserMakeAdmin.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUserMakeAdmin(obj as api.UserMakeAdmin);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9628,8 +9691,9 @@
       var arg_userKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.User.fromJson(json);
-        checkUser(obj);
+        var obj =
+            api.User.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUser(obj as api.User);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9671,7 +9735,7 @@
       res
           .patch(arg_request, arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -9736,8 +9800,9 @@
       var arg_userKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserUndelete.fromJson(json);
-        checkUserUndelete(obj);
+        var obj = api.UserUndelete.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUserUndelete(obj as api.UserUndelete);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9794,8 +9859,9 @@
       var arg_userKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.User.fromJson(json);
-        checkUser(obj);
+        var obj =
+            api.User.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUser(obj as api.User);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9837,7 +9903,7 @@
       res
           .update(arg_request, arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -9859,8 +9925,9 @@
       var arg_viewType = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9933,7 +10000,7 @@
               viewType: arg_viewType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -10004,8 +10071,9 @@
       var arg_userKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Alias.fromJson(json);
-        checkAlias(obj);
+        var obj =
+            api.Alias.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAlias(obj as api.Alias);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10053,7 +10121,7 @@
       res
           .insert(arg_request, arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAlias(response);
+        checkAlias(response as api.Alias);
       })));
     });
 
@@ -10109,7 +10177,7 @@
       res
           .list(arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAliases(response);
+        checkAliases(response as api.Aliases);
       })));
     });
 
@@ -10121,8 +10189,9 @@
       var arg_event = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10172,7 +10241,7 @@
           .watch(arg_request, arg_userKey,
               event: arg_event, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -10284,7 +10353,7 @@
       res
           .get(arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserPhoto(response);
+        checkUserPhoto(response as api.UserPhoto);
       })));
     });
 
@@ -10295,8 +10364,9 @@
       var arg_userKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserPhoto.fromJson(json);
-        checkUserPhoto(obj);
+        var obj =
+            api.UserPhoto.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUserPhoto(obj as api.UserPhoto);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10344,7 +10414,7 @@
       res
           .patch(arg_request, arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserPhoto(response);
+        checkUserPhoto(response as api.UserPhoto);
       })));
     });
 
@@ -10355,8 +10425,9 @@
       var arg_userKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserPhoto.fromJson(json);
-        checkUserPhoto(obj);
+        var obj =
+            api.UserPhoto.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUserPhoto(obj as api.UserPhoto);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10404,7 +10475,7 @@
       res
           .update(arg_request, arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserPhoto(response);
+        checkUserPhoto(response as api.UserPhoto);
       })));
     });
   });
@@ -10570,7 +10641,7 @@
       res
           .list(arg_userKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVerificationCodes(response);
+        checkVerificationCodes(response as api.VerificationCodes);
       })));
     });
   });
diff --git a/generated/googleapis/test/admin/reports_v1_test.dart b/generated/googleapis/test/admin/reports_v1_test.dart
index fadf651..7ce84fe 100644
--- a/generated/googleapis/test/admin/reports_v1_test.dart
+++ b/generated/googleapis/test/admin/reports_v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed4843(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActivity(o[0]);
-  checkActivity(o[1]);
+  checkActivity(o[0] as api.Activity);
+  checkActivity(o[1] as api.Activity);
 }
 
 core.int buildCounterActivities = 0;
@@ -146,8 +146,8 @@
 
 void checkUnnamed4844(core.List<api.NestedParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNestedParameter(o[0]);
-  checkNestedParameter(o[1]);
+  checkNestedParameter(o[0] as api.NestedParameter);
+  checkNestedParameter(o[1] as api.NestedParameter);
 }
 
 core.int buildCounterActivityEventsParametersMessageValue = 0;
@@ -193,8 +193,8 @@
 
 void checkUnnamed4846(core.List<api.NestedParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNestedParameter(o[0]);
-  checkNestedParameter(o[1]);
+  checkNestedParameter(o[0] as api.NestedParameter);
+  checkNestedParameter(o[1] as api.NestedParameter);
 }
 
 core.int buildCounterActivityEventsParametersMultiMessageValue = 0;
@@ -228,8 +228,10 @@
 void checkUnnamed4847(
     core.List<api.ActivityEventsParametersMultiMessageValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActivityEventsParametersMultiMessageValue(o[0]);
-  checkActivityEventsParametersMultiMessageValue(o[1]);
+  checkActivityEventsParametersMultiMessageValue(
+      o[0] as api.ActivityEventsParametersMultiMessageValue);
+  checkActivityEventsParametersMultiMessageValue(
+      o[1] as api.ActivityEventsParametersMultiMessageValue);
 }
 
 core.List<core.String> buildUnnamed4848() {
@@ -268,7 +270,8 @@
   if (buildCounterActivityEventsParameters < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkActivityEventsParametersMessageValue(o.messageValue);
+    checkActivityEventsParametersMessageValue(
+        o.messageValue as api.ActivityEventsParametersMessageValue);
     checkUnnamed4845(o.multiIntValue);
     checkUnnamed4847(o.multiMessageValue);
     checkUnnamed4848(o.multiValue);
@@ -287,8 +290,8 @@
 
 void checkUnnamed4849(core.List<api.ActivityEventsParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActivityEventsParameters(o[0]);
-  checkActivityEventsParameters(o[1]);
+  checkActivityEventsParameters(o[0] as api.ActivityEventsParameters);
+  checkActivityEventsParameters(o[1] as api.ActivityEventsParameters);
 }
 
 core.int buildCounterActivityEvents = 0;
@@ -323,8 +326,8 @@
 
 void checkUnnamed4850(core.List<api.ActivityEvents> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActivityEvents(o[0]);
-  checkActivityEvents(o[1]);
+  checkActivityEvents(o[0] as api.ActivityEvents);
+  checkActivityEvents(o[1] as api.ActivityEvents);
 }
 
 core.int buildCounterActivityId = 0;
@@ -373,10 +376,10 @@
 void checkActivity(api.Activity o) {
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
-    checkActivityActor(o.actor);
+    checkActivityActor(o.actor as api.ActivityActor);
     unittest.expect(o.etag, unittest.equals('foo'));
     checkUnnamed4850(o.events);
-    checkActivityId(o.id);
+    checkActivityId(o.id as api.ActivityId);
     unittest.expect(o.ipAddress, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.ownerDomain, unittest.equals('foo'));
@@ -612,8 +615,8 @@
 
 void checkUnnamed4857(core.List<api.UsageReportParameters> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageReportParameters(o[0]);
-  checkUsageReportParameters(o[1]);
+  checkUsageReportParameters(o[0] as api.UsageReportParameters);
+  checkUsageReportParameters(o[1] as api.UsageReportParameters);
 }
 
 core.int buildCounterUsageReport = 0;
@@ -635,7 +638,7 @@
   buildCounterUsageReport++;
   if (buildCounterUsageReport < 3) {
     unittest.expect(o.date, unittest.equals('foo'));
-    checkUsageReportEntity(o.entity);
+    checkUsageReportEntity(o.entity as api.UsageReportEntity);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed4857(o.parameters);
@@ -652,8 +655,8 @@
 
 void checkUnnamed4858(core.List<api.UsageReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageReport(o[0]);
-  checkUsageReport(o[1]);
+  checkUsageReport(o[0] as api.UsageReport);
+  checkUsageReport(o[1] as api.UsageReport);
 }
 
 core.int buildCounterUsageReportsWarningsData = 0;
@@ -686,8 +689,8 @@
 
 void checkUnnamed4859(core.List<api.UsageReportsWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageReportsWarningsData(o[0]);
-  checkUsageReportsWarningsData(o[1]);
+  checkUsageReportsWarningsData(o[0] as api.UsageReportsWarningsData);
+  checkUsageReportsWarningsData(o[1] as api.UsageReportsWarningsData);
 }
 
 core.int buildCounterUsageReportsWarnings = 0;
@@ -722,8 +725,8 @@
 
 void checkUnnamed4860(core.List<api.UsageReportsWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageReportsWarnings(o[0]);
-  checkUsageReportsWarnings(o[1]);
+  checkUsageReportsWarnings(o[0] as api.UsageReportsWarnings);
+  checkUsageReportsWarnings(o[1] as api.UsageReportsWarnings);
 }
 
 core.int buildCounterUsageReports = 0;
@@ -758,7 +761,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivities();
       var od = api.Activities.fromJson(o.toJson());
-      checkActivities(od);
+      checkActivities(od as api.Activities);
     });
   });
 
@@ -766,7 +769,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityActor();
       var od = api.ActivityActor.fromJson(o.toJson());
-      checkActivityActor(od);
+      checkActivityActor(od as api.ActivityActor);
     });
   });
 
@@ -774,7 +777,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityEventsParametersMessageValue();
       var od = api.ActivityEventsParametersMessageValue.fromJson(o.toJson());
-      checkActivityEventsParametersMessageValue(od);
+      checkActivityEventsParametersMessageValue(
+          od as api.ActivityEventsParametersMessageValue);
     });
   });
 
@@ -783,7 +787,8 @@
       var o = buildActivityEventsParametersMultiMessageValue();
       var od =
           api.ActivityEventsParametersMultiMessageValue.fromJson(o.toJson());
-      checkActivityEventsParametersMultiMessageValue(od);
+      checkActivityEventsParametersMultiMessageValue(
+          od as api.ActivityEventsParametersMultiMessageValue);
     });
   });
 
@@ -791,7 +796,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityEventsParameters();
       var od = api.ActivityEventsParameters.fromJson(o.toJson());
-      checkActivityEventsParameters(od);
+      checkActivityEventsParameters(od as api.ActivityEventsParameters);
     });
   });
 
@@ -799,7 +804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityEvents();
       var od = api.ActivityEvents.fromJson(o.toJson());
-      checkActivityEvents(od);
+      checkActivityEvents(od as api.ActivityEvents);
     });
   });
 
@@ -807,7 +812,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityId();
       var od = api.ActivityId.fromJson(o.toJson());
-      checkActivityId(od);
+      checkActivityId(od as api.ActivityId);
     });
   });
 
@@ -815,7 +820,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivity();
       var od = api.Activity.fromJson(o.toJson());
-      checkActivity(od);
+      checkActivity(od as api.Activity);
     });
   });
 
@@ -823,7 +828,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -831,7 +836,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNestedParameter();
       var od = api.NestedParameter.fromJson(o.toJson());
-      checkNestedParameter(od);
+      checkNestedParameter(od as api.NestedParameter);
     });
   });
 
@@ -839,7 +844,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageReportEntity();
       var od = api.UsageReportEntity.fromJson(o.toJson());
-      checkUsageReportEntity(od);
+      checkUsageReportEntity(od as api.UsageReportEntity);
     });
   });
 
@@ -847,7 +852,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageReportParameters();
       var od = api.UsageReportParameters.fromJson(o.toJson());
-      checkUsageReportParameters(od);
+      checkUsageReportParameters(od as api.UsageReportParameters);
     });
   });
 
@@ -855,7 +860,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageReport();
       var od = api.UsageReport.fromJson(o.toJson());
-      checkUsageReport(od);
+      checkUsageReport(od as api.UsageReport);
     });
   });
 
@@ -863,7 +868,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageReportsWarningsData();
       var od = api.UsageReportsWarningsData.fromJson(o.toJson());
-      checkUsageReportsWarningsData(od);
+      checkUsageReportsWarningsData(od as api.UsageReportsWarningsData);
     });
   });
 
@@ -871,7 +876,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageReportsWarnings();
       var od = api.UsageReportsWarnings.fromJson(o.toJson());
-      checkUsageReportsWarnings(od);
+      checkUsageReportsWarnings(od as api.UsageReportsWarnings);
     });
   });
 
@@ -879,7 +884,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageReports();
       var od = api.UsageReports.fromJson(o.toJson());
-      checkUsageReports(od);
+      checkUsageReports(od as api.UsageReports);
     });
   });
 
@@ -977,7 +982,7 @@
               startTime: arg_startTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkActivities(response);
+        checkActivities(response as api.Activities);
       })));
     });
 
@@ -998,8 +1003,9 @@
       var arg_startTime = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1084,7 +1090,7 @@
               startTime: arg_startTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -1096,8 +1102,9 @@
       var arg_request = buildChannel();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1199,7 +1206,7 @@
               parameters: arg_parameters,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsageReports(response);
+        checkUsageReports(response as api.UsageReports);
       })));
     });
   });
@@ -1292,7 +1299,7 @@
               parameters: arg_parameters,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsageReports(response);
+        checkUsageReports(response as api.UsageReports);
       })));
     });
   });
@@ -1379,7 +1386,7 @@
               parameters: arg_parameters,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsageReports(response);
+        checkUsageReports(response as api.UsageReports);
       })));
     });
   });
diff --git a/generated/googleapis/test/admob/v1_test.dart b/generated/googleapis/test/admob/v1_test.dart
index 766b5dc..edf0cbe 100644
--- a/generated/googleapis/test/admob/v1_test.dart
+++ b/generated/googleapis/test/admob/v1_test.dart
@@ -112,8 +112,8 @@
 void checkDateRange(api.DateRange o) {
   buildCounterDateRange++;
   if (buildCounterDateRange < 3) {
-    checkDate(o.endDate);
-    checkDate(o.startDate);
+    checkDate(o.endDate as api.Date);
+    checkDate(o.startDate as api.Date);
   }
   buildCounterDateRange--;
 }
@@ -132,7 +132,7 @@
 void checkGenerateMediationReportRequest(api.GenerateMediationReportRequest o) {
   buildCounterGenerateMediationReportRequest++;
   if (buildCounterGenerateMediationReportRequest < 3) {
-    checkMediationReportSpec(o.reportSpec);
+    checkMediationReportSpec(o.reportSpec as api.MediationReportSpec);
   }
   buildCounterGenerateMediationReportRequest--;
 }
@@ -154,9 +154,9 @@
     api.GenerateMediationReportResponse o) {
   buildCounterGenerateMediationReportResponse++;
   if (buildCounterGenerateMediationReportResponse < 3) {
-    checkReportFooter(o.footer);
-    checkReportHeader(o.header);
-    checkReportRow(o.row);
+    checkReportFooter(o.footer as api.ReportFooter);
+    checkReportHeader(o.header as api.ReportHeader);
+    checkReportRow(o.row as api.ReportRow);
   }
   buildCounterGenerateMediationReportResponse--;
 }
@@ -175,7 +175,7 @@
 void checkGenerateNetworkReportRequest(api.GenerateNetworkReportRequest o) {
   buildCounterGenerateNetworkReportRequest++;
   if (buildCounterGenerateNetworkReportRequest < 3) {
-    checkNetworkReportSpec(o.reportSpec);
+    checkNetworkReportSpec(o.reportSpec as api.NetworkReportSpec);
   }
   buildCounterGenerateNetworkReportRequest--;
 }
@@ -196,9 +196,9 @@
 void checkGenerateNetworkReportResponse(api.GenerateNetworkReportResponse o) {
   buildCounterGenerateNetworkReportResponse++;
   if (buildCounterGenerateNetworkReportResponse < 3) {
-    checkReportFooter(o.footer);
-    checkReportHeader(o.header);
-    checkReportRow(o.row);
+    checkReportFooter(o.footer as api.ReportFooter);
+    checkReportHeader(o.header as api.ReportHeader);
+    checkReportRow(o.row as api.ReportRow);
   }
   buildCounterGenerateNetworkReportResponse--;
 }
@@ -212,8 +212,8 @@
 
 void checkUnnamed5706(core.List<api.PublisherAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPublisherAccount(o[0]);
-  checkPublisherAccount(o[1]);
+  checkPublisherAccount(o[0] as api.PublisherAccount);
+  checkPublisherAccount(o[1] as api.PublisherAccount);
 }
 
 core.int buildCounterListPublisherAccountsResponse = 0;
@@ -267,8 +267,10 @@
 
 void checkUnnamed5707(core.List<api.MediationReportSpecDimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMediationReportSpecDimensionFilter(o[0]);
-  checkMediationReportSpecDimensionFilter(o[1]);
+  checkMediationReportSpecDimensionFilter(
+      o[0] as api.MediationReportSpecDimensionFilter);
+  checkMediationReportSpecDimensionFilter(
+      o[1] as api.MediationReportSpecDimensionFilter);
 }
 
 core.List<core.String> buildUnnamed5708() {
@@ -306,8 +308,10 @@
 
 void checkUnnamed5710(core.List<api.MediationReportSpecSortCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMediationReportSpecSortCondition(o[0]);
-  checkMediationReportSpecSortCondition(o[1]);
+  checkMediationReportSpecSortCondition(
+      o[0] as api.MediationReportSpecSortCondition);
+  checkMediationReportSpecSortCondition(
+      o[1] as api.MediationReportSpecSortCondition);
 }
 
 core.int buildCounterMediationReportSpec = 0;
@@ -331,10 +335,11 @@
 void checkMediationReportSpec(api.MediationReportSpec o) {
   buildCounterMediationReportSpec++;
   if (buildCounterMediationReportSpec < 3) {
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     checkUnnamed5707(o.dimensionFilters);
     checkUnnamed5708(o.dimensions);
-    checkLocalizationSettings(o.localizationSettings);
+    checkLocalizationSettings(
+        o.localizationSettings as api.LocalizationSettings);
     unittest.expect(o.maxReportRows, unittest.equals(42));
     checkUnnamed5709(o.metrics);
     checkUnnamed5710(o.sortConditions);
@@ -361,7 +366,7 @@
   buildCounterMediationReportSpecDimensionFilter++;
   if (buildCounterMediationReportSpecDimensionFilter < 3) {
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkStringList(o.matchesAny);
+    checkStringList(o.matchesAny as api.StringList);
   }
   buildCounterMediationReportSpecDimensionFilter--;
 }
@@ -399,8 +404,10 @@
 
 void checkUnnamed5711(core.List<api.NetworkReportSpecDimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkReportSpecDimensionFilter(o[0]);
-  checkNetworkReportSpecDimensionFilter(o[1]);
+  checkNetworkReportSpecDimensionFilter(
+      o[0] as api.NetworkReportSpecDimensionFilter);
+  checkNetworkReportSpecDimensionFilter(
+      o[1] as api.NetworkReportSpecDimensionFilter);
 }
 
 core.List<core.String> buildUnnamed5712() {
@@ -438,8 +445,10 @@
 
 void checkUnnamed5714(core.List<api.NetworkReportSpecSortCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkReportSpecSortCondition(o[0]);
-  checkNetworkReportSpecSortCondition(o[1]);
+  checkNetworkReportSpecSortCondition(
+      o[0] as api.NetworkReportSpecSortCondition);
+  checkNetworkReportSpecSortCondition(
+      o[1] as api.NetworkReportSpecSortCondition);
 }
 
 core.int buildCounterNetworkReportSpec = 0;
@@ -463,10 +472,11 @@
 void checkNetworkReportSpec(api.NetworkReportSpec o) {
   buildCounterNetworkReportSpec++;
   if (buildCounterNetworkReportSpec < 3) {
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     checkUnnamed5711(o.dimensionFilters);
     checkUnnamed5712(o.dimensions);
-    checkLocalizationSettings(o.localizationSettings);
+    checkLocalizationSettings(
+        o.localizationSettings as api.LocalizationSettings);
     unittest.expect(o.maxReportRows, unittest.equals(42));
     checkUnnamed5713(o.metrics);
     checkUnnamed5714(o.sortConditions);
@@ -492,7 +502,7 @@
   buildCounterNetworkReportSpecDimensionFilter++;
   if (buildCounterNetworkReportSpecDimensionFilter < 3) {
     unittest.expect(o.dimension, unittest.equals('foo'));
-    checkStringList(o.matchesAny);
+    checkStringList(o.matchesAny as api.StringList);
   }
   buildCounterNetworkReportSpecDimensionFilter--;
 }
@@ -554,8 +564,8 @@
 
 void checkUnnamed5715(core.List<api.ReportWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportWarning(o[0]);
-  checkReportWarning(o[1]);
+  checkReportWarning(o[0] as api.ReportWarning);
+  checkReportWarning(o[1] as api.ReportWarning);
 }
 
 core.int buildCounterReportFooter = 0;
@@ -595,8 +605,9 @@
 void checkReportHeader(api.ReportHeader o) {
   buildCounterReportHeader++;
   if (buildCounterReportHeader < 3) {
-    checkDateRange(o.dateRange);
-    checkLocalizationSettings(o.localizationSettings);
+    checkDateRange(o.dateRange as api.DateRange);
+    checkLocalizationSettings(
+        o.localizationSettings as api.LocalizationSettings);
     unittest.expect(o.reportingTimeZone, unittest.equals('foo'));
   }
   buildCounterReportHeader--;
@@ -611,8 +622,8 @@
 
 void checkUnnamed5716(core.Map<core.String, api.ReportRowDimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportRowDimensionValue(o['x']);
-  checkReportRowDimensionValue(o['y']);
+  checkReportRowDimensionValue(o['x'] as api.ReportRowDimensionValue);
+  checkReportRowDimensionValue(o['y'] as api.ReportRowDimensionValue);
 }
 
 core.Map<core.String, api.ReportRowMetricValue> buildUnnamed5717() {
@@ -624,8 +635,8 @@
 
 void checkUnnamed5717(core.Map<core.String, api.ReportRowMetricValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportRowMetricValue(o['x']);
-  checkReportRowMetricValue(o['y']);
+  checkReportRowMetricValue(o['x'] as api.ReportRowMetricValue);
+  checkReportRowMetricValue(o['y'] as api.ReportRowMetricValue);
 }
 
 core.int buildCounterReportRow = 0;
@@ -751,7 +762,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -759,7 +770,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateRange();
       var od = api.DateRange.fromJson(o.toJson());
-      checkDateRange(od);
+      checkDateRange(od as api.DateRange);
     });
   });
 
@@ -767,7 +778,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateMediationReportRequest();
       var od = api.GenerateMediationReportRequest.fromJson(o.toJson());
-      checkGenerateMediationReportRequest(od);
+      checkGenerateMediationReportRequest(
+          od as api.GenerateMediationReportRequest);
     });
   });
 
@@ -775,7 +787,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateMediationReportResponse();
       var od = api.GenerateMediationReportResponse.fromJson(o.toJson());
-      checkGenerateMediationReportResponse(od);
+      checkGenerateMediationReportResponse(
+          od as api.GenerateMediationReportResponse);
     });
   });
 
@@ -783,7 +796,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateNetworkReportRequest();
       var od = api.GenerateNetworkReportRequest.fromJson(o.toJson());
-      checkGenerateNetworkReportRequest(od);
+      checkGenerateNetworkReportRequest(od as api.GenerateNetworkReportRequest);
     });
   });
 
@@ -791,7 +804,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateNetworkReportResponse();
       var od = api.GenerateNetworkReportResponse.fromJson(o.toJson());
-      checkGenerateNetworkReportResponse(od);
+      checkGenerateNetworkReportResponse(
+          od as api.GenerateNetworkReportResponse);
     });
   });
 
@@ -799,7 +813,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPublisherAccountsResponse();
       var od = api.ListPublisherAccountsResponse.fromJson(o.toJson());
-      checkListPublisherAccountsResponse(od);
+      checkListPublisherAccountsResponse(
+          od as api.ListPublisherAccountsResponse);
     });
   });
 
@@ -807,7 +822,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizationSettings();
       var od = api.LocalizationSettings.fromJson(o.toJson());
-      checkLocalizationSettings(od);
+      checkLocalizationSettings(od as api.LocalizationSettings);
     });
   });
 
@@ -815,7 +830,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMediationReportSpec();
       var od = api.MediationReportSpec.fromJson(o.toJson());
-      checkMediationReportSpec(od);
+      checkMediationReportSpec(od as api.MediationReportSpec);
     });
   });
 
@@ -823,7 +838,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMediationReportSpecDimensionFilter();
       var od = api.MediationReportSpecDimensionFilter.fromJson(o.toJson());
-      checkMediationReportSpecDimensionFilter(od);
+      checkMediationReportSpecDimensionFilter(
+          od as api.MediationReportSpecDimensionFilter);
     });
   });
 
@@ -831,7 +847,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMediationReportSpecSortCondition();
       var od = api.MediationReportSpecSortCondition.fromJson(o.toJson());
-      checkMediationReportSpecSortCondition(od);
+      checkMediationReportSpecSortCondition(
+          od as api.MediationReportSpecSortCondition);
     });
   });
 
@@ -839,7 +856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkReportSpec();
       var od = api.NetworkReportSpec.fromJson(o.toJson());
-      checkNetworkReportSpec(od);
+      checkNetworkReportSpec(od as api.NetworkReportSpec);
     });
   });
 
@@ -847,7 +864,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkReportSpecDimensionFilter();
       var od = api.NetworkReportSpecDimensionFilter.fromJson(o.toJson());
-      checkNetworkReportSpecDimensionFilter(od);
+      checkNetworkReportSpecDimensionFilter(
+          od as api.NetworkReportSpecDimensionFilter);
     });
   });
 
@@ -855,7 +873,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkReportSpecSortCondition();
       var od = api.NetworkReportSpecSortCondition.fromJson(o.toJson());
-      checkNetworkReportSpecSortCondition(od);
+      checkNetworkReportSpecSortCondition(
+          od as api.NetworkReportSpecSortCondition);
     });
   });
 
@@ -863,7 +882,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublisherAccount();
       var od = api.PublisherAccount.fromJson(o.toJson());
-      checkPublisherAccount(od);
+      checkPublisherAccount(od as api.PublisherAccount);
     });
   });
 
@@ -871,7 +890,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportFooter();
       var od = api.ReportFooter.fromJson(o.toJson());
-      checkReportFooter(od);
+      checkReportFooter(od as api.ReportFooter);
     });
   });
 
@@ -879,7 +898,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportHeader();
       var od = api.ReportHeader.fromJson(o.toJson());
-      checkReportHeader(od);
+      checkReportHeader(od as api.ReportHeader);
     });
   });
 
@@ -887,7 +906,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRow();
       var od = api.ReportRow.fromJson(o.toJson());
-      checkReportRow(od);
+      checkReportRow(od as api.ReportRow);
     });
   });
 
@@ -895,7 +914,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRowDimensionValue();
       var od = api.ReportRowDimensionValue.fromJson(o.toJson());
-      checkReportRowDimensionValue(od);
+      checkReportRowDimensionValue(od as api.ReportRowDimensionValue);
     });
   });
 
@@ -903,7 +922,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRowMetricValue();
       var od = api.ReportRowMetricValue.fromJson(o.toJson());
-      checkReportRowMetricValue(od);
+      checkReportRowMetricValue(od as api.ReportRowMetricValue);
     });
   });
 
@@ -911,7 +930,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportWarning();
       var od = api.ReportWarning.fromJson(o.toJson());
-      checkReportWarning(od);
+      checkReportWarning(od as api.ReportWarning);
     });
   });
 
@@ -919,7 +938,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStringList();
       var od = api.StringList.fromJson(o.toJson());
-      checkStringList(od);
+      checkStringList(od as api.StringList);
     });
   });
 
@@ -968,7 +987,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPublisherAccount(response);
+        checkPublisherAccount(response as api.PublisherAccount);
       })));
     });
 
@@ -1023,7 +1042,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPublisherAccountsResponse(response);
+        checkListPublisherAccountsResponse(
+            response as api.ListPublisherAccountsResponse);
       })));
     });
   });
@@ -1036,8 +1056,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateMediationReportRequest.fromJson(json);
-        checkGenerateMediationReportRequest(obj);
+        var obj = api.GenerateMediationReportRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateMediationReportRequest(
+            obj as api.GenerateMediationReportRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1077,7 +1099,8 @@
       res
           .generate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateMediationReportResponse(response);
+        checkGenerateMediationReportResponse(
+            response as api.GenerateMediationReportResponse);
       })));
     });
   });
@@ -1090,8 +1113,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateNetworkReportRequest.fromJson(json);
-        checkGenerateNetworkReportRequest(obj);
+        var obj = api.GenerateNetworkReportRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateNetworkReportRequest(
+            obj as api.GenerateNetworkReportRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1131,7 +1156,8 @@
       res
           .generate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateNetworkReportResponse(response);
+        checkGenerateNetworkReportResponse(
+            response as api.GenerateNetworkReportResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/adsense/v1_4_test.dart b/generated/googleapis/test/adsense/v1_4_test.dart
index 4247924..da8143a 100644
--- a/generated/googleapis/test/adsense/v1_4_test.dart
+++ b/generated/googleapis/test/adsense/v1_4_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed3638(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccount = 0;
@@ -127,8 +127,8 @@
 
 void checkUnnamed3639(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccounts = 0;
@@ -192,8 +192,8 @@
 
 void checkUnnamed3640(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdClient(o[0]);
-  checkAdClient(o[1]);
+  checkAdClient(o[0] as api.AdClient);
+  checkAdClient(o[1] as api.AdClient);
 }
 
 core.int buildCounterAdClients = 0;
@@ -311,9 +311,9 @@
 void checkAdStyle(api.AdStyle o) {
   buildCounterAdStyle++;
   if (buildCounterAdStyle < 3) {
-    checkAdStyleColors(o.colors);
+    checkAdStyleColors(o.colors as api.AdStyleColors);
     unittest.expect(o.corners, unittest.equals('foo'));
-    checkAdStyleFont(o.font);
+    checkAdStyleFont(o.font as api.AdStyleFont);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAdStyle--;
@@ -360,7 +360,8 @@
 void checkAdUnitContentAdsSettings(api.AdUnitContentAdsSettings o) {
   buildCounterAdUnitContentAdsSettings++;
   if (buildCounterAdUnitContentAdsSettings < 3) {
-    checkAdUnitContentAdsSettingsBackupOption(o.backupOption);
+    checkAdUnitContentAdsSettingsBackupOption(
+        o.backupOption as api.AdUnitContentAdsSettingsBackupOption);
     unittest.expect(o.size, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -441,12 +442,14 @@
   buildCounterAdUnit++;
   if (buildCounterAdUnit < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkAdUnitContentAdsSettings(o.contentAdsSettings);
-    checkAdStyle(o.customStyle);
-    checkAdUnitFeedAdsSettings(o.feedAdsSettings);
+    checkAdUnitContentAdsSettings(
+        o.contentAdsSettings as api.AdUnitContentAdsSettings);
+    checkAdStyle(o.customStyle as api.AdStyle);
+    checkAdUnitFeedAdsSettings(o.feedAdsSettings as api.AdUnitFeedAdsSettings);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkAdUnitMobileContentAdsSettings(o.mobileContentAdsSettings);
+    checkAdUnitMobileContentAdsSettings(
+        o.mobileContentAdsSettings as api.AdUnitMobileContentAdsSettings);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.savedStyleId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -463,8 +466,8 @@
 
 void checkUnnamed3641(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdUnit(o[0]);
-  checkAdUnit(o[1]);
+  checkAdUnit(o[0] as api.AdUnit);
+  checkAdUnit(o[1] as api.AdUnit);
 }
 
 core.int buildCounterAdUnits = 0;
@@ -539,8 +542,10 @@
 
 void checkUnnamed3643(core.List<api.AdsenseReportsGenerateResponseHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdsenseReportsGenerateResponseHeaders(o[0]);
-  checkAdsenseReportsGenerateResponseHeaders(o[1]);
+  checkAdsenseReportsGenerateResponseHeaders(
+      o[0] as api.AdsenseReportsGenerateResponseHeaders);
+  checkAdsenseReportsGenerateResponseHeaders(
+      o[1] as api.AdsenseReportsGenerateResponseHeaders);
 }
 
 core.List<core.String> buildUnnamed3644() {
@@ -668,8 +673,8 @@
 
 void checkUnnamed3648(core.List<api.Alert> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAlert(o[0]);
-  checkAlert(o[1]);
+  checkAlert(o[0] as api.Alert);
+  checkAlert(o[1] as api.Alert);
 }
 
 core.int buildCounterAlerts = 0;
@@ -740,7 +745,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkCustomChannelTargetingInfo(o.targetingInfo);
+    checkCustomChannelTargetingInfo(
+        o.targetingInfo as api.CustomChannelTargetingInfo);
   }
   buildCounterCustomChannel--;
 }
@@ -754,8 +760,8 @@
 
 void checkUnnamed3649(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomChannel(o[0]);
-  checkCustomChannel(o[1]);
+  checkCustomChannel(o[0] as api.CustomChannel);
+  checkCustomChannel(o[1] as api.CustomChannel);
 }
 
 core.int buildCounterCustomChannels = 0;
@@ -792,8 +798,8 @@
 
 void checkUnnamed3650(core.List<api.ReportingMetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportingMetadataEntry(o[0]);
-  checkReportingMetadataEntry(o[1]);
+  checkReportingMetadataEntry(o[0] as api.ReportingMetadataEntry);
+  checkReportingMetadataEntry(o[1] as api.ReportingMetadataEntry);
 }
 
 core.int buildCounterMetadata = 0;
@@ -853,8 +859,8 @@
 
 void checkUnnamed3651(core.List<api.Payment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPayment(o[0]);
-  checkPayment(o[1]);
+  checkPayment(o[0] as api.Payment);
+  checkPayment(o[1] as api.Payment);
 }
 
 core.int buildCounterPayments = 0;
@@ -991,7 +997,7 @@
 void checkSavedAdStyle(api.SavedAdStyle o) {
   buildCounterSavedAdStyle++;
   if (buildCounterSavedAdStyle < 3) {
-    checkAdStyle(o.adStyle);
+    checkAdStyle(o.adStyle as api.AdStyle);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1008,8 +1014,8 @@
 
 void checkUnnamed3657(core.List<api.SavedAdStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSavedAdStyle(o[0]);
-  checkSavedAdStyle(o[1]);
+  checkSavedAdStyle(o[0] as api.SavedAdStyle);
+  checkSavedAdStyle(o[1] as api.SavedAdStyle);
 }
 
 core.int buildCounterSavedAdStyles = 0;
@@ -1069,8 +1075,8 @@
 
 void checkUnnamed3658(core.List<api.SavedReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSavedReport(o[0]);
-  checkSavedReport(o[1]);
+  checkSavedReport(o[0] as api.SavedReport);
+  checkSavedReport(o[1] as api.SavedReport);
 }
 
 core.int buildCounterSavedReports = 0;
@@ -1130,8 +1136,8 @@
 
 void checkUnnamed3659(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlChannel(o[0]);
-  checkUrlChannel(o[1]);
+  checkUrlChannel(o[0] as api.UrlChannel);
+  checkUrlChannel(o[1] as api.UrlChannel);
 }
 
 core.int buildCounterUrlChannels = 0;
@@ -1281,7 +1287,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -1289,7 +1295,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounts();
       var od = api.Accounts.fromJson(o.toJson());
-      checkAccounts(od);
+      checkAccounts(od as api.Accounts);
     });
   });
 
@@ -1297,7 +1303,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdClient();
       var od = api.AdClient.fromJson(o.toJson());
-      checkAdClient(od);
+      checkAdClient(od as api.AdClient);
     });
   });
 
@@ -1305,7 +1311,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdClients();
       var od = api.AdClients.fromJson(o.toJson());
-      checkAdClients(od);
+      checkAdClients(od as api.AdClients);
     });
   });
 
@@ -1313,7 +1319,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdCode();
       var od = api.AdCode.fromJson(o.toJson());
-      checkAdCode(od);
+      checkAdCode(od as api.AdCode);
     });
   });
 
@@ -1321,7 +1327,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdStyleColors();
       var od = api.AdStyleColors.fromJson(o.toJson());
-      checkAdStyleColors(od);
+      checkAdStyleColors(od as api.AdStyleColors);
     });
   });
 
@@ -1329,7 +1335,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdStyleFont();
       var od = api.AdStyleFont.fromJson(o.toJson());
-      checkAdStyleFont(od);
+      checkAdStyleFont(od as api.AdStyleFont);
     });
   });
 
@@ -1337,7 +1343,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdStyle();
       var od = api.AdStyle.fromJson(o.toJson());
-      checkAdStyle(od);
+      checkAdStyle(od as api.AdStyle);
     });
   });
 
@@ -1345,7 +1351,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnitContentAdsSettingsBackupOption();
       var od = api.AdUnitContentAdsSettingsBackupOption.fromJson(o.toJson());
-      checkAdUnitContentAdsSettingsBackupOption(od);
+      checkAdUnitContentAdsSettingsBackupOption(
+          od as api.AdUnitContentAdsSettingsBackupOption);
     });
   });
 
@@ -1353,7 +1360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnitContentAdsSettings();
       var od = api.AdUnitContentAdsSettings.fromJson(o.toJson());
-      checkAdUnitContentAdsSettings(od);
+      checkAdUnitContentAdsSettings(od as api.AdUnitContentAdsSettings);
     });
   });
 
@@ -1361,7 +1368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnitFeedAdsSettings();
       var od = api.AdUnitFeedAdsSettings.fromJson(o.toJson());
-      checkAdUnitFeedAdsSettings(od);
+      checkAdUnitFeedAdsSettings(od as api.AdUnitFeedAdsSettings);
     });
   });
 
@@ -1369,7 +1376,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnitMobileContentAdsSettings();
       var od = api.AdUnitMobileContentAdsSettings.fromJson(o.toJson());
-      checkAdUnitMobileContentAdsSettings(od);
+      checkAdUnitMobileContentAdsSettings(
+          od as api.AdUnitMobileContentAdsSettings);
     });
   });
 
@@ -1377,7 +1385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnit();
       var od = api.AdUnit.fromJson(o.toJson());
-      checkAdUnit(od);
+      checkAdUnit(od as api.AdUnit);
     });
   });
 
@@ -1385,7 +1393,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnits();
       var od = api.AdUnits.fromJson(o.toJson());
-      checkAdUnits(od);
+      checkAdUnits(od as api.AdUnits);
     });
   });
 
@@ -1393,7 +1401,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdsenseReportsGenerateResponseHeaders();
       var od = api.AdsenseReportsGenerateResponseHeaders.fromJson(o.toJson());
-      checkAdsenseReportsGenerateResponseHeaders(od);
+      checkAdsenseReportsGenerateResponseHeaders(
+          od as api.AdsenseReportsGenerateResponseHeaders);
     });
   });
 
@@ -1401,7 +1410,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdsenseReportsGenerateResponse();
       var od = api.AdsenseReportsGenerateResponse.fromJson(o.toJson());
-      checkAdsenseReportsGenerateResponse(od);
+      checkAdsenseReportsGenerateResponse(
+          od as api.AdsenseReportsGenerateResponse);
     });
   });
 
@@ -1409,7 +1419,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAlert();
       var od = api.Alert.fromJson(o.toJson());
-      checkAlert(od);
+      checkAlert(od as api.Alert);
     });
   });
 
@@ -1417,7 +1427,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAlerts();
       var od = api.Alerts.fromJson(o.toJson());
-      checkAlerts(od);
+      checkAlerts(od as api.Alerts);
     });
   });
 
@@ -1425,7 +1435,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomChannelTargetingInfo();
       var od = api.CustomChannelTargetingInfo.fromJson(o.toJson());
-      checkCustomChannelTargetingInfo(od);
+      checkCustomChannelTargetingInfo(od as api.CustomChannelTargetingInfo);
     });
   });
 
@@ -1433,7 +1443,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomChannel();
       var od = api.CustomChannel.fromJson(o.toJson());
-      checkCustomChannel(od);
+      checkCustomChannel(od as api.CustomChannel);
     });
   });
 
@@ -1441,7 +1451,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomChannels();
       var od = api.CustomChannels.fromJson(o.toJson());
-      checkCustomChannels(od);
+      checkCustomChannels(od as api.CustomChannels);
     });
   });
 
@@ -1449,7 +1459,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadata();
       var od = api.Metadata.fromJson(o.toJson());
-      checkMetadata(od);
+      checkMetadata(od as api.Metadata);
     });
   });
 
@@ -1457,7 +1467,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPayment();
       var od = api.Payment.fromJson(o.toJson());
-      checkPayment(od);
+      checkPayment(od as api.Payment);
     });
   });
 
@@ -1465,7 +1475,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPayments();
       var od = api.Payments.fromJson(o.toJson());
-      checkPayments(od);
+      checkPayments(od as api.Payments);
     });
   });
 
@@ -1473,7 +1483,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportingMetadataEntry();
       var od = api.ReportingMetadataEntry.fromJson(o.toJson());
-      checkReportingMetadataEntry(od);
+      checkReportingMetadataEntry(od as api.ReportingMetadataEntry);
     });
   });
 
@@ -1481,7 +1491,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSavedAdStyle();
       var od = api.SavedAdStyle.fromJson(o.toJson());
-      checkSavedAdStyle(od);
+      checkSavedAdStyle(od as api.SavedAdStyle);
     });
   });
 
@@ -1489,7 +1499,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSavedAdStyles();
       var od = api.SavedAdStyles.fromJson(o.toJson());
-      checkSavedAdStyles(od);
+      checkSavedAdStyles(od as api.SavedAdStyles);
     });
   });
 
@@ -1497,7 +1507,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSavedReport();
       var od = api.SavedReport.fromJson(o.toJson());
-      checkSavedReport(od);
+      checkSavedReport(od as api.SavedReport);
     });
   });
 
@@ -1505,7 +1515,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSavedReports();
       var od = api.SavedReports.fromJson(o.toJson());
-      checkSavedReports(od);
+      checkSavedReports(od as api.SavedReports);
     });
   });
 
@@ -1513,7 +1523,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlChannel();
       var od = api.UrlChannel.fromJson(o.toJson());
-      checkUrlChannel(od);
+      checkUrlChannel(od as api.UrlChannel);
     });
   });
 
@@ -1521,7 +1531,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlChannels();
       var od = api.UrlChannels.fromJson(o.toJson());
-      checkUrlChannels(od);
+      checkUrlChannels(od as api.UrlChannels);
     });
   });
 
@@ -1577,7 +1587,7 @@
       res
           .get(arg_accountId, tree: arg_tree, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -1635,7 +1645,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccounts(response);
+        checkAccounts(response as api.Accounts);
       })));
     });
   });
@@ -1710,7 +1720,7 @@
           .getAdCode(arg_accountId, arg_adClientId,
               tagPartner: arg_tagPartner, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdCode(response);
+        checkAdCode(response as api.AdCode);
       })));
     });
 
@@ -1778,7 +1788,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdClients(response);
+        checkAdClients(response as api.AdClients);
       })));
     });
   });
@@ -1854,7 +1864,7 @@
           .get(arg_accountId, arg_adClientId, arg_adUnitId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnit(response);
+        checkAdUnit(response as api.AdUnit);
       })));
     });
 
@@ -1934,7 +1944,7 @@
           .getAdCode(arg_accountId, arg_adClientId, arg_adUnitId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdCode(response);
+        checkAdCode(response as api.AdCode);
       })));
     });
 
@@ -2016,7 +2026,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnits(response);
+        checkAdUnits(response as api.AdUnits);
       })));
     });
   });
@@ -2106,7 +2116,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannels(response);
+        checkCustomChannels(response as api.CustomChannels);
       })));
     });
   });
@@ -2230,7 +2240,7 @@
       res
           .list(arg_accountId, locale: arg_locale, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAlerts(response);
+        checkAlerts(response as api.Alerts);
       })));
     });
   });
@@ -2306,7 +2316,7 @@
           .get(arg_accountId, arg_adClientId, arg_customChannelId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannel(response);
+        checkCustomChannel(response as api.CustomChannel);
       })));
     });
 
@@ -2384,7 +2394,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannels(response);
+        checkCustomChannels(response as api.CustomChannels);
       })));
     });
   });
@@ -2478,7 +2488,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnits(response);
+        checkAdUnits(response as api.AdUnits);
       })));
     });
   });
@@ -2539,7 +2549,7 @@
       res
           .list(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPayments(response);
+        checkPayments(response as api.Payments);
       })));
     });
   });
@@ -2641,7 +2651,8 @@
               useTimezoneReporting: arg_useTimezoneReporting,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdsenseReportsGenerateResponse(response);
+        checkAdsenseReportsGenerateResponse(
+            response as api.AdsenseReportsGenerateResponse);
       })));
     });
   });
@@ -2718,7 +2729,8 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdsenseReportsGenerateResponse(response);
+        checkAdsenseReportsGenerateResponse(
+            response as api.AdsenseReportsGenerateResponse);
       })));
     });
 
@@ -2786,7 +2798,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedReports(response);
+        checkSavedReports(response as api.SavedReports);
       })));
     });
   });
@@ -2851,7 +2863,7 @@
       res
           .get(arg_accountId, arg_savedAdStyleId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedAdStyle(response);
+        checkSavedAdStyle(response as api.SavedAdStyle);
       })));
     });
 
@@ -2919,7 +2931,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedAdStyles(response);
+        checkSavedAdStyles(response as api.SavedAdStyles);
       })));
     });
   });
@@ -2999,7 +3011,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlChannels(response);
+        checkUrlChannels(response as api.UrlChannels);
       })));
     });
   });
@@ -3059,7 +3071,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdClients(response);
+        checkAdClients(response as api.AdClients);
       })));
     });
   });
@@ -3124,7 +3136,7 @@
       res
           .get(arg_adClientId, arg_adUnitId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnit(response);
+        checkAdUnit(response as api.AdUnit);
       })));
     });
 
@@ -3193,7 +3205,7 @@
       res
           .getAdCode(arg_adClientId, arg_adUnitId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdCode(response);
+        checkAdCode(response as api.AdCode);
       })));
     });
 
@@ -3265,7 +3277,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnits(response);
+        checkAdUnits(response as api.AdUnits);
       })));
     });
   });
@@ -3345,7 +3357,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannels(response);
+        checkCustomChannels(response as api.CustomChannels);
       })));
     });
   });
@@ -3449,7 +3461,7 @@
       res
           .list(locale: arg_locale, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAlerts(response);
+        checkAlerts(response as api.Alerts);
       })));
     });
   });
@@ -3514,7 +3526,7 @@
       res
           .get(arg_adClientId, arg_customChannelId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannel(response);
+        checkCustomChannel(response as api.CustomChannel);
       })));
     });
 
@@ -3582,7 +3594,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannels(response);
+        checkCustomChannels(response as api.CustomChannels);
       })));
     });
   });
@@ -3666,7 +3678,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnits(response);
+        checkAdUnits(response as api.AdUnits);
       })));
     });
   });
@@ -3715,7 +3727,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkMetadata(response);
+        checkMetadata(response as api.Metadata);
       })));
     });
   });
@@ -3764,7 +3776,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkMetadata(response);
+        checkMetadata(response as api.Metadata);
       })));
     });
   });
@@ -3813,7 +3825,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkPayments(response);
+        checkPayments(response as api.Payments);
       })));
     });
   });
@@ -3908,7 +3920,8 @@
               useTimezoneReporting: arg_useTimezoneReporting,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdsenseReportsGenerateResponse(response);
+        checkAdsenseReportsGenerateResponse(
+            response as api.AdsenseReportsGenerateResponse);
       })));
     });
   });
@@ -3975,7 +3988,8 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdsenseReportsGenerateResponse(response);
+        checkAdsenseReportsGenerateResponse(
+            response as api.AdsenseReportsGenerateResponse);
       })));
     });
 
@@ -4033,7 +4047,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedReports(response);
+        checkSavedReports(response as api.SavedReports);
       })));
     });
   });
@@ -4088,7 +4102,7 @@
       res
           .get(arg_savedAdStyleId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedAdStyle(response);
+        checkSavedAdStyle(response as api.SavedAdStyle);
       })));
     });
 
@@ -4146,7 +4160,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedAdStyles(response);
+        checkSavedAdStyles(response as api.SavedAdStyles);
       })));
     });
   });
@@ -4216,7 +4230,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlChannels(response);
+        checkUrlChannels(response as api.UrlChannels);
       })));
     });
   });
diff --git a/generated/googleapis/test/adsensehost/v4_1_test.dart b/generated/googleapis/test/adsensehost/v4_1_test.dart
index 5ed931c..4da5cd9 100644
--- a/generated/googleapis/test/adsensehost/v4_1_test.dart
+++ b/generated/googleapis/test/adsensehost/v4_1_test.dart
@@ -108,8 +108,8 @@
 
 void checkUnnamed4306(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccounts = 0;
@@ -171,8 +171,8 @@
 
 void checkUnnamed4307(core.List<api.AdClient> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdClient(o[0]);
-  checkAdClient(o[1]);
+  checkAdClient(o[0] as api.AdClient);
+  checkAdClient(o[1] as api.AdClient);
 }
 
 core.int buildCounterAdClients = 0;
@@ -286,9 +286,9 @@
 void checkAdStyle(api.AdStyle o) {
   buildCounterAdStyle++;
   if (buildCounterAdStyle < 3) {
-    checkAdStyleColors(o.colors);
+    checkAdStyleColors(o.colors as api.AdStyleColors);
     unittest.expect(o.corners, unittest.equals('foo'));
-    checkAdStyleFont(o.font);
+    checkAdStyleFont(o.font as api.AdStyleFont);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAdStyle--;
@@ -335,7 +335,8 @@
 void checkAdUnitContentAdsSettings(api.AdUnitContentAdsSettings o) {
   buildCounterAdUnitContentAdsSettings++;
   if (buildCounterAdUnitContentAdsSettings < 3) {
-    checkAdUnitContentAdsSettingsBackupOption(o.backupOption);
+    checkAdUnitContentAdsSettingsBackupOption(
+        o.backupOption as api.AdUnitContentAdsSettingsBackupOption);
     unittest.expect(o.size, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -389,11 +390,13 @@
   buildCounterAdUnit++;
   if (buildCounterAdUnit < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
-    checkAdUnitContentAdsSettings(o.contentAdsSettings);
-    checkAdStyle(o.customStyle);
+    checkAdUnitContentAdsSettings(
+        o.contentAdsSettings as api.AdUnitContentAdsSettings);
+    checkAdStyle(o.customStyle as api.AdStyle);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkAdUnitMobileContentAdsSettings(o.mobileContentAdsSettings);
+    checkAdUnitMobileContentAdsSettings(
+        o.mobileContentAdsSettings as api.AdUnitMobileContentAdsSettings);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
@@ -409,8 +412,8 @@
 
 void checkUnnamed4308(core.List<api.AdUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdUnit(o[0]);
-  checkAdUnit(o[1]);
+  checkAdUnit(o[0] as api.AdUnit);
+  checkAdUnit(o[1] as api.AdUnit);
 }
 
 core.int buildCounterAdUnits = 0;
@@ -520,8 +523,8 @@
 
 void checkUnnamed4310(core.List<api.CustomChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomChannel(o[0]);
-  checkCustomChannel(o[1]);
+  checkCustomChannel(o[0] as api.CustomChannel);
+  checkCustomChannel(o[1] as api.CustomChannel);
 }
 
 core.int buildCounterCustomChannels = 0;
@@ -594,8 +597,8 @@
 
 void checkUnnamed4312(core.List<api.ReportHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportHeaders(o[0]);
-  checkReportHeaders(o[1]);
+  checkReportHeaders(o[0] as api.ReportHeaders);
+  checkReportHeaders(o[1] as api.ReportHeaders);
 }
 
 core.List<core.String> buildUnnamed4313() {
@@ -713,8 +716,8 @@
 
 void checkUnnamed4317(core.List<api.UrlChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlChannel(o[0]);
-  checkUrlChannel(o[1]);
+  checkUrlChannel(o[0] as api.UrlChannel);
+  checkUrlChannel(o[1] as api.UrlChannel);
 }
 
 core.int buildCounterUrlChannels = 0;
@@ -890,7 +893,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -898,7 +901,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounts();
       var od = api.Accounts.fromJson(o.toJson());
-      checkAccounts(od);
+      checkAccounts(od as api.Accounts);
     });
   });
 
@@ -906,7 +909,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdClient();
       var od = api.AdClient.fromJson(o.toJson());
-      checkAdClient(od);
+      checkAdClient(od as api.AdClient);
     });
   });
 
@@ -914,7 +917,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdClients();
       var od = api.AdClients.fromJson(o.toJson());
-      checkAdClients(od);
+      checkAdClients(od as api.AdClients);
     });
   });
 
@@ -922,7 +925,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdCode();
       var od = api.AdCode.fromJson(o.toJson());
-      checkAdCode(od);
+      checkAdCode(od as api.AdCode);
     });
   });
 
@@ -930,7 +933,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdStyleColors();
       var od = api.AdStyleColors.fromJson(o.toJson());
-      checkAdStyleColors(od);
+      checkAdStyleColors(od as api.AdStyleColors);
     });
   });
 
@@ -938,7 +941,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdStyleFont();
       var od = api.AdStyleFont.fromJson(o.toJson());
-      checkAdStyleFont(od);
+      checkAdStyleFont(od as api.AdStyleFont);
     });
   });
 
@@ -946,7 +949,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdStyle();
       var od = api.AdStyle.fromJson(o.toJson());
-      checkAdStyle(od);
+      checkAdStyle(od as api.AdStyle);
     });
   });
 
@@ -954,7 +957,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnitContentAdsSettingsBackupOption();
       var od = api.AdUnitContentAdsSettingsBackupOption.fromJson(o.toJson());
-      checkAdUnitContentAdsSettingsBackupOption(od);
+      checkAdUnitContentAdsSettingsBackupOption(
+          od as api.AdUnitContentAdsSettingsBackupOption);
     });
   });
 
@@ -962,7 +966,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnitContentAdsSettings();
       var od = api.AdUnitContentAdsSettings.fromJson(o.toJson());
-      checkAdUnitContentAdsSettings(od);
+      checkAdUnitContentAdsSettings(od as api.AdUnitContentAdsSettings);
     });
   });
 
@@ -970,7 +974,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnitMobileContentAdsSettings();
       var od = api.AdUnitMobileContentAdsSettings.fromJson(o.toJson());
-      checkAdUnitMobileContentAdsSettings(od);
+      checkAdUnitMobileContentAdsSettings(
+          od as api.AdUnitMobileContentAdsSettings);
     });
   });
 
@@ -978,7 +983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnit();
       var od = api.AdUnit.fromJson(o.toJson());
-      checkAdUnit(od);
+      checkAdUnit(od as api.AdUnit);
     });
   });
 
@@ -986,7 +991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdUnits();
       var od = api.AdUnits.fromJson(o.toJson());
-      checkAdUnits(od);
+      checkAdUnits(od as api.AdUnits);
     });
   });
 
@@ -994,7 +999,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssociationSession();
       var od = api.AssociationSession.fromJson(o.toJson());
-      checkAssociationSession(od);
+      checkAssociationSession(od as api.AssociationSession);
     });
   });
 
@@ -1002,7 +1007,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomChannel();
       var od = api.CustomChannel.fromJson(o.toJson());
-      checkCustomChannel(od);
+      checkCustomChannel(od as api.CustomChannel);
     });
   });
 
@@ -1010,7 +1015,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomChannels();
       var od = api.CustomChannels.fromJson(o.toJson());
-      checkCustomChannels(od);
+      checkCustomChannels(od as api.CustomChannels);
     });
   });
 
@@ -1018,7 +1023,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportHeaders();
       var od = api.ReportHeaders.fromJson(o.toJson());
-      checkReportHeaders(od);
+      checkReportHeaders(od as api.ReportHeaders);
     });
   });
 
@@ -1026,7 +1031,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReport();
       var od = api.Report.fromJson(o.toJson());
-      checkReport(od);
+      checkReport(od as api.Report);
     });
   });
 
@@ -1034,7 +1039,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlChannel();
       var od = api.UrlChannel.fromJson(o.toJson());
-      checkUrlChannel(od);
+      checkUrlChannel(od as api.UrlChannel);
     });
   });
 
@@ -1042,7 +1047,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlChannels();
       var od = api.UrlChannels.fromJson(o.toJson());
-      checkUrlChannels(od);
+      checkUrlChannels(od as api.UrlChannels);
     });
   });
 
@@ -1096,7 +1101,7 @@
       res
           .get(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -1148,7 +1153,7 @@
       res
           .list(arg_filterAdClientId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccounts(response);
+        checkAccounts(response as api.Accounts);
       })));
     });
   });
@@ -1213,7 +1218,7 @@
       res
           .get(arg_accountId, arg_adClientId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdClient(response);
+        checkAdClient(response as api.AdClient);
       })));
     });
 
@@ -1281,7 +1286,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdClients(response);
+        checkAdClients(response as api.AdClients);
       })));
     });
   });
@@ -1357,7 +1362,7 @@
           .delete(arg_accountId, arg_adClientId, arg_adUnitId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnit(response);
+        checkAdUnit(response as api.AdUnit);
       })));
     });
 
@@ -1431,7 +1436,7 @@
           .get(arg_accountId, arg_adClientId, arg_adUnitId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnit(response);
+        checkAdUnit(response as api.AdUnit);
       })));
     });
 
@@ -1515,7 +1520,7 @@
               hostCustomChannelId: arg_hostCustomChannelId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdCode(response);
+        checkAdCode(response as api.AdCode);
       })));
     });
 
@@ -1527,8 +1532,9 @@
       var arg_adClientId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AdUnit.fromJson(json);
-        checkAdUnit(obj);
+        var obj =
+            api.AdUnit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAdUnit(obj as api.AdUnit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1589,7 +1595,7 @@
           .insert(arg_request, arg_accountId, arg_adClientId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnit(response);
+        checkAdUnit(response as api.AdUnit);
       })));
     });
 
@@ -1671,7 +1677,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnits(response);
+        checkAdUnits(response as api.AdUnits);
       })));
     });
 
@@ -1684,8 +1690,9 @@
       var arg_adUnitId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AdUnit.fromJson(json);
-        checkAdUnit(obj);
+        var obj =
+            api.AdUnit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAdUnit(obj as api.AdUnit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1748,7 +1755,7 @@
           .patch(arg_request, arg_accountId, arg_adClientId, arg_adUnitId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnit(response);
+        checkAdUnit(response as api.AdUnit);
       })));
     });
 
@@ -1760,8 +1767,9 @@
       var arg_adClientId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AdUnit.fromJson(json);
-        checkAdUnit(obj);
+        var obj =
+            api.AdUnit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAdUnit(obj as api.AdUnit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1822,7 +1830,7 @@
           .update(arg_request, arg_accountId, arg_adClientId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdUnit(response);
+        checkAdUnit(response as api.AdUnit);
       })));
     });
   });
@@ -1913,7 +1921,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
   });
@@ -1968,7 +1976,7 @@
       res
           .get(arg_adClientId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdClient(response);
+        checkAdClient(response as api.AdClient);
       })));
     });
 
@@ -2026,7 +2034,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdClients(response);
+        checkAdClients(response as api.AdClients);
       })));
     });
   });
@@ -2096,7 +2104,7 @@
               websiteLocale: arg_websiteLocale,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssociationSession(response);
+        checkAssociationSession(response as api.AssociationSession);
       })));
     });
 
@@ -2147,7 +2155,7 @@
       res
           .verify(arg_token, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssociationSession(response);
+        checkAssociationSession(response as api.AssociationSession);
       })));
     });
   });
@@ -2212,7 +2220,7 @@
       res
           .delete(arg_adClientId, arg_customChannelId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannel(response);
+        checkCustomChannel(response as api.CustomChannel);
       })));
     });
 
@@ -2275,7 +2283,7 @@
       res
           .get(arg_adClientId, arg_customChannelId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannel(response);
+        checkCustomChannel(response as api.CustomChannel);
       })));
     });
 
@@ -2286,8 +2294,9 @@
       var arg_adClientId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomChannel.fromJson(json);
-        checkCustomChannel(obj);
+        var obj = api.CustomChannel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomChannel(obj as api.CustomChannel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2338,7 +2347,7 @@
       res
           .insert(arg_request, arg_adClientId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannel(response);
+        checkCustomChannel(response as api.CustomChannel);
       })));
     });
 
@@ -2406,7 +2415,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannels(response);
+        checkCustomChannels(response as api.CustomChannels);
       })));
     });
 
@@ -2418,8 +2427,9 @@
       var arg_customChannelId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomChannel.fromJson(json);
-        checkCustomChannel(obj);
+        var obj = api.CustomChannel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomChannel(obj as api.CustomChannel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2473,7 +2483,7 @@
           .patch(arg_request, arg_adClientId, arg_customChannelId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannel(response);
+        checkCustomChannel(response as api.CustomChannel);
       })));
     });
 
@@ -2484,8 +2494,9 @@
       var arg_adClientId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomChannel.fromJson(json);
-        checkCustomChannel(obj);
+        var obj = api.CustomChannel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomChannel(obj as api.CustomChannel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2536,7 +2547,7 @@
       res
           .update(arg_request, arg_adClientId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomChannel(response);
+        checkCustomChannel(response as api.CustomChannel);
       })));
     });
   });
@@ -2617,7 +2628,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
   });
@@ -2682,7 +2693,7 @@
       res
           .delete(arg_adClientId, arg_urlChannelId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlChannel(response);
+        checkUrlChannel(response as api.UrlChannel);
       })));
     });
 
@@ -2693,8 +2704,9 @@
       var arg_adClientId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlChannel.fromJson(json);
-        checkUrlChannel(obj);
+        var obj = api.UrlChannel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUrlChannel(obj as api.UrlChannel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2745,7 +2757,7 @@
       res
           .insert(arg_request, arg_adClientId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlChannel(response);
+        checkUrlChannel(response as api.UrlChannel);
       })));
     });
 
@@ -2813,7 +2825,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlChannels(response);
+        checkUrlChannels(response as api.UrlChannels);
       })));
     });
   });
diff --git a/generated/googleapis/test/analytics/v3_test.dart b/generated/googleapis/test/analytics/v3_test.dart
index 42edb2b..1bdc336 100644
--- a/generated/googleapis/test/analytics/v3_test.dart
+++ b/generated/googleapis/test/analytics/v3_test.dart
@@ -149,13 +149,13 @@
 void checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkAccountChildLink(o.childLink);
+    checkAccountChildLink(o.childLink as api.AccountChildLink);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkAccountPermissions(o.permissions);
+    checkAccountPermissions(o.permissions as api.AccountPermissions);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.starred, unittest.isTrue);
     unittest.expect(
@@ -198,8 +198,8 @@
 
 void checkUnnamed4483(core.List<api.AccountSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountSummary(o[0]);
-  checkAccountSummary(o[1]);
+  checkAccountSummary(o[0] as api.AccountSummary);
+  checkAccountSummary(o[1] as api.AccountSummary);
 }
 
 core.int buildCounterAccountSummaries = 0;
@@ -244,8 +244,8 @@
 
 void checkUnnamed4484(core.List<api.WebPropertySummary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebPropertySummary(o[0]);
-  checkWebPropertySummary(o[1]);
+  checkWebPropertySummary(o[0] as api.WebPropertySummary);
+  checkWebPropertySummary(o[1] as api.WebPropertySummary);
 }
 
 core.int buildCounterAccountSummary = 0;
@@ -294,12 +294,12 @@
 void checkAccountTicket(api.AccountTicket o) {
   buildCounterAccountTicket++;
   if (buildCounterAccountTicket < 3) {
-    checkAccount(o.account);
+    checkAccount(o.account as api.Account);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkProfile(o.profile);
+    checkProfile(o.profile as api.Profile);
     unittest.expect(o.redirectUri, unittest.equals('foo'));
-    checkWebproperty(o.webproperty);
+    checkWebproperty(o.webproperty as api.Webproperty);
   }
   buildCounterAccountTicket--;
 }
@@ -350,10 +350,10 @@
 void checkAccountTreeResponse(api.AccountTreeResponse o) {
   buildCounterAccountTreeResponse++;
   if (buildCounterAccountTreeResponse < 3) {
-    checkAccount(o.account);
+    checkAccount(o.account as api.Account);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkProfile(o.profile);
-    checkWebproperty(o.webproperty);
+    checkProfile(o.profile as api.Profile);
+    checkWebproperty(o.webproperty as api.Webproperty);
   }
   buildCounterAccountTreeResponse--;
 }
@@ -367,8 +367,8 @@
 
 void checkUnnamed4485(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccounts = 0;
@@ -519,8 +519,8 @@
 
 void checkUnnamed4489(core.List<api.Column> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkColumn(o[0]);
-  checkColumn(o[1]);
+  checkColumn(o[0] as api.Column);
+  checkColumn(o[1] as api.Column);
 }
 
 core.int buildCounterColumns = 0;
@@ -648,7 +648,8 @@
   buildCounterCustomDataSource++;
   if (buildCounterCustomDataSource < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkCustomDataSourceChildLink(o.childLink);
+    checkCustomDataSourceChildLink(
+        o.childLink as api.CustomDataSourceChildLink);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -656,7 +657,8 @@
     unittest.expect(o.importBehavior, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkCustomDataSourceParentLink(o.parentLink);
+    checkCustomDataSourceParentLink(
+        o.parentLink as api.CustomDataSourceParentLink);
     checkUnnamed4490(o.profilesLinked);
     checkUnnamed4491(o.schema);
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -678,8 +680,8 @@
 
 void checkUnnamed4492(core.List<api.CustomDataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomDataSource(o[0]);
-  checkCustomDataSource(o[1]);
+  checkCustomDataSource(o[0] as api.CustomDataSource);
+  checkCustomDataSource(o[1] as api.CustomDataSource);
 }
 
 core.int buildCounterCustomDataSources = 0;
@@ -769,7 +771,8 @@
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkCustomDimensionParentLink(o.parentLink);
+    checkCustomDimensionParentLink(
+        o.parentLink as api.CustomDimensionParentLink);
     unittest.expect(o.scope, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(
@@ -788,8 +791,8 @@
 
 void checkUnnamed4493(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomDimension(o[0]);
-  checkCustomDimension(o[1]);
+  checkCustomDimension(o[0] as api.CustomDimension);
+  checkCustomDimension(o[1] as api.CustomDimension);
 }
 
 core.int buildCounterCustomDimensions = 0;
@@ -884,7 +887,7 @@
     unittest.expect(o.maxValue, unittest.equals('foo'));
     unittest.expect(o.minValue, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkCustomMetricParentLink(o.parentLink);
+    checkCustomMetricParentLink(o.parentLink as api.CustomMetricParentLink);
     unittest.expect(o.scope, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -904,8 +907,8 @@
 
 void checkUnnamed4494(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomMetric(o[0]);
-  checkCustomMetric(o[1]);
+  checkCustomMetric(o[0] as api.CustomMetric);
+  checkCustomMetric(o[1] as api.CustomMetric);
 }
 
 core.int buildCounterCustomMetrics = 0;
@@ -950,8 +953,8 @@
 
 void checkUnnamed4495(core.List<api.AdWordsAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdWordsAccount(o[0]);
-  checkAdWordsAccount(o[1]);
+  checkAdWordsAccount(o[0] as api.AdWordsAccount);
+  checkAdWordsAccount(o[1] as api.AdWordsAccount);
 }
 
 core.int buildCounterEntityAdWordsLinkEntity = 0;
@@ -968,7 +971,7 @@
 void checkEntityAdWordsLinkEntity(api.EntityAdWordsLinkEntity o) {
   buildCounterEntityAdWordsLinkEntity++;
   if (buildCounterEntityAdWordsLinkEntity < 3) {
-    checkWebPropertyRef(o.webPropertyRef);
+    checkWebPropertyRef(o.webPropertyRef as api.WebPropertyRef);
   }
   buildCounterEntityAdWordsLinkEntity--;
 }
@@ -1007,7 +1010,7 @@
   buildCounterEntityAdWordsLink++;
   if (buildCounterEntityAdWordsLink < 3) {
     checkUnnamed4495(o.adWordsAccounts);
-    checkEntityAdWordsLinkEntity(o.entity);
+    checkEntityAdWordsLinkEntity(o.entity as api.EntityAdWordsLinkEntity);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1026,8 +1029,8 @@
 
 void checkUnnamed4497(core.List<api.EntityAdWordsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityAdWordsLink(o[0]);
-  checkEntityAdWordsLink(o[1]);
+  checkEntityAdWordsLink(o[0] as api.EntityAdWordsLink);
+  checkEntityAdWordsLink(o[1] as api.EntityAdWordsLink);
 }
 
 core.int buildCounterEntityAdWordsLinks = 0;
@@ -1077,9 +1080,9 @@
 void checkEntityUserLinkEntity(api.EntityUserLinkEntity o) {
   buildCounterEntityUserLinkEntity++;
   if (buildCounterEntityUserLinkEntity < 3) {
-    checkAccountRef(o.accountRef);
-    checkProfileRef(o.profileRef);
-    checkWebPropertyRef(o.webPropertyRef);
+    checkAccountRef(o.accountRef as api.AccountRef);
+    checkProfileRef(o.profileRef as api.ProfileRef);
+    checkWebPropertyRef(o.webPropertyRef as api.WebPropertyRef);
   }
   buildCounterEntityUserLinkEntity--;
 }
@@ -1150,12 +1153,13 @@
 void checkEntityUserLink(api.EntityUserLink o) {
   buildCounterEntityUserLink++;
   if (buildCounterEntityUserLink < 3) {
-    checkEntityUserLinkEntity(o.entity);
+    checkEntityUserLinkEntity(o.entity as api.EntityUserLinkEntity);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkEntityUserLinkPermissions(o.permissions);
+    checkEntityUserLinkPermissions(
+        o.permissions as api.EntityUserLinkPermissions);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUserRef(o.userRef);
+    checkUserRef(o.userRef as api.UserRef);
   }
   buildCounterEntityUserLink--;
 }
@@ -1169,8 +1173,8 @@
 
 void checkUnnamed4500(core.List<api.EntityUserLink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityUserLink(o[0]);
-  checkEntityUserLink(o[1]);
+  checkEntityUserLink(o[0] as api.EntityUserLink);
+  checkEntityUserLink(o[1] as api.EntityUserLink);
 }
 
 core.int buildCounterEntityUserLinks = 0;
@@ -1261,8 +1265,8 @@
 
 void checkUnnamed4501(core.List<api.ExperimentVariations> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExperimentVariations(o[0]);
-  checkExperimentVariations(o[1]);
+  checkExperimentVariations(o[0] as api.ExperimentVariations);
+  checkExperimentVariations(o[1] as api.ExperimentVariations);
 }
 
 core.int buildCounterExperiment = 0;
@@ -1321,7 +1325,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.objectiveMetric, unittest.equals('foo'));
     unittest.expect(o.optimizationType, unittest.equals('foo'));
-    checkExperimentParentLink(o.parentLink);
+    checkExperimentParentLink(o.parentLink as api.ExperimentParentLink);
     unittest.expect(o.profileId, unittest.equals('foo'));
     unittest.expect(o.reasonExperimentEnded, unittest.equals('foo'));
     unittest.expect(o.rewriteVariationUrlsAsOriginal, unittest.isTrue);
@@ -1351,8 +1355,8 @@
 
 void checkUnnamed4502(core.List<api.Experiment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExperiment(o[0]);
-  checkExperiment(o[1]);
+  checkExperiment(o[0] as api.Experiment);
+  checkExperiment(o[1] as api.Experiment);
 }
 
 core.int buildCounterExperiments = 0;
@@ -1550,22 +1554,25 @@
   buildCounterFilter++;
   if (buildCounterFilter < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkFilterAdvancedDetails(o.advancedDetails);
+    checkFilterAdvancedDetails(o.advancedDetails as api.FilterAdvancedDetails);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkFilterExpression(o.excludeDetails);
+    checkFilterExpression(o.excludeDetails as api.FilterExpression);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkFilterExpression(o.includeDetails);
+    checkFilterExpression(o.includeDetails as api.FilterExpression);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkFilterLowercaseDetails(o.lowercaseDetails);
+    checkFilterLowercaseDetails(
+        o.lowercaseDetails as api.FilterLowercaseDetails);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkFilterParentLink(o.parentLink);
-    checkFilterSearchAndReplaceDetails(o.searchAndReplaceDetails);
+    checkFilterParentLink(o.parentLink as api.FilterParentLink);
+    checkFilterSearchAndReplaceDetails(
+        o.searchAndReplaceDetails as api.FilterSearchAndReplaceDetails);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkFilterUppercaseDetails(o.uppercaseDetails);
+    checkFilterUppercaseDetails(
+        o.uppercaseDetails as api.FilterUppercaseDetails);
   }
   buildCounterFilter--;
 }
@@ -1635,8 +1642,8 @@
 
 void checkUnnamed4503(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilter(o[0]);
-  checkFilter(o[1]);
+  checkFilter(o[0] as api.Filter);
+  checkFilter(o[1] as api.Filter);
 }
 
 core.int buildCounterFilters = 0;
@@ -1704,8 +1711,8 @@
 
 void checkUnnamed4504(core.List<api.GaDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGaDataColumnHeaders(o[0]);
-  checkGaDataColumnHeaders(o[1]);
+  checkGaDataColumnHeaders(o[0] as api.GaDataColumnHeaders);
+  checkGaDataColumnHeaders(o[1] as api.GaDataColumnHeaders);
 }
 
 core.int buildCounterGaDataDataTableCols = 0;
@@ -1740,8 +1747,8 @@
 
 void checkUnnamed4505(core.List<api.GaDataDataTableCols> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGaDataDataTableCols(o[0]);
-  checkGaDataDataTableCols(o[1]);
+  checkGaDataDataTableCols(o[0] as api.GaDataDataTableCols);
+  checkGaDataDataTableCols(o[1] as api.GaDataDataTableCols);
 }
 
 core.int buildCounterGaDataDataTableRowsC = 0;
@@ -1772,8 +1779,8 @@
 
 void checkUnnamed4506(core.List<api.GaDataDataTableRowsC> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGaDataDataTableRowsC(o[0]);
-  checkGaDataDataTableRowsC(o[1]);
+  checkGaDataDataTableRowsC(o[0] as api.GaDataDataTableRowsC);
+  checkGaDataDataTableRowsC(o[1] as api.GaDataDataTableRowsC);
 }
 
 core.int buildCounterGaDataDataTableRows = 0;
@@ -1804,8 +1811,8 @@
 
 void checkUnnamed4507(core.List<api.GaDataDataTableRows> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGaDataDataTableRows(o[0]);
-  checkGaDataDataTableRows(o[1]);
+  checkGaDataDataTableRows(o[0] as api.GaDataDataTableRows);
+  checkGaDataDataTableRows(o[1] as api.GaDataDataTableRows);
 }
 
 core.int buildCounterGaDataDataTable = 0;
@@ -1995,14 +2002,14 @@
     checkUnnamed4504(o.columnHeaders);
     unittest.expect(o.containsSampledData, unittest.isTrue);
     unittest.expect(o.dataLastRefreshed, unittest.equals('foo'));
-    checkGaDataDataTable(o.dataTable);
+    checkGaDataDataTable(o.dataTable as api.GaDataDataTable);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.itemsPerPage, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.previousLink, unittest.equals('foo'));
-    checkGaDataProfileInfo(o.profileInfo);
-    checkGaDataQuery(o.query);
+    checkGaDataProfileInfo(o.profileInfo as api.GaDataProfileInfo);
+    checkGaDataQuery(o.query as api.GaDataQuery);
     checkUnnamed4511(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
@@ -2050,8 +2057,10 @@
 
 void checkUnnamed4513(core.List<api.GoalEventDetailsEventConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoalEventDetailsEventConditions(o[0]);
-  checkGoalEventDetailsEventConditions(o[1]);
+  checkGoalEventDetailsEventConditions(
+      o[0] as api.GoalEventDetailsEventConditions);
+  checkGoalEventDetailsEventConditions(
+      o[1] as api.GoalEventDetailsEventConditions);
 }
 
 core.int buildCounterGoalEventDetails = 0;
@@ -2128,8 +2137,10 @@
 
 void checkUnnamed4514(core.List<api.GoalUrlDestinationDetailsSteps> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoalUrlDestinationDetailsSteps(o[0]);
-  checkGoalUrlDestinationDetailsSteps(o[1]);
+  checkGoalUrlDestinationDetailsSteps(
+      o[0] as api.GoalUrlDestinationDetailsSteps);
+  checkGoalUrlDestinationDetailsSteps(
+      o[1] as api.GoalUrlDestinationDetailsSteps);
 }
 
 core.int buildCounterGoalUrlDestinationDetails = 0;
@@ -2236,21 +2247,24 @@
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkGoalEventDetails(o.eventDetails);
+    checkGoalEventDetails(o.eventDetails as api.GoalEventDetails);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalWebPropertyId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoalParentLink(o.parentLink);
+    checkGoalParentLink(o.parentLink as api.GoalParentLink);
     unittest.expect(o.profileId, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkGoalUrlDestinationDetails(o.urlDestinationDetails);
+    checkGoalUrlDestinationDetails(
+        o.urlDestinationDetails as api.GoalUrlDestinationDetails);
     unittest.expect(o.value, unittest.equals(42.0));
-    checkGoalVisitNumPagesDetails(o.visitNumPagesDetails);
-    checkGoalVisitTimeOnSiteDetails(o.visitTimeOnSiteDetails);
+    checkGoalVisitNumPagesDetails(
+        o.visitNumPagesDetails as api.GoalVisitNumPagesDetails);
+    checkGoalVisitTimeOnSiteDetails(
+        o.visitTimeOnSiteDetails as api.GoalVisitTimeOnSiteDetails);
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
   }
   buildCounterGoal--;
@@ -2265,8 +2279,8 @@
 
 void checkUnnamed4515(core.List<api.Goal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoal(o[0]);
-  checkGoal(o[1]);
+  checkGoal(o[0] as api.Goal);
+  checkGoal(o[1] as api.Goal);
 }
 
 core.int buildCounterGoals = 0;
@@ -2446,8 +2460,8 @@
 
 void checkUnnamed4516(core.List<api.McfDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMcfDataColumnHeaders(o[0]);
-  checkMcfDataColumnHeaders(o[1]);
+  checkMcfDataColumnHeaders(o[0] as api.McfDataColumnHeaders);
+  checkMcfDataColumnHeaders(o[1] as api.McfDataColumnHeaders);
 }
 
 core.int buildCounterMcfDataProfileInfo = 0;
@@ -2574,8 +2588,10 @@
 
 void checkUnnamed4519(core.List<api.McfDataRowsConversionPathValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMcfDataRowsConversionPathValue(o[0]);
-  checkMcfDataRowsConversionPathValue(o[1]);
+  checkMcfDataRowsConversionPathValue(
+      o[0] as api.McfDataRowsConversionPathValue);
+  checkMcfDataRowsConversionPathValue(
+      o[1] as api.McfDataRowsConversionPathValue);
 }
 
 core.int buildCounterMcfDataRows = 0;
@@ -2608,8 +2624,8 @@
 
 void checkUnnamed4520(core.List<api.McfDataRows> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMcfDataRows(o[0]);
-  checkMcfDataRows(o[1]);
+  checkMcfDataRows(o[0] as api.McfDataRows);
+  checkMcfDataRows(o[1] as api.McfDataRows);
 }
 
 core.List<core.List<api.McfDataRows>> buildUnnamed4521() {
@@ -2673,8 +2689,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextLink, unittest.equals('foo'));
     unittest.expect(o.previousLink, unittest.equals('foo'));
-    checkMcfDataProfileInfo(o.profileInfo);
-    checkMcfDataQuery(o.query);
+    checkMcfDataProfileInfo(o.profileInfo as api.McfDataProfileInfo);
+    checkMcfDataQuery(o.query as api.McfDataQuery);
     checkUnnamed4521(o.rows);
     unittest.expect(o.sampleSize, unittest.equals('foo'));
     unittest.expect(o.sampleSpace, unittest.equals('foo'));
@@ -2800,7 +2816,7 @@
   if (buildCounterProfile < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.botFilteringEnabled, unittest.isTrue);
-    checkProfileChildLink(o.childLink);
+    checkProfileChildLink(o.childLink as api.ProfileChildLink);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.currency, unittest.equals('foo'));
@@ -2812,8 +2828,8 @@
     unittest.expect(o.internalWebPropertyId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkProfileParentLink(o.parentLink);
-    checkProfilePermissions(o.permissions);
+    checkProfileParentLink(o.parentLink as api.ProfileParentLink);
+    checkProfilePermissions(o.permissions as api.ProfilePermissions);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.siteSearchCategoryParameters, unittest.equals('foo'));
     unittest.expect(o.siteSearchQueryParameters, unittest.equals('foo'));
@@ -2849,10 +2865,10 @@
 void checkProfileFilterLink(api.ProfileFilterLink o) {
   buildCounterProfileFilterLink++;
   if (buildCounterProfileFilterLink < 3) {
-    checkFilterRef(o.filterRef);
+    checkFilterRef(o.filterRef as api.FilterRef);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkProfileRef(o.profileRef);
+    checkProfileRef(o.profileRef as api.ProfileRef);
     unittest.expect(o.rank, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -2868,8 +2884,8 @@
 
 void checkUnnamed4524(core.List<api.ProfileFilterLink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProfileFilterLink(o[0]);
-  checkProfileFilterLink(o[1]);
+  checkProfileFilterLink(o[0] as api.ProfileFilterLink);
+  checkProfileFilterLink(o[1] as api.ProfileFilterLink);
 }
 
 core.int buildCounterProfileFilterLinks = 0;
@@ -2972,8 +2988,8 @@
 
 void checkUnnamed4525(core.List<api.Profile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProfile(o[0]);
-  checkProfile(o[1]);
+  checkProfile(o[0] as api.Profile);
+  checkProfile(o[1] as api.Profile);
 }
 
 core.int buildCounterProfiles = 0;
@@ -3041,8 +3057,8 @@
 
 void checkUnnamed4526(core.List<api.RealtimeDataColumnHeaders> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRealtimeDataColumnHeaders(o[0]);
-  checkRealtimeDataColumnHeaders(o[1]);
+  checkRealtimeDataColumnHeaders(o[0] as api.RealtimeDataColumnHeaders);
+  checkRealtimeDataColumnHeaders(o[1] as api.RealtimeDataColumnHeaders);
 }
 
 core.int buildCounterRealtimeDataProfileInfo = 0;
@@ -3193,8 +3209,8 @@
     checkUnnamed4526(o.columnHeaders);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkRealtimeDataProfileInfo(o.profileInfo);
-    checkRealtimeDataQuery(o.query);
+    checkRealtimeDataProfileInfo(o.profileInfo as api.RealtimeDataProfileInfo);
+    checkRealtimeDataQuery(o.query as api.RealtimeDataQuery);
     checkUnnamed4530(o.rows);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.totalResults, unittest.equals(42));
@@ -3219,7 +3235,7 @@
     api.RemarketingAudienceAudienceDefinition o) {
   buildCounterRemarketingAudienceAudienceDefinition++;
   if (buildCounterRemarketingAudienceAudienceDefinition < 3) {
-    checkIncludeConditions(o.includeConditions);
+    checkIncludeConditions(o.includeConditions as api.IncludeConditions);
   }
   buildCounterRemarketingAudienceAudienceDefinition--;
 }
@@ -3233,8 +3249,8 @@
 
 void checkUnnamed4532(core.List<api.LinkedForeignAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLinkedForeignAccount(o[0]);
-  checkLinkedForeignAccount(o[1]);
+  checkLinkedForeignAccount(o[0] as api.LinkedForeignAccount);
+  checkLinkedForeignAccount(o[1] as api.LinkedForeignAccount);
 }
 
 core.List<core.String> buildUnnamed4533() {
@@ -3297,8 +3313,9 @@
   buildCounterRemarketingAudienceStateBasedAudienceDefinition++;
   if (buildCounterRemarketingAudienceStateBasedAudienceDefinition < 3) {
     checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(
-        o.excludeConditions);
-    checkIncludeConditions(o.includeConditions);
+        o.excludeConditions as api
+            .RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions);
+    checkIncludeConditions(o.includeConditions as api.IncludeConditions);
   }
   buildCounterRemarketingAudienceStateBasedAudienceDefinition--;
 }
@@ -3332,7 +3349,8 @@
   buildCounterRemarketingAudience++;
   if (buildCounterRemarketingAudience < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkRemarketingAudienceAudienceDefinition(o.audienceDefinition);
+    checkRemarketingAudienceAudienceDefinition(
+        o.audienceDefinition as api.RemarketingAudienceAudienceDefinition);
     unittest.expect(o.audienceType, unittest.equals('foo'));
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -3344,7 +3362,8 @@
     checkUnnamed4533(o.linkedViews);
     unittest.expect(o.name, unittest.equals('foo'));
     checkRemarketingAudienceStateBasedAudienceDefinition(
-        o.stateBasedAudienceDefinition);
+        o.stateBasedAudienceDefinition
+            as api.RemarketingAudienceStateBasedAudienceDefinition);
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
@@ -3361,8 +3380,8 @@
 
 void checkUnnamed4534(core.List<api.RemarketingAudience> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRemarketingAudience(o[0]);
-  checkRemarketingAudience(o[1]);
+  checkRemarketingAudience(o[0] as api.RemarketingAudience);
+  checkRemarketingAudience(o[1] as api.RemarketingAudience);
 }
 
 core.int buildCounterRemarketingAudiences = 0;
@@ -3444,8 +3463,8 @@
 
 void checkUnnamed4535(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSegment(o[0]);
-  checkSegment(o[1]);
+  checkSegment(o[0] as api.Segment);
+  checkSegment(o[1] as api.Segment);
 }
 
 core.int buildCounterSegments = 0;
@@ -3560,12 +3579,14 @@
   if (buildCounterUnsampledReport < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkUnsampledReportCloudStorageDownloadDetails(
-        o.cloudStorageDownloadDetails);
+        o.cloudStorageDownloadDetails
+            as api.UnsampledReportCloudStorageDownloadDetails);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.dimensions, unittest.equals('foo'));
     unittest.expect(o.downloadType, unittest.equals('foo'));
-    checkUnsampledReportDriveDownloadDetails(o.driveDownloadDetails);
+    checkUnsampledReportDriveDownloadDetails(
+        o.driveDownloadDetails as api.UnsampledReportDriveDownloadDetails);
     unittest.expect(o.end_date, unittest.equals('foo'));
     unittest.expect(o.filters, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -3593,8 +3614,8 @@
 
 void checkUnnamed4536(core.List<api.UnsampledReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnsampledReport(o[0]);
-  checkUnsampledReport(o[1]);
+  checkUnsampledReport(o[0] as api.UnsampledReport);
+  checkUnsampledReport(o[1] as api.UnsampledReport);
 }
 
 core.int buildCounterUnsampledReports = 0;
@@ -3684,8 +3705,8 @@
 
 void checkUnnamed4538(core.List<api.Upload> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUpload(o[0]);
-  checkUpload(o[1]);
+  checkUpload(o[0] as api.Upload);
+  checkUpload(o[1] as api.Upload);
 }
 
 core.int buildCounterUploads = 0;
@@ -3762,7 +3783,7 @@
     unittest.expect(o.deletionRequestTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.firebaseProjectId, unittest.equals('foo'));
-    checkUserDeletionRequestId(o.id);
+    checkUserDeletionRequestId(o.id as api.UserDeletionRequestId);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.propertyId, unittest.equals('foo'));
     unittest.expect(o.webPropertyId, unittest.equals('foo'));
@@ -3831,8 +3852,8 @@
 
 void checkUnnamed4539(core.List<api.ProfileSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProfileSummary(o[0]);
-  checkProfileSummary(o[1]);
+  checkProfileSummary(o[0] as api.ProfileSummary);
+  checkProfileSummary(o[1] as api.ProfileSummary);
 }
 
 core.int buildCounterWebPropertySummary = 0;
@@ -3877,8 +3898,8 @@
 
 void checkUnnamed4540(core.List<api.Webproperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebproperty(o[0]);
-  checkWebproperty(o[1]);
+  checkWebproperty(o[0] as api.Webproperty);
+  checkWebproperty(o[1] as api.Webproperty);
 }
 
 core.int buildCounterWebproperties = 0;
@@ -4021,7 +4042,7 @@
   buildCounterWebproperty++;
   if (buildCounterWebproperty < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkWebpropertyChildLink(o.childLink);
+    checkWebpropertyChildLink(o.childLink as api.WebpropertyChildLink);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.dataRetentionResetOnNewActivity, unittest.isTrue);
@@ -4033,8 +4054,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.level, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkWebpropertyParentLink(o.parentLink);
-    checkWebpropertyPermissions(o.permissions);
+    checkWebpropertyParentLink(o.parentLink as api.WebpropertyParentLink);
+    checkWebpropertyPermissions(o.permissions as api.WebpropertyPermissions);
     unittest.expect(o.profileCount, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.starred, unittest.isTrue);
@@ -4050,7 +4071,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountChildLink();
       var od = api.AccountChildLink.fromJson(o.toJson());
-      checkAccountChildLink(od);
+      checkAccountChildLink(od as api.AccountChildLink);
     });
   });
 
@@ -4058,7 +4079,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountPermissions();
       var od = api.AccountPermissions.fromJson(o.toJson());
-      checkAccountPermissions(od);
+      checkAccountPermissions(od as api.AccountPermissions);
     });
   });
 
@@ -4066,7 +4087,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -4074,7 +4095,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountRef();
       var od = api.AccountRef.fromJson(o.toJson());
-      checkAccountRef(od);
+      checkAccountRef(od as api.AccountRef);
     });
   });
 
@@ -4082,7 +4103,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountSummaries();
       var od = api.AccountSummaries.fromJson(o.toJson());
-      checkAccountSummaries(od);
+      checkAccountSummaries(od as api.AccountSummaries);
     });
   });
 
@@ -4090,7 +4111,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountSummary();
       var od = api.AccountSummary.fromJson(o.toJson());
-      checkAccountSummary(od);
+      checkAccountSummary(od as api.AccountSummary);
     });
   });
 
@@ -4098,7 +4119,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountTicket();
       var od = api.AccountTicket.fromJson(o.toJson());
-      checkAccountTicket(od);
+      checkAccountTicket(od as api.AccountTicket);
     });
   });
 
@@ -4106,7 +4127,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountTreeRequest();
       var od = api.AccountTreeRequest.fromJson(o.toJson());
-      checkAccountTreeRequest(od);
+      checkAccountTreeRequest(od as api.AccountTreeRequest);
     });
   });
 
@@ -4114,7 +4135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountTreeResponse();
       var od = api.AccountTreeResponse.fromJson(o.toJson());
-      checkAccountTreeResponse(od);
+      checkAccountTreeResponse(od as api.AccountTreeResponse);
     });
   });
 
@@ -4122,7 +4143,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounts();
       var od = api.Accounts.fromJson(o.toJson());
-      checkAccounts(od);
+      checkAccounts(od as api.Accounts);
     });
   });
 
@@ -4130,7 +4151,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdWordsAccount();
       var od = api.AdWordsAccount.fromJson(o.toJson());
-      checkAdWordsAccount(od);
+      checkAdWordsAccount(od as api.AdWordsAccount);
     });
   });
 
@@ -4139,7 +4160,8 @@
       var o = buildAnalyticsDataimportDeleteUploadDataRequest();
       var od =
           api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(o.toJson());
-      checkAnalyticsDataimportDeleteUploadDataRequest(od);
+      checkAnalyticsDataimportDeleteUploadDataRequest(
+          od as api.AnalyticsDataimportDeleteUploadDataRequest);
     });
   });
 
@@ -4147,7 +4169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColumn();
       var od = api.Column.fromJson(o.toJson());
-      checkColumn(od);
+      checkColumn(od as api.Column);
     });
   });
 
@@ -4155,7 +4177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColumns();
       var od = api.Columns.fromJson(o.toJson());
-      checkColumns(od);
+      checkColumns(od as api.Columns);
     });
   });
 
@@ -4163,7 +4185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDataSourceChildLink();
       var od = api.CustomDataSourceChildLink.fromJson(o.toJson());
-      checkCustomDataSourceChildLink(od);
+      checkCustomDataSourceChildLink(od as api.CustomDataSourceChildLink);
     });
   });
 
@@ -4171,7 +4193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDataSourceParentLink();
       var od = api.CustomDataSourceParentLink.fromJson(o.toJson());
-      checkCustomDataSourceParentLink(od);
+      checkCustomDataSourceParentLink(od as api.CustomDataSourceParentLink);
     });
   });
 
@@ -4179,7 +4201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDataSource();
       var od = api.CustomDataSource.fromJson(o.toJson());
-      checkCustomDataSource(od);
+      checkCustomDataSource(od as api.CustomDataSource);
     });
   });
 
@@ -4187,7 +4209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDataSources();
       var od = api.CustomDataSources.fromJson(o.toJson());
-      checkCustomDataSources(od);
+      checkCustomDataSources(od as api.CustomDataSources);
     });
   });
 
@@ -4195,7 +4217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDimensionParentLink();
       var od = api.CustomDimensionParentLink.fromJson(o.toJson());
-      checkCustomDimensionParentLink(od);
+      checkCustomDimensionParentLink(od as api.CustomDimensionParentLink);
     });
   });
 
@@ -4203,7 +4225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDimension();
       var od = api.CustomDimension.fromJson(o.toJson());
-      checkCustomDimension(od);
+      checkCustomDimension(od as api.CustomDimension);
     });
   });
 
@@ -4211,7 +4233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDimensions();
       var od = api.CustomDimensions.fromJson(o.toJson());
-      checkCustomDimensions(od);
+      checkCustomDimensions(od as api.CustomDimensions);
     });
   });
 
@@ -4219,7 +4241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomMetricParentLink();
       var od = api.CustomMetricParentLink.fromJson(o.toJson());
-      checkCustomMetricParentLink(od);
+      checkCustomMetricParentLink(od as api.CustomMetricParentLink);
     });
   });
 
@@ -4227,7 +4249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomMetric();
       var od = api.CustomMetric.fromJson(o.toJson());
-      checkCustomMetric(od);
+      checkCustomMetric(od as api.CustomMetric);
     });
   });
 
@@ -4235,7 +4257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomMetrics();
       var od = api.CustomMetrics.fromJson(o.toJson());
-      checkCustomMetrics(od);
+      checkCustomMetrics(od as api.CustomMetrics);
     });
   });
 
@@ -4243,7 +4265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityAdWordsLinkEntity();
       var od = api.EntityAdWordsLinkEntity.fromJson(o.toJson());
-      checkEntityAdWordsLinkEntity(od);
+      checkEntityAdWordsLinkEntity(od as api.EntityAdWordsLinkEntity);
     });
   });
 
@@ -4251,7 +4273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityAdWordsLink();
       var od = api.EntityAdWordsLink.fromJson(o.toJson());
-      checkEntityAdWordsLink(od);
+      checkEntityAdWordsLink(od as api.EntityAdWordsLink);
     });
   });
 
@@ -4259,7 +4281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityAdWordsLinks();
       var od = api.EntityAdWordsLinks.fromJson(o.toJson());
-      checkEntityAdWordsLinks(od);
+      checkEntityAdWordsLinks(od as api.EntityAdWordsLinks);
     });
   });
 
@@ -4267,7 +4289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityUserLinkEntity();
       var od = api.EntityUserLinkEntity.fromJson(o.toJson());
-      checkEntityUserLinkEntity(od);
+      checkEntityUserLinkEntity(od as api.EntityUserLinkEntity);
     });
   });
 
@@ -4275,7 +4297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityUserLinkPermissions();
       var od = api.EntityUserLinkPermissions.fromJson(o.toJson());
-      checkEntityUserLinkPermissions(od);
+      checkEntityUserLinkPermissions(od as api.EntityUserLinkPermissions);
     });
   });
 
@@ -4283,7 +4305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityUserLink();
       var od = api.EntityUserLink.fromJson(o.toJson());
-      checkEntityUserLink(od);
+      checkEntityUserLink(od as api.EntityUserLink);
     });
   });
 
@@ -4291,7 +4313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityUserLinks();
       var od = api.EntityUserLinks.fromJson(o.toJson());
-      checkEntityUserLinks(od);
+      checkEntityUserLinks(od as api.EntityUserLinks);
     });
   });
 
@@ -4299,7 +4321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExperimentParentLink();
       var od = api.ExperimentParentLink.fromJson(o.toJson());
-      checkExperimentParentLink(od);
+      checkExperimentParentLink(od as api.ExperimentParentLink);
     });
   });
 
@@ -4307,7 +4329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExperimentVariations();
       var od = api.ExperimentVariations.fromJson(o.toJson());
-      checkExperimentVariations(od);
+      checkExperimentVariations(od as api.ExperimentVariations);
     });
   });
 
@@ -4315,7 +4337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExperiment();
       var od = api.Experiment.fromJson(o.toJson());
-      checkExperiment(od);
+      checkExperiment(od as api.Experiment);
     });
   });
 
@@ -4323,7 +4345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExperiments();
       var od = api.Experiments.fromJson(o.toJson());
-      checkExperiments(od);
+      checkExperiments(od as api.Experiments);
     });
   });
 
@@ -4331,7 +4353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterAdvancedDetails();
       var od = api.FilterAdvancedDetails.fromJson(o.toJson());
-      checkFilterAdvancedDetails(od);
+      checkFilterAdvancedDetails(od as api.FilterAdvancedDetails);
     });
   });
 
@@ -4339,7 +4361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterLowercaseDetails();
       var od = api.FilterLowercaseDetails.fromJson(o.toJson());
-      checkFilterLowercaseDetails(od);
+      checkFilterLowercaseDetails(od as api.FilterLowercaseDetails);
     });
   });
 
@@ -4347,7 +4369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterParentLink();
       var od = api.FilterParentLink.fromJson(o.toJson());
-      checkFilterParentLink(od);
+      checkFilterParentLink(od as api.FilterParentLink);
     });
   });
 
@@ -4355,7 +4377,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterSearchAndReplaceDetails();
       var od = api.FilterSearchAndReplaceDetails.fromJson(o.toJson());
-      checkFilterSearchAndReplaceDetails(od);
+      checkFilterSearchAndReplaceDetails(
+          od as api.FilterSearchAndReplaceDetails);
     });
   });
 
@@ -4363,7 +4386,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterUppercaseDetails();
       var od = api.FilterUppercaseDetails.fromJson(o.toJson());
-      checkFilterUppercaseDetails(od);
+      checkFilterUppercaseDetails(od as api.FilterUppercaseDetails);
     });
   });
 
@@ -4371,7 +4394,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilter();
       var od = api.Filter.fromJson(o.toJson());
-      checkFilter(od);
+      checkFilter(od as api.Filter);
     });
   });
 
@@ -4379,7 +4402,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterExpression();
       var od = api.FilterExpression.fromJson(o.toJson());
-      checkFilterExpression(od);
+      checkFilterExpression(od as api.FilterExpression);
     });
   });
 
@@ -4387,7 +4410,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterRef();
       var od = api.FilterRef.fromJson(o.toJson());
-      checkFilterRef(od);
+      checkFilterRef(od as api.FilterRef);
     });
   });
 
@@ -4395,7 +4418,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilters();
       var od = api.Filters.fromJson(o.toJson());
-      checkFilters(od);
+      checkFilters(od as api.Filters);
     });
   });
 
@@ -4403,7 +4426,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaDataColumnHeaders();
       var od = api.GaDataColumnHeaders.fromJson(o.toJson());
-      checkGaDataColumnHeaders(od);
+      checkGaDataColumnHeaders(od as api.GaDataColumnHeaders);
     });
   });
 
@@ -4411,7 +4434,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaDataDataTableCols();
       var od = api.GaDataDataTableCols.fromJson(o.toJson());
-      checkGaDataDataTableCols(od);
+      checkGaDataDataTableCols(od as api.GaDataDataTableCols);
     });
   });
 
@@ -4419,7 +4442,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaDataDataTableRowsC();
       var od = api.GaDataDataTableRowsC.fromJson(o.toJson());
-      checkGaDataDataTableRowsC(od);
+      checkGaDataDataTableRowsC(od as api.GaDataDataTableRowsC);
     });
   });
 
@@ -4427,7 +4450,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaDataDataTableRows();
       var od = api.GaDataDataTableRows.fromJson(o.toJson());
-      checkGaDataDataTableRows(od);
+      checkGaDataDataTableRows(od as api.GaDataDataTableRows);
     });
   });
 
@@ -4435,7 +4458,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaDataDataTable();
       var od = api.GaDataDataTable.fromJson(o.toJson());
-      checkGaDataDataTable(od);
+      checkGaDataDataTable(od as api.GaDataDataTable);
     });
   });
 
@@ -4443,7 +4466,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaDataProfileInfo();
       var od = api.GaDataProfileInfo.fromJson(o.toJson());
-      checkGaDataProfileInfo(od);
+      checkGaDataProfileInfo(od as api.GaDataProfileInfo);
     });
   });
 
@@ -4451,7 +4474,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaDataQuery();
       var od = api.GaDataQuery.fromJson(o.toJson());
-      checkGaDataQuery(od);
+      checkGaDataQuery(od as api.GaDataQuery);
     });
   });
 
@@ -4459,7 +4482,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGaData();
       var od = api.GaData.fromJson(o.toJson());
-      checkGaData(od);
+      checkGaData(od as api.GaData);
     });
   });
 
@@ -4467,7 +4490,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalEventDetailsEventConditions();
       var od = api.GoalEventDetailsEventConditions.fromJson(o.toJson());
-      checkGoalEventDetailsEventConditions(od);
+      checkGoalEventDetailsEventConditions(
+          od as api.GoalEventDetailsEventConditions);
     });
   });
 
@@ -4475,7 +4499,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalEventDetails();
       var od = api.GoalEventDetails.fromJson(o.toJson());
-      checkGoalEventDetails(od);
+      checkGoalEventDetails(od as api.GoalEventDetails);
     });
   });
 
@@ -4483,7 +4507,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalParentLink();
       var od = api.GoalParentLink.fromJson(o.toJson());
-      checkGoalParentLink(od);
+      checkGoalParentLink(od as api.GoalParentLink);
     });
   });
 
@@ -4491,7 +4515,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalUrlDestinationDetailsSteps();
       var od = api.GoalUrlDestinationDetailsSteps.fromJson(o.toJson());
-      checkGoalUrlDestinationDetailsSteps(od);
+      checkGoalUrlDestinationDetailsSteps(
+          od as api.GoalUrlDestinationDetailsSteps);
     });
   });
 
@@ -4499,7 +4524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalUrlDestinationDetails();
       var od = api.GoalUrlDestinationDetails.fromJson(o.toJson());
-      checkGoalUrlDestinationDetails(od);
+      checkGoalUrlDestinationDetails(od as api.GoalUrlDestinationDetails);
     });
   });
 
@@ -4507,7 +4532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalVisitNumPagesDetails();
       var od = api.GoalVisitNumPagesDetails.fromJson(o.toJson());
-      checkGoalVisitNumPagesDetails(od);
+      checkGoalVisitNumPagesDetails(od as api.GoalVisitNumPagesDetails);
     });
   });
 
@@ -4515,7 +4540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalVisitTimeOnSiteDetails();
       var od = api.GoalVisitTimeOnSiteDetails.fromJson(o.toJson());
-      checkGoalVisitTimeOnSiteDetails(od);
+      checkGoalVisitTimeOnSiteDetails(od as api.GoalVisitTimeOnSiteDetails);
     });
   });
 
@@ -4523,7 +4548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoal();
       var od = api.Goal.fromJson(o.toJson());
-      checkGoal(od);
+      checkGoal(od as api.Goal);
     });
   });
 
@@ -4531,7 +4556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoals();
       var od = api.Goals.fromJson(o.toJson());
-      checkGoals(od);
+      checkGoals(od as api.Goals);
     });
   });
 
@@ -4539,7 +4564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHashClientIdRequest();
       var od = api.HashClientIdRequest.fromJson(o.toJson());
-      checkHashClientIdRequest(od);
+      checkHashClientIdRequest(od as api.HashClientIdRequest);
     });
   });
 
@@ -4547,7 +4572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHashClientIdResponse();
       var od = api.HashClientIdResponse.fromJson(o.toJson());
-      checkHashClientIdResponse(od);
+      checkHashClientIdResponse(od as api.HashClientIdResponse);
     });
   });
 
@@ -4555,7 +4580,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIncludeConditions();
       var od = api.IncludeConditions.fromJson(o.toJson());
-      checkIncludeConditions(od);
+      checkIncludeConditions(od as api.IncludeConditions);
     });
   });
 
@@ -4563,7 +4588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinkedForeignAccount();
       var od = api.LinkedForeignAccount.fromJson(o.toJson());
-      checkLinkedForeignAccount(od);
+      checkLinkedForeignAccount(od as api.LinkedForeignAccount);
     });
   });
 
@@ -4571,7 +4596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMcfDataColumnHeaders();
       var od = api.McfDataColumnHeaders.fromJson(o.toJson());
-      checkMcfDataColumnHeaders(od);
+      checkMcfDataColumnHeaders(od as api.McfDataColumnHeaders);
     });
   });
 
@@ -4579,7 +4604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMcfDataProfileInfo();
       var od = api.McfDataProfileInfo.fromJson(o.toJson());
-      checkMcfDataProfileInfo(od);
+      checkMcfDataProfileInfo(od as api.McfDataProfileInfo);
     });
   });
 
@@ -4587,7 +4612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMcfDataQuery();
       var od = api.McfDataQuery.fromJson(o.toJson());
-      checkMcfDataQuery(od);
+      checkMcfDataQuery(od as api.McfDataQuery);
     });
   });
 
@@ -4595,7 +4620,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMcfDataRowsConversionPathValue();
       var od = api.McfDataRowsConversionPathValue.fromJson(o.toJson());
-      checkMcfDataRowsConversionPathValue(od);
+      checkMcfDataRowsConversionPathValue(
+          od as api.McfDataRowsConversionPathValue);
     });
   });
 
@@ -4603,7 +4629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMcfDataRows();
       var od = api.McfDataRows.fromJson(o.toJson());
-      checkMcfDataRows(od);
+      checkMcfDataRows(od as api.McfDataRows);
     });
   });
 
@@ -4611,7 +4637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMcfData();
       var od = api.McfData.fromJson(o.toJson());
-      checkMcfData(od);
+      checkMcfData(od as api.McfData);
     });
   });
 
@@ -4619,7 +4645,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileChildLink();
       var od = api.ProfileChildLink.fromJson(o.toJson());
-      checkProfileChildLink(od);
+      checkProfileChildLink(od as api.ProfileChildLink);
     });
   });
 
@@ -4627,7 +4653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileParentLink();
       var od = api.ProfileParentLink.fromJson(o.toJson());
-      checkProfileParentLink(od);
+      checkProfileParentLink(od as api.ProfileParentLink);
     });
   });
 
@@ -4635,7 +4661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfilePermissions();
       var od = api.ProfilePermissions.fromJson(o.toJson());
-      checkProfilePermissions(od);
+      checkProfilePermissions(od as api.ProfilePermissions);
     });
   });
 
@@ -4643,7 +4669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfile();
       var od = api.Profile.fromJson(o.toJson());
-      checkProfile(od);
+      checkProfile(od as api.Profile);
     });
   });
 
@@ -4651,7 +4677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileFilterLink();
       var od = api.ProfileFilterLink.fromJson(o.toJson());
-      checkProfileFilterLink(od);
+      checkProfileFilterLink(od as api.ProfileFilterLink);
     });
   });
 
@@ -4659,7 +4685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileFilterLinks();
       var od = api.ProfileFilterLinks.fromJson(o.toJson());
-      checkProfileFilterLinks(od);
+      checkProfileFilterLinks(od as api.ProfileFilterLinks);
     });
   });
 
@@ -4667,7 +4693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileRef();
       var od = api.ProfileRef.fromJson(o.toJson());
-      checkProfileRef(od);
+      checkProfileRef(od as api.ProfileRef);
     });
   });
 
@@ -4675,7 +4701,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileSummary();
       var od = api.ProfileSummary.fromJson(o.toJson());
-      checkProfileSummary(od);
+      checkProfileSummary(od as api.ProfileSummary);
     });
   });
 
@@ -4683,7 +4709,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfiles();
       var od = api.Profiles.fromJson(o.toJson());
-      checkProfiles(od);
+      checkProfiles(od as api.Profiles);
     });
   });
 
@@ -4691,7 +4717,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRealtimeDataColumnHeaders();
       var od = api.RealtimeDataColumnHeaders.fromJson(o.toJson());
-      checkRealtimeDataColumnHeaders(od);
+      checkRealtimeDataColumnHeaders(od as api.RealtimeDataColumnHeaders);
     });
   });
 
@@ -4699,7 +4725,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRealtimeDataProfileInfo();
       var od = api.RealtimeDataProfileInfo.fromJson(o.toJson());
-      checkRealtimeDataProfileInfo(od);
+      checkRealtimeDataProfileInfo(od as api.RealtimeDataProfileInfo);
     });
   });
 
@@ -4707,7 +4733,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRealtimeDataQuery();
       var od = api.RealtimeDataQuery.fromJson(o.toJson());
-      checkRealtimeDataQuery(od);
+      checkRealtimeDataQuery(od as api.RealtimeDataQuery);
     });
   });
 
@@ -4715,7 +4741,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRealtimeData();
       var od = api.RealtimeData.fromJson(o.toJson());
-      checkRealtimeData(od);
+      checkRealtimeData(od as api.RealtimeData);
     });
   });
 
@@ -4723,7 +4749,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemarketingAudienceAudienceDefinition();
       var od = api.RemarketingAudienceAudienceDefinition.fromJson(o.toJson());
-      checkRemarketingAudienceAudienceDefinition(od);
+      checkRemarketingAudienceAudienceDefinition(
+          od as api.RemarketingAudienceAudienceDefinition);
     });
   });
 
@@ -4736,7 +4763,9 @@
       var od =
           api.RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions
               .fromJson(o.toJson());
-      checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(od);
+      checkRemarketingAudienceStateBasedAudienceDefinitionExcludeConditions(od
+          as api
+              .RemarketingAudienceStateBasedAudienceDefinitionExcludeConditions);
     });
   });
 
@@ -4746,7 +4775,8 @@
       var o = buildRemarketingAudienceStateBasedAudienceDefinition();
       var od = api.RemarketingAudienceStateBasedAudienceDefinition.fromJson(
           o.toJson());
-      checkRemarketingAudienceStateBasedAudienceDefinition(od);
+      checkRemarketingAudienceStateBasedAudienceDefinition(
+          od as api.RemarketingAudienceStateBasedAudienceDefinition);
     });
   });
 
@@ -4754,7 +4784,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemarketingAudience();
       var od = api.RemarketingAudience.fromJson(o.toJson());
-      checkRemarketingAudience(od);
+      checkRemarketingAudience(od as api.RemarketingAudience);
     });
   });
 
@@ -4762,7 +4792,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemarketingAudiences();
       var od = api.RemarketingAudiences.fromJson(o.toJson());
-      checkRemarketingAudiences(od);
+      checkRemarketingAudiences(od as api.RemarketingAudiences);
     });
   });
 
@@ -4770,7 +4800,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegment();
       var od = api.Segment.fromJson(o.toJson());
-      checkSegment(od);
+      checkSegment(od as api.Segment);
     });
   });
 
@@ -4778,7 +4808,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegments();
       var od = api.Segments.fromJson(o.toJson());
-      checkSegments(od);
+      checkSegments(od as api.Segments);
     });
   });
 
@@ -4787,7 +4817,8 @@
       var o = buildUnsampledReportCloudStorageDownloadDetails();
       var od =
           api.UnsampledReportCloudStorageDownloadDetails.fromJson(o.toJson());
-      checkUnsampledReportCloudStorageDownloadDetails(od);
+      checkUnsampledReportCloudStorageDownloadDetails(
+          od as api.UnsampledReportCloudStorageDownloadDetails);
     });
   });
 
@@ -4795,7 +4826,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnsampledReportDriveDownloadDetails();
       var od = api.UnsampledReportDriveDownloadDetails.fromJson(o.toJson());
-      checkUnsampledReportDriveDownloadDetails(od);
+      checkUnsampledReportDriveDownloadDetails(
+          od as api.UnsampledReportDriveDownloadDetails);
     });
   });
 
@@ -4803,7 +4835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnsampledReport();
       var od = api.UnsampledReport.fromJson(o.toJson());
-      checkUnsampledReport(od);
+      checkUnsampledReport(od as api.UnsampledReport);
     });
   });
 
@@ -4811,7 +4843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnsampledReports();
       var od = api.UnsampledReports.fromJson(o.toJson());
-      checkUnsampledReports(od);
+      checkUnsampledReports(od as api.UnsampledReports);
     });
   });
 
@@ -4819,7 +4851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpload();
       var od = api.Upload.fromJson(o.toJson());
-      checkUpload(od);
+      checkUpload(od as api.Upload);
     });
   });
 
@@ -4827,7 +4859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploads();
       var od = api.Uploads.fromJson(o.toJson());
-      checkUploads(od);
+      checkUploads(od as api.Uploads);
     });
   });
 
@@ -4835,7 +4867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserDeletionRequestId();
       var od = api.UserDeletionRequestId.fromJson(o.toJson());
-      checkUserDeletionRequestId(od);
+      checkUserDeletionRequestId(od as api.UserDeletionRequestId);
     });
   });
 
@@ -4843,7 +4875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserDeletionRequest();
       var od = api.UserDeletionRequest.fromJson(o.toJson());
-      checkUserDeletionRequest(od);
+      checkUserDeletionRequest(od as api.UserDeletionRequest);
     });
   });
 
@@ -4851,7 +4883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRef();
       var od = api.UserRef.fromJson(o.toJson());
-      checkUserRef(od);
+      checkUserRef(od as api.UserRef);
     });
   });
 
@@ -4859,7 +4891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebPropertyRef();
       var od = api.WebPropertyRef.fromJson(o.toJson());
-      checkWebPropertyRef(od);
+      checkWebPropertyRef(od as api.WebPropertyRef);
     });
   });
 
@@ -4867,7 +4899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebPropertySummary();
       var od = api.WebPropertySummary.fromJson(o.toJson());
-      checkWebPropertySummary(od);
+      checkWebPropertySummary(od as api.WebPropertySummary);
     });
   });
 
@@ -4875,7 +4907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebproperties();
       var od = api.Webproperties.fromJson(o.toJson());
-      checkWebproperties(od);
+      checkWebproperties(od as api.Webproperties);
     });
   });
 
@@ -4883,7 +4915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebpropertyChildLink();
       var od = api.WebpropertyChildLink.fromJson(o.toJson());
-      checkWebpropertyChildLink(od);
+      checkWebpropertyChildLink(od as api.WebpropertyChildLink);
     });
   });
 
@@ -4891,7 +4923,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebpropertyParentLink();
       var od = api.WebpropertyParentLink.fromJson(o.toJson());
-      checkWebpropertyParentLink(od);
+      checkWebpropertyParentLink(od as api.WebpropertyParentLink);
     });
   });
 
@@ -4899,7 +4931,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebpropertyPermissions();
       var od = api.WebpropertyPermissions.fromJson(o.toJson());
-      checkWebpropertyPermissions(od);
+      checkWebpropertyPermissions(od as api.WebpropertyPermissions);
     });
   });
 
@@ -4907,7 +4939,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebproperty();
       var od = api.Webproperty.fromJson(o.toJson());
-      checkWebproperty(od);
+      checkWebproperty(od as api.Webproperty);
     });
   });
 
@@ -5003,7 +5035,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGaData(response);
+        checkGaData(response as api.GaData);
       })));
     });
   });
@@ -5089,7 +5121,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMcfData(response);
+        checkMcfData(response as api.McfData);
       })));
     });
   });
@@ -5161,7 +5193,7 @@
               sort: arg_sort,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRealtimeData(response);
+        checkRealtimeData(response as api.RealtimeData);
       })));
     });
   });
@@ -5221,7 +5253,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountSummaries(response);
+        checkAccountSummaries(response as api.AccountSummaries);
       })));
     });
   });
@@ -5295,8 +5327,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityUserLink.fromJson(json);
-        checkEntityUserLink(obj);
+        var obj = api.EntityUserLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityUserLink(obj as api.EntityUserLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5347,7 +5380,7 @@
       res
           .insert(arg_request, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLink(response);
+        checkEntityUserLink(response as api.EntityUserLink);
       })));
     });
 
@@ -5415,7 +5448,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLinks(response);
+        checkEntityUserLinks(response as api.EntityUserLinks);
       })));
     });
 
@@ -5427,8 +5460,9 @@
       var arg_linkId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityUserLink.fromJson(json);
-        checkEntityUserLink(obj);
+        var obj = api.EntityUserLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityUserLink(obj as api.EntityUserLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5482,7 +5516,7 @@
       res
           .update(arg_request, arg_accountId, arg_linkId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLink(response);
+        checkEntityUserLink(response as api.EntityUserLink);
       })));
     });
   });
@@ -5542,7 +5576,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccounts(response);
+        checkAccounts(response as api.Accounts);
       })));
     });
   });
@@ -5554,8 +5588,9 @@
       var arg_request = buildHashClientIdRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HashClientIdRequest.fromJson(json);
-        checkHashClientIdRequest(obj);
+        var obj = api.HashClientIdRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHashClientIdRequest(obj as api.HashClientIdRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5597,7 +5632,7 @@
       res
           .hashClientId(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHashClientIdResponse(response);
+        checkHashClientIdResponse(response as api.HashClientIdResponse);
       })));
     });
   });
@@ -5677,7 +5712,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomDataSources(response);
+        checkCustomDataSources(response as api.CustomDataSources);
       })));
     });
   });
@@ -5753,7 +5788,7 @@
           .get(arg_accountId, arg_webPropertyId, arg_customDimensionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomDimension(response);
+        checkCustomDimension(response as api.CustomDimension);
       })));
     });
 
@@ -5765,8 +5800,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomDimension.fromJson(json);
-        checkCustomDimension(obj);
+        var obj = api.CustomDimension.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomDimension(obj as api.CustomDimension);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5827,7 +5863,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomDimension(response);
+        checkCustomDimension(response as api.CustomDimension);
       })));
     });
 
@@ -5905,7 +5941,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomDimensions(response);
+        checkCustomDimensions(response as api.CustomDimensions);
       })));
     });
 
@@ -5919,8 +5955,9 @@
       var arg_ignoreCustomDataSourceLinks = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomDimension.fromJson(json);
-        checkCustomDimension(obj);
+        var obj = api.CustomDimension.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomDimension(obj as api.CustomDimension);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5988,7 +6025,7 @@
               ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomDimension(response);
+        checkCustomDimension(response as api.CustomDimension);
       })));
     });
 
@@ -6002,8 +6039,9 @@
       var arg_ignoreCustomDataSourceLinks = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomDimension.fromJson(json);
-        checkCustomDimension(obj);
+        var obj = api.CustomDimension.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomDimension(obj as api.CustomDimension);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6071,7 +6109,7 @@
               ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomDimension(response);
+        checkCustomDimension(response as api.CustomDimension);
       })));
     });
   });
@@ -6147,7 +6185,7 @@
           .get(arg_accountId, arg_webPropertyId, arg_customMetricId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomMetric(response);
+        checkCustomMetric(response as api.CustomMetric);
       })));
     });
 
@@ -6159,8 +6197,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomMetric.fromJson(json);
-        checkCustomMetric(obj);
+        var obj = api.CustomMetric.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomMetric(obj as api.CustomMetric);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6221,7 +6260,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomMetric(response);
+        checkCustomMetric(response as api.CustomMetric);
       })));
     });
 
@@ -6299,7 +6338,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomMetrics(response);
+        checkCustomMetrics(response as api.CustomMetrics);
       })));
     });
 
@@ -6313,8 +6352,9 @@
       var arg_ignoreCustomDataSourceLinks = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomMetric.fromJson(json);
-        checkCustomMetric(obj);
+        var obj = api.CustomMetric.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomMetric(obj as api.CustomMetric);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6382,7 +6422,7 @@
               ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomMetric(response);
+        checkCustomMetric(response as api.CustomMetric);
       })));
     });
 
@@ -6396,8 +6436,9 @@
       var arg_ignoreCustomDataSourceLinks = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomMetric.fromJson(json);
-        checkCustomMetric(obj);
+        var obj = api.CustomMetric.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomMetric(obj as api.CustomMetric);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6465,7 +6506,7 @@
               ignoreCustomDataSourceLinks: arg_ignoreCustomDataSourceLinks,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomMetric(response);
+        checkCustomMetric(response as api.CustomMetric);
       })));
     });
   });
@@ -6635,7 +6676,7 @@
               arg_accountId, arg_webPropertyId, arg_profileId, arg_experimentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExperiment(response);
+        checkExperiment(response as api.Experiment);
       })));
     });
 
@@ -6648,8 +6689,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Experiment.fromJson(json);
-        checkExperiment(obj);
+        var obj = api.Experiment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExperiment(obj as api.Experiment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6719,7 +6761,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExperiment(response);
+        checkExperiment(response as api.Experiment);
       })));
     });
 
@@ -6807,7 +6849,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExperiments(response);
+        checkExperiments(response as api.Experiments);
       })));
     });
 
@@ -6821,8 +6863,9 @@
       var arg_experimentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Experiment.fromJson(json);
-        checkExperiment(obj);
+        var obj = api.Experiment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExperiment(obj as api.Experiment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6896,7 +6939,7 @@
               arg_experimentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExperiment(response);
+        checkExperiment(response as api.Experiment);
       })));
     });
 
@@ -6910,8 +6953,9 @@
       var arg_experimentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Experiment.fromJson(json);
-        checkExperiment(obj);
+        var obj = api.Experiment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExperiment(obj as api.Experiment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6985,7 +7029,7 @@
               arg_experimentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExperiment(response);
+        checkExperiment(response as api.Experiment);
       })));
     });
   });
@@ -7050,7 +7094,7 @@
       res
           .delete(arg_accountId, arg_filterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilter(response);
+        checkFilter(response as api.Filter);
       })));
     });
 
@@ -7113,7 +7157,7 @@
       res
           .get(arg_accountId, arg_filterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilter(response);
+        checkFilter(response as api.Filter);
       })));
     });
 
@@ -7124,8 +7168,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Filter.fromJson(json);
-        checkFilter(obj);
+        var obj =
+            api.Filter.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFilter(obj as api.Filter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7176,7 +7221,7 @@
       res
           .insert(arg_request, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilter(response);
+        checkFilter(response as api.Filter);
       })));
     });
 
@@ -7244,7 +7289,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilters(response);
+        checkFilters(response as api.Filters);
       })));
     });
 
@@ -7256,8 +7301,9 @@
       var arg_filterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Filter.fromJson(json);
-        checkFilter(obj);
+        var obj =
+            api.Filter.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFilter(obj as api.Filter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7311,7 +7357,7 @@
       res
           .patch(arg_request, arg_accountId, arg_filterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilter(response);
+        checkFilter(response as api.Filter);
       })));
     });
 
@@ -7323,8 +7369,9 @@
       var arg_filterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Filter.fromJson(json);
-        checkFilter(obj);
+        var obj =
+            api.Filter.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFilter(obj as api.Filter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7379,7 +7426,7 @@
           .update(arg_request, arg_accountId, arg_filterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilter(response);
+        checkFilter(response as api.Filter);
       })));
     });
   });
@@ -7465,7 +7512,7 @@
           .get(arg_accountId, arg_webPropertyId, arg_profileId, arg_goalId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoal(response);
+        checkGoal(response as api.Goal);
       })));
     });
 
@@ -7478,8 +7525,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Goal.fromJson(json);
-        checkGoal(obj);
+        var obj =
+            api.Goal.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoal(obj as api.Goal);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7549,7 +7597,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoal(response);
+        checkGoal(response as api.Goal);
       })));
     });
 
@@ -7637,7 +7685,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoals(response);
+        checkGoals(response as api.Goals);
       })));
     });
 
@@ -7651,8 +7699,9 @@
       var arg_goalId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Goal.fromJson(json);
-        checkGoal(obj);
+        var obj =
+            api.Goal.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoal(obj as api.Goal);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7726,7 +7775,7 @@
               arg_goalId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoal(response);
+        checkGoal(response as api.Goal);
       })));
     });
 
@@ -7740,8 +7789,9 @@
       var arg_goalId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Goal.fromJson(json);
-        checkGoal(obj);
+        var obj =
+            api.Goal.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoal(obj as api.Goal);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7815,7 +7865,7 @@
               arg_goalId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoal(response);
+        checkGoal(response as api.Goal);
       })));
     });
   });
@@ -7983,7 +8033,7 @@
           .get(arg_accountId, arg_webPropertyId, arg_profileId, arg_linkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfileFilterLink(response);
+        checkProfileFilterLink(response as api.ProfileFilterLink);
       })));
     });
 
@@ -7996,8 +8046,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProfileFilterLink.fromJson(json);
-        checkProfileFilterLink(obj);
+        var obj = api.ProfileFilterLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProfileFilterLink(obj as api.ProfileFilterLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8067,7 +8118,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfileFilterLink(response);
+        checkProfileFilterLink(response as api.ProfileFilterLink);
       })));
     });
 
@@ -8155,7 +8206,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfileFilterLinks(response);
+        checkProfileFilterLinks(response as api.ProfileFilterLinks);
       })));
     });
 
@@ -8169,8 +8220,9 @@
       var arg_linkId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProfileFilterLink.fromJson(json);
-        checkProfileFilterLink(obj);
+        var obj = api.ProfileFilterLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProfileFilterLink(obj as api.ProfileFilterLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8244,7 +8296,7 @@
               arg_linkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfileFilterLink(response);
+        checkProfileFilterLink(response as api.ProfileFilterLink);
       })));
     });
 
@@ -8258,8 +8310,9 @@
       var arg_linkId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProfileFilterLink.fromJson(json);
-        checkProfileFilterLink(obj);
+        var obj = api.ProfileFilterLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProfileFilterLink(obj as api.ProfileFilterLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8333,7 +8386,7 @@
               arg_linkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfileFilterLink(response);
+        checkProfileFilterLink(response as api.ProfileFilterLink);
       })));
     });
   });
@@ -8430,8 +8483,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityUserLink.fromJson(json);
-        checkEntityUserLink(obj);
+        var obj = api.EntityUserLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityUserLink(obj as api.EntityUserLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8501,7 +8555,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLink(response);
+        checkEntityUserLink(response as api.EntityUserLink);
       })));
     });
 
@@ -8589,7 +8643,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLinks(response);
+        checkEntityUserLinks(response as api.EntityUserLinks);
       })));
     });
 
@@ -8603,8 +8657,9 @@
       var arg_linkId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityUserLink.fromJson(json);
-        checkEntityUserLink(obj);
+        var obj = api.EntityUserLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityUserLink(obj as api.EntityUserLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8678,7 +8733,7 @@
               arg_linkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLink(response);
+        checkEntityUserLink(response as api.EntityUserLink);
       })));
     });
   });
@@ -8826,7 +8881,7 @@
           .get(arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
 
@@ -8838,8 +8893,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Profile.fromJson(json);
-        checkProfile(obj);
+        var obj =
+            api.Profile.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProfile(obj as api.Profile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8900,7 +8956,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
 
@@ -8978,7 +9034,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfiles(response);
+        checkProfiles(response as api.Profiles);
       })));
     });
 
@@ -8991,8 +9047,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Profile.fromJson(json);
-        checkProfile(obj);
+        var obj =
+            api.Profile.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProfile(obj as api.Profile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9056,7 +9113,7 @@
           .patch(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
 
@@ -9069,8 +9126,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Profile.fromJson(json);
-        checkProfile(obj);
+        var obj =
+            api.Profile.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProfile(obj as api.Profile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9134,7 +9192,7 @@
           .update(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
   });
@@ -9282,7 +9340,7 @@
           .get(arg_accountId, arg_webPropertyId, arg_remarketingAudienceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingAudience(response);
+        checkRemarketingAudience(response as api.RemarketingAudience);
       })));
     });
 
@@ -9294,8 +9352,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingAudience.fromJson(json);
-        checkRemarketingAudience(obj);
+        var obj = api.RemarketingAudience.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingAudience(obj as api.RemarketingAudience);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9356,7 +9415,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingAudience(response);
+        checkRemarketingAudience(response as api.RemarketingAudience);
       })));
     });
 
@@ -9437,7 +9496,7 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingAudiences(response);
+        checkRemarketingAudiences(response as api.RemarketingAudiences);
       })));
     });
 
@@ -9450,8 +9509,9 @@
       var arg_remarketingAudienceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingAudience.fromJson(json);
-        checkRemarketingAudience(obj);
+        var obj = api.RemarketingAudience.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingAudience(obj as api.RemarketingAudience);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9516,7 +9576,7 @@
               arg_remarketingAudienceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingAudience(response);
+        checkRemarketingAudience(response as api.RemarketingAudience);
       })));
     });
 
@@ -9529,8 +9589,9 @@
       var arg_remarketingAudienceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingAudience.fromJson(json);
-        checkRemarketingAudience(obj);
+        var obj = api.RemarketingAudience.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingAudience(obj as api.RemarketingAudience);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9595,7 +9656,7 @@
               arg_remarketingAudienceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingAudience(response);
+        checkRemarketingAudience(response as api.RemarketingAudience);
       })));
     });
   });
@@ -9655,7 +9716,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSegments(response);
+        checkSegments(response as api.Segments);
       })));
     });
   });
@@ -9825,7 +9886,7 @@
               arg_unsampledReportId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUnsampledReport(response);
+        checkUnsampledReport(response as api.UnsampledReport);
       })));
     });
 
@@ -9838,8 +9899,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UnsampledReport.fromJson(json);
-        checkUnsampledReport(obj);
+        var obj = api.UnsampledReport.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUnsampledReport(obj as api.UnsampledReport);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9909,7 +9971,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId, arg_profileId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUnsampledReport(response);
+        checkUnsampledReport(response as api.UnsampledReport);
       })));
     });
 
@@ -9997,7 +10059,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUnsampledReports(response);
+        checkUnsampledReports(response as api.UnsampledReports);
       })));
     });
   });
@@ -10012,8 +10074,10 @@
       var arg_customDataSourceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(json);
-        checkAnalyticsDataimportDeleteUploadDataRequest(obj);
+        var obj = api.AnalyticsDataimportDeleteUploadDataRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnalyticsDataimportDeleteUploadDataRequest(
+            obj as api.AnalyticsDataimportDeleteUploadDataRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10167,7 +10231,7 @@
               arg_uploadId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUpload(response);
+        checkUpload(response as api.Upload);
       })));
     });
 
@@ -10255,7 +10319,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUploads(response);
+        checkUploads(response as api.Uploads);
       })));
     });
 
@@ -10338,7 +10402,7 @@
           .uploadData(arg_accountId, arg_webPropertyId, arg_customDataSourceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUpload(response);
+        checkUpload(response as api.Upload);
       })));
     });
   });
@@ -10489,7 +10553,7 @@
           .get(arg_accountId, arg_webPropertyId, arg_webPropertyAdWordsLinkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityAdWordsLink(response);
+        checkEntityAdWordsLink(response as api.EntityAdWordsLink);
       })));
     });
 
@@ -10501,8 +10565,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityAdWordsLink.fromJson(json);
-        checkEntityAdWordsLink(obj);
+        var obj = api.EntityAdWordsLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityAdWordsLink(obj as api.EntityAdWordsLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10563,7 +10628,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityAdWordsLink(response);
+        checkEntityAdWordsLink(response as api.EntityAdWordsLink);
       })));
     });
 
@@ -10641,7 +10706,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityAdWordsLinks(response);
+        checkEntityAdWordsLinks(response as api.EntityAdWordsLinks);
       })));
     });
 
@@ -10654,8 +10719,9 @@
       var arg_webPropertyAdWordsLinkId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityAdWordsLink.fromJson(json);
-        checkEntityAdWordsLink(obj);
+        var obj = api.EntityAdWordsLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityAdWordsLink(obj as api.EntityAdWordsLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10721,7 +10787,7 @@
               arg_webPropertyAdWordsLinkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityAdWordsLink(response);
+        checkEntityAdWordsLink(response as api.EntityAdWordsLink);
       })));
     });
 
@@ -10734,8 +10800,9 @@
       var arg_webPropertyAdWordsLinkId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityAdWordsLink.fromJson(json);
-        checkEntityAdWordsLink(obj);
+        var obj = api.EntityAdWordsLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityAdWordsLink(obj as api.EntityAdWordsLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10801,7 +10868,7 @@
               arg_webPropertyAdWordsLinkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityAdWordsLink(response);
+        checkEntityAdWordsLink(response as api.EntityAdWordsLink);
       })));
     });
   });
@@ -10866,7 +10933,7 @@
       res
           .get(arg_accountId, arg_webPropertyId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebproperty(response);
+        checkWebproperty(response as api.Webproperty);
       })));
     });
 
@@ -10877,8 +10944,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Webproperty.fromJson(json);
-        checkWebproperty(obj);
+        var obj = api.Webproperty.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWebproperty(obj as api.Webproperty);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10929,7 +10997,7 @@
       res
           .insert(arg_request, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebproperty(response);
+        checkWebproperty(response as api.Webproperty);
       })));
     });
 
@@ -10997,7 +11065,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebproperties(response);
+        checkWebproperties(response as api.Webproperties);
       })));
     });
 
@@ -11009,8 +11077,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Webproperty.fromJson(json);
-        checkWebproperty(obj);
+        var obj = api.Webproperty.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWebproperty(obj as api.Webproperty);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11065,7 +11134,7 @@
           .patch(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebproperty(response);
+        checkWebproperty(response as api.Webproperty);
       })));
     });
 
@@ -11077,8 +11146,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Webproperty.fromJson(json);
-        checkWebproperty(obj);
+        var obj = api.Webproperty.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWebproperty(obj as api.Webproperty);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11133,7 +11203,7 @@
           .update(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebproperty(response);
+        checkWebproperty(response as api.Webproperty);
       })));
     });
   });
@@ -11219,8 +11289,9 @@
       var arg_webPropertyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityUserLink.fromJson(json);
-        checkEntityUserLink(obj);
+        var obj = api.EntityUserLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityUserLink(obj as api.EntityUserLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11281,7 +11352,7 @@
           .insert(arg_request, arg_accountId, arg_webPropertyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLink(response);
+        checkEntityUserLink(response as api.EntityUserLink);
       })));
     });
 
@@ -11359,7 +11430,7 @@
               start_index: arg_start_index,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLinks(response);
+        checkEntityUserLinks(response as api.EntityUserLinks);
       })));
     });
 
@@ -11372,8 +11443,9 @@
       var arg_linkId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EntityUserLink.fromJson(json);
-        checkEntityUserLink(obj);
+        var obj = api.EntityUserLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntityUserLink(obj as api.EntityUserLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11437,7 +11509,7 @@
           .update(arg_request, arg_accountId, arg_webPropertyId, arg_linkId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntityUserLink(response);
+        checkEntityUserLink(response as api.EntityUserLink);
       })));
     });
   });
@@ -11498,7 +11570,7 @@
       res
           .list(arg_reportType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkColumns(response);
+        checkColumns(response as api.Columns);
       })));
     });
   });
@@ -11510,8 +11582,9 @@
       var arg_request = buildAccountTicket();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountTicket.fromJson(json);
-        checkAccountTicket(obj);
+        var obj = api.AccountTicket.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountTicket(obj as api.AccountTicket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11553,7 +11626,7 @@
       res
           .createAccountTicket(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountTicket(response);
+        checkAccountTicket(response as api.AccountTicket);
       })));
     });
 
@@ -11563,8 +11636,9 @@
       var arg_request = buildAccountTreeRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountTreeRequest.fromJson(json);
-        checkAccountTreeRequest(obj);
+        var obj = api.AccountTreeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountTreeRequest(obj as api.AccountTreeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11606,7 +11680,7 @@
       res
           .createAccountTree(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountTreeResponse(response);
+        checkAccountTreeResponse(response as api.AccountTreeResponse);
       })));
     });
   });
@@ -11618,8 +11692,9 @@
       var arg_request = buildUserDeletionRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserDeletionRequest.fromJson(json);
-        checkUserDeletionRequest(obj);
+        var obj = api.UserDeletionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUserDeletionRequest(obj as api.UserDeletionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11661,7 +11736,7 @@
       res
           .upsert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserDeletionRequest(response);
+        checkUserDeletionRequest(response as api.UserDeletionRequest);
       })));
     });
   });
diff --git a/generated/googleapis/test/analyticsreporting/v4_test.dart b/generated/googleapis/test/analyticsreporting/v4_test.dart
index 57404bc..8618a80 100644
--- a/generated/googleapis/test/analyticsreporting/v4_test.dart
+++ b/generated/googleapis/test/analyticsreporting/v4_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed5640(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomDimension(o[0]);
-  checkCustomDimension(o[1]);
+  checkCustomDimension(o[0] as api.CustomDimension);
+  checkCustomDimension(o[1] as api.CustomDimension);
 }
 
 core.int buildCounterActivity = 0;
@@ -117,18 +117,18 @@
   if (buildCounterActivity < 3) {
     unittest.expect(o.activityTime, unittest.equals('foo'));
     unittest.expect(o.activityType, unittest.equals('foo'));
-    checkScreenviewData(o.appview);
+    checkScreenviewData(o.appview as api.ScreenviewData);
     unittest.expect(o.campaign, unittest.equals('foo'));
     unittest.expect(o.channelGrouping, unittest.equals('foo'));
     checkUnnamed5640(o.customDimension);
-    checkEcommerceData(o.ecommerce);
-    checkEventData(o.event);
-    checkGoalSetData(o.goals);
+    checkEcommerceData(o.ecommerce as api.EcommerceData);
+    checkEventData(o.event as api.EventData);
+    checkGoalSetData(o.goals as api.GoalSetData);
     unittest.expect(o.hostname, unittest.equals('foo'));
     unittest.expect(o.keyword, unittest.equals('foo'));
     unittest.expect(o.landingPagePath, unittest.equals('foo'));
     unittest.expect(o.medium, unittest.equals('foo'));
-    checkPageviewData(o.pageview);
+    checkPageviewData(o.pageview as api.PageviewData);
     unittest.expect(o.source, unittest.equals('foo'));
   }
   buildCounterActivity--;
@@ -150,7 +150,7 @@
 void checkCohort(api.Cohort o) {
   buildCounterCohort++;
   if (buildCounterCohort < 3) {
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -166,8 +166,8 @@
 
 void checkUnnamed5641(core.List<api.Cohort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCohort(o[0]);
-  checkCohort(o[1]);
+  checkCohort(o[0] as api.Cohort);
+  checkCohort(o[1] as api.Cohort);
 }
 
 core.int buildCounterCohortGroup = 0;
@@ -220,7 +220,7 @@
   buildCounterColumnHeader++;
   if (buildCounterColumnHeader < 3) {
     checkUnnamed5642(o.dimensions);
-    checkMetricHeader(o.metricHeader);
+    checkMetricHeader(o.metricHeader as api.MetricHeader);
   }
   buildCounterColumnHeader--;
 }
@@ -276,8 +276,8 @@
 
 void checkUnnamed5643(core.List<api.PivotValueRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotValueRegion(o[0]);
-  checkPivotValueRegion(o[1]);
+  checkPivotValueRegion(o[0] as api.PivotValueRegion);
+  checkPivotValueRegion(o[1] as api.PivotValueRegion);
 }
 
 core.List<core.String> buildUnnamed5644() {
@@ -397,8 +397,8 @@
 
 void checkUnnamed5647(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionFilter(o[0]);
-  checkDimensionFilter(o[1]);
+  checkDimensionFilter(o[0] as api.DimensionFilter);
+  checkDimensionFilter(o[1] as api.DimensionFilter);
 }
 
 core.int buildCounterDimensionFilterClause = 0;
@@ -439,8 +439,8 @@
   buildCounterDynamicSegment++;
   if (buildCounterDynamicSegment < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkSegmentDefinition(o.sessionSegment);
-    checkSegmentDefinition(o.userSegment);
+    checkSegmentDefinition(o.sessionSegment as api.SegmentDefinition);
+    checkSegmentDefinition(o.userSegment as api.SegmentDefinition);
   }
   buildCounterDynamicSegment--;
 }
@@ -454,8 +454,8 @@
 
 void checkUnnamed5648(core.List<api.ProductData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductData(o[0]);
-  checkProductData(o[1]);
+  checkProductData(o[0] as api.ProductData);
+  checkProductData(o[1] as api.ProductData);
 }
 
 core.int buildCounterEcommerceData = 0;
@@ -478,7 +478,7 @@
     unittest.expect(o.actionType, unittest.equals('foo'));
     unittest.expect(o.ecommerceType, unittest.equals('foo'));
     checkUnnamed5648(o.products);
-    checkTransactionData(o.transaction);
+    checkTransactionData(o.transaction as api.TransactionData);
   }
   buildCounterEcommerceData--;
 }
@@ -519,8 +519,8 @@
 
 void checkUnnamed5649(core.List<api.ReportRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportRequest(o[0]);
-  checkReportRequest(o[1]);
+  checkReportRequest(o[0] as api.ReportRequest);
+  checkReportRequest(o[1] as api.ReportRequest);
 }
 
 core.int buildCounterGetReportsRequest = 0;
@@ -553,8 +553,8 @@
 
 void checkUnnamed5650(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReport(o[0]);
-  checkReport(o[1]);
+  checkReport(o[0] as api.Report);
+  checkReport(o[1] as api.Report);
 }
 
 core.int buildCounterGetReportsResponse = 0;
@@ -575,7 +575,8 @@
   if (buildCounterGetReportsResponse < 3) {
     unittest.expect(o.queryCost, unittest.equals(42));
     checkUnnamed5650(o.reports);
-    checkResourceQuotasRemaining(o.resourceQuotasRemaining);
+    checkResourceQuotasRemaining(
+        o.resourceQuotasRemaining as api.ResourceQuotasRemaining);
   }
   buildCounterGetReportsResponse--;
 }
@@ -622,8 +623,8 @@
 
 void checkUnnamed5651(core.List<api.GoalData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoalData(o[0]);
-  checkGoalData(o[1]);
+  checkGoalData(o[0] as api.GoalData);
+  checkGoalData(o[1] as api.GoalData);
 }
 
 core.int buildCounterGoalSetData = 0;
@@ -702,8 +703,8 @@
 
 void checkUnnamed5652(core.List<api.MetricFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricFilter(o[0]);
-  checkMetricFilter(o[1]);
+  checkMetricFilter(o[0] as api.MetricFilter);
+  checkMetricFilter(o[1] as api.MetricFilter);
 }
 
 core.int buildCounterMetricFilterClause = 0;
@@ -736,8 +737,8 @@
 
 void checkUnnamed5653(core.List<api.MetricHeaderEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricHeaderEntry(o[0]);
-  checkMetricHeaderEntry(o[1]);
+  checkMetricHeaderEntry(o[0] as api.MetricHeaderEntry);
+  checkMetricHeaderEntry(o[1] as api.MetricHeaderEntry);
 }
 
 core.List<api.PivotHeader> buildUnnamed5654() {
@@ -749,8 +750,8 @@
 
 void checkUnnamed5654(core.List<api.PivotHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotHeader(o[0]);
-  checkPivotHeader(o[1]);
+  checkPivotHeader(o[0] as api.PivotHeader);
+  checkPivotHeader(o[1] as api.PivotHeader);
 }
 
 core.int buildCounterMetricHeader = 0;
@@ -804,8 +805,8 @@
 
 void checkUnnamed5655(core.List<api.SegmentFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSegmentFilterClause(o[0]);
-  checkSegmentFilterClause(o[1]);
+  checkSegmentFilterClause(o[0] as api.SegmentFilterClause);
+  checkSegmentFilterClause(o[1] as api.SegmentFilterClause);
 }
 
 core.int buildCounterOrFiltersForSegment = 0;
@@ -880,8 +881,8 @@
 
 void checkUnnamed5656(core.List<api.DimensionFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionFilterClause(o[0]);
-  checkDimensionFilterClause(o[1]);
+  checkDimensionFilterClause(o[0] as api.DimensionFilterClause);
+  checkDimensionFilterClause(o[1] as api.DimensionFilterClause);
 }
 
 core.List<api.Dimension> buildUnnamed5657() {
@@ -893,8 +894,8 @@
 
 void checkUnnamed5657(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Metric> buildUnnamed5658() {
@@ -906,8 +907,8 @@
 
 void checkUnnamed5658(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.int buildCounterPivot = 0;
@@ -946,8 +947,8 @@
 
 void checkUnnamed5659(core.List<api.PivotHeaderEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotHeaderEntry(o[0]);
-  checkPivotHeaderEntry(o[1]);
+  checkPivotHeaderEntry(o[0] as api.PivotHeaderEntry);
+  checkPivotHeaderEntry(o[1] as api.PivotHeaderEntry);
 }
 
 core.int buildCounterPivotHeader = 0;
@@ -1015,7 +1016,7 @@
   if (buildCounterPivotHeaderEntry < 3) {
     checkUnnamed5660(o.dimensionNames);
     checkUnnamed5661(o.dimensionValues);
-    checkMetricHeaderEntry(o.metric);
+    checkMetricHeaderEntry(o.metric as api.MetricHeaderEntry);
   }
   buildCounterPivotHeaderEntry--;
 }
@@ -1093,8 +1094,8 @@
 void checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkColumnHeader(o.columnHeader);
-    checkReportData(o.data);
+    checkColumnHeader(o.columnHeader as api.ColumnHeader);
+    checkReportData(o.data as api.ReportData);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterReport--;
@@ -1109,8 +1110,8 @@
 
 void checkUnnamed5663(core.List<api.DateRangeValues> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
+  checkDateRangeValues(o[0] as api.DateRangeValues);
+  checkDateRangeValues(o[1] as api.DateRangeValues);
 }
 
 core.List<api.DateRangeValues> buildUnnamed5664() {
@@ -1122,8 +1123,8 @@
 
 void checkUnnamed5664(core.List<api.DateRangeValues> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
+  checkDateRangeValues(o[0] as api.DateRangeValues);
+  checkDateRangeValues(o[1] as api.DateRangeValues);
 }
 
 core.List<api.ReportRow> buildUnnamed5665() {
@@ -1135,8 +1136,8 @@
 
 void checkUnnamed5665(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportRow(o[0]);
-  checkReportRow(o[1]);
+  checkReportRow(o[0] as api.ReportRow);
+  checkReportRow(o[1] as api.ReportRow);
 }
 
 core.List<core.String> buildUnnamed5666() {
@@ -1174,8 +1175,8 @@
 
 void checkUnnamed5668(core.List<api.DateRangeValues> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
+  checkDateRangeValues(o[0] as api.DateRangeValues);
+  checkDateRangeValues(o[1] as api.DateRangeValues);
 }
 
 core.int buildCounterReportData = 0;
@@ -1222,8 +1223,8 @@
 
 void checkUnnamed5669(core.List<api.DateRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDateRange(o[0]);
-  checkDateRange(o[1]);
+  checkDateRange(o[0] as api.DateRange);
+  checkDateRange(o[1] as api.DateRange);
 }
 
 core.List<api.DimensionFilterClause> buildUnnamed5670() {
@@ -1235,8 +1236,8 @@
 
 void checkUnnamed5670(core.List<api.DimensionFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionFilterClause(o[0]);
-  checkDimensionFilterClause(o[1]);
+  checkDimensionFilterClause(o[0] as api.DimensionFilterClause);
+  checkDimensionFilterClause(o[1] as api.DimensionFilterClause);
 }
 
 core.List<api.Dimension> buildUnnamed5671() {
@@ -1248,8 +1249,8 @@
 
 void checkUnnamed5671(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.MetricFilterClause> buildUnnamed5672() {
@@ -1261,8 +1262,8 @@
 
 void checkUnnamed5672(core.List<api.MetricFilterClause> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricFilterClause(o[0]);
-  checkMetricFilterClause(o[1]);
+  checkMetricFilterClause(o[0] as api.MetricFilterClause);
+  checkMetricFilterClause(o[1] as api.MetricFilterClause);
 }
 
 core.List<api.Metric> buildUnnamed5673() {
@@ -1274,8 +1275,8 @@
 
 void checkUnnamed5673(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.OrderBy> buildUnnamed5674() {
@@ -1287,8 +1288,8 @@
 
 void checkUnnamed5674(core.List<api.OrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderBy(o[0]);
-  checkOrderBy(o[1]);
+  checkOrderBy(o[0] as api.OrderBy);
+  checkOrderBy(o[1] as api.OrderBy);
 }
 
 core.List<api.Pivot> buildUnnamed5675() {
@@ -1300,8 +1301,8 @@
 
 void checkUnnamed5675(core.List<api.Pivot> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivot(o[0]);
-  checkPivot(o[1]);
+  checkPivot(o[0] as api.Pivot);
+  checkPivot(o[1] as api.Pivot);
 }
 
 core.List<api.Segment> buildUnnamed5676() {
@@ -1313,8 +1314,8 @@
 
 void checkUnnamed5676(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSegment(o[0]);
-  checkSegment(o[1]);
+  checkSegment(o[0] as api.Segment);
+  checkSegment(o[1] as api.Segment);
 }
 
 core.int buildCounterReportRequest = 0;
@@ -1347,7 +1348,7 @@
 void checkReportRequest(api.ReportRequest o) {
   buildCounterReportRequest++;
   if (buildCounterReportRequest < 3) {
-    checkCohortGroup(o.cohortGroup);
+    checkCohortGroup(o.cohortGroup as api.CohortGroup);
     checkUnnamed5669(o.dateRanges);
     checkUnnamed5670(o.dimensionFilterClauses);
     checkUnnamed5671(o.dimensions);
@@ -1390,8 +1391,8 @@
 
 void checkUnnamed5678(core.List<api.DateRangeValues> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDateRangeValues(o[0]);
-  checkDateRangeValues(o[1]);
+  checkDateRangeValues(o[0] as api.DateRangeValues);
+  checkDateRangeValues(o[1] as api.DateRangeValues);
 }
 
 core.int buildCounterReportRow = 0;
@@ -1494,10 +1495,10 @@
   buildCounterSearchUserActivityRequest++;
   if (buildCounterSearchUserActivityRequest < 3) {
     checkUnnamed5679(o.activityTypes);
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkUser(o.user);
+    checkUser(o.user as api.User);
     unittest.expect(o.viewId, unittest.equals('foo'));
   }
   buildCounterSearchUserActivityRequest--;
@@ -1512,8 +1513,8 @@
 
 void checkUnnamed5680(core.List<api.UserActivitySession> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserActivitySession(o[0]);
-  checkUserActivitySession(o[1]);
+  checkUserActivitySession(o[0] as api.UserActivitySession);
+  checkUserActivitySession(o[1] as api.UserActivitySession);
 }
 
 core.int buildCounterSearchUserActivityResponse = 0;
@@ -1556,7 +1557,7 @@
 void checkSegment(api.Segment o) {
   buildCounterSegment++;
   if (buildCounterSegment < 3) {
-    checkDynamicSegment(o.dynamicSegment);
+    checkDynamicSegment(o.dynamicSegment as api.DynamicSegment);
     unittest.expect(o.segmentId, unittest.equals('foo'));
   }
   buildCounterSegment--;
@@ -1571,8 +1572,8 @@
 
 void checkUnnamed5681(core.List<api.SegmentFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSegmentFilter(o[0]);
-  checkSegmentFilter(o[1]);
+  checkSegmentFilter(o[0] as api.SegmentFilter);
+  checkSegmentFilter(o[1] as api.SegmentFilter);
 }
 
 core.int buildCounterSegmentDefinition = 0;
@@ -1653,8 +1654,8 @@
   buildCounterSegmentFilter++;
   if (buildCounterSegmentFilter < 3) {
     unittest.expect(o.not, unittest.isTrue);
-    checkSequenceSegment(o.sequenceSegment);
-    checkSimpleSegment(o.simpleSegment);
+    checkSequenceSegment(o.sequenceSegment as api.SequenceSegment);
+    checkSimpleSegment(o.simpleSegment as api.SimpleSegment);
   }
   buildCounterSegmentFilter--;
 }
@@ -1675,8 +1676,9 @@
 void checkSegmentFilterClause(api.SegmentFilterClause o) {
   buildCounterSegmentFilterClause++;
   if (buildCounterSegmentFilterClause < 3) {
-    checkSegmentDimensionFilter(o.dimensionFilter);
-    checkSegmentMetricFilter(o.metricFilter);
+    checkSegmentDimensionFilter(
+        o.dimensionFilter as api.SegmentDimensionFilter);
+    checkSegmentMetricFilter(o.metricFilter as api.SegmentMetricFilter);
     unittest.expect(o.not, unittest.isTrue);
   }
   buildCounterSegmentFilterClause--;
@@ -1718,8 +1720,8 @@
 
 void checkUnnamed5683(core.List<api.OrFiltersForSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrFiltersForSegment(o[0]);
-  checkOrFiltersForSegment(o[1]);
+  checkOrFiltersForSegment(o[0] as api.OrFiltersForSegment);
+  checkOrFiltersForSegment(o[1] as api.OrFiltersForSegment);
 }
 
 core.int buildCounterSegmentSequenceStep = 0;
@@ -1752,8 +1754,8 @@
 
 void checkUnnamed5684(core.List<api.SegmentSequenceStep> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSegmentSequenceStep(o[0]);
-  checkSegmentSequenceStep(o[1]);
+  checkSegmentSequenceStep(o[0] as api.SegmentSequenceStep);
+  checkSegmentSequenceStep(o[1] as api.SegmentSequenceStep);
 }
 
 core.int buildCounterSequenceSegment = 0;
@@ -1786,8 +1788,8 @@
 
 void checkUnnamed5685(core.List<api.OrFiltersForSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrFiltersForSegment(o[0]);
-  checkOrFiltersForSegment(o[1]);
+  checkOrFiltersForSegment(o[0] as api.OrFiltersForSegment);
+  checkOrFiltersForSegment(o[1] as api.OrFiltersForSegment);
 }
 
 core.int buildCounterSimpleSegment = 0;
@@ -1864,8 +1866,8 @@
 
 void checkUnnamed5686(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActivity(o[0]);
-  checkActivity(o[1]);
+  checkActivity(o[0] as api.Activity);
+  checkActivity(o[1] as api.Activity);
 }
 
 core.int buildCounterUserActivitySession = 0;
@@ -1902,7 +1904,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivity();
       var od = api.Activity.fromJson(o.toJson());
-      checkActivity(od);
+      checkActivity(od as api.Activity);
     });
   });
 
@@ -1910,7 +1912,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCohort();
       var od = api.Cohort.fromJson(o.toJson());
-      checkCohort(od);
+      checkCohort(od as api.Cohort);
     });
   });
 
@@ -1918,7 +1920,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCohortGroup();
       var od = api.CohortGroup.fromJson(o.toJson());
-      checkCohortGroup(od);
+      checkCohortGroup(od as api.CohortGroup);
     });
   });
 
@@ -1926,7 +1928,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColumnHeader();
       var od = api.ColumnHeader.fromJson(o.toJson());
-      checkColumnHeader(od);
+      checkColumnHeader(od as api.ColumnHeader);
     });
   });
 
@@ -1934,7 +1936,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDimension();
       var od = api.CustomDimension.fromJson(o.toJson());
-      checkCustomDimension(od);
+      checkCustomDimension(od as api.CustomDimension);
     });
   });
 
@@ -1942,7 +1944,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateRange();
       var od = api.DateRange.fromJson(o.toJson());
-      checkDateRange(od);
+      checkDateRange(od as api.DateRange);
     });
   });
 
@@ -1950,7 +1952,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateRangeValues();
       var od = api.DateRangeValues.fromJson(o.toJson());
-      checkDateRangeValues(od);
+      checkDateRangeValues(od as api.DateRangeValues);
     });
   });
 
@@ -1958,7 +1960,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimension();
       var od = api.Dimension.fromJson(o.toJson());
-      checkDimension(od);
+      checkDimension(od as api.Dimension);
     });
   });
 
@@ -1966,7 +1968,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionFilter();
       var od = api.DimensionFilter.fromJson(o.toJson());
-      checkDimensionFilter(od);
+      checkDimensionFilter(od as api.DimensionFilter);
     });
   });
 
@@ -1974,7 +1976,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionFilterClause();
       var od = api.DimensionFilterClause.fromJson(o.toJson());
-      checkDimensionFilterClause(od);
+      checkDimensionFilterClause(od as api.DimensionFilterClause);
     });
   });
 
@@ -1982,7 +1984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDynamicSegment();
       var od = api.DynamicSegment.fromJson(o.toJson());
-      checkDynamicSegment(od);
+      checkDynamicSegment(od as api.DynamicSegment);
     });
   });
 
@@ -1990,7 +1992,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEcommerceData();
       var od = api.EcommerceData.fromJson(o.toJson());
-      checkEcommerceData(od);
+      checkEcommerceData(od as api.EcommerceData);
     });
   });
 
@@ -1998,7 +2000,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventData();
       var od = api.EventData.fromJson(o.toJson());
-      checkEventData(od);
+      checkEventData(od as api.EventData);
     });
   });
 
@@ -2006,7 +2008,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetReportsRequest();
       var od = api.GetReportsRequest.fromJson(o.toJson());
-      checkGetReportsRequest(od);
+      checkGetReportsRequest(od as api.GetReportsRequest);
     });
   });
 
@@ -2014,7 +2016,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetReportsResponse();
       var od = api.GetReportsResponse.fromJson(o.toJson());
-      checkGetReportsResponse(od);
+      checkGetReportsResponse(od as api.GetReportsResponse);
     });
   });
 
@@ -2022,7 +2024,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalData();
       var od = api.GoalData.fromJson(o.toJson());
-      checkGoalData(od);
+      checkGoalData(od as api.GoalData);
     });
   });
 
@@ -2030,7 +2032,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoalSetData();
       var od = api.GoalSetData.fromJson(o.toJson());
-      checkGoalSetData(od);
+      checkGoalSetData(od as api.GoalSetData);
     });
   });
 
@@ -2038,7 +2040,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetric();
       var od = api.Metric.fromJson(o.toJson());
-      checkMetric(od);
+      checkMetric(od as api.Metric);
     });
   });
 
@@ -2046,7 +2048,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricFilter();
       var od = api.MetricFilter.fromJson(o.toJson());
-      checkMetricFilter(od);
+      checkMetricFilter(od as api.MetricFilter);
     });
   });
 
@@ -2054,7 +2056,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricFilterClause();
       var od = api.MetricFilterClause.fromJson(o.toJson());
-      checkMetricFilterClause(od);
+      checkMetricFilterClause(od as api.MetricFilterClause);
     });
   });
 
@@ -2062,7 +2064,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricHeader();
       var od = api.MetricHeader.fromJson(o.toJson());
-      checkMetricHeader(od);
+      checkMetricHeader(od as api.MetricHeader);
     });
   });
 
@@ -2070,7 +2072,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricHeaderEntry();
       var od = api.MetricHeaderEntry.fromJson(o.toJson());
-      checkMetricHeaderEntry(od);
+      checkMetricHeaderEntry(od as api.MetricHeaderEntry);
     });
   });
 
@@ -2078,7 +2080,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrFiltersForSegment();
       var od = api.OrFiltersForSegment.fromJson(o.toJson());
-      checkOrFiltersForSegment(od);
+      checkOrFiltersForSegment(od as api.OrFiltersForSegment);
     });
   });
 
@@ -2086,7 +2088,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderBy();
       var od = api.OrderBy.fromJson(o.toJson());
-      checkOrderBy(od);
+      checkOrderBy(od as api.OrderBy);
     });
   });
 
@@ -2094,7 +2096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageviewData();
       var od = api.PageviewData.fromJson(o.toJson());
-      checkPageviewData(od);
+      checkPageviewData(od as api.PageviewData);
     });
   });
 
@@ -2102,7 +2104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivot();
       var od = api.Pivot.fromJson(o.toJson());
-      checkPivot(od);
+      checkPivot(od as api.Pivot);
     });
   });
 
@@ -2110,7 +2112,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotHeader();
       var od = api.PivotHeader.fromJson(o.toJson());
-      checkPivotHeader(od);
+      checkPivotHeader(od as api.PivotHeader);
     });
   });
 
@@ -2118,7 +2120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotHeaderEntry();
       var od = api.PivotHeaderEntry.fromJson(o.toJson());
-      checkPivotHeaderEntry(od);
+      checkPivotHeaderEntry(od as api.PivotHeaderEntry);
     });
   });
 
@@ -2126,7 +2128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotValueRegion();
       var od = api.PivotValueRegion.fromJson(o.toJson());
-      checkPivotValueRegion(od);
+      checkPivotValueRegion(od as api.PivotValueRegion);
     });
   });
 
@@ -2134,7 +2136,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductData();
       var od = api.ProductData.fromJson(o.toJson());
-      checkProductData(od);
+      checkProductData(od as api.ProductData);
     });
   });
 
@@ -2142,7 +2144,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReport();
       var od = api.Report.fromJson(o.toJson());
-      checkReport(od);
+      checkReport(od as api.Report);
     });
   });
 
@@ -2150,7 +2152,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportData();
       var od = api.ReportData.fromJson(o.toJson());
-      checkReportData(od);
+      checkReportData(od as api.ReportData);
     });
   });
 
@@ -2158,7 +2160,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRequest();
       var od = api.ReportRequest.fromJson(o.toJson());
-      checkReportRequest(od);
+      checkReportRequest(od as api.ReportRequest);
     });
   });
 
@@ -2166,7 +2168,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRow();
       var od = api.ReportRow.fromJson(o.toJson());
-      checkReportRow(od);
+      checkReportRow(od as api.ReportRow);
     });
   });
 
@@ -2174,7 +2176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceQuotasRemaining();
       var od = api.ResourceQuotasRemaining.fromJson(o.toJson());
-      checkResourceQuotasRemaining(od);
+      checkResourceQuotasRemaining(od as api.ResourceQuotasRemaining);
     });
   });
 
@@ -2182,7 +2184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScreenviewData();
       var od = api.ScreenviewData.fromJson(o.toJson());
-      checkScreenviewData(od);
+      checkScreenviewData(od as api.ScreenviewData);
     });
   });
 
@@ -2190,7 +2192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchUserActivityRequest();
       var od = api.SearchUserActivityRequest.fromJson(o.toJson());
-      checkSearchUserActivityRequest(od);
+      checkSearchUserActivityRequest(od as api.SearchUserActivityRequest);
     });
   });
 
@@ -2198,7 +2200,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchUserActivityResponse();
       var od = api.SearchUserActivityResponse.fromJson(o.toJson());
-      checkSearchUserActivityResponse(od);
+      checkSearchUserActivityResponse(od as api.SearchUserActivityResponse);
     });
   });
 
@@ -2206,7 +2208,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegment();
       var od = api.Segment.fromJson(o.toJson());
-      checkSegment(od);
+      checkSegment(od as api.Segment);
     });
   });
 
@@ -2214,7 +2216,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegmentDefinition();
       var od = api.SegmentDefinition.fromJson(o.toJson());
-      checkSegmentDefinition(od);
+      checkSegmentDefinition(od as api.SegmentDefinition);
     });
   });
 
@@ -2222,7 +2224,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegmentDimensionFilter();
       var od = api.SegmentDimensionFilter.fromJson(o.toJson());
-      checkSegmentDimensionFilter(od);
+      checkSegmentDimensionFilter(od as api.SegmentDimensionFilter);
     });
   });
 
@@ -2230,7 +2232,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegmentFilter();
       var od = api.SegmentFilter.fromJson(o.toJson());
-      checkSegmentFilter(od);
+      checkSegmentFilter(od as api.SegmentFilter);
     });
   });
 
@@ -2238,7 +2240,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegmentFilterClause();
       var od = api.SegmentFilterClause.fromJson(o.toJson());
-      checkSegmentFilterClause(od);
+      checkSegmentFilterClause(od as api.SegmentFilterClause);
     });
   });
 
@@ -2246,7 +2248,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegmentMetricFilter();
       var od = api.SegmentMetricFilter.fromJson(o.toJson());
-      checkSegmentMetricFilter(od);
+      checkSegmentMetricFilter(od as api.SegmentMetricFilter);
     });
   });
 
@@ -2254,7 +2256,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegmentSequenceStep();
       var od = api.SegmentSequenceStep.fromJson(o.toJson());
-      checkSegmentSequenceStep(od);
+      checkSegmentSequenceStep(od as api.SegmentSequenceStep);
     });
   });
 
@@ -2262,7 +2264,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSequenceSegment();
       var od = api.SequenceSegment.fromJson(o.toJson());
-      checkSequenceSegment(od);
+      checkSequenceSegment(od as api.SequenceSegment);
     });
   });
 
@@ -2270,7 +2272,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSimpleSegment();
       var od = api.SimpleSegment.fromJson(o.toJson());
-      checkSimpleSegment(od);
+      checkSimpleSegment(od as api.SimpleSegment);
     });
   });
 
@@ -2278,7 +2280,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransactionData();
       var od = api.TransactionData.fromJson(o.toJson());
-      checkTransactionData(od);
+      checkTransactionData(od as api.TransactionData);
     });
   });
 
@@ -2286,7 +2288,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -2294,7 +2296,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserActivitySession();
       var od = api.UserActivitySession.fromJson(o.toJson());
-      checkUserActivitySession(od);
+      checkUserActivitySession(od as api.UserActivitySession);
     });
   });
 
@@ -2305,8 +2307,9 @@
       var arg_request = buildGetReportsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetReportsRequest.fromJson(json);
-        checkGetReportsRequest(obj);
+        var obj = api.GetReportsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetReportsRequest(obj as api.GetReportsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2345,7 +2348,7 @@
       res
           .batchGet(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetReportsResponse(response);
+        checkGetReportsResponse(response as api.GetReportsResponse);
       })));
     });
   });
@@ -2357,8 +2360,9 @@
       var arg_request = buildSearchUserActivityRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchUserActivityRequest.fromJson(json);
-        checkSearchUserActivityRequest(obj);
+        var obj = api.SearchUserActivityRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchUserActivityRequest(obj as api.SearchUserActivityRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2397,7 +2401,8 @@
       res
           .search(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchUserActivityResponse(response);
+        checkSearchUserActivityResponse(
+            response as api.SearchUserActivityResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
index 546a35d..211e225 100644
--- a/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
+++ b/generated/googleapis/test/androiddeviceprovisioning/v1_test.dart
@@ -92,8 +92,8 @@
   buildCounterClaimDeviceRequest++;
   if (buildCounterClaimDeviceRequest < 3) {
     unittest.expect(o.customerId, unittest.equals('foo'));
-    checkDeviceIdentifier(o.deviceIdentifier);
-    checkDeviceMetadata(o.deviceMetadata);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
+    checkDeviceMetadata(o.deviceMetadata as api.DeviceMetadata);
     unittest.expect(o.sectionType, unittest.equals('foo'));
   }
   buildCounterClaimDeviceRequest--;
@@ -129,8 +129,8 @@
 
 void checkUnnamed3210(core.List<api.PartnerClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPartnerClaim(o[0]);
-  checkPartnerClaim(o[1]);
+  checkPartnerClaim(o[0] as api.PartnerClaim);
+  checkPartnerClaim(o[1] as api.PartnerClaim);
 }
 
 core.int buildCounterClaimDevicesRequest = 0;
@@ -258,7 +258,7 @@
 void checkCreateCustomerRequest(api.CreateCustomerRequest o) {
   buildCounterCreateCustomerRequest++;
   if (buildCounterCreateCustomerRequest < 3) {
-    checkCompany(o.customer);
+    checkCompany(o.customer as api.Company);
   }
   buildCounterCreateCustomerRequest--;
 }
@@ -280,7 +280,7 @@
   buildCounterCustomerApplyConfigurationRequest++;
   if (buildCounterCustomerApplyConfigurationRequest < 3) {
     unittest.expect(o.configuration, unittest.equals('foo'));
-    checkDeviceReference(o.device);
+    checkDeviceReference(o.device as api.DeviceReference);
   }
   buildCounterCustomerApplyConfigurationRequest--;
 }
@@ -294,8 +294,8 @@
 
 void checkUnnamed3213(core.List<api.Configuration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConfiguration(o[0]);
-  checkConfiguration(o[1]);
+  checkConfiguration(o[0] as api.Configuration);
+  checkConfiguration(o[1] as api.Configuration);
 }
 
 core.int buildCounterCustomerListConfigurationsResponse = 0;
@@ -328,8 +328,8 @@
 
 void checkUnnamed3214(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompany(o[0]);
-  checkCompany(o[1]);
+  checkCompany(o[0] as api.Company);
+  checkCompany(o[1] as api.Company);
 }
 
 core.int buildCounterCustomerListCustomersResponse = 0;
@@ -362,8 +362,8 @@
 
 void checkUnnamed3215(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDevice(o[0]);
-  checkDevice(o[1]);
+  checkDevice(o[0] as api.Device);
+  checkDevice(o[1] as api.Device);
 }
 
 core.int buildCounterCustomerListDevicesResponse = 0;
@@ -396,8 +396,8 @@
 
 void checkUnnamed3216(core.List<api.Dpc> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDpc(o[0]);
-  checkDpc(o[1]);
+  checkDpc(o[0] as api.Dpc);
+  checkDpc(o[1] as api.Dpc);
 }
 
 core.int buildCounterCustomerListDpcsResponse = 0;
@@ -435,7 +435,7 @@
     api.CustomerRemoveConfigurationRequest o) {
   buildCounterCustomerRemoveConfigurationRequest++;
   if (buildCounterCustomerRemoveConfigurationRequest < 3) {
-    checkDeviceReference(o.device);
+    checkDeviceReference(o.device as api.DeviceReference);
   }
   buildCounterCustomerRemoveConfigurationRequest--;
 }
@@ -454,7 +454,7 @@
 void checkCustomerUnclaimDeviceRequest(api.CustomerUnclaimDeviceRequest o) {
   buildCounterCustomerUnclaimDeviceRequest++;
   if (buildCounterCustomerUnclaimDeviceRequest < 3) {
-    checkDeviceReference(o.device);
+    checkDeviceReference(o.device as api.DeviceReference);
   }
   buildCounterCustomerUnclaimDeviceRequest--;
 }
@@ -468,8 +468,8 @@
 
 void checkUnnamed3217(core.List<api.DeviceClaim> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeviceClaim(o[0]);
-  checkDeviceClaim(o[1]);
+  checkDeviceClaim(o[0] as api.DeviceClaim);
+  checkDeviceClaim(o[1] as api.DeviceClaim);
 }
 
 core.int buildCounterDevice = 0;
@@ -494,8 +494,8 @@
     checkUnnamed3217(o.claims);
     unittest.expect(o.configuration, unittest.equals('foo'));
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkDeviceIdentifier(o.deviceIdentifier);
-    checkDeviceMetadata(o.deviceMetadata);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
+    checkDeviceMetadata(o.deviceMetadata as api.DeviceMetadata);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterDevice--;
@@ -603,7 +603,7 @@
   buildCounterDeviceReference++;
   if (buildCounterDeviceReference < 3) {
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkDeviceIdentifier(o.deviceIdentifier);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
   }
   buildCounterDeviceReference--;
 }
@@ -642,8 +642,8 @@
 
 void checkUnnamed3219(core.List<api.OperationPerDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationPerDevice(o[0]);
-  checkOperationPerDevice(o[1]);
+  checkOperationPerDevice(o[0] as api.OperationPerDevice);
+  checkOperationPerDevice(o[1] as api.OperationPerDevice);
 }
 
 core.int buildCounterDevicesLongRunningOperationResponse = 0;
@@ -725,7 +725,7 @@
     api.FindDevicesByDeviceIdentifierRequest o) {
   buildCounterFindDevicesByDeviceIdentifierRequest++;
   if (buildCounterFindDevicesByDeviceIdentifierRequest < 3) {
-    checkDeviceIdentifier(o.deviceIdentifier);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
     unittest.expect(o.limit, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
   }
@@ -741,8 +741,8 @@
 
 void checkUnnamed3220(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDevice(o[0]);
-  checkDevice(o[1]);
+  checkDevice(o[0] as api.Device);
+  checkDevice(o[1] as api.Device);
 }
 
 core.int buildCounterFindDevicesByDeviceIdentifierResponse = 0;
@@ -817,8 +817,8 @@
 
 void checkUnnamed3222(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDevice(o[0]);
-  checkDevice(o[1]);
+  checkDevice(o[0] as api.Device);
+  checkDevice(o[1] as api.Device);
 }
 
 core.int buildCounterFindDevicesByOwnerResponse = 0;
@@ -853,8 +853,8 @@
 
 void checkUnnamed3223(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompany(o[0]);
-  checkCompany(o[1]);
+  checkCompany(o[0] as api.Company);
+  checkCompany(o[1] as api.Company);
 }
 
 core.int buildCounterListCustomersResponse = 0;
@@ -889,8 +889,8 @@
 
 void checkUnnamed3224(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompany(o[0]);
-  checkCompany(o[1]);
+  checkCompany(o[0] as api.Company);
+  checkCompany(o[1] as api.Company);
 }
 
 core.int buildCounterListVendorCustomersResponse = 0;
@@ -925,8 +925,8 @@
 
 void checkUnnamed3225(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompany(o[0]);
-  checkCompany(o[1]);
+  checkCompany(o[0] as api.Company);
+  checkCompany(o[1] as api.Company);
 }
 
 core.int buildCounterListVendorsResponse = 0;
@@ -1029,7 +1029,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3226(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3227(o.response);
@@ -1054,10 +1054,11 @@
 void checkOperationPerDevice(api.OperationPerDevice o) {
   buildCounterOperationPerDevice++;
   if (buildCounterOperationPerDevice < 3) {
-    checkPartnerClaim(o.claim);
-    checkPerDeviceStatusInBatch(o.result);
-    checkPartnerUnclaim(o.unclaim);
-    checkUpdateMetadataArguments(o.updateMetadata);
+    checkPartnerClaim(o.claim as api.PartnerClaim);
+    checkPerDeviceStatusInBatch(o.result as api.PerDeviceStatusInBatch);
+    checkPartnerUnclaim(o.unclaim as api.PartnerUnclaim);
+    checkUpdateMetadataArguments(
+        o.updateMetadata as api.UpdateMetadataArguments);
   }
   buildCounterOperationPerDevice--;
 }
@@ -1080,8 +1081,8 @@
   buildCounterPartnerClaim++;
   if (buildCounterPartnerClaim < 3) {
     unittest.expect(o.customerId, unittest.equals('foo'));
-    checkDeviceIdentifier(o.deviceIdentifier);
-    checkDeviceMetadata(o.deviceMetadata);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
+    checkDeviceMetadata(o.deviceMetadata as api.DeviceMetadata);
     unittest.expect(o.sectionType, unittest.equals('foo'));
   }
   buildCounterPartnerClaim--;
@@ -1106,7 +1107,7 @@
   buildCounterPartnerUnclaim++;
   if (buildCounterPartnerUnclaim < 3) {
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkDeviceIdentifier(o.deviceIdentifier);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
     unittest.expect(o.sectionType, unittest.equals('foo'));
     unittest.expect(o.vacationModeDays, unittest.equals(42));
     unittest.expect(o.vacationModeExpireTime, unittest.equals('foo'));
@@ -1223,7 +1224,7 @@
   buildCounterUnclaimDeviceRequest++;
   if (buildCounterUnclaimDeviceRequest < 3) {
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkDeviceIdentifier(o.deviceIdentifier);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
     unittest.expect(o.sectionType, unittest.equals('foo'));
     unittest.expect(o.vacationModeDays, unittest.equals(42));
     unittest.expect(o.vacationModeExpireTime, unittest.equals('foo'));
@@ -1240,8 +1241,8 @@
 
 void checkUnnamed3230(core.List<api.PartnerUnclaim> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPartnerUnclaim(o[0]);
-  checkPartnerUnclaim(o[1]);
+  checkPartnerUnclaim(o[0] as api.PartnerUnclaim);
+  checkPartnerUnclaim(o[1] as api.PartnerUnclaim);
 }
 
 core.int buildCounterUnclaimDevicesRequest = 0;
@@ -1272,8 +1273,8 @@
 
 void checkUnnamed3231(core.List<api.UpdateMetadataArguments> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUpdateMetadataArguments(o[0]);
-  checkUpdateMetadataArguments(o[1]);
+  checkUpdateMetadataArguments(o[0] as api.UpdateMetadataArguments);
+  checkUpdateMetadataArguments(o[1] as api.UpdateMetadataArguments);
 }
 
 core.int buildCounterUpdateDeviceMetadataInBatchRequest = 0;
@@ -1311,7 +1312,7 @@
 void checkUpdateDeviceMetadataRequest(api.UpdateDeviceMetadataRequest o) {
   buildCounterUpdateDeviceMetadataRequest++;
   if (buildCounterUpdateDeviceMetadataRequest < 3) {
-    checkDeviceMetadata(o.deviceMetadata);
+    checkDeviceMetadata(o.deviceMetadata as api.DeviceMetadata);
   }
   buildCounterUpdateDeviceMetadataRequest--;
 }
@@ -1333,8 +1334,8 @@
   buildCounterUpdateMetadataArguments++;
   if (buildCounterUpdateMetadataArguments < 3) {
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkDeviceIdentifier(o.deviceIdentifier);
-    checkDeviceMetadata(o.deviceMetadata);
+    checkDeviceIdentifier(o.deviceIdentifier as api.DeviceIdentifier);
+    checkDeviceMetadata(o.deviceMetadata as api.DeviceMetadata);
   }
   buildCounterUpdateMetadataArguments--;
 }
@@ -1344,7 +1345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClaimDeviceRequest();
       var od = api.ClaimDeviceRequest.fromJson(o.toJson());
-      checkClaimDeviceRequest(od);
+      checkClaimDeviceRequest(od as api.ClaimDeviceRequest);
     });
   });
 
@@ -1352,7 +1353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClaimDeviceResponse();
       var od = api.ClaimDeviceResponse.fromJson(o.toJson());
-      checkClaimDeviceResponse(od);
+      checkClaimDeviceResponse(od as api.ClaimDeviceResponse);
     });
   });
 
@@ -1360,7 +1361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClaimDevicesRequest();
       var od = api.ClaimDevicesRequest.fromJson(o.toJson());
-      checkClaimDevicesRequest(od);
+      checkClaimDevicesRequest(od as api.ClaimDevicesRequest);
     });
   });
 
@@ -1368,7 +1369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompany();
       var od = api.Company.fromJson(o.toJson());
-      checkCompany(od);
+      checkCompany(od as api.Company);
     });
   });
 
@@ -1376,7 +1377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfiguration();
       var od = api.Configuration.fromJson(o.toJson());
-      checkConfiguration(od);
+      checkConfiguration(od as api.Configuration);
     });
   });
 
@@ -1384,7 +1385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateCustomerRequest();
       var od = api.CreateCustomerRequest.fromJson(o.toJson());
-      checkCreateCustomerRequest(od);
+      checkCreateCustomerRequest(od as api.CreateCustomerRequest);
     });
   });
 
@@ -1392,7 +1393,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerApplyConfigurationRequest();
       var od = api.CustomerApplyConfigurationRequest.fromJson(o.toJson());
-      checkCustomerApplyConfigurationRequest(od);
+      checkCustomerApplyConfigurationRequest(
+          od as api.CustomerApplyConfigurationRequest);
     });
   });
 
@@ -1400,7 +1402,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerListConfigurationsResponse();
       var od = api.CustomerListConfigurationsResponse.fromJson(o.toJson());
-      checkCustomerListConfigurationsResponse(od);
+      checkCustomerListConfigurationsResponse(
+          od as api.CustomerListConfigurationsResponse);
     });
   });
 
@@ -1408,7 +1411,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerListCustomersResponse();
       var od = api.CustomerListCustomersResponse.fromJson(o.toJson());
-      checkCustomerListCustomersResponse(od);
+      checkCustomerListCustomersResponse(
+          od as api.CustomerListCustomersResponse);
     });
   });
 
@@ -1416,7 +1420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerListDevicesResponse();
       var od = api.CustomerListDevicesResponse.fromJson(o.toJson());
-      checkCustomerListDevicesResponse(od);
+      checkCustomerListDevicesResponse(od as api.CustomerListDevicesResponse);
     });
   });
 
@@ -1424,7 +1428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerListDpcsResponse();
       var od = api.CustomerListDpcsResponse.fromJson(o.toJson());
-      checkCustomerListDpcsResponse(od);
+      checkCustomerListDpcsResponse(od as api.CustomerListDpcsResponse);
     });
   });
 
@@ -1432,7 +1436,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerRemoveConfigurationRequest();
       var od = api.CustomerRemoveConfigurationRequest.fromJson(o.toJson());
-      checkCustomerRemoveConfigurationRequest(od);
+      checkCustomerRemoveConfigurationRequest(
+          od as api.CustomerRemoveConfigurationRequest);
     });
   });
 
@@ -1440,7 +1445,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerUnclaimDeviceRequest();
       var od = api.CustomerUnclaimDeviceRequest.fromJson(o.toJson());
-      checkCustomerUnclaimDeviceRequest(od);
+      checkCustomerUnclaimDeviceRequest(od as api.CustomerUnclaimDeviceRequest);
     });
   });
 
@@ -1448,7 +1453,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevice();
       var od = api.Device.fromJson(o.toJson());
-      checkDevice(od);
+      checkDevice(od as api.Device);
     });
   });
 
@@ -1456,7 +1461,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceClaim();
       var od = api.DeviceClaim.fromJson(o.toJson());
-      checkDeviceClaim(od);
+      checkDeviceClaim(od as api.DeviceClaim);
     });
   });
 
@@ -1464,7 +1469,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceIdentifier();
       var od = api.DeviceIdentifier.fromJson(o.toJson());
-      checkDeviceIdentifier(od);
+      checkDeviceIdentifier(od as api.DeviceIdentifier);
     });
   });
 
@@ -1472,7 +1477,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceMetadata();
       var od = api.DeviceMetadata.fromJson(o.toJson());
-      checkDeviceMetadata(od);
+      checkDeviceMetadata(od as api.DeviceMetadata);
     });
   });
 
@@ -1480,7 +1485,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceReference();
       var od = api.DeviceReference.fromJson(o.toJson());
-      checkDeviceReference(od);
+      checkDeviceReference(od as api.DeviceReference);
     });
   });
 
@@ -1488,7 +1493,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevicesLongRunningOperationMetadata();
       var od = api.DevicesLongRunningOperationMetadata.fromJson(o.toJson());
-      checkDevicesLongRunningOperationMetadata(od);
+      checkDevicesLongRunningOperationMetadata(
+          od as api.DevicesLongRunningOperationMetadata);
     });
   });
 
@@ -1496,7 +1502,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevicesLongRunningOperationResponse();
       var od = api.DevicesLongRunningOperationResponse.fromJson(o.toJson());
-      checkDevicesLongRunningOperationResponse(od);
+      checkDevicesLongRunningOperationResponse(
+          od as api.DevicesLongRunningOperationResponse);
     });
   });
 
@@ -1504,7 +1511,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDpc();
       var od = api.Dpc.fromJson(o.toJson());
-      checkDpc(od);
+      checkDpc(od as api.Dpc);
     });
   });
 
@@ -1512,7 +1519,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1520,7 +1527,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindDevicesByDeviceIdentifierRequest();
       var od = api.FindDevicesByDeviceIdentifierRequest.fromJson(o.toJson());
-      checkFindDevicesByDeviceIdentifierRequest(od);
+      checkFindDevicesByDeviceIdentifierRequest(
+          od as api.FindDevicesByDeviceIdentifierRequest);
     });
   });
 
@@ -1528,7 +1536,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindDevicesByDeviceIdentifierResponse();
       var od = api.FindDevicesByDeviceIdentifierResponse.fromJson(o.toJson());
-      checkFindDevicesByDeviceIdentifierResponse(od);
+      checkFindDevicesByDeviceIdentifierResponse(
+          od as api.FindDevicesByDeviceIdentifierResponse);
     });
   });
 
@@ -1536,7 +1545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindDevicesByOwnerRequest();
       var od = api.FindDevicesByOwnerRequest.fromJson(o.toJson());
-      checkFindDevicesByOwnerRequest(od);
+      checkFindDevicesByOwnerRequest(od as api.FindDevicesByOwnerRequest);
     });
   });
 
@@ -1544,7 +1553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindDevicesByOwnerResponse();
       var od = api.FindDevicesByOwnerResponse.fromJson(o.toJson());
-      checkFindDevicesByOwnerResponse(od);
+      checkFindDevicesByOwnerResponse(od as api.FindDevicesByOwnerResponse);
     });
   });
 
@@ -1552,7 +1561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCustomersResponse();
       var od = api.ListCustomersResponse.fromJson(o.toJson());
-      checkListCustomersResponse(od);
+      checkListCustomersResponse(od as api.ListCustomersResponse);
     });
   });
 
@@ -1560,7 +1569,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListVendorCustomersResponse();
       var od = api.ListVendorCustomersResponse.fromJson(o.toJson());
-      checkListVendorCustomersResponse(od);
+      checkListVendorCustomersResponse(od as api.ListVendorCustomersResponse);
     });
   });
 
@@ -1568,7 +1577,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListVendorsResponse();
       var od = api.ListVendorsResponse.fromJson(o.toJson());
-      checkListVendorsResponse(od);
+      checkListVendorsResponse(od as api.ListVendorsResponse);
     });
   });
 
@@ -1576,7 +1585,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1584,7 +1593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationPerDevice();
       var od = api.OperationPerDevice.fromJson(o.toJson());
-      checkOperationPerDevice(od);
+      checkOperationPerDevice(od as api.OperationPerDevice);
     });
   });
 
@@ -1592,7 +1601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartnerClaim();
       var od = api.PartnerClaim.fromJson(o.toJson());
-      checkPartnerClaim(od);
+      checkPartnerClaim(od as api.PartnerClaim);
     });
   });
 
@@ -1600,7 +1609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartnerUnclaim();
       var od = api.PartnerUnclaim.fromJson(o.toJson());
-      checkPartnerUnclaim(od);
+      checkPartnerUnclaim(od as api.PartnerUnclaim);
     });
   });
 
@@ -1608,7 +1617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerDeviceStatusInBatch();
       var od = api.PerDeviceStatusInBatch.fromJson(o.toJson());
-      checkPerDeviceStatusInBatch(od);
+      checkPerDeviceStatusInBatch(od as api.PerDeviceStatusInBatch);
     });
   });
 
@@ -1616,7 +1625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1624,7 +1633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnclaimDeviceRequest();
       var od = api.UnclaimDeviceRequest.fromJson(o.toJson());
-      checkUnclaimDeviceRequest(od);
+      checkUnclaimDeviceRequest(od as api.UnclaimDeviceRequest);
     });
   });
 
@@ -1632,7 +1641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnclaimDevicesRequest();
       var od = api.UnclaimDevicesRequest.fromJson(o.toJson());
-      checkUnclaimDevicesRequest(od);
+      checkUnclaimDevicesRequest(od as api.UnclaimDevicesRequest);
     });
   });
 
@@ -1640,7 +1649,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDeviceMetadataInBatchRequest();
       var od = api.UpdateDeviceMetadataInBatchRequest.fromJson(o.toJson());
-      checkUpdateDeviceMetadataInBatchRequest(od);
+      checkUpdateDeviceMetadataInBatchRequest(
+          od as api.UpdateDeviceMetadataInBatchRequest);
     });
   });
 
@@ -1648,7 +1658,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDeviceMetadataRequest();
       var od = api.UpdateDeviceMetadataRequest.fromJson(o.toJson());
-      checkUpdateDeviceMetadataRequest(od);
+      checkUpdateDeviceMetadataRequest(od as api.UpdateDeviceMetadataRequest);
     });
   });
 
@@ -1656,7 +1666,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateMetadataArguments();
       var od = api.UpdateMetadataArguments.fromJson(o.toJson());
-      checkUpdateMetadataArguments(od);
+      checkUpdateMetadataArguments(od as api.UpdateMetadataArguments);
     });
   });
 
@@ -1712,7 +1722,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomerListCustomersResponse(response);
+        checkCustomerListCustomersResponse(
+            response as api.CustomerListCustomersResponse);
       })));
     });
   });
@@ -1725,8 +1736,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Configuration.fromJson(json);
-        checkConfiguration(obj);
+        var obj = api.Configuration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConfiguration(obj as api.Configuration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1766,7 +1778,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConfiguration(response);
+        checkConfiguration(response as api.Configuration);
       })));
     });
 
@@ -1814,7 +1826,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1862,7 +1874,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConfiguration(response);
+        checkConfiguration(response as api.Configuration);
       })));
     });
 
@@ -1911,7 +1923,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomerListConfigurationsResponse(response);
+        checkCustomerListConfigurationsResponse(
+            response as api.CustomerListConfigurationsResponse);
       })));
     });
 
@@ -1923,8 +1936,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Configuration.fromJson(json);
-        checkConfiguration(obj);
+        var obj = api.Configuration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConfiguration(obj as api.Configuration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1967,7 +1981,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConfiguration(response);
+        checkConfiguration(response as api.Configuration);
       })));
     });
   });
@@ -1980,8 +1994,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomerApplyConfigurationRequest.fromJson(json);
-        checkCustomerApplyConfigurationRequest(obj);
+        var obj = api.CustomerApplyConfigurationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomerApplyConfigurationRequest(
+            obj as api.CustomerApplyConfigurationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2021,7 +2037,7 @@
       res
           .applyConfiguration(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2069,7 +2085,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
 
@@ -2126,7 +2142,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomerListDevicesResponse(response);
+        checkCustomerListDevicesResponse(
+            response as api.CustomerListDevicesResponse);
       })));
     });
 
@@ -2137,8 +2154,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomerRemoveConfigurationRequest.fromJson(json);
-        checkCustomerRemoveConfigurationRequest(obj);
+        var obj = api.CustomerRemoveConfigurationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomerRemoveConfigurationRequest(
+            obj as api.CustomerRemoveConfigurationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2178,7 +2197,7 @@
       res
           .removeConfiguration(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2189,8 +2208,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomerUnclaimDeviceRequest.fromJson(json);
-        checkCustomerUnclaimDeviceRequest(obj);
+        var obj = api.CustomerUnclaimDeviceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomerUnclaimDeviceRequest(
+            obj as api.CustomerUnclaimDeviceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2230,7 +2251,7 @@
       res
           .unclaim(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -2280,7 +2301,7 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomerListDpcsResponse(response);
+        checkCustomerListDpcsResponse(response as api.CustomerListDpcsResponse);
       })));
     });
   });
@@ -2330,7 +2351,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2343,8 +2364,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateCustomerRequest.fromJson(json);
-        checkCreateCustomerRequest(obj);
+        var obj = api.CreateCustomerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateCustomerRequest(obj as api.CreateCustomerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2384,7 +2406,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompany(response);
+        checkCompany(response as api.Company);
       })));
     });
 
@@ -2441,7 +2463,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCustomersResponse(response);
+        checkListCustomersResponse(response as api.ListCustomersResponse);
       })));
     });
   });
@@ -2454,8 +2476,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ClaimDeviceRequest.fromJson(json);
-        checkClaimDeviceRequest(obj);
+        var obj = api.ClaimDeviceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkClaimDeviceRequest(obj as api.ClaimDeviceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2495,7 +2518,7 @@
       res
           .claim(arg_request, arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkClaimDeviceResponse(response);
+        checkClaimDeviceResponse(response as api.ClaimDeviceResponse);
       })));
     });
 
@@ -2506,8 +2529,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ClaimDevicesRequest.fromJson(json);
-        checkClaimDevicesRequest(obj);
+        var obj = api.ClaimDevicesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkClaimDevicesRequest(obj as api.ClaimDevicesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2547,7 +2571,7 @@
       res
           .claimAsync(arg_request, arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2558,8 +2582,10 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FindDevicesByDeviceIdentifierRequest.fromJson(json);
-        checkFindDevicesByDeviceIdentifierRequest(obj);
+        var obj = api.FindDevicesByDeviceIdentifierRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFindDevicesByDeviceIdentifierRequest(
+            obj as api.FindDevicesByDeviceIdentifierRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2600,7 +2626,8 @@
       res
           .findByIdentifier(arg_request, arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFindDevicesByDeviceIdentifierResponse(response);
+        checkFindDevicesByDeviceIdentifierResponse(
+            response as api.FindDevicesByDeviceIdentifierResponse);
       })));
     });
 
@@ -2611,8 +2638,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FindDevicesByOwnerRequest.fromJson(json);
-        checkFindDevicesByOwnerRequest(obj);
+        var obj = api.FindDevicesByOwnerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFindDevicesByOwnerRequest(obj as api.FindDevicesByOwnerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2652,7 +2680,8 @@
       res
           .findByOwner(arg_request, arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFindDevicesByOwnerResponse(response);
+        checkFindDevicesByOwnerResponse(
+            response as api.FindDevicesByOwnerResponse);
       })));
     });
 
@@ -2700,7 +2729,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
 
@@ -2712,8 +2741,10 @@
       var arg_deviceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateDeviceMetadataRequest.fromJson(json);
-        checkUpdateDeviceMetadataRequest(obj);
+        var obj = api.UpdateDeviceMetadataRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateDeviceMetadataRequest(
+            obj as api.UpdateDeviceMetadataRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2754,7 +2785,7 @@
           .metadata(arg_request, arg_metadataOwnerId, arg_deviceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeviceMetadata(response);
+        checkDeviceMetadata(response as api.DeviceMetadata);
       })));
     });
 
@@ -2765,8 +2796,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UnclaimDeviceRequest.fromJson(json);
-        checkUnclaimDeviceRequest(obj);
+        var obj = api.UnclaimDeviceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUnclaimDeviceRequest(obj as api.UnclaimDeviceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2806,7 +2838,7 @@
       res
           .unclaim(arg_request, arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2817,8 +2849,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UnclaimDevicesRequest.fromJson(json);
-        checkUnclaimDevicesRequest(obj);
+        var obj = api.UnclaimDevicesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUnclaimDevicesRequest(obj as api.UnclaimDevicesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2858,7 +2891,7 @@
       res
           .unclaimAsync(arg_request, arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2869,8 +2902,10 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateDeviceMetadataInBatchRequest.fromJson(json);
-        checkUpdateDeviceMetadataInBatchRequest(obj);
+        var obj = api.UpdateDeviceMetadataInBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateDeviceMetadataInBatchRequest(
+            obj as api.UpdateDeviceMetadataInBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2910,7 +2945,7 @@
       res
           .updateMetadataAsync(arg_request, arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2969,7 +3004,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListVendorsResponse(response);
+        checkListVendorsResponse(response as api.ListVendorsResponse);
       })));
     });
   });
@@ -3029,7 +3064,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListVendorCustomersResponse(response);
+        checkListVendorCustomersResponse(
+            response as api.ListVendorCustomersResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/androidenterprise/v1_test.dart b/generated/googleapis/test/androidenterprise/v1_test.dart
index 01a6645..8f2234c 100644
--- a/generated/googleapis/test/androidenterprise/v1_test.dart
+++ b/generated/googleapis/test/androidenterprise/v1_test.dart
@@ -146,14 +146,18 @@
 void checkAdministratorWebTokenSpec(api.AdministratorWebTokenSpec o) {
   buildCounterAdministratorWebTokenSpec++;
   if (buildCounterAdministratorWebTokenSpec < 3) {
-    checkAdministratorWebTokenSpecManagedConfigurations(
-        o.managedConfigurations);
+    checkAdministratorWebTokenSpecManagedConfigurations(o.managedConfigurations
+        as api.AdministratorWebTokenSpecManagedConfigurations);
     unittest.expect(o.parent, unittest.equals('foo'));
     checkUnnamed3543(o.permission);
-    checkAdministratorWebTokenSpecPlaySearch(o.playSearch);
-    checkAdministratorWebTokenSpecPrivateApps(o.privateApps);
-    checkAdministratorWebTokenSpecStoreBuilder(o.storeBuilder);
-    checkAdministratorWebTokenSpecWebApps(o.webApps);
+    checkAdministratorWebTokenSpecPlaySearch(
+        o.playSearch as api.AdministratorWebTokenSpecPlaySearch);
+    checkAdministratorWebTokenSpecPrivateApps(
+        o.privateApps as api.AdministratorWebTokenSpecPrivateApps);
+    checkAdministratorWebTokenSpecStoreBuilder(
+        o.storeBuilder as api.AdministratorWebTokenSpecStoreBuilder);
+    checkAdministratorWebTokenSpecWebApps(
+        o.webApps as api.AdministratorWebTokenSpecWebApps);
   }
   buildCounterAdministratorWebTokenSpec--;
 }
@@ -273,8 +277,10 @@
 
 void checkUnnamed3544(core.List<api.AppRestrictionsSchemaRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAppRestrictionsSchemaRestriction(o[0]);
-  checkAppRestrictionsSchemaRestriction(o[1]);
+  checkAppRestrictionsSchemaRestriction(
+      o[0] as api.AppRestrictionsSchemaRestriction);
+  checkAppRestrictionsSchemaRestriction(
+      o[1] as api.AppRestrictionsSchemaRestriction);
 }
 
 core.int buildCounterAppRestrictionsSchema = 0;
@@ -353,8 +359,10 @@
 
 void checkUnnamed3547(core.List<api.AppRestrictionsSchemaRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAppRestrictionsSchemaRestriction(o[0]);
-  checkAppRestrictionsSchemaRestriction(o[1]);
+  checkAppRestrictionsSchemaRestriction(
+      o[0] as api.AppRestrictionsSchemaRestriction);
+  checkAppRestrictionsSchemaRestriction(
+      o[1] as api.AppRestrictionsSchemaRestriction);
 }
 
 core.int buildCounterAppRestrictionsSchemaRestriction = 0;
@@ -379,7 +387,8 @@
     api.AppRestrictionsSchemaRestriction o) {
   buildCounterAppRestrictionsSchemaRestriction++;
   if (buildCounterAppRestrictionsSchemaRestriction < 3) {
-    checkAppRestrictionsSchemaRestrictionRestrictionValue(o.defaultValue);
+    checkAppRestrictionsSchemaRestrictionRestrictionValue(
+        o.defaultValue as api.AppRestrictionsSchemaRestrictionRestrictionValue);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed3545(o.entry);
     checkUnnamed3546(o.entryValue);
@@ -442,8 +451,8 @@
 
 void checkUnnamed3549(core.List<api.KeyedAppState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKeyedAppState(o[0]);
-  checkKeyedAppState(o[1]);
+  checkKeyedAppState(o[0] as api.KeyedAppState);
+  checkKeyedAppState(o[1] as api.KeyedAppState);
 }
 
 core.int buildCounterAppState = 0;
@@ -596,8 +605,8 @@
 
 void checkUnnamed3551(core.List<api.AutoInstallConstraint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoInstallConstraint(o[0]);
-  checkAutoInstallConstraint(o[1]);
+  checkAutoInstallConstraint(o[0] as api.AutoInstallConstraint);
+  checkAutoInstallConstraint(o[1] as api.AutoInstallConstraint);
 }
 
 core.int buildCounterAutoInstallPolicy = 0;
@@ -634,8 +643,8 @@
 
 void checkUnnamed3552(core.List<api.VariableSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariableSet(o[0]);
-  checkVariableSet(o[1]);
+  checkVariableSet(o[0] as api.VariableSet);
+  checkVariableSet(o[1] as api.VariableSet);
 }
 
 core.int buildCounterConfigurationVariables = 0;
@@ -678,8 +687,8 @@
   if (buildCounterDevice < 3) {
     unittest.expect(o.androidId, unittest.equals('foo'));
     unittest.expect(o.managementType, unittest.equals('foo'));
-    checkPolicy(o.policy);
-    checkDeviceReport(o.report);
+    checkPolicy(o.policy as api.Policy);
+    checkDeviceReport(o.report as api.DeviceReport);
   }
   buildCounterDevice--;
 }
@@ -693,8 +702,8 @@
 
 void checkUnnamed3553(core.List<api.AppState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAppState(o[0]);
-  checkAppState(o[1]);
+  checkAppState(o[0] as api.AppState);
+  checkAppState(o[1] as api.AppState);
 }
 
 core.int buildCounterDeviceReport = 0;
@@ -735,7 +744,7 @@
   buildCounterDeviceReportUpdateEvent++;
   if (buildCounterDeviceReportUpdateEvent < 3) {
     unittest.expect(o.deviceId, unittest.equals('foo'));
-    checkDeviceReport(o.report);
+    checkDeviceReport(o.report as api.DeviceReport);
     unittest.expect(o.userId, unittest.equals('foo'));
   }
   buildCounterDeviceReportUpdateEvent--;
@@ -769,8 +778,8 @@
 
 void checkUnnamed3554(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDevice(o[0]);
-  checkDevice(o[1]);
+  checkDevice(o[0] as api.Device);
+  checkDevice(o[1] as api.Device);
 }
 
 core.int buildCounterDevicesListResponse = 0;
@@ -801,8 +810,8 @@
 
 void checkUnnamed3555(core.List<api.Administrator> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdministrator(o[0]);
-  checkAdministrator(o[1]);
+  checkAdministrator(o[0] as api.Administrator);
+  checkAdministrator(o[1] as api.Administrator);
 }
 
 core.int buildCounterEnterprise = 0;
@@ -858,8 +867,8 @@
 
 void checkUnnamed3556(core.List<api.Enterprise> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnterprise(o[0]);
-  checkEnterprise(o[1]);
+  checkEnterprise(o[0] as api.Enterprise);
+  checkEnterprise(o[1] as api.Enterprise);
 }
 
 core.int buildCounterEnterprisesListResponse = 0;
@@ -934,8 +943,8 @@
 
 void checkUnnamed3557(core.List<api.Entitlement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntitlement(o[0]);
-  checkEntitlement(o[1]);
+  checkEntitlement(o[0] as api.Entitlement);
+  checkEntitlement(o[1] as api.Entitlement);
 }
 
 core.int buildCounterEntitlementsListResponse = 0;
@@ -995,8 +1004,8 @@
 
 void checkUnnamed3558(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUser(o[0]);
-  checkUser(o[1]);
+  checkUser(o[0] as api.User);
+  checkUser(o[1] as api.User);
 }
 
 core.int buildCounterGroupLicenseUsersListResponse = 0;
@@ -1027,8 +1036,8 @@
 
 void checkUnnamed3559(core.List<api.GroupLicense> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroupLicense(o[0]);
-  checkGroupLicense(o[1]);
+  checkGroupLicense(o[0] as api.GroupLicense);
+  checkGroupLicense(o[1] as api.GroupLicense);
 }
 
 core.int buildCounterGroupLicensesListResponse = 0;
@@ -1109,8 +1118,8 @@
 
 void checkUnnamed3560(core.List<api.Install> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstall(o[0]);
-  checkInstall(o[1]);
+  checkInstall(o[0] as api.Install);
+  checkInstall(o[1] as api.Install);
 }
 
 core.int buildCounterInstallsListResponse = 0;
@@ -1210,8 +1219,8 @@
 
 void checkUnnamed3561(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedProperty(o[0]);
-  checkManagedProperty(o[1]);
+  checkManagedProperty(o[0] as api.ManagedProperty);
+  checkManagedProperty(o[1] as api.ManagedProperty);
 }
 
 core.int buildCounterManagedConfiguration = 0;
@@ -1231,7 +1240,8 @@
 void checkManagedConfiguration(api.ManagedConfiguration o) {
   buildCounterManagedConfiguration++;
   if (buildCounterManagedConfiguration < 3) {
-    checkConfigurationVariables(o.configurationVariables);
+    checkConfigurationVariables(
+        o.configurationVariables as api.ConfigurationVariables);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3561(o.managedProperty);
     unittest.expect(o.productId, unittest.equals('foo'));
@@ -1248,8 +1258,8 @@
 
 void checkUnnamed3562(core.List<api.ManagedConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedConfiguration(o[0]);
-  checkManagedConfiguration(o[1]);
+  checkManagedConfiguration(o[0] as api.ManagedConfiguration);
+  checkManagedConfiguration(o[1] as api.ManagedConfiguration);
 }
 
 core.int buildCounterManagedConfigurationsForDeviceListResponse = 0;
@@ -1282,8 +1292,8 @@
 
 void checkUnnamed3563(core.List<api.ManagedConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedConfiguration(o[0]);
-  checkManagedConfiguration(o[1]);
+  checkManagedConfiguration(o[0] as api.ManagedConfiguration);
+  checkManagedConfiguration(o[1] as api.ManagedConfiguration);
 }
 
 core.int buildCounterManagedConfigurationsForUserListResponse = 0;
@@ -1339,8 +1349,8 @@
 
 void checkUnnamed3564(core.List<api.ManagedConfigurationsSettings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedConfigurationsSettings(o[0]);
-  checkManagedConfigurationsSettings(o[1]);
+  checkManagedConfigurationsSettings(o[0] as api.ManagedConfigurationsSettings);
+  checkManagedConfigurationsSettings(o[1] as api.ManagedConfigurationsSettings);
 }
 
 core.int buildCounterManagedConfigurationsSettingsListResponse = 0;
@@ -1373,8 +1383,8 @@
 
 void checkUnnamed3565(core.List<api.ManagedPropertyBundle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedPropertyBundle(o[0]);
-  checkManagedPropertyBundle(o[1]);
+  checkManagedPropertyBundle(o[0] as api.ManagedPropertyBundle);
+  checkManagedPropertyBundle(o[1] as api.ManagedPropertyBundle);
 }
 
 core.List<core.String> buildUnnamed3566() {
@@ -1412,7 +1422,7 @@
   if (buildCounterManagedProperty < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
     unittest.expect(o.valueBool, unittest.isTrue);
-    checkManagedPropertyBundle(o.valueBundle);
+    checkManagedPropertyBundle(o.valueBundle as api.ManagedPropertyBundle);
     checkUnnamed3565(o.valueBundleArray);
     unittest.expect(o.valueInteger, unittest.equals(42));
     unittest.expect(o.valueString, unittest.equals('foo'));
@@ -1430,8 +1440,8 @@
 
 void checkUnnamed3567(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedProperty(o[0]);
-  checkManagedProperty(o[1]);
+  checkManagedProperty(o[0] as api.ManagedProperty);
+  checkManagedProperty(o[1] as api.ManagedProperty);
 }
 
 core.int buildCounterManagedPropertyBundle = 0;
@@ -1552,16 +1562,20 @@
 void checkNotification(api.Notification o) {
   buildCounterNotification++;
   if (buildCounterNotification < 3) {
-    checkAppRestrictionsSchemaChangeEvent(o.appRestrictionsSchemaChangeEvent);
-    checkAppUpdateEvent(o.appUpdateEvent);
-    checkDeviceReportUpdateEvent(o.deviceReportUpdateEvent);
+    checkAppRestrictionsSchemaChangeEvent(o.appRestrictionsSchemaChangeEvent
+        as api.AppRestrictionsSchemaChangeEvent);
+    checkAppUpdateEvent(o.appUpdateEvent as api.AppUpdateEvent);
+    checkDeviceReportUpdateEvent(
+        o.deviceReportUpdateEvent as api.DeviceReportUpdateEvent);
     unittest.expect(o.enterpriseId, unittest.equals('foo'));
-    checkInstallFailureEvent(o.installFailureEvent);
-    checkNewDeviceEvent(o.newDeviceEvent);
-    checkNewPermissionsEvent(o.newPermissionsEvent);
+    checkInstallFailureEvent(o.installFailureEvent as api.InstallFailureEvent);
+    checkNewDeviceEvent(o.newDeviceEvent as api.NewDeviceEvent);
+    checkNewPermissionsEvent(o.newPermissionsEvent as api.NewPermissionsEvent);
     unittest.expect(o.notificationType, unittest.equals('foo'));
-    checkProductApprovalEvent(o.productApprovalEvent);
-    checkProductAvailabilityChangeEvent(o.productAvailabilityChangeEvent);
+    checkProductApprovalEvent(
+        o.productApprovalEvent as api.ProductApprovalEvent);
+    checkProductAvailabilityChangeEvent(
+        o.productAvailabilityChangeEvent as api.ProductAvailabilityChangeEvent);
     unittest.expect(o.timestampMillis, unittest.equals('foo'));
   }
   buildCounterNotification--;
@@ -1576,8 +1590,8 @@
 
 void checkUnnamed3570(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotification(o[0]);
-  checkNotification(o[1]);
+  checkNotification(o[0] as api.Notification);
+  checkNotification(o[1] as api.Notification);
 }
 
 core.int buildCounterNotificationSet = 0;
@@ -1656,8 +1670,8 @@
 
 void checkUnnamed3571(core.List<api.ProductPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductPolicy(o[0]);
-  checkProductPolicy(o[1]);
+  checkProductPolicy(o[0] as api.ProductPolicy);
+  checkProductPolicy(o[1] as api.ProductPolicy);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1680,7 +1694,7 @@
   if (buildCounterPolicy < 3) {
     unittest.expect(o.autoUpdatePolicy, unittest.equals('foo'));
     unittest.expect(o.deviceReportPolicy, unittest.equals('foo'));
-    checkMaintenanceWindow(o.maintenanceWindow);
+    checkMaintenanceWindow(o.maintenanceWindow as api.MaintenanceWindow);
     unittest.expect(o.productAvailabilityPolicy, unittest.equals('foo'));
     checkUnnamed3571(o.productPolicy);
   }
@@ -1696,8 +1710,8 @@
 
 void checkUnnamed3572(core.List<api.TrackInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrackInfo(o[0]);
-  checkTrackInfo(o[1]);
+  checkTrackInfo(o[0] as api.TrackInfo);
+  checkTrackInfo(o[1] as api.TrackInfo);
 }
 
 core.List<api.AppVersion> buildUnnamed3573() {
@@ -1709,8 +1723,8 @@
 
 void checkUnnamed3573(core.List<api.AppVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAppVersion(o[0]);
-  checkAppVersion(o[1]);
+  checkAppVersion(o[0] as api.AppVersion);
+  checkAppVersion(o[1] as api.AppVersion);
 }
 
 core.List<core.String> buildUnnamed3574() {
@@ -1761,8 +1775,8 @@
 
 void checkUnnamed3577(core.List<api.ProductPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductPermission(o[0]);
-  checkProductPermission(o[1]);
+  checkProductPermission(o[0] as api.ProductPermission);
+  checkProductPermission(o[1] as api.ProductPermission);
 }
 
 core.List<core.String> buildUnnamed3578() {
@@ -1835,7 +1849,8 @@
     unittest.expect(o.recentChanges, unittest.equals('foo'));
     unittest.expect(o.requiresContainerApp, unittest.isTrue);
     checkUnnamed3578(o.screenshotUrls);
-    checkProductSigningCertificate(o.signingCertificate);
+    checkProductSigningCertificate(
+        o.signingCertificate as api.ProductSigningCertificate);
     unittest.expect(o.smallIconUrl, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.workDetailsUrl, unittest.equals('foo'));
@@ -1915,8 +1930,8 @@
 
 void checkUnnamed3579(core.List<api.ProductPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductPermission(o[0]);
-  checkProductPermission(o[1]);
+  checkProductPermission(o[0] as api.ProductPermission);
+  checkProductPermission(o[1] as api.ProductPermission);
 }
 
 core.int buildCounterProductPermissions = 0;
@@ -1984,8 +1999,9 @@
 void checkProductPolicy(api.ProductPolicy o) {
   buildCounterProductPolicy++;
   if (buildCounterProductPolicy < 3) {
-    checkAutoInstallPolicy(o.autoInstallPolicy);
-    checkManagedConfiguration(o.managedConfiguration);
+    checkAutoInstallPolicy(o.autoInstallPolicy as api.AutoInstallPolicy);
+    checkManagedConfiguration(
+        o.managedConfiguration as api.ManagedConfiguration);
     unittest.expect(o.productId, unittest.equals('foo'));
     checkUnnamed3580(o.trackIds);
     checkUnnamed3581(o.tracks);
@@ -2015,8 +2031,8 @@
 
 void checkUnnamed3583(core.List<api.ProductVisibility> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductVisibility(o[0]);
-  checkProductVisibility(o[1]);
+  checkProductVisibility(o[0] as api.ProductVisibility);
+  checkProductVisibility(o[1] as api.ProductVisibility);
 }
 
 core.int buildCounterProductSet = 0;
@@ -2127,7 +2143,7 @@
 void checkProductsApproveRequest(api.ProductsApproveRequest o) {
   buildCounterProductsApproveRequest++;
   if (buildCounterProductsApproveRequest < 3) {
-    checkApprovalUrlInfo(o.approvalUrlInfo);
+    checkApprovalUrlInfo(o.approvalUrlInfo as api.ApprovalUrlInfo);
     unittest.expect(o.approvedPermissions, unittest.equals('foo'));
   }
   buildCounterProductsApproveRequest--;
@@ -2163,8 +2179,8 @@
 
 void checkUnnamed3586(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProduct(o[0]);
-  checkProduct(o[1]);
+  checkProduct(o[0] as api.Product);
+  checkProduct(o[1] as api.Product);
 }
 
 core.int buildCounterProductsListResponse = 0;
@@ -2183,9 +2199,9 @@
 void checkProductsListResponse(api.ProductsListResponse o) {
   buildCounterProductsListResponse++;
   if (buildCounterProductsListResponse < 3) {
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     checkUnnamed3586(o.product);
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
   }
   buildCounterProductsListResponse--;
 }
@@ -2205,7 +2221,7 @@
 void checkServiceAccount(api.ServiceAccount o) {
   buildCounterServiceAccount++;
   if (buildCounterServiceAccount < 3) {
-    checkServiceAccountKey(o.key);
+    checkServiceAccountKey(o.key as api.ServiceAccountKey);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterServiceAccount--;
@@ -2245,8 +2261,8 @@
 
 void checkUnnamed3587(core.List<api.ServiceAccountKey> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServiceAccountKey(o[0]);
-  checkServiceAccountKey(o[1]);
+  checkServiceAccountKey(o[0] as api.ServiceAccountKey);
+  checkServiceAccountKey(o[1] as api.ServiceAccountKey);
 }
 
 core.int buildCounterServiceAccountKeysListResponse = 0;
@@ -2300,8 +2316,8 @@
 
 void checkUnnamed3588(core.List<api.LocalizedText> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalizedText(o[0]);
-  checkLocalizedText(o[1]);
+  checkLocalizedText(o[0] as api.LocalizedText);
+  checkLocalizedText(o[1] as api.LocalizedText);
 }
 
 core.List<core.String> buildUnnamed3589() {
@@ -2372,8 +2388,8 @@
 
 void checkUnnamed3590(core.List<api.StoreCluster> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStoreCluster(o[0]);
-  checkStoreCluster(o[1]);
+  checkStoreCluster(o[0] as api.StoreCluster);
+  checkStoreCluster(o[1] as api.StoreCluster);
 }
 
 core.int buildCounterStoreLayoutClustersListResponse = 0;
@@ -2405,8 +2421,8 @@
 
 void checkUnnamed3591(core.List<api.StorePage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStorePage(o[0]);
-  checkStorePage(o[1]);
+  checkStorePage(o[0] as api.StorePage);
+  checkStorePage(o[1] as api.StorePage);
 }
 
 core.int buildCounterStoreLayoutPagesListResponse = 0;
@@ -2450,8 +2466,8 @@
 
 void checkUnnamed3593(core.List<api.LocalizedText> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalizedText(o[0]);
-  checkLocalizedText(o[1]);
+  checkLocalizedText(o[0] as api.LocalizedText);
+  checkLocalizedText(o[1] as api.LocalizedText);
 }
 
 core.int buildCounterStorePage = 0;
@@ -2557,8 +2573,8 @@
 
 void checkUnnamed3594(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUser(o[0]);
-  checkUser(o[1]);
+  checkUser(o[0] as api.User);
+  checkUser(o[1] as api.User);
 }
 
 core.int buildCounterUsersListResponse = 0;
@@ -2610,8 +2626,8 @@
 
 void checkUnnamed3595(core.List<api.WebAppIcon> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebAppIcon(o[0]);
-  checkWebAppIcon(o[1]);
+  checkWebAppIcon(o[0] as api.WebAppIcon);
+  checkWebAppIcon(o[1] as api.WebAppIcon);
 }
 
 core.int buildCounterWebApp = 0;
@@ -2673,8 +2689,8 @@
 
 void checkUnnamed3596(core.List<api.WebApp> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebApp(o[0]);
-  checkWebApp(o[1]);
+  checkWebApp(o[0] as api.WebApp);
+  checkWebApp(o[1] as api.WebApp);
 }
 
 core.int buildCounterWebAppsListResponse = 0;
@@ -2701,7 +2717,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministrator();
       var od = api.Administrator.fromJson(o.toJson());
-      checkAdministrator(od);
+      checkAdministrator(od as api.Administrator);
     });
   });
 
@@ -2709,7 +2725,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministratorWebToken();
       var od = api.AdministratorWebToken.fromJson(o.toJson());
-      checkAdministratorWebToken(od);
+      checkAdministratorWebToken(od as api.AdministratorWebToken);
     });
   });
 
@@ -2717,7 +2733,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministratorWebTokenSpec();
       var od = api.AdministratorWebTokenSpec.fromJson(o.toJson());
-      checkAdministratorWebTokenSpec(od);
+      checkAdministratorWebTokenSpec(od as api.AdministratorWebTokenSpec);
     });
   });
 
@@ -2727,7 +2743,8 @@
       var o = buildAdministratorWebTokenSpecManagedConfigurations();
       var od = api.AdministratorWebTokenSpecManagedConfigurations.fromJson(
           o.toJson());
-      checkAdministratorWebTokenSpecManagedConfigurations(od);
+      checkAdministratorWebTokenSpecManagedConfigurations(
+          od as api.AdministratorWebTokenSpecManagedConfigurations);
     });
   });
 
@@ -2735,7 +2752,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministratorWebTokenSpecPlaySearch();
       var od = api.AdministratorWebTokenSpecPlaySearch.fromJson(o.toJson());
-      checkAdministratorWebTokenSpecPlaySearch(od);
+      checkAdministratorWebTokenSpecPlaySearch(
+          od as api.AdministratorWebTokenSpecPlaySearch);
     });
   });
 
@@ -2743,7 +2761,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministratorWebTokenSpecPrivateApps();
       var od = api.AdministratorWebTokenSpecPrivateApps.fromJson(o.toJson());
-      checkAdministratorWebTokenSpecPrivateApps(od);
+      checkAdministratorWebTokenSpecPrivateApps(
+          od as api.AdministratorWebTokenSpecPrivateApps);
     });
   });
 
@@ -2751,7 +2770,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministratorWebTokenSpecStoreBuilder();
       var od = api.AdministratorWebTokenSpecStoreBuilder.fromJson(o.toJson());
-      checkAdministratorWebTokenSpecStoreBuilder(od);
+      checkAdministratorWebTokenSpecStoreBuilder(
+          od as api.AdministratorWebTokenSpecStoreBuilder);
     });
   });
 
@@ -2759,7 +2779,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministratorWebTokenSpecWebApps();
       var od = api.AdministratorWebTokenSpecWebApps.fromJson(o.toJson());
-      checkAdministratorWebTokenSpecWebApps(od);
+      checkAdministratorWebTokenSpecWebApps(
+          od as api.AdministratorWebTokenSpecWebApps);
     });
   });
 
@@ -2767,7 +2788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppRestrictionsSchema();
       var od = api.AppRestrictionsSchema.fromJson(o.toJson());
-      checkAppRestrictionsSchema(od);
+      checkAppRestrictionsSchema(od as api.AppRestrictionsSchema);
     });
   });
 
@@ -2775,7 +2796,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppRestrictionsSchemaChangeEvent();
       var od = api.AppRestrictionsSchemaChangeEvent.fromJson(o.toJson());
-      checkAppRestrictionsSchemaChangeEvent(od);
+      checkAppRestrictionsSchemaChangeEvent(
+          od as api.AppRestrictionsSchemaChangeEvent);
     });
   });
 
@@ -2783,7 +2805,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppRestrictionsSchemaRestriction();
       var od = api.AppRestrictionsSchemaRestriction.fromJson(o.toJson());
-      checkAppRestrictionsSchemaRestriction(od);
+      checkAppRestrictionsSchemaRestriction(
+          od as api.AppRestrictionsSchemaRestriction);
     });
   });
 
@@ -2793,7 +2816,8 @@
       var o = buildAppRestrictionsSchemaRestrictionRestrictionValue();
       var od = api.AppRestrictionsSchemaRestrictionRestrictionValue.fromJson(
           o.toJson());
-      checkAppRestrictionsSchemaRestrictionRestrictionValue(od);
+      checkAppRestrictionsSchemaRestrictionRestrictionValue(
+          od as api.AppRestrictionsSchemaRestrictionRestrictionValue);
     });
   });
 
@@ -2801,7 +2825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppState();
       var od = api.AppState.fromJson(o.toJson());
-      checkAppState(od);
+      checkAppState(od as api.AppState);
     });
   });
 
@@ -2809,7 +2833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppUpdateEvent();
       var od = api.AppUpdateEvent.fromJson(o.toJson());
-      checkAppUpdateEvent(od);
+      checkAppUpdateEvent(od as api.AppUpdateEvent);
     });
   });
 
@@ -2817,7 +2841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppVersion();
       var od = api.AppVersion.fromJson(o.toJson());
-      checkAppVersion(od);
+      checkAppVersion(od as api.AppVersion);
     });
   });
 
@@ -2825,7 +2849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApprovalUrlInfo();
       var od = api.ApprovalUrlInfo.fromJson(o.toJson());
-      checkApprovalUrlInfo(od);
+      checkApprovalUrlInfo(od as api.ApprovalUrlInfo);
     });
   });
 
@@ -2833,7 +2857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthenticationToken();
       var od = api.AuthenticationToken.fromJson(o.toJson());
-      checkAuthenticationToken(od);
+      checkAuthenticationToken(od as api.AuthenticationToken);
     });
   });
 
@@ -2841,7 +2865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoInstallConstraint();
       var od = api.AutoInstallConstraint.fromJson(o.toJson());
-      checkAutoInstallConstraint(od);
+      checkAutoInstallConstraint(od as api.AutoInstallConstraint);
     });
   });
 
@@ -2849,7 +2873,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoInstallPolicy();
       var od = api.AutoInstallPolicy.fromJson(o.toJson());
-      checkAutoInstallPolicy(od);
+      checkAutoInstallPolicy(od as api.AutoInstallPolicy);
     });
   });
 
@@ -2857,7 +2881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigurationVariables();
       var od = api.ConfigurationVariables.fromJson(o.toJson());
-      checkConfigurationVariables(od);
+      checkConfigurationVariables(od as api.ConfigurationVariables);
     });
   });
 
@@ -2865,7 +2889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevice();
       var od = api.Device.fromJson(o.toJson());
-      checkDevice(od);
+      checkDevice(od as api.Device);
     });
   });
 
@@ -2873,7 +2897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceReport();
       var od = api.DeviceReport.fromJson(o.toJson());
-      checkDeviceReport(od);
+      checkDeviceReport(od as api.DeviceReport);
     });
   });
 
@@ -2881,7 +2905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceReportUpdateEvent();
       var od = api.DeviceReportUpdateEvent.fromJson(o.toJson());
-      checkDeviceReportUpdateEvent(od);
+      checkDeviceReportUpdateEvent(od as api.DeviceReportUpdateEvent);
     });
   });
 
@@ -2889,7 +2913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceState();
       var od = api.DeviceState.fromJson(o.toJson());
-      checkDeviceState(od);
+      checkDeviceState(od as api.DeviceState);
     });
   });
 
@@ -2897,7 +2921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevicesListResponse();
       var od = api.DevicesListResponse.fromJson(o.toJson());
-      checkDevicesListResponse(od);
+      checkDevicesListResponse(od as api.DevicesListResponse);
     });
   });
 
@@ -2905,7 +2929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnterprise();
       var od = api.Enterprise.fromJson(o.toJson());
-      checkEnterprise(od);
+      checkEnterprise(od as api.Enterprise);
     });
   });
 
@@ -2913,7 +2937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnterpriseAccount();
       var od = api.EnterpriseAccount.fromJson(o.toJson());
-      checkEnterpriseAccount(od);
+      checkEnterpriseAccount(od as api.EnterpriseAccount);
     });
   });
 
@@ -2921,7 +2945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnterprisesListResponse();
       var od = api.EnterprisesListResponse.fromJson(o.toJson());
-      checkEnterprisesListResponse(od);
+      checkEnterprisesListResponse(od as api.EnterprisesListResponse);
     });
   });
 
@@ -2930,7 +2954,8 @@
       var o = buildEnterprisesSendTestPushNotificationResponse();
       var od =
           api.EnterprisesSendTestPushNotificationResponse.fromJson(o.toJson());
-      checkEnterprisesSendTestPushNotificationResponse(od);
+      checkEnterprisesSendTestPushNotificationResponse(
+          od as api.EnterprisesSendTestPushNotificationResponse);
     });
   });
 
@@ -2938,7 +2963,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntitlement();
       var od = api.Entitlement.fromJson(o.toJson());
-      checkEntitlement(od);
+      checkEntitlement(od as api.Entitlement);
     });
   });
 
@@ -2946,7 +2971,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntitlementsListResponse();
       var od = api.EntitlementsListResponse.fromJson(o.toJson());
-      checkEntitlementsListResponse(od);
+      checkEntitlementsListResponse(od as api.EntitlementsListResponse);
     });
   });
 
@@ -2954,7 +2979,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupLicense();
       var od = api.GroupLicense.fromJson(o.toJson());
-      checkGroupLicense(od);
+      checkGroupLicense(od as api.GroupLicense);
     });
   });
 
@@ -2962,7 +2987,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupLicenseUsersListResponse();
       var od = api.GroupLicenseUsersListResponse.fromJson(o.toJson());
-      checkGroupLicenseUsersListResponse(od);
+      checkGroupLicenseUsersListResponse(
+          od as api.GroupLicenseUsersListResponse);
     });
   });
 
@@ -2970,7 +2996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupLicensesListResponse();
       var od = api.GroupLicensesListResponse.fromJson(o.toJson());
-      checkGroupLicensesListResponse(od);
+      checkGroupLicensesListResponse(od as api.GroupLicensesListResponse);
     });
   });
 
@@ -2978,7 +3004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstall();
       var od = api.Install.fromJson(o.toJson());
-      checkInstall(od);
+      checkInstall(od as api.Install);
     });
   });
 
@@ -2986,7 +3012,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstallFailureEvent();
       var od = api.InstallFailureEvent.fromJson(o.toJson());
-      checkInstallFailureEvent(od);
+      checkInstallFailureEvent(od as api.InstallFailureEvent);
     });
   });
 
@@ -2994,7 +3020,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstallsListResponse();
       var od = api.InstallsListResponse.fromJson(o.toJson());
-      checkInstallsListResponse(od);
+      checkInstallsListResponse(od as api.InstallsListResponse);
     });
   });
 
@@ -3002,7 +3028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyedAppState();
       var od = api.KeyedAppState.fromJson(o.toJson());
-      checkKeyedAppState(od);
+      checkKeyedAppState(od as api.KeyedAppState);
     });
   });
 
@@ -3010,7 +3036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizedText();
       var od = api.LocalizedText.fromJson(o.toJson());
-      checkLocalizedText(od);
+      checkLocalizedText(od as api.LocalizedText);
     });
   });
 
@@ -3018,7 +3044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMaintenanceWindow();
       var od = api.MaintenanceWindow.fromJson(o.toJson());
-      checkMaintenanceWindow(od);
+      checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
 
@@ -3026,7 +3052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedConfiguration();
       var od = api.ManagedConfiguration.fromJson(o.toJson());
-      checkManagedConfiguration(od);
+      checkManagedConfiguration(od as api.ManagedConfiguration);
     });
   });
 
@@ -3035,7 +3061,8 @@
       var o = buildManagedConfigurationsForDeviceListResponse();
       var od =
           api.ManagedConfigurationsForDeviceListResponse.fromJson(o.toJson());
-      checkManagedConfigurationsForDeviceListResponse(od);
+      checkManagedConfigurationsForDeviceListResponse(
+          od as api.ManagedConfigurationsForDeviceListResponse);
     });
   });
 
@@ -3044,7 +3071,8 @@
       var o = buildManagedConfigurationsForUserListResponse();
       var od =
           api.ManagedConfigurationsForUserListResponse.fromJson(o.toJson());
-      checkManagedConfigurationsForUserListResponse(od);
+      checkManagedConfigurationsForUserListResponse(
+          od as api.ManagedConfigurationsForUserListResponse);
     });
   });
 
@@ -3052,7 +3080,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedConfigurationsSettings();
       var od = api.ManagedConfigurationsSettings.fromJson(o.toJson());
-      checkManagedConfigurationsSettings(od);
+      checkManagedConfigurationsSettings(
+          od as api.ManagedConfigurationsSettings);
     });
   });
 
@@ -3061,7 +3090,8 @@
       var o = buildManagedConfigurationsSettingsListResponse();
       var od =
           api.ManagedConfigurationsSettingsListResponse.fromJson(o.toJson());
-      checkManagedConfigurationsSettingsListResponse(od);
+      checkManagedConfigurationsSettingsListResponse(
+          od as api.ManagedConfigurationsSettingsListResponse);
     });
   });
 
@@ -3069,7 +3099,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedProperty();
       var od = api.ManagedProperty.fromJson(o.toJson());
-      checkManagedProperty(od);
+      checkManagedProperty(od as api.ManagedProperty);
     });
   });
 
@@ -3077,7 +3107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedPropertyBundle();
       var od = api.ManagedPropertyBundle.fromJson(o.toJson());
-      checkManagedPropertyBundle(od);
+      checkManagedPropertyBundle(od as api.ManagedPropertyBundle);
     });
   });
 
@@ -3085,7 +3115,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNewDeviceEvent();
       var od = api.NewDeviceEvent.fromJson(o.toJson());
-      checkNewDeviceEvent(od);
+      checkNewDeviceEvent(od as api.NewDeviceEvent);
     });
   });
 
@@ -3093,7 +3123,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNewPermissionsEvent();
       var od = api.NewPermissionsEvent.fromJson(o.toJson());
-      checkNewPermissionsEvent(od);
+      checkNewPermissionsEvent(od as api.NewPermissionsEvent);
     });
   });
 
@@ -3101,7 +3131,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotification();
       var od = api.Notification.fromJson(o.toJson());
-      checkNotification(od);
+      checkNotification(od as api.Notification);
     });
   });
 
@@ -3109,7 +3139,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationSet();
       var od = api.NotificationSet.fromJson(o.toJson());
-      checkNotificationSet(od);
+      checkNotificationSet(od as api.NotificationSet);
     });
   });
 
@@ -3117,7 +3147,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageInfo();
       var od = api.PageInfo.fromJson(o.toJson());
-      checkPageInfo(od);
+      checkPageInfo(od as api.PageInfo);
     });
   });
 
@@ -3125,7 +3155,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermission();
       var od = api.Permission.fromJson(o.toJson());
-      checkPermission(od);
+      checkPermission(od as api.Permission);
     });
   });
 
@@ -3133,7 +3163,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -3141,7 +3171,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProduct();
       var od = api.Product.fromJson(o.toJson());
-      checkProduct(od);
+      checkProduct(od as api.Product);
     });
   });
 
@@ -3149,7 +3179,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductApprovalEvent();
       var od = api.ProductApprovalEvent.fromJson(o.toJson());
-      checkProductApprovalEvent(od);
+      checkProductApprovalEvent(od as api.ProductApprovalEvent);
     });
   });
 
@@ -3157,7 +3187,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductAvailabilityChangeEvent();
       var od = api.ProductAvailabilityChangeEvent.fromJson(o.toJson());
-      checkProductAvailabilityChangeEvent(od);
+      checkProductAvailabilityChangeEvent(
+          od as api.ProductAvailabilityChangeEvent);
     });
   });
 
@@ -3165,7 +3196,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductPermission();
       var od = api.ProductPermission.fromJson(o.toJson());
-      checkProductPermission(od);
+      checkProductPermission(od as api.ProductPermission);
     });
   });
 
@@ -3173,7 +3204,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductPermissions();
       var od = api.ProductPermissions.fromJson(o.toJson());
-      checkProductPermissions(od);
+      checkProductPermissions(od as api.ProductPermissions);
     });
   });
 
@@ -3181,7 +3212,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductPolicy();
       var od = api.ProductPolicy.fromJson(o.toJson());
-      checkProductPolicy(od);
+      checkProductPolicy(od as api.ProductPolicy);
     });
   });
 
@@ -3189,7 +3220,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductSet();
       var od = api.ProductSet.fromJson(o.toJson());
-      checkProductSet(od);
+      checkProductSet(od as api.ProductSet);
     });
   });
 
@@ -3197,7 +3228,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductSigningCertificate();
       var od = api.ProductSigningCertificate.fromJson(o.toJson());
-      checkProductSigningCertificate(od);
+      checkProductSigningCertificate(od as api.ProductSigningCertificate);
     });
   });
 
@@ -3205,7 +3236,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductVisibility();
       var od = api.ProductVisibility.fromJson(o.toJson());
-      checkProductVisibility(od);
+      checkProductVisibility(od as api.ProductVisibility);
     });
   });
 
@@ -3213,7 +3244,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsApproveRequest();
       var od = api.ProductsApproveRequest.fromJson(o.toJson());
-      checkProductsApproveRequest(od);
+      checkProductsApproveRequest(od as api.ProductsApproveRequest);
     });
   });
 
@@ -3221,7 +3252,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsGenerateApprovalUrlResponse();
       var od = api.ProductsGenerateApprovalUrlResponse.fromJson(o.toJson());
-      checkProductsGenerateApprovalUrlResponse(od);
+      checkProductsGenerateApprovalUrlResponse(
+          od as api.ProductsGenerateApprovalUrlResponse);
     });
   });
 
@@ -3229,7 +3261,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsListResponse();
       var od = api.ProductsListResponse.fromJson(o.toJson());
-      checkProductsListResponse(od);
+      checkProductsListResponse(od as api.ProductsListResponse);
     });
   });
 
@@ -3237,7 +3269,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccount();
       var od = api.ServiceAccount.fromJson(o.toJson());
-      checkServiceAccount(od);
+      checkServiceAccount(od as api.ServiceAccount);
     });
   });
 
@@ -3245,7 +3277,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccountKey();
       var od = api.ServiceAccountKey.fromJson(o.toJson());
-      checkServiceAccountKey(od);
+      checkServiceAccountKey(od as api.ServiceAccountKey);
     });
   });
 
@@ -3253,7 +3285,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccountKeysListResponse();
       var od = api.ServiceAccountKeysListResponse.fromJson(o.toJson());
-      checkServiceAccountKeysListResponse(od);
+      checkServiceAccountKeysListResponse(
+          od as api.ServiceAccountKeysListResponse);
     });
   });
 
@@ -3261,7 +3294,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignupInfo();
       var od = api.SignupInfo.fromJson(o.toJson());
-      checkSignupInfo(od);
+      checkSignupInfo(od as api.SignupInfo);
     });
   });
 
@@ -3269,7 +3302,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStoreCluster();
       var od = api.StoreCluster.fromJson(o.toJson());
-      checkStoreCluster(od);
+      checkStoreCluster(od as api.StoreCluster);
     });
   });
 
@@ -3277,7 +3310,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStoreLayout();
       var od = api.StoreLayout.fromJson(o.toJson());
-      checkStoreLayout(od);
+      checkStoreLayout(od as api.StoreLayout);
     });
   });
 
@@ -3285,7 +3318,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildStoreLayoutClustersListResponse();
       var od = api.StoreLayoutClustersListResponse.fromJson(o.toJson());
-      checkStoreLayoutClustersListResponse(od);
+      checkStoreLayoutClustersListResponse(
+          od as api.StoreLayoutClustersListResponse);
     });
   });
 
@@ -3293,7 +3327,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStoreLayoutPagesListResponse();
       var od = api.StoreLayoutPagesListResponse.fromJson(o.toJson());
-      checkStoreLayoutPagesListResponse(od);
+      checkStoreLayoutPagesListResponse(od as api.StoreLayoutPagesListResponse);
     });
   });
 
@@ -3301,7 +3335,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStorePage();
       var od = api.StorePage.fromJson(o.toJson());
-      checkStorePage(od);
+      checkStorePage(od as api.StorePage);
     });
   });
 
@@ -3309,7 +3343,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTokenPagination();
       var od = api.TokenPagination.fromJson(o.toJson());
-      checkTokenPagination(od);
+      checkTokenPagination(od as api.TokenPagination);
     });
   });
 
@@ -3317,7 +3351,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrackInfo();
       var od = api.TrackInfo.fromJson(o.toJson());
-      checkTrackInfo(od);
+      checkTrackInfo(od as api.TrackInfo);
     });
   });
 
@@ -3325,7 +3359,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -3333,7 +3367,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsersListResponse();
       var od = api.UsersListResponse.fromJson(o.toJson());
-      checkUsersListResponse(od);
+      checkUsersListResponse(od as api.UsersListResponse);
     });
   });
 
@@ -3341,7 +3375,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVariableSet();
       var od = api.VariableSet.fromJson(o.toJson());
-      checkVariableSet(od);
+      checkVariableSet(od as api.VariableSet);
     });
   });
 
@@ -3349,7 +3383,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebApp();
       var od = api.WebApp.fromJson(o.toJson());
-      checkWebApp(od);
+      checkWebApp(od as api.WebApp);
     });
   });
 
@@ -3357,7 +3391,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebAppIcon();
       var od = api.WebAppIcon.fromJson(o.toJson());
-      checkWebAppIcon(od);
+      checkWebAppIcon(od as api.WebAppIcon);
     });
   });
 
@@ -3365,7 +3399,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebAppsListResponse();
       var od = api.WebAppsListResponse.fromJson(o.toJson());
-      checkWebAppsListResponse(od);
+      checkWebAppsListResponse(od as api.WebAppsListResponse);
     });
   });
 
@@ -3511,7 +3545,7 @@
       res
           .get(arg_enterpriseId, arg_userId, arg_deviceId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
 
@@ -3588,7 +3622,7 @@
           .getState(arg_enterpriseId, arg_userId, arg_deviceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeviceState(response);
+        checkDeviceState(response as api.DeviceState);
       })));
     });
 
@@ -3654,7 +3688,7 @@
       res
           .list(arg_enterpriseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevicesListResponse(response);
+        checkDevicesListResponse(response as api.DevicesListResponse);
       })));
     });
 
@@ -3667,8 +3701,9 @@
       var arg_deviceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeviceState.fromJson(json);
-        checkDeviceState(obj);
+        var obj = api.DeviceState.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeviceState(obj as api.DeviceState);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3735,7 +3770,7 @@
           .setState(arg_request, arg_enterpriseId, arg_userId, arg_deviceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeviceState(response);
+        checkDeviceState(response as api.DeviceState);
       })));
     });
 
@@ -3749,8 +3784,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Device.fromJson(json);
-        checkDevice(obj);
+        var obj =
+            api.Device.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDevice(obj as api.Device);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3813,7 +3849,7 @@
           .update(arg_request, arg_enterpriseId, arg_userId, arg_deviceId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
   });
@@ -3920,7 +3956,7 @@
               enterpriseToken: arg_enterpriseToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprise(response);
+        checkEnterprise(response as api.Enterprise);
       })));
     });
 
@@ -3931,8 +3967,9 @@
       var arg_enterpriseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AdministratorWebTokenSpec.fromJson(json);
-        checkAdministratorWebTokenSpec(obj);
+        var obj = api.AdministratorWebTokenSpec.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdministratorWebTokenSpec(obj as api.AdministratorWebTokenSpec);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3980,7 +4017,7 @@
       res
           .createWebToken(arg_request, arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdministratorWebToken(response);
+        checkAdministratorWebToken(response as api.AdministratorWebToken);
       })));
     });
 
@@ -3991,8 +4028,9 @@
       var arg_token = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Enterprise.fromJson(json);
-        checkEnterprise(obj);
+        var obj = api.Enterprise.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnterprise(obj as api.Enterprise);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4032,7 +4070,7 @@
       res
           .enroll(arg_request, arg_token, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprise(response);
+        checkEnterprise(response as api.Enterprise);
       })));
     });
 
@@ -4081,7 +4119,7 @@
       res
           .generateSignupUrl(callbackUrl: arg_callbackUrl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSignupInfo(response);
+        checkSignupInfo(response as api.SignupInfo);
       })));
     });
 
@@ -4131,7 +4169,7 @@
       res
           .get(arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprise(response);
+        checkEnterprise(response as api.Enterprise);
       })));
     });
 
@@ -4191,7 +4229,7 @@
           .getServiceAccount(arg_enterpriseId,
               keyType: arg_keyType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccount(response);
+        checkServiceAccount(response as api.ServiceAccount);
       })));
     });
 
@@ -4247,7 +4285,7 @@
       res
           .getStoreLayout(arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStoreLayout(response);
+        checkStoreLayout(response as api.StoreLayout);
       })));
     });
 
@@ -4295,7 +4333,7 @@
       res
           .list(arg_domain, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprisesListResponse(response);
+        checkEnterprisesListResponse(response as api.EnterprisesListResponse);
       })));
     });
 
@@ -4347,7 +4385,7 @@
           .pullNotificationSet(
               requestMode: arg_requestMode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationSet(response);
+        checkNotificationSet(response as api.NotificationSet);
       })));
     });
 
@@ -4404,7 +4442,8 @@
       res
           .sendTestPushNotification(arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprisesSendTestPushNotificationResponse(response);
+        checkEnterprisesSendTestPushNotificationResponse(
+            response as api.EnterprisesSendTestPushNotificationResponse);
       })));
     });
 
@@ -4415,8 +4454,9 @@
       var arg_enterpriseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EnterpriseAccount.fromJson(json);
-        checkEnterpriseAccount(obj);
+        var obj = api.EnterpriseAccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnterpriseAccount(obj as api.EnterpriseAccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4464,7 +4504,7 @@
       res
           .setAccount(arg_request, arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterpriseAccount(response);
+        checkEnterpriseAccount(response as api.EnterpriseAccount);
       })));
     });
 
@@ -4475,8 +4515,9 @@
       var arg_enterpriseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StoreLayout.fromJson(json);
-        checkStoreLayout(obj);
+        var obj = api.StoreLayout.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStoreLayout(obj as api.StoreLayout);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4524,7 +4565,7 @@
       res
           .setStoreLayout(arg_request, arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStoreLayout(response);
+        checkStoreLayout(response as api.StoreLayout);
       })));
     });
 
@@ -4720,7 +4761,7 @@
           .get(arg_enterpriseId, arg_userId, arg_entitlementId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntitlement(response);
+        checkEntitlement(response as api.Entitlement);
       })));
     });
 
@@ -4786,7 +4827,7 @@
       res
           .list(arg_enterpriseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntitlementsListResponse(response);
+        checkEntitlementsListResponse(response as api.EntitlementsListResponse);
       })));
     });
 
@@ -4800,8 +4841,9 @@
       var arg_install = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Entitlement.fromJson(json);
-        checkEntitlement(obj);
+        var obj = api.Entitlement.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEntitlement(obj as api.Entitlement);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4864,7 +4906,7 @@
           .update(arg_request, arg_enterpriseId, arg_userId, arg_entitlementId,
               install: arg_install, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEntitlement(response);
+        checkEntitlement(response as api.Entitlement);
       })));
     });
   });
@@ -4926,7 +4968,7 @@
       res
           .get(arg_enterpriseId, arg_groupLicenseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroupLicense(response);
+        checkGroupLicense(response as api.GroupLicense);
       })));
     });
 
@@ -4982,7 +5024,8 @@
       res
           .list(arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroupLicensesListResponse(response);
+        checkGroupLicensesListResponse(
+            response as api.GroupLicensesListResponse);
       })));
     });
   });
@@ -5050,7 +5093,8 @@
       res
           .list(arg_enterpriseId, arg_groupLicenseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroupLicenseUsersListResponse(response);
+        checkGroupLicenseUsersListResponse(
+            response as api.GroupLicenseUsersListResponse);
       })));
     });
   });
@@ -5212,7 +5256,7 @@
           .get(arg_enterpriseId, arg_userId, arg_deviceId, arg_installId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstall(response);
+        checkInstall(response as api.Install);
       })));
     });
 
@@ -5289,7 +5333,7 @@
           .list(arg_enterpriseId, arg_userId, arg_deviceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstallsListResponse(response);
+        checkInstallsListResponse(response as api.InstallsListResponse);
       })));
     });
 
@@ -5303,8 +5347,9 @@
       var arg_installId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Install.fromJson(json);
-        checkInstall(obj);
+        var obj =
+            api.Install.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstall(obj as api.Install);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5375,7 +5420,7 @@
               arg_installId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstall(response);
+        checkInstall(response as api.Install);
       })));
     });
   });
@@ -5541,7 +5586,7 @@
               arg_managedConfigurationForDeviceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedConfiguration(response);
+        checkManagedConfiguration(response as api.ManagedConfiguration);
       })));
     });
 
@@ -5619,7 +5664,8 @@
           .list(arg_enterpriseId, arg_userId, arg_deviceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedConfigurationsForDeviceListResponse(response);
+        checkManagedConfigurationsForDeviceListResponse(
+            response as api.ManagedConfigurationsForDeviceListResponse);
       })));
     });
 
@@ -5633,8 +5679,9 @@
       var arg_managedConfigurationForDeviceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ManagedConfiguration.fromJson(json);
-        checkManagedConfiguration(obj);
+        var obj = api.ManagedConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkManagedConfiguration(obj as api.ManagedConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5706,7 +5753,7 @@
               arg_managedConfigurationForDeviceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedConfiguration(response);
+        checkManagedConfiguration(response as api.ManagedConfiguration);
       })));
     });
   });
@@ -5851,7 +5898,7 @@
           .get(arg_enterpriseId, arg_userId, arg_managedConfigurationForUserId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedConfiguration(response);
+        checkManagedConfiguration(response as api.ManagedConfiguration);
       })));
     });
 
@@ -5918,7 +5965,8 @@
       res
           .list(arg_enterpriseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedConfigurationsForUserListResponse(response);
+        checkManagedConfigurationsForUserListResponse(
+            response as api.ManagedConfigurationsForUserListResponse);
       })));
     });
 
@@ -5931,8 +5979,9 @@
       var arg_managedConfigurationForUserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ManagedConfiguration.fromJson(json);
-        checkManagedConfiguration(obj);
+        var obj = api.ManagedConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkManagedConfiguration(obj as api.ManagedConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5995,7 +6044,7 @@
               arg_managedConfigurationForUserId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedConfiguration(response);
+        checkManagedConfiguration(response as api.ManagedConfiguration);
       })));
     });
   });
@@ -6064,7 +6113,8 @@
       res
           .list(arg_enterpriseId, arg_productId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedConfigurationsSettingsListResponse(response);
+        checkManagedConfigurationsSettingsListResponse(
+            response as api.ManagedConfigurationsSettingsListResponse);
       })));
     });
   });
@@ -6119,7 +6169,7 @@
       res
           .get(arg_permissionId, language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
   });
@@ -6133,8 +6183,9 @@
       var arg_productId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProductsApproveRequest.fromJson(json);
-        checkProductsApproveRequest(obj);
+        var obj = api.ProductsApproveRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProductsApproveRequest(obj as api.ProductsApproveRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6261,7 +6312,8 @@
           .generateApprovalUrl(arg_enterpriseId, arg_productId,
               languageCode: arg_languageCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductsGenerateApprovalUrlResponse(response);
+        checkProductsGenerateApprovalUrlResponse(
+            response as api.ProductsGenerateApprovalUrlResponse);
       })));
     });
 
@@ -6325,7 +6377,7 @@
           .get(arg_enterpriseId, arg_productId,
               language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -6395,7 +6447,7 @@
           .getAppRestrictionsSchema(arg_enterpriseId, arg_productId,
               language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppRestrictionsSchema(response);
+        checkAppRestrictionsSchema(response as api.AppRestrictionsSchema);
       })));
     });
 
@@ -6461,7 +6513,7 @@
       res
           .getPermissions(arg_enterpriseId, arg_productId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductPermissions(response);
+        checkProductPermissions(response as api.ProductPermissions);
       })));
     });
 
@@ -6536,7 +6588,7 @@
               token: arg_token,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductsListResponse(response);
+        checkProductsListResponse(response as api.ProductsListResponse);
       })));
     });
 
@@ -6671,8 +6723,9 @@
       var arg_enterpriseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ServiceAccountKey.fromJson(json);
-        checkServiceAccountKey(obj);
+        var obj = api.ServiceAccountKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkServiceAccountKey(obj as api.ServiceAccountKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6720,7 +6773,7 @@
       res
           .insert(arg_request, arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccountKey(response);
+        checkServiceAccountKey(response as api.ServiceAccountKey);
       })));
     });
 
@@ -6776,7 +6829,8 @@
       res
           .list(arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccountKeysListResponse(response);
+        checkServiceAccountKeysListResponse(
+            response as api.ServiceAccountKeysListResponse);
       })));
     });
   });
@@ -6918,7 +6972,7 @@
           .get(arg_enterpriseId, arg_pageId, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStoreCluster(response);
+        checkStoreCluster(response as api.StoreCluster);
       })));
     });
 
@@ -6930,8 +6984,9 @@
       var arg_pageId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StoreCluster.fromJson(json);
-        checkStoreCluster(obj);
+        var obj = api.StoreCluster.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStoreCluster(obj as api.StoreCluster);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6989,7 +7044,7 @@
           .insert(arg_request, arg_enterpriseId, arg_pageId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStoreCluster(response);
+        checkStoreCluster(response as api.StoreCluster);
       })));
     });
 
@@ -7055,7 +7110,8 @@
       res
           .list(arg_enterpriseId, arg_pageId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStoreLayoutClustersListResponse(response);
+        checkStoreLayoutClustersListResponse(
+            response as api.StoreLayoutClustersListResponse);
       })));
     });
 
@@ -7068,8 +7124,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StoreCluster.fromJson(json);
-        checkStoreCluster(obj);
+        var obj = api.StoreCluster.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStoreCluster(obj as api.StoreCluster);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7130,7 +7187,7 @@
           .update(arg_request, arg_enterpriseId, arg_pageId, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStoreCluster(response);
+        checkStoreCluster(response as api.StoreCluster);
       })));
     });
   });
@@ -7250,7 +7307,7 @@
       res
           .get(arg_enterpriseId, arg_pageId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStorePage(response);
+        checkStorePage(response as api.StorePage);
       })));
     });
 
@@ -7261,8 +7318,9 @@
       var arg_enterpriseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StorePage.fromJson(json);
-        checkStorePage(obj);
+        var obj =
+            api.StorePage.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkStorePage(obj as api.StorePage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7310,7 +7368,7 @@
       res
           .insert(arg_request, arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStorePage(response);
+        checkStorePage(response as api.StorePage);
       })));
     });
 
@@ -7366,7 +7424,8 @@
       res
           .list(arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStoreLayoutPagesListResponse(response);
+        checkStoreLayoutPagesListResponse(
+            response as api.StoreLayoutPagesListResponse);
       })));
     });
 
@@ -7378,8 +7437,9 @@
       var arg_pageId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StorePage.fromJson(json);
-        checkStorePage(obj);
+        var obj =
+            api.StorePage.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkStorePage(obj as api.StorePage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7431,7 +7491,7 @@
           .update(arg_request, arg_enterpriseId, arg_pageId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStorePage(response);
+        checkStorePage(response as api.StorePage);
       })));
     });
   });
@@ -7558,7 +7618,7 @@
           .generateAuthenticationToken(arg_enterpriseId, arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAuthenticationToken(response);
+        checkAuthenticationToken(response as api.AuthenticationToken);
       })));
     });
 
@@ -7618,7 +7678,7 @@
       res
           .get(arg_enterpriseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -7685,7 +7745,7 @@
           .getAvailableProductSet(arg_enterpriseId, arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductSet(response);
+        checkProductSet(response as api.ProductSet);
       })));
     });
 
@@ -7696,8 +7756,9 @@
       var arg_enterpriseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.User.fromJson(json);
-        checkUser(obj);
+        var obj =
+            api.User.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUser(obj as api.User);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7745,7 +7806,7 @@
       res
           .insert(arg_request, arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -7803,7 +7864,7 @@
       res
           .list(arg_enterpriseId, arg_email, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsersListResponse(response);
+        checkUsersListResponse(response as api.UsersListResponse);
       })));
     });
 
@@ -7880,8 +7941,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProductSet.fromJson(json);
-        checkProductSet(obj);
+        var obj = api.ProductSet.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProductSet(obj as api.ProductSet);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7939,7 +8001,7 @@
           .setAvailableProductSet(arg_request, arg_enterpriseId, arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductSet(response);
+        checkProductSet(response as api.ProductSet);
       })));
     });
 
@@ -7951,8 +8013,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.User.fromJson(json);
-        checkUser(obj);
+        var obj =
+            api.User.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUser(obj as api.User);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8004,7 +8067,7 @@
           .update(arg_request, arg_enterpriseId, arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
   });
@@ -8124,7 +8187,7 @@
       res
           .get(arg_enterpriseId, arg_webAppId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebApp(response);
+        checkWebApp(response as api.WebApp);
       })));
     });
 
@@ -8135,8 +8198,9 @@
       var arg_enterpriseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WebApp.fromJson(json);
-        checkWebApp(obj);
+        var obj =
+            api.WebApp.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkWebApp(obj as api.WebApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8184,7 +8248,7 @@
       res
           .insert(arg_request, arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebApp(response);
+        checkWebApp(response as api.WebApp);
       })));
     });
 
@@ -8240,7 +8304,7 @@
       res
           .list(arg_enterpriseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebAppsListResponse(response);
+        checkWebAppsListResponse(response as api.WebAppsListResponse);
       })));
     });
 
@@ -8252,8 +8316,9 @@
       var arg_webAppId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WebApp.fromJson(json);
-        checkWebApp(obj);
+        var obj =
+            api.WebApp.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkWebApp(obj as api.WebApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8305,7 +8370,7 @@
           .update(arg_request, arg_enterpriseId, arg_webAppId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebApp(response);
+        checkWebApp(response as api.WebApp);
       })));
     });
   });
diff --git a/generated/googleapis/test/androidmanagement/v1_test.dart b/generated/googleapis/test/androidmanagement/v1_test.dart
index a8ab25a..77db0e3 100644
--- a/generated/googleapis/test/androidmanagement/v1_test.dart
+++ b/generated/googleapis/test/androidmanagement/v1_test.dart
@@ -163,8 +163,8 @@
 
 void checkUnnamed5209(core.List<api.AppTrackInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAppTrackInfo(o[0]);
-  checkAppTrackInfo(o[1]);
+  checkAppTrackInfo(o[0] as api.AppTrackInfo);
+  checkAppTrackInfo(o[1] as api.AppTrackInfo);
 }
 
 core.List<api.ManagedProperty> buildUnnamed5210() {
@@ -176,8 +176,8 @@
 
 void checkUnnamed5210(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedProperty(o[0]);
-  checkManagedProperty(o[1]);
+  checkManagedProperty(o[0] as api.ManagedProperty);
+  checkManagedProperty(o[1] as api.ManagedProperty);
 }
 
 core.List<api.ApplicationPermission> buildUnnamed5211() {
@@ -189,8 +189,8 @@
 
 void checkUnnamed5211(core.List<api.ApplicationPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplicationPermission(o[0]);
-  checkApplicationPermission(o[1]);
+  checkApplicationPermission(o[0] as api.ApplicationPermission);
+  checkApplicationPermission(o[1] as api.ApplicationPermission);
 }
 
 core.int buildCounterApplication = 0;
@@ -328,8 +328,8 @@
 
 void checkUnnamed5215(core.List<api.PermissionGrant> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermissionGrant(o[0]);
-  checkPermissionGrant(o[1]);
+  checkPermissionGrant(o[0] as api.PermissionGrant);
+  checkPermissionGrant(o[1] as api.PermissionGrant);
 }
 
 core.int buildCounterApplicationPolicy = 0;
@@ -365,7 +365,8 @@
     unittest.expect(o.installType, unittest.equals('foo'));
     unittest.expect(o.lockTaskAllowed, unittest.isTrue);
     checkUnnamed5214(o.managedConfiguration);
-    checkManagedConfigurationTemplate(o.managedConfigurationTemplate);
+    checkManagedConfigurationTemplate(
+        o.managedConfigurationTemplate as api.ManagedConfigurationTemplate);
     unittest.expect(o.minimumVersionCode, unittest.equals(42));
     unittest.expect(o.packageName, unittest.equals('foo'));
     checkUnnamed5215(o.permissionGrants);
@@ -382,8 +383,8 @@
 
 void checkUnnamed5216(core.List<api.ApplicationEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplicationEvent(o[0]);
-  checkApplicationEvent(o[1]);
+  checkApplicationEvent(o[0] as api.ApplicationEvent);
+  checkApplicationEvent(o[1] as api.ApplicationEvent);
 }
 
 core.List<api.KeyedAppState> buildUnnamed5217() {
@@ -395,8 +396,8 @@
 
 void checkUnnamed5217(core.List<api.KeyedAppState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKeyedAppState(o[0]);
-  checkKeyedAppState(o[1]);
+  checkKeyedAppState(o[0] as api.KeyedAppState);
+  checkKeyedAppState(o[1] as api.KeyedAppState);
 }
 
 core.List<core.String> buildUnnamed5218() {
@@ -601,9 +602,10 @@
 void checkComplianceRule(api.ComplianceRule o) {
   buildCounterComplianceRule++;
   if (buildCounterComplianceRule < 3) {
-    checkApiLevelCondition(o.apiLevelCondition);
+    checkApiLevelCondition(o.apiLevelCondition as api.ApiLevelCondition);
     unittest.expect(o.disableApps, unittest.isTrue);
-    checkNonComplianceDetailCondition(o.nonComplianceDetailCondition);
+    checkNonComplianceDetailCondition(
+        o.nonComplianceDetailCondition as api.NonComplianceDetailCondition);
     checkUnnamed5221(o.packageNamesToDisable);
   }
   buildCounterComplianceRule--;
@@ -641,8 +643,8 @@
 
 void checkUnnamed5222(core.List<api.ApplicationReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplicationReport(o[0]);
-  checkApplicationReport(o[1]);
+  checkApplicationReport(o[0] as api.ApplicationReport);
+  checkApplicationReport(o[1] as api.ApplicationReport);
 }
 
 core.List<api.Display> buildUnnamed5223() {
@@ -654,8 +656,8 @@
 
 void checkUnnamed5223(core.List<api.Display> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisplay(o[0]);
-  checkDisplay(o[1]);
+  checkDisplay(o[0] as api.Display);
+  checkDisplay(o[1] as api.Display);
 }
 
 core.List<api.HardwareStatus> buildUnnamed5224() {
@@ -667,8 +669,8 @@
 
 void checkUnnamed5224(core.List<api.HardwareStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHardwareStatus(o[0]);
-  checkHardwareStatus(o[1]);
+  checkHardwareStatus(o[0] as api.HardwareStatus);
+  checkHardwareStatus(o[1] as api.HardwareStatus);
 }
 
 core.List<api.MemoryEvent> buildUnnamed5225() {
@@ -680,8 +682,8 @@
 
 void checkUnnamed5225(core.List<api.MemoryEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMemoryEvent(o[0]);
-  checkMemoryEvent(o[1]);
+  checkMemoryEvent(o[0] as api.MemoryEvent);
+  checkMemoryEvent(o[1] as api.MemoryEvent);
 }
 
 core.List<api.NonComplianceDetail> buildUnnamed5226() {
@@ -693,8 +695,8 @@
 
 void checkUnnamed5226(core.List<api.NonComplianceDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNonComplianceDetail(o[0]);
-  checkNonComplianceDetail(o[1]);
+  checkNonComplianceDetail(o[0] as api.NonComplianceDetail);
+  checkNonComplianceDetail(o[1] as api.NonComplianceDetail);
 }
 
 core.List<api.PowerManagementEvent> buildUnnamed5227() {
@@ -706,8 +708,8 @@
 
 void checkUnnamed5227(core.List<api.PowerManagementEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPowerManagementEvent(o[0]);
-  checkPowerManagementEvent(o[1]);
+  checkPowerManagementEvent(o[0] as api.PowerManagementEvent);
+  checkPowerManagementEvent(o[1] as api.PowerManagementEvent);
 }
 
 core.List<core.String> buildUnnamed5228() {
@@ -787,33 +789,33 @@
     unittest.expect(o.appliedPolicyName, unittest.equals('foo'));
     unittest.expect(o.appliedPolicyVersion, unittest.equals('foo'));
     unittest.expect(o.appliedState, unittest.equals('foo'));
-    checkDeviceSettings(o.deviceSettings);
-    checkUserFacingMessage(o.disabledReason);
+    checkDeviceSettings(o.deviceSettings as api.DeviceSettings);
+    checkUserFacingMessage(o.disabledReason as api.UserFacingMessage);
     checkUnnamed5223(o.displays);
     unittest.expect(o.enrollmentTime, unittest.equals('foo'));
     unittest.expect(o.enrollmentTokenData, unittest.equals('foo'));
     unittest.expect(o.enrollmentTokenName, unittest.equals('foo'));
-    checkHardwareInfo(o.hardwareInfo);
+    checkHardwareInfo(o.hardwareInfo as api.HardwareInfo);
     checkUnnamed5224(o.hardwareStatusSamples);
     unittest.expect(o.lastPolicyComplianceReportTime, unittest.equals('foo'));
     unittest.expect(o.lastPolicySyncTime, unittest.equals('foo'));
     unittest.expect(o.lastStatusReportTime, unittest.equals('foo'));
     unittest.expect(o.managementMode, unittest.equals('foo'));
     checkUnnamed5225(o.memoryEvents);
-    checkMemoryInfo(o.memoryInfo);
+    checkMemoryInfo(o.memoryInfo as api.MemoryInfo);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNetworkInfo(o.networkInfo);
+    checkNetworkInfo(o.networkInfo as api.NetworkInfo);
     checkUnnamed5226(o.nonComplianceDetails);
     unittest.expect(o.ownership, unittest.equals('foo'));
     unittest.expect(o.policyCompliant, unittest.isTrue);
     unittest.expect(o.policyName, unittest.equals('foo'));
     checkUnnamed5227(o.powerManagementEvents);
     checkUnnamed5228(o.previousDeviceNames);
-    checkSecurityPosture(o.securityPosture);
-    checkSoftwareInfo(o.softwareInfo);
+    checkSecurityPosture(o.securityPosture as api.SecurityPosture);
+    checkSoftwareInfo(o.softwareInfo as api.SoftwareInfo);
     unittest.expect(o.state, unittest.equals('foo'));
     checkUnnamed5229(o.systemProperties);
-    checkUser(o.user);
+    checkUser(o.user as api.User);
     unittest.expect(o.userName, unittest.equals('foo'));
   }
   buildCounterDevice--;
@@ -927,7 +929,7 @@
     unittest.expect(o.oneTimeOnly, unittest.isTrue);
     unittest.expect(o.policyName, unittest.equals('foo'));
     unittest.expect(o.qrCode, unittest.equals('foo'));
-    checkUser(o.user);
+    checkUser(o.user as api.User);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterEnrollmentToken--;
@@ -955,8 +957,8 @@
 
 void checkUnnamed5231(core.List<api.SigninDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSigninDetail(o[0]);
-  checkSigninDetail(o[1]);
+  checkSigninDetail(o[0] as api.SigninDetail);
+  checkSigninDetail(o[1] as api.SigninDetail);
 }
 
 core.List<api.TermsAndConditions> buildUnnamed5232() {
@@ -968,8 +970,8 @@
 
 void checkUnnamed5232(core.List<api.TermsAndConditions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTermsAndConditions(o[0]);
-  checkTermsAndConditions(o[1]);
+  checkTermsAndConditions(o[0] as api.TermsAndConditions);
+  checkTermsAndConditions(o[1] as api.TermsAndConditions);
 }
 
 core.int buildCounterEnterprise = 0;
@@ -997,7 +999,7 @@
     unittest.expect(o.appAutoApprovalEnabled, unittest.isTrue);
     checkUnnamed5230(o.enabledNotificationTypes);
     unittest.expect(o.enterpriseDisplayName, unittest.equals('foo'));
-    checkExternalData(o.logo);
+    checkExternalData(o.logo as api.ExternalData);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.primaryColor, unittest.equals(42));
     unittest.expect(o.pubsubTopic, unittest.equals('foo'));
@@ -1043,8 +1045,8 @@
 void checkFreezePeriod(api.FreezePeriod o) {
   buildCounterFreezePeriod++;
   if (buildCounterFreezePeriod < 3) {
-    checkDate(o.endDate);
-    checkDate(o.startDate);
+    checkDate(o.endDate as api.Date);
+    checkDate(o.startDate as api.Date);
   }
   buildCounterFreezePeriod--;
 }
@@ -1391,8 +1393,8 @@
 
 void checkUnnamed5247(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDevice(o[0]);
-  checkDevice(o[1]);
+  checkDevice(o[0] as api.Device);
+  checkDevice(o[1] as api.Device);
 }
 
 core.int buildCounterListDevicesResponse = 0;
@@ -1425,8 +1427,8 @@
 
 void checkUnnamed5248(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1459,8 +1461,8 @@
 
 void checkUnnamed5249(core.List<api.Policy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicy(o[0]);
-  checkPolicy(o[1]);
+  checkPolicy(o[0] as api.Policy);
+  checkPolicy(o[1] as api.Policy);
 }
 
 core.int buildCounterListPoliciesResponse = 0;
@@ -1493,8 +1495,8 @@
 
 void checkUnnamed5250(core.List<api.WebApp> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebApp(o[0]);
-  checkWebApp(o[1]);
+  checkWebApp(o[0] as api.WebApp);
+  checkWebApp(o[1] as api.WebApp);
 }
 
 core.int buildCounterListWebAppsResponse = 0;
@@ -1561,8 +1563,8 @@
 
 void checkUnnamed5252(core.List<api.ManagedPropertyEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedPropertyEntry(o[0]);
-  checkManagedPropertyEntry(o[1]);
+  checkManagedPropertyEntry(o[0] as api.ManagedPropertyEntry);
+  checkManagedPropertyEntry(o[1] as api.ManagedPropertyEntry);
 }
 
 core.List<api.ManagedProperty> buildUnnamed5253() {
@@ -1574,8 +1576,8 @@
 
 void checkUnnamed5253(core.List<api.ManagedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedProperty(o[0]);
-  checkManagedProperty(o[1]);
+  checkManagedProperty(o[0] as api.ManagedProperty);
+  checkManagedProperty(o[1] as api.ManagedProperty);
 }
 
 core.int buildCounterManagedProperty = 0;
@@ -1844,7 +1846,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5254(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5255(o.response);
@@ -2040,8 +2042,8 @@
 
 void checkUnnamed5260(core.List<api.PersonalApplicationPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPersonalApplicationPolicy(o[0]);
-  checkPersonalApplicationPolicy(o[1]);
+  checkPersonalApplicationPolicy(o[0] as api.PersonalApplicationPolicy);
+  checkPersonalApplicationPolicy(o[1] as api.PersonalApplicationPolicy);
 }
 
 core.int buildCounterPersonalUsagePolicies = 0;
@@ -2108,8 +2110,8 @@
 
 void checkUnnamed5263(core.List<api.ApplicationPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApplicationPolicy(o[0]);
-  checkApplicationPolicy(o[1]);
+  checkApplicationPolicy(o[0] as api.ApplicationPolicy);
+  checkApplicationPolicy(o[1] as api.ApplicationPolicy);
 }
 
 core.List<api.ChoosePrivateKeyRule> buildUnnamed5264() {
@@ -2121,8 +2123,8 @@
 
 void checkUnnamed5264(core.List<api.ChoosePrivateKeyRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChoosePrivateKeyRule(o[0]);
-  checkChoosePrivateKeyRule(o[1]);
+  checkChoosePrivateKeyRule(o[0] as api.ChoosePrivateKeyRule);
+  checkChoosePrivateKeyRule(o[1] as api.ChoosePrivateKeyRule);
 }
 
 core.List<api.ComplianceRule> buildUnnamed5265() {
@@ -2134,8 +2136,8 @@
 
 void checkUnnamed5265(core.List<api.ComplianceRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComplianceRule(o[0]);
-  checkComplianceRule(o[1]);
+  checkComplianceRule(o[0] as api.ComplianceRule);
+  checkComplianceRule(o[1] as api.ComplianceRule);
 }
 
 core.List<core.String> buildUnnamed5266() {
@@ -2202,8 +2204,8 @@
 
 void checkUnnamed5269(core.List<api.PasswordRequirements> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPasswordRequirements(o[0]);
-  checkPasswordRequirements(o[1]);
+  checkPasswordRequirements(o[0] as api.PasswordRequirements);
+  checkPasswordRequirements(o[1] as api.PasswordRequirements);
 }
 
 core.List<api.PermissionGrant> buildUnnamed5270() {
@@ -2215,8 +2217,8 @@
 
 void checkUnnamed5270(core.List<api.PermissionGrant> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermissionGrant(o[0]);
-  checkPermissionGrant(o[1]);
+  checkPermissionGrant(o[0] as api.PermissionGrant);
+  checkPermissionGrant(o[1] as api.PermissionGrant);
 }
 
 core.List<api.PersistentPreferredActivity> buildUnnamed5271() {
@@ -2228,8 +2230,8 @@
 
 void checkUnnamed5271(core.List<api.PersistentPreferredActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPersistentPreferredActivity(o[0]);
-  checkPersistentPreferredActivity(o[1]);
+  checkPersistentPreferredActivity(o[0] as api.PersistentPreferredActivity);
+  checkPersistentPreferredActivity(o[1] as api.PersistentPreferredActivity);
 }
 
 core.List<api.PolicyEnforcementRule> buildUnnamed5272() {
@@ -2241,8 +2243,8 @@
 
 void checkUnnamed5272(core.List<api.PolicyEnforcementRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicyEnforcementRule(o[0]);
-  checkPolicyEnforcementRule(o[1]);
+  checkPolicyEnforcementRule(o[0] as api.PolicyEnforcementRule);
+  checkPolicyEnforcementRule(o[1] as api.PolicyEnforcementRule);
 }
 
 core.List<api.SetupAction> buildUnnamed5273() {
@@ -2254,8 +2256,8 @@
 
 void checkUnnamed5273(core.List<api.SetupAction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSetupAction(o[0]);
-  checkSetupAction(o[1]);
+  checkSetupAction(o[0] as api.SetupAction);
+  checkSetupAction(o[1] as api.SetupAction);
 }
 
 core.List<core.String> buildUnnamed5274() {
@@ -2368,8 +2370,9 @@
     checkUnnamed5261(o.accountTypesWithManagementDisabled);
     unittest.expect(o.addUserDisabled, unittest.isTrue);
     unittest.expect(o.adjustVolumeDisabled, unittest.isTrue);
-    checkAdvancedSecurityOverrides(o.advancedSecurityOverrides);
-    checkAlwaysOnVpnPackage(o.alwaysOnVpnPackage);
+    checkAdvancedSecurityOverrides(
+        o.advancedSecurityOverrides as api.AdvancedSecurityOverrides);
+    checkAlwaysOnVpnPackage(o.alwaysOnVpnPackage as api.AlwaysOnVpnPackage);
     checkUnnamed5262(o.androidDevicePolicyTracks);
     unittest.expect(o.appAutoUpdatePolicy, unittest.equals('foo'));
     checkUnnamed5263(o.applications);
@@ -2387,7 +2390,8 @@
     unittest.expect(o.dataRoamingDisabled, unittest.isTrue);
     unittest.expect(o.debuggingFeaturesAllowed, unittest.isTrue);
     unittest.expect(o.defaultPermissionPolicy, unittest.equals('foo'));
-    checkUserFacingMessage(o.deviceOwnerLockScreenInfo);
+    checkUserFacingMessage(
+        o.deviceOwnerLockScreenInfo as api.UserFacingMessage);
     unittest.expect(o.encryptionPolicy, unittest.equals('foo'));
     unittest.expect(o.ensureVerifyAppsEnabled, unittest.isTrue);
     unittest.expect(o.factoryResetDisabled, unittest.isTrue);
@@ -2398,9 +2402,9 @@
     unittest.expect(o.keyguardDisabled, unittest.isTrue);
     checkUnnamed5267(o.keyguardDisabledFeatures);
     unittest.expect(o.kioskCustomLauncherEnabled, unittest.isTrue);
-    checkKioskCustomization(o.kioskCustomization);
+    checkKioskCustomization(o.kioskCustomization as api.KioskCustomization);
     unittest.expect(o.locationMode, unittest.equals('foo'));
-    checkUserFacingMessage(o.longSupportMessage);
+    checkUserFacingMessage(o.longSupportMessage as api.UserFacingMessage);
     unittest.expect(o.maximumTimeToLock, unittest.equals('foo'));
     unittest.expect(o.minimumApiLevel, unittest.equals(42));
     unittest.expect(o.mobileNetworksConfigDisabled, unittest.isTrue);
@@ -2413,16 +2417,19 @@
     unittest.expect(o.outgoingBeamDisabled, unittest.isTrue);
     unittest.expect(o.outgoingCallsDisabled, unittest.isTrue);
     checkUnnamed5269(o.passwordPolicies);
-    checkPasswordRequirements(o.passwordRequirements);
+    checkPasswordRequirements(
+        o.passwordRequirements as api.PasswordRequirements);
     checkUnnamed5270(o.permissionGrants);
-    checkPackageNameList(o.permittedAccessibilityServices);
-    checkPackageNameList(o.permittedInputMethods);
+    checkPackageNameList(
+        o.permittedAccessibilityServices as api.PackageNameList);
+    checkPackageNameList(o.permittedInputMethods as api.PackageNameList);
     checkUnnamed5271(o.persistentPreferredActivities);
-    checkPersonalUsagePolicies(o.personalUsagePolicies);
+    checkPersonalUsagePolicies(
+        o.personalUsagePolicies as api.PersonalUsagePolicies);
     unittest.expect(o.playStoreMode, unittest.equals('foo'));
     checkUnnamed5272(o.policyEnforcementRules);
     unittest.expect(o.privateKeySelectionEnabled, unittest.isTrue);
-    checkProxyInfo(o.recommendedGlobalProxy);
+    checkProxyInfo(o.recommendedGlobalProxy as api.ProxyInfo);
     unittest.expect(o.removeUserDisabled, unittest.isTrue);
     unittest.expect(o.safeBootDisabled, unittest.isTrue);
     unittest.expect(o.screenCaptureDisabled, unittest.isTrue);
@@ -2430,13 +2437,14 @@
     unittest.expect(o.setWallpaperDisabled, unittest.isTrue);
     checkUnnamed5273(o.setupActions);
     unittest.expect(o.shareLocationDisabled, unittest.isTrue);
-    checkUserFacingMessage(o.shortSupportMessage);
+    checkUserFacingMessage(o.shortSupportMessage as api.UserFacingMessage);
     unittest.expect(o.skipFirstUseHintsEnabled, unittest.isTrue);
     unittest.expect(o.smsDisabled, unittest.isTrue);
     unittest.expect(o.statusBarDisabled, unittest.isTrue);
-    checkStatusReportingSettings(o.statusReportingSettings);
+    checkStatusReportingSettings(
+        o.statusReportingSettings as api.StatusReportingSettings);
     checkUnnamed5274(o.stayOnPluggedModes);
-    checkSystemUpdate(o.systemUpdate);
+    checkSystemUpdate(o.systemUpdate as api.SystemUpdate);
     unittest.expect(o.tetheringConfigDisabled, unittest.isTrue);
     unittest.expect(o.uninstallAppsDisabled, unittest.isTrue);
     unittest.expect(o.unmuteMicrophoneDisabled, unittest.isTrue);
@@ -2466,9 +2474,9 @@
 void checkPolicyEnforcementRule(api.PolicyEnforcementRule o) {
   buildCounterPolicyEnforcementRule++;
   if (buildCounterPolicyEnforcementRule < 3) {
-    checkBlockAction(o.blockAction);
+    checkBlockAction(o.blockAction as api.BlockAction);
     unittest.expect(o.settingName, unittest.equals('foo'));
-    checkWipeAction(o.wipeAction);
+    checkWipeAction(o.wipeAction as api.WipeAction);
   }
   buildCounterPolicyEnforcementRule--;
 }
@@ -2482,8 +2490,8 @@
 
 void checkUnnamed5275(core.List<api.UserFacingMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserFacingMessage(o[0]);
-  checkUserFacingMessage(o[1]);
+  checkUserFacingMessage(o[0] as api.UserFacingMessage);
+  checkUserFacingMessage(o[1] as api.UserFacingMessage);
 }
 
 core.int buildCounterPostureDetail = 0;
@@ -2577,8 +2585,8 @@
 
 void checkUnnamed5277(core.List<api.PostureDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPostureDetail(o[0]);
-  checkPostureDetail(o[1]);
+  checkPostureDetail(o[0] as api.PostureDetail);
+  checkPostureDetail(o[1] as api.PostureDetail);
 }
 
 core.int buildCounterSecurityPosture = 0;
@@ -2618,9 +2626,9 @@
 void checkSetupAction(api.SetupAction o) {
   buildCounterSetupAction++;
   if (buildCounterSetupAction < 3) {
-    checkUserFacingMessage(o.description);
-    checkLaunchAppAction(o.launchApp);
-    checkUserFacingMessage(o.title);
+    checkUserFacingMessage(o.description as api.UserFacingMessage);
+    checkLaunchAppAction(o.launchApp as api.LaunchAppAction);
+    checkUserFacingMessage(o.title as api.UserFacingMessage);
   }
   buildCounterSetupAction--;
 }
@@ -2705,7 +2713,7 @@
     unittest.expect(o.deviceKernelVersion, unittest.equals('foo'));
     unittest.expect(o.primaryLanguageCode, unittest.equals('foo'));
     unittest.expect(o.securityPatchLevel, unittest.equals('foo'));
-    checkSystemUpdateInfo(o.systemUpdateInfo);
+    checkSystemUpdateInfo(o.systemUpdateInfo as api.SystemUpdateInfo);
   }
   buildCounterSoftwareInfo--;
 }
@@ -2798,7 +2806,8 @@
 void checkStatusReportingSettings(api.StatusReportingSettings o) {
   buildCounterStatusReportingSettings++;
   if (buildCounterStatusReportingSettings < 3) {
-    checkApplicationReportingSettings(o.applicationReportingSettings);
+    checkApplicationReportingSettings(
+        o.applicationReportingSettings as api.ApplicationReportingSettings);
     unittest.expect(o.applicationReportsEnabled, unittest.isTrue);
     unittest.expect(o.deviceSettingsEnabled, unittest.isTrue);
     unittest.expect(o.displayInfoEnabled, unittest.isTrue);
@@ -2821,8 +2830,8 @@
 
 void checkUnnamed5280(core.List<api.FreezePeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFreezePeriod(o[0]);
-  checkFreezePeriod(o[1]);
+  checkFreezePeriod(o[0] as api.FreezePeriod);
+  checkFreezePeriod(o[1] as api.FreezePeriod);
 }
 
 core.int buildCounterSystemUpdate = 0;
@@ -2886,8 +2895,8 @@
 void checkTermsAndConditions(api.TermsAndConditions o) {
   buildCounterTermsAndConditions++;
   if (buildCounterTermsAndConditions < 3) {
-    checkUserFacingMessage(o.content);
-    checkUserFacingMessage(o.header);
+    checkUserFacingMessage(o.content as api.UserFacingMessage);
+    checkUserFacingMessage(o.header as api.UserFacingMessage);
   }
   buildCounterTermsAndConditions--;
 }
@@ -2954,8 +2963,8 @@
 
 void checkUnnamed5282(core.List<api.WebAppIcon> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebAppIcon(o[0]);
-  checkWebAppIcon(o[1]);
+  checkWebAppIcon(o[0] as api.WebAppIcon);
+  checkWebAppIcon(o[1] as api.WebAppIcon);
 }
 
 core.int buildCounterWebApp = 0;
@@ -3098,7 +3107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvancedSecurityOverrides();
       var od = api.AdvancedSecurityOverrides.fromJson(o.toJson());
-      checkAdvancedSecurityOverrides(od);
+      checkAdvancedSecurityOverrides(od as api.AdvancedSecurityOverrides);
     });
   });
 
@@ -3106,7 +3115,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAlwaysOnVpnPackage();
       var od = api.AlwaysOnVpnPackage.fromJson(o.toJson());
-      checkAlwaysOnVpnPackage(od);
+      checkAlwaysOnVpnPackage(od as api.AlwaysOnVpnPackage);
     });
   });
 
@@ -3114,7 +3123,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiLevelCondition();
       var od = api.ApiLevelCondition.fromJson(o.toJson());
-      checkApiLevelCondition(od);
+      checkApiLevelCondition(od as api.ApiLevelCondition);
     });
   });
 
@@ -3122,7 +3131,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppTrackInfo();
       var od = api.AppTrackInfo.fromJson(o.toJson());
-      checkAppTrackInfo(od);
+      checkAppTrackInfo(od as api.AppTrackInfo);
     });
   });
 
@@ -3130,7 +3139,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplication();
       var od = api.Application.fromJson(o.toJson());
-      checkApplication(od);
+      checkApplication(od as api.Application);
     });
   });
 
@@ -3138,7 +3147,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationEvent();
       var od = api.ApplicationEvent.fromJson(o.toJson());
-      checkApplicationEvent(od);
+      checkApplicationEvent(od as api.ApplicationEvent);
     });
   });
 
@@ -3146,7 +3155,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationPermission();
       var od = api.ApplicationPermission.fromJson(o.toJson());
-      checkApplicationPermission(od);
+      checkApplicationPermission(od as api.ApplicationPermission);
     });
   });
 
@@ -3154,7 +3163,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationPolicy();
       var od = api.ApplicationPolicy.fromJson(o.toJson());
-      checkApplicationPolicy(od);
+      checkApplicationPolicy(od as api.ApplicationPolicy);
     });
   });
 
@@ -3162,7 +3171,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationReport();
       var od = api.ApplicationReport.fromJson(o.toJson());
-      checkApplicationReport(od);
+      checkApplicationReport(od as api.ApplicationReport);
     });
   });
 
@@ -3170,7 +3179,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationReportingSettings();
       var od = api.ApplicationReportingSettings.fromJson(o.toJson());
-      checkApplicationReportingSettings(od);
+      checkApplicationReportingSettings(od as api.ApplicationReportingSettings);
     });
   });
 
@@ -3178,7 +3187,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlockAction();
       var od = api.BlockAction.fromJson(o.toJson());
-      checkBlockAction(od);
+      checkBlockAction(od as api.BlockAction);
     });
   });
 
@@ -3186,7 +3195,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChoosePrivateKeyRule();
       var od = api.ChoosePrivateKeyRule.fromJson(o.toJson());
-      checkChoosePrivateKeyRule(od);
+      checkChoosePrivateKeyRule(od as api.ChoosePrivateKeyRule);
     });
   });
 
@@ -3194,7 +3203,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommand();
       var od = api.Command.fromJson(o.toJson());
-      checkCommand(od);
+      checkCommand(od as api.Command);
     });
   });
 
@@ -3202,7 +3211,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComplianceRule();
       var od = api.ComplianceRule.fromJson(o.toJson());
-      checkComplianceRule(od);
+      checkComplianceRule(od as api.ComplianceRule);
     });
   });
 
@@ -3210,7 +3219,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -3218,7 +3227,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevice();
       var od = api.Device.fromJson(o.toJson());
-      checkDevice(od);
+      checkDevice(od as api.Device);
     });
   });
 
@@ -3226,7 +3235,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceSettings();
       var od = api.DeviceSettings.fromJson(o.toJson());
-      checkDeviceSettings(od);
+      checkDeviceSettings(od as api.DeviceSettings);
     });
   });
 
@@ -3234,7 +3243,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisplay();
       var od = api.Display.fromJson(o.toJson());
-      checkDisplay(od);
+      checkDisplay(od as api.Display);
     });
   });
 
@@ -3242,7 +3251,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3250,7 +3259,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnrollmentToken();
       var od = api.EnrollmentToken.fromJson(o.toJson());
-      checkEnrollmentToken(od);
+      checkEnrollmentToken(od as api.EnrollmentToken);
     });
   });
 
@@ -3258,7 +3267,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnterprise();
       var od = api.Enterprise.fromJson(o.toJson());
-      checkEnterprise(od);
+      checkEnterprise(od as api.Enterprise);
     });
   });
 
@@ -3266,7 +3275,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalData();
       var od = api.ExternalData.fromJson(o.toJson());
-      checkExternalData(od);
+      checkExternalData(od as api.ExternalData);
     });
   });
 
@@ -3274,7 +3283,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFreezePeriod();
       var od = api.FreezePeriod.fromJson(o.toJson());
-      checkFreezePeriod(od);
+      checkFreezePeriod(od as api.FreezePeriod);
     });
   });
 
@@ -3282,7 +3291,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHardwareInfo();
       var od = api.HardwareInfo.fromJson(o.toJson());
-      checkHardwareInfo(od);
+      checkHardwareInfo(od as api.HardwareInfo);
     });
   });
 
@@ -3290,7 +3299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHardwareStatus();
       var od = api.HardwareStatus.fromJson(o.toJson());
-      checkHardwareStatus(od);
+      checkHardwareStatus(od as api.HardwareStatus);
     });
   });
 
@@ -3298,7 +3307,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyedAppState();
       var od = api.KeyedAppState.fromJson(o.toJson());
-      checkKeyedAppState(od);
+      checkKeyedAppState(od as api.KeyedAppState);
     });
   });
 
@@ -3306,7 +3315,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKioskCustomization();
       var od = api.KioskCustomization.fromJson(o.toJson());
-      checkKioskCustomization(od);
+      checkKioskCustomization(od as api.KioskCustomization);
     });
   });
 
@@ -3314,7 +3323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLaunchAppAction();
       var od = api.LaunchAppAction.fromJson(o.toJson());
-      checkLaunchAppAction(od);
+      checkLaunchAppAction(od as api.LaunchAppAction);
     });
   });
 
@@ -3322,7 +3331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDevicesResponse();
       var od = api.ListDevicesResponse.fromJson(o.toJson());
-      checkListDevicesResponse(od);
+      checkListDevicesResponse(od as api.ListDevicesResponse);
     });
   });
 
@@ -3330,7 +3339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3338,7 +3347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPoliciesResponse();
       var od = api.ListPoliciesResponse.fromJson(o.toJson());
-      checkListPoliciesResponse(od);
+      checkListPoliciesResponse(od as api.ListPoliciesResponse);
     });
   });
 
@@ -3346,7 +3355,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListWebAppsResponse();
       var od = api.ListWebAppsResponse.fromJson(o.toJson());
-      checkListWebAppsResponse(od);
+      checkListWebAppsResponse(od as api.ListWebAppsResponse);
     });
   });
 
@@ -3354,7 +3363,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedConfigurationTemplate();
       var od = api.ManagedConfigurationTemplate.fromJson(o.toJson());
-      checkManagedConfigurationTemplate(od);
+      checkManagedConfigurationTemplate(od as api.ManagedConfigurationTemplate);
     });
   });
 
@@ -3362,7 +3371,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedProperty();
       var od = api.ManagedProperty.fromJson(o.toJson());
-      checkManagedProperty(od);
+      checkManagedProperty(od as api.ManagedProperty);
     });
   });
 
@@ -3370,7 +3379,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedPropertyEntry();
       var od = api.ManagedPropertyEntry.fromJson(o.toJson());
-      checkManagedPropertyEntry(od);
+      checkManagedPropertyEntry(od as api.ManagedPropertyEntry);
     });
   });
 
@@ -3378,7 +3387,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMemoryEvent();
       var od = api.MemoryEvent.fromJson(o.toJson());
-      checkMemoryEvent(od);
+      checkMemoryEvent(od as api.MemoryEvent);
     });
   });
 
@@ -3386,7 +3395,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMemoryInfo();
       var od = api.MemoryInfo.fromJson(o.toJson());
-      checkMemoryInfo(od);
+      checkMemoryInfo(od as api.MemoryInfo);
     });
   });
 
@@ -3394,7 +3403,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkInfo();
       var od = api.NetworkInfo.fromJson(o.toJson());
-      checkNetworkInfo(od);
+      checkNetworkInfo(od as api.NetworkInfo);
     });
   });
 
@@ -3402,7 +3411,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNonComplianceDetail();
       var od = api.NonComplianceDetail.fromJson(o.toJson());
-      checkNonComplianceDetail(od);
+      checkNonComplianceDetail(od as api.NonComplianceDetail);
     });
   });
 
@@ -3410,7 +3419,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNonComplianceDetailCondition();
       var od = api.NonComplianceDetailCondition.fromJson(o.toJson());
-      checkNonComplianceDetailCondition(od);
+      checkNonComplianceDetailCondition(od as api.NonComplianceDetailCondition);
     });
   });
 
@@ -3418,7 +3427,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3426,7 +3435,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPackageNameList();
       var od = api.PackageNameList.fromJson(o.toJson());
-      checkPackageNameList(od);
+      checkPackageNameList(od as api.PackageNameList);
     });
   });
 
@@ -3434,7 +3443,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPasswordRequirements();
       var od = api.PasswordRequirements.fromJson(o.toJson());
-      checkPasswordRequirements(od);
+      checkPasswordRequirements(od as api.PasswordRequirements);
     });
   });
 
@@ -3442,7 +3451,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionGrant();
       var od = api.PermissionGrant.fromJson(o.toJson());
-      checkPermissionGrant(od);
+      checkPermissionGrant(od as api.PermissionGrant);
     });
   });
 
@@ -3450,7 +3459,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPersistentPreferredActivity();
       var od = api.PersistentPreferredActivity.fromJson(o.toJson());
-      checkPersistentPreferredActivity(od);
+      checkPersistentPreferredActivity(od as api.PersistentPreferredActivity);
     });
   });
 
@@ -3458,7 +3467,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPersonalApplicationPolicy();
       var od = api.PersonalApplicationPolicy.fromJson(o.toJson());
-      checkPersonalApplicationPolicy(od);
+      checkPersonalApplicationPolicy(od as api.PersonalApplicationPolicy);
     });
   });
 
@@ -3466,7 +3475,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPersonalUsagePolicies();
       var od = api.PersonalUsagePolicies.fromJson(o.toJson());
-      checkPersonalUsagePolicies(od);
+      checkPersonalUsagePolicies(od as api.PersonalUsagePolicies);
     });
   });
 
@@ -3474,7 +3483,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -3482,7 +3491,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyEnforcementRule();
       var od = api.PolicyEnforcementRule.fromJson(o.toJson());
-      checkPolicyEnforcementRule(od);
+      checkPolicyEnforcementRule(od as api.PolicyEnforcementRule);
     });
   });
 
@@ -3490,7 +3499,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostureDetail();
       var od = api.PostureDetail.fromJson(o.toJson());
-      checkPostureDetail(od);
+      checkPostureDetail(od as api.PostureDetail);
     });
   });
 
@@ -3498,7 +3507,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPowerManagementEvent();
       var od = api.PowerManagementEvent.fromJson(o.toJson());
-      checkPowerManagementEvent(od);
+      checkPowerManagementEvent(od as api.PowerManagementEvent);
     });
   });
 
@@ -3506,7 +3515,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProxyInfo();
       var od = api.ProxyInfo.fromJson(o.toJson());
-      checkProxyInfo(od);
+      checkProxyInfo(od as api.ProxyInfo);
     });
   });
 
@@ -3514,7 +3523,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPosture();
       var od = api.SecurityPosture.fromJson(o.toJson());
-      checkSecurityPosture(od);
+      checkSecurityPosture(od as api.SecurityPosture);
     });
   });
 
@@ -3522,7 +3531,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetupAction();
       var od = api.SetupAction.fromJson(o.toJson());
-      checkSetupAction(od);
+      checkSetupAction(od as api.SetupAction);
     });
   });
 
@@ -3530,7 +3539,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSigninDetail();
       var od = api.SigninDetail.fromJson(o.toJson());
-      checkSigninDetail(od);
+      checkSigninDetail(od as api.SigninDetail);
     });
   });
 
@@ -3538,7 +3547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignupUrl();
       var od = api.SignupUrl.fromJson(o.toJson());
-      checkSignupUrl(od);
+      checkSignupUrl(od as api.SignupUrl);
     });
   });
 
@@ -3546,7 +3555,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSoftwareInfo();
       var od = api.SoftwareInfo.fromJson(o.toJson());
-      checkSoftwareInfo(od);
+      checkSoftwareInfo(od as api.SoftwareInfo);
     });
   });
 
@@ -3554,7 +3563,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3562,7 +3571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatusReportingSettings();
       var od = api.StatusReportingSettings.fromJson(o.toJson());
-      checkStatusReportingSettings(od);
+      checkStatusReportingSettings(od as api.StatusReportingSettings);
     });
   });
 
@@ -3570,7 +3579,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemUpdate();
       var od = api.SystemUpdate.fromJson(o.toJson());
-      checkSystemUpdate(od);
+      checkSystemUpdate(od as api.SystemUpdate);
     });
   });
 
@@ -3578,7 +3587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemUpdateInfo();
       var od = api.SystemUpdateInfo.fromJson(o.toJson());
-      checkSystemUpdateInfo(od);
+      checkSystemUpdateInfo(od as api.SystemUpdateInfo);
     });
   });
 
@@ -3586,7 +3595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTermsAndConditions();
       var od = api.TermsAndConditions.fromJson(o.toJson());
-      checkTermsAndConditions(od);
+      checkTermsAndConditions(od as api.TermsAndConditions);
     });
   });
 
@@ -3594,7 +3603,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -3602,7 +3611,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserFacingMessage();
       var od = api.UserFacingMessage.fromJson(o.toJson());
-      checkUserFacingMessage(od);
+      checkUserFacingMessage(od as api.UserFacingMessage);
     });
   });
 
@@ -3610,7 +3619,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebApp();
       var od = api.WebApp.fromJson(o.toJson());
-      checkWebApp(od);
+      checkWebApp(od as api.WebApp);
     });
   });
 
@@ -3618,7 +3627,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebAppIcon();
       var od = api.WebAppIcon.fromJson(o.toJson());
-      checkWebAppIcon(od);
+      checkWebAppIcon(od as api.WebAppIcon);
     });
   });
 
@@ -3626,7 +3635,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebToken();
       var od = api.WebToken.fromJson(o.toJson());
-      checkWebToken(od);
+      checkWebToken(od as api.WebToken);
     });
   });
 
@@ -3634,7 +3643,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWipeAction();
       var od = api.WipeAction.fromJson(o.toJson());
-      checkWipeAction(od);
+      checkWipeAction(od as api.WipeAction);
     });
   });
 
@@ -3648,8 +3657,9 @@
       var arg_signupUrlName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Enterprise.fromJson(json);
-        checkEnterprise(obj);
+        var obj = api.Enterprise.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnterprise(obj as api.Enterprise);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3698,7 +3708,7 @@
               signupUrlName: arg_signupUrlName,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprise(response);
+        checkEnterprise(response as api.Enterprise);
       })));
     });
 
@@ -3746,7 +3756,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprise(response);
+        checkEnterprise(response as api.Enterprise);
       })));
     });
 
@@ -3758,8 +3768,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Enterprise.fromJson(json);
-        checkEnterprise(obj);
+        var obj = api.Enterprise.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnterprise(obj as api.Enterprise);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3802,7 +3813,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnterprise(response);
+        checkEnterprise(response as api.Enterprise);
       })));
     });
   });
@@ -3855,7 +3866,7 @@
       res
           .get(arg_name, languageCode: arg_languageCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApplication(response);
+        checkApplication(response as api.Application);
       })));
     });
   });
@@ -3914,7 +3925,7 @@
               wipeReasonMessage: arg_wipeReasonMessage,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3962,7 +3973,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
 
@@ -3973,8 +3984,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Command.fromJson(json);
-        checkCommand(obj);
+        var obj =
+            api.Command.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCommand(obj as api.Command);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4014,7 +4026,7 @@
       res
           .issueCommand(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4071,7 +4083,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDevicesResponse(response);
+        checkListDevicesResponse(response as api.ListDevicesResponse);
       })));
     });
 
@@ -4083,8 +4095,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Device.fromJson(json);
-        checkDevice(obj);
+        var obj =
+            api.Device.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDevice(obj as api.Device);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4127,7 +4140,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
   });
@@ -4177,7 +4190,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4225,7 +4238,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4273,7 +4286,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4333,7 +4346,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -4346,8 +4359,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EnrollmentToken.fromJson(json);
-        checkEnrollmentToken(obj);
+        var obj = api.EnrollmentToken.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnrollmentToken(obj as api.EnrollmentToken);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4387,7 +4401,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnrollmentToken(response);
+        checkEnrollmentToken(response as api.EnrollmentToken);
       })));
     });
 
@@ -4435,7 +4449,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -4485,7 +4499,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4533,7 +4547,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4590,7 +4604,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPoliciesResponse(response);
+        checkListPoliciesResponse(response as api.ListPoliciesResponse);
       })));
     });
 
@@ -4602,8 +4616,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Policy.fromJson(json);
-        checkPolicy(obj);
+        var obj =
+            api.Policy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPolicy(obj as api.Policy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4646,7 +4661,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
   });
@@ -4659,8 +4674,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WebApp.fromJson(json);
-        checkWebApp(obj);
+        var obj =
+            api.WebApp.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkWebApp(obj as api.WebApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4700,7 +4716,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebApp(response);
+        checkWebApp(response as api.WebApp);
       })));
     });
 
@@ -4748,7 +4764,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4796,7 +4812,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebApp(response);
+        checkWebApp(response as api.WebApp);
       })));
     });
 
@@ -4853,7 +4869,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListWebAppsResponse(response);
+        checkListWebAppsResponse(response as api.ListWebAppsResponse);
       })));
     });
 
@@ -4865,8 +4881,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WebApp.fromJson(json);
-        checkWebApp(obj);
+        var obj =
+            api.WebApp.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkWebApp(obj as api.WebApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4909,7 +4926,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebApp(response);
+        checkWebApp(response as api.WebApp);
       })));
     });
   });
@@ -4922,8 +4939,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WebToken.fromJson(json);
-        checkWebToken(obj);
+        var obj =
+            api.WebToken.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkWebToken(obj as api.WebToken);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4963,7 +4981,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebToken(response);
+        checkWebToken(response as api.WebToken);
       })));
     });
   });
@@ -5020,7 +5038,7 @@
               projectId: arg_projectId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSignupUrl(response);
+        checkSignupUrl(response as api.SignupUrl);
       })));
     });
   });
diff --git a/generated/googleapis/test/androidpublisher/v3_test.dart b/generated/googleapis/test/androidpublisher/v3_test.dart
index 9eb4cba..4425276 100644
--- a/generated/googleapis/test/androidpublisher/v3_test.dart
+++ b/generated/googleapis/test/androidpublisher/v3_test.dart
@@ -89,7 +89,7 @@
 void checkApk(api.Apk o) {
   buildCounterApk++;
   if (buildCounterApk < 3) {
-    checkApkBinary(o.binary);
+    checkApkBinary(o.binary as api.ApkBinary);
     unittest.expect(o.versionCode, unittest.equals(42));
   }
   buildCounterApk--;
@@ -130,7 +130,7 @@
 void checkApksAddExternallyHostedRequest(api.ApksAddExternallyHostedRequest o) {
   buildCounterApksAddExternallyHostedRequest++;
   if (buildCounterApksAddExternallyHostedRequest < 3) {
-    checkExternallyHostedApk(o.externallyHostedApk);
+    checkExternallyHostedApk(o.externallyHostedApk as api.ExternallyHostedApk);
   }
   buildCounterApksAddExternallyHostedRequest--;
 }
@@ -150,7 +150,7 @@
     api.ApksAddExternallyHostedResponse o) {
   buildCounterApksAddExternallyHostedResponse++;
   if (buildCounterApksAddExternallyHostedResponse < 3) {
-    checkExternallyHostedApk(o.externallyHostedApk);
+    checkExternallyHostedApk(o.externallyHostedApk as api.ExternallyHostedApk);
   }
   buildCounterApksAddExternallyHostedResponse--;
 }
@@ -164,8 +164,8 @@
 
 void checkUnnamed1345(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApk(o[0]);
-  checkApk(o[1]);
+  checkApk(o[0] as api.Apk);
+  checkApk(o[1] as api.Apk);
 }
 
 core.int buildCounterApksListResponse = 0;
@@ -267,8 +267,8 @@
 
 void checkUnnamed1346(core.List<api.Bundle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBundle(o[0]);
-  checkBundle(o[1]);
+  checkBundle(o[0] as api.Bundle);
+  checkBundle(o[1] as api.Bundle);
 }
 
 core.int buildCounterBundlesListResponse = 0;
@@ -307,8 +307,8 @@
 void checkComment(api.Comment o) {
   buildCounterComment++;
   if (buildCounterComment < 3) {
-    checkDeveloperComment(o.developerComment);
-    checkUserComment(o.userComment);
+    checkDeveloperComment(o.developerComment as api.DeveloperComment);
+    checkUserComment(o.userComment as api.UserComment);
   }
   buildCounterComment--;
 }
@@ -381,7 +381,7 @@
     api.DeobfuscationFilesUploadResponse o) {
   buildCounterDeobfuscationFilesUploadResponse++;
   if (buildCounterDeobfuscationFilesUploadResponse < 3) {
-    checkDeobfuscationFile(o.deobfuscationFile);
+    checkDeobfuscationFile(o.deobfuscationFile as api.DeobfuscationFile);
   }
   buildCounterDeobfuscationFilesUploadResponse--;
 }
@@ -401,7 +401,7 @@
 void checkDeveloperComment(api.DeveloperComment o) {
   buildCounterDeveloperComment++;
   if (buildCounterDeveloperComment < 3) {
-    checkTimestamp(o.lastModified);
+    checkTimestamp(o.lastModified as api.Timestamp);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterDeveloperComment--;
@@ -530,7 +530,7 @@
 void checkExpansionFilesUploadResponse(api.ExpansionFilesUploadResponse o) {
   buildCounterExpansionFilesUploadResponse++;
   if (buildCounterExpansionFilesUploadResponse < 3) {
-    checkExpansionFile(o.expansionFile);
+    checkExpansionFile(o.expansionFile as api.ExpansionFile);
   }
   buildCounterExpansionFilesUploadResponse--;
 }
@@ -583,8 +583,8 @@
 
 void checkUnnamed1353(core.List<api.UsesPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsesPermission(o[0]);
-  checkUsesPermission(o[1]);
+  checkUsesPermission(o[0] as api.UsesPermission);
+  checkUsesPermission(o[1] as api.UsesPermission);
 }
 
 core.int buildCounterExternallyHostedApk = 0;
@@ -668,8 +668,8 @@
 
 void checkUnnamed1354(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImage(o[0]);
-  checkImage(o[1]);
+  checkImage(o[0] as api.Image);
+  checkImage(o[1] as api.Image);
 }
 
 core.int buildCounterImagesDeleteAllResponse = 0;
@@ -700,8 +700,8 @@
 
 void checkUnnamed1355(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImage(o[0]);
-  checkImage(o[1]);
+  checkImage(o[0] as api.Image);
+  checkImage(o[1] as api.Image);
 }
 
 core.int buildCounterImagesListResponse = 0;
@@ -737,7 +737,7 @@
 void checkImagesUploadResponse(api.ImagesUploadResponse o) {
   buildCounterImagesUploadResponse++;
   if (buildCounterImagesUploadResponse < 3) {
-    checkImage(o.image);
+    checkImage(o.image as api.Image);
   }
   buildCounterImagesUploadResponse--;
 }
@@ -751,8 +751,8 @@
 
 void checkUnnamed1356(core.Map<core.String, api.InAppProductListing> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInAppProductListing(o['x']);
-  checkInAppProductListing(o['y']);
+  checkInAppProductListing(o['x'] as api.InAppProductListing);
+  checkInAppProductListing(o['y'] as api.InAppProductListing);
 }
 
 core.Map<core.String, api.Price> buildUnnamed1357() {
@@ -764,8 +764,8 @@
 
 void checkUnnamed1357(core.Map<core.String, api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPrice(o['x']);
-  checkPrice(o['y']);
+  checkPrice(o['x'] as api.Price);
+  checkPrice(o['y'] as api.Price);
 }
 
 core.int buildCounterInAppProduct = 0;
@@ -793,7 +793,7 @@
   buildCounterInAppProduct++;
   if (buildCounterInAppProduct < 3) {
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
-    checkPrice(o.defaultPrice);
+    checkPrice(o.defaultPrice as api.Price);
     unittest.expect(o.gracePeriod, unittest.equals('foo'));
     checkUnnamed1356(o.listings);
     unittest.expect(o.packageName, unittest.equals('foo'));
@@ -852,8 +852,8 @@
 
 void checkUnnamed1359(core.List<api.InAppProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInAppProduct(o[0]);
-  checkInAppProduct(o[1]);
+  checkInAppProduct(o[0] as api.InAppProduct);
+  checkInAppProduct(o[1] as api.InAppProduct);
 }
 
 core.int buildCounterInappproductsListResponse = 0;
@@ -875,8 +875,8 @@
   if (buildCounterInappproductsListResponse < 3) {
     checkUnnamed1359(o.inappproduct);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
-    checkTokenPagination(o.tokenPagination);
+    checkPageInfo(o.pageInfo as api.PageInfo);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
   }
   buildCounterInappproductsListResponse--;
 }
@@ -965,8 +965,8 @@
 
 void checkUnnamed1360(core.List<api.Listing> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkListing(o[0]);
-  checkListing(o[1]);
+  checkListing(o[0] as api.Listing);
+  checkListing(o[1] as api.Listing);
 }
 
 core.int buildCounterListingsListResponse = 0;
@@ -1130,8 +1130,8 @@
 
 void checkUnnamed1361(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComment(o[0]);
-  checkComment(o[1]);
+  checkComment(o[0] as api.Comment);
+  checkComment(o[1] as api.Comment);
 }
 
 core.int buildCounterReview = 0;
@@ -1172,7 +1172,7 @@
 void checkReviewReplyResult(api.ReviewReplyResult o) {
   buildCounterReviewReplyResult++;
   if (buildCounterReviewReplyResult < 3) {
-    checkTimestamp(o.lastEdited);
+    checkTimestamp(o.lastEdited as api.Timestamp);
     unittest.expect(o.replyText, unittest.equals('foo'));
   }
   buildCounterReviewReplyResult--;
@@ -1187,8 +1187,8 @@
 
 void checkUnnamed1362(core.List<api.Review> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReview(o[0]);
-  checkReview(o[1]);
+  checkReview(o[0] as api.Review);
+  checkReview(o[1] as api.Review);
 }
 
 core.int buildCounterReviewsListResponse = 0;
@@ -1207,9 +1207,9 @@
 void checkReviewsListResponse(api.ReviewsListResponse o) {
   buildCounterReviewsListResponse++;
   if (buildCounterReviewsListResponse < 3) {
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     checkUnnamed1362(o.reviews);
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
   }
   buildCounterReviewsListResponse--;
 }
@@ -1247,7 +1247,7 @@
 void checkReviewsReplyResponse(api.ReviewsReplyResponse o) {
   buildCounterReviewsReplyResponse++;
   if (buildCounterReviewsReplyResponse < 3) {
-    checkReviewReplyResult(o.result);
+    checkReviewReplyResult(o.result as api.ReviewReplyResult);
   }
   buildCounterReviewsReplyResponse--;
 }
@@ -1309,7 +1309,7 @@
 void checkSubscriptionPriceChange(api.SubscriptionPriceChange o) {
   buildCounterSubscriptionPriceChange++;
   if (buildCounterSubscriptionPriceChange < 3) {
-    checkPrice(o.newPrice);
+    checkPrice(o.newPrice as api.Price);
     unittest.expect(o.state, unittest.equals(42));
   }
   buildCounterSubscriptionPriceChange--;
@@ -1361,7 +1361,8 @@
     unittest.expect(o.autoRenewing, unittest.isTrue);
     unittest.expect(o.autoResumeTimeMillis, unittest.equals('foo'));
     unittest.expect(o.cancelReason, unittest.equals(42));
-    checkSubscriptionCancelSurveyResult(o.cancelSurveyResult);
+    checkSubscriptionCancelSurveyResult(
+        o.cancelSurveyResult as api.SubscriptionCancelSurveyResult);
     unittest.expect(o.countryCode, unittest.equals('foo'));
     unittest.expect(o.developerPayload, unittest.equals('foo'));
     unittest.expect(o.emailAddress, unittest.equals('foo'));
@@ -1369,7 +1370,8 @@
     unittest.expect(o.externalAccountId, unittest.equals('foo'));
     unittest.expect(o.familyName, unittest.equals('foo'));
     unittest.expect(o.givenName, unittest.equals('foo'));
-    checkIntroductoryPriceInfo(o.introductoryPriceInfo);
+    checkIntroductoryPriceInfo(
+        o.introductoryPriceInfo as api.IntroductoryPriceInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.linkedPurchaseToken, unittest.equals('foo'));
     unittest.expect(o.obfuscatedExternalAccountId, unittest.equals('foo'));
@@ -1377,7 +1379,7 @@
     unittest.expect(o.orderId, unittest.equals('foo'));
     unittest.expect(o.paymentState, unittest.equals(42));
     unittest.expect(o.priceAmountMicros, unittest.equals('foo'));
-    checkSubscriptionPriceChange(o.priceChange);
+    checkSubscriptionPriceChange(o.priceChange as api.SubscriptionPriceChange);
     unittest.expect(o.priceCurrencyCode, unittest.equals('foo'));
     unittest.expect(o.profileId, unittest.equals('foo'));
     unittest.expect(o.profileName, unittest.equals('foo'));
@@ -1426,7 +1428,8 @@
     api.SubscriptionPurchasesDeferRequest o) {
   buildCounterSubscriptionPurchasesDeferRequest++;
   if (buildCounterSubscriptionPurchasesDeferRequest < 3) {
-    checkSubscriptionDeferralInfo(o.deferralInfo);
+    checkSubscriptionDeferralInfo(
+        o.deferralInfo as api.SubscriptionDeferralInfo);
   }
   buildCounterSubscriptionPurchasesDeferRequest--;
 }
@@ -1461,8 +1464,8 @@
 
 void checkUnnamed1363(core.List<api.Variant> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariant(o[0]);
-  checkVariant(o[1]);
+  checkVariant(o[0] as api.Variant);
+  checkVariant(o[1] as api.Variant);
 }
 
 core.int buildCounterSystemApksListResponse = 0;
@@ -1567,8 +1570,8 @@
 
 void checkUnnamed1365(core.List<api.TrackRelease> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrackRelease(o[0]);
-  checkTrackRelease(o[1]);
+  checkTrackRelease(o[0] as api.TrackRelease);
+  checkTrackRelease(o[1] as api.TrackRelease);
 }
 
 core.int buildCounterTrack = 0;
@@ -1601,8 +1604,8 @@
 
 void checkUnnamed1366(core.List<api.LocalizedText> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalizedText(o[0]);
-  checkLocalizedText(o[1]);
+  checkLocalizedText(o[0] as api.LocalizedText);
+  checkLocalizedText(o[1] as api.LocalizedText);
 }
 
 core.List<core.String> buildUnnamed1367() {
@@ -1638,7 +1641,7 @@
 void checkTrackRelease(api.TrackRelease o) {
   buildCounterTrackRelease++;
   if (buildCounterTrackRelease < 3) {
-    checkCountryTargeting(o.countryTargeting);
+    checkCountryTargeting(o.countryTargeting as api.CountryTargeting);
     unittest.expect(o.inAppUpdatePriority, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1366(o.releaseNotes);
@@ -1658,8 +1661,8 @@
 
 void checkUnnamed1368(core.List<api.Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrack(o[0]);
-  checkTrack(o[1]);
+  checkTrack(o[0] as api.Track);
+  checkTrack(o[1] as api.Track);
 }
 
 core.int buildCounterTracksListResponse = 0;
@@ -1712,8 +1715,8 @@
     unittest.expect(o.appVersionCode, unittest.equals(42));
     unittest.expect(o.appVersionName, unittest.equals('foo'));
     unittest.expect(o.device, unittest.equals('foo'));
-    checkDeviceMetadata(o.deviceMetadata);
-    checkTimestamp(o.lastModified);
+    checkDeviceMetadata(o.deviceMetadata as api.DeviceMetadata);
+    checkTimestamp(o.lastModified as api.Timestamp);
     unittest.expect(o.originalText, unittest.equals('foo'));
     unittest.expect(o.reviewerLanguage, unittest.equals('foo'));
     unittest.expect(o.starRating, unittest.equals(42));
@@ -1760,7 +1763,7 @@
 void checkVariant(api.Variant o) {
   buildCounterVariant++;
   if (buildCounterVariant < 3) {
-    checkDeviceSpec(o.deviceSpec);
+    checkDeviceSpec(o.deviceSpec as api.DeviceSpec);
     unittest.expect(o.variantId, unittest.equals(42));
   }
   buildCounterVariant--;
@@ -1806,8 +1809,8 @@
 
 void checkUnnamed1369(core.List<api.VoidedPurchase> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVoidedPurchase(o[0]);
-  checkVoidedPurchase(o[1]);
+  checkVoidedPurchase(o[0] as api.VoidedPurchase);
+  checkVoidedPurchase(o[1] as api.VoidedPurchase);
 }
 
 core.int buildCounterVoidedPurchasesListResponse = 0;
@@ -1826,8 +1829,8 @@
 void checkVoidedPurchasesListResponse(api.VoidedPurchasesListResponse o) {
   buildCounterVoidedPurchasesListResponse++;
   if (buildCounterVoidedPurchasesListResponse < 3) {
-    checkPageInfo(o.pageInfo);
-    checkTokenPagination(o.tokenPagination);
+    checkPageInfo(o.pageInfo as api.PageInfo);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     checkUnnamed1369(o.voidedPurchases);
   }
   buildCounterVoidedPurchasesListResponse--;
@@ -1838,7 +1841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApk();
       var od = api.Apk.fromJson(o.toJson());
-      checkApk(od);
+      checkApk(od as api.Apk);
     });
   });
 
@@ -1846,7 +1849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApkBinary();
       var od = api.ApkBinary.fromJson(o.toJson());
-      checkApkBinary(od);
+      checkApkBinary(od as api.ApkBinary);
     });
   });
 
@@ -1854,7 +1857,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildApksAddExternallyHostedRequest();
       var od = api.ApksAddExternallyHostedRequest.fromJson(o.toJson());
-      checkApksAddExternallyHostedRequest(od);
+      checkApksAddExternallyHostedRequest(
+          od as api.ApksAddExternallyHostedRequest);
     });
   });
 
@@ -1862,7 +1866,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildApksAddExternallyHostedResponse();
       var od = api.ApksAddExternallyHostedResponse.fromJson(o.toJson());
-      checkApksAddExternallyHostedResponse(od);
+      checkApksAddExternallyHostedResponse(
+          od as api.ApksAddExternallyHostedResponse);
     });
   });
 
@@ -1870,7 +1875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApksListResponse();
       var od = api.ApksListResponse.fromJson(o.toJson());
-      checkApksListResponse(od);
+      checkApksListResponse(od as api.ApksListResponse);
     });
   });
 
@@ -1878,7 +1883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppDetails();
       var od = api.AppDetails.fromJson(o.toJson());
-      checkAppDetails(od);
+      checkAppDetails(od as api.AppDetails);
     });
   });
 
@@ -1886,7 +1891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppEdit();
       var od = api.AppEdit.fromJson(o.toJson());
-      checkAppEdit(od);
+      checkAppEdit(od as api.AppEdit);
     });
   });
 
@@ -1894,7 +1899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBundle();
       var od = api.Bundle.fromJson(o.toJson());
-      checkBundle(od);
+      checkBundle(od as api.Bundle);
     });
   });
 
@@ -1902,7 +1907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBundlesListResponse();
       var od = api.BundlesListResponse.fromJson(o.toJson());
-      checkBundlesListResponse(od);
+      checkBundlesListResponse(od as api.BundlesListResponse);
     });
   });
 
@@ -1910,7 +1915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComment();
       var od = api.Comment.fromJson(o.toJson());
-      checkComment(od);
+      checkComment(od as api.Comment);
     });
   });
 
@@ -1918,7 +1923,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCountryTargeting();
       var od = api.CountryTargeting.fromJson(o.toJson());
-      checkCountryTargeting(od);
+      checkCountryTargeting(od as api.CountryTargeting);
     });
   });
 
@@ -1926,7 +1931,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeobfuscationFile();
       var od = api.DeobfuscationFile.fromJson(o.toJson());
-      checkDeobfuscationFile(od);
+      checkDeobfuscationFile(od as api.DeobfuscationFile);
     });
   });
 
@@ -1934,7 +1939,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeobfuscationFilesUploadResponse();
       var od = api.DeobfuscationFilesUploadResponse.fromJson(o.toJson());
-      checkDeobfuscationFilesUploadResponse(od);
+      checkDeobfuscationFilesUploadResponse(
+          od as api.DeobfuscationFilesUploadResponse);
     });
   });
 
@@ -1942,7 +1948,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeveloperComment();
       var od = api.DeveloperComment.fromJson(o.toJson());
-      checkDeveloperComment(od);
+      checkDeveloperComment(od as api.DeveloperComment);
     });
   });
 
@@ -1950,7 +1956,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceMetadata();
       var od = api.DeviceMetadata.fromJson(o.toJson());
-      checkDeviceMetadata(od);
+      checkDeviceMetadata(od as api.DeviceMetadata);
     });
   });
 
@@ -1958,7 +1964,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceSpec();
       var od = api.DeviceSpec.fromJson(o.toJson());
-      checkDeviceSpec(od);
+      checkDeviceSpec(od as api.DeviceSpec);
     });
   });
 
@@ -1966,7 +1972,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpansionFile();
       var od = api.ExpansionFile.fromJson(o.toJson());
-      checkExpansionFile(od);
+      checkExpansionFile(od as api.ExpansionFile);
     });
   });
 
@@ -1974,7 +1980,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpansionFilesUploadResponse();
       var od = api.ExpansionFilesUploadResponse.fromJson(o.toJson());
-      checkExpansionFilesUploadResponse(od);
+      checkExpansionFilesUploadResponse(od as api.ExpansionFilesUploadResponse);
     });
   });
 
@@ -1982,7 +1988,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternallyHostedApk();
       var od = api.ExternallyHostedApk.fromJson(o.toJson());
-      checkExternallyHostedApk(od);
+      checkExternallyHostedApk(od as api.ExternallyHostedApk);
     });
   });
 
@@ -1990,7 +1996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImage();
       var od = api.Image.fromJson(o.toJson());
-      checkImage(od);
+      checkImage(od as api.Image);
     });
   });
 
@@ -1998,7 +2004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImagesDeleteAllResponse();
       var od = api.ImagesDeleteAllResponse.fromJson(o.toJson());
-      checkImagesDeleteAllResponse(od);
+      checkImagesDeleteAllResponse(od as api.ImagesDeleteAllResponse);
     });
   });
 
@@ -2006,7 +2012,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImagesListResponse();
       var od = api.ImagesListResponse.fromJson(o.toJson());
-      checkImagesListResponse(od);
+      checkImagesListResponse(od as api.ImagesListResponse);
     });
   });
 
@@ -2014,7 +2020,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImagesUploadResponse();
       var od = api.ImagesUploadResponse.fromJson(o.toJson());
-      checkImagesUploadResponse(od);
+      checkImagesUploadResponse(od as api.ImagesUploadResponse);
     });
   });
 
@@ -2022,7 +2028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInAppProduct();
       var od = api.InAppProduct.fromJson(o.toJson());
-      checkInAppProduct(od);
+      checkInAppProduct(od as api.InAppProduct);
     });
   });
 
@@ -2030,7 +2036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInAppProductListing();
       var od = api.InAppProductListing.fromJson(o.toJson());
-      checkInAppProductListing(od);
+      checkInAppProductListing(od as api.InAppProductListing);
     });
   });
 
@@ -2038,7 +2044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInappproductsListResponse();
       var od = api.InappproductsListResponse.fromJson(o.toJson());
-      checkInappproductsListResponse(od);
+      checkInappproductsListResponse(od as api.InappproductsListResponse);
     });
   });
 
@@ -2046,7 +2052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInternalAppSharingArtifact();
       var od = api.InternalAppSharingArtifact.fromJson(o.toJson());
-      checkInternalAppSharingArtifact(od);
+      checkInternalAppSharingArtifact(od as api.InternalAppSharingArtifact);
     });
   });
 
@@ -2054,7 +2060,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntroductoryPriceInfo();
       var od = api.IntroductoryPriceInfo.fromJson(o.toJson());
-      checkIntroductoryPriceInfo(od);
+      checkIntroductoryPriceInfo(od as api.IntroductoryPriceInfo);
     });
   });
 
@@ -2062,7 +2068,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListing();
       var od = api.Listing.fromJson(o.toJson());
-      checkListing(od);
+      checkListing(od as api.Listing);
     });
   });
 
@@ -2070,7 +2076,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListingsListResponse();
       var od = api.ListingsListResponse.fromJson(o.toJson());
-      checkListingsListResponse(od);
+      checkListingsListResponse(od as api.ListingsListResponse);
     });
   });
 
@@ -2078,7 +2084,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizedText();
       var od = api.LocalizedText.fromJson(o.toJson());
-      checkLocalizedText(od);
+      checkLocalizedText(od as api.LocalizedText);
     });
   });
 
@@ -2086,7 +2092,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageInfo();
       var od = api.PageInfo.fromJson(o.toJson());
-      checkPageInfo(od);
+      checkPageInfo(od as api.PageInfo);
     });
   });
 
@@ -2094,7 +2100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrice();
       var od = api.Price.fromJson(o.toJson());
-      checkPrice(od);
+      checkPrice(od as api.Price);
     });
   });
 
@@ -2102,7 +2108,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductPurchase();
       var od = api.ProductPurchase.fromJson(o.toJson());
-      checkProductPurchase(od);
+      checkProductPurchase(od as api.ProductPurchase);
     });
   });
 
@@ -2110,7 +2116,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductPurchasesAcknowledgeRequest();
       var od = api.ProductPurchasesAcknowledgeRequest.fromJson(o.toJson());
-      checkProductPurchasesAcknowledgeRequest(od);
+      checkProductPurchasesAcknowledgeRequest(
+          od as api.ProductPurchasesAcknowledgeRequest);
     });
   });
 
@@ -2118,7 +2125,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReview();
       var od = api.Review.fromJson(o.toJson());
-      checkReview(od);
+      checkReview(od as api.Review);
     });
   });
 
@@ -2126,7 +2133,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReviewReplyResult();
       var od = api.ReviewReplyResult.fromJson(o.toJson());
-      checkReviewReplyResult(od);
+      checkReviewReplyResult(od as api.ReviewReplyResult);
     });
   });
 
@@ -2134,7 +2141,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReviewsListResponse();
       var od = api.ReviewsListResponse.fromJson(o.toJson());
-      checkReviewsListResponse(od);
+      checkReviewsListResponse(od as api.ReviewsListResponse);
     });
   });
 
@@ -2142,7 +2149,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReviewsReplyRequest();
       var od = api.ReviewsReplyRequest.fromJson(o.toJson());
-      checkReviewsReplyRequest(od);
+      checkReviewsReplyRequest(od as api.ReviewsReplyRequest);
     });
   });
 
@@ -2150,7 +2157,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReviewsReplyResponse();
       var od = api.ReviewsReplyResponse.fromJson(o.toJson());
-      checkReviewsReplyResponse(od);
+      checkReviewsReplyResponse(od as api.ReviewsReplyResponse);
     });
   });
 
@@ -2158,7 +2165,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionCancelSurveyResult();
       var od = api.SubscriptionCancelSurveyResult.fromJson(o.toJson());
-      checkSubscriptionCancelSurveyResult(od);
+      checkSubscriptionCancelSurveyResult(
+          od as api.SubscriptionCancelSurveyResult);
     });
   });
 
@@ -2166,7 +2174,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionDeferralInfo();
       var od = api.SubscriptionDeferralInfo.fromJson(o.toJson());
-      checkSubscriptionDeferralInfo(od);
+      checkSubscriptionDeferralInfo(od as api.SubscriptionDeferralInfo);
     });
   });
 
@@ -2174,7 +2182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionPriceChange();
       var od = api.SubscriptionPriceChange.fromJson(o.toJson());
-      checkSubscriptionPriceChange(od);
+      checkSubscriptionPriceChange(od as api.SubscriptionPriceChange);
     });
   });
 
@@ -2182,7 +2190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionPurchase();
       var od = api.SubscriptionPurchase.fromJson(o.toJson());
-      checkSubscriptionPurchase(od);
+      checkSubscriptionPurchase(od as api.SubscriptionPurchase);
     });
   });
 
@@ -2190,7 +2198,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionPurchasesAcknowledgeRequest();
       var od = api.SubscriptionPurchasesAcknowledgeRequest.fromJson(o.toJson());
-      checkSubscriptionPurchasesAcknowledgeRequest(od);
+      checkSubscriptionPurchasesAcknowledgeRequest(
+          od as api.SubscriptionPurchasesAcknowledgeRequest);
     });
   });
 
@@ -2198,7 +2207,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionPurchasesDeferRequest();
       var od = api.SubscriptionPurchasesDeferRequest.fromJson(o.toJson());
-      checkSubscriptionPurchasesDeferRequest(od);
+      checkSubscriptionPurchasesDeferRequest(
+          od as api.SubscriptionPurchasesDeferRequest);
     });
   });
 
@@ -2206,7 +2216,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionPurchasesDeferResponse();
       var od = api.SubscriptionPurchasesDeferResponse.fromJson(o.toJson());
-      checkSubscriptionPurchasesDeferResponse(od);
+      checkSubscriptionPurchasesDeferResponse(
+          od as api.SubscriptionPurchasesDeferResponse);
     });
   });
 
@@ -2214,7 +2225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemApksListResponse();
       var od = api.SystemApksListResponse.fromJson(o.toJson());
-      checkSystemApksListResponse(od);
+      checkSystemApksListResponse(od as api.SystemApksListResponse);
     });
   });
 
@@ -2222,7 +2233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTesters();
       var od = api.Testers.fromJson(o.toJson());
-      checkTesters(od);
+      checkTesters(od as api.Testers);
     });
   });
 
@@ -2230,7 +2241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimestamp();
       var od = api.Timestamp.fromJson(o.toJson());
-      checkTimestamp(od);
+      checkTimestamp(od as api.Timestamp);
     });
   });
 
@@ -2238,7 +2249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTokenPagination();
       var od = api.TokenPagination.fromJson(o.toJson());
-      checkTokenPagination(od);
+      checkTokenPagination(od as api.TokenPagination);
     });
   });
 
@@ -2246,7 +2257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrack();
       var od = api.Track.fromJson(o.toJson());
-      checkTrack(od);
+      checkTrack(od as api.Track);
     });
   });
 
@@ -2254,7 +2265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrackRelease();
       var od = api.TrackRelease.fromJson(o.toJson());
-      checkTrackRelease(od);
+      checkTrackRelease(od as api.TrackRelease);
     });
   });
 
@@ -2262,7 +2273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTracksListResponse();
       var od = api.TracksListResponse.fromJson(o.toJson());
-      checkTracksListResponse(od);
+      checkTracksListResponse(od as api.TracksListResponse);
     });
   });
 
@@ -2270,7 +2281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserComment();
       var od = api.UserComment.fromJson(o.toJson());
-      checkUserComment(od);
+      checkUserComment(od as api.UserComment);
     });
   });
 
@@ -2278,7 +2289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsesPermission();
       var od = api.UsesPermission.fromJson(o.toJson());
-      checkUsesPermission(od);
+      checkUsesPermission(od as api.UsesPermission);
     });
   });
 
@@ -2286,7 +2297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVariant();
       var od = api.Variant.fromJson(o.toJson());
-      checkVariant(od);
+      checkVariant(od as api.Variant);
     });
   });
 
@@ -2294,7 +2305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVoidedPurchase();
       var od = api.VoidedPurchase.fromJson(o.toJson());
-      checkVoidedPurchase(od);
+      checkVoidedPurchase(od as api.VoidedPurchase);
     });
   });
 
@@ -2302,7 +2313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVoidedPurchasesListResponse();
       var od = api.VoidedPurchasesListResponse.fromJson(o.toJson());
-      checkVoidedPurchasesListResponse(od);
+      checkVoidedPurchasesListResponse(od as api.VoidedPurchasesListResponse);
     });
   });
 
@@ -2369,7 +2380,7 @@
       res
           .commit(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppEdit(response);
+        checkAppEdit(response as api.AppEdit);
       })));
     });
 
@@ -2487,7 +2498,7 @@
       res
           .get(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppEdit(response);
+        checkAppEdit(response as api.AppEdit);
       })));
     });
 
@@ -2498,8 +2509,9 @@
       var arg_packageName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AppEdit.fromJson(json);
-        checkAppEdit(obj);
+        var obj =
+            api.AppEdit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAppEdit(obj as api.AppEdit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2547,7 +2559,7 @@
       res
           .insert(arg_request, arg_packageName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppEdit(response);
+        checkAppEdit(response as api.AppEdit);
       })));
     });
 
@@ -2613,7 +2625,7 @@
       res
           .validate(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppEdit(response);
+        checkAppEdit(response as api.AppEdit);
       })));
     });
   });
@@ -2627,8 +2639,10 @@
       var arg_editId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ApksAddExternallyHostedRequest.fromJson(json);
-        checkApksAddExternallyHostedRequest(obj);
+        var obj = api.ApksAddExternallyHostedRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkApksAddExternallyHostedRequest(
+            obj as api.ApksAddExternallyHostedRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2686,7 +2700,8 @@
           .addexternallyhosted(arg_request, arg_packageName, arg_editId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApksAddExternallyHostedResponse(response);
+        checkApksAddExternallyHostedResponse(
+            response as api.ApksAddExternallyHostedResponse);
       })));
     });
 
@@ -2752,7 +2767,7 @@
       res
           .list(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApksListResponse(response);
+        checkApksListResponse(response as api.ApksListResponse);
       })));
     });
 
@@ -2821,7 +2836,7 @@
       res
           .upload(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApk(response);
+        checkApk(response as api.Apk);
       })));
     });
   });
@@ -2889,7 +2904,7 @@
       res
           .list(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBundlesListResponse(response);
+        checkBundlesListResponse(response as api.BundlesListResponse);
       })));
     });
 
@@ -2963,7 +2978,7 @@
               ackBundleInstallationWarning: arg_ackBundleInstallationWarning,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBundle(response);
+        checkBundle(response as api.Bundle);
       })));
     });
   });
@@ -3050,7 +3065,8 @@
               arg_deobfuscationFileType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeobfuscationFilesUploadResponse(response);
+        checkDeobfuscationFilesUploadResponse(
+            response as api.DeobfuscationFilesUploadResponse);
       })));
     });
   });
@@ -3118,7 +3134,7 @@
       res
           .get(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppDetails(response);
+        checkAppDetails(response as api.AppDetails);
       })));
     });
 
@@ -3130,8 +3146,9 @@
       var arg_editId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AppDetails.fromJson(json);
-        checkAppDetails(obj);
+        var obj = api.AppDetails.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAppDetails(obj as api.AppDetails);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3188,7 +3205,7 @@
       res
           .patch(arg_request, arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppDetails(response);
+        checkAppDetails(response as api.AppDetails);
       })));
     });
 
@@ -3200,8 +3217,9 @@
       var arg_editId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AppDetails.fromJson(json);
-        checkAppDetails(obj);
+        var obj = api.AppDetails.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAppDetails(obj as api.AppDetails);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3259,7 +3277,7 @@
           .update(arg_request, arg_packageName, arg_editId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppDetails(response);
+        checkAppDetails(response as api.AppDetails);
       })));
     });
   });
@@ -3343,7 +3361,7 @@
               arg_expansionFileType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExpansionFile(response);
+        checkExpansionFile(response as api.ExpansionFile);
       })));
     });
 
@@ -3357,8 +3375,9 @@
       var arg_expansionFileType = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExpansionFile.fromJson(json);
-        checkExpansionFile(obj);
+        var obj = api.ExpansionFile.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExpansionFile(obj as api.ExpansionFile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3429,7 +3448,7 @@
               arg_expansionFileType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExpansionFile(response);
+        checkExpansionFile(response as api.ExpansionFile);
       })));
     });
 
@@ -3443,8 +3462,9 @@
       var arg_expansionFileType = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExpansionFile.fromJson(json);
-        checkExpansionFile(obj);
+        var obj = api.ExpansionFile.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExpansionFile(obj as api.ExpansionFile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3515,7 +3535,7 @@
               arg_expansionFileType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExpansionFile(response);
+        checkExpansionFile(response as api.ExpansionFile);
       })));
     });
 
@@ -3600,7 +3620,8 @@
               arg_expansionFileType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExpansionFilesUploadResponse(response);
+        checkExpansionFilesUploadResponse(
+            response as api.ExpansionFilesUploadResponse);
       })));
     });
   });
@@ -3773,7 +3794,7 @@
           .deleteall(arg_packageName, arg_editId, arg_language, arg_imageType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImagesDeleteAllResponse(response);
+        checkImagesDeleteAllResponse(response as api.ImagesDeleteAllResponse);
       })));
     });
 
@@ -3854,7 +3875,7 @@
           .list(arg_packageName, arg_editId, arg_language, arg_imageType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImagesListResponse(response);
+        checkImagesListResponse(response as api.ImagesListResponse);
       })));
     });
 
@@ -3938,7 +3959,7 @@
           .upload(arg_packageName, arg_editId, arg_language, arg_imageType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImagesUploadResponse(response);
+        checkImagesUploadResponse(response as api.ImagesUploadResponse);
       })));
     });
   });
@@ -4143,7 +4164,7 @@
       res
           .get(arg_packageName, arg_editId, arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListing(response);
+        checkListing(response as api.Listing);
       })));
     });
 
@@ -4209,7 +4230,7 @@
       res
           .list(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListingsListResponse(response);
+        checkListingsListResponse(response as api.ListingsListResponse);
       })));
     });
 
@@ -4222,8 +4243,9 @@
       var arg_language = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Listing.fromJson(json);
-        checkListing(obj);
+        var obj =
+            api.Listing.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkListing(obj as api.Listing);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4284,7 +4306,7 @@
           .patch(arg_request, arg_packageName, arg_editId, arg_language,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListing(response);
+        checkListing(response as api.Listing);
       })));
     });
 
@@ -4297,8 +4319,9 @@
       var arg_language = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Listing.fromJson(json);
-        checkListing(obj);
+        var obj =
+            api.Listing.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkListing(obj as api.Listing);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4359,7 +4382,7 @@
           .update(arg_request, arg_packageName, arg_editId, arg_language,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListing(response);
+        checkListing(response as api.Listing);
       })));
     });
   });
@@ -4431,7 +4454,7 @@
       res
           .get(arg_packageName, arg_editId, arg_track, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTesters(response);
+        checkTesters(response as api.Testers);
       })));
     });
 
@@ -4444,8 +4467,9 @@
       var arg_track = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Testers.fromJson(json);
-        checkTesters(obj);
+        var obj =
+            api.Testers.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTesters(obj as api.Testers);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4506,7 +4530,7 @@
           .patch(arg_request, arg_packageName, arg_editId, arg_track,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTesters(response);
+        checkTesters(response as api.Testers);
       })));
     });
 
@@ -4519,8 +4543,9 @@
       var arg_track = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Testers.fromJson(json);
-        checkTesters(obj);
+        var obj =
+            api.Testers.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTesters(obj as api.Testers);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4581,7 +4606,7 @@
           .update(arg_request, arg_packageName, arg_editId, arg_track,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTesters(response);
+        checkTesters(response as api.Testers);
       })));
     });
   });
@@ -4653,7 +4678,7 @@
       res
           .get(arg_packageName, arg_editId, arg_track, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrack(response);
+        checkTrack(response as api.Track);
       })));
     });
 
@@ -4719,7 +4744,7 @@
       res
           .list(arg_packageName, arg_editId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTracksListResponse(response);
+        checkTracksListResponse(response as api.TracksListResponse);
       })));
     });
 
@@ -4732,8 +4757,9 @@
       var arg_track = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Track.fromJson(json);
-        checkTrack(obj);
+        var obj =
+            api.Track.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTrack(obj as api.Track);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4794,7 +4820,7 @@
           .patch(arg_request, arg_packageName, arg_editId, arg_track,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrack(response);
+        checkTrack(response as api.Track);
       })));
     });
 
@@ -4807,8 +4833,9 @@
       var arg_track = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Track.fromJson(json);
-        checkTrack(obj);
+        var obj =
+            api.Track.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTrack(obj as api.Track);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4869,7 +4896,7 @@
           .update(arg_request, arg_packageName, arg_editId, arg_track,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrack(response);
+        checkTrack(response as api.Track);
       })));
     });
   });
@@ -4989,7 +5016,7 @@
       res
           .get(arg_packageName, arg_sku, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInAppProduct(response);
+        checkInAppProduct(response as api.InAppProduct);
       })));
     });
 
@@ -5001,8 +5028,9 @@
       var arg_autoConvertMissingPrices = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InAppProduct.fromJson(json);
-        checkInAppProduct(obj);
+        var obj = api.InAppProduct.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInAppProduct(obj as api.InAppProduct);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5054,7 +5082,7 @@
               autoConvertMissingPrices: arg_autoConvertMissingPrices,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInAppProduct(response);
+        checkInAppProduct(response as api.InAppProduct);
       })));
     });
 
@@ -5122,7 +5150,8 @@
               token: arg_token,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInappproductsListResponse(response);
+        checkInappproductsListResponse(
+            response as api.InappproductsListResponse);
       })));
     });
 
@@ -5135,8 +5164,9 @@
       var arg_autoConvertMissingPrices = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InAppProduct.fromJson(json);
-        checkInAppProduct(obj);
+        var obj = api.InAppProduct.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInAppProduct(obj as api.InAppProduct);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5191,7 +5221,7 @@
               autoConvertMissingPrices: arg_autoConvertMissingPrices,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInAppProduct(response);
+        checkInAppProduct(response as api.InAppProduct);
       })));
     });
 
@@ -5204,8 +5234,9 @@
       var arg_autoConvertMissingPrices = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InAppProduct.fromJson(json);
-        checkInAppProduct(obj);
+        var obj = api.InAppProduct.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInAppProduct(obj as api.InAppProduct);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5260,7 +5291,7 @@
               autoConvertMissingPrices: arg_autoConvertMissingPrices,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInAppProduct(response);
+        checkInAppProduct(response as api.InAppProduct);
       })));
     });
   });
@@ -5323,7 +5354,8 @@
       res
           .uploadapk(arg_packageName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInternalAppSharingArtifact(response);
+        checkInternalAppSharingArtifact(
+            response as api.InternalAppSharingArtifact);
       })));
     });
 
@@ -5384,7 +5416,8 @@
       res
           .uploadbundle(arg_packageName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInternalAppSharingArtifact(response);
+        checkInternalAppSharingArtifact(
+            response as api.InternalAppSharingArtifact);
       })));
     });
   });
@@ -5469,8 +5502,10 @@
       var arg_token = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProductPurchasesAcknowledgeRequest.fromJson(json);
-        checkProductPurchasesAcknowledgeRequest(obj);
+        var obj = api.ProductPurchasesAcknowledgeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProductPurchasesAcknowledgeRequest(
+            obj as api.ProductPurchasesAcknowledgeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5605,7 +5640,7 @@
       res
           .get(arg_packageName, arg_productId, arg_token, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductPurchase(response);
+        checkProductPurchase(response as api.ProductPurchase);
       })));
     });
   });
@@ -5620,8 +5655,10 @@
       var arg_token = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SubscriptionPurchasesAcknowledgeRequest.fromJson(json);
-        checkSubscriptionPurchasesAcknowledgeRequest(obj);
+        var obj = api.SubscriptionPurchasesAcknowledgeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubscriptionPurchasesAcknowledgeRequest(
+            obj as api.SubscriptionPurchasesAcknowledgeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5764,8 +5801,10 @@
       var arg_token = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SubscriptionPurchasesDeferRequest.fromJson(json);
-        checkSubscriptionPurchasesDeferRequest(obj);
+        var obj = api.SubscriptionPurchasesDeferRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubscriptionPurchasesDeferRequest(
+            obj as api.SubscriptionPurchasesDeferRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5833,7 +5872,8 @@
           .defer(arg_request, arg_packageName, arg_subscriptionId, arg_token,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscriptionPurchasesDeferResponse(response);
+        checkSubscriptionPurchasesDeferResponse(
+            response as api.SubscriptionPurchasesDeferResponse);
       })));
     });
 
@@ -5904,7 +5944,7 @@
           .get(arg_packageName, arg_subscriptionId, arg_token,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscriptionPurchase(response);
+        checkSubscriptionPurchase(response as api.SubscriptionPurchase);
       })));
     });
 
@@ -6136,7 +6176,8 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVoidedPurchasesListResponse(response);
+        checkVoidedPurchasesListResponse(
+            response as api.VoidedPurchasesListResponse);
       })));
     });
   });
@@ -6203,7 +6244,7 @@
               translationLanguage: arg_translationLanguage,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReview(response);
+        checkReview(response as api.Review);
       })));
     });
 
@@ -6275,7 +6316,7 @@
               translationLanguage: arg_translationLanguage,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReviewsListResponse(response);
+        checkReviewsListResponse(response as api.ReviewsListResponse);
       })));
     });
 
@@ -6287,8 +6328,9 @@
       var arg_reviewId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReviewsReplyRequest.fromJson(json);
-        checkReviewsReplyRequest(obj);
+        var obj = api.ReviewsReplyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReviewsReplyRequest(obj as api.ReviewsReplyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6346,7 +6388,7 @@
           .reply(arg_request, arg_packageName, arg_reviewId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReviewsReplyResponse(response);
+        checkReviewsReplyResponse(response as api.ReviewsReplyResponse);
       })));
     });
   });
@@ -6360,8 +6402,9 @@
       var arg_versionCode = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Variant.fromJson(json);
-        checkVariant(obj);
+        var obj =
+            api.Variant.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVariant(obj as api.Variant);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6419,7 +6462,7 @@
           .create(arg_request, arg_packageName, arg_versionCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariant(response);
+        checkVariant(response as api.Variant);
       })));
     });
 
@@ -6568,7 +6611,7 @@
           .get(arg_packageName, arg_versionCode, arg_variantId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariant(response);
+        checkVariant(response as api.Variant);
       })));
     });
 
@@ -6634,7 +6677,7 @@
       res
           .list(arg_packageName, arg_versionCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSystemApksListResponse(response);
+        checkSystemApksListResponse(response as api.SystemApksListResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/apigee/v1_test.dart b/generated/googleapis/test/apigee/v1_test.dart
index 7b59566..073717e 100644
--- a/generated/googleapis/test/apigee/v1_test.dart
+++ b/generated/googleapis/test/apigee/v1_test.dart
@@ -155,9 +155,12 @@
 void checkGoogleCloudApigeeV1Access(api.GoogleCloudApigeeV1Access o) {
   buildCounterGoogleCloudApigeeV1Access++;
   if (buildCounterGoogleCloudApigeeV1Access < 3) {
-    checkGoogleCloudApigeeV1AccessGet(o.Get);
-    checkGoogleCloudApigeeV1AccessRemove(o.Remove);
-    checkGoogleCloudApigeeV1AccessSet(o.Set);
+    checkGoogleCloudApigeeV1AccessGet(
+        o.Get as api.GoogleCloudApigeeV1AccessGet);
+    checkGoogleCloudApigeeV1AccessRemove(
+        o.Remove as api.GoogleCloudApigeeV1AccessRemove);
+    checkGoogleCloudApigeeV1AccessSet(
+        o.Set as api.GoogleCloudApigeeV1AccessSet);
   }
   buildCounterGoogleCloudApigeeV1Access--;
 }
@@ -245,7 +248,8 @@
   buildCounterGoogleCloudApigeeV1Alias++;
   if (buildCounterGoogleCloudApigeeV1Alias < 3) {
     unittest.expect(o.alias, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1Certificate(o.certsInfo);
+    checkGoogleCloudApigeeV1Certificate(
+        o.certsInfo as api.GoogleCloudApigeeV1Certificate);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGoogleCloudApigeeV1Alias--;
@@ -294,7 +298,8 @@
 void checkGoogleCloudApigeeV1ApiCategory(api.GoogleCloudApigeeV1ApiCategory o) {
   buildCounterGoogleCloudApigeeV1ApiCategory++;
   if (buildCounterGoogleCloudApigeeV1ApiCategory < 3) {
-    checkGoogleCloudApigeeV1ApiCategoryData(o.data);
+    checkGoogleCloudApigeeV1ApiCategoryData(
+        o.data as api.GoogleCloudApigeeV1ApiCategoryData);
     unittest.expect(o.errorCode, unittest.equals('foo'));
     unittest.expect(o.message, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
@@ -352,8 +357,8 @@
 
 void checkUnnamed4949(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.List<core.String> buildUnnamed4950() {
@@ -432,7 +437,8 @@
     checkUnnamed4950(o.environments);
     unittest.expect(o.lastModifiedAt, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1OperationGroup(o.operationGroup);
+    checkGoogleCloudApigeeV1OperationGroup(
+        o.operationGroup as api.GoogleCloudApigeeV1OperationGroup);
     checkUnnamed4951(o.proxies);
     unittest.expect(o.quota, unittest.equals('foo'));
     unittest.expect(o.quotaInterval, unittest.equals('foo'));
@@ -495,7 +501,8 @@
   buildCounterGoogleCloudApigeeV1ApiProxy++;
   if (buildCounterGoogleCloudApigeeV1ApiProxy < 3) {
     unittest.expect(o.latestRevisionId, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1EntityMetadata(o.metaData);
+    checkGoogleCloudApigeeV1EntityMetadata(
+        o.metaData as api.GoogleCloudApigeeV1EntityMetadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4953(o.revision);
   }
@@ -683,7 +690,8 @@
   buildCounterGoogleCloudApigeeV1ApiProxyRevision++;
   if (buildCounterGoogleCloudApigeeV1ApiProxyRevision < 3) {
     checkUnnamed4954(o.basepaths);
-    checkGoogleCloudApigeeV1ConfigVersion(o.configurationVersion);
+    checkGoogleCloudApigeeV1ConfigVersion(
+        o.configurationVersion as api.GoogleCloudApigeeV1ConfigVersion);
     unittest.expect(o.contextInfo, unittest.equals('foo'));
     unittest.expect(o.createdAt, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -694,7 +702,8 @@
     checkUnnamed4956(o.policies);
     checkUnnamed4957(o.proxies);
     checkUnnamed4958(o.proxyEndpoints);
-    checkGoogleCloudApigeeV1ResourceFiles(o.resourceFiles);
+    checkGoogleCloudApigeeV1ResourceFiles(
+        o.resourceFiles as api.GoogleCloudApigeeV1ResourceFiles);
     checkUnnamed4959(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     checkUnnamed4960(o.sharedFlows);
@@ -744,8 +753,10 @@
 
 void checkUnnamed4965(core.List<api.GoogleCloudApigeeV1ApiProductRef> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ApiProductRef(o[0]);
-  checkGoogleCloudApigeeV1ApiProductRef(o[1]);
+  checkGoogleCloudApigeeV1ApiProductRef(
+      o[0] as api.GoogleCloudApigeeV1ApiProductRef);
+  checkGoogleCloudApigeeV1ApiProductRef(
+      o[1] as api.GoogleCloudApigeeV1ApiProductRef);
 }
 
 core.List<api.GoogleCloudApigeeV1Attribute> buildUnnamed4966() {
@@ -757,8 +768,8 @@
 
 void checkUnnamed4966(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.List<api.GoogleCloudApigeeV1Credential> buildUnnamed4967() {
@@ -770,8 +781,8 @@
 
 void checkUnnamed4967(core.List<api.GoogleCloudApigeeV1Credential> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Credential(o[0]);
-  checkGoogleCloudApigeeV1Credential(o[1]);
+  checkGoogleCloudApigeeV1Credential(o[0] as api.GoogleCloudApigeeV1Credential);
+  checkGoogleCloudApigeeV1Credential(o[1] as api.GoogleCloudApigeeV1Credential);
 }
 
 core.List<core.String> buildUnnamed4968() {
@@ -859,9 +870,11 @@
     unittest.expect(o.error, unittest.equals('foo'));
     unittest.expect(o.executionTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1QueryMetadata(o.queryParams);
+    checkGoogleCloudApigeeV1QueryMetadata(
+        o.queryParams as api.GoogleCloudApigeeV1QueryMetadata);
     unittest.expect(o.reportDefinitionId, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1AsyncQueryResult(o.result);
+    checkGoogleCloudApigeeV1AsyncQueryResult(
+        o.result as api.GoogleCloudApigeeV1AsyncQueryResult);
     unittest.expect(o.resultFileSize, unittest.equals('foo'));
     unittest.expect(o.resultRows, unittest.equals('foo'));
     unittest.expect(o.self, unittest.equals('foo'));
@@ -924,8 +937,8 @@
 
 void checkUnnamed4969(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Attributes = 0;
@@ -1008,8 +1021,8 @@
 
 void checkUnnamed4971(core.List<api.GoogleCloudApigeeV1CertInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1CertInfo(o[0]);
-  checkGoogleCloudApigeeV1CertInfo(o[1]);
+  checkGoogleCloudApigeeV1CertInfo(o[0] as api.GoogleCloudApigeeV1CertInfo);
+  checkGoogleCloudApigeeV1CertInfo(o[1] as api.GoogleCloudApigeeV1CertInfo);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Certificate = 0;
@@ -1085,8 +1098,10 @@
 
 void checkUnnamed4972(core.List<api.GoogleCloudApigeeV1ApiProductRef> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ApiProductRef(o[0]);
-  checkGoogleCloudApigeeV1ApiProductRef(o[1]);
+  checkGoogleCloudApigeeV1ApiProductRef(
+      o[0] as api.GoogleCloudApigeeV1ApiProductRef);
+  checkGoogleCloudApigeeV1ApiProductRef(
+      o[1] as api.GoogleCloudApigeeV1ApiProductRef);
 }
 
 core.List<api.GoogleCloudApigeeV1Attribute> buildUnnamed4973() {
@@ -1098,8 +1113,8 @@
 
 void checkUnnamed4973(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.List<core.String> buildUnnamed4974() {
@@ -1183,8 +1198,10 @@
 
 void checkUnnamed4977(core.List<api.GoogleCloudApigeeV1CustomReportMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1CustomReportMetric(o[0]);
-  checkGoogleCloudApigeeV1CustomReportMetric(o[1]);
+  checkGoogleCloudApigeeV1CustomReportMetric(
+      o[0] as api.GoogleCloudApigeeV1CustomReportMetric);
+  checkGoogleCloudApigeeV1CustomReportMetric(
+      o[1] as api.GoogleCloudApigeeV1CustomReportMetric);
 }
 
 core.List<api.GoogleCloudApigeeV1ReportProperty> buildUnnamed4978() {
@@ -1196,8 +1213,10 @@
 
 void checkUnnamed4978(core.List<api.GoogleCloudApigeeV1ReportProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ReportProperty(o[0]);
-  checkGoogleCloudApigeeV1ReportProperty(o[1]);
+  checkGoogleCloudApigeeV1ReportProperty(
+      o[0] as api.GoogleCloudApigeeV1ReportProperty);
+  checkGoogleCloudApigeeV1ReportProperty(
+      o[1] as api.GoogleCloudApigeeV1ReportProperty);
 }
 
 core.List<core.String> buildUnnamed4979() {
@@ -1355,7 +1374,8 @@
   buildCounterGoogleCloudApigeeV1Datastore++;
   if (buildCounterGoogleCloudApigeeV1Datastore < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1DatastoreConfig(o.datastoreConfig);
+    checkGoogleCloudApigeeV1DatastoreConfig(
+        o.datastoreConfig as api.GoogleCloudApigeeV1DatastoreConfig);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.lastUpdateTime, unittest.equals('foo'));
     unittest.expect(o.org, unittest.equals('foo'));
@@ -1593,8 +1613,8 @@
 
 void checkUnnamed4989(core.List<api.GoogleCloudApigeeV1Point> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Point(o[0]);
-  checkGoogleCloudApigeeV1Point(o[1]);
+  checkGoogleCloudApigeeV1Point(o[0] as api.GoogleCloudApigeeV1Point);
+  checkGoogleCloudApigeeV1Point(o[1] as api.GoogleCloudApigeeV1Point);
 }
 
 core.int buildCounterGoogleCloudApigeeV1DebugSessionTransaction = 0;
@@ -1650,8 +1670,8 @@
 
 void checkUnnamed4990(core.List<api.GoogleRpcStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleRpcStatus(o[0]);
-  checkGoogleRpcStatus(o[1]);
+  checkGoogleRpcStatus(o[0] as api.GoogleRpcStatus);
+  checkGoogleRpcStatus(o[1] as api.GoogleRpcStatus);
 }
 
 core.List<api.GoogleCloudApigeeV1InstanceDeploymentStatus> buildUnnamed4991() {
@@ -1664,8 +1684,10 @@
 void checkUnnamed4991(
     core.List<api.GoogleCloudApigeeV1InstanceDeploymentStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1InstanceDeploymentStatus(o[0]);
-  checkGoogleCloudApigeeV1InstanceDeploymentStatus(o[1]);
+  checkGoogleCloudApigeeV1InstanceDeploymentStatus(
+      o[0] as api.GoogleCloudApigeeV1InstanceDeploymentStatus);
+  checkGoogleCloudApigeeV1InstanceDeploymentStatus(
+      o[1] as api.GoogleCloudApigeeV1InstanceDeploymentStatus);
 }
 
 core.List<api.GoogleCloudApigeeV1PodStatus> buildUnnamed4992() {
@@ -1677,8 +1699,8 @@
 
 void checkUnnamed4992(core.List<api.GoogleCloudApigeeV1PodStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1PodStatus(o[0]);
-  checkGoogleCloudApigeeV1PodStatus(o[1]);
+  checkGoogleCloudApigeeV1PodStatus(o[0] as api.GoogleCloudApigeeV1PodStatus);
+  checkGoogleCloudApigeeV1PodStatus(o[1] as api.GoogleCloudApigeeV1PodStatus);
 }
 
 core.List<api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict>
@@ -1692,8 +1714,10 @@
 void checkUnnamed4993(
     core.List<api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(o[0]);
-  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(o[1]);
+  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(
+      o[0] as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict);
+  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(
+      o[1] as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Deployment = 0;
@@ -1742,8 +1766,10 @@
 void checkUnnamed4994(
     core.List<api.GoogleCloudApigeeV1DeploymentChangeReportRoutingChange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingChange(o[0]);
-  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingChange(o[1]);
+  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingChange(
+      o[0] as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingChange);
+  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingChange(
+      o[1] as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingChange);
 }
 
 core.List<api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict>
@@ -1757,8 +1783,10 @@
 void checkUnnamed4995(
     core.List<api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(o[0]);
-  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(o[1]);
+  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(
+      o[0] as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict);
+  checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(
+      o[1] as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict);
 }
 
 core.int buildCounterGoogleCloudApigeeV1DeploymentChangeReport = 0;
@@ -1781,7 +1809,8 @@
   if (buildCounterGoogleCloudApigeeV1DeploymentChangeReport < 3) {
     checkUnnamed4994(o.routingChanges);
     checkUnnamed4995(o.routingConflicts);
-    checkGoogleRpcPreconditionFailure(o.validationErrors);
+    checkGoogleRpcPreconditionFailure(
+        o.validationErrors as api.GoogleRpcPreconditionFailure);
   }
   buildCounterGoogleCloudApigeeV1DeploymentChangeReport--;
 }
@@ -1811,10 +1840,12 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.environmentGroup, unittest.equals('foo'));
     checkGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment(
-        o.fromDeployment);
+        o.fromDeployment
+            as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment);
     unittest.expect(o.shouldSequenceRollout, unittest.isTrue);
     checkGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment(
-        o.toDeployment);
+        o.toDeployment
+            as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment);
   }
   buildCounterGoogleCloudApigeeV1DeploymentChangeReportRoutingChange--;
 }
@@ -1842,7 +1873,8 @@
   if (buildCounterGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict <
       3) {
     checkGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment(
-        o.conflictingDeployment);
+        o.conflictingDeployment
+            as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.environmentGroup, unittest.equals('foo'));
   }
@@ -1945,8 +1977,8 @@
 
 void checkUnnamed4998(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.List<core.String> buildUnnamed4999() {
@@ -2029,8 +2061,8 @@
 
 void checkUnnamed5001(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.List<api.GoogleCloudApigeeV1Credential> buildUnnamed5002() {
@@ -2042,8 +2074,8 @@
 
 void checkUnnamed5002(core.List<api.GoogleCloudApigeeV1Credential> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Credential(o[0]);
-  checkGoogleCloudApigeeV1Credential(o[1]);
+  checkGoogleCloudApigeeV1Credential(o[0] as api.GoogleCloudApigeeV1Credential);
+  checkGoogleCloudApigeeV1Credential(o[1] as api.GoogleCloudApigeeV1Credential);
 }
 
 core.List<core.String> buildUnnamed5003() {
@@ -2141,8 +2173,8 @@
 
 void checkUnnamed5005(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.List<core.String> buildUnnamed5006() {
@@ -2202,8 +2234,8 @@
 
 void checkUnnamed5007(core.List<api.GoogleCloudApigeeV1Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Metric(o[0]);
-  checkGoogleCloudApigeeV1Metric(o[1]);
+  checkGoogleCloudApigeeV1Metric(o[0] as api.GoogleCloudApigeeV1Metric);
+  checkGoogleCloudApigeeV1Metric(o[1] as api.GoogleCloudApigeeV1Metric);
 }
 
 core.int buildCounterGoogleCloudApigeeV1DimensionMetric = 0;
@@ -2277,7 +2309,8 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.lastModifiedAt, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1Properties(o.properties);
+    checkGoogleCloudApigeeV1Properties(
+        o.properties as api.GoogleCloudApigeeV1Properties);
   }
   buildCounterGoogleCloudApigeeV1Environment--;
 }
@@ -2291,8 +2324,10 @@
 
 void checkUnnamed5008(core.List<api.GoogleCloudApigeeV1DataCollectorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1DataCollectorConfig(o[0]);
-  checkGoogleCloudApigeeV1DataCollectorConfig(o[1]);
+  checkGoogleCloudApigeeV1DataCollectorConfig(
+      o[0] as api.GoogleCloudApigeeV1DataCollectorConfig);
+  checkGoogleCloudApigeeV1DataCollectorConfig(
+      o[1] as api.GoogleCloudApigeeV1DataCollectorConfig);
 }
 
 core.List<api.GoogleCloudApigeeV1DeploymentConfig> buildUnnamed5009() {
@@ -2304,8 +2339,10 @@
 
 void checkUnnamed5009(core.List<api.GoogleCloudApigeeV1DeploymentConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1DeploymentConfig(o[0]);
-  checkGoogleCloudApigeeV1DeploymentConfig(o[1]);
+  checkGoogleCloudApigeeV1DeploymentConfig(
+      o[0] as api.GoogleCloudApigeeV1DeploymentConfig);
+  checkGoogleCloudApigeeV1DeploymentConfig(
+      o[1] as api.GoogleCloudApigeeV1DeploymentConfig);
 }
 
 core.Map<core.String, core.String> buildUnnamed5010() {
@@ -2330,8 +2367,10 @@
 
 void checkUnnamed5011(core.List<api.GoogleCloudApigeeV1FlowHookConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1FlowHookConfig(o[0]);
-  checkGoogleCloudApigeeV1FlowHookConfig(o[1]);
+  checkGoogleCloudApigeeV1FlowHookConfig(
+      o[0] as api.GoogleCloudApigeeV1FlowHookConfig);
+  checkGoogleCloudApigeeV1FlowHookConfig(
+      o[1] as api.GoogleCloudApigeeV1FlowHookConfig);
 }
 
 core.List<api.GoogleCloudApigeeV1KeystoreConfig> buildUnnamed5012() {
@@ -2343,8 +2382,10 @@
 
 void checkUnnamed5012(core.List<api.GoogleCloudApigeeV1KeystoreConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1KeystoreConfig(o[0]);
-  checkGoogleCloudApigeeV1KeystoreConfig(o[1]);
+  checkGoogleCloudApigeeV1KeystoreConfig(
+      o[0] as api.GoogleCloudApigeeV1KeystoreConfig);
+  checkGoogleCloudApigeeV1KeystoreConfig(
+      o[1] as api.GoogleCloudApigeeV1KeystoreConfig);
 }
 
 core.List<api.GoogleCloudApigeeV1ReferenceConfig> buildUnnamed5013() {
@@ -2356,8 +2397,10 @@
 
 void checkUnnamed5013(core.List<api.GoogleCloudApigeeV1ReferenceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ReferenceConfig(o[0]);
-  checkGoogleCloudApigeeV1ReferenceConfig(o[1]);
+  checkGoogleCloudApigeeV1ReferenceConfig(
+      o[0] as api.GoogleCloudApigeeV1ReferenceConfig);
+  checkGoogleCloudApigeeV1ReferenceConfig(
+      o[1] as api.GoogleCloudApigeeV1ReferenceConfig);
 }
 
 core.List<api.GoogleCloudApigeeV1ResourceConfig> buildUnnamed5014() {
@@ -2369,8 +2412,10 @@
 
 void checkUnnamed5014(core.List<api.GoogleCloudApigeeV1ResourceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ResourceConfig(o[0]);
-  checkGoogleCloudApigeeV1ResourceConfig(o[1]);
+  checkGoogleCloudApigeeV1ResourceConfig(
+      o[0] as api.GoogleCloudApigeeV1ResourceConfig);
+  checkGoogleCloudApigeeV1ResourceConfig(
+      o[1] as api.GoogleCloudApigeeV1ResourceConfig);
 }
 
 core.List<api.GoogleCloudApigeeV1TargetServerConfig> buildUnnamed5015() {
@@ -2382,8 +2427,10 @@
 
 void checkUnnamed5015(core.List<api.GoogleCloudApigeeV1TargetServerConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1TargetServerConfig(o[0]);
-  checkGoogleCloudApigeeV1TargetServerConfig(o[1]);
+  checkGoogleCloudApigeeV1TargetServerConfig(
+      o[0] as api.GoogleCloudApigeeV1TargetServerConfig);
+  checkGoogleCloudApigeeV1TargetServerConfig(
+      o[1] as api.GoogleCloudApigeeV1TargetServerConfig);
 }
 
 core.int buildCounterGoogleCloudApigeeV1EnvironmentConfig = 0;
@@ -2420,7 +2467,8 @@
   if (buildCounterGoogleCloudApigeeV1EnvironmentConfig < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
     checkUnnamed5008(o.dataCollectors);
-    checkGoogleCloudApigeeV1DebugMask(o.debugMask);
+    checkGoogleCloudApigeeV1DebugMask(
+        o.debugMask as api.GoogleCloudApigeeV1DebugMask);
     checkUnnamed5009(o.deployments);
     checkUnnamed5010(o.featureFlags);
     checkUnnamed5011(o.flowhooks);
@@ -2433,7 +2481,8 @@
     unittest.expect(o.revisionId, unittest.equals('foo'));
     unittest.expect(o.sequenceNumber, unittest.equals('foo'));
     checkUnnamed5015(o.targets);
-    checkGoogleCloudApigeeV1RuntimeTraceConfig(o.traceConfig);
+    checkGoogleCloudApigeeV1RuntimeTraceConfig(
+        o.traceConfig as api.GoogleCloudApigeeV1RuntimeTraceConfig);
     unittest.expect(o.uid, unittest.equals('foo'));
   }
   buildCounterGoogleCloudApigeeV1EnvironmentConfig--;
@@ -2526,8 +2575,10 @@
 
 void checkUnnamed5018(core.List<api.GoogleCloudApigeeV1RoutingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1RoutingRule(o[0]);
-  checkGoogleCloudApigeeV1RoutingRule(o[1]);
+  checkGoogleCloudApigeeV1RoutingRule(
+      o[0] as api.GoogleCloudApigeeV1RoutingRule);
+  checkGoogleCloudApigeeV1RoutingRule(
+      o[1] as api.GoogleCloudApigeeV1RoutingRule);
 }
 
 core.int buildCounterGoogleCloudApigeeV1EnvironmentGroupConfig = 0;
@@ -2616,7 +2667,8 @@
   if (buildCounterGoogleCloudApigeeV1ExportRequest < 3) {
     unittest.expect(o.csvDelimiter, unittest.equals('foo'));
     unittest.expect(o.datastoreName, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1DateRange(o.dateRange);
+    checkGoogleCloudApigeeV1DateRange(
+        o.dateRange as api.GoogleCloudApigeeV1DateRange);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.outputFormat, unittest.equals('foo'));
@@ -2700,8 +2752,10 @@
 void checkUnnamed5019(
     core.List<api.GoogleCloudApigeeV1EnvironmentGroupConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1EnvironmentGroupConfig(o[0]);
-  checkGoogleCloudApigeeV1EnvironmentGroupConfig(o[1]);
+  checkGoogleCloudApigeeV1EnvironmentGroupConfig(
+      o[0] as api.GoogleCloudApigeeV1EnvironmentGroupConfig);
+  checkGoogleCloudApigeeV1EnvironmentGroupConfig(
+      o[1] as api.GoogleCloudApigeeV1EnvironmentGroupConfig);
 }
 
 core.int buildCounterGoogleCloudApigeeV1IngressConfig = 0;
@@ -2806,8 +2860,10 @@
     core.List<api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision(o[0]);
-  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision(o[1]);
+  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision(
+      o[0] as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision);
+  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision(
+      o[1] as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision);
 }
 
 core.List<api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute>
@@ -2821,8 +2877,10 @@
 void checkUnnamed5021(
     core.List<api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute(o[0]);
-  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute(o[1]);
+  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute(
+      o[0] as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute);
+  checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute(
+      o[1] as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute);
 }
 
 core.int buildCounterGoogleCloudApigeeV1InstanceDeploymentStatus = 0;
@@ -2993,8 +3051,10 @@
 
 void checkUnnamed5023(core.List<api.GoogleCloudApigeeV1AliasRevisionConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1AliasRevisionConfig(o[0]);
-  checkGoogleCloudApigeeV1AliasRevisionConfig(o[1]);
+  checkGoogleCloudApigeeV1AliasRevisionConfig(
+      o[0] as api.GoogleCloudApigeeV1AliasRevisionConfig);
+  checkGoogleCloudApigeeV1AliasRevisionConfig(
+      o[1] as api.GoogleCloudApigeeV1AliasRevisionConfig);
 }
 
 core.int buildCounterGoogleCloudApigeeV1KeystoreConfig = 0;
@@ -3028,8 +3088,10 @@
 
 void checkUnnamed5024(core.List<api.GoogleCloudApigeeV1ApiCategoryData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ApiCategoryData(o[0]);
-  checkGoogleCloudApigeeV1ApiCategoryData(o[1]);
+  checkGoogleCloudApigeeV1ApiCategoryData(
+      o[0] as api.GoogleCloudApigeeV1ApiCategoryData);
+  checkGoogleCloudApigeeV1ApiCategoryData(
+      o[1] as api.GoogleCloudApigeeV1ApiCategoryData);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListApiCategoriesResponse = 0;
@@ -3070,8 +3132,8 @@
 
 void checkUnnamed5025(core.List<api.GoogleCloudApigeeV1ApiProduct> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ApiProduct(o[0]);
-  checkGoogleCloudApigeeV1ApiProduct(o[1]);
+  checkGoogleCloudApigeeV1ApiProduct(o[0] as api.GoogleCloudApigeeV1ApiProduct);
+  checkGoogleCloudApigeeV1ApiProduct(o[1] as api.GoogleCloudApigeeV1ApiProduct);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListApiProductsResponse = 0;
@@ -3104,8 +3166,8 @@
 
 void checkUnnamed5026(core.List<api.GoogleCloudApigeeV1ApiProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ApiProxy(o[0]);
-  checkGoogleCloudApigeeV1ApiProxy(o[1]);
+  checkGoogleCloudApigeeV1ApiProxy(o[0] as api.GoogleCloudApigeeV1ApiProxy);
+  checkGoogleCloudApigeeV1ApiProxy(o[1] as api.GoogleCloudApigeeV1ApiProxy);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListApiProxiesResponse = 0;
@@ -3138,8 +3200,8 @@
 
 void checkUnnamed5027(core.List<api.GoogleCloudApigeeV1App> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1App(o[0]);
-  checkGoogleCloudApigeeV1App(o[1]);
+  checkGoogleCloudApigeeV1App(o[0] as api.GoogleCloudApigeeV1App);
+  checkGoogleCloudApigeeV1App(o[1] as api.GoogleCloudApigeeV1App);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListAppsResponse = 0;
@@ -3172,8 +3234,8 @@
 
 void checkUnnamed5028(core.List<api.GoogleCloudApigeeV1AsyncQuery> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1AsyncQuery(o[0]);
-  checkGoogleCloudApigeeV1AsyncQuery(o[1]);
+  checkGoogleCloudApigeeV1AsyncQuery(o[0] as api.GoogleCloudApigeeV1AsyncQuery);
+  checkGoogleCloudApigeeV1AsyncQuery(o[1] as api.GoogleCloudApigeeV1AsyncQuery);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListAsyncQueriesResponse = 0;
@@ -3206,8 +3268,10 @@
 
 void checkUnnamed5029(core.List<api.GoogleCloudApigeeV1CustomReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1CustomReport(o[0]);
-  checkGoogleCloudApigeeV1CustomReport(o[1]);
+  checkGoogleCloudApigeeV1CustomReport(
+      o[0] as api.GoogleCloudApigeeV1CustomReport);
+  checkGoogleCloudApigeeV1CustomReport(
+      o[1] as api.GoogleCloudApigeeV1CustomReport);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListCustomReportsResponse = 0;
@@ -3240,8 +3304,8 @@
 
 void checkUnnamed5030(core.List<api.GoogleCloudApigeeV1Datastore> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Datastore(o[0]);
-  checkGoogleCloudApigeeV1Datastore(o[1]);
+  checkGoogleCloudApigeeV1Datastore(o[0] as api.GoogleCloudApigeeV1Datastore);
+  checkGoogleCloudApigeeV1Datastore(o[1] as api.GoogleCloudApigeeV1Datastore);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListDatastoresResponse = 0;
@@ -3274,8 +3338,8 @@
 
 void checkUnnamed5031(core.List<api.GoogleCloudApigeeV1Session> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Session(o[0]);
-  checkGoogleCloudApigeeV1Session(o[1]);
+  checkGoogleCloudApigeeV1Session(o[0] as api.GoogleCloudApigeeV1Session);
+  checkGoogleCloudApigeeV1Session(o[1] as api.GoogleCloudApigeeV1Session);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListDebugSessionsResponse = 0;
@@ -3310,8 +3374,8 @@
 
 void checkUnnamed5032(core.List<api.GoogleCloudApigeeV1Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Deployment(o[0]);
-  checkGoogleCloudApigeeV1Deployment(o[1]);
+  checkGoogleCloudApigeeV1Deployment(o[0] as api.GoogleCloudApigeeV1Deployment);
+  checkGoogleCloudApigeeV1Deployment(o[1] as api.GoogleCloudApigeeV1Deployment);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListDeploymentsResponse = 0;
@@ -3344,8 +3408,10 @@
 
 void checkUnnamed5033(core.List<api.GoogleCloudApigeeV1DeveloperApp> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1DeveloperApp(o[0]);
-  checkGoogleCloudApigeeV1DeveloperApp(o[1]);
+  checkGoogleCloudApigeeV1DeveloperApp(
+      o[0] as api.GoogleCloudApigeeV1DeveloperApp);
+  checkGoogleCloudApigeeV1DeveloperApp(
+      o[1] as api.GoogleCloudApigeeV1DeveloperApp);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListDeveloperAppsResponse = 0;
@@ -3380,8 +3446,10 @@
 void checkUnnamed5034(
     core.List<api.GoogleCloudApigeeV1EnvironmentGroupAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1EnvironmentGroupAttachment(o[0]);
-  checkGoogleCloudApigeeV1EnvironmentGroupAttachment(o[1]);
+  checkGoogleCloudApigeeV1EnvironmentGroupAttachment(
+      o[0] as api.GoogleCloudApigeeV1EnvironmentGroupAttachment);
+  checkGoogleCloudApigeeV1EnvironmentGroupAttachment(
+      o[1] as api.GoogleCloudApigeeV1EnvironmentGroupAttachment);
 }
 
 core.int
@@ -3419,8 +3487,10 @@
 
 void checkUnnamed5035(core.List<api.GoogleCloudApigeeV1EnvironmentGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1EnvironmentGroup(o[0]);
-  checkGoogleCloudApigeeV1EnvironmentGroup(o[1]);
+  checkGoogleCloudApigeeV1EnvironmentGroup(
+      o[0] as api.GoogleCloudApigeeV1EnvironmentGroup);
+  checkGoogleCloudApigeeV1EnvironmentGroup(
+      o[1] as api.GoogleCloudApigeeV1EnvironmentGroup);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListEnvironmentGroupsResponse = 0;
@@ -3455,8 +3525,10 @@
 
 void checkUnnamed5036(core.List<api.GoogleCloudApigeeV1ResourceFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ResourceFile(o[0]);
-  checkGoogleCloudApigeeV1ResourceFile(o[1]);
+  checkGoogleCloudApigeeV1ResourceFile(
+      o[0] as api.GoogleCloudApigeeV1ResourceFile);
+  checkGoogleCloudApigeeV1ResourceFile(
+      o[1] as api.GoogleCloudApigeeV1ResourceFile);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListEnvironmentResourcesResponse = 0;
@@ -3489,8 +3561,8 @@
 
 void checkUnnamed5037(core.List<api.GoogleCloudApigeeV1Export> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Export(o[0]);
-  checkGoogleCloudApigeeV1Export(o[1]);
+  checkGoogleCloudApigeeV1Export(o[0] as api.GoogleCloudApigeeV1Export);
+  checkGoogleCloudApigeeV1Export(o[1] as api.GoogleCloudApigeeV1Export);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListExportsResponse = 0;
@@ -3524,8 +3596,10 @@
 void checkUnnamed5038(
     core.List<api.GoogleCloudApigeeV1ServiceIssuersMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ServiceIssuersMapping(o[0]);
-  checkGoogleCloudApigeeV1ServiceIssuersMapping(o[1]);
+  checkGoogleCloudApigeeV1ServiceIssuersMapping(
+      o[0] as api.GoogleCloudApigeeV1ServiceIssuersMapping);
+  checkGoogleCloudApigeeV1ServiceIssuersMapping(
+      o[1] as api.GoogleCloudApigeeV1ServiceIssuersMapping);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListHybridIssuersResponse = 0;
@@ -3558,8 +3632,10 @@
 
 void checkUnnamed5039(core.List<api.GoogleCloudApigeeV1InstanceAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1InstanceAttachment(o[0]);
-  checkGoogleCloudApigeeV1InstanceAttachment(o[1]);
+  checkGoogleCloudApigeeV1InstanceAttachment(
+      o[0] as api.GoogleCloudApigeeV1InstanceAttachment);
+  checkGoogleCloudApigeeV1InstanceAttachment(
+      o[1] as api.GoogleCloudApigeeV1InstanceAttachment);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListInstanceAttachmentsResponse = 0;
@@ -3594,8 +3670,8 @@
 
 void checkUnnamed5040(core.List<api.GoogleCloudApigeeV1Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Instance(o[0]);
-  checkGoogleCloudApigeeV1Instance(o[1]);
+  checkGoogleCloudApigeeV1Instance(o[0] as api.GoogleCloudApigeeV1Instance);
+  checkGoogleCloudApigeeV1Instance(o[1] as api.GoogleCloudApigeeV1Instance);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListInstancesResponse = 0;
@@ -3630,8 +3706,8 @@
 
 void checkUnnamed5041(core.List<api.GoogleCloudApigeeV1Developer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Developer(o[0]);
-  checkGoogleCloudApigeeV1Developer(o[1]);
+  checkGoogleCloudApigeeV1Developer(o[0] as api.GoogleCloudApigeeV1Developer);
+  checkGoogleCloudApigeeV1Developer(o[1] as api.GoogleCloudApigeeV1Developer);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListOfDevelopersResponse = 0;
@@ -3666,8 +3742,10 @@
 void checkUnnamed5042(
     core.List<api.GoogleCloudApigeeV1OrganizationProjectMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1OrganizationProjectMapping(o[0]);
-  checkGoogleCloudApigeeV1OrganizationProjectMapping(o[1]);
+  checkGoogleCloudApigeeV1OrganizationProjectMapping(
+      o[0] as api.GoogleCloudApigeeV1OrganizationProjectMapping);
+  checkGoogleCloudApigeeV1OrganizationProjectMapping(
+      o[1] as api.GoogleCloudApigeeV1OrganizationProjectMapping);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListOrganizationsResponse = 0;
@@ -3700,8 +3778,8 @@
 
 void checkUnnamed5043(core.List<api.GoogleCloudApigeeV1SharedFlow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1SharedFlow(o[0]);
-  checkGoogleCloudApigeeV1SharedFlow(o[1]);
+  checkGoogleCloudApigeeV1SharedFlow(o[0] as api.GoogleCloudApigeeV1SharedFlow);
+  checkGoogleCloudApigeeV1SharedFlow(o[1] as api.GoogleCloudApigeeV1SharedFlow);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ListSharedFlowsResponse = 0;
@@ -3865,8 +3943,8 @@
 
 void checkUnnamed5048(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.List<api.GoogleCloudApigeeV1Operation> buildUnnamed5049() {
@@ -3878,8 +3956,8 @@
 
 void checkUnnamed5049(core.List<api.GoogleCloudApigeeV1Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Operation(o[0]);
-  checkGoogleCloudApigeeV1Operation(o[1]);
+  checkGoogleCloudApigeeV1Operation(o[0] as api.GoogleCloudApigeeV1Operation);
+  checkGoogleCloudApigeeV1Operation(o[1] as api.GoogleCloudApigeeV1Operation);
 }
 
 core.int buildCounterGoogleCloudApigeeV1OperationConfig = 0;
@@ -3904,7 +3982,7 @@
     unittest.expect(o.apiSource, unittest.equals('foo'));
     checkUnnamed5048(o.attributes);
     checkUnnamed5049(o.operations);
-    checkGoogleCloudApigeeV1Quota(o.quota);
+    checkGoogleCloudApigeeV1Quota(o.quota as api.GoogleCloudApigeeV1Quota);
   }
   buildCounterGoogleCloudApigeeV1OperationConfig--;
 }
@@ -3918,8 +3996,10 @@
 
 void checkUnnamed5050(core.List<api.GoogleCloudApigeeV1OperationConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1OperationConfig(o[0]);
-  checkGoogleCloudApigeeV1OperationConfig(o[1]);
+  checkGoogleCloudApigeeV1OperationConfig(
+      o[0] as api.GoogleCloudApigeeV1OperationConfig);
+  checkGoogleCloudApigeeV1OperationConfig(
+      o[1] as api.GoogleCloudApigeeV1OperationConfig);
 }
 
 core.int buildCounterGoogleCloudApigeeV1OperationGroup = 0;
@@ -3984,7 +4064,8 @@
     api.GoogleCloudApigeeV1OptimizedStats o) {
   buildCounterGoogleCloudApigeeV1OptimizedStats++;
   if (buildCounterGoogleCloudApigeeV1OptimizedStats < 3) {
-    checkGoogleCloudApigeeV1OptimizedStatsResponse(o.Response);
+    checkGoogleCloudApigeeV1OptimizedStatsResponse(
+        o.Response as api.GoogleCloudApigeeV1OptimizedStatsResponse);
   }
   buildCounterGoogleCloudApigeeV1OptimizedStats--;
 }
@@ -4072,9 +4153,11 @@
   buildCounterGoogleCloudApigeeV1OptimizedStatsResponse++;
   if (buildCounterGoogleCloudApigeeV1OptimizedStatsResponse < 3) {
     checkUnnamed5052(o.TimeUnit);
-    checkGoogleCloudApigeeV1Metadata(o.metaData);
+    checkGoogleCloudApigeeV1Metadata(
+        o.metaData as api.GoogleCloudApigeeV1Metadata);
     unittest.expect(o.resultTruncated, unittest.isTrue);
-    checkGoogleCloudApigeeV1OptimizedStatsNode(o.stats);
+    checkGoogleCloudApigeeV1OptimizedStatsNode(
+        o.stats as api.GoogleCloudApigeeV1OptimizedStatsNode);
   }
   buildCounterGoogleCloudApigeeV1OptimizedStatsResponse--;
 }
@@ -4147,7 +4230,8 @@
     unittest.expect(o.lastModifiedAt, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1Properties(o.properties);
+    checkGoogleCloudApigeeV1Properties(
+        o.properties as api.GoogleCloudApigeeV1Properties);
     unittest.expect(o.runtimeType_, unittest.equals('foo'));
     unittest.expect(o.subscriptionType, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -4235,8 +4319,8 @@
 
 void checkUnnamed5056(core.List<api.GoogleCloudApigeeV1Result> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Result(o[0]);
-  checkGoogleCloudApigeeV1Result(o[1]);
+  checkGoogleCloudApigeeV1Result(o[0] as api.GoogleCloudApigeeV1Result);
+  checkGoogleCloudApigeeV1Result(o[1] as api.GoogleCloudApigeeV1Result);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Point = 0;
@@ -4269,8 +4353,8 @@
 
 void checkUnnamed5057(core.List<api.GoogleCloudApigeeV1Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Property(o[0]);
-  checkGoogleCloudApigeeV1Property(o[1]);
+  checkGoogleCloudApigeeV1Property(o[0] as api.GoogleCloudApigeeV1Property);
+  checkGoogleCloudApigeeV1Property(o[1] as api.GoogleCloudApigeeV1Property);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Properties = 0;
@@ -4360,8 +4444,10 @@
 
 void checkUnnamed5059(core.List<api.GoogleCloudApigeeV1QueryMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1QueryMetric(o[0]);
-  checkGoogleCloudApigeeV1QueryMetric(o[1]);
+  checkGoogleCloudApigeeV1QueryMetric(
+      o[0] as api.GoogleCloudApigeeV1QueryMetric);
+  checkGoogleCloudApigeeV1QueryMetric(
+      o[1] as api.GoogleCloudApigeeV1QueryMetric);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Query = 0;
@@ -4572,8 +4658,10 @@
 
 void checkUnnamed5062(core.List<api.GoogleCloudApigeeV1ResourceStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ResourceStatus(o[0]);
-  checkGoogleCloudApigeeV1ResourceStatus(o[1]);
+  checkGoogleCloudApigeeV1ResourceStatus(
+      o[0] as api.GoogleCloudApigeeV1ResourceStatus);
+  checkGoogleCloudApigeeV1ResourceStatus(
+      o[1] as api.GoogleCloudApigeeV1ResourceStatus);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ReportInstanceStatusRequest = 0;
@@ -4627,8 +4715,8 @@
 
 void checkUnnamed5063(core.List<api.GoogleCloudApigeeV1Attribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Attribute(o[0]);
-  checkGoogleCloudApigeeV1Attribute(o[1]);
+  checkGoogleCloudApigeeV1Attribute(o[0] as api.GoogleCloudApigeeV1Attribute);
+  checkGoogleCloudApigeeV1Attribute(o[1] as api.GoogleCloudApigeeV1Attribute);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ReportProperty = 0;
@@ -4706,8 +4794,10 @@
 
 void checkUnnamed5064(core.List<api.GoogleCloudApigeeV1ResourceFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1ResourceFile(o[0]);
-  checkGoogleCloudApigeeV1ResourceFile(o[1]);
+  checkGoogleCloudApigeeV1ResourceFile(
+      o[0] as api.GoogleCloudApigeeV1ResourceFile);
+  checkGoogleCloudApigeeV1ResourceFile(
+      o[1] as api.GoogleCloudApigeeV1ResourceFile);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ResourceFiles = 0;
@@ -4739,8 +4829,10 @@
 
 void checkUnnamed5065(core.List<api.GoogleCloudApigeeV1RevisionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1RevisionStatus(o[0]);
-  checkGoogleCloudApigeeV1RevisionStatus(o[1]);
+  checkGoogleCloudApigeeV1RevisionStatus(
+      o[0] as api.GoogleCloudApigeeV1RevisionStatus);
+  checkGoogleCloudApigeeV1RevisionStatus(
+      o[1] as api.GoogleCloudApigeeV1RevisionStatus);
 }
 
 core.int buildCounterGoogleCloudApigeeV1ResourceStatus = 0;
@@ -4778,8 +4870,8 @@
 
 void checkUnnamed5066(core.List<api.GoogleCloudApigeeV1Access> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Access(o[0]);
-  checkGoogleCloudApigeeV1Access(o[1]);
+  checkGoogleCloudApigeeV1Access(o[0] as api.GoogleCloudApigeeV1Access);
+  checkGoogleCloudApigeeV1Access(o[1] as api.GoogleCloudApigeeV1Access);
 }
 
 core.List<api.GoogleCloudApigeeV1Property> buildUnnamed5067() {
@@ -4791,8 +4883,8 @@
 
 void checkUnnamed5067(core.List<api.GoogleCloudApigeeV1Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Property(o[0]);
-  checkGoogleCloudApigeeV1Property(o[1]);
+  checkGoogleCloudApigeeV1Property(o[0] as api.GoogleCloudApigeeV1Property);
+  checkGoogleCloudApigeeV1Property(o[1] as api.GoogleCloudApigeeV1Property);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Result = 0;
@@ -4822,7 +4914,8 @@
     checkUnnamed5066(o.accessList);
     unittest.expect(o.content, unittest.equals('foo'));
     checkUnnamed5067(o.headers);
-    checkGoogleCloudApigeeV1Properties(o.properties);
+    checkGoogleCloudApigeeV1Properties(
+        o.properties as api.GoogleCloudApigeeV1Properties);
     unittest.expect(o.reasonPhrase, unittest.equals('foo'));
     unittest.expect(o.statusCode, unittest.equals('foo'));
     unittest.expect(o.timestamp, unittest.equals('foo'));
@@ -4841,8 +4934,10 @@
 
 void checkUnnamed5068(core.List<api.GoogleCloudApigeeV1UpdateError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1UpdateError(o[0]);
-  checkGoogleCloudApigeeV1UpdateError(o[1]);
+  checkGoogleCloudApigeeV1UpdateError(
+      o[0] as api.GoogleCloudApigeeV1UpdateError);
+  checkGoogleCloudApigeeV1UpdateError(
+      o[1] as api.GoogleCloudApigeeV1UpdateError);
 }
 
 core.int buildCounterGoogleCloudApigeeV1RevisionStatus = 0;
@@ -4909,8 +5004,10 @@
 void checkUnnamed5069(
     core.List<api.GoogleCloudApigeeV1RuntimeTraceConfigOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1RuntimeTraceConfigOverride(o[0]);
-  checkGoogleCloudApigeeV1RuntimeTraceConfigOverride(o[1]);
+  checkGoogleCloudApigeeV1RuntimeTraceConfigOverride(
+      o[0] as api.GoogleCloudApigeeV1RuntimeTraceConfigOverride);
+  checkGoogleCloudApigeeV1RuntimeTraceConfigOverride(
+      o[1] as api.GoogleCloudApigeeV1RuntimeTraceConfigOverride);
 }
 
 core.int buildCounterGoogleCloudApigeeV1RuntimeTraceConfig = 0;
@@ -4941,7 +5038,8 @@
     checkUnnamed5069(o.overrides);
     unittest.expect(o.revisionCreateTime, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1RuntimeTraceSamplingConfig(o.samplingConfig);
+    checkGoogleCloudApigeeV1RuntimeTraceSamplingConfig(
+        o.samplingConfig as api.GoogleCloudApigeeV1RuntimeTraceSamplingConfig);
   }
   buildCounterGoogleCloudApigeeV1RuntimeTraceConfig--;
 }
@@ -4971,7 +5069,8 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.revisionCreateTime, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1RuntimeTraceSamplingConfig(o.samplingConfig);
+    checkGoogleCloudApigeeV1RuntimeTraceSamplingConfig(
+        o.samplingConfig as api.GoogleCloudApigeeV1RuntimeTraceSamplingConfig);
     unittest.expect(o.uid, unittest.equals('foo'));
   }
   buildCounterGoogleCloudApigeeV1RuntimeTraceConfigOverride--;
@@ -5004,8 +5103,10 @@
             api.GoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange(o[0]);
-  checkGoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange(o[1]);
+  checkGoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange(o[0]
+      as api.GoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange);
+  checkGoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange(o[1]
+      as api.GoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange);
 }
 
 core.List<core.int> buildUnnamed5072() {
@@ -5086,8 +5187,10 @@
 
 void checkUnnamed5073(core.List<api.GoogleCloudApigeeV1SchemaSchemaElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1SchemaSchemaElement(o[0]);
-  checkGoogleCloudApigeeV1SchemaSchemaElement(o[1]);
+  checkGoogleCloudApigeeV1SchemaSchemaElement(
+      o[0] as api.GoogleCloudApigeeV1SchemaSchemaElement);
+  checkGoogleCloudApigeeV1SchemaSchemaElement(
+      o[1] as api.GoogleCloudApigeeV1SchemaSchemaElement);
 }
 
 core.List<core.String> buildUnnamed5074() {
@@ -5112,8 +5215,10 @@
 
 void checkUnnamed5075(core.List<api.GoogleCloudApigeeV1SchemaSchemaElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1SchemaSchemaElement(o[0]);
-  checkGoogleCloudApigeeV1SchemaSchemaElement(o[1]);
+  checkGoogleCloudApigeeV1SchemaSchemaElement(
+      o[0] as api.GoogleCloudApigeeV1SchemaSchemaElement);
+  checkGoogleCloudApigeeV1SchemaSchemaElement(
+      o[1] as api.GoogleCloudApigeeV1SchemaSchemaElement);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Schema = 0;
@@ -5157,7 +5262,8 @@
   buildCounterGoogleCloudApigeeV1SchemaSchemaElement++;
   if (buildCounterGoogleCloudApigeeV1SchemaSchemaElement < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1SchemaSchemaProperty(o.properties);
+    checkGoogleCloudApigeeV1SchemaSchemaProperty(
+        o.properties as api.GoogleCloudApigeeV1SchemaSchemaProperty);
   }
   buildCounterGoogleCloudApigeeV1SchemaSchemaElement--;
 }
@@ -5275,7 +5381,8 @@
   buildCounterGoogleCloudApigeeV1SharedFlow++;
   if (buildCounterGoogleCloudApigeeV1SharedFlow < 3) {
     unittest.expect(o.latestRevisionId, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1EntityMetadata(o.metaData);
+    checkGoogleCloudApigeeV1EntityMetadata(
+        o.metaData as api.GoogleCloudApigeeV1EntityMetadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5077(o.revision);
   }
@@ -5363,7 +5470,8 @@
     api.GoogleCloudApigeeV1SharedFlowRevision o) {
   buildCounterGoogleCloudApigeeV1SharedFlowRevision++;
   if (buildCounterGoogleCloudApigeeV1SharedFlowRevision < 3) {
-    checkGoogleCloudApigeeV1ConfigVersion(o.configurationVersion);
+    checkGoogleCloudApigeeV1ConfigVersion(
+        o.configurationVersion as api.GoogleCloudApigeeV1ConfigVersion);
     unittest.expect(o.contextInfo, unittest.equals('foo'));
     unittest.expect(o.createdAt, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -5372,7 +5480,8 @@
     unittest.expect(o.lastModifiedAt, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5079(o.policies);
-    checkGoogleCloudApigeeV1ResourceFiles(o.resourceFiles);
+    checkGoogleCloudApigeeV1ResourceFiles(
+        o.resourceFiles as api.GoogleCloudApigeeV1ResourceFiles);
     checkUnnamed5080(o.resources);
     unittest.expect(o.revision, unittest.equals('foo'));
     checkUnnamed5081(o.sharedFlows);
@@ -5391,8 +5500,10 @@
 void checkUnnamed5082(
     core.List<api.GoogleCloudApigeeV1StatsEnvironmentStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1StatsEnvironmentStats(o[0]);
-  checkGoogleCloudApigeeV1StatsEnvironmentStats(o[1]);
+  checkGoogleCloudApigeeV1StatsEnvironmentStats(
+      o[0] as api.GoogleCloudApigeeV1StatsEnvironmentStats);
+  checkGoogleCloudApigeeV1StatsEnvironmentStats(
+      o[1] as api.GoogleCloudApigeeV1StatsEnvironmentStats);
 }
 
 core.int buildCounterGoogleCloudApigeeV1Stats = 0;
@@ -5411,7 +5522,8 @@
   buildCounterGoogleCloudApigeeV1Stats++;
   if (buildCounterGoogleCloudApigeeV1Stats < 3) {
     checkUnnamed5082(o.environments);
-    checkGoogleCloudApigeeV1Metadata(o.metaData);
+    checkGoogleCloudApigeeV1Metadata(
+        o.metaData as api.GoogleCloudApigeeV1Metadata);
   }
   buildCounterGoogleCloudApigeeV1Stats--;
 }
@@ -5425,8 +5537,10 @@
 
 void checkUnnamed5083(core.List<api.GoogleCloudApigeeV1DimensionMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1DimensionMetric(o[0]);
-  checkGoogleCloudApigeeV1DimensionMetric(o[1]);
+  checkGoogleCloudApigeeV1DimensionMetric(
+      o[0] as api.GoogleCloudApigeeV1DimensionMetric);
+  checkGoogleCloudApigeeV1DimensionMetric(
+      o[1] as api.GoogleCloudApigeeV1DimensionMetric);
 }
 
 core.List<api.GoogleCloudApigeeV1Metric> buildUnnamed5084() {
@@ -5438,8 +5552,8 @@
 
 void checkUnnamed5084(core.List<api.GoogleCloudApigeeV1Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudApigeeV1Metric(o[0]);
-  checkGoogleCloudApigeeV1Metric(o[1]);
+  checkGoogleCloudApigeeV1Metric(o[0] as api.GoogleCloudApigeeV1Metric);
+  checkGoogleCloudApigeeV1Metric(o[1] as api.GoogleCloudApigeeV1Metric);
 }
 
 core.int buildCounterGoogleCloudApigeeV1StatsEnvironmentStats = 0;
@@ -5548,7 +5662,8 @@
     unittest.expect(o.isEnabled, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.port, unittest.equals(42));
-    checkGoogleCloudApigeeV1TlsInfo(o.sSLInfo);
+    checkGoogleCloudApigeeV1TlsInfo(
+        o.sSLInfo as api.GoogleCloudApigeeV1TlsInfo);
   }
   buildCounterGoogleCloudApigeeV1TargetServer--;
 }
@@ -5575,7 +5690,8 @@
     unittest.expect(o.host, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.port, unittest.equals(42));
-    checkGoogleCloudApigeeV1TlsInfoConfig(o.tlsInfo);
+    checkGoogleCloudApigeeV1TlsInfoConfig(
+        o.tlsInfo as api.GoogleCloudApigeeV1TlsInfoConfig);
   }
   buildCounterGoogleCloudApigeeV1TargetServerConfig--;
 }
@@ -5653,7 +5769,8 @@
   if (buildCounterGoogleCloudApigeeV1TlsInfo < 3) {
     checkUnnamed5086(o.ciphers);
     unittest.expect(o.clientAuthEnabled, unittest.isTrue);
-    checkGoogleCloudApigeeV1TlsInfoCommonName(o.commonName);
+    checkGoogleCloudApigeeV1TlsInfoCommonName(
+        o.commonName as api.GoogleCloudApigeeV1TlsInfoCommonName);
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.ignoreValidationErrors, unittest.isTrue);
     unittest.expect(o.keyAlias, unittest.equals('foo'));
@@ -5738,11 +5855,13 @@
   if (buildCounterGoogleCloudApigeeV1TlsInfoConfig < 3) {
     checkUnnamed5088(o.ciphers);
     unittest.expect(o.clientAuthEnabled, unittest.isTrue);
-    checkGoogleCloudApigeeV1CommonNameConfig(o.commonName);
+    checkGoogleCloudApigeeV1CommonNameConfig(
+        o.commonName as api.GoogleCloudApigeeV1CommonNameConfig);
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.ignoreValidationErrors, unittest.isTrue);
     unittest.expect(o.keyAlias, unittest.equals('foo'));
-    checkGoogleCloudApigeeV1KeyAliasReference(o.keyAliasReference);
+    checkGoogleCloudApigeeV1KeyAliasReference(
+        o.keyAliasReference as api.GoogleCloudApigeeV1KeyAliasReference);
     checkUnnamed5089(o.protocols);
     unittest.expect(o.trustStore, unittest.equals('foo'));
   }
@@ -5783,8 +5902,8 @@
 
 void checkUnnamed5090(core.List<api.GoogleIamV1AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1AuditLogConfig(o[0]);
-  checkGoogleIamV1AuditLogConfig(o[1]);
+  checkGoogleIamV1AuditLogConfig(o[0] as api.GoogleIamV1AuditLogConfig);
+  checkGoogleIamV1AuditLogConfig(o[1] as api.GoogleIamV1AuditLogConfig);
 }
 
 core.int buildCounterGoogleIamV1AuditConfig = 0;
@@ -5871,7 +5990,7 @@
 void checkGoogleIamV1Binding(api.GoogleIamV1Binding o) {
   buildCounterGoogleIamV1Binding++;
   if (buildCounterGoogleIamV1Binding < 3) {
-    checkGoogleTypeExpr(o.condition);
+    checkGoogleTypeExpr(o.condition as api.GoogleTypeExpr);
     checkUnnamed5092(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -5887,8 +6006,8 @@
 
 void checkUnnamed5093(core.List<api.GoogleIamV1AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1AuditConfig(o[0]);
-  checkGoogleIamV1AuditConfig(o[1]);
+  checkGoogleIamV1AuditConfig(o[0] as api.GoogleIamV1AuditConfig);
+  checkGoogleIamV1AuditConfig(o[1] as api.GoogleIamV1AuditConfig);
 }
 
 core.List<api.GoogleIamV1Binding> buildUnnamed5094() {
@@ -5900,8 +6019,8 @@
 
 void checkUnnamed5094(core.List<api.GoogleIamV1Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1Binding(o[0]);
-  checkGoogleIamV1Binding(o[1]);
+  checkGoogleIamV1Binding(o[0] as api.GoogleIamV1Binding);
+  checkGoogleIamV1Binding(o[1] as api.GoogleIamV1Binding);
 }
 
 core.int buildCounterGoogleIamV1Policy = 0;
@@ -5944,7 +6063,7 @@
 void checkGoogleIamV1SetIamPolicyRequest(api.GoogleIamV1SetIamPolicyRequest o) {
   buildCounterGoogleIamV1SetIamPolicyRequest++;
   if (buildCounterGoogleIamV1SetIamPolicyRequest < 3) {
-    checkGoogleIamV1Policy(o.policy);
+    checkGoogleIamV1Policy(o.policy as api.GoogleIamV1Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1SetIamPolicyRequest--;
@@ -6027,8 +6146,8 @@
 
 void checkUnnamed5097(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleLongrunningOperation(o[0]);
-  checkGoogleLongrunningOperation(o[1]);
+  checkGoogleLongrunningOperation(o[0] as api.GoogleLongrunningOperation);
+  checkGoogleLongrunningOperation(o[1] as api.GoogleLongrunningOperation);
 }
 
 core.int buildCounterGoogleLongrunningListOperationsResponse = 0;
@@ -6131,7 +6250,7 @@
   buildCounterGoogleLongrunningOperation++;
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkGoogleRpcStatus(o.error);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
     checkUnnamed5098(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5099(o.response);
@@ -6163,8 +6282,10 @@
 
 void checkUnnamed5100(core.List<api.GoogleRpcPreconditionFailureViolation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleRpcPreconditionFailureViolation(o[0]);
-  checkGoogleRpcPreconditionFailureViolation(o[1]);
+  checkGoogleRpcPreconditionFailureViolation(
+      o[0] as api.GoogleRpcPreconditionFailureViolation);
+  checkGoogleRpcPreconditionFailureViolation(
+      o[1] as api.GoogleRpcPreconditionFailureViolation);
 }
 
 core.int buildCounterGoogleRpcPreconditionFailure = 0;
@@ -6306,7 +6427,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleApiHttpBody();
       var od = api.GoogleApiHttpBody.fromJson(o.toJson());
-      checkGoogleApiHttpBody(od);
+      checkGoogleApiHttpBody(od as api.GoogleApiHttpBody);
     });
   });
 
@@ -6314,7 +6435,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Access();
       var od = api.GoogleCloudApigeeV1Access.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Access(od);
+      checkGoogleCloudApigeeV1Access(od as api.GoogleCloudApigeeV1Access);
     });
   });
 
@@ -6322,7 +6443,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1AccessGet();
       var od = api.GoogleCloudApigeeV1AccessGet.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1AccessGet(od);
+      checkGoogleCloudApigeeV1AccessGet(od as api.GoogleCloudApigeeV1AccessGet);
     });
   });
 
@@ -6330,7 +6451,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1AccessRemove();
       var od = api.GoogleCloudApigeeV1AccessRemove.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1AccessRemove(od);
+      checkGoogleCloudApigeeV1AccessRemove(
+          od as api.GoogleCloudApigeeV1AccessRemove);
     });
   });
 
@@ -6338,7 +6460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1AccessSet();
       var od = api.GoogleCloudApigeeV1AccessSet.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1AccessSet(od);
+      checkGoogleCloudApigeeV1AccessSet(od as api.GoogleCloudApigeeV1AccessSet);
     });
   });
 
@@ -6346,7 +6468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Alias();
       var od = api.GoogleCloudApigeeV1Alias.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Alias(od);
+      checkGoogleCloudApigeeV1Alias(od as api.GoogleCloudApigeeV1Alias);
     });
   });
 
@@ -6354,7 +6476,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1AliasRevisionConfig();
       var od = api.GoogleCloudApigeeV1AliasRevisionConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1AliasRevisionConfig(od);
+      checkGoogleCloudApigeeV1AliasRevisionConfig(
+          od as api.GoogleCloudApigeeV1AliasRevisionConfig);
     });
   });
 
@@ -6362,7 +6485,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ApiCategory();
       var od = api.GoogleCloudApigeeV1ApiCategory.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ApiCategory(od);
+      checkGoogleCloudApigeeV1ApiCategory(
+          od as api.GoogleCloudApigeeV1ApiCategory);
     });
   });
 
@@ -6370,7 +6494,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ApiCategoryData();
       var od = api.GoogleCloudApigeeV1ApiCategoryData.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ApiCategoryData(od);
+      checkGoogleCloudApigeeV1ApiCategoryData(
+          od as api.GoogleCloudApigeeV1ApiCategoryData);
     });
   });
 
@@ -6378,7 +6503,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ApiProduct();
       var od = api.GoogleCloudApigeeV1ApiProduct.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ApiProduct(od);
+      checkGoogleCloudApigeeV1ApiProduct(
+          od as api.GoogleCloudApigeeV1ApiProduct);
     });
   });
 
@@ -6386,7 +6512,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ApiProductRef();
       var od = api.GoogleCloudApigeeV1ApiProductRef.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ApiProductRef(od);
+      checkGoogleCloudApigeeV1ApiProductRef(
+          od as api.GoogleCloudApigeeV1ApiProductRef);
     });
   });
 
@@ -6394,7 +6521,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ApiProxy();
       var od = api.GoogleCloudApigeeV1ApiProxy.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ApiProxy(od);
+      checkGoogleCloudApigeeV1ApiProxy(od as api.GoogleCloudApigeeV1ApiProxy);
     });
   });
 
@@ -6402,7 +6529,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ApiProxyRevision();
       var od = api.GoogleCloudApigeeV1ApiProxyRevision.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ApiProxyRevision(od);
+      checkGoogleCloudApigeeV1ApiProxyRevision(
+          od as api.GoogleCloudApigeeV1ApiProxyRevision);
     });
   });
 
@@ -6410,7 +6538,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ApiResponseWrapper();
       var od = api.GoogleCloudApigeeV1ApiResponseWrapper.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ApiResponseWrapper(od);
+      checkGoogleCloudApigeeV1ApiResponseWrapper(
+          od as api.GoogleCloudApigeeV1ApiResponseWrapper);
     });
   });
 
@@ -6418,7 +6547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1App();
       var od = api.GoogleCloudApigeeV1App.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1App(od);
+      checkGoogleCloudApigeeV1App(od as api.GoogleCloudApigeeV1App);
     });
   });
 
@@ -6426,7 +6555,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1AsyncQuery();
       var od = api.GoogleCloudApigeeV1AsyncQuery.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1AsyncQuery(od);
+      checkGoogleCloudApigeeV1AsyncQuery(
+          od as api.GoogleCloudApigeeV1AsyncQuery);
     });
   });
 
@@ -6434,7 +6564,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1AsyncQueryResult();
       var od = api.GoogleCloudApigeeV1AsyncQueryResult.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1AsyncQueryResult(od);
+      checkGoogleCloudApigeeV1AsyncQueryResult(
+          od as api.GoogleCloudApigeeV1AsyncQueryResult);
     });
   });
 
@@ -6442,7 +6573,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Attribute();
       var od = api.GoogleCloudApigeeV1Attribute.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Attribute(od);
+      checkGoogleCloudApigeeV1Attribute(od as api.GoogleCloudApigeeV1Attribute);
     });
   });
 
@@ -6450,7 +6581,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Attributes();
       var od = api.GoogleCloudApigeeV1Attributes.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Attributes(od);
+      checkGoogleCloudApigeeV1Attributes(
+          od as api.GoogleCloudApigeeV1Attributes);
     });
   });
 
@@ -6458,7 +6590,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1CertInfo();
       var od = api.GoogleCloudApigeeV1CertInfo.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1CertInfo(od);
+      checkGoogleCloudApigeeV1CertInfo(od as api.GoogleCloudApigeeV1CertInfo);
     });
   });
 
@@ -6466,7 +6598,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Certificate();
       var od = api.GoogleCloudApigeeV1Certificate.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Certificate(od);
+      checkGoogleCloudApigeeV1Certificate(
+          od as api.GoogleCloudApigeeV1Certificate);
     });
   });
 
@@ -6474,7 +6607,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1CommonNameConfig();
       var od = api.GoogleCloudApigeeV1CommonNameConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1CommonNameConfig(od);
+      checkGoogleCloudApigeeV1CommonNameConfig(
+          od as api.GoogleCloudApigeeV1CommonNameConfig);
     });
   });
 
@@ -6482,7 +6616,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ConfigVersion();
       var od = api.GoogleCloudApigeeV1ConfigVersion.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ConfigVersion(od);
+      checkGoogleCloudApigeeV1ConfigVersion(
+          od as api.GoogleCloudApigeeV1ConfigVersion);
     });
   });
 
@@ -6490,7 +6625,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Credential();
       var od = api.GoogleCloudApigeeV1Credential.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Credential(od);
+      checkGoogleCloudApigeeV1Credential(
+          od as api.GoogleCloudApigeeV1Credential);
     });
   });
 
@@ -6498,7 +6634,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1CustomReport();
       var od = api.GoogleCloudApigeeV1CustomReport.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1CustomReport(od);
+      checkGoogleCloudApigeeV1CustomReport(
+          od as api.GoogleCloudApigeeV1CustomReport);
     });
   });
 
@@ -6506,7 +6643,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1CustomReportMetric();
       var od = api.GoogleCloudApigeeV1CustomReportMetric.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1CustomReportMetric(od);
+      checkGoogleCloudApigeeV1CustomReportMetric(
+          od as api.GoogleCloudApigeeV1CustomReportMetric);
     });
   });
 
@@ -6514,7 +6652,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DataCollectorConfig();
       var od = api.GoogleCloudApigeeV1DataCollectorConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DataCollectorConfig(od);
+      checkGoogleCloudApigeeV1DataCollectorConfig(
+          od as api.GoogleCloudApigeeV1DataCollectorConfig);
     });
   });
 
@@ -6522,7 +6661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Datastore();
       var od = api.GoogleCloudApigeeV1Datastore.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Datastore(od);
+      checkGoogleCloudApigeeV1Datastore(od as api.GoogleCloudApigeeV1Datastore);
     });
   });
 
@@ -6530,7 +6669,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DatastoreConfig();
       var od = api.GoogleCloudApigeeV1DatastoreConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DatastoreConfig(od);
+      checkGoogleCloudApigeeV1DatastoreConfig(
+          od as api.GoogleCloudApigeeV1DatastoreConfig);
     });
   });
 
@@ -6538,7 +6678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DateRange();
       var od = api.GoogleCloudApigeeV1DateRange.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DateRange(od);
+      checkGoogleCloudApigeeV1DateRange(od as api.GoogleCloudApigeeV1DateRange);
     });
   });
 
@@ -6546,7 +6686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DebugMask();
       var od = api.GoogleCloudApigeeV1DebugMask.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DebugMask(od);
+      checkGoogleCloudApigeeV1DebugMask(od as api.GoogleCloudApigeeV1DebugMask);
     });
   });
 
@@ -6554,7 +6694,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DebugSession();
       var od = api.GoogleCloudApigeeV1DebugSession.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DebugSession(od);
+      checkGoogleCloudApigeeV1DebugSession(
+          od as api.GoogleCloudApigeeV1DebugSession);
     });
   });
 
@@ -6563,7 +6704,8 @@
       var o = buildGoogleCloudApigeeV1DebugSessionTransaction();
       var od =
           api.GoogleCloudApigeeV1DebugSessionTransaction.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DebugSessionTransaction(od);
+      checkGoogleCloudApigeeV1DebugSessionTransaction(
+          od as api.GoogleCloudApigeeV1DebugSessionTransaction);
     });
   });
 
@@ -6573,7 +6715,8 @@
       var o = buildGoogleCloudApigeeV1DeleteCustomReportResponse();
       var od = api.GoogleCloudApigeeV1DeleteCustomReportResponse.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1DeleteCustomReportResponse(od);
+      checkGoogleCloudApigeeV1DeleteCustomReportResponse(
+          od as api.GoogleCloudApigeeV1DeleteCustomReportResponse);
     });
   });
 
@@ -6581,7 +6724,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Deployment();
       var od = api.GoogleCloudApigeeV1Deployment.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Deployment(od);
+      checkGoogleCloudApigeeV1Deployment(
+          od as api.GoogleCloudApigeeV1Deployment);
     });
   });
 
@@ -6590,7 +6734,8 @@
       var o = buildGoogleCloudApigeeV1DeploymentChangeReport();
       var od =
           api.GoogleCloudApigeeV1DeploymentChangeReport.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DeploymentChangeReport(od);
+      checkGoogleCloudApigeeV1DeploymentChangeReport(
+          od as api.GoogleCloudApigeeV1DeploymentChangeReport);
     });
   });
 
@@ -6601,7 +6746,8 @@
       var od =
           api.GoogleCloudApigeeV1DeploymentChangeReportRoutingChange.fromJson(
               o.toJson());
-      checkGoogleCloudApigeeV1DeploymentChangeReportRoutingChange(od);
+      checkGoogleCloudApigeeV1DeploymentChangeReportRoutingChange(
+          od as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingChange);
     });
   });
 
@@ -6613,7 +6759,8 @@
       var od =
           api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict.fromJson(
               o.toJson());
-      checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(od);
+      checkGoogleCloudApigeeV1DeploymentChangeReportRoutingConflict(
+          od as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingConflict);
     });
   });
 
@@ -6624,7 +6771,8 @@
       var o = buildGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment();
       var od = api.GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment
           .fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment(od);
+      checkGoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment(
+          od as api.GoogleCloudApigeeV1DeploymentChangeReportRoutingDeployment);
     });
   });
 
@@ -6632,7 +6780,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DeploymentConfig();
       var od = api.GoogleCloudApigeeV1DeploymentConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DeploymentConfig(od);
+      checkGoogleCloudApigeeV1DeploymentConfig(
+          od as api.GoogleCloudApigeeV1DeploymentConfig);
     });
   });
 
@@ -6640,7 +6789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Developer();
       var od = api.GoogleCloudApigeeV1Developer.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Developer(od);
+      checkGoogleCloudApigeeV1Developer(od as api.GoogleCloudApigeeV1Developer);
     });
   });
 
@@ -6648,7 +6797,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DeveloperApp();
       var od = api.GoogleCloudApigeeV1DeveloperApp.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DeveloperApp(od);
+      checkGoogleCloudApigeeV1DeveloperApp(
+          od as api.GoogleCloudApigeeV1DeveloperApp);
     });
   });
 
@@ -6656,7 +6806,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DeveloperAppKey();
       var od = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DeveloperAppKey(od);
+      checkGoogleCloudApigeeV1DeveloperAppKey(
+          od as api.GoogleCloudApigeeV1DeveloperAppKey);
     });
   });
 
@@ -6664,7 +6815,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1DimensionMetric();
       var od = api.GoogleCloudApigeeV1DimensionMetric.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1DimensionMetric(od);
+      checkGoogleCloudApigeeV1DimensionMetric(
+          od as api.GoogleCloudApigeeV1DimensionMetric);
     });
   });
 
@@ -6672,7 +6824,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1EntityMetadata();
       var od = api.GoogleCloudApigeeV1EntityMetadata.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1EntityMetadata(od);
+      checkGoogleCloudApigeeV1EntityMetadata(
+          od as api.GoogleCloudApigeeV1EntityMetadata);
     });
   });
 
@@ -6680,7 +6833,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Environment();
       var od = api.GoogleCloudApigeeV1Environment.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Environment(od);
+      checkGoogleCloudApigeeV1Environment(
+          od as api.GoogleCloudApigeeV1Environment);
     });
   });
 
@@ -6688,7 +6842,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1EnvironmentConfig();
       var od = api.GoogleCloudApigeeV1EnvironmentConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1EnvironmentConfig(od);
+      checkGoogleCloudApigeeV1EnvironmentConfig(
+          od as api.GoogleCloudApigeeV1EnvironmentConfig);
     });
   });
 
@@ -6696,7 +6851,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1EnvironmentGroup();
       var od = api.GoogleCloudApigeeV1EnvironmentGroup.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1EnvironmentGroup(od);
+      checkGoogleCloudApigeeV1EnvironmentGroup(
+          od as api.GoogleCloudApigeeV1EnvironmentGroup);
     });
   });
 
@@ -6706,7 +6862,8 @@
       var o = buildGoogleCloudApigeeV1EnvironmentGroupAttachment();
       var od = api.GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1EnvironmentGroupAttachment(od);
+      checkGoogleCloudApigeeV1EnvironmentGroupAttachment(
+          od as api.GoogleCloudApigeeV1EnvironmentGroupAttachment);
     });
   });
 
@@ -6715,7 +6872,8 @@
       var o = buildGoogleCloudApigeeV1EnvironmentGroupConfig();
       var od =
           api.GoogleCloudApigeeV1EnvironmentGroupConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1EnvironmentGroupConfig(od);
+      checkGoogleCloudApigeeV1EnvironmentGroupConfig(
+          od as api.GoogleCloudApigeeV1EnvironmentGroupConfig);
     });
   });
 
@@ -6723,7 +6881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Export();
       var od = api.GoogleCloudApigeeV1Export.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Export(od);
+      checkGoogleCloudApigeeV1Export(od as api.GoogleCloudApigeeV1Export);
     });
   });
 
@@ -6731,7 +6889,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ExportRequest();
       var od = api.GoogleCloudApigeeV1ExportRequest.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ExportRequest(od);
+      checkGoogleCloudApigeeV1ExportRequest(
+          od as api.GoogleCloudApigeeV1ExportRequest);
     });
   });
 
@@ -6739,7 +6898,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1FlowHook();
       var od = api.GoogleCloudApigeeV1FlowHook.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1FlowHook(od);
+      checkGoogleCloudApigeeV1FlowHook(od as api.GoogleCloudApigeeV1FlowHook);
     });
   });
 
@@ -6747,7 +6906,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1FlowHookConfig();
       var od = api.GoogleCloudApigeeV1FlowHookConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1FlowHookConfig(od);
+      checkGoogleCloudApigeeV1FlowHookConfig(
+          od as api.GoogleCloudApigeeV1FlowHookConfig);
     });
   });
 
@@ -6757,7 +6917,8 @@
       var o = buildGoogleCloudApigeeV1GetSyncAuthorizationRequest();
       var od = api.GoogleCloudApigeeV1GetSyncAuthorizationRequest.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1GetSyncAuthorizationRequest(od);
+      checkGoogleCloudApigeeV1GetSyncAuthorizationRequest(
+          od as api.GoogleCloudApigeeV1GetSyncAuthorizationRequest);
     });
   });
 
@@ -6765,7 +6926,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1IngressConfig();
       var od = api.GoogleCloudApigeeV1IngressConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1IngressConfig(od);
+      checkGoogleCloudApigeeV1IngressConfig(
+          od as api.GoogleCloudApigeeV1IngressConfig);
     });
   });
 
@@ -6773,7 +6935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Instance();
       var od = api.GoogleCloudApigeeV1Instance.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Instance(od);
+      checkGoogleCloudApigeeV1Instance(od as api.GoogleCloudApigeeV1Instance);
     });
   });
 
@@ -6781,7 +6943,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1InstanceAttachment();
       var od = api.GoogleCloudApigeeV1InstanceAttachment.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1InstanceAttachment(od);
+      checkGoogleCloudApigeeV1InstanceAttachment(
+          od as api.GoogleCloudApigeeV1InstanceAttachment);
     });
   });
 
@@ -6790,7 +6953,8 @@
       var o = buildGoogleCloudApigeeV1InstanceDeploymentStatus();
       var od =
           api.GoogleCloudApigeeV1InstanceDeploymentStatus.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1InstanceDeploymentStatus(od);
+      checkGoogleCloudApigeeV1InstanceDeploymentStatus(
+          od as api.GoogleCloudApigeeV1InstanceDeploymentStatus);
     });
   });
 
@@ -6802,7 +6966,8 @@
           buildGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision();
       var od = api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision
           .fromJson(o.toJson());
-      checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision(od);
+      checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision(od
+          as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRevision);
     });
   });
 
@@ -6814,7 +6979,8 @@
       var od =
           api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute.fromJson(
               o.toJson());
-      checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute(od);
+      checkGoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute(
+          od as api.GoogleCloudApigeeV1InstanceDeploymentStatusDeployedRoute);
     });
   });
 
@@ -6822,7 +6988,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1KeyAliasReference();
       var od = api.GoogleCloudApigeeV1KeyAliasReference.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1KeyAliasReference(od);
+      checkGoogleCloudApigeeV1KeyAliasReference(
+          od as api.GoogleCloudApigeeV1KeyAliasReference);
     });
   });
 
@@ -6830,7 +6997,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1KeyValueMap();
       var od = api.GoogleCloudApigeeV1KeyValueMap.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1KeyValueMap(od);
+      checkGoogleCloudApigeeV1KeyValueMap(
+          od as api.GoogleCloudApigeeV1KeyValueMap);
     });
   });
 
@@ -6838,7 +7006,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Keystore();
       var od = api.GoogleCloudApigeeV1Keystore.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Keystore(od);
+      checkGoogleCloudApigeeV1Keystore(od as api.GoogleCloudApigeeV1Keystore);
     });
   });
 
@@ -6846,7 +7014,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1KeystoreConfig();
       var od = api.GoogleCloudApigeeV1KeystoreConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1KeystoreConfig(od);
+      checkGoogleCloudApigeeV1KeystoreConfig(
+          od as api.GoogleCloudApigeeV1KeystoreConfig);
     });
   });
 
@@ -6855,7 +7024,8 @@
       var o = buildGoogleCloudApigeeV1ListApiCategoriesResponse();
       var od =
           api.GoogleCloudApigeeV1ListApiCategoriesResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListApiCategoriesResponse(od);
+      checkGoogleCloudApigeeV1ListApiCategoriesResponse(
+          od as api.GoogleCloudApigeeV1ListApiCategoriesResponse);
     });
   });
 
@@ -6864,7 +7034,8 @@
       var o = buildGoogleCloudApigeeV1ListApiProductsResponse();
       var od =
           api.GoogleCloudApigeeV1ListApiProductsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListApiProductsResponse(od);
+      checkGoogleCloudApigeeV1ListApiProductsResponse(
+          od as api.GoogleCloudApigeeV1ListApiProductsResponse);
     });
   });
 
@@ -6873,7 +7044,8 @@
       var o = buildGoogleCloudApigeeV1ListApiProxiesResponse();
       var od =
           api.GoogleCloudApigeeV1ListApiProxiesResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListApiProxiesResponse(od);
+      checkGoogleCloudApigeeV1ListApiProxiesResponse(
+          od as api.GoogleCloudApigeeV1ListApiProxiesResponse);
     });
   });
 
@@ -6881,7 +7053,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ListAppsResponse();
       var od = api.GoogleCloudApigeeV1ListAppsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListAppsResponse(od);
+      checkGoogleCloudApigeeV1ListAppsResponse(
+          od as api.GoogleCloudApigeeV1ListAppsResponse);
     });
   });
 
@@ -6890,7 +7063,8 @@
       var o = buildGoogleCloudApigeeV1ListAsyncQueriesResponse();
       var od =
           api.GoogleCloudApigeeV1ListAsyncQueriesResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListAsyncQueriesResponse(od);
+      checkGoogleCloudApigeeV1ListAsyncQueriesResponse(
+          od as api.GoogleCloudApigeeV1ListAsyncQueriesResponse);
     });
   });
 
@@ -6899,7 +7073,8 @@
       var o = buildGoogleCloudApigeeV1ListCustomReportsResponse();
       var od =
           api.GoogleCloudApigeeV1ListCustomReportsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListCustomReportsResponse(od);
+      checkGoogleCloudApigeeV1ListCustomReportsResponse(
+          od as api.GoogleCloudApigeeV1ListCustomReportsResponse);
     });
   });
 
@@ -6908,7 +7083,8 @@
       var o = buildGoogleCloudApigeeV1ListDatastoresResponse();
       var od =
           api.GoogleCloudApigeeV1ListDatastoresResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListDatastoresResponse(od);
+      checkGoogleCloudApigeeV1ListDatastoresResponse(
+          od as api.GoogleCloudApigeeV1ListDatastoresResponse);
     });
   });
 
@@ -6917,7 +7093,8 @@
       var o = buildGoogleCloudApigeeV1ListDebugSessionsResponse();
       var od =
           api.GoogleCloudApigeeV1ListDebugSessionsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListDebugSessionsResponse(od);
+      checkGoogleCloudApigeeV1ListDebugSessionsResponse(
+          od as api.GoogleCloudApigeeV1ListDebugSessionsResponse);
     });
   });
 
@@ -6926,7 +7103,8 @@
       var o = buildGoogleCloudApigeeV1ListDeploymentsResponse();
       var od =
           api.GoogleCloudApigeeV1ListDeploymentsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListDeploymentsResponse(od);
+      checkGoogleCloudApigeeV1ListDeploymentsResponse(
+          od as api.GoogleCloudApigeeV1ListDeploymentsResponse);
     });
   });
 
@@ -6935,7 +7113,8 @@
       var o = buildGoogleCloudApigeeV1ListDeveloperAppsResponse();
       var od =
           api.GoogleCloudApigeeV1ListDeveloperAppsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListDeveloperAppsResponse(od);
+      checkGoogleCloudApigeeV1ListDeveloperAppsResponse(
+          od as api.GoogleCloudApigeeV1ListDeveloperAppsResponse);
     });
   });
 
@@ -6946,7 +7125,8 @@
       var o = buildGoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse();
       var od = api.GoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse
           .fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse(od);
+      checkGoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse(
+          od as api.GoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse);
     });
   });
 
@@ -6956,7 +7136,8 @@
       var o = buildGoogleCloudApigeeV1ListEnvironmentGroupsResponse();
       var od = api.GoogleCloudApigeeV1ListEnvironmentGroupsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1ListEnvironmentGroupsResponse(od);
+      checkGoogleCloudApigeeV1ListEnvironmentGroupsResponse(
+          od as api.GoogleCloudApigeeV1ListEnvironmentGroupsResponse);
     });
   });
 
@@ -6966,7 +7147,8 @@
       var o = buildGoogleCloudApigeeV1ListEnvironmentResourcesResponse();
       var od = api.GoogleCloudApigeeV1ListEnvironmentResourcesResponse.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1ListEnvironmentResourcesResponse(od);
+      checkGoogleCloudApigeeV1ListEnvironmentResourcesResponse(
+          od as api.GoogleCloudApigeeV1ListEnvironmentResourcesResponse);
     });
   });
 
@@ -6974,7 +7156,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ListExportsResponse();
       var od = api.GoogleCloudApigeeV1ListExportsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListExportsResponse(od);
+      checkGoogleCloudApigeeV1ListExportsResponse(
+          od as api.GoogleCloudApigeeV1ListExportsResponse);
     });
   });
 
@@ -6983,7 +7166,8 @@
       var o = buildGoogleCloudApigeeV1ListHybridIssuersResponse();
       var od =
           api.GoogleCloudApigeeV1ListHybridIssuersResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListHybridIssuersResponse(od);
+      checkGoogleCloudApigeeV1ListHybridIssuersResponse(
+          od as api.GoogleCloudApigeeV1ListHybridIssuersResponse);
     });
   });
 
@@ -6993,7 +7177,8 @@
       var o = buildGoogleCloudApigeeV1ListInstanceAttachmentsResponse();
       var od = api.GoogleCloudApigeeV1ListInstanceAttachmentsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1ListInstanceAttachmentsResponse(od);
+      checkGoogleCloudApigeeV1ListInstanceAttachmentsResponse(
+          od as api.GoogleCloudApigeeV1ListInstanceAttachmentsResponse);
     });
   });
 
@@ -7002,7 +7187,8 @@
       var o = buildGoogleCloudApigeeV1ListInstancesResponse();
       var od =
           api.GoogleCloudApigeeV1ListInstancesResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListInstancesResponse(od);
+      checkGoogleCloudApigeeV1ListInstancesResponse(
+          od as api.GoogleCloudApigeeV1ListInstancesResponse);
     });
   });
 
@@ -7011,7 +7197,8 @@
       var o = buildGoogleCloudApigeeV1ListOfDevelopersResponse();
       var od =
           api.GoogleCloudApigeeV1ListOfDevelopersResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListOfDevelopersResponse(od);
+      checkGoogleCloudApigeeV1ListOfDevelopersResponse(
+          od as api.GoogleCloudApigeeV1ListOfDevelopersResponse);
     });
   });
 
@@ -7020,7 +7207,8 @@
       var o = buildGoogleCloudApigeeV1ListOrganizationsResponse();
       var od =
           api.GoogleCloudApigeeV1ListOrganizationsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListOrganizationsResponse(od);
+      checkGoogleCloudApigeeV1ListOrganizationsResponse(
+          od as api.GoogleCloudApigeeV1ListOrganizationsResponse);
     });
   });
 
@@ -7029,7 +7217,8 @@
       var o = buildGoogleCloudApigeeV1ListSharedFlowsResponse();
       var od =
           api.GoogleCloudApigeeV1ListSharedFlowsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ListSharedFlowsResponse(od);
+      checkGoogleCloudApigeeV1ListSharedFlowsResponse(
+          od as api.GoogleCloudApigeeV1ListSharedFlowsResponse);
     });
   });
 
@@ -7037,7 +7226,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Metadata();
       var od = api.GoogleCloudApigeeV1Metadata.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Metadata(od);
+      checkGoogleCloudApigeeV1Metadata(od as api.GoogleCloudApigeeV1Metadata);
     });
   });
 
@@ -7045,7 +7234,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Metric();
       var od = api.GoogleCloudApigeeV1Metric.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Metric(od);
+      checkGoogleCloudApigeeV1Metric(od as api.GoogleCloudApigeeV1Metric);
     });
   });
 
@@ -7053,7 +7242,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Operation();
       var od = api.GoogleCloudApigeeV1Operation.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Operation(od);
+      checkGoogleCloudApigeeV1Operation(od as api.GoogleCloudApigeeV1Operation);
     });
   });
 
@@ -7061,7 +7250,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1OperationConfig();
       var od = api.GoogleCloudApigeeV1OperationConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1OperationConfig(od);
+      checkGoogleCloudApigeeV1OperationConfig(
+          od as api.GoogleCloudApigeeV1OperationConfig);
     });
   });
 
@@ -7069,7 +7259,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1OperationGroup();
       var od = api.GoogleCloudApigeeV1OperationGroup.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1OperationGroup(od);
+      checkGoogleCloudApigeeV1OperationGroup(
+          od as api.GoogleCloudApigeeV1OperationGroup);
     });
   });
 
@@ -7077,7 +7268,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1OperationMetadata();
       var od = api.GoogleCloudApigeeV1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1OperationMetadata(od);
+      checkGoogleCloudApigeeV1OperationMetadata(
+          od as api.GoogleCloudApigeeV1OperationMetadata);
     });
   });
 
@@ -7085,7 +7277,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1OptimizedStats();
       var od = api.GoogleCloudApigeeV1OptimizedStats.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1OptimizedStats(od);
+      checkGoogleCloudApigeeV1OptimizedStats(
+          od as api.GoogleCloudApigeeV1OptimizedStats);
     });
   });
 
@@ -7093,7 +7286,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1OptimizedStatsNode();
       var od = api.GoogleCloudApigeeV1OptimizedStatsNode.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1OptimizedStatsNode(od);
+      checkGoogleCloudApigeeV1OptimizedStatsNode(
+          od as api.GoogleCloudApigeeV1OptimizedStatsNode);
     });
   });
 
@@ -7102,7 +7296,8 @@
       var o = buildGoogleCloudApigeeV1OptimizedStatsResponse();
       var od =
           api.GoogleCloudApigeeV1OptimizedStatsResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1OptimizedStatsResponse(od);
+      checkGoogleCloudApigeeV1OptimizedStatsResponse(
+          od as api.GoogleCloudApigeeV1OptimizedStatsResponse);
     });
   });
 
@@ -7110,7 +7305,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Organization();
       var od = api.GoogleCloudApigeeV1Organization.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Organization(od);
+      checkGoogleCloudApigeeV1Organization(
+          od as api.GoogleCloudApigeeV1Organization);
     });
   });
 
@@ -7120,7 +7316,8 @@
       var o = buildGoogleCloudApigeeV1OrganizationProjectMapping();
       var od = api.GoogleCloudApigeeV1OrganizationProjectMapping.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1OrganizationProjectMapping(od);
+      checkGoogleCloudApigeeV1OrganizationProjectMapping(
+          od as api.GoogleCloudApigeeV1OrganizationProjectMapping);
     });
   });
 
@@ -7128,7 +7325,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1PodStatus();
       var od = api.GoogleCloudApigeeV1PodStatus.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1PodStatus(od);
+      checkGoogleCloudApigeeV1PodStatus(od as api.GoogleCloudApigeeV1PodStatus);
     });
   });
 
@@ -7136,7 +7333,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Point();
       var od = api.GoogleCloudApigeeV1Point.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Point(od);
+      checkGoogleCloudApigeeV1Point(od as api.GoogleCloudApigeeV1Point);
     });
   });
 
@@ -7144,7 +7341,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Properties();
       var od = api.GoogleCloudApigeeV1Properties.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Properties(od);
+      checkGoogleCloudApigeeV1Properties(
+          od as api.GoogleCloudApigeeV1Properties);
     });
   });
 
@@ -7152,7 +7350,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Property();
       var od = api.GoogleCloudApigeeV1Property.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Property(od);
+      checkGoogleCloudApigeeV1Property(od as api.GoogleCloudApigeeV1Property);
     });
   });
 
@@ -7162,7 +7360,8 @@
       var o = buildGoogleCloudApigeeV1ProvisionOrganizationRequest();
       var od = api.GoogleCloudApigeeV1ProvisionOrganizationRequest.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1ProvisionOrganizationRequest(od);
+      checkGoogleCloudApigeeV1ProvisionOrganizationRequest(
+          od as api.GoogleCloudApigeeV1ProvisionOrganizationRequest);
     });
   });
 
@@ -7170,7 +7369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Query();
       var od = api.GoogleCloudApigeeV1Query.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Query(od);
+      checkGoogleCloudApigeeV1Query(od as api.GoogleCloudApigeeV1Query);
     });
   });
 
@@ -7178,7 +7377,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1QueryMetadata();
       var od = api.GoogleCloudApigeeV1QueryMetadata.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1QueryMetadata(od);
+      checkGoogleCloudApigeeV1QueryMetadata(
+          od as api.GoogleCloudApigeeV1QueryMetadata);
     });
   });
 
@@ -7186,7 +7386,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1QueryMetric();
       var od = api.GoogleCloudApigeeV1QueryMetric.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1QueryMetric(od);
+      checkGoogleCloudApigeeV1QueryMetric(
+          od as api.GoogleCloudApigeeV1QueryMetric);
     });
   });
 
@@ -7194,7 +7395,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Quota();
       var od = api.GoogleCloudApigeeV1Quota.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Quota(od);
+      checkGoogleCloudApigeeV1Quota(od as api.GoogleCloudApigeeV1Quota);
     });
   });
 
@@ -7202,7 +7403,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Reference();
       var od = api.GoogleCloudApigeeV1Reference.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Reference(od);
+      checkGoogleCloudApigeeV1Reference(od as api.GoogleCloudApigeeV1Reference);
     });
   });
 
@@ -7210,7 +7411,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ReferenceConfig();
       var od = api.GoogleCloudApigeeV1ReferenceConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ReferenceConfig(od);
+      checkGoogleCloudApigeeV1ReferenceConfig(
+          od as api.GoogleCloudApigeeV1ReferenceConfig);
     });
   });
 
@@ -7220,7 +7422,8 @@
       var o = buildGoogleCloudApigeeV1ReportInstanceStatusRequest();
       var od = api.GoogleCloudApigeeV1ReportInstanceStatusRequest.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1ReportInstanceStatusRequest(od);
+      checkGoogleCloudApigeeV1ReportInstanceStatusRequest(
+          od as api.GoogleCloudApigeeV1ReportInstanceStatusRequest);
     });
   });
 
@@ -7230,7 +7433,8 @@
       var o = buildGoogleCloudApigeeV1ReportInstanceStatusResponse();
       var od = api.GoogleCloudApigeeV1ReportInstanceStatusResponse.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1ReportInstanceStatusResponse(od);
+      checkGoogleCloudApigeeV1ReportInstanceStatusResponse(
+          od as api.GoogleCloudApigeeV1ReportInstanceStatusResponse);
     });
   });
 
@@ -7238,7 +7442,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ReportProperty();
       var od = api.GoogleCloudApigeeV1ReportProperty.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ReportProperty(od);
+      checkGoogleCloudApigeeV1ReportProperty(
+          od as api.GoogleCloudApigeeV1ReportProperty);
     });
   });
 
@@ -7246,7 +7451,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ResourceConfig();
       var od = api.GoogleCloudApigeeV1ResourceConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ResourceConfig(od);
+      checkGoogleCloudApigeeV1ResourceConfig(
+          od as api.GoogleCloudApigeeV1ResourceConfig);
     });
   });
 
@@ -7254,7 +7460,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ResourceFile();
       var od = api.GoogleCloudApigeeV1ResourceFile.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ResourceFile(od);
+      checkGoogleCloudApigeeV1ResourceFile(
+          od as api.GoogleCloudApigeeV1ResourceFile);
     });
   });
 
@@ -7262,7 +7469,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ResourceFiles();
       var od = api.GoogleCloudApigeeV1ResourceFiles.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ResourceFiles(od);
+      checkGoogleCloudApigeeV1ResourceFiles(
+          od as api.GoogleCloudApigeeV1ResourceFiles);
     });
   });
 
@@ -7270,7 +7478,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1ResourceStatus();
       var od = api.GoogleCloudApigeeV1ResourceStatus.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ResourceStatus(od);
+      checkGoogleCloudApigeeV1ResourceStatus(
+          od as api.GoogleCloudApigeeV1ResourceStatus);
     });
   });
 
@@ -7278,7 +7487,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Result();
       var od = api.GoogleCloudApigeeV1Result.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Result(od);
+      checkGoogleCloudApigeeV1Result(od as api.GoogleCloudApigeeV1Result);
     });
   });
 
@@ -7286,7 +7495,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1RevisionStatus();
       var od = api.GoogleCloudApigeeV1RevisionStatus.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1RevisionStatus(od);
+      checkGoogleCloudApigeeV1RevisionStatus(
+          od as api.GoogleCloudApigeeV1RevisionStatus);
     });
   });
 
@@ -7294,7 +7504,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1RoutingRule();
       var od = api.GoogleCloudApigeeV1RoutingRule.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1RoutingRule(od);
+      checkGoogleCloudApigeeV1RoutingRule(
+          od as api.GoogleCloudApigeeV1RoutingRule);
     });
   });
 
@@ -7302,7 +7513,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1RuntimeTraceConfig();
       var od = api.GoogleCloudApigeeV1RuntimeTraceConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1RuntimeTraceConfig(od);
+      checkGoogleCloudApigeeV1RuntimeTraceConfig(
+          od as api.GoogleCloudApigeeV1RuntimeTraceConfig);
     });
   });
 
@@ -7312,7 +7524,8 @@
       var o = buildGoogleCloudApigeeV1RuntimeTraceConfigOverride();
       var od = api.GoogleCloudApigeeV1RuntimeTraceConfigOverride.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1RuntimeTraceConfigOverride(od);
+      checkGoogleCloudApigeeV1RuntimeTraceConfigOverride(
+          od as api.GoogleCloudApigeeV1RuntimeTraceConfigOverride);
     });
   });
 
@@ -7322,7 +7535,8 @@
       var o = buildGoogleCloudApigeeV1RuntimeTraceSamplingConfig();
       var od = api.GoogleCloudApigeeV1RuntimeTraceSamplingConfig.fromJson(
           o.toJson());
-      checkGoogleCloudApigeeV1RuntimeTraceSamplingConfig(od);
+      checkGoogleCloudApigeeV1RuntimeTraceSamplingConfig(
+          od as api.GoogleCloudApigeeV1RuntimeTraceSamplingConfig);
     });
   });
 
@@ -7335,7 +7549,9 @@
       var od =
           api.GoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange
               .fromJson(o.toJson());
-      checkGoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange(od);
+      checkGoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange(od
+          as api
+              .GoogleCloudApigeeV1RuntimeTraceSamplingConfigResponseCodeRange);
     });
   });
 
@@ -7343,7 +7559,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Schema();
       var od = api.GoogleCloudApigeeV1Schema.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Schema(od);
+      checkGoogleCloudApigeeV1Schema(od as api.GoogleCloudApigeeV1Schema);
     });
   });
 
@@ -7351,7 +7567,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1SchemaSchemaElement();
       var od = api.GoogleCloudApigeeV1SchemaSchemaElement.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1SchemaSchemaElement(od);
+      checkGoogleCloudApigeeV1SchemaSchemaElement(
+          od as api.GoogleCloudApigeeV1SchemaSchemaElement);
     });
   });
 
@@ -7359,7 +7576,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1SchemaSchemaProperty();
       var od = api.GoogleCloudApigeeV1SchemaSchemaProperty.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1SchemaSchemaProperty(od);
+      checkGoogleCloudApigeeV1SchemaSchemaProperty(
+          od as api.GoogleCloudApigeeV1SchemaSchemaProperty);
     });
   });
 
@@ -7368,7 +7586,8 @@
       var o = buildGoogleCloudApigeeV1ServiceIssuersMapping();
       var od =
           api.GoogleCloudApigeeV1ServiceIssuersMapping.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1ServiceIssuersMapping(od);
+      checkGoogleCloudApigeeV1ServiceIssuersMapping(
+          od as api.GoogleCloudApigeeV1ServiceIssuersMapping);
     });
   });
 
@@ -7376,7 +7595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Session();
       var od = api.GoogleCloudApigeeV1Session.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Session(od);
+      checkGoogleCloudApigeeV1Session(od as api.GoogleCloudApigeeV1Session);
     });
   });
 
@@ -7384,7 +7603,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1SharedFlow();
       var od = api.GoogleCloudApigeeV1SharedFlow.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1SharedFlow(od);
+      checkGoogleCloudApigeeV1SharedFlow(
+          od as api.GoogleCloudApigeeV1SharedFlow);
     });
   });
 
@@ -7392,7 +7612,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1SharedFlowRevision();
       var od = api.GoogleCloudApigeeV1SharedFlowRevision.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1SharedFlowRevision(od);
+      checkGoogleCloudApigeeV1SharedFlowRevision(
+          od as api.GoogleCloudApigeeV1SharedFlowRevision);
     });
   });
 
@@ -7400,7 +7621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Stats();
       var od = api.GoogleCloudApigeeV1Stats.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Stats(od);
+      checkGoogleCloudApigeeV1Stats(od as api.GoogleCloudApigeeV1Stats);
     });
   });
 
@@ -7409,7 +7630,8 @@
       var o = buildGoogleCloudApigeeV1StatsEnvironmentStats();
       var od =
           api.GoogleCloudApigeeV1StatsEnvironmentStats.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1StatsEnvironmentStats(od);
+      checkGoogleCloudApigeeV1StatsEnvironmentStats(
+          od as api.GoogleCloudApigeeV1StatsEnvironmentStats);
     });
   });
 
@@ -7417,7 +7639,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1Subscription();
       var od = api.GoogleCloudApigeeV1Subscription.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1Subscription(od);
+      checkGoogleCloudApigeeV1Subscription(
+          od as api.GoogleCloudApigeeV1Subscription);
     });
   });
 
@@ -7425,7 +7648,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1SyncAuthorization();
       var od = api.GoogleCloudApigeeV1SyncAuthorization.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1SyncAuthorization(od);
+      checkGoogleCloudApigeeV1SyncAuthorization(
+          od as api.GoogleCloudApigeeV1SyncAuthorization);
     });
   });
 
@@ -7433,7 +7657,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1TargetServer();
       var od = api.GoogleCloudApigeeV1TargetServer.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1TargetServer(od);
+      checkGoogleCloudApigeeV1TargetServer(
+          od as api.GoogleCloudApigeeV1TargetServer);
     });
   });
 
@@ -7441,7 +7666,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1TargetServerConfig();
       var od = api.GoogleCloudApigeeV1TargetServerConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1TargetServerConfig(od);
+      checkGoogleCloudApigeeV1TargetServerConfig(
+          od as api.GoogleCloudApigeeV1TargetServerConfig);
     });
   });
 
@@ -7450,7 +7676,8 @@
       var o = buildGoogleCloudApigeeV1TestDatastoreResponse();
       var od =
           api.GoogleCloudApigeeV1TestDatastoreResponse.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1TestDatastoreResponse(od);
+      checkGoogleCloudApigeeV1TestDatastoreResponse(
+          od as api.GoogleCloudApigeeV1TestDatastoreResponse);
     });
   });
 
@@ -7458,7 +7685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1TlsInfo();
       var od = api.GoogleCloudApigeeV1TlsInfo.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1TlsInfo(od);
+      checkGoogleCloudApigeeV1TlsInfo(od as api.GoogleCloudApigeeV1TlsInfo);
     });
   });
 
@@ -7466,7 +7693,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1TlsInfoCommonName();
       var od = api.GoogleCloudApigeeV1TlsInfoCommonName.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1TlsInfoCommonName(od);
+      checkGoogleCloudApigeeV1TlsInfoCommonName(
+          od as api.GoogleCloudApigeeV1TlsInfoCommonName);
     });
   });
 
@@ -7474,7 +7702,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1TlsInfoConfig();
       var od = api.GoogleCloudApigeeV1TlsInfoConfig.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1TlsInfoConfig(od);
+      checkGoogleCloudApigeeV1TlsInfoConfig(
+          od as api.GoogleCloudApigeeV1TlsInfoConfig);
     });
   });
 
@@ -7482,7 +7711,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudApigeeV1UpdateError();
       var od = api.GoogleCloudApigeeV1UpdateError.fromJson(o.toJson());
-      checkGoogleCloudApigeeV1UpdateError(od);
+      checkGoogleCloudApigeeV1UpdateError(
+          od as api.GoogleCloudApigeeV1UpdateError);
     });
   });
 
@@ -7490,7 +7720,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1AuditConfig();
       var od = api.GoogleIamV1AuditConfig.fromJson(o.toJson());
-      checkGoogleIamV1AuditConfig(od);
+      checkGoogleIamV1AuditConfig(od as api.GoogleIamV1AuditConfig);
     });
   });
 
@@ -7498,7 +7728,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1AuditLogConfig();
       var od = api.GoogleIamV1AuditLogConfig.fromJson(o.toJson());
-      checkGoogleIamV1AuditLogConfig(od);
+      checkGoogleIamV1AuditLogConfig(od as api.GoogleIamV1AuditLogConfig);
     });
   });
 
@@ -7506,7 +7736,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1Binding();
       var od = api.GoogleIamV1Binding.fromJson(o.toJson());
-      checkGoogleIamV1Binding(od);
+      checkGoogleIamV1Binding(od as api.GoogleIamV1Binding);
     });
   });
 
@@ -7514,7 +7744,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1Policy();
       var od = api.GoogleIamV1Policy.fromJson(o.toJson());
-      checkGoogleIamV1Policy(od);
+      checkGoogleIamV1Policy(od as api.GoogleIamV1Policy);
     });
   });
 
@@ -7522,7 +7752,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1SetIamPolicyRequest();
       var od = api.GoogleIamV1SetIamPolicyRequest.fromJson(o.toJson());
-      checkGoogleIamV1SetIamPolicyRequest(od);
+      checkGoogleIamV1SetIamPolicyRequest(
+          od as api.GoogleIamV1SetIamPolicyRequest);
     });
   });
 
@@ -7530,7 +7761,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1TestIamPermissionsRequest();
       var od = api.GoogleIamV1TestIamPermissionsRequest.fromJson(o.toJson());
-      checkGoogleIamV1TestIamPermissionsRequest(od);
+      checkGoogleIamV1TestIamPermissionsRequest(
+          od as api.GoogleIamV1TestIamPermissionsRequest);
     });
   });
 
@@ -7538,7 +7770,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1TestIamPermissionsResponse();
       var od = api.GoogleIamV1TestIamPermissionsResponse.fromJson(o.toJson());
-      checkGoogleIamV1TestIamPermissionsResponse(od);
+      checkGoogleIamV1TestIamPermissionsResponse(
+          od as api.GoogleIamV1TestIamPermissionsResponse);
     });
   });
 
@@ -7546,7 +7779,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningListOperationsResponse();
       var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
-      checkGoogleLongrunningListOperationsResponse(od);
+      checkGoogleLongrunningListOperationsResponse(
+          od as api.GoogleLongrunningListOperationsResponse);
     });
   });
 
@@ -7554,7 +7788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningOperation();
       var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
-      checkGoogleLongrunningOperation(od);
+      checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
 
@@ -7562,7 +7796,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleProtobufEmpty();
       var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
-      checkGoogleProtobufEmpty(od);
+      checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
 
@@ -7570,7 +7804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcPreconditionFailure();
       var od = api.GoogleRpcPreconditionFailure.fromJson(o.toJson());
-      checkGoogleRpcPreconditionFailure(od);
+      checkGoogleRpcPreconditionFailure(od as api.GoogleRpcPreconditionFailure);
     });
   });
 
@@ -7578,7 +7812,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcPreconditionFailureViolation();
       var od = api.GoogleRpcPreconditionFailureViolation.fromJson(o.toJson());
-      checkGoogleRpcPreconditionFailureViolation(od);
+      checkGoogleRpcPreconditionFailureViolation(
+          od as api.GoogleRpcPreconditionFailureViolation);
     });
   });
 
@@ -7586,7 +7821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcStatus();
       var od = api.GoogleRpcStatus.fromJson(o.toJson());
-      checkGoogleRpcStatus(od);
+      checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
 
@@ -7594,7 +7829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleTypeExpr();
       var od = api.GoogleTypeExpr.fromJson(o.toJson());
-      checkGoogleTypeExpr(od);
+      checkGoogleTypeExpr(od as api.GoogleTypeExpr);
     });
   });
 
@@ -7644,7 +7879,8 @@
       res
           .list(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListHybridIssuersResponse(response);
+        checkGoogleCloudApigeeV1ListHybridIssuersResponse(
+            response as api.GoogleCloudApigeeV1ListHybridIssuersResponse);
       })));
     });
   });
@@ -7657,8 +7893,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Organization.fromJson(json);
-        checkGoogleCloudApigeeV1Organization(obj);
+        var obj = api.GoogleCloudApigeeV1Organization.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Organization(
+            obj as api.GoogleCloudApigeeV1Organization);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7698,7 +7936,8 @@
       res
           .create(arg_request, parent: arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -7746,7 +7985,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Organization(response);
+        checkGoogleCloudApigeeV1Organization(
+            response as api.GoogleCloudApigeeV1Organization);
       })));
     });
 
@@ -7797,7 +8037,8 @@
           .getDeployedIngressConfig(arg_name,
               view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1IngressConfig(response);
+        checkGoogleCloudApigeeV1IngressConfig(
+            response as api.GoogleCloudApigeeV1IngressConfig);
       })));
     });
 
@@ -7808,9 +8049,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleCloudApigeeV1GetSyncAuthorizationRequest.fromJson(json);
-        checkGoogleCloudApigeeV1GetSyncAuthorizationRequest(obj);
+        var obj = api.GoogleCloudApigeeV1GetSyncAuthorizationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1GetSyncAuthorizationRequest(
+            obj as api.GoogleCloudApigeeV1GetSyncAuthorizationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7851,7 +8093,8 @@
       res
           .getSyncAuthorization(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1SyncAuthorization(response);
+        checkGoogleCloudApigeeV1SyncAuthorization(
+            response as api.GoogleCloudApigeeV1SyncAuthorization);
       })));
     });
 
@@ -7900,7 +8143,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListOrganizationsResponse(response);
+        checkGoogleCloudApigeeV1ListOrganizationsResponse(
+            response as api.GoogleCloudApigeeV1ListOrganizationsResponse);
       })));
     });
 
@@ -7911,8 +8155,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1SyncAuthorization.fromJson(json);
-        checkGoogleCloudApigeeV1SyncAuthorization(obj);
+        var obj = api.GoogleCloudApigeeV1SyncAuthorization.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1SyncAuthorization(
+            obj as api.GoogleCloudApigeeV1SyncAuthorization);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7953,7 +8199,8 @@
       res
           .setSyncAuthorization(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1SyncAuthorization(response);
+        checkGoogleCloudApigeeV1SyncAuthorization(
+            response as api.GoogleCloudApigeeV1SyncAuthorization);
       })));
     });
 
@@ -7964,8 +8211,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Organization.fromJson(json);
-        checkGoogleCloudApigeeV1Organization(obj);
+        var obj = api.GoogleCloudApigeeV1Organization.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Organization(
+            obj as api.GoogleCloudApigeeV1Organization);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8005,7 +8254,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Organization(response);
+        checkGoogleCloudApigeeV1Organization(
+            response as api.GoogleCloudApigeeV1Organization);
       })));
     });
   });
@@ -8018,8 +8268,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Datastore.fromJson(json);
-        checkGoogleCloudApigeeV1Datastore(obj);
+        var obj = api.GoogleCloudApigeeV1Datastore.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Datastore(
+            obj as api.GoogleCloudApigeeV1Datastore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8059,7 +8311,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Datastore(response);
+        checkGoogleCloudApigeeV1Datastore(
+            response as api.GoogleCloudApigeeV1Datastore);
       })));
     });
 
@@ -8107,7 +8360,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8155,7 +8408,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Datastore(response);
+        checkGoogleCloudApigeeV1Datastore(
+            response as api.GoogleCloudApigeeV1Datastore);
       })));
     });
 
@@ -8207,7 +8461,8 @@
       res
           .list(arg_parent, targetType: arg_targetType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDatastoresResponse(response);
+        checkGoogleCloudApigeeV1ListDatastoresResponse(
+            response as api.GoogleCloudApigeeV1ListDatastoresResponse);
       })));
     });
 
@@ -8218,8 +8473,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Datastore.fromJson(json);
-        checkGoogleCloudApigeeV1Datastore(obj);
+        var obj = api.GoogleCloudApigeeV1Datastore.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Datastore(
+            obj as api.GoogleCloudApigeeV1Datastore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8260,7 +8517,8 @@
       res
           .test(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1TestDatastoreResponse(response);
+        checkGoogleCloudApigeeV1TestDatastoreResponse(
+            response as api.GoogleCloudApigeeV1TestDatastoreResponse);
       })));
     });
 
@@ -8271,8 +8529,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Datastore.fromJson(json);
-        checkGoogleCloudApigeeV1Datastore(obj);
+        var obj = api.GoogleCloudApigeeV1Datastore.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Datastore(
+            obj as api.GoogleCloudApigeeV1Datastore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8312,7 +8572,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Datastore(response);
+        checkGoogleCloudApigeeV1Datastore(
+            response as api.GoogleCloudApigeeV1Datastore);
       })));
     });
   });
@@ -8325,8 +8586,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Attributes.fromJson(json);
-        checkGoogleCloudApigeeV1Attributes(obj);
+        var obj = api.GoogleCloudApigeeV1Attributes.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Attributes(
+            obj as api.GoogleCloudApigeeV1Attributes);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8366,7 +8629,8 @@
       res
           .attributes(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attributes(response);
+        checkGoogleCloudApigeeV1Attributes(
+            response as api.GoogleCloudApigeeV1Attributes);
       })));
     });
 
@@ -8377,8 +8641,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1ApiProduct.fromJson(json);
-        checkGoogleCloudApigeeV1ApiProduct(obj);
+        var obj = api.GoogleCloudApigeeV1ApiProduct.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1ApiProduct(
+            obj as api.GoogleCloudApigeeV1ApiProduct);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8418,7 +8684,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProduct(response);
+        checkGoogleCloudApigeeV1ApiProduct(
+            response as api.GoogleCloudApigeeV1ApiProduct);
       })));
     });
 
@@ -8466,7 +8733,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProduct(response);
+        checkGoogleCloudApigeeV1ApiProduct(
+            response as api.GoogleCloudApigeeV1ApiProduct);
       })));
     });
 
@@ -8514,7 +8782,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProduct(response);
+        checkGoogleCloudApigeeV1ApiProduct(
+            response as api.GoogleCloudApigeeV1ApiProduct);
       })));
     });
 
@@ -8583,7 +8852,8 @@
               startKey: arg_startKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListApiProductsResponse(response);
+        checkGoogleCloudApigeeV1ListApiProductsResponse(
+            response as api.GoogleCloudApigeeV1ListApiProductsResponse);
       })));
     });
 
@@ -8594,8 +8864,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1ApiProduct.fromJson(json);
-        checkGoogleCloudApigeeV1ApiProduct(obj);
+        var obj = api.GoogleCloudApigeeV1ApiProduct.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1ApiProduct(
+            obj as api.GoogleCloudApigeeV1ApiProduct);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8635,7 +8907,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProduct(response);
+        checkGoogleCloudApigeeV1ApiProduct(
+            response as api.GoogleCloudApigeeV1ApiProduct);
       })));
     });
   });
@@ -8685,7 +8958,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
 
@@ -8733,7 +9007,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
 
@@ -8781,7 +9056,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attributes(response);
+        checkGoogleCloudApigeeV1Attributes(
+            response as api.GoogleCloudApigeeV1Attributes);
       })));
     });
 
@@ -8792,8 +9068,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Attribute.fromJson(json);
-        checkGoogleCloudApigeeV1Attribute(obj);
+        var obj = api.GoogleCloudApigeeV1Attribute.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Attribute(
+            obj as api.GoogleCloudApigeeV1Attribute);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8834,7 +9112,8 @@
           .updateApiProductAttribute(arg_request, arg_name,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
   });
@@ -8850,8 +9129,9 @@
       var arg_validate = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8900,7 +9180,8 @@
               validate: arg_validate,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProxyRevision(response);
+        checkGoogleCloudApigeeV1ApiProxyRevision(
+            response as api.GoogleCloudApigeeV1ApiProxyRevision);
       })));
     });
 
@@ -8948,7 +9229,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProxy(response);
+        checkGoogleCloudApigeeV1ApiProxy(
+            response as api.GoogleCloudApigeeV1ApiProxy);
       })));
     });
 
@@ -8996,7 +9278,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProxy(response);
+        checkGoogleCloudApigeeV1ApiProxy(
+            response as api.GoogleCloudApigeeV1ApiProxy);
       })));
     });
 
@@ -9054,7 +9337,8 @@
               includeRevisions: arg_includeRevisions,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListApiProxiesResponse(response);
+        checkGoogleCloudApigeeV1ListApiProxiesResponse(
+            response as api.GoogleCloudApigeeV1ListApiProxiesResponse);
       })));
     });
   });
@@ -9105,7 +9389,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -9118,8 +9403,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1KeyValueMap.fromJson(json);
-        checkGoogleCloudApigeeV1KeyValueMap(obj);
+        var obj = api.GoogleCloudApigeeV1KeyValueMap.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            obj as api.GoogleCloudApigeeV1KeyValueMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9159,7 +9446,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1KeyValueMap(response);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            response as api.GoogleCloudApigeeV1KeyValueMap);
       })));
     });
 
@@ -9207,7 +9495,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1KeyValueMap(response);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            response as api.GoogleCloudApigeeV1KeyValueMap);
       })));
     });
   });
@@ -9258,7 +9547,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProxyRevision(response);
+        checkGoogleCloudApigeeV1ApiProxyRevision(
+            response as api.GoogleCloudApigeeV1ApiProxyRevision);
       })));
     });
 
@@ -9308,7 +9598,7 @@
       res
           .get(arg_name, format: arg_format, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
 
@@ -9320,8 +9610,9 @@
       var arg_validate = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9365,7 +9656,8 @@
           .updateApiProxyRevision(arg_request, arg_name,
               validate: arg_validate, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiProxyRevision(response);
+        checkGoogleCloudApigeeV1ApiProxyRevision(
+            response as api.GoogleCloudApigeeV1ApiProxyRevision);
       })));
     });
   });
@@ -9417,7 +9709,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -9467,7 +9760,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1App(response);
+        checkGoogleCloudApigeeV1App(response as api.GoogleCloudApigeeV1App);
       })));
     });
 
@@ -9550,7 +9843,8 @@
               status: arg_status,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListAppsResponse(response);
+        checkGoogleCloudApigeeV1ListAppsResponse(
+            response as api.GoogleCloudApigeeV1ListAppsResponse);
       })));
     });
   });
@@ -9604,7 +9898,8 @@
       res
           .list(arg_parent, sharedFlows: arg_sharedFlows, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -9617,8 +9912,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Attributes.fromJson(json);
-        checkGoogleCloudApigeeV1Attributes(obj);
+        var obj = api.GoogleCloudApigeeV1Attributes.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Attributes(
+            obj as api.GoogleCloudApigeeV1Attributes);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9658,7 +9955,8 @@
       res
           .attributes(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attributes(response);
+        checkGoogleCloudApigeeV1Attributes(
+            response as api.GoogleCloudApigeeV1Attributes);
       })));
     });
 
@@ -9669,8 +9967,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Developer.fromJson(json);
-        checkGoogleCloudApigeeV1Developer(obj);
+        var obj = api.GoogleCloudApigeeV1Developer.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Developer(
+            obj as api.GoogleCloudApigeeV1Developer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9710,7 +10010,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Developer(response);
+        checkGoogleCloudApigeeV1Developer(
+            response as api.GoogleCloudApigeeV1Developer);
       })));
     });
 
@@ -9758,7 +10059,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Developer(response);
+        checkGoogleCloudApigeeV1Developer(
+            response as api.GoogleCloudApigeeV1Developer);
       })));
     });
 
@@ -9808,7 +10110,8 @@
       res
           .get(arg_name, action: arg_action, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Developer(response);
+        checkGoogleCloudApigeeV1Developer(
+            response as api.GoogleCloudApigeeV1Developer);
       })));
     });
 
@@ -9876,7 +10179,8 @@
               startKey: arg_startKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListOfDevelopersResponse(response);
+        checkGoogleCloudApigeeV1ListOfDevelopersResponse(
+            response as api.GoogleCloudApigeeV1ListOfDevelopersResponse);
       })));
     });
 
@@ -9927,7 +10231,7 @@
           .setDeveloperStatus(arg_name,
               action: arg_action, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -9938,8 +10242,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Developer.fromJson(json);
-        checkGoogleCloudApigeeV1Developer(obj);
+        var obj = api.GoogleCloudApigeeV1Developer.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Developer(
+            obj as api.GoogleCloudApigeeV1Developer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9979,7 +10285,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Developer(response);
+        checkGoogleCloudApigeeV1Developer(
+            response as api.GoogleCloudApigeeV1Developer);
       })));
     });
   });
@@ -9992,8 +10299,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Attributes.fromJson(json);
-        checkGoogleCloudApigeeV1Attributes(obj);
+        var obj = api.GoogleCloudApigeeV1Attributes.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Attributes(
+            obj as api.GoogleCloudApigeeV1Attributes);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10033,7 +10342,8 @@
       res
           .attributes(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attributes(response);
+        checkGoogleCloudApigeeV1Attributes(
+            response as api.GoogleCloudApigeeV1Attributes);
       })));
     });
 
@@ -10044,8 +10354,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DeveloperApp.fromJson(json);
-        checkGoogleCloudApigeeV1DeveloperApp(obj);
+        var obj = api.GoogleCloudApigeeV1DeveloperApp.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            obj as api.GoogleCloudApigeeV1DeveloperApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10085,7 +10397,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperApp(response);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            response as api.GoogleCloudApigeeV1DeveloperApp);
       })));
     });
 
@@ -10133,7 +10446,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperApp(response);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            response as api.GoogleCloudApigeeV1DeveloperApp);
       })));
     });
 
@@ -10145,8 +10459,10 @@
       var arg_action = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DeveloperApp.fromJson(json);
-        checkGoogleCloudApigeeV1DeveloperApp(obj);
+        var obj = api.GoogleCloudApigeeV1DeveloperApp.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            obj as api.GoogleCloudApigeeV1DeveloperApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10188,7 +10504,8 @@
           .generateKeyPairOrUpdateDeveloperAppStatus(arg_request, arg_name,
               action: arg_action, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperApp(response);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            response as api.GoogleCloudApigeeV1DeveloperApp);
       })));
     });
 
@@ -10241,7 +10558,8 @@
           .get(arg_name,
               entity: arg_entity, query: arg_query, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperApp(response);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            response as api.GoogleCloudApigeeV1DeveloperApp);
       })));
     });
 
@@ -10306,7 +10624,8 @@
               startKey: arg_startKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeveloperAppsResponse(response);
+        checkGoogleCloudApigeeV1ListDeveloperAppsResponse(
+            response as api.GoogleCloudApigeeV1ListDeveloperAppsResponse);
       })));
     });
 
@@ -10317,8 +10636,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DeveloperApp.fromJson(json);
-        checkGoogleCloudApigeeV1DeveloperApp(obj);
+        var obj = api.GoogleCloudApigeeV1DeveloperApp.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            obj as api.GoogleCloudApigeeV1DeveloperApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10358,7 +10679,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperApp(response);
+        checkGoogleCloudApigeeV1DeveloperApp(
+            response as api.GoogleCloudApigeeV1DeveloperApp);
       })));
     });
   });
@@ -10409,7 +10731,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
 
@@ -10457,7 +10780,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
 
@@ -10505,7 +10829,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attributes(response);
+        checkGoogleCloudApigeeV1Attributes(
+            response as api.GoogleCloudApigeeV1Attributes);
       })));
     });
 
@@ -10516,8 +10841,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Attribute.fromJson(json);
-        checkGoogleCloudApigeeV1Attribute(obj);
+        var obj = api.GoogleCloudApigeeV1Attribute.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Attribute(
+            obj as api.GoogleCloudApigeeV1Attribute);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10558,7 +10885,8 @@
           .updateDeveloperAppAttribute(arg_request, arg_name,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
   });
@@ -10571,8 +10899,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(json);
-        checkGoogleCloudApigeeV1DeveloperAppKey(obj);
+        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            obj as api.GoogleCloudApigeeV1DeveloperAppKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10613,7 +10943,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperAppKey(response);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            response as api.GoogleCloudApigeeV1DeveloperAppKey);
       })));
     });
 
@@ -10662,7 +10993,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperAppKey(response);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            response as api.GoogleCloudApigeeV1DeveloperAppKey);
       })));
     });
 
@@ -10711,7 +11043,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperAppKey(response);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            response as api.GoogleCloudApigeeV1DeveloperAppKey);
       })));
     });
 
@@ -10722,8 +11055,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(json);
-        checkGoogleCloudApigeeV1DeveloperAppKey(obj);
+        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            obj as api.GoogleCloudApigeeV1DeveloperAppKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10764,7 +11099,8 @@
       res
           .replaceDeveloperAppKey(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperAppKey(response);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            response as api.GoogleCloudApigeeV1DeveloperAppKey);
       })));
     });
 
@@ -10776,8 +11112,10 @@
       var arg_action = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(json);
-        checkGoogleCloudApigeeV1DeveloperAppKey(obj);
+        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            obj as api.GoogleCloudApigeeV1DeveloperAppKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10820,7 +11158,8 @@
           .updateDeveloperAppKey(arg_request, arg_name,
               action: arg_action, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperAppKey(response);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            response as api.GoogleCloudApigeeV1DeveloperAppKey);
       })));
     });
   });
@@ -10873,7 +11212,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperAppKey(response);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            response as api.GoogleCloudApigeeV1DeveloperAppKey);
       })));
     });
 
@@ -10925,7 +11265,7 @@
           .updateDeveloperAppKeyApiProduct(arg_name,
               action: arg_action, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
   });
@@ -10939,8 +11279,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(json);
-        checkGoogleCloudApigeeV1DeveloperAppKey(obj);
+        var obj = api.GoogleCloudApigeeV1DeveloperAppKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            obj as api.GoogleCloudApigeeV1DeveloperAppKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10981,7 +11323,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeveloperAppKey(response);
+        checkGoogleCloudApigeeV1DeveloperAppKey(
+            response as api.GoogleCloudApigeeV1DeveloperAppKey);
       })));
     });
   });
@@ -11031,7 +11374,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
 
@@ -11079,7 +11423,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
 
@@ -11127,7 +11472,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attributes(response);
+        checkGoogleCloudApigeeV1Attributes(
+            response as api.GoogleCloudApigeeV1Attributes);
       })));
     });
 
@@ -11138,8 +11484,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Attribute.fromJson(json);
-        checkGoogleCloudApigeeV1Attribute(obj);
+        var obj = api.GoogleCloudApigeeV1Attribute.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Attribute(
+            obj as api.GoogleCloudApigeeV1Attribute);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11179,7 +11527,8 @@
       res
           .updateDeveloperAttribute(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Attribute(response);
+        checkGoogleCloudApigeeV1Attribute(
+            response as api.GoogleCloudApigeeV1Attribute);
       })));
     });
   });
@@ -11193,8 +11542,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1EnvironmentGroup.fromJson(json);
-        checkGoogleCloudApigeeV1EnvironmentGroup(obj);
+        var obj = api.GoogleCloudApigeeV1EnvironmentGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1EnvironmentGroup(
+            obj as api.GoogleCloudApigeeV1EnvironmentGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11235,7 +11586,8 @@
       res
           .create(arg_request, arg_parent, name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11283,7 +11635,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11332,7 +11685,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1EnvironmentGroup(response);
+        checkGoogleCloudApigeeV1EnvironmentGroup(
+            response as api.GoogleCloudApigeeV1EnvironmentGroup);
       })));
     });
 
@@ -11390,7 +11744,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListEnvironmentGroupsResponse(response);
+        checkGoogleCloudApigeeV1ListEnvironmentGroupsResponse(
+            response as api.GoogleCloudApigeeV1ListEnvironmentGroupsResponse);
       })));
     });
 
@@ -11402,8 +11757,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1EnvironmentGroup.fromJson(json);
-        checkGoogleCloudApigeeV1EnvironmentGroup(obj);
+        var obj = api.GoogleCloudApigeeV1EnvironmentGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1EnvironmentGroup(
+            obj as api.GoogleCloudApigeeV1EnvironmentGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11446,7 +11803,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -11459,9 +11817,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(json);
-        checkGoogleCloudApigeeV1EnvironmentGroupAttachment(obj);
+        var obj = api.GoogleCloudApigeeV1EnvironmentGroupAttachment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1EnvironmentGroupAttachment(
+            obj as api.GoogleCloudApigeeV1EnvironmentGroupAttachment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11501,7 +11860,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11549,7 +11909,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11598,7 +11959,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1EnvironmentGroupAttachment(response);
+        checkGoogleCloudApigeeV1EnvironmentGroupAttachment(
+            response as api.GoogleCloudApigeeV1EnvironmentGroupAttachment);
       })));
     });
 
@@ -11656,8 +12018,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse(
-            response);
+        checkGoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse(response
+            as api.GoogleCloudApigeeV1ListEnvironmentGroupAttachmentsResponse);
       })));
     });
   });
@@ -11671,8 +12033,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Environment.fromJson(json);
-        checkGoogleCloudApigeeV1Environment(obj);
+        var obj = api.GoogleCloudApigeeV1Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Environment(
+            obj as api.GoogleCloudApigeeV1Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11713,7 +12077,8 @@
       res
           .create(arg_request, arg_parent, name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11761,7 +12126,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11809,7 +12175,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Environment(response);
+        checkGoogleCloudApigeeV1Environment(
+            response as api.GoogleCloudApigeeV1Environment);
       })));
     });
 
@@ -11857,7 +12224,8 @@
       res
           .getDebugmask(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DebugMask(response);
+        checkGoogleCloudApigeeV1DebugMask(
+            response as api.GoogleCloudApigeeV1DebugMask);
       })));
     });
 
@@ -11906,7 +12274,8 @@
       res
           .getDeployedConfig(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1EnvironmentConfig(response);
+        checkGoogleCloudApigeeV1EnvironmentConfig(
+            response as api.GoogleCloudApigeeV1EnvironmentConfig);
       })));
     });
 
@@ -11961,7 +12330,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1Policy(response);
+        checkGoogleIamV1Policy(response as api.GoogleIamV1Policy);
       })));
     });
 
@@ -11972,8 +12341,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleIamV1SetIamPolicyRequest.fromJson(json);
-        checkGoogleIamV1SetIamPolicyRequest(obj);
+        var obj = api.GoogleIamV1SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleIamV1SetIamPolicyRequest(
+            obj as api.GoogleIamV1SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12013,7 +12384,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1Policy(response);
+        checkGoogleIamV1Policy(response as api.GoogleIamV1Policy);
       })));
     });
 
@@ -12061,7 +12432,8 @@
       res
           .subscribe(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Subscription(response);
+        checkGoogleCloudApigeeV1Subscription(
+            response as api.GoogleCloudApigeeV1Subscription);
       })));
     });
 
@@ -12072,8 +12444,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleIamV1TestIamPermissionsRequest.fromJson(json);
-        checkGoogleIamV1TestIamPermissionsRequest(obj);
+        var obj = api.GoogleIamV1TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleIamV1TestIamPermissionsRequest(
+            obj as api.GoogleIamV1TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12114,7 +12488,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1TestIamPermissionsResponse(response);
+        checkGoogleIamV1TestIamPermissionsResponse(
+            response as api.GoogleIamV1TestIamPermissionsResponse);
       })));
     });
 
@@ -12125,8 +12500,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Subscription.fromJson(json);
-        checkGoogleCloudApigeeV1Subscription(obj);
+        var obj = api.GoogleCloudApigeeV1Subscription.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Subscription(
+            obj as api.GoogleCloudApigeeV1Subscription);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12166,7 +12543,7 @@
       res
           .unsubscribe(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12177,8 +12554,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Environment.fromJson(json);
-        checkGoogleCloudApigeeV1Environment(obj);
+        var obj = api.GoogleCloudApigeeV1Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Environment(
+            obj as api.GoogleCloudApigeeV1Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12218,7 +12597,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Environment(response);
+        checkGoogleCloudApigeeV1Environment(
+            response as api.GoogleCloudApigeeV1Environment);
       })));
     });
 
@@ -12231,8 +12611,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DebugMask.fromJson(json);
-        checkGoogleCloudApigeeV1DebugMask(obj);
+        var obj = api.GoogleCloudApigeeV1DebugMask.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DebugMask(
+            obj as api.GoogleCloudApigeeV1DebugMask);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12279,7 +12661,8 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DebugMask(response);
+        checkGoogleCloudApigeeV1DebugMask(
+            response as api.GoogleCloudApigeeV1DebugMask);
       })));
     });
 
@@ -12290,8 +12673,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Environment.fromJson(json);
-        checkGoogleCloudApigeeV1Environment(obj);
+        var obj = api.GoogleCloudApigeeV1Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Environment(
+            obj as api.GoogleCloudApigeeV1Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12331,7 +12716,8 @@
       res
           .updateEnvironment(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Environment(response);
+        checkGoogleCloudApigeeV1Environment(
+            response as api.GoogleCloudApigeeV1Environment);
       })));
     });
   });
@@ -12384,7 +12770,8 @@
       res
           .getSchemav2(arg_name, type: arg_type, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Schema(response);
+        checkGoogleCloudApigeeV1Schema(
+            response as api.GoogleCloudApigeeV1Schema);
       })));
     });
   });
@@ -12399,8 +12786,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1ExportRequest.fromJson(json);
-        checkGoogleCloudApigeeV1ExportRequest(obj);
+        var obj = api.GoogleCloudApigeeV1ExportRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1ExportRequest(
+            obj as api.GoogleCloudApigeeV1ExportRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12440,7 +12829,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Export(response);
+        checkGoogleCloudApigeeV1Export(
+            response as api.GoogleCloudApigeeV1Export);
       })));
     });
 
@@ -12489,7 +12879,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Export(response);
+        checkGoogleCloudApigeeV1Export(
+            response as api.GoogleCloudApigeeV1Export);
       })));
     });
 
@@ -12539,7 +12930,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListExportsResponse(response);
+        checkGoogleCloudApigeeV1ListExportsResponse(
+            response as api.GoogleCloudApigeeV1ListExportsResponse);
       })));
     });
   });
@@ -12591,7 +12983,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -12651,7 +13044,8 @@
               sequencedRollout: arg_sequencedRollout,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Deployment(response);
+        checkGoogleCloudApigeeV1Deployment(
+            response as api.GoogleCloudApigeeV1Deployment);
       })));
     });
 
@@ -12699,7 +13093,8 @@
       res
           .getDeployments(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Deployment(response);
+        checkGoogleCloudApigeeV1Deployment(
+            response as api.GoogleCloudApigeeV1Deployment);
       })));
     });
 
@@ -12751,7 +13146,7 @@
           .undeploy(arg_name,
               sequencedRollout: arg_sequencedRollout, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
   });
@@ -12772,8 +13167,10 @@
       var arg_timeout = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1DebugSession.fromJson(json);
-        checkGoogleCloudApigeeV1DebugSession(obj);
+        var obj = api.GoogleCloudApigeeV1DebugSession.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1DebugSession(
+            obj as api.GoogleCloudApigeeV1DebugSession);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12816,7 +13213,8 @@
           .create(arg_request, arg_parent,
               timeout: arg_timeout, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DebugSession(response);
+        checkGoogleCloudApigeeV1DebugSession(
+            response as api.GoogleCloudApigeeV1DebugSession);
       })));
     });
 
@@ -12869,7 +13267,7 @@
       res
           .deleteData(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12922,7 +13320,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DebugSession(response);
+        checkGoogleCloudApigeeV1DebugSession(
+            response as api.GoogleCloudApigeeV1DebugSession);
       })));
     });
 
@@ -12985,7 +13384,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDebugSessionsResponse(response);
+        checkGoogleCloudApigeeV1ListDebugSessionsResponse(
+            response as api.GoogleCloudApigeeV1ListDebugSessionsResponse);
       })));
     });
   });
@@ -13044,7 +13444,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DebugSessionTransaction(response);
+        checkGoogleCloudApigeeV1DebugSessionTransaction(
+            response as api.GoogleCloudApigeeV1DebugSessionTransaction);
       })));
     });
   });
@@ -13106,7 +13507,8 @@
           .generateDeployChangeReport(arg_name,
               override: arg_override, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeploymentChangeReport(response);
+        checkGoogleCloudApigeeV1DeploymentChangeReport(
+            response as api.GoogleCloudApigeeV1DeploymentChangeReport);
       })));
     });
 
@@ -13160,7 +13562,8 @@
       res
           .generateUndeployChangeReport(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeploymentChangeReport(response);
+        checkGoogleCloudApigeeV1DeploymentChangeReport(
+            response as api.GoogleCloudApigeeV1DeploymentChangeReport);
       })));
     });
   });
@@ -13210,7 +13613,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
   });
@@ -13265,7 +13668,8 @@
       res
           .list(arg_parent, sharedFlows: arg_sharedFlows, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -13278,8 +13682,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1FlowHook.fromJson(json);
-        checkGoogleCloudApigeeV1FlowHook(obj);
+        var obj = api.GoogleCloudApigeeV1FlowHook.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1FlowHook(
+            obj as api.GoogleCloudApigeeV1FlowHook);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13320,7 +13726,8 @@
           .attachSharedFlowToFlowHook(arg_request, arg_name,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1FlowHook(response);
+        checkGoogleCloudApigeeV1FlowHook(
+            response as api.GoogleCloudApigeeV1FlowHook);
       })));
     });
 
@@ -13368,7 +13775,8 @@
       res
           .detachSharedFlowFromFlowHook(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1FlowHook(response);
+        checkGoogleCloudApigeeV1FlowHook(
+            response as api.GoogleCloudApigeeV1FlowHook);
       })));
     });
 
@@ -13416,7 +13824,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1FlowHook(response);
+        checkGoogleCloudApigeeV1FlowHook(
+            response as api.GoogleCloudApigeeV1FlowHook);
       })));
     });
   });
@@ -13430,8 +13839,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Keystore.fromJson(json);
-        checkGoogleCloudApigeeV1Keystore(obj);
+        var obj = api.GoogleCloudApigeeV1Keystore.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Keystore(
+            obj as api.GoogleCloudApigeeV1Keystore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13472,7 +13883,8 @@
       res
           .create(arg_request, arg_parent, name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Keystore(response);
+        checkGoogleCloudApigeeV1Keystore(
+            response as api.GoogleCloudApigeeV1Keystore);
       })));
     });
 
@@ -13520,7 +13932,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Keystore(response);
+        checkGoogleCloudApigeeV1Keystore(
+            response as api.GoogleCloudApigeeV1Keystore);
       })));
     });
 
@@ -13568,7 +13981,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Keystore(response);
+        checkGoogleCloudApigeeV1Keystore(
+            response as api.GoogleCloudApigeeV1Keystore);
       })));
     });
   });
@@ -13588,8 +14002,9 @@
       var arg_ignoreNewlineValidation = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13643,7 +14058,7 @@
               ignoreNewlineValidation: arg_ignoreNewlineValidation,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Alias(response);
+        checkGoogleCloudApigeeV1Alias(response as api.GoogleCloudApigeeV1Alias);
       })));
     });
 
@@ -13692,7 +14107,7 @@
       res
           .csr(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
 
@@ -13741,7 +14156,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Alias(response);
+        checkGoogleCloudApigeeV1Alias(response as api.GoogleCloudApigeeV1Alias);
       })));
     });
 
@@ -13790,7 +14205,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Alias(response);
+        checkGoogleCloudApigeeV1Alias(response as api.GoogleCloudApigeeV1Alias);
       })));
     });
 
@@ -13839,7 +14254,7 @@
       res
           .getCertificate(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
 
@@ -13853,8 +14268,9 @@
       var arg_ignoreNewlineValidation = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13901,7 +14317,7 @@
               ignoreNewlineValidation: arg_ignoreNewlineValidation,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Alias(response);
+        checkGoogleCloudApigeeV1Alias(response as api.GoogleCloudApigeeV1Alias);
       })));
     });
   });
@@ -13915,8 +14331,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1KeyValueMap.fromJson(json);
-        checkGoogleCloudApigeeV1KeyValueMap(obj);
+        var obj = api.GoogleCloudApigeeV1KeyValueMap.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            obj as api.GoogleCloudApigeeV1KeyValueMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13956,7 +14374,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1KeyValueMap(response);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            response as api.GoogleCloudApigeeV1KeyValueMap);
       })));
     });
 
@@ -14004,7 +14423,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1KeyValueMap(response);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            response as api.GoogleCloudApigeeV1KeyValueMap);
       })));
     });
   });
@@ -14108,7 +14528,8 @@
               tzo: arg_tzo,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1OptimizedStats(response);
+        checkGoogleCloudApigeeV1OptimizedStats(
+            response as api.GoogleCloudApigeeV1OptimizedStats);
       })));
     });
   });
@@ -14121,8 +14542,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Query.fromJson(json);
-        checkGoogleCloudApigeeV1Query(obj);
+        var obj = api.GoogleCloudApigeeV1Query.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Query(obj as api.GoogleCloudApigeeV1Query);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14162,7 +14584,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1AsyncQuery(response);
+        checkGoogleCloudApigeeV1AsyncQuery(
+            response as api.GoogleCloudApigeeV1AsyncQuery);
       })));
     });
 
@@ -14210,7 +14633,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1AsyncQuery(response);
+        checkGoogleCloudApigeeV1AsyncQuery(
+            response as api.GoogleCloudApigeeV1AsyncQuery);
       })));
     });
 
@@ -14258,7 +14682,7 @@
       res
           .getResult(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
 
@@ -14329,7 +14753,8 @@
               to: arg_to,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListAsyncQueriesResponse(response);
+        checkGoogleCloudApigeeV1ListAsyncQueriesResponse(
+            response as api.GoogleCloudApigeeV1ListAsyncQueriesResponse);
       })));
     });
   });
@@ -14342,8 +14767,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Reference.fromJson(json);
-        checkGoogleCloudApigeeV1Reference(obj);
+        var obj = api.GoogleCloudApigeeV1Reference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Reference(
+            obj as api.GoogleCloudApigeeV1Reference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14383,7 +14810,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Reference(response);
+        checkGoogleCloudApigeeV1Reference(
+            response as api.GoogleCloudApigeeV1Reference);
       })));
     });
 
@@ -14431,7 +14859,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Reference(response);
+        checkGoogleCloudApigeeV1Reference(
+            response as api.GoogleCloudApigeeV1Reference);
       })));
     });
 
@@ -14479,7 +14908,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Reference(response);
+        checkGoogleCloudApigeeV1Reference(
+            response as api.GoogleCloudApigeeV1Reference);
       })));
     });
 
@@ -14490,8 +14920,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Reference.fromJson(json);
-        checkGoogleCloudApigeeV1Reference(obj);
+        var obj = api.GoogleCloudApigeeV1Reference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Reference(
+            obj as api.GoogleCloudApigeeV1Reference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14531,7 +14963,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Reference(response);
+        checkGoogleCloudApigeeV1Reference(
+            response as api.GoogleCloudApigeeV1Reference);
       })));
     });
   });
@@ -14547,8 +14980,9 @@
       var arg_type = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14591,7 +15025,8 @@
           .create(arg_request, arg_parent,
               name: arg_name, type: arg_type, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ResourceFile(response);
+        checkGoogleCloudApigeeV1ResourceFile(
+            response as api.GoogleCloudApigeeV1ResourceFile);
       })));
     });
 
@@ -14641,7 +15076,8 @@
       res
           .delete(arg_parent, arg_type, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ResourceFile(response);
+        checkGoogleCloudApigeeV1ResourceFile(
+            response as api.GoogleCloudApigeeV1ResourceFile);
       })));
     });
 
@@ -14691,7 +15127,7 @@
       res
           .get(arg_parent, arg_type, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
 
@@ -14742,7 +15178,8 @@
       res
           .list(arg_parent, type: arg_type, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListEnvironmentResourcesResponse(response);
+        checkGoogleCloudApigeeV1ListEnvironmentResourcesResponse(response
+            as api.GoogleCloudApigeeV1ListEnvironmentResourcesResponse);
       })));
     });
 
@@ -14792,7 +15229,8 @@
       res
           .listEnvironmentResources(arg_parent, arg_type, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListEnvironmentResourcesResponse(response);
+        checkGoogleCloudApigeeV1ListEnvironmentResourcesResponse(response
+            as api.GoogleCloudApigeeV1ListEnvironmentResourcesResponse);
       })));
     });
 
@@ -14805,8 +15243,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14847,7 +15286,8 @@
           .update(arg_request, arg_parent, arg_type, arg_name,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ResourceFile(response);
+        checkGoogleCloudApigeeV1ResourceFile(
+            response as api.GoogleCloudApigeeV1ResourceFile);
       })));
     });
   });
@@ -14904,7 +15344,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -14959,7 +15400,8 @@
       res
           .deploy(arg_name, override: arg_override, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Deployment(response);
+        checkGoogleCloudApigeeV1Deployment(
+            response as api.GoogleCloudApigeeV1Deployment);
       })));
     });
 
@@ -15008,7 +15450,8 @@
       res
           .getDeployments(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Deployment(response);
+        checkGoogleCloudApigeeV1Deployment(
+            response as api.GoogleCloudApigeeV1Deployment);
       })));
     });
 
@@ -15057,7 +15500,7 @@
       res
           .undeploy(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
   });
@@ -15159,7 +15602,7 @@
               tzo: arg_tzo,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Stats(response);
+        checkGoogleCloudApigeeV1Stats(response as api.GoogleCloudApigeeV1Stats);
       })));
     });
   });
@@ -15174,8 +15617,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1TargetServer.fromJson(json);
-        checkGoogleCloudApigeeV1TargetServer(obj);
+        var obj = api.GoogleCloudApigeeV1TargetServer.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1TargetServer(
+            obj as api.GoogleCloudApigeeV1TargetServer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15216,7 +15661,8 @@
       res
           .create(arg_request, arg_parent, name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1TargetServer(response);
+        checkGoogleCloudApigeeV1TargetServer(
+            response as api.GoogleCloudApigeeV1TargetServer);
       })));
     });
 
@@ -15264,7 +15710,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1TargetServer(response);
+        checkGoogleCloudApigeeV1TargetServer(
+            response as api.GoogleCloudApigeeV1TargetServer);
       })));
     });
 
@@ -15312,7 +15759,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1TargetServer(response);
+        checkGoogleCloudApigeeV1TargetServer(
+            response as api.GoogleCloudApigeeV1TargetServer);
       })));
     });
 
@@ -15323,8 +15771,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1TargetServer.fromJson(json);
-        checkGoogleCloudApigeeV1TargetServer(obj);
+        var obj = api.GoogleCloudApigeeV1TargetServer.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1TargetServer(
+            obj as api.GoogleCloudApigeeV1TargetServer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15364,7 +15814,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1TargetServer(response);
+        checkGoogleCloudApigeeV1TargetServer(
+            response as api.GoogleCloudApigeeV1TargetServer);
       })));
     });
   });
@@ -15377,8 +15828,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1Instance.fromJson(json);
-        checkGoogleCloudApigeeV1Instance(obj);
+        var obj = api.GoogleCloudApigeeV1Instance.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1Instance(
+            obj as api.GoogleCloudApigeeV1Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15418,7 +15871,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -15466,7 +15920,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -15514,7 +15969,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1Instance(response);
+        checkGoogleCloudApigeeV1Instance(
+            response as api.GoogleCloudApigeeV1Instance);
       })));
     });
 
@@ -15572,7 +16028,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListInstancesResponse(response);
+        checkGoogleCloudApigeeV1ListInstancesResponse(
+            response as api.GoogleCloudApigeeV1ListInstancesResponse);
       })));
     });
 
@@ -15583,9 +16040,10 @@
       var arg_instance = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleCloudApigeeV1ReportInstanceStatusRequest.fromJson(json);
-        checkGoogleCloudApigeeV1ReportInstanceStatusRequest(obj);
+        var obj = api.GoogleCloudApigeeV1ReportInstanceStatusRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1ReportInstanceStatusRequest(
+            obj as api.GoogleCloudApigeeV1ReportInstanceStatusRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15626,7 +16084,8 @@
       res
           .reportStatus(arg_request, arg_instance, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ReportInstanceStatusResponse(response);
+        checkGoogleCloudApigeeV1ReportInstanceStatusResponse(
+            response as api.GoogleCloudApigeeV1ReportInstanceStatusResponse);
       })));
     });
   });
@@ -15639,8 +16098,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1InstanceAttachment.fromJson(json);
-        checkGoogleCloudApigeeV1InstanceAttachment(obj);
+        var obj = api.GoogleCloudApigeeV1InstanceAttachment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1InstanceAttachment(
+            obj as api.GoogleCloudApigeeV1InstanceAttachment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15680,7 +16141,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -15728,7 +16190,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -15777,7 +16240,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1InstanceAttachment(response);
+        checkGoogleCloudApigeeV1InstanceAttachment(
+            response as api.GoogleCloudApigeeV1InstanceAttachment);
       })));
     });
 
@@ -15835,7 +16299,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListInstanceAttachmentsResponse(response);
+        checkGoogleCloudApigeeV1ListInstanceAttachmentsResponse(
+            response as api.GoogleCloudApigeeV1ListInstanceAttachmentsResponse);
       })));
     });
   });
@@ -15848,8 +16313,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1KeyValueMap.fromJson(json);
-        checkGoogleCloudApigeeV1KeyValueMap(obj);
+        var obj = api.GoogleCloudApigeeV1KeyValueMap.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            obj as api.GoogleCloudApigeeV1KeyValueMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15889,7 +16356,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1KeyValueMap(response);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            response as api.GoogleCloudApigeeV1KeyValueMap);
       })));
     });
 
@@ -15937,7 +16405,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1KeyValueMap(response);
+        checkGoogleCloudApigeeV1KeyValueMap(
+            response as api.GoogleCloudApigeeV1KeyValueMap);
       })));
     });
   });
@@ -15987,7 +16456,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -16048,7 +16518,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningListOperationsResponse(response);
+        checkGoogleLongrunningListOperationsResponse(
+            response as api.GoogleLongrunningListOperationsResponse);
       })));
     });
   });
@@ -16061,8 +16532,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1CustomReport.fromJson(json);
-        checkGoogleCloudApigeeV1CustomReport(obj);
+        var obj = api.GoogleCloudApigeeV1CustomReport.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1CustomReport(
+            obj as api.GoogleCloudApigeeV1CustomReport);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16102,7 +16575,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1CustomReport(response);
+        checkGoogleCloudApigeeV1CustomReport(
+            response as api.GoogleCloudApigeeV1CustomReport);
       })));
     });
 
@@ -16151,7 +16625,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1DeleteCustomReportResponse(response);
+        checkGoogleCloudApigeeV1DeleteCustomReportResponse(
+            response as api.GoogleCloudApigeeV1DeleteCustomReportResponse);
       })));
     });
 
@@ -16199,7 +16674,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1CustomReport(response);
+        checkGoogleCloudApigeeV1CustomReport(
+            response as api.GoogleCloudApigeeV1CustomReport);
       })));
     });
 
@@ -16251,7 +16727,8 @@
       res
           .list(arg_parent, expand: arg_expand, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListCustomReportsResponse(response);
+        checkGoogleCloudApigeeV1ListCustomReportsResponse(
+            response as api.GoogleCloudApigeeV1ListCustomReportsResponse);
       })));
     });
 
@@ -16262,8 +16739,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1CustomReport.fromJson(json);
-        checkGoogleCloudApigeeV1CustomReport(obj);
+        var obj = api.GoogleCloudApigeeV1CustomReport.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1CustomReport(
+            obj as api.GoogleCloudApigeeV1CustomReport);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16303,7 +16782,8 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1CustomReport(response);
+        checkGoogleCloudApigeeV1CustomReport(
+            response as api.GoogleCloudApigeeV1CustomReport);
       })));
     });
   });
@@ -16318,8 +16798,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16363,7 +16844,8 @@
           .create(arg_request, arg_parent,
               action: arg_action, name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1SharedFlowRevision(response);
+        checkGoogleCloudApigeeV1SharedFlowRevision(
+            response as api.GoogleCloudApigeeV1SharedFlowRevision);
       })));
     });
 
@@ -16411,7 +16893,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1SharedFlow(response);
+        checkGoogleCloudApigeeV1SharedFlow(
+            response as api.GoogleCloudApigeeV1SharedFlow);
       })));
     });
 
@@ -16459,7 +16942,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1SharedFlow(response);
+        checkGoogleCloudApigeeV1SharedFlow(
+            response as api.GoogleCloudApigeeV1SharedFlow);
       })));
     });
 
@@ -16517,7 +17001,8 @@
               includeRevisions: arg_includeRevisions,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListSharedFlowsResponse(response);
+        checkGoogleCloudApigeeV1ListSharedFlowsResponse(
+            response as api.GoogleCloudApigeeV1ListSharedFlowsResponse);
       })));
     });
   });
@@ -16568,7 +17053,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -16619,7 +17105,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1SharedFlowRevision(response);
+        checkGoogleCloudApigeeV1SharedFlowRevision(
+            response as api.GoogleCloudApigeeV1SharedFlowRevision);
       })));
     });
 
@@ -16669,7 +17156,7 @@
       res
           .get(arg_name, format: arg_format, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
 
@@ -16681,8 +17168,9 @@
       var arg_validate = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleApiHttpBody.fromJson(json);
-        checkGoogleApiHttpBody(obj);
+        var obj = api.GoogleApiHttpBody.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleApiHttpBody(obj as api.GoogleApiHttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16726,7 +17214,8 @@
           .updateSharedFlowRevision(arg_request, arg_name,
               validate: arg_validate, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1SharedFlowRevision(response);
+        checkGoogleCloudApigeeV1SharedFlowRevision(
+            response as api.GoogleCloudApigeeV1SharedFlowRevision);
       })));
     });
   });
@@ -16779,7 +17268,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListDeploymentsResponse(response);
+        checkGoogleCloudApigeeV1ListDeploymentsResponse(
+            response as api.GoogleCloudApigeeV1ListDeploymentsResponse);
       })));
     });
   });
@@ -16792,8 +17282,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1ApiCategoryData.fromJson(json);
-        checkGoogleCloudApigeeV1ApiCategoryData(obj);
+        var obj = api.GoogleCloudApigeeV1ApiCategoryData.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1ApiCategoryData(
+            obj as api.GoogleCloudApigeeV1ApiCategoryData);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16833,7 +17325,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiCategory(response);
+        checkGoogleCloudApigeeV1ApiCategory(
+            response as api.GoogleCloudApigeeV1ApiCategory);
       })));
     });
 
@@ -16882,7 +17375,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiResponseWrapper(response);
+        checkGoogleCloudApigeeV1ApiResponseWrapper(
+            response as api.GoogleCloudApigeeV1ApiResponseWrapper);
       })));
     });
 
@@ -16930,7 +17424,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiCategory(response);
+        checkGoogleCloudApigeeV1ApiCategory(
+            response as api.GoogleCloudApigeeV1ApiCategory);
       })));
     });
 
@@ -16979,7 +17474,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ListApiCategoriesResponse(response);
+        checkGoogleCloudApigeeV1ListApiCategoriesResponse(
+            response as api.GoogleCloudApigeeV1ListApiCategoriesResponse);
       })));
     });
 
@@ -16990,8 +17486,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudApigeeV1ApiCategoryData.fromJson(json);
-        checkGoogleCloudApigeeV1ApiCategoryData(obj);
+        var obj = api.GoogleCloudApigeeV1ApiCategoryData.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1ApiCategoryData(
+            obj as api.GoogleCloudApigeeV1ApiCategoryData);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17031,7 +17529,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudApigeeV1ApiCategory(response);
+        checkGoogleCloudApigeeV1ApiCategory(
+            response as api.GoogleCloudApigeeV1ApiCategory);
       })));
     });
   });
@@ -17044,9 +17543,10 @@
       var arg_project = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleCloudApigeeV1ProvisionOrganizationRequest.fromJson(json);
-        checkGoogleCloudApigeeV1ProvisionOrganizationRequest(obj);
+        var obj = api.GoogleCloudApigeeV1ProvisionOrganizationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudApigeeV1ProvisionOrganizationRequest(
+            obj as api.GoogleCloudApigeeV1ProvisionOrganizationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17086,7 +17586,8 @@
       res
           .provisionOrganization(arg_request, arg_project, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
diff --git a/generated/googleapis/test/appengine/v1_test.dart b/generated/googleapis/test/appengine/v1_test.dart
index c623dda..d6f6671 100644
--- a/generated/googleapis/test/appengine/v1_test.dart
+++ b/generated/googleapis/test/appengine/v1_test.dart
@@ -129,8 +129,8 @@
 
 void checkUnnamed35(core.List<api.UrlDispatchRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlDispatchRule(o[0]);
-  checkUrlDispatchRule(o[1]);
+  checkUrlDispatchRule(o[0] as api.UrlDispatchRule);
+  checkUrlDispatchRule(o[1] as api.UrlDispatchRule);
 }
 
 core.int buildCounterApplication = 0;
@@ -167,9 +167,9 @@
     unittest.expect(o.defaultCookieExpiration, unittest.equals('foo'));
     unittest.expect(o.defaultHostname, unittest.equals('foo'));
     checkUnnamed35(o.dispatchRules);
-    checkFeatureSettings(o.featureSettings);
+    checkFeatureSettings(o.featureSettings as api.FeatureSettings);
     unittest.expect(o.gcrDomain, unittest.equals('foo'));
-    checkIdentityAwareProxy(o.iap);
+    checkIdentityAwareProxy(o.iap as api.IdentityAwareProxy);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -226,13 +226,13 @@
 void checkAuthorizedCertificate(api.AuthorizedCertificate o) {
   buildCounterAuthorizedCertificate++;
   if (buildCounterAuthorizedCertificate < 3) {
-    checkCertificateRawData(o.certificateRawData);
+    checkCertificateRawData(o.certificateRawData as api.CertificateRawData);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.domainMappingsCount, unittest.equals(42));
     checkUnnamed36(o.domainNames);
     unittest.expect(o.expireTime, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkManagedCertificate(o.managedCertificate);
+    checkManagedCertificate(o.managedCertificate as api.ManagedCertificate);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed37(o.visibleDomainMappings);
   }
@@ -287,8 +287,8 @@
   buildCounterAutomaticScaling++;
   if (buildCounterAutomaticScaling < 3) {
     unittest.expect(o.coolDownPeriod, unittest.equals('foo'));
-    checkCpuUtilization(o.cpuUtilization);
-    checkDiskUtilization(o.diskUtilization);
+    checkCpuUtilization(o.cpuUtilization as api.CpuUtilization);
+    checkDiskUtilization(o.diskUtilization as api.DiskUtilization);
     unittest.expect(o.maxConcurrentRequests, unittest.equals(42));
     unittest.expect(o.maxIdleInstances, unittest.equals(42));
     unittest.expect(o.maxPendingLatency, unittest.equals('foo'));
@@ -296,9 +296,10 @@
     unittest.expect(o.minIdleInstances, unittest.equals(42));
     unittest.expect(o.minPendingLatency, unittest.equals('foo'));
     unittest.expect(o.minTotalInstances, unittest.equals(42));
-    checkNetworkUtilization(o.networkUtilization);
-    checkRequestUtilization(o.requestUtilization);
-    checkStandardSchedulerSettings(o.standardSchedulerSettings);
+    checkNetworkUtilization(o.networkUtilization as api.NetworkUtilization);
+    checkRequestUtilization(o.requestUtilization as api.RequestUtilization);
+    checkStandardSchedulerSettings(
+        o.standardSchedulerSettings as api.StandardSchedulerSettings);
   }
   buildCounterAutomaticScaling--;
 }
@@ -333,8 +334,8 @@
 
 void checkUnnamed38(core.List<api.FirewallRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirewallRule(o[0]);
-  checkFirewallRule(o[1]);
+  checkFirewallRule(o[0] as api.FirewallRule);
+  checkFirewallRule(o[1] as api.FirewallRule);
 }
 
 core.int buildCounterBatchUpdateIngressRulesRequest = 0;
@@ -365,8 +366,8 @@
 
 void checkUnnamed39(core.List<api.FirewallRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirewallRule(o[0]);
-  checkFirewallRule(o[1]);
+  checkFirewallRule(o[0] as api.FirewallRule);
+  checkFirewallRule(o[1] as api.FirewallRule);
 }
 
 core.int buildCounterBatchUpdateIngressRulesResponse = 0;
@@ -556,8 +557,8 @@
 
 void checkUnnamed40(core.Map<core.String, api.FileInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileInfo(o['x']);
-  checkFileInfo(o['y']);
+  checkFileInfo(o['x'] as api.FileInfo);
+  checkFileInfo(o['y'] as api.FileInfo);
 }
 
 core.int buildCounterDeployment = 0;
@@ -577,10 +578,10 @@
 void checkDeployment(api.Deployment o) {
   buildCounterDeployment++;
   if (buildCounterDeployment < 3) {
-    checkCloudBuildOptions(o.cloudBuildOptions);
-    checkContainerInfo(o.container);
+    checkCloudBuildOptions(o.cloudBuildOptions as api.CloudBuildOptions);
+    checkContainerInfo(o.container as api.ContainerInfo);
     checkUnnamed40(o.files);
-    checkZipInfo(o.zip);
+    checkZipInfo(o.zip as api.ZipInfo);
   }
   buildCounterDeployment--;
 }
@@ -619,8 +620,8 @@
 
 void checkUnnamed41(core.List<api.ResourceRecord> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceRecord(o[0]);
-  checkResourceRecord(o[1]);
+  checkResourceRecord(o[0] as api.ResourceRecord);
+  checkResourceRecord(o[1] as api.ResourceRecord);
 }
 
 core.int buildCounterDomainMapping = 0;
@@ -643,7 +644,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed41(o.resourceRecords);
-    checkSslSettings(o.sslSettings);
+    checkSslSettings(o.sslSettings as api.SslSettings);
   }
   buildCounterDomainMapping--;
 }
@@ -934,8 +935,8 @@
 
 void checkUnnamed42(core.List<api.AuthorizedCertificate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthorizedCertificate(o[0]);
-  checkAuthorizedCertificate(o[1]);
+  checkAuthorizedCertificate(o[0] as api.AuthorizedCertificate);
+  checkAuthorizedCertificate(o[1] as api.AuthorizedCertificate);
 }
 
 core.int buildCounterListAuthorizedCertificatesResponse = 0;
@@ -970,8 +971,8 @@
 
 void checkUnnamed43(core.List<api.AuthorizedDomain> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthorizedDomain(o[0]);
-  checkAuthorizedDomain(o[1]);
+  checkAuthorizedDomain(o[0] as api.AuthorizedDomain);
+  checkAuthorizedDomain(o[1] as api.AuthorizedDomain);
 }
 
 core.int buildCounterListAuthorizedDomainsResponse = 0;
@@ -1004,8 +1005,8 @@
 
 void checkUnnamed44(core.List<api.DomainMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDomainMapping(o[0]);
-  checkDomainMapping(o[1]);
+  checkDomainMapping(o[0] as api.DomainMapping);
+  checkDomainMapping(o[1] as api.DomainMapping);
 }
 
 core.int buildCounterListDomainMappingsResponse = 0;
@@ -1038,8 +1039,8 @@
 
 void checkUnnamed45(core.List<api.FirewallRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirewallRule(o[0]);
-  checkFirewallRule(o[1]);
+  checkFirewallRule(o[0] as api.FirewallRule);
+  checkFirewallRule(o[1] as api.FirewallRule);
 }
 
 core.int buildCounterListIngressRulesResponse = 0;
@@ -1072,8 +1073,8 @@
 
 void checkUnnamed46(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.int buildCounterListInstancesResponse = 0;
@@ -1106,8 +1107,8 @@
 
 void checkUnnamed47(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -1140,8 +1141,8 @@
 
 void checkUnnamed48(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1174,8 +1175,8 @@
 
 void checkUnnamed49(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkService(o[0]);
-  checkService(o[1]);
+  checkService(o[0] as api.Service);
+  checkService(o[1] as api.Service);
 }
 
 core.int buildCounterListServicesResponse = 0;
@@ -1208,8 +1209,8 @@
 
 void checkUnnamed50(core.List<api.Version> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVersion(o[0]);
-  checkVersion(o[1]);
+  checkVersion(o[0] as api.Version);
+  checkVersion(o[1] as api.Version);
 }
 
 core.int buildCounterListVersionsResponse = 0;
@@ -1555,7 +1556,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed54(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed55(o.response);
@@ -1597,7 +1598,8 @@
 void checkOperationMetadataV1(api.OperationMetadataV1 o) {
   buildCounterOperationMetadataV1++;
   if (buildCounterOperationMetadataV1 < 3) {
-    checkCreateVersionMetadataV1(o.createVersionMetadata);
+    checkCreateVersionMetadataV1(
+        o.createVersionMetadata as api.CreateVersionMetadataV1);
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.ephemeralMessage, unittest.equals('foo'));
     unittest.expect(o.insertTime, unittest.equals('foo'));
@@ -1643,7 +1645,8 @@
 void checkOperationMetadataV1Alpha(api.OperationMetadataV1Alpha o) {
   buildCounterOperationMetadataV1Alpha++;
   if (buildCounterOperationMetadataV1Alpha < 3) {
-    checkCreateVersionMetadataV1Alpha(o.createVersionMetadata);
+    checkCreateVersionMetadataV1Alpha(
+        o.createVersionMetadata as api.CreateVersionMetadataV1Alpha);
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.ephemeralMessage, unittest.equals('foo'));
     unittest.expect(o.insertTime, unittest.equals('foo'));
@@ -1689,7 +1692,8 @@
 void checkOperationMetadataV1Beta(api.OperationMetadataV1Beta o) {
   buildCounterOperationMetadataV1Beta++;
   if (buildCounterOperationMetadataV1Beta < 3) {
-    checkCreateVersionMetadataV1Beta(o.createVersionMetadata);
+    checkCreateVersionMetadataV1Beta(
+        o.createVersionMetadata as api.CreateVersionMetadataV1Beta);
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.ephemeralMessage, unittest.equals('foo'));
     unittest.expect(o.insertTime, unittest.equals('foo'));
@@ -1800,8 +1804,8 @@
 
 void checkUnnamed59(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.int buildCounterResources = 0;
@@ -1869,8 +1873,8 @@
   if (buildCounterService < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNetworkSettings(o.networkSettings);
-    checkTrafficSplit(o.split);
+    checkNetworkSettings(o.networkSettings as api.NetworkSettings);
+    checkTrafficSplit(o.split as api.TrafficSplit);
   }
   buildCounterService--;
 }
@@ -2110,13 +2114,13 @@
 void checkUrlMap(api.UrlMap o) {
   buildCounterUrlMap++;
   if (buildCounterUrlMap < 3) {
-    checkApiEndpointHandler(o.apiEndpoint);
+    checkApiEndpointHandler(o.apiEndpoint as api.ApiEndpointHandler);
     unittest.expect(o.authFailAction, unittest.equals('foo'));
     unittest.expect(o.login, unittest.equals('foo'));
     unittest.expect(o.redirectHttpResponseCode, unittest.equals('foo'));
-    checkScriptHandler(o.script);
+    checkScriptHandler(o.script as api.ScriptHandler);
     unittest.expect(o.securityLevel, unittest.equals('foo'));
-    checkStaticFilesHandler(o.staticFiles);
+    checkStaticFilesHandler(o.staticFiles as api.StaticFilesHandler);
     unittest.expect(o.urlRegex, unittest.equals('foo'));
   }
   buildCounterUrlMap--;
@@ -2170,8 +2174,8 @@
 
 void checkUnnamed67(core.List<api.ErrorHandler> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorHandler(o[0]);
-  checkErrorHandler(o[1]);
+  checkErrorHandler(o[0] as api.ErrorHandler);
+  checkErrorHandler(o[1] as api.ErrorHandler);
 }
 
 core.List<api.UrlMap> buildUnnamed68() {
@@ -2183,8 +2187,8 @@
 
 void checkUnnamed68(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMap(o[0]);
-  checkUrlMap(o[1]);
+  checkUrlMap(o[0] as api.UrlMap);
+  checkUrlMap(o[1] as api.UrlMap);
 }
 
 core.List<core.String> buildUnnamed69() {
@@ -2209,8 +2213,8 @@
 
 void checkUnnamed70(core.List<api.Library> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLibrary(o[0]);
-  checkLibrary(o[1]);
+  checkLibrary(o[0] as api.Library);
+  checkLibrary(o[1] as api.Library);
 }
 
 core.List<core.String> buildUnnamed71() {
@@ -2277,34 +2281,34 @@
 void checkVersion(api.Version o) {
   buildCounterVersion++;
   if (buildCounterVersion < 3) {
-    checkApiConfigHandler(o.apiConfig);
-    checkAutomaticScaling(o.automaticScaling);
-    checkBasicScaling(o.basicScaling);
+    checkApiConfigHandler(o.apiConfig as api.ApiConfigHandler);
+    checkAutomaticScaling(o.automaticScaling as api.AutomaticScaling);
+    checkBasicScaling(o.basicScaling as api.BasicScaling);
     checkUnnamed64(o.betaSettings);
     checkUnnamed65(o.buildEnvVariables);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.createdBy, unittest.equals('foo'));
     unittest.expect(o.defaultExpiration, unittest.equals('foo'));
-    checkDeployment(o.deployment);
+    checkDeployment(o.deployment as api.Deployment);
     unittest.expect(o.diskUsageBytes, unittest.equals('foo'));
-    checkEndpointsApiService(o.endpointsApiService);
-    checkEntrypoint(o.entrypoint);
+    checkEndpointsApiService(o.endpointsApiService as api.EndpointsApiService);
+    checkEntrypoint(o.entrypoint as api.Entrypoint);
     unittest.expect(o.env, unittest.equals('foo'));
     checkUnnamed66(o.envVariables);
     checkUnnamed67(o.errorHandlers);
     checkUnnamed68(o.handlers);
-    checkHealthCheck(o.healthCheck);
+    checkHealthCheck(o.healthCheck as api.HealthCheck);
     unittest.expect(o.id, unittest.equals('foo'));
     checkUnnamed69(o.inboundServices);
     unittest.expect(o.instanceClass, unittest.equals('foo'));
     checkUnnamed70(o.libraries);
-    checkLivenessCheck(o.livenessCheck);
-    checkManualScaling(o.manualScaling);
+    checkLivenessCheck(o.livenessCheck as api.LivenessCheck);
+    checkManualScaling(o.manualScaling as api.ManualScaling);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNetwork(o.network);
+    checkNetwork(o.network as api.Network);
     unittest.expect(o.nobuildFilesRegex, unittest.equals('foo'));
-    checkReadinessCheck(o.readinessCheck);
-    checkResources(o.resources);
+    checkReadinessCheck(o.readinessCheck as api.ReadinessCheck);
+    checkResources(o.resources as api.Resources);
     unittest.expect(o.runtime, unittest.equals('foo'));
     unittest.expect(o.runtimeApiVersion, unittest.equals('foo'));
     unittest.expect(o.runtimeChannel, unittest.equals('foo'));
@@ -2313,7 +2317,7 @@
     unittest.expect(o.threadsafe, unittest.isTrue);
     unittest.expect(o.versionUrl, unittest.equals('foo'));
     unittest.expect(o.vm, unittest.isTrue);
-    checkVpcAccessConnector(o.vpcAccessConnector);
+    checkVpcAccessConnector(o.vpcAccessConnector as api.VpcAccessConnector);
     checkUnnamed71(o.zones);
   }
   buildCounterVersion--;
@@ -2387,7 +2391,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiConfigHandler();
       var od = api.ApiConfigHandler.fromJson(o.toJson());
-      checkApiConfigHandler(od);
+      checkApiConfigHandler(od as api.ApiConfigHandler);
     });
   });
 
@@ -2395,7 +2399,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiEndpointHandler();
       var od = api.ApiEndpointHandler.fromJson(o.toJson());
-      checkApiEndpointHandler(od);
+      checkApiEndpointHandler(od as api.ApiEndpointHandler);
     });
   });
 
@@ -2403,7 +2407,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplication();
       var od = api.Application.fromJson(o.toJson());
-      checkApplication(od);
+      checkApplication(od as api.Application);
     });
   });
 
@@ -2411,7 +2415,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizedCertificate();
       var od = api.AuthorizedCertificate.fromJson(o.toJson());
-      checkAuthorizedCertificate(od);
+      checkAuthorizedCertificate(od as api.AuthorizedCertificate);
     });
   });
 
@@ -2419,7 +2423,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizedDomain();
       var od = api.AuthorizedDomain.fromJson(o.toJson());
-      checkAuthorizedDomain(od);
+      checkAuthorizedDomain(od as api.AuthorizedDomain);
     });
   });
 
@@ -2427,7 +2431,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutomaticScaling();
       var od = api.AutomaticScaling.fromJson(o.toJson());
-      checkAutomaticScaling(od);
+      checkAutomaticScaling(od as api.AutomaticScaling);
     });
   });
 
@@ -2435,7 +2439,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicScaling();
       var od = api.BasicScaling.fromJson(o.toJson());
-      checkBasicScaling(od);
+      checkBasicScaling(od as api.BasicScaling);
     });
   });
 
@@ -2443,7 +2447,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateIngressRulesRequest();
       var od = api.BatchUpdateIngressRulesRequest.fromJson(o.toJson());
-      checkBatchUpdateIngressRulesRequest(od);
+      checkBatchUpdateIngressRulesRequest(
+          od as api.BatchUpdateIngressRulesRequest);
     });
   });
 
@@ -2451,7 +2456,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateIngressRulesResponse();
       var od = api.BatchUpdateIngressRulesResponse.fromJson(o.toJson());
-      checkBatchUpdateIngressRulesResponse(od);
+      checkBatchUpdateIngressRulesResponse(
+          od as api.BatchUpdateIngressRulesResponse);
     });
   });
 
@@ -2459,7 +2465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCertificateRawData();
       var od = api.CertificateRawData.fromJson(o.toJson());
-      checkCertificateRawData(od);
+      checkCertificateRawData(od as api.CertificateRawData);
     });
   });
 
@@ -2467,7 +2473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudBuildOptions();
       var od = api.CloudBuildOptions.fromJson(o.toJson());
-      checkCloudBuildOptions(od);
+      checkCloudBuildOptions(od as api.CloudBuildOptions);
     });
   });
 
@@ -2475,7 +2481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerInfo();
       var od = api.ContainerInfo.fromJson(o.toJson());
-      checkContainerInfo(od);
+      checkContainerInfo(od as api.ContainerInfo);
     });
   });
 
@@ -2483,7 +2489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCpuUtilization();
       var od = api.CpuUtilization.fromJson(o.toJson());
-      checkCpuUtilization(od);
+      checkCpuUtilization(od as api.CpuUtilization);
     });
   });
 
@@ -2491,7 +2497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateVersionMetadataV1();
       var od = api.CreateVersionMetadataV1.fromJson(o.toJson());
-      checkCreateVersionMetadataV1(od);
+      checkCreateVersionMetadataV1(od as api.CreateVersionMetadataV1);
     });
   });
 
@@ -2499,7 +2505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateVersionMetadataV1Alpha();
       var od = api.CreateVersionMetadataV1Alpha.fromJson(o.toJson());
-      checkCreateVersionMetadataV1Alpha(od);
+      checkCreateVersionMetadataV1Alpha(od as api.CreateVersionMetadataV1Alpha);
     });
   });
 
@@ -2507,7 +2513,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateVersionMetadataV1Beta();
       var od = api.CreateVersionMetadataV1Beta.fromJson(o.toJson());
-      checkCreateVersionMetadataV1Beta(od);
+      checkCreateVersionMetadataV1Beta(od as api.CreateVersionMetadataV1Beta);
     });
   });
 
@@ -2515,7 +2521,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDebugInstanceRequest();
       var od = api.DebugInstanceRequest.fromJson(o.toJson());
-      checkDebugInstanceRequest(od);
+      checkDebugInstanceRequest(od as api.DebugInstanceRequest);
     });
   });
 
@@ -2523,7 +2529,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeployment();
       var od = api.Deployment.fromJson(o.toJson());
-      checkDeployment(od);
+      checkDeployment(od as api.Deployment);
     });
   });
 
@@ -2531,7 +2537,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskUtilization();
       var od = api.DiskUtilization.fromJson(o.toJson());
-      checkDiskUtilization(od);
+      checkDiskUtilization(od as api.DiskUtilization);
     });
   });
 
@@ -2539,7 +2545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomainMapping();
       var od = api.DomainMapping.fromJson(o.toJson());
-      checkDomainMapping(od);
+      checkDomainMapping(od as api.DomainMapping);
     });
   });
 
@@ -2547,7 +2553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2555,7 +2561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpointsApiService();
       var od = api.EndpointsApiService.fromJson(o.toJson());
-      checkEndpointsApiService(od);
+      checkEndpointsApiService(od as api.EndpointsApiService);
     });
   });
 
@@ -2563,7 +2569,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntrypoint();
       var od = api.Entrypoint.fromJson(o.toJson());
-      checkEntrypoint(od);
+      checkEntrypoint(od as api.Entrypoint);
     });
   });
 
@@ -2571,7 +2577,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorHandler();
       var od = api.ErrorHandler.fromJson(o.toJson());
-      checkErrorHandler(od);
+      checkErrorHandler(od as api.ErrorHandler);
     });
   });
 
@@ -2579,7 +2585,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeatureSettings();
       var od = api.FeatureSettings.fromJson(o.toJson());
-      checkFeatureSettings(od);
+      checkFeatureSettings(od as api.FeatureSettings);
     });
   });
 
@@ -2587,7 +2593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileInfo();
       var od = api.FileInfo.fromJson(o.toJson());
-      checkFileInfo(od);
+      checkFileInfo(od as api.FileInfo);
     });
   });
 
@@ -2595,7 +2601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallRule();
       var od = api.FirewallRule.fromJson(o.toJson());
-      checkFirewallRule(od);
+      checkFirewallRule(od as api.FirewallRule);
     });
   });
 
@@ -2603,7 +2609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheck();
       var od = api.HealthCheck.fromJson(o.toJson());
-      checkHealthCheck(od);
+      checkHealthCheck(od as api.HealthCheck);
     });
   });
 
@@ -2611,7 +2617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIdentityAwareProxy();
       var od = api.IdentityAwareProxy.fromJson(o.toJson());
-      checkIdentityAwareProxy(od);
+      checkIdentityAwareProxy(od as api.IdentityAwareProxy);
     });
   });
 
@@ -2619,7 +2625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstance();
       var od = api.Instance.fromJson(o.toJson());
-      checkInstance(od);
+      checkInstance(od as api.Instance);
     });
   });
 
@@ -2627,7 +2633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLibrary();
       var od = api.Library.fromJson(o.toJson());
-      checkLibrary(od);
+      checkLibrary(od as api.Library);
     });
   });
 
@@ -2635,7 +2641,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAuthorizedCertificatesResponse();
       var od = api.ListAuthorizedCertificatesResponse.fromJson(o.toJson());
-      checkListAuthorizedCertificatesResponse(od);
+      checkListAuthorizedCertificatesResponse(
+          od as api.ListAuthorizedCertificatesResponse);
     });
   });
 
@@ -2643,7 +2650,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAuthorizedDomainsResponse();
       var od = api.ListAuthorizedDomainsResponse.fromJson(o.toJson());
-      checkListAuthorizedDomainsResponse(od);
+      checkListAuthorizedDomainsResponse(
+          od as api.ListAuthorizedDomainsResponse);
     });
   });
 
@@ -2651,7 +2659,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDomainMappingsResponse();
       var od = api.ListDomainMappingsResponse.fromJson(o.toJson());
-      checkListDomainMappingsResponse(od);
+      checkListDomainMappingsResponse(od as api.ListDomainMappingsResponse);
     });
   });
 
@@ -2659,7 +2667,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListIngressRulesResponse();
       var od = api.ListIngressRulesResponse.fromJson(o.toJson());
-      checkListIngressRulesResponse(od);
+      checkListIngressRulesResponse(od as api.ListIngressRulesResponse);
     });
   });
 
@@ -2667,7 +2675,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInstancesResponse();
       var od = api.ListInstancesResponse.fromJson(o.toJson());
-      checkListInstancesResponse(od);
+      checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
 
@@ -2675,7 +2683,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -2683,7 +2691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -2691,7 +2699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServicesResponse();
       var od = api.ListServicesResponse.fromJson(o.toJson());
-      checkListServicesResponse(od);
+      checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
 
@@ -2699,7 +2707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListVersionsResponse();
       var od = api.ListVersionsResponse.fromJson(o.toJson());
-      checkListVersionsResponse(od);
+      checkListVersionsResponse(od as api.ListVersionsResponse);
     });
   });
 
@@ -2707,7 +2715,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLivenessCheck();
       var od = api.LivenessCheck.fromJson(o.toJson());
-      checkLivenessCheck(od);
+      checkLivenessCheck(od as api.LivenessCheck);
     });
   });
 
@@ -2715,7 +2723,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -2723,7 +2731,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationMetadata();
       var od = api.LocationMetadata.fromJson(o.toJson());
-      checkLocationMetadata(od);
+      checkLocationMetadata(od as api.LocationMetadata);
     });
   });
 
@@ -2731,7 +2739,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedCertificate();
       var od = api.ManagedCertificate.fromJson(o.toJson());
-      checkManagedCertificate(od);
+      checkManagedCertificate(od as api.ManagedCertificate);
     });
   });
 
@@ -2739,7 +2747,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManualScaling();
       var od = api.ManualScaling.fromJson(o.toJson());
-      checkManualScaling(od);
+      checkManualScaling(od as api.ManualScaling);
     });
   });
 
@@ -2747,7 +2755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetwork();
       var od = api.Network.fromJson(o.toJson());
-      checkNetwork(od);
+      checkNetwork(od as api.Network);
     });
   });
 
@@ -2755,7 +2763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkSettings();
       var od = api.NetworkSettings.fromJson(o.toJson());
-      checkNetworkSettings(od);
+      checkNetworkSettings(od as api.NetworkSettings);
     });
   });
 
@@ -2763,7 +2771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkUtilization();
       var od = api.NetworkUtilization.fromJson(o.toJson());
-      checkNetworkUtilization(od);
+      checkNetworkUtilization(od as api.NetworkUtilization);
     });
   });
 
@@ -2771,7 +2779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -2779,7 +2787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadataV1();
       var od = api.OperationMetadataV1.fromJson(o.toJson());
-      checkOperationMetadataV1(od);
+      checkOperationMetadataV1(od as api.OperationMetadataV1);
     });
   });
 
@@ -2787,7 +2795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadataV1Alpha();
       var od = api.OperationMetadataV1Alpha.fromJson(o.toJson());
-      checkOperationMetadataV1Alpha(od);
+      checkOperationMetadataV1Alpha(od as api.OperationMetadataV1Alpha);
     });
   });
 
@@ -2795,7 +2803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadataV1Beta();
       var od = api.OperationMetadataV1Beta.fromJson(o.toJson());
-      checkOperationMetadataV1Beta(od);
+      checkOperationMetadataV1Beta(od as api.OperationMetadataV1Beta);
     });
   });
 
@@ -2803,7 +2811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadinessCheck();
       var od = api.ReadinessCheck.fromJson(o.toJson());
-      checkReadinessCheck(od);
+      checkReadinessCheck(od as api.ReadinessCheck);
     });
   });
 
@@ -2811,7 +2819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepairApplicationRequest();
       var od = api.RepairApplicationRequest.fromJson(o.toJson());
-      checkRepairApplicationRequest(od);
+      checkRepairApplicationRequest(od as api.RepairApplicationRequest);
     });
   });
 
@@ -2819,7 +2827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestUtilization();
       var od = api.RequestUtilization.fromJson(o.toJson());
-      checkRequestUtilization(od);
+      checkRequestUtilization(od as api.RequestUtilization);
     });
   });
 
@@ -2827,7 +2835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceRecord();
       var od = api.ResourceRecord.fromJson(o.toJson());
-      checkResourceRecord(od);
+      checkResourceRecord(od as api.ResourceRecord);
     });
   });
 
@@ -2835,7 +2843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResources();
       var od = api.Resources.fromJson(o.toJson());
-      checkResources(od);
+      checkResources(od as api.Resources);
     });
   });
 
@@ -2843,7 +2851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScriptHandler();
       var od = api.ScriptHandler.fromJson(o.toJson());
-      checkScriptHandler(od);
+      checkScriptHandler(od as api.ScriptHandler);
     });
   });
 
@@ -2851,7 +2859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -2859,7 +2867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslSettings();
       var od = api.SslSettings.fromJson(o.toJson());
-      checkSslSettings(od);
+      checkSslSettings(od as api.SslSettings);
     });
   });
 
@@ -2867,7 +2875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStandardSchedulerSettings();
       var od = api.StandardSchedulerSettings.fromJson(o.toJson());
-      checkStandardSchedulerSettings(od);
+      checkStandardSchedulerSettings(od as api.StandardSchedulerSettings);
     });
   });
 
@@ -2875,7 +2883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStaticFilesHandler();
       var od = api.StaticFilesHandler.fromJson(o.toJson());
-      checkStaticFilesHandler(od);
+      checkStaticFilesHandler(od as api.StaticFilesHandler);
     });
   });
 
@@ -2883,7 +2891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2891,7 +2899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrafficSplit();
       var od = api.TrafficSplit.fromJson(o.toJson());
-      checkTrafficSplit(od);
+      checkTrafficSplit(od as api.TrafficSplit);
     });
   });
 
@@ -2899,7 +2907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlDispatchRule();
       var od = api.UrlDispatchRule.fromJson(o.toJson());
-      checkUrlDispatchRule(od);
+      checkUrlDispatchRule(od as api.UrlDispatchRule);
     });
   });
 
@@ -2907,7 +2915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMap();
       var od = api.UrlMap.fromJson(o.toJson());
-      checkUrlMap(od);
+      checkUrlMap(od as api.UrlMap);
     });
   });
 
@@ -2915,7 +2923,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVersion();
       var od = api.Version.fromJson(o.toJson());
-      checkVersion(od);
+      checkVersion(od as api.Version);
     });
   });
 
@@ -2923,7 +2931,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolume();
       var od = api.Volume.fromJson(o.toJson());
-      checkVolume(od);
+      checkVolume(od as api.Volume);
     });
   });
 
@@ -2931,7 +2939,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpcAccessConnector();
       var od = api.VpcAccessConnector.fromJson(o.toJson());
-      checkVpcAccessConnector(od);
+      checkVpcAccessConnector(od as api.VpcAccessConnector);
     });
   });
 
@@ -2939,7 +2947,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZipInfo();
       var od = api.ZipInfo.fromJson(o.toJson());
-      checkZipInfo(od);
+      checkZipInfo(od as api.ZipInfo);
     });
   });
 
@@ -2950,8 +2958,9 @@
       var arg_request = buildApplication();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Application.fromJson(json);
-        checkApplication(obj);
+        var obj = api.Application.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkApplication(obj as api.Application);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2990,7 +2999,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3040,7 +3049,7 @@
       res
           .get(arg_appsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApplication(response);
+        checkApplication(response as api.Application);
       })));
     });
 
@@ -3052,8 +3061,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Application.fromJson(json);
-        checkApplication(obj);
+        var obj = api.Application.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkApplication(obj as api.Application);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3098,7 +3108,7 @@
           .patch(arg_request, arg_appsId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3109,8 +3119,9 @@
       var arg_appsId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RepairApplicationRequest.fromJson(json);
-        checkRepairApplicationRequest(obj);
+        var obj = api.RepairApplicationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRepairApplicationRequest(obj as api.RepairApplicationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3158,7 +3169,7 @@
       res
           .repair(arg_request, arg_appsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -3171,8 +3182,9 @@
       var arg_appsId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AuthorizedCertificate.fromJson(json);
-        checkAuthorizedCertificate(obj);
+        var obj = api.AuthorizedCertificate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAuthorizedCertificate(obj as api.AuthorizedCertificate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3220,7 +3232,7 @@
       res
           .create(arg_request, arg_appsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAuthorizedCertificate(response);
+        checkAuthorizedCertificate(response as api.AuthorizedCertificate);
       })));
     });
 
@@ -3282,7 +3294,7 @@
           .delete(arg_appsId, arg_authorizedCertificatesId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3346,7 +3358,7 @@
           .get(arg_appsId, arg_authorizedCertificatesId,
               view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAuthorizedCertificate(response);
+        checkAuthorizedCertificate(response as api.AuthorizedCertificate);
       })));
     });
 
@@ -3415,7 +3427,8 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAuthorizedCertificatesResponse(response);
+        checkListAuthorizedCertificatesResponse(
+            response as api.ListAuthorizedCertificatesResponse);
       })));
     });
 
@@ -3428,8 +3441,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AuthorizedCertificate.fromJson(json);
-        checkAuthorizedCertificate(obj);
+        var obj = api.AuthorizedCertificate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAuthorizedCertificate(obj as api.AuthorizedCertificate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3484,7 +3498,7 @@
           .patch(arg_request, arg_appsId, arg_authorizedCertificatesId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAuthorizedCertificate(response);
+        checkAuthorizedCertificate(response as api.AuthorizedCertificate);
       })));
     });
   });
@@ -3551,7 +3565,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAuthorizedDomainsResponse(response);
+        checkListAuthorizedDomainsResponse(
+            response as api.ListAuthorizedDomainsResponse);
       })));
     });
   });
@@ -3565,8 +3580,9 @@
       var arg_overrideStrategy = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DomainMapping.fromJson(json);
-        checkDomainMapping(obj);
+        var obj = api.DomainMapping.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDomainMapping(obj as api.DomainMapping);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3617,7 +3633,7 @@
           .create(arg_request, arg_appsId,
               overrideStrategy: arg_overrideStrategy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3677,7 +3693,7 @@
       res
           .delete(arg_appsId, arg_domainMappingsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3737,7 +3753,7 @@
       res
           .get(arg_appsId, arg_domainMappingsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainMapping(response);
+        checkDomainMapping(response as api.DomainMapping);
       })));
     });
 
@@ -3802,7 +3818,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDomainMappingsResponse(response);
+        checkListDomainMappingsResponse(
+            response as api.ListDomainMappingsResponse);
       })));
     });
 
@@ -3815,8 +3832,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DomainMapping.fromJson(json);
-        checkDomainMapping(obj);
+        var obj = api.DomainMapping.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDomainMapping(obj as api.DomainMapping);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3870,7 +3888,7 @@
           .patch(arg_request, arg_appsId, arg_domainMappingsId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -3883,8 +3901,10 @@
       var arg_appsId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchUpdateIngressRulesRequest.fromJson(json);
-        checkBatchUpdateIngressRulesRequest(obj);
+        var obj = api.BatchUpdateIngressRulesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchUpdateIngressRulesRequest(
+            obj as api.BatchUpdateIngressRulesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3932,7 +3952,8 @@
       res
           .batchUpdate(arg_request, arg_appsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchUpdateIngressRulesResponse(response);
+        checkBatchUpdateIngressRulesResponse(
+            response as api.BatchUpdateIngressRulesResponse);
       })));
     });
 
@@ -3943,8 +3964,9 @@
       var arg_appsId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FirewallRule.fromJson(json);
-        checkFirewallRule(obj);
+        var obj = api.FirewallRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFirewallRule(obj as api.FirewallRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3992,7 +4014,7 @@
       res
           .create(arg_request, arg_appsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFirewallRule(response);
+        checkFirewallRule(response as api.FirewallRule);
       })));
     });
 
@@ -4052,7 +4074,7 @@
       res
           .delete(arg_appsId, arg_ingressRulesId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4112,7 +4134,7 @@
       res
           .get(arg_appsId, arg_ingressRulesId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFirewallRule(response);
+        checkFirewallRule(response as api.FirewallRule);
       })));
     });
 
@@ -4181,7 +4203,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListIngressRulesResponse(response);
+        checkListIngressRulesResponse(response as api.ListIngressRulesResponse);
       })));
     });
 
@@ -4194,8 +4216,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FirewallRule.fromJson(json);
-        checkFirewallRule(obj);
+        var obj = api.FirewallRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFirewallRule(obj as api.FirewallRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4249,7 +4272,7 @@
           .patch(arg_request, arg_appsId, arg_ingressRulesId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFirewallRule(response);
+        checkFirewallRule(response as api.FirewallRule);
       })));
     });
   });
@@ -4311,7 +4334,7 @@
       res
           .get(arg_appsId, arg_locationsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -4379,7 +4402,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -4441,7 +4464,7 @@
       res
           .get(arg_appsId, arg_operationsId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4509,7 +4532,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -4571,7 +4594,7 @@
       res
           .delete(arg_appsId, arg_servicesId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4631,7 +4654,7 @@
       res
           .get(arg_appsId, arg_servicesId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -4696,7 +4719,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicesResponse(response);
+        checkListServicesResponse(response as api.ListServicesResponse);
       })));
     });
 
@@ -4710,8 +4733,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4769,7 +4793,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -4783,8 +4807,9 @@
       var arg_servicesId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Version.fromJson(json);
-        checkVersion(obj);
+        var obj =
+            api.Version.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVersion(obj as api.Version);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4841,7 +4866,7 @@
       res
           .create(arg_request, arg_appsId, arg_servicesId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4912,7 +4937,7 @@
           .delete(arg_appsId, arg_servicesId, arg_versionsId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4985,7 +5010,7 @@
           .get(arg_appsId, arg_servicesId, arg_versionsId,
               view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVersion(response);
+        checkVersion(response as api.Version);
       })));
     });
 
@@ -5063,7 +5088,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListVersionsResponse(response);
+        checkListVersionsResponse(response as api.ListVersionsResponse);
       })));
     });
 
@@ -5077,8 +5102,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Version.fromJson(json);
-        checkVersion(obj);
+        var obj =
+            api.Version.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVersion(obj as api.Version);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5141,7 +5167,7 @@
           .patch(arg_request, arg_appsId, arg_servicesId, arg_versionsId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -5157,8 +5183,9 @@
       var arg_instancesId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DebugInstanceRequest.fromJson(json);
-        checkDebugInstanceRequest(obj);
+        var obj = api.DebugInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDebugInstanceRequest(obj as api.DebugInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5235,7 +5262,7 @@
               arg_instancesId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5316,7 +5343,7 @@
           .delete(arg_appsId, arg_servicesId, arg_versionsId, arg_instancesId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5397,7 +5424,7 @@
           .get(arg_appsId, arg_servicesId, arg_versionsId, arg_instancesId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstance(response);
+        checkInstance(response as api.Instance);
       })));
     });
 
@@ -5482,7 +5509,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInstancesResponse(response);
+        checkListInstancesResponse(response as api.ListInstancesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/bigquery/v2_test.dart b/generated/googleapis/test/bigquery/v2_test.dart
index d45ac8b..599a62e 100644
--- a/generated/googleapis/test/bigquery/v2_test.dart
+++ b/generated/googleapis/test/bigquery/v2_test.dart
@@ -123,7 +123,7 @@
   buildCounterArgument++;
   if (buildCounterArgument < 3) {
     unittest.expect(o.argumentKind, unittest.equals('foo'));
-    checkStandardSqlDataType(o.dataType);
+    checkStandardSqlDataType(o.dataType as api.StandardSqlDataType);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -211,8 +211,8 @@
 
 void checkUnnamed1210(core.List<api.ArimaFittingMetrics> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkArimaFittingMetrics(o[0]);
-  checkArimaFittingMetrics(o[1]);
+  checkArimaFittingMetrics(o[0] as api.ArimaFittingMetrics);
+  checkArimaFittingMetrics(o[1] as api.ArimaFittingMetrics);
 }
 
 core.List<api.ArimaSingleModelForecastingMetrics> buildUnnamed1211() {
@@ -224,8 +224,10 @@
 
 void checkUnnamed1211(core.List<api.ArimaSingleModelForecastingMetrics> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkArimaSingleModelForecastingMetrics(o[0]);
-  checkArimaSingleModelForecastingMetrics(o[1]);
+  checkArimaSingleModelForecastingMetrics(
+      o[0] as api.ArimaSingleModelForecastingMetrics);
+  checkArimaSingleModelForecastingMetrics(
+      o[1] as api.ArimaSingleModelForecastingMetrics);
 }
 
 core.List<core.bool> buildUnnamed1212() {
@@ -250,8 +252,8 @@
 
 void checkUnnamed1213(core.List<api.ArimaOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkArimaOrder(o[0]);
-  checkArimaOrder(o[1]);
+  checkArimaOrder(o[0] as api.ArimaOrder);
+  checkArimaOrder(o[1] as api.ArimaOrder);
 }
 
 core.List<core.String> buildUnnamed1214() {
@@ -341,10 +343,10 @@
 void checkArimaModelInfo(api.ArimaModelInfo o) {
   buildCounterArimaModelInfo++;
   if (buildCounterArimaModelInfo < 3) {
-    checkArimaCoefficients(o.arimaCoefficients);
-    checkArimaFittingMetrics(o.arimaFittingMetrics);
+    checkArimaCoefficients(o.arimaCoefficients as api.ArimaCoefficients);
+    checkArimaFittingMetrics(o.arimaFittingMetrics as api.ArimaFittingMetrics);
     unittest.expect(o.hasDrift, unittest.isTrue);
-    checkArimaOrder(o.nonSeasonalOrder);
+    checkArimaOrder(o.nonSeasonalOrder as api.ArimaOrder);
     checkUnnamed1216(o.seasonalPeriods);
     unittest.expect(o.timeSeriesId, unittest.equals('foo'));
   }
@@ -383,8 +385,8 @@
 
 void checkUnnamed1217(core.List<api.ArimaModelInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkArimaModelInfo(o[0]);
-  checkArimaModelInfo(o[1]);
+  checkArimaModelInfo(o[0] as api.ArimaModelInfo);
+  checkArimaModelInfo(o[1] as api.ArimaModelInfo);
 }
 
 core.List<core.String> buildUnnamed1218() {
@@ -454,9 +456,9 @@
     api.ArimaSingleModelForecastingMetrics o) {
   buildCounterArimaSingleModelForecastingMetrics++;
   if (buildCounterArimaSingleModelForecastingMetrics < 3) {
-    checkArimaFittingMetrics(o.arimaFittingMetrics);
+    checkArimaFittingMetrics(o.arimaFittingMetrics as api.ArimaFittingMetrics);
     unittest.expect(o.hasDrift, unittest.isTrue);
-    checkArimaOrder(o.nonSeasonalOrder);
+    checkArimaOrder(o.nonSeasonalOrder as api.ArimaOrder);
     checkUnnamed1219(o.seasonalPeriods);
     unittest.expect(o.timeSeriesId, unittest.equals('foo'));
   }
@@ -472,8 +474,8 @@
 
 void checkUnnamed1220(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -590,8 +592,8 @@
 
 void checkUnnamed1222(core.List<api.BigtableColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBigtableColumn(o[0]);
-  checkBigtableColumn(o[1]);
+  checkBigtableColumn(o[0] as api.BigtableColumn);
+  checkBigtableColumn(o[1] as api.BigtableColumn);
 }
 
 core.int buildCounterBigtableColumnFamily = 0;
@@ -630,8 +632,8 @@
 
 void checkUnnamed1223(core.List<api.BigtableColumnFamily> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBigtableColumnFamily(o[0]);
-  checkBigtableColumnFamily(o[1]);
+  checkBigtableColumnFamily(o[0] as api.BigtableColumnFamily);
+  checkBigtableColumnFamily(o[1] as api.BigtableColumnFamily);
 }
 
 core.int buildCounterBigtableOptions = 0;
@@ -666,8 +668,8 @@
 
 void checkUnnamed1224(core.List<api.BinaryConfusionMatrix> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinaryConfusionMatrix(o[0]);
-  checkBinaryConfusionMatrix(o[1]);
+  checkBinaryConfusionMatrix(o[0] as api.BinaryConfusionMatrix);
+  checkBinaryConfusionMatrix(o[1] as api.BinaryConfusionMatrix);
 }
 
 core.int buildCounterBinaryClassificationMetrics = 0;
@@ -687,7 +689,8 @@
 void checkBinaryClassificationMetrics(api.BinaryClassificationMetrics o) {
   buildCounterBinaryClassificationMetrics++;
   if (buildCounterBinaryClassificationMetrics < 3) {
-    checkAggregateClassificationMetrics(o.aggregateClassificationMetrics);
+    checkAggregateClassificationMetrics(
+        o.aggregateClassificationMetrics as api.AggregateClassificationMetrics);
     checkUnnamed1224(o.binaryConfusionMatrixList);
     unittest.expect(o.negativeLabel, unittest.equals('foo'));
     unittest.expect(o.positiveLabel, unittest.equals('foo'));
@@ -759,7 +762,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed1225(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -802,8 +805,8 @@
 
 void checkUnnamed1226(core.List<api.BqmlIterationResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBqmlIterationResult(o[0]);
-  checkBqmlIterationResult(o[1]);
+  checkBqmlIterationResult(o[0] as api.BqmlIterationResult);
+  checkBqmlIterationResult(o[1] as api.BqmlIterationResult);
 }
 
 core.int buildCounterBqmlTrainingRunTrainingOptions = 0;
@@ -862,7 +865,8 @@
     unittest.expect(o.startTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.state, unittest.equals('foo'));
-    checkBqmlTrainingRunTrainingOptions(o.trainingOptions);
+    checkBqmlTrainingRunTrainingOptions(
+        o.trainingOptions as api.BqmlTrainingRunTrainingOptions);
   }
   buildCounterBqmlTrainingRun--;
 }
@@ -876,8 +880,8 @@
 
 void checkUnnamed1227(core.List<api.CategoryCount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCategoryCount(o[0]);
-  checkCategoryCount(o[1]);
+  checkCategoryCount(o[0] as api.CategoryCount);
+  checkCategoryCount(o[1] as api.CategoryCount);
 }
 
 core.int buildCounterCategoricalValue = 0;
@@ -929,8 +933,8 @@
 
 void checkUnnamed1228(core.List<api.FeatureValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFeatureValue(o[0]);
-  checkFeatureValue(o[1]);
+  checkFeatureValue(o[0] as api.FeatureValue);
+  checkFeatureValue(o[1] as api.FeatureValue);
 }
 
 core.int buildCounterCluster = 0;
@@ -1020,8 +1024,8 @@
 
 void checkUnnamed1230(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCluster(o[0]);
-  checkCluster(o[1]);
+  checkCluster(o[0] as api.Cluster);
+  checkCluster(o[1] as api.Cluster);
 }
 
 core.int buildCounterClusteringMetrics = 0;
@@ -1056,8 +1060,8 @@
 
 void checkUnnamed1231(core.List<api.Row> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRow(o[0]);
-  checkRow(o[1]);
+  checkRow(o[0] as api.Row);
+  checkRow(o[1] as api.Row);
 }
 
 core.int buildCounterConfusionMatrix = 0;
@@ -1146,8 +1150,8 @@
 void checkDataSplitResult(api.DataSplitResult o) {
   buildCounterDataSplitResult++;
   if (buildCounterDataSplitResult < 3) {
-    checkTableReference(o.evaluationTable);
-    checkTableReference(o.trainingTable);
+    checkTableReference(o.evaluationTable as api.TableReference);
+    checkTableReference(o.trainingTable as api.TableReference);
   }
   buildCounterDataSplitResult--;
 }
@@ -1178,7 +1182,7 @@
     unittest.expect(o.role, unittest.equals('foo'));
     unittest.expect(o.specialGroup, unittest.equals('foo'));
     unittest.expect(o.userByEmail, unittest.equals('foo'));
-    checkTableReference(o.view);
+    checkTableReference(o.view as api.TableReference);
   }
   buildCounterDatasetAccess--;
 }
@@ -1192,8 +1196,8 @@
 
 void checkUnnamed1232(core.List<api.DatasetAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatasetAccess(o[0]);
-  checkDatasetAccess(o[1]);
+  checkDatasetAccess(o[0] as api.DatasetAccess);
+  checkDatasetAccess(o[1] as api.DatasetAccess);
 }
 
 core.Map<core.String, core.String> buildUnnamed1233() {
@@ -1240,8 +1244,9 @@
   if (buildCounterDataset < 3) {
     checkUnnamed1232(o.access);
     unittest.expect(o.creationTime, unittest.equals('foo'));
-    checkDatasetReference(o.datasetReference);
-    checkEncryptionConfiguration(o.defaultEncryptionConfiguration);
+    checkDatasetReference(o.datasetReference as api.DatasetReference);
+    checkEncryptionConfiguration(
+        o.defaultEncryptionConfiguration as api.EncryptionConfiguration);
     unittest.expect(o.defaultPartitionExpirationMs, unittest.equals('foo'));
     unittest.expect(o.defaultTableExpirationMs, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -1290,7 +1295,7 @@
 void checkDatasetListDatasets(api.DatasetListDatasets o) {
   buildCounterDatasetListDatasets++;
   if (buildCounterDatasetListDatasets < 3) {
-    checkDatasetReference(o.datasetReference);
+    checkDatasetReference(o.datasetReference as api.DatasetReference);
     unittest.expect(o.friendlyName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1309,8 +1314,8 @@
 
 void checkUnnamed1235(core.List<api.DatasetListDatasets> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatasetListDatasets(o[0]);
-  checkDatasetListDatasets(o[1]);
+  checkDatasetListDatasets(o[0] as api.DatasetListDatasets);
+  checkDatasetListDatasets(o[1] as api.DatasetListDatasets);
 }
 
 core.int buildCounterDatasetList = 0;
@@ -1479,12 +1484,15 @@
 void checkEvaluationMetrics(api.EvaluationMetrics o) {
   buildCounterEvaluationMetrics++;
   if (buildCounterEvaluationMetrics < 3) {
-    checkArimaForecastingMetrics(o.arimaForecastingMetrics);
-    checkBinaryClassificationMetrics(o.binaryClassificationMetrics);
-    checkClusteringMetrics(o.clusteringMetrics);
-    checkMultiClassClassificationMetrics(o.multiClassClassificationMetrics);
-    checkRankingMetrics(o.rankingMetrics);
-    checkRegressionMetrics(o.regressionMetrics);
+    checkArimaForecastingMetrics(
+        o.arimaForecastingMetrics as api.ArimaForecastingMetrics);
+    checkBinaryClassificationMetrics(
+        o.binaryClassificationMetrics as api.BinaryClassificationMetrics);
+    checkClusteringMetrics(o.clusteringMetrics as api.ClusteringMetrics);
+    checkMultiClassClassificationMetrics(o.multiClassClassificationMetrics
+        as api.MultiClassClassificationMetrics);
+    checkRankingMetrics(o.rankingMetrics as api.RankingMetrics);
+    checkRegressionMetrics(o.regressionMetrics as api.RegressionMetrics);
   }
   buildCounterEvaluationMetrics--;
 }
@@ -1511,8 +1519,8 @@
 
 void checkUnnamed1238(core.List<api.ExplainQueryStep> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExplainQueryStep(o[0]);
-  checkExplainQueryStep(o[1]);
+  checkExplainQueryStep(o[0] as api.ExplainQueryStep);
+  checkExplainQueryStep(o[1] as api.ExplainQueryStep);
 }
 
 core.int buildCounterExplainQueryStage = 0;
@@ -1690,15 +1698,16 @@
   buildCounterExternalDataConfiguration++;
   if (buildCounterExternalDataConfiguration < 3) {
     unittest.expect(o.autodetect, unittest.isTrue);
-    checkBigtableOptions(o.bigtableOptions);
+    checkBigtableOptions(o.bigtableOptions as api.BigtableOptions);
     unittest.expect(o.compression, unittest.equals('foo'));
     unittest.expect(o.connectionId, unittest.equals('foo'));
-    checkCsvOptions(o.csvOptions);
-    checkGoogleSheetsOptions(o.googleSheetsOptions);
-    checkHivePartitioningOptions(o.hivePartitioningOptions);
+    checkCsvOptions(o.csvOptions as api.CsvOptions);
+    checkGoogleSheetsOptions(o.googleSheetsOptions as api.GoogleSheetsOptions);
+    checkHivePartitioningOptions(
+        o.hivePartitioningOptions as api.HivePartitioningOptions);
     unittest.expect(o.ignoreUnknownValues, unittest.isTrue);
     unittest.expect(o.maxBadRecords, unittest.equals(42));
-    checkTableSchema(o.schema);
+    checkTableSchema(o.schema as api.TableSchema);
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
     checkUnnamed1240(o.sourceUris);
   }
@@ -1721,7 +1730,7 @@
 void checkFeatureValue(api.FeatureValue o) {
   buildCounterFeatureValue++;
   if (buildCounterFeatureValue < 3) {
-    checkCategoricalValue(o.categoricalValue);
+    checkCategoricalValue(o.categoricalValue as api.CategoricalValue);
     unittest.expect(o.featureColumn, unittest.equals('foo'));
     unittest.expect(o.numericalValue, unittest.equals(42.0));
   }
@@ -1742,7 +1751,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -1775,8 +1784,8 @@
 
 void checkUnnamed1241(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorProto(o[0]);
-  checkErrorProto(o[1]);
+  checkErrorProto(o[0] as api.ErrorProto);
+  checkErrorProto(o[1] as api.ErrorProto);
 }
 
 core.List<api.TableRow> buildUnnamed1242() {
@@ -1788,8 +1797,8 @@
 
 void checkUnnamed1242(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableRow(o[0]);
-  checkTableRow(o[1]);
+  checkTableRow(o[0] as api.TableRow);
+  checkTableRow(o[1] as api.TableRow);
 }
 
 core.int buildCounterGetQueryResultsResponse = 0;
@@ -1821,12 +1830,12 @@
     checkUnnamed1241(o.errors);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.jobComplete, unittest.isTrue);
-    checkJobReference(o.jobReference);
+    checkJobReference(o.jobReference as api.JobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.numDmlAffectedRows, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     checkUnnamed1242(o.rows);
-    checkTableSchema(o.schema);
+    checkTableSchema(o.schema as api.TableSchema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
@@ -1907,8 +1916,8 @@
 
 void checkUnnamed1243(core.List<api.ClusterInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClusterInfo(o[0]);
-  checkClusterInfo(o[1]);
+  checkClusterInfo(o[0] as api.ClusterInfo);
+  checkClusterInfo(o[1] as api.ClusterInfo);
 }
 
 core.int buildCounterIterationResult = 0;
@@ -1931,7 +1940,7 @@
 void checkIterationResult(api.IterationResult o) {
   buildCounterIterationResult++;
   if (buildCounterIterationResult < 3) {
-    checkArimaResult(o.arimaResult);
+    checkArimaResult(o.arimaResult as api.ArimaResult);
     checkUnnamed1243(o.clusterInfos);
     unittest.expect(o.durationMs, unittest.equals('foo'));
     unittest.expect(o.evalLoss, unittest.equals(42.0));
@@ -1964,14 +1973,14 @@
 void checkJob(api.Job o) {
   buildCounterJob++;
   if (buildCounterJob < 3) {
-    checkJobConfiguration(o.configuration);
+    checkJobConfiguration(o.configuration as api.JobConfiguration);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkJobReference(o.jobReference);
+    checkJobReference(o.jobReference as api.JobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkJobStatistics(o.statistics);
-    checkJobStatus(o.status);
+    checkJobStatistics(o.statistics as api.JobStatistics);
+    checkJobStatus(o.status as api.JobStatus);
     unittest.expect(o.userEmail, unittest.equals('foo'));
   }
   buildCounterJob--;
@@ -1992,7 +2001,7 @@
 void checkJobCancelResponse(api.JobCancelResponse o) {
   buildCounterJobCancelResponse++;
   if (buildCounterJobCancelResponse < 3) {
-    checkJob(o.job);
+    checkJob(o.job as api.Job);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterJobCancelResponse--;
@@ -2032,14 +2041,14 @@
 void checkJobConfiguration(api.JobConfiguration o) {
   buildCounterJobConfiguration++;
   if (buildCounterJobConfiguration < 3) {
-    checkJobConfigurationTableCopy(o.copy);
+    checkJobConfigurationTableCopy(o.copy as api.JobConfigurationTableCopy);
     unittest.expect(o.dryRun, unittest.isTrue);
-    checkJobConfigurationExtract(o.extract);
+    checkJobConfigurationExtract(o.extract as api.JobConfigurationExtract);
     unittest.expect(o.jobTimeoutMs, unittest.equals('foo'));
     unittest.expect(o.jobType, unittest.equals('foo'));
     checkUnnamed1244(o.labels);
-    checkJobConfigurationLoad(o.load);
-    checkJobConfigurationQuery(o.query);
+    checkJobConfigurationLoad(o.load as api.JobConfigurationLoad);
+    checkJobConfigurationQuery(o.query as api.JobConfigurationQuery);
   }
   buildCounterJobConfiguration--;
 }
@@ -2085,8 +2094,8 @@
     checkUnnamed1245(o.destinationUris);
     unittest.expect(o.fieldDelimiter, unittest.equals('foo'));
     unittest.expect(o.printHeader, unittest.isTrue);
-    checkModelReference(o.sourceModel);
-    checkTableReference(o.sourceTable);
+    checkModelReference(o.sourceModel as api.ModelReference);
+    checkTableReference(o.sourceTable as api.TableReference);
     unittest.expect(o.useAvroLogicalTypes, unittest.isTrue);
   }
   buildCounterJobConfigurationExtract--;
@@ -2188,29 +2197,32 @@
     unittest.expect(o.allowJaggedRows, unittest.isTrue);
     unittest.expect(o.allowQuotedNewlines, unittest.isTrue);
     unittest.expect(o.autodetect, unittest.isTrue);
-    checkClustering(o.clustering);
+    checkClustering(o.clustering as api.Clustering);
     unittest.expect(o.createDisposition, unittest.equals('foo'));
     checkUnnamed1246(o.decimalTargetTypes);
-    checkEncryptionConfiguration(o.destinationEncryptionConfiguration);
-    checkTableReference(o.destinationTable);
-    checkDestinationTableProperties(o.destinationTableProperties);
+    checkEncryptionConfiguration(
+        o.destinationEncryptionConfiguration as api.EncryptionConfiguration);
+    checkTableReference(o.destinationTable as api.TableReference);
+    checkDestinationTableProperties(
+        o.destinationTableProperties as api.DestinationTableProperties);
     unittest.expect(o.encoding, unittest.equals('foo'));
     unittest.expect(o.fieldDelimiter, unittest.equals('foo'));
-    checkHivePartitioningOptions(o.hivePartitioningOptions);
+    checkHivePartitioningOptions(
+        o.hivePartitioningOptions as api.HivePartitioningOptions);
     unittest.expect(o.ignoreUnknownValues, unittest.isTrue);
     unittest.expect(o.maxBadRecords, unittest.equals(42));
     unittest.expect(o.nullMarker, unittest.equals('foo'));
     checkUnnamed1247(o.projectionFields);
     unittest.expect(o.quote, unittest.equals('foo'));
-    checkRangePartitioning(o.rangePartitioning);
-    checkTableSchema(o.schema);
+    checkRangePartitioning(o.rangePartitioning as api.RangePartitioning);
+    checkTableSchema(o.schema as api.TableSchema);
     unittest.expect(o.schemaInline, unittest.equals('foo'));
     unittest.expect(o.schemaInlineFormat, unittest.equals('foo'));
     checkUnnamed1248(o.schemaUpdateOptions);
     unittest.expect(o.skipLeadingRows, unittest.equals(42));
     unittest.expect(o.sourceFormat, unittest.equals('foo'));
     checkUnnamed1249(o.sourceUris);
-    checkTimePartitioning(o.timePartitioning);
+    checkTimePartitioning(o.timePartitioning as api.TimePartitioning);
     unittest.expect(o.useAvroLogicalTypes, unittest.isTrue);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
@@ -2226,8 +2238,8 @@
 
 void checkUnnamed1250(core.List<api.ConnectionProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConnectionProperty(o[0]);
-  checkConnectionProperty(o[1]);
+  checkConnectionProperty(o[0] as api.ConnectionProperty);
+  checkConnectionProperty(o[1] as api.ConnectionProperty);
 }
 
 core.List<api.QueryParameter> buildUnnamed1251() {
@@ -2239,8 +2251,8 @@
 
 void checkUnnamed1251(core.List<api.QueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryParameter(o[0]);
-  checkQueryParameter(o[1]);
+  checkQueryParameter(o[0] as api.QueryParameter);
+  checkQueryParameter(o[1] as api.QueryParameter);
 }
 
 core.List<core.String> buildUnnamed1252() {
@@ -2265,8 +2277,8 @@
 
 void checkUnnamed1253(core.Map<core.String, api.ExternalDataConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExternalDataConfiguration(o['x']);
-  checkExternalDataConfiguration(o['y']);
+  checkExternalDataConfiguration(o['x'] as api.ExternalDataConfiguration);
+  checkExternalDataConfiguration(o['y'] as api.ExternalDataConfiguration);
 }
 
 core.List<api.UserDefinedFunctionResource> buildUnnamed1254() {
@@ -2278,8 +2290,8 @@
 
 void checkUnnamed1254(core.List<api.UserDefinedFunctionResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserDefinedFunctionResource(o[0]);
-  checkUserDefinedFunctionResource(o[1]);
+  checkUserDefinedFunctionResource(o[0] as api.UserDefinedFunctionResource);
+  checkUserDefinedFunctionResource(o[1] as api.UserDefinedFunctionResource);
 }
 
 core.int buildCounterJobConfigurationQuery = 0;
@@ -2319,12 +2331,13 @@
   buildCounterJobConfigurationQuery++;
   if (buildCounterJobConfigurationQuery < 3) {
     unittest.expect(o.allowLargeResults, unittest.isTrue);
-    checkClustering(o.clustering);
+    checkClustering(o.clustering as api.Clustering);
     checkUnnamed1250(o.connectionProperties);
     unittest.expect(o.createDisposition, unittest.equals('foo'));
-    checkDatasetReference(o.defaultDataset);
-    checkEncryptionConfiguration(o.destinationEncryptionConfiguration);
-    checkTableReference(o.destinationTable);
+    checkDatasetReference(o.defaultDataset as api.DatasetReference);
+    checkEncryptionConfiguration(
+        o.destinationEncryptionConfiguration as api.EncryptionConfiguration);
+    checkTableReference(o.destinationTable as api.TableReference);
     unittest.expect(o.flattenResults, unittest.isTrue);
     unittest.expect(o.maximumBillingTier, unittest.equals(42));
     unittest.expect(o.maximumBytesBilled, unittest.equals('foo'));
@@ -2333,10 +2346,10 @@
     unittest.expect(o.priority, unittest.equals('foo'));
     unittest.expect(o.query, unittest.equals('foo'));
     checkUnnamed1251(o.queryParameters);
-    checkRangePartitioning(o.rangePartitioning);
+    checkRangePartitioning(o.rangePartitioning as api.RangePartitioning);
     checkUnnamed1252(o.schemaUpdateOptions);
     checkUnnamed1253(o.tableDefinitions);
-    checkTimePartitioning(o.timePartitioning);
+    checkTimePartitioning(o.timePartitioning as api.TimePartitioning);
     unittest.expect(o.useLegacySql, unittest.isTrue);
     unittest.expect(o.useQueryCache, unittest.isTrue);
     checkUnnamed1254(o.userDefinedFunctionResources);
@@ -2354,8 +2367,8 @@
 
 void checkUnnamed1255(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableReference(o[0]);
-  checkTableReference(o[1]);
+  checkTableReference(o[0] as api.TableReference);
+  checkTableReference(o[1] as api.TableReference);
 }
 
 core.int buildCounterJobConfigurationTableCopy = 0;
@@ -2384,15 +2397,16 @@
   buildCounterJobConfigurationTableCopy++;
   if (buildCounterJobConfigurationTableCopy < 3) {
     unittest.expect(o.createDisposition, unittest.equals('foo'));
-    checkEncryptionConfiguration(o.destinationEncryptionConfiguration);
+    checkEncryptionConfiguration(
+        o.destinationEncryptionConfiguration as api.EncryptionConfiguration);
     var casted1 = (o.destinationExpirationTime) as core.Map;
     unittest.expect(casted1, unittest.hasLength(3));
     unittest.expect(casted1['list'], unittest.equals([1, 2, 3]));
     unittest.expect(casted1['bool'], unittest.equals(true));
     unittest.expect(casted1['string'], unittest.equals('foo'));
-    checkTableReference(o.destinationTable);
+    checkTableReference(o.destinationTable as api.TableReference);
     unittest.expect(o.operationType, unittest.equals('foo'));
-    checkTableReference(o.sourceTable);
+    checkTableReference(o.sourceTable as api.TableReference);
     checkUnnamed1255(o.sourceTables);
     unittest.expect(o.writeDisposition, unittest.equals('foo'));
   }
@@ -2421,14 +2435,14 @@
 void checkJobListJobs(api.JobListJobs o) {
   buildCounterJobListJobs++;
   if (buildCounterJobListJobs < 3) {
-    checkJobConfiguration(o.configuration);
-    checkErrorProto(o.errorResult);
+    checkJobConfiguration(o.configuration as api.JobConfiguration);
+    checkErrorProto(o.errorResult as api.ErrorProto);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkJobReference(o.jobReference);
+    checkJobReference(o.jobReference as api.JobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
-    checkJobStatistics(o.statistics);
-    checkJobStatus(o.status);
+    checkJobStatistics(o.statistics as api.JobStatistics);
+    checkJobStatus(o.status as api.JobStatus);
     unittest.expect(o.userEmail, unittest.equals('foo'));
   }
   buildCounterJobListJobs--;
@@ -2443,8 +2457,8 @@
 
 void checkUnnamed1256(core.List<api.JobListJobs> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJobListJobs(o[0]);
-  checkJobListJobs(o[1]);
+  checkJobListJobs(o[0] as api.JobListJobs);
+  checkJobListJobs(o[1] as api.JobListJobs);
 }
 
 core.int buildCounterJobList = 0;
@@ -2538,8 +2552,8 @@
 
 void checkUnnamed1258(core.List<api.JobStatisticsReservationUsage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJobStatisticsReservationUsage(o[0]);
-  checkJobStatisticsReservationUsage(o[1]);
+  checkJobStatisticsReservationUsage(o[0] as api.JobStatisticsReservationUsage);
+  checkJobStatisticsReservationUsage(o[1] as api.JobStatisticsReservationUsage);
 }
 
 core.int buildCounterJobStatistics = 0;
@@ -2575,20 +2589,21 @@
     unittest.expect(o.completionRatio, unittest.equals(42.0));
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkJobStatistics4(o.extract);
-    checkJobStatistics3(o.load);
+    checkJobStatistics4(o.extract as api.JobStatistics4);
+    checkJobStatistics3(o.load as api.JobStatistics3);
     unittest.expect(o.numChildJobs, unittest.equals('foo'));
     unittest.expect(o.parentJobId, unittest.equals('foo'));
-    checkJobStatistics2(o.query);
+    checkJobStatistics2(o.query as api.JobStatistics2);
     checkUnnamed1257(o.quotaDeferments);
     checkUnnamed1258(o.reservationUsage);
     unittest.expect(o.reservationId, unittest.equals('foo'));
-    checkRowLevelSecurityStatistics(o.rowLevelSecurityStatistics);
-    checkScriptStatistics(o.scriptStatistics);
+    checkRowLevelSecurityStatistics(
+        o.rowLevelSecurityStatistics as api.RowLevelSecurityStatistics);
+    checkScriptStatistics(o.scriptStatistics as api.ScriptStatistics);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalSlotMs, unittest.equals('foo'));
-    checkTransactionInfo(o.transactionInfoTemplate);
+    checkTransactionInfo(o.transactionInfoTemplate as api.TransactionInfo);
   }
   buildCounterJobStatistics--;
 }
@@ -2602,8 +2617,8 @@
 
 void checkUnnamed1259(core.List<api.ExplainQueryStage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExplainQueryStage(o[0]);
-  checkExplainQueryStage(o[1]);
+  checkExplainQueryStage(o[0] as api.ExplainQueryStage);
+  checkExplainQueryStage(o[1] as api.ExplainQueryStage);
 }
 
 core.List<api.RoutineReference> buildUnnamed1260() {
@@ -2615,8 +2630,8 @@
 
 void checkUnnamed1260(core.List<api.RoutineReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoutineReference(o[0]);
-  checkRoutineReference(o[1]);
+  checkRoutineReference(o[0] as api.RoutineReference);
+  checkRoutineReference(o[1] as api.RoutineReference);
 }
 
 core.List<api.TableReference> buildUnnamed1261() {
@@ -2628,8 +2643,8 @@
 
 void checkUnnamed1261(core.List<api.TableReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableReference(o[0]);
-  checkTableReference(o[1]);
+  checkTableReference(o[0] as api.TableReference);
+  checkTableReference(o[1] as api.TableReference);
 }
 
 core.int buildCounterJobStatistics2ReservationUsage = 0;
@@ -2662,8 +2677,10 @@
 
 void checkUnnamed1262(core.List<api.JobStatistics2ReservationUsage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJobStatistics2ReservationUsage(o[0]);
-  checkJobStatistics2ReservationUsage(o[1]);
+  checkJobStatistics2ReservationUsage(
+      o[0] as api.JobStatistics2ReservationUsage);
+  checkJobStatistics2ReservationUsage(
+      o[1] as api.JobStatistics2ReservationUsage);
 }
 
 core.List<api.QueryTimelineSample> buildUnnamed1263() {
@@ -2675,8 +2692,8 @@
 
 void checkUnnamed1263(core.List<api.QueryTimelineSample> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryTimelineSample(o[0]);
-  checkQueryTimelineSample(o[1]);
+  checkQueryTimelineSample(o[0] as api.QueryTimelineSample);
+  checkQueryTimelineSample(o[1] as api.QueryTimelineSample);
 }
 
 core.List<api.QueryParameter> buildUnnamed1264() {
@@ -2688,8 +2705,8 @@
 
 void checkUnnamed1264(core.List<api.QueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryParameter(o[0]);
-  checkQueryParameter(o[1]);
+  checkQueryParameter(o[0] as api.QueryParameter);
+  checkQueryParameter(o[1] as api.QueryParameter);
 }
 
 core.int buildCounterJobStatistics2 = 0;
@@ -2734,11 +2751,12 @@
     unittest.expect(o.cacheHit, unittest.isTrue);
     unittest.expect(o.ddlAffectedRowAccessPolicyCount, unittest.equals('foo'));
     unittest.expect(o.ddlOperationPerformed, unittest.equals('foo'));
-    checkRoutineReference(o.ddlTargetRoutine);
-    checkRowAccessPolicyReference(o.ddlTargetRowAccessPolicy);
-    checkTableReference(o.ddlTargetTable);
+    checkRoutineReference(o.ddlTargetRoutine as api.RoutineReference);
+    checkRowAccessPolicyReference(
+        o.ddlTargetRowAccessPolicy as api.RowAccessPolicyReference);
+    checkTableReference(o.ddlTargetTable as api.TableReference);
     unittest.expect(o.estimatedBytesProcessed, unittest.equals('foo'));
-    checkBigQueryModelTraining(o.modelTraining);
+    checkBigQueryModelTraining(o.modelTraining as api.BigQueryModelTraining);
     unittest.expect(o.modelTrainingCurrentIteration, unittest.equals(42));
     unittest.expect(
         o.modelTrainingExpectedTotalIteration, unittest.equals('foo'));
@@ -2747,7 +2765,7 @@
     checkUnnamed1260(o.referencedRoutines);
     checkUnnamed1261(o.referencedTables);
     checkUnnamed1262(o.reservationUsage);
-    checkTableSchema(o.schema);
+    checkTableSchema(o.schema as api.TableSchema);
     unittest.expect(o.statementType, unittest.equals('foo'));
     checkUnnamed1263(o.timeline);
     unittest.expect(o.totalBytesBilled, unittest.equals('foo'));
@@ -2830,8 +2848,8 @@
 
 void checkUnnamed1266(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorProto(o[0]);
-  checkErrorProto(o[1]);
+  checkErrorProto(o[0] as api.ErrorProto);
+  checkErrorProto(o[1] as api.ErrorProto);
 }
 
 core.int buildCounterJobStatus = 0;
@@ -2850,7 +2868,7 @@
 void checkJobStatus(api.JobStatus o) {
   buildCounterJobStatus++;
   if (buildCounterJobStatus < 3) {
-    checkErrorProto(o.errorResult);
+    checkErrorProto(o.errorResult as api.ErrorProto);
     checkUnnamed1266(o.errors);
     unittest.expect(o.state, unittest.equals('foo'));
   }
@@ -2895,8 +2913,8 @@
 
 void checkUnnamed1267(core.List<api.Model> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkModel(o[0]);
-  checkModel(o[1]);
+  checkModel(o[0] as api.Model);
+  checkModel(o[1] as api.Model);
 }
 
 core.int buildCounterListModelsResponse = 0;
@@ -2929,8 +2947,8 @@
 
 void checkUnnamed1268(core.List<api.Routine> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoutine(o[0]);
-  checkRoutine(o[1]);
+  checkRoutine(o[0] as api.Routine);
+  checkRoutine(o[1] as api.Routine);
 }
 
 core.int buildCounterListRoutinesResponse = 0;
@@ -3007,8 +3025,8 @@
 
 void checkUnnamed1269(core.List<api.StandardSqlField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStandardSqlField(o[0]);
-  checkStandardSqlField(o[1]);
+  checkStandardSqlField(o[0] as api.StandardSqlField);
+  checkStandardSqlField(o[1] as api.StandardSqlField);
 }
 
 core.List<api.StandardSqlField> buildUnnamed1270() {
@@ -3020,8 +3038,8 @@
 
 void checkUnnamed1270(core.List<api.StandardSqlField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStandardSqlField(o[0]);
-  checkStandardSqlField(o[1]);
+  checkStandardSqlField(o[0] as api.StandardSqlField);
+  checkStandardSqlField(o[1] as api.StandardSqlField);
 }
 
 core.Map<core.String, core.String> buildUnnamed1271() {
@@ -3046,8 +3064,8 @@
 
 void checkUnnamed1272(core.List<api.TrainingRun> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrainingRun(o[0]);
-  checkTrainingRun(o[1]);
+  checkTrainingRun(o[0] as api.TrainingRun);
+  checkTrainingRun(o[1] as api.TrainingRun);
 }
 
 core.int buildCounterModel = 0;
@@ -3079,7 +3097,8 @@
   if (buildCounterModel < 3) {
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkEncryptionConfiguration(o.encryptionConfiguration);
+    checkEncryptionConfiguration(
+        o.encryptionConfiguration as api.EncryptionConfiguration);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.expirationTime, unittest.equals('foo'));
     checkUnnamed1269(o.featureColumns);
@@ -3088,7 +3107,7 @@
     checkUnnamed1271(o.labels);
     unittest.expect(o.lastModifiedTime, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
-    checkModelReference(o.modelReference);
+    checkModelReference(o.modelReference as api.ModelReference);
     unittest.expect(o.modelType, unittest.equals('foo'));
     checkUnnamed1272(o.trainingRuns);
   }
@@ -3140,8 +3159,8 @@
 
 void checkUnnamed1274(core.List<api.BqmlTrainingRun> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBqmlTrainingRun(o[0]);
-  checkBqmlTrainingRun(o[1]);
+  checkBqmlTrainingRun(o[0] as api.BqmlTrainingRun);
+  checkBqmlTrainingRun(o[1] as api.BqmlTrainingRun);
 }
 
 core.int buildCounterModelDefinition = 0;
@@ -3159,7 +3178,8 @@
 void checkModelDefinition(api.ModelDefinition o) {
   buildCounterModelDefinition++;
   if (buildCounterModelDefinition < 3) {
-    checkModelDefinitionModelOptions(o.modelOptions);
+    checkModelDefinitionModelOptions(
+        o.modelOptions as api.ModelDefinitionModelOptions);
     checkUnnamed1274(o.trainingRuns);
   }
   buildCounterModelDefinition--;
@@ -3197,8 +3217,8 @@
 
 void checkUnnamed1275(core.List<api.ConfusionMatrix> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConfusionMatrix(o[0]);
-  checkConfusionMatrix(o[1]);
+  checkConfusionMatrix(o[0] as api.ConfusionMatrix);
+  checkConfusionMatrix(o[1] as api.ConfusionMatrix);
 }
 
 core.int buildCounterMultiClassClassificationMetrics = 0;
@@ -3217,7 +3237,8 @@
     api.MultiClassClassificationMetrics o) {
   buildCounterMultiClassClassificationMetrics++;
   if (buildCounterMultiClassClassificationMetrics < 3) {
-    checkAggregateClassificationMetrics(o.aggregateClassificationMetrics);
+    checkAggregateClassificationMetrics(
+        o.aggregateClassificationMetrics as api.AggregateClassificationMetrics);
     checkUnnamed1275(o.confusionMatrixList);
   }
   buildCounterMultiClassClassificationMetrics--;
@@ -3232,8 +3253,8 @@
 
 void checkUnnamed1276(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed1277() {
@@ -3245,8 +3266,8 @@
 
 void checkUnnamed1277(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -3296,7 +3317,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.numericId, unittest.equals('foo'));
-    checkProjectReference(o.projectReference);
+    checkProjectReference(o.projectReference as api.ProjectReference);
   }
   buildCounterProjectListProjects--;
 }
@@ -3310,8 +3331,8 @@
 
 void checkUnnamed1278(core.List<api.ProjectListProjects> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProjectListProjects(o[0]);
-  checkProjectListProjects(o[1]);
+  checkProjectListProjects(o[0] as api.ProjectListProjects);
+  checkProjectListProjects(o[1] as api.ProjectListProjects);
 }
 
 core.int buildCounterProjectList = 0;
@@ -3377,8 +3398,8 @@
   buildCounterQueryParameter++;
   if (buildCounterQueryParameter < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkQueryParameterType(o.parameterType);
-    checkQueryParameterValue(o.parameterValue);
+    checkQueryParameterType(o.parameterType as api.QueryParameterType);
+    checkQueryParameterValue(o.parameterValue as api.QueryParameterValue);
   }
   buildCounterQueryParameter--;
 }
@@ -3401,7 +3422,7 @@
   if (buildCounterQueryParameterTypeStructTypes < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkQueryParameterType(o.type);
+    checkQueryParameterType(o.type as api.QueryParameterType);
   }
   buildCounterQueryParameterTypeStructTypes--;
 }
@@ -3415,8 +3436,8 @@
 
 void checkUnnamed1279(core.List<api.QueryParameterTypeStructTypes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryParameterTypeStructTypes(o[0]);
-  checkQueryParameterTypeStructTypes(o[1]);
+  checkQueryParameterTypeStructTypes(o[0] as api.QueryParameterTypeStructTypes);
+  checkQueryParameterTypeStructTypes(o[1] as api.QueryParameterTypeStructTypes);
 }
 
 core.int buildCounterQueryParameterType = 0;
@@ -3435,7 +3456,7 @@
 void checkQueryParameterType(api.QueryParameterType o) {
   buildCounterQueryParameterType++;
   if (buildCounterQueryParameterType < 3) {
-    checkQueryParameterType(o.arrayType);
+    checkQueryParameterType(o.arrayType as api.QueryParameterType);
     checkUnnamed1279(o.structTypes);
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -3451,8 +3472,8 @@
 
 void checkUnnamed1280(core.List<api.QueryParameterValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryParameterValue(o[0]);
-  checkQueryParameterValue(o[1]);
+  checkQueryParameterValue(o[0] as api.QueryParameterValue);
+  checkQueryParameterValue(o[1] as api.QueryParameterValue);
 }
 
 core.Map<core.String, api.QueryParameterValue> buildUnnamed1281() {
@@ -3464,8 +3485,8 @@
 
 void checkUnnamed1281(core.Map<core.String, api.QueryParameterValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryParameterValue(o['x']);
-  checkQueryParameterValue(o['y']);
+  checkQueryParameterValue(o['x'] as api.QueryParameterValue);
+  checkQueryParameterValue(o['y'] as api.QueryParameterValue);
 }
 
 core.int buildCounterQueryParameterValue = 0;
@@ -3500,8 +3521,8 @@
 
 void checkUnnamed1282(core.List<api.ConnectionProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConnectionProperty(o[0]);
-  checkConnectionProperty(o[1]);
+  checkConnectionProperty(o[0] as api.ConnectionProperty);
+  checkConnectionProperty(o[1] as api.ConnectionProperty);
 }
 
 core.Map<core.String, core.String> buildUnnamed1283() {
@@ -3526,8 +3547,8 @@
 
 void checkUnnamed1284(core.List<api.QueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryParameter(o[0]);
-  checkQueryParameter(o[1]);
+  checkQueryParameter(o[0] as api.QueryParameter);
+  checkQueryParameter(o[1] as api.QueryParameter);
 }
 
 core.int buildCounterQueryRequest = 0;
@@ -3560,7 +3581,7 @@
   buildCounterQueryRequest++;
   if (buildCounterQueryRequest < 3) {
     checkUnnamed1282(o.connectionProperties);
-    checkDatasetReference(o.defaultDataset);
+    checkDatasetReference(o.defaultDataset as api.DatasetReference);
     unittest.expect(o.dryRun, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed1283(o.labels);
@@ -3588,8 +3609,8 @@
 
 void checkUnnamed1285(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorProto(o[0]);
-  checkErrorProto(o[1]);
+  checkErrorProto(o[0] as api.ErrorProto);
+  checkErrorProto(o[1] as api.ErrorProto);
 }
 
 core.List<api.TableRow> buildUnnamed1286() {
@@ -3601,8 +3622,8 @@
 
 void checkUnnamed1286(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableRow(o[0]);
-  checkTableRow(o[1]);
+  checkTableRow(o[0] as api.TableRow);
+  checkTableRow(o[1] as api.TableRow);
 }
 
 core.int buildCounterQueryResponse = 0;
@@ -3632,12 +3653,12 @@
     unittest.expect(o.cacheHit, unittest.isTrue);
     checkUnnamed1285(o.errors);
     unittest.expect(o.jobComplete, unittest.isTrue);
-    checkJobReference(o.jobReference);
+    checkJobReference(o.jobReference as api.JobReference);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.numDmlAffectedRows, unittest.equals('foo'));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     checkUnnamed1286(o.rows);
-    checkTableSchema(o.schema);
+    checkTableSchema(o.schema as api.TableSchema);
     unittest.expect(o.totalBytesProcessed, unittest.equals('foo'));
     unittest.expect(o.totalRows, unittest.equals('foo'));
   }
@@ -3710,7 +3731,7 @@
   buildCounterRangePartitioning++;
   if (buildCounterRangePartitioning < 3) {
     unittest.expect(o.field, unittest.equals('foo'));
-    checkRangePartitioningRange(o.range);
+    checkRangePartitioningRange(o.range as api.RangePartitioningRange);
   }
   buildCounterRangePartitioning--;
 }
@@ -3777,8 +3798,8 @@
 
 void checkUnnamed1287(core.List<api.Argument> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkArgument(o[0]);
-  checkArgument(o[1]);
+  checkArgument(o[0] as api.Argument);
+  checkArgument(o[1] as api.Argument);
 }
 
 core.List<core.String> buildUnnamed1288() {
@@ -3828,8 +3849,8 @@
     checkUnnamed1288(o.importedLibraries);
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals('foo'));
-    checkStandardSqlDataType(o.returnType);
-    checkRoutineReference(o.routineReference);
+    checkStandardSqlDataType(o.returnType as api.StandardSqlDataType);
+    checkRoutineReference(o.routineReference as api.RoutineReference);
     unittest.expect(o.routineType, unittest.equals('foo'));
   }
   buildCounterRoutine--;
@@ -3867,8 +3888,8 @@
 
 void checkUnnamed1289(core.List<api.Entry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntry(o[0]);
-  checkEntry(o[1]);
+  checkEntry(o[0] as api.Entry);
+  checkEntry(o[1] as api.Entry);
 }
 
 core.int buildCounterRow = 0;
@@ -3974,8 +3995,8 @@
 
 void checkUnnamed1290(core.List<api.ScriptStackFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkScriptStackFrame(o[0]);
-  checkScriptStackFrame(o[1]);
+  checkScriptStackFrame(o[0] as api.ScriptStackFrame);
+  checkScriptStackFrame(o[1] as api.ScriptStackFrame);
 }
 
 core.int buildCounterScriptStatistics = 0;
@@ -4014,7 +4035,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -4035,7 +4056,7 @@
 void checkSnapshotDefinition(api.SnapshotDefinition o) {
   buildCounterSnapshotDefinition++;
   if (buildCounterSnapshotDefinition < 3) {
-    checkTableReference(o.baseTableReference);
+    checkTableReference(o.baseTableReference as api.TableReference);
     unittest.expect(o.snapshotTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
   }
@@ -4058,8 +4079,8 @@
 void checkStandardSqlDataType(api.StandardSqlDataType o) {
   buildCounterStandardSqlDataType++;
   if (buildCounterStandardSqlDataType < 3) {
-    checkStandardSqlDataType(o.arrayElementType);
-    checkStandardSqlStructType(o.structType);
+    checkStandardSqlDataType(o.arrayElementType as api.StandardSqlDataType);
+    checkStandardSqlStructType(o.structType as api.StandardSqlStructType);
     unittest.expect(o.typeKind, unittest.equals('foo'));
   }
   buildCounterStandardSqlDataType--;
@@ -4081,7 +4102,7 @@
   buildCounterStandardSqlField++;
   if (buildCounterStandardSqlField < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkStandardSqlDataType(o.type);
+    checkStandardSqlDataType(o.type as api.StandardSqlDataType);
   }
   buildCounterStandardSqlField--;
 }
@@ -4095,8 +4116,8 @@
 
 void checkUnnamed1291(core.List<api.StandardSqlField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStandardSqlField(o[0]);
-  checkStandardSqlField(o[1]);
+  checkStandardSqlField(o[0] as api.StandardSqlField);
+  checkStandardSqlField(o[1] as api.StandardSqlField);
 }
 
 core.int buildCounterStandardSqlStructType = 0;
@@ -4196,35 +4217,38 @@
 void checkTable(api.Table o) {
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    checkClustering(o.clustering);
+    checkClustering(o.clustering as api.Clustering);
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkEncryptionConfiguration(o.encryptionConfiguration);
+    checkEncryptionConfiguration(
+        o.encryptionConfiguration as api.EncryptionConfiguration);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.expirationTime, unittest.equals('foo'));
-    checkExternalDataConfiguration(o.externalDataConfiguration);
+    checkExternalDataConfiguration(
+        o.externalDataConfiguration as api.ExternalDataConfiguration);
     unittest.expect(o.friendlyName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed1292(o.labels);
     unittest.expect(o.lastModifiedTime, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
-    checkMaterializedViewDefinition(o.materializedView);
-    checkModelDefinition(o.model);
+    checkMaterializedViewDefinition(
+        o.materializedView as api.MaterializedViewDefinition);
+    checkModelDefinition(o.model as api.ModelDefinition);
     unittest.expect(o.numBytes, unittest.equals('foo'));
     unittest.expect(o.numLongTermBytes, unittest.equals('foo'));
     unittest.expect(o.numPhysicalBytes, unittest.equals('foo'));
     unittest.expect(o.numRows, unittest.equals('foo'));
-    checkRangePartitioning(o.rangePartitioning);
+    checkRangePartitioning(o.rangePartitioning as api.RangePartitioning);
     unittest.expect(o.requirePartitionFilter, unittest.isTrue);
-    checkTableSchema(o.schema);
+    checkTableSchema(o.schema as api.TableSchema);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkSnapshotDefinition(o.snapshotDefinition);
-    checkStreamingbuffer(o.streamingBuffer);
-    checkTableReference(o.tableReference);
-    checkTimePartitioning(o.timePartitioning);
+    checkSnapshotDefinition(o.snapshotDefinition as api.SnapshotDefinition);
+    checkStreamingbuffer(o.streamingBuffer as api.Streamingbuffer);
+    checkTableReference(o.tableReference as api.TableReference);
+    checkTimePartitioning(o.timePartitioning as api.TimePartitioning);
     unittest.expect(o.type, unittest.equals('foo'));
-    checkViewDefinition(o.view);
+    checkViewDefinition(o.view as api.ViewDefinition);
   }
   buildCounterTable--;
 }
@@ -4272,7 +4296,7 @@
   buildCounterTableDataInsertAllRequestRows++;
   if (buildCounterTableDataInsertAllRequestRows < 3) {
     unittest.expect(o.insertId, unittest.equals('foo'));
-    checkJsonObject(o.json);
+    checkJsonObject(o.json as api.JsonObject);
   }
   buildCounterTableDataInsertAllRequestRows--;
 }
@@ -4286,8 +4310,8 @@
 
 void checkUnnamed1293(core.List<api.TableDataInsertAllRequestRows> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableDataInsertAllRequestRows(o[0]);
-  checkTableDataInsertAllRequestRows(o[1]);
+  checkTableDataInsertAllRequestRows(o[0] as api.TableDataInsertAllRequestRows);
+  checkTableDataInsertAllRequestRows(o[1] as api.TableDataInsertAllRequestRows);
 }
 
 core.int buildCounterTableDataInsertAllRequest = 0;
@@ -4326,8 +4350,8 @@
 
 void checkUnnamed1294(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorProto(o[0]);
-  checkErrorProto(o[1]);
+  checkErrorProto(o[0] as api.ErrorProto);
+  checkErrorProto(o[1] as api.ErrorProto);
 }
 
 core.int buildCounterTableDataInsertAllResponseInsertErrors = 0;
@@ -4362,8 +4386,10 @@
 
 void checkUnnamed1295(core.List<api.TableDataInsertAllResponseInsertErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableDataInsertAllResponseInsertErrors(o[0]);
-  checkTableDataInsertAllResponseInsertErrors(o[1]);
+  checkTableDataInsertAllResponseInsertErrors(
+      o[0] as api.TableDataInsertAllResponseInsertErrors);
+  checkTableDataInsertAllResponseInsertErrors(
+      o[1] as api.TableDataInsertAllResponseInsertErrors);
 }
 
 core.int buildCounterTableDataInsertAllResponse = 0;
@@ -4396,8 +4422,8 @@
 
 void checkUnnamed1296(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableRow(o[0]);
-  checkTableRow(o[1]);
+  checkTableRow(o[0] as api.TableRow);
+  checkTableRow(o[1] as api.TableRow);
 }
 
 core.int buildCounterTableDataList = 0;
@@ -4468,8 +4494,8 @@
 
 void checkUnnamed1298(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableFieldSchema(o[0]);
-  checkTableFieldSchema(o[1]);
+  checkTableFieldSchema(o[0] as api.TableFieldSchema);
+  checkTableFieldSchema(o[1] as api.TableFieldSchema);
 }
 
 core.List<core.String> buildUnnamed1299() {
@@ -4524,12 +4550,14 @@
 void checkTableFieldSchema(api.TableFieldSchema o) {
   buildCounterTableFieldSchema++;
   if (buildCounterTableFieldSchema < 3) {
-    checkTableFieldSchemaCategories(o.categories);
+    checkTableFieldSchemaCategories(
+        o.categories as api.TableFieldSchemaCategories);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed1298(o.fields);
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkTableFieldSchemaPolicyTags(o.policyTags);
+    checkTableFieldSchemaPolicyTags(
+        o.policyTags as api.TableFieldSchemaPolicyTags);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterTableFieldSchema--;
@@ -4592,18 +4620,18 @@
 void checkTableListTables(api.TableListTables o) {
   buildCounterTableListTables++;
   if (buildCounterTableListTables < 3) {
-    checkClustering(o.clustering);
+    checkClustering(o.clustering as api.Clustering);
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.expirationTime, unittest.equals('foo'));
     unittest.expect(o.friendlyName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed1300(o.labels);
-    checkRangePartitioning(o.rangePartitioning);
-    checkTableReference(o.tableReference);
-    checkTimePartitioning(o.timePartitioning);
+    checkRangePartitioning(o.rangePartitioning as api.RangePartitioning);
+    checkTableReference(o.tableReference as api.TableReference);
+    checkTimePartitioning(o.timePartitioning as api.TimePartitioning);
     unittest.expect(o.type, unittest.equals('foo'));
-    checkTableListTablesView(o.view);
+    checkTableListTablesView(o.view as api.TableListTablesView);
   }
   buildCounterTableListTables--;
 }
@@ -4617,8 +4645,8 @@
 
 void checkUnnamed1301(core.List<api.TableListTables> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableListTables(o[0]);
-  checkTableListTables(o[1]);
+  checkTableListTables(o[0] as api.TableListTables);
+  checkTableListTables(o[1] as api.TableListTables);
 }
 
 core.int buildCounterTableList = 0;
@@ -4680,8 +4708,8 @@
 
 void checkUnnamed1302(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableCell(o[0]);
-  checkTableCell(o[1]);
+  checkTableCell(o[0] as api.TableCell);
+  checkTableCell(o[1] as api.TableCell);
 }
 
 core.int buildCounterTableRow = 0;
@@ -4712,8 +4740,8 @@
 
 void checkUnnamed1303(core.List<api.TableFieldSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableFieldSchema(o[0]);
-  checkTableFieldSchema(o[1]);
+  checkTableFieldSchema(o[0] as api.TableFieldSchema);
+  checkTableFieldSchema(o[1] as api.TableFieldSchema);
 }
 
 core.int buildCounterTableSchema = 0;
@@ -4950,7 +4978,7 @@
     unittest.expect(o.minRelativeProgress, unittest.equals(42.0));
     unittest.expect(o.minSplitLoss, unittest.equals(42.0));
     unittest.expect(o.modelUri, unittest.equals('foo'));
-    checkArimaOrder(o.nonSeasonalOrder);
+    checkArimaOrder(o.nonSeasonalOrder as api.ArimaOrder);
     unittest.expect(o.numClusters, unittest.equals('foo'));
     unittest.expect(o.numFactors, unittest.equals('foo'));
     unittest.expect(o.optimizationStrategy, unittest.equals('foo'));
@@ -4975,8 +5003,8 @@
 
 void checkUnnamed1309(core.List<api.IterationResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIterationResult(o[0]);
-  checkIterationResult(o[1]);
+  checkIterationResult(o[0] as api.IterationResult);
+  checkIterationResult(o[1] as api.IterationResult);
 }
 
 core.int buildCounterTrainingRun = 0;
@@ -4997,11 +5025,11 @@
 void checkTrainingRun(api.TrainingRun o) {
   buildCounterTrainingRun++;
   if (buildCounterTrainingRun < 3) {
-    checkDataSplitResult(o.dataSplitResult);
-    checkEvaluationMetrics(o.evaluationMetrics);
+    checkDataSplitResult(o.dataSplitResult as api.DataSplitResult);
+    checkEvaluationMetrics(o.evaluationMetrics as api.EvaluationMetrics);
     checkUnnamed1309(o.results);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkTrainingOptions(o.trainingOptions);
+    checkTrainingOptions(o.trainingOptions as api.TrainingOptions);
   }
   buildCounterTrainingRun--;
 }
@@ -5055,8 +5083,8 @@
 
 void checkUnnamed1310(core.List<api.UserDefinedFunctionResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserDefinedFunctionResource(o[0]);
-  checkUserDefinedFunctionResource(o[1]);
+  checkUserDefinedFunctionResource(o[0] as api.UserDefinedFunctionResource);
+  checkUserDefinedFunctionResource(o[1] as api.UserDefinedFunctionResource);
 }
 
 core.int buildCounterViewDefinition = 0;
@@ -5100,7 +5128,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAggregateClassificationMetrics();
       var od = api.AggregateClassificationMetrics.fromJson(o.toJson());
-      checkAggregateClassificationMetrics(od);
+      checkAggregateClassificationMetrics(
+          od as api.AggregateClassificationMetrics);
     });
   });
 
@@ -5108,7 +5137,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArgument();
       var od = api.Argument.fromJson(o.toJson());
-      checkArgument(od);
+      checkArgument(od as api.Argument);
     });
   });
 
@@ -5116,7 +5145,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArimaCoefficients();
       var od = api.ArimaCoefficients.fromJson(o.toJson());
-      checkArimaCoefficients(od);
+      checkArimaCoefficients(od as api.ArimaCoefficients);
     });
   });
 
@@ -5124,7 +5153,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArimaFittingMetrics();
       var od = api.ArimaFittingMetrics.fromJson(o.toJson());
-      checkArimaFittingMetrics(od);
+      checkArimaFittingMetrics(od as api.ArimaFittingMetrics);
     });
   });
 
@@ -5132,7 +5161,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArimaForecastingMetrics();
       var od = api.ArimaForecastingMetrics.fromJson(o.toJson());
-      checkArimaForecastingMetrics(od);
+      checkArimaForecastingMetrics(od as api.ArimaForecastingMetrics);
     });
   });
 
@@ -5140,7 +5169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArimaModelInfo();
       var od = api.ArimaModelInfo.fromJson(o.toJson());
-      checkArimaModelInfo(od);
+      checkArimaModelInfo(od as api.ArimaModelInfo);
     });
   });
 
@@ -5148,7 +5177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArimaOrder();
       var od = api.ArimaOrder.fromJson(o.toJson());
-      checkArimaOrder(od);
+      checkArimaOrder(od as api.ArimaOrder);
     });
   });
 
@@ -5156,7 +5185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArimaResult();
       var od = api.ArimaResult.fromJson(o.toJson());
-      checkArimaResult(od);
+      checkArimaResult(od as api.ArimaResult);
     });
   });
 
@@ -5164,7 +5193,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildArimaSingleModelForecastingMetrics();
       var od = api.ArimaSingleModelForecastingMetrics.fromJson(o.toJson());
-      checkArimaSingleModelForecastingMetrics(od);
+      checkArimaSingleModelForecastingMetrics(
+          od as api.ArimaSingleModelForecastingMetrics);
     });
   });
 
@@ -5172,7 +5202,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -5180,7 +5210,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -5188,7 +5218,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigQueryModelTraining();
       var od = api.BigQueryModelTraining.fromJson(o.toJson());
-      checkBigQueryModelTraining(od);
+      checkBigQueryModelTraining(od as api.BigQueryModelTraining);
     });
   });
 
@@ -5196,7 +5226,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigtableColumn();
       var od = api.BigtableColumn.fromJson(o.toJson());
-      checkBigtableColumn(od);
+      checkBigtableColumn(od as api.BigtableColumn);
     });
   });
 
@@ -5204,7 +5234,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigtableColumnFamily();
       var od = api.BigtableColumnFamily.fromJson(o.toJson());
-      checkBigtableColumnFamily(od);
+      checkBigtableColumnFamily(od as api.BigtableColumnFamily);
     });
   });
 
@@ -5212,7 +5242,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigtableOptions();
       var od = api.BigtableOptions.fromJson(o.toJson());
-      checkBigtableOptions(od);
+      checkBigtableOptions(od as api.BigtableOptions);
     });
   });
 
@@ -5220,7 +5250,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinaryClassificationMetrics();
       var od = api.BinaryClassificationMetrics.fromJson(o.toJson());
-      checkBinaryClassificationMetrics(od);
+      checkBinaryClassificationMetrics(od as api.BinaryClassificationMetrics);
     });
   });
 
@@ -5228,7 +5258,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinaryConfusionMatrix();
       var od = api.BinaryConfusionMatrix.fromJson(o.toJson());
-      checkBinaryConfusionMatrix(od);
+      checkBinaryConfusionMatrix(od as api.BinaryConfusionMatrix);
     });
   });
 
@@ -5236,7 +5266,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -5244,7 +5274,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBqmlIterationResult();
       var od = api.BqmlIterationResult.fromJson(o.toJson());
-      checkBqmlIterationResult(od);
+      checkBqmlIterationResult(od as api.BqmlIterationResult);
     });
   });
 
@@ -5252,7 +5282,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBqmlTrainingRunTrainingOptions();
       var od = api.BqmlTrainingRunTrainingOptions.fromJson(o.toJson());
-      checkBqmlTrainingRunTrainingOptions(od);
+      checkBqmlTrainingRunTrainingOptions(
+          od as api.BqmlTrainingRunTrainingOptions);
     });
   });
 
@@ -5260,7 +5291,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBqmlTrainingRun();
       var od = api.BqmlTrainingRun.fromJson(o.toJson());
-      checkBqmlTrainingRun(od);
+      checkBqmlTrainingRun(od as api.BqmlTrainingRun);
     });
   });
 
@@ -5268,7 +5299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategoricalValue();
       var od = api.CategoricalValue.fromJson(o.toJson());
-      checkCategoricalValue(od);
+      checkCategoricalValue(od as api.CategoricalValue);
     });
   });
 
@@ -5276,7 +5307,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategoryCount();
       var od = api.CategoryCount.fromJson(o.toJson());
-      checkCategoryCount(od);
+      checkCategoryCount(od as api.CategoryCount);
     });
   });
 
@@ -5284,7 +5315,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCluster();
       var od = api.Cluster.fromJson(o.toJson());
-      checkCluster(od);
+      checkCluster(od as api.Cluster);
     });
   });
 
@@ -5292,7 +5323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterInfo();
       var od = api.ClusterInfo.fromJson(o.toJson());
-      checkClusterInfo(od);
+      checkClusterInfo(od as api.ClusterInfo);
     });
   });
 
@@ -5300,7 +5331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClustering();
       var od = api.Clustering.fromJson(o.toJson());
-      checkClustering(od);
+      checkClustering(od as api.Clustering);
     });
   });
 
@@ -5308,7 +5339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusteringMetrics();
       var od = api.ClusteringMetrics.fromJson(o.toJson());
-      checkClusteringMetrics(od);
+      checkClusteringMetrics(od as api.ClusteringMetrics);
     });
   });
 
@@ -5316,7 +5347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfusionMatrix();
       var od = api.ConfusionMatrix.fromJson(o.toJson());
-      checkConfusionMatrix(od);
+      checkConfusionMatrix(od as api.ConfusionMatrix);
     });
   });
 
@@ -5324,7 +5355,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConnectionProperty();
       var od = api.ConnectionProperty.fromJson(o.toJson());
-      checkConnectionProperty(od);
+      checkConnectionProperty(od as api.ConnectionProperty);
     });
   });
 
@@ -5332,7 +5363,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCsvOptions();
       var od = api.CsvOptions.fromJson(o.toJson());
-      checkCsvOptions(od);
+      checkCsvOptions(od as api.CsvOptions);
     });
   });
 
@@ -5340,7 +5371,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSplitResult();
       var od = api.DataSplitResult.fromJson(o.toJson());
-      checkDataSplitResult(od);
+      checkDataSplitResult(od as api.DataSplitResult);
     });
   });
 
@@ -5348,7 +5379,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatasetAccess();
       var od = api.DatasetAccess.fromJson(o.toJson());
-      checkDatasetAccess(od);
+      checkDatasetAccess(od as api.DatasetAccess);
     });
   });
 
@@ -5356,7 +5387,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataset();
       var od = api.Dataset.fromJson(o.toJson());
-      checkDataset(od);
+      checkDataset(od as api.Dataset);
     });
   });
 
@@ -5364,7 +5395,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatasetListDatasets();
       var od = api.DatasetListDatasets.fromJson(o.toJson());
-      checkDatasetListDatasets(od);
+      checkDatasetListDatasets(od as api.DatasetListDatasets);
     });
   });
 
@@ -5372,7 +5403,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatasetList();
       var od = api.DatasetList.fromJson(o.toJson());
-      checkDatasetList(od);
+      checkDatasetList(od as api.DatasetList);
     });
   });
 
@@ -5380,7 +5411,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatasetReference();
       var od = api.DatasetReference.fromJson(o.toJson());
-      checkDatasetReference(od);
+      checkDatasetReference(od as api.DatasetReference);
     });
   });
 
@@ -5388,7 +5419,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDestinationTableProperties();
       var od = api.DestinationTableProperties.fromJson(o.toJson());
-      checkDestinationTableProperties(od);
+      checkDestinationTableProperties(od as api.DestinationTableProperties);
     });
   });
 
@@ -5396,7 +5427,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEncryptionConfiguration();
       var od = api.EncryptionConfiguration.fromJson(o.toJson());
-      checkEncryptionConfiguration(od);
+      checkEncryptionConfiguration(od as api.EncryptionConfiguration);
     });
   });
 
@@ -5404,7 +5435,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntry();
       var od = api.Entry.fromJson(o.toJson());
-      checkEntry(od);
+      checkEntry(od as api.Entry);
     });
   });
 
@@ -5412,7 +5443,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorProto();
       var od = api.ErrorProto.fromJson(o.toJson());
-      checkErrorProto(od);
+      checkErrorProto(od as api.ErrorProto);
     });
   });
 
@@ -5420,7 +5451,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEvaluationMetrics();
       var od = api.EvaluationMetrics.fromJson(o.toJson());
-      checkEvaluationMetrics(od);
+      checkEvaluationMetrics(od as api.EvaluationMetrics);
     });
   });
 
@@ -5428,7 +5459,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExplainQueryStage();
       var od = api.ExplainQueryStage.fromJson(o.toJson());
-      checkExplainQueryStage(od);
+      checkExplainQueryStage(od as api.ExplainQueryStage);
     });
   });
 
@@ -5436,7 +5467,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExplainQueryStep();
       var od = api.ExplainQueryStep.fromJson(o.toJson());
-      checkExplainQueryStep(od);
+      checkExplainQueryStep(od as api.ExplainQueryStep);
     });
   });
 
@@ -5444,7 +5475,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -5452,7 +5483,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalDataConfiguration();
       var od = api.ExternalDataConfiguration.fromJson(o.toJson());
-      checkExternalDataConfiguration(od);
+      checkExternalDataConfiguration(od as api.ExternalDataConfiguration);
     });
   });
 
@@ -5460,7 +5491,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeatureValue();
       var od = api.FeatureValue.fromJson(o.toJson());
-      checkFeatureValue(od);
+      checkFeatureValue(od as api.FeatureValue);
     });
   });
 
@@ -5468,7 +5499,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -5476,7 +5507,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -5484,7 +5515,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetQueryResultsResponse();
       var od = api.GetQueryResultsResponse.fromJson(o.toJson());
-      checkGetQueryResultsResponse(od);
+      checkGetQueryResultsResponse(od as api.GetQueryResultsResponse);
     });
   });
 
@@ -5492,7 +5523,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetServiceAccountResponse();
       var od = api.GetServiceAccountResponse.fromJson(o.toJson());
-      checkGetServiceAccountResponse(od);
+      checkGetServiceAccountResponse(od as api.GetServiceAccountResponse);
     });
   });
 
@@ -5500,7 +5531,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleSheetsOptions();
       var od = api.GoogleSheetsOptions.fromJson(o.toJson());
-      checkGoogleSheetsOptions(od);
+      checkGoogleSheetsOptions(od as api.GoogleSheetsOptions);
     });
   });
 
@@ -5508,7 +5539,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHivePartitioningOptions();
       var od = api.HivePartitioningOptions.fromJson(o.toJson());
-      checkHivePartitioningOptions(od);
+      checkHivePartitioningOptions(od as api.HivePartitioningOptions);
     });
   });
 
@@ -5516,7 +5547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIterationResult();
       var od = api.IterationResult.fromJson(o.toJson());
-      checkIterationResult(od);
+      checkIterationResult(od as api.IterationResult);
     });
   });
 
@@ -5524,7 +5555,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJob();
       var od = api.Job.fromJson(o.toJson());
-      checkJob(od);
+      checkJob(od as api.Job);
     });
   });
 
@@ -5532,7 +5563,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobCancelResponse();
       var od = api.JobCancelResponse.fromJson(o.toJson());
-      checkJobCancelResponse(od);
+      checkJobCancelResponse(od as api.JobCancelResponse);
     });
   });
 
@@ -5540,7 +5571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobConfiguration();
       var od = api.JobConfiguration.fromJson(o.toJson());
-      checkJobConfiguration(od);
+      checkJobConfiguration(od as api.JobConfiguration);
     });
   });
 
@@ -5548,7 +5579,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobConfigurationExtract();
       var od = api.JobConfigurationExtract.fromJson(o.toJson());
-      checkJobConfigurationExtract(od);
+      checkJobConfigurationExtract(od as api.JobConfigurationExtract);
     });
   });
 
@@ -5556,7 +5587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobConfigurationLoad();
       var od = api.JobConfigurationLoad.fromJson(o.toJson());
-      checkJobConfigurationLoad(od);
+      checkJobConfigurationLoad(od as api.JobConfigurationLoad);
     });
   });
 
@@ -5564,7 +5595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobConfigurationQuery();
       var od = api.JobConfigurationQuery.fromJson(o.toJson());
-      checkJobConfigurationQuery(od);
+      checkJobConfigurationQuery(od as api.JobConfigurationQuery);
     });
   });
 
@@ -5572,7 +5603,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobConfigurationTableCopy();
       var od = api.JobConfigurationTableCopy.fromJson(o.toJson());
-      checkJobConfigurationTableCopy(od);
+      checkJobConfigurationTableCopy(od as api.JobConfigurationTableCopy);
     });
   });
 
@@ -5580,7 +5611,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobListJobs();
       var od = api.JobListJobs.fromJson(o.toJson());
-      checkJobListJobs(od);
+      checkJobListJobs(od as api.JobListJobs);
     });
   });
 
@@ -5588,7 +5619,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobList();
       var od = api.JobList.fromJson(o.toJson());
-      checkJobList(od);
+      checkJobList(od as api.JobList);
     });
   });
 
@@ -5596,7 +5627,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobReference();
       var od = api.JobReference.fromJson(o.toJson());
-      checkJobReference(od);
+      checkJobReference(od as api.JobReference);
     });
   });
 
@@ -5604,7 +5635,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatisticsReservationUsage();
       var od = api.JobStatisticsReservationUsage.fromJson(o.toJson());
-      checkJobStatisticsReservationUsage(od);
+      checkJobStatisticsReservationUsage(
+          od as api.JobStatisticsReservationUsage);
     });
   });
 
@@ -5612,7 +5644,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatistics();
       var od = api.JobStatistics.fromJson(o.toJson());
-      checkJobStatistics(od);
+      checkJobStatistics(od as api.JobStatistics);
     });
   });
 
@@ -5620,7 +5652,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatistics2ReservationUsage();
       var od = api.JobStatistics2ReservationUsage.fromJson(o.toJson());
-      checkJobStatistics2ReservationUsage(od);
+      checkJobStatistics2ReservationUsage(
+          od as api.JobStatistics2ReservationUsage);
     });
   });
 
@@ -5628,7 +5661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatistics2();
       var od = api.JobStatistics2.fromJson(o.toJson());
-      checkJobStatistics2(od);
+      checkJobStatistics2(od as api.JobStatistics2);
     });
   });
 
@@ -5636,7 +5669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatistics3();
       var od = api.JobStatistics3.fromJson(o.toJson());
-      checkJobStatistics3(od);
+      checkJobStatistics3(od as api.JobStatistics3);
     });
   });
 
@@ -5644,7 +5677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatistics4();
       var od = api.JobStatistics4.fromJson(o.toJson());
-      checkJobStatistics4(od);
+      checkJobStatistics4(od as api.JobStatistics4);
     });
   });
 
@@ -5652,7 +5685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatus();
       var od = api.JobStatus.fromJson(o.toJson());
-      checkJobStatus(od);
+      checkJobStatus(od as api.JobStatus);
     });
   });
 
@@ -5660,7 +5693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJsonObject();
       var od = api.JsonObject.fromJson(o.toJson());
-      checkJsonObject(od);
+      checkJsonObject(od as api.JsonObject);
     });
   });
 
@@ -5668,7 +5701,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListModelsResponse();
       var od = api.ListModelsResponse.fromJson(o.toJson());
-      checkListModelsResponse(od);
+      checkListModelsResponse(od as api.ListModelsResponse);
     });
   });
 
@@ -5676,7 +5709,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListRoutinesResponse();
       var od = api.ListRoutinesResponse.fromJson(o.toJson());
-      checkListRoutinesResponse(od);
+      checkListRoutinesResponse(od as api.ListRoutinesResponse);
     });
   });
 
@@ -5684,7 +5717,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationMetadata();
       var od = api.LocationMetadata.fromJson(o.toJson());
-      checkLocationMetadata(od);
+      checkLocationMetadata(od as api.LocationMetadata);
     });
   });
 
@@ -5692,7 +5725,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMaterializedViewDefinition();
       var od = api.MaterializedViewDefinition.fromJson(o.toJson());
-      checkMaterializedViewDefinition(od);
+      checkMaterializedViewDefinition(od as api.MaterializedViewDefinition);
     });
   });
 
@@ -5700,7 +5733,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModel();
       var od = api.Model.fromJson(o.toJson());
-      checkModel(od);
+      checkModel(od as api.Model);
     });
   });
 
@@ -5708,7 +5741,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModelDefinitionModelOptions();
       var od = api.ModelDefinitionModelOptions.fromJson(o.toJson());
-      checkModelDefinitionModelOptions(od);
+      checkModelDefinitionModelOptions(od as api.ModelDefinitionModelOptions);
     });
   });
 
@@ -5716,7 +5749,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModelDefinition();
       var od = api.ModelDefinition.fromJson(o.toJson());
-      checkModelDefinition(od);
+      checkModelDefinition(od as api.ModelDefinition);
     });
   });
 
@@ -5724,7 +5757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModelReference();
       var od = api.ModelReference.fromJson(o.toJson());
-      checkModelReference(od);
+      checkModelReference(od as api.ModelReference);
     });
   });
 
@@ -5732,7 +5765,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMultiClassClassificationMetrics();
       var od = api.MultiClassClassificationMetrics.fromJson(o.toJson());
-      checkMultiClassClassificationMetrics(od);
+      checkMultiClassClassificationMetrics(
+          od as api.MultiClassClassificationMetrics);
     });
   });
 
@@ -5740,7 +5774,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -5748,7 +5782,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectListProjects();
       var od = api.ProjectListProjects.fromJson(o.toJson());
-      checkProjectListProjects(od);
+      checkProjectListProjects(od as api.ProjectListProjects);
     });
   });
 
@@ -5756,7 +5790,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectList();
       var od = api.ProjectList.fromJson(o.toJson());
-      checkProjectList(od);
+      checkProjectList(od as api.ProjectList);
     });
   });
 
@@ -5764,7 +5798,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectReference();
       var od = api.ProjectReference.fromJson(o.toJson());
-      checkProjectReference(od);
+      checkProjectReference(od as api.ProjectReference);
     });
   });
 
@@ -5772,7 +5806,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryParameter();
       var od = api.QueryParameter.fromJson(o.toJson());
-      checkQueryParameter(od);
+      checkQueryParameter(od as api.QueryParameter);
     });
   });
 
@@ -5780,7 +5814,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryParameterTypeStructTypes();
       var od = api.QueryParameterTypeStructTypes.fromJson(o.toJson());
-      checkQueryParameterTypeStructTypes(od);
+      checkQueryParameterTypeStructTypes(
+          od as api.QueryParameterTypeStructTypes);
     });
   });
 
@@ -5788,7 +5823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryParameterType();
       var od = api.QueryParameterType.fromJson(o.toJson());
-      checkQueryParameterType(od);
+      checkQueryParameterType(od as api.QueryParameterType);
     });
   });
 
@@ -5796,7 +5831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryParameterValue();
       var od = api.QueryParameterValue.fromJson(o.toJson());
-      checkQueryParameterValue(od);
+      checkQueryParameterValue(od as api.QueryParameterValue);
     });
   });
 
@@ -5804,7 +5839,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryRequest();
       var od = api.QueryRequest.fromJson(o.toJson());
-      checkQueryRequest(od);
+      checkQueryRequest(od as api.QueryRequest);
     });
   });
 
@@ -5812,7 +5847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryResponse();
       var od = api.QueryResponse.fromJson(o.toJson());
-      checkQueryResponse(od);
+      checkQueryResponse(od as api.QueryResponse);
     });
   });
 
@@ -5820,7 +5855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryTimelineSample();
       var od = api.QueryTimelineSample.fromJson(o.toJson());
-      checkQueryTimelineSample(od);
+      checkQueryTimelineSample(od as api.QueryTimelineSample);
     });
   });
 
@@ -5828,7 +5863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRangePartitioningRange();
       var od = api.RangePartitioningRange.fromJson(o.toJson());
-      checkRangePartitioningRange(od);
+      checkRangePartitioningRange(od as api.RangePartitioningRange);
     });
   });
 
@@ -5836,7 +5871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRangePartitioning();
       var od = api.RangePartitioning.fromJson(o.toJson());
-      checkRangePartitioning(od);
+      checkRangePartitioning(od as api.RangePartitioning);
     });
   });
 
@@ -5844,7 +5879,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRankingMetrics();
       var od = api.RankingMetrics.fromJson(o.toJson());
-      checkRankingMetrics(od);
+      checkRankingMetrics(od as api.RankingMetrics);
     });
   });
 
@@ -5852,7 +5887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegressionMetrics();
       var od = api.RegressionMetrics.fromJson(o.toJson());
-      checkRegressionMetrics(od);
+      checkRegressionMetrics(od as api.RegressionMetrics);
     });
   });
 
@@ -5860,7 +5895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoutine();
       var od = api.Routine.fromJson(o.toJson());
-      checkRoutine(od);
+      checkRoutine(od as api.Routine);
     });
   });
 
@@ -5868,7 +5903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoutineReference();
       var od = api.RoutineReference.fromJson(o.toJson());
-      checkRoutineReference(od);
+      checkRoutineReference(od as api.RoutineReference);
     });
   });
 
@@ -5876,7 +5911,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRow();
       var od = api.Row.fromJson(o.toJson());
-      checkRow(od);
+      checkRow(od as api.Row);
     });
   });
 
@@ -5884,7 +5919,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRowAccessPolicyReference();
       var od = api.RowAccessPolicyReference.fromJson(o.toJson());
-      checkRowAccessPolicyReference(od);
+      checkRowAccessPolicyReference(od as api.RowAccessPolicyReference);
     });
   });
 
@@ -5892,7 +5927,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRowLevelSecurityStatistics();
       var od = api.RowLevelSecurityStatistics.fromJson(o.toJson());
-      checkRowLevelSecurityStatistics(od);
+      checkRowLevelSecurityStatistics(od as api.RowLevelSecurityStatistics);
     });
   });
 
@@ -5900,7 +5935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScriptStackFrame();
       var od = api.ScriptStackFrame.fromJson(o.toJson());
-      checkScriptStackFrame(od);
+      checkScriptStackFrame(od as api.ScriptStackFrame);
     });
   });
 
@@ -5908,7 +5943,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScriptStatistics();
       var od = api.ScriptStatistics.fromJson(o.toJson());
-      checkScriptStatistics(od);
+      checkScriptStatistics(od as api.ScriptStatistics);
     });
   });
 
@@ -5916,7 +5951,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -5924,7 +5959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshotDefinition();
       var od = api.SnapshotDefinition.fromJson(o.toJson());
-      checkSnapshotDefinition(od);
+      checkSnapshotDefinition(od as api.SnapshotDefinition);
     });
   });
 
@@ -5932,7 +5967,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStandardSqlDataType();
       var od = api.StandardSqlDataType.fromJson(o.toJson());
-      checkStandardSqlDataType(od);
+      checkStandardSqlDataType(od as api.StandardSqlDataType);
     });
   });
 
@@ -5940,7 +5975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStandardSqlField();
       var od = api.StandardSqlField.fromJson(o.toJson());
-      checkStandardSqlField(od);
+      checkStandardSqlField(od as api.StandardSqlField);
     });
   });
 
@@ -5948,7 +5983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStandardSqlStructType();
       var od = api.StandardSqlStructType.fromJson(o.toJson());
-      checkStandardSqlStructType(od);
+      checkStandardSqlStructType(od as api.StandardSqlStructType);
     });
   });
 
@@ -5956,7 +5991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStreamingbuffer();
       var od = api.Streamingbuffer.fromJson(o.toJson());
-      checkStreamingbuffer(od);
+      checkStreamingbuffer(od as api.Streamingbuffer);
     });
   });
 
@@ -5964,7 +5999,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTable();
       var od = api.Table.fromJson(o.toJson());
-      checkTable(od);
+      checkTable(od as api.Table);
     });
   });
 
@@ -5972,7 +6007,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCell();
       var od = api.TableCell.fromJson(o.toJson());
-      checkTableCell(od);
+      checkTableCell(od as api.TableCell);
     });
   });
 
@@ -5980,7 +6015,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableDataInsertAllRequestRows();
       var od = api.TableDataInsertAllRequestRows.fromJson(o.toJson());
-      checkTableDataInsertAllRequestRows(od);
+      checkTableDataInsertAllRequestRows(
+          od as api.TableDataInsertAllRequestRows);
     });
   });
 
@@ -5988,7 +6024,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableDataInsertAllRequest();
       var od = api.TableDataInsertAllRequest.fromJson(o.toJson());
-      checkTableDataInsertAllRequest(od);
+      checkTableDataInsertAllRequest(od as api.TableDataInsertAllRequest);
     });
   });
 
@@ -5996,7 +6032,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableDataInsertAllResponseInsertErrors();
       var od = api.TableDataInsertAllResponseInsertErrors.fromJson(o.toJson());
-      checkTableDataInsertAllResponseInsertErrors(od);
+      checkTableDataInsertAllResponseInsertErrors(
+          od as api.TableDataInsertAllResponseInsertErrors);
     });
   });
 
@@ -6004,7 +6041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableDataInsertAllResponse();
       var od = api.TableDataInsertAllResponse.fromJson(o.toJson());
-      checkTableDataInsertAllResponse(od);
+      checkTableDataInsertAllResponse(od as api.TableDataInsertAllResponse);
     });
   });
 
@@ -6012,7 +6049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableDataList();
       var od = api.TableDataList.fromJson(o.toJson());
-      checkTableDataList(od);
+      checkTableDataList(od as api.TableDataList);
     });
   });
 
@@ -6020,7 +6057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableFieldSchemaCategories();
       var od = api.TableFieldSchemaCategories.fromJson(o.toJson());
-      checkTableFieldSchemaCategories(od);
+      checkTableFieldSchemaCategories(od as api.TableFieldSchemaCategories);
     });
   });
 
@@ -6028,7 +6065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableFieldSchemaPolicyTags();
       var od = api.TableFieldSchemaPolicyTags.fromJson(o.toJson());
-      checkTableFieldSchemaPolicyTags(od);
+      checkTableFieldSchemaPolicyTags(od as api.TableFieldSchemaPolicyTags);
     });
   });
 
@@ -6036,7 +6073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableFieldSchema();
       var od = api.TableFieldSchema.fromJson(o.toJson());
-      checkTableFieldSchema(od);
+      checkTableFieldSchema(od as api.TableFieldSchema);
     });
   });
 
@@ -6044,7 +6081,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableListTablesView();
       var od = api.TableListTablesView.fromJson(o.toJson());
-      checkTableListTablesView(od);
+      checkTableListTablesView(od as api.TableListTablesView);
     });
   });
 
@@ -6052,7 +6089,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableListTables();
       var od = api.TableListTables.fromJson(o.toJson());
-      checkTableListTables(od);
+      checkTableListTables(od as api.TableListTables);
     });
   });
 
@@ -6060,7 +6097,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableList();
       var od = api.TableList.fromJson(o.toJson());
-      checkTableList(od);
+      checkTableList(od as api.TableList);
     });
   });
 
@@ -6068,7 +6105,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableReference();
       var od = api.TableReference.fromJson(o.toJson());
-      checkTableReference(od);
+      checkTableReference(od as api.TableReference);
     });
   });
 
@@ -6076,7 +6113,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRow();
       var od = api.TableRow.fromJson(o.toJson());
-      checkTableRow(od);
+      checkTableRow(od as api.TableRow);
     });
   });
 
@@ -6084,7 +6121,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableSchema();
       var od = api.TableSchema.fromJson(o.toJson());
-      checkTableSchema(od);
+      checkTableSchema(od as api.TableSchema);
     });
   });
 
@@ -6092,7 +6129,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -6100,7 +6137,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -6108,7 +6145,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimePartitioning();
       var od = api.TimePartitioning.fromJson(o.toJson());
-      checkTimePartitioning(od);
+      checkTimePartitioning(od as api.TimePartitioning);
     });
   });
 
@@ -6116,7 +6153,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrainingOptions();
       var od = api.TrainingOptions.fromJson(o.toJson());
-      checkTrainingOptions(od);
+      checkTrainingOptions(od as api.TrainingOptions);
     });
   });
 
@@ -6124,7 +6161,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrainingRun();
       var od = api.TrainingRun.fromJson(o.toJson());
-      checkTrainingRun(od);
+      checkTrainingRun(od as api.TrainingRun);
     });
   });
 
@@ -6132,7 +6169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransactionInfo();
       var od = api.TransactionInfo.fromJson(o.toJson());
-      checkTransactionInfo(od);
+      checkTransactionInfo(od as api.TransactionInfo);
     });
   });
 
@@ -6140,7 +6177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserDefinedFunctionResource();
       var od = api.UserDefinedFunctionResource.fromJson(o.toJson());
-      checkUserDefinedFunctionResource(od);
+      checkUserDefinedFunctionResource(od as api.UserDefinedFunctionResource);
     });
   });
 
@@ -6148,7 +6185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildViewDefinition();
       var od = api.ViewDefinition.fromJson(o.toJson());
-      checkViewDefinition(od);
+      checkViewDefinition(od as api.ViewDefinition);
     });
   });
 
@@ -6277,7 +6314,7 @@
       res
           .get(arg_projectId, arg_datasetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
 
@@ -6288,8 +6325,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Dataset.fromJson(json);
-        checkDataset(obj);
+        var obj =
+            api.Dataset.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDataset(obj as api.Dataset);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6340,7 +6378,7 @@
       res
           .insert(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
 
@@ -6414,7 +6452,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatasetList(response);
+        checkDatasetList(response as api.DatasetList);
       })));
     });
 
@@ -6426,8 +6464,9 @@
       var arg_datasetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Dataset.fromJson(json);
-        checkDataset(obj);
+        var obj =
+            api.Dataset.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDataset(obj as api.Dataset);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6482,7 +6521,7 @@
           .patch(arg_request, arg_projectId, arg_datasetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
 
@@ -6494,8 +6533,9 @@
       var arg_datasetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Dataset.fromJson(json);
-        checkDataset(obj);
+        var obj =
+            api.Dataset.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDataset(obj as api.Dataset);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6550,7 +6590,7 @@
           .update(arg_request, arg_projectId, arg_datasetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
   });
@@ -6625,7 +6665,7 @@
           .cancel(arg_projectId, arg_jobId,
               location: arg_location, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJobCancelResponse(response);
+        checkJobCancelResponse(response as api.JobCancelResponse);
       })));
     });
 
@@ -6692,7 +6732,7 @@
           .get(arg_projectId, arg_jobId,
               location: arg_location, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -6776,7 +6816,7 @@
               timeoutMs: arg_timeoutMs,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetQueryResultsResponse(response);
+        checkGetQueryResultsResponse(response as api.GetQueryResultsResponse);
       })));
     });
 
@@ -6790,8 +6830,8 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Job.fromJson(json);
-        checkJob(obj);
+        var obj = api.Job.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkJob(obj as api.Job);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6842,7 +6882,7 @@
       res
           .insert(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -6934,7 +6974,7 @@
               stateFilter: arg_stateFilter,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJobList(response);
+        checkJobList(response as api.JobList);
       })));
     });
 
@@ -6945,8 +6985,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.QueryRequest.fromJson(json);
-        checkQueryRequest(obj);
+        var obj = api.QueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkQueryRequest(obj as api.QueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6997,7 +7038,7 @@
       res
           .query(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryResponse(response);
+        checkQueryResponse(response as api.QueryResponse);
       })));
     });
   });
@@ -7104,7 +7145,7 @@
       res
           .get(arg_projectId, arg_datasetId, arg_modelId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkModel(response);
+        checkModel(response as api.Model);
       })));
     });
 
@@ -7165,7 +7206,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListModelsResponse(response);
+        checkListModelsResponse(response as api.ListModelsResponse);
       })));
     });
 
@@ -7178,8 +7219,9 @@
       var arg_modelId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Model.fromJson(json);
-        checkModel(obj);
+        var obj =
+            api.Model.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkModel(obj as api.Model);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7223,7 +7265,7 @@
           .patch(arg_request, arg_projectId, arg_datasetId, arg_modelId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkModel(response);
+        checkModel(response as api.Model);
       })));
     });
   });
@@ -7284,7 +7326,8 @@
       res
           .getServiceAccount(arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetServiceAccountResponse(response);
+        checkGetServiceAccountResponse(
+            response as api.GetServiceAccountResponse);
       })));
     });
 
@@ -7342,7 +7385,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProjectList(response);
+        checkProjectList(response as api.ProjectList);
       })));
     });
   });
@@ -7453,7 +7496,7 @@
           .get(arg_projectId, arg_datasetId, arg_routineId,
               readMask: arg_readMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoutine(response);
+        checkRoutine(response as api.Routine);
       })));
     });
 
@@ -7465,8 +7508,9 @@
       var arg_datasetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Routine.fromJson(json);
-        checkRoutine(obj);
+        var obj =
+            api.Routine.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRoutine(obj as api.Routine);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7510,7 +7554,7 @@
           .insert(arg_request, arg_projectId, arg_datasetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoutine(response);
+        checkRoutine(response as api.Routine);
       })));
     });
 
@@ -7578,7 +7622,7 @@
               readMask: arg_readMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRoutinesResponse(response);
+        checkListRoutinesResponse(response as api.ListRoutinesResponse);
       })));
     });
 
@@ -7591,8 +7635,9 @@
       var arg_routineId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Routine.fromJson(json);
-        checkRoutine(obj);
+        var obj =
+            api.Routine.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRoutine(obj as api.Routine);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7636,7 +7681,7 @@
           .update(arg_request, arg_projectId, arg_datasetId, arg_routineId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoutine(response);
+        checkRoutine(response as api.Routine);
       })));
     });
   });
@@ -7651,8 +7696,9 @@
       var arg_tableId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TableDataInsertAllRequest.fromJson(json);
-        checkTableDataInsertAllRequest(obj);
+        var obj = api.TableDataInsertAllRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTableDataInsertAllRequest(obj as api.TableDataInsertAllRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7722,7 +7768,8 @@
           .insertAll(arg_request, arg_projectId, arg_datasetId, arg_tableId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTableDataInsertAllResponse(response);
+        checkTableDataInsertAllResponse(
+            response as api.TableDataInsertAllResponse);
       })));
     });
 
@@ -7818,7 +7865,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTableDataList(response);
+        checkTableDataList(response as api.TableDataList);
       })));
     });
   });
@@ -7969,7 +8016,7 @@
           .get(arg_projectId, arg_datasetId, arg_tableId,
               selectedFields: arg_selectedFields, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTable(response);
+        checkTable(response as api.Table);
       })));
     });
 
@@ -7980,8 +8027,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8017,7 +8065,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -8029,8 +8077,9 @@
       var arg_datasetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Table.fromJson(json);
-        checkTable(obj);
+        var obj =
+            api.Table.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTable(obj as api.Table);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8091,7 +8140,7 @@
           .insert(arg_request, arg_projectId, arg_datasetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTable(response);
+        checkTable(response as api.Table);
       })));
     });
 
@@ -8169,7 +8218,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTableList(response);
+        checkTableList(response as api.TableList);
       })));
     });
 
@@ -8182,8 +8231,9 @@
       var arg_tableId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Table.fromJson(json);
-        checkTable(obj);
+        var obj =
+            api.Table.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTable(obj as api.Table);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8247,7 +8297,7 @@
           .patch(arg_request, arg_projectId, arg_datasetId, arg_tableId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTable(response);
+        checkTable(response as api.Table);
       })));
     });
 
@@ -8258,8 +8308,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8295,7 +8346,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -8306,8 +8357,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8343,7 +8395,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -8356,8 +8409,9 @@
       var arg_tableId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Table.fromJson(json);
-        checkTable(obj);
+        var obj =
+            api.Table.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTable(obj as api.Table);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8421,7 +8475,7 @@
           .update(arg_request, arg_projectId, arg_datasetId, arg_tableId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTable(response);
+        checkTable(response as api.Table);
       })));
     });
   });
diff --git a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
index aecd8e8..befd56c 100644
--- a/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
+++ b/generated/googleapis/test/bigquerydatatransfer/v1_test.dart
@@ -117,8 +117,8 @@
 
 void checkUnnamed2265(core.List<api.DataSourceParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceParameter(o[0]);
-  checkDataSourceParameter(o[1]);
+  checkDataSourceParameter(o[0] as api.DataSourceParameter);
+  checkDataSourceParameter(o[1] as api.DataSourceParameter);
 }
 
 core.List<core.String> buildUnnamed2266() {
@@ -209,8 +209,8 @@
 
 void checkUnnamed2268(core.List<api.DataSourceParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceParameter(o[0]);
-  checkDataSourceParameter(o[1]);
+  checkDataSourceParameter(o[0] as api.DataSourceParameter);
+  checkDataSourceParameter(o[1] as api.DataSourceParameter);
 }
 
 core.int buildCounterDataSourceParameter = 0;
@@ -305,8 +305,8 @@
 
 void checkUnnamed2269(core.List<api.DataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSource(o[0]);
-  checkDataSource(o[1]);
+  checkDataSource(o[0] as api.DataSource);
+  checkDataSource(o[1] as api.DataSource);
 }
 
 core.int buildCounterListDataSourcesResponse = 0;
@@ -339,8 +339,8 @@
 
 void checkUnnamed2270(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -373,8 +373,8 @@
 
 void checkUnnamed2271(core.List<api.TransferConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransferConfig(o[0]);
-  checkTransferConfig(o[1]);
+  checkTransferConfig(o[0] as api.TransferConfig);
+  checkTransferConfig(o[1] as api.TransferConfig);
 }
 
 core.int buildCounterListTransferConfigsResponse = 0;
@@ -407,8 +407,8 @@
 
 void checkUnnamed2272(core.List<api.TransferMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransferMessage(o[0]);
-  checkTransferMessage(o[1]);
+  checkTransferMessage(o[0] as api.TransferMessage);
+  checkTransferMessage(o[1] as api.TransferMessage);
 }
 
 core.int buildCounterListTransferLogsResponse = 0;
@@ -441,8 +441,8 @@
 
 void checkUnnamed2273(core.List<api.TransferRun> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransferRun(o[0]);
-  checkTransferRun(o[1]);
+  checkTransferRun(o[0] as api.TransferRun);
+  checkTransferRun(o[1] as api.TransferRun);
 }
 
 core.int buildCounterListTransferRunsResponse = 0;
@@ -588,8 +588,8 @@
 
 void checkUnnamed2276(core.List<api.TransferRun> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransferRun(o[0]);
-  checkTransferRun(o[1]);
+  checkTransferRun(o[0] as api.TransferRun);
+  checkTransferRun(o[1] as api.TransferRun);
 }
 
 core.int buildCounterScheduleTransferRunsResponse = 0;
@@ -627,7 +627,7 @@
   buildCounterStartManualTransferRunsRequest++;
   if (buildCounterStartManualTransferRunsRequest < 3) {
     unittest.expect(o.requestedRunTime, unittest.equals('foo'));
-    checkTimeRange(o.requestedTimeRange);
+    checkTimeRange(o.requestedTimeRange as api.TimeRange);
   }
   buildCounterStartManualTransferRunsRequest--;
 }
@@ -641,8 +641,8 @@
 
 void checkUnnamed2277(core.List<api.TransferRun> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransferRun(o[0]);
-  checkTransferRun(o[1]);
+  checkTransferRun(o[0] as api.TransferRun);
+  checkTransferRun(o[1] as api.TransferRun);
 }
 
 core.int buildCounterStartManualTransferRunsResponse = 0;
@@ -815,13 +815,13 @@
     unittest.expect(o.destinationDatasetId, unittest.equals('foo'));
     unittest.expect(o.disabled, unittest.isTrue);
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkEmailPreferences(o.emailPreferences);
+    checkEmailPreferences(o.emailPreferences as api.EmailPreferences);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nextRunTime, unittest.equals('foo'));
     unittest.expect(o.notificationPubsubTopic, unittest.equals('foo'));
     checkUnnamed2280(o.params);
     unittest.expect(o.schedule, unittest.equals('foo'));
-    checkScheduleOptions(o.scheduleOptions);
+    checkScheduleOptions(o.scheduleOptions as api.ScheduleOptions);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.userId, unittest.equals('foo'));
@@ -911,9 +911,9 @@
   if (buildCounterTransferRun < 3) {
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
     unittest.expect(o.destinationDatasetId, unittest.equals('foo'));
-    checkEmailPreferences(o.emailPreferences);
+    checkEmailPreferences(o.emailPreferences as api.EmailPreferences);
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkStatus(o.errorStatus);
+    checkStatus(o.errorStatus as api.Status);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notificationPubsubTopic, unittest.equals('foo'));
     checkUnnamed2281(o.params);
@@ -1011,7 +1011,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckValidCredsRequest();
       var od = api.CheckValidCredsRequest.fromJson(o.toJson());
-      checkCheckValidCredsRequest(od);
+      checkCheckValidCredsRequest(od as api.CheckValidCredsRequest);
     });
   });
 
@@ -1019,7 +1019,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckValidCredsResponse();
       var od = api.CheckValidCredsResponse.fromJson(o.toJson());
-      checkCheckValidCredsResponse(od);
+      checkCheckValidCredsResponse(od as api.CheckValidCredsResponse);
     });
   });
 
@@ -1027,7 +1027,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSource();
       var od = api.DataSource.fromJson(o.toJson());
-      checkDataSource(od);
+      checkDataSource(od as api.DataSource);
     });
   });
 
@@ -1035,7 +1035,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceParameter();
       var od = api.DataSourceParameter.fromJson(o.toJson());
-      checkDataSourceParameter(od);
+      checkDataSourceParameter(od as api.DataSourceParameter);
     });
   });
 
@@ -1043,7 +1043,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmailPreferences();
       var od = api.EmailPreferences.fromJson(o.toJson());
-      checkEmailPreferences(od);
+      checkEmailPreferences(od as api.EmailPreferences);
     });
   });
 
@@ -1051,7 +1051,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1059,7 +1059,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDataSourcesResponse();
       var od = api.ListDataSourcesResponse.fromJson(o.toJson());
-      checkListDataSourcesResponse(od);
+      checkListDataSourcesResponse(od as api.ListDataSourcesResponse);
     });
   });
 
@@ -1067,7 +1067,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1075,7 +1075,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTransferConfigsResponse();
       var od = api.ListTransferConfigsResponse.fromJson(o.toJson());
-      checkListTransferConfigsResponse(od);
+      checkListTransferConfigsResponse(od as api.ListTransferConfigsResponse);
     });
   });
 
@@ -1083,7 +1083,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTransferLogsResponse();
       var od = api.ListTransferLogsResponse.fromJson(o.toJson());
-      checkListTransferLogsResponse(od);
+      checkListTransferLogsResponse(od as api.ListTransferLogsResponse);
     });
   });
 
@@ -1091,7 +1091,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTransferRunsResponse();
       var od = api.ListTransferRunsResponse.fromJson(o.toJson());
-      checkListTransferRunsResponse(od);
+      checkListTransferRunsResponse(od as api.ListTransferRunsResponse);
     });
   });
 
@@ -1099,7 +1099,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1107,7 +1107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScheduleOptions();
       var od = api.ScheduleOptions.fromJson(o.toJson());
-      checkScheduleOptions(od);
+      checkScheduleOptions(od as api.ScheduleOptions);
     });
   });
 
@@ -1115,7 +1115,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScheduleTransferRunsRequest();
       var od = api.ScheduleTransferRunsRequest.fromJson(o.toJson());
-      checkScheduleTransferRunsRequest(od);
+      checkScheduleTransferRunsRequest(od as api.ScheduleTransferRunsRequest);
     });
   });
 
@@ -1123,7 +1123,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScheduleTransferRunsResponse();
       var od = api.ScheduleTransferRunsResponse.fromJson(o.toJson());
-      checkScheduleTransferRunsResponse(od);
+      checkScheduleTransferRunsResponse(od as api.ScheduleTransferRunsResponse);
     });
   });
 
@@ -1131,7 +1131,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartManualTransferRunsRequest();
       var od = api.StartManualTransferRunsRequest.fromJson(o.toJson());
-      checkStartManualTransferRunsRequest(od);
+      checkStartManualTransferRunsRequest(
+          od as api.StartManualTransferRunsRequest);
     });
   });
 
@@ -1139,7 +1140,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartManualTransferRunsResponse();
       var od = api.StartManualTransferRunsResponse.fromJson(o.toJson());
-      checkStartManualTransferRunsResponse(od);
+      checkStartManualTransferRunsResponse(
+          od as api.StartManualTransferRunsResponse);
     });
   });
 
@@ -1147,7 +1149,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1155,7 +1157,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeRange();
       var od = api.TimeRange.fromJson(o.toJson());
-      checkTimeRange(od);
+      checkTimeRange(od as api.TimeRange);
     });
   });
 
@@ -1163,7 +1165,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferConfig();
       var od = api.TransferConfig.fromJson(o.toJson());
-      checkTransferConfig(od);
+      checkTransferConfig(od as api.TransferConfig);
     });
   });
 
@@ -1171,7 +1173,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferMessage();
       var od = api.TransferMessage.fromJson(o.toJson());
-      checkTransferMessage(od);
+      checkTransferMessage(od as api.TransferMessage);
     });
   });
 
@@ -1179,7 +1181,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferRun();
       var od = api.TransferRun.fromJson(o.toJson());
-      checkTransferRun(od);
+      checkTransferRun(od as api.TransferRun);
     });
   });
 
@@ -1191,8 +1193,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CheckValidCredsRequest.fromJson(json);
-        checkCheckValidCredsRequest(obj);
+        var obj = api.CheckValidCredsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCheckValidCredsRequest(obj as api.CheckValidCredsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1232,7 +1235,7 @@
       res
           .checkValidCreds(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCheckValidCredsResponse(response);
+        checkCheckValidCredsResponse(response as api.CheckValidCredsResponse);
       })));
     });
 
@@ -1280,7 +1283,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataSource(response);
+        checkDataSource(response as api.DataSource);
       })));
     });
 
@@ -1337,7 +1340,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDataSourcesResponse(response);
+        checkListDataSourcesResponse(response as api.ListDataSourcesResponse);
       })));
     });
   });
@@ -1387,7 +1390,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1447,7 +1450,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1461,8 +1464,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CheckValidCredsRequest.fromJson(json);
-        checkCheckValidCredsRequest(obj);
+        var obj = api.CheckValidCredsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCheckValidCredsRequest(obj as api.CheckValidCredsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1502,7 +1506,7 @@
       res
           .checkValidCreds(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCheckValidCredsResponse(response);
+        checkCheckValidCredsResponse(response as api.CheckValidCredsResponse);
       })));
     });
 
@@ -1551,7 +1555,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataSource(response);
+        checkDataSource(response as api.DataSource);
       })));
     });
 
@@ -1609,7 +1613,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDataSourcesResponse(response);
+        checkListDataSourcesResponse(response as api.ListDataSourcesResponse);
       })));
     });
   });
@@ -1626,8 +1630,9 @@
       var arg_versionInfo = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TransferConfig.fromJson(json);
-        checkTransferConfig(obj);
+        var obj = api.TransferConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTransferConfig(obj as api.TransferConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1677,7 +1682,7 @@
               versionInfo: arg_versionInfo,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferConfig(response);
+        checkTransferConfig(response as api.TransferConfig);
       })));
     });
 
@@ -1726,7 +1731,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1775,7 +1780,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferConfig(response);
+        checkTransferConfig(response as api.TransferConfig);
       })));
     });
 
@@ -1837,7 +1842,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTransferConfigsResponse(response);
+        checkListTransferConfigsResponse(
+            response as api.ListTransferConfigsResponse);
       })));
     });
 
@@ -1853,8 +1859,9 @@
       var arg_versionInfo = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TransferConfig.fromJson(json);
-        checkTransferConfig(obj);
+        var obj = api.TransferConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTransferConfig(obj as api.TransferConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1907,7 +1914,7 @@
               versionInfo: arg_versionInfo,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferConfig(response);
+        checkTransferConfig(response as api.TransferConfig);
       })));
     });
 
@@ -1919,8 +1926,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ScheduleTransferRunsRequest.fromJson(json);
-        checkScheduleTransferRunsRequest(obj);
+        var obj = api.ScheduleTransferRunsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkScheduleTransferRunsRequest(
+            obj as api.ScheduleTransferRunsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1960,7 +1969,8 @@
       res
           .scheduleRuns(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScheduleTransferRunsResponse(response);
+        checkScheduleTransferRunsResponse(
+            response as api.ScheduleTransferRunsResponse);
       })));
     });
 
@@ -1972,8 +1982,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartManualTransferRunsRequest.fromJson(json);
-        checkStartManualTransferRunsRequest(obj);
+        var obj = api.StartManualTransferRunsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartManualTransferRunsRequest(
+            obj as api.StartManualTransferRunsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2013,7 +2025,8 @@
       res
           .startManualRuns(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStartManualTransferRunsResponse(response);
+        checkStartManualTransferRunsResponse(
+            response as api.StartManualTransferRunsResponse);
       })));
     });
   });
@@ -2068,7 +2081,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2120,7 +2133,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferRun(response);
+        checkTransferRun(response as api.TransferRun);
       })));
     });
 
@@ -2188,7 +2201,7 @@
               states: arg_states,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTransferRunsResponse(response);
+        checkListTransferRunsResponse(response as api.ListTransferRunsResponse);
       })));
     });
   });
@@ -2258,7 +2271,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTransferLogsResponse(response);
+        checkListTransferLogsResponse(response as api.ListTransferLogsResponse);
       })));
     });
   });
@@ -2274,8 +2287,9 @@
       var arg_versionInfo = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TransferConfig.fromJson(json);
-        checkTransferConfig(obj);
+        var obj = api.TransferConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTransferConfig(obj as api.TransferConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2325,7 +2339,7 @@
               versionInfo: arg_versionInfo,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferConfig(response);
+        checkTransferConfig(response as api.TransferConfig);
       })));
     });
 
@@ -2373,7 +2387,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2421,7 +2435,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferConfig(response);
+        checkTransferConfig(response as api.TransferConfig);
       })));
     });
 
@@ -2482,7 +2496,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTransferConfigsResponse(response);
+        checkListTransferConfigsResponse(
+            response as api.ListTransferConfigsResponse);
       })));
     });
 
@@ -2497,8 +2512,9 @@
       var arg_versionInfo = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TransferConfig.fromJson(json);
-        checkTransferConfig(obj);
+        var obj = api.TransferConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTransferConfig(obj as api.TransferConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2551,7 +2567,7 @@
               versionInfo: arg_versionInfo,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferConfig(response);
+        checkTransferConfig(response as api.TransferConfig);
       })));
     });
 
@@ -2562,8 +2578,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ScheduleTransferRunsRequest.fromJson(json);
-        checkScheduleTransferRunsRequest(obj);
+        var obj = api.ScheduleTransferRunsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkScheduleTransferRunsRequest(
+            obj as api.ScheduleTransferRunsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2603,7 +2621,8 @@
       res
           .scheduleRuns(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScheduleTransferRunsResponse(response);
+        checkScheduleTransferRunsResponse(
+            response as api.ScheduleTransferRunsResponse);
       })));
     });
 
@@ -2614,8 +2633,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartManualTransferRunsRequest.fromJson(json);
-        checkStartManualTransferRunsRequest(obj);
+        var obj = api.StartManualTransferRunsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartManualTransferRunsRequest(
+            obj as api.StartManualTransferRunsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2655,7 +2676,8 @@
       res
           .startManualRuns(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStartManualTransferRunsResponse(response);
+        checkStartManualTransferRunsResponse(
+            response as api.StartManualTransferRunsResponse);
       })));
     });
   });
@@ -2705,7 +2727,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2753,7 +2775,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferRun(response);
+        checkTransferRun(response as api.TransferRun);
       })));
     });
 
@@ -2817,7 +2839,7 @@
               states: arg_states,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTransferRunsResponse(response);
+        checkListTransferRunsResponse(response as api.ListTransferRunsResponse);
       })));
     });
   });
@@ -2885,7 +2907,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTransferLogsResponse(response);
+        checkListTransferLogsResponse(response as api.ListTransferLogsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/bigqueryreservation/v1_test.dart b/generated/googleapis/test/bigqueryreservation/v1_test.dart
index 30ca22f..a98a733 100644
--- a/generated/googleapis/test/bigqueryreservation/v1_test.dart
+++ b/generated/googleapis/test/bigqueryreservation/v1_test.dart
@@ -145,7 +145,7 @@
   if (buildCounterCapacityCommitment < 3) {
     unittest.expect(o.commitmentEndTime, unittest.equals('foo'));
     unittest.expect(o.commitmentStartTime, unittest.equals('foo'));
-    checkStatus(o.failureStatus);
+    checkStatus(o.failureStatus as api.Status);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.plan, unittest.equals('foo'));
     unittest.expect(o.renewalPlan, unittest.equals('foo'));
@@ -198,8 +198,8 @@
 
 void checkUnnamed3879(core.List<api.Assignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignment(o[0]);
-  checkAssignment(o[1]);
+  checkAssignment(o[0] as api.Assignment);
+  checkAssignment(o[1] as api.Assignment);
 }
 
 core.int buildCounterListAssignmentsResponse = 0;
@@ -232,8 +232,8 @@
 
 void checkUnnamed3880(core.List<api.CapacityCommitment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCapacityCommitment(o[0]);
-  checkCapacityCommitment(o[1]);
+  checkCapacityCommitment(o[0] as api.CapacityCommitment);
+  checkCapacityCommitment(o[1] as api.CapacityCommitment);
 }
 
 core.int buildCounterListCapacityCommitmentsResponse = 0;
@@ -267,8 +267,8 @@
 
 void checkUnnamed3881(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -301,8 +301,8 @@
 
 void checkUnnamed3882(core.List<api.Reservation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservation(o[0]);
-  checkReservation(o[1]);
+  checkReservation(o[0] as api.Reservation);
+  checkReservation(o[1] as api.Reservation);
 }
 
 core.int buildCounterListReservationsResponse = 0;
@@ -455,7 +455,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3884(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3885(o.response);
@@ -499,8 +499,8 @@
 
 void checkUnnamed3886(core.List<api.Assignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignment(o[0]);
-  checkAssignment(o[1]);
+  checkAssignment(o[0] as api.Assignment);
+  checkAssignment(o[1] as api.Assignment);
 }
 
 core.int buildCounterSearchAllAssignmentsResponse = 0;
@@ -533,8 +533,8 @@
 
 void checkUnnamed3887(core.List<api.Assignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignment(o[0]);
-  checkAssignment(o[1]);
+  checkAssignment(o[0] as api.Assignment);
+  checkAssignment(o[1] as api.Assignment);
 }
 
 core.int buildCounterSearchAssignmentsResponse = 0;
@@ -593,8 +593,8 @@
     api.SplitCapacityCommitmentResponse o) {
   buildCounterSplitCapacityCommitmentResponse++;
   if (buildCounterSplitCapacityCommitmentResponse < 3) {
-    checkCapacityCommitment(o.first);
-    checkCapacityCommitment(o.second);
+    checkCapacityCommitment(o.first as api.CapacityCommitment);
+    checkCapacityCommitment(o.second as api.CapacityCommitment);
   }
   buildCounterSplitCapacityCommitmentResponse--;
 }
@@ -669,7 +669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignment();
       var od = api.Assignment.fromJson(o.toJson());
-      checkAssignment(od);
+      checkAssignment(od as api.Assignment);
     });
   });
 
@@ -677,7 +677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBiReservation();
       var od = api.BiReservation.fromJson(o.toJson());
-      checkBiReservation(od);
+      checkBiReservation(od as api.BiReservation);
     });
   });
 
@@ -685,7 +685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCapacityCommitment();
       var od = api.CapacityCommitment.fromJson(o.toJson());
-      checkCapacityCommitment(od);
+      checkCapacityCommitment(od as api.CapacityCommitment);
     });
   });
 
@@ -693,7 +693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSlotPoolMetadata();
       var od = api.CreateSlotPoolMetadata.fromJson(o.toJson());
-      checkCreateSlotPoolMetadata(od);
+      checkCreateSlotPoolMetadata(od as api.CreateSlotPoolMetadata);
     });
   });
 
@@ -701,7 +701,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -709,7 +709,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAssignmentsResponse();
       var od = api.ListAssignmentsResponse.fromJson(o.toJson());
-      checkListAssignmentsResponse(od);
+      checkListAssignmentsResponse(od as api.ListAssignmentsResponse);
     });
   });
 
@@ -717,7 +717,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCapacityCommitmentsResponse();
       var od = api.ListCapacityCommitmentsResponse.fromJson(o.toJson());
-      checkListCapacityCommitmentsResponse(od);
+      checkListCapacityCommitmentsResponse(
+          od as api.ListCapacityCommitmentsResponse);
     });
   });
 
@@ -725,7 +726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -733,7 +734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListReservationsResponse();
       var od = api.ListReservationsResponse.fromJson(o.toJson());
-      checkListReservationsResponse(od);
+      checkListReservationsResponse(od as api.ListReservationsResponse);
     });
   });
 
@@ -741,7 +742,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMergeCapacityCommitmentsRequest();
       var od = api.MergeCapacityCommitmentsRequest.fromJson(o.toJson());
-      checkMergeCapacityCommitmentsRequest(od);
+      checkMergeCapacityCommitmentsRequest(
+          od as api.MergeCapacityCommitmentsRequest);
     });
   });
 
@@ -749,7 +751,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoveAssignmentRequest();
       var od = api.MoveAssignmentRequest.fromJson(o.toJson());
-      checkMoveAssignmentRequest(od);
+      checkMoveAssignmentRequest(od as api.MoveAssignmentRequest);
     });
   });
 
@@ -757,7 +759,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -765,7 +767,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservation();
       var od = api.Reservation.fromJson(o.toJson());
-      checkReservation(od);
+      checkReservation(od as api.Reservation);
     });
   });
 
@@ -773,7 +775,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAllAssignmentsResponse();
       var od = api.SearchAllAssignmentsResponse.fromJson(o.toJson());
-      checkSearchAllAssignmentsResponse(od);
+      checkSearchAllAssignmentsResponse(od as api.SearchAllAssignmentsResponse);
     });
   });
 
@@ -781,7 +783,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAssignmentsResponse();
       var od = api.SearchAssignmentsResponse.fromJson(o.toJson());
-      checkSearchAssignmentsResponse(od);
+      checkSearchAssignmentsResponse(od as api.SearchAssignmentsResponse);
     });
   });
 
@@ -789,7 +791,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSplitCapacityCommitmentRequest();
       var od = api.SplitCapacityCommitmentRequest.fromJson(o.toJson());
-      checkSplitCapacityCommitmentRequest(od);
+      checkSplitCapacityCommitmentRequest(
+          od as api.SplitCapacityCommitmentRequest);
     });
   });
 
@@ -797,7 +800,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSplitCapacityCommitmentResponse();
       var od = api.SplitCapacityCommitmentResponse.fromJson(o.toJson());
-      checkSplitCapacityCommitmentResponse(od);
+      checkSplitCapacityCommitmentResponse(
+          od as api.SplitCapacityCommitmentResponse);
     });
   });
 
@@ -805,7 +809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -854,7 +858,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -914,7 +918,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -964,7 +968,7 @@
       res
           .getBiReservation(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBiReservation(response);
+        checkBiReservation(response as api.BiReservation);
       })));
     });
 
@@ -1024,7 +1028,8 @@
               query: arg_query,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchAllAssignmentsResponse(response);
+        checkSearchAllAssignmentsResponse(
+            response as api.SearchAllAssignmentsResponse);
       })));
     });
 
@@ -1084,7 +1089,8 @@
               query: arg_query,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchAssignmentsResponse(response);
+        checkSearchAssignmentsResponse(
+            response as api.SearchAssignmentsResponse);
       })));
     });
 
@@ -1096,8 +1102,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BiReservation.fromJson(json);
-        checkBiReservation(obj);
+        var obj = api.BiReservation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBiReservation(obj as api.BiReservation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1140,7 +1147,7 @@
           .updateBiReservation(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBiReservation(response);
+        checkBiReservation(response as api.BiReservation);
       })));
     });
   });
@@ -1158,8 +1165,9 @@
       var arg_enforceSingleAdminProjectPerOrg = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CapacityCommitment.fromJson(json);
-        checkCapacityCommitment(obj);
+        var obj = api.CapacityCommitment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCapacityCommitment(obj as api.CapacityCommitment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1204,7 +1212,7 @@
                   arg_enforceSingleAdminProjectPerOrg,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCapacityCommitment(response);
+        checkCapacityCommitment(response as api.CapacityCommitment);
       })));
     });
 
@@ -1255,7 +1263,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1306,7 +1314,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCapacityCommitment(response);
+        checkCapacityCommitment(response as api.CapacityCommitment);
       })));
     });
 
@@ -1366,7 +1374,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCapacityCommitmentsResponse(response);
+        checkListCapacityCommitmentsResponse(
+            response as api.ListCapacityCommitmentsResponse);
       })));
     });
 
@@ -1380,8 +1389,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.MergeCapacityCommitmentsRequest.fromJson(json);
-        checkMergeCapacityCommitmentsRequest(obj);
+        var obj = api.MergeCapacityCommitmentsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkMergeCapacityCommitmentsRequest(
+            obj as api.MergeCapacityCommitmentsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1421,7 +1432,7 @@
       res
           .merge(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCapacityCommitment(response);
+        checkCapacityCommitment(response as api.CapacityCommitment);
       })));
     });
 
@@ -1436,8 +1447,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CapacityCommitment.fromJson(json);
-        checkCapacityCommitment(obj);
+        var obj = api.CapacityCommitment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCapacityCommitment(obj as api.CapacityCommitment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1480,7 +1492,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCapacityCommitment(response);
+        checkCapacityCommitment(response as api.CapacityCommitment);
       })));
     });
 
@@ -1494,8 +1506,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SplitCapacityCommitmentRequest.fromJson(json);
-        checkSplitCapacityCommitmentRequest(obj);
+        var obj = api.SplitCapacityCommitmentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSplitCapacityCommitmentRequest(
+            obj as api.SplitCapacityCommitmentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1535,7 +1549,8 @@
       res
           .split(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSplitCapacityCommitmentResponse(response);
+        checkSplitCapacityCommitmentResponse(
+            response as api.SplitCapacityCommitmentResponse);
       })));
     });
   });
@@ -1550,8 +1565,9 @@
       var arg_reservationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Reservation.fromJson(json);
-        checkReservation(obj);
+        var obj = api.Reservation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReservation(obj as api.Reservation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1594,7 +1610,7 @@
           .create(arg_request, arg_parent,
               reservationId: arg_reservationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReservation(response);
+        checkReservation(response as api.Reservation);
       })));
     });
 
@@ -1643,7 +1659,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1692,7 +1708,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReservation(response);
+        checkReservation(response as api.Reservation);
       })));
     });
 
@@ -1750,7 +1766,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListReservationsResponse(response);
+        checkListReservationsResponse(response as api.ListReservationsResponse);
       })));
     });
 
@@ -1763,8 +1779,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Reservation.fromJson(json);
-        checkReservation(obj);
+        var obj = api.Reservation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReservation(obj as api.Reservation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1807,7 +1824,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReservation(response);
+        checkReservation(response as api.Reservation);
       })));
     });
   });
@@ -1825,8 +1842,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Assignment.fromJson(json);
-        checkAssignment(obj);
+        var obj = api.Assignment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAssignment(obj as api.Assignment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1866,7 +1884,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignment(response);
+        checkAssignment(response as api.Assignment);
       })));
     });
 
@@ -1918,7 +1936,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1979,7 +1997,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAssignmentsResponse(response);
+        checkListAssignmentsResponse(response as api.ListAssignmentsResponse);
       })));
     });
 
@@ -1994,8 +2012,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.MoveAssignmentRequest.fromJson(json);
-        checkMoveAssignmentRequest(obj);
+        var obj = api.MoveAssignmentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkMoveAssignmentRequest(obj as api.MoveAssignmentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2035,7 +2054,7 @@
       res
           .move(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignment(response);
+        checkAssignment(response as api.Assignment);
       })));
     });
   });
diff --git a/generated/googleapis/test/bigtableadmin/v2_test.dart b/generated/googleapis/test/bigtableadmin/v2_test.dart
index f7d0123..f408b4d 100644
--- a/generated/googleapis/test/bigtableadmin/v2_test.dart
+++ b/generated/googleapis/test/bigtableadmin/v2_test.dart
@@ -94,9 +94,11 @@
   if (buildCounterAppProfile < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkMultiClusterRoutingUseAny(o.multiClusterRoutingUseAny);
+    checkMultiClusterRoutingUseAny(
+        o.multiClusterRoutingUseAny as api.MultiClusterRoutingUseAny);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkSingleClusterRouting(o.singleClusterRouting);
+    checkSingleClusterRouting(
+        o.singleClusterRouting as api.SingleClusterRouting);
   }
   buildCounterAppProfile--;
 }
@@ -110,8 +112,8 @@
 
 void checkUnnamed1175(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -254,7 +256,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed1177(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -359,7 +361,7 @@
 void checkColumnFamily(api.ColumnFamily o) {
   buildCounterColumnFamily++;
   if (buildCounterColumnFamily < 3) {
-    checkGcRule(o.gcRule);
+    checkGcRule(o.gcRule as api.GcRule);
   }
   buildCounterColumnFamily--;
 }
@@ -398,8 +400,8 @@
 
 void checkUnnamed1178(core.Map<core.String, api.TableProgress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableProgress(o['x']);
-  checkTableProgress(o['y']);
+  checkTableProgress(o['x'] as api.TableProgress);
+  checkTableProgress(o['y'] as api.TableProgress);
 }
 
 core.int buildCounterCreateClusterMetadata = 0;
@@ -420,7 +422,7 @@
   buildCounterCreateClusterMetadata++;
   if (buildCounterCreateClusterMetadata < 3) {
     unittest.expect(o.finishTime, unittest.equals('foo'));
-    checkCreateClusterRequest(o.originalRequest);
+    checkCreateClusterRequest(o.originalRequest as api.CreateClusterRequest);
     unittest.expect(o.requestTime, unittest.equals('foo'));
     checkUnnamed1178(o.tables);
   }
@@ -443,7 +445,7 @@
 void checkCreateClusterRequest(api.CreateClusterRequest o) {
   buildCounterCreateClusterRequest++;
   if (buildCounterCreateClusterRequest < 3) {
-    checkCluster(o.cluster);
+    checkCluster(o.cluster as api.Cluster);
     unittest.expect(o.clusterId, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
   }
@@ -467,7 +469,7 @@
   buildCounterCreateInstanceMetadata++;
   if (buildCounterCreateInstanceMetadata < 3) {
     unittest.expect(o.finishTime, unittest.equals('foo'));
-    checkCreateInstanceRequest(o.originalRequest);
+    checkCreateInstanceRequest(o.originalRequest as api.CreateInstanceRequest);
     unittest.expect(o.requestTime, unittest.equals('foo'));
   }
   buildCounterCreateInstanceMetadata--;
@@ -482,8 +484,8 @@
 
 void checkUnnamed1179(core.Map<core.String, api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCluster(o['x']);
-  checkCluster(o['y']);
+  checkCluster(o['x'] as api.Cluster);
+  checkCluster(o['y'] as api.Cluster);
 }
 
 core.int buildCounterCreateInstanceRequest = 0;
@@ -504,7 +506,7 @@
   buildCounterCreateInstanceRequest++;
   if (buildCounterCreateInstanceRequest < 3) {
     checkUnnamed1179(o.clusters);
-    checkInstance(o.instance);
+    checkInstance(o.instance as api.Instance);
     unittest.expect(o.instanceId, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
   }
@@ -520,8 +522,8 @@
 
 void checkUnnamed1180(core.List<api.Split> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSplit(o[0]);
-  checkSplit(o[1]);
+  checkSplit(o[0] as api.Split);
+  checkSplit(o[1] as api.Split);
 }
 
 core.int buildCounterCreateTableRequest = 0;
@@ -541,7 +543,7 @@
   buildCounterCreateTableRequest++;
   if (buildCounterCreateTableRequest < 3) {
     checkUnnamed1180(o.initialSplits);
-    checkTable(o.table);
+    checkTable(o.table as api.Table);
     unittest.expect(o.tableId, unittest.equals('foo'));
   }
   buildCounterCreateTableRequest--;
@@ -617,8 +619,8 @@
 
 void checkUnnamed1181(core.List<api.Frame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFrame(o[0]);
-  checkFrame(o[1]);
+  checkFrame(o[0] as api.Frame);
+  checkFrame(o[1] as api.Frame);
 }
 
 core.int buildCounterFailureTrace = 0;
@@ -680,10 +682,10 @@
 void checkGcRule(api.GcRule o) {
   buildCounterGcRule++;
   if (buildCounterGcRule < 3) {
-    checkIntersection(o.intersection);
+    checkIntersection(o.intersection as api.Intersection);
     unittest.expect(o.maxAge, unittest.equals('foo'));
     unittest.expect(o.maxNumVersions, unittest.equals(42));
-    checkUnion(o.union);
+    checkUnion(o.union as api.Union);
   }
   buildCounterGcRule--;
 }
@@ -738,7 +740,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -811,8 +813,8 @@
 
 void checkUnnamed1183(core.List<api.GcRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGcRule(o[0]);
-  checkGcRule(o[1]);
+  checkGcRule(o[0] as api.GcRule);
+  checkGcRule(o[1] as api.GcRule);
 }
 
 core.int buildCounterIntersection = 0;
@@ -843,8 +845,8 @@
 
 void checkUnnamed1184(core.List<api.AppProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAppProfile(o[0]);
-  checkAppProfile(o[1]);
+  checkAppProfile(o[0] as api.AppProfile);
+  checkAppProfile(o[1] as api.AppProfile);
 }
 
 core.List<core.String> buildUnnamed1185() {
@@ -892,8 +894,8 @@
 
 void checkUnnamed1186(core.List<api.Backup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackup(o[0]);
-  checkBackup(o[1]);
+  checkBackup(o[0] as api.Backup);
+  checkBackup(o[1] as api.Backup);
 }
 
 core.int buildCounterListBackupsResponse = 0;
@@ -926,8 +928,8 @@
 
 void checkUnnamed1187(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCluster(o[0]);
-  checkCluster(o[1]);
+  checkCluster(o[0] as api.Cluster);
+  checkCluster(o[1] as api.Cluster);
 }
 
 core.List<core.String> buildUnnamed1188() {
@@ -988,8 +990,8 @@
 
 void checkUnnamed1190(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.int buildCounterListInstancesResponse = 0;
@@ -1024,8 +1026,8 @@
 
 void checkUnnamed1191(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -1058,8 +1060,8 @@
 
 void checkUnnamed1192(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1092,8 +1094,8 @@
 
 void checkUnnamed1193(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTable(o[0]);
-  checkTable(o[1]);
+  checkTable(o[0] as api.Table);
+  checkTable(o[1] as api.Table);
 }
 
 core.int buildCounterListTablesResponse = 0;
@@ -1203,10 +1205,10 @@
 void checkModification(api.Modification o) {
   buildCounterModification++;
   if (buildCounterModification < 3) {
-    checkColumnFamily(o.create);
+    checkColumnFamily(o.create as api.ColumnFamily);
     unittest.expect(o.drop, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkColumnFamily(o.update);
+    checkColumnFamily(o.update as api.ColumnFamily);
   }
   buildCounterModification--;
 }
@@ -1220,8 +1222,8 @@
 
 void checkUnnamed1196(core.List<api.Modification> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkModification(o[0]);
-  checkModification(o[1]);
+  checkModification(o[0] as api.Modification);
+  checkModification(o[1] as api.Modification);
 }
 
 core.int buildCounterModifyColumnFamiliesRequest = 0;
@@ -1335,7 +1337,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1197(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1198(o.response);
@@ -1382,7 +1384,7 @@
   buildCounterOptimizeRestoredTableMetadata++;
   if (buildCounterOptimizeRestoredTableMetadata < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOperationProgress(o.progress);
+    checkOperationProgress(o.progress as api.OperationProgress);
   }
   buildCounterOptimizeRestoredTableMetadata--;
 }
@@ -1402,7 +1404,7 @@
 void checkPartialUpdateInstanceRequest(api.PartialUpdateInstanceRequest o) {
   buildCounterPartialUpdateInstanceRequest++;
   if (buildCounterPartialUpdateInstanceRequest < 3) {
-    checkInstance(o.instance);
+    checkInstance(o.instance as api.Instance);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterPartialUpdateInstanceRequest--;
@@ -1417,8 +1419,8 @@
 
 void checkUnnamed1199(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed1200() {
@@ -1430,8 +1432,8 @@
 
 void checkUnnamed1200(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1474,7 +1476,7 @@
 void checkRestoreInfo(api.RestoreInfo o) {
   buildCounterRestoreInfo++;
   if (buildCounterRestoreInfo < 3) {
-    checkBackupInfo(o.backupInfo);
+    checkBackupInfo(o.backupInfo as api.BackupInfo);
     unittest.expect(o.sourceType, unittest.equals('foo'));
   }
   buildCounterRestoreInfo--;
@@ -1498,10 +1500,10 @@
 void checkRestoreTableMetadata(api.RestoreTableMetadata o) {
   buildCounterRestoreTableMetadata++;
   if (buildCounterRestoreTableMetadata < 3) {
-    checkBackupInfo(o.backupInfo);
+    checkBackupInfo(o.backupInfo as api.BackupInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.optimizeTableOperationName, unittest.equals('foo'));
-    checkOperationProgress(o.progress);
+    checkOperationProgress(o.progress as api.OperationProgress);
     unittest.expect(o.sourceType, unittest.equals('foo'));
   }
   buildCounterRestoreTableMetadata--;
@@ -1543,7 +1545,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -1663,8 +1665,8 @@
 
 void checkUnnamed1203(core.Map<core.String, api.ClusterState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClusterState(o['x']);
-  checkClusterState(o['y']);
+  checkClusterState(o['x'] as api.ClusterState);
+  checkClusterState(o['y'] as api.ClusterState);
 }
 
 core.Map<core.String, api.ColumnFamily> buildUnnamed1204() {
@@ -1676,8 +1678,8 @@
 
 void checkUnnamed1204(core.Map<core.String, api.ColumnFamily> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkColumnFamily(o['x']);
-  checkColumnFamily(o['y']);
+  checkColumnFamily(o['x'] as api.ColumnFamily);
+  checkColumnFamily(o['y'] as api.ColumnFamily);
 }
 
 core.int buildCounterTable = 0;
@@ -1702,7 +1704,7 @@
     checkUnnamed1204(o.columnFamilies);
     unittest.expect(o.granularity, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkRestoreInfo(o.restoreInfo);
+    checkRestoreInfo(o.restoreInfo as api.RestoreInfo);
   }
   buildCounterTable--;
 }
@@ -1803,8 +1805,8 @@
 
 void checkUnnamed1207(core.List<api.GcRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGcRule(o[0]);
-  checkGcRule(o[1]);
+  checkGcRule(o[0] as api.GcRule);
+  checkGcRule(o[1] as api.GcRule);
 }
 
 core.int buildCounterUnion = 0;
@@ -1858,7 +1860,7 @@
   buildCounterUpdateClusterMetadata++;
   if (buildCounterUpdateClusterMetadata < 3) {
     unittest.expect(o.finishTime, unittest.equals('foo'));
-    checkCluster(o.originalRequest);
+    checkCluster(o.originalRequest as api.Cluster);
     unittest.expect(o.requestTime, unittest.equals('foo'));
   }
   buildCounterUpdateClusterMetadata--;
@@ -1881,7 +1883,8 @@
   buildCounterUpdateInstanceMetadata++;
   if (buildCounterUpdateInstanceMetadata < 3) {
     unittest.expect(o.finishTime, unittest.equals('foo'));
-    checkPartialUpdateInstanceRequest(o.originalRequest);
+    checkPartialUpdateInstanceRequest(
+        o.originalRequest as api.PartialUpdateInstanceRequest);
     unittest.expect(o.requestTime, unittest.equals('foo'));
   }
   buildCounterUpdateInstanceMetadata--;
@@ -1892,7 +1895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppProfile();
       var od = api.AppProfile.fromJson(o.toJson());
-      checkAppProfile(od);
+      checkAppProfile(od as api.AppProfile);
     });
   });
 
@@ -1900,7 +1903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1908,7 +1911,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1916,7 +1919,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackup();
       var od = api.Backup.fromJson(o.toJson());
-      checkBackup(od);
+      checkBackup(od as api.Backup);
     });
   });
 
@@ -1924,7 +1927,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackupInfo();
       var od = api.BackupInfo.fromJson(o.toJson());
-      checkBackupInfo(od);
+      checkBackupInfo(od as api.BackupInfo);
     });
   });
 
@@ -1932,7 +1935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1940,7 +1943,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckConsistencyRequest();
       var od = api.CheckConsistencyRequest.fromJson(o.toJson());
-      checkCheckConsistencyRequest(od);
+      checkCheckConsistencyRequest(od as api.CheckConsistencyRequest);
     });
   });
 
@@ -1948,7 +1951,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckConsistencyResponse();
       var od = api.CheckConsistencyResponse.fromJson(o.toJson());
-      checkCheckConsistencyResponse(od);
+      checkCheckConsistencyResponse(od as api.CheckConsistencyResponse);
     });
   });
 
@@ -1956,7 +1959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCluster();
       var od = api.Cluster.fromJson(o.toJson());
-      checkCluster(od);
+      checkCluster(od as api.Cluster);
     });
   });
 
@@ -1964,7 +1967,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterState();
       var od = api.ClusterState.fromJson(o.toJson());
-      checkClusterState(od);
+      checkClusterState(od as api.ClusterState);
     });
   });
 
@@ -1972,7 +1975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColumnFamily();
       var od = api.ColumnFamily.fromJson(o.toJson());
-      checkColumnFamily(od);
+      checkColumnFamily(od as api.ColumnFamily);
     });
   });
 
@@ -1980,7 +1983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateBackupMetadata();
       var od = api.CreateBackupMetadata.fromJson(o.toJson());
-      checkCreateBackupMetadata(od);
+      checkCreateBackupMetadata(od as api.CreateBackupMetadata);
     });
   });
 
@@ -1988,7 +1991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateClusterMetadata();
       var od = api.CreateClusterMetadata.fromJson(o.toJson());
-      checkCreateClusterMetadata(od);
+      checkCreateClusterMetadata(od as api.CreateClusterMetadata);
     });
   });
 
@@ -1996,7 +1999,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateClusterRequest();
       var od = api.CreateClusterRequest.fromJson(o.toJson());
-      checkCreateClusterRequest(od);
+      checkCreateClusterRequest(od as api.CreateClusterRequest);
     });
   });
 
@@ -2004,7 +2007,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateInstanceMetadata();
       var od = api.CreateInstanceMetadata.fromJson(o.toJson());
-      checkCreateInstanceMetadata(od);
+      checkCreateInstanceMetadata(od as api.CreateInstanceMetadata);
     });
   });
 
@@ -2012,7 +2015,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateInstanceRequest();
       var od = api.CreateInstanceRequest.fromJson(o.toJson());
-      checkCreateInstanceRequest(od);
+      checkCreateInstanceRequest(od as api.CreateInstanceRequest);
     });
   });
 
@@ -2020,7 +2023,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateTableRequest();
       var od = api.CreateTableRequest.fromJson(o.toJson());
-      checkCreateTableRequest(od);
+      checkCreateTableRequest(od as api.CreateTableRequest);
     });
   });
 
@@ -2028,7 +2031,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDropRowRangeRequest();
       var od = api.DropRowRangeRequest.fromJson(o.toJson());
-      checkDropRowRangeRequest(od);
+      checkDropRowRangeRequest(od as api.DropRowRangeRequest);
     });
   });
 
@@ -2036,7 +2039,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2044,7 +2047,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -2052,7 +2055,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFailureTrace();
       var od = api.FailureTrace.fromJson(o.toJson());
-      checkFailureTrace(od);
+      checkFailureTrace(od as api.FailureTrace);
     });
   });
 
@@ -2060,7 +2063,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFrame();
       var od = api.Frame.fromJson(o.toJson());
-      checkFrame(od);
+      checkFrame(od as api.Frame);
     });
   });
 
@@ -2068,7 +2071,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcRule();
       var od = api.GcRule.fromJson(o.toJson());
-      checkGcRule(od);
+      checkGcRule(od as api.GcRule);
     });
   });
 
@@ -2076,7 +2079,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateConsistencyTokenRequest();
       var od = api.GenerateConsistencyTokenRequest.fromJson(o.toJson());
-      checkGenerateConsistencyTokenRequest(od);
+      checkGenerateConsistencyTokenRequest(
+          od as api.GenerateConsistencyTokenRequest);
     });
   });
 
@@ -2084,7 +2088,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateConsistencyTokenResponse();
       var od = api.GenerateConsistencyTokenResponse.fromJson(o.toJson());
-      checkGenerateConsistencyTokenResponse(od);
+      checkGenerateConsistencyTokenResponse(
+          od as api.GenerateConsistencyTokenResponse);
     });
   });
 
@@ -2092,7 +2097,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -2100,7 +2105,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -2108,7 +2113,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstance();
       var od = api.Instance.fromJson(o.toJson());
-      checkInstance(od);
+      checkInstance(od as api.Instance);
     });
   });
 
@@ -2116,7 +2121,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntersection();
       var od = api.Intersection.fromJson(o.toJson());
-      checkIntersection(od);
+      checkIntersection(od as api.Intersection);
     });
   });
 
@@ -2124,7 +2129,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAppProfilesResponse();
       var od = api.ListAppProfilesResponse.fromJson(o.toJson());
-      checkListAppProfilesResponse(od);
+      checkListAppProfilesResponse(od as api.ListAppProfilesResponse);
     });
   });
 
@@ -2132,7 +2137,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBackupsResponse();
       var od = api.ListBackupsResponse.fromJson(o.toJson());
-      checkListBackupsResponse(od);
+      checkListBackupsResponse(od as api.ListBackupsResponse);
     });
   });
 
@@ -2140,7 +2145,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListClustersResponse();
       var od = api.ListClustersResponse.fromJson(o.toJson());
-      checkListClustersResponse(od);
+      checkListClustersResponse(od as api.ListClustersResponse);
     });
   });
 
@@ -2148,7 +2153,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInstancesResponse();
       var od = api.ListInstancesResponse.fromJson(o.toJson());
-      checkListInstancesResponse(od);
+      checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
 
@@ -2156,7 +2161,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -2164,7 +2169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -2172,7 +2177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTablesResponse();
       var od = api.ListTablesResponse.fromJson(o.toJson());
-      checkListTablesResponse(od);
+      checkListTablesResponse(od as api.ListTablesResponse);
     });
   });
 
@@ -2180,7 +2185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -2188,7 +2193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModification();
       var od = api.Modification.fromJson(o.toJson());
-      checkModification(od);
+      checkModification(od as api.Modification);
     });
   });
 
@@ -2196,7 +2201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyColumnFamiliesRequest();
       var od = api.ModifyColumnFamiliesRequest.fromJson(o.toJson());
-      checkModifyColumnFamiliesRequest(od);
+      checkModifyColumnFamiliesRequest(od as api.ModifyColumnFamiliesRequest);
     });
   });
 
@@ -2204,7 +2209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMultiClusterRoutingUseAny();
       var od = api.MultiClusterRoutingUseAny.fromJson(o.toJson());
-      checkMultiClusterRoutingUseAny(od);
+      checkMultiClusterRoutingUseAny(od as api.MultiClusterRoutingUseAny);
     });
   });
 
@@ -2212,7 +2217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -2220,7 +2225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationProgress();
       var od = api.OperationProgress.fromJson(o.toJson());
-      checkOperationProgress(od);
+      checkOperationProgress(od as api.OperationProgress);
     });
   });
 
@@ -2228,7 +2233,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOptimizeRestoredTableMetadata();
       var od = api.OptimizeRestoredTableMetadata.fromJson(o.toJson());
-      checkOptimizeRestoredTableMetadata(od);
+      checkOptimizeRestoredTableMetadata(
+          od as api.OptimizeRestoredTableMetadata);
     });
   });
 
@@ -2236,7 +2242,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartialUpdateInstanceRequest();
       var od = api.PartialUpdateInstanceRequest.fromJson(o.toJson());
-      checkPartialUpdateInstanceRequest(od);
+      checkPartialUpdateInstanceRequest(od as api.PartialUpdateInstanceRequest);
     });
   });
 
@@ -2244,7 +2250,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -2252,7 +2258,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreInfo();
       var od = api.RestoreInfo.fromJson(o.toJson());
-      checkRestoreInfo(od);
+      checkRestoreInfo(od as api.RestoreInfo);
     });
   });
 
@@ -2260,7 +2266,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreTableMetadata();
       var od = api.RestoreTableMetadata.fromJson(o.toJson());
-      checkRestoreTableMetadata(od);
+      checkRestoreTableMetadata(od as api.RestoreTableMetadata);
     });
   });
 
@@ -2268,7 +2274,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreTableRequest();
       var od = api.RestoreTableRequest.fromJson(o.toJson());
-      checkRestoreTableRequest(od);
+      checkRestoreTableRequest(od as api.RestoreTableRequest);
     });
   });
 
@@ -2276,7 +2282,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -2284,7 +2290,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSingleClusterRouting();
       var od = api.SingleClusterRouting.fromJson(o.toJson());
-      checkSingleClusterRouting(od);
+      checkSingleClusterRouting(od as api.SingleClusterRouting);
     });
   });
 
@@ -2292,7 +2298,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSplit();
       var od = api.Split.fromJson(o.toJson());
-      checkSplit(od);
+      checkSplit(od as api.Split);
     });
   });
 
@@ -2300,7 +2306,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2308,7 +2314,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTable();
       var od = api.Table.fromJson(o.toJson());
-      checkTable(od);
+      checkTable(od as api.Table);
     });
   });
 
@@ -2316,7 +2322,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableProgress();
       var od = api.TableProgress.fromJson(o.toJson());
-      checkTableProgress(od);
+      checkTableProgress(od as api.TableProgress);
     });
   });
 
@@ -2324,7 +2330,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -2332,7 +2338,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -2340,7 +2346,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnion();
       var od = api.Union.fromJson(o.toJson());
-      checkUnion(od);
+      checkUnion(od as api.Union);
     });
   });
 
@@ -2348,7 +2354,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateAppProfileMetadata();
       var od = api.UpdateAppProfileMetadata.fromJson(o.toJson());
-      checkUpdateAppProfileMetadata(od);
+      checkUpdateAppProfileMetadata(od as api.UpdateAppProfileMetadata);
     });
   });
 
@@ -2356,7 +2362,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateClusterMetadata();
       var od = api.UpdateClusterMetadata.fromJson(o.toJson());
-      checkUpdateClusterMetadata(od);
+      checkUpdateClusterMetadata(od as api.UpdateClusterMetadata);
     });
   });
 
@@ -2364,7 +2370,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateInstanceMetadata();
       var od = api.UpdateInstanceMetadata.fromJson(o.toJson());
-      checkUpdateInstanceMetadata(od);
+      checkUpdateInstanceMetadata(od as api.UpdateInstanceMetadata);
     });
   });
 
@@ -2413,7 +2419,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2461,7 +2467,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2509,7 +2515,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2571,7 +2577,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -2584,8 +2590,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateInstanceRequest.fromJson(json);
-        checkCreateInstanceRequest(obj);
+        var obj = api.CreateInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateInstanceRequest(obj as api.CreateInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2625,7 +2632,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2673,7 +2680,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2721,7 +2728,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstance(response);
+        checkInstance(response as api.Instance);
       })));
     });
 
@@ -2732,8 +2739,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2773,7 +2781,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2824,7 +2832,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInstancesResponse(response);
+        checkListInstancesResponse(response as api.ListInstancesResponse);
       })));
     });
 
@@ -2836,8 +2844,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2880,7 +2889,7 @@
           .partialUpdateInstance(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2891,8 +2900,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2932,7 +2942,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2943,8 +2953,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2984,7 +2995,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -2995,8 +3007,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3036,7 +3049,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstance(response);
+        checkInstance(response as api.Instance);
       })));
     });
   });
@@ -3051,8 +3064,9 @@
       var arg_ignoreWarnings = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AppProfile.fromJson(json);
-        checkAppProfile(obj);
+        var obj = api.AppProfile.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAppProfile(obj as api.AppProfile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3099,7 +3113,7 @@
               ignoreWarnings: arg_ignoreWarnings,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppProfile(response);
+        checkAppProfile(response as api.AppProfile);
       })));
     });
 
@@ -3151,7 +3165,7 @@
           .delete(arg_name,
               ignoreWarnings: arg_ignoreWarnings, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3199,7 +3213,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppProfile(response);
+        checkAppProfile(response as api.AppProfile);
       })));
     });
 
@@ -3256,7 +3270,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAppProfilesResponse(response);
+        checkListAppProfilesResponse(response as api.ListAppProfilesResponse);
       })));
     });
 
@@ -3269,8 +3283,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AppProfile.fromJson(json);
-        checkAppProfile(obj);
+        var obj = api.AppProfile.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAppProfile(obj as api.AppProfile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3317,7 +3332,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -3331,8 +3346,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Cluster.fromJson(json);
-        checkCluster(obj);
+        var obj =
+            api.Cluster.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCluster(obj as api.Cluster);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3375,7 +3391,7 @@
           .create(arg_request, arg_parent,
               clusterId: arg_clusterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3423,7 +3439,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3471,7 +3487,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCluster(response);
+        checkCluster(response as api.Cluster);
       })));
     });
 
@@ -3522,7 +3538,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListClustersResponse(response);
+        checkListClustersResponse(response as api.ListClustersResponse);
       })));
     });
 
@@ -3533,8 +3549,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Cluster.fromJson(json);
-        checkCluster(obj);
+        var obj =
+            api.Cluster.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCluster(obj as api.Cluster);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3574,7 +3591,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -3588,8 +3605,9 @@
       var arg_backupId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Backup.fromJson(json);
-        checkBackup(obj);
+        var obj =
+            api.Backup.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBackup(obj as api.Backup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3632,7 +3650,7 @@
           .create(arg_request, arg_parent,
               backupId: arg_backupId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3680,7 +3698,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3728,7 +3746,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackup(response);
+        checkBackup(response as api.Backup);
       })));
     });
 
@@ -3739,8 +3757,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3780,7 +3799,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3844,7 +3863,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBackupsResponse(response);
+        checkListBackupsResponse(response as api.ListBackupsResponse);
       })));
     });
 
@@ -3856,8 +3875,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Backup.fromJson(json);
-        checkBackup(obj);
+        var obj =
+            api.Backup.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBackup(obj as api.Backup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3900,7 +3920,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackup(response);
+        checkBackup(response as api.Backup);
       })));
     });
 
@@ -3911,8 +3931,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3952,7 +3973,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3963,8 +3984,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4004,7 +4026,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -4017,8 +4040,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CheckConsistencyRequest.fromJson(json);
-        checkCheckConsistencyRequest(obj);
+        var obj = api.CheckConsistencyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCheckConsistencyRequest(obj as api.CheckConsistencyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4058,7 +4082,7 @@
       res
           .checkConsistency(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCheckConsistencyResponse(response);
+        checkCheckConsistencyResponse(response as api.CheckConsistencyResponse);
       })));
     });
 
@@ -4069,8 +4093,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateTableRequest.fromJson(json);
-        checkCreateTableRequest(obj);
+        var obj = api.CreateTableRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateTableRequest(obj as api.CreateTableRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4110,7 +4135,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTable(response);
+        checkTable(response as api.Table);
       })));
     });
 
@@ -4158,7 +4183,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4169,8 +4194,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DropRowRangeRequest.fromJson(json);
-        checkDropRowRangeRequest(obj);
+        var obj = api.DropRowRangeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDropRowRangeRequest(obj as api.DropRowRangeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4210,7 +4236,7 @@
       res
           .dropRowRange(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4221,8 +4247,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateConsistencyTokenRequest.fromJson(json);
-        checkGenerateConsistencyTokenRequest(obj);
+        var obj = api.GenerateConsistencyTokenRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateConsistencyTokenRequest(
+            obj as api.GenerateConsistencyTokenRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4262,7 +4290,8 @@
       res
           .generateConsistencyToken(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateConsistencyTokenResponse(response);
+        checkGenerateConsistencyTokenResponse(
+            response as api.GenerateConsistencyTokenResponse);
       })));
     });
 
@@ -4312,7 +4341,7 @@
       res
           .get(arg_name, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTable(response);
+        checkTable(response as api.Table);
       })));
     });
 
@@ -4323,8 +4352,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4364,7 +4394,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4424,7 +4454,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTablesResponse(response);
+        checkListTablesResponse(response as api.ListTablesResponse);
       })));
     });
 
@@ -4435,8 +4465,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyColumnFamiliesRequest.fromJson(json);
-        checkModifyColumnFamiliesRequest(obj);
+        var obj = api.ModifyColumnFamiliesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyColumnFamiliesRequest(
+            obj as api.ModifyColumnFamiliesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4476,7 +4508,7 @@
       res
           .modifyColumnFamilies(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTable(response);
+        checkTable(response as api.Table);
       })));
     });
 
@@ -4487,8 +4519,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RestoreTableRequest.fromJson(json);
-        checkRestoreTableRequest(obj);
+        var obj = api.RestoreTableRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRestoreTableRequest(obj as api.RestoreTableRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4528,7 +4561,7 @@
       res
           .restore(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4539,8 +4572,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4580,7 +4614,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4591,8 +4625,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4632,7 +4667,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -4682,7 +4718,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -4742,7 +4778,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/binaryauthorization/v1_test.dart b/generated/googleapis/test/binaryauthorization/v1_test.dart
index efcee06..9eeb376 100644
--- a/generated/googleapis/test/binaryauthorization/v1_test.dart
+++ b/generated/googleapis/test/binaryauthorization/v1_test.dart
@@ -138,8 +138,8 @@
 
 void checkUnnamed3628(core.List<api.Jwt> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJwt(o[0]);
-  checkJwt(o[1]);
+  checkJwt(o[0] as api.Jwt);
+  checkJwt(o[1] as api.Jwt);
 }
 
 core.List<api.Signature> buildUnnamed3629() {
@@ -151,8 +151,8 @@
 
 void checkUnnamed3629(core.List<api.Signature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSignature(o[0]);
-  checkSignature(o[1]);
+  checkSignature(o[0] as api.Signature);
+  checkSignature(o[1] as api.Signature);
 }
 
 core.int buildCounterAttestationOccurrence = 0;
@@ -198,7 +198,8 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
-    checkUserOwnedGrafeasNote(o.userOwnedGrafeasNote);
+    checkUserOwnedGrafeasNote(
+        o.userOwnedGrafeasNote as api.UserOwnedGrafeasNote);
   }
   buildCounterAttestor--;
 }
@@ -223,7 +224,7 @@
     unittest.expect(o.asciiArmoredPgpPublicKey, unittest.equals('foo'));
     unittest.expect(o.comment, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkPkixPublicKey(o.pkixPublicKey);
+    checkPkixPublicKey(o.pkixPublicKey as api.PkixPublicKey);
   }
   buildCounterAttestorPublicKey--;
 }
@@ -259,7 +260,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed3630(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -315,8 +316,8 @@
 
 void checkUnnamed3631(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterIamPolicy = 0;
@@ -370,8 +371,8 @@
 
 void checkUnnamed3632(core.List<api.Attestor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttestor(o[0]);
-  checkAttestor(o[1]);
+  checkAttestor(o[0] as api.Attestor);
+  checkAttestor(o[1] as api.Attestor);
 }
 
 core.int buildCounterListAttestorsResponse = 0;
@@ -425,8 +426,8 @@
 
 void checkUnnamed3633(core.List<api.AdmissionWhitelistPattern> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdmissionWhitelistPattern(o[0]);
-  checkAdmissionWhitelistPattern(o[1]);
+  checkAdmissionWhitelistPattern(o[0] as api.AdmissionWhitelistPattern);
+  checkAdmissionWhitelistPattern(o[1] as api.AdmissionWhitelistPattern);
 }
 
 core.Map<core.String, api.AdmissionRule> buildUnnamed3634() {
@@ -438,8 +439,8 @@
 
 void checkUnnamed3634(core.Map<core.String, api.AdmissionRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdmissionRule(o['x']);
-  checkAdmissionRule(o['y']);
+  checkAdmissionRule(o['x'] as api.AdmissionRule);
+  checkAdmissionRule(o['y'] as api.AdmissionRule);
 }
 
 core.int buildCounterPolicy = 0;
@@ -464,7 +465,7 @@
   if (buildCounterPolicy < 3) {
     checkUnnamed3633(o.admissionWhitelistPatterns);
     checkUnnamed3634(o.clusterAdmissionRules);
-    checkAdmissionRule(o.defaultAdmissionRule);
+    checkAdmissionRule(o.defaultAdmissionRule as api.AdmissionRule);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.globalPolicyEvaluationMode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -487,7 +488,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkIamPolicy(o.policy);
+    checkIamPolicy(o.policy as api.IamPolicy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -586,8 +587,8 @@
 
 void checkUnnamed3637(core.List<api.AttestorPublicKey> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttestorPublicKey(o[0]);
-  checkAttestorPublicKey(o[1]);
+  checkAttestorPublicKey(o[0] as api.AttestorPublicKey);
+  checkAttestorPublicKey(o[1] as api.AttestorPublicKey);
 }
 
 core.int buildCounterUserOwnedGrafeasNote = 0;
@@ -631,7 +632,7 @@
     api.ValidateAttestationOccurrenceRequest o) {
   buildCounterValidateAttestationOccurrenceRequest++;
   if (buildCounterValidateAttestationOccurrenceRequest < 3) {
-    checkAttestationOccurrence(o.attestation);
+    checkAttestationOccurrence(o.attestation as api.AttestationOccurrence);
     unittest.expect(o.occurrenceNote, unittest.equals('foo'));
     unittest.expect(o.occurrenceResourceUri, unittest.equals('foo'));
   }
@@ -666,7 +667,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdmissionRule();
       var od = api.AdmissionRule.fromJson(o.toJson());
-      checkAdmissionRule(od);
+      checkAdmissionRule(od as api.AdmissionRule);
     });
   });
 
@@ -674,7 +675,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdmissionWhitelistPattern();
       var od = api.AdmissionWhitelistPattern.fromJson(o.toJson());
-      checkAdmissionWhitelistPattern(od);
+      checkAdmissionWhitelistPattern(od as api.AdmissionWhitelistPattern);
     });
   });
 
@@ -682,7 +683,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttestationOccurrence();
       var od = api.AttestationOccurrence.fromJson(o.toJson());
-      checkAttestationOccurrence(od);
+      checkAttestationOccurrence(od as api.AttestationOccurrence);
     });
   });
 
@@ -690,7 +691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttestor();
       var od = api.Attestor.fromJson(o.toJson());
-      checkAttestor(od);
+      checkAttestor(od as api.Attestor);
     });
   });
 
@@ -698,7 +699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttestorPublicKey();
       var od = api.AttestorPublicKey.fromJson(o.toJson());
-      checkAttestorPublicKey(od);
+      checkAttestorPublicKey(od as api.AttestorPublicKey);
     });
   });
 
@@ -706,7 +707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -714,7 +715,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -722,7 +723,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -730,7 +731,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIamPolicy();
       var od = api.IamPolicy.fromJson(o.toJson());
-      checkIamPolicy(od);
+      checkIamPolicy(od as api.IamPolicy);
     });
   });
 
@@ -738,7 +739,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJwt();
       var od = api.Jwt.fromJson(o.toJson());
-      checkJwt(od);
+      checkJwt(od as api.Jwt);
     });
   });
 
@@ -746,7 +747,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAttestorsResponse();
       var od = api.ListAttestorsResponse.fromJson(o.toJson());
-      checkListAttestorsResponse(od);
+      checkListAttestorsResponse(od as api.ListAttestorsResponse);
     });
   });
 
@@ -754,7 +755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPkixPublicKey();
       var od = api.PkixPublicKey.fromJson(o.toJson());
-      checkPkixPublicKey(od);
+      checkPkixPublicKey(od as api.PkixPublicKey);
     });
   });
 
@@ -762,7 +763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -770,7 +771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -778,7 +779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignature();
       var od = api.Signature.fromJson(o.toJson());
-      checkSignature(od);
+      checkSignature(od as api.Signature);
     });
   });
 
@@ -786,7 +787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -794,7 +795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -802,7 +803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserOwnedGrafeasNote();
       var od = api.UserOwnedGrafeasNote.fromJson(o.toJson());
-      checkUserOwnedGrafeasNote(od);
+      checkUserOwnedGrafeasNote(od as api.UserOwnedGrafeasNote);
     });
   });
 
@@ -810,7 +811,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildValidateAttestationOccurrenceRequest();
       var od = api.ValidateAttestationOccurrenceRequest.fromJson(o.toJson());
-      checkValidateAttestationOccurrenceRequest(od);
+      checkValidateAttestationOccurrenceRequest(
+          od as api.ValidateAttestationOccurrenceRequest);
     });
   });
 
@@ -818,7 +820,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildValidateAttestationOccurrenceResponse();
       var od = api.ValidateAttestationOccurrenceResponse.fromJson(o.toJson());
-      checkValidateAttestationOccurrenceResponse(od);
+      checkValidateAttestationOccurrenceResponse(
+          od as api.ValidateAttestationOccurrenceResponse);
     });
   });
 
@@ -867,7 +870,7 @@
       res
           .getPolicy(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -878,8 +881,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Policy.fromJson(json);
-        checkPolicy(obj);
+        var obj =
+            api.Policy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPolicy(obj as api.Policy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -919,7 +923,7 @@
       res
           .updatePolicy(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
   });
@@ -933,8 +937,9 @@
       var arg_attestorId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Attestor.fromJson(json);
-        checkAttestor(obj);
+        var obj =
+            api.Attestor.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAttestor(obj as api.Attestor);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -977,7 +982,7 @@
           .create(arg_request, arg_parent,
               attestorId: arg_attestorId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAttestor(response);
+        checkAttestor(response as api.Attestor);
       })));
     });
 
@@ -1025,7 +1030,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1073,7 +1078,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAttestor(response);
+        checkAttestor(response as api.Attestor);
       })));
     });
 
@@ -1128,7 +1133,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIamPolicy(response);
+        checkIamPolicy(response as api.IamPolicy);
       })));
     });
 
@@ -1185,7 +1190,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAttestorsResponse(response);
+        checkListAttestorsResponse(response as api.ListAttestorsResponse);
       })));
     });
 
@@ -1196,8 +1201,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1237,7 +1243,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIamPolicy(response);
+        checkIamPolicy(response as api.IamPolicy);
       })));
     });
 
@@ -1248,8 +1254,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1289,7 +1296,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -1300,8 +1308,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Attestor.fromJson(json);
-        checkAttestor(obj);
+        var obj =
+            api.Attestor.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAttestor(obj as api.Attestor);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1341,7 +1350,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAttestor(response);
+        checkAttestor(response as api.Attestor);
       })));
     });
 
@@ -1352,8 +1361,10 @@
       var arg_attestor = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ValidateAttestationOccurrenceRequest.fromJson(json);
-        checkValidateAttestationOccurrenceRequest(obj);
+        var obj = api.ValidateAttestationOccurrenceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkValidateAttestationOccurrenceRequest(
+            obj as api.ValidateAttestationOccurrenceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1395,7 +1406,8 @@
           .validateAttestationOccurrence(arg_request, arg_attestor,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkValidateAttestationOccurrenceResponse(response);
+        checkValidateAttestationOccurrenceResponse(
+            response as api.ValidateAttestationOccurrenceResponse);
       })));
     });
   });
@@ -1452,7 +1464,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIamPolicy(response);
+        checkIamPolicy(response as api.IamPolicy);
       })));
     });
 
@@ -1463,8 +1475,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1504,7 +1517,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIamPolicy(response);
+        checkIamPolicy(response as api.IamPolicy);
       })));
     });
 
@@ -1515,8 +1528,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1556,7 +1570,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/blogger/v3_test.dart b/generated/googleapis/test/blogger/v3_test.dart
index 16983ab..26c222d 100644
--- a/generated/googleapis/test/blogger/v3_test.dart
+++ b/generated/googleapis/test/blogger/v3_test.dart
@@ -127,8 +127,8 @@
 
 void checkUnnamed148(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPost(o[0]);
-  checkPost(o[1]);
+  checkPost(o[0] as api.Post);
+  checkPost(o[1] as api.Post);
 }
 
 core.int buildCounterBlogPosts = 0;
@@ -184,10 +184,10 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkBlogLocale(o.locale);
+    checkBlogLocale(o.locale as api.BlogLocale);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkBlogPages(o.pages);
-    checkBlogPosts(o.posts);
+    checkBlogPages(o.pages as api.BlogPages);
+    checkBlogPosts(o.posts as api.BlogPosts);
     unittest.expect(o.published, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -206,8 +206,8 @@
 
 void checkUnnamed149(core.List<api.BlogUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBlogUserInfo(o[0]);
-  checkBlogUserInfo(o[1]);
+  checkBlogUserInfo(o[0] as api.BlogUserInfo);
+  checkBlogUserInfo(o[1] as api.BlogUserInfo);
 }
 
 core.List<api.Blog> buildUnnamed150() {
@@ -219,8 +219,8 @@
 
 void checkUnnamed150(core.List<api.Blog> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBlog(o[0]);
-  checkBlog(o[1]);
+  checkBlog(o[0] as api.Blog);
+  checkBlog(o[1] as api.Blog);
 }
 
 core.int buildCounterBlogList = 0;
@@ -291,8 +291,8 @@
 void checkBlogUserInfo(api.BlogUserInfo o) {
   buildCounterBlogUserInfo++;
   if (buildCounterBlogUserInfo < 3) {
-    checkBlog(o.blog);
-    checkBlogPerUserInfo(o.blogUserInfo);
+    checkBlog(o.blog as api.Blog);
+    checkBlogPerUserInfo(o.blogUserInfo as api.BlogPerUserInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterBlogUserInfo--;
@@ -336,7 +336,7 @@
   if (buildCounterCommentAuthor < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkCommentAuthorImage(o.image);
+    checkCommentAuthorImage(o.image as api.CommentAuthorImage);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterCommentAuthor--;
@@ -423,13 +423,13 @@
 void checkComment(api.Comment o) {
   buildCounterComment++;
   if (buildCounterComment < 3) {
-    checkCommentAuthor(o.author);
-    checkCommentBlog(o.blog);
+    checkCommentAuthor(o.author as api.CommentAuthor);
+    checkCommentBlog(o.blog as api.CommentBlog);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkCommentInReplyTo(o.inReplyTo);
+    checkCommentInReplyTo(o.inReplyTo as api.CommentInReplyTo);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkCommentPost(o.post);
+    checkCommentPost(o.post as api.CommentPost);
     unittest.expect(o.published, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -447,8 +447,8 @@
 
 void checkUnnamed151(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComment(o[0]);
-  checkComment(o[1]);
+  checkComment(o[0] as api.Comment);
+  checkComment(o[1] as api.Comment);
 }
 
 core.int buildCounterCommentList = 0;
@@ -516,7 +516,7 @@
   if (buildCounterPageAuthor < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkPageAuthorImage(o.image);
+    checkPageAuthorImage(o.image as api.PageAuthorImage);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterPageAuthor--;
@@ -566,8 +566,8 @@
 void checkPage(api.Page o) {
   buildCounterPage++;
   if (buildCounterPage < 3) {
-    checkPageAuthor(o.author);
-    checkPageBlog(o.blog);
+    checkPageAuthor(o.author as api.PageAuthor);
+    checkPageBlog(o.blog as api.PageBlog);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -591,8 +591,8 @@
 
 void checkUnnamed152(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.int buildCounterPageList = 0;
@@ -650,8 +650,8 @@
 
 void checkUnnamed153(core.List<api.PageviewsCounts> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPageviewsCounts(o[0]);
-  checkPageviewsCounts(o[1]);
+  checkPageviewsCounts(o[0] as api.PageviewsCounts);
+  checkPageviewsCounts(o[1] as api.PageviewsCounts);
 }
 
 core.int buildCounterPageviews = 0;
@@ -715,7 +715,7 @@
   if (buildCounterPostAuthor < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkPostAuthorImage(o.image);
+    checkPostAuthorImage(o.image as api.PostAuthorImage);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterPostAuthor--;
@@ -768,8 +768,8 @@
 
 void checkUnnamed154(core.List<api.PostImages> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPostImages(o[0]);
-  checkPostImages(o[1]);
+  checkPostImages(o[0] as api.PostImages);
+  checkPostImages(o[1] as api.PostImages);
 }
 
 core.List<core.String> buildUnnamed155() {
@@ -819,8 +819,8 @@
 
 void checkUnnamed156(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComment(o[0]);
-  checkComment(o[1]);
+  checkComment(o[0] as api.Comment);
+  checkComment(o[1] as api.Comment);
 }
 
 core.int buildCounterPostReplies = 0;
@@ -878,8 +878,8 @@
 void checkPost(api.Post o) {
   buildCounterPost++;
   if (buildCounterPost < 3) {
-    checkPostAuthor(o.author);
-    checkPostBlog(o.blog);
+    checkPostAuthor(o.author as api.PostAuthor);
+    checkPostBlog(o.blog as api.PostBlog);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.customMetaData, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
@@ -887,10 +887,10 @@
     checkUnnamed154(o.images);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed155(o.labels);
-    checkPostLocation(o.location);
+    checkPostLocation(o.location as api.PostLocation);
     unittest.expect(o.published, unittest.equals('foo'));
     unittest.expect(o.readerComments, unittest.equals('foo'));
-    checkPostReplies(o.replies);
+    checkPostReplies(o.replies as api.PostReplies);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -910,8 +910,8 @@
 
 void checkUnnamed157(core.List<api.Post> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPost(o[0]);
-  checkPost(o[1]);
+  checkPost(o[0] as api.Post);
+  checkPost(o[1] as api.Post);
 }
 
 core.int buildCounterPostList = 0;
@@ -985,8 +985,8 @@
   buildCounterPostUserInfo++;
   if (buildCounterPostUserInfo < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPost(o.post);
-    checkPostPerUserInfo(o.postUserInfo);
+    checkPost(o.post as api.Post);
+    checkPostPerUserInfo(o.postUserInfo as api.PostPerUserInfo);
   }
   buildCounterPostUserInfo--;
 }
@@ -1000,8 +1000,8 @@
 
 void checkUnnamed158(core.List<api.PostUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPostUserInfo(o[0]);
-  checkPostUserInfo(o[1]);
+  checkPostUserInfo(o[0] as api.PostUserInfo);
+  checkPostUserInfo(o[1] as api.PostUserInfo);
 }
 
 core.int buildCounterPostUserInfosList = 0;
@@ -1092,12 +1092,12 @@
   buildCounterUser++;
   if (buildCounterUser < 3) {
     unittest.expect(o.about, unittest.equals('foo'));
-    checkUserBlogs(o.blogs);
+    checkUserBlogs(o.blogs as api.UserBlogs);
     unittest.expect(o.created, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUserLocale(o.locale);
+    checkUserLocale(o.locale as api.UserLocale);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
   }
@@ -1200,7 +1200,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlogLocale();
       var od = api.BlogLocale.fromJson(o.toJson());
-      checkBlogLocale(od);
+      checkBlogLocale(od as api.BlogLocale);
     });
   });
 
@@ -1208,7 +1208,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlogPages();
       var od = api.BlogPages.fromJson(o.toJson());
-      checkBlogPages(od);
+      checkBlogPages(od as api.BlogPages);
     });
   });
 
@@ -1216,7 +1216,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlogPosts();
       var od = api.BlogPosts.fromJson(o.toJson());
-      checkBlogPosts(od);
+      checkBlogPosts(od as api.BlogPosts);
     });
   });
 
@@ -1224,7 +1224,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlog();
       var od = api.Blog.fromJson(o.toJson());
-      checkBlog(od);
+      checkBlog(od as api.Blog);
     });
   });
 
@@ -1232,7 +1232,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlogList();
       var od = api.BlogList.fromJson(o.toJson());
-      checkBlogList(od);
+      checkBlogList(od as api.BlogList);
     });
   });
 
@@ -1240,7 +1240,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlogPerUserInfo();
       var od = api.BlogPerUserInfo.fromJson(o.toJson());
-      checkBlogPerUserInfo(od);
+      checkBlogPerUserInfo(od as api.BlogPerUserInfo);
     });
   });
 
@@ -1248,7 +1248,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlogUserInfo();
       var od = api.BlogUserInfo.fromJson(o.toJson());
-      checkBlogUserInfo(od);
+      checkBlogUserInfo(od as api.BlogUserInfo);
     });
   });
 
@@ -1256,7 +1256,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentAuthorImage();
       var od = api.CommentAuthorImage.fromJson(o.toJson());
-      checkCommentAuthorImage(od);
+      checkCommentAuthorImage(od as api.CommentAuthorImage);
     });
   });
 
@@ -1264,7 +1264,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentAuthor();
       var od = api.CommentAuthor.fromJson(o.toJson());
-      checkCommentAuthor(od);
+      checkCommentAuthor(od as api.CommentAuthor);
     });
   });
 
@@ -1272,7 +1272,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentBlog();
       var od = api.CommentBlog.fromJson(o.toJson());
-      checkCommentBlog(od);
+      checkCommentBlog(od as api.CommentBlog);
     });
   });
 
@@ -1280,7 +1280,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentInReplyTo();
       var od = api.CommentInReplyTo.fromJson(o.toJson());
-      checkCommentInReplyTo(od);
+      checkCommentInReplyTo(od as api.CommentInReplyTo);
     });
   });
 
@@ -1288,7 +1288,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentPost();
       var od = api.CommentPost.fromJson(o.toJson());
-      checkCommentPost(od);
+      checkCommentPost(od as api.CommentPost);
     });
   });
 
@@ -1296,7 +1296,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComment();
       var od = api.Comment.fromJson(o.toJson());
-      checkComment(od);
+      checkComment(od as api.Comment);
     });
   });
 
@@ -1304,7 +1304,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentList();
       var od = api.CommentList.fromJson(o.toJson());
-      checkCommentList(od);
+      checkCommentList(od as api.CommentList);
     });
   });
 
@@ -1312,7 +1312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageAuthorImage();
       var od = api.PageAuthorImage.fromJson(o.toJson());
-      checkPageAuthorImage(od);
+      checkPageAuthorImage(od as api.PageAuthorImage);
     });
   });
 
@@ -1320,7 +1320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageAuthor();
       var od = api.PageAuthor.fromJson(o.toJson());
-      checkPageAuthor(od);
+      checkPageAuthor(od as api.PageAuthor);
     });
   });
 
@@ -1328,7 +1328,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageBlog();
       var od = api.PageBlog.fromJson(o.toJson());
-      checkPageBlog(od);
+      checkPageBlog(od as api.PageBlog);
     });
   });
 
@@ -1336,7 +1336,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPage();
       var od = api.Page.fromJson(o.toJson());
-      checkPage(od);
+      checkPage(od as api.Page);
     });
   });
 
@@ -1344,7 +1344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageList();
       var od = api.PageList.fromJson(o.toJson());
-      checkPageList(od);
+      checkPageList(od as api.PageList);
     });
   });
 
@@ -1352,7 +1352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageviewsCounts();
       var od = api.PageviewsCounts.fromJson(o.toJson());
-      checkPageviewsCounts(od);
+      checkPageviewsCounts(od as api.PageviewsCounts);
     });
   });
 
@@ -1360,7 +1360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageviews();
       var od = api.Pageviews.fromJson(o.toJson());
-      checkPageviews(od);
+      checkPageviews(od as api.Pageviews);
     });
   });
 
@@ -1368,7 +1368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostAuthorImage();
       var od = api.PostAuthorImage.fromJson(o.toJson());
-      checkPostAuthorImage(od);
+      checkPostAuthorImage(od as api.PostAuthorImage);
     });
   });
 
@@ -1376,7 +1376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostAuthor();
       var od = api.PostAuthor.fromJson(o.toJson());
-      checkPostAuthor(od);
+      checkPostAuthor(od as api.PostAuthor);
     });
   });
 
@@ -1384,7 +1384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostBlog();
       var od = api.PostBlog.fromJson(o.toJson());
-      checkPostBlog(od);
+      checkPostBlog(od as api.PostBlog);
     });
   });
 
@@ -1392,7 +1392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostImages();
       var od = api.PostImages.fromJson(o.toJson());
-      checkPostImages(od);
+      checkPostImages(od as api.PostImages);
     });
   });
 
@@ -1400,7 +1400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostLocation();
       var od = api.PostLocation.fromJson(o.toJson());
-      checkPostLocation(od);
+      checkPostLocation(od as api.PostLocation);
     });
   });
 
@@ -1408,7 +1408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostReplies();
       var od = api.PostReplies.fromJson(o.toJson());
-      checkPostReplies(od);
+      checkPostReplies(od as api.PostReplies);
     });
   });
 
@@ -1416,7 +1416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPost();
       var od = api.Post.fromJson(o.toJson());
-      checkPost(od);
+      checkPost(od as api.Post);
     });
   });
 
@@ -1424,7 +1424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostList();
       var od = api.PostList.fromJson(o.toJson());
-      checkPostList(od);
+      checkPostList(od as api.PostList);
     });
   });
 
@@ -1432,7 +1432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostPerUserInfo();
       var od = api.PostPerUserInfo.fromJson(o.toJson());
-      checkPostPerUserInfo(od);
+      checkPostPerUserInfo(od as api.PostPerUserInfo);
     });
   });
 
@@ -1440,7 +1440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostUserInfo();
       var od = api.PostUserInfo.fromJson(o.toJson());
-      checkPostUserInfo(od);
+      checkPostUserInfo(od as api.PostUserInfo);
     });
   });
 
@@ -1448,7 +1448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostUserInfosList();
       var od = api.PostUserInfosList.fromJson(o.toJson());
-      checkPostUserInfosList(od);
+      checkPostUserInfosList(od as api.PostUserInfosList);
     });
   });
 
@@ -1456,7 +1456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserBlogs();
       var od = api.UserBlogs.fromJson(o.toJson());
-      checkUserBlogs(od);
+      checkUserBlogs(od as api.UserBlogs);
     });
   });
 
@@ -1464,7 +1464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserLocale();
       var od = api.UserLocale.fromJson(o.toJson());
-      checkUserLocale(od);
+      checkUserLocale(od as api.UserLocale);
     });
   });
 
@@ -1472,7 +1472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -1537,7 +1537,7 @@
           .get(arg_userId, arg_blogId,
               maxPosts: arg_maxPosts, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBlogUserInfo(response);
+        checkBlogUserInfo(response as api.BlogUserInfo);
       })));
     });
   });
@@ -1595,7 +1595,7 @@
           .get(arg_blogId,
               maxPosts: arg_maxPosts, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBlog(response);
+        checkBlog(response as api.Blog);
       })));
     });
 
@@ -1645,7 +1645,7 @@
       res
           .getByUrl(arg_url, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBlog(response);
+        checkBlog(response as api.Blog);
       })));
     });
 
@@ -1715,7 +1715,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBlogList(response);
+        checkBlogList(response as api.BlogList);
       })));
     });
   });
@@ -1793,7 +1793,7 @@
       res
           .approve(arg_blogId, arg_postId, arg_commentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -1934,7 +1934,7 @@
           .get(arg_blogId, arg_postId, arg_commentId,
               view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -2027,7 +2027,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentList(response);
+        checkCommentList(response as api.CommentList);
       })));
     });
 
@@ -2107,7 +2107,7 @@
               status: arg_status,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentList(response);
+        checkCommentList(response as api.CommentList);
       })));
     });
 
@@ -2184,7 +2184,7 @@
           .markAsSpam(arg_blogId, arg_postId, arg_commentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -2261,7 +2261,7 @@
           .removeContent(arg_blogId, arg_postId, arg_commentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
   });
@@ -2321,7 +2321,7 @@
       res
           .get(arg_blogId, range: arg_range, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPageviews(response);
+        checkPageviews(response as api.Pageviews);
       })));
     });
   });
@@ -2443,7 +2443,7 @@
       res
           .get(arg_blogId, arg_pageId, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPage(response);
+        checkPage(response as api.Page);
       })));
     });
 
@@ -2455,8 +2455,9 @@
       var arg_isDraft = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Page.fromJson(json);
-        checkPage(obj);
+        var obj =
+            api.Page.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPage(obj as api.Page);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2507,7 +2508,7 @@
           .insert(arg_request, arg_blogId,
               isDraft: arg_isDraft, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPage(response);
+        checkPage(response as api.Page);
       })));
     });
 
@@ -2582,7 +2583,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPageList(response);
+        checkPageList(response as api.PageList);
       })));
     });
 
@@ -2596,8 +2597,9 @@
       var arg_revert_1 = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Page.fromJson(json);
-        checkPage(obj);
+        var obj =
+            api.Page.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPage(obj as api.Page);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2655,7 +2657,7 @@
               revert_1: arg_revert_1,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPage(response);
+        checkPage(response as api.Page);
       })));
     });
 
@@ -2721,7 +2723,7 @@
       res
           .publish(arg_blogId, arg_pageId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPage(response);
+        checkPage(response as api.Page);
       })));
     });
 
@@ -2787,7 +2789,7 @@
       res
           .revert(arg_blogId, arg_pageId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPage(response);
+        checkPage(response as api.Page);
       })));
     });
 
@@ -2801,8 +2803,9 @@
       var arg_revert_1 = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Page.fromJson(json);
-        checkPage(obj);
+        var obj =
+            api.Page.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPage(obj as api.Page);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2860,7 +2863,7 @@
               revert_1: arg_revert_1,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPage(response);
+        checkPage(response as api.Page);
       })));
     });
   });
@@ -2936,7 +2939,7 @@
           .get(arg_userId, arg_blogId, arg_postId,
               maxComments: arg_maxComments, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPostUserInfo(response);
+        checkPostUserInfo(response as api.PostUserInfo);
       })));
     });
 
@@ -3036,7 +3039,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPostUserInfosList(response);
+        checkPostUserInfosList(response as api.PostUserInfosList);
       })));
     });
   });
@@ -3172,7 +3175,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPost(response);
+        checkPost(response as api.Post);
       })));
     });
 
@@ -3238,7 +3241,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPost(response);
+        checkPost(response as api.Post);
       })));
     });
 
@@ -3252,8 +3255,9 @@
       var arg_isDraft = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Post.fromJson(json);
-        checkPost(obj);
+        var obj =
+            api.Post.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPost(obj as api.Post);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3311,7 +3315,7 @@
               isDraft: arg_isDraft,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPost(response);
+        checkPost(response as api.Post);
       })));
     });
 
@@ -3405,7 +3409,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPostList(response);
+        checkPostList(response as api.PostList);
       })));
     });
 
@@ -3422,8 +3426,9 @@
       var arg_revert_1 = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Post.fromJson(json);
-        checkPost(obj);
+        var obj =
+            api.Post.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPost(obj as api.Post);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3490,7 +3495,7 @@
               revert_1: arg_revert_1,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPost(response);
+        checkPost(response as api.Post);
       })));
     });
 
@@ -3560,7 +3565,7 @@
           .publish(arg_blogId, arg_postId,
               publishDate: arg_publishDate, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPost(response);
+        checkPost(response as api.Post);
       })));
     });
 
@@ -3626,7 +3631,7 @@
       res
           .revert(arg_blogId, arg_postId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPost(response);
+        checkPost(response as api.Post);
       })));
     });
 
@@ -3693,7 +3698,7 @@
               orderBy: arg_orderBy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPostList(response);
+        checkPostList(response as api.PostList);
       })));
     });
 
@@ -3710,8 +3715,9 @@
       var arg_revert_1 = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Post.fromJson(json);
-        checkPost(obj);
+        var obj =
+            api.Post.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPost(obj as api.Post);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3778,7 +3784,7 @@
               revert_1: arg_revert_1,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPost(response);
+        checkPost(response as api.Post);
       })));
     });
   });
@@ -3830,7 +3836,7 @@
       res
           .get(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
   });
diff --git a/generated/googleapis/test/books/v1_test.dart b/generated/googleapis/test/books/v1_test.dart
index 8395db6..9a8ca3c 100644
--- a/generated/googleapis/test/books/v1_test.dart
+++ b/generated/googleapis/test/books/v1_test.dart
@@ -92,11 +92,11 @@
 void checkAnnotationClientVersionRanges(api.AnnotationClientVersionRanges o) {
   buildCounterAnnotationClientVersionRanges++;
   if (buildCounterAnnotationClientVersionRanges < 3) {
-    checkBooksAnnotationsRange(o.cfiRange);
+    checkBooksAnnotationsRange(o.cfiRange as api.BooksAnnotationsRange);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
-    checkBooksAnnotationsRange(o.gbImageRange);
-    checkBooksAnnotationsRange(o.gbTextRange);
-    checkBooksAnnotationsRange(o.imageCfiRange);
+    checkBooksAnnotationsRange(o.gbImageRange as api.BooksAnnotationsRange);
+    checkBooksAnnotationsRange(o.gbTextRange as api.BooksAnnotationsRange);
+    checkBooksAnnotationsRange(o.imageCfiRange as api.BooksAnnotationsRange);
   }
   buildCounterAnnotationClientVersionRanges--;
 }
@@ -119,11 +119,11 @@
 void checkAnnotationCurrentVersionRanges(api.AnnotationCurrentVersionRanges o) {
   buildCounterAnnotationCurrentVersionRanges++;
   if (buildCounterAnnotationCurrentVersionRanges < 3) {
-    checkBooksAnnotationsRange(o.cfiRange);
+    checkBooksAnnotationsRange(o.cfiRange as api.BooksAnnotationsRange);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
-    checkBooksAnnotationsRange(o.gbImageRange);
-    checkBooksAnnotationsRange(o.gbTextRange);
-    checkBooksAnnotationsRange(o.imageCfiRange);
+    checkBooksAnnotationsRange(o.gbImageRange as api.BooksAnnotationsRange);
+    checkBooksAnnotationsRange(o.gbTextRange as api.BooksAnnotationsRange);
+    checkBooksAnnotationsRange(o.imageCfiRange as api.BooksAnnotationsRange);
   }
   buildCounterAnnotationCurrentVersionRanges--;
 }
@@ -196,16 +196,18 @@
   if (buildCounterAnnotation < 3) {
     unittest.expect(o.afterSelectedText, unittest.equals('foo'));
     unittest.expect(o.beforeSelectedText, unittest.equals('foo'));
-    checkAnnotationClientVersionRanges(o.clientVersionRanges);
+    checkAnnotationClientVersionRanges(
+        o.clientVersionRanges as api.AnnotationClientVersionRanges);
     unittest.expect(o.created, unittest.equals('foo'));
-    checkAnnotationCurrentVersionRanges(o.currentVersionRanges);
+    checkAnnotationCurrentVersionRanges(
+        o.currentVersionRanges as api.AnnotationCurrentVersionRanges);
     unittest.expect(o.data, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.highlightStyle, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.layerId, unittest.equals('foo'));
-    checkAnnotationLayerSummary(o.layerSummary);
+    checkAnnotationLayerSummary(o.layerSummary as api.AnnotationLayerSummary);
     checkUnnamed5791(o.pageIds);
     unittest.expect(o.selectedText, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -224,8 +226,8 @@
 
 void checkUnnamed5792(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotation(o[0]);
-  checkAnnotation(o[1]);
+  checkAnnotation(o[0] as api.Annotation);
+  checkAnnotation(o[1] as api.Annotation);
 }
 
 core.int buildCounterAnnotations = 0;
@@ -289,8 +291,8 @@
 
 void checkUnnamed5793(core.List<api.AnnotationsSummaryLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotationsSummaryLayers(o[0]);
-  checkAnnotationsSummaryLayers(o[1]);
+  checkAnnotationsSummaryLayers(o[0] as api.AnnotationsSummaryLayers);
+  checkAnnotationsSummaryLayers(o[1] as api.AnnotationsSummaryLayers);
 }
 
 core.int buildCounterAnnotationsSummary = 0;
@@ -323,8 +325,8 @@
 
 void checkUnnamed5794(core.List<api.GeoAnnotationdata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGeoAnnotationdata(o[0]);
-  checkGeoAnnotationdata(o[1]);
+  checkGeoAnnotationdata(o[0] as api.GeoAnnotationdata);
+  checkGeoAnnotationdata(o[1] as api.GeoAnnotationdata);
 }
 
 core.int buildCounterAnnotationsdata = 0;
@@ -469,8 +471,8 @@
 
 void checkUnnamed5795(core.List<api.Bookshelf> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBookshelf(o[0]);
-  checkBookshelf(o[1]);
+  checkBookshelf(o[0] as api.Bookshelf);
+  checkBookshelf(o[1] as api.Bookshelf);
 }
 
 core.int buildCounterBookshelves = 0;
@@ -526,8 +528,8 @@
 
 void checkUnnamed5796(core.List<api.CategoryItems> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCategoryItems(o[0]);
-  checkCategoryItems(o[1]);
+  checkCategoryItems(o[0] as api.CategoryItems);
+  checkCategoryItems(o[1] as api.CategoryItems);
 }
 
 core.int buildCounterCategory = 0;
@@ -613,7 +615,7 @@
   buildCounterDictionaryAnnotationdata++;
   if (buildCounterDictionaryAnnotationdata < 3) {
     unittest.expect(o.annotationType, unittest.equals('foo'));
-    checkDictlayerdata(o.data);
+    checkDictlayerdata(o.data as api.Dictlayerdata);
     unittest.expect(o.encodedData, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -704,7 +706,8 @@
     api.DictlayerdataDictWordsDerivatives o) {
   buildCounterDictlayerdataDictWordsDerivatives++;
   if (buildCounterDictlayerdataDictWordsDerivatives < 3) {
-    checkDictlayerdataDictWordsDerivativesSource(o.source);
+    checkDictlayerdataDictWordsDerivativesSource(
+        o.source as api.DictlayerdataDictWordsDerivativesSource);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterDictlayerdataDictWordsDerivatives--;
@@ -719,8 +722,10 @@
 
 void checkUnnamed5797(core.List<api.DictlayerdataDictWordsDerivatives> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWordsDerivatives(o[0]);
-  checkDictlayerdataDictWordsDerivatives(o[1]);
+  checkDictlayerdataDictWordsDerivatives(
+      o[0] as api.DictlayerdataDictWordsDerivatives);
+  checkDictlayerdataDictWordsDerivatives(
+      o[1] as api.DictlayerdataDictWordsDerivatives);
 }
 
 core.int buildCounterDictlayerdataDictWordsExamplesSource = 0;
@@ -761,7 +766,8 @@
 void checkDictlayerdataDictWordsExamples(api.DictlayerdataDictWordsExamples o) {
   buildCounterDictlayerdataDictWordsExamples++;
   if (buildCounterDictlayerdataDictWordsExamples < 3) {
-    checkDictlayerdataDictWordsExamplesSource(o.source);
+    checkDictlayerdataDictWordsExamplesSource(
+        o.source as api.DictlayerdataDictWordsExamplesSource);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterDictlayerdataDictWordsExamples--;
@@ -776,8 +782,10 @@
 
 void checkUnnamed5798(core.List<api.DictlayerdataDictWordsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWordsExamples(o[0]);
-  checkDictlayerdataDictWordsExamples(o[1]);
+  checkDictlayerdataDictWordsExamples(
+      o[0] as api.DictlayerdataDictWordsExamples);
+  checkDictlayerdataDictWordsExamples(
+      o[1] as api.DictlayerdataDictWordsExamples);
 }
 
 core.int buildCounterDictlayerdataDictWordsSensesConjugations = 0;
@@ -813,8 +821,10 @@
 void checkUnnamed5799(
     core.List<api.DictlayerdataDictWordsSensesConjugations> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWordsSensesConjugations(o[0]);
-  checkDictlayerdataDictWordsSensesConjugations(o[1]);
+  checkDictlayerdataDictWordsSensesConjugations(
+      o[0] as api.DictlayerdataDictWordsSensesConjugations);
+  checkDictlayerdataDictWordsSensesConjugations(
+      o[1] as api.DictlayerdataDictWordsSensesConjugations);
 }
 
 core.int buildCounterDictlayerdataDictWordsSensesDefinitionsExamplesSource = 0;
@@ -857,7 +867,8 @@
     api.DictlayerdataDictWordsSensesDefinitionsExamples o) {
   buildCounterDictlayerdataDictWordsSensesDefinitionsExamples++;
   if (buildCounterDictlayerdataDictWordsSensesDefinitionsExamples < 3) {
-    checkDictlayerdataDictWordsSensesDefinitionsExamplesSource(o.source);
+    checkDictlayerdataDictWordsSensesDefinitionsExamplesSource(
+        o.source as api.DictlayerdataDictWordsSensesDefinitionsExamplesSource);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterDictlayerdataDictWordsSensesDefinitionsExamples--;
@@ -874,8 +885,10 @@
 void checkUnnamed5800(
     core.List<api.DictlayerdataDictWordsSensesDefinitionsExamples> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWordsSensesDefinitionsExamples(o[0]);
-  checkDictlayerdataDictWordsSensesDefinitionsExamples(o[1]);
+  checkDictlayerdataDictWordsSensesDefinitionsExamples(
+      o[0] as api.DictlayerdataDictWordsSensesDefinitionsExamples);
+  checkDictlayerdataDictWordsSensesDefinitionsExamples(
+      o[1] as api.DictlayerdataDictWordsSensesDefinitionsExamples);
 }
 
 core.int buildCounterDictlayerdataDictWordsSensesDefinitions = 0;
@@ -911,8 +924,10 @@
 void checkUnnamed5801(
     core.List<api.DictlayerdataDictWordsSensesDefinitions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWordsSensesDefinitions(o[0]);
-  checkDictlayerdataDictWordsSensesDefinitions(o[1]);
+  checkDictlayerdataDictWordsSensesDefinitions(
+      o[0] as api.DictlayerdataDictWordsSensesDefinitions);
+  checkDictlayerdataDictWordsSensesDefinitions(
+      o[1] as api.DictlayerdataDictWordsSensesDefinitions);
 }
 
 core.int buildCounterDictlayerdataDictWordsSensesSource = 0;
@@ -978,7 +993,8 @@
     api.DictlayerdataDictWordsSensesSynonyms o) {
   buildCounterDictlayerdataDictWordsSensesSynonyms++;
   if (buildCounterDictlayerdataDictWordsSensesSynonyms < 3) {
-    checkDictlayerdataDictWordsSensesSynonymsSource(o.source);
+    checkDictlayerdataDictWordsSensesSynonymsSource(
+        o.source as api.DictlayerdataDictWordsSensesSynonymsSource);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterDictlayerdataDictWordsSensesSynonyms--;
@@ -993,8 +1009,10 @@
 
 void checkUnnamed5802(core.List<api.DictlayerdataDictWordsSensesSynonyms> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWordsSensesSynonyms(o[0]);
-  checkDictlayerdataDictWordsSensesSynonyms(o[1]);
+  checkDictlayerdataDictWordsSensesSynonyms(
+      o[0] as api.DictlayerdataDictWordsSensesSynonyms);
+  checkDictlayerdataDictWordsSensesSynonyms(
+      o[1] as api.DictlayerdataDictWordsSensesSynonyms);
 }
 
 core.int buildCounterDictlayerdataDictWordsSenses = 0;
@@ -1023,7 +1041,8 @@
     unittest.expect(o.partOfSpeech, unittest.equals('foo'));
     unittest.expect(o.pronunciation, unittest.equals('foo'));
     unittest.expect(o.pronunciationUrl, unittest.equals('foo'));
-    checkDictlayerdataDictWordsSensesSource(o.source);
+    checkDictlayerdataDictWordsSensesSource(
+        o.source as api.DictlayerdataDictWordsSensesSource);
     unittest.expect(o.syllabification, unittest.equals('foo'));
     checkUnnamed5802(o.synonyms);
   }
@@ -1039,8 +1058,8 @@
 
 void checkUnnamed5803(core.List<api.DictlayerdataDictWordsSenses> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWordsSenses(o[0]);
-  checkDictlayerdataDictWordsSenses(o[1]);
+  checkDictlayerdataDictWordsSenses(o[0] as api.DictlayerdataDictWordsSenses);
+  checkDictlayerdataDictWordsSenses(o[1] as api.DictlayerdataDictWordsSenses);
 }
 
 core.int buildCounterDictlayerdataDictWordsSource = 0;
@@ -1084,7 +1103,8 @@
     checkUnnamed5797(o.derivatives);
     checkUnnamed5798(o.examples);
     checkUnnamed5803(o.senses);
-    checkDictlayerdataDictWordsSource(o.source);
+    checkDictlayerdataDictWordsSource(
+        o.source as api.DictlayerdataDictWordsSource);
   }
   buildCounterDictlayerdataDictWords--;
 }
@@ -1098,8 +1118,8 @@
 
 void checkUnnamed5804(core.List<api.DictlayerdataDictWords> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDictlayerdataDictWords(o[0]);
-  checkDictlayerdataDictWords(o[1]);
+  checkDictlayerdataDictWords(o[0] as api.DictlayerdataDictWords);
+  checkDictlayerdataDictWords(o[1] as api.DictlayerdataDictWords);
 }
 
 core.int buildCounterDictlayerdataDict = 0;
@@ -1117,7 +1137,7 @@
 void checkDictlayerdataDict(api.DictlayerdataDict o) {
   buildCounterDictlayerdataDict++;
   if (buildCounterDictlayerdataDict < 3) {
-    checkDictlayerdataDictSource(o.source);
+    checkDictlayerdataDictSource(o.source as api.DictlayerdataDictSource);
     checkUnnamed5804(o.words);
   }
   buildCounterDictlayerdataDict--;
@@ -1139,8 +1159,8 @@
 void checkDictlayerdata(api.Dictlayerdata o) {
   buildCounterDictlayerdata++;
   if (buildCounterDictlayerdata < 3) {
-    checkDictlayerdataCommon(o.common);
-    checkDictlayerdataDict(o.dict);
+    checkDictlayerdataCommon(o.common as api.DictlayerdataCommon);
+    checkDictlayerdataDict(o.dict as api.DictlayerdataDict);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterDictlayerdata--;
@@ -1186,8 +1206,8 @@
 
 void checkUnnamed5805(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.int buildCounterDiscoveryclustersClusters = 0;
@@ -1211,7 +1231,8 @@
   buildCounterDiscoveryclustersClusters++;
   if (buildCounterDiscoveryclustersClusters < 3) {
     checkDiscoveryclustersClustersBannerWithContentContainer(
-        o.bannerWithContentContainer);
+        o.bannerWithContentContainer
+            as api.DiscoveryclustersClustersBannerWithContentContainer);
     unittest.expect(o.subTitle, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.totalVolumes, unittest.equals(42));
@@ -1230,8 +1251,8 @@
 
 void checkUnnamed5806(core.List<api.DiscoveryclustersClusters> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiscoveryclustersClusters(o[0]);
-  checkDiscoveryclustersClusters(o[1]);
+  checkDiscoveryclustersClusters(o[0] as api.DiscoveryclustersClusters);
+  checkDiscoveryclustersClusters(o[1] as api.DiscoveryclustersClusters);
 }
 
 core.int buildCounterDiscoveryclusters = 0;
@@ -1307,8 +1328,8 @@
 
 void checkUnnamed5807(core.List<api.DownloadAccessRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDownloadAccessRestriction(o[0]);
-  checkDownloadAccessRestriction(o[1]);
+  checkDownloadAccessRestriction(o[0] as api.DownloadAccessRestriction);
+  checkDownloadAccessRestriction(o[1] as api.DownloadAccessRestriction);
 }
 
 core.int buildCounterDownloadAccesses = 0;
@@ -1390,7 +1411,7 @@
   buildCounterFamilyInfo++;
   if (buildCounterFamilyInfo < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkFamilyInfoMembership(o.membership);
+    checkFamilyInfoMembership(o.membership as api.FamilyInfoMembership);
   }
   buildCounterFamilyInfo--;
 }
@@ -1418,7 +1439,7 @@
   buildCounterGeoAnnotationdata++;
   if (buildCounterGeoAnnotationdata < 3) {
     unittest.expect(o.annotationType, unittest.equals('foo'));
-    checkGeolayerdata(o.data);
+    checkGeolayerdata(o.data as api.Geolayerdata);
     unittest.expect(o.encodedData, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -1527,8 +1548,8 @@
 void checkGeolayerdataGeoViewport(api.GeolayerdataGeoViewport o) {
   buildCounterGeolayerdataGeoViewport++;
   if (buildCounterGeolayerdataGeoViewport < 3) {
-    checkGeolayerdataGeoViewportHi(o.hi);
-    checkGeolayerdataGeoViewportLo(o.lo);
+    checkGeolayerdataGeoViewportHi(o.hi as api.GeolayerdataGeoViewportHi);
+    checkGeolayerdataGeoViewportLo(o.lo as api.GeolayerdataGeoViewportLo);
   }
   buildCounterGeolayerdataGeoViewport--;
 }
@@ -1560,7 +1581,7 @@
     unittest.expect(o.latitude, unittest.equals(42.0));
     unittest.expect(o.longitude, unittest.equals(42.0));
     unittest.expect(o.mapType, unittest.equals('foo'));
-    checkGeolayerdataGeoViewport(o.viewport);
+    checkGeolayerdataGeoViewport(o.viewport as api.GeolayerdataGeoViewport);
     unittest.expect(o.zoom, unittest.equals(42));
   }
   buildCounterGeolayerdataGeo--;
@@ -1582,8 +1603,8 @@
 void checkGeolayerdata(api.Geolayerdata o) {
   buildCounterGeolayerdata++;
   if (buildCounterGeolayerdata < 3) {
-    checkGeolayerdataCommon(o.common);
-    checkGeolayerdataGeo(o.geo);
+    checkGeolayerdataCommon(o.common as api.GeolayerdataCommon);
+    checkGeolayerdataGeo(o.geo as api.GeolayerdataGeo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterGeolayerdata--;
@@ -1598,8 +1619,8 @@
 
 void checkUnnamed5809(core.List<api.Layersummary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLayersummary(o[0]);
-  checkLayersummary(o[1]);
+  checkLayersummary(o[0] as api.Layersummary);
+  checkLayersummary(o[1] as api.Layersummary);
 }
 
 core.int buildCounterLayersummaries = 0;
@@ -1717,8 +1738,8 @@
 
 void checkUnnamed5811(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetadataItems(o[0]);
-  checkMetadataItems(o[1]);
+  checkMetadataItems(o[0] as api.MetadataItems);
+  checkMetadataItems(o[1] as api.MetadataItems);
 }
 
 core.int buildCounterMetadata = 0;
@@ -1842,8 +1863,8 @@
 
 void checkUnnamed5813(core.List<api.OffersItemsItems> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOffersItemsItems(o[0]);
-  checkOffersItemsItems(o[1]);
+  checkOffersItemsItems(o[0] as api.OffersItemsItems);
+  checkOffersItemsItems(o[1] as api.OffersItemsItems);
 }
 
 core.int buildCounterOffersItems = 0;
@@ -1880,8 +1901,8 @@
 
 void checkUnnamed5814(core.List<api.OffersItems> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOffersItems(o[0]);
-  checkOffersItems(o[1]);
+  checkOffersItems(o[0] as api.OffersItems);
+  checkOffersItems(o[1] as api.OffersItems);
 }
 
 core.int buildCounterOffers = 0;
@@ -1952,8 +1973,10 @@
 void checkRequestAccessData(api.RequestAccessData o) {
   buildCounterRequestAccessData++;
   if (buildCounterRequestAccessData < 3) {
-    checkConcurrentAccessRestriction(o.concurrentAccess);
-    checkDownloadAccessRestriction(o.downloadAccess);
+    checkConcurrentAccessRestriction(
+        o.concurrentAccess as api.ConcurrentAccessRestriction);
+    checkDownloadAccessRestriction(
+        o.downloadAccess as api.DownloadAccessRestriction);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterRequestAccessData--;
@@ -2024,13 +2047,13 @@
 void checkReview(api.Review o) {
   buildCounterReview++;
   if (buildCounterReview < 3) {
-    checkReviewAuthor(o.author);
+    checkReviewAuthor(o.author as api.ReviewAuthor);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.date, unittest.equals('foo'));
     unittest.expect(o.fullTextUrl, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.rating, unittest.equals('foo'));
-    checkReviewSource(o.source);
+    checkReviewSource(o.source as api.ReviewSource);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.volumeId, unittest.equals('foo'));
@@ -2121,9 +2144,11 @@
   if (buildCounterSeriesSeriesSeriesSubscriptionReleaseInfo < 3) {
     unittest.expect(o.cancelTime, unittest.equals('foo'));
     checkSeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo(
-        o.currentReleaseInfo);
+        o.currentReleaseInfo
+            as api.SeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo);
     checkSeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo(
-        o.nextReleaseInfo);
+        o.nextReleaseInfo
+            as api.SeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo);
     unittest.expect(o.seriesSubscriptionType, unittest.equals('foo'));
   }
   buildCounterSeriesSeriesSeriesSubscriptionReleaseInfo--;
@@ -2160,7 +2185,8 @@
     unittest.expect(o.seriesFormatType, unittest.equals('foo'));
     unittest.expect(o.seriesId, unittest.equals('foo'));
     checkSeriesSeriesSeriesSubscriptionReleaseInfo(
-        o.seriesSubscriptionReleaseInfo);
+        o.seriesSubscriptionReleaseInfo
+            as api.SeriesSeriesSeriesSubscriptionReleaseInfo);
     unittest.expect(o.seriesType, unittest.equals('foo'));
     unittest.expect(o.subscriptionId, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -2177,8 +2203,8 @@
 
 void checkUnnamed5815(core.List<api.SeriesSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSeriesSeries(o[0]);
-  checkSeriesSeries(o[1]);
+  checkSeriesSeries(o[0] as api.SeriesSeries);
+  checkSeriesSeries(o[1] as api.SeriesSeries);
 }
 
 core.int buildCounterSeries = 0;
@@ -2211,8 +2237,8 @@
 
 void checkUnnamed5816(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.int buildCounterSeriesmembership = 0;
@@ -2381,11 +2407,16 @@
 void checkUsersettingsNotification(api.UsersettingsNotification o) {
   buildCounterUsersettingsNotification++;
   if (buildCounterUsersettingsNotification < 3) {
-    checkUsersettingsNotificationMatchMyInterests(o.matchMyInterests);
-    checkUsersettingsNotificationMoreFromAuthors(o.moreFromAuthors);
-    checkUsersettingsNotificationMoreFromSeries(o.moreFromSeries);
-    checkUsersettingsNotificationPriceDrop(o.priceDrop);
-    checkUsersettingsNotificationRewardExpirations(o.rewardExpirations);
+    checkUsersettingsNotificationMatchMyInterests(
+        o.matchMyInterests as api.UsersettingsNotificationMatchMyInterests);
+    checkUsersettingsNotificationMoreFromAuthors(
+        o.moreFromAuthors as api.UsersettingsNotificationMoreFromAuthors);
+    checkUsersettingsNotificationMoreFromSeries(
+        o.moreFromSeries as api.UsersettingsNotificationMoreFromSeries);
+    checkUsersettingsNotificationPriceDrop(
+        o.priceDrop as api.UsersettingsNotificationPriceDrop);
+    checkUsersettingsNotificationRewardExpirations(
+        o.rewardExpirations as api.UsersettingsNotificationRewardExpirations);
   }
   buildCounterUsersettingsNotification--;
 }
@@ -2407,8 +2438,9 @@
   buildCounterUsersettings++;
   if (buildCounterUsersettings < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUsersettingsNotesExport(o.notesExport);
-    checkUsersettingsNotification(o.notification);
+    checkUsersettingsNotesExport(o.notesExport as api.UsersettingsNotesExport);
+    checkUsersettingsNotification(
+        o.notification as api.UsersettingsNotification);
   }
   buildCounterUsersettings--;
 }
@@ -2488,12 +2520,13 @@
   if (buildCounterVolumeAccessInfo < 3) {
     unittest.expect(o.accessViewStatus, unittest.equals('foo'));
     unittest.expect(o.country, unittest.equals('foo'));
-    checkDownloadAccessRestriction(o.downloadAccess);
+    checkDownloadAccessRestriction(
+        o.downloadAccess as api.DownloadAccessRestriction);
     unittest.expect(o.driveImportedContentLink, unittest.equals('foo'));
     unittest.expect(o.embeddable, unittest.isTrue);
-    checkVolumeAccessInfoEpub(o.epub);
+    checkVolumeAccessInfoEpub(o.epub as api.VolumeAccessInfoEpub);
     unittest.expect(o.explicitOfflineLicenseManagement, unittest.isTrue);
-    checkVolumeAccessInfoPdf(o.pdf);
+    checkVolumeAccessInfoPdf(o.pdf as api.VolumeAccessInfoPdf);
     unittest.expect(o.publicDomain, unittest.isTrue);
     unittest.expect(o.quoteSharingAllowed, unittest.isTrue);
     unittest.expect(o.textToSpeechPermission, unittest.equals('foo'));
@@ -2534,8 +2567,8 @@
 
 void checkUnnamed5817(core.List<api.VolumeLayerInfoLayers> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolumeLayerInfoLayers(o[0]);
-  checkVolumeLayerInfoLayers(o[1]);
+  checkVolumeLayerInfoLayers(o[0] as api.VolumeLayerInfoLayers);
+  checkVolumeLayerInfoLayers(o[1] as api.VolumeLayerInfoLayers);
 }
 
 core.int buildCounterVolumeLayerInfo = 0;
@@ -2683,9 +2716,12 @@
   if (buildCounterVolumeSaleInfoOffers < 3) {
     unittest.expect(o.finskyOfferType, unittest.equals(42));
     unittest.expect(o.giftable, unittest.isTrue);
-    checkVolumeSaleInfoOffersListPrice(o.listPrice);
-    checkVolumeSaleInfoOffersRentalDuration(o.rentalDuration);
-    checkVolumeSaleInfoOffersRetailPrice(o.retailPrice);
+    checkVolumeSaleInfoOffersListPrice(
+        o.listPrice as api.VolumeSaleInfoOffersListPrice);
+    checkVolumeSaleInfoOffersRentalDuration(
+        o.rentalDuration as api.VolumeSaleInfoOffersRentalDuration);
+    checkVolumeSaleInfoOffersRetailPrice(
+        o.retailPrice as api.VolumeSaleInfoOffersRetailPrice);
   }
   buildCounterVolumeSaleInfoOffers--;
 }
@@ -2699,8 +2735,8 @@
 
 void checkUnnamed5818(core.List<api.VolumeSaleInfoOffers> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolumeSaleInfoOffers(o[0]);
-  checkVolumeSaleInfoOffers(o[1]);
+  checkVolumeSaleInfoOffers(o[0] as api.VolumeSaleInfoOffers);
+  checkVolumeSaleInfoOffers(o[1] as api.VolumeSaleInfoOffers);
 }
 
 core.int buildCounterVolumeSaleInfoRetailPrice = 0;
@@ -2748,10 +2784,11 @@
     unittest.expect(o.buyLink, unittest.equals('foo'));
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.isEbook, unittest.isTrue);
-    checkVolumeSaleInfoListPrice(o.listPrice);
+    checkVolumeSaleInfoListPrice(o.listPrice as api.VolumeSaleInfoListPrice);
     checkUnnamed5818(o.offers);
     unittest.expect(o.onSaleDate, unittest.equals('foo'));
-    checkVolumeSaleInfoRetailPrice(o.retailPrice);
+    checkVolumeSaleInfoRetailPrice(
+        o.retailPrice as api.VolumeSaleInfoRetailPrice);
     unittest.expect(o.saleability, unittest.equals('foo'));
   }
   buildCounterVolumeSaleInfo--;
@@ -2900,9 +2937,10 @@
   if (buildCounterVolumeUserInfo < 3) {
     unittest.expect(o.acquiredTime, unittest.equals('foo'));
     unittest.expect(o.acquisitionType, unittest.equals(42));
-    checkVolumeUserInfoCopy(o.copy);
+    checkVolumeUserInfoCopy(o.copy as api.VolumeUserInfoCopy);
     unittest.expect(o.entitlementType, unittest.equals(42));
-    checkVolumeUserInfoFamilySharing(o.familySharing);
+    checkVolumeUserInfoFamilySharing(
+        o.familySharing as api.VolumeUserInfoFamilySharing);
     unittest.expect(o.isFamilySharedFromUser, unittest.isTrue);
     unittest.expect(o.isFamilySharedToUser, unittest.isTrue);
     unittest.expect(o.isFamilySharingAllowed, unittest.isTrue);
@@ -2911,12 +2949,14 @@
     unittest.expect(o.isPreordered, unittest.isTrue);
     unittest.expect(o.isPurchased, unittest.isTrue);
     unittest.expect(o.isUploaded, unittest.isTrue);
-    checkReadingPosition(o.readingPosition);
-    checkVolumeUserInfoRentalPeriod(o.rentalPeriod);
+    checkReadingPosition(o.readingPosition as api.ReadingPosition);
+    checkVolumeUserInfoRentalPeriod(
+        o.rentalPeriod as api.VolumeUserInfoRentalPeriod);
     unittest.expect(o.rentalState, unittest.equals('foo'));
-    checkReview(o.review);
+    checkReview(o.review as api.Review);
     unittest.expect(o.updated, unittest.equals('foo'));
-    checkVolumeUserInfoUserUploadedVolumeInfo(o.userUploadedVolumeInfo);
+    checkVolumeUserInfoUserUploadedVolumeInfo(
+        o.userUploadedVolumeInfo as api.VolumeUserInfoUserUploadedVolumeInfo);
   }
   buildCounterVolumeUserInfo--;
 }
@@ -3031,8 +3071,10 @@
 
 void checkUnnamed5821(core.List<api.VolumeVolumeInfoIndustryIdentifiers> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolumeVolumeInfoIndustryIdentifiers(o[0]);
-  checkVolumeVolumeInfoIndustryIdentifiers(o[1]);
+  checkVolumeVolumeInfoIndustryIdentifiers(
+      o[0] as api.VolumeVolumeInfoIndustryIdentifiers);
+  checkVolumeVolumeInfoIndustryIdentifiers(
+      o[1] as api.VolumeVolumeInfoIndustryIdentifiers);
 }
 
 core.int buildCounterVolumeVolumeInfoPanelizationSummary = 0;
@@ -3132,24 +3174,28 @@
     unittest.expect(o.comicsContent, unittest.isTrue);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkVolumeVolumeInfoDimensions(o.dimensions);
-    checkVolumeVolumeInfoImageLinks(o.imageLinks);
+    checkVolumeVolumeInfoDimensions(
+        o.dimensions as api.VolumeVolumeInfoDimensions);
+    checkVolumeVolumeInfoImageLinks(
+        o.imageLinks as api.VolumeVolumeInfoImageLinks);
     checkUnnamed5821(o.industryIdentifiers);
     unittest.expect(o.infoLink, unittest.equals('foo'));
     unittest.expect(o.language, unittest.equals('foo'));
     unittest.expect(o.mainCategory, unittest.equals('foo'));
     unittest.expect(o.maturityRating, unittest.equals('foo'));
     unittest.expect(o.pageCount, unittest.equals(42));
-    checkVolumeVolumeInfoPanelizationSummary(o.panelizationSummary);
+    checkVolumeVolumeInfoPanelizationSummary(
+        o.panelizationSummary as api.VolumeVolumeInfoPanelizationSummary);
     unittest.expect(o.previewLink, unittest.equals('foo'));
     unittest.expect(o.printType, unittest.equals('foo'));
     unittest.expect(o.printedPageCount, unittest.equals(42));
     unittest.expect(o.publishedDate, unittest.equals('foo'));
     unittest.expect(o.publisher, unittest.equals('foo'));
     unittest.expect(o.ratingsCount, unittest.equals(42));
-    checkVolumeVolumeInfoReadingModes(o.readingModes);
+    checkVolumeVolumeInfoReadingModes(
+        o.readingModes as api.VolumeVolumeInfoReadingModes);
     unittest.expect(o.samplePageCount, unittest.equals(42));
-    checkVolumeseriesinfo(o.seriesInfo);
+    checkVolumeseriesinfo(o.seriesInfo as api.Volumeseriesinfo);
     unittest.expect(o.subtitle, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -3180,17 +3226,17 @@
 void checkVolume(api.Volume o) {
   buildCounterVolume++;
   if (buildCounterVolume < 3) {
-    checkVolumeAccessInfo(o.accessInfo);
+    checkVolumeAccessInfo(o.accessInfo as api.VolumeAccessInfo);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkVolumeLayerInfo(o.layerInfo);
-    checkVolumeRecommendedInfo(o.recommendedInfo);
-    checkVolumeSaleInfo(o.saleInfo);
-    checkVolumeSearchInfo(o.searchInfo);
+    checkVolumeLayerInfo(o.layerInfo as api.VolumeLayerInfo);
+    checkVolumeRecommendedInfo(o.recommendedInfo as api.VolumeRecommendedInfo);
+    checkVolumeSaleInfo(o.saleInfo as api.VolumeSaleInfo);
+    checkVolumeSearchInfo(o.searchInfo as api.VolumeSearchInfo);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkVolumeUserInfo(o.userInfo);
-    checkVolumeVolumeInfo(o.volumeInfo);
+    checkVolumeUserInfo(o.userInfo as api.VolumeUserInfo);
+    checkVolumeVolumeInfo(o.volumeInfo as api.VolumeVolumeInfo);
   }
   buildCounterVolume--;
 }
@@ -3204,8 +3250,8 @@
 
 void checkUnnamed5822(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.int buildCounterVolume2 = 0;
@@ -3248,10 +3294,10 @@
 void checkVolumeannotationContentRanges(api.VolumeannotationContentRanges o) {
   buildCounterVolumeannotationContentRanges++;
   if (buildCounterVolumeannotationContentRanges < 3) {
-    checkBooksAnnotationsRange(o.cfiRange);
+    checkBooksAnnotationsRange(o.cfiRange as api.BooksAnnotationsRange);
     unittest.expect(o.contentVersion, unittest.equals('foo'));
-    checkBooksAnnotationsRange(o.gbImageRange);
-    checkBooksAnnotationsRange(o.gbTextRange);
+    checkBooksAnnotationsRange(o.gbImageRange as api.BooksAnnotationsRange);
+    checkBooksAnnotationsRange(o.gbTextRange as api.BooksAnnotationsRange);
   }
   buildCounterVolumeannotationContentRanges--;
 }
@@ -3299,7 +3345,8 @@
     unittest.expect(o.annotationDataId, unittest.equals('foo'));
     unittest.expect(o.annotationDataLink, unittest.equals('foo'));
     unittest.expect(o.annotationType, unittest.equals('foo'));
-    checkVolumeannotationContentRanges(o.contentRanges);
+    checkVolumeannotationContentRanges(
+        o.contentRanges as api.VolumeannotationContentRanges);
     unittest.expect(o.data, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -3323,8 +3370,8 @@
 
 void checkUnnamed5824(core.List<api.Volumeannotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolumeannotation(o[0]);
-  checkVolumeannotation(o[1]);
+  checkVolumeannotation(o[0] as api.Volumeannotation);
+  checkVolumeannotation(o[1] as api.Volumeannotation);
 }
 
 core.int buildCounterVolumeannotations = 0;
@@ -3363,8 +3410,8 @@
 
 void checkUnnamed5825(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.int buildCounterVolumes = 0;
@@ -3421,8 +3468,10 @@
 
 void checkUnnamed5826(core.List<api.VolumeseriesinfoVolumeSeriesIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolumeseriesinfoVolumeSeriesIssue(o[0]);
-  checkVolumeseriesinfoVolumeSeriesIssue(o[1]);
+  checkVolumeseriesinfoVolumeSeriesIssue(
+      o[0] as api.VolumeseriesinfoVolumeSeriesIssue);
+  checkVolumeseriesinfoVolumeSeriesIssue(
+      o[1] as api.VolumeseriesinfoVolumeSeriesIssue);
 }
 
 core.int buildCounterVolumeseriesinfoVolumeSeries = 0;
@@ -3459,8 +3508,8 @@
 
 void checkUnnamed5827(core.List<api.VolumeseriesinfoVolumeSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolumeseriesinfoVolumeSeries(o[0]);
-  checkVolumeseriesinfoVolumeSeries(o[1]);
+  checkVolumeseriesinfoVolumeSeries(o[0] as api.VolumeseriesinfoVolumeSeries);
+  checkVolumeseriesinfoVolumeSeries(o[1] as api.VolumeseriesinfoVolumeSeries);
 }
 
 core.int buildCounterVolumeseriesinfo = 0;
@@ -3649,7 +3698,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotationClientVersionRanges();
       var od = api.AnnotationClientVersionRanges.fromJson(o.toJson());
-      checkAnnotationClientVersionRanges(od);
+      checkAnnotationClientVersionRanges(
+          od as api.AnnotationClientVersionRanges);
     });
   });
 
@@ -3657,7 +3707,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotationCurrentVersionRanges();
       var od = api.AnnotationCurrentVersionRanges.fromJson(o.toJson());
-      checkAnnotationCurrentVersionRanges(od);
+      checkAnnotationCurrentVersionRanges(
+          od as api.AnnotationCurrentVersionRanges);
     });
   });
 
@@ -3665,7 +3716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotationLayerSummary();
       var od = api.AnnotationLayerSummary.fromJson(o.toJson());
-      checkAnnotationLayerSummary(od);
+      checkAnnotationLayerSummary(od as api.AnnotationLayerSummary);
     });
   });
 
@@ -3673,7 +3724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotation();
       var od = api.Annotation.fromJson(o.toJson());
-      checkAnnotation(od);
+      checkAnnotation(od as api.Annotation);
     });
   });
 
@@ -3681,7 +3732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotations();
       var od = api.Annotations.fromJson(o.toJson());
-      checkAnnotations(od);
+      checkAnnotations(od as api.Annotations);
     });
   });
 
@@ -3689,7 +3740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotationsSummaryLayers();
       var od = api.AnnotationsSummaryLayers.fromJson(o.toJson());
-      checkAnnotationsSummaryLayers(od);
+      checkAnnotationsSummaryLayers(od as api.AnnotationsSummaryLayers);
     });
   });
 
@@ -3697,7 +3748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotationsSummary();
       var od = api.AnnotationsSummary.fromJson(o.toJson());
-      checkAnnotationsSummary(od);
+      checkAnnotationsSummary(od as api.AnnotationsSummary);
     });
   });
 
@@ -3705,7 +3756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotationsdata();
       var od = api.Annotationsdata.fromJson(o.toJson());
-      checkAnnotationsdata(od);
+      checkAnnotationsdata(od as api.Annotationsdata);
     });
   });
 
@@ -3713,7 +3764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooksAnnotationsRange();
       var od = api.BooksAnnotationsRange.fromJson(o.toJson());
-      checkBooksAnnotationsRange(od);
+      checkBooksAnnotationsRange(od as api.BooksAnnotationsRange);
     });
   });
 
@@ -3721,7 +3772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooksCloudloadingResource();
       var od = api.BooksCloudloadingResource.fromJson(o.toJson());
-      checkBooksCloudloadingResource(od);
+      checkBooksCloudloadingResource(od as api.BooksCloudloadingResource);
     });
   });
 
@@ -3729,7 +3780,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooksVolumesRecommendedRateResponse();
       var od = api.BooksVolumesRecommendedRateResponse.fromJson(o.toJson());
-      checkBooksVolumesRecommendedRateResponse(od);
+      checkBooksVolumesRecommendedRateResponse(
+          od as api.BooksVolumesRecommendedRateResponse);
     });
   });
 
@@ -3737,7 +3789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBookshelf();
       var od = api.Bookshelf.fromJson(o.toJson());
-      checkBookshelf(od);
+      checkBookshelf(od as api.Bookshelf);
     });
   });
 
@@ -3745,7 +3797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBookshelves();
       var od = api.Bookshelves.fromJson(o.toJson());
-      checkBookshelves(od);
+      checkBookshelves(od as api.Bookshelves);
     });
   });
 
@@ -3753,7 +3805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategoryItems();
       var od = api.CategoryItems.fromJson(o.toJson());
-      checkCategoryItems(od);
+      checkCategoryItems(od as api.CategoryItems);
     });
   });
 
@@ -3761,7 +3813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategory();
       var od = api.Category.fromJson(o.toJson());
-      checkCategory(od);
+      checkCategory(od as api.Category);
     });
   });
 
@@ -3769,7 +3821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConcurrentAccessRestriction();
       var od = api.ConcurrentAccessRestriction.fromJson(o.toJson());
-      checkConcurrentAccessRestriction(od);
+      checkConcurrentAccessRestriction(od as api.ConcurrentAccessRestriction);
     });
   });
 
@@ -3777,7 +3829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictionaryAnnotationdata();
       var od = api.DictionaryAnnotationdata.fromJson(o.toJson());
-      checkDictionaryAnnotationdata(od);
+      checkDictionaryAnnotationdata(od as api.DictionaryAnnotationdata);
     });
   });
 
@@ -3785,7 +3837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataCommon();
       var od = api.DictlayerdataCommon.fromJson(o.toJson());
-      checkDictlayerdataCommon(od);
+      checkDictlayerdataCommon(od as api.DictlayerdataCommon);
     });
   });
 
@@ -3793,7 +3845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictSource();
       var od = api.DictlayerdataDictSource.fromJson(o.toJson());
-      checkDictlayerdataDictSource(od);
+      checkDictlayerdataDictSource(od as api.DictlayerdataDictSource);
     });
   });
 
@@ -3801,7 +3853,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsDerivativesSource();
       var od = api.DictlayerdataDictWordsDerivativesSource.fromJson(o.toJson());
-      checkDictlayerdataDictWordsDerivativesSource(od);
+      checkDictlayerdataDictWordsDerivativesSource(
+          od as api.DictlayerdataDictWordsDerivativesSource);
     });
   });
 
@@ -3809,7 +3862,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsDerivatives();
       var od = api.DictlayerdataDictWordsDerivatives.fromJson(o.toJson());
-      checkDictlayerdataDictWordsDerivatives(od);
+      checkDictlayerdataDictWordsDerivatives(
+          od as api.DictlayerdataDictWordsDerivatives);
     });
   });
 
@@ -3817,7 +3871,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsExamplesSource();
       var od = api.DictlayerdataDictWordsExamplesSource.fromJson(o.toJson());
-      checkDictlayerdataDictWordsExamplesSource(od);
+      checkDictlayerdataDictWordsExamplesSource(
+          od as api.DictlayerdataDictWordsExamplesSource);
     });
   });
 
@@ -3825,7 +3880,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsExamples();
       var od = api.DictlayerdataDictWordsExamples.fromJson(o.toJson());
-      checkDictlayerdataDictWordsExamples(od);
+      checkDictlayerdataDictWordsExamples(
+          od as api.DictlayerdataDictWordsExamples);
     });
   });
 
@@ -3834,7 +3890,8 @@
       var o = buildDictlayerdataDictWordsSensesConjugations();
       var od =
           api.DictlayerdataDictWordsSensesConjugations.fromJson(o.toJson());
-      checkDictlayerdataDictWordsSensesConjugations(od);
+      checkDictlayerdataDictWordsSensesConjugations(
+          od as api.DictlayerdataDictWordsSensesConjugations);
     });
   });
 
@@ -3845,7 +3902,8 @@
       var od =
           api.DictlayerdataDictWordsSensesDefinitionsExamplesSource.fromJson(
               o.toJson());
-      checkDictlayerdataDictWordsSensesDefinitionsExamplesSource(od);
+      checkDictlayerdataDictWordsSensesDefinitionsExamplesSource(
+          od as api.DictlayerdataDictWordsSensesDefinitionsExamplesSource);
     });
   });
 
@@ -3855,7 +3913,8 @@
       var o = buildDictlayerdataDictWordsSensesDefinitionsExamples();
       var od = api.DictlayerdataDictWordsSensesDefinitionsExamples.fromJson(
           o.toJson());
-      checkDictlayerdataDictWordsSensesDefinitionsExamples(od);
+      checkDictlayerdataDictWordsSensesDefinitionsExamples(
+          od as api.DictlayerdataDictWordsSensesDefinitionsExamples);
     });
   });
 
@@ -3863,7 +3922,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsSensesDefinitions();
       var od = api.DictlayerdataDictWordsSensesDefinitions.fromJson(o.toJson());
-      checkDictlayerdataDictWordsSensesDefinitions(od);
+      checkDictlayerdataDictWordsSensesDefinitions(
+          od as api.DictlayerdataDictWordsSensesDefinitions);
     });
   });
 
@@ -3871,7 +3931,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsSensesSource();
       var od = api.DictlayerdataDictWordsSensesSource.fromJson(o.toJson());
-      checkDictlayerdataDictWordsSensesSource(od);
+      checkDictlayerdataDictWordsSensesSource(
+          od as api.DictlayerdataDictWordsSensesSource);
     });
   });
 
@@ -3880,7 +3941,8 @@
       var o = buildDictlayerdataDictWordsSensesSynonymsSource();
       var od =
           api.DictlayerdataDictWordsSensesSynonymsSource.fromJson(o.toJson());
-      checkDictlayerdataDictWordsSensesSynonymsSource(od);
+      checkDictlayerdataDictWordsSensesSynonymsSource(
+          od as api.DictlayerdataDictWordsSensesSynonymsSource);
     });
   });
 
@@ -3888,7 +3950,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsSensesSynonyms();
       var od = api.DictlayerdataDictWordsSensesSynonyms.fromJson(o.toJson());
-      checkDictlayerdataDictWordsSensesSynonyms(od);
+      checkDictlayerdataDictWordsSensesSynonyms(
+          od as api.DictlayerdataDictWordsSensesSynonyms);
     });
   });
 
@@ -3896,7 +3959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsSenses();
       var od = api.DictlayerdataDictWordsSenses.fromJson(o.toJson());
-      checkDictlayerdataDictWordsSenses(od);
+      checkDictlayerdataDictWordsSenses(od as api.DictlayerdataDictWordsSenses);
     });
   });
 
@@ -3904,7 +3967,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWordsSource();
       var od = api.DictlayerdataDictWordsSource.fromJson(o.toJson());
-      checkDictlayerdataDictWordsSource(od);
+      checkDictlayerdataDictWordsSource(od as api.DictlayerdataDictWordsSource);
     });
   });
 
@@ -3912,7 +3975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDictWords();
       var od = api.DictlayerdataDictWords.fromJson(o.toJson());
-      checkDictlayerdataDictWords(od);
+      checkDictlayerdataDictWords(od as api.DictlayerdataDictWords);
     });
   });
 
@@ -3920,7 +3983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdataDict();
       var od = api.DictlayerdataDict.fromJson(o.toJson());
-      checkDictlayerdataDict(od);
+      checkDictlayerdataDict(od as api.DictlayerdataDict);
     });
   });
 
@@ -3928,7 +3991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDictlayerdata();
       var od = api.Dictlayerdata.fromJson(o.toJson());
-      checkDictlayerdata(od);
+      checkDictlayerdata(od as api.Dictlayerdata);
     });
   });
 
@@ -3938,7 +4001,8 @@
       var o = buildDiscoveryclustersClustersBannerWithContentContainer();
       var od = api.DiscoveryclustersClustersBannerWithContentContainer.fromJson(
           o.toJson());
-      checkDiscoveryclustersClustersBannerWithContentContainer(od);
+      checkDiscoveryclustersClustersBannerWithContentContainer(
+          od as api.DiscoveryclustersClustersBannerWithContentContainer);
     });
   });
 
@@ -3946,7 +4010,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiscoveryclustersClusters();
       var od = api.DiscoveryclustersClusters.fromJson(o.toJson());
-      checkDiscoveryclustersClusters(od);
+      checkDiscoveryclustersClusters(od as api.DiscoveryclustersClusters);
     });
   });
 
@@ -3954,7 +4018,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiscoveryclusters();
       var od = api.Discoveryclusters.fromJson(o.toJson());
-      checkDiscoveryclusters(od);
+      checkDiscoveryclusters(od as api.Discoveryclusters);
     });
   });
 
@@ -3962,7 +4026,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDownloadAccessRestriction();
       var od = api.DownloadAccessRestriction.fromJson(o.toJson());
-      checkDownloadAccessRestriction(od);
+      checkDownloadAccessRestriction(od as api.DownloadAccessRestriction);
     });
   });
 
@@ -3970,7 +4034,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDownloadAccesses();
       var od = api.DownloadAccesses.fromJson(o.toJson());
-      checkDownloadAccesses(od);
+      checkDownloadAccesses(od as api.DownloadAccesses);
     });
   });
 
@@ -3978,7 +4042,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3986,7 +4050,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFamilyInfoMembership();
       var od = api.FamilyInfoMembership.fromJson(o.toJson());
-      checkFamilyInfoMembership(od);
+      checkFamilyInfoMembership(od as api.FamilyInfoMembership);
     });
   });
 
@@ -3994,7 +4058,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFamilyInfo();
       var od = api.FamilyInfo.fromJson(o.toJson());
-      checkFamilyInfo(od);
+      checkFamilyInfo(od as api.FamilyInfo);
     });
   });
 
@@ -4002,7 +4066,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeoAnnotationdata();
       var od = api.GeoAnnotationdata.fromJson(o.toJson());
-      checkGeoAnnotationdata(od);
+      checkGeoAnnotationdata(od as api.GeoAnnotationdata);
     });
   });
 
@@ -4010,7 +4074,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeolayerdataCommon();
       var od = api.GeolayerdataCommon.fromJson(o.toJson());
-      checkGeolayerdataCommon(od);
+      checkGeolayerdataCommon(od as api.GeolayerdataCommon);
     });
   });
 
@@ -4018,7 +4082,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeolayerdataGeoViewportHi();
       var od = api.GeolayerdataGeoViewportHi.fromJson(o.toJson());
-      checkGeolayerdataGeoViewportHi(od);
+      checkGeolayerdataGeoViewportHi(od as api.GeolayerdataGeoViewportHi);
     });
   });
 
@@ -4026,7 +4090,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeolayerdataGeoViewportLo();
       var od = api.GeolayerdataGeoViewportLo.fromJson(o.toJson());
-      checkGeolayerdataGeoViewportLo(od);
+      checkGeolayerdataGeoViewportLo(od as api.GeolayerdataGeoViewportLo);
     });
   });
 
@@ -4034,7 +4098,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeolayerdataGeoViewport();
       var od = api.GeolayerdataGeoViewport.fromJson(o.toJson());
-      checkGeolayerdataGeoViewport(od);
+      checkGeolayerdataGeoViewport(od as api.GeolayerdataGeoViewport);
     });
   });
 
@@ -4042,7 +4106,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeolayerdataGeo();
       var od = api.GeolayerdataGeo.fromJson(o.toJson());
-      checkGeolayerdataGeo(od);
+      checkGeolayerdataGeo(od as api.GeolayerdataGeo);
     });
   });
 
@@ -4050,7 +4114,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeolayerdata();
       var od = api.Geolayerdata.fromJson(o.toJson());
-      checkGeolayerdata(od);
+      checkGeolayerdata(od as api.Geolayerdata);
     });
   });
 
@@ -4058,7 +4122,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLayersummaries();
       var od = api.Layersummaries.fromJson(o.toJson());
-      checkLayersummaries(od);
+      checkLayersummaries(od as api.Layersummaries);
     });
   });
 
@@ -4066,7 +4130,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLayersummary();
       var od = api.Layersummary.fromJson(o.toJson());
-      checkLayersummary(od);
+      checkLayersummary(od as api.Layersummary);
     });
   });
 
@@ -4074,7 +4138,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadataItems();
       var od = api.MetadataItems.fromJson(o.toJson());
-      checkMetadataItems(od);
+      checkMetadataItems(od as api.MetadataItems);
     });
   });
 
@@ -4082,7 +4146,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadata();
       var od = api.Metadata.fromJson(o.toJson());
-      checkMetadata(od);
+      checkMetadata(od as api.Metadata);
     });
   });
 
@@ -4090,7 +4154,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotification();
       var od = api.Notification.fromJson(o.toJson());
-      checkNotification(od);
+      checkNotification(od as api.Notification);
     });
   });
 
@@ -4098,7 +4162,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOffersItemsItems();
       var od = api.OffersItemsItems.fromJson(o.toJson());
-      checkOffersItemsItems(od);
+      checkOffersItemsItems(od as api.OffersItemsItems);
     });
   });
 
@@ -4106,7 +4170,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOffersItems();
       var od = api.OffersItems.fromJson(o.toJson());
-      checkOffersItems(od);
+      checkOffersItems(od as api.OffersItems);
     });
   });
 
@@ -4114,7 +4178,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOffers();
       var od = api.Offers.fromJson(o.toJson());
-      checkOffers(od);
+      checkOffers(od as api.Offers);
     });
   });
 
@@ -4122,7 +4186,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadingPosition();
       var od = api.ReadingPosition.fromJson(o.toJson());
-      checkReadingPosition(od);
+      checkReadingPosition(od as api.ReadingPosition);
     });
   });
 
@@ -4130,7 +4194,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestAccessData();
       var od = api.RequestAccessData.fromJson(o.toJson());
-      checkRequestAccessData(od);
+      checkRequestAccessData(od as api.RequestAccessData);
     });
   });
 
@@ -4138,7 +4202,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReviewAuthor();
       var od = api.ReviewAuthor.fromJson(o.toJson());
-      checkReviewAuthor(od);
+      checkReviewAuthor(od as api.ReviewAuthor);
     });
   });
 
@@ -4146,7 +4210,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReviewSource();
       var od = api.ReviewSource.fromJson(o.toJson());
-      checkReviewSource(od);
+      checkReviewSource(od as api.ReviewSource);
     });
   });
 
@@ -4154,7 +4218,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReview();
       var od = api.Review.fromJson(o.toJson());
-      checkReview(od);
+      checkReview(od as api.Review);
     });
   });
 
@@ -4166,7 +4230,8 @@
           buildSeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo();
       var od = api.SeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo
           .fromJson(o.toJson());
-      checkSeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo(od);
+      checkSeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo(od
+          as api.SeriesSeriesSeriesSubscriptionReleaseInfoCurrentReleaseInfo);
     });
   });
 
@@ -4178,7 +4243,8 @@
       var od =
           api.SeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo.fromJson(
               o.toJson());
-      checkSeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo(od);
+      checkSeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo(
+          od as api.SeriesSeriesSeriesSubscriptionReleaseInfoNextReleaseInfo);
     });
   });
 
@@ -4187,7 +4253,8 @@
       var o = buildSeriesSeriesSeriesSubscriptionReleaseInfo();
       var od =
           api.SeriesSeriesSeriesSubscriptionReleaseInfo.fromJson(o.toJson());
-      checkSeriesSeriesSeriesSubscriptionReleaseInfo(od);
+      checkSeriesSeriesSeriesSubscriptionReleaseInfo(
+          od as api.SeriesSeriesSeriesSubscriptionReleaseInfo);
     });
   });
 
@@ -4195,7 +4262,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSeriesSeries();
       var od = api.SeriesSeries.fromJson(o.toJson());
-      checkSeriesSeries(od);
+      checkSeriesSeries(od as api.SeriesSeries);
     });
   });
 
@@ -4203,7 +4270,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSeries();
       var od = api.Series.fromJson(o.toJson());
-      checkSeries(od);
+      checkSeries(od as api.Series);
     });
   });
 
@@ -4211,7 +4278,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSeriesmembership();
       var od = api.Seriesmembership.fromJson(o.toJson());
-      checkSeriesmembership(od);
+      checkSeriesmembership(od as api.Seriesmembership);
     });
   });
 
@@ -4219,7 +4286,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsersettingsNotesExport();
       var od = api.UsersettingsNotesExport.fromJson(o.toJson());
-      checkUsersettingsNotesExport(od);
+      checkUsersettingsNotesExport(od as api.UsersettingsNotesExport);
     });
   });
 
@@ -4228,7 +4295,8 @@
       var o = buildUsersettingsNotificationMatchMyInterests();
       var od =
           api.UsersettingsNotificationMatchMyInterests.fromJson(o.toJson());
-      checkUsersettingsNotificationMatchMyInterests(od);
+      checkUsersettingsNotificationMatchMyInterests(
+          od as api.UsersettingsNotificationMatchMyInterests);
     });
   });
 
@@ -4236,7 +4304,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsersettingsNotificationMoreFromAuthors();
       var od = api.UsersettingsNotificationMoreFromAuthors.fromJson(o.toJson());
-      checkUsersettingsNotificationMoreFromAuthors(od);
+      checkUsersettingsNotificationMoreFromAuthors(
+          od as api.UsersettingsNotificationMoreFromAuthors);
     });
   });
 
@@ -4244,7 +4313,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsersettingsNotificationMoreFromSeries();
       var od = api.UsersettingsNotificationMoreFromSeries.fromJson(o.toJson());
-      checkUsersettingsNotificationMoreFromSeries(od);
+      checkUsersettingsNotificationMoreFromSeries(
+          od as api.UsersettingsNotificationMoreFromSeries);
     });
   });
 
@@ -4252,7 +4322,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsersettingsNotificationPriceDrop();
       var od = api.UsersettingsNotificationPriceDrop.fromJson(o.toJson());
-      checkUsersettingsNotificationPriceDrop(od);
+      checkUsersettingsNotificationPriceDrop(
+          od as api.UsersettingsNotificationPriceDrop);
     });
   });
 
@@ -4261,7 +4332,8 @@
       var o = buildUsersettingsNotificationRewardExpirations();
       var od =
           api.UsersettingsNotificationRewardExpirations.fromJson(o.toJson());
-      checkUsersettingsNotificationRewardExpirations(od);
+      checkUsersettingsNotificationRewardExpirations(
+          od as api.UsersettingsNotificationRewardExpirations);
     });
   });
 
@@ -4269,7 +4341,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsersettingsNotification();
       var od = api.UsersettingsNotification.fromJson(o.toJson());
-      checkUsersettingsNotification(od);
+      checkUsersettingsNotification(od as api.UsersettingsNotification);
     });
   });
 
@@ -4277,7 +4349,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsersettings();
       var od = api.Usersettings.fromJson(o.toJson());
-      checkUsersettings(od);
+      checkUsersettings(od as api.Usersettings);
     });
   });
 
@@ -4285,7 +4357,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeAccessInfoEpub();
       var od = api.VolumeAccessInfoEpub.fromJson(o.toJson());
-      checkVolumeAccessInfoEpub(od);
+      checkVolumeAccessInfoEpub(od as api.VolumeAccessInfoEpub);
     });
   });
 
@@ -4293,7 +4365,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeAccessInfoPdf();
       var od = api.VolumeAccessInfoPdf.fromJson(o.toJson());
-      checkVolumeAccessInfoPdf(od);
+      checkVolumeAccessInfoPdf(od as api.VolumeAccessInfoPdf);
     });
   });
 
@@ -4301,7 +4373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeAccessInfo();
       var od = api.VolumeAccessInfo.fromJson(o.toJson());
-      checkVolumeAccessInfo(od);
+      checkVolumeAccessInfo(od as api.VolumeAccessInfo);
     });
   });
 
@@ -4309,7 +4381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeLayerInfoLayers();
       var od = api.VolumeLayerInfoLayers.fromJson(o.toJson());
-      checkVolumeLayerInfoLayers(od);
+      checkVolumeLayerInfoLayers(od as api.VolumeLayerInfoLayers);
     });
   });
 
@@ -4317,7 +4389,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeLayerInfo();
       var od = api.VolumeLayerInfo.fromJson(o.toJson());
-      checkVolumeLayerInfo(od);
+      checkVolumeLayerInfo(od as api.VolumeLayerInfo);
     });
   });
 
@@ -4325,7 +4397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeRecommendedInfo();
       var od = api.VolumeRecommendedInfo.fromJson(o.toJson());
-      checkVolumeRecommendedInfo(od);
+      checkVolumeRecommendedInfo(od as api.VolumeRecommendedInfo);
     });
   });
 
@@ -4333,7 +4405,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSaleInfoListPrice();
       var od = api.VolumeSaleInfoListPrice.fromJson(o.toJson());
-      checkVolumeSaleInfoListPrice(od);
+      checkVolumeSaleInfoListPrice(od as api.VolumeSaleInfoListPrice);
     });
   });
 
@@ -4341,7 +4413,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSaleInfoOffersListPrice();
       var od = api.VolumeSaleInfoOffersListPrice.fromJson(o.toJson());
-      checkVolumeSaleInfoOffersListPrice(od);
+      checkVolumeSaleInfoOffersListPrice(
+          od as api.VolumeSaleInfoOffersListPrice);
     });
   });
 
@@ -4349,7 +4422,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSaleInfoOffersRentalDuration();
       var od = api.VolumeSaleInfoOffersRentalDuration.fromJson(o.toJson());
-      checkVolumeSaleInfoOffersRentalDuration(od);
+      checkVolumeSaleInfoOffersRentalDuration(
+          od as api.VolumeSaleInfoOffersRentalDuration);
     });
   });
 
@@ -4357,7 +4431,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSaleInfoOffersRetailPrice();
       var od = api.VolumeSaleInfoOffersRetailPrice.fromJson(o.toJson());
-      checkVolumeSaleInfoOffersRetailPrice(od);
+      checkVolumeSaleInfoOffersRetailPrice(
+          od as api.VolumeSaleInfoOffersRetailPrice);
     });
   });
 
@@ -4365,7 +4440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSaleInfoOffers();
       var od = api.VolumeSaleInfoOffers.fromJson(o.toJson());
-      checkVolumeSaleInfoOffers(od);
+      checkVolumeSaleInfoOffers(od as api.VolumeSaleInfoOffers);
     });
   });
 
@@ -4373,7 +4448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSaleInfoRetailPrice();
       var od = api.VolumeSaleInfoRetailPrice.fromJson(o.toJson());
-      checkVolumeSaleInfoRetailPrice(od);
+      checkVolumeSaleInfoRetailPrice(od as api.VolumeSaleInfoRetailPrice);
     });
   });
 
@@ -4381,7 +4456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSaleInfo();
       var od = api.VolumeSaleInfo.fromJson(o.toJson());
-      checkVolumeSaleInfo(od);
+      checkVolumeSaleInfo(od as api.VolumeSaleInfo);
     });
   });
 
@@ -4389,7 +4464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeSearchInfo();
       var od = api.VolumeSearchInfo.fromJson(o.toJson());
-      checkVolumeSearchInfo(od);
+      checkVolumeSearchInfo(od as api.VolumeSearchInfo);
     });
   });
 
@@ -4397,7 +4472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeUserInfoCopy();
       var od = api.VolumeUserInfoCopy.fromJson(o.toJson());
-      checkVolumeUserInfoCopy(od);
+      checkVolumeUserInfoCopy(od as api.VolumeUserInfoCopy);
     });
   });
 
@@ -4405,7 +4480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeUserInfoFamilySharing();
       var od = api.VolumeUserInfoFamilySharing.fromJson(o.toJson());
-      checkVolumeUserInfoFamilySharing(od);
+      checkVolumeUserInfoFamilySharing(od as api.VolumeUserInfoFamilySharing);
     });
   });
 
@@ -4413,7 +4488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeUserInfoRentalPeriod();
       var od = api.VolumeUserInfoRentalPeriod.fromJson(o.toJson());
-      checkVolumeUserInfoRentalPeriod(od);
+      checkVolumeUserInfoRentalPeriod(od as api.VolumeUserInfoRentalPeriod);
     });
   });
 
@@ -4421,7 +4496,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeUserInfoUserUploadedVolumeInfo();
       var od = api.VolumeUserInfoUserUploadedVolumeInfo.fromJson(o.toJson());
-      checkVolumeUserInfoUserUploadedVolumeInfo(od);
+      checkVolumeUserInfoUserUploadedVolumeInfo(
+          od as api.VolumeUserInfoUserUploadedVolumeInfo);
     });
   });
 
@@ -4429,7 +4505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeUserInfo();
       var od = api.VolumeUserInfo.fromJson(o.toJson());
-      checkVolumeUserInfo(od);
+      checkVolumeUserInfo(od as api.VolumeUserInfo);
     });
   });
 
@@ -4437,7 +4513,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeVolumeInfoDimensions();
       var od = api.VolumeVolumeInfoDimensions.fromJson(o.toJson());
-      checkVolumeVolumeInfoDimensions(od);
+      checkVolumeVolumeInfoDimensions(od as api.VolumeVolumeInfoDimensions);
     });
   });
 
@@ -4445,7 +4521,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeVolumeInfoImageLinks();
       var od = api.VolumeVolumeInfoImageLinks.fromJson(o.toJson());
-      checkVolumeVolumeInfoImageLinks(od);
+      checkVolumeVolumeInfoImageLinks(od as api.VolumeVolumeInfoImageLinks);
     });
   });
 
@@ -4453,7 +4529,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeVolumeInfoIndustryIdentifiers();
       var od = api.VolumeVolumeInfoIndustryIdentifiers.fromJson(o.toJson());
-      checkVolumeVolumeInfoIndustryIdentifiers(od);
+      checkVolumeVolumeInfoIndustryIdentifiers(
+          od as api.VolumeVolumeInfoIndustryIdentifiers);
     });
   });
 
@@ -4461,7 +4538,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeVolumeInfoPanelizationSummary();
       var od = api.VolumeVolumeInfoPanelizationSummary.fromJson(o.toJson());
-      checkVolumeVolumeInfoPanelizationSummary(od);
+      checkVolumeVolumeInfoPanelizationSummary(
+          od as api.VolumeVolumeInfoPanelizationSummary);
     });
   });
 
@@ -4469,7 +4547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeVolumeInfoReadingModes();
       var od = api.VolumeVolumeInfoReadingModes.fromJson(o.toJson());
-      checkVolumeVolumeInfoReadingModes(od);
+      checkVolumeVolumeInfoReadingModes(od as api.VolumeVolumeInfoReadingModes);
     });
   });
 
@@ -4477,7 +4555,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeVolumeInfo();
       var od = api.VolumeVolumeInfo.fromJson(o.toJson());
-      checkVolumeVolumeInfo(od);
+      checkVolumeVolumeInfo(od as api.VolumeVolumeInfo);
     });
   });
 
@@ -4485,7 +4563,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolume();
       var od = api.Volume.fromJson(o.toJson());
-      checkVolume(od);
+      checkVolume(od as api.Volume);
     });
   });
 
@@ -4493,7 +4571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolume2();
       var od = api.Volume2.fromJson(o.toJson());
-      checkVolume2(od);
+      checkVolume2(od as api.Volume2);
     });
   });
 
@@ -4501,7 +4579,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeannotationContentRanges();
       var od = api.VolumeannotationContentRanges.fromJson(o.toJson());
-      checkVolumeannotationContentRanges(od);
+      checkVolumeannotationContentRanges(
+          od as api.VolumeannotationContentRanges);
     });
   });
 
@@ -4509,7 +4588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeannotation();
       var od = api.Volumeannotation.fromJson(o.toJson());
-      checkVolumeannotation(od);
+      checkVolumeannotation(od as api.Volumeannotation);
     });
   });
 
@@ -4517,7 +4596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeannotations();
       var od = api.Volumeannotations.fromJson(o.toJson());
-      checkVolumeannotations(od);
+      checkVolumeannotations(od as api.Volumeannotations);
     });
   });
 
@@ -4525,7 +4604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumes();
       var od = api.Volumes.fromJson(o.toJson());
-      checkVolumes(od);
+      checkVolumes(od as api.Volumes);
     });
   });
 
@@ -4533,7 +4612,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeseriesinfoVolumeSeriesIssue();
       var od = api.VolumeseriesinfoVolumeSeriesIssue.fromJson(o.toJson());
-      checkVolumeseriesinfoVolumeSeriesIssue(od);
+      checkVolumeseriesinfoVolumeSeriesIssue(
+          od as api.VolumeseriesinfoVolumeSeriesIssue);
     });
   });
 
@@ -4541,7 +4621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeseriesinfoVolumeSeries();
       var od = api.VolumeseriesinfoVolumeSeries.fromJson(o.toJson());
-      checkVolumeseriesinfoVolumeSeries(od);
+      checkVolumeseriesinfoVolumeSeries(od as api.VolumeseriesinfoVolumeSeries);
     });
   });
 
@@ -4549,7 +4629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeseriesinfo();
       var od = api.Volumeseriesinfo.fromJson(o.toJson());
-      checkVolumeseriesinfo(od);
+      checkVolumeseriesinfo(od as api.Volumeseriesinfo);
     });
   });
 
@@ -4612,7 +4692,7 @@
       res
           .get(arg_userId, arg_shelf, source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBookshelf(response);
+        checkBookshelf(response as api.Bookshelf);
       })));
     });
 
@@ -4670,7 +4750,7 @@
       res
           .list(arg_userId, source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBookshelves(response);
+        checkBookshelves(response as api.Bookshelves);
       })));
     });
   });
@@ -4754,7 +4834,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
   });
@@ -4818,7 +4898,8 @@
               uploadClientToken: arg_uploadClientToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBooksCloudloadingResource(response);
+        checkBooksCloudloadingResource(
+            response as api.BooksCloudloadingResource);
       })));
     });
 
@@ -4867,7 +4948,7 @@
       res
           .deleteBook(volumeId: arg_volumeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4877,8 +4958,9 @@
       var arg_request = buildBooksCloudloadingResource();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BooksCloudloadingResource.fromJson(json);
-        checkBooksCloudloadingResource(obj);
+        var obj = api.BooksCloudloadingResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBooksCloudloadingResource(obj as api.BooksCloudloadingResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4917,7 +4999,8 @@
       res
           .updateBook(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBooksCloudloadingResource(response);
+        checkBooksCloudloadingResource(
+            response as api.BooksCloudloadingResource);
       })));
     });
   });
@@ -4968,7 +5051,7 @@
       res
           .listOfflineMetadata(cpksver: arg_cpksver, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMetadata(response);
+        checkMetadata(response as api.Metadata);
       })));
     });
   });
@@ -5018,7 +5101,7 @@
       res
           .getFamilyInfo(source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFamilyInfo(response);
+        checkFamilyInfo(response as api.FamilyInfo);
       })));
     });
 
@@ -5075,7 +5158,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5132,7 +5215,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -5202,7 +5285,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLayersummary(response);
+        checkLayersummary(response as api.Layersummary);
       })));
     });
 
@@ -5274,7 +5357,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLayersummaries(response);
+        checkLayersummaries(response as api.Layersummaries);
       })));
     });
   });
@@ -5373,7 +5456,7 @@
               w: arg_w,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDictionaryAnnotationdata(response);
+        checkDictionaryAnnotationdata(response as api.DictionaryAnnotationdata);
       })));
     });
 
@@ -5482,7 +5565,7 @@
               w: arg_w,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnotationsdata(response);
+        checkAnnotationsdata(response as api.Annotationsdata);
       })));
     });
   });
@@ -5559,7 +5642,7 @@
           .get(arg_volumeId, arg_layerId, arg_annotationId,
               locale: arg_locale, source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumeannotation(response);
+        checkVolumeannotation(response as api.Volumeannotation);
       })));
     });
 
@@ -5670,7 +5753,7 @@
               volumeAnnotationsVersion: arg_volumeAnnotationsVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumeannotations(response);
+        checkVolumeannotations(response as api.Volumeannotations);
       })));
     });
   });
@@ -5721,7 +5804,7 @@
       res
           .getUserSettings(country: arg_country, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsersettings(response);
+        checkUsersettings(response as api.Usersettings);
       })));
     });
 
@@ -5781,7 +5864,7 @@
               volumeIds: arg_volumeIds,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDownloadAccesses(response);
+        checkDownloadAccesses(response as api.DownloadAccesses);
       })));
     });
 
@@ -5849,7 +5932,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRequestAccessData(response);
+        checkRequestAccessData(response as api.RequestAccessData);
       })));
     });
 
@@ -5923,7 +6006,7 @@
               volumeIds: arg_volumeIds,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
 
@@ -5933,8 +6016,9 @@
       var arg_request = buildUsersettings();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Usersettings.fromJson(json);
-        checkUsersettings(obj);
+        var obj = api.Usersettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUsersettings(obj as api.Usersettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5973,7 +6057,7 @@
       res
           .updateUserSettings(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsersettings(response);
+        checkUsersettings(response as api.Usersettings);
       })));
     });
   });
@@ -6027,7 +6111,7 @@
       res
           .delete(arg_annotationId, source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6041,8 +6125,9 @@
       var arg_source = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Annotation.fromJson(json);
-        checkAnnotation(obj);
+        var obj = api.Annotation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnnotation(obj as api.Annotation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6093,7 +6178,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnotation(response);
+        checkAnnotation(response as api.Annotation);
       })));
     });
 
@@ -6178,7 +6263,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnotations(response);
+        checkAnnotations(response as api.Annotations);
       })));
     });
 
@@ -6232,7 +6317,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnotationsSummary(response);
+        checkAnnotationsSummary(response as api.AnnotationsSummary);
       })));
     });
 
@@ -6244,8 +6329,9 @@
       var arg_source = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Annotation.fromJson(json);
-        checkAnnotation(obj);
+        var obj = api.Annotation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnnotation(obj as api.Annotation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6289,7 +6375,7 @@
           .update(arg_request, arg_annotationId,
               source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnotation(response);
+        checkAnnotation(response as api.Annotation);
       })));
     });
   });
@@ -6358,7 +6444,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6416,7 +6502,7 @@
       res
           .clearVolumes(arg_shelf, source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6468,7 +6554,7 @@
       res
           .get(arg_shelf, source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBookshelf(response);
+        checkBookshelf(response as api.Bookshelf);
       })));
     });
 
@@ -6516,7 +6602,7 @@
       res
           .list(source: arg_source, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBookshelves(response);
+        checkBookshelves(response as api.Bookshelves);
       })));
     });
 
@@ -6584,7 +6670,7 @@
               volumePosition: arg_volumePosition,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6651,7 +6737,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -6736,7 +6822,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
   });
@@ -6796,7 +6882,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReadingPosition(response);
+        checkReadingPosition(response as api.ReadingPosition);
       })));
     });
 
@@ -6875,7 +6961,7 @@
               timestamp: arg_timestamp,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -6934,7 +7020,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotification(response);
+        checkNotification(response as api.Notification);
       })));
     });
   });
@@ -6984,7 +7070,7 @@
       res
           .listCategories(locale: arg_locale, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCategory(response);
+        checkCategory(response as api.Category);
       })));
     });
 
@@ -7050,7 +7136,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolume2(response);
+        checkVolume2(response as api.Volume2);
       })));
     });
   });
@@ -7109,7 +7195,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiscoveryclusters(response);
+        checkDiscoveryclusters(response as api.Discoveryclusters);
       })));
     });
   });
@@ -7187,7 +7273,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -7259,7 +7345,7 @@
               serial: arg_serial,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -7327,7 +7413,7 @@
               serial: arg_serial,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOffers(response);
+        checkOffers(response as api.Offers);
       })));
     });
   });
@@ -7377,7 +7463,7 @@
       res
           .get(seriesId: arg_seriesId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSeries(response);
+        checkSeries(response as api.Series);
       })));
     });
   });
@@ -7438,7 +7524,7 @@
               seriesId: arg_seriesId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSeriesmembership(response);
+        checkSeriesmembership(response as api.Seriesmembership);
       })));
     });
   });
@@ -7514,7 +7600,7 @@
               userLibraryConsistentRead: arg_userLibraryConsistentRead,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolume(response);
+        checkVolume(response as api.Volume);
       })));
     });
 
@@ -7614,7 +7700,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
   });
@@ -7687,7 +7773,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
   });
@@ -7762,7 +7848,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
   });
@@ -7821,7 +7907,7 @@
               source: arg_source,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
 
@@ -7882,7 +7968,8 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBooksVolumesRecommendedRateResponse(response);
+        checkBooksVolumesRecommendedRateResponse(
+            response as api.BooksVolumesRecommendedRateResponse);
       })));
     });
   });
@@ -7952,7 +8039,7 @@
               volumeId: arg_volumeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVolumes(response);
+        checkVolumes(response as api.Volumes);
       })));
     });
   });
diff --git a/generated/googleapis/test/calendar/v3_test.dart b/generated/googleapis/test/calendar/v3_test.dart
index 6d9ee6e..4beac25 100644
--- a/generated/googleapis/test/calendar/v3_test.dart
+++ b/generated/googleapis/test/calendar/v3_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed3890(core.List<api.AclRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAclRule(o[0]);
-  checkAclRule(o[1]);
+  checkAclRule(o[0] as api.AclRule);
+  checkAclRule(o[1] as api.AclRule);
 }
 
 core.int buildCounterAcl = 0;
@@ -157,7 +157,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
-    checkAclRuleScope(o.scope);
+    checkAclRuleScope(o.scope as api.AclRuleScope);
   }
   buildCounterAclRule--;
 }
@@ -183,7 +183,8 @@
 void checkCalendar(api.Calendar o) {
   buildCounterCalendar++;
   if (buildCounterCalendar < 3) {
-    checkConferenceProperties(o.conferenceProperties);
+    checkConferenceProperties(
+        o.conferenceProperties as api.ConferenceProperties);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -204,8 +205,8 @@
 
 void checkUnnamed3891(core.List<api.CalendarListEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCalendarListEntry(o[0]);
-  checkCalendarListEntry(o[1]);
+  checkCalendarListEntry(o[0] as api.CalendarListEntry);
+  checkCalendarListEntry(o[1] as api.CalendarListEntry);
 }
 
 core.int buildCounterCalendarList = 0;
@@ -244,8 +245,8 @@
 
 void checkUnnamed3892(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventReminder(o[0]);
-  checkEventReminder(o[1]);
+  checkEventReminder(o[0] as api.EventReminder);
+  checkEventReminder(o[1] as api.EventReminder);
 }
 
 core.List<api.CalendarNotification> buildUnnamed3893() {
@@ -257,8 +258,8 @@
 
 void checkUnnamed3893(core.List<api.CalendarNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCalendarNotification(o[0]);
-  checkCalendarNotification(o[1]);
+  checkCalendarNotification(o[0] as api.CalendarNotification);
+  checkCalendarNotification(o[1] as api.CalendarNotification);
 }
 
 core.int buildCounterCalendarListEntryNotificationSettings = 0;
@@ -317,7 +318,8 @@
     unittest.expect(o.accessRole, unittest.equals('foo'));
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.colorId, unittest.equals('foo'));
-    checkConferenceProperties(o.conferenceProperties);
+    checkConferenceProperties(
+        o.conferenceProperties as api.ConferenceProperties);
     checkUnnamed3892(o.defaultReminders);
     unittest.expect(o.deleted, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
@@ -327,7 +329,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
-    checkCalendarListEntryNotificationSettings(o.notificationSettings);
+    checkCalendarListEntryNotificationSettings(
+        o.notificationSettings as api.CalendarListEntryNotificationSettings);
     unittest.expect(o.primary, unittest.isTrue);
     unittest.expect(o.selected, unittest.isTrue);
     unittest.expect(o.summary, unittest.equals('foo'));
@@ -438,8 +441,8 @@
 
 void checkUnnamed3895(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkColorDefinition(o['x']);
-  checkColorDefinition(o['y']);
+  checkColorDefinition(o['x'] as api.ColorDefinition);
+  checkColorDefinition(o['y'] as api.ColorDefinition);
 }
 
 core.Map<core.String, api.ColorDefinition> buildUnnamed3896() {
@@ -451,8 +454,8 @@
 
 void checkUnnamed3896(core.Map<core.String, api.ColorDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkColorDefinition(o['x']);
-  checkColorDefinition(o['y']);
+  checkColorDefinition(o['x'] as api.ColorDefinition);
+  checkColorDefinition(o['y'] as api.ColorDefinition);
 }
 
 core.int buildCounterColors = 0;
@@ -490,8 +493,8 @@
 
 void checkUnnamed3897(core.List<api.EntryPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntryPoint(o[0]);
-  checkEntryPoint(o[1]);
+  checkEntryPoint(o[0] as api.EntryPoint);
+  checkEntryPoint(o[1] as api.EntryPoint);
 }
 
 core.int buildCounterConferenceData = 0;
@@ -515,11 +518,12 @@
   buildCounterConferenceData++;
   if (buildCounterConferenceData < 3) {
     unittest.expect(o.conferenceId, unittest.equals('foo'));
-    checkConferenceSolution(o.conferenceSolution);
-    checkCreateConferenceRequest(o.createRequest);
+    checkConferenceSolution(o.conferenceSolution as api.ConferenceSolution);
+    checkCreateConferenceRequest(
+        o.createRequest as api.CreateConferenceRequest);
     checkUnnamed3897(o.entryPoints);
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkConferenceParameters(o.parameters);
+    checkConferenceParameters(o.parameters as api.ConferenceParameters);
     unittest.expect(o.signature, unittest.equals('foo'));
   }
   buildCounterConferenceData--;
@@ -539,7 +543,8 @@
 void checkConferenceParameters(api.ConferenceParameters o) {
   buildCounterConferenceParameters++;
   if (buildCounterConferenceParameters < 3) {
-    checkConferenceParametersAddOnParameters(o.addOnParameters);
+    checkConferenceParametersAddOnParameters(
+        o.addOnParameters as api.ConferenceParametersAddOnParameters);
   }
   buildCounterConferenceParameters--;
 }
@@ -646,7 +651,7 @@
   buildCounterConferenceSolution++;
   if (buildCounterConferenceSolution < 3) {
     unittest.expect(o.iconUri, unittest.equals('foo'));
-    checkConferenceSolutionKey(o.key);
+    checkConferenceSolutionKey(o.key as api.ConferenceSolutionKey);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterConferenceSolution--;
@@ -687,9 +692,10 @@
 void checkCreateConferenceRequest(api.CreateConferenceRequest o) {
   buildCounterCreateConferenceRequest++;
   if (buildCounterCreateConferenceRequest < 3) {
-    checkConferenceSolutionKey(o.conferenceSolutionKey);
+    checkConferenceSolutionKey(
+        o.conferenceSolutionKey as api.ConferenceSolutionKey);
     unittest.expect(o.requestId, unittest.equals('foo'));
-    checkConferenceRequestStatus(o.status);
+    checkConferenceRequestStatus(o.status as api.ConferenceRequestStatus);
   }
   buildCounterCreateConferenceRequest--;
 }
@@ -774,8 +780,8 @@
 
 void checkUnnamed3901(core.List<api.EventAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventAttachment(o[0]);
-  checkEventAttachment(o[1]);
+  checkEventAttachment(o[0] as api.EventAttachment);
+  checkEventAttachment(o[1] as api.EventAttachment);
 }
 
 core.List<api.EventAttendee> buildUnnamed3902() {
@@ -787,8 +793,8 @@
 
 void checkUnnamed3902(core.List<api.EventAttendee> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventAttendee(o[0]);
-  checkEventAttendee(o[1]);
+  checkEventAttendee(o[0] as api.EventAttendee);
+  checkEventAttendee(o[1] as api.EventAttendee);
 }
 
 core.int buildCounterEventCreator = 0;
@@ -956,8 +962,8 @@
 
 void checkUnnamed3907(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventReminder(o[0]);
-  checkEventReminder(o[1]);
+  checkEventReminder(o[0] as api.EventReminder);
+  checkEventReminder(o[1] as api.EventReminder);
 }
 
 core.int buildCounterEventReminders = 0;
@@ -1058,16 +1064,17 @@
     checkUnnamed3902(o.attendees);
     unittest.expect(o.attendeesOmitted, unittest.isTrue);
     unittest.expect(o.colorId, unittest.equals('foo'));
-    checkConferenceData(o.conferenceData);
+    checkConferenceData(o.conferenceData as api.ConferenceData);
     unittest.expect(
         o.created, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkEventCreator(o.creator);
+    checkEventCreator(o.creator as api.EventCreator);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkEventDateTime(o.end);
+    checkEventDateTime(o.end as api.EventDateTime);
     unittest.expect(o.endTimeUnspecified, unittest.isTrue);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkEventExtendedProperties(o.extendedProperties);
-    checkEventGadget(o.gadget);
+    checkEventExtendedProperties(
+        o.extendedProperties as api.EventExtendedProperties);
+    checkEventGadget(o.gadget as api.EventGadget);
     unittest.expect(o.guestsCanInviteOthers, unittest.isTrue);
     unittest.expect(o.guestsCanModify, unittest.isTrue);
     unittest.expect(o.guestsCanSeeOtherGuests, unittest.isTrue);
@@ -1078,15 +1085,15 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.locked, unittest.isTrue);
-    checkEventOrganizer(o.organizer);
-    checkEventDateTime(o.originalStartTime);
+    checkEventOrganizer(o.organizer as api.EventOrganizer);
+    checkEventDateTime(o.originalStartTime as api.EventDateTime);
     unittest.expect(o.privateCopy, unittest.isTrue);
     checkUnnamed3906(o.recurrence);
     unittest.expect(o.recurringEventId, unittest.equals('foo'));
-    checkEventReminders(o.reminders);
+    checkEventReminders(o.reminders as api.EventReminders);
     unittest.expect(o.sequence, unittest.equals(42));
-    checkEventSource(o.source);
-    checkEventDateTime(o.start);
+    checkEventSource(o.source as api.EventSource);
+    checkEventDateTime(o.start as api.EventDateTime);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.summary, unittest.equals('foo'));
     unittest.expect(o.transparency, unittest.equals('foo'));
@@ -1216,8 +1223,8 @@
 
 void checkUnnamed3908(core.List<api.EventReminder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventReminder(o[0]);
-  checkEventReminder(o[1]);
+  checkEventReminder(o[0] as api.EventReminder);
+  checkEventReminder(o[1] as api.EventReminder);
 }
 
 core.List<api.Event> buildUnnamed3909() {
@@ -1229,8 +1236,8 @@
 
 void checkUnnamed3909(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEvent(o[0]);
-  checkEvent(o[1]);
+  checkEvent(o[0] as api.Event);
+  checkEvent(o[1] as api.Event);
 }
 
 core.int buildCounterEvents = 0;
@@ -1282,8 +1289,8 @@
 
 void checkUnnamed3910(core.List<api.TimePeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimePeriod(o[0]);
-  checkTimePeriod(o[1]);
+  checkTimePeriod(o[0] as api.TimePeriod);
+  checkTimePeriod(o[1] as api.TimePeriod);
 }
 
 core.List<api.Error> buildUnnamed3911() {
@@ -1295,8 +1302,8 @@
 
 void checkUnnamed3911(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkError(o[0]);
-  checkError(o[1]);
+  checkError(o[0] as api.Error);
+  checkError(o[1] as api.Error);
 }
 
 core.int buildCounterFreeBusyCalendar = 0;
@@ -1342,8 +1349,8 @@
 
 void checkUnnamed3913(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkError(o[0]);
-  checkError(o[1]);
+  checkError(o[0] as api.Error);
+  checkError(o[1] as api.Error);
 }
 
 core.int buildCounterFreeBusyGroup = 0;
@@ -1376,8 +1383,8 @@
 
 void checkUnnamed3914(core.List<api.FreeBusyRequestItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFreeBusyRequestItem(o[0]);
-  checkFreeBusyRequestItem(o[1]);
+  checkFreeBusyRequestItem(o[0] as api.FreeBusyRequestItem);
+  checkFreeBusyRequestItem(o[1] as api.FreeBusyRequestItem);
 }
 
 core.int buildCounterFreeBusyRequest = 0;
@@ -1439,8 +1446,8 @@
 
 void checkUnnamed3915(core.Map<core.String, api.FreeBusyCalendar> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFreeBusyCalendar(o['x']);
-  checkFreeBusyCalendar(o['y']);
+  checkFreeBusyCalendar(o['x'] as api.FreeBusyCalendar);
+  checkFreeBusyCalendar(o['y'] as api.FreeBusyCalendar);
 }
 
 core.Map<core.String, api.FreeBusyGroup> buildUnnamed3916() {
@@ -1452,8 +1459,8 @@
 
 void checkUnnamed3916(core.Map<core.String, api.FreeBusyGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFreeBusyGroup(o['x']);
-  checkFreeBusyGroup(o['y']);
+  checkFreeBusyGroup(o['x'] as api.FreeBusyGroup);
+  checkFreeBusyGroup(o['y'] as api.FreeBusyGroup);
 }
 
 core.int buildCounterFreeBusyResponse = 0;
@@ -1519,8 +1526,8 @@
 
 void checkUnnamed3917(core.List<api.Setting> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSetting(o[0]);
-  checkSetting(o[1]);
+  checkSetting(o[0] as api.Setting);
+  checkSetting(o[1] as api.Setting);
 }
 
 core.int buildCounterSettings = 0;
@@ -1630,7 +1637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcl();
       var od = api.Acl.fromJson(o.toJson());
-      checkAcl(od);
+      checkAcl(od as api.Acl);
     });
   });
 
@@ -1638,7 +1645,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAclRuleScope();
       var od = api.AclRuleScope.fromJson(o.toJson());
-      checkAclRuleScope(od);
+      checkAclRuleScope(od as api.AclRuleScope);
     });
   });
 
@@ -1646,7 +1653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAclRule();
       var od = api.AclRule.fromJson(o.toJson());
-      checkAclRule(od);
+      checkAclRule(od as api.AclRule);
     });
   });
 
@@ -1654,7 +1661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendar();
       var od = api.Calendar.fromJson(o.toJson());
-      checkCalendar(od);
+      checkCalendar(od as api.Calendar);
     });
   });
 
@@ -1662,7 +1669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendarList();
       var od = api.CalendarList.fromJson(o.toJson());
-      checkCalendarList(od);
+      checkCalendarList(od as api.CalendarList);
     });
   });
 
@@ -1670,7 +1677,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendarListEntryNotificationSettings();
       var od = api.CalendarListEntryNotificationSettings.fromJson(o.toJson());
-      checkCalendarListEntryNotificationSettings(od);
+      checkCalendarListEntryNotificationSettings(
+          od as api.CalendarListEntryNotificationSettings);
     });
   });
 
@@ -1678,7 +1686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendarListEntry();
       var od = api.CalendarListEntry.fromJson(o.toJson());
-      checkCalendarListEntry(od);
+      checkCalendarListEntry(od as api.CalendarListEntry);
     });
   });
 
@@ -1686,7 +1694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendarNotification();
       var od = api.CalendarNotification.fromJson(o.toJson());
-      checkCalendarNotification(od);
+      checkCalendarNotification(od as api.CalendarNotification);
     });
   });
 
@@ -1694,7 +1702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -1702,7 +1710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColorDefinition();
       var od = api.ColorDefinition.fromJson(o.toJson());
-      checkColorDefinition(od);
+      checkColorDefinition(od as api.ColorDefinition);
     });
   });
 
@@ -1710,7 +1718,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColors();
       var od = api.Colors.fromJson(o.toJson());
-      checkColors(od);
+      checkColors(od as api.Colors);
     });
   });
 
@@ -1718,7 +1726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConferenceData();
       var od = api.ConferenceData.fromJson(o.toJson());
-      checkConferenceData(od);
+      checkConferenceData(od as api.ConferenceData);
     });
   });
 
@@ -1726,7 +1734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConferenceParameters();
       var od = api.ConferenceParameters.fromJson(o.toJson());
-      checkConferenceParameters(od);
+      checkConferenceParameters(od as api.ConferenceParameters);
     });
   });
 
@@ -1734,7 +1742,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildConferenceParametersAddOnParameters();
       var od = api.ConferenceParametersAddOnParameters.fromJson(o.toJson());
-      checkConferenceParametersAddOnParameters(od);
+      checkConferenceParametersAddOnParameters(
+          od as api.ConferenceParametersAddOnParameters);
     });
   });
 
@@ -1742,7 +1751,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConferenceProperties();
       var od = api.ConferenceProperties.fromJson(o.toJson());
-      checkConferenceProperties(od);
+      checkConferenceProperties(od as api.ConferenceProperties);
     });
   });
 
@@ -1750,7 +1759,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConferenceRequestStatus();
       var od = api.ConferenceRequestStatus.fromJson(o.toJson());
-      checkConferenceRequestStatus(od);
+      checkConferenceRequestStatus(od as api.ConferenceRequestStatus);
     });
   });
 
@@ -1758,7 +1767,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConferenceSolution();
       var od = api.ConferenceSolution.fromJson(o.toJson());
-      checkConferenceSolution(od);
+      checkConferenceSolution(od as api.ConferenceSolution);
     });
   });
 
@@ -1766,7 +1775,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConferenceSolutionKey();
       var od = api.ConferenceSolutionKey.fromJson(o.toJson());
-      checkConferenceSolutionKey(od);
+      checkConferenceSolutionKey(od as api.ConferenceSolutionKey);
     });
   });
 
@@ -1774,7 +1783,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateConferenceRequest();
       var od = api.CreateConferenceRequest.fromJson(o.toJson());
-      checkCreateConferenceRequest(od);
+      checkCreateConferenceRequest(od as api.CreateConferenceRequest);
     });
   });
 
@@ -1782,7 +1791,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntryPoint();
       var od = api.EntryPoint.fromJson(o.toJson());
-      checkEntryPoint(od);
+      checkEntryPoint(od as api.EntryPoint);
     });
   });
 
@@ -1790,7 +1799,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildError();
       var od = api.Error.fromJson(o.toJson());
-      checkError(od);
+      checkError(od as api.Error);
     });
   });
 
@@ -1798,7 +1807,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventCreator();
       var od = api.EventCreator.fromJson(o.toJson());
-      checkEventCreator(od);
+      checkEventCreator(od as api.EventCreator);
     });
   });
 
@@ -1806,7 +1815,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventExtendedProperties();
       var od = api.EventExtendedProperties.fromJson(o.toJson());
-      checkEventExtendedProperties(od);
+      checkEventExtendedProperties(od as api.EventExtendedProperties);
     });
   });
 
@@ -1814,7 +1823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventGadget();
       var od = api.EventGadget.fromJson(o.toJson());
-      checkEventGadget(od);
+      checkEventGadget(od as api.EventGadget);
     });
   });
 
@@ -1822,7 +1831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventOrganizer();
       var od = api.EventOrganizer.fromJson(o.toJson());
-      checkEventOrganizer(od);
+      checkEventOrganizer(od as api.EventOrganizer);
     });
   });
 
@@ -1830,7 +1839,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventReminders();
       var od = api.EventReminders.fromJson(o.toJson());
-      checkEventReminders(od);
+      checkEventReminders(od as api.EventReminders);
     });
   });
 
@@ -1838,7 +1847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventSource();
       var od = api.EventSource.fromJson(o.toJson());
-      checkEventSource(od);
+      checkEventSource(od as api.EventSource);
     });
   });
 
@@ -1846,7 +1855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEvent();
       var od = api.Event.fromJson(o.toJson());
-      checkEvent(od);
+      checkEvent(od as api.Event);
     });
   });
 
@@ -1854,7 +1863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventAttachment();
       var od = api.EventAttachment.fromJson(o.toJson());
-      checkEventAttachment(od);
+      checkEventAttachment(od as api.EventAttachment);
     });
   });
 
@@ -1862,7 +1871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventAttendee();
       var od = api.EventAttendee.fromJson(o.toJson());
-      checkEventAttendee(od);
+      checkEventAttendee(od as api.EventAttendee);
     });
   });
 
@@ -1870,7 +1879,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventDateTime();
       var od = api.EventDateTime.fromJson(o.toJson());
-      checkEventDateTime(od);
+      checkEventDateTime(od as api.EventDateTime);
     });
   });
 
@@ -1878,7 +1887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventReminder();
       var od = api.EventReminder.fromJson(o.toJson());
-      checkEventReminder(od);
+      checkEventReminder(od as api.EventReminder);
     });
   });
 
@@ -1886,7 +1895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEvents();
       var od = api.Events.fromJson(o.toJson());
-      checkEvents(od);
+      checkEvents(od as api.Events);
     });
   });
 
@@ -1894,7 +1903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFreeBusyCalendar();
       var od = api.FreeBusyCalendar.fromJson(o.toJson());
-      checkFreeBusyCalendar(od);
+      checkFreeBusyCalendar(od as api.FreeBusyCalendar);
     });
   });
 
@@ -1902,7 +1911,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFreeBusyGroup();
       var od = api.FreeBusyGroup.fromJson(o.toJson());
-      checkFreeBusyGroup(od);
+      checkFreeBusyGroup(od as api.FreeBusyGroup);
     });
   });
 
@@ -1910,7 +1919,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFreeBusyRequest();
       var od = api.FreeBusyRequest.fromJson(o.toJson());
-      checkFreeBusyRequest(od);
+      checkFreeBusyRequest(od as api.FreeBusyRequest);
     });
   });
 
@@ -1918,7 +1927,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFreeBusyRequestItem();
       var od = api.FreeBusyRequestItem.fromJson(o.toJson());
-      checkFreeBusyRequestItem(od);
+      checkFreeBusyRequestItem(od as api.FreeBusyRequestItem);
     });
   });
 
@@ -1926,7 +1935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFreeBusyResponse();
       var od = api.FreeBusyResponse.fromJson(o.toJson());
-      checkFreeBusyResponse(od);
+      checkFreeBusyResponse(od as api.FreeBusyResponse);
     });
   });
 
@@ -1934,7 +1943,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetting();
       var od = api.Setting.fromJson(o.toJson());
-      checkSetting(od);
+      checkSetting(od as api.Setting);
     });
   });
 
@@ -1942,7 +1951,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettings();
       var od = api.Settings.fromJson(o.toJson());
-      checkSettings(od);
+      checkSettings(od as api.Settings);
     });
   });
 
@@ -1950,7 +1959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimePeriod();
       var od = api.TimePeriod.fromJson(o.toJson());
-      checkTimePeriod(od);
+      checkTimePeriod(od as api.TimePeriod);
     });
   });
 
@@ -2075,7 +2084,7 @@
       res
           .get(arg_calendarId, arg_ruleId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAclRule(response);
+        checkAclRule(response as api.AclRule);
       })));
     });
 
@@ -2087,8 +2096,9 @@
       var arg_sendNotifications = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AclRule.fromJson(json);
-        checkAclRule(obj);
+        var obj =
+            api.AclRule.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAclRule(obj as api.AclRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2142,7 +2152,7 @@
           .insert(arg_request, arg_calendarId,
               sendNotifications: arg_sendNotifications, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAclRule(response);
+        checkAclRule(response as api.AclRule);
       })));
     });
 
@@ -2218,7 +2228,7 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAcl(response);
+        checkAcl(response as api.Acl);
       })));
     });
 
@@ -2231,8 +2241,9 @@
       var arg_sendNotifications = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AclRule.fromJson(json);
-        checkAclRule(obj);
+        var obj =
+            api.AclRule.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAclRule(obj as api.AclRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2289,7 +2300,7 @@
           .patch(arg_request, arg_calendarId, arg_ruleId,
               sendNotifications: arg_sendNotifications, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAclRule(response);
+        checkAclRule(response as api.AclRule);
       })));
     });
 
@@ -2302,8 +2313,9 @@
       var arg_sendNotifications = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AclRule.fromJson(json);
-        checkAclRule(obj);
+        var obj =
+            api.AclRule.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAclRule(obj as api.AclRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2360,7 +2372,7 @@
           .update(arg_request, arg_calendarId, arg_ruleId,
               sendNotifications: arg_sendNotifications, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAclRule(response);
+        checkAclRule(response as api.AclRule);
       })));
     });
 
@@ -2375,8 +2387,9 @@
       var arg_syncToken = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2440,7 +2453,7 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -2546,7 +2559,7 @@
       res
           .get(arg_calendarId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarListEntry(response);
+        checkCalendarListEntry(response as api.CalendarListEntry);
       })));
     });
 
@@ -2557,8 +2570,9 @@
       var arg_colorRgbFormat = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CalendarListEntry.fromJson(json);
-        checkCalendarListEntry(obj);
+        var obj = api.CalendarListEntry.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCalendarListEntry(obj as api.CalendarListEntry);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2603,7 +2617,7 @@
           .insert(arg_request,
               colorRgbFormat: arg_colorRgbFormat, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarListEntry(response);
+        checkCalendarListEntry(response as api.CalendarListEntry);
       })));
     });
 
@@ -2677,7 +2691,7 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarList(response);
+        checkCalendarList(response as api.CalendarList);
       })));
     });
 
@@ -2689,8 +2703,9 @@
       var arg_colorRgbFormat = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CalendarListEntry.fromJson(json);
-        checkCalendarListEntry(obj);
+        var obj = api.CalendarListEntry.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCalendarListEntry(obj as api.CalendarListEntry);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2738,7 +2753,7 @@
           .patch(arg_request, arg_calendarId,
               colorRgbFormat: arg_colorRgbFormat, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarListEntry(response);
+        checkCalendarListEntry(response as api.CalendarListEntry);
       })));
     });
 
@@ -2750,8 +2765,9 @@
       var arg_colorRgbFormat = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CalendarListEntry.fromJson(json);
-        checkCalendarListEntry(obj);
+        var obj = api.CalendarListEntry.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCalendarListEntry(obj as api.CalendarListEntry);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2799,7 +2815,7 @@
           .update(arg_request, arg_calendarId,
               colorRgbFormat: arg_colorRgbFormat, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendarListEntry(response);
+        checkCalendarListEntry(response as api.CalendarListEntry);
       })));
     });
 
@@ -2815,8 +2831,9 @@
       var arg_syncToken = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2877,7 +2894,7 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -3040,7 +3057,7 @@
       res
           .get(arg_calendarId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendar(response);
+        checkCalendar(response as api.Calendar);
       })));
     });
 
@@ -3050,8 +3067,9 @@
       var arg_request = buildCalendar();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Calendar.fromJson(json);
-        checkCalendar(obj);
+        var obj =
+            api.Calendar.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCalendar(obj as api.Calendar);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3093,7 +3111,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendar(response);
+        checkCalendar(response as api.Calendar);
       })));
     });
 
@@ -3104,8 +3122,9 @@
       var arg_calendarId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Calendar.fromJson(json);
-        checkCalendar(obj);
+        var obj =
+            api.Calendar.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCalendar(obj as api.Calendar);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3150,7 +3169,7 @@
       res
           .patch(arg_request, arg_calendarId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendar(response);
+        checkCalendar(response as api.Calendar);
       })));
     });
 
@@ -3161,8 +3180,9 @@
       var arg_calendarId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Calendar.fromJson(json);
-        checkCalendar(obj);
+        var obj =
+            api.Calendar.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCalendar(obj as api.Calendar);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3207,7 +3227,7 @@
       res
           .update(arg_request, arg_calendarId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCalendar(response);
+        checkCalendar(response as api.Calendar);
       })));
     });
   });
@@ -3219,8 +3239,9 @@
       var arg_request = buildChannel();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3309,7 +3330,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.get($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkColors(response);
+        checkColors(response as api.Colors);
       })));
     });
   });
@@ -3457,7 +3478,7 @@
               timeZone: arg_timeZone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvent(response);
+        checkEvent(response as api.Event);
       })));
     });
 
@@ -3470,8 +3491,9 @@
       var arg_supportsAttachments = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Event.fromJson(json);
-        checkEvent(obj);
+        var obj =
+            api.Event.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEvent(obj as api.Event);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3529,7 +3551,7 @@
               supportsAttachments: arg_supportsAttachments,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvent(response);
+        checkEvent(response as api.Event);
       })));
     });
 
@@ -3545,8 +3567,9 @@
       var arg_supportsAttachments = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Event.fromJson(json);
-        checkEvent(obj);
+        var obj =
+            api.Event.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEvent(obj as api.Event);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3613,7 +3636,7 @@
               supportsAttachments: arg_supportsAttachments,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvent(response);
+        checkEvent(response as api.Event);
       })));
     });
 
@@ -3719,7 +3742,7 @@
               timeZone: arg_timeZone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvents(response);
+        checkEvents(response as api.Events);
       })));
     });
 
@@ -3846,7 +3869,7 @@
               updatedMin: arg_updatedMin,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvents(response);
+        checkEvents(response as api.Events);
       })));
     });
 
@@ -3927,7 +3950,7 @@
               sendUpdates: arg_sendUpdates,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvent(response);
+        checkEvent(response as api.Event);
       })));
     });
 
@@ -3945,8 +3968,9 @@
       var arg_supportsAttachments = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Event.fromJson(json);
-        checkEvent(obj);
+        var obj =
+            api.Event.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEvent(obj as api.Event);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4019,7 +4043,7 @@
               supportsAttachments: arg_supportsAttachments,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvent(response);
+        checkEvent(response as api.Event);
       })));
     });
 
@@ -4089,7 +4113,7 @@
               sendUpdates: arg_sendUpdates,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvent(response);
+        checkEvent(response as api.Event);
       })));
     });
 
@@ -4107,8 +4131,9 @@
       var arg_supportsAttachments = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Event.fromJson(json);
-        checkEvent(obj);
+        var obj =
+            api.Event.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEvent(obj as api.Event);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4181,7 +4206,7 @@
               supportsAttachments: arg_supportsAttachments,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEvent(response);
+        checkEvent(response as api.Event);
       })));
     });
 
@@ -4209,8 +4234,9 @@
       var arg_updatedMin = core.DateTime.parse("2002-02-27T14:01:02");
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4312,7 +4338,7 @@
               updatedMin: arg_updatedMin,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -4324,8 +4350,9 @@
       var arg_request = buildFreeBusyRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FreeBusyRequest.fromJson(json);
-        checkFreeBusyRequest(obj);
+        var obj = api.FreeBusyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFreeBusyRequest(obj as api.FreeBusyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4367,7 +4394,7 @@
       res
           .query(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFreeBusyResponse(response);
+        checkFreeBusyResponse(response as api.FreeBusyResponse);
       })));
     });
   });
@@ -4422,7 +4449,7 @@
       res
           .get(arg_setting, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSetting(response);
+        checkSetting(response as api.Setting);
       })));
     });
 
@@ -4484,7 +4511,7 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSettings(response);
+        checkSettings(response as api.Settings);
       })));
     });
 
@@ -4497,8 +4524,9 @@
       var arg_syncToken = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4550,7 +4578,7 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
diff --git a/generated/googleapis/test/chat/v1_test.dart b/generated/googleapis/test/chat/v1_test.dart
index 186114d..b98b8d1 100644
--- a/generated/googleapis/test/chat/v1_test.dart
+++ b/generated/googleapis/test/chat/v1_test.dart
@@ -135,10 +135,10 @@
   buildCounterAnnotation++;
   if (buildCounterAnnotation < 3) {
     unittest.expect(o.length, unittest.equals(42));
-    checkSlashCommandMetadata(o.slashCommand);
+    checkSlashCommandMetadata(o.slashCommand as api.SlashCommandMetadata);
     unittest.expect(o.startIndex, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUserMentionMetadata(o.userMention);
+    checkUserMentionMetadata(o.userMention as api.UserMentionMetadata);
   }
   buildCounterAnnotation--;
 }
@@ -164,11 +164,11 @@
 void checkAttachment(api.Attachment o) {
   buildCounterAttachment++;
   if (buildCounterAttachment < 3) {
-    checkAttachmentDataRef(o.attachmentDataRef);
+    checkAttachmentDataRef(o.attachmentDataRef as api.AttachmentDataRef);
     unittest.expect(o.contentName, unittest.equals('foo'));
     unittest.expect(o.contentType, unittest.equals('foo'));
     unittest.expect(o.downloadUri, unittest.equals('foo'));
-    checkDriveDataRef(o.driveDataRef);
+    checkDriveDataRef(o.driveDataRef as api.DriveDataRef);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.thumbnailUri, unittest.equals('foo'));
@@ -210,8 +210,8 @@
 void checkButton(api.Button o) {
   buildCounterButton++;
   if (buildCounterButton < 3) {
-    checkImageButton(o.imageButton);
-    checkTextButton(o.textButton);
+    checkImageButton(o.imageButton as api.ImageButton);
+    checkTextButton(o.textButton as api.TextButton);
   }
   buildCounterButton--;
 }
@@ -225,8 +225,8 @@
 
 void checkUnnamed2960(core.List<api.CardAction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCardAction(o[0]);
-  checkCardAction(o[1]);
+  checkCardAction(o[0] as api.CardAction);
+  checkCardAction(o[1] as api.CardAction);
 }
 
 core.List<api.Section> buildUnnamed2961() {
@@ -238,8 +238,8 @@
 
 void checkUnnamed2961(core.List<api.Section> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSection(o[0]);
-  checkSection(o[1]);
+  checkSection(o[0] as api.Section);
+  checkSection(o[1] as api.Section);
 }
 
 core.int buildCounterCard = 0;
@@ -260,7 +260,7 @@
   buildCounterCard++;
   if (buildCounterCard < 3) {
     checkUnnamed2960(o.cardActions);
-    checkCardHeader(o.header);
+    checkCardHeader(o.header as api.CardHeader);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2961(o.sections);
   }
@@ -283,7 +283,7 @@
   buildCounterCardAction++;
   if (buildCounterCardAction < 3) {
     unittest.expect(o.actionLabel, unittest.equals('foo'));
-    checkOnClick(o.onClick);
+    checkOnClick(o.onClick as api.OnClick);
   }
   buildCounterCardAction--;
 }
@@ -335,15 +335,15 @@
 void checkDeprecatedEvent(api.DeprecatedEvent o) {
   buildCounterDeprecatedEvent++;
   if (buildCounterDeprecatedEvent < 3) {
-    checkFormAction(o.action);
+    checkFormAction(o.action as api.FormAction);
     unittest.expect(o.configCompleteRedirectUrl, unittest.equals('foo'));
     unittest.expect(o.eventTime, unittest.equals('foo'));
-    checkMessage(o.message);
-    checkSpace(o.space);
+    checkMessage(o.message as api.Message);
+    checkSpace(o.space as api.Space);
     unittest.expect(o.threadKey, unittest.equals('foo'));
     unittest.expect(o.token, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUser(o.user);
+    checkUser(o.user as api.User);
   }
   buildCounterDeprecatedEvent--;
 }
@@ -391,8 +391,8 @@
 
 void checkUnnamed2962(core.List<api.ActionParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActionParameter(o[0]);
-  checkActionParameter(o[1]);
+  checkActionParameter(o[0] as api.ActionParameter);
+  checkActionParameter(o[1] as api.ActionParameter);
 }
 
 core.int buildCounterFormAction = 0;
@@ -434,7 +434,7 @@
   if (buildCounterImage < 3) {
     unittest.expect(o.aspectRatio, unittest.equals(42.0));
     unittest.expect(o.imageUrl, unittest.equals('foo'));
-    checkOnClick(o.onClick);
+    checkOnClick(o.onClick as api.OnClick);
   }
   buildCounterImage--;
 }
@@ -459,7 +459,7 @@
     unittest.expect(o.icon, unittest.equals('foo'));
     unittest.expect(o.iconUrl, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOnClick(o.onClick);
+    checkOnClick(o.onClick as api.OnClick);
   }
   buildCounterImageButton--;
 }
@@ -486,12 +486,12 @@
   buildCounterKeyValue++;
   if (buildCounterKeyValue < 3) {
     unittest.expect(o.bottomLabel, unittest.equals('foo'));
-    checkButton(o.button);
+    checkButton(o.button as api.Button);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.contentMultiline, unittest.isTrue);
     unittest.expect(o.icon, unittest.equals('foo'));
     unittest.expect(o.iconUrl, unittest.equals('foo'));
-    checkOnClick(o.onClick);
+    checkOnClick(o.onClick as api.OnClick);
     unittest.expect(o.topLabel, unittest.equals('foo'));
   }
   buildCounterKeyValue--;
@@ -506,8 +506,8 @@
 
 void checkUnnamed2963(core.List<api.Membership> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMembership(o[0]);
-  checkMembership(o[1]);
+  checkMembership(o[0] as api.Membership);
+  checkMembership(o[1] as api.Membership);
 }
 
 core.int buildCounterListMembershipsResponse = 0;
@@ -540,8 +540,8 @@
 
 void checkUnnamed2964(core.List<api.Space> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSpace(o[0]);
-  checkSpace(o[1]);
+  checkSpace(o[0] as api.Space);
+  checkSpace(o[1] as api.Space);
 }
 
 core.int buildCounterListSpacesResponse = 0;
@@ -602,7 +602,7 @@
   buildCounterMembership++;
   if (buildCounterMembership < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkUser(o.member);
+    checkUser(o.member as api.User);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
   }
@@ -618,8 +618,8 @@
 
 void checkUnnamed2965(core.List<api.Annotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotation(o[0]);
-  checkAnnotation(o[1]);
+  checkAnnotation(o[0] as api.Annotation);
+  checkAnnotation(o[1] as api.Annotation);
 }
 
 core.List<api.Attachment> buildUnnamed2966() {
@@ -631,8 +631,8 @@
 
 void checkUnnamed2966(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttachment(o[0]);
-  checkAttachment(o[1]);
+  checkAttachment(o[0] as api.Attachment);
+  checkAttachment(o[1] as api.Attachment);
 }
 
 core.List<api.Card> buildUnnamed2967() {
@@ -644,8 +644,8 @@
 
 void checkUnnamed2967(core.List<api.Card> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCard(o[0]);
-  checkCard(o[1]);
+  checkCard(o[0] as api.Card);
+  checkCard(o[1] as api.Card);
 }
 
 core.int buildCounterMessage = 0;
@@ -675,7 +675,7 @@
 void checkMessage(api.Message o) {
   buildCounterMessage++;
   if (buildCounterMessage < 3) {
-    checkActionResponse(o.actionResponse);
+    checkActionResponse(o.actionResponse as api.ActionResponse);
     checkUnnamed2965(o.annotations);
     unittest.expect(o.argumentText, unittest.equals('foo'));
     checkUnnamed2966(o.attachment);
@@ -684,11 +684,11 @@
     unittest.expect(o.fallbackText, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.previewText, unittest.equals('foo'));
-    checkUser(o.sender);
-    checkSlashCommand(o.slashCommand);
-    checkSpace(o.space);
+    checkUser(o.sender as api.User);
+    checkSlashCommand(o.slashCommand as api.SlashCommand);
+    checkSpace(o.space as api.Space);
     unittest.expect(o.text, unittest.equals('foo'));
-    checkThread(o.thread);
+    checkThread(o.thread as api.Thread);
   }
   buildCounterMessage--;
 }
@@ -708,8 +708,8 @@
 void checkOnClick(api.OnClick o) {
   buildCounterOnClick++;
   if (buildCounterOnClick < 3) {
-    checkFormAction(o.action);
-    checkOpenLink(o.openLink);
+    checkFormAction(o.action as api.FormAction);
+    checkOpenLink(o.openLink as api.OpenLink);
   }
   buildCounterOnClick--;
 }
@@ -742,8 +742,8 @@
 
 void checkUnnamed2968(core.List<api.WidgetMarkup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWidgetMarkup(o[0]);
-  checkWidgetMarkup(o[1]);
+  checkWidgetMarkup(o[0] as api.WidgetMarkup);
+  checkWidgetMarkup(o[1] as api.WidgetMarkup);
 }
 
 core.int buildCounterSection = 0;
@@ -804,7 +804,7 @@
 void checkSlashCommandMetadata(api.SlashCommandMetadata o) {
   buildCounterSlashCommandMetadata++;
   if (buildCounterSlashCommandMetadata < 3) {
-    checkUser(o.bot);
+    checkUser(o.bot as api.User);
     unittest.expect(o.commandId, unittest.equals('foo'));
     unittest.expect(o.commandName, unittest.equals('foo'));
     unittest.expect(o.triggersDialog, unittest.isTrue);
@@ -855,7 +855,7 @@
 void checkTextButton(api.TextButton o) {
   buildCounterTextButton++;
   if (buildCounterTextButton < 3) {
-    checkOnClick(o.onClick);
+    checkOnClick(o.onClick as api.OnClick);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterTextButton--;
@@ -940,7 +940,7 @@
   buildCounterUserMentionMetadata++;
   if (buildCounterUserMentionMetadata < 3) {
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUser(o.user);
+    checkUser(o.user as api.User);
   }
   buildCounterUserMentionMetadata--;
 }
@@ -954,8 +954,8 @@
 
 void checkUnnamed2969(core.List<api.Button> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkButton(o[0]);
-  checkButton(o[1]);
+  checkButton(o[0] as api.Button);
+  checkButton(o[1] as api.Button);
 }
 
 core.int buildCounterWidgetMarkup = 0;
@@ -976,9 +976,9 @@
   buildCounterWidgetMarkup++;
   if (buildCounterWidgetMarkup < 3) {
     checkUnnamed2969(o.buttons);
-    checkImage(o.image);
-    checkKeyValue(o.keyValue);
-    checkTextParagraph(o.textParagraph);
+    checkImage(o.image as api.Image);
+    checkKeyValue(o.keyValue as api.KeyValue);
+    checkTextParagraph(o.textParagraph as api.TextParagraph);
   }
   buildCounterWidgetMarkup--;
 }
@@ -988,7 +988,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActionParameter();
       var od = api.ActionParameter.fromJson(o.toJson());
-      checkActionParameter(od);
+      checkActionParameter(od as api.ActionParameter);
     });
   });
 
@@ -996,7 +996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActionResponse();
       var od = api.ActionResponse.fromJson(o.toJson());
-      checkActionResponse(od);
+      checkActionResponse(od as api.ActionResponse);
     });
   });
 
@@ -1004,7 +1004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotation();
       var od = api.Annotation.fromJson(o.toJson());
-      checkAnnotation(od);
+      checkAnnotation(od as api.Annotation);
     });
   });
 
@@ -1012,7 +1012,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttachment();
       var od = api.Attachment.fromJson(o.toJson());
-      checkAttachment(od);
+      checkAttachment(od as api.Attachment);
     });
   });
 
@@ -1020,7 +1020,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttachmentDataRef();
       var od = api.AttachmentDataRef.fromJson(o.toJson());
-      checkAttachmentDataRef(od);
+      checkAttachmentDataRef(od as api.AttachmentDataRef);
     });
   });
 
@@ -1028,7 +1028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildButton();
       var od = api.Button.fromJson(o.toJson());
-      checkButton(od);
+      checkButton(od as api.Button);
     });
   });
 
@@ -1036,7 +1036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCard();
       var od = api.Card.fromJson(o.toJson());
-      checkCard(od);
+      checkCard(od as api.Card);
     });
   });
 
@@ -1044,7 +1044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCardAction();
       var od = api.CardAction.fromJson(o.toJson());
-      checkCardAction(od);
+      checkCardAction(od as api.CardAction);
     });
   });
 
@@ -1052,7 +1052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCardHeader();
       var od = api.CardHeader.fromJson(o.toJson());
-      checkCardHeader(od);
+      checkCardHeader(od as api.CardHeader);
     });
   });
 
@@ -1060,7 +1060,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeprecatedEvent();
       var od = api.DeprecatedEvent.fromJson(o.toJson());
-      checkDeprecatedEvent(od);
+      checkDeprecatedEvent(od as api.DeprecatedEvent);
     });
   });
 
@@ -1068,7 +1068,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveDataRef();
       var od = api.DriveDataRef.fromJson(o.toJson());
-      checkDriveDataRef(od);
+      checkDriveDataRef(od as api.DriveDataRef);
     });
   });
 
@@ -1076,7 +1076,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1084,7 +1084,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFormAction();
       var od = api.FormAction.fromJson(o.toJson());
-      checkFormAction(od);
+      checkFormAction(od as api.FormAction);
     });
   });
 
@@ -1092,7 +1092,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImage();
       var od = api.Image.fromJson(o.toJson());
-      checkImage(od);
+      checkImage(od as api.Image);
     });
   });
 
@@ -1100,7 +1100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageButton();
       var od = api.ImageButton.fromJson(o.toJson());
-      checkImageButton(od);
+      checkImageButton(od as api.ImageButton);
     });
   });
 
@@ -1108,7 +1108,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyValue();
       var od = api.KeyValue.fromJson(o.toJson());
-      checkKeyValue(od);
+      checkKeyValue(od as api.KeyValue);
     });
   });
 
@@ -1116,7 +1116,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListMembershipsResponse();
       var od = api.ListMembershipsResponse.fromJson(o.toJson());
-      checkListMembershipsResponse(od);
+      checkListMembershipsResponse(od as api.ListMembershipsResponse);
     });
   });
 
@@ -1124,7 +1124,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSpacesResponse();
       var od = api.ListSpacesResponse.fromJson(o.toJson());
-      checkListSpacesResponse(od);
+      checkListSpacesResponse(od as api.ListSpacesResponse);
     });
   });
 
@@ -1132,7 +1132,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMedia();
       var od = api.Media.fromJson(o.toJson());
-      checkMedia(od);
+      checkMedia(od as api.Media);
     });
   });
 
@@ -1140,7 +1140,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembership();
       var od = api.Membership.fromJson(o.toJson());
-      checkMembership(od);
+      checkMembership(od as api.Membership);
     });
   });
 
@@ -1148,7 +1148,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessage();
       var od = api.Message.fromJson(o.toJson());
-      checkMessage(od);
+      checkMessage(od as api.Message);
     });
   });
 
@@ -1156,7 +1156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOnClick();
       var od = api.OnClick.fromJson(o.toJson());
-      checkOnClick(od);
+      checkOnClick(od as api.OnClick);
     });
   });
 
@@ -1164,7 +1164,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOpenLink();
       var od = api.OpenLink.fromJson(o.toJson());
-      checkOpenLink(od);
+      checkOpenLink(od as api.OpenLink);
     });
   });
 
@@ -1172,7 +1172,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSection();
       var od = api.Section.fromJson(o.toJson());
-      checkSection(od);
+      checkSection(od as api.Section);
     });
   });
 
@@ -1180,7 +1180,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSlashCommand();
       var od = api.SlashCommand.fromJson(o.toJson());
-      checkSlashCommand(od);
+      checkSlashCommand(od as api.SlashCommand);
     });
   });
 
@@ -1188,7 +1188,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSlashCommandMetadata();
       var od = api.SlashCommandMetadata.fromJson(o.toJson());
-      checkSlashCommandMetadata(od);
+      checkSlashCommandMetadata(od as api.SlashCommandMetadata);
     });
   });
 
@@ -1196,7 +1196,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpace();
       var od = api.Space.fromJson(o.toJson());
-      checkSpace(od);
+      checkSpace(od as api.Space);
     });
   });
 
@@ -1204,7 +1204,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextButton();
       var od = api.TextButton.fromJson(o.toJson());
-      checkTextButton(od);
+      checkTextButton(od as api.TextButton);
     });
   });
 
@@ -1212,7 +1212,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextParagraph();
       var od = api.TextParagraph.fromJson(o.toJson());
-      checkTextParagraph(od);
+      checkTextParagraph(od as api.TextParagraph);
     });
   });
 
@@ -1220,7 +1220,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThread();
       var od = api.Thread.fromJson(o.toJson());
-      checkThread(od);
+      checkThread(od as api.Thread);
     });
   });
 
@@ -1228,7 +1228,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -1236,7 +1236,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserMentionMetadata();
       var od = api.UserMentionMetadata.fromJson(o.toJson());
-      checkUserMentionMetadata(od);
+      checkUserMentionMetadata(od as api.UserMentionMetadata);
     });
   });
 
@@ -1244,7 +1244,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWidgetMarkup();
       var od = api.WidgetMarkup.fromJson(o.toJson());
-      checkWidgetMarkup(od);
+      checkWidgetMarkup(od as api.WidgetMarkup);
     });
   });
 
@@ -1296,7 +1296,7 @@
       res
           .download(arg_resourceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMedia(response);
+        checkMedia(response as api.Media);
       })));
     });
   });
@@ -1346,7 +1346,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSpace(response);
+        checkSpace(response as api.Space);
       })));
     });
 
@@ -1401,7 +1401,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSpacesResponse(response);
+        checkListSpacesResponse(response as api.ListSpacesResponse);
       })));
     });
   });
@@ -1451,7 +1451,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMembership(response);
+        checkMembership(response as api.Membership);
       })));
     });
 
@@ -1508,7 +1508,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMembershipsResponse(response);
+        checkListMembershipsResponse(response as api.ListMembershipsResponse);
       })));
     });
   });
@@ -1522,8 +1522,9 @@
       var arg_threadKey = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Message.fromJson(json);
-        checkMessage(obj);
+        var obj =
+            api.Message.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMessage(obj as api.Message);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1566,7 +1567,7 @@
           .create(arg_request, arg_parent,
               threadKey: arg_threadKey, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -1614,7 +1615,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1662,7 +1663,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -1674,8 +1675,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Message.fromJson(json);
-        checkMessage(obj);
+        var obj =
+            api.Message.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMessage(obj as api.Message);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1718,7 +1720,7 @@
           .update(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
   });
@@ -1768,7 +1770,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAttachment(response);
+        checkAttachment(response as api.Attachment);
       })));
     });
   });
diff --git a/generated/googleapis/test/civicinfo/v2_test.dart b/generated/googleapis/test/civicinfo/v2_test.dart
index b598d17..64cf7f1 100644
--- a/generated/googleapis/test/civicinfo/v2_test.dart
+++ b/generated/googleapis/test/civicinfo/v2_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed2221(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSource(o[0]);
-  checkSource(o[1]);
+  checkSource(o[0] as api.Source);
+  checkSource(o[1] as api.Source);
 }
 
 core.int buildCounterAdministrationRegion = 0;
@@ -105,9 +105,10 @@
 void checkAdministrationRegion(api.AdministrationRegion o) {
   buildCounterAdministrationRegion++;
   if (buildCounterAdministrationRegion < 3) {
-    checkAdministrativeBody(o.electionAdministrationBody);
+    checkAdministrativeBody(
+        o.electionAdministrationBody as api.AdministrativeBody);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkAdministrationRegion(o.localJurisdiction);
+    checkAdministrationRegion(o.localJurisdiction as api.AdministrationRegion);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2221(o.sources);
   }
@@ -123,8 +124,8 @@
 
 void checkUnnamed2222(core.List<api.ElectionOfficial> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkElectionOfficial(o[0]);
-  checkElectionOfficial(o[1]);
+  checkElectionOfficial(o[0] as api.ElectionOfficial);
+  checkElectionOfficial(o[1] as api.ElectionOfficial);
 }
 
 core.List<core.String> buildUnnamed2223() {
@@ -170,7 +171,7 @@
   if (buildCounterAdministrativeBody < 3) {
     unittest.expect(o.absenteeVotingInfoUrl, unittest.equals('foo'));
     unittest.expect(o.ballotInfoUrl, unittest.equals('foo'));
-    checkSimpleAddressType(o.correspondenceAddress);
+    checkSimpleAddressType(o.correspondenceAddress as api.SimpleAddressType);
     unittest.expect(o.electionInfoUrl, unittest.equals('foo'));
     unittest.expect(o.electionNoticeText, unittest.equals('foo'));
     unittest.expect(o.electionNoticeUrl, unittest.equals('foo'));
@@ -181,7 +182,7 @@
     unittest.expect(o.electionRulesUrl, unittest.equals('foo'));
     unittest.expect(o.hoursOfOperation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkSimpleAddressType(o.physicalAddress);
+    checkSimpleAddressType(o.physicalAddress as api.SimpleAddressType);
     checkUnnamed2223(o.voterServices);
     unittest.expect(o.votingLocationFinderUrl, unittest.equals('foo'));
   }
@@ -197,8 +198,8 @@
 
 void checkUnnamed2224(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannel(o[0]);
-  checkChannel(o[1]);
+  checkChannel(o[0] as api.Channel);
+  checkChannel(o[1] as api.Channel);
 }
 
 core.int buildCounterCandidate = 0;
@@ -264,8 +265,8 @@
 
 void checkUnnamed2225(core.List<api.Candidate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCandidate(o[0]);
-  checkCandidate(o[1]);
+  checkCandidate(o[0] as api.Candidate);
+  checkCandidate(o[1] as api.Candidate);
 }
 
 core.List<core.String> buildUnnamed2226() {
@@ -329,8 +330,8 @@
 
 void checkUnnamed2230(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSource(o[0]);
-  checkSource(o[1]);
+  checkSource(o[0] as api.Source);
+  checkSource(o[1] as api.Source);
 }
 
 core.int buildCounterContest = 0;
@@ -375,7 +376,7 @@
     unittest.expect(o.ballotPlacement, unittest.equals('foo'));
     unittest.expect(o.ballotTitle, unittest.equals('foo'));
     checkUnnamed2225(o.candidates);
-    checkElectoralDistrict(o.district);
+    checkElectoralDistrict(o.district as api.ElectoralDistrict);
     unittest.expect(o.electorateSpecifications, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkUnnamed2226(o.level);
@@ -411,8 +412,8 @@
 
 void checkUnnamed2231(core.List<api.DivisionSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDivisionSearchResult(o[0]);
-  checkDivisionSearchResult(o[1]);
+  checkDivisionSearchResult(o[0] as api.DivisionSearchResult);
+  checkDivisionSearchResult(o[1] as api.DivisionSearchResult);
 }
 
 core.int buildCounterDivisionSearchResponse = 0;
@@ -533,8 +534,8 @@
 
 void checkUnnamed2233(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkElection(o[0]);
-  checkElection(o[1]);
+  checkElection(o[0] as api.Election);
+  checkElection(o[1] as api.Election);
 }
 
 core.int buildCounterElectionsQueryResponse = 0;
@@ -678,8 +679,8 @@
 
 void checkUnnamed2239(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSource(o[0]);
-  checkSource(o[1]);
+  checkSource(o[0] as api.Source);
+  checkSource(o[1] as api.Source);
 }
 
 core.int buildCounterOffice = 0;
@@ -720,8 +721,8 @@
 
 void checkUnnamed2240(core.List<api.SimpleAddressType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSimpleAddressType(o[0]);
-  checkSimpleAddressType(o[1]);
+  checkSimpleAddressType(o[0] as api.SimpleAddressType);
+  checkSimpleAddressType(o[1] as api.SimpleAddressType);
 }
 
 core.List<api.Channel> buildUnnamed2241() {
@@ -733,8 +734,8 @@
 
 void checkUnnamed2241(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannel(o[0]);
-  checkChannel(o[1]);
+  checkChannel(o[0] as api.Channel);
+  checkChannel(o[1] as api.Channel);
 }
 
 core.List<core.String> buildUnnamed2242() {
@@ -818,8 +819,8 @@
 
 void checkUnnamed2245(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSource(o[0]);
-  checkSource(o[1]);
+  checkSource(o[0] as api.Source);
+  checkSource(o[1] as api.Source);
 }
 
 core.int buildCounterPollingLocation = 0;
@@ -846,7 +847,7 @@
 void checkPollingLocation(api.PollingLocation o) {
   buildCounterPollingLocation++;
   if (buildCounterPollingLocation < 3) {
-    checkSimpleAddressType(o.address);
+    checkSimpleAddressType(o.address as api.SimpleAddressType);
     unittest.expect(o.endDate, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.latitude, unittest.equals(42.0));
@@ -870,8 +871,8 @@
 
 void checkUnnamed2246(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGeographicDivision(o['x']);
-  checkGeographicDivision(o['y']);
+  checkGeographicDivision(o['x'] as api.GeographicDivision);
+  checkGeographicDivision(o['y'] as api.GeographicDivision);
 }
 
 core.List<api.Office> buildUnnamed2247() {
@@ -883,8 +884,8 @@
 
 void checkUnnamed2247(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOffice(o[0]);
-  checkOffice(o[1]);
+  checkOffice(o[0] as api.Office);
+  checkOffice(o[1] as api.Office);
 }
 
 core.List<api.Official> buildUnnamed2248() {
@@ -896,8 +897,8 @@
 
 void checkUnnamed2248(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOfficial(o[0]);
-  checkOfficial(o[1]);
+  checkOfficial(o[0] as api.Official);
+  checkOfficial(o[1] as api.Official);
 }
 
 core.int buildCounterRepresentativeInfoData = 0;
@@ -932,8 +933,8 @@
 
 void checkUnnamed2249(core.Map<core.String, api.GeographicDivision> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGeographicDivision(o['x']);
-  checkGeographicDivision(o['y']);
+  checkGeographicDivision(o['x'] as api.GeographicDivision);
+  checkGeographicDivision(o['y'] as api.GeographicDivision);
 }
 
 core.List<api.Office> buildUnnamed2250() {
@@ -945,8 +946,8 @@
 
 void checkUnnamed2250(core.List<api.Office> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOffice(o[0]);
-  checkOffice(o[1]);
+  checkOffice(o[0] as api.Office);
+  checkOffice(o[1] as api.Office);
 }
 
 core.List<api.Official> buildUnnamed2251() {
@@ -958,8 +959,8 @@
 
 void checkUnnamed2251(core.List<api.Official> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOfficial(o[0]);
-  checkOfficial(o[1]);
+  checkOfficial(o[0] as api.Official);
+  checkOfficial(o[1] as api.Official);
 }
 
 core.int buildCounterRepresentativeInfoResponse = 0;
@@ -982,7 +983,7 @@
   if (buildCounterRepresentativeInfoResponse < 3) {
     checkUnnamed2249(o.divisions);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSimpleAddressType(o.normalizedInput);
+    checkSimpleAddressType(o.normalizedInput as api.SimpleAddressType);
     checkUnnamed2250(o.offices);
     checkUnnamed2251(o.officials);
   }
@@ -1050,8 +1051,8 @@
 
 void checkUnnamed2252(core.List<api.Contest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContest(o[0]);
-  checkContest(o[1]);
+  checkContest(o[0] as api.Contest);
+  checkContest(o[1] as api.Contest);
 }
 
 core.List<api.PollingLocation> buildUnnamed2253() {
@@ -1063,8 +1064,8 @@
 
 void checkUnnamed2253(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPollingLocation(o[0]);
-  checkPollingLocation(o[1]);
+  checkPollingLocation(o[0] as api.PollingLocation);
+  checkPollingLocation(o[1] as api.PollingLocation);
 }
 
 core.List<api.PollingLocation> buildUnnamed2254() {
@@ -1076,8 +1077,8 @@
 
 void checkUnnamed2254(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPollingLocation(o[0]);
-  checkPollingLocation(o[1]);
+  checkPollingLocation(o[0] as api.PollingLocation);
+  checkPollingLocation(o[1] as api.PollingLocation);
 }
 
 core.List<api.Election> buildUnnamed2255() {
@@ -1089,8 +1090,8 @@
 
 void checkUnnamed2255(core.List<api.Election> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkElection(o[0]);
-  checkElection(o[1]);
+  checkElection(o[0] as api.Election);
+  checkElection(o[1] as api.Election);
 }
 
 core.List<api.PollingLocation> buildUnnamed2256() {
@@ -1102,8 +1103,8 @@
 
 void checkUnnamed2256(core.List<api.PollingLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPollingLocation(o[0]);
-  checkPollingLocation(o[1]);
+  checkPollingLocation(o[0] as api.PollingLocation);
+  checkPollingLocation(o[1] as api.PollingLocation);
 }
 
 core.List<api.AdministrationRegion> buildUnnamed2257() {
@@ -1115,8 +1116,8 @@
 
 void checkUnnamed2257(core.List<api.AdministrationRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdministrationRegion(o[0]);
-  checkAdministrationRegion(o[1]);
+  checkAdministrationRegion(o[0] as api.AdministrationRegion);
+  checkAdministrationRegion(o[1] as api.AdministrationRegion);
 }
 
 core.int buildCounterVoterInfoResponse = 0;
@@ -1146,10 +1147,10 @@
     checkUnnamed2252(o.contests);
     checkUnnamed2253(o.dropOffLocations);
     checkUnnamed2254(o.earlyVoteSites);
-    checkElection(o.election);
+    checkElection(o.election as api.Election);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.mailOnly, unittest.isTrue);
-    checkSimpleAddressType(o.normalizedInput);
+    checkSimpleAddressType(o.normalizedInput as api.SimpleAddressType);
     checkUnnamed2255(o.otherElections);
     checkUnnamed2256(o.pollingLocations);
     unittest.expect(o.precinctId, unittest.equals('foo'));
@@ -1215,7 +1216,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministrationRegion();
       var od = api.AdministrationRegion.fromJson(o.toJson());
-      checkAdministrationRegion(od);
+      checkAdministrationRegion(od as api.AdministrationRegion);
     });
   });
 
@@ -1223,7 +1224,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministrativeBody();
       var od = api.AdministrativeBody.fromJson(o.toJson());
-      checkAdministrativeBody(od);
+      checkAdministrativeBody(od as api.AdministrativeBody);
     });
   });
 
@@ -1231,7 +1232,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCandidate();
       var od = api.Candidate.fromJson(o.toJson());
-      checkCandidate(od);
+      checkCandidate(od as api.Candidate);
     });
   });
 
@@ -1239,7 +1240,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -1247,7 +1248,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContest();
       var od = api.Contest.fromJson(o.toJson());
-      checkContest(od);
+      checkContest(od as api.Contest);
     });
   });
 
@@ -1255,7 +1256,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDivisionSearchResponse();
       var od = api.DivisionSearchResponse.fromJson(o.toJson());
-      checkDivisionSearchResponse(od);
+      checkDivisionSearchResponse(od as api.DivisionSearchResponse);
     });
   });
 
@@ -1263,7 +1264,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDivisionSearchResult();
       var od = api.DivisionSearchResult.fromJson(o.toJson());
-      checkDivisionSearchResult(od);
+      checkDivisionSearchResult(od as api.DivisionSearchResult);
     });
   });
 
@@ -1271,7 +1272,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildElection();
       var od = api.Election.fromJson(o.toJson());
-      checkElection(od);
+      checkElection(od as api.Election);
     });
   });
 
@@ -1279,7 +1280,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildElectionOfficial();
       var od = api.ElectionOfficial.fromJson(o.toJson());
-      checkElectionOfficial(od);
+      checkElectionOfficial(od as api.ElectionOfficial);
     });
   });
 
@@ -1287,7 +1288,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildElectionsQueryResponse();
       var od = api.ElectionsQueryResponse.fromJson(o.toJson());
-      checkElectionsQueryResponse(od);
+      checkElectionsQueryResponse(od as api.ElectionsQueryResponse);
     });
   });
 
@@ -1295,7 +1296,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildElectoralDistrict();
       var od = api.ElectoralDistrict.fromJson(o.toJson());
-      checkElectoralDistrict(od);
+      checkElectoralDistrict(od as api.ElectoralDistrict);
     });
   });
 
@@ -1303,7 +1304,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeographicDivision();
       var od = api.GeographicDivision.fromJson(o.toJson());
-      checkGeographicDivision(od);
+      checkGeographicDivision(od as api.GeographicDivision);
     });
   });
 
@@ -1311,7 +1312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOffice();
       var od = api.Office.fromJson(o.toJson());
-      checkOffice(od);
+      checkOffice(od as api.Office);
     });
   });
 
@@ -1319,7 +1320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOfficial();
       var od = api.Official.fromJson(o.toJson());
-      checkOfficial(od);
+      checkOfficial(od as api.Official);
     });
   });
 
@@ -1327,7 +1328,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPollingLocation();
       var od = api.PollingLocation.fromJson(o.toJson());
-      checkPollingLocation(od);
+      checkPollingLocation(od as api.PollingLocation);
     });
   });
 
@@ -1335,7 +1336,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepresentativeInfoData();
       var od = api.RepresentativeInfoData.fromJson(o.toJson());
-      checkRepresentativeInfoData(od);
+      checkRepresentativeInfoData(od as api.RepresentativeInfoData);
     });
   });
 
@@ -1343,7 +1344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepresentativeInfoResponse();
       var od = api.RepresentativeInfoResponse.fromJson(o.toJson());
-      checkRepresentativeInfoResponse(od);
+      checkRepresentativeInfoResponse(od as api.RepresentativeInfoResponse);
     });
   });
 
@@ -1351,7 +1352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSimpleAddressType();
       var od = api.SimpleAddressType.fromJson(o.toJson());
-      checkSimpleAddressType(od);
+      checkSimpleAddressType(od as api.SimpleAddressType);
     });
   });
 
@@ -1359,7 +1360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSource();
       var od = api.Source.fromJson(o.toJson());
-      checkSource(od);
+      checkSource(od as api.Source);
     });
   });
 
@@ -1367,7 +1368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVoterInfoResponse();
       var od = api.VoterInfoResponse.fromJson(o.toJson());
-      checkVoterInfoResponse(od);
+      checkVoterInfoResponse(od as api.VoterInfoResponse);
     });
   });
 
@@ -1416,7 +1417,7 @@
       res
           .search(query: arg_query, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDivisionSearchResponse(response);
+        checkDivisionSearchResponse(response as api.DivisionSearchResponse);
       })));
     });
   });
@@ -1464,7 +1465,7 @@
       res
           .electionQuery($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkElectionsQueryResponse(response);
+        checkElectionsQueryResponse(response as api.ElectionsQueryResponse);
       })));
     });
 
@@ -1526,7 +1527,7 @@
               returnAllAvailableData: arg_returnAllAvailableData,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVoterInfoResponse(response);
+        checkVoterInfoResponse(response as api.VoterInfoResponse);
       })));
     });
   });
@@ -1589,7 +1590,8 @@
               roles: arg_roles,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRepresentativeInfoResponse(response);
+        checkRepresentativeInfoResponse(
+            response as api.RepresentativeInfoResponse);
       })));
     });
 
@@ -1650,7 +1652,7 @@
               roles: arg_roles,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRepresentativeInfoData(response);
+        checkRepresentativeInfoData(response as api.RepresentativeInfoData);
       })));
     });
   });
diff --git a/generated/googleapis/test/classroom/v1_test.dart b/generated/googleapis/test/classroom/v1_test.dart
index 5ed1d92..51eb5cf 100644
--- a/generated/googleapis/test/classroom/v1_test.dart
+++ b/generated/googleapis/test/classroom/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed4666(core.List<api.Material> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMaterial(o[0]);
-  checkMaterial(o[1]);
+  checkMaterial(o[0] as api.Material);
+  checkMaterial(o[1] as api.Material);
 }
 
 core.int buildCounterAnnouncement = 0;
@@ -118,7 +118,8 @@
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.creatorUserId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkIndividualStudentsOptions(o.individualStudentsOptions);
+    checkIndividualStudentsOptions(
+        o.individualStudentsOptions as api.IndividualStudentsOptions);
     checkUnnamed4666(o.materials);
     unittest.expect(o.scheduledTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -142,7 +143,7 @@
 void checkAssignment(api.Assignment o) {
   buildCounterAssignment++;
   if (buildCounterAssignment < 3) {
-    checkDriveFolder(o.studentWorkFolder);
+    checkDriveFolder(o.studentWorkFolder as api.DriveFolder);
   }
   buildCounterAssignment--;
 }
@@ -156,8 +157,8 @@
 
 void checkUnnamed4667(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttachment(o[0]);
-  checkAttachment(o[1]);
+  checkAttachment(o[0] as api.Attachment);
+  checkAttachment(o[1] as api.Attachment);
 }
 
 core.int buildCounterAssignmentSubmission = 0;
@@ -196,10 +197,10 @@
 void checkAttachment(api.Attachment o) {
   buildCounterAttachment++;
   if (buildCounterAttachment < 3) {
-    checkDriveFile(o.driveFile);
-    checkForm(o.form);
-    checkLink(o.link);
-    checkYouTubeVideo(o.youTubeVideo);
+    checkDriveFile(o.driveFile as api.DriveFile);
+    checkForm(o.form as api.Form);
+    checkLink(o.link as api.Link);
+    checkYouTubeVideo(o.youTubeVideo as api.YouTubeVideo);
   }
   buildCounterAttachment--;
 }
@@ -232,8 +233,8 @@
 
 void checkUnnamed4668(core.List<api.CourseMaterialSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCourseMaterialSet(o[0]);
-  checkCourseMaterialSet(o[1]);
+  checkCourseMaterialSet(o[0] as api.CourseMaterialSet);
+  checkCourseMaterialSet(o[1] as api.CourseMaterialSet);
 }
 
 core.int buildCounterCourse = 0;
@@ -282,7 +283,7 @@
     unittest.expect(o.ownerId, unittest.equals('foo'));
     unittest.expect(o.room, unittest.equals('foo'));
     unittest.expect(o.section, unittest.equals('foo'));
-    checkDriveFolder(o.teacherFolder);
+    checkDriveFolder(o.teacherFolder as api.DriveFolder);
     unittest.expect(o.teacherGroupEmail, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -325,10 +326,10 @@
 void checkCourseMaterial(api.CourseMaterial o) {
   buildCounterCourseMaterial++;
   if (buildCounterCourseMaterial < 3) {
-    checkDriveFile(o.driveFile);
-    checkForm(o.form);
-    checkLink(o.link);
-    checkYouTubeVideo(o.youTubeVideo);
+    checkDriveFile(o.driveFile as api.DriveFile);
+    checkForm(o.form as api.Form);
+    checkLink(o.link as api.Link);
+    checkYouTubeVideo(o.youTubeVideo as api.YouTubeVideo);
   }
   buildCounterCourseMaterial--;
 }
@@ -342,8 +343,8 @@
 
 void checkUnnamed4669(core.List<api.CourseMaterial> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCourseMaterial(o[0]);
-  checkCourseMaterial(o[1]);
+  checkCourseMaterial(o[0] as api.CourseMaterial);
+  checkCourseMaterial(o[1] as api.CourseMaterial);
 }
 
 core.int buildCounterCourseMaterialSet = 0;
@@ -395,8 +396,8 @@
 
 void checkUnnamed4670(core.List<api.Material> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMaterial(o[0]);
-  checkMaterial(o[1]);
+  checkMaterial(o[0] as api.Material);
+  checkMaterial(o[1] as api.Material);
 }
 
 core.int buildCounterCourseWork = 0;
@@ -436,19 +437,21 @@
   if (buildCounterCourseWork < 3) {
     unittest.expect(o.alternateLink, unittest.equals('foo'));
     unittest.expect(o.assigneeMode, unittest.equals('foo'));
-    checkAssignment(o.assignment);
+    checkAssignment(o.assignment as api.Assignment);
     unittest.expect(o.associatedWithDeveloper, unittest.isTrue);
     unittest.expect(o.courseId, unittest.equals('foo'));
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.creatorUserId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkDate(o.dueDate);
-    checkTimeOfDay(o.dueTime);
+    checkDate(o.dueDate as api.Date);
+    checkTimeOfDay(o.dueTime as api.TimeOfDay);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkIndividualStudentsOptions(o.individualStudentsOptions);
+    checkIndividualStudentsOptions(
+        o.individualStudentsOptions as api.IndividualStudentsOptions);
     checkUnnamed4670(o.materials);
     unittest.expect(o.maxPoints, unittest.equals(42.0));
-    checkMultipleChoiceQuestion(o.multipleChoiceQuestion);
+    checkMultipleChoiceQuestion(
+        o.multipleChoiceQuestion as api.MultipleChoiceQuestion);
     unittest.expect(o.scheduledTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.submissionModificationMode, unittest.equals('foo'));
@@ -488,8 +491,8 @@
 
 void checkUnnamed4671(core.List<api.Material> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMaterial(o[0]);
-  checkMaterial(o[1]);
+  checkMaterial(o[0] as api.Material);
+  checkMaterial(o[1] as api.Material);
 }
 
 core.int buildCounterCourseWorkMaterial = 0;
@@ -526,7 +529,8 @@
     unittest.expect(o.creatorUserId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkIndividualStudentsOptions(o.individualStudentsOptions);
+    checkIndividualStudentsOptions(
+        o.individualStudentsOptions as api.IndividualStudentsOptions);
     checkUnnamed4671(o.materials);
     unittest.expect(o.scheduledTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -639,8 +643,10 @@
 void checkFeed(api.Feed o) {
   buildCounterFeed++;
   if (buildCounterFeed < 3) {
-    checkCourseRosterChangesInfo(o.courseRosterChangesInfo);
-    checkCourseWorkChangesInfo(o.courseWorkChangesInfo);
+    checkCourseRosterChangesInfo(
+        o.courseRosterChangesInfo as api.CourseRosterChangesInfo);
+    checkCourseWorkChangesInfo(
+        o.courseWorkChangesInfo as api.CourseWorkChangesInfo);
     unittest.expect(o.feedType, unittest.equals('foo'));
   }
   buildCounterFeed--;
@@ -735,7 +741,7 @@
   buildCounterGuardian++;
   if (buildCounterGuardian < 3) {
     unittest.expect(o.guardianId, unittest.equals('foo'));
-    checkUserProfile(o.guardianProfile);
+    checkUserProfile(o.guardianProfile as api.UserProfile);
     unittest.expect(o.invitedEmailAddress, unittest.equals('foo'));
     unittest.expect(o.studentId, unittest.equals('foo'));
   }
@@ -858,8 +864,8 @@
 
 void checkUnnamed4673(core.List<api.Announcement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnouncement(o[0]);
-  checkAnnouncement(o[1]);
+  checkAnnouncement(o[0] as api.Announcement);
+  checkAnnouncement(o[1] as api.Announcement);
 }
 
 core.int buildCounterListAnnouncementsResponse = 0;
@@ -892,8 +898,8 @@
 
 void checkUnnamed4674(core.List<api.CourseAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCourseAlias(o[0]);
-  checkCourseAlias(o[1]);
+  checkCourseAlias(o[0] as api.CourseAlias);
+  checkCourseAlias(o[1] as api.CourseAlias);
 }
 
 core.int buildCounterListCourseAliasesResponse = 0;
@@ -926,8 +932,8 @@
 
 void checkUnnamed4675(core.List<api.CourseWorkMaterial> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCourseWorkMaterial(o[0]);
-  checkCourseWorkMaterial(o[1]);
+  checkCourseWorkMaterial(o[0] as api.CourseWorkMaterial);
+  checkCourseWorkMaterial(o[1] as api.CourseWorkMaterial);
 }
 
 core.int buildCounterListCourseWorkMaterialResponse = 0;
@@ -960,8 +966,8 @@
 
 void checkUnnamed4676(core.List<api.CourseWork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCourseWork(o[0]);
-  checkCourseWork(o[1]);
+  checkCourseWork(o[0] as api.CourseWork);
+  checkCourseWork(o[1] as api.CourseWork);
 }
 
 core.int buildCounterListCourseWorkResponse = 0;
@@ -994,8 +1000,8 @@
 
 void checkUnnamed4677(core.List<api.Course> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCourse(o[0]);
-  checkCourse(o[1]);
+  checkCourse(o[0] as api.Course);
+  checkCourse(o[1] as api.Course);
 }
 
 core.int buildCounterListCoursesResponse = 0;
@@ -1028,8 +1034,8 @@
 
 void checkUnnamed4678(core.List<api.GuardianInvitation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGuardianInvitation(o[0]);
-  checkGuardianInvitation(o[1]);
+  checkGuardianInvitation(o[0] as api.GuardianInvitation);
+  checkGuardianInvitation(o[1] as api.GuardianInvitation);
 }
 
 core.int buildCounterListGuardianInvitationsResponse = 0;
@@ -1063,8 +1069,8 @@
 
 void checkUnnamed4679(core.List<api.Guardian> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGuardian(o[0]);
-  checkGuardian(o[1]);
+  checkGuardian(o[0] as api.Guardian);
+  checkGuardian(o[1] as api.Guardian);
 }
 
 core.int buildCounterListGuardiansResponse = 0;
@@ -1097,8 +1103,8 @@
 
 void checkUnnamed4680(core.List<api.Invitation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInvitation(o[0]);
-  checkInvitation(o[1]);
+  checkInvitation(o[0] as api.Invitation);
+  checkInvitation(o[1] as api.Invitation);
 }
 
 core.int buildCounterListInvitationsResponse = 0;
@@ -1131,8 +1137,8 @@
 
 void checkUnnamed4681(core.List<api.StudentSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStudentSubmission(o[0]);
-  checkStudentSubmission(o[1]);
+  checkStudentSubmission(o[0] as api.StudentSubmission);
+  checkStudentSubmission(o[1] as api.StudentSubmission);
 }
 
 core.int buildCounterListStudentSubmissionsResponse = 0;
@@ -1165,8 +1171,8 @@
 
 void checkUnnamed4682(core.List<api.Student> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStudent(o[0]);
-  checkStudent(o[1]);
+  checkStudent(o[0] as api.Student);
+  checkStudent(o[1] as api.Student);
 }
 
 core.int buildCounterListStudentsResponse = 0;
@@ -1199,8 +1205,8 @@
 
 void checkUnnamed4683(core.List<api.Teacher> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTeacher(o[0]);
-  checkTeacher(o[1]);
+  checkTeacher(o[0] as api.Teacher);
+  checkTeacher(o[1] as api.Teacher);
 }
 
 core.int buildCounterListTeachersResponse = 0;
@@ -1233,8 +1239,8 @@
 
 void checkUnnamed4684(core.List<api.Topic> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTopic(o[0]);
-  checkTopic(o[1]);
+  checkTopic(o[0] as api.Topic);
+  checkTopic(o[1] as api.Topic);
 }
 
 core.int buildCounterListTopicResponse = 0;
@@ -1275,10 +1281,10 @@
 void checkMaterial(api.Material o) {
   buildCounterMaterial++;
   if (buildCounterMaterial < 3) {
-    checkSharedDriveFile(o.driveFile);
-    checkForm(o.form);
-    checkLink(o.link);
-    checkYouTubeVideo(o.youtubeVideo);
+    checkSharedDriveFile(o.driveFile as api.SharedDriveFile);
+    checkForm(o.form as api.Form);
+    checkLink(o.link as api.Link);
+    checkYouTubeVideo(o.youtubeVideo as api.YouTubeVideo);
   }
   buildCounterMaterial--;
 }
@@ -1301,7 +1307,8 @@
   buildCounterModifyAnnouncementAssigneesRequest++;
   if (buildCounterModifyAnnouncementAssigneesRequest < 3) {
     unittest.expect(o.assigneeMode, unittest.equals('foo'));
-    checkModifyIndividualStudentsOptions(o.modifyIndividualStudentsOptions);
+    checkModifyIndividualStudentsOptions(o.modifyIndividualStudentsOptions
+        as api.ModifyIndividualStudentsOptions);
   }
   buildCounterModifyAnnouncementAssigneesRequest--;
 }
@@ -1315,8 +1322,8 @@
 
 void checkUnnamed4685(core.List<api.Attachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttachment(o[0]);
-  checkAttachment(o[1]);
+  checkAttachment(o[0] as api.Attachment);
+  checkAttachment(o[1] as api.Attachment);
 }
 
 core.int buildCounterModifyAttachmentsRequest = 0;
@@ -1355,7 +1362,8 @@
   buildCounterModifyCourseWorkAssigneesRequest++;
   if (buildCounterModifyCourseWorkAssigneesRequest < 3) {
     unittest.expect(o.assigneeMode, unittest.equals('foo'));
-    checkModifyIndividualStudentsOptions(o.modifyIndividualStudentsOptions);
+    checkModifyIndividualStudentsOptions(o.modifyIndividualStudentsOptions
+        as api.ModifyIndividualStudentsOptions);
   }
   buildCounterModifyCourseWorkAssigneesRequest--;
 }
@@ -1515,9 +1523,9 @@
 void checkRegistration(api.Registration o) {
   buildCounterRegistration++;
   if (buildCounterRegistration < 3) {
-    checkCloudPubsubTopic(o.cloudPubsubTopic);
+    checkCloudPubsubTopic(o.cloudPubsubTopic as api.CloudPubsubTopic);
     unittest.expect(o.expiryTime, unittest.equals('foo'));
-    checkFeed(o.feed);
+    checkFeed(o.feed as api.Feed);
     unittest.expect(o.registrationId, unittest.equals('foo'));
   }
   buildCounterRegistration--;
@@ -1553,7 +1561,7 @@
 void checkSharedDriveFile(api.SharedDriveFile o) {
   buildCounterSharedDriveFile++;
   if (buildCounterSharedDriveFile < 3) {
-    checkDriveFile(o.driveFile);
+    checkDriveFile(o.driveFile as api.DriveFile);
     unittest.expect(o.shareMode, unittest.equals('foo'));
   }
   buildCounterSharedDriveFile--;
@@ -1619,8 +1627,8 @@
   buildCounterStudent++;
   if (buildCounterStudent < 3) {
     unittest.expect(o.courseId, unittest.equals('foo'));
-    checkUserProfile(o.profile);
-    checkDriveFolder(o.studentWorkFolder);
+    checkUserProfile(o.profile as api.UserProfile);
+    checkDriveFolder(o.studentWorkFolder as api.DriveFolder);
     unittest.expect(o.userId, unittest.equals('foo'));
   }
   buildCounterStudent--;
@@ -1635,8 +1643,8 @@
 
 void checkUnnamed4689(core.List<api.SubmissionHistory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubmissionHistory(o[0]);
-  checkSubmissionHistory(o[1]);
+  checkSubmissionHistory(o[0] as api.SubmissionHistory);
+  checkSubmissionHistory(o[1] as api.SubmissionHistory);
 }
 
 core.int buildCounterStudentSubmission = 0;
@@ -1671,7 +1679,8 @@
   if (buildCounterStudentSubmission < 3) {
     unittest.expect(o.alternateLink, unittest.equals('foo'));
     unittest.expect(o.assignedGrade, unittest.equals(42.0));
-    checkAssignmentSubmission(o.assignmentSubmission);
+    checkAssignmentSubmission(
+        o.assignmentSubmission as api.AssignmentSubmission);
     unittest.expect(o.associatedWithDeveloper, unittest.isTrue);
     unittest.expect(o.courseId, unittest.equals('foo'));
     unittest.expect(o.courseWorkId, unittest.equals('foo'));
@@ -1680,8 +1689,10 @@
     unittest.expect(o.draftGrade, unittest.equals(42.0));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.late, unittest.isTrue);
-    checkMultipleChoiceSubmission(o.multipleChoiceSubmission);
-    checkShortAnswerSubmission(o.shortAnswerSubmission);
+    checkMultipleChoiceSubmission(
+        o.multipleChoiceSubmission as api.MultipleChoiceSubmission);
+    checkShortAnswerSubmission(
+        o.shortAnswerSubmission as api.ShortAnswerSubmission);
     unittest.expect(o.state, unittest.equals('foo'));
     checkUnnamed4689(o.submissionHistory);
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -1705,8 +1716,8 @@
 void checkSubmissionHistory(api.SubmissionHistory o) {
   buildCounterSubmissionHistory++;
   if (buildCounterSubmissionHistory < 3) {
-    checkGradeHistory(o.gradeHistory);
-    checkStateHistory(o.stateHistory);
+    checkGradeHistory(o.gradeHistory as api.GradeHistory);
+    checkStateHistory(o.stateHistory as api.StateHistory);
   }
   buildCounterSubmissionHistory--;
 }
@@ -1728,7 +1739,7 @@
   buildCounterTeacher++;
   if (buildCounterTeacher < 3) {
     unittest.expect(o.courseId, unittest.equals('foo'));
-    checkUserProfile(o.profile);
+    checkUserProfile(o.profile as api.UserProfile);
     unittest.expect(o.userId, unittest.equals('foo'));
   }
   buildCounterTeacher--;
@@ -1808,8 +1819,8 @@
 
 void checkUnnamed4690(core.List<api.GlobalPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGlobalPermission(o[0]);
-  checkGlobalPermission(o[1]);
+  checkGlobalPermission(o[0] as api.GlobalPermission);
+  checkGlobalPermission(o[1] as api.GlobalPermission);
 }
 
 core.int buildCounterUserProfile = 0;
@@ -1833,7 +1844,7 @@
   if (buildCounterUserProfile < 3) {
     unittest.expect(o.emailAddress, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkName(o.name);
+    checkName(o.name as api.Name);
     checkUnnamed4690(o.permissions);
     unittest.expect(o.photoUrl, unittest.equals('foo'));
     unittest.expect(o.verifiedTeacher, unittest.isTrue);
@@ -1949,7 +1960,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnouncement();
       var od = api.Announcement.fromJson(o.toJson());
-      checkAnnouncement(od);
+      checkAnnouncement(od as api.Announcement);
     });
   });
 
@@ -1957,7 +1968,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignment();
       var od = api.Assignment.fromJson(o.toJson());
-      checkAssignment(od);
+      checkAssignment(od as api.Assignment);
     });
   });
 
@@ -1965,7 +1976,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignmentSubmission();
       var od = api.AssignmentSubmission.fromJson(o.toJson());
-      checkAssignmentSubmission(od);
+      checkAssignmentSubmission(od as api.AssignmentSubmission);
     });
   });
 
@@ -1973,7 +1984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttachment();
       var od = api.Attachment.fromJson(o.toJson());
-      checkAttachment(od);
+      checkAttachment(od as api.Attachment);
     });
   });
 
@@ -1981,7 +1992,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudPubsubTopic();
       var od = api.CloudPubsubTopic.fromJson(o.toJson());
-      checkCloudPubsubTopic(od);
+      checkCloudPubsubTopic(od as api.CloudPubsubTopic);
     });
   });
 
@@ -1989,7 +2000,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourse();
       var od = api.Course.fromJson(o.toJson());
-      checkCourse(od);
+      checkCourse(od as api.Course);
     });
   });
 
@@ -1997,7 +2008,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourseAlias();
       var od = api.CourseAlias.fromJson(o.toJson());
-      checkCourseAlias(od);
+      checkCourseAlias(od as api.CourseAlias);
     });
   });
 
@@ -2005,7 +2016,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourseMaterial();
       var od = api.CourseMaterial.fromJson(o.toJson());
-      checkCourseMaterial(od);
+      checkCourseMaterial(od as api.CourseMaterial);
     });
   });
 
@@ -2013,7 +2024,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourseMaterialSet();
       var od = api.CourseMaterialSet.fromJson(o.toJson());
-      checkCourseMaterialSet(od);
+      checkCourseMaterialSet(od as api.CourseMaterialSet);
     });
   });
 
@@ -2021,7 +2032,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourseRosterChangesInfo();
       var od = api.CourseRosterChangesInfo.fromJson(o.toJson());
-      checkCourseRosterChangesInfo(od);
+      checkCourseRosterChangesInfo(od as api.CourseRosterChangesInfo);
     });
   });
 
@@ -2029,7 +2040,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourseWork();
       var od = api.CourseWork.fromJson(o.toJson());
-      checkCourseWork(od);
+      checkCourseWork(od as api.CourseWork);
     });
   });
 
@@ -2037,7 +2048,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourseWorkChangesInfo();
       var od = api.CourseWorkChangesInfo.fromJson(o.toJson());
-      checkCourseWorkChangesInfo(od);
+      checkCourseWorkChangesInfo(od as api.CourseWorkChangesInfo);
     });
   });
 
@@ -2045,7 +2056,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCourseWorkMaterial();
       var od = api.CourseWorkMaterial.fromJson(o.toJson());
-      checkCourseWorkMaterial(od);
+      checkCourseWorkMaterial(od as api.CourseWorkMaterial);
     });
   });
 
@@ -2053,7 +2064,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -2061,7 +2072,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveFile();
       var od = api.DriveFile.fromJson(o.toJson());
-      checkDriveFile(od);
+      checkDriveFile(od as api.DriveFile);
     });
   });
 
@@ -2069,7 +2080,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveFolder();
       var od = api.DriveFolder.fromJson(o.toJson());
-      checkDriveFolder(od);
+      checkDriveFolder(od as api.DriveFolder);
     });
   });
 
@@ -2077,7 +2088,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2085,7 +2096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeed();
       var od = api.Feed.fromJson(o.toJson());
-      checkFeed(od);
+      checkFeed(od as api.Feed);
     });
   });
 
@@ -2093,7 +2104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForm();
       var od = api.Form.fromJson(o.toJson());
-      checkForm(od);
+      checkForm(od as api.Form);
     });
   });
 
@@ -2101,7 +2112,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGlobalPermission();
       var od = api.GlobalPermission.fromJson(o.toJson());
-      checkGlobalPermission(od);
+      checkGlobalPermission(od as api.GlobalPermission);
     });
   });
 
@@ -2109,7 +2120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGradeHistory();
       var od = api.GradeHistory.fromJson(o.toJson());
-      checkGradeHistory(od);
+      checkGradeHistory(od as api.GradeHistory);
     });
   });
 
@@ -2117,7 +2128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGuardian();
       var od = api.Guardian.fromJson(o.toJson());
-      checkGuardian(od);
+      checkGuardian(od as api.Guardian);
     });
   });
 
@@ -2125,7 +2136,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGuardianInvitation();
       var od = api.GuardianInvitation.fromJson(o.toJson());
-      checkGuardianInvitation(od);
+      checkGuardianInvitation(od as api.GuardianInvitation);
     });
   });
 
@@ -2133,7 +2144,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIndividualStudentsOptions();
       var od = api.IndividualStudentsOptions.fromJson(o.toJson());
-      checkIndividualStudentsOptions(od);
+      checkIndividualStudentsOptions(od as api.IndividualStudentsOptions);
     });
   });
 
@@ -2141,7 +2152,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInvitation();
       var od = api.Invitation.fromJson(o.toJson());
-      checkInvitation(od);
+      checkInvitation(od as api.Invitation);
     });
   });
 
@@ -2149,7 +2160,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLink();
       var od = api.Link.fromJson(o.toJson());
-      checkLink(od);
+      checkLink(od as api.Link);
     });
   });
 
@@ -2157,7 +2168,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAnnouncementsResponse();
       var od = api.ListAnnouncementsResponse.fromJson(o.toJson());
-      checkListAnnouncementsResponse(od);
+      checkListAnnouncementsResponse(od as api.ListAnnouncementsResponse);
     });
   });
 
@@ -2165,7 +2176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCourseAliasesResponse();
       var od = api.ListCourseAliasesResponse.fromJson(o.toJson());
-      checkListCourseAliasesResponse(od);
+      checkListCourseAliasesResponse(od as api.ListCourseAliasesResponse);
     });
   });
 
@@ -2173,7 +2184,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCourseWorkMaterialResponse();
       var od = api.ListCourseWorkMaterialResponse.fromJson(o.toJson());
-      checkListCourseWorkMaterialResponse(od);
+      checkListCourseWorkMaterialResponse(
+          od as api.ListCourseWorkMaterialResponse);
     });
   });
 
@@ -2181,7 +2193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCourseWorkResponse();
       var od = api.ListCourseWorkResponse.fromJson(o.toJson());
-      checkListCourseWorkResponse(od);
+      checkListCourseWorkResponse(od as api.ListCourseWorkResponse);
     });
   });
 
@@ -2189,7 +2201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCoursesResponse();
       var od = api.ListCoursesResponse.fromJson(o.toJson());
-      checkListCoursesResponse(od);
+      checkListCoursesResponse(od as api.ListCoursesResponse);
     });
   });
 
@@ -2197,7 +2209,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGuardianInvitationsResponse();
       var od = api.ListGuardianInvitationsResponse.fromJson(o.toJson());
-      checkListGuardianInvitationsResponse(od);
+      checkListGuardianInvitationsResponse(
+          od as api.ListGuardianInvitationsResponse);
     });
   });
 
@@ -2205,7 +2218,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGuardiansResponse();
       var od = api.ListGuardiansResponse.fromJson(o.toJson());
-      checkListGuardiansResponse(od);
+      checkListGuardiansResponse(od as api.ListGuardiansResponse);
     });
   });
 
@@ -2213,7 +2226,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInvitationsResponse();
       var od = api.ListInvitationsResponse.fromJson(o.toJson());
-      checkListInvitationsResponse(od);
+      checkListInvitationsResponse(od as api.ListInvitationsResponse);
     });
   });
 
@@ -2221,7 +2234,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListStudentSubmissionsResponse();
       var od = api.ListStudentSubmissionsResponse.fromJson(o.toJson());
-      checkListStudentSubmissionsResponse(od);
+      checkListStudentSubmissionsResponse(
+          od as api.ListStudentSubmissionsResponse);
     });
   });
 
@@ -2229,7 +2243,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListStudentsResponse();
       var od = api.ListStudentsResponse.fromJson(o.toJson());
-      checkListStudentsResponse(od);
+      checkListStudentsResponse(od as api.ListStudentsResponse);
     });
   });
 
@@ -2237,7 +2251,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTeachersResponse();
       var od = api.ListTeachersResponse.fromJson(o.toJson());
-      checkListTeachersResponse(od);
+      checkListTeachersResponse(od as api.ListTeachersResponse);
     });
   });
 
@@ -2245,7 +2259,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTopicResponse();
       var od = api.ListTopicResponse.fromJson(o.toJson());
-      checkListTopicResponse(od);
+      checkListTopicResponse(od as api.ListTopicResponse);
     });
   });
 
@@ -2253,7 +2267,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMaterial();
       var od = api.Material.fromJson(o.toJson());
-      checkMaterial(od);
+      checkMaterial(od as api.Material);
     });
   });
 
@@ -2261,7 +2275,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyAnnouncementAssigneesRequest();
       var od = api.ModifyAnnouncementAssigneesRequest.fromJson(o.toJson());
-      checkModifyAnnouncementAssigneesRequest(od);
+      checkModifyAnnouncementAssigneesRequest(
+          od as api.ModifyAnnouncementAssigneesRequest);
     });
   });
 
@@ -2269,7 +2284,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyAttachmentsRequest();
       var od = api.ModifyAttachmentsRequest.fromJson(o.toJson());
-      checkModifyAttachmentsRequest(od);
+      checkModifyAttachmentsRequest(od as api.ModifyAttachmentsRequest);
     });
   });
 
@@ -2277,7 +2292,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyCourseWorkAssigneesRequest();
       var od = api.ModifyCourseWorkAssigneesRequest.fromJson(o.toJson());
-      checkModifyCourseWorkAssigneesRequest(od);
+      checkModifyCourseWorkAssigneesRequest(
+          od as api.ModifyCourseWorkAssigneesRequest);
     });
   });
 
@@ -2285,7 +2301,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyIndividualStudentsOptions();
       var od = api.ModifyIndividualStudentsOptions.fromJson(o.toJson());
-      checkModifyIndividualStudentsOptions(od);
+      checkModifyIndividualStudentsOptions(
+          od as api.ModifyIndividualStudentsOptions);
     });
   });
 
@@ -2293,7 +2310,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMultipleChoiceQuestion();
       var od = api.MultipleChoiceQuestion.fromJson(o.toJson());
-      checkMultipleChoiceQuestion(od);
+      checkMultipleChoiceQuestion(od as api.MultipleChoiceQuestion);
     });
   });
 
@@ -2301,7 +2318,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMultipleChoiceSubmission();
       var od = api.MultipleChoiceSubmission.fromJson(o.toJson());
-      checkMultipleChoiceSubmission(od);
+      checkMultipleChoiceSubmission(od as api.MultipleChoiceSubmission);
     });
   });
 
@@ -2309,7 +2326,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildName();
       var od = api.Name.fromJson(o.toJson());
-      checkName(od);
+      checkName(od as api.Name);
     });
   });
 
@@ -2317,7 +2334,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReclaimStudentSubmissionRequest();
       var od = api.ReclaimStudentSubmissionRequest.fromJson(o.toJson());
-      checkReclaimStudentSubmissionRequest(od);
+      checkReclaimStudentSubmissionRequest(
+          od as api.ReclaimStudentSubmissionRequest);
     });
   });
 
@@ -2325,7 +2343,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegistration();
       var od = api.Registration.fromJson(o.toJson());
-      checkRegistration(od);
+      checkRegistration(od as api.Registration);
     });
   });
 
@@ -2333,7 +2351,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnStudentSubmissionRequest();
       var od = api.ReturnStudentSubmissionRequest.fromJson(o.toJson());
-      checkReturnStudentSubmissionRequest(od);
+      checkReturnStudentSubmissionRequest(
+          od as api.ReturnStudentSubmissionRequest);
     });
   });
 
@@ -2341,7 +2360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSharedDriveFile();
       var od = api.SharedDriveFile.fromJson(o.toJson());
-      checkSharedDriveFile(od);
+      checkSharedDriveFile(od as api.SharedDriveFile);
     });
   });
 
@@ -2349,7 +2368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShortAnswerSubmission();
       var od = api.ShortAnswerSubmission.fromJson(o.toJson());
-      checkShortAnswerSubmission(od);
+      checkShortAnswerSubmission(od as api.ShortAnswerSubmission);
     });
   });
 
@@ -2357,7 +2376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStateHistory();
       var od = api.StateHistory.fromJson(o.toJson());
-      checkStateHistory(od);
+      checkStateHistory(od as api.StateHistory);
     });
   });
 
@@ -2365,7 +2384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStudent();
       var od = api.Student.fromJson(o.toJson());
-      checkStudent(od);
+      checkStudent(od as api.Student);
     });
   });
 
@@ -2373,7 +2392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStudentSubmission();
       var od = api.StudentSubmission.fromJson(o.toJson());
-      checkStudentSubmission(od);
+      checkStudentSubmission(od as api.StudentSubmission);
     });
   });
 
@@ -2381,7 +2400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubmissionHistory();
       var od = api.SubmissionHistory.fromJson(o.toJson());
-      checkSubmissionHistory(od);
+      checkSubmissionHistory(od as api.SubmissionHistory);
     });
   });
 
@@ -2389,7 +2408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeacher();
       var od = api.Teacher.fromJson(o.toJson());
-      checkTeacher(od);
+      checkTeacher(od as api.Teacher);
     });
   });
 
@@ -2397,7 +2416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeOfDay();
       var od = api.TimeOfDay.fromJson(o.toJson());
-      checkTimeOfDay(od);
+      checkTimeOfDay(od as api.TimeOfDay);
     });
   });
 
@@ -2405,7 +2424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTopic();
       var od = api.Topic.fromJson(o.toJson());
-      checkTopic(od);
+      checkTopic(od as api.Topic);
     });
   });
 
@@ -2413,7 +2432,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTurnInStudentSubmissionRequest();
       var od = api.TurnInStudentSubmissionRequest.fromJson(o.toJson());
-      checkTurnInStudentSubmissionRequest(od);
+      checkTurnInStudentSubmissionRequest(
+          od as api.TurnInStudentSubmissionRequest);
     });
   });
 
@@ -2421,7 +2441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserProfile();
       var od = api.UserProfile.fromJson(o.toJson());
-      checkUserProfile(od);
+      checkUserProfile(od as api.UserProfile);
     });
   });
 
@@ -2429,7 +2449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildYouTubeVideo();
       var od = api.YouTubeVideo.fromJson(o.toJson());
-      checkYouTubeVideo(od);
+      checkYouTubeVideo(od as api.YouTubeVideo);
     });
   });
 
@@ -2440,8 +2460,9 @@
       var arg_request = buildCourse();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Course.fromJson(json);
-        checkCourse(obj);
+        var obj =
+            api.Course.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCourse(obj as api.Course);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2480,7 +2501,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourse(response);
+        checkCourse(response as api.Course);
       })));
     });
 
@@ -2530,7 +2551,7 @@
       res
           .delete(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2580,7 +2601,7 @@
       res
           .get(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourse(response);
+        checkCourse(response as api.Course);
       })));
     });
 
@@ -2647,7 +2668,7 @@
               teacherId: arg_teacherId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCoursesResponse(response);
+        checkListCoursesResponse(response as api.ListCoursesResponse);
       })));
     });
 
@@ -2659,8 +2680,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Course.fromJson(json);
-        checkCourse(obj);
+        var obj =
+            api.Course.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCourse(obj as api.Course);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2705,7 +2727,7 @@
           .patch(arg_request, arg_id,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourse(response);
+        checkCourse(response as api.Course);
       })));
     });
 
@@ -2716,8 +2738,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Course.fromJson(json);
-        checkCourse(obj);
+        var obj =
+            api.Course.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCourse(obj as api.Course);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2759,7 +2782,7 @@
       res
           .update(arg_request, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourse(response);
+        checkCourse(response as api.Course);
       })));
     });
   });
@@ -2772,8 +2795,9 @@
       var arg_courseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CourseAlias.fromJson(json);
-        checkCourseAlias(obj);
+        var obj = api.CourseAlias.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCourseAlias(obj as api.CourseAlias);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2821,7 +2845,7 @@
       res
           .create(arg_request, arg_courseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseAlias(response);
+        checkCourseAlias(response as api.CourseAlias);
       })));
     });
 
@@ -2881,7 +2905,7 @@
       res
           .delete(arg_courseId, arg_alias, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2946,7 +2970,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCourseAliasesResponse(response);
+        checkListCourseAliasesResponse(
+            response as api.ListCourseAliasesResponse);
       })));
     });
   });
@@ -2959,8 +2984,9 @@
       var arg_courseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Announcement.fromJson(json);
-        checkAnnouncement(obj);
+        var obj = api.Announcement.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnnouncement(obj as api.Announcement);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3008,7 +3034,7 @@
       res
           .create(arg_request, arg_courseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnouncement(response);
+        checkAnnouncement(response as api.Announcement);
       })));
     });
 
@@ -3068,7 +3094,7 @@
       res
           .delete(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3128,7 +3154,7 @@
       res
           .get(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnouncement(response);
+        checkAnnouncement(response as api.Announcement);
       })));
     });
 
@@ -3201,7 +3227,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAnnouncementsResponse(response);
+        checkListAnnouncementsResponse(
+            response as api.ListAnnouncementsResponse);
       })));
     });
 
@@ -3213,8 +3240,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyAnnouncementAssigneesRequest.fromJson(json);
-        checkModifyAnnouncementAssigneesRequest(obj);
+        var obj = api.ModifyAnnouncementAssigneesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyAnnouncementAssigneesRequest(
+            obj as api.ModifyAnnouncementAssigneesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3272,7 +3301,7 @@
           .modifyAssignees(arg_request, arg_courseId, arg_id,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnouncement(response);
+        checkAnnouncement(response as api.Announcement);
       })));
     });
 
@@ -3285,8 +3314,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Announcement.fromJson(json);
-        checkAnnouncement(obj);
+        var obj = api.Announcement.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnnouncement(obj as api.Announcement);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3340,7 +3370,7 @@
           .patch(arg_request, arg_courseId, arg_id,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnouncement(response);
+        checkAnnouncement(response as api.Announcement);
       })));
     });
   });
@@ -3353,8 +3383,9 @@
       var arg_courseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CourseWork.fromJson(json);
-        checkCourseWork(obj);
+        var obj = api.CourseWork.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCourseWork(obj as api.CourseWork);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3402,7 +3433,7 @@
       res
           .create(arg_request, arg_courseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseWork(response);
+        checkCourseWork(response as api.CourseWork);
       })));
     });
 
@@ -3462,7 +3493,7 @@
       res
           .delete(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3522,7 +3553,7 @@
       res
           .get(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseWork(response);
+        checkCourseWork(response as api.CourseWork);
       })));
     });
 
@@ -3595,7 +3626,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCourseWorkResponse(response);
+        checkListCourseWorkResponse(response as api.ListCourseWorkResponse);
       })));
     });
 
@@ -3607,8 +3638,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyCourseWorkAssigneesRequest.fromJson(json);
-        checkModifyCourseWorkAssigneesRequest(obj);
+        var obj = api.ModifyCourseWorkAssigneesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyCourseWorkAssigneesRequest(
+            obj as api.ModifyCourseWorkAssigneesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3666,7 +3699,7 @@
           .modifyAssignees(arg_request, arg_courseId, arg_id,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseWork(response);
+        checkCourseWork(response as api.CourseWork);
       })));
     });
 
@@ -3679,8 +3712,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CourseWork.fromJson(json);
-        checkCourseWork(obj);
+        var obj = api.CourseWork.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCourseWork(obj as api.CourseWork);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3734,7 +3768,7 @@
           .patch(arg_request, arg_courseId, arg_id,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseWork(response);
+        checkCourseWork(response as api.CourseWork);
       })));
     });
   });
@@ -3806,7 +3840,7 @@
       res
           .get(arg_courseId, arg_courseWorkId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStudentSubmission(response);
+        checkStudentSubmission(response as api.StudentSubmission);
       })));
     });
 
@@ -3890,7 +3924,8 @@
               userId: arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListStudentSubmissionsResponse(response);
+        checkListStudentSubmissionsResponse(
+            response as api.ListStudentSubmissionsResponse);
       })));
     });
 
@@ -3903,8 +3938,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyAttachmentsRequest.fromJson(json);
-        checkModifyAttachmentsRequest(obj);
+        var obj = api.ModifyAttachmentsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyAttachmentsRequest(obj as api.ModifyAttachmentsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3972,7 +4008,7 @@
               arg_request, arg_courseId, arg_courseWorkId, arg_id,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStudentSubmission(response);
+        checkStudentSubmission(response as api.StudentSubmission);
       })));
     });
 
@@ -3986,8 +4022,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StudentSubmission.fromJson(json);
-        checkStudentSubmission(obj);
+        var obj = api.StudentSubmission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStudentSubmission(obj as api.StudentSubmission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4050,7 +4087,7 @@
           .patch(arg_request, arg_courseId, arg_courseWorkId, arg_id,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStudentSubmission(response);
+        checkStudentSubmission(response as api.StudentSubmission);
       })));
     });
 
@@ -4063,8 +4100,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReclaimStudentSubmissionRequest.fromJson(json);
-        checkReclaimStudentSubmissionRequest(obj);
+        var obj = api.ReclaimStudentSubmissionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReclaimStudentSubmissionRequest(
+            obj as api.ReclaimStudentSubmissionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4131,7 +4170,7 @@
           .reclaim(arg_request, arg_courseId, arg_courseWorkId, arg_id,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4144,8 +4183,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReturnStudentSubmissionRequest.fromJson(json);
-        checkReturnStudentSubmissionRequest(obj);
+        var obj = api.ReturnStudentSubmissionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReturnStudentSubmissionRequest(
+            obj as api.ReturnStudentSubmissionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4212,7 +4253,7 @@
           .return_(arg_request, arg_courseId, arg_courseWorkId, arg_id,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4225,8 +4266,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TurnInStudentSubmissionRequest.fromJson(json);
-        checkTurnInStudentSubmissionRequest(obj);
+        var obj = api.TurnInStudentSubmissionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTurnInStudentSubmissionRequest(
+            obj as api.TurnInStudentSubmissionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4293,7 +4336,7 @@
           .turnIn(arg_request, arg_courseId, arg_courseWorkId, arg_id,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -4306,8 +4349,9 @@
       var arg_courseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CourseWorkMaterial.fromJson(json);
-        checkCourseWorkMaterial(obj);
+        var obj = api.CourseWorkMaterial.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCourseWorkMaterial(obj as api.CourseWorkMaterial);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4355,7 +4399,7 @@
       res
           .create(arg_request, arg_courseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseWorkMaterial(response);
+        checkCourseWorkMaterial(response as api.CourseWorkMaterial);
       })));
     });
 
@@ -4415,7 +4459,7 @@
       res
           .delete(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4475,7 +4519,7 @@
       res
           .get(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseWorkMaterial(response);
+        checkCourseWorkMaterial(response as api.CourseWorkMaterial);
       })));
     });
 
@@ -4556,7 +4600,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCourseWorkMaterialResponse(response);
+        checkListCourseWorkMaterialResponse(
+            response as api.ListCourseWorkMaterialResponse);
       })));
     });
 
@@ -4569,8 +4614,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CourseWorkMaterial.fromJson(json);
-        checkCourseWorkMaterial(obj);
+        var obj = api.CourseWorkMaterial.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCourseWorkMaterial(obj as api.CourseWorkMaterial);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4624,7 +4670,7 @@
           .patch(arg_request, arg_courseId, arg_id,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCourseWorkMaterial(response);
+        checkCourseWorkMaterial(response as api.CourseWorkMaterial);
       })));
     });
   });
@@ -4638,8 +4684,9 @@
       var arg_enrollmentCode = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Student.fromJson(json);
-        checkStudent(obj);
+        var obj =
+            api.Student.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkStudent(obj as api.Student);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4690,7 +4737,7 @@
           .create(arg_request, arg_courseId,
               enrollmentCode: arg_enrollmentCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStudent(response);
+        checkStudent(response as api.Student);
       })));
     });
 
@@ -4750,7 +4797,7 @@
       res
           .delete(arg_courseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4810,7 +4857,7 @@
       res
           .get(arg_courseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStudent(response);
+        checkStudent(response as api.Student);
       })));
     });
 
@@ -4875,7 +4922,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListStudentsResponse(response);
+        checkListStudentsResponse(response as api.ListStudentsResponse);
       })));
     });
   });
@@ -4888,8 +4935,9 @@
       var arg_courseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Teacher.fromJson(json);
-        checkTeacher(obj);
+        var obj =
+            api.Teacher.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTeacher(obj as api.Teacher);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4937,7 +4985,7 @@
       res
           .create(arg_request, arg_courseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeacher(response);
+        checkTeacher(response as api.Teacher);
       })));
     });
 
@@ -4997,7 +5045,7 @@
       res
           .delete(arg_courseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5057,7 +5105,7 @@
       res
           .get(arg_courseId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeacher(response);
+        checkTeacher(response as api.Teacher);
       })));
     });
 
@@ -5122,7 +5170,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTeachersResponse(response);
+        checkListTeachersResponse(response as api.ListTeachersResponse);
       })));
     });
   });
@@ -5135,8 +5183,9 @@
       var arg_courseId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Topic.fromJson(json);
-        checkTopic(obj);
+        var obj =
+            api.Topic.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTopic(obj as api.Topic);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5184,7 +5233,7 @@
       res
           .create(arg_request, arg_courseId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTopic(response);
+        checkTopic(response as api.Topic);
       })));
     });
 
@@ -5244,7 +5293,7 @@
       res
           .delete(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5304,7 +5353,7 @@
       res
           .get(arg_courseId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTopic(response);
+        checkTopic(response as api.Topic);
       })));
     });
 
@@ -5369,7 +5418,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTopicResponse(response);
+        checkListTopicResponse(response as api.ListTopicResponse);
       })));
     });
 
@@ -5382,8 +5431,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Topic.fromJson(json);
-        checkTopic(obj);
+        var obj =
+            api.Topic.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTopic(obj as api.Topic);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5437,7 +5487,7 @@
           .patch(arg_request, arg_courseId, arg_id,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTopic(response);
+        checkTopic(response as api.Topic);
       })));
     });
   });
@@ -5495,7 +5545,7 @@
       res
           .accept(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5505,8 +5555,9 @@
       var arg_request = buildInvitation();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Invitation.fromJson(json);
-        checkInvitation(obj);
+        var obj = api.Invitation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInvitation(obj as api.Invitation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5545,7 +5596,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInvitation(response);
+        checkInvitation(response as api.Invitation);
       })));
     });
 
@@ -5595,7 +5646,7 @@
       res
           .delete(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5645,7 +5696,7 @@
       res
           .get(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInvitation(response);
+        checkInvitation(response as api.Invitation);
       })));
     });
 
@@ -5707,7 +5758,7 @@
               userId: arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInvitationsResponse(response);
+        checkListInvitationsResponse(response as api.ListInvitationsResponse);
       })));
     });
   });
@@ -5719,8 +5770,9 @@
       var arg_request = buildRegistration();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Registration.fromJson(json);
-        checkRegistration(obj);
+        var obj = api.Registration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegistration(obj as api.Registration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5759,7 +5811,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegistration(response);
+        checkRegistration(response as api.Registration);
       })));
     });
 
@@ -5809,7 +5861,7 @@
       res
           .delete(arg_registrationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -5861,7 +5913,7 @@
       res
           .get(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserProfile(response);
+        checkUserProfile(response as api.UserProfile);
       })));
     });
   });
@@ -5874,8 +5926,9 @@
       var arg_studentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GuardianInvitation.fromJson(json);
-        checkGuardianInvitation(obj);
+        var obj = api.GuardianInvitation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGuardianInvitation(obj as api.GuardianInvitation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5923,7 +5976,7 @@
       res
           .create(arg_request, arg_studentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGuardianInvitation(response);
+        checkGuardianInvitation(response as api.GuardianInvitation);
       })));
     });
 
@@ -5983,7 +6036,7 @@
       res
           .get(arg_studentId, arg_invitationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGuardianInvitation(response);
+        checkGuardianInvitation(response as api.GuardianInvitation);
       })));
     });
 
@@ -6055,7 +6108,8 @@
               states: arg_states,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGuardianInvitationsResponse(response);
+        checkListGuardianInvitationsResponse(
+            response as api.ListGuardianInvitationsResponse);
       })));
     });
 
@@ -6068,8 +6122,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GuardianInvitation.fromJson(json);
-        checkGuardianInvitation(obj);
+        var obj = api.GuardianInvitation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGuardianInvitation(obj as api.GuardianInvitation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6123,7 +6178,7 @@
           .patch(arg_request, arg_studentId, arg_invitationId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGuardianInvitation(response);
+        checkGuardianInvitation(response as api.GuardianInvitation);
       })));
     });
   });
@@ -6185,7 +6240,7 @@
       res
           .delete(arg_studentId, arg_guardianId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6245,7 +6300,7 @@
       res
           .get(arg_studentId, arg_guardianId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGuardian(response);
+        checkGuardian(response as api.Guardian);
       })));
     });
 
@@ -6314,7 +6369,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGuardiansResponse(response);
+        checkListGuardiansResponse(response as api.ListGuardiansResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudasset/v1_test.dart b/generated/googleapis/test/cloudasset/v1_test.dart
index b55056d..c598cdf 100644
--- a/generated/googleapis/test/cloudasset/v1_test.dart
+++ b/generated/googleapis/test/cloudasset/v1_test.dart
@@ -96,8 +96,8 @@
 
 void checkUnnamed2670(core.List<api.GoogleCloudOrgpolicyV1Policy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudOrgpolicyV1Policy(o[0]);
-  checkGoogleCloudOrgpolicyV1Policy(o[1]);
+  checkGoogleCloudOrgpolicyV1Policy(o[0] as api.GoogleCloudOrgpolicyV1Policy);
+  checkGoogleCloudOrgpolicyV1Policy(o[1] as api.GoogleCloudOrgpolicyV1Policy);
 }
 
 core.int buildCounterAsset = 0;
@@ -124,16 +124,18 @@
 void checkAsset(api.Asset o) {
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    checkGoogleIdentityAccesscontextmanagerV1AccessLevel(o.accessLevel);
-    checkGoogleIdentityAccesscontextmanagerV1AccessPolicy(o.accessPolicy);
+    checkGoogleIdentityAccesscontextmanagerV1AccessLevel(
+        o.accessLevel as api.GoogleIdentityAccesscontextmanagerV1AccessLevel);
+    checkGoogleIdentityAccesscontextmanagerV1AccessPolicy(
+        o.accessPolicy as api.GoogleIdentityAccesscontextmanagerV1AccessPolicy);
     checkUnnamed2669(o.ancestors);
     unittest.expect(o.assetType, unittest.equals('foo'));
-    checkPolicy(o.iamPolicy);
+    checkPolicy(o.iamPolicy as api.Policy);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2670(o.orgPolicy);
-    checkResource(o.resource);
-    checkGoogleIdentityAccesscontextmanagerV1ServicePerimeter(
-        o.servicePerimeter);
+    checkResource(o.resource as api.Resource);
+    checkGoogleIdentityAccesscontextmanagerV1ServicePerimeter(o.servicePerimeter
+        as api.GoogleIdentityAccesscontextmanagerV1ServicePerimeter);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterAsset--;
@@ -148,8 +150,8 @@
 
 void checkUnnamed2671(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -216,8 +218,8 @@
 
 void checkUnnamed2673(core.List<api.TemporalAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTemporalAsset(o[0]);
-  checkTemporalAsset(o[1]);
+  checkTemporalAsset(o[0] as api.TemporalAsset);
+  checkTemporalAsset(o[1] as api.TemporalAsset);
 }
 
 core.int buildCounterBatchGetAssetsHistoryResponse = 0;
@@ -259,7 +261,7 @@
   if (buildCounterBigQueryDestination < 3) {
     unittest.expect(o.dataset, unittest.equals('foo'));
     unittest.expect(o.force, unittest.isTrue);
-    checkPartitionSpec(o.partitionSpec);
+    checkPartitionSpec(o.partitionSpec as api.PartitionSpec);
     unittest.expect(o.separateTablesPerAssetType, unittest.isTrue);
     unittest.expect(o.table, unittest.equals('foo'));
   }
@@ -295,7 +297,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2674(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -317,7 +319,7 @@
 void checkCreateFeedRequest(api.CreateFeedRequest o) {
   buildCounterCreateFeedRequest++;
   if (buildCounterCreateFeedRequest < 3) {
-    checkFeed(o.feed);
+    checkFeed(o.feed as api.Feed);
     unittest.expect(o.feedId, unittest.equals('foo'));
   }
   buildCounterCreateFeedRequest--;
@@ -347,8 +349,8 @@
 
 void checkUnnamed2675(core.Map<core.String, api.Permissions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermissions(o['x']);
-  checkPermissions(o['y']);
+  checkPermissions(o['x'] as api.Permissions);
+  checkPermissions(o['y'] as api.Permissions);
 }
 
 core.int buildCounterExplanation = 0;
@@ -402,7 +404,7 @@
   if (buildCounterExportAssetsRequest < 3) {
     checkUnnamed2676(o.assetTypes);
     unittest.expect(o.contentType, unittest.equals('foo'));
-    checkOutputConfig(o.outputConfig);
+    checkOutputConfig(o.outputConfig as api.OutputConfig);
     unittest.expect(o.readTime, unittest.equals('foo'));
   }
   buildCounterExportAssetsRequest--;
@@ -480,9 +482,9 @@
   if (buildCounterFeed < 3) {
     checkUnnamed2677(o.assetNames);
     checkUnnamed2678(o.assetTypes);
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     unittest.expect(o.contentType, unittest.equals('foo'));
-    checkFeedOutputConfig(o.feedOutputConfig);
+    checkFeedOutputConfig(o.feedOutputConfig as api.FeedOutputConfig);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterFeed--;
@@ -502,7 +504,7 @@
 void checkFeedOutputConfig(api.FeedOutputConfig o) {
   buildCounterFeedOutputConfig++;
   if (buildCounterFeedOutputConfig < 3) {
-    checkPubsubDestination(o.pubsubDestination);
+    checkPubsubDestination(o.pubsubDestination as api.PubsubDestination);
   }
   buildCounterFeedOutputConfig--;
 }
@@ -623,11 +625,14 @@
 void checkGoogleCloudOrgpolicyV1Policy(api.GoogleCloudOrgpolicyV1Policy o) {
   buildCounterGoogleCloudOrgpolicyV1Policy++;
   if (buildCounterGoogleCloudOrgpolicyV1Policy < 3) {
-    checkGoogleCloudOrgpolicyV1BooleanPolicy(o.booleanPolicy);
+    checkGoogleCloudOrgpolicyV1BooleanPolicy(
+        o.booleanPolicy as api.GoogleCloudOrgpolicyV1BooleanPolicy);
     unittest.expect(o.constraint, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkGoogleCloudOrgpolicyV1ListPolicy(o.listPolicy);
-    checkGoogleCloudOrgpolicyV1RestoreDefault(o.restoreDefault);
+    checkGoogleCloudOrgpolicyV1ListPolicy(
+        o.listPolicy as api.GoogleCloudOrgpolicyV1ListPolicy);
+    checkGoogleCloudOrgpolicyV1RestoreDefault(
+        o.restoreDefault as api.GoogleCloudOrgpolicyV1RestoreDefault);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -671,8 +676,10 @@
     api.GoogleIdentityAccesscontextmanagerV1AccessLevel o) {
   buildCounterGoogleIdentityAccesscontextmanagerV1AccessLevel++;
   if (buildCounterGoogleIdentityAccesscontextmanagerV1AccessLevel < 3) {
-    checkGoogleIdentityAccesscontextmanagerV1BasicLevel(o.basic);
-    checkGoogleIdentityAccesscontextmanagerV1CustomLevel(o.custom);
+    checkGoogleIdentityAccesscontextmanagerV1BasicLevel(
+        o.basic as api.GoogleIdentityAccesscontextmanagerV1BasicLevel);
+    checkGoogleIdentityAccesscontextmanagerV1CustomLevel(
+        o.custom as api.GoogleIdentityAccesscontextmanagerV1CustomLevel);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -718,8 +725,10 @@
 void checkUnnamed2681(
     core.List<api.GoogleIdentityAccesscontextmanagerV1Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIdentityAccesscontextmanagerV1Condition(o[0]);
-  checkGoogleIdentityAccesscontextmanagerV1Condition(o[1]);
+  checkGoogleIdentityAccesscontextmanagerV1Condition(
+      o[0] as api.GoogleIdentityAccesscontextmanagerV1Condition);
+  checkGoogleIdentityAccesscontextmanagerV1Condition(
+      o[1] as api.GoogleIdentityAccesscontextmanagerV1Condition);
 }
 
 core.int buildCounterGoogleIdentityAccesscontextmanagerV1BasicLevel = 0;
@@ -818,7 +827,8 @@
     api.GoogleIdentityAccesscontextmanagerV1Condition o) {
   buildCounterGoogleIdentityAccesscontextmanagerV1Condition++;
   if (buildCounterGoogleIdentityAccesscontextmanagerV1Condition < 3) {
-    checkGoogleIdentityAccesscontextmanagerV1DevicePolicy(o.devicePolicy);
+    checkGoogleIdentityAccesscontextmanagerV1DevicePolicy(
+        o.devicePolicy as api.GoogleIdentityAccesscontextmanagerV1DevicePolicy);
     checkUnnamed2682(o.ipSubnetworks);
     checkUnnamed2683(o.members);
     unittest.expect(o.negate, unittest.isTrue);
@@ -844,7 +854,7 @@
     api.GoogleIdentityAccesscontextmanagerV1CustomLevel o) {
   buildCounterGoogleIdentityAccesscontextmanagerV1CustomLevel++;
   if (buildCounterGoogleIdentityAccesscontextmanagerV1CustomLevel < 3) {
-    checkExpr(o.expr);
+    checkExpr(o.expr as api.Expr);
   }
   buildCounterGoogleIdentityAccesscontextmanagerV1CustomLevel--;
 }
@@ -886,8 +896,10 @@
 void checkUnnamed2688(
     core.List<api.GoogleIdentityAccesscontextmanagerV1OsConstraint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIdentityAccesscontextmanagerV1OsConstraint(o[0]);
-  checkGoogleIdentityAccesscontextmanagerV1OsConstraint(o[1]);
+  checkGoogleIdentityAccesscontextmanagerV1OsConstraint(
+      o[0] as api.GoogleIdentityAccesscontextmanagerV1OsConstraint);
+  checkGoogleIdentityAccesscontextmanagerV1OsConstraint(
+      o[1] as api.GoogleIdentityAccesscontextmanagerV1OsConstraint);
 }
 
 core.int buildCounterGoogleIdentityAccesscontextmanagerV1DevicePolicy = 0;
@@ -972,8 +984,10 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.perimeterType, unittest.equals('foo'));
-    checkGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig(o.spec);
-    checkGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig(o.status);
+    checkGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig(o.spec
+        as api.GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig);
+    checkGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig(o.status
+        as api.GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.useExplicitDryRunSpec, unittest.isTrue);
   }
@@ -1046,7 +1060,8 @@
     checkUnnamed2690(o.resources);
     checkUnnamed2691(o.restrictedServices);
     checkGoogleIdentityAccesscontextmanagerV1VpcAccessibleServices(
-        o.vpcAccessibleServices);
+        o.vpcAccessibleServices
+            as api.GoogleIdentityAccesscontextmanagerV1VpcAccessibleServices);
   }
   buildCounterGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig--;
 }
@@ -1107,8 +1122,8 @@
 void checkIamPolicySearchResult(api.IamPolicySearchResult o) {
   buildCounterIamPolicySearchResult++;
   if (buildCounterIamPolicySearchResult < 3) {
-    checkExplanation(o.explanation);
-    checkPolicy(o.policy);
+    checkExplanation(o.explanation as api.Explanation);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.project, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
   }
@@ -1124,8 +1139,8 @@
 
 void checkUnnamed2693(core.List<api.Feed> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFeed(o[0]);
-  checkFeed(o[1]);
+  checkFeed(o[0] as api.Feed);
+  checkFeed(o[1] as api.Feed);
 }
 
 core.int buildCounterListFeedsResponse = 0;
@@ -1224,7 +1239,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed2694(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2695(o.response);
@@ -1247,8 +1262,8 @@
 void checkOutputConfig(api.OutputConfig o) {
   buildCounterOutputConfig++;
   if (buildCounterOutputConfig < 3) {
-    checkBigQueryDestination(o.bigqueryDestination);
-    checkGcsDestination(o.gcsDestination);
+    checkBigQueryDestination(o.bigqueryDestination as api.BigQueryDestination);
+    checkGcsDestination(o.gcsDestination as api.GcsDestination);
   }
   buildCounterOutputConfig--;
 }
@@ -1313,8 +1328,8 @@
 
 void checkUnnamed2697(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed2698() {
@@ -1326,8 +1341,8 @@
 
 void checkUnnamed2698(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1533,8 +1548,8 @@
 
 void checkUnnamed2703(core.List<api.IamPolicySearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIamPolicySearchResult(o[0]);
-  checkIamPolicySearchResult(o[1]);
+  checkIamPolicySearchResult(o[0] as api.IamPolicySearchResult);
+  checkIamPolicySearchResult(o[1] as api.IamPolicySearchResult);
 }
 
 core.int buildCounterSearchAllIamPoliciesResponse = 0;
@@ -1567,8 +1582,8 @@
 
 void checkUnnamed2704(core.List<api.ResourceSearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceSearchResult(o[0]);
-  checkResourceSearchResult(o[1]);
+  checkResourceSearchResult(o[0] as api.ResourceSearchResult);
+  checkResourceSearchResult(o[1] as api.ResourceSearchResult);
 }
 
 core.int buildCounterSearchAllResourcesResponse = 0;
@@ -1675,11 +1690,11 @@
 void checkTemporalAsset(api.TemporalAsset o) {
   buildCounterTemporalAsset++;
   if (buildCounterTemporalAsset < 3) {
-    checkAsset(o.asset);
+    checkAsset(o.asset as api.Asset);
     unittest.expect(o.deleted, unittest.isTrue);
-    checkAsset(o.priorAsset);
+    checkAsset(o.priorAsset as api.Asset);
     unittest.expect(o.priorAssetState, unittest.equals('foo'));
-    checkTimeWindow(o.window);
+    checkTimeWindow(o.window as api.TimeWindow);
   }
   buildCounterTemporalAsset--;
 }
@@ -1720,7 +1735,7 @@
 void checkUpdateFeedRequest(api.UpdateFeedRequest o) {
   buildCounterUpdateFeedRequest++;
   if (buildCounterUpdateFeedRequest < 3) {
-    checkFeed(o.feed);
+    checkFeed(o.feed as api.Feed);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateFeedRequest--;
@@ -1757,7 +1772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsset();
       var od = api.Asset.fromJson(o.toJson());
-      checkAsset(od);
+      checkAsset(od as api.Asset);
     });
   });
 
@@ -1765,7 +1780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1773,7 +1788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1781,7 +1796,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetAssetsHistoryResponse();
       var od = api.BatchGetAssetsHistoryResponse.fromJson(o.toJson());
-      checkBatchGetAssetsHistoryResponse(od);
+      checkBatchGetAssetsHistoryResponse(
+          od as api.BatchGetAssetsHistoryResponse);
     });
   });
 
@@ -1789,7 +1805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigQueryDestination();
       var od = api.BigQueryDestination.fromJson(o.toJson());
-      checkBigQueryDestination(od);
+      checkBigQueryDestination(od as api.BigQueryDestination);
     });
   });
 
@@ -1797,7 +1813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1805,7 +1821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateFeedRequest();
       var od = api.CreateFeedRequest.fromJson(o.toJson());
-      checkCreateFeedRequest(od);
+      checkCreateFeedRequest(od as api.CreateFeedRequest);
     });
   });
 
@@ -1813,7 +1829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1821,7 +1837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExplanation();
       var od = api.Explanation.fromJson(o.toJson());
-      checkExplanation(od);
+      checkExplanation(od as api.Explanation);
     });
   });
 
@@ -1829,7 +1845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportAssetsRequest();
       var od = api.ExportAssetsRequest.fromJson(o.toJson());
-      checkExportAssetsRequest(od);
+      checkExportAssetsRequest(od as api.ExportAssetsRequest);
     });
   });
 
@@ -1837,7 +1853,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1845,7 +1861,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeed();
       var od = api.Feed.fromJson(o.toJson());
-      checkFeed(od);
+      checkFeed(od as api.Feed);
     });
   });
 
@@ -1853,7 +1869,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeedOutputConfig();
       var od = api.FeedOutputConfig.fromJson(o.toJson());
-      checkFeedOutputConfig(od);
+      checkFeedOutputConfig(od as api.FeedOutputConfig);
     });
   });
 
@@ -1861,7 +1877,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsDestination();
       var od = api.GcsDestination.fromJson(o.toJson());
-      checkGcsDestination(od);
+      checkGcsDestination(od as api.GcsDestination);
     });
   });
 
@@ -1869,7 +1885,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudOrgpolicyV1BooleanPolicy();
       var od = api.GoogleCloudOrgpolicyV1BooleanPolicy.fromJson(o.toJson());
-      checkGoogleCloudOrgpolicyV1BooleanPolicy(od);
+      checkGoogleCloudOrgpolicyV1BooleanPolicy(
+          od as api.GoogleCloudOrgpolicyV1BooleanPolicy);
     });
   });
 
@@ -1877,7 +1894,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudOrgpolicyV1ListPolicy();
       var od = api.GoogleCloudOrgpolicyV1ListPolicy.fromJson(o.toJson());
-      checkGoogleCloudOrgpolicyV1ListPolicy(od);
+      checkGoogleCloudOrgpolicyV1ListPolicy(
+          od as api.GoogleCloudOrgpolicyV1ListPolicy);
     });
   });
 
@@ -1885,7 +1903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudOrgpolicyV1Policy();
       var od = api.GoogleCloudOrgpolicyV1Policy.fromJson(o.toJson());
-      checkGoogleCloudOrgpolicyV1Policy(od);
+      checkGoogleCloudOrgpolicyV1Policy(od as api.GoogleCloudOrgpolicyV1Policy);
     });
   });
 
@@ -1893,7 +1911,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudOrgpolicyV1RestoreDefault();
       var od = api.GoogleCloudOrgpolicyV1RestoreDefault.fromJson(o.toJson());
-      checkGoogleCloudOrgpolicyV1RestoreDefault(od);
+      checkGoogleCloudOrgpolicyV1RestoreDefault(
+          od as api.GoogleCloudOrgpolicyV1RestoreDefault);
     });
   });
 
@@ -1903,7 +1922,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1AccessLevel();
       var od = api.GoogleIdentityAccesscontextmanagerV1AccessLevel.fromJson(
           o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1AccessLevel(od);
+      checkGoogleIdentityAccesscontextmanagerV1AccessLevel(
+          od as api.GoogleIdentityAccesscontextmanagerV1AccessLevel);
     });
   });
 
@@ -1913,7 +1933,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1AccessPolicy();
       var od = api.GoogleIdentityAccesscontextmanagerV1AccessPolicy.fromJson(
           o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1AccessPolicy(od);
+      checkGoogleIdentityAccesscontextmanagerV1AccessPolicy(
+          od as api.GoogleIdentityAccesscontextmanagerV1AccessPolicy);
     });
   });
 
@@ -1923,7 +1944,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1BasicLevel();
       var od = api.GoogleIdentityAccesscontextmanagerV1BasicLevel.fromJson(
           o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1BasicLevel(od);
+      checkGoogleIdentityAccesscontextmanagerV1BasicLevel(
+          od as api.GoogleIdentityAccesscontextmanagerV1BasicLevel);
     });
   });
 
@@ -1933,7 +1955,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1Condition();
       var od = api.GoogleIdentityAccesscontextmanagerV1Condition.fromJson(
           o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1Condition(od);
+      checkGoogleIdentityAccesscontextmanagerV1Condition(
+          od as api.GoogleIdentityAccesscontextmanagerV1Condition);
     });
   });
 
@@ -1943,7 +1966,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1CustomLevel();
       var od = api.GoogleIdentityAccesscontextmanagerV1CustomLevel.fromJson(
           o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1CustomLevel(od);
+      checkGoogleIdentityAccesscontextmanagerV1CustomLevel(
+          od as api.GoogleIdentityAccesscontextmanagerV1CustomLevel);
     });
   });
 
@@ -1953,7 +1977,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1DevicePolicy();
       var od = api.GoogleIdentityAccesscontextmanagerV1DevicePolicy.fromJson(
           o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1DevicePolicy(od);
+      checkGoogleIdentityAccesscontextmanagerV1DevicePolicy(
+          od as api.GoogleIdentityAccesscontextmanagerV1DevicePolicy);
     });
   });
 
@@ -1963,7 +1988,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1OsConstraint();
       var od = api.GoogleIdentityAccesscontextmanagerV1OsConstraint.fromJson(
           o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1OsConstraint(od);
+      checkGoogleIdentityAccesscontextmanagerV1OsConstraint(
+          od as api.GoogleIdentityAccesscontextmanagerV1OsConstraint);
     });
   });
 
@@ -1974,7 +2000,8 @@
       var od =
           api.GoogleIdentityAccesscontextmanagerV1ServicePerimeter.fromJson(
               o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1ServicePerimeter(od);
+      checkGoogleIdentityAccesscontextmanagerV1ServicePerimeter(
+          od as api.GoogleIdentityAccesscontextmanagerV1ServicePerimeter);
     });
   });
 
@@ -1985,7 +2012,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig();
       var od = api.GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig
           .fromJson(o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig(od);
+      checkGoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig(
+          od as api.GoogleIdentityAccesscontextmanagerV1ServicePerimeterConfig);
     });
   });
 
@@ -1996,7 +2024,8 @@
       var o = buildGoogleIdentityAccesscontextmanagerV1VpcAccessibleServices();
       var od = api.GoogleIdentityAccesscontextmanagerV1VpcAccessibleServices
           .fromJson(o.toJson());
-      checkGoogleIdentityAccesscontextmanagerV1VpcAccessibleServices(od);
+      checkGoogleIdentityAccesscontextmanagerV1VpcAccessibleServices(
+          od as api.GoogleIdentityAccesscontextmanagerV1VpcAccessibleServices);
     });
   });
 
@@ -2004,7 +2033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIamPolicySearchResult();
       var od = api.IamPolicySearchResult.fromJson(o.toJson());
-      checkIamPolicySearchResult(od);
+      checkIamPolicySearchResult(od as api.IamPolicySearchResult);
     });
   });
 
@@ -2012,7 +2041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFeedsResponse();
       var od = api.ListFeedsResponse.fromJson(o.toJson());
-      checkListFeedsResponse(od);
+      checkListFeedsResponse(od as api.ListFeedsResponse);
     });
   });
 
@@ -2020,7 +2049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -2028,7 +2057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutputConfig();
       var od = api.OutputConfig.fromJson(o.toJson());
-      checkOutputConfig(od);
+      checkOutputConfig(od as api.OutputConfig);
     });
   });
 
@@ -2036,7 +2065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionSpec();
       var od = api.PartitionSpec.fromJson(o.toJson());
-      checkPartitionSpec(od);
+      checkPartitionSpec(od as api.PartitionSpec);
     });
   });
 
@@ -2044,7 +2073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissions();
       var od = api.Permissions.fromJson(o.toJson());
-      checkPermissions(od);
+      checkPermissions(od as api.Permissions);
     });
   });
 
@@ -2052,7 +2081,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -2060,7 +2089,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPubsubDestination();
       var od = api.PubsubDestination.fromJson(o.toJson());
-      checkPubsubDestination(od);
+      checkPubsubDestination(od as api.PubsubDestination);
     });
   });
 
@@ -2068,7 +2097,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResource();
       var od = api.Resource.fromJson(o.toJson());
-      checkResource(od);
+      checkResource(od as api.Resource);
     });
   });
 
@@ -2076,7 +2105,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceSearchResult();
       var od = api.ResourceSearchResult.fromJson(o.toJson());
-      checkResourceSearchResult(od);
+      checkResourceSearchResult(od as api.ResourceSearchResult);
     });
   });
 
@@ -2084,7 +2113,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAllIamPoliciesResponse();
       var od = api.SearchAllIamPoliciesResponse.fromJson(o.toJson());
-      checkSearchAllIamPoliciesResponse(od);
+      checkSearchAllIamPoliciesResponse(od as api.SearchAllIamPoliciesResponse);
     });
   });
 
@@ -2092,7 +2121,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAllResourcesResponse();
       var od = api.SearchAllResourcesResponse.fromJson(o.toJson());
-      checkSearchAllResourcesResponse(od);
+      checkSearchAllResourcesResponse(od as api.SearchAllResourcesResponse);
     });
   });
 
@@ -2100,7 +2129,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2108,7 +2137,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTemporalAsset();
       var od = api.TemporalAsset.fromJson(o.toJson());
-      checkTemporalAsset(od);
+      checkTemporalAsset(od as api.TemporalAsset);
     });
   });
 
@@ -2116,7 +2145,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeWindow();
       var od = api.TimeWindow.fromJson(o.toJson());
-      checkTimeWindow(od);
+      checkTimeWindow(od as api.TimeWindow);
     });
   });
 
@@ -2124,7 +2153,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateFeedRequest();
       var od = api.UpdateFeedRequest.fromJson(o.toJson());
-      checkUpdateFeedRequest(od);
+      checkUpdateFeedRequest(od as api.UpdateFeedRequest);
     });
   });
 
@@ -2136,8 +2165,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateFeedRequest.fromJson(json);
-        checkCreateFeedRequest(obj);
+        var obj = api.CreateFeedRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateFeedRequest(obj as api.CreateFeedRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2177,7 +2207,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeed(response);
+        checkFeed(response as api.Feed);
       })));
     });
 
@@ -2225,7 +2255,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2273,7 +2303,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeed(response);
+        checkFeed(response as api.Feed);
       })));
     });
 
@@ -2321,7 +2351,7 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFeedsResponse(response);
+        checkListFeedsResponse(response as api.ListFeedsResponse);
       })));
     });
 
@@ -2332,8 +2362,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateFeedRequest.fromJson(json);
-        checkUpdateFeedRequest(obj);
+        var obj = api.UpdateFeedRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateFeedRequest(obj as api.UpdateFeedRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2373,7 +2404,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFeed(response);
+        checkFeed(response as api.Feed);
       })));
     });
   });
@@ -2423,7 +2454,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2490,7 +2521,8 @@
               readTimeWindow_startTime: arg_readTimeWindow_startTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetAssetsHistoryResponse(response);
+        checkBatchGetAssetsHistoryResponse(
+            response as api.BatchGetAssetsHistoryResponse);
       })));
     });
 
@@ -2501,8 +2533,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExportAssetsRequest.fromJson(json);
-        checkExportAssetsRequest(obj);
+        var obj = api.ExportAssetsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExportAssetsRequest(obj as api.ExportAssetsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2542,7 +2575,7 @@
       res
           .exportAssets(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2602,7 +2635,8 @@
               query: arg_query,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchAllIamPoliciesResponse(response);
+        checkSearchAllIamPoliciesResponse(
+            response as api.SearchAllIamPoliciesResponse);
       })));
     });
 
@@ -2670,7 +2704,8 @@
               query: arg_query,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchAllResourcesResponse(response);
+        checkSearchAllResourcesResponse(
+            response as api.SearchAllResourcesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudbilling/v1_test.dart b/generated/googleapis/test/cloudbilling/v1_test.dart
index c427905..83579d8 100644
--- a/generated/googleapis/test/cloudbilling/v1_test.dart
+++ b/generated/googleapis/test/cloudbilling/v1_test.dart
@@ -106,8 +106,8 @@
 
 void checkUnnamed2315(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -219,7 +219,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2317(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -319,8 +319,8 @@
 
 void checkUnnamed2319(core.List<api.BillingAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBillingAccount(o[0]);
-  checkBillingAccount(o[1]);
+  checkBillingAccount(o[0] as api.BillingAccount);
+  checkBillingAccount(o[1] as api.BillingAccount);
 }
 
 core.int buildCounterListBillingAccountsResponse = 0;
@@ -353,8 +353,8 @@
 
 void checkUnnamed2320(core.List<api.ProjectBillingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProjectBillingInfo(o[0]);
-  checkProjectBillingInfo(o[1]);
+  checkProjectBillingInfo(o[0] as api.ProjectBillingInfo);
+  checkProjectBillingInfo(o[1] as api.ProjectBillingInfo);
 }
 
 core.int buildCounterListProjectBillingInfoResponse = 0;
@@ -387,8 +387,8 @@
 
 void checkUnnamed2321(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkService(o[0]);
-  checkService(o[1]);
+  checkService(o[0] as api.Service);
+  checkService(o[1] as api.Service);
 }
 
 core.int buildCounterListServicesResponse = 0;
@@ -421,8 +421,8 @@
 
 void checkUnnamed2322(core.List<api.Sku> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSku(o[0]);
-  checkSku(o[1]);
+  checkSku(o[0] as api.Sku);
+  checkSku(o[1] as api.Sku);
 }
 
 core.int buildCounterListSkusResponse = 0;
@@ -478,8 +478,8 @@
 
 void checkUnnamed2323(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed2324() {
@@ -491,8 +491,8 @@
 
 void checkUnnamed2324(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -529,8 +529,8 @@
 
 void checkUnnamed2325(core.List<api.TierRate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTierRate(o[0]);
-  checkTierRate(o[1]);
+  checkTierRate(o[0] as api.TierRate);
+  checkTierRate(o[1] as api.TierRate);
 }
 
 core.int buildCounterPricingExpression = 0;
@@ -582,10 +582,10 @@
 void checkPricingInfo(api.PricingInfo o) {
   buildCounterPricingInfo++;
   if (buildCounterPricingInfo < 3) {
-    checkAggregationInfo(o.aggregationInfo);
+    checkAggregationInfo(o.aggregationInfo as api.AggregationInfo);
     unittest.expect(o.currencyConversionRate, unittest.equals(42.0));
     unittest.expect(o.effectiveTime, unittest.equals('foo'));
-    checkPricingExpression(o.pricingExpression);
+    checkPricingExpression(o.pricingExpression as api.PricingExpression);
     unittest.expect(o.summary, unittest.equals('foo'));
   }
   buildCounterPricingInfo--;
@@ -656,7 +656,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -671,8 +671,8 @@
 
 void checkUnnamed2326(core.List<api.PricingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPricingInfo(o[0]);
-  checkPricingInfo(o[1]);
+  checkPricingInfo(o[0] as api.PricingInfo);
+  checkPricingInfo(o[1] as api.PricingInfo);
 }
 
 core.List<core.String> buildUnnamed2327() {
@@ -709,9 +709,9 @@
 void checkSku(api.Sku o) {
   buildCounterSku++;
   if (buildCounterSku < 3) {
-    checkCategory(o.category);
+    checkCategory(o.category as api.Category);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGeoTaxonomy(o.geoTaxonomy);
+    checkGeoTaxonomy(o.geoTaxonomy as api.GeoTaxonomy);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2326(o.pricingInfo);
     unittest.expect(o.serviceProviderName, unittest.equals('foo'));
@@ -801,7 +801,7 @@
   buildCounterTierRate++;
   if (buildCounterTierRate < 3) {
     unittest.expect(o.startUsageAmount, unittest.equals(42.0));
-    checkMoney(o.unitPrice);
+    checkMoney(o.unitPrice as api.Money);
   }
   buildCounterTierRate--;
 }
@@ -811,7 +811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAggregationInfo();
       var od = api.AggregationInfo.fromJson(o.toJson());
-      checkAggregationInfo(od);
+      checkAggregationInfo(od as api.AggregationInfo);
     });
   });
 
@@ -819,7 +819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -827,7 +827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -835,7 +835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingAccount();
       var od = api.BillingAccount.fromJson(o.toJson());
-      checkBillingAccount(od);
+      checkBillingAccount(od as api.BillingAccount);
     });
   });
 
@@ -843,7 +843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -851,7 +851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategory();
       var od = api.Category.fromJson(o.toJson());
-      checkCategory(od);
+      checkCategory(od as api.Category);
     });
   });
 
@@ -859,7 +859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -867,7 +867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeoTaxonomy();
       var od = api.GeoTaxonomy.fromJson(o.toJson());
-      checkGeoTaxonomy(od);
+      checkGeoTaxonomy(od as api.GeoTaxonomy);
     });
   });
 
@@ -875,7 +875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBillingAccountsResponse();
       var od = api.ListBillingAccountsResponse.fromJson(o.toJson());
-      checkListBillingAccountsResponse(od);
+      checkListBillingAccountsResponse(od as api.ListBillingAccountsResponse);
     });
   });
 
@@ -883,7 +883,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListProjectBillingInfoResponse();
       var od = api.ListProjectBillingInfoResponse.fromJson(o.toJson());
-      checkListProjectBillingInfoResponse(od);
+      checkListProjectBillingInfoResponse(
+          od as api.ListProjectBillingInfoResponse);
     });
   });
 
@@ -891,7 +892,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServicesResponse();
       var od = api.ListServicesResponse.fromJson(o.toJson());
-      checkListServicesResponse(od);
+      checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
 
@@ -899,7 +900,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSkusResponse();
       var od = api.ListSkusResponse.fromJson(o.toJson());
-      checkListSkusResponse(od);
+      checkListSkusResponse(od as api.ListSkusResponse);
     });
   });
 
@@ -907,7 +908,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoney();
       var od = api.Money.fromJson(o.toJson());
-      checkMoney(od);
+      checkMoney(od as api.Money);
     });
   });
 
@@ -915,7 +916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -923,7 +924,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPricingExpression();
       var od = api.PricingExpression.fromJson(o.toJson());
-      checkPricingExpression(od);
+      checkPricingExpression(od as api.PricingExpression);
     });
   });
 
@@ -931,7 +932,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPricingInfo();
       var od = api.PricingInfo.fromJson(o.toJson());
-      checkPricingInfo(od);
+      checkPricingInfo(od as api.PricingInfo);
     });
   });
 
@@ -939,7 +940,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectBillingInfo();
       var od = api.ProjectBillingInfo.fromJson(o.toJson());
-      checkProjectBillingInfo(od);
+      checkProjectBillingInfo(od as api.ProjectBillingInfo);
     });
   });
 
@@ -947,7 +948,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -955,7 +956,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -963,7 +964,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSku();
       var od = api.Sku.fromJson(o.toJson());
-      checkSku(od);
+      checkSku(od as api.Sku);
     });
   });
 
@@ -971,7 +972,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -979,7 +980,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -987,7 +988,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTierRate();
       var od = api.TierRate.fromJson(o.toJson());
-      checkTierRate(od);
+      checkTierRate(od as api.TierRate);
     });
   });
 
@@ -998,8 +999,9 @@
       var arg_request = buildBillingAccount();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BillingAccount.fromJson(json);
-        checkBillingAccount(obj);
+        var obj = api.BillingAccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBillingAccount(obj as api.BillingAccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1038,7 +1040,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBillingAccount(response);
+        checkBillingAccount(response as api.BillingAccount);
       })));
     });
 
@@ -1086,7 +1088,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBillingAccount(response);
+        checkBillingAccount(response as api.BillingAccount);
       })));
     });
 
@@ -1141,7 +1143,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1199,7 +1201,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBillingAccountsResponse(response);
+        checkListBillingAccountsResponse(
+            response as api.ListBillingAccountsResponse);
       })));
     });
 
@@ -1211,8 +1214,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BillingAccount.fromJson(json);
-        checkBillingAccount(obj);
+        var obj = api.BillingAccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBillingAccount(obj as api.BillingAccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1255,7 +1259,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBillingAccount(response);
+        checkBillingAccount(response as api.BillingAccount);
       })));
     });
 
@@ -1266,8 +1270,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1307,7 +1312,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1318,8 +1323,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1359,7 +1365,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -1418,7 +1425,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListProjectBillingInfoResponse(response);
+        checkListProjectBillingInfoResponse(
+            response as api.ListProjectBillingInfoResponse);
       })));
     });
   });
@@ -1468,7 +1476,7 @@
       res
           .getBillingInfo(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProjectBillingInfo(response);
+        checkProjectBillingInfo(response as api.ProjectBillingInfo);
       })));
     });
 
@@ -1479,8 +1487,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProjectBillingInfo.fromJson(json);
-        checkProjectBillingInfo(obj);
+        var obj = api.ProjectBillingInfo.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProjectBillingInfo(obj as api.ProjectBillingInfo);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1520,7 +1529,7 @@
       res
           .updateBillingInfo(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProjectBillingInfo(response);
+        checkProjectBillingInfo(response as api.ProjectBillingInfo);
       })));
     });
   });
@@ -1577,7 +1586,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicesResponse(response);
+        checkListServicesResponse(response as api.ListServicesResponse);
       })));
     });
   });
@@ -1648,7 +1657,7 @@
               startTime: arg_startTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSkusResponse(response);
+        checkListSkusResponse(response as api.ListSkusResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudbuild/v1_test.dart b/generated/googleapis/test/cloudbuild/v1_test.dart
index b255f2b..0316d5e 100644
--- a/generated/googleapis/test/cloudbuild/v1_test.dart
+++ b/generated/googleapis/test/cloudbuild/v1_test.dart
@@ -105,7 +105,7 @@
   if (buildCounterArtifactObjects < 3) {
     unittest.expect(o.location, unittest.equals('foo'));
     checkUnnamed1642(o.paths);
-    checkTimeSpan(o.timing);
+    checkTimeSpan(o.timing as api.TimeSpan);
   }
   buildCounterArtifactObjects--;
 }
@@ -119,8 +119,8 @@
 
 void checkUnnamed1643(core.List<api.FileHashes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileHashes(o[0]);
-  checkFileHashes(o[1]);
+  checkFileHashes(o[0] as api.FileHashes);
+  checkFileHashes(o[1] as api.FileHashes);
 }
 
 core.int buildCounterArtifactResult = 0;
@@ -173,7 +173,7 @@
   buildCounterArtifacts++;
   if (buildCounterArtifacts < 3) {
     checkUnnamed1644(o.images);
-    checkArtifactObjects(o.objects);
+    checkArtifactObjects(o.objects as api.ArtifactObjects);
   }
   buildCounterArtifacts--;
 }
@@ -200,8 +200,8 @@
 
 void checkUnnamed1646(core.List<api.Secret> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSecret(o[0]);
-  checkSecret(o[1]);
+  checkSecret(o[0] as api.Secret);
+  checkSecret(o[1] as api.Secret);
 }
 
 core.List<api.BuildStep> buildUnnamed1647() {
@@ -213,8 +213,8 @@
 
 void checkUnnamed1647(core.List<api.BuildStep> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildStep(o[0]);
-  checkBuildStep(o[1]);
+  checkBuildStep(o[0] as api.BuildStep);
+  checkBuildStep(o[1] as api.BuildStep);
 }
 
 core.Map<core.String, core.String> buildUnnamed1648() {
@@ -252,8 +252,8 @@
 
 void checkUnnamed1650(core.Map<core.String, api.TimeSpan> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimeSpan(o['x']);
-  checkTimeSpan(o['y']);
+  checkTimeSpan(o['x'] as api.TimeSpan);
+  checkTimeSpan(o['y'] as api.TimeSpan);
 }
 
 core.int buildCounterBuild = 0;
@@ -294,7 +294,7 @@
 void checkBuild(api.Build o) {
   buildCounterBuild++;
   if (buildCounterBuild < 3) {
-    checkArtifacts(o.artifacts);
+    checkArtifacts(o.artifacts as api.Artifacts);
     unittest.expect(o.buildTriggerId, unittest.equals('foo'));
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.finishTime, unittest.equals('foo'));
@@ -303,14 +303,14 @@
     unittest.expect(o.logUrl, unittest.equals('foo'));
     unittest.expect(o.logsBucket, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkBuildOptions(o.options);
+    checkBuildOptions(o.options as api.BuildOptions);
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.queueTtl, unittest.equals('foo'));
-    checkResults(o.results);
+    checkResults(o.results as api.Results);
     checkUnnamed1646(o.secrets);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkSource(o.source);
-    checkSourceProvenance(o.sourceProvenance);
+    checkSource(o.source as api.Source);
+    checkSourceProvenance(o.sourceProvenance as api.SourceProvenance);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusDetail, unittest.equals('foo'));
@@ -337,7 +337,7 @@
 void checkBuildOperationMetadata(api.BuildOperationMetadata o) {
   buildCounterBuildOperationMetadata++;
   if (buildCounterBuildOperationMetadata < 3) {
-    checkBuild(o.build);
+    checkBuild(o.build as api.Build);
   }
   buildCounterBuildOperationMetadata--;
 }
@@ -390,8 +390,8 @@
 
 void checkUnnamed1654(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.int buildCounterBuildOptions = 0;
@@ -483,8 +483,8 @@
 
 void checkUnnamed1658(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.List<core.String> buildUnnamed1659() {
@@ -532,11 +532,11 @@
     checkUnnamed1656(o.env);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkTimeSpan(o.pullTiming);
+    checkTimeSpan(o.pullTiming as api.TimeSpan);
     checkUnnamed1657(o.secretEnv);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.timeout, unittest.equals('foo'));
-    checkTimeSpan(o.timing);
+    checkTimeSpan(o.timing as api.TimeSpan);
     checkUnnamed1658(o.volumes);
     checkUnnamed1659(o.waitFor);
   }
@@ -621,19 +621,19 @@
 void checkBuildTrigger(api.BuildTrigger o) {
   buildCounterBuildTrigger++;
   if (buildCounterBuildTrigger < 3) {
-    checkBuild(o.build);
+    checkBuild(o.build as api.Build);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.disabled, unittest.isTrue);
     unittest.expect(o.filename, unittest.equals('foo'));
-    checkGitHubEventsConfig(o.github);
+    checkGitHubEventsConfig(o.github as api.GitHubEventsConfig);
     unittest.expect(o.id, unittest.equals('foo'));
     checkUnnamed1660(o.ignoredFiles);
     checkUnnamed1661(o.includedFiles);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1662(o.substitutions);
     checkUnnamed1663(o.tags);
-    checkRepoSource(o.triggerTemplate);
+    checkRepoSource(o.triggerTemplate as api.RepoSource);
   }
   buildCounterBuildTrigger--;
 }
@@ -656,7 +656,7 @@
   if (buildCounterBuiltImage < 3) {
     unittest.expect(o.digest, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkTimeSpan(o.pushTiming);
+    checkTimeSpan(o.pushTiming as api.TimeSpan);
   }
   buildCounterBuiltImage--;
 }
@@ -723,8 +723,8 @@
 
 void checkUnnamed1664(core.List<api.Hash> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHash(o[0]);
-  checkHash(o[1]);
+  checkHash(o[0] as api.Hash);
+  checkHash(o[1] as api.Hash);
 }
 
 core.int buildCounterFileHashes = 0;
@@ -767,8 +767,8 @@
     unittest.expect(o.installationId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.owner, unittest.equals('foo'));
-    checkPullRequestFilter(o.pullRequest);
-    checkPushFilter(o.push);
+    checkPullRequestFilter(o.pullRequest as api.PullRequestFilter);
+    checkPushFilter(o.push as api.PushFilter);
   }
   buildCounterGitHubEventsConfig--;
 }
@@ -822,8 +822,8 @@
 
 void checkUnnamed1665(core.List<api.BuildTrigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildTrigger(o[0]);
-  checkBuildTrigger(o[1]);
+  checkBuildTrigger(o[0] as api.BuildTrigger);
+  checkBuildTrigger(o[1] as api.BuildTrigger);
 }
 
 core.int buildCounterListBuildTriggersResponse = 0;
@@ -856,8 +856,8 @@
 
 void checkUnnamed1666(core.List<api.Build> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuild(o[0]);
-  checkBuild(o[1]);
+  checkBuild(o[0] as api.Build);
+  checkBuild(o[1] as api.Build);
 }
 
 core.int buildCounterListBuildsResponse = 0;
@@ -929,9 +929,9 @@
   buildCounterNotification++;
   if (buildCounterNotification < 3) {
     unittest.expect(o.filter, unittest.equals('foo'));
-    checkHTTPDelivery(o.httpDelivery);
-    checkSlackDelivery(o.slackDelivery);
-    checkSMTPDelivery(o.smtpDelivery);
+    checkHTTPDelivery(o.httpDelivery as api.HTTPDelivery);
+    checkSlackDelivery(o.slackDelivery as api.SlackDelivery);
+    checkSMTPDelivery(o.smtpDelivery as api.SMTPDelivery);
     checkUnnamed1667(o.structDelivery);
   }
   buildCounterNotification--;
@@ -956,8 +956,8 @@
   if (buildCounterNotifierConfig < 3) {
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkNotifierMetadata(o.metadata);
-    checkNotifierSpec(o.spec);
+    checkNotifierMetadata(o.metadata as api.NotifierMetadata);
+    checkNotifierSpec(o.spec as api.NotifierSpec);
   }
   buildCounterNotifierConfig--;
 }
@@ -1032,8 +1032,8 @@
 
 void checkUnnamed1668(core.List<api.NotifierSecret> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotifierSecret(o[0]);
-  checkNotifierSecret(o[1]);
+  checkNotifierSecret(o[0] as api.NotifierSecret);
+  checkNotifierSecret(o[1] as api.NotifierSecret);
 }
 
 core.int buildCounterNotifierSpec = 0;
@@ -1051,7 +1051,7 @@
 void checkNotifierSpec(api.NotifierSpec o) {
   buildCounterNotifierSpec++;
   if (buildCounterNotifierSpec < 3) {
-    checkNotification(o.notification);
+    checkNotification(o.notification as api.Notification);
     checkUnnamed1668(o.secrets);
   }
   buildCounterNotifierSpec--;
@@ -1134,7 +1134,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1669(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1670(o.response);
@@ -1269,8 +1269,8 @@
 
 void checkUnnamed1674(core.List<api.BuiltImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuiltImage(o[0]);
-  checkBuiltImage(o[1]);
+  checkBuiltImage(o[0] as api.BuiltImage);
+  checkBuiltImage(o[1] as api.BuiltImage);
 }
 
 core.int buildCounterResults = 0;
@@ -1293,7 +1293,7 @@
   buildCounterResults++;
   if (buildCounterResults < 3) {
     unittest.expect(o.artifactManifest, unittest.equals('foo'));
-    checkTimeSpan(o.artifactTiming);
+    checkTimeSpan(o.artifactTiming as api.TimeSpan);
     checkUnnamed1672(o.buildStepImages);
     checkUnnamed1673(o.buildStepOutputs);
     checkUnnamed1674(o.images);
@@ -1358,7 +1358,7 @@
   buildCounterSMTPDelivery++;
   if (buildCounterSMTPDelivery < 3) {
     unittest.expect(o.fromAddress, unittest.equals('foo'));
-    checkNotifierSecretRef(o.password);
+    checkNotifierSecretRef(o.password as api.NotifierSecretRef);
     unittest.expect(o.port, unittest.equals('foo'));
     checkUnnamed1675(o.recipientAddresses);
     unittest.expect(o.senderAddress, unittest.equals('foo'));
@@ -1415,7 +1415,7 @@
 void checkSlackDelivery(api.SlackDelivery o) {
   buildCounterSlackDelivery++;
   if (buildCounterSlackDelivery < 3) {
-    checkNotifierSecretRef(o.webhookUri);
+    checkNotifierSecretRef(o.webhookUri as api.NotifierSecretRef);
   }
   buildCounterSlackDelivery--;
 }
@@ -1435,8 +1435,8 @@
 void checkSource(api.Source o) {
   buildCounterSource++;
   if (buildCounterSource < 3) {
-    checkRepoSource(o.repoSource);
-    checkStorageSource(o.storageSource);
+    checkRepoSource(o.repoSource as api.RepoSource);
+    checkStorageSource(o.storageSource as api.StorageSource);
   }
   buildCounterSource--;
 }
@@ -1450,8 +1450,8 @@
 
 void checkUnnamed1677(core.Map<core.String, api.FileHashes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileHashes(o['x']);
-  checkFileHashes(o['y']);
+  checkFileHashes(o['x'] as api.FileHashes);
+  checkFileHashes(o['y'] as api.FileHashes);
 }
 
 core.int buildCounterSourceProvenance = 0;
@@ -1471,8 +1471,8 @@
   buildCounterSourceProvenance++;
   if (buildCounterSourceProvenance < 3) {
     checkUnnamed1677(o.fileHashes);
-    checkRepoSource(o.resolvedRepoSource);
-    checkStorageSource(o.resolvedStorageSource);
+    checkRepoSource(o.resolvedRepoSource as api.RepoSource);
+    checkStorageSource(o.resolvedStorageSource as api.StorageSource);
   }
   buildCounterSourceProvenance--;
 }
@@ -1612,7 +1612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArtifactObjects();
       var od = api.ArtifactObjects.fromJson(o.toJson());
-      checkArtifactObjects(od);
+      checkArtifactObjects(od as api.ArtifactObjects);
     });
   });
 
@@ -1620,7 +1620,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArtifactResult();
       var od = api.ArtifactResult.fromJson(o.toJson());
-      checkArtifactResult(od);
+      checkArtifactResult(od as api.ArtifactResult);
     });
   });
 
@@ -1628,7 +1628,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArtifacts();
       var od = api.Artifacts.fromJson(o.toJson());
-      checkArtifacts(od);
+      checkArtifacts(od as api.Artifacts);
     });
   });
 
@@ -1636,7 +1636,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuild();
       var od = api.Build.fromJson(o.toJson());
-      checkBuild(od);
+      checkBuild(od as api.Build);
     });
   });
 
@@ -1644,7 +1644,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildOperationMetadata();
       var od = api.BuildOperationMetadata.fromJson(o.toJson());
-      checkBuildOperationMetadata(od);
+      checkBuildOperationMetadata(od as api.BuildOperationMetadata);
     });
   });
 
@@ -1652,7 +1652,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildOptions();
       var od = api.BuildOptions.fromJson(o.toJson());
-      checkBuildOptions(od);
+      checkBuildOptions(od as api.BuildOptions);
     });
   });
 
@@ -1660,7 +1660,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildStep();
       var od = api.BuildStep.fromJson(o.toJson());
-      checkBuildStep(od);
+      checkBuildStep(od as api.BuildStep);
     });
   });
 
@@ -1668,7 +1668,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildTrigger();
       var od = api.BuildTrigger.fromJson(o.toJson());
-      checkBuildTrigger(od);
+      checkBuildTrigger(od as api.BuildTrigger);
     });
   });
 
@@ -1676,7 +1676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuiltImage();
       var od = api.BuiltImage.fromJson(o.toJson());
-      checkBuiltImage(od);
+      checkBuiltImage(od as api.BuiltImage);
     });
   });
 
@@ -1684,7 +1684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelBuildRequest();
       var od = api.CancelBuildRequest.fromJson(o.toJson());
-      checkCancelBuildRequest(od);
+      checkCancelBuildRequest(od as api.CancelBuildRequest);
     });
   });
 
@@ -1692,7 +1692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -1700,7 +1700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1708,7 +1708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileHashes();
       var od = api.FileHashes.fromJson(o.toJson());
-      checkFileHashes(od);
+      checkFileHashes(od as api.FileHashes);
     });
   });
 
@@ -1716,7 +1716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGitHubEventsConfig();
       var od = api.GitHubEventsConfig.fromJson(o.toJson());
-      checkGitHubEventsConfig(od);
+      checkGitHubEventsConfig(od as api.GitHubEventsConfig);
     });
   });
 
@@ -1724,7 +1724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHTTPDelivery();
       var od = api.HTTPDelivery.fromJson(o.toJson());
-      checkHTTPDelivery(od);
+      checkHTTPDelivery(od as api.HTTPDelivery);
     });
   });
 
@@ -1732,7 +1732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHash();
       var od = api.Hash.fromJson(o.toJson());
-      checkHash(od);
+      checkHash(od as api.Hash);
     });
   });
 
@@ -1740,7 +1740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBuildTriggersResponse();
       var od = api.ListBuildTriggersResponse.fromJson(o.toJson());
-      checkListBuildTriggersResponse(od);
+      checkListBuildTriggersResponse(od as api.ListBuildTriggersResponse);
     });
   });
 
@@ -1748,7 +1748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBuildsResponse();
       var od = api.ListBuildsResponse.fromJson(o.toJson());
-      checkListBuildsResponse(od);
+      checkListBuildsResponse(od as api.ListBuildsResponse);
     });
   });
 
@@ -1756,7 +1756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotification();
       var od = api.Notification.fromJson(o.toJson());
-      checkNotification(od);
+      checkNotification(od as api.Notification);
     });
   });
 
@@ -1764,7 +1764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotifierConfig();
       var od = api.NotifierConfig.fromJson(o.toJson());
-      checkNotifierConfig(od);
+      checkNotifierConfig(od as api.NotifierConfig);
     });
   });
 
@@ -1772,7 +1772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotifierMetadata();
       var od = api.NotifierMetadata.fromJson(o.toJson());
-      checkNotifierMetadata(od);
+      checkNotifierMetadata(od as api.NotifierMetadata);
     });
   });
 
@@ -1780,7 +1780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotifierSecret();
       var od = api.NotifierSecret.fromJson(o.toJson());
-      checkNotifierSecret(od);
+      checkNotifierSecret(od as api.NotifierSecret);
     });
   });
 
@@ -1788,7 +1788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotifierSecretRef();
       var od = api.NotifierSecretRef.fromJson(o.toJson());
-      checkNotifierSecretRef(od);
+      checkNotifierSecretRef(od as api.NotifierSecretRef);
     });
   });
 
@@ -1796,7 +1796,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotifierSpec();
       var od = api.NotifierSpec.fromJson(o.toJson());
-      checkNotifierSpec(od);
+      checkNotifierSpec(od as api.NotifierSpec);
     });
   });
 
@@ -1804,7 +1804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1812,7 +1812,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPullRequestFilter();
       var od = api.PullRequestFilter.fromJson(o.toJson());
-      checkPullRequestFilter(od);
+      checkPullRequestFilter(od as api.PullRequestFilter);
     });
   });
 
@@ -1820,7 +1820,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPushFilter();
       var od = api.PushFilter.fromJson(o.toJson());
-      checkPushFilter(od);
+      checkPushFilter(od as api.PushFilter);
     });
   });
 
@@ -1828,7 +1828,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepoSource();
       var od = api.RepoSource.fromJson(o.toJson());
-      checkRepoSource(od);
+      checkRepoSource(od as api.RepoSource);
     });
   });
 
@@ -1836,7 +1836,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResults();
       var od = api.Results.fromJson(o.toJson());
-      checkResults(od);
+      checkResults(od as api.Results);
     });
   });
 
@@ -1844,7 +1844,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRetryBuildRequest();
       var od = api.RetryBuildRequest.fromJson(o.toJson());
-      checkRetryBuildRequest(od);
+      checkRetryBuildRequest(od as api.RetryBuildRequest);
     });
   });
 
@@ -1852,7 +1852,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSMTPDelivery();
       var od = api.SMTPDelivery.fromJson(o.toJson());
-      checkSMTPDelivery(od);
+      checkSMTPDelivery(od as api.SMTPDelivery);
     });
   });
 
@@ -1860,7 +1860,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecret();
       var od = api.Secret.fromJson(o.toJson());
-      checkSecret(od);
+      checkSecret(od as api.Secret);
     });
   });
 
@@ -1868,7 +1868,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSlackDelivery();
       var od = api.SlackDelivery.fromJson(o.toJson());
-      checkSlackDelivery(od);
+      checkSlackDelivery(od as api.SlackDelivery);
     });
   });
 
@@ -1876,7 +1876,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSource();
       var od = api.Source.fromJson(o.toJson());
-      checkSource(od);
+      checkSource(od as api.Source);
     });
   });
 
@@ -1884,7 +1884,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceProvenance();
       var od = api.SourceProvenance.fromJson(o.toJson());
-      checkSourceProvenance(od);
+      checkSourceProvenance(od as api.SourceProvenance);
     });
   });
 
@@ -1892,7 +1892,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1900,7 +1900,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStorageSource();
       var od = api.StorageSource.fromJson(o.toJson());
-      checkStorageSource(od);
+      checkStorageSource(od as api.StorageSource);
     });
   });
 
@@ -1908,7 +1908,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeSpan();
       var od = api.TimeSpan.fromJson(o.toJson());
-      checkTimeSpan(od);
+      checkTimeSpan(od as api.TimeSpan);
     });
   });
 
@@ -1916,7 +1916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolume();
       var od = api.Volume.fromJson(o.toJson());
-      checkVolume(od);
+      checkVolume(od as api.Volume);
     });
   });
 
@@ -1928,8 +1928,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1969,7 +1970,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2017,7 +2018,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2031,8 +2032,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelBuildRequest.fromJson(json);
-        checkCancelBuildRequest(obj);
+        var obj = api.CancelBuildRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelBuildRequest(obj as api.CancelBuildRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2089,7 +2091,7 @@
       res
           .cancel(arg_request, arg_projectId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuild(response);
+        checkBuild(response as api.Build);
       })));
     });
 
@@ -2101,8 +2103,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Build.fromJson(json);
-        checkBuild(obj);
+        var obj =
+            api.Build.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBuild(obj as api.Build);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2152,7 +2155,7 @@
           .create(arg_request, arg_projectId,
               parent: arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2214,7 +2217,7 @@
       res
           .get(arg_projectId, arg_id, name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuild(response);
+        checkBuild(response as api.Build);
       })));
     });
 
@@ -2285,7 +2288,7 @@
               parent: arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBuildsResponse(response);
+        checkListBuildsResponse(response as api.ListBuildsResponse);
       })));
     });
 
@@ -2297,8 +2300,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RetryBuildRequest.fromJson(json);
-        checkRetryBuildRequest(obj);
+        var obj = api.RetryBuildRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRetryBuildRequest(obj as api.RetryBuildRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2355,7 +2359,7 @@
       res
           .retry(arg_request, arg_projectId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2368,8 +2372,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelBuildRequest.fromJson(json);
-        checkCancelBuildRequest(obj);
+        var obj = api.CancelBuildRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelBuildRequest(obj as api.CancelBuildRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2409,7 +2414,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuild(response);
+        checkBuild(response as api.Build);
       })));
     });
 
@@ -2421,8 +2426,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Build.fromJson(json);
-        checkBuild(obj);
+        var obj =
+            api.Build.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBuild(obj as api.Build);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2465,7 +2471,7 @@
           .create(arg_request, arg_parent,
               projectId: arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2519,7 +2525,7 @@
           .get(arg_name,
               id: arg_id, projectId: arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuild(response);
+        checkBuild(response as api.Build);
       })));
     });
 
@@ -2583,7 +2589,7 @@
               projectId: arg_projectId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBuildsResponse(response);
+        checkListBuildsResponse(response as api.ListBuildsResponse);
       })));
     });
 
@@ -2594,8 +2600,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RetryBuildRequest.fromJson(json);
-        checkRetryBuildRequest(obj);
+        var obj = api.RetryBuildRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRetryBuildRequest(obj as api.RetryBuildRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2635,7 +2642,7 @@
       res
           .retry(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2648,8 +2655,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2689,7 +2697,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2737,7 +2745,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2750,8 +2758,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BuildTrigger.fromJson(json);
-        checkBuildTrigger(obj);
+        var obj = api.BuildTrigger.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBuildTrigger(obj as api.BuildTrigger);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2799,7 +2808,7 @@
       res
           .create(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildTrigger(response);
+        checkBuildTrigger(response as api.BuildTrigger);
       })));
     });
 
@@ -2859,7 +2868,7 @@
       res
           .delete(arg_projectId, arg_triggerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2919,7 +2928,7 @@
       res
           .get(arg_projectId, arg_triggerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildTrigger(response);
+        checkBuildTrigger(response as api.BuildTrigger);
       })));
     });
 
@@ -2984,7 +2993,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBuildTriggersResponse(response);
+        checkListBuildTriggersResponse(
+            response as api.ListBuildTriggersResponse);
       })));
     });
 
@@ -2996,8 +3006,9 @@
       var arg_triggerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BuildTrigger.fromJson(json);
-        checkBuildTrigger(obj);
+        var obj = api.BuildTrigger.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBuildTrigger(obj as api.BuildTrigger);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3049,7 +3060,7 @@
           .patch(arg_request, arg_projectId, arg_triggerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildTrigger(response);
+        checkBuildTrigger(response as api.BuildTrigger);
       })));
     });
 
@@ -3061,8 +3072,9 @@
       var arg_triggerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RepoSource.fromJson(json);
-        checkRepoSource(obj);
+        var obj = api.RepoSource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRepoSource(obj as api.RepoSource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3119,7 +3131,7 @@
       res
           .run(arg_request, arg_projectId, arg_triggerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/clouddebugger/v2_test.dart b/generated/googleapis/test/clouddebugger/v2_test.dart
index e9342e6..b44c1ca 100644
--- a/generated/googleapis/test/clouddebugger/v2_test.dart
+++ b/generated/googleapis/test/clouddebugger/v2_test.dart
@@ -104,8 +104,8 @@
 
 void checkUnnamed3853(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.List<core.String> buildUnnamed3854() {
@@ -143,8 +143,8 @@
 
 void checkUnnamed3856(core.List<api.StackFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStackFrame(o[0]);
-  checkStackFrame(o[1]);
+  checkStackFrame(o[0] as api.StackFrame);
+  checkStackFrame(o[1] as api.StackFrame);
 }
 
 core.List<api.Variable> buildUnnamed3857() {
@@ -156,8 +156,8 @@
 
 void checkUnnamed3857(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterBreakpoint = 0;
@@ -201,12 +201,12 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isFinalState, unittest.isTrue);
     checkUnnamed3855(o.labels);
-    checkSourceLocation(o.location);
+    checkSourceLocation(o.location as api.SourceLocation);
     unittest.expect(o.logLevel, unittest.equals('foo'));
     unittest.expect(o.logMessageFormat, unittest.equals('foo'));
     checkUnnamed3856(o.stackFrames);
     unittest.expect(o.state, unittest.equals('foo'));
-    checkStatusMessage(o.status);
+    checkStatusMessage(o.status as api.StatusMessage);
     unittest.expect(o.userEmail, unittest.equals('foo'));
     checkUnnamed3857(o.variableTable);
   }
@@ -230,9 +230,9 @@
 void checkCloudRepoSourceContext(api.CloudRepoSourceContext o) {
   buildCounterCloudRepoSourceContext++;
   if (buildCounterCloudRepoSourceContext < 3) {
-    checkAliasContext(o.aliasContext);
+    checkAliasContext(o.aliasContext as api.AliasContext);
     unittest.expect(o.aliasName, unittest.equals('foo'));
-    checkRepoId(o.repoId);
+    checkRepoId(o.repoId as api.RepoId);
     unittest.expect(o.revisionId, unittest.equals('foo'));
   }
   buildCounterCloudRepoSourceContext--;
@@ -254,7 +254,7 @@
   buildCounterCloudWorkspaceId++;
   if (buildCounterCloudWorkspaceId < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkRepoId(o.repoId);
+    checkRepoId(o.repoId as api.RepoId);
   }
   buildCounterCloudWorkspaceId--;
 }
@@ -275,7 +275,7 @@
   buildCounterCloudWorkspaceSourceContext++;
   if (buildCounterCloudWorkspaceSourceContext < 3) {
     unittest.expect(o.snapshotId, unittest.equals('foo'));
-    checkCloudWorkspaceId(o.workspaceId);
+    checkCloudWorkspaceId(o.workspaceId as api.CloudWorkspaceId);
   }
   buildCounterCloudWorkspaceSourceContext--;
 }
@@ -289,8 +289,8 @@
 
 void checkUnnamed3858(core.List<api.ExtendedSourceContext> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExtendedSourceContext(o[0]);
-  checkExtendedSourceContext(o[1]);
+  checkExtendedSourceContext(o[0] as api.ExtendedSourceContext);
+  checkExtendedSourceContext(o[1] as api.ExtendedSourceContext);
 }
 
 core.Map<core.String, core.String> buildUnnamed3859() {
@@ -315,8 +315,8 @@
 
 void checkUnnamed3860(core.List<api.SourceContext> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSourceContext(o[0]);
-  checkSourceContext(o[1]);
+  checkSourceContext(o[0] as api.SourceContext);
+  checkSourceContext(o[1] as api.SourceContext);
 }
 
 core.int buildCounterDebuggee = 0;
@@ -354,7 +354,7 @@
     checkUnnamed3859(o.labels);
     unittest.expect(o.project, unittest.equals('foo'));
     checkUnnamed3860(o.sourceContexts);
-    checkStatusMessage(o.status);
+    checkStatusMessage(o.status as api.StatusMessage);
     unittest.expect(o.uniquifier, unittest.equals('foo'));
   }
   buildCounterDebuggee--;
@@ -403,7 +403,7 @@
 void checkExtendedSourceContext(api.ExtendedSourceContext o) {
   buildCounterExtendedSourceContext++;
   if (buildCounterExtendedSourceContext < 3) {
-    checkSourceContext(o.context);
+    checkSourceContext(o.context as api.SourceContext);
     checkUnnamed3861(o.labels);
   }
   buildCounterExtendedSourceContext--;
@@ -461,7 +461,7 @@
 void checkGerritSourceContext(api.GerritSourceContext o) {
   buildCounterGerritSourceContext++;
   if (buildCounterGerritSourceContext < 3) {
-    checkAliasContext(o.aliasContext);
+    checkAliasContext(o.aliasContext as api.AliasContext);
     unittest.expect(o.aliasName, unittest.equals('foo'));
     unittest.expect(o.gerritProject, unittest.equals('foo'));
     unittest.expect(o.hostUri, unittest.equals('foo'));
@@ -484,7 +484,7 @@
 void checkGetBreakpointResponse(api.GetBreakpointResponse o) {
   buildCounterGetBreakpointResponse++;
   if (buildCounterGetBreakpointResponse < 3) {
-    checkBreakpoint(o.breakpoint);
+    checkBreakpoint(o.breakpoint as api.Breakpoint);
   }
   buildCounterGetBreakpointResponse--;
 }
@@ -519,8 +519,8 @@
 
 void checkUnnamed3863(core.List<api.Breakpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBreakpoint(o[0]);
-  checkBreakpoint(o[1]);
+  checkBreakpoint(o[0] as api.Breakpoint);
+  checkBreakpoint(o[1] as api.Breakpoint);
 }
 
 core.int buildCounterListActiveBreakpointsResponse = 0;
@@ -555,8 +555,8 @@
 
 void checkUnnamed3864(core.List<api.Breakpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBreakpoint(o[0]);
-  checkBreakpoint(o[1]);
+  checkBreakpoint(o[0] as api.Breakpoint);
+  checkBreakpoint(o[1] as api.Breakpoint);
 }
 
 core.int buildCounterListBreakpointsResponse = 0;
@@ -589,8 +589,8 @@
 
 void checkUnnamed3865(core.List<api.Debuggee> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDebuggee(o[0]);
-  checkDebuggee(o[1]);
+  checkDebuggee(o[0] as api.Debuggee);
+  checkDebuggee(o[1] as api.Debuggee);
 }
 
 core.int buildCounterListDebuggeesResponse = 0;
@@ -647,7 +647,7 @@
 void checkRegisterDebuggeeRequest(api.RegisterDebuggeeRequest o) {
   buildCounterRegisterDebuggeeRequest++;
   if (buildCounterRegisterDebuggeeRequest < 3) {
-    checkDebuggee(o.debuggee);
+    checkDebuggee(o.debuggee as api.Debuggee);
   }
   buildCounterRegisterDebuggeeRequest--;
 }
@@ -668,7 +668,7 @@
   buildCounterRegisterDebuggeeResponse++;
   if (buildCounterRegisterDebuggeeResponse < 3) {
     unittest.expect(o.agentId, unittest.equals('foo'));
-    checkDebuggee(o.debuggee);
+    checkDebuggee(o.debuggee as api.Debuggee);
   }
   buildCounterRegisterDebuggeeResponse--;
 }
@@ -688,7 +688,7 @@
 void checkRepoId(api.RepoId o) {
   buildCounterRepoId++;
   if (buildCounterRepoId < 3) {
-    checkProjectRepoId(o.projectRepoId);
+    checkProjectRepoId(o.projectRepoId as api.ProjectRepoId);
     unittest.expect(o.uid, unittest.equals('foo'));
   }
   buildCounterRepoId--;
@@ -708,7 +708,7 @@
 void checkSetBreakpointResponse(api.SetBreakpointResponse o) {
   buildCounterSetBreakpointResponse++;
   if (buildCounterSetBreakpointResponse < 3) {
-    checkBreakpoint(o.breakpoint);
+    checkBreakpoint(o.breakpoint as api.Breakpoint);
   }
   buildCounterSetBreakpointResponse--;
 }
@@ -730,10 +730,11 @@
 void checkSourceContext(api.SourceContext o) {
   buildCounterSourceContext++;
   if (buildCounterSourceContext < 3) {
-    checkCloudRepoSourceContext(o.cloudRepo);
-    checkCloudWorkspaceSourceContext(o.cloudWorkspace);
-    checkGerritSourceContext(o.gerrit);
-    checkGitSourceContext(o.git);
+    checkCloudRepoSourceContext(o.cloudRepo as api.CloudRepoSourceContext);
+    checkCloudWorkspaceSourceContext(
+        o.cloudWorkspace as api.CloudWorkspaceSourceContext);
+    checkGerritSourceContext(o.gerrit as api.GerritSourceContext);
+    checkGitSourceContext(o.git as api.GitSourceContext);
   }
   buildCounterSourceContext--;
 }
@@ -770,8 +771,8 @@
 
 void checkUnnamed3866(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.List<api.Variable> buildUnnamed3867() {
@@ -783,8 +784,8 @@
 
 void checkUnnamed3867(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterStackFrame = 0;
@@ -807,7 +808,7 @@
     checkUnnamed3866(o.arguments);
     unittest.expect(o.function, unittest.equals('foo'));
     checkUnnamed3867(o.locals);
-    checkSourceLocation(o.location);
+    checkSourceLocation(o.location as api.SourceLocation);
   }
   buildCounterStackFrame--;
 }
@@ -828,7 +829,7 @@
 void checkStatusMessage(api.StatusMessage o) {
   buildCounterStatusMessage++;
   if (buildCounterStatusMessage < 3) {
-    checkFormatMessage(o.description);
+    checkFormatMessage(o.description as api.FormatMessage);
     unittest.expect(o.isError, unittest.isTrue);
     unittest.expect(o.refersTo, unittest.equals('foo'));
   }
@@ -849,7 +850,7 @@
 void checkUpdateActiveBreakpointRequest(api.UpdateActiveBreakpointRequest o) {
   buildCounterUpdateActiveBreakpointRequest++;
   if (buildCounterUpdateActiveBreakpointRequest < 3) {
-    checkBreakpoint(o.breakpoint);
+    checkBreakpoint(o.breakpoint as api.Breakpoint);
   }
   buildCounterUpdateActiveBreakpointRequest--;
 }
@@ -878,8 +879,8 @@
 
 void checkUnnamed3868(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterVariable = 0;
@@ -903,7 +904,7 @@
   if (buildCounterVariable < 3) {
     checkUnnamed3868(o.members);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkStatusMessage(o.status);
+    checkStatusMessage(o.status as api.StatusMessage);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
     unittest.expect(o.varTableIndex, unittest.equals(42));
@@ -916,7 +917,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAliasContext();
       var od = api.AliasContext.fromJson(o.toJson());
-      checkAliasContext(od);
+      checkAliasContext(od as api.AliasContext);
     });
   });
 
@@ -924,7 +925,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBreakpoint();
       var od = api.Breakpoint.fromJson(o.toJson());
-      checkBreakpoint(od);
+      checkBreakpoint(od as api.Breakpoint);
     });
   });
 
@@ -932,7 +933,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudRepoSourceContext();
       var od = api.CloudRepoSourceContext.fromJson(o.toJson());
-      checkCloudRepoSourceContext(od);
+      checkCloudRepoSourceContext(od as api.CloudRepoSourceContext);
     });
   });
 
@@ -940,7 +941,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudWorkspaceId();
       var od = api.CloudWorkspaceId.fromJson(o.toJson());
-      checkCloudWorkspaceId(od);
+      checkCloudWorkspaceId(od as api.CloudWorkspaceId);
     });
   });
 
@@ -948,7 +949,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudWorkspaceSourceContext();
       var od = api.CloudWorkspaceSourceContext.fromJson(o.toJson());
-      checkCloudWorkspaceSourceContext(od);
+      checkCloudWorkspaceSourceContext(od as api.CloudWorkspaceSourceContext);
     });
   });
 
@@ -956,7 +957,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDebuggee();
       var od = api.Debuggee.fromJson(o.toJson());
-      checkDebuggee(od);
+      checkDebuggee(od as api.Debuggee);
     });
   });
 
@@ -964,7 +965,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -972,7 +973,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExtendedSourceContext();
       var od = api.ExtendedSourceContext.fromJson(o.toJson());
-      checkExtendedSourceContext(od);
+      checkExtendedSourceContext(od as api.ExtendedSourceContext);
     });
   });
 
@@ -980,7 +981,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFormatMessage();
       var od = api.FormatMessage.fromJson(o.toJson());
-      checkFormatMessage(od);
+      checkFormatMessage(od as api.FormatMessage);
     });
   });
 
@@ -988,7 +989,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGerritSourceContext();
       var od = api.GerritSourceContext.fromJson(o.toJson());
-      checkGerritSourceContext(od);
+      checkGerritSourceContext(od as api.GerritSourceContext);
     });
   });
 
@@ -996,7 +997,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetBreakpointResponse();
       var od = api.GetBreakpointResponse.fromJson(o.toJson());
-      checkGetBreakpointResponse(od);
+      checkGetBreakpointResponse(od as api.GetBreakpointResponse);
     });
   });
 
@@ -1004,7 +1005,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGitSourceContext();
       var od = api.GitSourceContext.fromJson(o.toJson());
-      checkGitSourceContext(od);
+      checkGitSourceContext(od as api.GitSourceContext);
     });
   });
 
@@ -1012,7 +1013,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListActiveBreakpointsResponse();
       var od = api.ListActiveBreakpointsResponse.fromJson(o.toJson());
-      checkListActiveBreakpointsResponse(od);
+      checkListActiveBreakpointsResponse(
+          od as api.ListActiveBreakpointsResponse);
     });
   });
 
@@ -1020,7 +1022,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBreakpointsResponse();
       var od = api.ListBreakpointsResponse.fromJson(o.toJson());
-      checkListBreakpointsResponse(od);
+      checkListBreakpointsResponse(od as api.ListBreakpointsResponse);
     });
   });
 
@@ -1028,7 +1030,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDebuggeesResponse();
       var od = api.ListDebuggeesResponse.fromJson(o.toJson());
-      checkListDebuggeesResponse(od);
+      checkListDebuggeesResponse(od as api.ListDebuggeesResponse);
     });
   });
 
@@ -1036,7 +1038,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectRepoId();
       var od = api.ProjectRepoId.fromJson(o.toJson());
-      checkProjectRepoId(od);
+      checkProjectRepoId(od as api.ProjectRepoId);
     });
   });
 
@@ -1044,7 +1046,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegisterDebuggeeRequest();
       var od = api.RegisterDebuggeeRequest.fromJson(o.toJson());
-      checkRegisterDebuggeeRequest(od);
+      checkRegisterDebuggeeRequest(od as api.RegisterDebuggeeRequest);
     });
   });
 
@@ -1052,7 +1054,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegisterDebuggeeResponse();
       var od = api.RegisterDebuggeeResponse.fromJson(o.toJson());
-      checkRegisterDebuggeeResponse(od);
+      checkRegisterDebuggeeResponse(od as api.RegisterDebuggeeResponse);
     });
   });
 
@@ -1060,7 +1062,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepoId();
       var od = api.RepoId.fromJson(o.toJson());
-      checkRepoId(od);
+      checkRepoId(od as api.RepoId);
     });
   });
 
@@ -1068,7 +1070,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetBreakpointResponse();
       var od = api.SetBreakpointResponse.fromJson(o.toJson());
-      checkSetBreakpointResponse(od);
+      checkSetBreakpointResponse(od as api.SetBreakpointResponse);
     });
   });
 
@@ -1076,7 +1078,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceContext();
       var od = api.SourceContext.fromJson(o.toJson());
-      checkSourceContext(od);
+      checkSourceContext(od as api.SourceContext);
     });
   });
 
@@ -1084,7 +1086,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceLocation();
       var od = api.SourceLocation.fromJson(o.toJson());
-      checkSourceLocation(od);
+      checkSourceLocation(od as api.SourceLocation);
     });
   });
 
@@ -1092,7 +1094,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStackFrame();
       var od = api.StackFrame.fromJson(o.toJson());
-      checkStackFrame(od);
+      checkStackFrame(od as api.StackFrame);
     });
   });
 
@@ -1100,7 +1102,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatusMessage();
       var od = api.StatusMessage.fromJson(o.toJson());
-      checkStatusMessage(od);
+      checkStatusMessage(od as api.StatusMessage);
     });
   });
 
@@ -1108,7 +1110,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateActiveBreakpointRequest();
       var od = api.UpdateActiveBreakpointRequest.fromJson(o.toJson());
-      checkUpdateActiveBreakpointRequest(od);
+      checkUpdateActiveBreakpointRequest(
+          od as api.UpdateActiveBreakpointRequest);
     });
   });
 
@@ -1116,7 +1119,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateActiveBreakpointResponse();
       var od = api.UpdateActiveBreakpointResponse.fromJson(o.toJson());
-      checkUpdateActiveBreakpointResponse(od);
+      checkUpdateActiveBreakpointResponse(
+          od as api.UpdateActiveBreakpointResponse);
     });
   });
 
@@ -1124,7 +1128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVariable();
       var od = api.Variable.fromJson(o.toJson());
-      checkVariable(od);
+      checkVariable(od as api.Variable);
     });
   });
 
@@ -1135,8 +1139,9 @@
       var arg_request = buildRegisterDebuggeeRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegisterDebuggeeRequest.fromJson(json);
-        checkRegisterDebuggeeRequest(obj);
+        var obj = api.RegisterDebuggeeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegisterDebuggeeRequest(obj as api.RegisterDebuggeeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1175,7 +1180,7 @@
       res
           .register(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegisterDebuggeeResponse(response);
+        checkRegisterDebuggeeResponse(response as api.RegisterDebuggeeResponse);
       })));
     });
   });
@@ -1246,7 +1251,8 @@
               waitToken: arg_waitToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListActiveBreakpointsResponse(response);
+        checkListActiveBreakpointsResponse(
+            response as api.ListActiveBreakpointsResponse);
       })));
     });
 
@@ -1258,8 +1264,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateActiveBreakpointRequest.fromJson(json);
-        checkUpdateActiveBreakpointRequest(obj);
+        var obj = api.UpdateActiveBreakpointRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateActiveBreakpointRequest(
+            obj as api.UpdateActiveBreakpointRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1310,7 +1318,8 @@
       res
           .update(arg_request, arg_debuggeeId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUpdateActiveBreakpointResponse(response);
+        checkUpdateActiveBreakpointResponse(
+            response as api.UpdateActiveBreakpointResponse);
       })));
     });
   });
@@ -1371,7 +1380,7 @@
               project: arg_project,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDebuggeesResponse(response);
+        checkListDebuggeesResponse(response as api.ListDebuggeesResponse);
       })));
     });
   });
@@ -1437,7 +1446,7 @@
           .delete(arg_debuggeeId, arg_breakpointId,
               clientVersion: arg_clientVersion, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1501,7 +1510,7 @@
           .get(arg_debuggeeId, arg_breakpointId,
               clientVersion: arg_clientVersion, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetBreakpointResponse(response);
+        checkGetBreakpointResponse(response as api.GetBreakpointResponse);
       })));
     });
 
@@ -1582,7 +1591,7 @@
               waitToken: arg_waitToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBreakpointsResponse(response);
+        checkListBreakpointsResponse(response as api.ListBreakpointsResponse);
       })));
     });
 
@@ -1595,8 +1604,9 @@
       var arg_clientVersion = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Breakpoint.fromJson(json);
-        checkBreakpoint(obj);
+        var obj = api.Breakpoint.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBreakpoint(obj as api.Breakpoint);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1651,7 +1661,7 @@
               clientVersion: arg_clientVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSetBreakpointResponse(response);
+        checkSetBreakpointResponse(response as api.SetBreakpointResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudfunctions/v1_test.dart b/generated/googleapis/test/cloudfunctions/v1_test.dart
index 9c5a853..a9cee4a 100644
--- a/generated/googleapis/test/cloudfunctions/v1_test.dart
+++ b/generated/googleapis/test/cloudfunctions/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed1901(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -171,7 +171,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed1903(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -302,8 +302,8 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.entryPoint, unittest.equals('foo'));
     checkUnnamed1905(o.environmentVariables);
-    checkEventTrigger(o.eventTrigger);
-    checkHttpsTrigger(o.httpsTrigger);
+    checkEventTrigger(o.eventTrigger as api.EventTrigger);
+    checkHttpsTrigger(o.httpsTrigger as api.HttpsTrigger);
     unittest.expect(o.ingressSettings, unittest.equals('foo'));
     checkUnnamed1906(o.labels);
     unittest.expect(o.maxInstances, unittest.equals(42));
@@ -312,7 +312,7 @@
     unittest.expect(o.runtime, unittest.equals('foo'));
     unittest.expect(o.serviceAccountEmail, unittest.equals('foo'));
     unittest.expect(o.sourceArchiveUrl, unittest.equals('foo'));
-    checkSourceRepository(o.sourceRepository);
+    checkSourceRepository(o.sourceRepository as api.SourceRepository);
     unittest.expect(o.sourceUploadUrl, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.timeout, unittest.equals('foo'));
@@ -342,7 +342,7 @@
   buildCounterEventTrigger++;
   if (buildCounterEventTrigger < 3) {
     unittest.expect(o.eventType, unittest.equals('foo'));
-    checkFailurePolicy(o.failurePolicy);
+    checkFailurePolicy(o.failurePolicy as api.FailurePolicy);
     unittest.expect(o.resource, unittest.equals('foo'));
     unittest.expect(o.service, unittest.equals('foo'));
   }
@@ -388,7 +388,7 @@
 void checkFailurePolicy(api.FailurePolicy o) {
   buildCounterFailurePolicy++;
   if (buildCounterFailurePolicy < 3) {
-    checkRetry(o.retry);
+    checkRetry(o.retry as api.Retry);
   }
   buildCounterFailurePolicy--;
 }
@@ -493,8 +493,8 @@
 
 void checkUnnamed1907(core.List<api.CloudFunction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCloudFunction(o[0]);
-  checkCloudFunction(o[1]);
+  checkCloudFunction(o[0] as api.CloudFunction);
+  checkCloudFunction(o[1] as api.CloudFunction);
 }
 
 core.List<core.String> buildUnnamed1908() {
@@ -542,8 +542,8 @@
 
 void checkUnnamed1909(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -576,8 +576,8 @@
 
 void checkUnnamed1910(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -747,7 +747,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1913(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1914(o.response);
@@ -822,8 +822,8 @@
 
 void checkUnnamed1916(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed1917() {
@@ -835,8 +835,8 @@
 
 void checkUnnamed1917(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -894,7 +894,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -1055,7 +1055,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1063,7 +1063,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1071,7 +1071,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1079,7 +1079,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCallFunctionRequest();
       var od = api.CallFunctionRequest.fromJson(o.toJson());
-      checkCallFunctionRequest(od);
+      checkCallFunctionRequest(od as api.CallFunctionRequest);
     });
   });
 
@@ -1087,7 +1087,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCallFunctionResponse();
       var od = api.CallFunctionResponse.fromJson(o.toJson());
-      checkCallFunctionResponse(od);
+      checkCallFunctionResponse(od as api.CallFunctionResponse);
     });
   });
 
@@ -1095,7 +1095,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudFunction();
       var od = api.CloudFunction.fromJson(o.toJson());
-      checkCloudFunction(od);
+      checkCloudFunction(od as api.CloudFunction);
     });
   });
 
@@ -1103,7 +1103,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventTrigger();
       var od = api.EventTrigger.fromJson(o.toJson());
-      checkEventTrigger(od);
+      checkEventTrigger(od as api.EventTrigger);
     });
   });
 
@@ -1111,7 +1111,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1119,7 +1119,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFailurePolicy();
       var od = api.FailurePolicy.fromJson(o.toJson());
-      checkFailurePolicy(od);
+      checkFailurePolicy(od as api.FailurePolicy);
     });
   });
 
@@ -1127,7 +1127,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateDownloadUrlRequest();
       var od = api.GenerateDownloadUrlRequest.fromJson(o.toJson());
-      checkGenerateDownloadUrlRequest(od);
+      checkGenerateDownloadUrlRequest(od as api.GenerateDownloadUrlRequest);
     });
   });
 
@@ -1135,7 +1135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateDownloadUrlResponse();
       var od = api.GenerateDownloadUrlResponse.fromJson(o.toJson());
-      checkGenerateDownloadUrlResponse(od);
+      checkGenerateDownloadUrlResponse(od as api.GenerateDownloadUrlResponse);
     });
   });
 
@@ -1143,7 +1143,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateUploadUrlRequest();
       var od = api.GenerateUploadUrlRequest.fromJson(o.toJson());
-      checkGenerateUploadUrlRequest(od);
+      checkGenerateUploadUrlRequest(od as api.GenerateUploadUrlRequest);
     });
   });
 
@@ -1151,7 +1151,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateUploadUrlResponse();
       var od = api.GenerateUploadUrlResponse.fromJson(o.toJson());
-      checkGenerateUploadUrlResponse(od);
+      checkGenerateUploadUrlResponse(od as api.GenerateUploadUrlResponse);
     });
   });
 
@@ -1159,7 +1159,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpsTrigger();
       var od = api.HttpsTrigger.fromJson(o.toJson());
-      checkHttpsTrigger(od);
+      checkHttpsTrigger(od as api.HttpsTrigger);
     });
   });
 
@@ -1167,7 +1167,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFunctionsResponse();
       var od = api.ListFunctionsResponse.fromJson(o.toJson());
-      checkListFunctionsResponse(od);
+      checkListFunctionsResponse(od as api.ListFunctionsResponse);
     });
   });
 
@@ -1175,7 +1175,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1183,7 +1183,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1191,7 +1191,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1199,7 +1199,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1207,7 +1207,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadataV1();
       var od = api.OperationMetadataV1.fromJson(o.toJson());
-      checkOperationMetadataV1(od);
+      checkOperationMetadataV1(od as api.OperationMetadataV1);
     });
   });
 
@@ -1215,7 +1215,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1223,7 +1223,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRetry();
       var od = api.Retry.fromJson(o.toJson());
-      checkRetry(od);
+      checkRetry(od as api.Retry);
     });
   });
 
@@ -1231,7 +1231,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1239,7 +1239,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceRepository();
       var od = api.SourceRepository.fromJson(o.toJson());
-      checkSourceRepository(od);
+      checkSourceRepository(od as api.SourceRepository);
     });
   });
 
@@ -1247,7 +1247,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1255,7 +1255,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1263,7 +1263,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1312,7 +1312,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1373,7 +1373,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -1435,7 +1435,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1448,8 +1448,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CallFunctionRequest.fromJson(json);
-        checkCallFunctionRequest(obj);
+        var obj = api.CallFunctionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCallFunctionRequest(obj as api.CallFunctionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1489,7 +1490,7 @@
       res
           .call(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCallFunctionResponse(response);
+        checkCallFunctionResponse(response as api.CallFunctionResponse);
       })));
     });
 
@@ -1500,8 +1501,9 @@
       var arg_location = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CloudFunction.fromJson(json);
-        checkCloudFunction(obj);
+        var obj = api.CloudFunction.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCloudFunction(obj as api.CloudFunction);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1541,7 +1543,7 @@
       res
           .create(arg_request, arg_location, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1589,7 +1591,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1600,8 +1602,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateDownloadUrlRequest.fromJson(json);
-        checkGenerateDownloadUrlRequest(obj);
+        var obj = api.GenerateDownloadUrlRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateDownloadUrlRequest(obj as api.GenerateDownloadUrlRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1641,7 +1644,8 @@
       res
           .generateDownloadUrl(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateDownloadUrlResponse(response);
+        checkGenerateDownloadUrlResponse(
+            response as api.GenerateDownloadUrlResponse);
       })));
     });
 
@@ -1652,8 +1656,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateUploadUrlRequest.fromJson(json);
-        checkGenerateUploadUrlRequest(obj);
+        var obj = api.GenerateUploadUrlRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateUploadUrlRequest(obj as api.GenerateUploadUrlRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1693,7 +1698,8 @@
       res
           .generateUploadUrl(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateUploadUrlResponse(response);
+        checkGenerateUploadUrlResponse(
+            response as api.GenerateUploadUrlResponse);
       })));
     });
 
@@ -1741,7 +1747,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCloudFunction(response);
+        checkCloudFunction(response as api.CloudFunction);
       })));
     });
 
@@ -1796,7 +1802,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1853,7 +1859,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFunctionsResponse(response);
+        checkListFunctionsResponse(response as api.ListFunctionsResponse);
       })));
     });
 
@@ -1865,8 +1871,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CloudFunction.fromJson(json);
-        checkCloudFunction(obj);
+        var obj = api.CloudFunction.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCloudFunction(obj as api.CloudFunction);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1909,7 +1916,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1920,8 +1927,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1961,7 +1969,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1972,8 +1980,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2013,7 +2022,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudidentity/v1_test.dart b/generated/googleapis/test/cloudidentity/v1_test.dart
index 4a92aaf..02d9eee 100644
--- a/generated/googleapis/test/cloudidentity/v1_test.dart
+++ b/generated/googleapis/test/cloudidentity/v1_test.dart
@@ -165,7 +165,8 @@
   buildCounterGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse++;
   if (buildCounterGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse <
       3) {
-    checkGoogleAppsCloudidentityDevicesV1DeviceUser(o.deviceUser);
+    checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+        o.deviceUser as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
   }
   buildCounterGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse--;
 }
@@ -208,7 +209,8 @@
     api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse o) {
   buildCounterGoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse++;
   if (buildCounterGoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse < 3) {
-    checkGoogleAppsCloudidentityDevicesV1DeviceUser(o.deviceUser);
+    checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+        o.deviceUser as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
   }
   buildCounterGoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse--;
 }
@@ -254,7 +256,8 @@
   buildCounterGoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse++;
   if (buildCounterGoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse <
       3) {
-    checkGoogleAppsCloudidentityDevicesV1Device(o.device);
+    checkGoogleAppsCloudidentityDevicesV1Device(
+        o.device as api.GoogleAppsCloudidentityDevicesV1Device);
   }
   buildCounterGoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse--;
 }
@@ -303,7 +306,8 @@
   buildCounterGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse++;
   if (buildCounterGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse <
       3) {
-    checkGoogleAppsCloudidentityDevicesV1DeviceUser(o.deviceUser);
+    checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+        o.deviceUser as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
   }
   buildCounterGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse--;
 }
@@ -335,8 +339,10 @@
             api.GoogleAppsCloudidentityDevicesV1CustomAttributeValue>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAppsCloudidentityDevicesV1CustomAttributeValue(o['x']);
-  checkGoogleAppsCloudidentityDevicesV1CustomAttributeValue(o['y']);
+  checkGoogleAppsCloudidentityDevicesV1CustomAttributeValue(
+      o['x'] as api.GoogleAppsCloudidentityDevicesV1CustomAttributeValue);
+  checkGoogleAppsCloudidentityDevicesV1CustomAttributeValue(
+      o['y'] as api.GoogleAppsCloudidentityDevicesV1CustomAttributeValue);
 }
 
 core.int buildCounterGoogleAppsCloudidentityDevicesV1ClientState = 0;
@@ -478,7 +484,8 @@
   buildCounterGoogleAppsCloudidentityDevicesV1Device++;
   if (buildCounterGoogleAppsCloudidentityDevicesV1Device < 3) {
     checkGoogleAppsCloudidentityDevicesV1AndroidAttributes(
-        o.androidSpecificAttributes);
+        o.androidSpecificAttributes
+            as api.GoogleAppsCloudidentityDevicesV1AndroidAttributes);
     unittest.expect(o.assetTag, unittest.equals('foo'));
     unittest.expect(o.basebandVersion, unittest.equals('foo'));
     unittest.expect(o.bootloaderVersion, unittest.equals('foo'));
@@ -559,8 +566,10 @@
 void checkUnnamed1519(
     core.List<api.GoogleAppsCloudidentityDevicesV1ClientState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAppsCloudidentityDevicesV1ClientState(o[0]);
-  checkGoogleAppsCloudidentityDevicesV1ClientState(o[1]);
+  checkGoogleAppsCloudidentityDevicesV1ClientState(
+      o[0] as api.GoogleAppsCloudidentityDevicesV1ClientState);
+  checkGoogleAppsCloudidentityDevicesV1ClientState(
+      o[1] as api.GoogleAppsCloudidentityDevicesV1ClientState);
 }
 
 core.int buildCounterGoogleAppsCloudidentityDevicesV1ListClientStatesResponse =
@@ -599,8 +608,10 @@
 void checkUnnamed1520(
     core.List<api.GoogleAppsCloudidentityDevicesV1DeviceUser> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAppsCloudidentityDevicesV1DeviceUser(o[0]);
-  checkGoogleAppsCloudidentityDevicesV1DeviceUser(o[1]);
+  checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+      o[0] as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
+  checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+      o[1] as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
 }
 
 core.int buildCounterGoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse =
@@ -636,8 +647,10 @@
 
 void checkUnnamed1521(core.List<api.GoogleAppsCloudidentityDevicesV1Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAppsCloudidentityDevicesV1Device(o[0]);
-  checkGoogleAppsCloudidentityDevicesV1Device(o[1]);
+  checkGoogleAppsCloudidentityDevicesV1Device(
+      o[0] as api.GoogleAppsCloudidentityDevicesV1Device);
+  checkGoogleAppsCloudidentityDevicesV1Device(
+      o[1] as api.GoogleAppsCloudidentityDevicesV1Device);
 }
 
 core.int buildCounterGoogleAppsCloudidentityDevicesV1ListDevicesResponse = 0;
@@ -742,7 +755,8 @@
     api.GoogleAppsCloudidentityDevicesV1WipeDeviceResponse o) {
   buildCounterGoogleAppsCloudidentityDevicesV1WipeDeviceResponse++;
   if (buildCounterGoogleAppsCloudidentityDevicesV1WipeDeviceResponse < 3) {
-    checkGoogleAppsCloudidentityDevicesV1Device(o.device);
+    checkGoogleAppsCloudidentityDevicesV1Device(
+        o.device as api.GoogleAppsCloudidentityDevicesV1Device);
   }
   buildCounterGoogleAppsCloudidentityDevicesV1WipeDeviceResponse--;
 }
@@ -784,7 +798,8 @@
     api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse o) {
   buildCounterGoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse++;
   if (buildCounterGoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse < 3) {
-    checkGoogleAppsCloudidentityDevicesV1DeviceUser(o.deviceUser);
+    checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+        o.deviceUser as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
   }
   buildCounterGoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse--;
 }
@@ -826,7 +841,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkEntityKey(o.groupKey);
+    checkEntityKey(o.groupKey as api.EntityKey);
     checkUnnamed1523(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
@@ -844,8 +859,8 @@
 
 void checkUnnamed1524(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroup(o[0]);
-  checkGroup(o[1]);
+  checkGroup(o[0] as api.Group);
+  checkGroup(o[1] as api.Group);
 }
 
 core.int buildCounterListGroupsResponse = 0;
@@ -878,8 +893,8 @@
 
 void checkUnnamed1525(core.List<api.Membership> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMembership(o[0]);
-  checkMembership(o[1]);
+  checkMembership(o[0] as api.Membership);
+  checkMembership(o[1] as api.Membership);
 }
 
 core.int buildCounterListMembershipsResponse = 0;
@@ -950,8 +965,8 @@
 
 void checkUnnamed1526(core.List<api.MembershipRole> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMembershipRole(o[0]);
-  checkMembershipRole(o[1]);
+  checkMembershipRole(o[0] as api.MembershipRole);
+  checkMembershipRole(o[1] as api.MembershipRole);
 }
 
 core.int buildCounterMembership = 0;
@@ -975,7 +990,7 @@
   if (buildCounterMembership < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkEntityKey(o.preferredMemberKey);
+    checkEntityKey(o.preferredMemberKey as api.EntityKey);
     checkUnnamed1526(o.roles);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -1011,8 +1026,8 @@
 
 void checkUnnamed1527(core.List<api.MembershipRole> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMembershipRole(o[0]);
-  checkMembershipRole(o[1]);
+  checkMembershipRole(o[0] as api.MembershipRole);
+  checkMembershipRole(o[1] as api.MembershipRole);
 }
 
 core.List<core.String> buildUnnamed1528() {
@@ -1063,7 +1078,7 @@
 void checkModifyMembershipRolesResponse(api.ModifyMembershipRolesResponse o) {
   buildCounterModifyMembershipRolesResponse++;
   if (buildCounterModifyMembershipRolesResponse < 3) {
-    checkMembership(o.membership);
+    checkMembership(o.membership as api.Membership);
   }
   buildCounterModifyMembershipRolesResponse--;
 }
@@ -1145,7 +1160,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1529(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1530(o.response);
@@ -1162,8 +1177,8 @@
 
 void checkUnnamed1531(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroup(o[0]);
-  checkGroup(o[1]);
+  checkGroup(o[0] as api.Group);
+  checkGroup(o[1] as api.Group);
 }
 
 core.int buildCounterSearchGroupsResponse = 0;
@@ -1257,7 +1272,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityKey();
       var od = api.EntityKey.fromJson(o.toJson());
-      checkEntityKey(od);
+      checkEntityKey(od as api.EntityKey);
     });
   });
 
@@ -1267,7 +1282,8 @@
       var o = buildGoogleAppsCloudidentityDevicesV1AndroidAttributes();
       var od = api.GoogleAppsCloudidentityDevicesV1AndroidAttributes.fromJson(
           o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1AndroidAttributes(od);
+      checkGoogleAppsCloudidentityDevicesV1AndroidAttributes(
+          od as api.GoogleAppsCloudidentityDevicesV1AndroidAttributes);
     });
   });
 
@@ -1279,7 +1295,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest(od);
+      checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest(
+          od as api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest);
     });
   });
 
@@ -1290,7 +1307,8 @@
       var o = buildGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse();
       var od = api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse
           .fromJson(o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserResponse);
     });
   });
 
@@ -1301,7 +1319,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest(od);
+      checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest(
+          od as api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest);
     });
   });
 
@@ -1312,7 +1331,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserResponse);
     });
   });
 
@@ -1323,7 +1343,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest(od);
+      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest(
+          od as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest);
     });
   });
 
@@ -1335,7 +1356,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceResponse);
     });
   });
 
@@ -1347,7 +1369,8 @@
           buildGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest();
       var od = api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest
           .fromJson(o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest(od);
+      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest(od
+          as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest);
     });
   });
 
@@ -1359,7 +1382,8 @@
           buildGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse();
       var od = api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse
           .fromJson(o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse(od
+          as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserResponse);
     });
   });
 
@@ -1368,7 +1392,8 @@
       var o = buildGoogleAppsCloudidentityDevicesV1ClientState();
       var od =
           api.GoogleAppsCloudidentityDevicesV1ClientState.fromJson(o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1ClientState(od);
+      checkGoogleAppsCloudidentityDevicesV1ClientState(
+          od as api.GoogleAppsCloudidentityDevicesV1ClientState);
     });
   });
 
@@ -1379,7 +1404,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1CustomAttributeValue.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1CustomAttributeValue(od);
+      checkGoogleAppsCloudidentityDevicesV1CustomAttributeValue(
+          od as api.GoogleAppsCloudidentityDevicesV1CustomAttributeValue);
     });
   });
 
@@ -1387,7 +1413,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsCloudidentityDevicesV1Device();
       var od = api.GoogleAppsCloudidentityDevicesV1Device.fromJson(o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1Device(od);
+      checkGoogleAppsCloudidentityDevicesV1Device(
+          od as api.GoogleAppsCloudidentityDevicesV1Device);
     });
   });
 
@@ -1396,7 +1423,8 @@
       var o = buildGoogleAppsCloudidentityDevicesV1DeviceUser();
       var od =
           api.GoogleAppsCloudidentityDevicesV1DeviceUser.fromJson(o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1DeviceUser(od);
+      checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+          od as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
     });
   });
 
@@ -1408,7 +1436,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1ListClientStatesResponse.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1ListClientStatesResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1ListClientStatesResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1ListClientStatesResponse);
     });
   });
 
@@ -1419,7 +1448,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse);
     });
   });
 
@@ -1429,7 +1459,8 @@
       var o = buildGoogleAppsCloudidentityDevicesV1ListDevicesResponse();
       var od = api.GoogleAppsCloudidentityDevicesV1ListDevicesResponse.fromJson(
           o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1ListDevicesResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1ListDevicesResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1ListDevicesResponse);
     });
   });
 
@@ -1441,7 +1472,8 @@
           buildGoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse();
       var od = api.GoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse
           .fromJson(o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse(od
+          as api.GoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse);
     });
   });
 
@@ -1451,7 +1483,8 @@
       var o = buildGoogleAppsCloudidentityDevicesV1WipeDeviceRequest();
       var od = api.GoogleAppsCloudidentityDevicesV1WipeDeviceRequest.fromJson(
           o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1WipeDeviceRequest(od);
+      checkGoogleAppsCloudidentityDevicesV1WipeDeviceRequest(
+          od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceRequest);
     });
   });
 
@@ -1461,7 +1494,8 @@
       var o = buildGoogleAppsCloudidentityDevicesV1WipeDeviceResponse();
       var od = api.GoogleAppsCloudidentityDevicesV1WipeDeviceResponse.fromJson(
           o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1WipeDeviceResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1WipeDeviceResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceResponse);
     });
   });
 
@@ -1472,7 +1506,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest(od);
+      checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest(
+          od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest);
     });
   });
 
@@ -1483,7 +1518,8 @@
       var od =
           api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse.fromJson(
               o.toJson());
-      checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse(od);
+      checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse(
+          od as api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserResponse);
     });
   });
 
@@ -1491,7 +1527,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroup();
       var od = api.Group.fromJson(o.toJson());
-      checkGroup(od);
+      checkGroup(od as api.Group);
     });
   });
 
@@ -1499,7 +1535,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGroupsResponse();
       var od = api.ListGroupsResponse.fromJson(o.toJson());
-      checkListGroupsResponse(od);
+      checkListGroupsResponse(od as api.ListGroupsResponse);
     });
   });
 
@@ -1507,7 +1543,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListMembershipsResponse();
       var od = api.ListMembershipsResponse.fromJson(o.toJson());
-      checkListMembershipsResponse(od);
+      checkListMembershipsResponse(od as api.ListMembershipsResponse);
     });
   });
 
@@ -1515,7 +1551,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLookupGroupNameResponse();
       var od = api.LookupGroupNameResponse.fromJson(o.toJson());
-      checkLookupGroupNameResponse(od);
+      checkLookupGroupNameResponse(od as api.LookupGroupNameResponse);
     });
   });
 
@@ -1523,7 +1559,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLookupMembershipNameResponse();
       var od = api.LookupMembershipNameResponse.fromJson(o.toJson());
-      checkLookupMembershipNameResponse(od);
+      checkLookupMembershipNameResponse(od as api.LookupMembershipNameResponse);
     });
   });
 
@@ -1531,7 +1567,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembership();
       var od = api.Membership.fromJson(o.toJson());
-      checkMembership(od);
+      checkMembership(od as api.Membership);
     });
   });
 
@@ -1539,7 +1575,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembershipRole();
       var od = api.MembershipRole.fromJson(o.toJson());
-      checkMembershipRole(od);
+      checkMembershipRole(od as api.MembershipRole);
     });
   });
 
@@ -1547,7 +1583,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyMembershipRolesRequest();
       var od = api.ModifyMembershipRolesRequest.fromJson(o.toJson());
-      checkModifyMembershipRolesRequest(od);
+      checkModifyMembershipRolesRequest(od as api.ModifyMembershipRolesRequest);
     });
   });
 
@@ -1555,7 +1591,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyMembershipRolesResponse();
       var od = api.ModifyMembershipRolesResponse.fromJson(o.toJson());
-      checkModifyMembershipRolesResponse(od);
+      checkModifyMembershipRolesResponse(
+          od as api.ModifyMembershipRolesResponse);
     });
   });
 
@@ -1563,7 +1600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1571,7 +1608,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchGroupsResponse();
       var od = api.SearchGroupsResponse.fromJson(o.toJson());
-      checkSearchGroupsResponse(od);
+      checkSearchGroupsResponse(od as api.SearchGroupsResponse);
     });
   });
 
@@ -1579,7 +1616,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1593,8 +1630,9 @@
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest
-            .fromJson(json);
-        checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest(obj);
+            .fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest(
+            obj as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1634,7 +1672,7 @@
       res
           .cancelWipe(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1645,8 +1683,10 @@
       var arg_customer = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleAppsCloudidentityDevicesV1Device.fromJson(json);
-        checkGoogleAppsCloudidentityDevicesV1Device(obj);
+        var obj = api.GoogleAppsCloudidentityDevicesV1Device.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1Device(
+            obj as api.GoogleAppsCloudidentityDevicesV1Device);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1687,7 +1727,7 @@
       res
           .create(arg_request, customer: arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1738,7 +1778,7 @@
       res
           .delete(arg_name, customer: arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1790,7 +1830,8 @@
       res
           .get(arg_name, customer: arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleAppsCloudidentityDevicesV1Device(response);
+        checkGoogleAppsCloudidentityDevicesV1Device(
+            response as api.GoogleAppsCloudidentityDevicesV1Device);
       })));
     });
 
@@ -1860,7 +1901,8 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleAppsCloudidentityDevicesV1ListDevicesResponse(response);
+        checkGoogleAppsCloudidentityDevicesV1ListDevicesResponse(response
+            as api.GoogleAppsCloudidentityDevicesV1ListDevicesResponse);
       })));
     });
 
@@ -1874,8 +1916,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleAppsCloudidentityDevicesV1WipeDeviceRequest.fromJson(
-                json);
-        checkGoogleAppsCloudidentityDevicesV1WipeDeviceRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1WipeDeviceRequest(
+            obj as api.GoogleAppsCloudidentityDevicesV1WipeDeviceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1915,7 +1958,7 @@
       res
           .wipe(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -1930,8 +1973,9 @@
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest
-            .fromJson(json);
-        checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest(obj);
+            .fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest(obj
+            as api.GoogleAppsCloudidentityDevicesV1ApproveDeviceUserRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1971,7 +2015,7 @@
       res
           .approve(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1985,8 +2029,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest.fromJson(
-                json);
-        checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest(
+            obj as api.GoogleAppsCloudidentityDevicesV1BlockDeviceUserRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2026,7 +2071,7 @@
       res
           .block(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2040,8 +2085,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest
-                .fromJson(json);
-        checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest(obj);
+                .fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest(obj
+            as api.GoogleAppsCloudidentityDevicesV1CancelWipeDeviceUserRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2081,7 +2127,7 @@
       res
           .cancelWipe(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2132,7 +2178,7 @@
       res
           .delete(arg_name, customer: arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2184,7 +2230,8 @@
       res
           .get(arg_name, customer: arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleAppsCloudidentityDevicesV1DeviceUser(response);
+        checkGoogleAppsCloudidentityDevicesV1DeviceUser(
+            response as api.GoogleAppsCloudidentityDevicesV1DeviceUser);
       })));
     });
 
@@ -2253,7 +2300,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse(response);
+        checkGoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse(response
+            as api.GoogleAppsCloudidentityDevicesV1ListDeviceUsersResponse);
       })));
     });
 
@@ -2323,7 +2371,8 @@
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
         checkGoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse(
-            response);
+            response as api
+                .GoogleAppsCloudidentityDevicesV1LookupSelfDeviceUsersResponse);
       })));
     });
 
@@ -2337,8 +2386,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest.fromJson(
-                json);
-        checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest(
+            obj as api.GoogleAppsCloudidentityDevicesV1WipeDeviceUserRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2378,7 +2428,7 @@
       res
           .wipe(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2432,7 +2482,8 @@
       res
           .get(arg_name, customer: arg_customer, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleAppsCloudidentityDevicesV1ClientState(response);
+        checkGoogleAppsCloudidentityDevicesV1ClientState(
+            response as api.GoogleAppsCloudidentityDevicesV1ClientState);
       })));
     });
 
@@ -2497,7 +2548,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleAppsCloudidentityDevicesV1ListClientStatesResponse(response);
+        checkGoogleAppsCloudidentityDevicesV1ListClientStatesResponse(response
+            as api.GoogleAppsCloudidentityDevicesV1ListClientStatesResponse);
       })));
     });
 
@@ -2510,9 +2562,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleAppsCloudidentityDevicesV1ClientState.fromJson(json);
-        checkGoogleAppsCloudidentityDevicesV1ClientState(obj);
+        var obj = api.GoogleAppsCloudidentityDevicesV1ClientState.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleAppsCloudidentityDevicesV1ClientState(
+            obj as api.GoogleAppsCloudidentityDevicesV1ClientState);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2559,7 +2612,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2572,8 +2625,9 @@
       var arg_initialGroupConfig = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2615,7 +2669,7 @@
           .create(arg_request,
               initialGroupConfig: arg_initialGroupConfig, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2663,7 +2717,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2711,7 +2765,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
 
@@ -2772,7 +2826,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGroupsResponse(response);
+        checkListGroupsResponse(response as api.ListGroupsResponse);
       })));
     });
 
@@ -2827,7 +2881,7 @@
               groupKey_namespace: arg_groupKey_namespace,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLookupGroupNameResponse(response);
+        checkLookupGroupNameResponse(response as api.LookupGroupNameResponse);
       })));
     });
 
@@ -2839,8 +2893,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2883,7 +2938,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2944,7 +2999,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchGroupsResponse(response);
+        checkSearchGroupsResponse(response as api.SearchGroupsResponse);
       })));
     });
   });
@@ -2957,8 +3012,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Membership.fromJson(json);
-        checkMembership(obj);
+        var obj = api.Membership.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkMembership(obj as api.Membership);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2998,7 +3054,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3046,7 +3102,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3094,7 +3150,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMembership(response);
+        checkMembership(response as api.Membership);
       })));
     });
 
@@ -3154,7 +3210,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMembershipsResponse(response);
+        checkListMembershipsResponse(response as api.ListMembershipsResponse);
       })));
     });
 
@@ -3211,7 +3267,8 @@
               memberKey_namespace: arg_memberKey_namespace,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLookupMembershipNameResponse(response);
+        checkLookupMembershipNameResponse(
+            response as api.LookupMembershipNameResponse);
       })));
     });
 
@@ -3222,8 +3279,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyMembershipRolesRequest.fromJson(json);
-        checkModifyMembershipRolesRequest(obj);
+        var obj = api.ModifyMembershipRolesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyMembershipRolesRequest(
+            obj as api.ModifyMembershipRolesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3263,7 +3322,8 @@
       res
           .modifyMembershipRoles(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkModifyMembershipRolesResponse(response);
+        checkModifyMembershipRolesResponse(
+            response as api.ModifyMembershipRolesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudiot/v1_test.dart b/generated/googleapis/test/cloudiot/v1_test.dart
index 77d9ffb..035901b 100644
--- a/generated/googleapis/test/cloudiot/v1_test.dart
+++ b/generated/googleapis/test/cloudiot/v1_test.dart
@@ -141,7 +141,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2499(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -157,8 +157,8 @@
 
 void checkUnnamed2500(core.List<api.DeviceCredential> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeviceCredential(o[0]);
-  checkDeviceCredential(o[1]);
+  checkDeviceCredential(o[0] as api.DeviceCredential);
+  checkDeviceCredential(o[1] as api.DeviceCredential);
 }
 
 core.Map<core.String, core.String> buildUnnamed2501() {
@@ -205,13 +205,13 @@
   buildCounterDevice++;
   if (buildCounterDevice < 3) {
     unittest.expect(o.blocked, unittest.isTrue);
-    checkDeviceConfig(o.config);
+    checkDeviceConfig(o.config as api.DeviceConfig);
     checkUnnamed2500(o.credentials);
-    checkGatewayConfig(o.gatewayConfig);
+    checkGatewayConfig(o.gatewayConfig as api.GatewayConfig);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.lastConfigAckTime, unittest.equals('foo'));
     unittest.expect(o.lastConfigSendTime, unittest.equals('foo'));
-    checkStatus(o.lastErrorStatus);
+    checkStatus(o.lastErrorStatus as api.Status);
     unittest.expect(o.lastErrorTime, unittest.equals('foo'));
     unittest.expect(o.lastEventTime, unittest.equals('foo'));
     unittest.expect(o.lastHeartbeatTime, unittest.equals('foo'));
@@ -220,7 +220,7 @@
     checkUnnamed2501(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.numId, unittest.equals('foo'));
-    checkDeviceState(o.state);
+    checkDeviceState(o.state as api.DeviceState);
   }
   buildCounterDevice--;
 }
@@ -266,7 +266,7 @@
   buildCounterDeviceCredential++;
   if (buildCounterDeviceCredential < 3) {
     unittest.expect(o.expirationTime, unittest.equals('foo'));
-    checkPublicKeyCredential(o.publicKey);
+    checkPublicKeyCredential(o.publicKey as api.PublicKeyCredential);
   }
   buildCounterDeviceCredential--;
 }
@@ -280,8 +280,8 @@
 
 void checkUnnamed2502(core.List<api.RegistryCredential> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegistryCredential(o[0]);
-  checkRegistryCredential(o[1]);
+  checkRegistryCredential(o[0] as api.RegistryCredential);
+  checkRegistryCredential(o[1] as api.RegistryCredential);
 }
 
 core.List<api.EventNotificationConfig> buildUnnamed2503() {
@@ -293,8 +293,8 @@
 
 void checkUnnamed2503(core.List<api.EventNotificationConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventNotificationConfig(o[0]);
-  checkEventNotificationConfig(o[1]);
+  checkEventNotificationConfig(o[0] as api.EventNotificationConfig);
+  checkEventNotificationConfig(o[1] as api.EventNotificationConfig);
 }
 
 core.int buildCounterDeviceRegistry = 0;
@@ -320,12 +320,13 @@
   if (buildCounterDeviceRegistry < 3) {
     checkUnnamed2502(o.credentials);
     checkUnnamed2503(o.eventNotificationConfigs);
-    checkHttpConfig(o.httpConfig);
+    checkHttpConfig(o.httpConfig as api.HttpConfig);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.logLevel, unittest.equals('foo'));
-    checkMqttConfig(o.mqttConfig);
+    checkMqttConfig(o.mqttConfig as api.MqttConfig);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkStateNotificationConfig(o.stateNotificationConfig);
+    checkStateNotificationConfig(
+        o.stateNotificationConfig as api.StateNotificationConfig);
   }
   buildCounterDeviceRegistry--;
 }
@@ -451,7 +452,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -503,8 +504,8 @@
 
 void checkUnnamed2504(core.List<api.DeviceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeviceConfig(o[0]);
-  checkDeviceConfig(o[1]);
+  checkDeviceConfig(o[0] as api.DeviceConfig);
+  checkDeviceConfig(o[1] as api.DeviceConfig);
 }
 
 core.int buildCounterListDeviceConfigVersionsResponse = 0;
@@ -536,8 +537,8 @@
 
 void checkUnnamed2505(core.List<api.DeviceRegistry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeviceRegistry(o[0]);
-  checkDeviceRegistry(o[1]);
+  checkDeviceRegistry(o[0] as api.DeviceRegistry);
+  checkDeviceRegistry(o[1] as api.DeviceRegistry);
 }
 
 core.int buildCounterListDeviceRegistriesResponse = 0;
@@ -570,8 +571,8 @@
 
 void checkUnnamed2506(core.List<api.DeviceState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeviceState(o[0]);
-  checkDeviceState(o[1]);
+  checkDeviceState(o[0] as api.DeviceState);
+  checkDeviceState(o[1] as api.DeviceState);
 }
 
 core.int buildCounterListDeviceStatesResponse = 0;
@@ -602,8 +603,8 @@
 
 void checkUnnamed2507(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDevice(o[0]);
-  checkDevice(o[1]);
+  checkDevice(o[0] as api.Device);
+  checkDevice(o[1] as api.Device);
 }
 
 core.int buildCounterListDevicesResponse = 0;
@@ -677,8 +678,8 @@
 
 void checkUnnamed2508(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -722,7 +723,7 @@
   if (buildCounterPublicKeyCertificate < 3) {
     unittest.expect(o.certificate, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
-    checkX509CertificateDetails(o.x509Details);
+    checkX509CertificateDetails(o.x509Details as api.X509CertificateDetails);
   }
   buildCounterPublicKeyCertificate--;
 }
@@ -762,7 +763,8 @@
 void checkRegistryCredential(api.RegistryCredential o) {
   buildCounterRegistryCredential++;
   if (buildCounterRegistryCredential < 3) {
-    checkPublicKeyCertificate(o.publicKeyCertificate);
+    checkPublicKeyCertificate(
+        o.publicKeyCertificate as api.PublicKeyCertificate);
   }
   buildCounterRegistryCredential--;
 }
@@ -817,7 +819,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -1093,7 +1095,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBindDeviceToGatewayRequest();
       var od = api.BindDeviceToGatewayRequest.fromJson(o.toJson());
-      checkBindDeviceToGatewayRequest(od);
+      checkBindDeviceToGatewayRequest(od as api.BindDeviceToGatewayRequest);
     });
   });
 
@@ -1101,7 +1103,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBindDeviceToGatewayResponse();
       var od = api.BindDeviceToGatewayResponse.fromJson(o.toJson());
-      checkBindDeviceToGatewayResponse(od);
+      checkBindDeviceToGatewayResponse(od as api.BindDeviceToGatewayResponse);
     });
   });
 
@@ -1109,7 +1111,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1117,7 +1119,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevice();
       var od = api.Device.fromJson(o.toJson());
-      checkDevice(od);
+      checkDevice(od as api.Device);
     });
   });
 
@@ -1125,7 +1127,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceConfig();
       var od = api.DeviceConfig.fromJson(o.toJson());
-      checkDeviceConfig(od);
+      checkDeviceConfig(od as api.DeviceConfig);
     });
   });
 
@@ -1133,7 +1135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceCredential();
       var od = api.DeviceCredential.fromJson(o.toJson());
-      checkDeviceCredential(od);
+      checkDeviceCredential(od as api.DeviceCredential);
     });
   });
 
@@ -1141,7 +1143,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceRegistry();
       var od = api.DeviceRegistry.fromJson(o.toJson());
-      checkDeviceRegistry(od);
+      checkDeviceRegistry(od as api.DeviceRegistry);
     });
   });
 
@@ -1149,7 +1151,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceState();
       var od = api.DeviceState.fromJson(o.toJson());
-      checkDeviceState(od);
+      checkDeviceState(od as api.DeviceState);
     });
   });
 
@@ -1157,7 +1159,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1165,7 +1167,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventNotificationConfig();
       var od = api.EventNotificationConfig.fromJson(o.toJson());
-      checkEventNotificationConfig(od);
+      checkEventNotificationConfig(od as api.EventNotificationConfig);
     });
   });
 
@@ -1173,7 +1175,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1181,7 +1183,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGatewayConfig();
       var od = api.GatewayConfig.fromJson(o.toJson());
-      checkGatewayConfig(od);
+      checkGatewayConfig(od as api.GatewayConfig);
     });
   });
 
@@ -1189,7 +1191,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -1197,7 +1199,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -1205,7 +1207,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpConfig();
       var od = api.HttpConfig.fromJson(o.toJson());
-      checkHttpConfig(od);
+      checkHttpConfig(od as api.HttpConfig);
     });
   });
 
@@ -1213,7 +1215,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDeviceConfigVersionsResponse();
       var od = api.ListDeviceConfigVersionsResponse.fromJson(o.toJson());
-      checkListDeviceConfigVersionsResponse(od);
+      checkListDeviceConfigVersionsResponse(
+          od as api.ListDeviceConfigVersionsResponse);
     });
   });
 
@@ -1221,7 +1224,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDeviceRegistriesResponse();
       var od = api.ListDeviceRegistriesResponse.fromJson(o.toJson());
-      checkListDeviceRegistriesResponse(od);
+      checkListDeviceRegistriesResponse(od as api.ListDeviceRegistriesResponse);
     });
   });
 
@@ -1229,7 +1232,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDeviceStatesResponse();
       var od = api.ListDeviceStatesResponse.fromJson(o.toJson());
-      checkListDeviceStatesResponse(od);
+      checkListDeviceStatesResponse(od as api.ListDeviceStatesResponse);
     });
   });
 
@@ -1237,7 +1240,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDevicesResponse();
       var od = api.ListDevicesResponse.fromJson(o.toJson());
-      checkListDevicesResponse(od);
+      checkListDevicesResponse(od as api.ListDevicesResponse);
     });
   });
 
@@ -1245,7 +1248,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyCloudToDeviceConfigRequest();
       var od = api.ModifyCloudToDeviceConfigRequest.fromJson(o.toJson());
-      checkModifyCloudToDeviceConfigRequest(od);
+      checkModifyCloudToDeviceConfigRequest(
+          od as api.ModifyCloudToDeviceConfigRequest);
     });
   });
 
@@ -1253,7 +1257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMqttConfig();
       var od = api.MqttConfig.fromJson(o.toJson());
-      checkMqttConfig(od);
+      checkMqttConfig(od as api.MqttConfig);
     });
   });
 
@@ -1261,7 +1265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1269,7 +1273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublicKeyCertificate();
       var od = api.PublicKeyCertificate.fromJson(o.toJson());
-      checkPublicKeyCertificate(od);
+      checkPublicKeyCertificate(od as api.PublicKeyCertificate);
     });
   });
 
@@ -1277,7 +1281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublicKeyCredential();
       var od = api.PublicKeyCredential.fromJson(o.toJson());
-      checkPublicKeyCredential(od);
+      checkPublicKeyCredential(od as api.PublicKeyCredential);
     });
   });
 
@@ -1285,7 +1289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegistryCredential();
       var od = api.RegistryCredential.fromJson(o.toJson());
-      checkRegistryCredential(od);
+      checkRegistryCredential(od as api.RegistryCredential);
     });
   });
 
@@ -1293,7 +1297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSendCommandToDeviceRequest();
       var od = api.SendCommandToDeviceRequest.fromJson(o.toJson());
-      checkSendCommandToDeviceRequest(od);
+      checkSendCommandToDeviceRequest(od as api.SendCommandToDeviceRequest);
     });
   });
 
@@ -1301,7 +1305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSendCommandToDeviceResponse();
       var od = api.SendCommandToDeviceResponse.fromJson(o.toJson());
-      checkSendCommandToDeviceResponse(od);
+      checkSendCommandToDeviceResponse(od as api.SendCommandToDeviceResponse);
     });
   });
 
@@ -1309,7 +1313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1317,7 +1321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStateNotificationConfig();
       var od = api.StateNotificationConfig.fromJson(o.toJson());
-      checkStateNotificationConfig(od);
+      checkStateNotificationConfig(od as api.StateNotificationConfig);
     });
   });
 
@@ -1325,7 +1329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1333,7 +1337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1341,7 +1345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1349,7 +1353,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnbindDeviceFromGatewayRequest();
       var od = api.UnbindDeviceFromGatewayRequest.fromJson(o.toJson());
-      checkUnbindDeviceFromGatewayRequest(od);
+      checkUnbindDeviceFromGatewayRequest(
+          od as api.UnbindDeviceFromGatewayRequest);
     });
   });
 
@@ -1357,7 +1362,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnbindDeviceFromGatewayResponse();
       var od = api.UnbindDeviceFromGatewayResponse.fromJson(o.toJson());
-      checkUnbindDeviceFromGatewayResponse(od);
+      checkUnbindDeviceFromGatewayResponse(
+          od as api.UnbindDeviceFromGatewayResponse);
     });
   });
 
@@ -1365,7 +1371,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildX509CertificateDetails();
       var od = api.X509CertificateDetails.fromJson(o.toJson());
-      checkX509CertificateDetails(od);
+      checkX509CertificateDetails(od as api.X509CertificateDetails);
     });
   });
 
@@ -1377,8 +1383,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BindDeviceToGatewayRequest.fromJson(json);
-        checkBindDeviceToGatewayRequest(obj);
+        var obj = api.BindDeviceToGatewayRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBindDeviceToGatewayRequest(obj as api.BindDeviceToGatewayRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1418,7 +1425,8 @@
       res
           .bindDeviceToGateway(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBindDeviceToGatewayResponse(response);
+        checkBindDeviceToGatewayResponse(
+            response as api.BindDeviceToGatewayResponse);
       })));
     });
 
@@ -1429,8 +1437,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeviceRegistry.fromJson(json);
-        checkDeviceRegistry(obj);
+        var obj = api.DeviceRegistry.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeviceRegistry(obj as api.DeviceRegistry);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1470,7 +1479,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeviceRegistry(response);
+        checkDeviceRegistry(response as api.DeviceRegistry);
       })));
     });
 
@@ -1518,7 +1527,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1566,7 +1575,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeviceRegistry(response);
+        checkDeviceRegistry(response as api.DeviceRegistry);
       })));
     });
 
@@ -1577,8 +1586,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1618,7 +1628,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1675,7 +1685,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDeviceRegistriesResponse(response);
+        checkListDeviceRegistriesResponse(
+            response as api.ListDeviceRegistriesResponse);
       })));
     });
 
@@ -1687,8 +1698,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeviceRegistry.fromJson(json);
-        checkDeviceRegistry(obj);
+        var obj = api.DeviceRegistry.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeviceRegistry(obj as api.DeviceRegistry);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1731,7 +1743,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeviceRegistry(response);
+        checkDeviceRegistry(response as api.DeviceRegistry);
       })));
     });
 
@@ -1742,8 +1754,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1783,7 +1796,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1794,8 +1807,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1835,7 +1849,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -1846,8 +1861,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UnbindDeviceFromGatewayRequest.fromJson(json);
-        checkUnbindDeviceFromGatewayRequest(obj);
+        var obj = api.UnbindDeviceFromGatewayRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUnbindDeviceFromGatewayRequest(
+            obj as api.UnbindDeviceFromGatewayRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1888,7 +1905,8 @@
           .unbindDeviceFromGateway(arg_request, arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUnbindDeviceFromGatewayResponse(response);
+        checkUnbindDeviceFromGatewayResponse(
+            response as api.UnbindDeviceFromGatewayResponse);
       })));
     });
   });
@@ -1901,8 +1919,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Device.fromJson(json);
-        checkDevice(obj);
+        var obj =
+            api.Device.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDevice(obj as api.Device);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1942,7 +1961,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
 
@@ -1990,7 +2009,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2041,7 +2060,7 @@
       res
           .get(arg_name, fieldMask: arg_fieldMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
 
@@ -2126,7 +2145,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDevicesResponse(response);
+        checkListDevicesResponse(response as api.ListDevicesResponse);
       })));
     });
 
@@ -2137,8 +2156,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyCloudToDeviceConfigRequest.fromJson(json);
-        checkModifyCloudToDeviceConfigRequest(obj);
+        var obj = api.ModifyCloudToDeviceConfigRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyCloudToDeviceConfigRequest(
+            obj as api.ModifyCloudToDeviceConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2179,7 +2200,7 @@
           .modifyCloudToDeviceConfig(arg_request, arg_name,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeviceConfig(response);
+        checkDeviceConfig(response as api.DeviceConfig);
       })));
     });
 
@@ -2191,8 +2212,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Device.fromJson(json);
-        checkDevice(obj);
+        var obj =
+            api.Device.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDevice(obj as api.Device);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2235,7 +2257,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDevice(response);
+        checkDevice(response as api.Device);
       })));
     });
 
@@ -2246,8 +2268,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SendCommandToDeviceRequest.fromJson(json);
-        checkSendCommandToDeviceRequest(obj);
+        var obj = api.SendCommandToDeviceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSendCommandToDeviceRequest(obj as api.SendCommandToDeviceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2287,7 +2310,8 @@
       res
           .sendCommandToDevice(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSendCommandToDeviceResponse(response);
+        checkSendCommandToDeviceResponse(
+            response as api.SendCommandToDeviceResponse);
       })));
     });
   });
@@ -2347,7 +2371,8 @@
       res
           .list(arg_name, numVersions: arg_numVersions, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDeviceConfigVersionsResponse(response);
+        checkListDeviceConfigVersionsResponse(
+            response as api.ListDeviceConfigVersionsResponse);
       })));
     });
   });
@@ -2402,7 +2427,7 @@
       res
           .list(arg_name, numStates: arg_numStates, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDeviceStatesResponse(response);
+        checkListDeviceStatesResponse(response as api.ListDeviceStatesResponse);
       })));
     });
   });
@@ -2415,8 +2440,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2456,7 +2482,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2467,8 +2493,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2508,7 +2535,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2519,8 +2546,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2560,7 +2588,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -2649,7 +2678,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDevicesResponse(response);
+        checkListDevicesResponse(response as api.ListDevicesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudkms/v1_test.dart b/generated/googleapis/test/cloudkms/v1_test.dart
index 9a4f59e..e7439ba 100644
--- a/generated/googleapis/test/cloudkms/v1_test.dart
+++ b/generated/googleapis/test/cloudkms/v1_test.dart
@@ -133,7 +133,7 @@
 void checkAsymmetricSignRequest(api.AsymmetricSignRequest o) {
   buildCounterAsymmetricSignRequest++;
   if (buildCounterAsymmetricSignRequest < 3) {
-    checkDigest(o.digest);
+    checkDigest(o.digest as api.Digest);
     unittest.expect(o.digestCrc32c, unittest.equals('foo'));
   }
   buildCounterAsymmetricSignRequest--;
@@ -173,8 +173,8 @@
 
 void checkUnnamed4708(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -263,7 +263,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed4710(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -370,10 +370,11 @@
     checkUnnamed4714(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nextRotationTime, unittest.equals('foo'));
-    checkCryptoKeyVersion(o.primary);
+    checkCryptoKeyVersion(o.primary as api.CryptoKeyVersion);
     unittest.expect(o.purpose, unittest.equals('foo'));
     unittest.expect(o.rotationPeriod, unittest.equals('foo'));
-    checkCryptoKeyVersionTemplate(o.versionTemplate);
+    checkCryptoKeyVersionTemplate(
+        o.versionTemplate as api.CryptoKeyVersionTemplate);
   }
   buildCounterCryptoKey--;
 }
@@ -405,11 +406,12 @@
   buildCounterCryptoKeyVersion++;
   if (buildCounterCryptoKeyVersion < 3) {
     unittest.expect(o.algorithm, unittest.equals('foo'));
-    checkKeyOperationAttestation(o.attestation);
+    checkKeyOperationAttestation(o.attestation as api.KeyOperationAttestation);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.destroyEventTime, unittest.equals('foo'));
     unittest.expect(o.destroyTime, unittest.equals('foo'));
-    checkExternalProtectionLevelOptions(o.externalProtectionLevelOptions);
+    checkExternalProtectionLevelOptions(
+        o.externalProtectionLevelOptions as api.ExternalProtectionLevelOptions);
     unittest.expect(o.generateTime, unittest.equals('foo'));
     unittest.expect(o.importFailureReason, unittest.equals('foo'));
     unittest.expect(o.importJob, unittest.equals('foo'));
@@ -671,7 +673,7 @@
 void checkImportJob(api.ImportJob o) {
   buildCounterImportJob++;
   if (buildCounterImportJob < 3) {
-    checkKeyOperationAttestation(o.attestation);
+    checkKeyOperationAttestation(o.attestation as api.KeyOperationAttestation);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.expireEventTime, unittest.equals('foo'));
     unittest.expect(o.expireTime, unittest.equals('foo'));
@@ -679,7 +681,7 @@
     unittest.expect(o.importMethod, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.protectionLevel, unittest.equals('foo'));
-    checkWrappingPublicKey(o.publicKey);
+    checkWrappingPublicKey(o.publicKey as api.WrappingPublicKey);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterImportJob--;
@@ -701,7 +703,7 @@
 void checkKeyOperationAttestation(api.KeyOperationAttestation o) {
   buildCounterKeyOperationAttestation++;
   if (buildCounterKeyOperationAttestation < 3) {
-    checkCertificateChains(o.certChains);
+    checkCertificateChains(o.certChains as api.CertificateChains);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
   }
@@ -738,8 +740,8 @@
 
 void checkUnnamed4715(core.List<api.CryptoKeyVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCryptoKeyVersion(o[0]);
-  checkCryptoKeyVersion(o[1]);
+  checkCryptoKeyVersion(o[0] as api.CryptoKeyVersion);
+  checkCryptoKeyVersion(o[1] as api.CryptoKeyVersion);
 }
 
 core.int buildCounterListCryptoKeyVersionsResponse = 0;
@@ -774,8 +776,8 @@
 
 void checkUnnamed4716(core.List<api.CryptoKey> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCryptoKey(o[0]);
-  checkCryptoKey(o[1]);
+  checkCryptoKey(o[0] as api.CryptoKey);
+  checkCryptoKey(o[1] as api.CryptoKey);
 }
 
 core.int buildCounterListCryptoKeysResponse = 0;
@@ -810,8 +812,8 @@
 
 void checkUnnamed4717(core.List<api.ImportJob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImportJob(o[0]);
-  checkImportJob(o[1]);
+  checkImportJob(o[0] as api.ImportJob);
+  checkImportJob(o[1] as api.ImportJob);
 }
 
 core.int buildCounterListImportJobsResponse = 0;
@@ -846,8 +848,8 @@
 
 void checkUnnamed4718(core.List<api.KeyRing> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKeyRing(o[0]);
-  checkKeyRing(o[1]);
+  checkKeyRing(o[0] as api.KeyRing);
+  checkKeyRing(o[1] as api.KeyRing);
 }
 
 core.int buildCounterListKeyRingsResponse = 0;
@@ -882,8 +884,8 @@
 
 void checkUnnamed4719(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -1006,8 +1008,8 @@
 
 void checkUnnamed4722(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed4723() {
@@ -1019,8 +1021,8 @@
 
 void checkUnnamed4723(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1103,7 +1105,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -1218,7 +1220,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsymmetricDecryptRequest();
       var od = api.AsymmetricDecryptRequest.fromJson(o.toJson());
-      checkAsymmetricDecryptRequest(od);
+      checkAsymmetricDecryptRequest(od as api.AsymmetricDecryptRequest);
     });
   });
 
@@ -1226,7 +1228,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsymmetricDecryptResponse();
       var od = api.AsymmetricDecryptResponse.fromJson(o.toJson());
-      checkAsymmetricDecryptResponse(od);
+      checkAsymmetricDecryptResponse(od as api.AsymmetricDecryptResponse);
     });
   });
 
@@ -1234,7 +1236,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsymmetricSignRequest();
       var od = api.AsymmetricSignRequest.fromJson(o.toJson());
-      checkAsymmetricSignRequest(od);
+      checkAsymmetricSignRequest(od as api.AsymmetricSignRequest);
     });
   });
 
@@ -1242,7 +1244,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsymmetricSignResponse();
       var od = api.AsymmetricSignResponse.fromJson(o.toJson());
-      checkAsymmetricSignResponse(od);
+      checkAsymmetricSignResponse(od as api.AsymmetricSignResponse);
     });
   });
 
@@ -1250,7 +1252,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1258,7 +1260,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1266,7 +1268,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1274,7 +1276,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCertificateChains();
       var od = api.CertificateChains.fromJson(o.toJson());
-      checkCertificateChains(od);
+      checkCertificateChains(od as api.CertificateChains);
     });
   });
 
@@ -1282,7 +1284,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCryptoKey();
       var od = api.CryptoKey.fromJson(o.toJson());
-      checkCryptoKey(od);
+      checkCryptoKey(od as api.CryptoKey);
     });
   });
 
@@ -1290,7 +1292,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCryptoKeyVersion();
       var od = api.CryptoKeyVersion.fromJson(o.toJson());
-      checkCryptoKeyVersion(od);
+      checkCryptoKeyVersion(od as api.CryptoKeyVersion);
     });
   });
 
@@ -1298,7 +1300,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCryptoKeyVersionTemplate();
       var od = api.CryptoKeyVersionTemplate.fromJson(o.toJson());
-      checkCryptoKeyVersionTemplate(od);
+      checkCryptoKeyVersionTemplate(od as api.CryptoKeyVersionTemplate);
     });
   });
 
@@ -1306,7 +1308,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDecryptRequest();
       var od = api.DecryptRequest.fromJson(o.toJson());
-      checkDecryptRequest(od);
+      checkDecryptRequest(od as api.DecryptRequest);
     });
   });
 
@@ -1314,7 +1316,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDecryptResponse();
       var od = api.DecryptResponse.fromJson(o.toJson());
-      checkDecryptResponse(od);
+      checkDecryptResponse(od as api.DecryptResponse);
     });
   });
 
@@ -1322,7 +1324,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDestroyCryptoKeyVersionRequest();
       var od = api.DestroyCryptoKeyVersionRequest.fromJson(o.toJson());
-      checkDestroyCryptoKeyVersionRequest(od);
+      checkDestroyCryptoKeyVersionRequest(
+          od as api.DestroyCryptoKeyVersionRequest);
     });
   });
 
@@ -1330,7 +1333,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDigest();
       var od = api.Digest.fromJson(o.toJson());
-      checkDigest(od);
+      checkDigest(od as api.Digest);
     });
   });
 
@@ -1338,7 +1341,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEncryptRequest();
       var od = api.EncryptRequest.fromJson(o.toJson());
-      checkEncryptRequest(od);
+      checkEncryptRequest(od as api.EncryptRequest);
     });
   });
 
@@ -1346,7 +1349,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEncryptResponse();
       var od = api.EncryptResponse.fromJson(o.toJson());
-      checkEncryptResponse(od);
+      checkEncryptResponse(od as api.EncryptResponse);
     });
   });
 
@@ -1354,7 +1357,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1362,7 +1365,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalProtectionLevelOptions();
       var od = api.ExternalProtectionLevelOptions.fromJson(o.toJson());
-      checkExternalProtectionLevelOptions(od);
+      checkExternalProtectionLevelOptions(
+          od as api.ExternalProtectionLevelOptions);
     });
   });
 
@@ -1370,7 +1374,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportCryptoKeyVersionRequest();
       var od = api.ImportCryptoKeyVersionRequest.fromJson(o.toJson());
-      checkImportCryptoKeyVersionRequest(od);
+      checkImportCryptoKeyVersionRequest(
+          od as api.ImportCryptoKeyVersionRequest);
     });
   });
 
@@ -1378,7 +1383,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportJob();
       var od = api.ImportJob.fromJson(o.toJson());
-      checkImportJob(od);
+      checkImportJob(od as api.ImportJob);
     });
   });
 
@@ -1386,7 +1391,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyOperationAttestation();
       var od = api.KeyOperationAttestation.fromJson(o.toJson());
-      checkKeyOperationAttestation(od);
+      checkKeyOperationAttestation(od as api.KeyOperationAttestation);
     });
   });
 
@@ -1394,7 +1399,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyRing();
       var od = api.KeyRing.fromJson(o.toJson());
-      checkKeyRing(od);
+      checkKeyRing(od as api.KeyRing);
     });
   });
 
@@ -1402,7 +1407,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCryptoKeyVersionsResponse();
       var od = api.ListCryptoKeyVersionsResponse.fromJson(o.toJson());
-      checkListCryptoKeyVersionsResponse(od);
+      checkListCryptoKeyVersionsResponse(
+          od as api.ListCryptoKeyVersionsResponse);
     });
   });
 
@@ -1410,7 +1416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCryptoKeysResponse();
       var od = api.ListCryptoKeysResponse.fromJson(o.toJson());
-      checkListCryptoKeysResponse(od);
+      checkListCryptoKeysResponse(od as api.ListCryptoKeysResponse);
     });
   });
 
@@ -1418,7 +1424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListImportJobsResponse();
       var od = api.ListImportJobsResponse.fromJson(o.toJson());
-      checkListImportJobsResponse(od);
+      checkListImportJobsResponse(od as api.ListImportJobsResponse);
     });
   });
 
@@ -1426,7 +1432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListKeyRingsResponse();
       var od = api.ListKeyRingsResponse.fromJson(o.toJson());
-      checkListKeyRingsResponse(od);
+      checkListKeyRingsResponse(od as api.ListKeyRingsResponse);
     });
   });
 
@@ -1434,7 +1440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1442,7 +1448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1450,7 +1456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationMetadata();
       var od = api.LocationMetadata.fromJson(o.toJson());
-      checkLocationMetadata(od);
+      checkLocationMetadata(od as api.LocationMetadata);
     });
   });
 
@@ -1458,7 +1464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1466,7 +1472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublicKey();
       var od = api.PublicKey.fromJson(o.toJson());
-      checkPublicKey(od);
+      checkPublicKey(od as api.PublicKey);
     });
   });
 
@@ -1474,7 +1480,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreCryptoKeyVersionRequest();
       var od = api.RestoreCryptoKeyVersionRequest.fromJson(o.toJson());
-      checkRestoreCryptoKeyVersionRequest(od);
+      checkRestoreCryptoKeyVersionRequest(
+          od as api.RestoreCryptoKeyVersionRequest);
     });
   });
 
@@ -1482,7 +1489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1490,7 +1497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1498,7 +1505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1506,7 +1513,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateCryptoKeyPrimaryVersionRequest();
       var od = api.UpdateCryptoKeyPrimaryVersionRequest.fromJson(o.toJson());
-      checkUpdateCryptoKeyPrimaryVersionRequest(od);
+      checkUpdateCryptoKeyPrimaryVersionRequest(
+          od as api.UpdateCryptoKeyPrimaryVersionRequest);
     });
   });
 
@@ -1514,7 +1522,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWrappingPublicKey();
       var od = api.WrappingPublicKey.fromJson(o.toJson());
-      checkWrappingPublicKey(od);
+      checkWrappingPublicKey(od as api.WrappingPublicKey);
     });
   });
 
@@ -1563,7 +1571,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1623,7 +1631,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1637,8 +1645,9 @@
       var arg_keyRingId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.KeyRing.fromJson(json);
-        checkKeyRing(obj);
+        var obj =
+            api.KeyRing.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkKeyRing(obj as api.KeyRing);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1681,7 +1690,7 @@
           .create(arg_request, arg_parent,
               keyRingId: arg_keyRingId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkKeyRing(response);
+        checkKeyRing(response as api.KeyRing);
       })));
     });
 
@@ -1729,7 +1738,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkKeyRing(response);
+        checkKeyRing(response as api.KeyRing);
       })));
     });
 
@@ -1784,7 +1793,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1848,7 +1857,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListKeyRingsResponse(response);
+        checkListKeyRingsResponse(response as api.ListKeyRingsResponse);
       })));
     });
 
@@ -1859,8 +1868,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1900,7 +1910,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1911,8 +1921,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1952,7 +1963,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -1967,8 +1979,9 @@
       var arg_skipInitialVersionCreation = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CryptoKey.fromJson(json);
-        checkCryptoKey(obj);
+        var obj =
+            api.CryptoKey.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCryptoKey(obj as api.CryptoKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2015,7 +2028,7 @@
               skipInitialVersionCreation: arg_skipInitialVersionCreation,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKey(response);
+        checkCryptoKey(response as api.CryptoKey);
       })));
     });
 
@@ -2026,8 +2039,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DecryptRequest.fromJson(json);
-        checkDecryptRequest(obj);
+        var obj = api.DecryptRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDecryptRequest(obj as api.DecryptRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2067,7 +2081,7 @@
       res
           .decrypt(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDecryptResponse(response);
+        checkDecryptResponse(response as api.DecryptResponse);
       })));
     });
 
@@ -2078,8 +2092,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EncryptRequest.fromJson(json);
-        checkEncryptRequest(obj);
+        var obj = api.EncryptRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEncryptRequest(obj as api.EncryptRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2119,7 +2134,7 @@
       res
           .encrypt(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEncryptResponse(response);
+        checkEncryptResponse(response as api.EncryptResponse);
       })));
     });
 
@@ -2167,7 +2182,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKey(response);
+        checkCryptoKey(response as api.CryptoKey);
       })));
     });
 
@@ -2222,7 +2237,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2290,7 +2305,7 @@
               versionView: arg_versionView,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCryptoKeysResponse(response);
+        checkListCryptoKeysResponse(response as api.ListCryptoKeysResponse);
       })));
     });
 
@@ -2302,8 +2317,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CryptoKey.fromJson(json);
-        checkCryptoKey(obj);
+        var obj =
+            api.CryptoKey.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCryptoKey(obj as api.CryptoKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2346,7 +2362,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKey(response);
+        checkCryptoKey(response as api.CryptoKey);
       })));
     });
 
@@ -2357,8 +2373,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2398,7 +2415,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2409,8 +2426,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2450,7 +2468,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -2461,8 +2480,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateCryptoKeyPrimaryVersionRequest.fromJson(json);
-        checkUpdateCryptoKeyPrimaryVersionRequest(obj);
+        var obj = api.UpdateCryptoKeyPrimaryVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateCryptoKeyPrimaryVersionRequest(
+            obj as api.UpdateCryptoKeyPrimaryVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2502,7 +2523,7 @@
       res
           .updatePrimaryVersion(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKey(response);
+        checkCryptoKey(response as api.CryptoKey);
       })));
     });
   });
@@ -2522,8 +2543,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsymmetricDecryptRequest.fromJson(json);
-        checkAsymmetricDecryptRequest(obj);
+        var obj = api.AsymmetricDecryptRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsymmetricDecryptRequest(obj as api.AsymmetricDecryptRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2563,7 +2585,8 @@
       res
           .asymmetricDecrypt(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAsymmetricDecryptResponse(response);
+        checkAsymmetricDecryptResponse(
+            response as api.AsymmetricDecryptResponse);
       })));
     });
 
@@ -2579,8 +2602,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsymmetricSignRequest.fromJson(json);
-        checkAsymmetricSignRequest(obj);
+        var obj = api.AsymmetricSignRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsymmetricSignRequest(obj as api.AsymmetricSignRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2620,7 +2644,7 @@
       res
           .asymmetricSign(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAsymmetricSignResponse(response);
+        checkAsymmetricSignResponse(response as api.AsymmetricSignResponse);
       })));
     });
 
@@ -2636,8 +2660,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CryptoKeyVersion.fromJson(json);
-        checkCryptoKeyVersion(obj);
+        var obj = api.CryptoKeyVersion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCryptoKeyVersion(obj as api.CryptoKeyVersion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2677,7 +2702,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKeyVersion(response);
+        checkCryptoKeyVersion(response as api.CryptoKeyVersion);
       })));
     });
 
@@ -2693,8 +2718,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DestroyCryptoKeyVersionRequest.fromJson(json);
-        checkDestroyCryptoKeyVersionRequest(obj);
+        var obj = api.DestroyCryptoKeyVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDestroyCryptoKeyVersionRequest(
+            obj as api.DestroyCryptoKeyVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2734,7 +2761,7 @@
       res
           .destroy(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKeyVersion(response);
+        checkCryptoKeyVersion(response as api.CryptoKeyVersion);
       })));
     });
 
@@ -2787,7 +2814,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKeyVersion(response);
+        checkCryptoKeyVersion(response as api.CryptoKeyVersion);
       })));
     });
 
@@ -2840,7 +2867,7 @@
       res
           .getPublicKey(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPublicKey(response);
+        checkPublicKey(response as api.PublicKey);
       })));
     });
 
@@ -2856,8 +2883,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ImportCryptoKeyVersionRequest.fromJson(json);
-        checkImportCryptoKeyVersionRequest(obj);
+        var obj = api.ImportCryptoKeyVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkImportCryptoKeyVersionRequest(
+            obj as api.ImportCryptoKeyVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2897,7 +2926,7 @@
       res
           .import(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKeyVersion(response);
+        checkCryptoKeyVersion(response as api.CryptoKeyVersion);
       })));
     });
 
@@ -2969,7 +2998,8 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCryptoKeyVersionsResponse(response);
+        checkListCryptoKeyVersionsResponse(
+            response as api.ListCryptoKeyVersionsResponse);
       })));
     });
 
@@ -2986,8 +3016,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CryptoKeyVersion.fromJson(json);
-        checkCryptoKeyVersion(obj);
+        var obj = api.CryptoKeyVersion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCryptoKeyVersion(obj as api.CryptoKeyVersion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3030,7 +3061,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKeyVersion(response);
+        checkCryptoKeyVersion(response as api.CryptoKeyVersion);
       })));
     });
 
@@ -3046,8 +3077,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RestoreCryptoKeyVersionRequest.fromJson(json);
-        checkRestoreCryptoKeyVersionRequest(obj);
+        var obj = api.RestoreCryptoKeyVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRestoreCryptoKeyVersionRequest(
+            obj as api.RestoreCryptoKeyVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3087,7 +3120,7 @@
       res
           .restore(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCryptoKeyVersion(response);
+        checkCryptoKeyVersion(response as api.CryptoKeyVersion);
       })));
     });
   });
@@ -3101,8 +3134,9 @@
       var arg_importJobId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ImportJob.fromJson(json);
-        checkImportJob(obj);
+        var obj =
+            api.ImportJob.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkImportJob(obj as api.ImportJob);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3145,7 +3179,7 @@
           .create(arg_request, arg_parent,
               importJobId: arg_importJobId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImportJob(response);
+        checkImportJob(response as api.ImportJob);
       })));
     });
 
@@ -3193,7 +3227,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImportJob(response);
+        checkImportJob(response as api.ImportJob);
       })));
     });
 
@@ -3248,7 +3282,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3312,7 +3346,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListImportJobsResponse(response);
+        checkListImportJobsResponse(response as api.ListImportJobsResponse);
       })));
     });
 
@@ -3323,8 +3357,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3364,7 +3399,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3375,8 +3410,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3416,7 +3452,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudprofiler/v2_test.dart b/generated/googleapis/test/cloudprofiler/v2_test.dart
index 8df2085..017a37d 100644
--- a/generated/googleapis/test/cloudprofiler/v2_test.dart
+++ b/generated/googleapis/test/cloudprofiler/v2_test.dart
@@ -102,7 +102,7 @@
 void checkCreateProfileRequest(api.CreateProfileRequest o) {
   buildCounterCreateProfileRequest++;
   if (buildCounterCreateProfileRequest < 3) {
-    checkDeployment(o.deployment);
+    checkDeployment(o.deployment as api.Deployment);
     checkUnnamed2262(o.profileType);
   }
   buildCounterCreateProfileRequest--;
@@ -176,7 +176,7 @@
 void checkProfile(api.Profile o) {
   buildCounterProfile++;
   if (buildCounterProfile < 3) {
-    checkDeployment(o.deployment);
+    checkDeployment(o.deployment as api.Deployment);
     unittest.expect(o.duration, unittest.equals('foo'));
     checkUnnamed2264(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -191,7 +191,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateProfileRequest();
       var od = api.CreateProfileRequest.fromJson(o.toJson());
-      checkCreateProfileRequest(od);
+      checkCreateProfileRequest(od as api.CreateProfileRequest);
     });
   });
 
@@ -199,7 +199,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeployment();
       var od = api.Deployment.fromJson(o.toJson());
-      checkDeployment(od);
+      checkDeployment(od as api.Deployment);
     });
   });
 
@@ -207,7 +207,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfile();
       var od = api.Profile.fromJson(o.toJson());
-      checkProfile(od);
+      checkProfile(od as api.Profile);
     });
   });
 
@@ -219,8 +219,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateProfileRequest.fromJson(json);
-        checkCreateProfileRequest(obj);
+        var obj = api.CreateProfileRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateProfileRequest(obj as api.CreateProfileRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -260,7 +261,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
 
@@ -271,8 +272,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Profile.fromJson(json);
-        checkProfile(obj);
+        var obj =
+            api.Profile.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProfile(obj as api.Profile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -312,7 +314,7 @@
       res
           .createOffline(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
 
@@ -324,8 +326,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Profile.fromJson(json);
-        checkProfile(obj);
+        var obj =
+            api.Profile.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProfile(obj as api.Profile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -368,7 +371,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudresourcemanager/v1_test.dart b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
index 9a1497f..fff5d0c 100644
--- a/generated/googleapis/test/cloudresourcemanager/v1_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v1_test.dart
@@ -88,7 +88,7 @@
 void checkAncestor(api.Ancestor o) {
   buildCounterAncestor++;
   if (buildCounterAncestor < 3) {
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterAncestor--;
 }
@@ -102,8 +102,8 @@
 
 void checkUnnamed2855(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -192,7 +192,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2857(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -274,11 +274,11 @@
 void checkConstraint(api.Constraint o) {
   buildCounterConstraint++;
   if (buildCounterConstraint < 3) {
-    checkBooleanConstraint(o.booleanConstraint);
+    checkBooleanConstraint(o.booleanConstraint as api.BooleanConstraint);
     unittest.expect(o.constraintDefault, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkListConstraint(o.listConstraint);
+    checkListConstraint(o.listConstraint as api.ListConstraint);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -393,8 +393,8 @@
 
 void checkUnnamed2858(core.List<api.Ancestor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAncestor(o[0]);
-  checkAncestor(o[1]);
+  checkAncestor(o[0] as api.Ancestor);
+  checkAncestor(o[1] as api.Ancestor);
 }
 
 core.int buildCounterGetAncestryResponse = 0;
@@ -449,7 +449,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -566,8 +566,8 @@
 
 void checkUnnamed2860(core.List<api.Constraint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConstraint(o[0]);
-  checkConstraint(o[1]);
+  checkConstraint(o[0] as api.Constraint);
+  checkConstraint(o[1] as api.Constraint);
 }
 
 core.int buildCounterListAvailableOrgPolicyConstraintsResponse = 0;
@@ -623,8 +623,8 @@
 
 void checkUnnamed2861(core.List<api.Lien> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLien(o[0]);
-  checkLien(o[1]);
+  checkLien(o[0] as api.Lien);
+  checkLien(o[1] as api.Lien);
 }
 
 core.int buildCounterListLiensResponse = 0;
@@ -678,8 +678,8 @@
 
 void checkUnnamed2862(core.List<api.OrgPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrgPolicy(o[0]);
-  checkOrgPolicy(o[1]);
+  checkOrgPolicy(o[0] as api.OrgPolicy);
+  checkOrgPolicy(o[1] as api.OrgPolicy);
 }
 
 core.int buildCounterListOrgPoliciesResponse = 0;
@@ -765,8 +765,8 @@
 
 void checkUnnamed2865(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProject(o[0]);
-  checkProject(o[1]);
+  checkProject(o[0] as api.Project);
+  checkProject(o[1] as api.Project);
 }
 
 core.int buildCounterListProjectsResponse = 0;
@@ -867,7 +867,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed2866(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2867(o.response);
@@ -895,11 +895,11 @@
 void checkOrgPolicy(api.OrgPolicy o) {
   buildCounterOrgPolicy++;
   if (buildCounterOrgPolicy < 3) {
-    checkBooleanPolicy(o.booleanPolicy);
+    checkBooleanPolicy(o.booleanPolicy as api.BooleanPolicy);
     unittest.expect(o.constraint, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkListPolicy(o.listPolicy);
-    checkRestoreDefault(o.restoreDefault);
+    checkListPolicy(o.listPolicy as api.ListPolicy);
+    checkRestoreDefault(o.restoreDefault as api.RestoreDefault);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -928,7 +928,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.lifecycleState, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOrganizationOwner(o.owner);
+    checkOrganizationOwner(o.owner as api.OrganizationOwner);
   }
   buildCounterOrganization--;
 }
@@ -961,8 +961,8 @@
 
 void checkUnnamed2868(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed2869() {
@@ -974,8 +974,8 @@
 
 void checkUnnamed2869(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1040,7 +1040,7 @@
     checkUnnamed2870(o.labels);
     unittest.expect(o.lifecycleState, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkResourceId(o.parent);
+    checkResourceId(o.parent as api.ResourceId);
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.projectNumber, unittest.equals('foo'));
   }
@@ -1138,8 +1138,8 @@
 
 void checkUnnamed2871(core.List<api.Organization> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrganization(o[0]);
-  checkOrganization(o[1]);
+  checkOrganization(o[0] as api.Organization);
+  checkOrganization(o[1] as api.Organization);
 }
 
 core.int buildCounterSearchOrganizationsResponse = 0;
@@ -1178,7 +1178,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -1198,7 +1198,7 @@
 void checkSetOrgPolicyRequest(api.SetOrgPolicyRequest o) {
   buildCounterSetOrgPolicyRequest++;
   if (buildCounterSetOrgPolicyRequest < 3) {
-    checkOrgPolicy(o.policy);
+    checkOrgPolicy(o.policy as api.OrgPolicy);
   }
   buildCounterSetOrgPolicyRequest--;
 }
@@ -1352,7 +1352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAncestor();
       var od = api.Ancestor.fromJson(o.toJson());
-      checkAncestor(od);
+      checkAncestor(od as api.Ancestor);
     });
   });
 
@@ -1360,7 +1360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1368,7 +1368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1376,7 +1376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1384,7 +1384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooleanConstraint();
       var od = api.BooleanConstraint.fromJson(o.toJson());
-      checkBooleanConstraint(od);
+      checkBooleanConstraint(od as api.BooleanConstraint);
     });
   });
 
@@ -1392,7 +1392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooleanPolicy();
       var od = api.BooleanPolicy.fromJson(o.toJson());
-      checkBooleanPolicy(od);
+      checkBooleanPolicy(od as api.BooleanPolicy);
     });
   });
 
@@ -1400,7 +1400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClearOrgPolicyRequest();
       var od = api.ClearOrgPolicyRequest.fromJson(o.toJson());
-      checkClearOrgPolicyRequest(od);
+      checkClearOrgPolicyRequest(od as api.ClearOrgPolicyRequest);
     });
   });
 
@@ -1408,7 +1408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConstraint();
       var od = api.Constraint.fromJson(o.toJson());
-      checkConstraint(od);
+      checkConstraint(od as api.Constraint);
     });
   });
 
@@ -1416,7 +1416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1424,7 +1424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1432,7 +1432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolderOperation();
       var od = api.FolderOperation.fromJson(o.toJson());
-      checkFolderOperation(od);
+      checkFolderOperation(od as api.FolderOperation);
     });
   });
 
@@ -1440,7 +1440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolderOperationError();
       var od = api.FolderOperationError.fromJson(o.toJson());
-      checkFolderOperationError(od);
+      checkFolderOperationError(od as api.FolderOperationError);
     });
   });
 
@@ -1448,7 +1448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetAncestryRequest();
       var od = api.GetAncestryRequest.fromJson(o.toJson());
-      checkGetAncestryRequest(od);
+      checkGetAncestryRequest(od as api.GetAncestryRequest);
     });
   });
 
@@ -1456,7 +1456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetAncestryResponse();
       var od = api.GetAncestryResponse.fromJson(o.toJson());
-      checkGetAncestryResponse(od);
+      checkGetAncestryResponse(od as api.GetAncestryResponse);
     });
   });
 
@@ -1464,7 +1464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetEffectiveOrgPolicyRequest();
       var od = api.GetEffectiveOrgPolicyRequest.fromJson(o.toJson());
-      checkGetEffectiveOrgPolicyRequest(od);
+      checkGetEffectiveOrgPolicyRequest(od as api.GetEffectiveOrgPolicyRequest);
     });
   });
 
@@ -1472,7 +1472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -1480,7 +1480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetOrgPolicyRequest();
       var od = api.GetOrgPolicyRequest.fromJson(o.toJson());
-      checkGetOrgPolicyRequest(od);
+      checkGetOrgPolicyRequest(od as api.GetOrgPolicyRequest);
     });
   });
 
@@ -1488,7 +1488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -1496,7 +1496,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLien();
       var od = api.Lien.fromJson(o.toJson());
-      checkLien(od);
+      checkLien(od as api.Lien);
     });
   });
 
@@ -1505,7 +1505,8 @@
       var o = buildListAvailableOrgPolicyConstraintsRequest();
       var od =
           api.ListAvailableOrgPolicyConstraintsRequest.fromJson(o.toJson());
-      checkListAvailableOrgPolicyConstraintsRequest(od);
+      checkListAvailableOrgPolicyConstraintsRequest(
+          od as api.ListAvailableOrgPolicyConstraintsRequest);
     });
   });
 
@@ -1514,7 +1515,8 @@
       var o = buildListAvailableOrgPolicyConstraintsResponse();
       var od =
           api.ListAvailableOrgPolicyConstraintsResponse.fromJson(o.toJson());
-      checkListAvailableOrgPolicyConstraintsResponse(od);
+      checkListAvailableOrgPolicyConstraintsResponse(
+          od as api.ListAvailableOrgPolicyConstraintsResponse);
     });
   });
 
@@ -1522,7 +1524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListConstraint();
       var od = api.ListConstraint.fromJson(o.toJson());
-      checkListConstraint(od);
+      checkListConstraint(od as api.ListConstraint);
     });
   });
 
@@ -1530,7 +1532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLiensResponse();
       var od = api.ListLiensResponse.fromJson(o.toJson());
-      checkListLiensResponse(od);
+      checkListLiensResponse(od as api.ListLiensResponse);
     });
   });
 
@@ -1538,7 +1540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOrgPoliciesRequest();
       var od = api.ListOrgPoliciesRequest.fromJson(o.toJson());
-      checkListOrgPoliciesRequest(od);
+      checkListOrgPoliciesRequest(od as api.ListOrgPoliciesRequest);
     });
   });
 
@@ -1546,7 +1548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOrgPoliciesResponse();
       var od = api.ListOrgPoliciesResponse.fromJson(o.toJson());
-      checkListOrgPoliciesResponse(od);
+      checkListOrgPoliciesResponse(od as api.ListOrgPoliciesResponse);
     });
   });
 
@@ -1554,7 +1556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPolicy();
       var od = api.ListPolicy.fromJson(o.toJson());
-      checkListPolicy(od);
+      checkListPolicy(od as api.ListPolicy);
     });
   });
 
@@ -1562,7 +1564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListProjectsResponse();
       var od = api.ListProjectsResponse.fromJson(o.toJson());
-      checkListProjectsResponse(od);
+      checkListProjectsResponse(od as api.ListProjectsResponse);
     });
   });
 
@@ -1570,7 +1572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1578,7 +1580,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrgPolicy();
       var od = api.OrgPolicy.fromJson(o.toJson());
-      checkOrgPolicy(od);
+      checkOrgPolicy(od as api.OrgPolicy);
     });
   });
 
@@ -1586,7 +1588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrganization();
       var od = api.Organization.fromJson(o.toJson());
-      checkOrganization(od);
+      checkOrganization(od as api.Organization);
     });
   });
 
@@ -1594,7 +1596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrganizationOwner();
       var od = api.OrganizationOwner.fromJson(o.toJson());
-      checkOrganizationOwner(od);
+      checkOrganizationOwner(od as api.OrganizationOwner);
     });
   });
 
@@ -1602,7 +1604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1610,7 +1612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProject();
       var od = api.Project.fromJson(o.toJson());
-      checkProject(od);
+      checkProject(od as api.Project);
     });
   });
 
@@ -1618,7 +1620,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectCreationStatus();
       var od = api.ProjectCreationStatus.fromJson(o.toJson());
-      checkProjectCreationStatus(od);
+      checkProjectCreationStatus(od as api.ProjectCreationStatus);
     });
   });
 
@@ -1626,7 +1628,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceId();
       var od = api.ResourceId.fromJson(o.toJson());
-      checkResourceId(od);
+      checkResourceId(od as api.ResourceId);
     });
   });
 
@@ -1634,7 +1636,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreDefault();
       var od = api.RestoreDefault.fromJson(o.toJson());
-      checkRestoreDefault(od);
+      checkRestoreDefault(od as api.RestoreDefault);
     });
   });
 
@@ -1642,7 +1644,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchOrganizationsRequest();
       var od = api.SearchOrganizationsRequest.fromJson(o.toJson());
-      checkSearchOrganizationsRequest(od);
+      checkSearchOrganizationsRequest(od as api.SearchOrganizationsRequest);
     });
   });
 
@@ -1650,7 +1652,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchOrganizationsResponse();
       var od = api.SearchOrganizationsResponse.fromJson(o.toJson());
-      checkSearchOrganizationsResponse(od);
+      checkSearchOrganizationsResponse(od as api.SearchOrganizationsResponse);
     });
   });
 
@@ -1658,7 +1660,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1666,7 +1668,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetOrgPolicyRequest();
       var od = api.SetOrgPolicyRequest.fromJson(o.toJson());
-      checkSetOrgPolicyRequest(od);
+      checkSetOrgPolicyRequest(od as api.SetOrgPolicyRequest);
     });
   });
 
@@ -1674,7 +1676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1682,7 +1684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1690,7 +1692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1698,7 +1700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteProjectRequest();
       var od = api.UndeleteProjectRequest.fromJson(o.toJson());
-      checkUndeleteProjectRequest(od);
+      checkUndeleteProjectRequest(od as api.UndeleteProjectRequest);
     });
   });
 
@@ -1710,8 +1712,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ClearOrgPolicyRequest.fromJson(json);
-        checkClearOrgPolicyRequest(obj);
+        var obj = api.ClearOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkClearOrgPolicyRequest(obj as api.ClearOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1751,7 +1754,7 @@
       res
           .clearOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1762,8 +1765,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetEffectiveOrgPolicyRequest.fromJson(json);
-        checkGetEffectiveOrgPolicyRequest(obj);
+        var obj = api.GetEffectiveOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetEffectiveOrgPolicyRequest(
+            obj as api.GetEffectiveOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1804,7 +1809,7 @@
           .getEffectiveOrgPolicy(arg_request, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -1815,8 +1820,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetOrgPolicyRequest.fromJson(json);
-        checkGetOrgPolicyRequest(obj);
+        var obj = api.GetOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetOrgPolicyRequest(obj as api.GetOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1856,7 +1862,7 @@
       res
           .getOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -1867,8 +1873,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
-        checkListAvailableOrgPolicyConstraintsRequest(obj);
+        var obj = api.ListAvailableOrgPolicyConstraintsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListAvailableOrgPolicyConstraintsRequest(
+            obj as api.ListAvailableOrgPolicyConstraintsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1910,7 +1918,8 @@
           .listAvailableOrgPolicyConstraints(arg_request, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAvailableOrgPolicyConstraintsResponse(response);
+        checkListAvailableOrgPolicyConstraintsResponse(
+            response as api.ListAvailableOrgPolicyConstraintsResponse);
       })));
     });
 
@@ -1921,8 +1930,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListOrgPoliciesRequest.fromJson(json);
-        checkListOrgPoliciesRequest(obj);
+        var obj = api.ListOrgPoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListOrgPoliciesRequest(obj as api.ListOrgPoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1962,7 +1972,7 @@
       res
           .listOrgPolicies(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOrgPoliciesResponse(response);
+        checkListOrgPoliciesResponse(response as api.ListOrgPoliciesResponse);
       })));
     });
 
@@ -1973,8 +1983,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetOrgPolicyRequest.fromJson(json);
-        checkSetOrgPolicyRequest(obj);
+        var obj = api.SetOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetOrgPolicyRequest(obj as api.SetOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2014,7 +2025,7 @@
       res
           .setOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
   });
@@ -2026,8 +2037,9 @@
       var arg_request = buildLien();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Lien.fromJson(json);
-        checkLien(obj);
+        var obj =
+            api.Lien.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLien(obj as api.Lien);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2066,7 +2078,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLien(response);
+        checkLien(response as api.Lien);
       })));
     });
 
@@ -2114,7 +2126,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2162,7 +2174,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLien(response);
+        checkLien(response as api.Lien);
       })));
     });
 
@@ -2220,7 +2232,7 @@
               parent: arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLiensResponse(response);
+        checkListLiensResponse(response as api.ListLiensResponse);
       })));
     });
   });
@@ -2270,7 +2282,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2283,8 +2295,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ClearOrgPolicyRequest.fromJson(json);
-        checkClearOrgPolicyRequest(obj);
+        var obj = api.ClearOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkClearOrgPolicyRequest(obj as api.ClearOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2324,7 +2337,7 @@
       res
           .clearOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2372,7 +2385,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrganization(response);
+        checkOrganization(response as api.Organization);
       })));
     });
 
@@ -2383,8 +2396,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetEffectiveOrgPolicyRequest.fromJson(json);
-        checkGetEffectiveOrgPolicyRequest(obj);
+        var obj = api.GetEffectiveOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetEffectiveOrgPolicyRequest(
+            obj as api.GetEffectiveOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2425,7 +2440,7 @@
           .getEffectiveOrgPolicy(arg_request, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -2436,8 +2451,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2477,7 +2493,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2488,8 +2504,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetOrgPolicyRequest.fromJson(json);
-        checkGetOrgPolicyRequest(obj);
+        var obj = api.GetOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetOrgPolicyRequest(obj as api.GetOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2529,7 +2546,7 @@
       res
           .getOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -2540,8 +2557,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
-        checkListAvailableOrgPolicyConstraintsRequest(obj);
+        var obj = api.ListAvailableOrgPolicyConstraintsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListAvailableOrgPolicyConstraintsRequest(
+            obj as api.ListAvailableOrgPolicyConstraintsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2583,7 +2602,8 @@
           .listAvailableOrgPolicyConstraints(arg_request, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAvailableOrgPolicyConstraintsResponse(response);
+        checkListAvailableOrgPolicyConstraintsResponse(
+            response as api.ListAvailableOrgPolicyConstraintsResponse);
       })));
     });
 
@@ -2594,8 +2614,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListOrgPoliciesRequest.fromJson(json);
-        checkListOrgPoliciesRequest(obj);
+        var obj = api.ListOrgPoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListOrgPoliciesRequest(obj as api.ListOrgPoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2635,7 +2656,7 @@
       res
           .listOrgPolicies(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOrgPoliciesResponse(response);
+        checkListOrgPoliciesResponse(response as api.ListOrgPoliciesResponse);
       })));
     });
 
@@ -2645,8 +2666,9 @@
       var arg_request = buildSearchOrganizationsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchOrganizationsRequest.fromJson(json);
-        checkSearchOrganizationsRequest(obj);
+        var obj = api.SearchOrganizationsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchOrganizationsRequest(obj as api.SearchOrganizationsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2685,7 +2707,8 @@
       res
           .search(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchOrganizationsResponse(response);
+        checkSearchOrganizationsResponse(
+            response as api.SearchOrganizationsResponse);
       })));
     });
 
@@ -2696,8 +2719,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2737,7 +2761,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2748,8 +2772,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetOrgPolicyRequest.fromJson(json);
-        checkSetOrgPolicyRequest(obj);
+        var obj = api.SetOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetOrgPolicyRequest(obj as api.SetOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2789,7 +2814,7 @@
       res
           .setOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -2800,8 +2825,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2841,7 +2867,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -2854,8 +2881,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ClearOrgPolicyRequest.fromJson(json);
-        checkClearOrgPolicyRequest(obj);
+        var obj = api.ClearOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkClearOrgPolicyRequest(obj as api.ClearOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2895,7 +2923,7 @@
       res
           .clearOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2905,8 +2933,9 @@
       var arg_request = buildProject();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Project.fromJson(json);
-        checkProject(obj);
+        var obj =
+            api.Project.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProject(obj as api.Project);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2945,7 +2974,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2995,7 +3024,7 @@
       res
           .delete(arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3045,7 +3074,7 @@
       res
           .get(arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
 
@@ -3056,8 +3085,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetAncestryRequest.fromJson(json);
-        checkGetAncestryRequest(obj);
+        var obj = api.GetAncestryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetAncestryRequest(obj as api.GetAncestryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3105,7 +3135,7 @@
       res
           .getAncestry(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetAncestryResponse(response);
+        checkGetAncestryResponse(response as api.GetAncestryResponse);
       })));
     });
 
@@ -3116,8 +3146,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetEffectiveOrgPolicyRequest.fromJson(json);
-        checkGetEffectiveOrgPolicyRequest(obj);
+        var obj = api.GetEffectiveOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetEffectiveOrgPolicyRequest(
+            obj as api.GetEffectiveOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3158,7 +3190,7 @@
           .getEffectiveOrgPolicy(arg_request, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -3169,8 +3201,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3218,7 +3251,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3229,8 +3262,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetOrgPolicyRequest.fromJson(json);
-        checkGetOrgPolicyRequest(obj);
+        var obj = api.GetOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetOrgPolicyRequest(obj as api.GetOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3270,7 +3304,7 @@
       res
           .getOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -3328,7 +3362,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListProjectsResponse(response);
+        checkListProjectsResponse(response as api.ListProjectsResponse);
       })));
     });
 
@@ -3339,8 +3373,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListAvailableOrgPolicyConstraintsRequest.fromJson(json);
-        checkListAvailableOrgPolicyConstraintsRequest(obj);
+        var obj = api.ListAvailableOrgPolicyConstraintsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListAvailableOrgPolicyConstraintsRequest(
+            obj as api.ListAvailableOrgPolicyConstraintsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3382,7 +3418,8 @@
           .listAvailableOrgPolicyConstraints(arg_request, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAvailableOrgPolicyConstraintsResponse(response);
+        checkListAvailableOrgPolicyConstraintsResponse(
+            response as api.ListAvailableOrgPolicyConstraintsResponse);
       })));
     });
 
@@ -3393,8 +3430,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListOrgPoliciesRequest.fromJson(json);
-        checkListOrgPoliciesRequest(obj);
+        var obj = api.ListOrgPoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListOrgPoliciesRequest(obj as api.ListOrgPoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3434,7 +3472,7 @@
       res
           .listOrgPolicies(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOrgPoliciesResponse(response);
+        checkListOrgPoliciesResponse(response as api.ListOrgPoliciesResponse);
       })));
     });
 
@@ -3445,8 +3483,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3494,7 +3533,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3505,8 +3544,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetOrgPolicyRequest.fromJson(json);
-        checkSetOrgPolicyRequest(obj);
+        var obj = api.SetOrgPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetOrgPolicyRequest(obj as api.SetOrgPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3546,7 +3586,7 @@
       res
           .setOrgPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrgPolicy(response);
+        checkOrgPolicy(response as api.OrgPolicy);
       })));
     });
 
@@ -3557,8 +3597,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3606,7 +3647,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -3617,8 +3659,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteProjectRequest.fromJson(json);
-        checkUndeleteProjectRequest(obj);
+        var obj = api.UndeleteProjectRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteProjectRequest(obj as api.UndeleteProjectRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3666,7 +3709,7 @@
       res
           .undelete(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3677,8 +3720,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Project.fromJson(json);
-        checkProject(obj);
+        var obj =
+            api.Project.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProject(obj as api.Project);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3720,7 +3764,7 @@
       res
           .update(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudresourcemanager/v2_test.dart b/generated/googleapis/test/cloudresourcemanager/v2_test.dart
index 9fe6697..5afd469 100644
--- a/generated/googleapis/test/cloudresourcemanager/v2_test.dart
+++ b/generated/googleapis/test/cloudresourcemanager/v2_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed2759(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -173,7 +173,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2761(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -290,7 +290,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -323,8 +323,8 @@
 
 void checkUnnamed2762(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFolder(o[0]);
-  checkFolder(o[1]);
+  checkFolder(o[0] as api.Folder);
+  checkFolder(o[1] as api.Folder);
 }
 
 core.int buildCounterListFoldersResponse = 0;
@@ -444,7 +444,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed2763(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2764(o.response);
@@ -461,8 +461,8 @@
 
 void checkUnnamed2765(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed2766() {
@@ -474,8 +474,8 @@
 
 void checkUnnamed2766(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -558,8 +558,8 @@
 
 void checkUnnamed2767(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFolder(o[0]);
-  checkFolder(o[1]);
+  checkFolder(o[0] as api.Folder);
+  checkFolder(o[1] as api.Folder);
 }
 
 core.int buildCounterSearchFoldersResponse = 0;
@@ -598,7 +598,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -753,7 +753,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -761,7 +761,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -769,7 +769,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -777,7 +777,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -785,7 +785,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolder();
       var od = api.Folder.fromJson(o.toJson());
-      checkFolder(od);
+      checkFolder(od as api.Folder);
     });
   });
 
@@ -793,7 +793,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolderOperation();
       var od = api.FolderOperation.fromJson(o.toJson());
-      checkFolderOperation(od);
+      checkFolderOperation(od as api.FolderOperation);
     });
   });
 
@@ -801,7 +801,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolderOperationError();
       var od = api.FolderOperationError.fromJson(o.toJson());
-      checkFolderOperationError(od);
+      checkFolderOperationError(od as api.FolderOperationError);
     });
   });
 
@@ -809,7 +809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -817,7 +817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -825,7 +825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFoldersResponse();
       var od = api.ListFoldersResponse.fromJson(o.toJson());
-      checkListFoldersResponse(od);
+      checkListFoldersResponse(od as api.ListFoldersResponse);
     });
   });
 
@@ -833,7 +833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoveFolderRequest();
       var od = api.MoveFolderRequest.fromJson(o.toJson());
-      checkMoveFolderRequest(od);
+      checkMoveFolderRequest(od as api.MoveFolderRequest);
     });
   });
 
@@ -841,7 +841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -849,7 +849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -857,7 +857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectCreationStatus();
       var od = api.ProjectCreationStatus.fromJson(o.toJson());
-      checkProjectCreationStatus(od);
+      checkProjectCreationStatus(od as api.ProjectCreationStatus);
     });
   });
 
@@ -865,7 +865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchFoldersRequest();
       var od = api.SearchFoldersRequest.fromJson(o.toJson());
-      checkSearchFoldersRequest(od);
+      checkSearchFoldersRequest(od as api.SearchFoldersRequest);
     });
   });
 
@@ -873,7 +873,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchFoldersResponse();
       var od = api.SearchFoldersResponse.fromJson(o.toJson());
-      checkSearchFoldersResponse(od);
+      checkSearchFoldersResponse(od as api.SearchFoldersResponse);
     });
   });
 
@@ -881,7 +881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -889,7 +889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -897,7 +897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -905,7 +905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -913,7 +913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteFolderRequest();
       var od = api.UndeleteFolderRequest.fromJson(o.toJson());
-      checkUndeleteFolderRequest(od);
+      checkUndeleteFolderRequest(od as api.UndeleteFolderRequest);
     });
   });
 
@@ -925,8 +925,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -966,7 +967,7 @@
       res
           .create(arg_request, parent: arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1014,7 +1015,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
 
@@ -1062,7 +1063,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
 
@@ -1073,8 +1074,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1114,7 +1116,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1176,7 +1178,7 @@
               showDeleted: arg_showDeleted,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFoldersResponse(response);
+        checkListFoldersResponse(response as api.ListFoldersResponse);
       })));
     });
 
@@ -1187,8 +1189,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.MoveFolderRequest.fromJson(json);
-        checkMoveFolderRequest(obj);
+        var obj = api.MoveFolderRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkMoveFolderRequest(obj as api.MoveFolderRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1228,7 +1231,7 @@
       res
           .move(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1240,8 +1243,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1284,7 +1288,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
 
@@ -1294,8 +1298,9 @@
       var arg_request = buildSearchFoldersRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchFoldersRequest.fromJson(json);
-        checkSearchFoldersRequest(obj);
+        var obj = api.SearchFoldersRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchFoldersRequest(obj as api.SearchFoldersRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1334,7 +1339,7 @@
       res
           .search(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchFoldersResponse(response);
+        checkSearchFoldersResponse(response as api.SearchFoldersResponse);
       })));
     });
 
@@ -1345,8 +1350,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1386,7 +1392,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1397,8 +1403,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1438,7 +1445,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -1449,8 +1457,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteFolderRequest.fromJson(json);
-        checkUndeleteFolderRequest(obj);
+        var obj = api.UndeleteFolderRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteFolderRequest(obj as api.UndeleteFolderRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1490,7 +1499,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
   });
@@ -1540,7 +1549,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudscheduler/v1_test.dart b/generated/googleapis/test/cloudscheduler/v1_test.dart
index b0612b3..d749072 100644
--- a/generated/googleapis/test/cloudscheduler/v1_test.dart
+++ b/generated/googleapis/test/cloudscheduler/v1_test.dart
@@ -105,7 +105,7 @@
 void checkAppEngineHttpTarget(api.AppEngineHttpTarget o) {
   buildCounterAppEngineHttpTarget++;
   if (buildCounterAppEngineHttpTarget < 3) {
-    checkAppEngineRouting(o.appEngineRouting);
+    checkAppEngineRouting(o.appEngineRouting as api.AppEngineRouting);
     unittest.expect(o.body, unittest.equals('foo'));
     checkUnnamed2749(o.headers);
     unittest.expect(o.httpMethod, unittest.equals('foo'));
@@ -189,8 +189,8 @@
     unittest.expect(o.body, unittest.equals('foo'));
     checkUnnamed2750(o.headers);
     unittest.expect(o.httpMethod, unittest.equals('foo'));
-    checkOAuthToken(o.oauthToken);
-    checkOidcToken(o.oidcToken);
+    checkOAuthToken(o.oauthToken as api.OAuthToken);
+    checkOidcToken(o.oidcToken as api.OidcToken);
     unittest.expect(o.uri, unittest.equals('foo'));
   }
   buildCounterHttpTarget--;
@@ -223,18 +223,18 @@
 void checkJob(api.Job o) {
   buildCounterJob++;
   if (buildCounterJob < 3) {
-    checkAppEngineHttpTarget(o.appEngineHttpTarget);
+    checkAppEngineHttpTarget(o.appEngineHttpTarget as api.AppEngineHttpTarget);
     unittest.expect(o.attemptDeadline, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkHttpTarget(o.httpTarget);
+    checkHttpTarget(o.httpTarget as api.HttpTarget);
     unittest.expect(o.lastAttemptTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPubsubTarget(o.pubsubTarget);
-    checkRetryConfig(o.retryConfig);
+    checkPubsubTarget(o.pubsubTarget as api.PubsubTarget);
+    checkRetryConfig(o.retryConfig as api.RetryConfig);
     unittest.expect(o.schedule, unittest.equals('foo'));
     unittest.expect(o.scheduleTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
     unittest.expect(o.timeZone, unittest.equals('foo'));
     unittest.expect(o.userUpdateTime, unittest.equals('foo'));
   }
@@ -250,8 +250,8 @@
 
 void checkUnnamed2751(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJob(o[0]);
-  checkJob(o[1]);
+  checkJob(o[0] as api.Job);
+  checkJob(o[1] as api.Job);
 }
 
 core.int buildCounterListJobsResponse = 0;
@@ -284,8 +284,8 @@
 
 void checkUnnamed2752(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -638,7 +638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppEngineHttpTarget();
       var od = api.AppEngineHttpTarget.fromJson(o.toJson());
-      checkAppEngineHttpTarget(od);
+      checkAppEngineHttpTarget(od as api.AppEngineHttpTarget);
     });
   });
 
@@ -646,7 +646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppEngineRouting();
       var od = api.AppEngineRouting.fromJson(o.toJson());
-      checkAppEngineRouting(od);
+      checkAppEngineRouting(od as api.AppEngineRouting);
     });
   });
 
@@ -654,7 +654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -662,7 +662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpTarget();
       var od = api.HttpTarget.fromJson(o.toJson());
-      checkHttpTarget(od);
+      checkHttpTarget(od as api.HttpTarget);
     });
   });
 
@@ -670,7 +670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJob();
       var od = api.Job.fromJson(o.toJson());
-      checkJob(od);
+      checkJob(od as api.Job);
     });
   });
 
@@ -678,7 +678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListJobsResponse();
       var od = api.ListJobsResponse.fromJson(o.toJson());
-      checkListJobsResponse(od);
+      checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
 
@@ -686,7 +686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -694,7 +694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -702,7 +702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOAuthToken();
       var od = api.OAuthToken.fromJson(o.toJson());
-      checkOAuthToken(od);
+      checkOAuthToken(od as api.OAuthToken);
     });
   });
 
@@ -710,7 +710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOidcToken();
       var od = api.OidcToken.fromJson(o.toJson());
-      checkOidcToken(od);
+      checkOidcToken(od as api.OidcToken);
     });
   });
 
@@ -718,7 +718,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPauseJobRequest();
       var od = api.PauseJobRequest.fromJson(o.toJson());
-      checkPauseJobRequest(od);
+      checkPauseJobRequest(od as api.PauseJobRequest);
     });
   });
 
@@ -726,7 +726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPubsubMessage();
       var od = api.PubsubMessage.fromJson(o.toJson());
-      checkPubsubMessage(od);
+      checkPubsubMessage(od as api.PubsubMessage);
     });
   });
 
@@ -734,7 +734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPubsubTarget();
       var od = api.PubsubTarget.fromJson(o.toJson());
-      checkPubsubTarget(od);
+      checkPubsubTarget(od as api.PubsubTarget);
     });
   });
 
@@ -742,7 +742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResumeJobRequest();
       var od = api.ResumeJobRequest.fromJson(o.toJson());
-      checkResumeJobRequest(od);
+      checkResumeJobRequest(od as api.ResumeJobRequest);
     });
   });
 
@@ -750,7 +750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRetryConfig();
       var od = api.RetryConfig.fromJson(o.toJson());
-      checkRetryConfig(od);
+      checkRetryConfig(od as api.RetryConfig);
     });
   });
 
@@ -758,7 +758,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunJobRequest();
       var od = api.RunJobRequest.fromJson(o.toJson());
-      checkRunJobRequest(od);
+      checkRunJobRequest(od as api.RunJobRequest);
     });
   });
 
@@ -766,7 +766,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -815,7 +815,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -875,7 +875,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -888,8 +888,8 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Job.fromJson(json);
-        checkJob(obj);
+        var obj = api.Job.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkJob(obj as api.Job);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -929,7 +929,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -977,7 +977,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1025,7 +1025,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -1082,7 +1082,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListJobsResponse(response);
+        checkListJobsResponse(response as api.ListJobsResponse);
       })));
     });
 
@@ -1094,8 +1094,8 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Job.fromJson(json);
-        checkJob(obj);
+        var obj = api.Job.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkJob(obj as api.Job);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1138,7 +1138,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -1149,8 +1149,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PauseJobRequest.fromJson(json);
-        checkPauseJobRequest(obj);
+        var obj = api.PauseJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPauseJobRequest(obj as api.PauseJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1190,7 +1191,7 @@
       res
           .pause(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -1201,8 +1202,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResumeJobRequest.fromJson(json);
-        checkResumeJobRequest(obj);
+        var obj = api.ResumeJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResumeJobRequest(obj as api.ResumeJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1242,7 +1244,7 @@
       res
           .resume(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -1253,8 +1255,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RunJobRequest.fromJson(json);
-        checkRunJobRequest(obj);
+        var obj = api.RunJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRunJobRequest(obj as api.RunJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1294,7 +1297,7 @@
       res
           .run(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudsearch/v1_test.dart b/generated/googleapis/test/cloudsearch/v1_test.dart
index 33ec629..b08d573 100644
--- a/generated/googleapis/test/cloudsearch/v1_test.dart
+++ b/generated/googleapis/test/cloudsearch/v1_test.dart
@@ -107,7 +107,8 @@
 void checkBooleanPropertyOptions(api.BooleanPropertyOptions o) {
   buildCounterBooleanPropertyOptions++;
   if (buildCounterBooleanPropertyOptions < 3) {
-    checkBooleanOperatorOptions(o.operatorOptions);
+    checkBooleanOperatorOptions(
+        o.operatorOptions as api.BooleanOperatorOptions);
   }
   buildCounterBooleanPropertyOptions--;
 }
@@ -140,8 +141,8 @@
 
 void checkUnnamed3307(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilter(o[0]);
-  checkFilter(o[1]);
+  checkFilter(o[0] as api.Filter);
+  checkFilter(o[1] as api.Filter);
 }
 
 core.int buildCounterCompositeFilter = 0;
@@ -174,8 +175,8 @@
 
 void checkUnnamed3308(core.List<api.ItemCountByStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkItemCountByStatus(o[0]);
-  checkItemCountByStatus(o[1]);
+  checkItemCountByStatus(o[0] as api.ItemCountByStatus);
+  checkItemCountByStatus(o[1] as api.ItemCountByStatus);
 }
 
 core.int buildCounterCustomerIndexStats = 0;
@@ -193,7 +194,7 @@
 void checkCustomerIndexStats(api.CustomerIndexStats o) {
   buildCounterCustomerIndexStats++;
   if (buildCounterCustomerIndexStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     checkUnnamed3308(o.itemCountByStatus);
   }
   buildCounterCustomerIndexStats--;
@@ -208,8 +209,8 @@
 
 void checkUnnamed3309(core.List<api.QueryCountByStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryCountByStatus(o[0]);
-  checkQueryCountByStatus(o[1]);
+  checkQueryCountByStatus(o[0] as api.QueryCountByStatus);
+  checkQueryCountByStatus(o[1] as api.QueryCountByStatus);
 }
 
 core.int buildCounterCustomerQueryStats = 0;
@@ -227,7 +228,7 @@
 void checkCustomerQueryStats(api.CustomerQueryStats o) {
   buildCounterCustomerQueryStats++;
   if (buildCounterCustomerQueryStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     checkUnnamed3309(o.queryCountByStatus);
   }
   buildCounterCustomerQueryStats--;
@@ -248,7 +249,7 @@
 void checkCustomerSessionStats(api.CustomerSessionStats o) {
   buildCounterCustomerSessionStats++;
   if (buildCounterCustomerSessionStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     unittest.expect(o.searchSessionsCount, unittest.equals('foo'));
   }
   buildCounterCustomerSessionStats--;
@@ -271,7 +272,7 @@
 void checkCustomerUserStats(api.CustomerUserStats o) {
   buildCounterCustomerUserStats++;
   if (buildCounterCustomerUserStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     unittest.expect(o.oneDayActiveUsersCount, unittest.equals('foo'));
     unittest.expect(o.sevenDaysActiveUsersCount, unittest.equals('foo'));
     unittest.expect(o.thirtyDaysActiveUsersCount, unittest.equals('foo'));
@@ -301,8 +302,8 @@
 
 void checkUnnamed3311(core.List<api.GSuitePrincipal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGSuitePrincipal(o[0]);
-  checkGSuitePrincipal(o[1]);
+  checkGSuitePrincipal(o[0] as api.GSuitePrincipal);
+  checkGSuitePrincipal(o[1] as api.GSuitePrincipal);
 }
 
 core.List<core.String> buildUnnamed3312() {
@@ -360,8 +361,8 @@
 
 void checkUnnamed3313(core.List<api.ItemCountByStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkItemCountByStatus(o[0]);
-  checkItemCountByStatus(o[1]);
+  checkItemCountByStatus(o[0] as api.ItemCountByStatus);
+  checkItemCountByStatus(o[1] as api.ItemCountByStatus);
 }
 
 core.int buildCounterDataSourceIndexStats = 0;
@@ -379,7 +380,7 @@
 void checkDataSourceIndexStats(api.DataSourceIndexStats o) {
   buildCounterDataSourceIndexStats++;
   if (buildCounterDataSourceIndexStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     checkUnnamed3313(o.itemCountByStatus);
   }
   buildCounterDataSourceIndexStats--;
@@ -394,8 +395,8 @@
 
 void checkUnnamed3314(core.List<api.FilterOptions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterOptions(o[0]);
-  checkFilterOptions(o[1]);
+  checkFilterOptions(o[0] as api.FilterOptions);
+  checkFilterOptions(o[1] as api.FilterOptions);
 }
 
 core.int buildCounterDataSourceRestriction = 0;
@@ -414,7 +415,7 @@
   buildCounterDataSourceRestriction++;
   if (buildCounterDataSourceRestriction < 3) {
     checkUnnamed3314(o.filterOptions);
-    checkSource(o.source);
+    checkSource(o.source as api.Source);
   }
   buildCounterDataSourceRestriction--;
 }
@@ -479,7 +480,7 @@
 void checkDatePropertyOptions(api.DatePropertyOptions o) {
   buildCounterDatePropertyOptions++;
   if (buildCounterDatePropertyOptions < 3) {
-    checkDateOperatorOptions(o.operatorOptions);
+    checkDateOperatorOptions(o.operatorOptions as api.DateOperatorOptions);
   }
   buildCounterDatePropertyOptions--;
 }
@@ -493,8 +494,8 @@
 
 void checkUnnamed3315(core.List<api.Date> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDate(o[0]);
-  checkDate(o[1]);
+  checkDate(o[0] as api.Date);
+  checkDate(o[1] as api.Date);
 }
 
 core.int buildCounterDateValues = 0;
@@ -552,7 +553,7 @@
   buildCounterDeleteQueueItemsRequest++;
   if (buildCounterDeleteQueueItemsRequest < 3) {
     unittest.expect(o.connectorName, unittest.equals('foo'));
-    checkDebugOptions(o.debugOptions);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
     unittest.expect(o.queue, unittest.equals('foo'));
   }
   buildCounterDeleteQueueItemsRequest--;
@@ -610,7 +611,7 @@
 void checkDoublePropertyOptions(api.DoublePropertyOptions o) {
   buildCounterDoublePropertyOptions++;
   if (buildCounterDoublePropertyOptions < 3) {
-    checkDoubleOperatorOptions(o.operatorOptions);
+    checkDoubleOperatorOptions(o.operatorOptions as api.DoubleOperatorOptions);
   }
   buildCounterDoublePropertyOptions--;
 }
@@ -770,8 +771,8 @@
 
 void checkUnnamed3317(core.List<api.EnumValuePair> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnumValuePair(o[0]);
-  checkEnumValuePair(o[1]);
+  checkEnumValuePair(o[0] as api.EnumValuePair);
+  checkEnumValuePair(o[1] as api.EnumValuePair);
 }
 
 core.int buildCounterEnumPropertyOptions = 0;
@@ -790,7 +791,7 @@
 void checkEnumPropertyOptions(api.EnumPropertyOptions o) {
   buildCounterEnumPropertyOptions++;
   if (buildCounterEnumPropertyOptions < 3) {
-    checkEnumOperatorOptions(o.operatorOptions);
+    checkEnumOperatorOptions(o.operatorOptions as api.EnumOperatorOptions);
     unittest.expect(o.orderedRanking, unittest.equals('foo'));
     checkUnnamed3317(o.possibleValues);
   }
@@ -859,8 +860,8 @@
 
 void checkUnnamed3319(core.List<api.ErrorMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorMessage(o[0]);
-  checkErrorMessage(o[1]);
+  checkErrorMessage(o[0] as api.ErrorMessage);
+  checkErrorMessage(o[1] as api.ErrorMessage);
 }
 
 core.int buildCounterErrorInfo = 0;
@@ -898,7 +899,7 @@
   buildCounterErrorMessage++;
   if (buildCounterErrorMessage < 3) {
     unittest.expect(o.errorMessage, unittest.equals('foo'));
-    checkSource(o.source);
+    checkSource(o.source as api.Source);
   }
   buildCounterErrorMessage--;
 }
@@ -921,7 +922,7 @@
   if (buildCounterFacetBucket < 3) {
     unittest.expect(o.count, unittest.equals(42));
     unittest.expect(o.percentage, unittest.equals(42));
-    checkValue(o.value);
+    checkValue(o.value as api.Value);
   }
   buildCounterFacetBucket--;
 }
@@ -960,8 +961,8 @@
 
 void checkUnnamed3320(core.List<api.FacetBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFacetBucket(o[0]);
-  checkFacetBucket(o[1]);
+  checkFacetBucket(o[0] as api.FacetBucket);
+  checkFacetBucket(o[1] as api.FacetBucket);
 }
 
 core.int buildCounterFacetResult = 0;
@@ -1025,8 +1026,8 @@
 void checkFilter(api.Filter o) {
   buildCounterFilter++;
   if (buildCounterFilter < 3) {
-    checkCompositeFilter(o.compositeFilter);
-    checkValueFilter(o.valueFilter);
+    checkCompositeFilter(o.compositeFilter as api.CompositeFilter);
+    checkValueFilter(o.valueFilter as api.ValueFilter);
   }
   buildCounterFilter--;
 }
@@ -1046,7 +1047,7 @@
 void checkFilterOptions(api.FilterOptions o) {
   buildCounterFilterOptions++;
   if (buildCounterFilterOptions < 3) {
-    checkFilter(o.filter);
+    checkFilter(o.filter as api.Filter);
     unittest.expect(o.objectType, unittest.equals('foo'));
   }
   buildCounterFilterOptions--;
@@ -1105,8 +1106,8 @@
 
 void checkUnnamed3321(core.List<api.CustomerIndexStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomerIndexStats(o[0]);
-  checkCustomerIndexStats(o[1]);
+  checkCustomerIndexStats(o[0] as api.CustomerIndexStats);
+  checkCustomerIndexStats(o[1] as api.CustomerIndexStats);
 }
 
 core.int buildCounterGetCustomerIndexStatsResponse = 0;
@@ -1137,8 +1138,8 @@
 
 void checkUnnamed3322(core.List<api.CustomerQueryStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomerQueryStats(o[0]);
-  checkCustomerQueryStats(o[1]);
+  checkCustomerQueryStats(o[0] as api.CustomerQueryStats);
+  checkCustomerQueryStats(o[1] as api.CustomerQueryStats);
 }
 
 core.int buildCounterGetCustomerQueryStatsResponse = 0;
@@ -1169,8 +1170,8 @@
 
 void checkUnnamed3323(core.List<api.CustomerSessionStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomerSessionStats(o[0]);
-  checkCustomerSessionStats(o[1]);
+  checkCustomerSessionStats(o[0] as api.CustomerSessionStats);
+  checkCustomerSessionStats(o[1] as api.CustomerSessionStats);
 }
 
 core.int buildCounterGetCustomerSessionStatsResponse = 0;
@@ -1202,8 +1203,8 @@
 
 void checkUnnamed3324(core.List<api.CustomerUserStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomerUserStats(o[0]);
-  checkCustomerUserStats(o[1]);
+  checkCustomerUserStats(o[0] as api.CustomerUserStats);
+  checkCustomerUserStats(o[1] as api.CustomerUserStats);
 }
 
 core.int buildCounterGetCustomerUserStatsResponse = 0;
@@ -1234,8 +1235,8 @@
 
 void checkUnnamed3325(core.List<api.DataSourceIndexStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceIndexStats(o[0]);
-  checkDataSourceIndexStats(o[1]);
+  checkDataSourceIndexStats(o[0] as api.DataSourceIndexStats);
+  checkDataSourceIndexStats(o[1] as api.DataSourceIndexStats);
 }
 
 core.int buildCounterGetDataSourceIndexStatsResponse = 0;
@@ -1267,8 +1268,8 @@
 
 void checkUnnamed3326(core.List<api.SearchApplicationQueryStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchApplicationQueryStats(o[0]);
-  checkSearchApplicationQueryStats(o[1]);
+  checkSearchApplicationQueryStats(o[0] as api.SearchApplicationQueryStats);
+  checkSearchApplicationQueryStats(o[1] as api.SearchApplicationQueryStats);
 }
 
 core.int buildCounterGetSearchApplicationQueryStatsResponse = 0;
@@ -1301,8 +1302,8 @@
 
 void checkUnnamed3327(core.List<api.SearchApplicationSessionStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchApplicationSessionStats(o[0]);
-  checkSearchApplicationSessionStats(o[1]);
+  checkSearchApplicationSessionStats(o[0] as api.SearchApplicationSessionStats);
+  checkSearchApplicationSessionStats(o[1] as api.SearchApplicationSessionStats);
 }
 
 core.int buildCounterGetSearchApplicationSessionStatsResponse = 0;
@@ -1335,8 +1336,8 @@
 
 void checkUnnamed3328(core.List<api.SearchApplicationUserStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchApplicationUserStats(o[0]);
-  checkSearchApplicationUserStats(o[1]);
+  checkSearchApplicationUserStats(o[0] as api.SearchApplicationUserStats);
+  checkSearchApplicationUserStats(o[1] as api.SearchApplicationUserStats);
 }
 
 core.int buildCounterGetSearchApplicationUserStatsResponse = 0;
@@ -1394,8 +1395,8 @@
 void checkHtmlPropertyOptions(api.HtmlPropertyOptions o) {
   buildCounterHtmlPropertyOptions++;
   if (buildCounterHtmlPropertyOptions < 3) {
-    checkHtmlOperatorOptions(o.operatorOptions);
-    checkRetrievalImportance(o.retrievalImportance);
+    checkHtmlOperatorOptions(o.operatorOptions as api.HtmlOperatorOptions);
+    checkRetrievalImportance(o.retrievalImportance as api.RetrievalImportance);
   }
   buildCounterHtmlPropertyOptions--;
 }
@@ -1470,9 +1471,9 @@
   buildCounterIndexItemRequest++;
   if (buildCounterIndexItemRequest < 3) {
     unittest.expect(o.connectorName, unittest.equals('foo'));
-    checkDebugOptions(o.debugOptions);
-    checkIndexItemOptions(o.indexItemOptions);
-    checkItem(o.item);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
+    checkIndexItemOptions(o.indexItemOptions as api.IndexItemOptions);
+    checkItem(o.item as api.Item);
     unittest.expect(o.mode, unittest.equals('foo'));
   }
   buildCounterIndexItemRequest--;
@@ -1520,7 +1521,8 @@
   if (buildCounterIntegerPropertyOptions < 3) {
     unittest.expect(o.maximumValue, unittest.equals('foo'));
     unittest.expect(o.minimumValue, unittest.equals('foo'));
-    checkIntegerOperatorOptions(o.operatorOptions);
+    checkIntegerOperatorOptions(
+        o.operatorOptions as api.IntegerOperatorOptions);
     unittest.expect(o.orderedRanking, unittest.equals('foo'));
   }
   buildCounterIntegerPropertyOptions--;
@@ -1575,7 +1577,7 @@
   buildCounterInteraction++;
   if (buildCounterInteraction < 3) {
     unittest.expect(o.interactionTime, unittest.equals('foo'));
-    checkPrincipal(o.principal);
+    checkPrincipal(o.principal as api.Principal);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterInteraction--;
@@ -1604,15 +1606,15 @@
 void checkItem(api.Item o) {
   buildCounterItem++;
   if (buildCounterItem < 3) {
-    checkItemAcl(o.acl);
-    checkItemContent(o.content);
+    checkItemAcl(o.acl as api.ItemAcl);
+    checkItemContent(o.content as api.ItemContent);
     unittest.expect(o.itemType, unittest.equals('foo'));
-    checkItemMetadata(o.metadata);
+    checkItemMetadata(o.metadata as api.ItemMetadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.queue, unittest.equals('foo'));
-    checkItemStatus(o.status);
-    checkItemStructuredData(o.structuredData);
+    checkItemStatus(o.status as api.ItemStatus);
+    checkItemStructuredData(o.structuredData as api.ItemStructuredData);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterItem--;
@@ -1627,8 +1629,8 @@
 
 void checkUnnamed3331(core.List<api.Principal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPrincipal(o[0]);
-  checkPrincipal(o[1]);
+  checkPrincipal(o[0] as api.Principal);
+  checkPrincipal(o[1] as api.Principal);
 }
 
 core.List<api.Principal> buildUnnamed3332() {
@@ -1640,8 +1642,8 @@
 
 void checkUnnamed3332(core.List<api.Principal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPrincipal(o[0]);
-  checkPrincipal(o[1]);
+  checkPrincipal(o[0] as api.Principal);
+  checkPrincipal(o[1] as api.Principal);
 }
 
 core.List<api.Principal> buildUnnamed3333() {
@@ -1653,8 +1655,8 @@
 
 void checkUnnamed3333(core.List<api.Principal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPrincipal(o[0]);
-  checkPrincipal(o[1]);
+  checkPrincipal(o[0] as api.Principal);
+  checkPrincipal(o[1] as api.Principal);
 }
 
 core.int buildCounterItemAcl = 0;
@@ -1701,7 +1703,7 @@
 void checkItemContent(api.ItemContent o) {
   buildCounterItemContent++;
   if (buildCounterItemContent < 3) {
-    checkUploadItemRef(o.contentDataRef);
+    checkUploadItemRef(o.contentDataRef as api.UploadItemRef);
     unittest.expect(o.contentFormat, unittest.equals('foo'));
     unittest.expect(o.hash, unittest.equals('foo'));
     unittest.expect(o.inlineContent, unittest.equals('foo'));
@@ -1739,8 +1741,8 @@
 
 void checkUnnamed3334(core.List<api.Interaction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInteraction(o[0]);
-  checkInteraction(o[1]);
+  checkInteraction(o[0] as api.Interaction);
+  checkInteraction(o[1] as api.Interaction);
 }
 
 core.List<core.String> buildUnnamed3335() {
@@ -1789,7 +1791,8 @@
     checkUnnamed3335(o.keywords);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkSearchQualityMetadata(o.searchQualityMetadata);
+    checkSearchQualityMetadata(
+        o.searchQualityMetadata as api.SearchQualityMetadata);
     unittest.expect(o.sourceRepositoryUrl, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -1806,8 +1809,8 @@
 
 void checkUnnamed3336(core.List<api.ProcessingError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProcessingError(o[0]);
-  checkProcessingError(o[1]);
+  checkProcessingError(o[0] as api.ProcessingError);
+  checkProcessingError(o[1] as api.ProcessingError);
 }
 
 core.List<api.RepositoryError> buildUnnamed3337() {
@@ -1819,8 +1822,8 @@
 
 void checkUnnamed3337(core.List<api.RepositoryError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRepositoryError(o[0]);
-  checkRepositoryError(o[1]);
+  checkRepositoryError(o[0] as api.RepositoryError);
+  checkRepositoryError(o[1] as api.RepositoryError);
 }
 
 core.int buildCounterItemStatus = 0;
@@ -1862,7 +1865,7 @@
   buildCounterItemStructuredData++;
   if (buildCounterItemStructuredData < 3) {
     unittest.expect(o.hash, unittest.equals('foo'));
-    checkStructuredDataObject(o.object);
+    checkStructuredDataObject(o.object as api.StructuredDataObject);
   }
   buildCounterItemStructuredData--;
 }
@@ -1876,8 +1879,8 @@
 
 void checkUnnamed3338(core.List<api.DataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSource(o[0]);
-  checkDataSource(o[1]);
+  checkDataSource(o[0] as api.DataSource);
+  checkDataSource(o[1] as api.DataSource);
 }
 
 core.int buildCounterListDataSourceResponse = 0;
@@ -1946,8 +1949,8 @@
 
 void checkUnnamed3340(core.List<api.Item> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkItem(o[0]);
-  checkItem(o[1]);
+  checkItem(o[0] as api.Item);
+  checkItem(o[1] as api.Item);
 }
 
 core.int buildCounterListItemsResponse = 0;
@@ -1980,8 +1983,8 @@
 
 void checkUnnamed3341(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -2014,8 +2017,8 @@
 
 void checkUnnamed3342(core.List<api.QuerySource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuerySource(o[0]);
-  checkQuerySource(o[1]);
+  checkQuerySource(o[0] as api.QuerySource);
+  checkQuerySource(o[1] as api.QuerySource);
 }
 
 core.int buildCounterListQuerySourcesResponse = 0;
@@ -2048,8 +2051,8 @@
 
 void checkUnnamed3343(core.List<api.SearchApplication> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchApplication(o[0]);
-  checkSearchApplication(o[1]);
+  checkSearchApplication(o[0] as api.SearchApplication);
+  checkSearchApplication(o[1] as api.SearchApplication);
 }
 
 core.int buildCounterListSearchApplicationsResponse = 0;
@@ -2082,8 +2085,8 @@
 
 void checkUnnamed3344(core.List<api.UnmappedIdentity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnmappedIdentity(o[0]);
-  checkUnmappedIdentity(o[1]);
+  checkUnmappedIdentity(o[0] as api.UnmappedIdentity);
+  checkUnmappedIdentity(o[1] as api.UnmappedIdentity);
 }
 
 core.int buildCounterListUnmappedIdentitiesResponse = 0;
@@ -2156,8 +2159,8 @@
 
 void checkUnnamed3345(core.List<api.NamedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedProperty(o[0]);
-  checkNamedProperty(o[1]);
+  checkNamedProperty(o[0] as api.NamedProperty);
+  checkNamedProperty(o[1] as api.NamedProperty);
 }
 
 core.int buildCounterMetadata = 0;
@@ -2182,12 +2185,12 @@
   buildCounterMetadata++;
   if (buildCounterMetadata < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkResultDisplayMetadata(o.displayOptions);
+    checkResultDisplayMetadata(o.displayOptions as api.ResultDisplayMetadata);
     checkUnnamed3345(o.fields);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.objectType, unittest.equals('foo'));
-    checkPerson(o.owner);
-    checkSource(o.source);
+    checkPerson(o.owner as api.Person);
+    checkSource(o.source as api.Source);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterMetadata--;
@@ -2202,8 +2205,8 @@
 
 void checkUnnamed3346(core.List<api.DisplayedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisplayedProperty(o[0]);
-  checkDisplayedProperty(o[1]);
+  checkDisplayedProperty(o[0] as api.DisplayedProperty);
+  checkDisplayedProperty(o[1] as api.DisplayedProperty);
 }
 
 core.int buildCounterMetaline = 0;
@@ -2268,15 +2271,15 @@
   buildCounterNamedProperty++;
   if (buildCounterNamedProperty < 3) {
     unittest.expect(o.booleanValue, unittest.isTrue);
-    checkDateValues(o.dateValues);
-    checkDoubleValues(o.doubleValues);
-    checkEnumValues(o.enumValues);
-    checkHtmlValues(o.htmlValues);
-    checkIntegerValues(o.integerValues);
+    checkDateValues(o.dateValues as api.DateValues);
+    checkDoubleValues(o.doubleValues as api.DoubleValues);
+    checkEnumValues(o.enumValues as api.EnumValues);
+    checkHtmlValues(o.htmlValues as api.HtmlValues);
+    checkIntegerValues(o.integerValues as api.IntegerValues);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkObjectValues(o.objectValues);
-    checkTextValues(o.textValues);
-    checkTimestampValues(o.timestampValues);
+    checkObjectValues(o.objectValues as api.ObjectValues);
+    checkTextValues(o.textValues as api.TextValues);
+    checkTimestampValues(o.timestampValues as api.TimestampValues);
   }
   buildCounterNamedProperty--;
 }
@@ -2290,8 +2293,8 @@
 
 void checkUnnamed3347(core.List<api.PropertyDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPropertyDefinition(o[0]);
-  checkPropertyDefinition(o[1]);
+  checkPropertyDefinition(o[0] as api.PropertyDefinition);
+  checkPropertyDefinition(o[1] as api.PropertyDefinition);
 }
 
 core.int buildCounterObjectDefinition = 0;
@@ -2311,7 +2314,7 @@
   buildCounterObjectDefinition++;
   if (buildCounterObjectDefinition < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkObjectOptions(o.options);
+    checkObjectOptions(o.options as api.ObjectOptions);
     checkUnnamed3347(o.propertyDefinitions);
   }
   buildCounterObjectDefinition--;
@@ -2326,8 +2329,8 @@
 
 void checkUnnamed3348(core.List<api.Metaline> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetaline(o[0]);
-  checkMetaline(o[1]);
+  checkMetaline(o[0] as api.Metaline);
+  checkMetaline(o[1] as api.Metaline);
 }
 
 core.int buildCounterObjectDisplayOptions = 0;
@@ -2366,8 +2369,8 @@
 void checkObjectOptions(api.ObjectOptions o) {
   buildCounterObjectOptions++;
   if (buildCounterObjectOptions < 3) {
-    checkObjectDisplayOptions(o.displayOptions);
-    checkFreshnessOptions(o.freshnessOptions);
+    checkObjectDisplayOptions(o.displayOptions as api.ObjectDisplayOptions);
+    checkFreshnessOptions(o.freshnessOptions as api.FreshnessOptions);
   }
   buildCounterObjectOptions--;
 }
@@ -2381,8 +2384,8 @@
 
 void checkUnnamed3349(core.List<api.PropertyDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPropertyDefinition(o[0]);
-  checkPropertyDefinition(o[1]);
+  checkPropertyDefinition(o[0] as api.PropertyDefinition);
+  checkPropertyDefinition(o[1] as api.PropertyDefinition);
 }
 
 core.int buildCounterObjectPropertyOptions = 0;
@@ -2413,8 +2416,8 @@
 
 void checkUnnamed3350(core.List<api.StructuredDataObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuredDataObject(o[0]);
-  checkStructuredDataObject(o[1]);
+  checkStructuredDataObject(o[0] as api.StructuredDataObject);
+  checkStructuredDataObject(o[1] as api.StructuredDataObject);
 }
 
 core.int buildCounterObjectValues = 0;
@@ -2513,7 +2516,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3351(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3352(o.response);
@@ -2535,7 +2538,7 @@
 void checkPeopleSuggestion(api.PeopleSuggestion o) {
   buildCounterPeopleSuggestion++;
   if (buildCounterPeopleSuggestion < 3) {
-    checkPerson(o.person);
+    checkPerson(o.person as api.Person);
   }
   buildCounterPeopleSuggestion--;
 }
@@ -2549,8 +2552,8 @@
 
 void checkUnnamed3353(core.List<api.EmailAddress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEmailAddress(o[0]);
-  checkEmailAddress(o[1]);
+  checkEmailAddress(o[0] as api.EmailAddress);
+  checkEmailAddress(o[1] as api.EmailAddress);
 }
 
 core.List<api.Name> buildUnnamed3354() {
@@ -2562,8 +2565,8 @@
 
 void checkUnnamed3354(core.List<api.Name> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkName(o[0]);
-  checkName(o[1]);
+  checkName(o[0] as api.Name);
+  checkName(o[1] as api.Name);
 }
 
 core.List<api.Photo> buildUnnamed3355() {
@@ -2575,8 +2578,8 @@
 
 void checkUnnamed3355(core.List<api.Photo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPhoto(o[0]);
-  checkPhoto(o[1]);
+  checkPhoto(o[0] as api.Photo);
+  checkPhoto(o[1] as api.Photo);
 }
 
 core.int buildCounterPerson = 0;
@@ -2657,7 +2660,7 @@
   buildCounterPollItemsRequest++;
   if (buildCounterPollItemsRequest < 3) {
     unittest.expect(o.connectorName, unittest.equals('foo'));
-    checkDebugOptions(o.debugOptions);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.queue, unittest.equals('foo'));
     checkUnnamed3356(o.statusCodes);
@@ -2674,8 +2677,8 @@
 
 void checkUnnamed3357(core.List<api.Item> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkItem(o[0]);
-  checkItem(o[1]);
+  checkItem(o[0] as api.Item);
+  checkItem(o[1] as api.Item);
 }
 
 core.int buildCounterPollItemsResponse = 0;
@@ -2714,7 +2717,7 @@
   buildCounterPrincipal++;
   if (buildCounterPrincipal < 3) {
     unittest.expect(o.groupResourceName, unittest.equals('foo'));
-    checkGSuitePrincipal(o.gsuitePrincipal);
+    checkGSuitePrincipal(o.gsuitePrincipal as api.GSuitePrincipal);
     unittest.expect(o.userResourceName, unittest.equals('foo'));
   }
   buildCounterPrincipal--;
@@ -2729,8 +2732,8 @@
 
 void checkUnnamed3358(core.List<api.FieldViolation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFieldViolation(o[0]);
-  checkFieldViolation(o[1]);
+  checkFieldViolation(o[0] as api.FieldViolation);
+  checkFieldViolation(o[1] as api.FieldViolation);
 }
 
 core.int buildCounterProcessingError = 0;
@@ -2786,13 +2789,16 @@
 void checkPropertyDefinition(api.PropertyDefinition o) {
   buildCounterPropertyDefinition++;
   if (buildCounterPropertyDefinition < 3) {
-    checkBooleanPropertyOptions(o.booleanPropertyOptions);
-    checkDatePropertyOptions(o.datePropertyOptions);
-    checkPropertyDisplayOptions(o.displayOptions);
-    checkDoublePropertyOptions(o.doublePropertyOptions);
-    checkEnumPropertyOptions(o.enumPropertyOptions);
-    checkHtmlPropertyOptions(o.htmlPropertyOptions);
-    checkIntegerPropertyOptions(o.integerPropertyOptions);
+    checkBooleanPropertyOptions(
+        o.booleanPropertyOptions as api.BooleanPropertyOptions);
+    checkDatePropertyOptions(o.datePropertyOptions as api.DatePropertyOptions);
+    checkPropertyDisplayOptions(o.displayOptions as api.PropertyDisplayOptions);
+    checkDoublePropertyOptions(
+        o.doublePropertyOptions as api.DoublePropertyOptions);
+    checkEnumPropertyOptions(o.enumPropertyOptions as api.EnumPropertyOptions);
+    checkHtmlPropertyOptions(o.htmlPropertyOptions as api.HtmlPropertyOptions);
+    checkIntegerPropertyOptions(
+        o.integerPropertyOptions as api.IntegerPropertyOptions);
     unittest.expect(o.isFacetable, unittest.isTrue);
     unittest.expect(o.isRepeatable, unittest.isTrue);
     unittest.expect(o.isReturnable, unittest.isTrue);
@@ -2800,9 +2806,11 @@
     unittest.expect(o.isSuggestable, unittest.isTrue);
     unittest.expect(o.isWildcardSearchable, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkObjectPropertyOptions(o.objectPropertyOptions);
-    checkTextPropertyOptions(o.textPropertyOptions);
-    checkTimestampPropertyOptions(o.timestampPropertyOptions);
+    checkObjectPropertyOptions(
+        o.objectPropertyOptions as api.ObjectPropertyOptions);
+    checkTextPropertyOptions(o.textPropertyOptions as api.TextPropertyOptions);
+    checkTimestampPropertyOptions(
+        o.timestampPropertyOptions as api.TimestampPropertyOptions);
   }
   buildCounterPropertyDefinition--;
 }
@@ -2850,7 +2858,7 @@
     unittest.expect(o.metadataHash, unittest.equals('foo'));
     unittest.expect(o.payload, unittest.equals('foo'));
     unittest.expect(o.queue, unittest.equals('foo'));
-    checkRepositoryError(o.repositoryError);
+    checkRepositoryError(o.repositoryError as api.RepositoryError);
     unittest.expect(o.structuredDataHash, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -2874,8 +2882,8 @@
   buildCounterPushItemRequest++;
   if (buildCounterPushItemRequest < 3) {
     unittest.expect(o.connectorName, unittest.equals('foo'));
-    checkDebugOptions(o.debugOptions);
-    checkPushItem(o.item);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
+    checkPushItem(o.item as api.PushItem);
   }
   buildCounterPushItemRequest--;
 }
@@ -3027,8 +3035,8 @@
 
 void checkUnnamed3360(core.List<api.QueryOperator> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryOperator(o[0]);
-  checkQueryOperator(o[1]);
+  checkQueryOperator(o[0] as api.QueryOperator);
+  checkQueryOperator(o[1] as api.QueryOperator);
 }
 
 core.int buildCounterQuerySource = 0;
@@ -3051,7 +3059,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed3360(o.operators);
     unittest.expect(o.shortName, unittest.equals('foo'));
-    checkSource(o.source);
+    checkSource(o.source as api.Source);
   }
   buildCounterQuerySource--;
 }
@@ -3111,7 +3119,7 @@
 void checkRequestOptions(api.RequestOptions o) {
   buildCounterRequestOptions++;
   if (buildCounterRequestOptions < 3) {
-    checkDebugOptions(o.debugOptions);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.searchApplicationId, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
@@ -3133,7 +3141,7 @@
 void checkResetSearchApplicationRequest(api.ResetSearchApplicationRequest o) {
   buildCounterResetSearchApplicationRequest++;
   if (buildCounterResetSearchApplicationRequest < 3) {
-    checkDebugOptions(o.debugOptions);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
   }
   buildCounterResetSearchApplicationRequest--;
 }
@@ -3175,10 +3183,14 @@
 void checkRestrictItem(api.RestrictItem o) {
   buildCounterRestrictItem++;
   if (buildCounterRestrictItem < 3) {
-    checkDriveFollowUpRestrict(o.driveFollowUpRestrict);
-    checkDriveLocationRestrict(o.driveLocationRestrict);
-    checkDriveMimeTypeRestrict(o.driveMimeTypeRestrict);
-    checkDriveTimeSpanRestrict(o.driveTimeSpanRestrict);
+    checkDriveFollowUpRestrict(
+        o.driveFollowUpRestrict as api.DriveFollowUpRestrict);
+    checkDriveLocationRestrict(
+        o.driveLocationRestrict as api.DriveLocationRestrict);
+    checkDriveMimeTypeRestrict(
+        o.driveMimeTypeRestrict as api.DriveMimeTypeRestrict);
+    checkDriveTimeSpanRestrict(
+        o.driveTimeSpanRestrict as api.DriveTimeSpanRestrict);
     unittest.expect(o.searchOperator, unittest.equals('foo'));
   }
   buildCounterRestrictItem--;
@@ -3193,8 +3205,8 @@
 
 void checkUnnamed3361(core.List<api.SourceResultCount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSourceResultCount(o[0]);
-  checkSourceResultCount(o[1]);
+  checkSourceResultCount(o[0] as api.SourceResultCount);
+  checkSourceResultCount(o[1] as api.SourceResultCount);
 }
 
 core.int buildCounterResultCounts = 0;
@@ -3253,7 +3265,7 @@
   if (buildCounterResultDisplayField < 3) {
     unittest.expect(o.label, unittest.equals('foo'));
     unittest.expect(o.operatorName, unittest.equals('foo'));
-    checkNamedProperty(o.property);
+    checkNamedProperty(o.property as api.NamedProperty);
   }
   buildCounterResultDisplayField--;
 }
@@ -3267,8 +3279,8 @@
 
 void checkUnnamed3362(core.List<api.ResultDisplayField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResultDisplayField(o[0]);
-  checkResultDisplayField(o[1]);
+  checkResultDisplayField(o[0] as api.ResultDisplayField);
+  checkResultDisplayField(o[1] as api.ResultDisplayField);
 }
 
 core.int buildCounterResultDisplayLine = 0;
@@ -3299,8 +3311,8 @@
 
 void checkUnnamed3363(core.List<api.ResultDisplayLine> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResultDisplayLine(o[0]);
-  checkResultDisplayLine(o[1]);
+  checkResultDisplayLine(o[0] as api.ResultDisplayLine);
+  checkResultDisplayLine(o[1] as api.ResultDisplayLine);
 }
 
 core.int buildCounterResultDisplayMetadata = 0;
@@ -3352,8 +3364,8 @@
 
 void checkUnnamed3364(core.List<api.ObjectDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkObjectDefinition(o[0]);
-  checkObjectDefinition(o[1]);
+  checkObjectDefinition(o[0] as api.ObjectDefinition);
+  checkObjectDefinition(o[1] as api.ObjectDefinition);
 }
 
 core.List<core.String> buildUnnamed3365() {
@@ -3420,8 +3432,8 @@
 
 void checkUnnamed3366(core.List<api.DataSourceRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceRestriction(o[0]);
-  checkDataSourceRestriction(o[1]);
+  checkDataSourceRestriction(o[0] as api.DataSourceRestriction);
+  checkDataSourceRestriction(o[1] as api.DataSourceRestriction);
 }
 
 core.List<api.FacetOptions> buildUnnamed3367() {
@@ -3433,8 +3445,8 @@
 
 void checkUnnamed3367(core.List<api.FacetOptions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFacetOptions(o[0]);
-  checkFacetOptions(o[1]);
+  checkFacetOptions(o[0] as api.FacetOptions);
+  checkFacetOptions(o[1] as api.FacetOptions);
 }
 
 core.List<core.String> buildUnnamed3368() {
@@ -3459,8 +3471,8 @@
 
 void checkUnnamed3369(core.List<api.SourceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSourceConfig(o[0]);
-  checkSourceConfig(o[1]);
+  checkSourceConfig(o[0] as api.SourceConfig);
+  checkSourceConfig(o[1] as api.SourceConfig);
 }
 
 core.int buildCounterSearchApplication = 0;
@@ -3486,11 +3498,11 @@
   if (buildCounterSearchApplication < 3) {
     checkUnnamed3366(o.dataSourceRestrictions);
     checkUnnamed3367(o.defaultFacetOptions);
-    checkSortOptions(o.defaultSortOptions);
+    checkSortOptions(o.defaultSortOptions as api.SortOptions);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3368(o.operationIds);
-    checkScoringConfig(o.scoringConfig);
+    checkScoringConfig(o.scoringConfig as api.ScoringConfig);
     checkUnnamed3369(o.sourceConfig);
   }
   buildCounterSearchApplication--;
@@ -3505,8 +3517,8 @@
 
 void checkUnnamed3370(core.List<api.QueryCountByStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryCountByStatus(o[0]);
-  checkQueryCountByStatus(o[1]);
+  checkQueryCountByStatus(o[0] as api.QueryCountByStatus);
+  checkQueryCountByStatus(o[1] as api.QueryCountByStatus);
 }
 
 core.int buildCounterSearchApplicationQueryStats = 0;
@@ -3524,7 +3536,7 @@
 void checkSearchApplicationQueryStats(api.SearchApplicationQueryStats o) {
   buildCounterSearchApplicationQueryStats++;
   if (buildCounterSearchApplicationQueryStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     checkUnnamed3370(o.queryCountByStatus);
   }
   buildCounterSearchApplicationQueryStats--;
@@ -3545,7 +3557,7 @@
 void checkSearchApplicationSessionStats(api.SearchApplicationSessionStats o) {
   buildCounterSearchApplicationSessionStats++;
   if (buildCounterSearchApplicationSessionStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     unittest.expect(o.searchSessionsCount, unittest.equals('foo'));
   }
   buildCounterSearchApplicationSessionStats--;
@@ -3568,7 +3580,7 @@
 void checkSearchApplicationUserStats(api.SearchApplicationUserStats o) {
   buildCounterSearchApplicationUserStats++;
   if (buildCounterSearchApplicationUserStats < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     unittest.expect(o.oneDayActiveUsersCount, unittest.equals('foo'));
     unittest.expect(o.sevenDaysActiveUsersCount, unittest.equals('foo'));
     unittest.expect(o.thirtyDaysActiveUsersCount, unittest.equals('foo'));
@@ -3592,7 +3604,7 @@
 void checkSearchItemsByViewUrlRequest(api.SearchItemsByViewUrlRequest o) {
   buildCounterSearchItemsByViewUrlRequest++;
   if (buildCounterSearchItemsByViewUrlRequest < 3) {
-    checkDebugOptions(o.debugOptions);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.viewUrl, unittest.equals('foo'));
   }
@@ -3608,8 +3620,8 @@
 
 void checkUnnamed3371(core.List<api.Item> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkItem(o[0]);
-  checkItem(o[1]);
+  checkItem(o[0] as api.Item);
+  checkItem(o[1] as api.Item);
 }
 
 core.int buildCounterSearchItemsByViewUrlResponse = 0;
@@ -3661,8 +3673,8 @@
 
 void checkUnnamed3372(core.List<api.DataSourceRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceRestriction(o[0]);
-  checkDataSourceRestriction(o[1]);
+  checkDataSourceRestriction(o[0] as api.DataSourceRestriction);
+  checkDataSourceRestriction(o[1] as api.DataSourceRestriction);
 }
 
 core.List<api.FacetOptions> buildUnnamed3373() {
@@ -3674,8 +3686,8 @@
 
 void checkUnnamed3373(core.List<api.FacetOptions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFacetOptions(o[0]);
-  checkFacetOptions(o[1]);
+  checkFacetOptions(o[0] as api.FacetOptions);
+  checkFacetOptions(o[1] as api.FacetOptions);
 }
 
 core.int buildCounterSearchRequest = 0;
@@ -3703,9 +3715,10 @@
     checkUnnamed3373(o.facetOptions);
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.query, unittest.equals('foo'));
-    checkQueryInterpretationOptions(o.queryInterpretationOptions);
-    checkRequestOptions(o.requestOptions);
-    checkSortOptions(o.sortOptions);
+    checkQueryInterpretationOptions(
+        o.queryInterpretationOptions as api.QueryInterpretationOptions);
+    checkRequestOptions(o.requestOptions as api.RequestOptions);
+    checkSortOptions(o.sortOptions as api.SortOptions);
     unittest.expect(o.start, unittest.equals(42));
   }
   buildCounterSearchRequest--;
@@ -3720,8 +3733,8 @@
 
 void checkUnnamed3374(core.List<api.FacetResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFacetResult(o[0]);
-  checkFacetResult(o[1]);
+  checkFacetResult(o[0] as api.FacetResult);
+  checkFacetResult(o[1] as api.FacetResult);
 }
 
 core.List<api.SearchResult> buildUnnamed3375() {
@@ -3733,8 +3746,8 @@
 
 void checkUnnamed3375(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchResult(o[0]);
-  checkSearchResult(o[1]);
+  checkSearchResult(o[0] as api.SearchResult);
+  checkSearchResult(o[1] as api.SearchResult);
 }
 
 core.List<api.SpellResult> buildUnnamed3376() {
@@ -3746,8 +3759,8 @@
 
 void checkUnnamed3376(core.List<api.SpellResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSpellResult(o[0]);
-  checkSpellResult(o[1]);
+  checkSpellResult(o[0] as api.SpellResult);
+  checkSpellResult(o[1] as api.SpellResult);
 }
 
 core.List<api.StructuredResult> buildUnnamed3377() {
@@ -3759,8 +3772,8 @@
 
 void checkUnnamed3377(core.List<api.StructuredResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuredResult(o[0]);
-  checkStructuredResult(o[1]);
+  checkStructuredResult(o[0] as api.StructuredResult);
+  checkStructuredResult(o[1] as api.StructuredResult);
 }
 
 core.int buildCounterSearchResponse = 0;
@@ -3787,14 +3800,14 @@
 void checkSearchResponse(api.SearchResponse o) {
   buildCounterSearchResponse++;
   if (buildCounterSearchResponse < 3) {
-    checkResponseDebugInfo(o.debugInfo);
-    checkErrorInfo(o.errorInfo);
+    checkResponseDebugInfo(o.debugInfo as api.ResponseDebugInfo);
+    checkErrorInfo(o.errorInfo as api.ErrorInfo);
     checkUnnamed3374(o.facetResults);
     unittest.expect(o.hasMoreResults, unittest.isTrue);
-    checkQueryInterpretation(o.queryInterpretation);
+    checkQueryInterpretation(o.queryInterpretation as api.QueryInterpretation);
     unittest.expect(o.resultCountEstimate, unittest.equals('foo'));
     unittest.expect(o.resultCountExact, unittest.equals('foo'));
-    checkResultCounts(o.resultCounts);
+    checkResultCounts(o.resultCounts as api.ResultCounts);
     checkUnnamed3375(o.results);
     checkUnnamed3376(o.spellResults);
     checkUnnamed3377(o.structuredResults);
@@ -3811,8 +3824,8 @@
 
 void checkUnnamed3378(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchResult(o[0]);
-  checkSearchResult(o[1]);
+  checkSearchResult(o[0] as api.SearchResult);
+  checkSearchResult(o[1] as api.SearchResult);
 }
 
 core.int buildCounterSearchResult = 0;
@@ -3835,9 +3848,9 @@
   buildCounterSearchResult++;
   if (buildCounterSearchResult < 3) {
     checkUnnamed3378(o.clusteredResults);
-    checkResultDebugInfo(o.debugInfo);
-    checkMetadata(o.metadata);
-    checkSnippet(o.snippet);
+    checkResultDebugInfo(o.debugInfo as api.ResultDebugInfo);
+    checkMetadata(o.metadata as api.Metadata);
+    checkSnippet(o.snippet as api.Snippet);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
   }
@@ -3853,8 +3866,8 @@
 
 void checkUnnamed3379(core.List<api.MatchRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMatchRange(o[0]);
-  checkMatchRange(o[1]);
+  checkMatchRange(o[0] as api.MatchRange);
+  checkMatchRange(o[1] as api.MatchRange);
 }
 
 core.int buildCounterSnippet = 0;
@@ -3936,9 +3949,9 @@
 void checkSourceConfig(api.SourceConfig o) {
   buildCounterSourceConfig++;
   if (buildCounterSourceConfig < 3) {
-    checkSourceCrowdingConfig(o.crowdingConfig);
-    checkSourceScoringConfig(o.scoringConfig);
-    checkSource(o.source);
+    checkSourceCrowdingConfig(o.crowdingConfig as api.SourceCrowdingConfig);
+    checkSourceScoringConfig(o.scoringConfig as api.SourceScoringConfig);
+    checkSource(o.source as api.Source);
   }
   buildCounterSourceConfig--;
 }
@@ -3984,7 +3997,7 @@
     unittest.expect(o.hasMoreResults, unittest.isTrue);
     unittest.expect(o.resultCountEstimate, unittest.equals('foo'));
     unittest.expect(o.resultCountExact, unittest.equals('foo'));
-    checkSource(o.source);
+    checkSource(o.source as api.Source);
   }
   buildCounterSourceResultCount--;
 }
@@ -4043,7 +4056,7 @@
   buildCounterStartUploadItemRequest++;
   if (buildCounterStartUploadItemRequest < 3) {
     unittest.expect(o.connectorName, unittest.equals('foo'));
-    checkDebugOptions(o.debugOptions);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
   }
   buildCounterStartUploadItemRequest--;
 }
@@ -4122,8 +4135,8 @@
 
 void checkUnnamed3382(core.List<api.NamedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedProperty(o[0]);
-  checkNamedProperty(o[1]);
+  checkNamedProperty(o[0] as api.NamedProperty);
+  checkNamedProperty(o[1] as api.NamedProperty);
 }
 
 core.int buildCounterStructuredDataObject = 0;
@@ -4159,7 +4172,7 @@
 void checkStructuredResult(api.StructuredResult o) {
   buildCounterStructuredResult++;
   if (buildCounterStructuredResult < 3) {
-    checkPerson(o.person);
+    checkPerson(o.person as api.Person);
   }
   buildCounterStructuredResult--;
 }
@@ -4173,8 +4186,8 @@
 
 void checkUnnamed3383(core.List<api.DataSourceRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceRestriction(o[0]);
-  checkDataSourceRestriction(o[1]);
+  checkDataSourceRestriction(o[0] as api.DataSourceRestriction);
+  checkDataSourceRestriction(o[1] as api.DataSourceRestriction);
 }
 
 core.int buildCounterSuggestRequest = 0;
@@ -4195,7 +4208,7 @@
   if (buildCounterSuggestRequest < 3) {
     checkUnnamed3383(o.dataSourceRestrictions);
     unittest.expect(o.query, unittest.equals('foo'));
-    checkRequestOptions(o.requestOptions);
+    checkRequestOptions(o.requestOptions as api.RequestOptions);
   }
   buildCounterSuggestRequest--;
 }
@@ -4209,8 +4222,8 @@
 
 void checkUnnamed3384(core.List<api.SuggestResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestResult(o[0]);
-  checkSuggestResult(o[1]);
+  checkSuggestResult(o[0] as api.SuggestResult);
+  checkSuggestResult(o[1] as api.SuggestResult);
 }
 
 core.int buildCounterSuggestResponse = 0;
@@ -4249,9 +4262,9 @@
 void checkSuggestResult(api.SuggestResult o) {
   buildCounterSuggestResult++;
   if (buildCounterSuggestResult < 3) {
-    checkPeopleSuggestion(o.peopleSuggestion);
-    checkQuerySuggestion(o.querySuggestion);
-    checkSource(o.source);
+    checkPeopleSuggestion(o.peopleSuggestion as api.PeopleSuggestion);
+    checkQuerySuggestion(o.querySuggestion as api.QuerySuggestion);
+    checkSource(o.source as api.Source);
     unittest.expect(o.suggestedQuery, unittest.equals('foo'));
   }
   buildCounterSuggestResult--;
@@ -4293,8 +4306,8 @@
 void checkTextPropertyOptions(api.TextPropertyOptions o) {
   buildCounterTextPropertyOptions++;
   if (buildCounterTextPropertyOptions < 3) {
-    checkTextOperatorOptions(o.operatorOptions);
-    checkRetrievalImportance(o.retrievalImportance);
+    checkTextOperatorOptions(o.operatorOptions as api.TextOperatorOptions);
+    checkRetrievalImportance(o.retrievalImportance as api.RetrievalImportance);
   }
   buildCounterTextPropertyOptions--;
 }
@@ -4368,7 +4381,8 @@
 void checkTimestampPropertyOptions(api.TimestampPropertyOptions o) {
   buildCounterTimestampPropertyOptions++;
   if (buildCounterTimestampPropertyOptions < 3) {
-    checkTimestampOperatorOptions(o.operatorOptions);
+    checkTimestampOperatorOptions(
+        o.operatorOptions as api.TimestampOperatorOptions);
   }
   buildCounterTimestampPropertyOptions--;
 }
@@ -4420,7 +4434,7 @@
 void checkUnmappedIdentity(api.UnmappedIdentity o) {
   buildCounterUnmappedIdentity++;
   if (buildCounterUnmappedIdentity < 3) {
-    checkPrincipal(o.externalIdentity);
+    checkPrincipal(o.externalIdentity as api.Principal);
     unittest.expect(o.resolutionStatusCode, unittest.equals('foo'));
   }
   buildCounterUnmappedIdentity--;
@@ -4443,7 +4457,7 @@
   buildCounterUnreserveItemsRequest++;
   if (buildCounterUnreserveItemsRequest < 3) {
     unittest.expect(o.connectorName, unittest.equals('foo'));
-    checkDebugOptions(o.debugOptions);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
     unittest.expect(o.queue, unittest.equals('foo'));
   }
   buildCounterUnreserveItemsRequest--;
@@ -4464,8 +4478,8 @@
 void checkUpdateDataSourceRequest(api.UpdateDataSourceRequest o) {
   buildCounterUpdateDataSourceRequest++;
   if (buildCounterUpdateDataSourceRequest < 3) {
-    checkDebugOptions(o.debugOptions);
-    checkDataSource(o.source);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
+    checkDataSource(o.source as api.DataSource);
   }
   buildCounterUpdateDataSourceRequest--;
 }
@@ -4486,8 +4500,8 @@
 void checkUpdateSchemaRequest(api.UpdateSchemaRequest o) {
   buildCounterUpdateSchemaRequest++;
   if (buildCounterUpdateSchemaRequest < 3) {
-    checkDebugOptions(o.debugOptions);
-    checkSchema(o.schema);
+    checkDebugOptions(o.debugOptions as api.DebugOptions);
+    checkSchema(o.schema as api.Schema);
     unittest.expect(o.validateOnly, unittest.isTrue);
   }
   buildCounterUpdateSchemaRequest--;
@@ -4532,7 +4546,7 @@
   buildCounterValue++;
   if (buildCounterValue < 3) {
     unittest.expect(o.booleanValue, unittest.isTrue);
-    checkDate(o.dateValue);
+    checkDate(o.dateValue as api.Date);
     unittest.expect(o.doubleValue, unittest.equals(42.0));
     unittest.expect(o.integerValue, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
@@ -4557,7 +4571,7 @@
   buildCounterValueFilter++;
   if (buildCounterValueFilter < 3) {
     unittest.expect(o.operatorName, unittest.equals('foo'));
-    checkValue(o.value);
+    checkValue(o.value as api.Value);
   }
   buildCounterValueFilter--;
 }
@@ -4567,7 +4581,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooleanOperatorOptions();
       var od = api.BooleanOperatorOptions.fromJson(o.toJson());
-      checkBooleanOperatorOptions(od);
+      checkBooleanOperatorOptions(od as api.BooleanOperatorOptions);
     });
   });
 
@@ -4575,7 +4589,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooleanPropertyOptions();
       var od = api.BooleanPropertyOptions.fromJson(o.toJson());
-      checkBooleanPropertyOptions(od);
+      checkBooleanPropertyOptions(od as api.BooleanPropertyOptions);
     });
   });
 
@@ -4583,7 +4597,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckAccessResponse();
       var od = api.CheckAccessResponse.fromJson(o.toJson());
-      checkCheckAccessResponse(od);
+      checkCheckAccessResponse(od as api.CheckAccessResponse);
     });
   });
 
@@ -4591,7 +4605,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompositeFilter();
       var od = api.CompositeFilter.fromJson(o.toJson());
-      checkCompositeFilter(od);
+      checkCompositeFilter(od as api.CompositeFilter);
     });
   });
 
@@ -4599,7 +4613,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerIndexStats();
       var od = api.CustomerIndexStats.fromJson(o.toJson());
-      checkCustomerIndexStats(od);
+      checkCustomerIndexStats(od as api.CustomerIndexStats);
     });
   });
 
@@ -4607,7 +4621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerQueryStats();
       var od = api.CustomerQueryStats.fromJson(o.toJson());
-      checkCustomerQueryStats(od);
+      checkCustomerQueryStats(od as api.CustomerQueryStats);
     });
   });
 
@@ -4615,7 +4629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerSessionStats();
       var od = api.CustomerSessionStats.fromJson(o.toJson());
-      checkCustomerSessionStats(od);
+      checkCustomerSessionStats(od as api.CustomerSessionStats);
     });
   });
 
@@ -4623,7 +4637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerUserStats();
       var od = api.CustomerUserStats.fromJson(o.toJson());
-      checkCustomerUserStats(od);
+      checkCustomerUserStats(od as api.CustomerUserStats);
     });
   });
 
@@ -4631,7 +4645,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSource();
       var od = api.DataSource.fromJson(o.toJson());
-      checkDataSource(od);
+      checkDataSource(od as api.DataSource);
     });
   });
 
@@ -4639,7 +4653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceIndexStats();
       var od = api.DataSourceIndexStats.fromJson(o.toJson());
-      checkDataSourceIndexStats(od);
+      checkDataSourceIndexStats(od as api.DataSourceIndexStats);
     });
   });
 
@@ -4647,7 +4661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceRestriction();
       var od = api.DataSourceRestriction.fromJson(o.toJson());
-      checkDataSourceRestriction(od);
+      checkDataSourceRestriction(od as api.DataSourceRestriction);
     });
   });
 
@@ -4655,7 +4669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -4663,7 +4677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateOperatorOptions();
       var od = api.DateOperatorOptions.fromJson(o.toJson());
-      checkDateOperatorOptions(od);
+      checkDateOperatorOptions(od as api.DateOperatorOptions);
     });
   });
 
@@ -4671,7 +4685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatePropertyOptions();
       var od = api.DatePropertyOptions.fromJson(o.toJson());
-      checkDatePropertyOptions(od);
+      checkDatePropertyOptions(od as api.DatePropertyOptions);
     });
   });
 
@@ -4679,7 +4693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateValues();
       var od = api.DateValues.fromJson(o.toJson());
-      checkDateValues(od);
+      checkDateValues(od as api.DateValues);
     });
   });
 
@@ -4687,7 +4701,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDebugOptions();
       var od = api.DebugOptions.fromJson(o.toJson());
-      checkDebugOptions(od);
+      checkDebugOptions(od as api.DebugOptions);
     });
   });
 
@@ -4695,7 +4709,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteQueueItemsRequest();
       var od = api.DeleteQueueItemsRequest.fromJson(o.toJson());
-      checkDeleteQueueItemsRequest(od);
+      checkDeleteQueueItemsRequest(od as api.DeleteQueueItemsRequest);
     });
   });
 
@@ -4703,7 +4717,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisplayedProperty();
       var od = api.DisplayedProperty.fromJson(o.toJson());
-      checkDisplayedProperty(od);
+      checkDisplayedProperty(od as api.DisplayedProperty);
     });
   });
 
@@ -4711,7 +4725,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleOperatorOptions();
       var od = api.DoubleOperatorOptions.fromJson(o.toJson());
-      checkDoubleOperatorOptions(od);
+      checkDoubleOperatorOptions(od as api.DoubleOperatorOptions);
     });
   });
 
@@ -4719,7 +4733,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoublePropertyOptions();
       var od = api.DoublePropertyOptions.fromJson(o.toJson());
-      checkDoublePropertyOptions(od);
+      checkDoublePropertyOptions(od as api.DoublePropertyOptions);
     });
   });
 
@@ -4727,7 +4741,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleValues();
       var od = api.DoubleValues.fromJson(o.toJson());
-      checkDoubleValues(od);
+      checkDoubleValues(od as api.DoubleValues);
     });
   });
 
@@ -4735,7 +4749,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveFollowUpRestrict();
       var od = api.DriveFollowUpRestrict.fromJson(o.toJson());
-      checkDriveFollowUpRestrict(od);
+      checkDriveFollowUpRestrict(od as api.DriveFollowUpRestrict);
     });
   });
 
@@ -4743,7 +4757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveLocationRestrict();
       var od = api.DriveLocationRestrict.fromJson(o.toJson());
-      checkDriveLocationRestrict(od);
+      checkDriveLocationRestrict(od as api.DriveLocationRestrict);
     });
   });
 
@@ -4751,7 +4765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveMimeTypeRestrict();
       var od = api.DriveMimeTypeRestrict.fromJson(o.toJson());
-      checkDriveMimeTypeRestrict(od);
+      checkDriveMimeTypeRestrict(od as api.DriveMimeTypeRestrict);
     });
   });
 
@@ -4759,7 +4773,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveTimeSpanRestrict();
       var od = api.DriveTimeSpanRestrict.fromJson(o.toJson());
-      checkDriveTimeSpanRestrict(od);
+      checkDriveTimeSpanRestrict(od as api.DriveTimeSpanRestrict);
     });
   });
 
@@ -4767,7 +4781,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmailAddress();
       var od = api.EmailAddress.fromJson(o.toJson());
-      checkEmailAddress(od);
+      checkEmailAddress(od as api.EmailAddress);
     });
   });
 
@@ -4775,7 +4789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumOperatorOptions();
       var od = api.EnumOperatorOptions.fromJson(o.toJson());
-      checkEnumOperatorOptions(od);
+      checkEnumOperatorOptions(od as api.EnumOperatorOptions);
     });
   });
 
@@ -4783,7 +4797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumPropertyOptions();
       var od = api.EnumPropertyOptions.fromJson(o.toJson());
-      checkEnumPropertyOptions(od);
+      checkEnumPropertyOptions(od as api.EnumPropertyOptions);
     });
   });
 
@@ -4791,7 +4805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumValuePair();
       var od = api.EnumValuePair.fromJson(o.toJson());
-      checkEnumValuePair(od);
+      checkEnumValuePair(od as api.EnumValuePair);
     });
   });
 
@@ -4799,7 +4813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumValues();
       var od = api.EnumValues.fromJson(o.toJson());
-      checkEnumValues(od);
+      checkEnumValues(od as api.EnumValues);
     });
   });
 
@@ -4807,7 +4821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorInfo();
       var od = api.ErrorInfo.fromJson(o.toJson());
-      checkErrorInfo(od);
+      checkErrorInfo(od as api.ErrorInfo);
     });
   });
 
@@ -4815,7 +4829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorMessage();
       var od = api.ErrorMessage.fromJson(o.toJson());
-      checkErrorMessage(od);
+      checkErrorMessage(od as api.ErrorMessage);
     });
   });
 
@@ -4823,7 +4837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFacetBucket();
       var od = api.FacetBucket.fromJson(o.toJson());
-      checkFacetBucket(od);
+      checkFacetBucket(od as api.FacetBucket);
     });
   });
 
@@ -4831,7 +4845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFacetOptions();
       var od = api.FacetOptions.fromJson(o.toJson());
-      checkFacetOptions(od);
+      checkFacetOptions(od as api.FacetOptions);
     });
   });
 
@@ -4839,7 +4853,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFacetResult();
       var od = api.FacetResult.fromJson(o.toJson());
-      checkFacetResult(od);
+      checkFacetResult(od as api.FacetResult);
     });
   });
 
@@ -4847,7 +4861,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFieldViolation();
       var od = api.FieldViolation.fromJson(o.toJson());
-      checkFieldViolation(od);
+      checkFieldViolation(od as api.FieldViolation);
     });
   });
 
@@ -4855,7 +4869,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilter();
       var od = api.Filter.fromJson(o.toJson());
-      checkFilter(od);
+      checkFilter(od as api.Filter);
     });
   });
 
@@ -4863,7 +4877,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterOptions();
       var od = api.FilterOptions.fromJson(o.toJson());
-      checkFilterOptions(od);
+      checkFilterOptions(od as api.FilterOptions);
     });
   });
 
@@ -4871,7 +4885,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFreshnessOptions();
       var od = api.FreshnessOptions.fromJson(o.toJson());
-      checkFreshnessOptions(od);
+      checkFreshnessOptions(od as api.FreshnessOptions);
     });
   });
 
@@ -4879,7 +4893,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGSuitePrincipal();
       var od = api.GSuitePrincipal.fromJson(o.toJson());
-      checkGSuitePrincipal(od);
+      checkGSuitePrincipal(od as api.GSuitePrincipal);
     });
   });
 
@@ -4887,7 +4901,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetCustomerIndexStatsResponse();
       var od = api.GetCustomerIndexStatsResponse.fromJson(o.toJson());
-      checkGetCustomerIndexStatsResponse(od);
+      checkGetCustomerIndexStatsResponse(
+          od as api.GetCustomerIndexStatsResponse);
     });
   });
 
@@ -4895,7 +4910,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetCustomerQueryStatsResponse();
       var od = api.GetCustomerQueryStatsResponse.fromJson(o.toJson());
-      checkGetCustomerQueryStatsResponse(od);
+      checkGetCustomerQueryStatsResponse(
+          od as api.GetCustomerQueryStatsResponse);
     });
   });
 
@@ -4903,7 +4919,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetCustomerSessionStatsResponse();
       var od = api.GetCustomerSessionStatsResponse.fromJson(o.toJson());
-      checkGetCustomerSessionStatsResponse(od);
+      checkGetCustomerSessionStatsResponse(
+          od as api.GetCustomerSessionStatsResponse);
     });
   });
 
@@ -4911,7 +4928,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetCustomerUserStatsResponse();
       var od = api.GetCustomerUserStatsResponse.fromJson(o.toJson());
-      checkGetCustomerUserStatsResponse(od);
+      checkGetCustomerUserStatsResponse(od as api.GetCustomerUserStatsResponse);
     });
   });
 
@@ -4919,7 +4936,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetDataSourceIndexStatsResponse();
       var od = api.GetDataSourceIndexStatsResponse.fromJson(o.toJson());
-      checkGetDataSourceIndexStatsResponse(od);
+      checkGetDataSourceIndexStatsResponse(
+          od as api.GetDataSourceIndexStatsResponse);
     });
   });
 
@@ -4927,7 +4945,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetSearchApplicationQueryStatsResponse();
       var od = api.GetSearchApplicationQueryStatsResponse.fromJson(o.toJson());
-      checkGetSearchApplicationQueryStatsResponse(od);
+      checkGetSearchApplicationQueryStatsResponse(
+          od as api.GetSearchApplicationQueryStatsResponse);
     });
   });
 
@@ -4936,7 +4955,8 @@
       var o = buildGetSearchApplicationSessionStatsResponse();
       var od =
           api.GetSearchApplicationSessionStatsResponse.fromJson(o.toJson());
-      checkGetSearchApplicationSessionStatsResponse(od);
+      checkGetSearchApplicationSessionStatsResponse(
+          od as api.GetSearchApplicationSessionStatsResponse);
     });
   });
 
@@ -4944,7 +4964,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetSearchApplicationUserStatsResponse();
       var od = api.GetSearchApplicationUserStatsResponse.fromJson(o.toJson());
-      checkGetSearchApplicationUserStatsResponse(od);
+      checkGetSearchApplicationUserStatsResponse(
+          od as api.GetSearchApplicationUserStatsResponse);
     });
   });
 
@@ -4952,7 +4973,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHtmlOperatorOptions();
       var od = api.HtmlOperatorOptions.fromJson(o.toJson());
-      checkHtmlOperatorOptions(od);
+      checkHtmlOperatorOptions(od as api.HtmlOperatorOptions);
     });
   });
 
@@ -4960,7 +4981,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHtmlPropertyOptions();
       var od = api.HtmlPropertyOptions.fromJson(o.toJson());
-      checkHtmlPropertyOptions(od);
+      checkHtmlPropertyOptions(od as api.HtmlPropertyOptions);
     });
   });
 
@@ -4968,7 +4989,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHtmlValues();
       var od = api.HtmlValues.fromJson(o.toJson());
-      checkHtmlValues(od);
+      checkHtmlValues(od as api.HtmlValues);
     });
   });
 
@@ -4976,7 +4997,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIndexItemOptions();
       var od = api.IndexItemOptions.fromJson(o.toJson());
-      checkIndexItemOptions(od);
+      checkIndexItemOptions(od as api.IndexItemOptions);
     });
   });
 
@@ -4984,7 +5005,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIndexItemRequest();
       var od = api.IndexItemRequest.fromJson(o.toJson());
-      checkIndexItemRequest(od);
+      checkIndexItemRequest(od as api.IndexItemRequest);
     });
   });
 
@@ -4992,7 +5013,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntegerOperatorOptions();
       var od = api.IntegerOperatorOptions.fromJson(o.toJson());
-      checkIntegerOperatorOptions(od);
+      checkIntegerOperatorOptions(od as api.IntegerOperatorOptions);
     });
   });
 
@@ -5000,7 +5021,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntegerPropertyOptions();
       var od = api.IntegerPropertyOptions.fromJson(o.toJson());
-      checkIntegerPropertyOptions(od);
+      checkIntegerPropertyOptions(od as api.IntegerPropertyOptions);
     });
   });
 
@@ -5008,7 +5029,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntegerValues();
       var od = api.IntegerValues.fromJson(o.toJson());
-      checkIntegerValues(od);
+      checkIntegerValues(od as api.IntegerValues);
     });
   });
 
@@ -5016,7 +5037,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInteraction();
       var od = api.Interaction.fromJson(o.toJson());
-      checkInteraction(od);
+      checkInteraction(od as api.Interaction);
     });
   });
 
@@ -5024,7 +5045,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildItem();
       var od = api.Item.fromJson(o.toJson());
-      checkItem(od);
+      checkItem(od as api.Item);
     });
   });
 
@@ -5032,7 +5053,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildItemAcl();
       var od = api.ItemAcl.fromJson(o.toJson());
-      checkItemAcl(od);
+      checkItemAcl(od as api.ItemAcl);
     });
   });
 
@@ -5040,7 +5061,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildItemContent();
       var od = api.ItemContent.fromJson(o.toJson());
-      checkItemContent(od);
+      checkItemContent(od as api.ItemContent);
     });
   });
 
@@ -5048,7 +5069,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildItemCountByStatus();
       var od = api.ItemCountByStatus.fromJson(o.toJson());
-      checkItemCountByStatus(od);
+      checkItemCountByStatus(od as api.ItemCountByStatus);
     });
   });
 
@@ -5056,7 +5077,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildItemMetadata();
       var od = api.ItemMetadata.fromJson(o.toJson());
-      checkItemMetadata(od);
+      checkItemMetadata(od as api.ItemMetadata);
     });
   });
 
@@ -5064,7 +5085,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildItemStatus();
       var od = api.ItemStatus.fromJson(o.toJson());
-      checkItemStatus(od);
+      checkItemStatus(od as api.ItemStatus);
     });
   });
 
@@ -5072,7 +5093,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildItemStructuredData();
       var od = api.ItemStructuredData.fromJson(o.toJson());
-      checkItemStructuredData(od);
+      checkItemStructuredData(od as api.ItemStructuredData);
     });
   });
 
@@ -5080,7 +5101,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDataSourceResponse();
       var od = api.ListDataSourceResponse.fromJson(o.toJson());
-      checkListDataSourceResponse(od);
+      checkListDataSourceResponse(od as api.ListDataSourceResponse);
     });
   });
 
@@ -5089,7 +5110,8 @@
       var o = buildListItemNamesForUnmappedIdentityResponse();
       var od =
           api.ListItemNamesForUnmappedIdentityResponse.fromJson(o.toJson());
-      checkListItemNamesForUnmappedIdentityResponse(od);
+      checkListItemNamesForUnmappedIdentityResponse(
+          od as api.ListItemNamesForUnmappedIdentityResponse);
     });
   });
 
@@ -5097,7 +5119,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListItemsResponse();
       var od = api.ListItemsResponse.fromJson(o.toJson());
-      checkListItemsResponse(od);
+      checkListItemsResponse(od as api.ListItemsResponse);
     });
   });
 
@@ -5105,7 +5127,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -5113,7 +5135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListQuerySourcesResponse();
       var od = api.ListQuerySourcesResponse.fromJson(o.toJson());
-      checkListQuerySourcesResponse(od);
+      checkListQuerySourcesResponse(od as api.ListQuerySourcesResponse);
     });
   });
 
@@ -5121,7 +5143,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSearchApplicationsResponse();
       var od = api.ListSearchApplicationsResponse.fromJson(o.toJson());
-      checkListSearchApplicationsResponse(od);
+      checkListSearchApplicationsResponse(
+          od as api.ListSearchApplicationsResponse);
     });
   });
 
@@ -5129,7 +5152,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUnmappedIdentitiesResponse();
       var od = api.ListUnmappedIdentitiesResponse.fromJson(o.toJson());
-      checkListUnmappedIdentitiesResponse(od);
+      checkListUnmappedIdentitiesResponse(
+          od as api.ListUnmappedIdentitiesResponse);
     });
   });
 
@@ -5137,7 +5161,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMatchRange();
       var od = api.MatchRange.fromJson(o.toJson());
-      checkMatchRange(od);
+      checkMatchRange(od as api.MatchRange);
     });
   });
 
@@ -5145,7 +5169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMedia();
       var od = api.Media.fromJson(o.toJson());
-      checkMedia(od);
+      checkMedia(od as api.Media);
     });
   });
 
@@ -5153,7 +5177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadata();
       var od = api.Metadata.fromJson(o.toJson());
-      checkMetadata(od);
+      checkMetadata(od as api.Metadata);
     });
   });
 
@@ -5161,7 +5185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetaline();
       var od = api.Metaline.fromJson(o.toJson());
-      checkMetaline(od);
+      checkMetaline(od as api.Metaline);
     });
   });
 
@@ -5169,7 +5193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildName();
       var od = api.Name.fromJson(o.toJson());
-      checkName(od);
+      checkName(od as api.Name);
     });
   });
 
@@ -5177,7 +5201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedProperty();
       var od = api.NamedProperty.fromJson(o.toJson());
-      checkNamedProperty(od);
+      checkNamedProperty(od as api.NamedProperty);
     });
   });
 
@@ -5185,7 +5209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectDefinition();
       var od = api.ObjectDefinition.fromJson(o.toJson());
-      checkObjectDefinition(od);
+      checkObjectDefinition(od as api.ObjectDefinition);
     });
   });
 
@@ -5193,7 +5217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectDisplayOptions();
       var od = api.ObjectDisplayOptions.fromJson(o.toJson());
-      checkObjectDisplayOptions(od);
+      checkObjectDisplayOptions(od as api.ObjectDisplayOptions);
     });
   });
 
@@ -5201,7 +5225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectOptions();
       var od = api.ObjectOptions.fromJson(o.toJson());
-      checkObjectOptions(od);
+      checkObjectOptions(od as api.ObjectOptions);
     });
   });
 
@@ -5209,7 +5233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectPropertyOptions();
       var od = api.ObjectPropertyOptions.fromJson(o.toJson());
-      checkObjectPropertyOptions(od);
+      checkObjectPropertyOptions(od as api.ObjectPropertyOptions);
     });
   });
 
@@ -5217,7 +5241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectValues();
       var od = api.ObjectValues.fromJson(o.toJson());
-      checkObjectValues(od);
+      checkObjectValues(od as api.ObjectValues);
     });
   });
 
@@ -5225,7 +5249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -5233,7 +5257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPeopleSuggestion();
       var od = api.PeopleSuggestion.fromJson(o.toJson());
-      checkPeopleSuggestion(od);
+      checkPeopleSuggestion(od as api.PeopleSuggestion);
     });
   });
 
@@ -5241,7 +5265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerson();
       var od = api.Person.fromJson(o.toJson());
-      checkPerson(od);
+      checkPerson(od as api.Person);
     });
   });
 
@@ -5249,7 +5273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPhoto();
       var od = api.Photo.fromJson(o.toJson());
-      checkPhoto(od);
+      checkPhoto(od as api.Photo);
     });
   });
 
@@ -5257,7 +5281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPollItemsRequest();
       var od = api.PollItemsRequest.fromJson(o.toJson());
-      checkPollItemsRequest(od);
+      checkPollItemsRequest(od as api.PollItemsRequest);
     });
   });
 
@@ -5265,7 +5289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPollItemsResponse();
       var od = api.PollItemsResponse.fromJson(o.toJson());
-      checkPollItemsResponse(od);
+      checkPollItemsResponse(od as api.PollItemsResponse);
     });
   });
 
@@ -5273,7 +5297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrincipal();
       var od = api.Principal.fromJson(o.toJson());
-      checkPrincipal(od);
+      checkPrincipal(od as api.Principal);
     });
   });
 
@@ -5281,7 +5305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProcessingError();
       var od = api.ProcessingError.fromJson(o.toJson());
-      checkProcessingError(od);
+      checkProcessingError(od as api.ProcessingError);
     });
   });
 
@@ -5289,7 +5313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPropertyDefinition();
       var od = api.PropertyDefinition.fromJson(o.toJson());
-      checkPropertyDefinition(od);
+      checkPropertyDefinition(od as api.PropertyDefinition);
     });
   });
 
@@ -5297,7 +5321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPropertyDisplayOptions();
       var od = api.PropertyDisplayOptions.fromJson(o.toJson());
-      checkPropertyDisplayOptions(od);
+      checkPropertyDisplayOptions(od as api.PropertyDisplayOptions);
     });
   });
 
@@ -5305,7 +5329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPushItem();
       var od = api.PushItem.fromJson(o.toJson());
-      checkPushItem(od);
+      checkPushItem(od as api.PushItem);
     });
   });
 
@@ -5313,7 +5337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPushItemRequest();
       var od = api.PushItemRequest.fromJson(o.toJson());
-      checkPushItemRequest(od);
+      checkPushItemRequest(od as api.PushItemRequest);
     });
   });
 
@@ -5321,7 +5345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryCountByStatus();
       var od = api.QueryCountByStatus.fromJson(o.toJson());
-      checkQueryCountByStatus(od);
+      checkQueryCountByStatus(od as api.QueryCountByStatus);
     });
   });
 
@@ -5329,7 +5353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryInterpretation();
       var od = api.QueryInterpretation.fromJson(o.toJson());
-      checkQueryInterpretation(od);
+      checkQueryInterpretation(od as api.QueryInterpretation);
     });
   });
 
@@ -5337,7 +5361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryInterpretationOptions();
       var od = api.QueryInterpretationOptions.fromJson(o.toJson());
-      checkQueryInterpretationOptions(od);
+      checkQueryInterpretationOptions(od as api.QueryInterpretationOptions);
     });
   });
 
@@ -5345,7 +5369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryItem();
       var od = api.QueryItem.fromJson(o.toJson());
-      checkQueryItem(od);
+      checkQueryItem(od as api.QueryItem);
     });
   });
 
@@ -5353,7 +5377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryOperator();
       var od = api.QueryOperator.fromJson(o.toJson());
-      checkQueryOperator(od);
+      checkQueryOperator(od as api.QueryOperator);
     });
   });
 
@@ -5361,7 +5385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuerySource();
       var od = api.QuerySource.fromJson(o.toJson());
-      checkQuerySource(od);
+      checkQuerySource(od as api.QuerySource);
     });
   });
 
@@ -5369,7 +5393,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuerySuggestion();
       var od = api.QuerySuggestion.fromJson(o.toJson());
-      checkQuerySuggestion(od);
+      checkQuerySuggestion(od as api.QuerySuggestion);
     });
   });
 
@@ -5377,7 +5401,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepositoryError();
       var od = api.RepositoryError.fromJson(o.toJson());
-      checkRepositoryError(od);
+      checkRepositoryError(od as api.RepositoryError);
     });
   });
 
@@ -5385,7 +5409,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestOptions();
       var od = api.RequestOptions.fromJson(o.toJson());
-      checkRequestOptions(od);
+      checkRequestOptions(od as api.RequestOptions);
     });
   });
 
@@ -5393,7 +5417,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResetSearchApplicationRequest();
       var od = api.ResetSearchApplicationRequest.fromJson(o.toJson());
-      checkResetSearchApplicationRequest(od);
+      checkResetSearchApplicationRequest(
+          od as api.ResetSearchApplicationRequest);
     });
   });
 
@@ -5401,7 +5426,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResponseDebugInfo();
       var od = api.ResponseDebugInfo.fromJson(o.toJson());
-      checkResponseDebugInfo(od);
+      checkResponseDebugInfo(od as api.ResponseDebugInfo);
     });
   });
 
@@ -5409,7 +5434,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestrictItem();
       var od = api.RestrictItem.fromJson(o.toJson());
-      checkRestrictItem(od);
+      checkRestrictItem(od as api.RestrictItem);
     });
   });
 
@@ -5417,7 +5442,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultCounts();
       var od = api.ResultCounts.fromJson(o.toJson());
-      checkResultCounts(od);
+      checkResultCounts(od as api.ResultCounts);
     });
   });
 
@@ -5425,7 +5450,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultDebugInfo();
       var od = api.ResultDebugInfo.fromJson(o.toJson());
-      checkResultDebugInfo(od);
+      checkResultDebugInfo(od as api.ResultDebugInfo);
     });
   });
 
@@ -5433,7 +5458,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultDisplayField();
       var od = api.ResultDisplayField.fromJson(o.toJson());
-      checkResultDisplayField(od);
+      checkResultDisplayField(od as api.ResultDisplayField);
     });
   });
 
@@ -5441,7 +5466,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultDisplayLine();
       var od = api.ResultDisplayLine.fromJson(o.toJson());
-      checkResultDisplayLine(od);
+      checkResultDisplayLine(od as api.ResultDisplayLine);
     });
   });
 
@@ -5449,7 +5474,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultDisplayMetadata();
       var od = api.ResultDisplayMetadata.fromJson(o.toJson());
-      checkResultDisplayMetadata(od);
+      checkResultDisplayMetadata(od as api.ResultDisplayMetadata);
     });
   });
 
@@ -5457,7 +5482,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRetrievalImportance();
       var od = api.RetrievalImportance.fromJson(o.toJson());
-      checkRetrievalImportance(od);
+      checkRetrievalImportance(od as api.RetrievalImportance);
     });
   });
 
@@ -5465,7 +5490,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchema();
       var od = api.Schema.fromJson(o.toJson());
-      checkSchema(od);
+      checkSchema(od as api.Schema);
     });
   });
 
@@ -5473,7 +5498,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScoringConfig();
       var od = api.ScoringConfig.fromJson(o.toJson());
-      checkScoringConfig(od);
+      checkScoringConfig(od as api.ScoringConfig);
     });
   });
 
@@ -5481,7 +5506,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchApplication();
       var od = api.SearchApplication.fromJson(o.toJson());
-      checkSearchApplication(od);
+      checkSearchApplication(od as api.SearchApplication);
     });
   });
 
@@ -5489,7 +5514,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchApplicationQueryStats();
       var od = api.SearchApplicationQueryStats.fromJson(o.toJson());
-      checkSearchApplicationQueryStats(od);
+      checkSearchApplicationQueryStats(od as api.SearchApplicationQueryStats);
     });
   });
 
@@ -5497,7 +5522,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchApplicationSessionStats();
       var od = api.SearchApplicationSessionStats.fromJson(o.toJson());
-      checkSearchApplicationSessionStats(od);
+      checkSearchApplicationSessionStats(
+          od as api.SearchApplicationSessionStats);
     });
   });
 
@@ -5505,7 +5531,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchApplicationUserStats();
       var od = api.SearchApplicationUserStats.fromJson(o.toJson());
-      checkSearchApplicationUserStats(od);
+      checkSearchApplicationUserStats(od as api.SearchApplicationUserStats);
     });
   });
 
@@ -5513,7 +5539,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchItemsByViewUrlRequest();
       var od = api.SearchItemsByViewUrlRequest.fromJson(o.toJson());
-      checkSearchItemsByViewUrlRequest(od);
+      checkSearchItemsByViewUrlRequest(od as api.SearchItemsByViewUrlRequest);
     });
   });
 
@@ -5521,7 +5547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchItemsByViewUrlResponse();
       var od = api.SearchItemsByViewUrlResponse.fromJson(o.toJson());
-      checkSearchItemsByViewUrlResponse(od);
+      checkSearchItemsByViewUrlResponse(od as api.SearchItemsByViewUrlResponse);
     });
   });
 
@@ -5529,7 +5555,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchQualityMetadata();
       var od = api.SearchQualityMetadata.fromJson(o.toJson());
-      checkSearchQualityMetadata(od);
+      checkSearchQualityMetadata(od as api.SearchQualityMetadata);
     });
   });
 
@@ -5537,7 +5563,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchRequest();
       var od = api.SearchRequest.fromJson(o.toJson());
-      checkSearchRequest(od);
+      checkSearchRequest(od as api.SearchRequest);
     });
   });
 
@@ -5545,7 +5571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchResponse();
       var od = api.SearchResponse.fromJson(o.toJson());
-      checkSearchResponse(od);
+      checkSearchResponse(od as api.SearchResponse);
     });
   });
 
@@ -5553,7 +5579,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchResult();
       var od = api.SearchResult.fromJson(o.toJson());
-      checkSearchResult(od);
+      checkSearchResult(od as api.SearchResult);
     });
   });
 
@@ -5561,7 +5587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnippet();
       var od = api.Snippet.fromJson(o.toJson());
-      checkSnippet(od);
+      checkSnippet(od as api.Snippet);
     });
   });
 
@@ -5569,7 +5595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSortOptions();
       var od = api.SortOptions.fromJson(o.toJson());
-      checkSortOptions(od);
+      checkSortOptions(od as api.SortOptions);
     });
   });
 
@@ -5577,7 +5603,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSource();
       var od = api.Source.fromJson(o.toJson());
-      checkSource(od);
+      checkSource(od as api.Source);
     });
   });
 
@@ -5585,7 +5611,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceConfig();
       var od = api.SourceConfig.fromJson(o.toJson());
-      checkSourceConfig(od);
+      checkSourceConfig(od as api.SourceConfig);
     });
   });
 
@@ -5593,7 +5619,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceCrowdingConfig();
       var od = api.SourceCrowdingConfig.fromJson(o.toJson());
-      checkSourceCrowdingConfig(od);
+      checkSourceCrowdingConfig(od as api.SourceCrowdingConfig);
     });
   });
 
@@ -5601,7 +5627,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceResultCount();
       var od = api.SourceResultCount.fromJson(o.toJson());
-      checkSourceResultCount(od);
+      checkSourceResultCount(od as api.SourceResultCount);
     });
   });
 
@@ -5609,7 +5635,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceScoringConfig();
       var od = api.SourceScoringConfig.fromJson(o.toJson());
-      checkSourceScoringConfig(od);
+      checkSourceScoringConfig(od as api.SourceScoringConfig);
     });
   });
 
@@ -5617,7 +5643,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpellResult();
       var od = api.SpellResult.fromJson(o.toJson());
-      checkSpellResult(od);
+      checkSpellResult(od as api.SpellResult);
     });
   });
 
@@ -5625,7 +5651,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartUploadItemRequest();
       var od = api.StartUploadItemRequest.fromJson(o.toJson());
-      checkStartUploadItemRequest(od);
+      checkStartUploadItemRequest(od as api.StartUploadItemRequest);
     });
   });
 
@@ -5633,7 +5659,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -5641,7 +5667,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStructuredDataObject();
       var od = api.StructuredDataObject.fromJson(o.toJson());
-      checkStructuredDataObject(od);
+      checkStructuredDataObject(od as api.StructuredDataObject);
     });
   });
 
@@ -5649,7 +5675,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStructuredResult();
       var od = api.StructuredResult.fromJson(o.toJson());
-      checkStructuredResult(od);
+      checkStructuredResult(od as api.StructuredResult);
     });
   });
 
@@ -5657,7 +5683,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestRequest();
       var od = api.SuggestRequest.fromJson(o.toJson());
-      checkSuggestRequest(od);
+      checkSuggestRequest(od as api.SuggestRequest);
     });
   });
 
@@ -5665,7 +5691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestResponse();
       var od = api.SuggestResponse.fromJson(o.toJson());
-      checkSuggestResponse(od);
+      checkSuggestResponse(od as api.SuggestResponse);
     });
   });
 
@@ -5673,7 +5699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestResult();
       var od = api.SuggestResult.fromJson(o.toJson());
-      checkSuggestResult(od);
+      checkSuggestResult(od as api.SuggestResult);
     });
   });
 
@@ -5681,7 +5707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextOperatorOptions();
       var od = api.TextOperatorOptions.fromJson(o.toJson());
-      checkTextOperatorOptions(od);
+      checkTextOperatorOptions(od as api.TextOperatorOptions);
     });
   });
 
@@ -5689,7 +5715,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextPropertyOptions();
       var od = api.TextPropertyOptions.fromJson(o.toJson());
-      checkTextPropertyOptions(od);
+      checkTextPropertyOptions(od as api.TextPropertyOptions);
     });
   });
 
@@ -5697,7 +5723,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextValues();
       var od = api.TextValues.fromJson(o.toJson());
-      checkTextValues(od);
+      checkTextValues(od as api.TextValues);
     });
   });
 
@@ -5705,7 +5731,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimestampOperatorOptions();
       var od = api.TimestampOperatorOptions.fromJson(o.toJson());
-      checkTimestampOperatorOptions(od);
+      checkTimestampOperatorOptions(od as api.TimestampOperatorOptions);
     });
   });
 
@@ -5713,7 +5739,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimestampPropertyOptions();
       var od = api.TimestampPropertyOptions.fromJson(o.toJson());
-      checkTimestampPropertyOptions(od);
+      checkTimestampPropertyOptions(od as api.TimestampPropertyOptions);
     });
   });
 
@@ -5721,7 +5747,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimestampValues();
       var od = api.TimestampValues.fromJson(o.toJson());
-      checkTimestampValues(od);
+      checkTimestampValues(od as api.TimestampValues);
     });
   });
 
@@ -5729,7 +5755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnmappedIdentity();
       var od = api.UnmappedIdentity.fromJson(o.toJson());
-      checkUnmappedIdentity(od);
+      checkUnmappedIdentity(od as api.UnmappedIdentity);
     });
   });
 
@@ -5737,7 +5763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnreserveItemsRequest();
       var od = api.UnreserveItemsRequest.fromJson(o.toJson());
-      checkUnreserveItemsRequest(od);
+      checkUnreserveItemsRequest(od as api.UnreserveItemsRequest);
     });
   });
 
@@ -5745,7 +5771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDataSourceRequest();
       var od = api.UpdateDataSourceRequest.fromJson(o.toJson());
-      checkUpdateDataSourceRequest(od);
+      checkUpdateDataSourceRequest(od as api.UpdateDataSourceRequest);
     });
   });
 
@@ -5753,7 +5779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSchemaRequest();
       var od = api.UpdateSchemaRequest.fromJson(o.toJson());
-      checkUpdateSchemaRequest(od);
+      checkUpdateSchemaRequest(od as api.UpdateSchemaRequest);
     });
   });
 
@@ -5761,7 +5787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadItemRef();
       var od = api.UploadItemRef.fromJson(o.toJson());
-      checkUploadItemRef(od);
+      checkUploadItemRef(od as api.UploadItemRef);
     });
   });
 
@@ -5769,7 +5795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValue();
       var od = api.Value.fromJson(o.toJson());
-      checkValue(od);
+      checkValue(od as api.Value);
     });
   });
 
@@ -5777,7 +5803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValueFilter();
       var od = api.ValueFilter.fromJson(o.toJson());
-      checkValueFilter(od);
+      checkValueFilter(od as api.ValueFilter);
     });
   });
 
@@ -5790,8 +5816,9 @@
       var arg_debugOptions_enableDebugging = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Principal.fromJson(json);
-        checkPrincipal(obj);
+        var obj =
+            api.Principal.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPrincipal(obj as api.Principal);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5835,7 +5862,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCheckAccessResponse(response);
+        checkCheckAccessResponse(response as api.CheckAccessResponse);
       })));
     });
 
@@ -5846,8 +5873,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchItemsByViewUrlRequest.fromJson(json);
-        checkSearchItemsByViewUrlRequest(obj);
+        var obj = api.SearchItemsByViewUrlRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchItemsByViewUrlRequest(
+            obj as api.SearchItemsByViewUrlRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5887,7 +5916,8 @@
       res
           .searchByViewUrl(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchItemsByViewUrlResponse(response);
+        checkSearchItemsByViewUrlResponse(
+            response as api.SearchItemsByViewUrlResponse);
       })));
     });
   });
@@ -5950,7 +5980,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUnmappedIdentitiesResponse(response);
+        checkListUnmappedIdentitiesResponse(
+            response as api.ListUnmappedIdentitiesResponse);
       })));
     });
   });
@@ -6022,7 +6053,8 @@
               userResourceName: arg_userResourceName,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListItemNamesForUnmappedIdentityResponse(response);
+        checkListItemNamesForUnmappedIdentityResponse(
+            response as api.ListItemNamesForUnmappedIdentityResponse);
       })));
     });
   });
@@ -6089,7 +6121,8 @@
               resolutionStatusCode: arg_resolutionStatusCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUnmappedIdentitiesResponse(response);
+        checkListUnmappedIdentitiesResponse(
+            response as api.ListUnmappedIdentitiesResponse);
       })));
     });
   });
@@ -6144,7 +6177,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6197,7 +6230,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSchema(response);
+        checkSchema(response as api.Schema);
       })));
     });
 
@@ -6208,8 +6241,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateSchemaRequest.fromJson(json);
-        checkUpdateSchemaRequest(obj);
+        var obj = api.UpdateSchemaRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateSchemaRequest(obj as api.UpdateSchemaRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6249,7 +6283,7 @@
       res
           .updateSchema(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -6315,7 +6349,7 @@
               version: arg_version,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6326,8 +6360,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeleteQueueItemsRequest.fromJson(json);
-        checkDeleteQueueItemsRequest(obj);
+        var obj = api.DeleteQueueItemsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeleteQueueItemsRequest(obj as api.DeleteQueueItemsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6367,7 +6402,7 @@
       res
           .deleteQueueItems(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6424,7 +6459,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkItem(response);
+        checkItem(response as api.Item);
       })));
     });
 
@@ -6435,8 +6470,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.IndexItemRequest.fromJson(json);
-        checkIndexItemRequest(obj);
+        var obj = api.IndexItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIndexItemRequest(obj as api.IndexItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6476,7 +6512,7 @@
       res
           .index(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6544,7 +6580,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListItemsResponse(response);
+        checkListItemsResponse(response as api.ListItemsResponse);
       })));
     });
 
@@ -6555,8 +6591,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PollItemsRequest.fromJson(json);
-        checkPollItemsRequest(obj);
+        var obj = api.PollItemsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPollItemsRequest(obj as api.PollItemsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6596,7 +6633,7 @@
       res
           .poll(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPollItemsResponse(response);
+        checkPollItemsResponse(response as api.PollItemsResponse);
       })));
     });
 
@@ -6607,8 +6644,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PushItemRequest.fromJson(json);
-        checkPushItemRequest(obj);
+        var obj = api.PushItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPushItemRequest(obj as api.PushItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6648,7 +6686,7 @@
       res
           .push(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkItem(response);
+        checkItem(response as api.Item);
       })));
     });
 
@@ -6659,8 +6697,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UnreserveItemsRequest.fromJson(json);
-        checkUnreserveItemsRequest(obj);
+        var obj = api.UnreserveItemsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUnreserveItemsRequest(obj as api.UnreserveItemsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6700,7 +6739,7 @@
       res
           .unreserve(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6711,8 +6750,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartUploadItemRequest.fromJson(json);
-        checkStartUploadItemRequest(obj);
+        var obj = api.StartUploadItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartUploadItemRequest(obj as api.StartUploadItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6752,7 +6792,7 @@
       res
           .upload(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUploadItemRef(response);
+        checkUploadItemRef(response as api.UploadItemRef);
       })));
     });
   });
@@ -6768,8 +6808,9 @@
       var arg_resourceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Media.fromJson(json);
-        checkMedia(obj);
+        var obj =
+            api.Media.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMedia(obj as api.Media);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6809,7 +6850,7 @@
       res
           .upload(arg_request, arg_resourceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMedia(response);
+        checkMedia(response as api.Media);
       })));
     });
   });
@@ -6859,7 +6900,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -6921,7 +6962,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -6933,8 +6974,9 @@
       var arg_request = buildSearchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchRequest.fromJson(json);
-        checkSearchRequest(obj);
+        var obj = api.SearchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchRequest(obj as api.SearchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6973,7 +7015,7 @@
       res
           .search(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchResponse(response);
+        checkSearchResponse(response as api.SearchResponse);
       })));
     });
 
@@ -6983,8 +7025,9 @@
       var arg_request = buildSuggestRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SuggestRequest.fromJson(json);
-        checkSuggestRequest(obj);
+        var obj = api.SuggestRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSuggestRequest(obj as api.SuggestRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7023,7 +7066,7 @@
       res
           .suggest(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSuggestResponse(response);
+        checkSuggestResponse(response as api.SuggestResponse);
       })));
     });
   });
@@ -7096,7 +7139,7 @@
               requestOptions_timeZone: arg_requestOptions_timeZone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListQuerySourcesResponse(response);
+        checkListQuerySourcesResponse(response as api.ListQuerySourcesResponse);
       })));
     });
   });
@@ -7108,8 +7151,9 @@
       var arg_request = buildDataSource();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DataSource.fromJson(json);
-        checkDataSource(obj);
+        var obj = api.DataSource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDataSource(obj as api.DataSource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7148,7 +7192,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7201,7 +7245,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7254,7 +7298,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataSource(response);
+        checkDataSource(response as api.DataSource);
       })));
     });
 
@@ -7313,7 +7357,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDataSourceResponse(response);
+        checkListDataSourceResponse(response as api.ListDataSourceResponse);
       })));
     });
 
@@ -7324,8 +7368,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateDataSourceRequest.fromJson(json);
-        checkUpdateDataSourceRequest(obj);
+        var obj = api.UpdateDataSourceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateDataSourceRequest(obj as api.UpdateDataSourceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7365,7 +7410,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -7377,8 +7422,9 @@
       var arg_request = buildSearchApplication();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchApplication.fromJson(json);
-        checkSearchApplication(obj);
+        var obj = api.SearchApplication.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchApplication(obj as api.SearchApplication);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7417,7 +7463,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7470,7 +7516,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7523,7 +7569,7 @@
               debugOptions_enableDebugging: arg_debugOptions_enableDebugging,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchApplication(response);
+        checkSearchApplication(response as api.SearchApplication);
       })));
     });
 
@@ -7582,7 +7628,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSearchApplicationsResponse(response);
+        checkListSearchApplicationsResponse(
+            response as api.ListSearchApplicationsResponse);
       })));
     });
 
@@ -7593,8 +7640,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResetSearchApplicationRequest.fromJson(json);
-        checkResetSearchApplicationRequest(obj);
+        var obj = api.ResetSearchApplicationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResetSearchApplicationRequest(
+            obj as api.ResetSearchApplicationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7634,7 +7683,7 @@
       res
           .reset(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7645,8 +7694,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchApplication.fromJson(json);
-        checkSearchApplication(obj);
+        var obj = api.SearchApplication.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchApplication(obj as api.SearchApplication);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7686,7 +7736,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -7759,7 +7809,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetCustomerIndexStatsResponse(response);
+        checkGetCustomerIndexStatsResponse(
+            response as api.GetCustomerIndexStatsResponse);
       })));
     });
 
@@ -7830,7 +7881,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetCustomerQueryStatsResponse(response);
+        checkGetCustomerQueryStatsResponse(
+            response as api.GetCustomerQueryStatsResponse);
       })));
     });
 
@@ -7901,7 +7953,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetCustomerSessionStatsResponse(response);
+        checkGetCustomerSessionStatsResponse(
+            response as api.GetCustomerSessionStatsResponse);
       })));
     });
 
@@ -7972,7 +8025,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetCustomerUserStatsResponse(response);
+        checkGetCustomerUserStatsResponse(
+            response as api.GetCustomerUserStatsResponse);
       })));
     });
   });
@@ -8047,7 +8101,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetDataSourceIndexStatsResponse(response);
+        checkGetDataSourceIndexStatsResponse(
+            response as api.GetDataSourceIndexStatsResponse);
       })));
     });
   });
@@ -8123,7 +8178,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetSearchApplicationQueryStatsResponse(response);
+        checkGetSearchApplicationQueryStatsResponse(
+            response as api.GetSearchApplicationQueryStatsResponse);
       })));
     });
   });
@@ -8199,7 +8255,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetSearchApplicationSessionStatsResponse(response);
+        checkGetSearchApplicationSessionStatsResponse(
+            response as api.GetSearchApplicationSessionStatsResponse);
       })));
     });
   });
@@ -8275,7 +8332,8 @@
               toDate_year: arg_toDate_year,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetSearchApplicationUserStatsResponse(response);
+        checkGetSearchApplicationUserStatsResponse(
+            response as api.GetSearchApplicationUserStatsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudshell/v1_test.dart b/generated/googleapis/test/cloudshell/v1_test.dart
index f7f5465..f8ad343 100644
--- a/generated/googleapis/test/cloudshell/v1_test.dart
+++ b/generated/googleapis/test/cloudshell/v1_test.dart
@@ -297,8 +297,8 @@
 
 void checkUnnamed1807(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -399,7 +399,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1808(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1809(o.response);
@@ -523,7 +523,7 @@
 void checkStartEnvironmentResponse(api.StartEnvironmentResponse o) {
   buildCounterStartEnvironmentResponse++;
   if (buildCounterStartEnvironmentResponse < 3) {
-    checkEnvironment(o.environment);
+    checkEnvironment(o.environment as api.Environment);
   }
   buildCounterStartEnvironmentResponse--;
 }
@@ -598,7 +598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddPublicKeyMetadata();
       var od = api.AddPublicKeyMetadata.fromJson(o.toJson());
-      checkAddPublicKeyMetadata(od);
+      checkAddPublicKeyMetadata(od as api.AddPublicKeyMetadata);
     });
   });
 
@@ -606,7 +606,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddPublicKeyRequest();
       var od = api.AddPublicKeyRequest.fromJson(o.toJson());
-      checkAddPublicKeyRequest(od);
+      checkAddPublicKeyRequest(od as api.AddPublicKeyRequest);
     });
   });
 
@@ -614,7 +614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddPublicKeyResponse();
       var od = api.AddPublicKeyResponse.fromJson(o.toJson());
-      checkAddPublicKeyResponse(od);
+      checkAddPublicKeyResponse(od as api.AddPublicKeyResponse);
     });
   });
 
@@ -622,7 +622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizeEnvironmentMetadata();
       var od = api.AuthorizeEnvironmentMetadata.fromJson(o.toJson());
-      checkAuthorizeEnvironmentMetadata(od);
+      checkAuthorizeEnvironmentMetadata(od as api.AuthorizeEnvironmentMetadata);
     });
   });
 
@@ -630,7 +630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizeEnvironmentRequest();
       var od = api.AuthorizeEnvironmentRequest.fromJson(o.toJson());
-      checkAuthorizeEnvironmentRequest(od);
+      checkAuthorizeEnvironmentRequest(od as api.AuthorizeEnvironmentRequest);
     });
   });
 
@@ -638,7 +638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizeEnvironmentResponse();
       var od = api.AuthorizeEnvironmentResponse.fromJson(o.toJson());
-      checkAuthorizeEnvironmentResponse(od);
+      checkAuthorizeEnvironmentResponse(od as api.AuthorizeEnvironmentResponse);
     });
   });
 
@@ -646,7 +646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -654,7 +654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateEnvironmentMetadata();
       var od = api.CreateEnvironmentMetadata.fromJson(o.toJson());
-      checkCreateEnvironmentMetadata(od);
+      checkCreateEnvironmentMetadata(od as api.CreateEnvironmentMetadata);
     });
   });
 
@@ -662,7 +662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteEnvironmentMetadata();
       var od = api.DeleteEnvironmentMetadata.fromJson(o.toJson());
-      checkDeleteEnvironmentMetadata(od);
+      checkDeleteEnvironmentMetadata(od as api.DeleteEnvironmentMetadata);
     });
   });
 
@@ -670,7 +670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -678,7 +678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironment();
       var od = api.Environment.fromJson(o.toJson());
-      checkEnvironment(od);
+      checkEnvironment(od as api.Environment);
     });
   });
 
@@ -686,7 +686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -694,7 +694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -702,7 +702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemovePublicKeyMetadata();
       var od = api.RemovePublicKeyMetadata.fromJson(o.toJson());
-      checkRemovePublicKeyMetadata(od);
+      checkRemovePublicKeyMetadata(od as api.RemovePublicKeyMetadata);
     });
   });
 
@@ -710,7 +710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemovePublicKeyRequest();
       var od = api.RemovePublicKeyRequest.fromJson(o.toJson());
-      checkRemovePublicKeyRequest(od);
+      checkRemovePublicKeyRequest(od as api.RemovePublicKeyRequest);
     });
   });
 
@@ -718,7 +718,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemovePublicKeyResponse();
       var od = api.RemovePublicKeyResponse.fromJson(o.toJson());
-      checkRemovePublicKeyResponse(od);
+      checkRemovePublicKeyResponse(od as api.RemovePublicKeyResponse);
     });
   });
 
@@ -726,7 +726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartEnvironmentMetadata();
       var od = api.StartEnvironmentMetadata.fromJson(o.toJson());
-      checkStartEnvironmentMetadata(od);
+      checkStartEnvironmentMetadata(od as api.StartEnvironmentMetadata);
     });
   });
 
@@ -734,7 +734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartEnvironmentRequest();
       var od = api.StartEnvironmentRequest.fromJson(o.toJson());
-      checkStartEnvironmentRequest(od);
+      checkStartEnvironmentRequest(od as api.StartEnvironmentRequest);
     });
   });
 
@@ -742,7 +742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartEnvironmentResponse();
       var od = api.StartEnvironmentResponse.fromJson(o.toJson());
-      checkStartEnvironmentResponse(od);
+      checkStartEnvironmentResponse(od as api.StartEnvironmentResponse);
     });
   });
 
@@ -750,7 +750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -762,8 +762,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -803,7 +804,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -851,7 +852,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -899,7 +900,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -959,7 +960,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -972,8 +973,9 @@
       var arg_environment = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddPublicKeyRequest.fromJson(json);
-        checkAddPublicKeyRequest(obj);
+        var obj = api.AddPublicKeyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddPublicKeyRequest(obj as api.AddPublicKeyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1013,7 +1015,7 @@
       res
           .addPublicKey(arg_request, arg_environment, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1024,8 +1026,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AuthorizeEnvironmentRequest.fromJson(json);
-        checkAuthorizeEnvironmentRequest(obj);
+        var obj = api.AuthorizeEnvironmentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAuthorizeEnvironmentRequest(
+            obj as api.AuthorizeEnvironmentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1065,7 +1069,7 @@
       res
           .authorize(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1113,7 +1117,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
 
@@ -1124,8 +1128,9 @@
       var arg_environment = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemovePublicKeyRequest.fromJson(json);
-        checkRemovePublicKeyRequest(obj);
+        var obj = api.RemovePublicKeyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemovePublicKeyRequest(obj as api.RemovePublicKeyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1165,7 +1170,7 @@
       res
           .removePublicKey(arg_request, arg_environment, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1176,8 +1181,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartEnvironmentRequest.fromJson(json);
-        checkStartEnvironmentRequest(obj);
+        var obj = api.StartEnvironmentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartEnvironmentRequest(obj as api.StartEnvironmentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1217,7 +1223,7 @@
       res
           .start(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudtasks/v2_test.dart b/generated/googleapis/test/cloudtasks/v2_test.dart
index 209e14c..f4afa40 100644
--- a/generated/googleapis/test/cloudtasks/v2_test.dart
+++ b/generated/googleapis/test/cloudtasks/v2_test.dart
@@ -105,7 +105,7 @@
 void checkAppEngineHttpRequest(api.AppEngineHttpRequest o) {
   buildCounterAppEngineHttpRequest++;
   if (buildCounterAppEngineHttpRequest < 3) {
-    checkAppEngineRouting(o.appEngineRouting);
+    checkAppEngineRouting(o.appEngineRouting as api.AppEngineRouting);
     unittest.expect(o.body, unittest.equals('foo'));
     checkUnnamed5196(o.headers);
     unittest.expect(o.httpMethod, unittest.equals('foo'));
@@ -157,7 +157,7 @@
   buildCounterAttempt++;
   if (buildCounterAttempt < 3) {
     unittest.expect(o.dispatchTime, unittest.equals('foo'));
-    checkStatus(o.responseStatus);
+    checkStatus(o.responseStatus as api.Status);
     unittest.expect(o.responseTime, unittest.equals('foo'));
     unittest.expect(o.scheduleTime, unittest.equals('foo'));
   }
@@ -195,7 +195,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed5197(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -218,7 +218,7 @@
   buildCounterCreateTaskRequest++;
   if (buildCounterCreateTaskRequest < 3) {
     unittest.expect(o.responseView, unittest.equals('foo'));
-    checkTask(o.task);
+    checkTask(o.task as api.Task);
   }
   buildCounterCreateTaskRequest--;
 }
@@ -277,7 +277,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -336,8 +336,8 @@
     unittest.expect(o.body, unittest.equals('foo'));
     checkUnnamed5198(o.headers);
     unittest.expect(o.httpMethod, unittest.equals('foo'));
-    checkOAuthToken(o.oauthToken);
-    checkOidcToken(o.oidcToken);
+    checkOAuthToken(o.oauthToken as api.OAuthToken);
+    checkOidcToken(o.oidcToken as api.OidcToken);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterHttpRequest--;
@@ -352,8 +352,8 @@
 
 void checkUnnamed5199(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -386,8 +386,8 @@
 
 void checkUnnamed5200(core.List<api.Queue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueue(o[0]);
-  checkQueue(o[1]);
+  checkQueue(o[0] as api.Queue);
+  checkQueue(o[1] as api.Queue);
 }
 
 core.int buildCounterListQueuesResponse = 0;
@@ -420,8 +420,8 @@
 
 void checkUnnamed5201(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTask(o[0]);
-  checkTask(o[1]);
+  checkTask(o[0] as api.Task);
+  checkTask(o[1] as api.Task);
 }
 
 core.int buildCounterListTasksResponse = 0;
@@ -580,8 +580,8 @@
 
 void checkUnnamed5204(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -642,12 +642,13 @@
 void checkQueue(api.Queue o) {
   buildCounterQueue++;
   if (buildCounterQueue < 3) {
-    checkAppEngineRouting(o.appEngineRoutingOverride);
+    checkAppEngineRouting(o.appEngineRoutingOverride as api.AppEngineRouting);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.purgeTime, unittest.equals('foo'));
-    checkRateLimits(o.rateLimits);
-    checkRetryConfig(o.retryConfig);
-    checkStackdriverLoggingConfig(o.stackdriverLoggingConfig);
+    checkRateLimits(o.rateLimits as api.RateLimits);
+    checkRetryConfig(o.retryConfig as api.RetryConfig);
+    checkStackdriverLoggingConfig(
+        o.stackdriverLoggingConfig as api.StackdriverLoggingConfig);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterQueue--;
@@ -751,7 +752,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -864,13 +865,14 @@
 void checkTask(api.Task o) {
   buildCounterTask++;
   if (buildCounterTask < 3) {
-    checkAppEngineHttpRequest(o.appEngineHttpRequest);
+    checkAppEngineHttpRequest(
+        o.appEngineHttpRequest as api.AppEngineHttpRequest);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.dispatchCount, unittest.equals(42));
     unittest.expect(o.dispatchDeadline, unittest.equals('foo'));
-    checkAttempt(o.firstAttempt);
-    checkHttpRequest(o.httpRequest);
-    checkAttempt(o.lastAttempt);
+    checkAttempt(o.firstAttempt as api.Attempt);
+    checkHttpRequest(o.httpRequest as api.HttpRequest);
+    checkAttempt(o.lastAttempt as api.Attempt);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.responseCount, unittest.equals(42));
     unittest.expect(o.scheduleTime, unittest.equals('foo'));
@@ -948,7 +950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppEngineHttpRequest();
       var od = api.AppEngineHttpRequest.fromJson(o.toJson());
-      checkAppEngineHttpRequest(od);
+      checkAppEngineHttpRequest(od as api.AppEngineHttpRequest);
     });
   });
 
@@ -956,7 +958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppEngineRouting();
       var od = api.AppEngineRouting.fromJson(o.toJson());
-      checkAppEngineRouting(od);
+      checkAppEngineRouting(od as api.AppEngineRouting);
     });
   });
 
@@ -964,7 +966,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttempt();
       var od = api.Attempt.fromJson(o.toJson());
-      checkAttempt(od);
+      checkAttempt(od as api.Attempt);
     });
   });
 
@@ -972,7 +974,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -980,7 +982,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateTaskRequest();
       var od = api.CreateTaskRequest.fromJson(o.toJson());
-      checkCreateTaskRequest(od);
+      checkCreateTaskRequest(od as api.CreateTaskRequest);
     });
   });
 
@@ -988,7 +990,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -996,7 +998,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1004,7 +1006,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -1012,7 +1014,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -1020,7 +1022,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRequest();
       var od = api.HttpRequest.fromJson(o.toJson());
-      checkHttpRequest(od);
+      checkHttpRequest(od as api.HttpRequest);
     });
   });
 
@@ -1028,7 +1030,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1036,7 +1038,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListQueuesResponse();
       var od = api.ListQueuesResponse.fromJson(o.toJson());
-      checkListQueuesResponse(od);
+      checkListQueuesResponse(od as api.ListQueuesResponse);
     });
   });
 
@@ -1044,7 +1046,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTasksResponse();
       var od = api.ListTasksResponse.fromJson(o.toJson());
-      checkListTasksResponse(od);
+      checkListTasksResponse(od as api.ListTasksResponse);
     });
   });
 
@@ -1052,7 +1054,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1060,7 +1062,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOAuthToken();
       var od = api.OAuthToken.fromJson(o.toJson());
-      checkOAuthToken(od);
+      checkOAuthToken(od as api.OAuthToken);
     });
   });
 
@@ -1068,7 +1070,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOidcToken();
       var od = api.OidcToken.fromJson(o.toJson());
-      checkOidcToken(od);
+      checkOidcToken(od as api.OidcToken);
     });
   });
 
@@ -1076,7 +1078,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPauseQueueRequest();
       var od = api.PauseQueueRequest.fromJson(o.toJson());
-      checkPauseQueueRequest(od);
+      checkPauseQueueRequest(od as api.PauseQueueRequest);
     });
   });
 
@@ -1084,7 +1086,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1092,7 +1094,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPurgeQueueRequest();
       var od = api.PurgeQueueRequest.fromJson(o.toJson());
-      checkPurgeQueueRequest(od);
+      checkPurgeQueueRequest(od as api.PurgeQueueRequest);
     });
   });
 
@@ -1100,7 +1102,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueue();
       var od = api.Queue.fromJson(o.toJson());
-      checkQueue(od);
+      checkQueue(od as api.Queue);
     });
   });
 
@@ -1108,7 +1110,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRateLimits();
       var od = api.RateLimits.fromJson(o.toJson());
-      checkRateLimits(od);
+      checkRateLimits(od as api.RateLimits);
     });
   });
 
@@ -1116,7 +1118,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResumeQueueRequest();
       var od = api.ResumeQueueRequest.fromJson(o.toJson());
-      checkResumeQueueRequest(od);
+      checkResumeQueueRequest(od as api.ResumeQueueRequest);
     });
   });
 
@@ -1124,7 +1126,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRetryConfig();
       var od = api.RetryConfig.fromJson(o.toJson());
-      checkRetryConfig(od);
+      checkRetryConfig(od as api.RetryConfig);
     });
   });
 
@@ -1132,7 +1134,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunTaskRequest();
       var od = api.RunTaskRequest.fromJson(o.toJson());
-      checkRunTaskRequest(od);
+      checkRunTaskRequest(od as api.RunTaskRequest);
     });
   });
 
@@ -1140,7 +1142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1148,7 +1150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStackdriverLoggingConfig();
       var od = api.StackdriverLoggingConfig.fromJson(o.toJson());
-      checkStackdriverLoggingConfig(od);
+      checkStackdriverLoggingConfig(od as api.StackdriverLoggingConfig);
     });
   });
 
@@ -1156,7 +1158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1164,7 +1166,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTask();
       var od = api.Task.fromJson(o.toJson());
-      checkTask(od);
+      checkTask(od as api.Task);
     });
   });
 
@@ -1172,7 +1174,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1180,7 +1182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1229,7 +1231,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1289,7 +1291,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1302,8 +1304,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Queue.fromJson(json);
-        checkQueue(obj);
+        var obj =
+            api.Queue.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkQueue(obj as api.Queue);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1343,7 +1346,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueue(response);
+        checkQueue(response as api.Queue);
       })));
     });
 
@@ -1391,7 +1394,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1439,7 +1442,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueue(response);
+        checkQueue(response as api.Queue);
       })));
     });
 
@@ -1450,8 +1453,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1491,7 +1495,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1551,7 +1555,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListQueuesResponse(response);
+        checkListQueuesResponse(response as api.ListQueuesResponse);
       })));
     });
 
@@ -1563,8 +1567,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Queue.fromJson(json);
-        checkQueue(obj);
+        var obj =
+            api.Queue.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkQueue(obj as api.Queue);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1607,7 +1612,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueue(response);
+        checkQueue(response as api.Queue);
       })));
     });
 
@@ -1618,8 +1623,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PauseQueueRequest.fromJson(json);
-        checkPauseQueueRequest(obj);
+        var obj = api.PauseQueueRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPauseQueueRequest(obj as api.PauseQueueRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1659,7 +1665,7 @@
       res
           .pause(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueue(response);
+        checkQueue(response as api.Queue);
       })));
     });
 
@@ -1670,8 +1676,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PurgeQueueRequest.fromJson(json);
-        checkPurgeQueueRequest(obj);
+        var obj = api.PurgeQueueRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPurgeQueueRequest(obj as api.PurgeQueueRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1711,7 +1718,7 @@
       res
           .purge(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueue(response);
+        checkQueue(response as api.Queue);
       })));
     });
 
@@ -1722,8 +1729,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResumeQueueRequest.fromJson(json);
-        checkResumeQueueRequest(obj);
+        var obj = api.ResumeQueueRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResumeQueueRequest(obj as api.ResumeQueueRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1763,7 +1771,7 @@
       res
           .resume(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueue(response);
+        checkQueue(response as api.Queue);
       })));
     });
 
@@ -1774,8 +1782,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1815,7 +1824,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1826,8 +1835,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1867,7 +1877,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -1880,8 +1891,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateTaskRequest.fromJson(json);
-        checkCreateTaskRequest(obj);
+        var obj = api.CreateTaskRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateTaskRequest(obj as api.CreateTaskRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1921,7 +1933,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
 
@@ -1969,7 +1981,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2020,7 +2032,7 @@
       res
           .get(arg_name, responseView: arg_responseView, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
 
@@ -2081,7 +2093,7 @@
               responseView: arg_responseView,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTasksResponse(response);
+        checkListTasksResponse(response as api.ListTasksResponse);
       })));
     });
 
@@ -2092,8 +2104,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RunTaskRequest.fromJson(json);
-        checkRunTaskRequest(obj);
+        var obj = api.RunTaskRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRunTaskRequest(obj as api.RunTaskRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2133,7 +2146,7 @@
       res
           .run(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
   });
diff --git a/generated/googleapis/test/cloudtrace/v2_test.dart b/generated/googleapis/test/cloudtrace/v2_test.dart
index 62dddac..3d6b1d4 100644
--- a/generated/googleapis/test/cloudtrace/v2_test.dart
+++ b/generated/googleapis/test/cloudtrace/v2_test.dart
@@ -89,8 +89,8 @@
 void checkAnnotation(api.Annotation o) {
   buildCounterAnnotation++;
   if (buildCounterAnnotation < 3) {
-    checkAttributes(o.attributes);
-    checkTruncatableString(o.description);
+    checkAttributes(o.attributes as api.Attributes);
+    checkTruncatableString(o.description as api.TruncatableString);
   }
   buildCounterAnnotation--;
 }
@@ -113,7 +113,7 @@
   if (buildCounterAttributeValue < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkTruncatableString(o.stringValue);
+    checkTruncatableString(o.stringValue as api.TruncatableString);
   }
   buildCounterAttributeValue--;
 }
@@ -127,8 +127,8 @@
 
 void checkUnnamed1338(core.Map<core.String, api.AttributeValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttributeValue(o['x']);
-  checkAttributeValue(o['y']);
+  checkAttributeValue(o['x'] as api.AttributeValue);
+  checkAttributeValue(o['y'] as api.AttributeValue);
 }
 
 core.int buildCounterAttributes = 0;
@@ -161,8 +161,8 @@
 
 void checkUnnamed1339(core.List<api.Span> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSpan(o[0]);
-  checkSpan(o[1]);
+  checkSpan(o[0] as api.Span);
+  checkSpan(o[1] as api.Span);
 }
 
 core.int buildCounterBatchWriteSpansRequest = 0;
@@ -216,7 +216,7 @@
 void checkLink(api.Link o) {
   buildCounterLink++;
   if (buildCounterLink < 3) {
-    checkAttributes(o.attributes);
+    checkAttributes(o.attributes as api.Attributes);
     unittest.expect(o.spanId, unittest.equals('foo'));
     unittest.expect(o.traceId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -233,8 +233,8 @@
 
 void checkUnnamed1340(core.List<api.Link> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLink(o[0]);
-  checkLink(o[1]);
+  checkLink(o[0] as api.Link);
+  checkLink(o[1] as api.Link);
 }
 
 core.int buildCounterLinks = 0;
@@ -298,8 +298,8 @@
 void checkModule(api.Module o) {
   buildCounterModule++;
   if (buildCounterModule < 3) {
-    checkTruncatableString(o.buildId);
-    checkTruncatableString(o.module);
+    checkTruncatableString(o.buildId as api.TruncatableString);
+    checkTruncatableString(o.module as api.TruncatableString);
   }
   buildCounterModule--;
 }
@@ -331,20 +331,20 @@
 void checkSpan(api.Span o) {
   buildCounterSpan++;
   if (buildCounterSpan < 3) {
-    checkAttributes(o.attributes);
+    checkAttributes(o.attributes as api.Attributes);
     unittest.expect(o.childSpanCount, unittest.equals(42));
-    checkTruncatableString(o.displayName);
+    checkTruncatableString(o.displayName as api.TruncatableString);
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkLinks(o.links);
+    checkLinks(o.links as api.Links);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentSpanId, unittest.equals('foo'));
     unittest.expect(o.sameProcessAsParentSpan, unittest.isTrue);
     unittest.expect(o.spanId, unittest.equals('foo'));
     unittest.expect(o.spanKind, unittest.equals('foo'));
-    checkStackTrace(o.stackTrace);
+    checkStackTrace(o.stackTrace as api.StackTrace);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkStatus(o.status);
-    checkTimeEvents(o.timeEvents);
+    checkStatus(o.status as api.Status);
+    checkTimeEvents(o.timeEvents as api.TimeEvents);
   }
   buildCounterSpan--;
 }
@@ -370,12 +370,12 @@
   buildCounterStackFrame++;
   if (buildCounterStackFrame < 3) {
     unittest.expect(o.columnNumber, unittest.equals('foo'));
-    checkTruncatableString(o.fileName);
-    checkTruncatableString(o.functionName);
+    checkTruncatableString(o.fileName as api.TruncatableString);
+    checkTruncatableString(o.functionName as api.TruncatableString);
     unittest.expect(o.lineNumber, unittest.equals('foo'));
-    checkModule(o.loadModule);
-    checkTruncatableString(o.originalFunctionName);
-    checkTruncatableString(o.sourceVersion);
+    checkModule(o.loadModule as api.Module);
+    checkTruncatableString(o.originalFunctionName as api.TruncatableString);
+    checkTruncatableString(o.sourceVersion as api.TruncatableString);
   }
   buildCounterStackFrame--;
 }
@@ -389,8 +389,8 @@
 
 void checkUnnamed1341(core.List<api.StackFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStackFrame(o[0]);
-  checkStackFrame(o[1]);
+  checkStackFrame(o[0] as api.StackFrame);
+  checkStackFrame(o[1] as api.StackFrame);
 }
 
 core.int buildCounterStackFrames = 0;
@@ -429,7 +429,7 @@
 void checkStackTrace(api.StackTrace o) {
   buildCounterStackTrace++;
   if (buildCounterStackTrace < 3) {
-    checkStackFrames(o.stackFrames);
+    checkStackFrames(o.stackFrames as api.StackFrames);
     unittest.expect(o.stackTraceHashId, unittest.equals('foo'));
   }
   buildCounterStackTrace--;
@@ -516,8 +516,8 @@
 void checkTimeEvent(api.TimeEvent o) {
   buildCounterTimeEvent++;
   if (buildCounterTimeEvent < 3) {
-    checkAnnotation(o.annotation);
-    checkMessageEvent(o.messageEvent);
+    checkAnnotation(o.annotation as api.Annotation);
+    checkMessageEvent(o.messageEvent as api.MessageEvent);
     unittest.expect(o.time, unittest.equals('foo'));
   }
   buildCounterTimeEvent--;
@@ -532,8 +532,8 @@
 
 void checkUnnamed1344(core.List<api.TimeEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimeEvent(o[0]);
-  checkTimeEvent(o[1]);
+  checkTimeEvent(o[0] as api.TimeEvent);
+  checkTimeEvent(o[1] as api.TimeEvent);
 }
 
 core.int buildCounterTimeEvents = 0;
@@ -585,7 +585,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotation();
       var od = api.Annotation.fromJson(o.toJson());
-      checkAnnotation(od);
+      checkAnnotation(od as api.Annotation);
     });
   });
 
@@ -593,7 +593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttributeValue();
       var od = api.AttributeValue.fromJson(o.toJson());
-      checkAttributeValue(od);
+      checkAttributeValue(od as api.AttributeValue);
     });
   });
 
@@ -601,7 +601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttributes();
       var od = api.Attributes.fromJson(o.toJson());
-      checkAttributes(od);
+      checkAttributes(od as api.Attributes);
     });
   });
 
@@ -609,7 +609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchWriteSpansRequest();
       var od = api.BatchWriteSpansRequest.fromJson(o.toJson());
-      checkBatchWriteSpansRequest(od);
+      checkBatchWriteSpansRequest(od as api.BatchWriteSpansRequest);
     });
   });
 
@@ -617,7 +617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -625,7 +625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLink();
       var od = api.Link.fromJson(o.toJson());
-      checkLink(od);
+      checkLink(od as api.Link);
     });
   });
 
@@ -633,7 +633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinks();
       var od = api.Links.fromJson(o.toJson());
-      checkLinks(od);
+      checkLinks(od as api.Links);
     });
   });
 
@@ -641,7 +641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessageEvent();
       var od = api.MessageEvent.fromJson(o.toJson());
-      checkMessageEvent(od);
+      checkMessageEvent(od as api.MessageEvent);
     });
   });
 
@@ -649,7 +649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModule();
       var od = api.Module.fromJson(o.toJson());
-      checkModule(od);
+      checkModule(od as api.Module);
     });
   });
 
@@ -657,7 +657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpan();
       var od = api.Span.fromJson(o.toJson());
-      checkSpan(od);
+      checkSpan(od as api.Span);
     });
   });
 
@@ -665,7 +665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStackFrame();
       var od = api.StackFrame.fromJson(o.toJson());
-      checkStackFrame(od);
+      checkStackFrame(od as api.StackFrame);
     });
   });
 
@@ -673,7 +673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStackFrames();
       var od = api.StackFrames.fromJson(o.toJson());
-      checkStackFrames(od);
+      checkStackFrames(od as api.StackFrames);
     });
   });
 
@@ -681,7 +681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStackTrace();
       var od = api.StackTrace.fromJson(o.toJson());
-      checkStackTrace(od);
+      checkStackTrace(od as api.StackTrace);
     });
   });
 
@@ -689,7 +689,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -697,7 +697,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeEvent();
       var od = api.TimeEvent.fromJson(o.toJson());
-      checkTimeEvent(od);
+      checkTimeEvent(od as api.TimeEvent);
     });
   });
 
@@ -705,7 +705,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeEvents();
       var od = api.TimeEvents.fromJson(o.toJson());
-      checkTimeEvents(od);
+      checkTimeEvents(od as api.TimeEvents);
     });
   });
 
@@ -713,7 +713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTruncatableString();
       var od = api.TruncatableString.fromJson(o.toJson());
-      checkTruncatableString(od);
+      checkTruncatableString(od as api.TruncatableString);
     });
   });
 
@@ -725,8 +725,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchWriteSpansRequest.fromJson(json);
-        checkBatchWriteSpansRequest(obj);
+        var obj = api.BatchWriteSpansRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchWriteSpansRequest(obj as api.BatchWriteSpansRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -766,7 +767,7 @@
       res
           .batchWrite(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -779,8 +780,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Span.fromJson(json);
-        checkSpan(obj);
+        var obj =
+            api.Span.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSpan(obj as api.Span);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -820,7 +822,7 @@
       res
           .createSpan(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSpan(response);
+        checkSpan(response as api.Span);
       })));
     });
   });
diff --git a/generated/googleapis/test/composer/v1_test.dart b/generated/googleapis/test/composer/v1_test.dart
index a787347..226fb3f 100644
--- a/generated/googleapis/test/composer/v1_test.dart
+++ b/generated/googleapis/test/composer/v1_test.dart
@@ -122,7 +122,7 @@
 void checkEnvironment(api.Environment o) {
   buildCounterEnvironment++;
   if (buildCounterEnvironment < 3) {
-    checkEnvironmentConfig(o.config);
+    checkEnvironmentConfig(o.config as api.EnvironmentConfig);
     unittest.expect(o.createTime, unittest.equals('foo'));
     checkUnnamed1838(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -156,10 +156,11 @@
     unittest.expect(o.airflowUri, unittest.equals('foo'));
     unittest.expect(o.dagGcsPrefix, unittest.equals('foo'));
     unittest.expect(o.gkeCluster, unittest.equals('foo'));
-    checkNodeConfig(o.nodeConfig);
+    checkNodeConfig(o.nodeConfig as api.NodeConfig);
     unittest.expect(o.nodeCount, unittest.equals(42));
-    checkPrivateEnvironmentConfig(o.privateEnvironmentConfig);
-    checkSoftwareConfig(o.softwareConfig);
+    checkPrivateEnvironmentConfig(
+        o.privateEnvironmentConfig as api.PrivateEnvironmentConfig);
+    checkSoftwareConfig(o.softwareConfig as api.SoftwareConfig);
   }
   buildCounterEnvironmentConfig--;
 }
@@ -236,8 +237,8 @@
 
 void checkUnnamed1840(core.List<api.Environment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnvironment(o[0]);
-  checkEnvironment(o[1]);
+  checkEnvironment(o[0] as api.Environment);
+  checkEnvironment(o[1] as api.Environment);
 }
 
 core.int buildCounterListEnvironmentsResponse = 0;
@@ -270,8 +271,8 @@
 
 void checkUnnamed1841(core.List<api.ImageVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImageVersion(o[0]);
-  checkImageVersion(o[1]);
+  checkImageVersion(o[0] as api.ImageVersion);
+  checkImageVersion(o[1] as api.ImageVersion);
 }
 
 core.int buildCounterListImageVersionsResponse = 0;
@@ -304,8 +305,8 @@
 
 void checkUnnamed1842(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -378,7 +379,7 @@
   buildCounterNodeConfig++;
   if (buildCounterNodeConfig < 3) {
     unittest.expect(o.diskSizeGb, unittest.equals(42));
-    checkIPAllocationPolicy(o.ipAllocationPolicy);
+    checkIPAllocationPolicy(o.ipAllocationPolicy as api.IPAllocationPolicy);
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
@@ -467,7 +468,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1845(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1846(o.response);
@@ -547,7 +548,8 @@
   if (buildCounterPrivateEnvironmentConfig < 3) {
     unittest.expect(o.cloudSqlIpv4CidrBlock, unittest.equals('foo'));
     unittest.expect(o.enablePrivateEnvironment, unittest.isTrue);
-    checkPrivateClusterConfig(o.privateClusterConfig);
+    checkPrivateClusterConfig(
+        o.privateClusterConfig as api.PrivateClusterConfig);
     unittest.expect(o.webServerIpv4CidrBlock, unittest.equals('foo'));
     unittest.expect(o.webServerIpv4ReservedRange, unittest.equals('foo'));
   }
@@ -690,7 +692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -698,7 +700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironment();
       var od = api.Environment.fromJson(o.toJson());
-      checkEnvironment(od);
+      checkEnvironment(od as api.Environment);
     });
   });
 
@@ -706,7 +708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironmentConfig();
       var od = api.EnvironmentConfig.fromJson(o.toJson());
-      checkEnvironmentConfig(od);
+      checkEnvironmentConfig(od as api.EnvironmentConfig);
     });
   });
 
@@ -714,7 +716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIPAllocationPolicy();
       var od = api.IPAllocationPolicy.fromJson(o.toJson());
-      checkIPAllocationPolicy(od);
+      checkIPAllocationPolicy(od as api.IPAllocationPolicy);
     });
   });
 
@@ -722,7 +724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageVersion();
       var od = api.ImageVersion.fromJson(o.toJson());
-      checkImageVersion(od);
+      checkImageVersion(od as api.ImageVersion);
     });
   });
 
@@ -730,7 +732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListEnvironmentsResponse();
       var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
-      checkListEnvironmentsResponse(od);
+      checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
 
@@ -738,7 +740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListImageVersionsResponse();
       var od = api.ListImageVersionsResponse.fromJson(o.toJson());
-      checkListImageVersionsResponse(od);
+      checkListImageVersionsResponse(od as api.ListImageVersionsResponse);
     });
   });
 
@@ -746,7 +748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -754,7 +756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeConfig();
       var od = api.NodeConfig.fromJson(o.toJson());
-      checkNodeConfig(od);
+      checkNodeConfig(od as api.NodeConfig);
     });
   });
 
@@ -762,7 +764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -770,7 +772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -778,7 +780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrivateClusterConfig();
       var od = api.PrivateClusterConfig.fromJson(o.toJson());
-      checkPrivateClusterConfig(od);
+      checkPrivateClusterConfig(od as api.PrivateClusterConfig);
     });
   });
 
@@ -786,7 +788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrivateEnvironmentConfig();
       var od = api.PrivateEnvironmentConfig.fromJson(o.toJson());
-      checkPrivateEnvironmentConfig(od);
+      checkPrivateEnvironmentConfig(od as api.PrivateEnvironmentConfig);
     });
   });
 
@@ -794,7 +796,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSoftwareConfig();
       var od = api.SoftwareConfig.fromJson(o.toJson());
-      checkSoftwareConfig(od);
+      checkSoftwareConfig(od as api.SoftwareConfig);
     });
   });
 
@@ -802,7 +804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -814,8 +816,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -855,7 +858,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -903,7 +906,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -951,7 +954,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
 
@@ -1008,7 +1011,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListEnvironmentsResponse(response);
+        checkListEnvironmentsResponse(response as api.ListEnvironmentsResponse);
       })));
     });
 
@@ -1020,8 +1023,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1064,7 +1068,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -1123,7 +1127,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListImageVersionsResponse(response);
+        checkListImageVersionsResponse(
+            response as api.ListImageVersionsResponse);
       })));
     });
   });
@@ -1173,7 +1178,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1221,7 +1226,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1281,7 +1286,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/compute/v1_test.dart b/generated/googleapis/test/compute/v1_test.dart
index 5c802bd..2f080f5 100644
--- a/generated/googleapis/test/compute/v1_test.dart
+++ b/generated/googleapis/test/compute/v1_test.dart
@@ -118,7 +118,7 @@
   buildCounterAcceleratorType++;
   if (buildCounterAcceleratorType < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkDeprecationStatus(o.deprecated);
+    checkDeprecationStatus(o.deprecated as api.DeprecationStatus);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -139,8 +139,8 @@
 
 void checkUnnamed579(core.Map<core.String, api.AcceleratorTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorTypesScopedList(o['x']);
-  checkAcceleratorTypesScopedList(o['y']);
+  checkAcceleratorTypesScopedList(o['x'] as api.AcceleratorTypesScopedList);
+  checkAcceleratorTypesScopedList(o['y'] as api.AcceleratorTypesScopedList);
 }
 
 core.List<core.String> buildUnnamed580() {
@@ -189,8 +189,10 @@
 void checkUnnamed581(
     core.List<api.AcceleratorTypeAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorTypeAggregatedListWarningData(o[0]);
-  checkAcceleratorTypeAggregatedListWarningData(o[1]);
+  checkAcceleratorTypeAggregatedListWarningData(
+      o[0] as api.AcceleratorTypeAggregatedListWarningData);
+  checkAcceleratorTypeAggregatedListWarningData(
+      o[1] as api.AcceleratorTypeAggregatedListWarningData);
 }
 
 core.int buildCounterAcceleratorTypeAggregatedListWarning = 0;
@@ -244,7 +246,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed580(o.unreachables);
-    checkAcceleratorTypeAggregatedListWarning(o.warning);
+    checkAcceleratorTypeAggregatedListWarning(
+        o.warning as api.AcceleratorTypeAggregatedListWarning);
   }
   buildCounterAcceleratorTypeAggregatedList--;
 }
@@ -258,8 +261,8 @@
 
 void checkUnnamed582(core.List<api.AcceleratorType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorType(o[0]);
-  checkAcceleratorType(o[1]);
+  checkAcceleratorType(o[0] as api.AcceleratorType);
+  checkAcceleratorType(o[1] as api.AcceleratorType);
 }
 
 core.int buildCounterAcceleratorTypeListWarningData = 0;
@@ -292,8 +295,10 @@
 
 void checkUnnamed583(core.List<api.AcceleratorTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorTypeListWarningData(o[0]);
-  checkAcceleratorTypeListWarningData(o[1]);
+  checkAcceleratorTypeListWarningData(
+      o[0] as api.AcceleratorTypeListWarningData);
+  checkAcceleratorTypeListWarningData(
+      o[1] as api.AcceleratorTypeListWarningData);
 }
 
 core.int buildCounterAcceleratorTypeListWarning = 0;
@@ -343,7 +348,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkAcceleratorTypeListWarning(o.warning);
+    checkAcceleratorTypeListWarning(
+        o.warning as api.AcceleratorTypeListWarning);
   }
   buildCounterAcceleratorTypeList--;
 }
@@ -357,8 +363,8 @@
 
 void checkUnnamed584(core.List<api.AcceleratorType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorType(o[0]);
-  checkAcceleratorType(o[1]);
+  checkAcceleratorType(o[0] as api.AcceleratorType);
+  checkAcceleratorType(o[1] as api.AcceleratorType);
 }
 
 core.int buildCounterAcceleratorTypesScopedListWarningData = 0;
@@ -393,8 +399,10 @@
 
 void checkUnnamed585(core.List<api.AcceleratorTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorTypesScopedListWarningData(o[0]);
-  checkAcceleratorTypesScopedListWarningData(o[1]);
+  checkAcceleratorTypesScopedListWarningData(
+      o[0] as api.AcceleratorTypesScopedListWarningData);
+  checkAcceleratorTypesScopedListWarningData(
+      o[1] as api.AcceleratorTypesScopedListWarningData);
 }
 
 core.int buildCounterAcceleratorTypesScopedListWarning = 0;
@@ -437,7 +445,8 @@
   buildCounterAcceleratorTypesScopedList++;
   if (buildCounterAcceleratorTypesScopedList < 3) {
     checkUnnamed584(o.acceleratorTypes);
-    checkAcceleratorTypesScopedListWarning(o.warning);
+    checkAcceleratorTypesScopedListWarning(
+        o.warning as api.AcceleratorTypesScopedListWarning);
   }
   buildCounterAcceleratorTypesScopedList--;
 }
@@ -546,8 +555,8 @@
 
 void checkUnnamed587(core.Map<core.String, api.AddressesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddressesScopedList(o['x']);
-  checkAddressesScopedList(o['y']);
+  checkAddressesScopedList(o['x'] as api.AddressesScopedList);
+  checkAddressesScopedList(o['y'] as api.AddressesScopedList);
 }
 
 core.List<core.String> buildUnnamed588() {
@@ -594,8 +603,10 @@
 
 void checkUnnamed589(core.List<api.AddressAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddressAggregatedListWarningData(o[0]);
-  checkAddressAggregatedListWarningData(o[1]);
+  checkAddressAggregatedListWarningData(
+      o[0] as api.AddressAggregatedListWarningData);
+  checkAddressAggregatedListWarningData(
+      o[1] as api.AddressAggregatedListWarningData);
 }
 
 core.int buildCounterAddressAggregatedListWarning = 0;
@@ -647,7 +658,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed588(o.unreachables);
-    checkAddressAggregatedListWarning(o.warning);
+    checkAddressAggregatedListWarning(
+        o.warning as api.AddressAggregatedListWarning);
   }
   buildCounterAddressAggregatedList--;
 }
@@ -661,8 +673,8 @@
 
 void checkUnnamed590(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddress(o[0]);
-  checkAddress(o[1]);
+  checkAddress(o[0] as api.Address);
+  checkAddress(o[1] as api.Address);
 }
 
 core.int buildCounterAddressListWarningData = 0;
@@ -695,8 +707,8 @@
 
 void checkUnnamed591(core.List<api.AddressListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddressListWarningData(o[0]);
-  checkAddressListWarningData(o[1]);
+  checkAddressListWarningData(o[0] as api.AddressListWarningData);
+  checkAddressListWarningData(o[1] as api.AddressListWarningData);
 }
 
 core.int buildCounterAddressListWarning = 0;
@@ -746,7 +758,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkAddressListWarning(o.warning);
+    checkAddressListWarning(o.warning as api.AddressListWarning);
   }
   buildCounterAddressList--;
 }
@@ -760,8 +772,8 @@
 
 void checkUnnamed592(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddress(o[0]);
-  checkAddress(o[1]);
+  checkAddress(o[0] as api.Address);
+  checkAddress(o[1] as api.Address);
 }
 
 core.int buildCounterAddressesScopedListWarningData = 0;
@@ -794,8 +806,10 @@
 
 void checkUnnamed593(core.List<api.AddressesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddressesScopedListWarningData(o[0]);
-  checkAddressesScopedListWarningData(o[1]);
+  checkAddressesScopedListWarningData(
+      o[0] as api.AddressesScopedListWarningData);
+  checkAddressesScopedListWarningData(
+      o[1] as api.AddressesScopedListWarningData);
 }
 
 core.int buildCounterAddressesScopedListWarning = 0;
@@ -837,7 +851,8 @@
   buildCounterAddressesScopedList++;
   if (buildCounterAddressesScopedList < 3) {
     checkUnnamed592(o.addresses);
-    checkAddressesScopedListWarning(o.warning);
+    checkAddressesScopedListWarning(
+        o.warning as api.AddressesScopedListWarning);
   }
   buildCounterAddressesScopedList--;
 }
@@ -901,8 +916,8 @@
 
 void checkUnnamed594(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorConfig(o[0]);
-  checkAcceleratorConfig(o[1]);
+  checkAcceleratorConfig(o[0] as api.AcceleratorConfig);
+  checkAcceleratorConfig(o[1] as api.AcceleratorConfig);
 }
 
 core.List<
@@ -923,9 +938,11 @@
         o) {
   unittest.expect(o, unittest.hasLength(2));
   checkAllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
-      o[0]);
+      o[0] as api
+          .AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk);
   checkAllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
-      o[1]);
+      o[1] as api
+          .AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk);
 }
 
 core.int buildCounterAllocationSpecificSKUAllocationReservedInstanceProperties =
@@ -979,7 +996,8 @@
     unittest.expect(o.count, unittest.equals('foo'));
     unittest.expect(o.inUseCount, unittest.equals('foo'));
     checkAllocationSpecificSKUAllocationReservedInstanceProperties(
-        o.instanceProperties);
+        o.instanceProperties
+            as api.AllocationSpecificSKUAllocationReservedInstanceProperties);
   }
   buildCounterAllocationSpecificSKUReservation--;
 }
@@ -993,8 +1011,8 @@
 
 void checkUnnamed596(core.List<api.GuestOsFeature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGuestOsFeature(o[0]);
-  checkGuestOsFeature(o[1]);
+  checkGuestOsFeature(o[0] as api.GuestOsFeature);
+  checkGuestOsFeature(o[1] as api.GuestOsFeature);
 }
 
 core.List<core.String> buildUnnamed597() {
@@ -1041,16 +1059,19 @@
     unittest.expect(o.autoDelete, unittest.isTrue);
     unittest.expect(o.boot, unittest.isTrue);
     unittest.expect(o.deviceName, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.diskEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.diskEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     checkUnnamed596(o.guestOsFeatures);
     unittest.expect(o.index, unittest.equals(42));
-    checkAttachedDiskInitializeParams(o.initializeParams);
+    checkAttachedDiskInitializeParams(
+        o.initializeParams as api.AttachedDiskInitializeParams);
     unittest.expect(o.interface, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed597(o.licenses);
     unittest.expect(o.mode, unittest.equals('foo'));
-    checkInitialStateConfig(o.shieldedInstanceInitialState);
+    checkInitialStateConfig(
+        o.shieldedInstanceInitialState as api.InitialStateConfig);
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -1115,9 +1136,11 @@
     unittest.expect(o.onUpdateAction, unittest.equals('foo'));
     checkUnnamed599(o.resourcePolicies);
     unittest.expect(o.sourceImage, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceImageEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceImageEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceSnapshot, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceSnapshotEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceSnapshotEncryptionKey as api.CustomerEncryptionKey);
   }
   buildCounterAttachedDiskInitializeParams--;
 }
@@ -1131,8 +1154,8 @@
 
 void checkUnnamed600(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.List<core.String> buildUnnamed601() {
@@ -1235,8 +1258,8 @@
 
 void checkUnnamed603(core.List<api.AutoscalerStatusDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscalerStatusDetails(o[0]);
-  checkAutoscalerStatusDetails(o[1]);
+  checkAutoscalerStatusDetails(o[0] as api.AutoscalerStatusDetails);
+  checkAutoscalerStatusDetails(o[1] as api.AutoscalerStatusDetails);
 }
 
 core.int buildCounterAutoscaler = 0;
@@ -1265,7 +1288,7 @@
 void checkAutoscaler(api.Autoscaler o) {
   buildCounterAutoscaler++;
   if (buildCounterAutoscaler < 3) {
-    checkAutoscalingPolicy(o.autoscalingPolicy);
+    checkAutoscalingPolicy(o.autoscalingPolicy as api.AutoscalingPolicy);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1291,8 +1314,8 @@
 
 void checkUnnamed604(core.Map<core.String, api.AutoscalersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscalersScopedList(o['x']);
-  checkAutoscalersScopedList(o['y']);
+  checkAutoscalersScopedList(o['x'] as api.AutoscalersScopedList);
+  checkAutoscalersScopedList(o['y'] as api.AutoscalersScopedList);
 }
 
 core.List<core.String> buildUnnamed605() {
@@ -1340,8 +1363,10 @@
 
 void checkUnnamed606(core.List<api.AutoscalerAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscalerAggregatedListWarningData(o[0]);
-  checkAutoscalerAggregatedListWarningData(o[1]);
+  checkAutoscalerAggregatedListWarningData(
+      o[0] as api.AutoscalerAggregatedListWarningData);
+  checkAutoscalerAggregatedListWarningData(
+      o[1] as api.AutoscalerAggregatedListWarningData);
 }
 
 core.int buildCounterAutoscalerAggregatedListWarning = 0;
@@ -1394,7 +1419,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed605(o.unreachables);
-    checkAutoscalerAggregatedListWarning(o.warning);
+    checkAutoscalerAggregatedListWarning(
+        o.warning as api.AutoscalerAggregatedListWarning);
   }
   buildCounterAutoscalerAggregatedList--;
 }
@@ -1408,8 +1434,8 @@
 
 void checkUnnamed607(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscaler(o[0]);
-  checkAutoscaler(o[1]);
+  checkAutoscaler(o[0] as api.Autoscaler);
+  checkAutoscaler(o[1] as api.Autoscaler);
 }
 
 core.int buildCounterAutoscalerListWarningData = 0;
@@ -1442,8 +1468,8 @@
 
 void checkUnnamed608(core.List<api.AutoscalerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscalerListWarningData(o[0]);
-  checkAutoscalerListWarningData(o[1]);
+  checkAutoscalerListWarningData(o[0] as api.AutoscalerListWarningData);
+  checkAutoscalerListWarningData(o[1] as api.AutoscalerListWarningData);
 }
 
 core.int buildCounterAutoscalerListWarning = 0;
@@ -1493,7 +1519,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkAutoscalerListWarning(o.warning);
+    checkAutoscalerListWarning(o.warning as api.AutoscalerListWarning);
   }
   buildCounterAutoscalerList--;
 }
@@ -1528,8 +1554,8 @@
 
 void checkUnnamed609(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscaler(o[0]);
-  checkAutoscaler(o[1]);
+  checkAutoscaler(o[0] as api.Autoscaler);
+  checkAutoscaler(o[1] as api.Autoscaler);
 }
 
 core.int buildCounterAutoscalersScopedListWarningData = 0;
@@ -1563,8 +1589,10 @@
 
 void checkUnnamed610(core.List<api.AutoscalersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscalersScopedListWarningData(o[0]);
-  checkAutoscalersScopedListWarningData(o[1]);
+  checkAutoscalersScopedListWarningData(
+      o[0] as api.AutoscalersScopedListWarningData);
+  checkAutoscalersScopedListWarningData(
+      o[1] as api.AutoscalersScopedListWarningData);
 }
 
 core.int buildCounterAutoscalersScopedListWarning = 0;
@@ -1606,7 +1634,8 @@
   buildCounterAutoscalersScopedList++;
   if (buildCounterAutoscalersScopedList < 3) {
     checkUnnamed609(o.autoscalers);
-    checkAutoscalersScopedListWarning(o.warning);
+    checkAutoscalersScopedListWarning(
+        o.warning as api.AutoscalersScopedListWarning);
   }
   buildCounterAutoscalersScopedList--;
 }
@@ -1621,8 +1650,10 @@
 void checkUnnamed611(
     core.List<api.AutoscalingPolicyCustomMetricUtilization> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscalingPolicyCustomMetricUtilization(o[0]);
-  checkAutoscalingPolicyCustomMetricUtilization(o[1]);
+  checkAutoscalingPolicyCustomMetricUtilization(
+      o[0] as api.AutoscalingPolicyCustomMetricUtilization);
+  checkAutoscalingPolicyCustomMetricUtilization(
+      o[1] as api.AutoscalingPolicyCustomMetricUtilization);
 }
 
 core.int buildCounterAutoscalingPolicy = 0;
@@ -1648,13 +1679,16 @@
   buildCounterAutoscalingPolicy++;
   if (buildCounterAutoscalingPolicy < 3) {
     unittest.expect(o.coolDownPeriodSec, unittest.equals(42));
-    checkAutoscalingPolicyCpuUtilization(o.cpuUtilization);
+    checkAutoscalingPolicyCpuUtilization(
+        o.cpuUtilization as api.AutoscalingPolicyCpuUtilization);
     checkUnnamed611(o.customMetricUtilizations);
-    checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization);
+    checkAutoscalingPolicyLoadBalancingUtilization(o.loadBalancingUtilization
+        as api.AutoscalingPolicyLoadBalancingUtilization);
     unittest.expect(o.maxNumReplicas, unittest.equals(42));
     unittest.expect(o.minNumReplicas, unittest.equals(42));
     unittest.expect(o.mode, unittest.equals('foo'));
-    checkAutoscalingPolicyScaleInControl(o.scaleInControl);
+    checkAutoscalingPolicyScaleInControl(
+        o.scaleInControl as api.AutoscalingPolicyScaleInControl);
   }
   buildCounterAutoscalingPolicy--;
 }
@@ -1741,7 +1775,7 @@
     api.AutoscalingPolicyScaleInControl o) {
   buildCounterAutoscalingPolicyScaleInControl++;
   if (buildCounterAutoscalingPolicyScaleInControl < 3) {
-    checkFixedOrPercent(o.maxScaledInReplicas);
+    checkFixedOrPercent(o.maxScaledInReplicas as api.FixedOrPercent);
     unittest.expect(o.timeWindowSec, unittest.equals(42));
   }
   buildCounterAutoscalingPolicyScaleInControl--;
@@ -1811,7 +1845,7 @@
   buildCounterBackendBucket++;
   if (buildCounterBackendBucket < 3) {
     unittest.expect(o.bucketName, unittest.equals('foo'));
-    checkBackendBucketCdnPolicy(o.cdnPolicy);
+    checkBackendBucketCdnPolicy(o.cdnPolicy as api.BackendBucketCdnPolicy);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.enableCdn, unittest.isTrue);
@@ -1866,8 +1900,8 @@
 
 void checkUnnamed613(core.List<api.BackendBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendBucket(o[0]);
-  checkBackendBucket(o[1]);
+  checkBackendBucket(o[0] as api.BackendBucket);
+  checkBackendBucket(o[1] as api.BackendBucket);
 }
 
 core.int buildCounterBackendBucketListWarningData = 0;
@@ -1900,8 +1934,8 @@
 
 void checkUnnamed614(core.List<api.BackendBucketListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendBucketListWarningData(o[0]);
-  checkBackendBucketListWarningData(o[1]);
+  checkBackendBucketListWarningData(o[0] as api.BackendBucketListWarningData);
+  checkBackendBucketListWarningData(o[1] as api.BackendBucketListWarningData);
 }
 
 core.int buildCounterBackendBucketListWarning = 0;
@@ -1951,7 +1985,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkBackendBucketListWarning(o.warning);
+    checkBackendBucketListWarning(o.warning as api.BackendBucketListWarning);
   }
   buildCounterBackendBucketList--;
 }
@@ -1965,8 +1999,8 @@
 
 void checkUnnamed615(core.List<api.Backend> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackend(o[0]);
-  checkBackend(o[1]);
+  checkBackend(o[0] as api.Backend);
+  checkBackend(o[1] as api.Backend);
 }
 
 core.List<core.String> buildUnnamed616() {
@@ -2040,26 +2074,28 @@
   if (buildCounterBackendService < 3) {
     unittest.expect(o.affinityCookieTtlSec, unittest.equals(42));
     checkUnnamed615(o.backends);
-    checkBackendServiceCdnPolicy(o.cdnPolicy);
-    checkCircuitBreakers(o.circuitBreakers);
-    checkConnectionDraining(o.connectionDraining);
-    checkConsistentHashLoadBalancerSettings(o.consistentHash);
+    checkBackendServiceCdnPolicy(o.cdnPolicy as api.BackendServiceCdnPolicy);
+    checkCircuitBreakers(o.circuitBreakers as api.CircuitBreakers);
+    checkConnectionDraining(o.connectionDraining as api.ConnectionDraining);
+    checkConsistentHashLoadBalancerSettings(
+        o.consistentHash as api.ConsistentHashLoadBalancerSettings);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     checkUnnamed616(o.customRequestHeaders);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.enableCDN, unittest.isTrue);
-    checkBackendServiceFailoverPolicy(o.failoverPolicy);
+    checkBackendServiceFailoverPolicy(
+        o.failoverPolicy as api.BackendServiceFailoverPolicy);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     checkUnnamed617(o.healthChecks);
-    checkBackendServiceIAP(o.iap);
+    checkBackendServiceIAP(o.iap as api.BackendServiceIAP);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.loadBalancingScheme, unittest.equals('foo'));
     unittest.expect(o.localityLbPolicy, unittest.equals('foo'));
-    checkBackendServiceLogConfig(o.logConfig);
+    checkBackendServiceLogConfig(o.logConfig as api.BackendServiceLogConfig);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkOutlierDetection(o.outlierDetection);
+    checkOutlierDetection(o.outlierDetection as api.OutlierDetection);
     unittest.expect(o.port, unittest.equals(42));
     unittest.expect(o.portName, unittest.equals('foo'));
     unittest.expect(o.protocol, unittest.equals('foo'));
@@ -2081,8 +2117,8 @@
 
 void checkUnnamed618(core.Map<core.String, api.BackendServicesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendServicesScopedList(o['x']);
-  checkBackendServicesScopedList(o['y']);
+  checkBackendServicesScopedList(o['x'] as api.BackendServicesScopedList);
+  checkBackendServicesScopedList(o['y'] as api.BackendServicesScopedList);
 }
 
 core.List<core.String> buildUnnamed619() {
@@ -2130,8 +2166,10 @@
 
 void checkUnnamed620(core.List<api.BackendServiceAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendServiceAggregatedListWarningData(o[0]);
-  checkBackendServiceAggregatedListWarningData(o[1]);
+  checkBackendServiceAggregatedListWarningData(
+      o[0] as api.BackendServiceAggregatedListWarningData);
+  checkBackendServiceAggregatedListWarningData(
+      o[1] as api.BackendServiceAggregatedListWarningData);
 }
 
 core.int buildCounterBackendServiceAggregatedListWarning = 0;
@@ -2185,7 +2223,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed619(o.unreachables);
-    checkBackendServiceAggregatedListWarning(o.warning);
+    checkBackendServiceAggregatedListWarning(
+        o.warning as api.BackendServiceAggregatedListWarning);
   }
   buildCounterBackendServiceAggregatedList--;
 }
@@ -2219,7 +2258,7 @@
 void checkBackendServiceCdnPolicy(api.BackendServiceCdnPolicy o) {
   buildCounterBackendServiceCdnPolicy++;
   if (buildCounterBackendServiceCdnPolicy < 3) {
-    checkCacheKeyPolicy(o.cacheKeyPolicy);
+    checkCacheKeyPolicy(o.cacheKeyPolicy as api.CacheKeyPolicy);
     unittest.expect(o.signedUrlCacheMaxAgeSec, unittest.equals('foo'));
     checkUnnamed621(o.signedUrlKeyNames);
   }
@@ -2271,8 +2310,8 @@
 
 void checkUnnamed623(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthStatus(o[0]);
-  checkHealthStatus(o[1]);
+  checkHealthStatus(o[0] as api.HealthStatus);
+  checkHealthStatus(o[1] as api.HealthStatus);
 }
 
 core.int buildCounterBackendServiceGroupHealth = 0;
@@ -2332,8 +2371,8 @@
 
 void checkUnnamed624(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendService(o[0]);
-  checkBackendService(o[1]);
+  checkBackendService(o[0] as api.BackendService);
+  checkBackendService(o[1] as api.BackendService);
 }
 
 core.int buildCounterBackendServiceListWarningData = 0;
@@ -2366,8 +2405,8 @@
 
 void checkUnnamed625(core.List<api.BackendServiceListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendServiceListWarningData(o[0]);
-  checkBackendServiceListWarningData(o[1]);
+  checkBackendServiceListWarningData(o[0] as api.BackendServiceListWarningData);
+  checkBackendServiceListWarningData(o[1] as api.BackendServiceListWarningData);
 }
 
 core.int buildCounterBackendServiceListWarning = 0;
@@ -2417,7 +2456,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkBackendServiceListWarning(o.warning);
+    checkBackendServiceListWarning(o.warning as api.BackendServiceListWarning);
   }
   buildCounterBackendServiceList--;
 }
@@ -2471,8 +2510,8 @@
 
 void checkUnnamed626(core.List<api.BackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendService(o[0]);
-  checkBackendService(o[1]);
+  checkBackendService(o[0] as api.BackendService);
+  checkBackendService(o[1] as api.BackendService);
 }
 
 core.int buildCounterBackendServicesScopedListWarningData = 0;
@@ -2507,8 +2546,10 @@
 
 void checkUnnamed627(core.List<api.BackendServicesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendServicesScopedListWarningData(o[0]);
-  checkBackendServicesScopedListWarningData(o[1]);
+  checkBackendServicesScopedListWarningData(
+      o[0] as api.BackendServicesScopedListWarningData);
+  checkBackendServicesScopedListWarningData(
+      o[1] as api.BackendServicesScopedListWarningData);
 }
 
 core.int buildCounterBackendServicesScopedListWarning = 0;
@@ -2551,7 +2592,8 @@
   buildCounterBackendServicesScopedList++;
   if (buildCounterBackendServicesScopedList < 3) {
     checkUnnamed626(o.backendServices);
-    checkBackendServicesScopedListWarning(o.warning);
+    checkBackendServicesScopedListWarning(
+        o.warning as api.BackendServicesScopedListWarning);
   }
   buildCounterBackendServicesScopedList--;
 }
@@ -2587,7 +2629,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed628(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -2704,8 +2746,8 @@
 
 void checkUnnamed631(core.List<api.Reservation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservation(o[0]);
-  checkReservation(o[1]);
+  checkReservation(o[0] as api.Reservation);
+  checkReservation(o[1] as api.Reservation);
 }
 
 core.List<api.ResourceCommitment> buildUnnamed632() {
@@ -2717,8 +2759,8 @@
 
 void checkUnnamed632(core.List<api.ResourceCommitment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceCommitment(o[0]);
-  checkResourceCommitment(o[1]);
+  checkResourceCommitment(o[0] as api.ResourceCommitment);
+  checkResourceCommitment(o[1] as api.ResourceCommitment);
 }
 
 core.int buildCounterCommitment = 0;
@@ -2756,7 +2798,8 @@
     unittest.expect(o.endTimestamp, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLicenseResourceCommitment(o.licenseResource);
+    checkLicenseResourceCommitment(
+        o.licenseResource as api.LicenseResourceCommitment);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.plan, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -2779,8 +2822,8 @@
 
 void checkUnnamed633(core.Map<core.String, api.CommitmentsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommitmentsScopedList(o['x']);
-  checkCommitmentsScopedList(o['y']);
+  checkCommitmentsScopedList(o['x'] as api.CommitmentsScopedList);
+  checkCommitmentsScopedList(o['y'] as api.CommitmentsScopedList);
 }
 
 core.List<core.String> buildUnnamed634() {
@@ -2828,8 +2871,10 @@
 
 void checkUnnamed635(core.List<api.CommitmentAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommitmentAggregatedListWarningData(o[0]);
-  checkCommitmentAggregatedListWarningData(o[1]);
+  checkCommitmentAggregatedListWarningData(
+      o[0] as api.CommitmentAggregatedListWarningData);
+  checkCommitmentAggregatedListWarningData(
+      o[1] as api.CommitmentAggregatedListWarningData);
 }
 
 core.int buildCounterCommitmentAggregatedListWarning = 0;
@@ -2882,7 +2927,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed634(o.unreachables);
-    checkCommitmentAggregatedListWarning(o.warning);
+    checkCommitmentAggregatedListWarning(
+        o.warning as api.CommitmentAggregatedListWarning);
   }
   buildCounterCommitmentAggregatedList--;
 }
@@ -2896,8 +2942,8 @@
 
 void checkUnnamed636(core.List<api.Commitment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommitment(o[0]);
-  checkCommitment(o[1]);
+  checkCommitment(o[0] as api.Commitment);
+  checkCommitment(o[1] as api.Commitment);
 }
 
 core.int buildCounterCommitmentListWarningData = 0;
@@ -2930,8 +2976,8 @@
 
 void checkUnnamed637(core.List<api.CommitmentListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommitmentListWarningData(o[0]);
-  checkCommitmentListWarningData(o[1]);
+  checkCommitmentListWarningData(o[0] as api.CommitmentListWarningData);
+  checkCommitmentListWarningData(o[1] as api.CommitmentListWarningData);
 }
 
 core.int buildCounterCommitmentListWarning = 0;
@@ -2981,7 +3027,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkCommitmentListWarning(o.warning);
+    checkCommitmentListWarning(o.warning as api.CommitmentListWarning);
   }
   buildCounterCommitmentList--;
 }
@@ -2995,8 +3041,8 @@
 
 void checkUnnamed638(core.List<api.Commitment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommitment(o[0]);
-  checkCommitment(o[1]);
+  checkCommitment(o[0] as api.Commitment);
+  checkCommitment(o[1] as api.Commitment);
 }
 
 core.int buildCounterCommitmentsScopedListWarningData = 0;
@@ -3030,8 +3076,10 @@
 
 void checkUnnamed639(core.List<api.CommitmentsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommitmentsScopedListWarningData(o[0]);
-  checkCommitmentsScopedListWarningData(o[1]);
+  checkCommitmentsScopedListWarningData(
+      o[0] as api.CommitmentsScopedListWarningData);
+  checkCommitmentsScopedListWarningData(
+      o[1] as api.CommitmentsScopedListWarningData);
 }
 
 core.int buildCounterCommitmentsScopedListWarning = 0;
@@ -3073,7 +3121,8 @@
   buildCounterCommitmentsScopedList++;
   if (buildCounterCommitmentsScopedList < 3) {
     checkUnnamed638(o.commitments);
-    checkCommitmentsScopedListWarning(o.warning);
+    checkCommitmentsScopedListWarning(
+        o.warning as api.CommitmentsScopedListWarning);
   }
   buildCounterCommitmentsScopedList--;
 }
@@ -3174,7 +3223,8 @@
     api.ConsistentHashLoadBalancerSettings o) {
   buildCounterConsistentHashLoadBalancerSettings++;
   if (buildCounterConsistentHashLoadBalancerSettings < 3) {
-    checkConsistentHashLoadBalancerSettingsHttpCookie(o.httpCookie);
+    checkConsistentHashLoadBalancerSettingsHttpCookie(
+        o.httpCookie as api.ConsistentHashLoadBalancerSettingsHttpCookie);
     unittest.expect(o.httpHeaderName, unittest.equals('foo'));
     unittest.expect(o.minimumRingSize, unittest.equals('foo'));
   }
@@ -3201,7 +3251,7 @@
   if (buildCounterConsistentHashLoadBalancerSettingsHttpCookie < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
-    checkDuration(o.ttl);
+    checkDuration(o.ttl as api.Duration);
   }
   buildCounterConsistentHashLoadBalancerSettingsHttpCookie--;
 }
@@ -3346,7 +3396,8 @@
     api.CustomerEncryptionKeyProtectedDisk o) {
   buildCounterCustomerEncryptionKeyProtectedDisk++;
   if (buildCounterCustomerEncryptionKeyProtectedDisk < 3) {
-    checkCustomerEncryptionKey(o.diskEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.diskEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.source, unittest.equals('foo'));
   }
   buildCounterCustomerEncryptionKeyProtectedDisk--;
@@ -3388,8 +3439,8 @@
 
 void checkUnnamed646(core.List<api.GuestOsFeature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGuestOsFeature(o[0]);
-  checkGuestOsFeature(o[1]);
+  checkGuestOsFeature(o[0] as api.GuestOsFeature);
+  checkGuestOsFeature(o[1] as api.GuestOsFeature);
 }
 
 core.Map<core.String, core.String> buildUnnamed647() {
@@ -3517,7 +3568,8 @@
   if (buildCounterDisk < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.diskEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.diskEncryptionKey as api.CustomerEncryptionKey);
     checkUnnamed646(o.guestOsFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -3538,10 +3590,12 @@
     unittest.expect(o.sourceDisk, unittest.equals('foo'));
     unittest.expect(o.sourceDiskId, unittest.equals('foo'));
     unittest.expect(o.sourceImage, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceImageEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceImageEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceImageId, unittest.equals('foo'));
     unittest.expect(o.sourceSnapshot, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceSnapshotEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceSnapshotEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceSnapshotId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -3560,8 +3614,8 @@
 
 void checkUnnamed653(core.Map<core.String, api.DisksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisksScopedList(o['x']);
-  checkDisksScopedList(o['y']);
+  checkDisksScopedList(o['x'] as api.DisksScopedList);
+  checkDisksScopedList(o['y'] as api.DisksScopedList);
 }
 
 core.List<core.String> buildUnnamed654() {
@@ -3607,8 +3661,8 @@
 
 void checkUnnamed655(core.List<api.DiskAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskAggregatedListWarningData(o[0]);
-  checkDiskAggregatedListWarningData(o[1]);
+  checkDiskAggregatedListWarningData(o[0] as api.DiskAggregatedListWarningData);
+  checkDiskAggregatedListWarningData(o[1] as api.DiskAggregatedListWarningData);
 }
 
 core.int buildCounterDiskAggregatedListWarning = 0;
@@ -3660,7 +3714,7 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed654(o.unreachables);
-    checkDiskAggregatedListWarning(o.warning);
+    checkDiskAggregatedListWarning(o.warning as api.DiskAggregatedListWarning);
   }
   buildCounterDiskAggregatedList--;
 }
@@ -3699,8 +3753,8 @@
 
 void checkUnnamed656(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisk(o[0]);
-  checkDisk(o[1]);
+  checkDisk(o[0] as api.Disk);
+  checkDisk(o[1] as api.Disk);
 }
 
 core.int buildCounterDiskListWarningData = 0;
@@ -3733,8 +3787,8 @@
 
 void checkUnnamed657(core.List<api.DiskListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskListWarningData(o[0]);
-  checkDiskListWarningData(o[1]);
+  checkDiskListWarningData(o[0] as api.DiskListWarningData);
+  checkDiskListWarningData(o[1] as api.DiskListWarningData);
 }
 
 core.int buildCounterDiskListWarning = 0;
@@ -3784,7 +3838,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkDiskListWarning(o.warning);
+    checkDiskListWarning(o.warning as api.DiskListWarning);
   }
   buildCounterDiskList--;
 }
@@ -3836,7 +3890,7 @@
   if (buildCounterDiskType < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.defaultDiskSizeGb, unittest.equals('foo'));
-    checkDeprecationStatus(o.deprecated);
+    checkDeprecationStatus(o.deprecated as api.DeprecationStatus);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -3858,8 +3912,8 @@
 
 void checkUnnamed658(core.Map<core.String, api.DiskTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskTypesScopedList(o['x']);
-  checkDiskTypesScopedList(o['y']);
+  checkDiskTypesScopedList(o['x'] as api.DiskTypesScopedList);
+  checkDiskTypesScopedList(o['y'] as api.DiskTypesScopedList);
 }
 
 core.List<core.String> buildUnnamed659() {
@@ -3906,8 +3960,10 @@
 
 void checkUnnamed660(core.List<api.DiskTypeAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskTypeAggregatedListWarningData(o[0]);
-  checkDiskTypeAggregatedListWarningData(o[1]);
+  checkDiskTypeAggregatedListWarningData(
+      o[0] as api.DiskTypeAggregatedListWarningData);
+  checkDiskTypeAggregatedListWarningData(
+      o[1] as api.DiskTypeAggregatedListWarningData);
 }
 
 core.int buildCounterDiskTypeAggregatedListWarning = 0;
@@ -3959,7 +4015,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed659(o.unreachables);
-    checkDiskTypeAggregatedListWarning(o.warning);
+    checkDiskTypeAggregatedListWarning(
+        o.warning as api.DiskTypeAggregatedListWarning);
   }
   buildCounterDiskTypeAggregatedList--;
 }
@@ -3973,8 +4030,8 @@
 
 void checkUnnamed661(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskType(o[0]);
-  checkDiskType(o[1]);
+  checkDiskType(o[0] as api.DiskType);
+  checkDiskType(o[1] as api.DiskType);
 }
 
 core.int buildCounterDiskTypeListWarningData = 0;
@@ -4007,8 +4064,8 @@
 
 void checkUnnamed662(core.List<api.DiskTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskTypeListWarningData(o[0]);
-  checkDiskTypeListWarningData(o[1]);
+  checkDiskTypeListWarningData(o[0] as api.DiskTypeListWarningData);
+  checkDiskTypeListWarningData(o[1] as api.DiskTypeListWarningData);
 }
 
 core.int buildCounterDiskTypeListWarning = 0;
@@ -4058,7 +4115,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkDiskTypeListWarning(o.warning);
+    checkDiskTypeListWarning(o.warning as api.DiskTypeListWarning);
   }
   buildCounterDiskTypeList--;
 }
@@ -4072,8 +4129,8 @@
 
 void checkUnnamed663(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskType(o[0]);
-  checkDiskType(o[1]);
+  checkDiskType(o[0] as api.DiskType);
+  checkDiskType(o[1] as api.DiskType);
 }
 
 core.int buildCounterDiskTypesScopedListWarningData = 0;
@@ -4106,8 +4163,10 @@
 
 void checkUnnamed664(core.List<api.DiskTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskTypesScopedListWarningData(o[0]);
-  checkDiskTypesScopedListWarningData(o[1]);
+  checkDiskTypesScopedListWarningData(
+      o[0] as api.DiskTypesScopedListWarningData);
+  checkDiskTypesScopedListWarningData(
+      o[1] as api.DiskTypesScopedListWarningData);
 }
 
 core.int buildCounterDiskTypesScopedListWarning = 0;
@@ -4149,7 +4208,8 @@
   buildCounterDiskTypesScopedList++;
   if (buildCounterDiskTypesScopedList < 3) {
     checkUnnamed663(o.diskTypes);
-    checkDiskTypesScopedListWarning(o.warning);
+    checkDiskTypesScopedListWarning(
+        o.warning as api.DiskTypesScopedListWarning);
   }
   buildCounterDiskTypesScopedList--;
 }
@@ -4249,8 +4309,8 @@
 
 void checkUnnamed667(core.List<api.Disk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisk(o[0]);
-  checkDisk(o[1]);
+  checkDisk(o[0] as api.Disk);
+  checkDisk(o[1] as api.Disk);
 }
 
 core.int buildCounterDisksScopedListWarningData = 0;
@@ -4283,8 +4343,8 @@
 
 void checkUnnamed668(core.List<api.DisksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisksScopedListWarningData(o[0]);
-  checkDisksScopedListWarningData(o[1]);
+  checkDisksScopedListWarningData(o[0] as api.DisksScopedListWarningData);
+  checkDisksScopedListWarningData(o[1] as api.DisksScopedListWarningData);
 }
 
 core.int buildCounterDisksScopedListWarning = 0;
@@ -4326,7 +4386,7 @@
   buildCounterDisksScopedList++;
   if (buildCounterDisksScopedList < 3) {
     checkUnnamed667(o.disks);
-    checkDisksScopedListWarning(o.warning);
+    checkDisksScopedListWarning(o.warning as api.DisksScopedListWarning);
   }
   buildCounterDisksScopedList--;
 }
@@ -4359,8 +4419,10 @@
 
 void checkUnnamed669(core.List<api.DistributionPolicyZoneConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDistributionPolicyZoneConfiguration(o[0]);
-  checkDistributionPolicyZoneConfiguration(o[1]);
+  checkDistributionPolicyZoneConfiguration(
+      o[0] as api.DistributionPolicyZoneConfiguration);
+  checkDistributionPolicyZoneConfiguration(
+      o[1] as api.DistributionPolicyZoneConfiguration);
 }
 
 core.int buildCounterDistributionPolicy = 0;
@@ -4460,8 +4522,8 @@
 
 void checkUnnamed670(core.List<api.ExchangedPeeringRoute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExchangedPeeringRoute(o[0]);
-  checkExchangedPeeringRoute(o[1]);
+  checkExchangedPeeringRoute(o[0] as api.ExchangedPeeringRoute);
+  checkExchangedPeeringRoute(o[1] as api.ExchangedPeeringRoute);
 }
 
 core.int buildCounterExchangedPeeringRoutesListWarningData = 0;
@@ -4496,8 +4558,10 @@
 
 void checkUnnamed671(core.List<api.ExchangedPeeringRoutesListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExchangedPeeringRoutesListWarningData(o[0]);
-  checkExchangedPeeringRoutesListWarningData(o[1]);
+  checkExchangedPeeringRoutesListWarningData(
+      o[0] as api.ExchangedPeeringRoutesListWarningData);
+  checkExchangedPeeringRoutesListWarningData(
+      o[1] as api.ExchangedPeeringRoutesListWarningData);
 }
 
 core.int buildCounterExchangedPeeringRoutesListWarning = 0;
@@ -4548,7 +4612,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkExchangedPeeringRoutesListWarning(o.warning);
+    checkExchangedPeeringRoutesListWarning(
+        o.warning as api.ExchangedPeeringRoutesListWarning);
   }
   buildCounterExchangedPeeringRoutesList--;
 }
@@ -4587,8 +4652,8 @@
 
 void checkUnnamed672(core.List<api.ExternalVpnGatewayInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExternalVpnGatewayInterface(o[0]);
-  checkExternalVpnGatewayInterface(o[1]);
+  checkExternalVpnGatewayInterface(o[0] as api.ExternalVpnGatewayInterface);
+  checkExternalVpnGatewayInterface(o[1] as api.ExternalVpnGatewayInterface);
 }
 
 core.Map<core.String, core.String> buildUnnamed673() {
@@ -4671,8 +4736,8 @@
 
 void checkUnnamed674(core.List<api.ExternalVpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExternalVpnGateway(o[0]);
-  checkExternalVpnGateway(o[1]);
+  checkExternalVpnGateway(o[0] as api.ExternalVpnGateway);
+  checkExternalVpnGateway(o[1] as api.ExternalVpnGateway);
 }
 
 core.int buildCounterExternalVpnGatewayListWarningData = 0;
@@ -4706,8 +4771,10 @@
 
 void checkUnnamed675(core.List<api.ExternalVpnGatewayListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExternalVpnGatewayListWarningData(o[0]);
-  checkExternalVpnGatewayListWarningData(o[1]);
+  checkExternalVpnGatewayListWarningData(
+      o[0] as api.ExternalVpnGatewayListWarningData);
+  checkExternalVpnGatewayListWarningData(
+      o[1] as api.ExternalVpnGatewayListWarningData);
 }
 
 core.int buildCounterExternalVpnGatewayListWarning = 0;
@@ -4759,7 +4826,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkExternalVpnGatewayListWarning(o.warning);
+    checkExternalVpnGatewayListWarning(
+        o.warning as api.ExternalVpnGatewayListWarning);
   }
   buildCounterExternalVpnGatewayList--;
 }
@@ -4828,8 +4896,8 @@
 
 void checkUnnamed677(core.List<api.FirewallAllowed> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirewallAllowed(o[0]);
-  checkFirewallAllowed(o[1]);
+  checkFirewallAllowed(o[0] as api.FirewallAllowed);
+  checkFirewallAllowed(o[1] as api.FirewallAllowed);
 }
 
 core.List<core.String> buildUnnamed678() {
@@ -4875,8 +4943,8 @@
 
 void checkUnnamed679(core.List<api.FirewallDenied> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirewallDenied(o[0]);
-  checkFirewallDenied(o[1]);
+  checkFirewallDenied(o[0] as api.FirewallDenied);
+  checkFirewallDenied(o[1] as api.FirewallDenied);
 }
 
 core.List<core.String> buildUnnamed680() {
@@ -4998,7 +5066,7 @@
     unittest.expect(o.disabled, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkFirewallLogConfig(o.logConfig);
+    checkFirewallLogConfig(o.logConfig as api.FirewallLogConfig);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals(42));
@@ -5021,8 +5089,8 @@
 
 void checkUnnamed686(core.List<api.Firewall> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirewall(o[0]);
-  checkFirewall(o[1]);
+  checkFirewall(o[0] as api.Firewall);
+  checkFirewall(o[1] as api.Firewall);
 }
 
 core.int buildCounterFirewallListWarningData = 0;
@@ -5055,8 +5123,8 @@
 
 void checkUnnamed687(core.List<api.FirewallListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirewallListWarningData(o[0]);
-  checkFirewallListWarningData(o[1]);
+  checkFirewallListWarningData(o[0] as api.FirewallListWarningData);
+  checkFirewallListWarningData(o[1] as api.FirewallListWarningData);
 }
 
 core.int buildCounterFirewallListWarning = 0;
@@ -5106,7 +5174,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkFirewallListWarning(o.warning);
+    checkFirewallListWarning(o.warning as api.FirewallListWarning);
   }
   buildCounterFirewallList--;
 }
@@ -5164,8 +5232,8 @@
 
 void checkUnnamed688(core.List<api.MetadataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetadataFilter(o[0]);
-  checkMetadataFilter(o[1]);
+  checkMetadataFilter(o[0] as api.MetadataFilter);
+  checkMetadataFilter(o[1] as api.MetadataFilter);
 }
 
 core.List<core.String> buildUnnamed689() {
@@ -5257,8 +5325,8 @@
 
 void checkUnnamed690(core.Map<core.String, api.ForwardingRulesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkForwardingRulesScopedList(o['x']);
-  checkForwardingRulesScopedList(o['y']);
+  checkForwardingRulesScopedList(o['x'] as api.ForwardingRulesScopedList);
+  checkForwardingRulesScopedList(o['y'] as api.ForwardingRulesScopedList);
 }
 
 core.List<core.String> buildUnnamed691() {
@@ -5306,8 +5374,10 @@
 
 void checkUnnamed692(core.List<api.ForwardingRuleAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkForwardingRuleAggregatedListWarningData(o[0]);
-  checkForwardingRuleAggregatedListWarningData(o[1]);
+  checkForwardingRuleAggregatedListWarningData(
+      o[0] as api.ForwardingRuleAggregatedListWarningData);
+  checkForwardingRuleAggregatedListWarningData(
+      o[1] as api.ForwardingRuleAggregatedListWarningData);
 }
 
 core.int buildCounterForwardingRuleAggregatedListWarning = 0;
@@ -5361,7 +5431,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed691(o.unreachables);
-    checkForwardingRuleAggregatedListWarning(o.warning);
+    checkForwardingRuleAggregatedListWarning(
+        o.warning as api.ForwardingRuleAggregatedListWarning);
   }
   buildCounterForwardingRuleAggregatedList--;
 }
@@ -5375,8 +5446,8 @@
 
 void checkUnnamed693(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkForwardingRule(o[0]);
-  checkForwardingRule(o[1]);
+  checkForwardingRule(o[0] as api.ForwardingRule);
+  checkForwardingRule(o[1] as api.ForwardingRule);
 }
 
 core.int buildCounterForwardingRuleListWarningData = 0;
@@ -5409,8 +5480,8 @@
 
 void checkUnnamed694(core.List<api.ForwardingRuleListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkForwardingRuleListWarningData(o[0]);
-  checkForwardingRuleListWarningData(o[1]);
+  checkForwardingRuleListWarningData(o[0] as api.ForwardingRuleListWarningData);
+  checkForwardingRuleListWarningData(o[1] as api.ForwardingRuleListWarningData);
 }
 
 core.int buildCounterForwardingRuleListWarning = 0;
@@ -5460,7 +5531,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkForwardingRuleListWarning(o.warning);
+    checkForwardingRuleListWarning(o.warning as api.ForwardingRuleListWarning);
   }
   buildCounterForwardingRuleList--;
 }
@@ -5493,8 +5564,8 @@
 
 void checkUnnamed695(core.List<api.ForwardingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkForwardingRule(o[0]);
-  checkForwardingRule(o[1]);
+  checkForwardingRule(o[0] as api.ForwardingRule);
+  checkForwardingRule(o[1] as api.ForwardingRule);
 }
 
 core.int buildCounterForwardingRulesScopedListWarningData = 0;
@@ -5529,8 +5600,10 @@
 
 void checkUnnamed696(core.List<api.ForwardingRulesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkForwardingRulesScopedListWarningData(o[0]);
-  checkForwardingRulesScopedListWarningData(o[1]);
+  checkForwardingRulesScopedListWarningData(
+      o[0] as api.ForwardingRulesScopedListWarningData);
+  checkForwardingRulesScopedListWarningData(
+      o[1] as api.ForwardingRulesScopedListWarningData);
 }
 
 core.int buildCounterForwardingRulesScopedListWarning = 0;
@@ -5573,7 +5646,8 @@
   buildCounterForwardingRulesScopedList++;
   if (buildCounterForwardingRulesScopedList < 3) {
     checkUnnamed695(o.forwardingRules);
-    checkForwardingRulesScopedListWarning(o.warning);
+    checkForwardingRulesScopedListWarning(
+        o.warning as api.ForwardingRulesScopedListWarning);
   }
   buildCounterForwardingRulesScopedList--;
 }
@@ -5612,8 +5686,8 @@
 
 void checkUnnamed697(core.List<api.NetworkEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpoint(o[0]);
-  checkNetworkEndpoint(o[1]);
+  checkNetworkEndpoint(o[0] as api.NetworkEndpoint);
+  checkNetworkEndpoint(o[1] as api.NetworkEndpoint);
 }
 
 core.int buildCounterGlobalNetworkEndpointGroupsAttachEndpointsRequest = 0;
@@ -5646,8 +5720,8 @@
 
 void checkUnnamed698(core.List<api.NetworkEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpoint(o[0]);
-  checkNetworkEndpoint(o[1]);
+  checkNetworkEndpoint(o[0] as api.NetworkEndpoint);
+  checkNetworkEndpoint(o[1] as api.NetworkEndpoint);
 }
 
 core.int buildCounterGlobalNetworkEndpointGroupsDetachEndpointsRequest = 0;
@@ -5714,8 +5788,8 @@
 
 void checkUnnamed700(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterGlobalSetPolicyRequest = 0;
@@ -5736,7 +5810,7 @@
   if (buildCounterGlobalSetPolicyRequest < 3) {
     checkUnnamed700(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterGlobalSetPolicyRequest--;
 }
@@ -5762,7 +5836,7 @@
   if (buildCounterGuestAttributes < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.queryPath, unittest.equals('foo'));
-    checkGuestAttributesValue(o.queryValue);
+    checkGuestAttributesValue(o.queryValue as api.GuestAttributesValue);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.variableKey, unittest.equals('foo'));
     unittest.expect(o.variableValue, unittest.equals('foo'));
@@ -5802,8 +5876,8 @@
 
 void checkUnnamed701(core.List<api.GuestAttributesEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGuestAttributesEntry(o[0]);
-  checkGuestAttributesEntry(o[1]);
+  checkGuestAttributesEntry(o[0] as api.GuestAttributesEntry);
+  checkGuestAttributesEntry(o[1] as api.GuestAttributesEntry);
 }
 
 core.int buildCounterGuestAttributesValue = 0;
@@ -5971,18 +6045,18 @@
     unittest.expect(o.checkIntervalSec, unittest.equals(42));
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGRPCHealthCheck(o.grpcHealthCheck);
+    checkGRPCHealthCheck(o.grpcHealthCheck as api.GRPCHealthCheck);
     unittest.expect(o.healthyThreshold, unittest.equals(42));
-    checkHTTP2HealthCheck(o.http2HealthCheck);
-    checkHTTPHealthCheck(o.httpHealthCheck);
-    checkHTTPSHealthCheck(o.httpsHealthCheck);
+    checkHTTP2HealthCheck(o.http2HealthCheck as api.HTTP2HealthCheck);
+    checkHTTPHealthCheck(o.httpHealthCheck as api.HTTPHealthCheck);
+    checkHTTPSHealthCheck(o.httpsHealthCheck as api.HTTPSHealthCheck);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkSSLHealthCheck(o.sslHealthCheck);
-    checkTCPHealthCheck(o.tcpHealthCheck);
+    checkSSLHealthCheck(o.sslHealthCheck as api.SSLHealthCheck);
+    checkTCPHealthCheck(o.tcpHealthCheck as api.TCPHealthCheck);
     unittest.expect(o.timeoutSec, unittest.equals(42));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unhealthyThreshold, unittest.equals(42));
@@ -5999,8 +6073,8 @@
 
 void checkUnnamed702(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheck(o[0]);
-  checkHealthCheck(o[1]);
+  checkHealthCheck(o[0] as api.HealthCheck);
+  checkHealthCheck(o[1] as api.HealthCheck);
 }
 
 core.int buildCounterHealthCheckListWarningData = 0;
@@ -6033,8 +6107,8 @@
 
 void checkUnnamed703(core.List<api.HealthCheckListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheckListWarningData(o[0]);
-  checkHealthCheckListWarningData(o[1]);
+  checkHealthCheckListWarningData(o[0] as api.HealthCheckListWarningData);
+  checkHealthCheckListWarningData(o[1] as api.HealthCheckListWarningData);
 }
 
 core.int buildCounterHealthCheckListWarning = 0;
@@ -6084,7 +6158,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkHealthCheckListWarning(o.warning);
+    checkHealthCheckListWarning(o.warning as api.HealthCheckListWarning);
   }
   buildCounterHealthCheckList--;
 }
@@ -6216,8 +6290,8 @@
 
 void checkUnnamed707(core.List<api.HealthCheckService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheckService(o[0]);
-  checkHealthCheckService(o[1]);
+  checkHealthCheckService(o[0] as api.HealthCheckService);
+  checkHealthCheckService(o[1] as api.HealthCheckService);
 }
 
 core.int buildCounterHealthCheckServicesListWarningData = 0;
@@ -6252,8 +6326,10 @@
 
 void checkUnnamed708(core.List<api.HealthCheckServicesListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheckServicesListWarningData(o[0]);
-  checkHealthCheckServicesListWarningData(o[1]);
+  checkHealthCheckServicesListWarningData(
+      o[0] as api.HealthCheckServicesListWarningData);
+  checkHealthCheckServicesListWarningData(
+      o[1] as api.HealthCheckServicesListWarningData);
 }
 
 core.int buildCounterHealthCheckServicesListWarning = 0;
@@ -6303,7 +6379,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkHealthCheckServicesListWarning(o.warning);
+    checkHealthCheckServicesListWarning(
+        o.warning as api.HealthCheckServicesListWarning);
   }
   buildCounterHealthCheckServicesList--;
 }
@@ -6317,8 +6394,8 @@
 
 void checkUnnamed709(core.Map<core.String, api.HealthChecksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthChecksScopedList(o['x']);
-  checkHealthChecksScopedList(o['y']);
+  checkHealthChecksScopedList(o['x'] as api.HealthChecksScopedList);
+  checkHealthChecksScopedList(o['y'] as api.HealthChecksScopedList);
 }
 
 core.List<core.String> buildUnnamed710() {
@@ -6366,8 +6443,10 @@
 
 void checkUnnamed711(core.List<api.HealthChecksAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthChecksAggregatedListWarningData(o[0]);
-  checkHealthChecksAggregatedListWarningData(o[1]);
+  checkHealthChecksAggregatedListWarningData(
+      o[0] as api.HealthChecksAggregatedListWarningData);
+  checkHealthChecksAggregatedListWarningData(
+      o[1] as api.HealthChecksAggregatedListWarningData);
 }
 
 core.int buildCounterHealthChecksAggregatedListWarning = 0;
@@ -6420,7 +6499,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed710(o.unreachables);
-    checkHealthChecksAggregatedListWarning(o.warning);
+    checkHealthChecksAggregatedListWarning(
+        o.warning as api.HealthChecksAggregatedListWarning);
   }
   buildCounterHealthChecksAggregatedList--;
 }
@@ -6434,8 +6514,8 @@
 
 void checkUnnamed712(core.List<api.HealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheck(o[0]);
-  checkHealthCheck(o[1]);
+  checkHealthCheck(o[0] as api.HealthCheck);
+  checkHealthCheck(o[1] as api.HealthCheck);
 }
 
 core.int buildCounterHealthChecksScopedListWarningData = 0;
@@ -6469,8 +6549,10 @@
 
 void checkUnnamed713(core.List<api.HealthChecksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthChecksScopedListWarningData(o[0]);
-  checkHealthChecksScopedListWarningData(o[1]);
+  checkHealthChecksScopedListWarningData(
+      o[0] as api.HealthChecksScopedListWarningData);
+  checkHealthChecksScopedListWarningData(
+      o[1] as api.HealthChecksScopedListWarningData);
 }
 
 core.int buildCounterHealthChecksScopedListWarning = 0;
@@ -6512,7 +6594,8 @@
   buildCounterHealthChecksScopedList++;
   if (buildCounterHealthChecksScopedList < 3) {
     checkUnnamed712(o.healthChecks);
-    checkHealthChecksScopedListWarning(o.warning);
+    checkHealthChecksScopedListWarning(
+        o.warning as api.HealthChecksScopedListWarning);
   }
   buildCounterHealthChecksScopedList--;
 }
@@ -6575,10 +6658,13 @@
 void checkHealthStatusForNetworkEndpoint(api.HealthStatusForNetworkEndpoint o) {
   buildCounterHealthStatusForNetworkEndpoint++;
   if (buildCounterHealthStatusForNetworkEndpoint < 3) {
-    checkBackendServiceReference(o.backendService);
-    checkForwardingRuleReference(o.forwardingRule);
-    checkHealthCheckReference(o.healthCheck);
-    checkHealthCheckServiceReference(o.healthCheckService);
+    checkBackendServiceReference(
+        o.backendService as api.BackendServiceReference);
+    checkForwardingRuleReference(
+        o.forwardingRule as api.ForwardingRuleReference);
+    checkHealthCheckReference(o.healthCheck as api.HealthCheckReference);
+    checkHealthCheckServiceReference(
+        o.healthCheckService as api.HealthCheckServiceReference);
     unittest.expect(o.healthState, unittest.equals('foo'));
   }
   buildCounterHealthStatusForNetworkEndpoint--;
@@ -6656,7 +6742,7 @@
 void checkHttpFaultDelay(api.HttpFaultDelay o) {
   buildCounterHttpFaultDelay++;
   if (buildCounterHttpFaultDelay < 3) {
-    checkDuration(o.fixedDelay);
+    checkDuration(o.fixedDelay as api.Duration);
     unittest.expect(o.percentage, unittest.equals(42.0));
   }
   buildCounterHttpFaultDelay--;
@@ -6677,8 +6763,8 @@
 void checkHttpFaultInjection(api.HttpFaultInjection o) {
   buildCounterHttpFaultInjection++;
   if (buildCounterHttpFaultInjection < 3) {
-    checkHttpFaultAbort(o.abort);
-    checkHttpFaultDelay(o.delay);
+    checkHttpFaultAbort(o.abort as api.HttpFaultAbort);
+    checkHttpFaultDelay(o.delay as api.HttpFaultDelay);
   }
   buildCounterHttpFaultInjection--;
 }
@@ -6692,8 +6778,8 @@
 
 void checkUnnamed716(core.List<api.HttpHeaderOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpHeaderOption(o[0]);
-  checkHttpHeaderOption(o[1]);
+  checkHttpHeaderOption(o[0] as api.HttpHeaderOption);
+  checkHttpHeaderOption(o[1] as api.HttpHeaderOption);
 }
 
 core.List<core.String> buildUnnamed717() {
@@ -6718,8 +6804,8 @@
 
 void checkUnnamed718(core.List<api.HttpHeaderOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpHeaderOption(o[0]);
-  checkHttpHeaderOption(o[1]);
+  checkHttpHeaderOption(o[0] as api.HttpHeaderOption);
+  checkHttpHeaderOption(o[1] as api.HttpHeaderOption);
 }
 
 core.List<core.String> buildUnnamed719() {
@@ -6786,7 +6872,7 @@
     unittest.expect(o.invertMatch, unittest.isTrue);
     unittest.expect(o.prefixMatch, unittest.equals('foo'));
     unittest.expect(o.presentMatch, unittest.isTrue);
-    checkInt64RangeMatch(o.rangeMatch);
+    checkInt64RangeMatch(o.rangeMatch as api.Int64RangeMatch);
     unittest.expect(o.regexMatch, unittest.equals('foo'));
     unittest.expect(o.suffixMatch, unittest.equals('foo'));
   }
@@ -6868,8 +6954,8 @@
 
 void checkUnnamed720(core.List<api.HttpHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpHealthCheck(o[0]);
-  checkHttpHealthCheck(o[1]);
+  checkHttpHealthCheck(o[0] as api.HttpHealthCheck);
+  checkHttpHealthCheck(o[1] as api.HttpHealthCheck);
 }
 
 core.int buildCounterHttpHealthCheckListWarningData = 0;
@@ -6902,8 +6988,10 @@
 
 void checkUnnamed721(core.List<api.HttpHealthCheckListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpHealthCheckListWarningData(o[0]);
-  checkHttpHealthCheckListWarningData(o[1]);
+  checkHttpHealthCheckListWarningData(
+      o[0] as api.HttpHealthCheckListWarningData);
+  checkHttpHealthCheckListWarningData(
+      o[1] as api.HttpHealthCheckListWarningData);
 }
 
 core.int buildCounterHttpHealthCheckListWarning = 0;
@@ -6953,7 +7041,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkHttpHealthCheckListWarning(o.warning);
+    checkHttpHealthCheckListWarning(
+        o.warning as api.HttpHealthCheckListWarning);
   }
   buildCounterHttpHealthCheckList--;
 }
@@ -7042,7 +7131,7 @@
   buildCounterHttpRetryPolicy++;
   if (buildCounterHttpRetryPolicy < 3) {
     unittest.expect(o.numRetries, unittest.equals(42));
-    checkDuration(o.perTryTimeout);
+    checkDuration(o.perTryTimeout as api.Duration);
     checkUnnamed722(o.retryConditions);
   }
   buildCounterHttpRetryPolicy--;
@@ -7057,8 +7146,8 @@
 
 void checkUnnamed723(core.List<api.WeightedBackendService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWeightedBackendService(o[0]);
-  checkWeightedBackendService(o[1]);
+  checkWeightedBackendService(o[0] as api.WeightedBackendService);
+  checkWeightedBackendService(o[1] as api.WeightedBackendService);
 }
 
 core.int buildCounterHttpRouteAction = 0;
@@ -7081,12 +7170,12 @@
 void checkHttpRouteAction(api.HttpRouteAction o) {
   buildCounterHttpRouteAction++;
   if (buildCounterHttpRouteAction < 3) {
-    checkCorsPolicy(o.corsPolicy);
-    checkHttpFaultInjection(o.faultInjectionPolicy);
-    checkRequestMirrorPolicy(o.requestMirrorPolicy);
-    checkHttpRetryPolicy(o.retryPolicy);
-    checkDuration(o.timeout);
-    checkUrlRewrite(o.urlRewrite);
+    checkCorsPolicy(o.corsPolicy as api.CorsPolicy);
+    checkHttpFaultInjection(o.faultInjectionPolicy as api.HttpFaultInjection);
+    checkRequestMirrorPolicy(o.requestMirrorPolicy as api.RequestMirrorPolicy);
+    checkHttpRetryPolicy(o.retryPolicy as api.HttpRetryPolicy);
+    checkDuration(o.timeout as api.Duration);
+    checkUrlRewrite(o.urlRewrite as api.UrlRewrite);
     checkUnnamed723(o.weightedBackendServices);
   }
   buildCounterHttpRouteAction--;
@@ -7101,8 +7190,8 @@
 
 void checkUnnamed724(core.List<api.HttpRouteRuleMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRouteRuleMatch(o[0]);
-  checkHttpRouteRuleMatch(o[1]);
+  checkHttpRouteRuleMatch(o[0] as api.HttpRouteRuleMatch);
+  checkHttpRouteRuleMatch(o[1] as api.HttpRouteRuleMatch);
 }
 
 core.int buildCounterHttpRouteRule = 0;
@@ -7126,12 +7215,12 @@
   buildCounterHttpRouteRule++;
   if (buildCounterHttpRouteRule < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkHttpHeaderAction(o.headerAction);
+    checkHttpHeaderAction(o.headerAction as api.HttpHeaderAction);
     checkUnnamed724(o.matchRules);
     unittest.expect(o.priority, unittest.equals(42));
-    checkHttpRouteAction(o.routeAction);
+    checkHttpRouteAction(o.routeAction as api.HttpRouteAction);
     unittest.expect(o.service, unittest.equals('foo'));
-    checkHttpRedirectAction(o.urlRedirect);
+    checkHttpRedirectAction(o.urlRedirect as api.HttpRedirectAction);
   }
   buildCounterHttpRouteRule--;
 }
@@ -7145,8 +7234,8 @@
 
 void checkUnnamed725(core.List<api.HttpHeaderMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpHeaderMatch(o[0]);
-  checkHttpHeaderMatch(o[1]);
+  checkHttpHeaderMatch(o[0] as api.HttpHeaderMatch);
+  checkHttpHeaderMatch(o[1] as api.HttpHeaderMatch);
 }
 
 core.List<api.MetadataFilter> buildUnnamed726() {
@@ -7158,8 +7247,8 @@
 
 void checkUnnamed726(core.List<api.MetadataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetadataFilter(o[0]);
-  checkMetadataFilter(o[1]);
+  checkMetadataFilter(o[0] as api.MetadataFilter);
+  checkMetadataFilter(o[1] as api.MetadataFilter);
 }
 
 core.List<api.HttpQueryParameterMatch> buildUnnamed727() {
@@ -7171,8 +7260,8 @@
 
 void checkUnnamed727(core.List<api.HttpQueryParameterMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpQueryParameterMatch(o[0]);
-  checkHttpQueryParameterMatch(o[1]);
+  checkHttpQueryParameterMatch(o[0] as api.HttpQueryParameterMatch);
+  checkHttpQueryParameterMatch(o[1] as api.HttpQueryParameterMatch);
 }
 
 core.int buildCounterHttpRouteRuleMatch = 0;
@@ -7258,8 +7347,8 @@
 
 void checkUnnamed728(core.List<api.HttpsHealthCheck> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpsHealthCheck(o[0]);
-  checkHttpsHealthCheck(o[1]);
+  checkHttpsHealthCheck(o[0] as api.HttpsHealthCheck);
+  checkHttpsHealthCheck(o[1] as api.HttpsHealthCheck);
 }
 
 core.int buildCounterHttpsHealthCheckListWarningData = 0;
@@ -7293,8 +7382,10 @@
 
 void checkUnnamed729(core.List<api.HttpsHealthCheckListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpsHealthCheckListWarningData(o[0]);
-  checkHttpsHealthCheckListWarningData(o[1]);
+  checkHttpsHealthCheckListWarningData(
+      o[0] as api.HttpsHealthCheckListWarningData);
+  checkHttpsHealthCheckListWarningData(
+      o[1] as api.HttpsHealthCheckListWarningData);
 }
 
 core.int buildCounterHttpsHealthCheckListWarning = 0;
@@ -7344,7 +7435,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkHttpsHealthCheckListWarning(o.warning);
+    checkHttpsHealthCheckListWarning(
+        o.warning as api.HttpsHealthCheckListWarning);
   }
   buildCounterHttpsHealthCheckList--;
 }
@@ -7358,8 +7450,8 @@
 
 void checkUnnamed730(core.List<api.GuestOsFeature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGuestOsFeature(o[0]);
-  checkGuestOsFeature(o[1]);
+  checkGuestOsFeature(o[0] as api.GuestOsFeature);
+  checkGuestOsFeature(o[1] as api.GuestOsFeature);
 }
 
 core.Map<core.String, core.String> buildUnnamed731() {
@@ -7482,30 +7574,35 @@
   if (buildCounterImage < 3) {
     unittest.expect(o.archiveSizeBytes, unittest.equals('foo'));
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkDeprecationStatus(o.deprecated);
+    checkDeprecationStatus(o.deprecated as api.DeprecationStatus);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.family, unittest.equals('foo'));
     checkUnnamed730(o.guestOsFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.imageEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.imageEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
     checkUnnamed731(o.labels);
     checkUnnamed732(o.licenseCodes);
     checkUnnamed733(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkImageRawDisk(o.rawDisk);
+    checkImageRawDisk(o.rawDisk as api.ImageRawDisk);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInitialStateConfig(o.shieldedInstanceInitialState);
+    checkInitialStateConfig(
+        o.shieldedInstanceInitialState as api.InitialStateConfig);
     unittest.expect(o.sourceDisk, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceDiskEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceDiskEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceDiskId, unittest.equals('foo'));
     unittest.expect(o.sourceImage, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceImageEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceImageEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceImageId, unittest.equals('foo'));
     unittest.expect(o.sourceSnapshot, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceSnapshotEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceSnapshotEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceSnapshotId, unittest.equals('foo'));
     unittest.expect(o.sourceType, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -7523,8 +7620,8 @@
 
 void checkUnnamed735(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImage(o[0]);
-  checkImage(o[1]);
+  checkImage(o[0] as api.Image);
+  checkImage(o[1] as api.Image);
 }
 
 core.int buildCounterImageListWarningData = 0;
@@ -7557,8 +7654,8 @@
 
 void checkUnnamed736(core.List<api.ImageListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImageListWarningData(o[0]);
-  checkImageListWarningData(o[1]);
+  checkImageListWarningData(o[0] as api.ImageListWarningData);
+  checkImageListWarningData(o[1] as api.ImageListWarningData);
 }
 
 core.int buildCounterImageListWarning = 0;
@@ -7608,7 +7705,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkImageListWarning(o.warning);
+    checkImageListWarning(o.warning as api.ImageListWarning);
   }
   buildCounterImageList--;
 }
@@ -7622,8 +7719,8 @@
 
 void checkUnnamed737(core.List<api.FileContentBuffer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileContentBuffer(o[0]);
-  checkFileContentBuffer(o[1]);
+  checkFileContentBuffer(o[0] as api.FileContentBuffer);
+  checkFileContentBuffer(o[1] as api.FileContentBuffer);
 }
 
 core.List<api.FileContentBuffer> buildUnnamed738() {
@@ -7635,8 +7732,8 @@
 
 void checkUnnamed738(core.List<api.FileContentBuffer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileContentBuffer(o[0]);
-  checkFileContentBuffer(o[1]);
+  checkFileContentBuffer(o[0] as api.FileContentBuffer);
+  checkFileContentBuffer(o[1] as api.FileContentBuffer);
 }
 
 core.List<api.FileContentBuffer> buildUnnamed739() {
@@ -7648,8 +7745,8 @@
 
 void checkUnnamed739(core.List<api.FileContentBuffer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileContentBuffer(o[0]);
-  checkFileContentBuffer(o[1]);
+  checkFileContentBuffer(o[0] as api.FileContentBuffer);
+  checkFileContentBuffer(o[1] as api.FileContentBuffer);
 }
 
 core.int buildCounterInitialStateConfig = 0;
@@ -7672,7 +7769,7 @@
     checkUnnamed737(o.dbs);
     checkUnnamed738(o.dbxs);
     checkUnnamed739(o.keks);
-    checkFileContentBuffer(o.pk);
+    checkFileContentBuffer(o.pk as api.FileContentBuffer);
   }
   buildCounterInitialStateConfig--;
 }
@@ -7686,8 +7783,8 @@
 
 void checkUnnamed740(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttachedDisk(o[0]);
-  checkAttachedDisk(o[1]);
+  checkAttachedDisk(o[0] as api.AttachedDisk);
+  checkAttachedDisk(o[1] as api.AttachedDisk);
 }
 
 core.List<api.AcceleratorConfig> buildUnnamed741() {
@@ -7699,8 +7796,8 @@
 
 void checkUnnamed741(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorConfig(o[0]);
-  checkAcceleratorConfig(o[1]);
+  checkAcceleratorConfig(o[0] as api.AcceleratorConfig);
+  checkAcceleratorConfig(o[1] as api.AcceleratorConfig);
 }
 
 core.Map<core.String, core.String> buildUnnamed742() {
@@ -7725,8 +7822,8 @@
 
 void checkUnnamed743(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkInterface(o[0]);
-  checkNetworkInterface(o[1]);
+  checkNetworkInterface(o[0] as api.NetworkInterface);
+  checkNetworkInterface(o[1] as api.NetworkInterface);
 }
 
 core.List<core.String> buildUnnamed744() {
@@ -7751,8 +7848,8 @@
 
 void checkUnnamed745(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServiceAccount(o[0]);
-  checkServiceAccount(o[1]);
+  checkServiceAccount(o[0] as api.ServiceAccount);
+  checkServiceAccount(o[1] as api.ServiceAccount);
 }
 
 core.int buildCounterInstance = 0;
@@ -7802,13 +7899,14 @@
   buildCounterInstance++;
   if (buildCounterInstance < 3) {
     unittest.expect(o.canIpForward, unittest.isTrue);
-    checkConfidentialInstanceConfig(o.confidentialInstanceConfig);
+    checkConfidentialInstanceConfig(
+        o.confidentialInstanceConfig as api.ConfidentialInstanceConfig);
     unittest.expect(o.cpuPlatform, unittest.equals('foo'));
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.deletionProtection, unittest.isTrue);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed740(o.disks);
-    checkDisplayDevice(o.displayDevice);
+    checkDisplayDevice(o.displayDevice as api.DisplayDevice);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     checkUnnamed741(o.guestAccelerators);
     unittest.expect(o.hostname, unittest.equals('foo'));
@@ -7817,22 +7915,24 @@
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
     checkUnnamed742(o.labels);
     unittest.expect(o.machineType, unittest.equals('foo'));
-    checkMetadata(o.metadata);
+    checkMetadata(o.metadata as api.Metadata);
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed743(o.networkInterfaces);
     unittest.expect(o.privateIpv6GoogleAccess, unittest.equals('foo'));
-    checkReservationAffinity(o.reservationAffinity);
+    checkReservationAffinity(o.reservationAffinity as api.ReservationAffinity);
     checkUnnamed744(o.resourcePolicies);
-    checkScheduling(o.scheduling);
+    checkScheduling(o.scheduling as api.Scheduling);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed745(o.serviceAccounts);
-    checkShieldedInstanceConfig(o.shieldedInstanceConfig);
-    checkShieldedInstanceIntegrityPolicy(o.shieldedInstanceIntegrityPolicy);
+    checkShieldedInstanceConfig(
+        o.shieldedInstanceConfig as api.ShieldedInstanceConfig);
+    checkShieldedInstanceIntegrityPolicy(o.shieldedInstanceIntegrityPolicy
+        as api.ShieldedInstanceIntegrityPolicy);
     unittest.expect(o.startRestricted, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
-    checkTags(o.tags);
+    checkTags(o.tags as api.Tags);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterInstance--;
@@ -7847,8 +7947,8 @@
 
 void checkUnnamed746(core.Map<core.String, api.InstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstancesScopedList(o['x']);
-  checkInstancesScopedList(o['y']);
+  checkInstancesScopedList(o['x'] as api.InstancesScopedList);
+  checkInstancesScopedList(o['y'] as api.InstancesScopedList);
 }
 
 core.List<core.String> buildUnnamed747() {
@@ -7895,8 +7995,10 @@
 
 void checkUnnamed748(core.List<api.InstanceAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceAggregatedListWarningData(o[0]);
-  checkInstanceAggregatedListWarningData(o[1]);
+  checkInstanceAggregatedListWarningData(
+      o[0] as api.InstanceAggregatedListWarningData);
+  checkInstanceAggregatedListWarningData(
+      o[1] as api.InstanceAggregatedListWarningData);
 }
 
 core.int buildCounterInstanceAggregatedListWarning = 0;
@@ -7948,7 +8050,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed747(o.unreachables);
-    checkInstanceAggregatedListWarning(o.warning);
+    checkInstanceAggregatedListWarning(
+        o.warning as api.InstanceAggregatedListWarning);
   }
   buildCounterInstanceAggregatedList--;
 }
@@ -7962,8 +8065,8 @@
 
 void checkUnnamed749(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedPort(o[0]);
-  checkNamedPort(o[1]);
+  checkNamedPort(o[0] as api.NamedPort);
+  checkNamedPort(o[1] as api.NamedPort);
 }
 
 core.int buildCounterInstanceGroup = 0;
@@ -8018,8 +8121,8 @@
 
 void checkUnnamed750(core.Map<core.String, api.InstanceGroupsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupsScopedList(o['x']);
-  checkInstanceGroupsScopedList(o['y']);
+  checkInstanceGroupsScopedList(o['x'] as api.InstanceGroupsScopedList);
+  checkInstanceGroupsScopedList(o['y'] as api.InstanceGroupsScopedList);
 }
 
 core.List<core.String> buildUnnamed751() {
@@ -8067,8 +8170,10 @@
 
 void checkUnnamed752(core.List<api.InstanceGroupAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupAggregatedListWarningData(o[0]);
-  checkInstanceGroupAggregatedListWarningData(o[1]);
+  checkInstanceGroupAggregatedListWarningData(
+      o[0] as api.InstanceGroupAggregatedListWarningData);
+  checkInstanceGroupAggregatedListWarningData(
+      o[1] as api.InstanceGroupAggregatedListWarningData);
 }
 
 core.int buildCounterInstanceGroupAggregatedListWarning = 0;
@@ -8122,7 +8227,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed751(o.unreachables);
-    checkInstanceGroupAggregatedListWarning(o.warning);
+    checkInstanceGroupAggregatedListWarning(
+        o.warning as api.InstanceGroupAggregatedListWarning);
   }
   buildCounterInstanceGroupAggregatedList--;
 }
@@ -8136,8 +8242,8 @@
 
 void checkUnnamed753(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroup(o[0]);
-  checkInstanceGroup(o[1]);
+  checkInstanceGroup(o[0] as api.InstanceGroup);
+  checkInstanceGroup(o[1] as api.InstanceGroup);
 }
 
 core.int buildCounterInstanceGroupListWarningData = 0;
@@ -8170,8 +8276,8 @@
 
 void checkUnnamed754(core.List<api.InstanceGroupListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupListWarningData(o[0]);
-  checkInstanceGroupListWarningData(o[1]);
+  checkInstanceGroupListWarningData(o[0] as api.InstanceGroupListWarningData);
+  checkInstanceGroupListWarningData(o[1] as api.InstanceGroupListWarningData);
 }
 
 core.int buildCounterInstanceGroupListWarning = 0;
@@ -8221,7 +8327,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInstanceGroupListWarning(o.warning);
+    checkInstanceGroupListWarning(o.warning as api.InstanceGroupListWarning);
   }
   buildCounterInstanceGroupList--;
 }
@@ -8235,8 +8341,10 @@
 
 void checkUnnamed755(core.List<api.InstanceGroupManagerAutoHealingPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManagerAutoHealingPolicy(o[0]);
-  checkInstanceGroupManagerAutoHealingPolicy(o[1]);
+  checkInstanceGroupManagerAutoHealingPolicy(
+      o[0] as api.InstanceGroupManagerAutoHealingPolicy);
+  checkInstanceGroupManagerAutoHealingPolicy(
+      o[1] as api.InstanceGroupManagerAutoHealingPolicy);
 }
 
 core.List<api.NamedPort> buildUnnamed756() {
@@ -8248,8 +8356,8 @@
 
 void checkUnnamed756(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedPort(o[0]);
-  checkNamedPort(o[1]);
+  checkNamedPort(o[0] as api.NamedPort);
+  checkNamedPort(o[1] as api.NamedPort);
 }
 
 core.List<core.String> buildUnnamed757() {
@@ -8274,8 +8382,8 @@
 
 void checkUnnamed758(core.List<api.InstanceGroupManagerVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManagerVersion(o[0]);
-  checkInstanceGroupManagerVersion(o[1]);
+  checkInstanceGroupManagerVersion(o[0] as api.InstanceGroupManagerVersion);
+  checkInstanceGroupManagerVersion(o[1] as api.InstanceGroupManagerVersion);
 }
 
 core.int buildCounterInstanceGroupManager = 0;
@@ -8316,9 +8424,10 @@
     checkUnnamed755(o.autoHealingPolicies);
     unittest.expect(o.baseInstanceName, unittest.equals('foo'));
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkInstanceGroupManagerActionsSummary(o.currentActions);
+    checkInstanceGroupManagerActionsSummary(
+        o.currentActions as api.InstanceGroupManagerActionsSummary);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkDistributionPolicy(o.distributionPolicy);
+    checkDistributionPolicy(o.distributionPolicy as api.DistributionPolicy);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.instanceGroup, unittest.equals('foo'));
@@ -8328,11 +8437,12 @@
     checkUnnamed756(o.namedPorts);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkStatefulPolicy(o.statefulPolicy);
-    checkInstanceGroupManagerStatus(o.status);
+    checkStatefulPolicy(o.statefulPolicy as api.StatefulPolicy);
+    checkInstanceGroupManagerStatus(o.status as api.InstanceGroupManagerStatus);
     checkUnnamed757(o.targetPools);
     unittest.expect(o.targetSize, unittest.equals(42));
-    checkInstanceGroupManagerUpdatePolicy(o.updatePolicy);
+    checkInstanceGroupManagerUpdatePolicy(
+        o.updatePolicy as api.InstanceGroupManagerUpdatePolicy);
     checkUnnamed758(o.versions);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
@@ -8386,8 +8496,10 @@
 void checkUnnamed759(
     core.Map<core.String, api.InstanceGroupManagersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManagersScopedList(o['x']);
-  checkInstanceGroupManagersScopedList(o['y']);
+  checkInstanceGroupManagersScopedList(
+      o['x'] as api.InstanceGroupManagersScopedList);
+  checkInstanceGroupManagersScopedList(
+      o['y'] as api.InstanceGroupManagersScopedList);
 }
 
 core.List<core.String> buildUnnamed760() {
@@ -8436,8 +8548,10 @@
 void checkUnnamed761(
     core.List<api.InstanceGroupManagerAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManagerAggregatedListWarningData(o[0]);
-  checkInstanceGroupManagerAggregatedListWarningData(o[1]);
+  checkInstanceGroupManagerAggregatedListWarningData(
+      o[0] as api.InstanceGroupManagerAggregatedListWarningData);
+  checkInstanceGroupManagerAggregatedListWarningData(
+      o[1] as api.InstanceGroupManagerAggregatedListWarningData);
 }
 
 core.int buildCounterInstanceGroupManagerAggregatedListWarning = 0;
@@ -8493,7 +8607,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed760(o.unreachables);
-    checkInstanceGroupManagerAggregatedListWarning(o.warning);
+    checkInstanceGroupManagerAggregatedListWarning(
+        o.warning as api.InstanceGroupManagerAggregatedListWarning);
   }
   buildCounterInstanceGroupManagerAggregatedList--;
 }
@@ -8530,8 +8645,8 @@
 
 void checkUnnamed762(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManager(o[0]);
-  checkInstanceGroupManager(o[1]);
+  checkInstanceGroupManager(o[0] as api.InstanceGroupManager);
+  checkInstanceGroupManager(o[1] as api.InstanceGroupManager);
 }
 
 core.int buildCounterInstanceGroupManagerListWarningData = 0;
@@ -8566,8 +8681,10 @@
 
 void checkUnnamed763(core.List<api.InstanceGroupManagerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManagerListWarningData(o[0]);
-  checkInstanceGroupManagerListWarningData(o[1]);
+  checkInstanceGroupManagerListWarningData(
+      o[0] as api.InstanceGroupManagerListWarningData);
+  checkInstanceGroupManagerListWarningData(
+      o[1] as api.InstanceGroupManagerListWarningData);
 }
 
 core.int buildCounterInstanceGroupManagerListWarning = 0;
@@ -8618,7 +8735,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInstanceGroupManagerListWarning(o.warning);
+    checkInstanceGroupManagerListWarning(
+        o.warning as api.InstanceGroupManagerListWarning);
   }
   buildCounterInstanceGroupManagerList--;
 }
@@ -8642,8 +8760,10 @@
   if (buildCounterInstanceGroupManagerStatus < 3) {
     unittest.expect(o.autoscaler, unittest.equals('foo'));
     unittest.expect(o.isStable, unittest.isTrue);
-    checkInstanceGroupManagerStatusStateful(o.stateful);
-    checkInstanceGroupManagerStatusVersionTarget(o.versionTarget);
+    checkInstanceGroupManagerStatusStateful(
+        o.stateful as api.InstanceGroupManagerStatusStateful);
+    checkInstanceGroupManagerStatusVersionTarget(
+        o.versionTarget as api.InstanceGroupManagerStatusVersionTarget);
   }
   buildCounterInstanceGroupManagerStatus--;
 }
@@ -8668,7 +8788,8 @@
   if (buildCounterInstanceGroupManagerStatusStateful < 3) {
     unittest.expect(o.hasStatefulConfig, unittest.isTrue);
     checkInstanceGroupManagerStatusStatefulPerInstanceConfigs(
-        o.perInstanceConfigs);
+        o.perInstanceConfigs
+            as api.InstanceGroupManagerStatusStatefulPerInstanceConfigs);
   }
   buildCounterInstanceGroupManagerStatusStateful--;
 }
@@ -8736,8 +8857,8 @@
   buildCounterInstanceGroupManagerUpdatePolicy++;
   if (buildCounterInstanceGroupManagerUpdatePolicy < 3) {
     unittest.expect(o.instanceRedistributionType, unittest.equals('foo'));
-    checkFixedOrPercent(o.maxSurge);
-    checkFixedOrPercent(o.maxUnavailable);
+    checkFixedOrPercent(o.maxSurge as api.FixedOrPercent);
+    checkFixedOrPercent(o.maxUnavailable as api.FixedOrPercent);
     unittest.expect(o.minimalAction, unittest.equals('foo'));
     unittest.expect(o.replacementMethod, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -8763,7 +8884,7 @@
   if (buildCounterInstanceGroupManagerVersion < 3) {
     unittest.expect(o.instanceTemplate, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkFixedOrPercent(o.targetSize);
+    checkFixedOrPercent(o.targetSize as api.FixedOrPercent);
   }
   buildCounterInstanceGroupManagerVersion--;
 }
@@ -8849,8 +8970,8 @@
 
 void checkUnnamed766(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int buildCounterInstanceGroupManagersCreateInstancesRequest = 0;
@@ -8951,8 +9072,8 @@
 
 void checkUnnamed769(core.List<api.InstanceManagedByIgmError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceManagedByIgmError(o[0]);
-  checkInstanceManagedByIgmError(o[1]);
+  checkInstanceManagedByIgmError(o[0] as api.InstanceManagedByIgmError);
+  checkInstanceManagedByIgmError(o[1] as api.InstanceManagedByIgmError);
 }
 
 core.int buildCounterInstanceGroupManagersListErrorsResponse = 0;
@@ -8987,8 +9108,8 @@
 
 void checkUnnamed770(core.List<api.ManagedInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedInstance(o[0]);
-  checkManagedInstance(o[1]);
+  checkManagedInstance(o[0] as api.ManagedInstance);
+  checkManagedInstance(o[1] as api.ManagedInstance);
 }
 
 core.int buildCounterInstanceGroupManagersListManagedInstancesResponse = 0;
@@ -9023,8 +9144,8 @@
 
 void checkUnnamed771(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int
@@ -9065,8 +9186,10 @@
     core.List<api.InstanceGroupManagersListPerInstanceConfigsRespWarningData>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManagersListPerInstanceConfigsRespWarningData(o[0]);
-  checkInstanceGroupManagersListPerInstanceConfigsRespWarningData(o[1]);
+  checkInstanceGroupManagersListPerInstanceConfigsRespWarningData(
+      o[0] as api.InstanceGroupManagersListPerInstanceConfigsRespWarningData);
+  checkInstanceGroupManagersListPerInstanceConfigsRespWarningData(
+      o[1] as api.InstanceGroupManagersListPerInstanceConfigsRespWarningData);
 }
 
 core.int buildCounterInstanceGroupManagersListPerInstanceConfigsRespWarning = 0;
@@ -9114,7 +9237,8 @@
   if (buildCounterInstanceGroupManagersListPerInstanceConfigsResp < 3) {
     checkUnnamed771(o.items);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkInstanceGroupManagersListPerInstanceConfigsRespWarning(o.warning);
+    checkInstanceGroupManagersListPerInstanceConfigsRespWarning(o.warning
+        as api.InstanceGroupManagersListPerInstanceConfigsRespWarning);
   }
   buildCounterInstanceGroupManagersListPerInstanceConfigsResp--;
 }
@@ -9128,8 +9252,8 @@
 
 void checkUnnamed773(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int buildCounterInstanceGroupManagersPatchPerInstanceConfigsReq = 0;
@@ -9196,8 +9320,8 @@
 
 void checkUnnamed775(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManager(o[0]);
-  checkInstanceGroupManager(o[1]);
+  checkInstanceGroupManager(o[0] as api.InstanceGroupManager);
+  checkInstanceGroupManager(o[1] as api.InstanceGroupManager);
 }
 
 core.int buildCounterInstanceGroupManagersScopedListWarningData = 0;
@@ -9233,8 +9357,10 @@
 void checkUnnamed776(
     core.List<api.InstanceGroupManagersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManagersScopedListWarningData(o[0]);
-  checkInstanceGroupManagersScopedListWarningData(o[1]);
+  checkInstanceGroupManagersScopedListWarningData(
+      o[0] as api.InstanceGroupManagersScopedListWarningData);
+  checkInstanceGroupManagersScopedListWarningData(
+      o[1] as api.InstanceGroupManagersScopedListWarningData);
 }
 
 core.int buildCounterInstanceGroupManagersScopedListWarning = 0;
@@ -9279,7 +9405,8 @@
   buildCounterInstanceGroupManagersScopedList++;
   if (buildCounterInstanceGroupManagersScopedList < 3) {
     checkUnnamed775(o.instanceGroupManagers);
-    checkInstanceGroupManagersScopedListWarning(o.warning);
+    checkInstanceGroupManagersScopedListWarning(
+        o.warning as api.InstanceGroupManagersScopedListWarning);
   }
   buildCounterInstanceGroupManagersScopedList--;
 }
@@ -9350,8 +9477,8 @@
 
 void checkUnnamed778(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int buildCounterInstanceGroupManagersUpdatePerInstanceConfigsReq = 0;
@@ -9384,8 +9511,8 @@
 
 void checkUnnamed779(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceReference(o[0]);
-  checkInstanceReference(o[1]);
+  checkInstanceReference(o[0] as api.InstanceReference);
+  checkInstanceReference(o[1] as api.InstanceReference);
 }
 
 core.int buildCounterInstanceGroupsAddInstancesRequest = 0;
@@ -9417,8 +9544,8 @@
 
 void checkUnnamed780(core.List<api.InstanceWithNamedPorts> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceWithNamedPorts(o[0]);
-  checkInstanceWithNamedPorts(o[1]);
+  checkInstanceWithNamedPorts(o[0] as api.InstanceWithNamedPorts);
+  checkInstanceWithNamedPorts(o[1] as api.InstanceWithNamedPorts);
 }
 
 core.int buildCounterInstanceGroupsListInstancesWarningData = 0;
@@ -9453,8 +9580,10 @@
 
 void checkUnnamed781(core.List<api.InstanceGroupsListInstancesWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupsListInstancesWarningData(o[0]);
-  checkInstanceGroupsListInstancesWarningData(o[1]);
+  checkInstanceGroupsListInstancesWarningData(
+      o[0] as api.InstanceGroupsListInstancesWarningData);
+  checkInstanceGroupsListInstancesWarningData(
+      o[1] as api.InstanceGroupsListInstancesWarningData);
 }
 
 core.int buildCounterInstanceGroupsListInstancesWarning = 0;
@@ -9506,7 +9635,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInstanceGroupsListInstancesWarning(o.warning);
+    checkInstanceGroupsListInstancesWarning(
+        o.warning as api.InstanceGroupsListInstancesWarning);
   }
   buildCounterInstanceGroupsListInstances--;
 }
@@ -9541,8 +9671,8 @@
 
 void checkUnnamed782(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceReference(o[0]);
-  checkInstanceReference(o[1]);
+  checkInstanceReference(o[0] as api.InstanceReference);
+  checkInstanceReference(o[1] as api.InstanceReference);
 }
 
 core.int buildCounterInstanceGroupsRemoveInstancesRequest = 0;
@@ -9575,8 +9705,8 @@
 
 void checkUnnamed783(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroup(o[0]);
-  checkInstanceGroup(o[1]);
+  checkInstanceGroup(o[0] as api.InstanceGroup);
+  checkInstanceGroup(o[1] as api.InstanceGroup);
 }
 
 core.int buildCounterInstanceGroupsScopedListWarningData = 0;
@@ -9611,8 +9741,10 @@
 
 void checkUnnamed784(core.List<api.InstanceGroupsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupsScopedListWarningData(o[0]);
-  checkInstanceGroupsScopedListWarningData(o[1]);
+  checkInstanceGroupsScopedListWarningData(
+      o[0] as api.InstanceGroupsScopedListWarningData);
+  checkInstanceGroupsScopedListWarningData(
+      o[1] as api.InstanceGroupsScopedListWarningData);
 }
 
 core.int buildCounterInstanceGroupsScopedListWarning = 0;
@@ -9655,7 +9787,8 @@
   buildCounterInstanceGroupsScopedList++;
   if (buildCounterInstanceGroupsScopedList < 3) {
     checkUnnamed783(o.instanceGroups);
-    checkInstanceGroupsScopedListWarning(o.warning);
+    checkInstanceGroupsScopedListWarning(
+        o.warning as api.InstanceGroupsScopedListWarning);
   }
   buildCounterInstanceGroupsScopedList--;
 }
@@ -9669,8 +9802,8 @@
 
 void checkUnnamed785(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedPort(o[0]);
-  checkNamedPort(o[1]);
+  checkNamedPort(o[0] as api.NamedPort);
+  checkNamedPort(o[1] as api.NamedPort);
 }
 
 core.int buildCounterInstanceGroupsSetNamedPortsRequest = 0;
@@ -9705,8 +9838,8 @@
 
 void checkUnnamed786(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.int buildCounterInstanceListWarningData = 0;
@@ -9739,8 +9872,8 @@
 
 void checkUnnamed787(core.List<api.InstanceListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceListWarningData(o[0]);
-  checkInstanceListWarningData(o[1]);
+  checkInstanceListWarningData(o[0] as api.InstanceListWarningData);
+  checkInstanceListWarningData(o[1] as api.InstanceListWarningData);
 }
 
 core.int buildCounterInstanceListWarning = 0;
@@ -9790,7 +9923,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInstanceListWarning(o.warning);
+    checkInstanceListWarning(o.warning as api.InstanceListWarning);
   }
   buildCounterInstanceList--;
 }
@@ -9804,8 +9937,8 @@
 
 void checkUnnamed788(core.List<api.Reference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReference(o[0]);
-  checkReference(o[1]);
+  checkReference(o[0] as api.Reference);
+  checkReference(o[1] as api.Reference);
 }
 
 core.int buildCounterInstanceListReferrersWarningData = 0;
@@ -9839,8 +9972,10 @@
 
 void checkUnnamed789(core.List<api.InstanceListReferrersWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceListReferrersWarningData(o[0]);
-  checkInstanceListReferrersWarningData(o[1]);
+  checkInstanceListReferrersWarningData(
+      o[0] as api.InstanceListReferrersWarningData);
+  checkInstanceListReferrersWarningData(
+      o[1] as api.InstanceListReferrersWarningData);
 }
 
 core.int buildCounterInstanceListReferrersWarning = 0;
@@ -9890,7 +10025,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInstanceListReferrersWarning(o.warning);
+    checkInstanceListReferrersWarning(
+        o.warning as api.InstanceListReferrersWarning);
   }
   buildCounterInstanceListReferrers--;
 }
@@ -9912,9 +10048,10 @@
 void checkInstanceManagedByIgmError(api.InstanceManagedByIgmError o) {
   buildCounterInstanceManagedByIgmError++;
   if (buildCounterInstanceManagedByIgmError < 3) {
-    checkInstanceManagedByIgmErrorManagedInstanceError(o.error);
-    checkInstanceManagedByIgmErrorInstanceActionDetails(
-        o.instanceActionDetails);
+    checkInstanceManagedByIgmErrorManagedInstanceError(
+        o.error as api.InstanceManagedByIgmErrorManagedInstanceError);
+    checkInstanceManagedByIgmErrorInstanceActionDetails(o.instanceActionDetails
+        as api.InstanceManagedByIgmErrorInstanceActionDetails);
     unittest.expect(o.timestamp, unittest.equals('foo'));
   }
   buildCounterInstanceManagedByIgmError--;
@@ -9940,7 +10077,7 @@
   if (buildCounterInstanceManagedByIgmErrorInstanceActionDetails < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
     unittest.expect(o.instance, unittest.equals('foo'));
-    checkManagedInstanceVersion(o.version);
+    checkManagedInstanceVersion(o.version as api.ManagedInstanceVersion);
   }
   buildCounterInstanceManagedByIgmErrorInstanceActionDetails--;
 }
@@ -9998,8 +10135,8 @@
 
 void checkUnnamed790(core.List<api.AttachedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttachedDisk(o[0]);
-  checkAttachedDisk(o[1]);
+  checkAttachedDisk(o[0] as api.AttachedDisk);
+  checkAttachedDisk(o[1] as api.AttachedDisk);
 }
 
 core.List<api.AcceleratorConfig> buildUnnamed791() {
@@ -10011,8 +10148,8 @@
 
 void checkUnnamed791(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorConfig(o[0]);
-  checkAcceleratorConfig(o[1]);
+  checkAcceleratorConfig(o[0] as api.AcceleratorConfig);
+  checkAcceleratorConfig(o[1] as api.AcceleratorConfig);
 }
 
 core.Map<core.String, core.String> buildUnnamed792() {
@@ -10037,8 +10174,8 @@
 
 void checkUnnamed793(core.List<api.NetworkInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkInterface(o[0]);
-  checkNetworkInterface(o[1]);
+  checkNetworkInterface(o[0] as api.NetworkInterface);
+  checkNetworkInterface(o[1] as api.NetworkInterface);
 }
 
 core.List<core.String> buildUnnamed794() {
@@ -10063,8 +10200,8 @@
 
 void checkUnnamed795(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServiceAccount(o[0]);
-  checkServiceAccount(o[1]);
+  checkServiceAccount(o[0] as api.ServiceAccount);
+  checkServiceAccount(o[1] as api.ServiceAccount);
 }
 
 core.int buildCounterInstanceProperties = 0;
@@ -10098,22 +10235,24 @@
   buildCounterInstanceProperties++;
   if (buildCounterInstanceProperties < 3) {
     unittest.expect(o.canIpForward, unittest.isTrue);
-    checkConfidentialInstanceConfig(o.confidentialInstanceConfig);
+    checkConfidentialInstanceConfig(
+        o.confidentialInstanceConfig as api.ConfidentialInstanceConfig);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed790(o.disks);
     checkUnnamed791(o.guestAccelerators);
     checkUnnamed792(o.labels);
     unittest.expect(o.machineType, unittest.equals('foo'));
-    checkMetadata(o.metadata);
+    checkMetadata(o.metadata as api.Metadata);
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
     checkUnnamed793(o.networkInterfaces);
     unittest.expect(o.privateIpv6GoogleAccess, unittest.equals('foo'));
-    checkReservationAffinity(o.reservationAffinity);
+    checkReservationAffinity(o.reservationAffinity as api.ReservationAffinity);
     checkUnnamed794(o.resourcePolicies);
-    checkScheduling(o.scheduling);
+    checkScheduling(o.scheduling as api.Scheduling);
     checkUnnamed795(o.serviceAccounts);
-    checkShieldedInstanceConfig(o.shieldedInstanceConfig);
-    checkTags(o.tags);
+    checkShieldedInstanceConfig(
+        o.shieldedInstanceConfig as api.ShieldedInstanceConfig);
+    checkTags(o.tags as api.Tags);
   }
   buildCounterInstanceProperties--;
 }
@@ -10164,10 +10303,11 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkInstanceProperties(o.properties);
+    checkInstanceProperties(o.properties as api.InstanceProperties);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.sourceInstance, unittest.equals('foo'));
-    checkSourceInstanceParams(o.sourceInstanceParams);
+    checkSourceInstanceParams(
+        o.sourceInstanceParams as api.SourceInstanceParams);
   }
   buildCounterInstanceTemplate--;
 }
@@ -10181,8 +10321,8 @@
 
 void checkUnnamed796(core.List<api.InstanceTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceTemplate(o[0]);
-  checkInstanceTemplate(o[1]);
+  checkInstanceTemplate(o[0] as api.InstanceTemplate);
+  checkInstanceTemplate(o[1] as api.InstanceTemplate);
 }
 
 core.int buildCounterInstanceTemplateListWarningData = 0;
@@ -10216,8 +10356,10 @@
 
 void checkUnnamed797(core.List<api.InstanceTemplateListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceTemplateListWarningData(o[0]);
-  checkInstanceTemplateListWarningData(o[1]);
+  checkInstanceTemplateListWarningData(
+      o[0] as api.InstanceTemplateListWarningData);
+  checkInstanceTemplateListWarningData(
+      o[1] as api.InstanceTemplateListWarningData);
 }
 
 core.int buildCounterInstanceTemplateListWarning = 0;
@@ -10267,7 +10409,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInstanceTemplateListWarning(o.warning);
+    checkInstanceTemplateListWarning(
+        o.warning as api.InstanceTemplateListWarning);
   }
   buildCounterInstanceTemplateList--;
 }
@@ -10281,8 +10424,8 @@
 
 void checkUnnamed798(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedPort(o[0]);
-  checkNamedPort(o[1]);
+  checkNamedPort(o[0] as api.NamedPort);
+  checkNamedPort(o[1] as api.NamedPort);
 }
 
 core.int buildCounterInstanceWithNamedPorts = 0;
@@ -10385,8 +10528,8 @@
 
 void checkUnnamed801(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.int buildCounterInstancesScopedListWarningData = 0;
@@ -10419,8 +10562,10 @@
 
 void checkUnnamed802(core.List<api.InstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstancesScopedListWarningData(o[0]);
-  checkInstancesScopedListWarningData(o[1]);
+  checkInstancesScopedListWarningData(
+      o[0] as api.InstancesScopedListWarningData);
+  checkInstancesScopedListWarningData(
+      o[1] as api.InstancesScopedListWarningData);
 }
 
 core.int buildCounterInstancesScopedListWarning = 0;
@@ -10462,7 +10607,8 @@
   buildCounterInstancesScopedList++;
   if (buildCounterInstancesScopedList < 3) {
     checkUnnamed801(o.instances);
-    checkInstancesScopedListWarning(o.warning);
+    checkInstancesScopedListWarning(
+        o.warning as api.InstancesScopedListWarning);
   }
   buildCounterInstancesScopedList--;
 }
@@ -10510,8 +10656,8 @@
 
 void checkUnnamed804(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorConfig(o[0]);
-  checkAcceleratorConfig(o[1]);
+  checkAcceleratorConfig(o[0] as api.AcceleratorConfig);
+  checkAcceleratorConfig(o[1] as api.AcceleratorConfig);
 }
 
 core.int buildCounterInstancesSetMachineResourcesRequest = 0;
@@ -10618,8 +10764,10 @@
 
 void checkUnnamed806(core.List<api.CustomerEncryptionKeyProtectedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomerEncryptionKeyProtectedDisk(o[0]);
-  checkCustomerEncryptionKeyProtectedDisk(o[1]);
+  checkCustomerEncryptionKeyProtectedDisk(
+      o[0] as api.CustomerEncryptionKeyProtectedDisk);
+  checkCustomerEncryptionKeyProtectedDisk(
+      o[1] as api.CustomerEncryptionKeyProtectedDisk);
 }
 
 core.int buildCounterInstancesStartWithEncryptionKeyRequest = 0;
@@ -10673,8 +10821,8 @@
 
 void checkUnnamed807(core.List<api.InterconnectCircuitInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectCircuitInfo(o[0]);
-  checkInterconnectCircuitInfo(o[1]);
+  checkInterconnectCircuitInfo(o[0] as api.InterconnectCircuitInfo);
+  checkInterconnectCircuitInfo(o[1] as api.InterconnectCircuitInfo);
 }
 
 core.List<api.InterconnectOutageNotification> buildUnnamed808() {
@@ -10686,8 +10834,10 @@
 
 void checkUnnamed808(core.List<api.InterconnectOutageNotification> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectOutageNotification(o[0]);
-  checkInterconnectOutageNotification(o[1]);
+  checkInterconnectOutageNotification(
+      o[0] as api.InterconnectOutageNotification);
+  checkInterconnectOutageNotification(
+      o[1] as api.InterconnectOutageNotification);
 }
 
 core.List<core.String> buildUnnamed809() {
@@ -10830,8 +10980,10 @@
     unittest.expect(o.operationalStatus, unittest.equals('foo'));
     unittest.expect(o.pairingKey, unittest.equals('foo'));
     unittest.expect(o.partnerAsn, unittest.equals('foo'));
-    checkInterconnectAttachmentPartnerMetadata(o.partnerMetadata);
-    checkInterconnectAttachmentPrivateInfo(o.privateInterconnectInfo);
+    checkInterconnectAttachmentPartnerMetadata(
+        o.partnerMetadata as api.InterconnectAttachmentPartnerMetadata);
+    checkInterconnectAttachmentPrivateInfo(
+        o.privateInterconnectInfo as api.InterconnectAttachmentPrivateInfo);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.router, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -10852,8 +11004,10 @@
 void checkUnnamed811(
     core.Map<core.String, api.InterconnectAttachmentsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectAttachmentsScopedList(o['x']);
-  checkInterconnectAttachmentsScopedList(o['y']);
+  checkInterconnectAttachmentsScopedList(
+      o['x'] as api.InterconnectAttachmentsScopedList);
+  checkInterconnectAttachmentsScopedList(
+      o['y'] as api.InterconnectAttachmentsScopedList);
 }
 
 core.List<core.String> buildUnnamed812() {
@@ -10903,8 +11057,10 @@
 void checkUnnamed813(
     core.List<api.InterconnectAttachmentAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectAttachmentAggregatedListWarningData(o[0]);
-  checkInterconnectAttachmentAggregatedListWarningData(o[1]);
+  checkInterconnectAttachmentAggregatedListWarningData(
+      o[0] as api.InterconnectAttachmentAggregatedListWarningData);
+  checkInterconnectAttachmentAggregatedListWarningData(
+      o[1] as api.InterconnectAttachmentAggregatedListWarningData);
 }
 
 core.int buildCounterInterconnectAttachmentAggregatedListWarning = 0;
@@ -10960,7 +11116,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed812(o.unreachables);
-    checkInterconnectAttachmentAggregatedListWarning(o.warning);
+    checkInterconnectAttachmentAggregatedListWarning(
+        o.warning as api.InterconnectAttachmentAggregatedListWarning);
   }
   buildCounterInterconnectAttachmentAggregatedList--;
 }
@@ -10974,8 +11131,8 @@
 
 void checkUnnamed814(core.List<api.InterconnectAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectAttachment(o[0]);
-  checkInterconnectAttachment(o[1]);
+  checkInterconnectAttachment(o[0] as api.InterconnectAttachment);
+  checkInterconnectAttachment(o[1] as api.InterconnectAttachment);
 }
 
 core.int buildCounterInterconnectAttachmentListWarningData = 0;
@@ -11010,8 +11167,10 @@
 
 void checkUnnamed815(core.List<api.InterconnectAttachmentListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectAttachmentListWarningData(o[0]);
-  checkInterconnectAttachmentListWarningData(o[1]);
+  checkInterconnectAttachmentListWarningData(
+      o[0] as api.InterconnectAttachmentListWarningData);
+  checkInterconnectAttachmentListWarningData(
+      o[1] as api.InterconnectAttachmentListWarningData);
 }
 
 core.int buildCounterInterconnectAttachmentListWarning = 0;
@@ -11062,7 +11221,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInterconnectAttachmentListWarning(o.warning);
+    checkInterconnectAttachmentListWarning(
+        o.warning as api.InterconnectAttachmentListWarning);
   }
   buildCounterInterconnectAttachmentList--;
 }
@@ -11121,8 +11281,8 @@
 
 void checkUnnamed816(core.List<api.InterconnectAttachment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectAttachment(o[0]);
-  checkInterconnectAttachment(o[1]);
+  checkInterconnectAttachment(o[0] as api.InterconnectAttachment);
+  checkInterconnectAttachment(o[1] as api.InterconnectAttachment);
 }
 
 core.int buildCounterInterconnectAttachmentsScopedListWarningData = 0;
@@ -11158,8 +11318,10 @@
 void checkUnnamed817(
     core.List<api.InterconnectAttachmentsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectAttachmentsScopedListWarningData(o[0]);
-  checkInterconnectAttachmentsScopedListWarningData(o[1]);
+  checkInterconnectAttachmentsScopedListWarningData(
+      o[0] as api.InterconnectAttachmentsScopedListWarningData);
+  checkInterconnectAttachmentsScopedListWarningData(
+      o[1] as api.InterconnectAttachmentsScopedListWarningData);
 }
 
 core.int buildCounterInterconnectAttachmentsScopedListWarning = 0;
@@ -11204,7 +11366,8 @@
   buildCounterInterconnectAttachmentsScopedList++;
   if (buildCounterInterconnectAttachmentsScopedList < 3) {
     checkUnnamed816(o.interconnectAttachments);
-    checkInterconnectAttachmentsScopedListWarning(o.warning);
+    checkInterconnectAttachmentsScopedListWarning(
+        o.warning as api.InterconnectAttachmentsScopedListWarning);
   }
   buildCounterInterconnectAttachmentsScopedList--;
 }
@@ -11241,8 +11404,10 @@
 
 void checkUnnamed818(core.List<api.InterconnectDiagnosticsARPEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectDiagnosticsARPEntry(o[0]);
-  checkInterconnectDiagnosticsARPEntry(o[1]);
+  checkInterconnectDiagnosticsARPEntry(
+      o[0] as api.InterconnectDiagnosticsARPEntry);
+  checkInterconnectDiagnosticsARPEntry(
+      o[1] as api.InterconnectDiagnosticsARPEntry);
 }
 
 core.List<api.InterconnectDiagnosticsLinkStatus> buildUnnamed819() {
@@ -11254,8 +11419,10 @@
 
 void checkUnnamed819(core.List<api.InterconnectDiagnosticsLinkStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectDiagnosticsLinkStatus(o[0]);
-  checkInterconnectDiagnosticsLinkStatus(o[1]);
+  checkInterconnectDiagnosticsLinkStatus(
+      o[0] as api.InterconnectDiagnosticsLinkStatus);
+  checkInterconnectDiagnosticsLinkStatus(
+      o[1] as api.InterconnectDiagnosticsLinkStatus);
 }
 
 core.int buildCounterInterconnectDiagnostics = 0;
@@ -11360,8 +11527,10 @@
 
 void checkUnnamed820(core.List<api.InterconnectDiagnosticsARPEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectDiagnosticsARPEntry(o[0]);
-  checkInterconnectDiagnosticsARPEntry(o[1]);
+  checkInterconnectDiagnosticsARPEntry(
+      o[0] as api.InterconnectDiagnosticsARPEntry);
+  checkInterconnectDiagnosticsARPEntry(
+      o[1] as api.InterconnectDiagnosticsARPEntry);
 }
 
 core.int buildCounterInterconnectDiagnosticsLinkStatus = 0;
@@ -11387,9 +11556,12 @@
     checkUnnamed820(o.arpCaches);
     unittest.expect(o.circuitId, unittest.equals('foo'));
     unittest.expect(o.googleDemarc, unittest.equals('foo'));
-    checkInterconnectDiagnosticsLinkLACPStatus(o.lacpStatus);
-    checkInterconnectDiagnosticsLinkOpticalPower(o.receivingOpticalPower);
-    checkInterconnectDiagnosticsLinkOpticalPower(o.transmittingOpticalPower);
+    checkInterconnectDiagnosticsLinkLACPStatus(
+        o.lacpStatus as api.InterconnectDiagnosticsLinkLACPStatus);
+    checkInterconnectDiagnosticsLinkOpticalPower(
+        o.receivingOpticalPower as api.InterconnectDiagnosticsLinkOpticalPower);
+    checkInterconnectDiagnosticsLinkOpticalPower(o.transmittingOpticalPower
+        as api.InterconnectDiagnosticsLinkOpticalPower);
   }
   buildCounterInterconnectDiagnosticsLinkStatus--;
 }
@@ -11403,8 +11575,8 @@
 
 void checkUnnamed821(core.List<api.Interconnect> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnect(o[0]);
-  checkInterconnect(o[1]);
+  checkInterconnect(o[0] as api.Interconnect);
+  checkInterconnect(o[1] as api.Interconnect);
 }
 
 core.int buildCounterInterconnectListWarningData = 0;
@@ -11437,8 +11609,8 @@
 
 void checkUnnamed822(core.List<api.InterconnectListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectListWarningData(o[0]);
-  checkInterconnectListWarningData(o[1]);
+  checkInterconnectListWarningData(o[0] as api.InterconnectListWarningData);
+  checkInterconnectListWarningData(o[1] as api.InterconnectListWarningData);
 }
 
 core.int buildCounterInterconnectListWarning = 0;
@@ -11488,7 +11660,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInterconnectListWarning(o.warning);
+    checkInterconnectListWarning(o.warning as api.InterconnectListWarning);
   }
   buildCounterInterconnectList--;
 }
@@ -11502,8 +11674,10 @@
 
 void checkUnnamed823(core.List<api.InterconnectLocationRegionInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectLocationRegionInfo(o[0]);
-  checkInterconnectLocationRegionInfo(o[1]);
+  checkInterconnectLocationRegionInfo(
+      o[0] as api.InterconnectLocationRegionInfo);
+  checkInterconnectLocationRegionInfo(
+      o[1] as api.InterconnectLocationRegionInfo);
 }
 
 core.int buildCounterInterconnectLocation = 0;
@@ -11562,8 +11736,8 @@
 
 void checkUnnamed824(core.List<api.InterconnectLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectLocation(o[0]);
-  checkInterconnectLocation(o[1]);
+  checkInterconnectLocation(o[0] as api.InterconnectLocation);
+  checkInterconnectLocation(o[1] as api.InterconnectLocation);
 }
 
 core.int buildCounterInterconnectLocationListWarningData = 0;
@@ -11598,8 +11772,10 @@
 
 void checkUnnamed825(core.List<api.InterconnectLocationListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterconnectLocationListWarningData(o[0]);
-  checkInterconnectLocationListWarningData(o[1]);
+  checkInterconnectLocationListWarningData(
+      o[0] as api.InterconnectLocationListWarningData);
+  checkInterconnectLocationListWarningData(
+      o[1] as api.InterconnectLocationListWarningData);
 }
 
 core.int buildCounterInterconnectLocationListWarning = 0;
@@ -11650,7 +11826,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkInterconnectLocationListWarning(o.warning);
+    checkInterconnectLocationListWarning(
+        o.warning as api.InterconnectLocationListWarning);
   }
   buildCounterInterconnectLocationList--;
 }
@@ -11740,7 +11917,7 @@
     api.InterconnectsGetDiagnosticsResponse o) {
   buildCounterInterconnectsGetDiagnosticsResponse++;
   if (buildCounterInterconnectsGetDiagnosticsResponse < 3) {
-    checkInterconnectDiagnostics(o.result);
+    checkInterconnectDiagnostics(o.result as api.InterconnectDiagnostics);
   }
   buildCounterInterconnectsGetDiagnosticsResponse--;
 }
@@ -11775,7 +11952,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.licenseCode, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkLicenseResourceRequirements(o.resourceRequirements);
+    checkLicenseResourceRequirements(
+        o.resourceRequirements as api.LicenseResourceRequirements);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.transferable, unittest.isTrue);
   }
@@ -11791,8 +11969,8 @@
 
 void checkUnnamed827(core.List<api.LicenseCodeLicenseAlias> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLicenseCodeLicenseAlias(o[0]);
-  checkLicenseCodeLicenseAlias(o[1]);
+  checkLicenseCodeLicenseAlias(o[0] as api.LicenseCodeLicenseAlias);
+  checkLicenseCodeLicenseAlias(o[1] as api.LicenseCodeLicenseAlias);
 }
 
 core.int buildCounterLicenseCode = 0;
@@ -11904,8 +12082,8 @@
 
 void checkUnnamed828(core.List<api.License> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLicense(o[0]);
-  checkLicense(o[1]);
+  checkLicense(o[0] as api.License);
+  checkLicense(o[1] as api.License);
 }
 
 core.int buildCounterLicensesListResponseWarningData = 0;
@@ -11939,8 +12117,10 @@
 
 void checkUnnamed829(core.List<api.LicensesListResponseWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLicensesListResponseWarningData(o[0]);
-  checkLicensesListResponseWarningData(o[1]);
+  checkLicensesListResponseWarningData(
+      o[0] as api.LicensesListResponseWarningData);
+  checkLicensesListResponseWarningData(
+      o[1] as api.LicensesListResponseWarningData);
 }
 
 core.int buildCounterLicensesListResponseWarning = 0;
@@ -11988,7 +12168,8 @@
     checkUnnamed828(o.items);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkLicensesListResponseWarning(o.warning);
+    checkLicensesListResponseWarning(
+        o.warning as api.LicensesListResponseWarning);
   }
   buildCounterLicensesListResponse--;
 }
@@ -12009,9 +12190,11 @@
 void checkLogConfig(api.LogConfig o) {
   buildCounterLogConfig++;
   if (buildCounterLogConfig < 3) {
-    checkLogConfigCloudAuditOptions(o.cloudAudit);
-    checkLogConfigCounterOptions(o.counter);
-    checkLogConfigDataAccessOptions(o.dataAccess);
+    checkLogConfigCloudAuditOptions(
+        o.cloudAudit as api.LogConfigCloudAuditOptions);
+    checkLogConfigCounterOptions(o.counter as api.LogConfigCounterOptions);
+    checkLogConfigDataAccessOptions(
+        o.dataAccess as api.LogConfigDataAccessOptions);
   }
   buildCounterLogConfig--;
 }
@@ -12031,7 +12214,8 @@
 void checkLogConfigCloudAuditOptions(api.LogConfigCloudAuditOptions o) {
   buildCounterLogConfigCloudAuditOptions++;
   if (buildCounterLogConfigCloudAuditOptions < 3) {
-    checkAuthorizationLoggingOptions(o.authorizationLoggingOptions);
+    checkAuthorizationLoggingOptions(
+        o.authorizationLoggingOptions as api.AuthorizationLoggingOptions);
     unittest.expect(o.logName, unittest.equals('foo'));
   }
   buildCounterLogConfigCloudAuditOptions--;
@@ -12046,8 +12230,10 @@
 
 void checkUnnamed830(core.List<api.LogConfigCounterOptionsCustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogConfigCounterOptionsCustomField(o[0]);
-  checkLogConfigCounterOptionsCustomField(o[1]);
+  checkLogConfigCounterOptionsCustomField(
+      o[0] as api.LogConfigCounterOptionsCustomField);
+  checkLogConfigCounterOptionsCustomField(
+      o[1] as api.LogConfigCounterOptionsCustomField);
 }
 
 core.int buildCounterLogConfigCounterOptions = 0;
@@ -12145,8 +12331,8 @@
 
 void checkUnnamed831(core.List<api.MachineTypeAccelerators> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineTypeAccelerators(o[0]);
-  checkMachineTypeAccelerators(o[1]);
+  checkMachineTypeAccelerators(o[0] as api.MachineTypeAccelerators);
+  checkMachineTypeAccelerators(o[1] as api.MachineTypeAccelerators);
 }
 
 core.int buildCounterMachineTypeScratchDisks = 0;
@@ -12177,8 +12363,8 @@
 
 void checkUnnamed832(core.List<api.MachineTypeScratchDisks> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineTypeScratchDisks(o[0]);
-  checkMachineTypeScratchDisks(o[1]);
+  checkMachineTypeScratchDisks(o[0] as api.MachineTypeScratchDisks);
+  checkMachineTypeScratchDisks(o[1] as api.MachineTypeScratchDisks);
 }
 
 core.int buildCounterMachineType = 0;
@@ -12212,7 +12398,7 @@
   if (buildCounterMachineType < 3) {
     checkUnnamed831(o.accelerators);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkDeprecationStatus(o.deprecated);
+    checkDeprecationStatus(o.deprecated as api.DeprecationStatus);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.guestCpus, unittest.equals(42));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -12239,8 +12425,8 @@
 
 void checkUnnamed833(core.Map<core.String, api.MachineTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineTypesScopedList(o['x']);
-  checkMachineTypesScopedList(o['y']);
+  checkMachineTypesScopedList(o['x'] as api.MachineTypesScopedList);
+  checkMachineTypesScopedList(o['y'] as api.MachineTypesScopedList);
 }
 
 core.List<core.String> buildUnnamed834() {
@@ -12288,8 +12474,10 @@
 
 void checkUnnamed835(core.List<api.MachineTypeAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineTypeAggregatedListWarningData(o[0]);
-  checkMachineTypeAggregatedListWarningData(o[1]);
+  checkMachineTypeAggregatedListWarningData(
+      o[0] as api.MachineTypeAggregatedListWarningData);
+  checkMachineTypeAggregatedListWarningData(
+      o[1] as api.MachineTypeAggregatedListWarningData);
 }
 
 core.int buildCounterMachineTypeAggregatedListWarning = 0;
@@ -12342,7 +12530,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed834(o.unreachables);
-    checkMachineTypeAggregatedListWarning(o.warning);
+    checkMachineTypeAggregatedListWarning(
+        o.warning as api.MachineTypeAggregatedListWarning);
   }
   buildCounterMachineTypeAggregatedList--;
 }
@@ -12356,8 +12545,8 @@
 
 void checkUnnamed836(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineType(o[0]);
-  checkMachineType(o[1]);
+  checkMachineType(o[0] as api.MachineType);
+  checkMachineType(o[1] as api.MachineType);
 }
 
 core.int buildCounterMachineTypeListWarningData = 0;
@@ -12390,8 +12579,8 @@
 
 void checkUnnamed837(core.List<api.MachineTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineTypeListWarningData(o[0]);
-  checkMachineTypeListWarningData(o[1]);
+  checkMachineTypeListWarningData(o[0] as api.MachineTypeListWarningData);
+  checkMachineTypeListWarningData(o[1] as api.MachineTypeListWarningData);
 }
 
 core.int buildCounterMachineTypeListWarning = 0;
@@ -12441,7 +12630,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkMachineTypeListWarning(o.warning);
+    checkMachineTypeListWarning(o.warning as api.MachineTypeListWarning);
   }
   buildCounterMachineTypeList--;
 }
@@ -12455,8 +12644,8 @@
 
 void checkUnnamed838(core.List<api.MachineType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineType(o[0]);
-  checkMachineType(o[1]);
+  checkMachineType(o[0] as api.MachineType);
+  checkMachineType(o[1] as api.MachineType);
 }
 
 core.int buildCounterMachineTypesScopedListWarningData = 0;
@@ -12490,8 +12679,10 @@
 
 void checkUnnamed839(core.List<api.MachineTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMachineTypesScopedListWarningData(o[0]);
-  checkMachineTypesScopedListWarningData(o[1]);
+  checkMachineTypesScopedListWarningData(
+      o[0] as api.MachineTypesScopedListWarningData);
+  checkMachineTypesScopedListWarningData(
+      o[1] as api.MachineTypesScopedListWarningData);
 }
 
 core.int buildCounterMachineTypesScopedListWarning = 0;
@@ -12533,7 +12724,8 @@
   buildCounterMachineTypesScopedList++;
   if (buildCounterMachineTypesScopedList < 3) {
     checkUnnamed838(o.machineTypes);
-    checkMachineTypesScopedListWarning(o.warning);
+    checkMachineTypesScopedListWarning(
+        o.warning as api.MachineTypesScopedListWarning);
   }
   buildCounterMachineTypesScopedList--;
 }
@@ -12547,8 +12739,8 @@
 
 void checkUnnamed840(core.List<api.ManagedInstanceInstanceHealth> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedInstanceInstanceHealth(o[0]);
-  checkManagedInstanceInstanceHealth(o[1]);
+  checkManagedInstanceInstanceHealth(o[0] as api.ManagedInstanceInstanceHealth);
+  checkManagedInstanceInstanceHealth(o[1] as api.ManagedInstanceInstanceHealth);
 }
 
 core.int buildCounterManagedInstance = 0;
@@ -12578,10 +12770,11 @@
     unittest.expect(o.instance, unittest.equals('foo'));
     checkUnnamed840(o.instanceHealth);
     unittest.expect(o.instanceStatus, unittest.equals('foo'));
-    checkManagedInstanceLastAttempt(o.lastAttempt);
-    checkPreservedState(o.preservedStateFromConfig);
-    checkPreservedState(o.preservedStateFromPolicy);
-    checkManagedInstanceVersion(o.version);
+    checkManagedInstanceLastAttempt(
+        o.lastAttempt as api.ManagedInstanceLastAttempt);
+    checkPreservedState(o.preservedStateFromConfig as api.PreservedState);
+    checkPreservedState(o.preservedStateFromPolicy as api.PreservedState);
+    checkManagedInstanceVersion(o.version as api.ManagedInstanceVersion);
   }
   buildCounterManagedInstance--;
 }
@@ -12641,8 +12834,10 @@
 
 void checkUnnamed841(core.List<api.ManagedInstanceLastAttemptErrorsErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedInstanceLastAttemptErrorsErrors(o[0]);
-  checkManagedInstanceLastAttemptErrorsErrors(o[1]);
+  checkManagedInstanceLastAttemptErrorsErrors(
+      o[0] as api.ManagedInstanceLastAttemptErrorsErrors);
+  checkManagedInstanceLastAttemptErrorsErrors(
+      o[1] as api.ManagedInstanceLastAttemptErrorsErrors);
 }
 
 core.int buildCounterManagedInstanceLastAttemptErrors = 0;
@@ -12679,7 +12874,8 @@
 void checkManagedInstanceLastAttempt(api.ManagedInstanceLastAttempt o) {
   buildCounterManagedInstanceLastAttempt++;
   if (buildCounterManagedInstanceLastAttempt < 3) {
-    checkManagedInstanceLastAttemptErrors(o.errors);
+    checkManagedInstanceLastAttemptErrors(
+        o.errors as api.ManagedInstanceLastAttemptErrors);
   }
   buildCounterManagedInstanceLastAttempt--;
 }
@@ -12735,8 +12931,8 @@
 
 void checkUnnamed842(core.List<api.MetadataItems> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetadataItems(o[0]);
-  checkMetadataItems(o[1]);
+  checkMetadataItems(o[0] as api.MetadataItems);
+  checkMetadataItems(o[1] as api.MetadataItems);
 }
 
 core.int buildCounterMetadata = 0;
@@ -12771,8 +12967,8 @@
 
 void checkUnnamed843(core.List<api.MetadataFilterLabelMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetadataFilterLabelMatch(o[0]);
-  checkMetadataFilterLabelMatch(o[1]);
+  checkMetadataFilterLabelMatch(o[0] as api.MetadataFilterLabelMatch);
+  checkMetadataFilterLabelMatch(o[1] as api.MetadataFilterLabelMatch);
 }
 
 core.int buildCounterMetadataFilter = 0;
@@ -12847,8 +13043,8 @@
 
 void checkUnnamed844(core.List<api.NetworkPeering> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkPeering(o[0]);
-  checkNetworkPeering(o[1]);
+  checkNetworkPeering(o[0] as api.NetworkPeering);
+  checkNetworkPeering(o[1] as api.NetworkPeering);
 }
 
 core.List<core.String> buildUnnamed845() {
@@ -12900,7 +13096,7 @@
     unittest.expect(o.mtu, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed844(o.peerings);
-    checkNetworkRoutingConfig(o.routingConfig);
+    checkNetworkRoutingConfig(o.routingConfig as api.NetworkRoutingConfig);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed845(o.subnetworks);
   }
@@ -12991,9 +13187,12 @@
   buildCounterNetworkEndpointGroup++;
   if (buildCounterNetworkEndpointGroup < 3) {
     checkUnnamed847(o.annotations);
-    checkNetworkEndpointGroupAppEngine(o.appEngine);
-    checkNetworkEndpointGroupCloudFunction(o.cloudFunction);
-    checkNetworkEndpointGroupCloudRun(o.cloudRun);
+    checkNetworkEndpointGroupAppEngine(
+        o.appEngine as api.NetworkEndpointGroupAppEngine);
+    checkNetworkEndpointGroupCloudFunction(
+        o.cloudFunction as api.NetworkEndpointGroupCloudFunction);
+    checkNetworkEndpointGroupCloudRun(
+        o.cloudRun as api.NetworkEndpointGroupCloudRun);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.defaultPort, unittest.equals(42));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -13021,8 +13220,10 @@
 void checkUnnamed848(
     core.Map<core.String, api.NetworkEndpointGroupsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointGroupsScopedList(o['x']);
-  checkNetworkEndpointGroupsScopedList(o['y']);
+  checkNetworkEndpointGroupsScopedList(
+      o['x'] as api.NetworkEndpointGroupsScopedList);
+  checkNetworkEndpointGroupsScopedList(
+      o['y'] as api.NetworkEndpointGroupsScopedList);
 }
 
 core.List<core.String> buildUnnamed849() {
@@ -13071,8 +13272,10 @@
 void checkUnnamed850(
     core.List<api.NetworkEndpointGroupAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointGroupAggregatedListWarningData(o[0]);
-  checkNetworkEndpointGroupAggregatedListWarningData(o[1]);
+  checkNetworkEndpointGroupAggregatedListWarningData(
+      o[0] as api.NetworkEndpointGroupAggregatedListWarningData);
+  checkNetworkEndpointGroupAggregatedListWarningData(
+      o[1] as api.NetworkEndpointGroupAggregatedListWarningData);
 }
 
 core.int buildCounterNetworkEndpointGroupAggregatedListWarning = 0;
@@ -13128,7 +13331,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed849(o.unreachables);
-    checkNetworkEndpointGroupAggregatedListWarning(o.warning);
+    checkNetworkEndpointGroupAggregatedListWarning(
+        o.warning as api.NetworkEndpointGroupAggregatedListWarning);
   }
   buildCounterNetworkEndpointGroupAggregatedList--;
 }
@@ -13210,8 +13414,8 @@
 
 void checkUnnamed851(core.List<api.NetworkEndpointGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointGroup(o[0]);
-  checkNetworkEndpointGroup(o[1]);
+  checkNetworkEndpointGroup(o[0] as api.NetworkEndpointGroup);
+  checkNetworkEndpointGroup(o[1] as api.NetworkEndpointGroup);
 }
 
 core.int buildCounterNetworkEndpointGroupListWarningData = 0;
@@ -13246,8 +13450,10 @@
 
 void checkUnnamed852(core.List<api.NetworkEndpointGroupListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointGroupListWarningData(o[0]);
-  checkNetworkEndpointGroupListWarningData(o[1]);
+  checkNetworkEndpointGroupListWarningData(
+      o[0] as api.NetworkEndpointGroupListWarningData);
+  checkNetworkEndpointGroupListWarningData(
+      o[1] as api.NetworkEndpointGroupListWarningData);
 }
 
 core.int buildCounterNetworkEndpointGroupListWarning = 0;
@@ -13298,7 +13504,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkNetworkEndpointGroupListWarning(o.warning);
+    checkNetworkEndpointGroupListWarning(
+        o.warning as api.NetworkEndpointGroupListWarning);
   }
   buildCounterNetworkEndpointGroupList--;
 }
@@ -13312,8 +13519,8 @@
 
 void checkUnnamed853(core.List<api.NetworkEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpoint(o[0]);
-  checkNetworkEndpoint(o[1]);
+  checkNetworkEndpoint(o[0] as api.NetworkEndpoint);
+  checkNetworkEndpoint(o[1] as api.NetworkEndpoint);
 }
 
 core.int buildCounterNetworkEndpointGroupsAttachEndpointsRequest = 0;
@@ -13346,8 +13553,8 @@
 
 void checkUnnamed854(core.List<api.NetworkEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpoint(o[0]);
-  checkNetworkEndpoint(o[1]);
+  checkNetworkEndpoint(o[0] as api.NetworkEndpoint);
+  checkNetworkEndpoint(o[1] as api.NetworkEndpoint);
 }
 
 core.int buildCounterNetworkEndpointGroupsDetachEndpointsRequest = 0;
@@ -13401,8 +13608,10 @@
 
 void checkUnnamed855(core.List<api.NetworkEndpointWithHealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointWithHealthStatus(o[0]);
-  checkNetworkEndpointWithHealthStatus(o[1]);
+  checkNetworkEndpointWithHealthStatus(
+      o[0] as api.NetworkEndpointWithHealthStatus);
+  checkNetworkEndpointWithHealthStatus(
+      o[1] as api.NetworkEndpointWithHealthStatus);
 }
 
 core.int buildCounterNetworkEndpointGroupsListNetworkEndpointsWarningData = 0;
@@ -13439,8 +13648,10 @@
 void checkUnnamed856(
     core.List<api.NetworkEndpointGroupsListNetworkEndpointsWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointGroupsListNetworkEndpointsWarningData(o[0]);
-  checkNetworkEndpointGroupsListNetworkEndpointsWarningData(o[1]);
+  checkNetworkEndpointGroupsListNetworkEndpointsWarningData(
+      o[0] as api.NetworkEndpointGroupsListNetworkEndpointsWarningData);
+  checkNetworkEndpointGroupsListNetworkEndpointsWarningData(
+      o[1] as api.NetworkEndpointGroupsListNetworkEndpointsWarningData);
 }
 
 core.int buildCounterNetworkEndpointGroupsListNetworkEndpointsWarning = 0;
@@ -13492,7 +13703,8 @@
     checkUnnamed855(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkNetworkEndpointGroupsListNetworkEndpointsWarning(o.warning);
+    checkNetworkEndpointGroupsListNetworkEndpointsWarning(
+        o.warning as api.NetworkEndpointGroupsListNetworkEndpointsWarning);
   }
   buildCounterNetworkEndpointGroupsListNetworkEndpoints--;
 }
@@ -13506,8 +13718,8 @@
 
 void checkUnnamed857(core.List<api.NetworkEndpointGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointGroup(o[0]);
-  checkNetworkEndpointGroup(o[1]);
+  checkNetworkEndpointGroup(o[0] as api.NetworkEndpointGroup);
+  checkNetworkEndpointGroup(o[1] as api.NetworkEndpointGroup);
 }
 
 core.int buildCounterNetworkEndpointGroupsScopedListWarningData = 0;
@@ -13543,8 +13755,10 @@
 void checkUnnamed858(
     core.List<api.NetworkEndpointGroupsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpointGroupsScopedListWarningData(o[0]);
-  checkNetworkEndpointGroupsScopedListWarningData(o[1]);
+  checkNetworkEndpointGroupsScopedListWarningData(
+      o[0] as api.NetworkEndpointGroupsScopedListWarningData);
+  checkNetworkEndpointGroupsScopedListWarningData(
+      o[1] as api.NetworkEndpointGroupsScopedListWarningData);
 }
 
 core.int buildCounterNetworkEndpointGroupsScopedListWarning = 0;
@@ -13589,7 +13803,8 @@
   buildCounterNetworkEndpointGroupsScopedList++;
   if (buildCounterNetworkEndpointGroupsScopedList < 3) {
     checkUnnamed857(o.networkEndpointGroups);
-    checkNetworkEndpointGroupsScopedListWarning(o.warning);
+    checkNetworkEndpointGroupsScopedListWarning(
+        o.warning as api.NetworkEndpointGroupsScopedListWarning);
   }
   buildCounterNetworkEndpointGroupsScopedList--;
 }
@@ -13603,8 +13818,10 @@
 
 void checkUnnamed859(core.List<api.HealthStatusForNetworkEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthStatusForNetworkEndpoint(o[0]);
-  checkHealthStatusForNetworkEndpoint(o[1]);
+  checkHealthStatusForNetworkEndpoint(
+      o[0] as api.HealthStatusForNetworkEndpoint);
+  checkHealthStatusForNetworkEndpoint(
+      o[1] as api.HealthStatusForNetworkEndpoint);
 }
 
 core.int buildCounterNetworkEndpointWithHealthStatus = 0;
@@ -13624,7 +13841,7 @@
   buildCounterNetworkEndpointWithHealthStatus++;
   if (buildCounterNetworkEndpointWithHealthStatus < 3) {
     checkUnnamed859(o.healths);
-    checkNetworkEndpoint(o.networkEndpoint);
+    checkNetworkEndpoint(o.networkEndpoint as api.NetworkEndpoint);
   }
   buildCounterNetworkEndpointWithHealthStatus--;
 }
@@ -13638,8 +13855,8 @@
 
 void checkUnnamed860(core.List<api.AccessConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccessConfig(o[0]);
-  checkAccessConfig(o[1]);
+  checkAccessConfig(o[0] as api.AccessConfig);
+  checkAccessConfig(o[1] as api.AccessConfig);
 }
 
 core.List<api.AliasIpRange> buildUnnamed861() {
@@ -13651,8 +13868,8 @@
 
 void checkUnnamed861(core.List<api.AliasIpRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAliasIpRange(o[0]);
-  checkAliasIpRange(o[1]);
+  checkAliasIpRange(o[0] as api.AliasIpRange);
+  checkAliasIpRange(o[1] as api.AliasIpRange);
 }
 
 core.int buildCounterNetworkInterface = 0;
@@ -13699,8 +13916,8 @@
 
 void checkUnnamed862(core.List<api.Network> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetwork(o[0]);
-  checkNetwork(o[1]);
+  checkNetwork(o[0] as api.Network);
+  checkNetwork(o[1] as api.Network);
 }
 
 core.int buildCounterNetworkListWarningData = 0;
@@ -13733,8 +13950,8 @@
 
 void checkUnnamed863(core.List<api.NetworkListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkListWarningData(o[0]);
-  checkNetworkListWarningData(o[1]);
+  checkNetworkListWarningData(o[0] as api.NetworkListWarningData);
+  checkNetworkListWarningData(o[1] as api.NetworkListWarningData);
 }
 
 core.int buildCounterNetworkListWarning = 0;
@@ -13784,7 +14001,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkNetworkListWarning(o.warning);
+    checkNetworkListWarning(o.warning as api.NetworkListWarning);
   }
   buildCounterNetworkList--;
 }
@@ -13866,7 +14083,7 @@
   if (buildCounterNetworksAddPeeringRequest < 3) {
     unittest.expect(o.autoCreateRoutes, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNetworkPeering(o.networkPeering);
+    checkNetworkPeering(o.networkPeering as api.NetworkPeering);
     unittest.expect(o.peerNetwork, unittest.equals('foo'));
   }
   buildCounterNetworksAddPeeringRequest--;
@@ -13905,7 +14122,7 @@
 void checkNetworksUpdatePeeringRequest(api.NetworksUpdatePeeringRequest o) {
   buildCounterNetworksUpdatePeeringRequest++;
   if (buildCounterNetworksUpdatePeeringRequest < 3) {
-    checkNetworkPeering(o.networkPeering);
+    checkNetworkPeering(o.networkPeering as api.NetworkPeering);
   }
   buildCounterNetworksUpdatePeeringRequest--;
 }
@@ -13936,7 +14153,8 @@
 void checkNodeGroup(api.NodeGroup o) {
   buildCounterNodeGroup++;
   if (buildCounterNodeGroup < 3) {
-    checkNodeGroupAutoscalingPolicy(o.autoscalingPolicy);
+    checkNodeGroupAutoscalingPolicy(
+        o.autoscalingPolicy as api.NodeGroupAutoscalingPolicy);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
@@ -13962,8 +14180,8 @@
 
 void checkUnnamed864(core.Map<core.String, api.NodeGroupsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroupsScopedList(o['x']);
-  checkNodeGroupsScopedList(o['y']);
+  checkNodeGroupsScopedList(o['x'] as api.NodeGroupsScopedList);
+  checkNodeGroupsScopedList(o['y'] as api.NodeGroupsScopedList);
 }
 
 core.List<core.String> buildUnnamed865() {
@@ -14011,8 +14229,10 @@
 
 void checkUnnamed866(core.List<api.NodeGroupAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroupAggregatedListWarningData(o[0]);
-  checkNodeGroupAggregatedListWarningData(o[1]);
+  checkNodeGroupAggregatedListWarningData(
+      o[0] as api.NodeGroupAggregatedListWarningData);
+  checkNodeGroupAggregatedListWarningData(
+      o[1] as api.NodeGroupAggregatedListWarningData);
 }
 
 core.int buildCounterNodeGroupAggregatedListWarning = 0;
@@ -14064,7 +14284,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed865(o.unreachables);
-    checkNodeGroupAggregatedListWarning(o.warning);
+    checkNodeGroupAggregatedListWarning(
+        o.warning as api.NodeGroupAggregatedListWarning);
   }
   buildCounterNodeGroupAggregatedList--;
 }
@@ -14101,8 +14322,8 @@
 
 void checkUnnamed867(core.List<api.NodeGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroup(o[0]);
-  checkNodeGroup(o[1]);
+  checkNodeGroup(o[0] as api.NodeGroup);
+  checkNodeGroup(o[1] as api.NodeGroup);
 }
 
 core.int buildCounterNodeGroupListWarningData = 0;
@@ -14135,8 +14356,8 @@
 
 void checkUnnamed868(core.List<api.NodeGroupListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroupListWarningData(o[0]);
-  checkNodeGroupListWarningData(o[1]);
+  checkNodeGroupListWarningData(o[0] as api.NodeGroupListWarningData);
+  checkNodeGroupListWarningData(o[1] as api.NodeGroupListWarningData);
 }
 
 core.int buildCounterNodeGroupListWarning = 0;
@@ -14186,7 +14407,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkNodeGroupListWarning(o.warning);
+    checkNodeGroupListWarning(o.warning as api.NodeGroupListWarning);
   }
   buildCounterNodeGroupList--;
 }
@@ -14228,7 +14449,7 @@
     checkUnnamed869(o.instances);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nodeType, unittest.equals('foo'));
-    checkServerBinding(o.serverBinding);
+    checkServerBinding(o.serverBinding as api.ServerBinding);
     unittest.expect(o.serverId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
@@ -14295,8 +14516,8 @@
 
 void checkUnnamed871(core.List<api.NodeGroupNode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroupNode(o[0]);
-  checkNodeGroupNode(o[1]);
+  checkNodeGroupNode(o[0] as api.NodeGroupNode);
+  checkNodeGroupNode(o[1] as api.NodeGroupNode);
 }
 
 core.int buildCounterNodeGroupsListNodesWarningData = 0;
@@ -14329,8 +14550,10 @@
 
 void checkUnnamed872(core.List<api.NodeGroupsListNodesWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroupsListNodesWarningData(o[0]);
-  checkNodeGroupsListNodesWarningData(o[1]);
+  checkNodeGroupsListNodesWarningData(
+      o[0] as api.NodeGroupsListNodesWarningData);
+  checkNodeGroupsListNodesWarningData(
+      o[1] as api.NodeGroupsListNodesWarningData);
 }
 
 core.int buildCounterNodeGroupsListNodesWarning = 0;
@@ -14380,7 +14603,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkNodeGroupsListNodesWarning(o.warning);
+    checkNodeGroupsListNodesWarning(
+        o.warning as api.NodeGroupsListNodesWarning);
   }
   buildCounterNodeGroupsListNodes--;
 }
@@ -14394,8 +14618,8 @@
 
 void checkUnnamed873(core.List<api.NodeGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroup(o[0]);
-  checkNodeGroup(o[1]);
+  checkNodeGroup(o[0] as api.NodeGroup);
+  checkNodeGroup(o[1] as api.NodeGroup);
 }
 
 core.int buildCounterNodeGroupsScopedListWarningData = 0;
@@ -14429,8 +14653,10 @@
 
 void checkUnnamed874(core.List<api.NodeGroupsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeGroupsScopedListWarningData(o[0]);
-  checkNodeGroupsScopedListWarningData(o[1]);
+  checkNodeGroupsScopedListWarningData(
+      o[0] as api.NodeGroupsScopedListWarningData);
+  checkNodeGroupsScopedListWarningData(
+      o[1] as api.NodeGroupsScopedListWarningData);
 }
 
 core.int buildCounterNodeGroupsScopedListWarning = 0;
@@ -14472,7 +14698,8 @@
   buildCounterNodeGroupsScopedList++;
   if (buildCounterNodeGroupsScopedList < 3) {
     checkUnnamed873(o.nodeGroups);
-    checkNodeGroupsScopedListWarning(o.warning);
+    checkNodeGroupsScopedListWarning(
+        o.warning as api.NodeGroupsScopedListWarning);
   }
   buildCounterNodeGroupsScopedList--;
 }
@@ -14545,10 +14772,11 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed875(o.nodeAffinityLabels);
     unittest.expect(o.nodeType, unittest.equals('foo'));
-    checkNodeTemplateNodeTypeFlexibility(o.nodeTypeFlexibility);
+    checkNodeTemplateNodeTypeFlexibility(
+        o.nodeTypeFlexibility as api.NodeTemplateNodeTypeFlexibility);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkServerBinding(o.serverBinding);
+    checkServerBinding(o.serverBinding as api.ServerBinding);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
   }
@@ -14564,8 +14792,8 @@
 
 void checkUnnamed876(core.Map<core.String, api.NodeTemplatesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTemplatesScopedList(o['x']);
-  checkNodeTemplatesScopedList(o['y']);
+  checkNodeTemplatesScopedList(o['x'] as api.NodeTemplatesScopedList);
+  checkNodeTemplatesScopedList(o['y'] as api.NodeTemplatesScopedList);
 }
 
 core.List<core.String> buildUnnamed877() {
@@ -14613,8 +14841,10 @@
 
 void checkUnnamed878(core.List<api.NodeTemplateAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTemplateAggregatedListWarningData(o[0]);
-  checkNodeTemplateAggregatedListWarningData(o[1]);
+  checkNodeTemplateAggregatedListWarningData(
+      o[0] as api.NodeTemplateAggregatedListWarningData);
+  checkNodeTemplateAggregatedListWarningData(
+      o[1] as api.NodeTemplateAggregatedListWarningData);
 }
 
 core.int buildCounterNodeTemplateAggregatedListWarning = 0;
@@ -14667,7 +14897,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed877(o.unreachables);
-    checkNodeTemplateAggregatedListWarning(o.warning);
+    checkNodeTemplateAggregatedListWarning(
+        o.warning as api.NodeTemplateAggregatedListWarning);
   }
   buildCounterNodeTemplateAggregatedList--;
 }
@@ -14681,8 +14912,8 @@
 
 void checkUnnamed879(core.List<api.NodeTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTemplate(o[0]);
-  checkNodeTemplate(o[1]);
+  checkNodeTemplate(o[0] as api.NodeTemplate);
+  checkNodeTemplate(o[1] as api.NodeTemplate);
 }
 
 core.int buildCounterNodeTemplateListWarningData = 0;
@@ -14715,8 +14946,8 @@
 
 void checkUnnamed880(core.List<api.NodeTemplateListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTemplateListWarningData(o[0]);
-  checkNodeTemplateListWarningData(o[1]);
+  checkNodeTemplateListWarningData(o[0] as api.NodeTemplateListWarningData);
+  checkNodeTemplateListWarningData(o[1] as api.NodeTemplateListWarningData);
 }
 
 core.int buildCounterNodeTemplateListWarning = 0;
@@ -14766,7 +14997,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkNodeTemplateListWarning(o.warning);
+    checkNodeTemplateListWarning(o.warning as api.NodeTemplateListWarning);
   }
   buildCounterNodeTemplateList--;
 }
@@ -14804,8 +15035,8 @@
 
 void checkUnnamed881(core.List<api.NodeTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTemplate(o[0]);
-  checkNodeTemplate(o[1]);
+  checkNodeTemplate(o[0] as api.NodeTemplate);
+  checkNodeTemplate(o[1] as api.NodeTemplate);
 }
 
 core.int buildCounterNodeTemplatesScopedListWarningData = 0;
@@ -14840,8 +15071,10 @@
 
 void checkUnnamed882(core.List<api.NodeTemplatesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTemplatesScopedListWarningData(o[0]);
-  checkNodeTemplatesScopedListWarningData(o[1]);
+  checkNodeTemplatesScopedListWarningData(
+      o[0] as api.NodeTemplatesScopedListWarningData);
+  checkNodeTemplatesScopedListWarningData(
+      o[1] as api.NodeTemplatesScopedListWarningData);
 }
 
 core.int buildCounterNodeTemplatesScopedListWarning = 0;
@@ -14883,7 +15116,8 @@
   buildCounterNodeTemplatesScopedList++;
   if (buildCounterNodeTemplatesScopedList < 3) {
     checkUnnamed881(o.nodeTemplates);
-    checkNodeTemplatesScopedListWarning(o.warning);
+    checkNodeTemplatesScopedListWarning(
+        o.warning as api.NodeTemplatesScopedListWarning);
   }
   buildCounterNodeTemplatesScopedList--;
 }
@@ -14915,7 +15149,7 @@
   if (buildCounterNodeType < 3) {
     unittest.expect(o.cpuPlatform, unittest.equals('foo'));
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkDeprecationStatus(o.deprecated);
+    checkDeprecationStatus(o.deprecated as api.DeprecationStatus);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.guestCpus, unittest.equals(42));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -14938,8 +15172,8 @@
 
 void checkUnnamed883(core.Map<core.String, api.NodeTypesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTypesScopedList(o['x']);
-  checkNodeTypesScopedList(o['y']);
+  checkNodeTypesScopedList(o['x'] as api.NodeTypesScopedList);
+  checkNodeTypesScopedList(o['y'] as api.NodeTypesScopedList);
 }
 
 core.List<core.String> buildUnnamed884() {
@@ -14986,8 +15220,10 @@
 
 void checkUnnamed885(core.List<api.NodeTypeAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTypeAggregatedListWarningData(o[0]);
-  checkNodeTypeAggregatedListWarningData(o[1]);
+  checkNodeTypeAggregatedListWarningData(
+      o[0] as api.NodeTypeAggregatedListWarningData);
+  checkNodeTypeAggregatedListWarningData(
+      o[1] as api.NodeTypeAggregatedListWarningData);
 }
 
 core.int buildCounterNodeTypeAggregatedListWarning = 0;
@@ -15039,7 +15275,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed884(o.unreachables);
-    checkNodeTypeAggregatedListWarning(o.warning);
+    checkNodeTypeAggregatedListWarning(
+        o.warning as api.NodeTypeAggregatedListWarning);
   }
   buildCounterNodeTypeAggregatedList--;
 }
@@ -15053,8 +15290,8 @@
 
 void checkUnnamed886(core.List<api.NodeType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeType(o[0]);
-  checkNodeType(o[1]);
+  checkNodeType(o[0] as api.NodeType);
+  checkNodeType(o[1] as api.NodeType);
 }
 
 core.int buildCounterNodeTypeListWarningData = 0;
@@ -15087,8 +15324,8 @@
 
 void checkUnnamed887(core.List<api.NodeTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTypeListWarningData(o[0]);
-  checkNodeTypeListWarningData(o[1]);
+  checkNodeTypeListWarningData(o[0] as api.NodeTypeListWarningData);
+  checkNodeTypeListWarningData(o[1] as api.NodeTypeListWarningData);
 }
 
 core.int buildCounterNodeTypeListWarning = 0;
@@ -15138,7 +15375,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkNodeTypeListWarning(o.warning);
+    checkNodeTypeListWarning(o.warning as api.NodeTypeListWarning);
   }
   buildCounterNodeTypeList--;
 }
@@ -15152,8 +15389,8 @@
 
 void checkUnnamed888(core.List<api.NodeType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeType(o[0]);
-  checkNodeType(o[1]);
+  checkNodeType(o[0] as api.NodeType);
+  checkNodeType(o[1] as api.NodeType);
 }
 
 core.int buildCounterNodeTypesScopedListWarningData = 0;
@@ -15186,8 +15423,10 @@
 
 void checkUnnamed889(core.List<api.NodeTypesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTypesScopedListWarningData(o[0]);
-  checkNodeTypesScopedListWarningData(o[1]);
+  checkNodeTypesScopedListWarningData(
+      o[0] as api.NodeTypesScopedListWarningData);
+  checkNodeTypesScopedListWarningData(
+      o[1] as api.NodeTypesScopedListWarningData);
 }
 
 core.int buildCounterNodeTypesScopedListWarning = 0;
@@ -15229,7 +15468,8 @@
   buildCounterNodeTypesScopedList++;
   if (buildCounterNodeTypesScopedList < 3) {
     checkUnnamed888(o.nodeTypes);
-    checkNodeTypesScopedListWarning(o.warning);
+    checkNodeTypesScopedListWarning(
+        o.warning as api.NodeTypesScopedListWarning);
   }
   buildCounterNodeTypesScopedList--;
 }
@@ -15257,7 +15497,8 @@
   if (buildCounterNotificationEndpoint < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkNotificationEndpointGrpcSettings(o.grpcSettings);
+    checkNotificationEndpointGrpcSettings(
+        o.grpcSettings as api.NotificationEndpointGrpcSettings);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -15289,7 +15530,7 @@
     unittest.expect(o.authority, unittest.equals('foo'));
     unittest.expect(o.endpoint, unittest.equals('foo'));
     unittest.expect(o.payloadName, unittest.equals('foo'));
-    checkDuration(o.resendInterval);
+    checkDuration(o.resendInterval as api.Duration);
     unittest.expect(o.retryDurationSec, unittest.equals(42));
   }
   buildCounterNotificationEndpointGrpcSettings--;
@@ -15304,8 +15545,8 @@
 
 void checkUnnamed890(core.List<api.NotificationEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotificationEndpoint(o[0]);
-  checkNotificationEndpoint(o[1]);
+  checkNotificationEndpoint(o[0] as api.NotificationEndpoint);
+  checkNotificationEndpoint(o[1] as api.NotificationEndpoint);
 }
 
 core.int buildCounterNotificationEndpointListWarningData = 0;
@@ -15340,8 +15581,10 @@
 
 void checkUnnamed891(core.List<api.NotificationEndpointListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotificationEndpointListWarningData(o[0]);
-  checkNotificationEndpointListWarningData(o[1]);
+  checkNotificationEndpointListWarningData(
+      o[0] as api.NotificationEndpointListWarningData);
+  checkNotificationEndpointListWarningData(
+      o[1] as api.NotificationEndpointListWarningData);
 }
 
 core.int buildCounterNotificationEndpointListWarning = 0;
@@ -15392,7 +15635,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkNotificationEndpointListWarning(o.warning);
+    checkNotificationEndpointListWarning(
+        o.warning as api.NotificationEndpointListWarning);
   }
   buildCounterNotificationEndpointList--;
 }
@@ -15429,8 +15673,8 @@
 
 void checkUnnamed892(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationErrorErrors(o[0]);
-  checkOperationErrorErrors(o[1]);
+  checkOperationErrorErrors(o[0] as api.OperationErrorErrors);
+  checkOperationErrorErrors(o[1] as api.OperationErrorErrors);
 }
 
 core.int buildCounterOperationError = 0;
@@ -15482,8 +15726,8 @@
 
 void checkUnnamed893(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationWarningsData(o[0]);
-  checkOperationWarningsData(o[1]);
+  checkOperationWarningsData(o[0] as api.OperationWarningsData);
+  checkOperationWarningsData(o[1] as api.OperationWarningsData);
 }
 
 core.int buildCounterOperationWarnings = 0;
@@ -15518,8 +15762,8 @@
 
 void checkUnnamed894(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationWarnings(o[0]);
-  checkOperationWarnings(o[1]);
+  checkOperationWarnings(o[0] as api.OperationWarnings);
+  checkOperationWarnings(o[1] as api.OperationWarnings);
 }
 
 core.int buildCounterOperation = 0;
@@ -15562,7 +15806,7 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkOperationError(o.error);
+    checkOperationError(o.error as api.OperationError);
     unittest.expect(o.httpErrorMessage, unittest.equals('foo'));
     unittest.expect(o.httpErrorStatusCode, unittest.equals(42));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -15594,8 +15838,8 @@
 
 void checkUnnamed895(core.Map<core.String, api.OperationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationsScopedList(o['x']);
-  checkOperationsScopedList(o['y']);
+  checkOperationsScopedList(o['x'] as api.OperationsScopedList);
+  checkOperationsScopedList(o['y'] as api.OperationsScopedList);
 }
 
 core.List<core.String> buildUnnamed896() {
@@ -15643,8 +15887,10 @@
 
 void checkUnnamed897(core.List<api.OperationAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationAggregatedListWarningData(o[0]);
-  checkOperationAggregatedListWarningData(o[1]);
+  checkOperationAggregatedListWarningData(
+      o[0] as api.OperationAggregatedListWarningData);
+  checkOperationAggregatedListWarningData(
+      o[1] as api.OperationAggregatedListWarningData);
 }
 
 core.int buildCounterOperationAggregatedListWarning = 0;
@@ -15696,7 +15942,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed896(o.unreachables);
-    checkOperationAggregatedListWarning(o.warning);
+    checkOperationAggregatedListWarning(
+        o.warning as api.OperationAggregatedListWarning);
   }
   buildCounterOperationAggregatedList--;
 }
@@ -15710,8 +15957,8 @@
 
 void checkUnnamed898(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterOperationListWarningData = 0;
@@ -15744,8 +15991,8 @@
 
 void checkUnnamed899(core.List<api.OperationListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationListWarningData(o[0]);
-  checkOperationListWarningData(o[1]);
+  checkOperationListWarningData(o[0] as api.OperationListWarningData);
+  checkOperationListWarningData(o[1] as api.OperationListWarningData);
 }
 
 core.int buildCounterOperationListWarning = 0;
@@ -15795,7 +16042,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkOperationListWarning(o.warning);
+    checkOperationListWarning(o.warning as api.OperationListWarning);
   }
   buildCounterOperationList--;
 }
@@ -15809,8 +16056,8 @@
 
 void checkUnnamed900(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterOperationsScopedListWarningData = 0;
@@ -15844,8 +16091,10 @@
 
 void checkUnnamed901(core.List<api.OperationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationsScopedListWarningData(o[0]);
-  checkOperationsScopedListWarningData(o[1]);
+  checkOperationsScopedListWarningData(
+      o[0] as api.OperationsScopedListWarningData);
+  checkOperationsScopedListWarningData(
+      o[1] as api.OperationsScopedListWarningData);
 }
 
 core.int buildCounterOperationsScopedListWarning = 0;
@@ -15887,7 +16136,8 @@
   buildCounterOperationsScopedList++;
   if (buildCounterOperationsScopedList < 3) {
     checkUnnamed900(o.operations);
-    checkOperationsScopedListWarning(o.warning);
+    checkOperationsScopedListWarning(
+        o.warning as api.OperationsScopedListWarning);
   }
   buildCounterOperationsScopedList--;
 }
@@ -15916,13 +16166,13 @@
 void checkOutlierDetection(api.OutlierDetection o) {
   buildCounterOutlierDetection++;
   if (buildCounterOutlierDetection < 3) {
-    checkDuration(o.baseEjectionTime);
+    checkDuration(o.baseEjectionTime as api.Duration);
     unittest.expect(o.consecutiveErrors, unittest.equals(42));
     unittest.expect(o.consecutiveGatewayFailure, unittest.equals(42));
     unittest.expect(o.enforcingConsecutiveErrors, unittest.equals(42));
     unittest.expect(o.enforcingConsecutiveGatewayFailure, unittest.equals(42));
     unittest.expect(o.enforcingSuccessRate, unittest.equals(42));
-    checkDuration(o.interval);
+    checkDuration(o.interval as api.Duration);
     unittest.expect(o.maxEjectionPercent, unittest.equals(42));
     unittest.expect(o.successRateMinimumHosts, unittest.equals(42));
     unittest.expect(o.successRateRequestVolume, unittest.equals(42));
@@ -15957,16 +16207,19 @@
 void checkPacketMirroring(api.PacketMirroring o) {
   buildCounterPacketMirroring++;
   if (buildCounterPacketMirroring < 3) {
-    checkPacketMirroringForwardingRuleInfo(o.collectorIlb);
+    checkPacketMirroringForwardingRuleInfo(
+        o.collectorIlb as api.PacketMirroringForwardingRuleInfo);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.enable, unittest.equals('foo'));
-    checkPacketMirroringFilter(o.filter);
+    checkPacketMirroringFilter(o.filter as api.PacketMirroringFilter);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPacketMirroringMirroredResourceInfo(o.mirroredResources);
+    checkPacketMirroringMirroredResourceInfo(
+        o.mirroredResources as api.PacketMirroringMirroredResourceInfo);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPacketMirroringNetworkInfo(o.network);
+    checkPacketMirroringNetworkInfo(
+        o.network as api.PacketMirroringNetworkInfo);
     unittest.expect(o.priority, unittest.equals(42));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -15983,8 +16236,8 @@
 
 void checkUnnamed902(core.Map<core.String, api.PacketMirroringsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroringsScopedList(o['x']);
-  checkPacketMirroringsScopedList(o['y']);
+  checkPacketMirroringsScopedList(o['x'] as api.PacketMirroringsScopedList);
+  checkPacketMirroringsScopedList(o['y'] as api.PacketMirroringsScopedList);
 }
 
 core.List<core.String> buildUnnamed903() {
@@ -16033,8 +16286,10 @@
 void checkUnnamed904(
     core.List<api.PacketMirroringAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroringAggregatedListWarningData(o[0]);
-  checkPacketMirroringAggregatedListWarningData(o[1]);
+  checkPacketMirroringAggregatedListWarningData(
+      o[0] as api.PacketMirroringAggregatedListWarningData);
+  checkPacketMirroringAggregatedListWarningData(
+      o[1] as api.PacketMirroringAggregatedListWarningData);
 }
 
 core.int buildCounterPacketMirroringAggregatedListWarning = 0;
@@ -16088,7 +16343,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed903(o.unreachables);
-    checkPacketMirroringAggregatedListWarning(o.warning);
+    checkPacketMirroringAggregatedListWarning(
+        o.warning as api.PacketMirroringAggregatedListWarning);
   }
   buildCounterPacketMirroringAggregatedList--;
 }
@@ -16171,8 +16427,8 @@
 
 void checkUnnamed907(core.List<api.PacketMirroring> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroring(o[0]);
-  checkPacketMirroring(o[1]);
+  checkPacketMirroring(o[0] as api.PacketMirroring);
+  checkPacketMirroring(o[1] as api.PacketMirroring);
 }
 
 core.int buildCounterPacketMirroringListWarningData = 0;
@@ -16205,8 +16461,10 @@
 
 void checkUnnamed908(core.List<api.PacketMirroringListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroringListWarningData(o[0]);
-  checkPacketMirroringListWarningData(o[1]);
+  checkPacketMirroringListWarningData(
+      o[0] as api.PacketMirroringListWarningData);
+  checkPacketMirroringListWarningData(
+      o[1] as api.PacketMirroringListWarningData);
 }
 
 core.int buildCounterPacketMirroringListWarning = 0;
@@ -16256,7 +16514,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkPacketMirroringListWarning(o.warning);
+    checkPacketMirroringListWarning(
+        o.warning as api.PacketMirroringListWarning);
   }
   buildCounterPacketMirroringList--;
 }
@@ -16272,8 +16531,10 @@
 void checkUnnamed909(
     core.List<api.PacketMirroringMirroredResourceInfoInstanceInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroringMirroredResourceInfoInstanceInfo(o[0]);
-  checkPacketMirroringMirroredResourceInfoInstanceInfo(o[1]);
+  checkPacketMirroringMirroredResourceInfoInstanceInfo(
+      o[0] as api.PacketMirroringMirroredResourceInfoInstanceInfo);
+  checkPacketMirroringMirroredResourceInfoInstanceInfo(
+      o[1] as api.PacketMirroringMirroredResourceInfoInstanceInfo);
 }
 
 core.List<api.PacketMirroringMirroredResourceInfoSubnetInfo> buildUnnamed910() {
@@ -16286,8 +16547,10 @@
 void checkUnnamed910(
     core.List<api.PacketMirroringMirroredResourceInfoSubnetInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroringMirroredResourceInfoSubnetInfo(o[0]);
-  checkPacketMirroringMirroredResourceInfoSubnetInfo(o[1]);
+  checkPacketMirroringMirroredResourceInfoSubnetInfo(
+      o[0] as api.PacketMirroringMirroredResourceInfoSubnetInfo);
+  checkPacketMirroringMirroredResourceInfoSubnetInfo(
+      o[1] as api.PacketMirroringMirroredResourceInfoSubnetInfo);
 }
 
 core.List<core.String> buildUnnamed911() {
@@ -16404,8 +16667,8 @@
 
 void checkUnnamed912(core.List<api.PacketMirroring> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroring(o[0]);
-  checkPacketMirroring(o[1]);
+  checkPacketMirroring(o[0] as api.PacketMirroring);
+  checkPacketMirroring(o[1] as api.PacketMirroring);
 }
 
 core.int buildCounterPacketMirroringsScopedListWarningData = 0;
@@ -16440,8 +16703,10 @@
 
 void checkUnnamed913(core.List<api.PacketMirroringsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPacketMirroringsScopedListWarningData(o[0]);
-  checkPacketMirroringsScopedListWarningData(o[1]);
+  checkPacketMirroringsScopedListWarningData(
+      o[0] as api.PacketMirroringsScopedListWarningData);
+  checkPacketMirroringsScopedListWarningData(
+      o[1] as api.PacketMirroringsScopedListWarningData);
 }
 
 core.int buildCounterPacketMirroringsScopedListWarning = 0;
@@ -16484,7 +16749,8 @@
   buildCounterPacketMirroringsScopedList++;
   if (buildCounterPacketMirroringsScopedList < 3) {
     checkUnnamed912(o.packetMirrorings);
-    checkPacketMirroringsScopedListWarning(o.warning);
+    checkPacketMirroringsScopedListWarning(
+        o.warning as api.PacketMirroringsScopedListWarning);
   }
   buildCounterPacketMirroringsScopedList--;
 }
@@ -16498,8 +16764,8 @@
 
 void checkUnnamed914(core.List<api.PathRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPathRule(o[0]);
-  checkPathRule(o[1]);
+  checkPathRule(o[0] as api.PathRule);
+  checkPathRule(o[1] as api.PathRule);
 }
 
 core.List<api.HttpRouteRule> buildUnnamed915() {
@@ -16511,8 +16777,8 @@
 
 void checkUnnamed915(core.List<api.HttpRouteRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRouteRule(o[0]);
-  checkHttpRouteRule(o[1]);
+  checkHttpRouteRule(o[0] as api.HttpRouteRule);
+  checkHttpRouteRule(o[1] as api.HttpRouteRule);
 }
 
 core.int buildCounterPathMatcher = 0;
@@ -16536,11 +16802,11 @@
 void checkPathMatcher(api.PathMatcher o) {
   buildCounterPathMatcher++;
   if (buildCounterPathMatcher < 3) {
-    checkHttpRouteAction(o.defaultRouteAction);
+    checkHttpRouteAction(o.defaultRouteAction as api.HttpRouteAction);
     unittest.expect(o.defaultService, unittest.equals('foo'));
-    checkHttpRedirectAction(o.defaultUrlRedirect);
+    checkHttpRedirectAction(o.defaultUrlRedirect as api.HttpRedirectAction);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkHttpHeaderAction(o.headerAction);
+    checkHttpHeaderAction(o.headerAction as api.HttpHeaderAction);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed914(o.pathRules);
     checkUnnamed915(o.routeRules);
@@ -16579,9 +16845,9 @@
   buildCounterPathRule++;
   if (buildCounterPathRule < 3) {
     checkUnnamed916(o.paths);
-    checkHttpRouteAction(o.routeAction);
+    checkHttpRouteAction(o.routeAction as api.HttpRouteAction);
     unittest.expect(o.service, unittest.equals('foo'));
-    checkHttpRedirectAction(o.urlRedirect);
+    checkHttpRedirectAction(o.urlRedirect as api.HttpRedirectAction);
   }
   buildCounterPathRule--;
 }
@@ -16605,7 +16871,7 @@
   if (buildCounterPerInstanceConfig < 3) {
     unittest.expect(o.fingerprint, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPreservedState(o.preservedState);
+    checkPreservedState(o.preservedState as api.PreservedState);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterPerInstanceConfig--;
@@ -16620,8 +16886,8 @@
 
 void checkUnnamed917(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed918() {
@@ -16633,8 +16899,8 @@
 
 void checkUnnamed918(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.List<api.Rule> buildUnnamed919() {
@@ -16646,8 +16912,8 @@
 
 void checkUnnamed919(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
+  checkRule(o[0] as api.Rule);
+  checkRule(o[1] as api.Rule);
 }
 
 core.int buildCounterPolicy = 0;
@@ -16688,8 +16954,8 @@
 
 void checkUnnamed920(core.List<api.WafExpressionSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWafExpressionSet(o[0]);
-  checkWafExpressionSet(o[1]);
+  checkWafExpressionSet(o[0] as api.WafExpressionSet);
+  checkWafExpressionSet(o[1] as api.WafExpressionSet);
 }
 
 core.int buildCounterPreconfiguredWafSet = 0;
@@ -16720,8 +16986,8 @@
 
 void checkUnnamed921(core.Map<core.String, api.PreservedStatePreservedDisk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPreservedStatePreservedDisk(o['x']);
-  checkPreservedStatePreservedDisk(o['y']);
+  checkPreservedStatePreservedDisk(o['x'] as api.PreservedStatePreservedDisk);
+  checkPreservedStatePreservedDisk(o['y'] as api.PreservedStatePreservedDisk);
 }
 
 core.Map<core.String, core.String> buildUnnamed922() {
@@ -16803,8 +17069,8 @@
 
 void checkUnnamed924(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuota(o[0]);
-  checkQuota(o[1]);
+  checkQuota(o[0] as api.Quota);
+  checkQuota(o[1] as api.Quota);
 }
 
 core.int buildCounterProject = 0;
@@ -16833,7 +17099,7 @@
 void checkProject(api.Project o) {
   buildCounterProject++;
   if (buildCounterProject < 3) {
-    checkMetadata(o.commonInstanceMetadata);
+    checkMetadata(o.commonInstanceMetadata as api.Metadata);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.defaultNetworkTier, unittest.equals('foo'));
     unittest.expect(o.defaultServiceAccount, unittest.equals('foo'));
@@ -16844,7 +17110,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed924(o.quotas);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUsageExportLocation(o.usageExportLocation);
+    checkUsageExportLocation(o.usageExportLocation as api.UsageExportLocation);
     unittest.expect(o.xpnProjectStatus, unittest.equals('foo'));
   }
   buildCounterProject--;
@@ -16865,7 +17131,7 @@
     api.ProjectsDisableXpnResourceRequest o) {
   buildCounterProjectsDisableXpnResourceRequest++;
   if (buildCounterProjectsDisableXpnResourceRequest < 3) {
-    checkXpnResourceId(o.xpnResource);
+    checkXpnResourceId(o.xpnResource as api.XpnResourceId);
   }
   buildCounterProjectsDisableXpnResourceRequest--;
 }
@@ -16885,7 +17151,7 @@
     api.ProjectsEnableXpnResourceRequest o) {
   buildCounterProjectsEnableXpnResourceRequest++;
   if (buildCounterProjectsEnableXpnResourceRequest < 3) {
-    checkXpnResourceId(o.xpnResource);
+    checkXpnResourceId(o.xpnResource as api.XpnResourceId);
   }
   buildCounterProjectsEnableXpnResourceRequest--;
 }
@@ -16899,8 +17165,8 @@
 
 void checkUnnamed925(core.List<api.XpnResourceId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkXpnResourceId(o[0]);
-  checkXpnResourceId(o[1]);
+  checkXpnResourceId(o[0] as api.XpnResourceId);
+  checkXpnResourceId(o[1] as api.XpnResourceId);
 }
 
 core.int buildCounterProjectsGetXpnResources = 0;
@@ -17025,8 +17291,8 @@
 
 void checkUnnamed926(core.List<api.Quota> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuota(o[0]);
-  checkQuota(o[1]);
+  checkQuota(o[0] as api.Quota);
+  checkQuota(o[1] as api.Quota);
 }
 
 core.List<core.String> buildUnnamed927() {
@@ -17066,7 +17332,7 @@
   buildCounterRegion++;
   if (buildCounterRegion < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkDeprecationStatus(o.deprecated);
+    checkDeprecationStatus(o.deprecated as api.DeprecationStatus);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -17088,8 +17354,8 @@
 
 void checkUnnamed928(core.List<api.Autoscaler> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscaler(o[0]);
-  checkAutoscaler(o[1]);
+  checkAutoscaler(o[0] as api.Autoscaler);
+  checkAutoscaler(o[1] as api.Autoscaler);
 }
 
 core.int buildCounterRegionAutoscalerListWarningData = 0;
@@ -17123,8 +17389,10 @@
 
 void checkUnnamed929(core.List<api.RegionAutoscalerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionAutoscalerListWarningData(o[0]);
-  checkRegionAutoscalerListWarningData(o[1]);
+  checkRegionAutoscalerListWarningData(
+      o[0] as api.RegionAutoscalerListWarningData);
+  checkRegionAutoscalerListWarningData(
+      o[1] as api.RegionAutoscalerListWarningData);
 }
 
 core.int buildCounterRegionAutoscalerListWarning = 0;
@@ -17174,7 +17442,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRegionAutoscalerListWarning(o.warning);
+    checkRegionAutoscalerListWarning(
+        o.warning as api.RegionAutoscalerListWarning);
   }
   buildCounterRegionAutoscalerList--;
 }
@@ -17188,8 +17457,8 @@
 
 void checkUnnamed930(core.List<api.DiskType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskType(o[0]);
-  checkDiskType(o[1]);
+  checkDiskType(o[0] as api.DiskType);
+  checkDiskType(o[1] as api.DiskType);
 }
 
 core.int buildCounterRegionDiskTypeListWarningData = 0;
@@ -17222,8 +17491,8 @@
 
 void checkUnnamed931(core.List<api.RegionDiskTypeListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionDiskTypeListWarningData(o[0]);
-  checkRegionDiskTypeListWarningData(o[1]);
+  checkRegionDiskTypeListWarningData(o[0] as api.RegionDiskTypeListWarningData);
+  checkRegionDiskTypeListWarningData(o[1] as api.RegionDiskTypeListWarningData);
 }
 
 core.int buildCounterRegionDiskTypeListWarning = 0;
@@ -17273,7 +17542,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRegionDiskTypeListWarning(o.warning);
+    checkRegionDiskTypeListWarning(o.warning as api.RegionDiskTypeListWarning);
   }
   buildCounterRegionDiskTypeList--;
 }
@@ -17374,8 +17643,8 @@
 
 void checkUnnamed934(core.List<api.InstanceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroup(o[0]);
-  checkInstanceGroup(o[1]);
+  checkInstanceGroup(o[0] as api.InstanceGroup);
+  checkInstanceGroup(o[1] as api.InstanceGroup);
 }
 
 core.int buildCounterRegionInstanceGroupListWarningData = 0;
@@ -17410,8 +17679,10 @@
 
 void checkUnnamed935(core.List<api.RegionInstanceGroupListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionInstanceGroupListWarningData(o[0]);
-  checkRegionInstanceGroupListWarningData(o[1]);
+  checkRegionInstanceGroupListWarningData(
+      o[0] as api.RegionInstanceGroupListWarningData);
+  checkRegionInstanceGroupListWarningData(
+      o[1] as api.RegionInstanceGroupListWarningData);
 }
 
 core.int buildCounterRegionInstanceGroupListWarning = 0;
@@ -17461,7 +17732,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRegionInstanceGroupListWarning(o.warning);
+    checkRegionInstanceGroupListWarning(
+        o.warning as api.RegionInstanceGroupListWarning);
   }
   buildCounterRegionInstanceGroupList--;
 }
@@ -17509,8 +17781,8 @@
 
 void checkUnnamed937(core.List<api.InstanceGroupManager> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceGroupManager(o[0]);
-  checkInstanceGroupManager(o[1]);
+  checkInstanceGroupManager(o[0] as api.InstanceGroupManager);
+  checkInstanceGroupManager(o[1] as api.InstanceGroupManager);
 }
 
 core.int buildCounterRegionInstanceGroupManagerListWarningData = 0;
@@ -17546,8 +17818,10 @@
 void checkUnnamed938(
     core.List<api.RegionInstanceGroupManagerListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionInstanceGroupManagerListWarningData(o[0]);
-  checkRegionInstanceGroupManagerListWarningData(o[1]);
+  checkRegionInstanceGroupManagerListWarningData(
+      o[0] as api.RegionInstanceGroupManagerListWarningData);
+  checkRegionInstanceGroupManagerListWarningData(
+      o[1] as api.RegionInstanceGroupManagerListWarningData);
 }
 
 core.int buildCounterRegionInstanceGroupManagerListWarning = 0;
@@ -17599,7 +17873,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRegionInstanceGroupManagerListWarning(o.warning);
+    checkRegionInstanceGroupManagerListWarning(
+        o.warning as api.RegionInstanceGroupManagerListWarning);
   }
   buildCounterRegionInstanceGroupManagerList--;
 }
@@ -17613,8 +17888,8 @@
 
 void checkUnnamed939(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int buildCounterRegionInstanceGroupManagerPatchInstanceConfigReq = 0;
@@ -17647,8 +17922,8 @@
 
 void checkUnnamed940(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int buildCounterRegionInstanceGroupManagerUpdateInstanceConfigReq = 0;
@@ -17753,8 +18028,8 @@
 
 void checkUnnamed943(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int buildCounterRegionInstanceGroupManagersCreateInstancesRequest = 0;
@@ -17821,8 +18096,8 @@
 
 void checkUnnamed945(core.List<api.InstanceManagedByIgmError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceManagedByIgmError(o[0]);
-  checkInstanceManagedByIgmError(o[1]);
+  checkInstanceManagedByIgmError(o[0] as api.InstanceManagedByIgmError);
+  checkInstanceManagedByIgmError(o[1] as api.InstanceManagedByIgmError);
 }
 
 core.int buildCounterRegionInstanceGroupManagersListErrorsResponse = 0;
@@ -17857,8 +18132,8 @@
 
 void checkUnnamed946(core.List<api.PerInstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerInstanceConfig(o[0]);
-  checkPerInstanceConfig(o[1]);
+  checkPerInstanceConfig(o[0] as api.PerInstanceConfig);
+  checkPerInstanceConfig(o[1] as api.PerInstanceConfig);
 }
 
 core.int
@@ -17900,8 +18175,10 @@
     core.List<api.RegionInstanceGroupManagersListInstanceConfigsRespWarningData>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionInstanceGroupManagersListInstanceConfigsRespWarningData(o[0]);
-  checkRegionInstanceGroupManagersListInstanceConfigsRespWarningData(o[1]);
+  checkRegionInstanceGroupManagersListInstanceConfigsRespWarningData(o[0]
+      as api.RegionInstanceGroupManagersListInstanceConfigsRespWarningData);
+  checkRegionInstanceGroupManagersListInstanceConfigsRespWarningData(o[1]
+      as api.RegionInstanceGroupManagersListInstanceConfigsRespWarningData);
 }
 
 core.int buildCounterRegionInstanceGroupManagersListInstanceConfigsRespWarning =
@@ -17953,7 +18230,8 @@
   if (buildCounterRegionInstanceGroupManagersListInstanceConfigsResp < 3) {
     checkUnnamed946(o.items);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkRegionInstanceGroupManagersListInstanceConfigsRespWarning(o.warning);
+    checkRegionInstanceGroupManagersListInstanceConfigsRespWarning(o.warning
+        as api.RegionInstanceGroupManagersListInstanceConfigsRespWarning);
   }
   buildCounterRegionInstanceGroupManagersListInstanceConfigsResp--;
 }
@@ -17967,8 +18245,8 @@
 
 void checkUnnamed948(core.List<api.ManagedInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedInstance(o[0]);
-  checkManagedInstance(o[1]);
+  checkManagedInstance(o[0] as api.ManagedInstance);
+  checkManagedInstance(o[1] as api.ManagedInstance);
 }
 
 core.int buildCounterRegionInstanceGroupManagersListInstancesResponse = 0;
@@ -18094,8 +18372,8 @@
 
 void checkUnnamed951(core.List<api.InstanceWithNamedPorts> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceWithNamedPorts(o[0]);
-  checkInstanceWithNamedPorts(o[1]);
+  checkInstanceWithNamedPorts(o[0] as api.InstanceWithNamedPorts);
+  checkInstanceWithNamedPorts(o[1] as api.InstanceWithNamedPorts);
 }
 
 core.int buildCounterRegionInstanceGroupsListInstancesWarningData = 0;
@@ -18131,8 +18409,10 @@
 void checkUnnamed952(
     core.List<api.RegionInstanceGroupsListInstancesWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionInstanceGroupsListInstancesWarningData(o[0]);
-  checkRegionInstanceGroupsListInstancesWarningData(o[1]);
+  checkRegionInstanceGroupsListInstancesWarningData(
+      o[0] as api.RegionInstanceGroupsListInstancesWarningData);
+  checkRegionInstanceGroupsListInstancesWarningData(
+      o[1] as api.RegionInstanceGroupsListInstancesWarningData);
 }
 
 core.int buildCounterRegionInstanceGroupsListInstancesWarning = 0;
@@ -18185,7 +18465,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRegionInstanceGroupsListInstancesWarning(o.warning);
+    checkRegionInstanceGroupsListInstancesWarning(
+        o.warning as api.RegionInstanceGroupsListInstancesWarning);
   }
   buildCounterRegionInstanceGroupsListInstances--;
 }
@@ -18222,8 +18503,8 @@
 
 void checkUnnamed953(core.List<api.NamedPort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedPort(o[0]);
-  checkNamedPort(o[1]);
+  checkNamedPort(o[0] as api.NamedPort);
+  checkNamedPort(o[1] as api.NamedPort);
 }
 
 core.int buildCounterRegionInstanceGroupsSetNamedPortsRequest = 0;
@@ -18258,8 +18539,8 @@
 
 void checkUnnamed954(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegion(o[0]);
-  checkRegion(o[1]);
+  checkRegion(o[0] as api.Region);
+  checkRegion(o[1] as api.Region);
 }
 
 core.int buildCounterRegionListWarningData = 0;
@@ -18292,8 +18573,8 @@
 
 void checkUnnamed955(core.List<api.RegionListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionListWarningData(o[0]);
-  checkRegionListWarningData(o[1]);
+  checkRegionListWarningData(o[0] as api.RegionListWarningData);
+  checkRegionListWarningData(o[1] as api.RegionListWarningData);
 }
 
 core.int buildCounterRegionListWarning = 0;
@@ -18343,7 +18624,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRegionListWarning(o.warning);
+    checkRegionListWarning(o.warning as api.RegionListWarning);
   }
   buildCounterRegionList--;
 }
@@ -18391,8 +18672,8 @@
 
 void checkUnnamed957(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterRegionSetPolicyRequest = 0;
@@ -18413,7 +18694,7 @@
   if (buildCounterRegionSetPolicyRequest < 3) {
     checkUnnamed957(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterRegionSetPolicyRequest--;
 }
@@ -18466,7 +18747,7 @@
 void checkRegionUrlMapsValidateRequest(api.RegionUrlMapsValidateRequest o) {
   buildCounterRegionUrlMapsValidateRequest++;
   if (buildCounterRegionUrlMapsValidateRequest < 3) {
-    checkUrlMap(o.resource);
+    checkUrlMap(o.resource as api.UrlMap);
   }
   buildCounterRegionUrlMapsValidateRequest--;
 }
@@ -18521,7 +18802,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkAllocationSpecificSKUReservation(o.specificReservation);
+    checkAllocationSpecificSKUReservation(
+        o.specificReservation as api.AllocationSpecificSKUReservation);
     unittest.expect(o.specificReservationRequired, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
@@ -18574,8 +18856,8 @@
 
 void checkUnnamed960(core.Map<core.String, api.ReservationsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservationsScopedList(o['x']);
-  checkReservationsScopedList(o['y']);
+  checkReservationsScopedList(o['x'] as api.ReservationsScopedList);
+  checkReservationsScopedList(o['y'] as api.ReservationsScopedList);
 }
 
 core.List<core.String> buildUnnamed961() {
@@ -18623,8 +18905,10 @@
 
 void checkUnnamed962(core.List<api.ReservationAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservationAggregatedListWarningData(o[0]);
-  checkReservationAggregatedListWarningData(o[1]);
+  checkReservationAggregatedListWarningData(
+      o[0] as api.ReservationAggregatedListWarningData);
+  checkReservationAggregatedListWarningData(
+      o[1] as api.ReservationAggregatedListWarningData);
 }
 
 core.int buildCounterReservationAggregatedListWarning = 0;
@@ -18677,7 +18961,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed961(o.unreachables);
-    checkReservationAggregatedListWarning(o.warning);
+    checkReservationAggregatedListWarning(
+        o.warning as api.ReservationAggregatedListWarning);
   }
   buildCounterReservationAggregatedList--;
 }
@@ -18691,8 +18976,8 @@
 
 void checkUnnamed963(core.List<api.Reservation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservation(o[0]);
-  checkReservation(o[1]);
+  checkReservation(o[0] as api.Reservation);
+  checkReservation(o[1] as api.Reservation);
 }
 
 core.int buildCounterReservationListWarningData = 0;
@@ -18725,8 +19010,8 @@
 
 void checkUnnamed964(core.List<api.ReservationListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservationListWarningData(o[0]);
-  checkReservationListWarningData(o[1]);
+  checkReservationListWarningData(o[0] as api.ReservationListWarningData);
+  checkReservationListWarningData(o[1] as api.ReservationListWarningData);
 }
 
 core.int buildCounterReservationListWarning = 0;
@@ -18776,7 +19061,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkReservationListWarning(o.warning);
+    checkReservationListWarning(o.warning as api.ReservationListWarning);
   }
   buildCounterReservationList--;
 }
@@ -18809,8 +19094,8 @@
 
 void checkUnnamed965(core.List<api.Reservation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservation(o[0]);
-  checkReservation(o[1]);
+  checkReservation(o[0] as api.Reservation);
+  checkReservation(o[1] as api.Reservation);
 }
 
 core.int buildCounterReservationsScopedListWarningData = 0;
@@ -18844,8 +19129,10 @@
 
 void checkUnnamed966(core.List<api.ReservationsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReservationsScopedListWarningData(o[0]);
-  checkReservationsScopedListWarningData(o[1]);
+  checkReservationsScopedListWarningData(
+      o[0] as api.ReservationsScopedListWarningData);
+  checkReservationsScopedListWarningData(
+      o[1] as api.ReservationsScopedListWarningData);
 }
 
 core.int buildCounterReservationsScopedListWarning = 0;
@@ -18887,7 +19174,8 @@
   buildCounterReservationsScopedList++;
   if (buildCounterReservationsScopedList < 3) {
     checkUnnamed965(o.reservations);
-    checkReservationsScopedListWarning(o.warning);
+    checkReservationsScopedListWarning(
+        o.warning as api.ReservationsScopedListWarning);
   }
   buildCounterReservationsScopedList--;
 }
@@ -18943,8 +19231,8 @@
 
 void checkUnnamed967(core.List<api.ResourcePolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourcePolicy(o[0]);
-  checkResourcePolicy(o[1]);
+  checkResourcePolicy(o[0] as api.ResourcePolicy);
+  checkResourcePolicy(o[1] as api.ResourcePolicy);
 }
 
 core.int buildCounterResourcePoliciesScopedListWarningData = 0;
@@ -18979,8 +19267,10 @@
 
 void checkUnnamed968(core.List<api.ResourcePoliciesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourcePoliciesScopedListWarningData(o[0]);
-  checkResourcePoliciesScopedListWarningData(o[1]);
+  checkResourcePoliciesScopedListWarningData(
+      o[0] as api.ResourcePoliciesScopedListWarningData);
+  checkResourcePoliciesScopedListWarningData(
+      o[1] as api.ResourcePoliciesScopedListWarningData);
 }
 
 core.int buildCounterResourcePoliciesScopedListWarning = 0;
@@ -19023,7 +19313,8 @@
   buildCounterResourcePoliciesScopedList++;
   if (buildCounterResourcePoliciesScopedList < 3) {
     checkUnnamed967(o.resourcePolicies);
-    checkResourcePoliciesScopedListWarning(o.warning);
+    checkResourcePoliciesScopedListWarning(
+        o.warning as api.ResourcePoliciesScopedListWarning);
   }
   buildCounterResourcePoliciesScopedList--;
 }
@@ -19053,13 +19344,15 @@
   if (buildCounterResourcePolicy < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkResourcePolicyGroupPlacementPolicy(o.groupPlacementPolicy);
+    checkResourcePolicyGroupPlacementPolicy(
+        o.groupPlacementPolicy as api.ResourcePolicyGroupPlacementPolicy);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkResourcePolicySnapshotSchedulePolicy(o.snapshotSchedulePolicy);
+    checkResourcePolicySnapshotSchedulePolicy(
+        o.snapshotSchedulePolicy as api.ResourcePolicySnapshotSchedulePolicy);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterResourcePolicy--;
@@ -19074,8 +19367,8 @@
 
 void checkUnnamed969(core.Map<core.String, api.ResourcePoliciesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourcePoliciesScopedList(o['x']);
-  checkResourcePoliciesScopedList(o['y']);
+  checkResourcePoliciesScopedList(o['x'] as api.ResourcePoliciesScopedList);
+  checkResourcePoliciesScopedList(o['y'] as api.ResourcePoliciesScopedList);
 }
 
 core.List<core.String> buildUnnamed970() {
@@ -19123,8 +19416,10 @@
 
 void checkUnnamed971(core.List<api.ResourcePolicyAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourcePolicyAggregatedListWarningData(o[0]);
-  checkResourcePolicyAggregatedListWarningData(o[1]);
+  checkResourcePolicyAggregatedListWarningData(
+      o[0] as api.ResourcePolicyAggregatedListWarningData);
+  checkResourcePolicyAggregatedListWarningData(
+      o[1] as api.ResourcePolicyAggregatedListWarningData);
 }
 
 core.int buildCounterResourcePolicyAggregatedListWarning = 0;
@@ -19180,7 +19475,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed970(o.unreachables);
-    checkResourcePolicyAggregatedListWarning(o.warning);
+    checkResourcePolicyAggregatedListWarning(
+        o.warning as api.ResourcePolicyAggregatedListWarning);
   }
   buildCounterResourcePolicyAggregatedList--;
 }
@@ -19265,8 +19561,8 @@
 
 void checkUnnamed972(core.List<api.ResourcePolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourcePolicy(o[0]);
-  checkResourcePolicy(o[1]);
+  checkResourcePolicy(o[0] as api.ResourcePolicy);
+  checkResourcePolicy(o[1] as api.ResourcePolicy);
 }
 
 core.int buildCounterResourcePolicyListWarningData = 0;
@@ -19299,8 +19595,8 @@
 
 void checkUnnamed973(core.List<api.ResourcePolicyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourcePolicyListWarningData(o[0]);
-  checkResourcePolicyListWarningData(o[1]);
+  checkResourcePolicyListWarningData(o[0] as api.ResourcePolicyListWarningData);
+  checkResourcePolicyListWarningData(o[1] as api.ResourcePolicyListWarningData);
 }
 
 core.int buildCounterResourcePolicyListWarning = 0;
@@ -19352,7 +19648,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkResourcePolicyListWarning(o.warning);
+    checkResourcePolicyListWarning(o.warning as api.ResourcePolicyListWarning);
   }
   buildCounterResourcePolicyList--;
 }
@@ -19377,10 +19673,13 @@
     api.ResourcePolicySnapshotSchedulePolicy o) {
   buildCounterResourcePolicySnapshotSchedulePolicy++;
   if (buildCounterResourcePolicySnapshotSchedulePolicy < 3) {
-    checkResourcePolicySnapshotSchedulePolicyRetentionPolicy(o.retentionPolicy);
-    checkResourcePolicySnapshotSchedulePolicySchedule(o.schedule);
+    checkResourcePolicySnapshotSchedulePolicyRetentionPolicy(o.retentionPolicy
+        as api.ResourcePolicySnapshotSchedulePolicyRetentionPolicy);
+    checkResourcePolicySnapshotSchedulePolicySchedule(
+        o.schedule as api.ResourcePolicySnapshotSchedulePolicySchedule);
     checkResourcePolicySnapshotSchedulePolicySnapshotProperties(
-        o.snapshotProperties);
+        o.snapshotProperties
+            as api.ResourcePolicySnapshotSchedulePolicySnapshotProperties);
   }
   buildCounterResourcePolicySnapshotSchedulePolicy--;
 }
@@ -19426,9 +19725,12 @@
     api.ResourcePolicySnapshotSchedulePolicySchedule o) {
   buildCounterResourcePolicySnapshotSchedulePolicySchedule++;
   if (buildCounterResourcePolicySnapshotSchedulePolicySchedule < 3) {
-    checkResourcePolicyDailyCycle(o.dailySchedule);
-    checkResourcePolicyHourlyCycle(o.hourlySchedule);
-    checkResourcePolicyWeeklyCycle(o.weeklySchedule);
+    checkResourcePolicyDailyCycle(
+        o.dailySchedule as api.ResourcePolicyDailyCycle);
+    checkResourcePolicyHourlyCycle(
+        o.hourlySchedule as api.ResourcePolicyHourlyCycle);
+    checkResourcePolicyWeeklyCycle(
+        o.weeklySchedule as api.ResourcePolicyWeeklyCycle);
   }
   buildCounterResourcePolicySnapshotSchedulePolicySchedule--;
 }
@@ -19493,8 +19795,10 @@
 
 void checkUnnamed976(core.List<api.ResourcePolicyWeeklyCycleDayOfWeek> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourcePolicyWeeklyCycleDayOfWeek(o[0]);
-  checkResourcePolicyWeeklyCycleDayOfWeek(o[1]);
+  checkResourcePolicyWeeklyCycleDayOfWeek(
+      o[0] as api.ResourcePolicyWeeklyCycleDayOfWeek);
+  checkResourcePolicyWeeklyCycleDayOfWeek(
+      o[1] as api.ResourcePolicyWeeklyCycleDayOfWeek);
 }
 
 core.int buildCounterResourcePolicyWeeklyCycle = 0;
@@ -19584,8 +19888,8 @@
 
 void checkUnnamed978(core.List<api.RouteWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouteWarningsData(o[0]);
-  checkRouteWarningsData(o[1]);
+  checkRouteWarningsData(o[0] as api.RouteWarningsData);
+  checkRouteWarningsData(o[1] as api.RouteWarningsData);
 }
 
 core.int buildCounterRouteWarnings = 0;
@@ -19620,8 +19924,8 @@
 
 void checkUnnamed979(core.List<api.RouteWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouteWarnings(o[0]);
-  checkRouteWarnings(o[1]);
+  checkRouteWarnings(o[0] as api.RouteWarnings);
+  checkRouteWarnings(o[1] as api.RouteWarnings);
 }
 
 core.int buildCounterRoute = 0;
@@ -19686,8 +19990,8 @@
 
 void checkUnnamed980(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoute(o[0]);
-  checkRoute(o[1]);
+  checkRoute(o[0] as api.Route);
+  checkRoute(o[1] as api.Route);
 }
 
 core.int buildCounterRouteListWarningData = 0;
@@ -19720,8 +20024,8 @@
 
 void checkUnnamed981(core.List<api.RouteListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouteListWarningData(o[0]);
-  checkRouteListWarningData(o[1]);
+  checkRouteListWarningData(o[0] as api.RouteListWarningData);
+  checkRouteListWarningData(o[1] as api.RouteListWarningData);
 }
 
 core.int buildCounterRouteListWarning = 0;
@@ -19771,7 +20075,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRouteListWarning(o.warning);
+    checkRouteListWarning(o.warning as api.RouteListWarning);
   }
   buildCounterRouteList--;
 }
@@ -19785,8 +20089,8 @@
 
 void checkUnnamed982(core.List<api.RouterBgpPeer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterBgpPeer(o[0]);
-  checkRouterBgpPeer(o[1]);
+  checkRouterBgpPeer(o[0] as api.RouterBgpPeer);
+  checkRouterBgpPeer(o[1] as api.RouterBgpPeer);
 }
 
 core.List<api.RouterInterface> buildUnnamed983() {
@@ -19798,8 +20102,8 @@
 
 void checkUnnamed983(core.List<api.RouterInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterInterface(o[0]);
-  checkRouterInterface(o[1]);
+  checkRouterInterface(o[0] as api.RouterInterface);
+  checkRouterInterface(o[1] as api.RouterInterface);
 }
 
 core.List<api.RouterNat> buildUnnamed984() {
@@ -19811,8 +20115,8 @@
 
 void checkUnnamed984(core.List<api.RouterNat> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterNat(o[0]);
-  checkRouterNat(o[1]);
+  checkRouterNat(o[0] as api.RouterNat);
+  checkRouterNat(o[1] as api.RouterNat);
 }
 
 core.int buildCounterRouter = 0;
@@ -19840,7 +20144,7 @@
 void checkRouter(api.Router o) {
   buildCounterRouter++;
   if (buildCounterRouter < 3) {
-    checkRouterBgp(o.bgp);
+    checkRouterBgp(o.bgp as api.RouterBgp);
     checkUnnamed982(o.bgpPeers);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
@@ -19886,8 +20190,8 @@
 
 void checkUnnamed985(core.Map<core.String, api.RoutersScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoutersScopedList(o['x']);
-  checkRoutersScopedList(o['y']);
+  checkRoutersScopedList(o['x'] as api.RoutersScopedList);
+  checkRoutersScopedList(o['y'] as api.RoutersScopedList);
 }
 
 core.List<core.String> buildUnnamed986() {
@@ -19934,8 +20238,10 @@
 
 void checkUnnamed987(core.List<api.RouterAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterAggregatedListWarningData(o[0]);
-  checkRouterAggregatedListWarningData(o[1]);
+  checkRouterAggregatedListWarningData(
+      o[0] as api.RouterAggregatedListWarningData);
+  checkRouterAggregatedListWarningData(
+      o[1] as api.RouterAggregatedListWarningData);
 }
 
 core.int buildCounterRouterAggregatedListWarning = 0;
@@ -19987,7 +20293,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed986(o.unreachables);
-    checkRouterAggregatedListWarning(o.warning);
+    checkRouterAggregatedListWarning(
+        o.warning as api.RouterAggregatedListWarning);
   }
   buildCounterRouterAggregatedList--;
 }
@@ -20014,8 +20321,8 @@
 
 void checkUnnamed989(core.List<api.RouterAdvertisedIpRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterAdvertisedIpRange(o[0]);
-  checkRouterAdvertisedIpRange(o[1]);
+  checkRouterAdvertisedIpRange(o[0] as api.RouterAdvertisedIpRange);
+  checkRouterAdvertisedIpRange(o[1] as api.RouterAdvertisedIpRange);
 }
 
 core.int buildCounterRouterBgp = 0;
@@ -20065,8 +20372,8 @@
 
 void checkUnnamed991(core.List<api.RouterAdvertisedIpRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterAdvertisedIpRange(o[0]);
-  checkRouterAdvertisedIpRange(o[1]);
+  checkRouterAdvertisedIpRange(o[0] as api.RouterAdvertisedIpRange);
+  checkRouterAdvertisedIpRange(o[1] as api.RouterAdvertisedIpRange);
 }
 
 core.int buildCounterRouterBgpPeer = 0;
@@ -20142,8 +20449,8 @@
 
 void checkUnnamed992(core.List<api.Router> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouter(o[0]);
-  checkRouter(o[1]);
+  checkRouter(o[0] as api.Router);
+  checkRouter(o[1] as api.Router);
 }
 
 core.int buildCounterRouterListWarningData = 0;
@@ -20176,8 +20483,8 @@
 
 void checkUnnamed993(core.List<api.RouterListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterListWarningData(o[0]);
-  checkRouterListWarningData(o[1]);
+  checkRouterListWarningData(o[0] as api.RouterListWarningData);
+  checkRouterListWarningData(o[1] as api.RouterListWarningData);
 }
 
 core.int buildCounterRouterListWarning = 0;
@@ -20227,7 +20534,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkRouterListWarning(o.warning);
+    checkRouterListWarning(o.warning as api.RouterListWarning);
   }
   buildCounterRouterList--;
 }
@@ -20267,8 +20574,8 @@
 
 void checkUnnamed996(core.List<api.RouterNatSubnetworkToNat> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterNatSubnetworkToNat(o[0]);
-  checkRouterNatSubnetworkToNat(o[1]);
+  checkRouterNatSubnetworkToNat(o[0] as api.RouterNatSubnetworkToNat);
+  checkRouterNatSubnetworkToNat(o[1] as api.RouterNatSubnetworkToNat);
 }
 
 core.int buildCounterRouterNat = 0;
@@ -20298,7 +20605,7 @@
   if (buildCounterRouterNat < 3) {
     checkUnnamed994(o.drainNatIps);
     unittest.expect(o.icmpIdleTimeoutSec, unittest.equals(42));
-    checkRouterNatLogConfig(o.logConfig);
+    checkRouterNatLogConfig(o.logConfig as api.RouterNatLogConfig);
     unittest.expect(o.minPortsPerVm, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.natIpAllocateOption, unittest.equals('foo'));
@@ -20391,8 +20698,8 @@
 
 void checkUnnamed999(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoute(o[0]);
-  checkRoute(o[1]);
+  checkRoute(o[0] as api.Route);
+  checkRoute(o[1] as api.Route);
 }
 
 core.List<api.Route> buildUnnamed1000() {
@@ -20404,8 +20711,8 @@
 
 void checkUnnamed1000(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoute(o[0]);
-  checkRoute(o[1]);
+  checkRoute(o[0] as api.Route);
+  checkRoute(o[1] as api.Route);
 }
 
 core.List<api.RouterStatusBgpPeerStatus> buildUnnamed1001() {
@@ -20417,8 +20724,8 @@
 
 void checkUnnamed1001(core.List<api.RouterStatusBgpPeerStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterStatusBgpPeerStatus(o[0]);
-  checkRouterStatusBgpPeerStatus(o[1]);
+  checkRouterStatusBgpPeerStatus(o[0] as api.RouterStatusBgpPeerStatus);
+  checkRouterStatusBgpPeerStatus(o[1] as api.RouterStatusBgpPeerStatus);
 }
 
 core.List<api.RouterStatusNatStatus> buildUnnamed1002() {
@@ -20430,8 +20737,8 @@
 
 void checkUnnamed1002(core.List<api.RouterStatusNatStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouterStatusNatStatus(o[0]);
-  checkRouterStatusNatStatus(o[1]);
+  checkRouterStatusNatStatus(o[0] as api.RouterStatusNatStatus);
+  checkRouterStatusNatStatus(o[1] as api.RouterStatusNatStatus);
 }
 
 core.int buildCounterRouterStatus = 0;
@@ -20470,8 +20777,8 @@
 
 void checkUnnamed1003(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoute(o[0]);
-  checkRoute(o[1]);
+  checkRoute(o[0] as api.Route);
+  checkRoute(o[1] as api.Route);
 }
 
 core.int buildCounterRouterStatusBgpPeerStatus = 0;
@@ -20625,7 +20932,7 @@
   buildCounterRouterStatusResponse++;
   if (buildCounterRouterStatusResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkRouterStatus(o.result);
+    checkRouterStatus(o.result as api.RouterStatus);
   }
   buildCounterRouterStatusResponse--;
 }
@@ -20644,7 +20951,7 @@
 void checkRoutersPreviewResponse(api.RoutersPreviewResponse o) {
   buildCounterRoutersPreviewResponse++;
   if (buildCounterRoutersPreviewResponse < 3) {
-    checkRouter(o.resource);
+    checkRouter(o.resource as api.Router);
   }
   buildCounterRoutersPreviewResponse--;
 }
@@ -20658,8 +20965,8 @@
 
 void checkUnnamed1009(core.List<api.Router> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRouter(o[0]);
-  checkRouter(o[1]);
+  checkRouter(o[0] as api.Router);
+  checkRouter(o[1] as api.Router);
 }
 
 core.int buildCounterRoutersScopedListWarningData = 0;
@@ -20692,8 +20999,8 @@
 
 void checkUnnamed1010(core.List<api.RoutersScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoutersScopedListWarningData(o[0]);
-  checkRoutersScopedListWarningData(o[1]);
+  checkRoutersScopedListWarningData(o[0] as api.RoutersScopedListWarningData);
+  checkRoutersScopedListWarningData(o[1] as api.RoutersScopedListWarningData);
 }
 
 core.int buildCounterRoutersScopedListWarning = 0;
@@ -20735,7 +21042,7 @@
   buildCounterRoutersScopedList++;
   if (buildCounterRoutersScopedList < 3) {
     checkUnnamed1009(o.routers);
-    checkRoutersScopedListWarning(o.warning);
+    checkRoutersScopedListWarning(o.warning as api.RoutersScopedListWarning);
   }
   buildCounterRoutersScopedList--;
 }
@@ -20749,8 +21056,8 @@
 
 void checkUnnamed1011(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<core.String> buildUnnamed1012() {
@@ -20775,8 +21082,8 @@
 
 void checkUnnamed1013(core.List<api.LogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogConfig(o[0]);
-  checkLogConfig(o[1]);
+  checkLogConfig(o[0] as api.LogConfig);
+  checkLogConfig(o[1] as api.LogConfig);
 }
 
 core.List<core.String> buildUnnamed1014() {
@@ -20874,8 +21181,8 @@
 
 void checkUnnamed1016(core.List<api.SchedulingNodeAffinity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSchedulingNodeAffinity(o[0]);
-  checkSchedulingNodeAffinity(o[1]);
+  checkSchedulingNodeAffinity(o[0] as api.SchedulingNodeAffinity);
+  checkSchedulingNodeAffinity(o[1] as api.SchedulingNodeAffinity);
 }
 
 core.int buildCounterScheduling = 0;
@@ -20979,7 +21286,8 @@
     api.SecurityPoliciesListPreconfiguredExpressionSetsResponse o) {
   buildCounterSecurityPoliciesListPreconfiguredExpressionSetsResponse++;
   if (buildCounterSecurityPoliciesListPreconfiguredExpressionSetsResponse < 3) {
-    checkSecurityPoliciesWafConfig(o.preconfiguredExpressionSets);
+    checkSecurityPoliciesWafConfig(
+        o.preconfiguredExpressionSets as api.SecurityPoliciesWafConfig);
   }
   buildCounterSecurityPoliciesListPreconfiguredExpressionSetsResponse--;
 }
@@ -20998,7 +21306,7 @@
 void checkSecurityPoliciesWafConfig(api.SecurityPoliciesWafConfig o) {
   buildCounterSecurityPoliciesWafConfig++;
   if (buildCounterSecurityPoliciesWafConfig < 3) {
-    checkPreconfiguredWafSet(o.wafRules);
+    checkPreconfiguredWafSet(o.wafRules as api.PreconfiguredWafSet);
   }
   buildCounterSecurityPoliciesWafConfig--;
 }
@@ -21012,8 +21320,8 @@
 
 void checkUnnamed1018(core.List<api.SecurityPolicyRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSecurityPolicyRule(o[0]);
-  checkSecurityPolicyRule(o[1]);
+  checkSecurityPolicyRule(o[0] as api.SecurityPolicyRule);
+  checkSecurityPolicyRule(o[1] as api.SecurityPolicyRule);
 }
 
 core.int buildCounterSecurityPolicy = 0;
@@ -21058,8 +21366,8 @@
 
 void checkUnnamed1019(core.List<api.SecurityPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSecurityPolicy(o[0]);
-  checkSecurityPolicy(o[1]);
+  checkSecurityPolicy(o[0] as api.SecurityPolicy);
+  checkSecurityPolicy(o[1] as api.SecurityPolicy);
 }
 
 core.int buildCounterSecurityPolicyListWarningData = 0;
@@ -21092,8 +21400,8 @@
 
 void checkUnnamed1020(core.List<api.SecurityPolicyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSecurityPolicyListWarningData(o[0]);
-  checkSecurityPolicyListWarningData(o[1]);
+  checkSecurityPolicyListWarningData(o[0] as api.SecurityPolicyListWarningData);
+  checkSecurityPolicyListWarningData(o[1] as api.SecurityPolicyListWarningData);
 }
 
 core.int buildCounterSecurityPolicyListWarning = 0;
@@ -21141,7 +21449,7 @@
     checkUnnamed1019(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkSecurityPolicyListWarning(o.warning);
+    checkSecurityPolicyListWarning(o.warning as api.SecurityPolicyListWarning);
   }
   buildCounterSecurityPolicyList--;
 }
@@ -21187,7 +21495,7 @@
     unittest.expect(o.action, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSecurityPolicyRuleMatcher(o.match);
+    checkSecurityPolicyRuleMatcher(o.match as api.SecurityPolicyRuleMatcher);
     unittest.expect(o.preview, unittest.isTrue);
     unittest.expect(o.priority, unittest.equals(42));
   }
@@ -21210,8 +21518,9 @@
 void checkSecurityPolicyRuleMatcher(api.SecurityPolicyRuleMatcher o) {
   buildCounterSecurityPolicyRuleMatcher++;
   if (buildCounterSecurityPolicyRuleMatcher < 3) {
-    checkSecurityPolicyRuleMatcherConfig(o.config);
-    checkExpr(o.expr);
+    checkSecurityPolicyRuleMatcherConfig(
+        o.config as api.SecurityPolicyRuleMatcherConfig);
+    checkExpr(o.expr as api.Expr);
     unittest.expect(o.versionedExpr, unittest.equals('foo'));
   }
   buildCounterSecurityPolicyRuleMatcher--;
@@ -21369,9 +21678,11 @@
 void checkShieldedInstanceIdentity(api.ShieldedInstanceIdentity o) {
   buildCounterShieldedInstanceIdentity++;
   if (buildCounterShieldedInstanceIdentity < 3) {
-    checkShieldedInstanceIdentityEntry(o.encryptionKey);
+    checkShieldedInstanceIdentityEntry(
+        o.encryptionKey as api.ShieldedInstanceIdentityEntry);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkShieldedInstanceIdentityEntry(o.signingKey);
+    checkShieldedInstanceIdentityEntry(
+        o.signingKey as api.ShieldedInstanceIdentityEntry);
   }
   buildCounterShieldedInstanceIdentity--;
 }
@@ -21537,9 +21848,11 @@
     checkUnnamed1025(o.licenses);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.snapshotEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.snapshotEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceDisk, unittest.equals('foo'));
-    checkCustomerEncryptionKey(o.sourceDiskEncryptionKey);
+    checkCustomerEncryptionKey(
+        o.sourceDiskEncryptionKey as api.CustomerEncryptionKey);
     unittest.expect(o.sourceDiskId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.storageBytes, unittest.equals('foo'));
@@ -21558,8 +21871,8 @@
 
 void checkUnnamed1027(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSnapshot(o[0]);
-  checkSnapshot(o[1]);
+  checkSnapshot(o[0] as api.Snapshot);
+  checkSnapshot(o[1] as api.Snapshot);
 }
 
 core.int buildCounterSnapshotListWarningData = 0;
@@ -21592,8 +21905,8 @@
 
 void checkUnnamed1028(core.List<api.SnapshotListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSnapshotListWarningData(o[0]);
-  checkSnapshotListWarningData(o[1]);
+  checkSnapshotListWarningData(o[0] as api.SnapshotListWarningData);
+  checkSnapshotListWarningData(o[1] as api.SnapshotListWarningData);
 }
 
 core.int buildCounterSnapshotListWarning = 0;
@@ -21643,7 +21956,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkSnapshotListWarning(o.warning);
+    checkSnapshotListWarning(o.warning as api.SnapshotListWarning);
   }
   buildCounterSnapshotList--;
 }
@@ -21657,8 +21970,8 @@
 
 void checkUnnamed1029(core.List<api.DiskInstantiationConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiskInstantiationConfig(o[0]);
-  checkDiskInstantiationConfig(o[1]);
+  checkDiskInstantiationConfig(o[0] as api.DiskInstantiationConfig);
+  checkDiskInstantiationConfig(o[1] as api.DiskInstantiationConfig);
 }
 
 core.int buildCounterSourceInstanceParams = 0;
@@ -21726,12 +22039,14 @@
     unittest.expect(o.expireTime, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSslCertificateManagedSslCertificate(o.managed);
+    checkSslCertificateManagedSslCertificate(
+        o.managed as api.SslCertificateManagedSslCertificate);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.privateKey, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkSslCertificateSelfManagedSslCertificate(o.selfManaged);
+    checkSslCertificateSelfManagedSslCertificate(
+        o.selfManaged as api.SslCertificateSelfManagedSslCertificate);
     checkUnnamed1030(o.subjectAlternativeNames);
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -21747,8 +22062,8 @@
 
 void checkUnnamed1031(core.Map<core.String, api.SslCertificatesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslCertificatesScopedList(o['x']);
-  checkSslCertificatesScopedList(o['y']);
+  checkSslCertificatesScopedList(o['x'] as api.SslCertificatesScopedList);
+  checkSslCertificatesScopedList(o['y'] as api.SslCertificatesScopedList);
 }
 
 core.List<core.String> buildUnnamed1032() {
@@ -21797,8 +22112,10 @@
 void checkUnnamed1033(
     core.List<api.SslCertificateAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslCertificateAggregatedListWarningData(o[0]);
-  checkSslCertificateAggregatedListWarningData(o[1]);
+  checkSslCertificateAggregatedListWarningData(
+      o[0] as api.SslCertificateAggregatedListWarningData);
+  checkSslCertificateAggregatedListWarningData(
+      o[1] as api.SslCertificateAggregatedListWarningData);
 }
 
 core.int buildCounterSslCertificateAggregatedListWarning = 0;
@@ -21852,7 +22169,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1032(o.unreachables);
-    checkSslCertificateAggregatedListWarning(o.warning);
+    checkSslCertificateAggregatedListWarning(
+        o.warning as api.SslCertificateAggregatedListWarning);
   }
   buildCounterSslCertificateAggregatedList--;
 }
@@ -21866,8 +22184,8 @@
 
 void checkUnnamed1034(core.List<api.SslCertificate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslCertificate(o[0]);
-  checkSslCertificate(o[1]);
+  checkSslCertificate(o[0] as api.SslCertificate);
+  checkSslCertificate(o[1] as api.SslCertificate);
 }
 
 core.int buildCounterSslCertificateListWarningData = 0;
@@ -21900,8 +22218,8 @@
 
 void checkUnnamed1035(core.List<api.SslCertificateListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslCertificateListWarningData(o[0]);
-  checkSslCertificateListWarningData(o[1]);
+  checkSslCertificateListWarningData(o[0] as api.SslCertificateListWarningData);
+  checkSslCertificateListWarningData(o[1] as api.SslCertificateListWarningData);
 }
 
 core.int buildCounterSslCertificateListWarning = 0;
@@ -21951,7 +22269,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkSslCertificateListWarning(o.warning);
+    checkSslCertificateListWarning(o.warning as api.SslCertificateListWarning);
   }
   buildCounterSslCertificateList--;
 }
@@ -22039,8 +22357,8 @@
 
 void checkUnnamed1038(core.List<api.SslCertificate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslCertificate(o[0]);
-  checkSslCertificate(o[1]);
+  checkSslCertificate(o[0] as api.SslCertificate);
+  checkSslCertificate(o[1] as api.SslCertificate);
 }
 
 core.int buildCounterSslCertificatesScopedListWarningData = 0;
@@ -22075,8 +22393,10 @@
 
 void checkUnnamed1039(core.List<api.SslCertificatesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslCertificatesScopedListWarningData(o[0]);
-  checkSslCertificatesScopedListWarningData(o[1]);
+  checkSslCertificatesScopedListWarningData(
+      o[0] as api.SslCertificatesScopedListWarningData);
+  checkSslCertificatesScopedListWarningData(
+      o[1] as api.SslCertificatesScopedListWarningData);
 }
 
 core.int buildCounterSslCertificatesScopedListWarning = 0;
@@ -22119,7 +22439,8 @@
   buildCounterSslCertificatesScopedList++;
   if (buildCounterSslCertificatesScopedList < 3) {
     checkUnnamed1038(o.sslCertificates);
-    checkSslCertificatesScopedListWarning(o.warning);
+    checkSslCertificatesScopedListWarning(
+        o.warning as api.SslCertificatesScopedListWarning);
   }
   buildCounterSslCertificatesScopedList--;
 }
@@ -22133,8 +22454,8 @@
 
 void checkUnnamed1040(core.List<api.SslPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslPolicy(o[0]);
-  checkSslPolicy(o[1]);
+  checkSslPolicy(o[0] as api.SslPolicy);
+  checkSslPolicy(o[1] as api.SslPolicy);
 }
 
 core.int buildCounterSslPoliciesListWarningData = 0;
@@ -22167,8 +22488,8 @@
 
 void checkUnnamed1041(core.List<api.SslPoliciesListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslPoliciesListWarningData(o[0]);
-  checkSslPoliciesListWarningData(o[1]);
+  checkSslPoliciesListWarningData(o[0] as api.SslPoliciesListWarningData);
+  checkSslPoliciesListWarningData(o[1] as api.SslPoliciesListWarningData);
 }
 
 core.int buildCounterSslPoliciesListWarning = 0;
@@ -22218,7 +22539,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkSslPoliciesListWarning(o.warning);
+    checkSslPoliciesListWarning(o.warning as api.SslPoliciesListWarning);
   }
   buildCounterSslPoliciesList--;
 }
@@ -22313,8 +22634,8 @@
 
 void checkUnnamed1045(core.List<api.SslPolicyWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslPolicyWarningsData(o[0]);
-  checkSslPolicyWarningsData(o[1]);
+  checkSslPolicyWarningsData(o[0] as api.SslPolicyWarningsData);
+  checkSslPolicyWarningsData(o[1] as api.SslPolicyWarningsData);
 }
 
 core.int buildCounterSslPolicyWarnings = 0;
@@ -22349,8 +22670,8 @@
 
 void checkUnnamed1046(core.List<api.SslPolicyWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSslPolicyWarnings(o[0]);
-  checkSslPolicyWarnings(o[1]);
+  checkSslPolicyWarnings(o[0] as api.SslPolicyWarnings);
+  checkSslPolicyWarnings(o[1] as api.SslPolicyWarnings);
 }
 
 core.int buildCounterSslPolicy = 0;
@@ -22427,7 +22748,8 @@
 void checkStatefulPolicy(api.StatefulPolicy o) {
   buildCounterStatefulPolicy++;
   if (buildCounterStatefulPolicy < 3) {
-    checkStatefulPolicyPreservedState(o.preservedState);
+    checkStatefulPolicyPreservedState(
+        o.preservedState as api.StatefulPolicyPreservedState);
   }
   buildCounterStatefulPolicy--;
 }
@@ -22443,8 +22765,10 @@
 void checkUnnamed1047(
     core.Map<core.String, api.StatefulPolicyPreservedStateDiskDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatefulPolicyPreservedStateDiskDevice(o['x']);
-  checkStatefulPolicyPreservedStateDiskDevice(o['y']);
+  checkStatefulPolicyPreservedStateDiskDevice(
+      o['x'] as api.StatefulPolicyPreservedStateDiskDevice);
+  checkStatefulPolicyPreservedStateDiskDevice(
+      o['y'] as api.StatefulPolicyPreservedStateDiskDevice);
 }
 
 core.int buildCounterStatefulPolicyPreservedState = 0;
@@ -22496,8 +22820,8 @@
 
 void checkUnnamed1048(core.List<api.SubnetworkSecondaryRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubnetworkSecondaryRange(o[0]);
-  checkSubnetworkSecondaryRange(o[1]);
+  checkSubnetworkSecondaryRange(o[0] as api.SubnetworkSecondaryRange);
+  checkSubnetworkSecondaryRange(o[1] as api.SubnetworkSecondaryRange);
 }
 
 core.int buildCounterSubnetwork = 0;
@@ -22542,7 +22866,7 @@
     unittest.expect(o.ipCidrRange, unittest.equals('foo'));
     unittest.expect(o.ipv6CidrRange, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSubnetworkLogConfig(o.logConfig);
+    checkSubnetworkLogConfig(o.logConfig as api.SubnetworkLogConfig);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.privateIpGoogleAccess, unittest.isTrue);
@@ -22566,8 +22890,8 @@
 
 void checkUnnamed1049(core.Map<core.String, api.SubnetworksScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubnetworksScopedList(o['x']);
-  checkSubnetworksScopedList(o['y']);
+  checkSubnetworksScopedList(o['x'] as api.SubnetworksScopedList);
+  checkSubnetworksScopedList(o['y'] as api.SubnetworksScopedList);
 }
 
 core.List<core.String> buildUnnamed1050() {
@@ -22615,8 +22939,10 @@
 
 void checkUnnamed1051(core.List<api.SubnetworkAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubnetworkAggregatedListWarningData(o[0]);
-  checkSubnetworkAggregatedListWarningData(o[1]);
+  checkSubnetworkAggregatedListWarningData(
+      o[0] as api.SubnetworkAggregatedListWarningData);
+  checkSubnetworkAggregatedListWarningData(
+      o[1] as api.SubnetworkAggregatedListWarningData);
 }
 
 core.int buildCounterSubnetworkAggregatedListWarning = 0;
@@ -22669,7 +22995,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1050(o.unreachables);
-    checkSubnetworkAggregatedListWarning(o.warning);
+    checkSubnetworkAggregatedListWarning(
+        o.warning as api.SubnetworkAggregatedListWarning);
   }
   buildCounterSubnetworkAggregatedList--;
 }
@@ -22683,8 +23010,8 @@
 
 void checkUnnamed1052(core.List<api.Subnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubnetwork(o[0]);
-  checkSubnetwork(o[1]);
+  checkSubnetwork(o[0] as api.Subnetwork);
+  checkSubnetwork(o[1] as api.Subnetwork);
 }
 
 core.int buildCounterSubnetworkListWarningData = 0;
@@ -22717,8 +23044,8 @@
 
 void checkUnnamed1053(core.List<api.SubnetworkListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubnetworkListWarningData(o[0]);
-  checkSubnetworkListWarningData(o[1]);
+  checkSubnetworkListWarningData(o[0] as api.SubnetworkListWarningData);
+  checkSubnetworkListWarningData(o[1] as api.SubnetworkListWarningData);
 }
 
 core.int buildCounterSubnetworkListWarning = 0;
@@ -22768,7 +23095,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkSubnetworkListWarning(o.warning);
+    checkSubnetworkListWarning(o.warning as api.SubnetworkListWarning);
   }
   buildCounterSubnetworkList--;
 }
@@ -22866,8 +23193,8 @@
 
 void checkUnnamed1055(core.List<api.Subnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubnetwork(o[0]);
-  checkSubnetwork(o[1]);
+  checkSubnetwork(o[0] as api.Subnetwork);
+  checkSubnetwork(o[1] as api.Subnetwork);
 }
 
 core.int buildCounterSubnetworksScopedListWarningData = 0;
@@ -22901,8 +23228,10 @@
 
 void checkUnnamed1056(core.List<api.SubnetworksScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubnetworksScopedListWarningData(o[0]);
-  checkSubnetworksScopedListWarningData(o[1]);
+  checkSubnetworksScopedListWarningData(
+      o[0] as api.SubnetworksScopedListWarningData);
+  checkSubnetworksScopedListWarningData(
+      o[1] as api.SubnetworksScopedListWarningData);
 }
 
 core.int buildCounterSubnetworksScopedListWarning = 0;
@@ -22944,7 +23273,8 @@
   buildCounterSubnetworksScopedList++;
   if (buildCounterSubnetworksScopedList < 3) {
     checkUnnamed1055(o.subnetworks);
-    checkSubnetworksScopedListWarning(o.warning);
+    checkSubnetworksScopedListWarning(
+        o.warning as api.SubnetworksScopedListWarning);
   }
   buildCounterSubnetworksScopedList--;
 }
@@ -23079,8 +23409,8 @@
 
 void checkUnnamed1058(core.List<api.TargetGrpcProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetGrpcProxy(o[0]);
-  checkTargetGrpcProxy(o[1]);
+  checkTargetGrpcProxy(o[0] as api.TargetGrpcProxy);
+  checkTargetGrpcProxy(o[1] as api.TargetGrpcProxy);
 }
 
 core.int buildCounterTargetGrpcProxyListWarningData = 0;
@@ -23113,8 +23443,10 @@
 
 void checkUnnamed1059(core.List<api.TargetGrpcProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetGrpcProxyListWarningData(o[0]);
-  checkTargetGrpcProxyListWarningData(o[1]);
+  checkTargetGrpcProxyListWarningData(
+      o[0] as api.TargetGrpcProxyListWarningData);
+  checkTargetGrpcProxyListWarningData(
+      o[1] as api.TargetGrpcProxyListWarningData);
 }
 
 core.int buildCounterTargetGrpcProxyListWarning = 0;
@@ -23164,7 +23496,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetGrpcProxyListWarning(o.warning);
+    checkTargetGrpcProxyListWarning(
+        o.warning as api.TargetGrpcProxyListWarning);
   }
   buildCounterTargetGrpcProxyList--;
 }
@@ -23178,8 +23511,8 @@
 
 void checkUnnamed1060(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpProxy(o[0]);
-  checkTargetHttpProxy(o[1]);
+  checkTargetHttpProxy(o[0] as api.TargetHttpProxy);
+  checkTargetHttpProxy(o[1] as api.TargetHttpProxy);
 }
 
 core.int buildCounterTargetHttpProxiesScopedListWarningData = 0;
@@ -23214,8 +23547,10 @@
 
 void checkUnnamed1061(core.List<api.TargetHttpProxiesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpProxiesScopedListWarningData(o[0]);
-  checkTargetHttpProxiesScopedListWarningData(o[1]);
+  checkTargetHttpProxiesScopedListWarningData(
+      o[0] as api.TargetHttpProxiesScopedListWarningData);
+  checkTargetHttpProxiesScopedListWarningData(
+      o[1] as api.TargetHttpProxiesScopedListWarningData);
 }
 
 core.int buildCounterTargetHttpProxiesScopedListWarning = 0;
@@ -23259,7 +23594,8 @@
   buildCounterTargetHttpProxiesScopedList++;
   if (buildCounterTargetHttpProxiesScopedList < 3) {
     checkUnnamed1060(o.targetHttpProxies);
-    checkTargetHttpProxiesScopedListWarning(o.warning);
+    checkTargetHttpProxiesScopedListWarning(
+        o.warning as api.TargetHttpProxiesScopedListWarning);
   }
   buildCounterTargetHttpProxiesScopedList--;
 }
@@ -23309,8 +23645,8 @@
 void checkUnnamed1062(
     core.Map<core.String, api.TargetHttpProxiesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpProxiesScopedList(o['x']);
-  checkTargetHttpProxiesScopedList(o['y']);
+  checkTargetHttpProxiesScopedList(o['x'] as api.TargetHttpProxiesScopedList);
+  checkTargetHttpProxiesScopedList(o['y'] as api.TargetHttpProxiesScopedList);
 }
 
 core.List<core.String> buildUnnamed1063() {
@@ -23364,8 +23700,8 @@
 
 void checkUnnamed1064(core.List<api.TargetHttpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpProxy(o[0]);
-  checkTargetHttpProxy(o[1]);
+  checkTargetHttpProxy(o[0] as api.TargetHttpProxy);
+  checkTargetHttpProxy(o[1] as api.TargetHttpProxy);
 }
 
 core.int buildCounterTargetHttpProxyListWarningData = 0;
@@ -23398,8 +23734,10 @@
 
 void checkUnnamed1065(core.List<api.TargetHttpProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpProxyListWarningData(o[0]);
-  checkTargetHttpProxyListWarningData(o[1]);
+  checkTargetHttpProxyListWarningData(
+      o[0] as api.TargetHttpProxyListWarningData);
+  checkTargetHttpProxyListWarningData(
+      o[1] as api.TargetHttpProxyListWarningData);
 }
 
 core.int buildCounterTargetHttpProxyListWarning = 0;
@@ -23449,7 +23787,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetHttpProxyListWarning(o.warning);
+    checkTargetHttpProxyListWarning(
+        o.warning as api.TargetHttpProxyListWarning);
   }
   buildCounterTargetHttpProxyList--;
 }
@@ -23463,8 +23802,8 @@
 
 void checkUnnamed1066(core.List<api.TargetHttpsProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpsProxy(o[0]);
-  checkTargetHttpsProxy(o[1]);
+  checkTargetHttpsProxy(o[0] as api.TargetHttpsProxy);
+  checkTargetHttpsProxy(o[1] as api.TargetHttpsProxy);
 }
 
 core.int buildCounterTargetHttpsProxiesScopedListWarningData = 0;
@@ -23500,8 +23839,10 @@
 void checkUnnamed1067(
     core.List<api.TargetHttpsProxiesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpsProxiesScopedListWarningData(o[0]);
-  checkTargetHttpsProxiesScopedListWarningData(o[1]);
+  checkTargetHttpsProxiesScopedListWarningData(
+      o[0] as api.TargetHttpsProxiesScopedListWarningData);
+  checkTargetHttpsProxiesScopedListWarningData(
+      o[1] as api.TargetHttpsProxiesScopedListWarningData);
 }
 
 core.int buildCounterTargetHttpsProxiesScopedListWarning = 0;
@@ -23545,7 +23886,8 @@
   buildCounterTargetHttpsProxiesScopedList++;
   if (buildCounterTargetHttpsProxiesScopedList < 3) {
     checkUnnamed1066(o.targetHttpsProxies);
-    checkTargetHttpsProxiesScopedListWarning(o.warning);
+    checkTargetHttpsProxiesScopedListWarning(
+        o.warning as api.TargetHttpsProxiesScopedListWarning);
   }
   buildCounterTargetHttpsProxiesScopedList--;
 }
@@ -23667,8 +24009,8 @@
 void checkUnnamed1070(
     core.Map<core.String, api.TargetHttpsProxiesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpsProxiesScopedList(o['x']);
-  checkTargetHttpsProxiesScopedList(o['y']);
+  checkTargetHttpsProxiesScopedList(o['x'] as api.TargetHttpsProxiesScopedList);
+  checkTargetHttpsProxiesScopedList(o['y'] as api.TargetHttpsProxiesScopedList);
 }
 
 core.List<core.String> buildUnnamed1071() {
@@ -23717,8 +24059,10 @@
 void checkUnnamed1072(
     core.List<api.TargetHttpsProxyAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpsProxyAggregatedListWarningData(o[0]);
-  checkTargetHttpsProxyAggregatedListWarningData(o[1]);
+  checkTargetHttpsProxyAggregatedListWarningData(
+      o[0] as api.TargetHttpsProxyAggregatedListWarningData);
+  checkTargetHttpsProxyAggregatedListWarningData(
+      o[1] as api.TargetHttpsProxyAggregatedListWarningData);
 }
 
 core.int buildCounterTargetHttpsProxyAggregatedListWarning = 0;
@@ -23772,7 +24116,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1071(o.unreachables);
-    checkTargetHttpsProxyAggregatedListWarning(o.warning);
+    checkTargetHttpsProxyAggregatedListWarning(
+        o.warning as api.TargetHttpsProxyAggregatedListWarning);
   }
   buildCounterTargetHttpsProxyAggregatedList--;
 }
@@ -23786,8 +24131,8 @@
 
 void checkUnnamed1073(core.List<api.TargetHttpsProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpsProxy(o[0]);
-  checkTargetHttpsProxy(o[1]);
+  checkTargetHttpsProxy(o[0] as api.TargetHttpsProxy);
+  checkTargetHttpsProxy(o[1] as api.TargetHttpsProxy);
 }
 
 core.int buildCounterTargetHttpsProxyListWarningData = 0;
@@ -23821,8 +24166,10 @@
 
 void checkUnnamed1074(core.List<api.TargetHttpsProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetHttpsProxyListWarningData(o[0]);
-  checkTargetHttpsProxyListWarningData(o[1]);
+  checkTargetHttpsProxyListWarningData(
+      o[0] as api.TargetHttpsProxyListWarningData);
+  checkTargetHttpsProxyListWarningData(
+      o[1] as api.TargetHttpsProxyListWarningData);
 }
 
 core.int buildCounterTargetHttpsProxyListWarning = 0;
@@ -23872,7 +24219,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetHttpsProxyListWarning(o.warning);
+    checkTargetHttpsProxyListWarning(
+        o.warning as api.TargetHttpsProxyListWarning);
   }
   buildCounterTargetHttpsProxyList--;
 }
@@ -23921,8 +24269,8 @@
 
 void checkUnnamed1075(core.Map<core.String, api.TargetInstancesScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetInstancesScopedList(o['x']);
-  checkTargetInstancesScopedList(o['y']);
+  checkTargetInstancesScopedList(o['x'] as api.TargetInstancesScopedList);
+  checkTargetInstancesScopedList(o['y'] as api.TargetInstancesScopedList);
 }
 
 core.List<core.String> buildUnnamed1076() {
@@ -23971,8 +24319,10 @@
 void checkUnnamed1077(
     core.List<api.TargetInstanceAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetInstanceAggregatedListWarningData(o[0]);
-  checkTargetInstanceAggregatedListWarningData(o[1]);
+  checkTargetInstanceAggregatedListWarningData(
+      o[0] as api.TargetInstanceAggregatedListWarningData);
+  checkTargetInstanceAggregatedListWarningData(
+      o[1] as api.TargetInstanceAggregatedListWarningData);
 }
 
 core.int buildCounterTargetInstanceAggregatedListWarning = 0;
@@ -24026,7 +24376,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1076(o.unreachables);
-    checkTargetInstanceAggregatedListWarning(o.warning);
+    checkTargetInstanceAggregatedListWarning(
+        o.warning as api.TargetInstanceAggregatedListWarning);
   }
   buildCounterTargetInstanceAggregatedList--;
 }
@@ -24040,8 +24391,8 @@
 
 void checkUnnamed1078(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetInstance(o[0]);
-  checkTargetInstance(o[1]);
+  checkTargetInstance(o[0] as api.TargetInstance);
+  checkTargetInstance(o[1] as api.TargetInstance);
 }
 
 core.int buildCounterTargetInstanceListWarningData = 0;
@@ -24074,8 +24425,8 @@
 
 void checkUnnamed1079(core.List<api.TargetInstanceListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetInstanceListWarningData(o[0]);
-  checkTargetInstanceListWarningData(o[1]);
+  checkTargetInstanceListWarningData(o[0] as api.TargetInstanceListWarningData);
+  checkTargetInstanceListWarningData(o[1] as api.TargetInstanceListWarningData);
 }
 
 core.int buildCounterTargetInstanceListWarning = 0;
@@ -24125,7 +24476,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetInstanceListWarning(o.warning);
+    checkTargetInstanceListWarning(o.warning as api.TargetInstanceListWarning);
   }
   buildCounterTargetInstanceList--;
 }
@@ -24139,8 +24490,8 @@
 
 void checkUnnamed1080(core.List<api.TargetInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetInstance(o[0]);
-  checkTargetInstance(o[1]);
+  checkTargetInstance(o[0] as api.TargetInstance);
+  checkTargetInstance(o[1] as api.TargetInstance);
 }
 
 core.int buildCounterTargetInstancesScopedListWarningData = 0;
@@ -24175,8 +24526,10 @@
 
 void checkUnnamed1081(core.List<api.TargetInstancesScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetInstancesScopedListWarningData(o[0]);
-  checkTargetInstancesScopedListWarningData(o[1]);
+  checkTargetInstancesScopedListWarningData(
+      o[0] as api.TargetInstancesScopedListWarningData);
+  checkTargetInstancesScopedListWarningData(
+      o[1] as api.TargetInstancesScopedListWarningData);
 }
 
 core.int buildCounterTargetInstancesScopedListWarning = 0;
@@ -24219,7 +24572,8 @@
   buildCounterTargetInstancesScopedList++;
   if (buildCounterTargetInstancesScopedList < 3) {
     checkUnnamed1080(o.targetInstances);
-    checkTargetInstancesScopedListWarning(o.warning);
+    checkTargetInstancesScopedListWarning(
+        o.warning as api.TargetInstancesScopedListWarning);
   }
   buildCounterTargetInstancesScopedList--;
 }
@@ -24300,8 +24654,8 @@
 
 void checkUnnamed1084(core.Map<core.String, api.TargetPoolsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetPoolsScopedList(o['x']);
-  checkTargetPoolsScopedList(o['y']);
+  checkTargetPoolsScopedList(o['x'] as api.TargetPoolsScopedList);
+  checkTargetPoolsScopedList(o['y'] as api.TargetPoolsScopedList);
 }
 
 core.List<core.String> buildUnnamed1085() {
@@ -24349,8 +24703,10 @@
 
 void checkUnnamed1086(core.List<api.TargetPoolAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetPoolAggregatedListWarningData(o[0]);
-  checkTargetPoolAggregatedListWarningData(o[1]);
+  checkTargetPoolAggregatedListWarningData(
+      o[0] as api.TargetPoolAggregatedListWarningData);
+  checkTargetPoolAggregatedListWarningData(
+      o[1] as api.TargetPoolAggregatedListWarningData);
 }
 
 core.int buildCounterTargetPoolAggregatedListWarning = 0;
@@ -24403,7 +24759,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1085(o.unreachables);
-    checkTargetPoolAggregatedListWarning(o.warning);
+    checkTargetPoolAggregatedListWarning(
+        o.warning as api.TargetPoolAggregatedListWarning);
   }
   buildCounterTargetPoolAggregatedList--;
 }
@@ -24417,8 +24774,8 @@
 
 void checkUnnamed1087(core.List<api.HealthStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthStatus(o[0]);
-  checkHealthStatus(o[1]);
+  checkHealthStatus(o[0] as api.HealthStatus);
+  checkHealthStatus(o[1] as api.HealthStatus);
 }
 
 core.int buildCounterTargetPoolInstanceHealth = 0;
@@ -24451,8 +24808,8 @@
 
 void checkUnnamed1088(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetPool(o[0]);
-  checkTargetPool(o[1]);
+  checkTargetPool(o[0] as api.TargetPool);
+  checkTargetPool(o[1] as api.TargetPool);
 }
 
 core.int buildCounterTargetPoolListWarningData = 0;
@@ -24485,8 +24842,8 @@
 
 void checkUnnamed1089(core.List<api.TargetPoolListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetPoolListWarningData(o[0]);
-  checkTargetPoolListWarningData(o[1]);
+  checkTargetPoolListWarningData(o[0] as api.TargetPoolListWarningData);
+  checkTargetPoolListWarningData(o[1] as api.TargetPoolListWarningData);
 }
 
 core.int buildCounterTargetPoolListWarning = 0;
@@ -24536,7 +24893,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetPoolListWarning(o.warning);
+    checkTargetPoolListWarning(o.warning as api.TargetPoolListWarning);
   }
   buildCounterTargetPoolList--;
 }
@@ -24550,8 +24907,8 @@
 
 void checkUnnamed1090(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheckReference(o[0]);
-  checkHealthCheckReference(o[1]);
+  checkHealthCheckReference(o[0] as api.HealthCheckReference);
+  checkHealthCheckReference(o[1] as api.HealthCheckReference);
 }
 
 core.int buildCounterTargetPoolsAddHealthCheckRequest = 0;
@@ -24583,8 +24940,8 @@
 
 void checkUnnamed1091(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceReference(o[0]);
-  checkInstanceReference(o[1]);
+  checkInstanceReference(o[0] as api.InstanceReference);
+  checkInstanceReference(o[1] as api.InstanceReference);
 }
 
 core.int buildCounterTargetPoolsAddInstanceRequest = 0;
@@ -24615,8 +24972,8 @@
 
 void checkUnnamed1092(core.List<api.HealthCheckReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHealthCheckReference(o[0]);
-  checkHealthCheckReference(o[1]);
+  checkHealthCheckReference(o[0] as api.HealthCheckReference);
+  checkHealthCheckReference(o[1] as api.HealthCheckReference);
 }
 
 core.int buildCounterTargetPoolsRemoveHealthCheckRequest = 0;
@@ -24649,8 +25006,8 @@
 
 void checkUnnamed1093(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceReference(o[0]);
-  checkInstanceReference(o[1]);
+  checkInstanceReference(o[0] as api.InstanceReference);
+  checkInstanceReference(o[1] as api.InstanceReference);
 }
 
 core.int buildCounterTargetPoolsRemoveInstanceRequest = 0;
@@ -24682,8 +25039,8 @@
 
 void checkUnnamed1094(core.List<api.TargetPool> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetPool(o[0]);
-  checkTargetPool(o[1]);
+  checkTargetPool(o[0] as api.TargetPool);
+  checkTargetPool(o[1] as api.TargetPool);
 }
 
 core.int buildCounterTargetPoolsScopedListWarningData = 0;
@@ -24717,8 +25074,10 @@
 
 void checkUnnamed1095(core.List<api.TargetPoolsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetPoolsScopedListWarningData(o[0]);
-  checkTargetPoolsScopedListWarningData(o[1]);
+  checkTargetPoolsScopedListWarningData(
+      o[0] as api.TargetPoolsScopedListWarningData);
+  checkTargetPoolsScopedListWarningData(
+      o[1] as api.TargetPoolsScopedListWarningData);
 }
 
 core.int buildCounterTargetPoolsScopedListWarning = 0;
@@ -24760,7 +25119,8 @@
   buildCounterTargetPoolsScopedList++;
   if (buildCounterTargetPoolsScopedList < 3) {
     checkUnnamed1094(o.targetPools);
-    checkTargetPoolsScopedListWarning(o.warning);
+    checkTargetPoolsScopedListWarning(
+        o.warning as api.TargetPoolsScopedListWarning);
   }
   buildCounterTargetPoolsScopedList--;
 }
@@ -24919,8 +25279,8 @@
 
 void checkUnnamed1098(core.List<api.TargetSslProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetSslProxy(o[0]);
-  checkTargetSslProxy(o[1]);
+  checkTargetSslProxy(o[0] as api.TargetSslProxy);
+  checkTargetSslProxy(o[1] as api.TargetSslProxy);
 }
 
 core.int buildCounterTargetSslProxyListWarningData = 0;
@@ -24953,8 +25313,8 @@
 
 void checkUnnamed1099(core.List<api.TargetSslProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetSslProxyListWarningData(o[0]);
-  checkTargetSslProxyListWarningData(o[1]);
+  checkTargetSslProxyListWarningData(o[0] as api.TargetSslProxyListWarningData);
+  checkTargetSslProxyListWarningData(o[1] as api.TargetSslProxyListWarningData);
 }
 
 core.int buildCounterTargetSslProxyListWarning = 0;
@@ -25004,7 +25364,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetSslProxyListWarning(o.warning);
+    checkTargetSslProxyListWarning(o.warning as api.TargetSslProxyListWarning);
   }
   buildCounterTargetSslProxyList--;
 }
@@ -25093,8 +25453,8 @@
 
 void checkUnnamed1100(core.List<api.TargetTcpProxy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetTcpProxy(o[0]);
-  checkTargetTcpProxy(o[1]);
+  checkTargetTcpProxy(o[0] as api.TargetTcpProxy);
+  checkTargetTcpProxy(o[1] as api.TargetTcpProxy);
 }
 
 core.int buildCounterTargetTcpProxyListWarningData = 0;
@@ -25127,8 +25487,8 @@
 
 void checkUnnamed1101(core.List<api.TargetTcpProxyListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetTcpProxyListWarningData(o[0]);
-  checkTargetTcpProxyListWarningData(o[1]);
+  checkTargetTcpProxyListWarningData(o[0] as api.TargetTcpProxyListWarningData);
+  checkTargetTcpProxyListWarningData(o[1] as api.TargetTcpProxyListWarningData);
 }
 
 core.int buildCounterTargetTcpProxyListWarning = 0;
@@ -25178,7 +25538,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetTcpProxyListWarning(o.warning);
+    checkTargetTcpProxyListWarning(o.warning as api.TargetTcpProxyListWarning);
   }
   buildCounterTargetTcpProxyList--;
 }
@@ -25258,8 +25618,8 @@
 void checkUnnamed1104(
     core.Map<core.String, api.TargetVpnGatewaysScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetVpnGatewaysScopedList(o['x']);
-  checkTargetVpnGatewaysScopedList(o['y']);
+  checkTargetVpnGatewaysScopedList(o['x'] as api.TargetVpnGatewaysScopedList);
+  checkTargetVpnGatewaysScopedList(o['y'] as api.TargetVpnGatewaysScopedList);
 }
 
 core.List<core.String> buildUnnamed1105() {
@@ -25308,8 +25668,10 @@
 void checkUnnamed1106(
     core.List<api.TargetVpnGatewayAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetVpnGatewayAggregatedListWarningData(o[0]);
-  checkTargetVpnGatewayAggregatedListWarningData(o[1]);
+  checkTargetVpnGatewayAggregatedListWarningData(
+      o[0] as api.TargetVpnGatewayAggregatedListWarningData);
+  checkTargetVpnGatewayAggregatedListWarningData(
+      o[1] as api.TargetVpnGatewayAggregatedListWarningData);
 }
 
 core.int buildCounterTargetVpnGatewayAggregatedListWarning = 0;
@@ -25363,7 +25725,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1105(o.unreachables);
-    checkTargetVpnGatewayAggregatedListWarning(o.warning);
+    checkTargetVpnGatewayAggregatedListWarning(
+        o.warning as api.TargetVpnGatewayAggregatedListWarning);
   }
   buildCounterTargetVpnGatewayAggregatedList--;
 }
@@ -25377,8 +25740,8 @@
 
 void checkUnnamed1107(core.List<api.TargetVpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetVpnGateway(o[0]);
-  checkTargetVpnGateway(o[1]);
+  checkTargetVpnGateway(o[0] as api.TargetVpnGateway);
+  checkTargetVpnGateway(o[1] as api.TargetVpnGateway);
 }
 
 core.int buildCounterTargetVpnGatewayListWarningData = 0;
@@ -25412,8 +25775,10 @@
 
 void checkUnnamed1108(core.List<api.TargetVpnGatewayListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetVpnGatewayListWarningData(o[0]);
-  checkTargetVpnGatewayListWarningData(o[1]);
+  checkTargetVpnGatewayListWarningData(
+      o[0] as api.TargetVpnGatewayListWarningData);
+  checkTargetVpnGatewayListWarningData(
+      o[1] as api.TargetVpnGatewayListWarningData);
 }
 
 core.int buildCounterTargetVpnGatewayListWarning = 0;
@@ -25463,7 +25828,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetVpnGatewayListWarning(o.warning);
+    checkTargetVpnGatewayListWarning(
+        o.warning as api.TargetVpnGatewayListWarning);
   }
   buildCounterTargetVpnGatewayList--;
 }
@@ -25477,8 +25843,8 @@
 
 void checkUnnamed1109(core.List<api.TargetVpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetVpnGateway(o[0]);
-  checkTargetVpnGateway(o[1]);
+  checkTargetVpnGateway(o[0] as api.TargetVpnGateway);
+  checkTargetVpnGateway(o[1] as api.TargetVpnGateway);
 }
 
 core.int buildCounterTargetVpnGatewaysScopedListWarningData = 0;
@@ -25513,8 +25879,10 @@
 
 void checkUnnamed1110(core.List<api.TargetVpnGatewaysScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetVpnGatewaysScopedListWarningData(o[0]);
-  checkTargetVpnGatewaysScopedListWarningData(o[1]);
+  checkTargetVpnGatewaysScopedListWarningData(
+      o[0] as api.TargetVpnGatewaysScopedListWarningData);
+  checkTargetVpnGatewaysScopedListWarningData(
+      o[1] as api.TargetVpnGatewaysScopedListWarningData);
 }
 
 core.int buildCounterTargetVpnGatewaysScopedListWarning = 0;
@@ -25558,7 +25926,8 @@
   buildCounterTargetVpnGatewaysScopedList++;
   if (buildCounterTargetVpnGatewaysScopedList < 3) {
     checkUnnamed1109(o.targetVpnGateways);
-    checkTargetVpnGatewaysScopedListWarning(o.warning);
+    checkTargetVpnGatewaysScopedListWarning(
+        o.warning as api.TargetVpnGatewaysScopedListWarning);
   }
   buildCounterTargetVpnGatewaysScopedList--;
 }
@@ -25661,8 +26030,8 @@
 
 void checkUnnamed1113(core.List<api.HostRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHostRule(o[0]);
-  checkHostRule(o[1]);
+  checkHostRule(o[0] as api.HostRule);
+  checkHostRule(o[1] as api.HostRule);
 }
 
 core.List<api.PathMatcher> buildUnnamed1114() {
@@ -25674,8 +26043,8 @@
 
 void checkUnnamed1114(core.List<api.PathMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPathMatcher(o[0]);
-  checkPathMatcher(o[1]);
+  checkPathMatcher(o[0] as api.PathMatcher);
+  checkPathMatcher(o[1] as api.PathMatcher);
 }
 
 core.List<api.UrlMapTest> buildUnnamed1115() {
@@ -25687,8 +26056,8 @@
 
 void checkUnnamed1115(core.List<api.UrlMapTest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMapTest(o[0]);
-  checkUrlMapTest(o[1]);
+  checkUrlMapTest(o[0] as api.UrlMapTest);
+  checkUrlMapTest(o[1] as api.UrlMapTest);
 }
 
 core.int buildCounterUrlMap = 0;
@@ -25720,12 +26089,12 @@
   buildCounterUrlMap++;
   if (buildCounterUrlMap < 3) {
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkHttpRouteAction(o.defaultRouteAction);
+    checkHttpRouteAction(o.defaultRouteAction as api.HttpRouteAction);
     unittest.expect(o.defaultService, unittest.equals('foo'));
-    checkHttpRedirectAction(o.defaultUrlRedirect);
+    checkHttpRedirectAction(o.defaultUrlRedirect as api.HttpRedirectAction);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkHttpHeaderAction(o.headerAction);
+    checkHttpHeaderAction(o.headerAction as api.HttpHeaderAction);
     checkUnnamed1113(o.hostRules);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -25747,8 +26116,8 @@
 
 void checkUnnamed1116(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMap(o[0]);
-  checkUrlMap(o[1]);
+  checkUrlMap(o[0] as api.UrlMap);
+  checkUrlMap(o[1] as api.UrlMap);
 }
 
 core.int buildCounterUrlMapListWarningData = 0;
@@ -25781,8 +26150,8 @@
 
 void checkUnnamed1117(core.List<api.UrlMapListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMapListWarningData(o[0]);
-  checkUrlMapListWarningData(o[1]);
+  checkUrlMapListWarningData(o[0] as api.UrlMapListWarningData);
+  checkUrlMapListWarningData(o[1] as api.UrlMapListWarningData);
 }
 
 core.int buildCounterUrlMapListWarning = 0;
@@ -25832,7 +26201,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUrlMapListWarning(o.warning);
+    checkUrlMapListWarning(o.warning as api.UrlMapListWarning);
   }
   buildCounterUrlMapList--;
 }
@@ -25903,8 +26272,8 @@
 
 void checkUnnamed1119(core.List<api.TestFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTestFailure(o[0]);
-  checkTestFailure(o[1]);
+  checkTestFailure(o[0] as api.TestFailure);
+  checkTestFailure(o[1] as api.TestFailure);
 }
 
 core.int buildCounterUrlMapValidationResult = 0;
@@ -25941,8 +26310,8 @@
 
 void checkUnnamed1120(core.Map<core.String, api.UrlMapsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMapsScopedList(o['x']);
-  checkUrlMapsScopedList(o['y']);
+  checkUrlMapsScopedList(o['x'] as api.UrlMapsScopedList);
+  checkUrlMapsScopedList(o['y'] as api.UrlMapsScopedList);
 }
 
 core.List<core.String> buildUnnamed1121() {
@@ -25989,8 +26358,10 @@
 
 void checkUnnamed1122(core.List<api.UrlMapsAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMapsAggregatedListWarningData(o[0]);
-  checkUrlMapsAggregatedListWarningData(o[1]);
+  checkUrlMapsAggregatedListWarningData(
+      o[0] as api.UrlMapsAggregatedListWarningData);
+  checkUrlMapsAggregatedListWarningData(
+      o[1] as api.UrlMapsAggregatedListWarningData);
 }
 
 core.int buildCounterUrlMapsAggregatedListWarning = 0;
@@ -26042,7 +26413,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1121(o.unreachables);
-    checkUrlMapsAggregatedListWarning(o.warning);
+    checkUrlMapsAggregatedListWarning(
+        o.warning as api.UrlMapsAggregatedListWarning);
   }
   buildCounterUrlMapsAggregatedList--;
 }
@@ -26056,8 +26428,8 @@
 
 void checkUnnamed1123(core.List<api.UrlMap> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMap(o[0]);
-  checkUrlMap(o[1]);
+  checkUrlMap(o[0] as api.UrlMap);
+  checkUrlMap(o[1] as api.UrlMap);
 }
 
 core.int buildCounterUrlMapsScopedListWarningData = 0;
@@ -26090,8 +26462,8 @@
 
 void checkUnnamed1124(core.List<api.UrlMapsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrlMapsScopedListWarningData(o[0]);
-  checkUrlMapsScopedListWarningData(o[1]);
+  checkUrlMapsScopedListWarningData(o[0] as api.UrlMapsScopedListWarningData);
+  checkUrlMapsScopedListWarningData(o[1] as api.UrlMapsScopedListWarningData);
 }
 
 core.int buildCounterUrlMapsScopedListWarning = 0;
@@ -26133,7 +26505,7 @@
   buildCounterUrlMapsScopedList++;
   if (buildCounterUrlMapsScopedList < 3) {
     checkUnnamed1123(o.urlMaps);
-    checkUrlMapsScopedListWarning(o.warning);
+    checkUrlMapsScopedListWarning(o.warning as api.UrlMapsScopedListWarning);
   }
   buildCounterUrlMapsScopedList--;
 }
@@ -26152,7 +26524,7 @@
 void checkUrlMapsValidateRequest(api.UrlMapsValidateRequest o) {
   buildCounterUrlMapsValidateRequest++;
   if (buildCounterUrlMapsValidateRequest < 3) {
-    checkUrlMap(o.resource);
+    checkUrlMap(o.resource as api.UrlMap);
   }
   buildCounterUrlMapsValidateRequest--;
 }
@@ -26171,7 +26543,7 @@
 void checkUrlMapsValidateResponse(api.UrlMapsValidateResponse o) {
   buildCounterUrlMapsValidateResponse++;
   if (buildCounterUrlMapsValidateResponse < 3) {
-    checkUrlMapValidationResult(o.result);
+    checkUrlMapValidationResult(o.result as api.UrlMapValidationResult);
   }
   buildCounterUrlMapsValidateResponse--;
 }
@@ -26206,8 +26578,10 @@
 
 void checkUnnamed1125(core.List<api.UsableSubnetworkSecondaryRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsableSubnetworkSecondaryRange(o[0]);
-  checkUsableSubnetworkSecondaryRange(o[1]);
+  checkUsableSubnetworkSecondaryRange(
+      o[0] as api.UsableSubnetworkSecondaryRange);
+  checkUsableSubnetworkSecondaryRange(
+      o[1] as api.UsableSubnetworkSecondaryRange);
 }
 
 core.int buildCounterUsableSubnetwork = 0;
@@ -26265,8 +26639,8 @@
 
 void checkUnnamed1126(core.List<api.UsableSubnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsableSubnetwork(o[0]);
-  checkUsableSubnetwork(o[1]);
+  checkUsableSubnetwork(o[0] as api.UsableSubnetwork);
+  checkUsableSubnetwork(o[1] as api.UsableSubnetwork);
 }
 
 core.int buildCounterUsableSubnetworksAggregatedListWarningData = 0;
@@ -26302,8 +26676,10 @@
 void checkUnnamed1127(
     core.List<api.UsableSubnetworksAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsableSubnetworksAggregatedListWarningData(o[0]);
-  checkUsableSubnetworksAggregatedListWarningData(o[1]);
+  checkUsableSubnetworksAggregatedListWarningData(
+      o[0] as api.UsableSubnetworksAggregatedListWarningData);
+  checkUsableSubnetworksAggregatedListWarningData(
+      o[1] as api.UsableSubnetworksAggregatedListWarningData);
 }
 
 core.int buildCounterUsableSubnetworksAggregatedListWarning = 0;
@@ -26356,7 +26732,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkUsableSubnetworksAggregatedListWarning(o.warning);
+    checkUsableSubnetworksAggregatedListWarning(
+        o.warning as api.UsableSubnetworksAggregatedListWarning);
   }
   buildCounterUsableSubnetworksAggregatedList--;
 }
@@ -26392,8 +26769,10 @@
 void checkUnnamed1128(
     core.List<api.VmEndpointNatMappingsInterfaceNatMappings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVmEndpointNatMappingsInterfaceNatMappings(o[0]);
-  checkVmEndpointNatMappingsInterfaceNatMappings(o[1]);
+  checkVmEndpointNatMappingsInterfaceNatMappings(
+      o[0] as api.VmEndpointNatMappingsInterfaceNatMappings);
+  checkVmEndpointNatMappingsInterfaceNatMappings(
+      o[1] as api.VmEndpointNatMappingsInterfaceNatMappings);
 }
 
 core.int buildCounterVmEndpointNatMappings = 0;
@@ -26483,8 +26862,8 @@
 
 void checkUnnamed1131(core.List<api.VmEndpointNatMappings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVmEndpointNatMappings(o[0]);
-  checkVmEndpointNatMappings(o[1]);
+  checkVmEndpointNatMappings(o[0] as api.VmEndpointNatMappings);
+  checkVmEndpointNatMappings(o[1] as api.VmEndpointNatMappings);
 }
 
 core.int buildCounterVmEndpointNatMappingsListWarningData = 0;
@@ -26519,8 +26898,10 @@
 
 void checkUnnamed1132(core.List<api.VmEndpointNatMappingsListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVmEndpointNatMappingsListWarningData(o[0]);
-  checkVmEndpointNatMappingsListWarningData(o[1]);
+  checkVmEndpointNatMappingsListWarningData(
+      o[0] as api.VmEndpointNatMappingsListWarningData);
+  checkVmEndpointNatMappingsListWarningData(
+      o[1] as api.VmEndpointNatMappingsListWarningData);
 }
 
 core.int buildCounterVmEndpointNatMappingsListWarning = 0;
@@ -26571,7 +26952,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkUnnamed1131(o.result);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkVmEndpointNatMappingsListWarning(o.warning);
+    checkVmEndpointNatMappingsListWarning(
+        o.warning as api.VmEndpointNatMappingsListWarning);
   }
   buildCounterVmEndpointNatMappingsList--;
 }
@@ -26598,8 +26980,8 @@
 
 void checkUnnamed1134(core.List<api.VpnGatewayVpnGatewayInterface> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGatewayVpnGatewayInterface(o[0]);
-  checkVpnGatewayVpnGatewayInterface(o[1]);
+  checkVpnGatewayVpnGatewayInterface(o[0] as api.VpnGatewayVpnGatewayInterface);
+  checkVpnGatewayVpnGatewayInterface(o[1] as api.VpnGatewayVpnGatewayInterface);
 }
 
 core.int buildCounterVpnGateway = 0;
@@ -26650,8 +27032,8 @@
 
 void checkUnnamed1135(core.Map<core.String, api.VpnGatewaysScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGatewaysScopedList(o['x']);
-  checkVpnGatewaysScopedList(o['y']);
+  checkVpnGatewaysScopedList(o['x'] as api.VpnGatewaysScopedList);
+  checkVpnGatewaysScopedList(o['y'] as api.VpnGatewaysScopedList);
 }
 
 core.List<core.String> buildUnnamed1136() {
@@ -26699,8 +27081,10 @@
 
 void checkUnnamed1137(core.List<api.VpnGatewayAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGatewayAggregatedListWarningData(o[0]);
-  checkVpnGatewayAggregatedListWarningData(o[1]);
+  checkVpnGatewayAggregatedListWarningData(
+      o[0] as api.VpnGatewayAggregatedListWarningData);
+  checkVpnGatewayAggregatedListWarningData(
+      o[1] as api.VpnGatewayAggregatedListWarningData);
 }
 
 core.int buildCounterVpnGatewayAggregatedListWarning = 0;
@@ -26753,7 +27137,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1136(o.unreachables);
-    checkVpnGatewayAggregatedListWarning(o.warning);
+    checkVpnGatewayAggregatedListWarning(
+        o.warning as api.VpnGatewayAggregatedListWarning);
   }
   buildCounterVpnGatewayAggregatedList--;
 }
@@ -26767,8 +27152,8 @@
 
 void checkUnnamed1138(core.List<api.VpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGateway(o[0]);
-  checkVpnGateway(o[1]);
+  checkVpnGateway(o[0] as api.VpnGateway);
+  checkVpnGateway(o[1] as api.VpnGateway);
 }
 
 core.int buildCounterVpnGatewayListWarningData = 0;
@@ -26801,8 +27186,8 @@
 
 void checkUnnamed1139(core.List<api.VpnGatewayListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGatewayListWarningData(o[0]);
-  checkVpnGatewayListWarningData(o[1]);
+  checkVpnGatewayListWarningData(o[0] as api.VpnGatewayListWarningData);
+  checkVpnGatewayListWarningData(o[1] as api.VpnGatewayListWarningData);
 }
 
 core.int buildCounterVpnGatewayListWarning = 0;
@@ -26852,7 +27237,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkVpnGatewayListWarning(o.warning);
+    checkVpnGatewayListWarning(o.warning as api.VpnGatewayListWarning);
   }
   buildCounterVpnGatewayList--;
 }
@@ -26866,8 +27251,8 @@
 
 void checkUnnamed1140(core.List<api.VpnGatewayStatusVpnConnection> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGatewayStatusVpnConnection(o[0]);
-  checkVpnGatewayStatusVpnConnection(o[1]);
+  checkVpnGatewayStatusVpnConnection(o[0] as api.VpnGatewayStatusVpnConnection);
+  checkVpnGatewayStatusVpnConnection(o[1] as api.VpnGatewayStatusVpnConnection);
 }
 
 core.int buildCounterVpnGatewayStatus = 0;
@@ -26944,8 +27329,8 @@
 
 void checkUnnamed1141(core.List<api.VpnGatewayStatusTunnel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGatewayStatusTunnel(o[0]);
-  checkVpnGatewayStatusTunnel(o[1]);
+  checkVpnGatewayStatusTunnel(o[0] as api.VpnGatewayStatusTunnel);
+  checkVpnGatewayStatusTunnel(o[1] as api.VpnGatewayStatusTunnel);
 }
 
 core.int buildCounterVpnGatewayStatusVpnConnection = 0;
@@ -26967,7 +27352,8 @@
   if (buildCounterVpnGatewayStatusVpnConnection < 3) {
     unittest.expect(o.peerExternalGateway, unittest.equals('foo'));
     unittest.expect(o.peerGcpGateway, unittest.equals('foo'));
-    checkVpnGatewayStatusHighAvailabilityRequirementState(o.state);
+    checkVpnGatewayStatusHighAvailabilityRequirementState(
+        o.state as api.VpnGatewayStatusHighAvailabilityRequirementState);
     checkUnnamed1141(o.tunnels);
   }
   buildCounterVpnGatewayStatusVpnConnection--;
@@ -27008,7 +27394,7 @@
 void checkVpnGatewaysGetStatusResponse(api.VpnGatewaysGetStatusResponse o) {
   buildCounterVpnGatewaysGetStatusResponse++;
   if (buildCounterVpnGatewaysGetStatusResponse < 3) {
-    checkVpnGatewayStatus(o.result);
+    checkVpnGatewayStatus(o.result as api.VpnGatewayStatus);
   }
   buildCounterVpnGatewaysGetStatusResponse--;
 }
@@ -27022,8 +27408,8 @@
 
 void checkUnnamed1142(core.List<api.VpnGateway> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGateway(o[0]);
-  checkVpnGateway(o[1]);
+  checkVpnGateway(o[0] as api.VpnGateway);
+  checkVpnGateway(o[1] as api.VpnGateway);
 }
 
 core.int buildCounterVpnGatewaysScopedListWarningData = 0;
@@ -27057,8 +27443,10 @@
 
 void checkUnnamed1143(core.List<api.VpnGatewaysScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnGatewaysScopedListWarningData(o[0]);
-  checkVpnGatewaysScopedListWarningData(o[1]);
+  checkVpnGatewaysScopedListWarningData(
+      o[0] as api.VpnGatewaysScopedListWarningData);
+  checkVpnGatewaysScopedListWarningData(
+      o[1] as api.VpnGatewaysScopedListWarningData);
 }
 
 core.int buildCounterVpnGatewaysScopedListWarning = 0;
@@ -27100,7 +27488,8 @@
   buildCounterVpnGatewaysScopedList++;
   if (buildCounterVpnGatewaysScopedList < 3) {
     checkUnnamed1142(o.vpnGateways);
-    checkVpnGatewaysScopedListWarning(o.warning);
+    checkVpnGatewaysScopedListWarning(
+        o.warning as api.VpnGatewaysScopedListWarning);
   }
   buildCounterVpnGatewaysScopedList--;
 }
@@ -27201,8 +27590,8 @@
 
 void checkUnnamed1146(core.Map<core.String, api.VpnTunnelsScopedList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnTunnelsScopedList(o['x']);
-  checkVpnTunnelsScopedList(o['y']);
+  checkVpnTunnelsScopedList(o['x'] as api.VpnTunnelsScopedList);
+  checkVpnTunnelsScopedList(o['y'] as api.VpnTunnelsScopedList);
 }
 
 core.List<core.String> buildUnnamed1147() {
@@ -27250,8 +27639,10 @@
 
 void checkUnnamed1148(core.List<api.VpnTunnelAggregatedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnTunnelAggregatedListWarningData(o[0]);
-  checkVpnTunnelAggregatedListWarningData(o[1]);
+  checkVpnTunnelAggregatedListWarningData(
+      o[0] as api.VpnTunnelAggregatedListWarningData);
+  checkVpnTunnelAggregatedListWarningData(
+      o[1] as api.VpnTunnelAggregatedListWarningData);
 }
 
 core.int buildCounterVpnTunnelAggregatedListWarning = 0;
@@ -27303,7 +27694,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed1147(o.unreachables);
-    checkVpnTunnelAggregatedListWarning(o.warning);
+    checkVpnTunnelAggregatedListWarning(
+        o.warning as api.VpnTunnelAggregatedListWarning);
   }
   buildCounterVpnTunnelAggregatedList--;
 }
@@ -27317,8 +27709,8 @@
 
 void checkUnnamed1149(core.List<api.VpnTunnel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnTunnel(o[0]);
-  checkVpnTunnel(o[1]);
+  checkVpnTunnel(o[0] as api.VpnTunnel);
+  checkVpnTunnel(o[1] as api.VpnTunnel);
 }
 
 core.int buildCounterVpnTunnelListWarningData = 0;
@@ -27351,8 +27743,8 @@
 
 void checkUnnamed1150(core.List<api.VpnTunnelListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnTunnelListWarningData(o[0]);
-  checkVpnTunnelListWarningData(o[1]);
+  checkVpnTunnelListWarningData(o[0] as api.VpnTunnelListWarningData);
+  checkVpnTunnelListWarningData(o[1] as api.VpnTunnelListWarningData);
 }
 
 core.int buildCounterVpnTunnelListWarning = 0;
@@ -27402,7 +27794,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkVpnTunnelListWarning(o.warning);
+    checkVpnTunnelListWarning(o.warning as api.VpnTunnelListWarning);
   }
   buildCounterVpnTunnelList--;
 }
@@ -27416,8 +27808,8 @@
 
 void checkUnnamed1151(core.List<api.VpnTunnel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnTunnel(o[0]);
-  checkVpnTunnel(o[1]);
+  checkVpnTunnel(o[0] as api.VpnTunnel);
+  checkVpnTunnel(o[1] as api.VpnTunnel);
 }
 
 core.int buildCounterVpnTunnelsScopedListWarningData = 0;
@@ -27451,8 +27843,10 @@
 
 void checkUnnamed1152(core.List<api.VpnTunnelsScopedListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVpnTunnelsScopedListWarningData(o[0]);
-  checkVpnTunnelsScopedListWarningData(o[1]);
+  checkVpnTunnelsScopedListWarningData(
+      o[0] as api.VpnTunnelsScopedListWarningData);
+  checkVpnTunnelsScopedListWarningData(
+      o[1] as api.VpnTunnelsScopedListWarningData);
 }
 
 core.int buildCounterVpnTunnelsScopedListWarning = 0;
@@ -27494,7 +27888,8 @@
   buildCounterVpnTunnelsScopedList++;
   if (buildCounterVpnTunnelsScopedList < 3) {
     checkUnnamed1151(o.vpnTunnels);
-    checkVpnTunnelsScopedListWarning(o.warning);
+    checkVpnTunnelsScopedListWarning(
+        o.warning as api.VpnTunnelsScopedListWarning);
   }
   buildCounterVpnTunnelsScopedList--;
 }
@@ -27521,8 +27916,8 @@
 
 void checkUnnamed1154(core.List<api.WafExpressionSetExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWafExpressionSetExpression(o[0]);
-  checkWafExpressionSetExpression(o[1]);
+  checkWafExpressionSetExpression(o[0] as api.WafExpressionSetExpression);
+  checkWafExpressionSetExpression(o[1] as api.WafExpressionSetExpression);
 }
 
 core.int buildCounterWafExpressionSet = 0;
@@ -27584,7 +27979,7 @@
   buildCounterWeightedBackendService++;
   if (buildCounterWeightedBackendService < 3) {
     unittest.expect(o.backendService, unittest.equals('foo'));
-    checkHttpHeaderAction(o.headerAction);
+    checkHttpHeaderAction(o.headerAction as api.HttpHeaderAction);
     unittest.expect(o.weight, unittest.equals(42));
   }
   buildCounterWeightedBackendService--;
@@ -27599,8 +27994,8 @@
 
 void checkUnnamed1155(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProject(o[0]);
-  checkProject(o[1]);
+  checkProject(o[0] as api.Project);
+  checkProject(o[1] as api.Project);
 }
 
 core.int buildCounterXpnHostListWarningData = 0;
@@ -27633,8 +28028,8 @@
 
 void checkUnnamed1156(core.List<api.XpnHostListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkXpnHostListWarningData(o[0]);
-  checkXpnHostListWarningData(o[1]);
+  checkXpnHostListWarningData(o[0] as api.XpnHostListWarningData);
+  checkXpnHostListWarningData(o[1] as api.XpnHostListWarningData);
 }
 
 core.int buildCounterXpnHostListWarning = 0;
@@ -27684,7 +28079,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkXpnHostListWarning(o.warning);
+    checkXpnHostListWarning(o.warning as api.XpnHostListWarning);
   }
   buildCounterXpnHostList--;
 }
@@ -27748,7 +28143,7 @@
   if (buildCounterZone < 3) {
     checkUnnamed1157(o.availableCpuPlatforms);
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
-    checkDeprecationStatus(o.deprecated);
+    checkDeprecationStatus(o.deprecated as api.DeprecationStatus);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -27769,8 +28164,8 @@
 
 void checkUnnamed1158(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkZone(o[0]);
-  checkZone(o[1]);
+  checkZone(o[0] as api.Zone);
+  checkZone(o[1] as api.Zone);
 }
 
 core.int buildCounterZoneListWarningData = 0;
@@ -27803,8 +28198,8 @@
 
 void checkUnnamed1159(core.List<api.ZoneListWarningData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkZoneListWarningData(o[0]);
-  checkZoneListWarningData(o[1]);
+  checkZoneListWarningData(o[0] as api.ZoneListWarningData);
+  checkZoneListWarningData(o[1] as api.ZoneListWarningData);
 }
 
 core.int buildCounterZoneListWarning = 0;
@@ -27854,7 +28249,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkZoneListWarning(o.warning);
+    checkZoneListWarning(o.warning as api.ZoneListWarning);
   }
   buildCounterZoneList--;
 }
@@ -27902,8 +28297,8 @@
 
 void checkUnnamed1161(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterZoneSetPolicyRequest = 0;
@@ -27924,7 +28319,7 @@
   if (buildCounterZoneSetPolicyRequest < 3) {
     checkUnnamed1161(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterZoneSetPolicyRequest--;
 }
@@ -27934,7 +28329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorConfig();
       var od = api.AcceleratorConfig.fromJson(o.toJson());
-      checkAcceleratorConfig(od);
+      checkAcceleratorConfig(od as api.AcceleratorConfig);
     });
   });
 
@@ -27942,7 +28337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorType();
       var od = api.AcceleratorType.fromJson(o.toJson());
-      checkAcceleratorType(od);
+      checkAcceleratorType(od as api.AcceleratorType);
     });
   });
 
@@ -27951,7 +28346,8 @@
       var o = buildAcceleratorTypeAggregatedListWarningData();
       var od =
           api.AcceleratorTypeAggregatedListWarningData.fromJson(o.toJson());
-      checkAcceleratorTypeAggregatedListWarningData(od);
+      checkAcceleratorTypeAggregatedListWarningData(
+          od as api.AcceleratorTypeAggregatedListWarningData);
     });
   });
 
@@ -27959,7 +28355,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypeAggregatedListWarning();
       var od = api.AcceleratorTypeAggregatedListWarning.fromJson(o.toJson());
-      checkAcceleratorTypeAggregatedListWarning(od);
+      checkAcceleratorTypeAggregatedListWarning(
+          od as api.AcceleratorTypeAggregatedListWarning);
     });
   });
 
@@ -27967,7 +28364,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypeAggregatedList();
       var od = api.AcceleratorTypeAggregatedList.fromJson(o.toJson());
-      checkAcceleratorTypeAggregatedList(od);
+      checkAcceleratorTypeAggregatedList(
+          od as api.AcceleratorTypeAggregatedList);
     });
   });
 
@@ -27975,7 +28373,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypeListWarningData();
       var od = api.AcceleratorTypeListWarningData.fromJson(o.toJson());
-      checkAcceleratorTypeListWarningData(od);
+      checkAcceleratorTypeListWarningData(
+          od as api.AcceleratorTypeListWarningData);
     });
   });
 
@@ -27983,7 +28382,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypeListWarning();
       var od = api.AcceleratorTypeListWarning.fromJson(o.toJson());
-      checkAcceleratorTypeListWarning(od);
+      checkAcceleratorTypeListWarning(od as api.AcceleratorTypeListWarning);
     });
   });
 
@@ -27991,7 +28390,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypeList();
       var od = api.AcceleratorTypeList.fromJson(o.toJson());
-      checkAcceleratorTypeList(od);
+      checkAcceleratorTypeList(od as api.AcceleratorTypeList);
     });
   });
 
@@ -27999,7 +28398,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypesScopedListWarningData();
       var od = api.AcceleratorTypesScopedListWarningData.fromJson(o.toJson());
-      checkAcceleratorTypesScopedListWarningData(od);
+      checkAcceleratorTypesScopedListWarningData(
+          od as api.AcceleratorTypesScopedListWarningData);
     });
   });
 
@@ -28007,7 +28407,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypesScopedListWarning();
       var od = api.AcceleratorTypesScopedListWarning.fromJson(o.toJson());
-      checkAcceleratorTypesScopedListWarning(od);
+      checkAcceleratorTypesScopedListWarning(
+          od as api.AcceleratorTypesScopedListWarning);
     });
   });
 
@@ -28015,7 +28416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorTypesScopedList();
       var od = api.AcceleratorTypesScopedList.fromJson(o.toJson());
-      checkAcceleratorTypesScopedList(od);
+      checkAcceleratorTypesScopedList(od as api.AcceleratorTypesScopedList);
     });
   });
 
@@ -28023,7 +28424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessConfig();
       var od = api.AccessConfig.fromJson(o.toJson());
-      checkAccessConfig(od);
+      checkAccessConfig(od as api.AccessConfig);
     });
   });
 
@@ -28031,7 +28432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddress();
       var od = api.Address.fromJson(o.toJson());
-      checkAddress(od);
+      checkAddress(od as api.Address);
     });
   });
 
@@ -28039,7 +28440,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressAggregatedListWarningData();
       var od = api.AddressAggregatedListWarningData.fromJson(o.toJson());
-      checkAddressAggregatedListWarningData(od);
+      checkAddressAggregatedListWarningData(
+          od as api.AddressAggregatedListWarningData);
     });
   });
 
@@ -28047,7 +28449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressAggregatedListWarning();
       var od = api.AddressAggregatedListWarning.fromJson(o.toJson());
-      checkAddressAggregatedListWarning(od);
+      checkAddressAggregatedListWarning(od as api.AddressAggregatedListWarning);
     });
   });
 
@@ -28055,7 +28457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressAggregatedList();
       var od = api.AddressAggregatedList.fromJson(o.toJson());
-      checkAddressAggregatedList(od);
+      checkAddressAggregatedList(od as api.AddressAggregatedList);
     });
   });
 
@@ -28063,7 +28465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressListWarningData();
       var od = api.AddressListWarningData.fromJson(o.toJson());
-      checkAddressListWarningData(od);
+      checkAddressListWarningData(od as api.AddressListWarningData);
     });
   });
 
@@ -28071,7 +28473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressListWarning();
       var od = api.AddressListWarning.fromJson(o.toJson());
-      checkAddressListWarning(od);
+      checkAddressListWarning(od as api.AddressListWarning);
     });
   });
 
@@ -28079,7 +28481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressList();
       var od = api.AddressList.fromJson(o.toJson());
-      checkAddressList(od);
+      checkAddressList(od as api.AddressList);
     });
   });
 
@@ -28087,7 +28489,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressesScopedListWarningData();
       var od = api.AddressesScopedListWarningData.fromJson(o.toJson());
-      checkAddressesScopedListWarningData(od);
+      checkAddressesScopedListWarningData(
+          od as api.AddressesScopedListWarningData);
     });
   });
 
@@ -28095,7 +28498,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressesScopedListWarning();
       var od = api.AddressesScopedListWarning.fromJson(o.toJson());
-      checkAddressesScopedListWarning(od);
+      checkAddressesScopedListWarning(od as api.AddressesScopedListWarning);
     });
   });
 
@@ -28103,7 +28506,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressesScopedList();
       var od = api.AddressesScopedList.fromJson(o.toJson());
-      checkAddressesScopedList(od);
+      checkAddressesScopedList(od as api.AddressesScopedList);
     });
   });
 
@@ -28111,7 +28514,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAliasIpRange();
       var od = api.AliasIpRange.fromJson(o.toJson());
-      checkAliasIpRange(od);
+      checkAliasIpRange(od as api.AliasIpRange);
     });
   });
 
@@ -28125,7 +28528,8 @@
           api.AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk
               .fromJson(o.toJson());
       checkAllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk(
-          od);
+          od as api
+              .AllocationSpecificSKUAllocationAllocatedInstancePropertiesReservedDisk);
     });
   });
 
@@ -28136,7 +28540,8 @@
       var o = buildAllocationSpecificSKUAllocationReservedInstanceProperties();
       var od = api.AllocationSpecificSKUAllocationReservedInstanceProperties
           .fromJson(o.toJson());
-      checkAllocationSpecificSKUAllocationReservedInstanceProperties(od);
+      checkAllocationSpecificSKUAllocationReservedInstanceProperties(
+          od as api.AllocationSpecificSKUAllocationReservedInstanceProperties);
     });
   });
 
@@ -28144,7 +28549,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAllocationSpecificSKUReservation();
       var od = api.AllocationSpecificSKUReservation.fromJson(o.toJson());
-      checkAllocationSpecificSKUReservation(od);
+      checkAllocationSpecificSKUReservation(
+          od as api.AllocationSpecificSKUReservation);
     });
   });
 
@@ -28152,7 +28558,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttachedDisk();
       var od = api.AttachedDisk.fromJson(o.toJson());
-      checkAttachedDisk(od);
+      checkAttachedDisk(od as api.AttachedDisk);
     });
   });
 
@@ -28160,7 +28566,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttachedDiskInitializeParams();
       var od = api.AttachedDiskInitializeParams.fromJson(o.toJson());
-      checkAttachedDiskInitializeParams(od);
+      checkAttachedDiskInitializeParams(od as api.AttachedDiskInitializeParams);
     });
   });
 
@@ -28168,7 +28574,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -28176,7 +28582,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -28184,7 +28590,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizationLoggingOptions();
       var od = api.AuthorizationLoggingOptions.fromJson(o.toJson());
-      checkAuthorizationLoggingOptions(od);
+      checkAuthorizationLoggingOptions(od as api.AuthorizationLoggingOptions);
     });
   });
 
@@ -28192,7 +28598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscaler();
       var od = api.Autoscaler.fromJson(o.toJson());
-      checkAutoscaler(od);
+      checkAutoscaler(od as api.Autoscaler);
     });
   });
 
@@ -28200,7 +28606,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalerAggregatedListWarningData();
       var od = api.AutoscalerAggregatedListWarningData.fromJson(o.toJson());
-      checkAutoscalerAggregatedListWarningData(od);
+      checkAutoscalerAggregatedListWarningData(
+          od as api.AutoscalerAggregatedListWarningData);
     });
   });
 
@@ -28208,7 +28615,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalerAggregatedListWarning();
       var od = api.AutoscalerAggregatedListWarning.fromJson(o.toJson());
-      checkAutoscalerAggregatedListWarning(od);
+      checkAutoscalerAggregatedListWarning(
+          od as api.AutoscalerAggregatedListWarning);
     });
   });
 
@@ -28216,7 +28624,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalerAggregatedList();
       var od = api.AutoscalerAggregatedList.fromJson(o.toJson());
-      checkAutoscalerAggregatedList(od);
+      checkAutoscalerAggregatedList(od as api.AutoscalerAggregatedList);
     });
   });
 
@@ -28224,7 +28632,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalerListWarningData();
       var od = api.AutoscalerListWarningData.fromJson(o.toJson());
-      checkAutoscalerListWarningData(od);
+      checkAutoscalerListWarningData(od as api.AutoscalerListWarningData);
     });
   });
 
@@ -28232,7 +28640,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalerListWarning();
       var od = api.AutoscalerListWarning.fromJson(o.toJson());
-      checkAutoscalerListWarning(od);
+      checkAutoscalerListWarning(od as api.AutoscalerListWarning);
     });
   });
 
@@ -28240,7 +28648,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalerList();
       var od = api.AutoscalerList.fromJson(o.toJson());
-      checkAutoscalerList(od);
+      checkAutoscalerList(od as api.AutoscalerList);
     });
   });
 
@@ -28248,7 +28656,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalerStatusDetails();
       var od = api.AutoscalerStatusDetails.fromJson(o.toJson());
-      checkAutoscalerStatusDetails(od);
+      checkAutoscalerStatusDetails(od as api.AutoscalerStatusDetails);
     });
   });
 
@@ -28256,7 +28664,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalersScopedListWarningData();
       var od = api.AutoscalersScopedListWarningData.fromJson(o.toJson());
-      checkAutoscalersScopedListWarningData(od);
+      checkAutoscalersScopedListWarningData(
+          od as api.AutoscalersScopedListWarningData);
     });
   });
 
@@ -28264,7 +28673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalersScopedListWarning();
       var od = api.AutoscalersScopedListWarning.fromJson(o.toJson());
-      checkAutoscalersScopedListWarning(od);
+      checkAutoscalersScopedListWarning(od as api.AutoscalersScopedListWarning);
     });
   });
 
@@ -28272,7 +28681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalersScopedList();
       var od = api.AutoscalersScopedList.fromJson(o.toJson());
-      checkAutoscalersScopedList(od);
+      checkAutoscalersScopedList(od as api.AutoscalersScopedList);
     });
   });
 
@@ -28280,7 +28689,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalingPolicy();
       var od = api.AutoscalingPolicy.fromJson(o.toJson());
-      checkAutoscalingPolicy(od);
+      checkAutoscalingPolicy(od as api.AutoscalingPolicy);
     });
   });
 
@@ -28288,7 +28697,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalingPolicyCpuUtilization();
       var od = api.AutoscalingPolicyCpuUtilization.fromJson(o.toJson());
-      checkAutoscalingPolicyCpuUtilization(od);
+      checkAutoscalingPolicyCpuUtilization(
+          od as api.AutoscalingPolicyCpuUtilization);
     });
   });
 
@@ -28297,7 +28707,8 @@
       var o = buildAutoscalingPolicyCustomMetricUtilization();
       var od =
           api.AutoscalingPolicyCustomMetricUtilization.fromJson(o.toJson());
-      checkAutoscalingPolicyCustomMetricUtilization(od);
+      checkAutoscalingPolicyCustomMetricUtilization(
+          od as api.AutoscalingPolicyCustomMetricUtilization);
     });
   });
 
@@ -28306,7 +28717,8 @@
       var o = buildAutoscalingPolicyLoadBalancingUtilization();
       var od =
           api.AutoscalingPolicyLoadBalancingUtilization.fromJson(o.toJson());
-      checkAutoscalingPolicyLoadBalancingUtilization(od);
+      checkAutoscalingPolicyLoadBalancingUtilization(
+          od as api.AutoscalingPolicyLoadBalancingUtilization);
     });
   });
 
@@ -28314,7 +28726,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalingPolicyScaleInControl();
       var od = api.AutoscalingPolicyScaleInControl.fromJson(o.toJson());
-      checkAutoscalingPolicyScaleInControl(od);
+      checkAutoscalingPolicyScaleInControl(
+          od as api.AutoscalingPolicyScaleInControl);
     });
   });
 
@@ -28322,7 +28735,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackend();
       var od = api.Backend.fromJson(o.toJson());
-      checkBackend(od);
+      checkBackend(od as api.Backend);
     });
   });
 
@@ -28330,7 +28743,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendBucket();
       var od = api.BackendBucket.fromJson(o.toJson());
-      checkBackendBucket(od);
+      checkBackendBucket(od as api.BackendBucket);
     });
   });
 
@@ -28338,7 +28751,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendBucketCdnPolicy();
       var od = api.BackendBucketCdnPolicy.fromJson(o.toJson());
-      checkBackendBucketCdnPolicy(od);
+      checkBackendBucketCdnPolicy(od as api.BackendBucketCdnPolicy);
     });
   });
 
@@ -28346,7 +28759,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendBucketListWarningData();
       var od = api.BackendBucketListWarningData.fromJson(o.toJson());
-      checkBackendBucketListWarningData(od);
+      checkBackendBucketListWarningData(od as api.BackendBucketListWarningData);
     });
   });
 
@@ -28354,7 +28767,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendBucketListWarning();
       var od = api.BackendBucketListWarning.fromJson(o.toJson());
-      checkBackendBucketListWarning(od);
+      checkBackendBucketListWarning(od as api.BackendBucketListWarning);
     });
   });
 
@@ -28362,7 +28775,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendBucketList();
       var od = api.BackendBucketList.fromJson(o.toJson());
-      checkBackendBucketList(od);
+      checkBackendBucketList(od as api.BackendBucketList);
     });
   });
 
@@ -28370,7 +28783,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendService();
       var od = api.BackendService.fromJson(o.toJson());
-      checkBackendService(od);
+      checkBackendService(od as api.BackendService);
     });
   });
 
@@ -28378,7 +28791,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceAggregatedListWarningData();
       var od = api.BackendServiceAggregatedListWarningData.fromJson(o.toJson());
-      checkBackendServiceAggregatedListWarningData(od);
+      checkBackendServiceAggregatedListWarningData(
+          od as api.BackendServiceAggregatedListWarningData);
     });
   });
 
@@ -28386,7 +28800,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceAggregatedListWarning();
       var od = api.BackendServiceAggregatedListWarning.fromJson(o.toJson());
-      checkBackendServiceAggregatedListWarning(od);
+      checkBackendServiceAggregatedListWarning(
+          od as api.BackendServiceAggregatedListWarning);
     });
   });
 
@@ -28394,7 +28809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceAggregatedList();
       var od = api.BackendServiceAggregatedList.fromJson(o.toJson());
-      checkBackendServiceAggregatedList(od);
+      checkBackendServiceAggregatedList(od as api.BackendServiceAggregatedList);
     });
   });
 
@@ -28402,7 +28817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceCdnPolicy();
       var od = api.BackendServiceCdnPolicy.fromJson(o.toJson());
-      checkBackendServiceCdnPolicy(od);
+      checkBackendServiceCdnPolicy(od as api.BackendServiceCdnPolicy);
     });
   });
 
@@ -28410,7 +28825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceFailoverPolicy();
       var od = api.BackendServiceFailoverPolicy.fromJson(o.toJson());
-      checkBackendServiceFailoverPolicy(od);
+      checkBackendServiceFailoverPolicy(od as api.BackendServiceFailoverPolicy);
     });
   });
 
@@ -28418,7 +28833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceGroupHealth();
       var od = api.BackendServiceGroupHealth.fromJson(o.toJson());
-      checkBackendServiceGroupHealth(od);
+      checkBackendServiceGroupHealth(od as api.BackendServiceGroupHealth);
     });
   });
 
@@ -28426,7 +28841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceIAP();
       var od = api.BackendServiceIAP.fromJson(o.toJson());
-      checkBackendServiceIAP(od);
+      checkBackendServiceIAP(od as api.BackendServiceIAP);
     });
   });
 
@@ -28434,7 +28849,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceListWarningData();
       var od = api.BackendServiceListWarningData.fromJson(o.toJson());
-      checkBackendServiceListWarningData(od);
+      checkBackendServiceListWarningData(
+          od as api.BackendServiceListWarningData);
     });
   });
 
@@ -28442,7 +28858,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceListWarning();
       var od = api.BackendServiceListWarning.fromJson(o.toJson());
-      checkBackendServiceListWarning(od);
+      checkBackendServiceListWarning(od as api.BackendServiceListWarning);
     });
   });
 
@@ -28450,7 +28866,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceList();
       var od = api.BackendServiceList.fromJson(o.toJson());
-      checkBackendServiceList(od);
+      checkBackendServiceList(od as api.BackendServiceList);
     });
   });
 
@@ -28458,7 +28874,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceLogConfig();
       var od = api.BackendServiceLogConfig.fromJson(o.toJson());
-      checkBackendServiceLogConfig(od);
+      checkBackendServiceLogConfig(od as api.BackendServiceLogConfig);
     });
   });
 
@@ -28466,7 +28882,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServiceReference();
       var od = api.BackendServiceReference.fromJson(o.toJson());
-      checkBackendServiceReference(od);
+      checkBackendServiceReference(od as api.BackendServiceReference);
     });
   });
 
@@ -28474,7 +28890,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServicesScopedListWarningData();
       var od = api.BackendServicesScopedListWarningData.fromJson(o.toJson());
-      checkBackendServicesScopedListWarningData(od);
+      checkBackendServicesScopedListWarningData(
+          od as api.BackendServicesScopedListWarningData);
     });
   });
 
@@ -28482,7 +28899,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServicesScopedListWarning();
       var od = api.BackendServicesScopedListWarning.fromJson(o.toJson());
-      checkBackendServicesScopedListWarning(od);
+      checkBackendServicesScopedListWarning(
+          od as api.BackendServicesScopedListWarning);
     });
   });
 
@@ -28490,7 +28908,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendServicesScopedList();
       var od = api.BackendServicesScopedList.fromJson(o.toJson());
-      checkBackendServicesScopedList(od);
+      checkBackendServicesScopedList(od as api.BackendServicesScopedList);
     });
   });
 
@@ -28498,7 +28916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -28506,7 +28924,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCacheInvalidationRule();
       var od = api.CacheInvalidationRule.fromJson(o.toJson());
-      checkCacheInvalidationRule(od);
+      checkCacheInvalidationRule(od as api.CacheInvalidationRule);
     });
   });
 
@@ -28514,7 +28932,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCacheKeyPolicy();
       var od = api.CacheKeyPolicy.fromJson(o.toJson());
-      checkCacheKeyPolicy(od);
+      checkCacheKeyPolicy(od as api.CacheKeyPolicy);
     });
   });
 
@@ -28522,7 +28940,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCircuitBreakers();
       var od = api.CircuitBreakers.fromJson(o.toJson());
-      checkCircuitBreakers(od);
+      checkCircuitBreakers(od as api.CircuitBreakers);
     });
   });
 
@@ -28530,7 +28948,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitment();
       var od = api.Commitment.fromJson(o.toJson());
-      checkCommitment(od);
+      checkCommitment(od as api.Commitment);
     });
   });
 
@@ -28538,7 +28956,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentAggregatedListWarningData();
       var od = api.CommitmentAggregatedListWarningData.fromJson(o.toJson());
-      checkCommitmentAggregatedListWarningData(od);
+      checkCommitmentAggregatedListWarningData(
+          od as api.CommitmentAggregatedListWarningData);
     });
   });
 
@@ -28546,7 +28965,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentAggregatedListWarning();
       var od = api.CommitmentAggregatedListWarning.fromJson(o.toJson());
-      checkCommitmentAggregatedListWarning(od);
+      checkCommitmentAggregatedListWarning(
+          od as api.CommitmentAggregatedListWarning);
     });
   });
 
@@ -28554,7 +28974,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentAggregatedList();
       var od = api.CommitmentAggregatedList.fromJson(o.toJson());
-      checkCommitmentAggregatedList(od);
+      checkCommitmentAggregatedList(od as api.CommitmentAggregatedList);
     });
   });
 
@@ -28562,7 +28982,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentListWarningData();
       var od = api.CommitmentListWarningData.fromJson(o.toJson());
-      checkCommitmentListWarningData(od);
+      checkCommitmentListWarningData(od as api.CommitmentListWarningData);
     });
   });
 
@@ -28570,7 +28990,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentListWarning();
       var od = api.CommitmentListWarning.fromJson(o.toJson());
-      checkCommitmentListWarning(od);
+      checkCommitmentListWarning(od as api.CommitmentListWarning);
     });
   });
 
@@ -28578,7 +28998,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentList();
       var od = api.CommitmentList.fromJson(o.toJson());
-      checkCommitmentList(od);
+      checkCommitmentList(od as api.CommitmentList);
     });
   });
 
@@ -28586,7 +29006,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentsScopedListWarningData();
       var od = api.CommitmentsScopedListWarningData.fromJson(o.toJson());
-      checkCommitmentsScopedListWarningData(od);
+      checkCommitmentsScopedListWarningData(
+          od as api.CommitmentsScopedListWarningData);
     });
   });
 
@@ -28594,7 +29015,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentsScopedListWarning();
       var od = api.CommitmentsScopedListWarning.fromJson(o.toJson());
-      checkCommitmentsScopedListWarning(od);
+      checkCommitmentsScopedListWarning(od as api.CommitmentsScopedListWarning);
     });
   });
 
@@ -28602,7 +29023,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitmentsScopedList();
       var od = api.CommitmentsScopedList.fromJson(o.toJson());
-      checkCommitmentsScopedList(od);
+      checkCommitmentsScopedList(od as api.CommitmentsScopedList);
     });
   });
 
@@ -28610,7 +29031,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCondition();
       var od = api.Condition.fromJson(o.toJson());
-      checkCondition(od);
+      checkCondition(od as api.Condition);
     });
   });
 
@@ -28618,7 +29039,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfidentialInstanceConfig();
       var od = api.ConfidentialInstanceConfig.fromJson(o.toJson());
-      checkConfidentialInstanceConfig(od);
+      checkConfidentialInstanceConfig(od as api.ConfidentialInstanceConfig);
     });
   });
 
@@ -28626,7 +29047,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConnectionDraining();
       var od = api.ConnectionDraining.fromJson(o.toJson());
-      checkConnectionDraining(od);
+      checkConnectionDraining(od as api.ConnectionDraining);
     });
   });
 
@@ -28634,7 +29055,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildConsistentHashLoadBalancerSettings();
       var od = api.ConsistentHashLoadBalancerSettings.fromJson(o.toJson());
-      checkConsistentHashLoadBalancerSettings(od);
+      checkConsistentHashLoadBalancerSettings(
+          od as api.ConsistentHashLoadBalancerSettings);
     });
   });
 
@@ -28643,7 +29065,8 @@
       var o = buildConsistentHashLoadBalancerSettingsHttpCookie();
       var od =
           api.ConsistentHashLoadBalancerSettingsHttpCookie.fromJson(o.toJson());
-      checkConsistentHashLoadBalancerSettingsHttpCookie(od);
+      checkConsistentHashLoadBalancerSettingsHttpCookie(
+          od as api.ConsistentHashLoadBalancerSettingsHttpCookie);
     });
   });
 
@@ -28651,7 +29074,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCorsPolicy();
       var od = api.CorsPolicy.fromJson(o.toJson());
-      checkCorsPolicy(od);
+      checkCorsPolicy(od as api.CorsPolicy);
     });
   });
 
@@ -28659,7 +29082,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerEncryptionKey();
       var od = api.CustomerEncryptionKey.fromJson(o.toJson());
-      checkCustomerEncryptionKey(od);
+      checkCustomerEncryptionKey(od as api.CustomerEncryptionKey);
     });
   });
 
@@ -28667,7 +29090,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerEncryptionKeyProtectedDisk();
       var od = api.CustomerEncryptionKeyProtectedDisk.fromJson(o.toJson());
-      checkCustomerEncryptionKeyProtectedDisk(od);
+      checkCustomerEncryptionKeyProtectedDisk(
+          od as api.CustomerEncryptionKeyProtectedDisk);
     });
   });
 
@@ -28675,7 +29099,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeprecationStatus();
       var od = api.DeprecationStatus.fromJson(o.toJson());
-      checkDeprecationStatus(od);
+      checkDeprecationStatus(od as api.DeprecationStatus);
     });
   });
 
@@ -28683,7 +29107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisk();
       var od = api.Disk.fromJson(o.toJson());
-      checkDisk(od);
+      checkDisk(od as api.Disk);
     });
   });
 
@@ -28691,7 +29115,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskAggregatedListWarningData();
       var od = api.DiskAggregatedListWarningData.fromJson(o.toJson());
-      checkDiskAggregatedListWarningData(od);
+      checkDiskAggregatedListWarningData(
+          od as api.DiskAggregatedListWarningData);
     });
   });
 
@@ -28699,7 +29124,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskAggregatedListWarning();
       var od = api.DiskAggregatedListWarning.fromJson(o.toJson());
-      checkDiskAggregatedListWarning(od);
+      checkDiskAggregatedListWarning(od as api.DiskAggregatedListWarning);
     });
   });
 
@@ -28707,7 +29132,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskAggregatedList();
       var od = api.DiskAggregatedList.fromJson(o.toJson());
-      checkDiskAggregatedList(od);
+      checkDiskAggregatedList(od as api.DiskAggregatedList);
     });
   });
 
@@ -28715,7 +29140,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskInstantiationConfig();
       var od = api.DiskInstantiationConfig.fromJson(o.toJson());
-      checkDiskInstantiationConfig(od);
+      checkDiskInstantiationConfig(od as api.DiskInstantiationConfig);
     });
   });
 
@@ -28723,7 +29148,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskListWarningData();
       var od = api.DiskListWarningData.fromJson(o.toJson());
-      checkDiskListWarningData(od);
+      checkDiskListWarningData(od as api.DiskListWarningData);
     });
   });
 
@@ -28731,7 +29156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskListWarning();
       var od = api.DiskListWarning.fromJson(o.toJson());
-      checkDiskListWarning(od);
+      checkDiskListWarning(od as api.DiskListWarning);
     });
   });
 
@@ -28739,7 +29164,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskList();
       var od = api.DiskList.fromJson(o.toJson());
-      checkDiskList(od);
+      checkDiskList(od as api.DiskList);
     });
   });
 
@@ -28747,7 +29172,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskMoveRequest();
       var od = api.DiskMoveRequest.fromJson(o.toJson());
-      checkDiskMoveRequest(od);
+      checkDiskMoveRequest(od as api.DiskMoveRequest);
     });
   });
 
@@ -28755,7 +29180,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskType();
       var od = api.DiskType.fromJson(o.toJson());
-      checkDiskType(od);
+      checkDiskType(od as api.DiskType);
     });
   });
 
@@ -28763,7 +29188,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypeAggregatedListWarningData();
       var od = api.DiskTypeAggregatedListWarningData.fromJson(o.toJson());
-      checkDiskTypeAggregatedListWarningData(od);
+      checkDiskTypeAggregatedListWarningData(
+          od as api.DiskTypeAggregatedListWarningData);
     });
   });
 
@@ -28771,7 +29197,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypeAggregatedListWarning();
       var od = api.DiskTypeAggregatedListWarning.fromJson(o.toJson());
-      checkDiskTypeAggregatedListWarning(od);
+      checkDiskTypeAggregatedListWarning(
+          od as api.DiskTypeAggregatedListWarning);
     });
   });
 
@@ -28779,7 +29206,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypeAggregatedList();
       var od = api.DiskTypeAggregatedList.fromJson(o.toJson());
-      checkDiskTypeAggregatedList(od);
+      checkDiskTypeAggregatedList(od as api.DiskTypeAggregatedList);
     });
   });
 
@@ -28787,7 +29214,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypeListWarningData();
       var od = api.DiskTypeListWarningData.fromJson(o.toJson());
-      checkDiskTypeListWarningData(od);
+      checkDiskTypeListWarningData(od as api.DiskTypeListWarningData);
     });
   });
 
@@ -28795,7 +29222,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypeListWarning();
       var od = api.DiskTypeListWarning.fromJson(o.toJson());
-      checkDiskTypeListWarning(od);
+      checkDiskTypeListWarning(od as api.DiskTypeListWarning);
     });
   });
 
@@ -28803,7 +29230,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypeList();
       var od = api.DiskTypeList.fromJson(o.toJson());
-      checkDiskTypeList(od);
+      checkDiskTypeList(od as api.DiskTypeList);
     });
   });
 
@@ -28811,7 +29238,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypesScopedListWarningData();
       var od = api.DiskTypesScopedListWarningData.fromJson(o.toJson());
-      checkDiskTypesScopedListWarningData(od);
+      checkDiskTypesScopedListWarningData(
+          od as api.DiskTypesScopedListWarningData);
     });
   });
 
@@ -28819,7 +29247,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypesScopedListWarning();
       var od = api.DiskTypesScopedListWarning.fromJson(o.toJson());
-      checkDiskTypesScopedListWarning(od);
+      checkDiskTypesScopedListWarning(od as api.DiskTypesScopedListWarning);
     });
   });
 
@@ -28827,7 +29255,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskTypesScopedList();
       var od = api.DiskTypesScopedList.fromJson(o.toJson());
-      checkDiskTypesScopedList(od);
+      checkDiskTypesScopedList(od as api.DiskTypesScopedList);
     });
   });
 
@@ -28835,7 +29263,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisksAddResourcePoliciesRequest();
       var od = api.DisksAddResourcePoliciesRequest.fromJson(o.toJson());
-      checkDisksAddResourcePoliciesRequest(od);
+      checkDisksAddResourcePoliciesRequest(
+          od as api.DisksAddResourcePoliciesRequest);
     });
   });
 
@@ -28843,7 +29272,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisksRemoveResourcePoliciesRequest();
       var od = api.DisksRemoveResourcePoliciesRequest.fromJson(o.toJson());
-      checkDisksRemoveResourcePoliciesRequest(od);
+      checkDisksRemoveResourcePoliciesRequest(
+          od as api.DisksRemoveResourcePoliciesRequest);
     });
   });
 
@@ -28851,7 +29281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisksResizeRequest();
       var od = api.DisksResizeRequest.fromJson(o.toJson());
-      checkDisksResizeRequest(od);
+      checkDisksResizeRequest(od as api.DisksResizeRequest);
     });
   });
 
@@ -28859,7 +29289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisksScopedListWarningData();
       var od = api.DisksScopedListWarningData.fromJson(o.toJson());
-      checkDisksScopedListWarningData(od);
+      checkDisksScopedListWarningData(od as api.DisksScopedListWarningData);
     });
   });
 
@@ -28867,7 +29297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisksScopedListWarning();
       var od = api.DisksScopedListWarning.fromJson(o.toJson());
-      checkDisksScopedListWarning(od);
+      checkDisksScopedListWarning(od as api.DisksScopedListWarning);
     });
   });
 
@@ -28875,7 +29305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisksScopedList();
       var od = api.DisksScopedList.fromJson(o.toJson());
-      checkDisksScopedList(od);
+      checkDisksScopedList(od as api.DisksScopedList);
     });
   });
 
@@ -28883,7 +29313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisplayDevice();
       var od = api.DisplayDevice.fromJson(o.toJson());
-      checkDisplayDevice(od);
+      checkDisplayDevice(od as api.DisplayDevice);
     });
   });
 
@@ -28891,7 +29321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDistributionPolicy();
       var od = api.DistributionPolicy.fromJson(o.toJson());
-      checkDistributionPolicy(od);
+      checkDistributionPolicy(od as api.DistributionPolicy);
     });
   });
 
@@ -28899,7 +29329,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDistributionPolicyZoneConfiguration();
       var od = api.DistributionPolicyZoneConfiguration.fromJson(o.toJson());
-      checkDistributionPolicyZoneConfiguration(od);
+      checkDistributionPolicyZoneConfiguration(
+          od as api.DistributionPolicyZoneConfiguration);
     });
   });
 
@@ -28907,7 +29338,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDuration();
       var od = api.Duration.fromJson(o.toJson());
-      checkDuration(od);
+      checkDuration(od as api.Duration);
     });
   });
 
@@ -28915,7 +29346,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangedPeeringRoute();
       var od = api.ExchangedPeeringRoute.fromJson(o.toJson());
-      checkExchangedPeeringRoute(od);
+      checkExchangedPeeringRoute(od as api.ExchangedPeeringRoute);
     });
   });
 
@@ -28923,7 +29354,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangedPeeringRoutesListWarningData();
       var od = api.ExchangedPeeringRoutesListWarningData.fromJson(o.toJson());
-      checkExchangedPeeringRoutesListWarningData(od);
+      checkExchangedPeeringRoutesListWarningData(
+          od as api.ExchangedPeeringRoutesListWarningData);
     });
   });
 
@@ -28931,7 +29363,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangedPeeringRoutesListWarning();
       var od = api.ExchangedPeeringRoutesListWarning.fromJson(o.toJson());
-      checkExchangedPeeringRoutesListWarning(od);
+      checkExchangedPeeringRoutesListWarning(
+          od as api.ExchangedPeeringRoutesListWarning);
     });
   });
 
@@ -28939,7 +29372,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangedPeeringRoutesList();
       var od = api.ExchangedPeeringRoutesList.fromJson(o.toJson());
-      checkExchangedPeeringRoutesList(od);
+      checkExchangedPeeringRoutesList(od as api.ExchangedPeeringRoutesList);
     });
   });
 
@@ -28947,7 +29380,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -28955,7 +29388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalVpnGateway();
       var od = api.ExternalVpnGateway.fromJson(o.toJson());
-      checkExternalVpnGateway(od);
+      checkExternalVpnGateway(od as api.ExternalVpnGateway);
     });
   });
 
@@ -28963,7 +29396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalVpnGatewayInterface();
       var od = api.ExternalVpnGatewayInterface.fromJson(o.toJson());
-      checkExternalVpnGatewayInterface(od);
+      checkExternalVpnGatewayInterface(od as api.ExternalVpnGatewayInterface);
     });
   });
 
@@ -28971,7 +29404,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalVpnGatewayListWarningData();
       var od = api.ExternalVpnGatewayListWarningData.fromJson(o.toJson());
-      checkExternalVpnGatewayListWarningData(od);
+      checkExternalVpnGatewayListWarningData(
+          od as api.ExternalVpnGatewayListWarningData);
     });
   });
 
@@ -28979,7 +29413,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalVpnGatewayListWarning();
       var od = api.ExternalVpnGatewayListWarning.fromJson(o.toJson());
-      checkExternalVpnGatewayListWarning(od);
+      checkExternalVpnGatewayListWarning(
+          od as api.ExternalVpnGatewayListWarning);
     });
   });
 
@@ -28987,7 +29422,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalVpnGatewayList();
       var od = api.ExternalVpnGatewayList.fromJson(o.toJson());
-      checkExternalVpnGatewayList(od);
+      checkExternalVpnGatewayList(od as api.ExternalVpnGatewayList);
     });
   });
 
@@ -28995,7 +29430,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileContentBuffer();
       var od = api.FileContentBuffer.fromJson(o.toJson());
-      checkFileContentBuffer(od);
+      checkFileContentBuffer(od as api.FileContentBuffer);
     });
   });
 
@@ -29003,7 +29438,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallAllowed();
       var od = api.FirewallAllowed.fromJson(o.toJson());
-      checkFirewallAllowed(od);
+      checkFirewallAllowed(od as api.FirewallAllowed);
     });
   });
 
@@ -29011,7 +29446,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallDenied();
       var od = api.FirewallDenied.fromJson(o.toJson());
-      checkFirewallDenied(od);
+      checkFirewallDenied(od as api.FirewallDenied);
     });
   });
 
@@ -29019,7 +29454,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewall();
       var od = api.Firewall.fromJson(o.toJson());
-      checkFirewall(od);
+      checkFirewall(od as api.Firewall);
     });
   });
 
@@ -29027,7 +29462,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallListWarningData();
       var od = api.FirewallListWarningData.fromJson(o.toJson());
-      checkFirewallListWarningData(od);
+      checkFirewallListWarningData(od as api.FirewallListWarningData);
     });
   });
 
@@ -29035,7 +29470,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallListWarning();
       var od = api.FirewallListWarning.fromJson(o.toJson());
-      checkFirewallListWarning(od);
+      checkFirewallListWarning(od as api.FirewallListWarning);
     });
   });
 
@@ -29043,7 +29478,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallList();
       var od = api.FirewallList.fromJson(o.toJson());
-      checkFirewallList(od);
+      checkFirewallList(od as api.FirewallList);
     });
   });
 
@@ -29051,7 +29486,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallLogConfig();
       var od = api.FirewallLogConfig.fromJson(o.toJson());
-      checkFirewallLogConfig(od);
+      checkFirewallLogConfig(od as api.FirewallLogConfig);
     });
   });
 
@@ -29059,7 +29494,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFixedOrPercent();
       var od = api.FixedOrPercent.fromJson(o.toJson());
-      checkFixedOrPercent(od);
+      checkFixedOrPercent(od as api.FixedOrPercent);
     });
   });
 
@@ -29067,7 +29502,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRule();
       var od = api.ForwardingRule.fromJson(o.toJson());
-      checkForwardingRule(od);
+      checkForwardingRule(od as api.ForwardingRule);
     });
   });
 
@@ -29075,7 +29510,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleAggregatedListWarningData();
       var od = api.ForwardingRuleAggregatedListWarningData.fromJson(o.toJson());
-      checkForwardingRuleAggregatedListWarningData(od);
+      checkForwardingRuleAggregatedListWarningData(
+          od as api.ForwardingRuleAggregatedListWarningData);
     });
   });
 
@@ -29083,7 +29519,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleAggregatedListWarning();
       var od = api.ForwardingRuleAggregatedListWarning.fromJson(o.toJson());
-      checkForwardingRuleAggregatedListWarning(od);
+      checkForwardingRuleAggregatedListWarning(
+          od as api.ForwardingRuleAggregatedListWarning);
     });
   });
 
@@ -29091,7 +29528,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleAggregatedList();
       var od = api.ForwardingRuleAggregatedList.fromJson(o.toJson());
-      checkForwardingRuleAggregatedList(od);
+      checkForwardingRuleAggregatedList(od as api.ForwardingRuleAggregatedList);
     });
   });
 
@@ -29099,7 +29536,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleListWarningData();
       var od = api.ForwardingRuleListWarningData.fromJson(o.toJson());
-      checkForwardingRuleListWarningData(od);
+      checkForwardingRuleListWarningData(
+          od as api.ForwardingRuleListWarningData);
     });
   });
 
@@ -29107,7 +29545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleListWarning();
       var od = api.ForwardingRuleListWarning.fromJson(o.toJson());
-      checkForwardingRuleListWarning(od);
+      checkForwardingRuleListWarning(od as api.ForwardingRuleListWarning);
     });
   });
 
@@ -29115,7 +29553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleList();
       var od = api.ForwardingRuleList.fromJson(o.toJson());
-      checkForwardingRuleList(od);
+      checkForwardingRuleList(od as api.ForwardingRuleList);
     });
   });
 
@@ -29123,7 +29561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleReference();
       var od = api.ForwardingRuleReference.fromJson(o.toJson());
-      checkForwardingRuleReference(od);
+      checkForwardingRuleReference(od as api.ForwardingRuleReference);
     });
   });
 
@@ -29131,7 +29569,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRulesScopedListWarningData();
       var od = api.ForwardingRulesScopedListWarningData.fromJson(o.toJson());
-      checkForwardingRulesScopedListWarningData(od);
+      checkForwardingRulesScopedListWarningData(
+          od as api.ForwardingRulesScopedListWarningData);
     });
   });
 
@@ -29139,7 +29578,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRulesScopedListWarning();
       var od = api.ForwardingRulesScopedListWarning.fromJson(o.toJson());
-      checkForwardingRulesScopedListWarning(od);
+      checkForwardingRulesScopedListWarning(
+          od as api.ForwardingRulesScopedListWarning);
     });
   });
 
@@ -29147,7 +29587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRulesScopedList();
       var od = api.ForwardingRulesScopedList.fromJson(o.toJson());
-      checkForwardingRulesScopedList(od);
+      checkForwardingRulesScopedList(od as api.ForwardingRulesScopedList);
     });
   });
 
@@ -29155,7 +29595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGRPCHealthCheck();
       var od = api.GRPCHealthCheck.fromJson(o.toJson());
-      checkGRPCHealthCheck(od);
+      checkGRPCHealthCheck(od as api.GRPCHealthCheck);
     });
   });
 
@@ -29165,7 +29605,8 @@
       var o = buildGlobalNetworkEndpointGroupsAttachEndpointsRequest();
       var od = api.GlobalNetworkEndpointGroupsAttachEndpointsRequest.fromJson(
           o.toJson());
-      checkGlobalNetworkEndpointGroupsAttachEndpointsRequest(od);
+      checkGlobalNetworkEndpointGroupsAttachEndpointsRequest(
+          od as api.GlobalNetworkEndpointGroupsAttachEndpointsRequest);
     });
   });
 
@@ -29175,7 +29616,8 @@
       var o = buildGlobalNetworkEndpointGroupsDetachEndpointsRequest();
       var od = api.GlobalNetworkEndpointGroupsDetachEndpointsRequest.fromJson(
           o.toJson());
-      checkGlobalNetworkEndpointGroupsDetachEndpointsRequest(od);
+      checkGlobalNetworkEndpointGroupsDetachEndpointsRequest(
+          od as api.GlobalNetworkEndpointGroupsDetachEndpointsRequest);
     });
   });
 
@@ -29183,7 +29625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGlobalSetLabelsRequest();
       var od = api.GlobalSetLabelsRequest.fromJson(o.toJson());
-      checkGlobalSetLabelsRequest(od);
+      checkGlobalSetLabelsRequest(od as api.GlobalSetLabelsRequest);
     });
   });
 
@@ -29191,7 +29633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGlobalSetPolicyRequest();
       var od = api.GlobalSetPolicyRequest.fromJson(o.toJson());
-      checkGlobalSetPolicyRequest(od);
+      checkGlobalSetPolicyRequest(od as api.GlobalSetPolicyRequest);
     });
   });
 
@@ -29199,7 +29641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGuestAttributes();
       var od = api.GuestAttributes.fromJson(o.toJson());
-      checkGuestAttributes(od);
+      checkGuestAttributes(od as api.GuestAttributes);
     });
   });
 
@@ -29207,7 +29649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGuestAttributesEntry();
       var od = api.GuestAttributesEntry.fromJson(o.toJson());
-      checkGuestAttributesEntry(od);
+      checkGuestAttributesEntry(od as api.GuestAttributesEntry);
     });
   });
 
@@ -29215,7 +29657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGuestAttributesValue();
       var od = api.GuestAttributesValue.fromJson(o.toJson());
-      checkGuestAttributesValue(od);
+      checkGuestAttributesValue(od as api.GuestAttributesValue);
     });
   });
 
@@ -29223,7 +29665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGuestOsFeature();
       var od = api.GuestOsFeature.fromJson(o.toJson());
-      checkGuestOsFeature(od);
+      checkGuestOsFeature(od as api.GuestOsFeature);
     });
   });
 
@@ -29231,7 +29673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHTTP2HealthCheck();
       var od = api.HTTP2HealthCheck.fromJson(o.toJson());
-      checkHTTP2HealthCheck(od);
+      checkHTTP2HealthCheck(od as api.HTTP2HealthCheck);
     });
   });
 
@@ -29239,7 +29681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHTTPHealthCheck();
       var od = api.HTTPHealthCheck.fromJson(o.toJson());
-      checkHTTPHealthCheck(od);
+      checkHTTPHealthCheck(od as api.HTTPHealthCheck);
     });
   });
 
@@ -29247,7 +29689,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHTTPSHealthCheck();
       var od = api.HTTPSHealthCheck.fromJson(o.toJson());
-      checkHTTPSHealthCheck(od);
+      checkHTTPSHealthCheck(od as api.HTTPSHealthCheck);
     });
   });
 
@@ -29255,7 +29697,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheck();
       var od = api.HealthCheck.fromJson(o.toJson());
-      checkHealthCheck(od);
+      checkHealthCheck(od as api.HealthCheck);
     });
   });
 
@@ -29263,7 +29705,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckListWarningData();
       var od = api.HealthCheckListWarningData.fromJson(o.toJson());
-      checkHealthCheckListWarningData(od);
+      checkHealthCheckListWarningData(od as api.HealthCheckListWarningData);
     });
   });
 
@@ -29271,7 +29713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckListWarning();
       var od = api.HealthCheckListWarning.fromJson(o.toJson());
-      checkHealthCheckListWarning(od);
+      checkHealthCheckListWarning(od as api.HealthCheckListWarning);
     });
   });
 
@@ -29279,7 +29721,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckList();
       var od = api.HealthCheckList.fromJson(o.toJson());
-      checkHealthCheckList(od);
+      checkHealthCheckList(od as api.HealthCheckList);
     });
   });
 
@@ -29287,7 +29729,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckReference();
       var od = api.HealthCheckReference.fromJson(o.toJson());
-      checkHealthCheckReference(od);
+      checkHealthCheckReference(od as api.HealthCheckReference);
     });
   });
 
@@ -29295,7 +29737,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckService();
       var od = api.HealthCheckService.fromJson(o.toJson());
-      checkHealthCheckService(od);
+      checkHealthCheckService(od as api.HealthCheckService);
     });
   });
 
@@ -29303,7 +29745,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckServiceReference();
       var od = api.HealthCheckServiceReference.fromJson(o.toJson());
-      checkHealthCheckServiceReference(od);
+      checkHealthCheckServiceReference(od as api.HealthCheckServiceReference);
     });
   });
 
@@ -29311,7 +29753,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckServicesListWarningData();
       var od = api.HealthCheckServicesListWarningData.fromJson(o.toJson());
-      checkHealthCheckServicesListWarningData(od);
+      checkHealthCheckServicesListWarningData(
+          od as api.HealthCheckServicesListWarningData);
     });
   });
 
@@ -29319,7 +29762,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckServicesListWarning();
       var od = api.HealthCheckServicesListWarning.fromJson(o.toJson());
-      checkHealthCheckServicesListWarning(od);
+      checkHealthCheckServicesListWarning(
+          od as api.HealthCheckServicesListWarning);
     });
   });
 
@@ -29327,7 +29771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthCheckServicesList();
       var od = api.HealthCheckServicesList.fromJson(o.toJson());
-      checkHealthCheckServicesList(od);
+      checkHealthCheckServicesList(od as api.HealthCheckServicesList);
     });
   });
 
@@ -29335,7 +29779,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthChecksAggregatedListWarningData();
       var od = api.HealthChecksAggregatedListWarningData.fromJson(o.toJson());
-      checkHealthChecksAggregatedListWarningData(od);
+      checkHealthChecksAggregatedListWarningData(
+          od as api.HealthChecksAggregatedListWarningData);
     });
   });
 
@@ -29343,7 +29788,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthChecksAggregatedListWarning();
       var od = api.HealthChecksAggregatedListWarning.fromJson(o.toJson());
-      checkHealthChecksAggregatedListWarning(od);
+      checkHealthChecksAggregatedListWarning(
+          od as api.HealthChecksAggregatedListWarning);
     });
   });
 
@@ -29351,7 +29797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthChecksAggregatedList();
       var od = api.HealthChecksAggregatedList.fromJson(o.toJson());
-      checkHealthChecksAggregatedList(od);
+      checkHealthChecksAggregatedList(od as api.HealthChecksAggregatedList);
     });
   });
 
@@ -29359,7 +29805,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthChecksScopedListWarningData();
       var od = api.HealthChecksScopedListWarningData.fromJson(o.toJson());
-      checkHealthChecksScopedListWarningData(od);
+      checkHealthChecksScopedListWarningData(
+          od as api.HealthChecksScopedListWarningData);
     });
   });
 
@@ -29367,7 +29814,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthChecksScopedListWarning();
       var od = api.HealthChecksScopedListWarning.fromJson(o.toJson());
-      checkHealthChecksScopedListWarning(od);
+      checkHealthChecksScopedListWarning(
+          od as api.HealthChecksScopedListWarning);
     });
   });
 
@@ -29375,7 +29823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthChecksScopedList();
       var od = api.HealthChecksScopedList.fromJson(o.toJson());
-      checkHealthChecksScopedList(od);
+      checkHealthChecksScopedList(od as api.HealthChecksScopedList);
     });
   });
 
@@ -29383,7 +29831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthStatus();
       var od = api.HealthStatus.fromJson(o.toJson());
-      checkHealthStatus(od);
+      checkHealthStatus(od as api.HealthStatus);
     });
   });
 
@@ -29391,7 +29839,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHealthStatusForNetworkEndpoint();
       var od = api.HealthStatusForNetworkEndpoint.fromJson(o.toJson());
-      checkHealthStatusForNetworkEndpoint(od);
+      checkHealthStatusForNetworkEndpoint(
+          od as api.HealthStatusForNetworkEndpoint);
     });
   });
 
@@ -29399,7 +29848,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHostRule();
       var od = api.HostRule.fromJson(o.toJson());
-      checkHostRule(od);
+      checkHostRule(od as api.HostRule);
     });
   });
 
@@ -29407,7 +29856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpFaultAbort();
       var od = api.HttpFaultAbort.fromJson(o.toJson());
-      checkHttpFaultAbort(od);
+      checkHttpFaultAbort(od as api.HttpFaultAbort);
     });
   });
 
@@ -29415,7 +29864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpFaultDelay();
       var od = api.HttpFaultDelay.fromJson(o.toJson());
-      checkHttpFaultDelay(od);
+      checkHttpFaultDelay(od as api.HttpFaultDelay);
     });
   });
 
@@ -29423,7 +29872,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpFaultInjection();
       var od = api.HttpFaultInjection.fromJson(o.toJson());
-      checkHttpFaultInjection(od);
+      checkHttpFaultInjection(od as api.HttpFaultInjection);
     });
   });
 
@@ -29431,7 +29880,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpHeaderAction();
       var od = api.HttpHeaderAction.fromJson(o.toJson());
-      checkHttpHeaderAction(od);
+      checkHttpHeaderAction(od as api.HttpHeaderAction);
     });
   });
 
@@ -29439,7 +29888,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpHeaderMatch();
       var od = api.HttpHeaderMatch.fromJson(o.toJson());
-      checkHttpHeaderMatch(od);
+      checkHttpHeaderMatch(od as api.HttpHeaderMatch);
     });
   });
 
@@ -29447,7 +29896,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpHeaderOption();
       var od = api.HttpHeaderOption.fromJson(o.toJson());
-      checkHttpHeaderOption(od);
+      checkHttpHeaderOption(od as api.HttpHeaderOption);
     });
   });
 
@@ -29455,7 +29904,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpHealthCheck();
       var od = api.HttpHealthCheck.fromJson(o.toJson());
-      checkHttpHealthCheck(od);
+      checkHttpHealthCheck(od as api.HttpHealthCheck);
     });
   });
 
@@ -29463,7 +29912,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpHealthCheckListWarningData();
       var od = api.HttpHealthCheckListWarningData.fromJson(o.toJson());
-      checkHttpHealthCheckListWarningData(od);
+      checkHttpHealthCheckListWarningData(
+          od as api.HttpHealthCheckListWarningData);
     });
   });
 
@@ -29471,7 +29921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpHealthCheckListWarning();
       var od = api.HttpHealthCheckListWarning.fromJson(o.toJson());
-      checkHttpHealthCheckListWarning(od);
+      checkHttpHealthCheckListWarning(od as api.HttpHealthCheckListWarning);
     });
   });
 
@@ -29479,7 +29929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpHealthCheckList();
       var od = api.HttpHealthCheckList.fromJson(o.toJson());
-      checkHttpHealthCheckList(od);
+      checkHttpHealthCheckList(od as api.HttpHealthCheckList);
     });
   });
 
@@ -29487,7 +29937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpQueryParameterMatch();
       var od = api.HttpQueryParameterMatch.fromJson(o.toJson());
-      checkHttpQueryParameterMatch(od);
+      checkHttpQueryParameterMatch(od as api.HttpQueryParameterMatch);
     });
   });
 
@@ -29495,7 +29945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRedirectAction();
       var od = api.HttpRedirectAction.fromJson(o.toJson());
-      checkHttpRedirectAction(od);
+      checkHttpRedirectAction(od as api.HttpRedirectAction);
     });
   });
 
@@ -29503,7 +29953,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRetryPolicy();
       var od = api.HttpRetryPolicy.fromJson(o.toJson());
-      checkHttpRetryPolicy(od);
+      checkHttpRetryPolicy(od as api.HttpRetryPolicy);
     });
   });
 
@@ -29511,7 +29961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRouteAction();
       var od = api.HttpRouteAction.fromJson(o.toJson());
-      checkHttpRouteAction(od);
+      checkHttpRouteAction(od as api.HttpRouteAction);
     });
   });
 
@@ -29519,7 +29969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRouteRule();
       var od = api.HttpRouteRule.fromJson(o.toJson());
-      checkHttpRouteRule(od);
+      checkHttpRouteRule(od as api.HttpRouteRule);
     });
   });
 
@@ -29527,7 +29977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRouteRuleMatch();
       var od = api.HttpRouteRuleMatch.fromJson(o.toJson());
-      checkHttpRouteRuleMatch(od);
+      checkHttpRouteRuleMatch(od as api.HttpRouteRuleMatch);
     });
   });
 
@@ -29535,7 +29985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpsHealthCheck();
       var od = api.HttpsHealthCheck.fromJson(o.toJson());
-      checkHttpsHealthCheck(od);
+      checkHttpsHealthCheck(od as api.HttpsHealthCheck);
     });
   });
 
@@ -29543,7 +29993,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpsHealthCheckListWarningData();
       var od = api.HttpsHealthCheckListWarningData.fromJson(o.toJson());
-      checkHttpsHealthCheckListWarningData(od);
+      checkHttpsHealthCheckListWarningData(
+          od as api.HttpsHealthCheckListWarningData);
     });
   });
 
@@ -29551,7 +30002,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpsHealthCheckListWarning();
       var od = api.HttpsHealthCheckListWarning.fromJson(o.toJson());
-      checkHttpsHealthCheckListWarning(od);
+      checkHttpsHealthCheckListWarning(od as api.HttpsHealthCheckListWarning);
     });
   });
 
@@ -29559,7 +30010,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpsHealthCheckList();
       var od = api.HttpsHealthCheckList.fromJson(o.toJson());
-      checkHttpsHealthCheckList(od);
+      checkHttpsHealthCheckList(od as api.HttpsHealthCheckList);
     });
   });
 
@@ -29567,7 +30018,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageRawDisk();
       var od = api.ImageRawDisk.fromJson(o.toJson());
-      checkImageRawDisk(od);
+      checkImageRawDisk(od as api.ImageRawDisk);
     });
   });
 
@@ -29575,7 +30026,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImage();
       var od = api.Image.fromJson(o.toJson());
-      checkImage(od);
+      checkImage(od as api.Image);
     });
   });
 
@@ -29583,7 +30034,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageListWarningData();
       var od = api.ImageListWarningData.fromJson(o.toJson());
-      checkImageListWarningData(od);
+      checkImageListWarningData(od as api.ImageListWarningData);
     });
   });
 
@@ -29591,7 +30042,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageListWarning();
       var od = api.ImageListWarning.fromJson(o.toJson());
-      checkImageListWarning(od);
+      checkImageListWarning(od as api.ImageListWarning);
     });
   });
 
@@ -29599,7 +30050,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageList();
       var od = api.ImageList.fromJson(o.toJson());
-      checkImageList(od);
+      checkImageList(od as api.ImageList);
     });
   });
 
@@ -29607,7 +30058,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInitialStateConfig();
       var od = api.InitialStateConfig.fromJson(o.toJson());
-      checkInitialStateConfig(od);
+      checkInitialStateConfig(od as api.InitialStateConfig);
     });
   });
 
@@ -29615,7 +30066,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstance();
       var od = api.Instance.fromJson(o.toJson());
-      checkInstance(od);
+      checkInstance(od as api.Instance);
     });
   });
 
@@ -29623,7 +30074,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceAggregatedListWarningData();
       var od = api.InstanceAggregatedListWarningData.fromJson(o.toJson());
-      checkInstanceAggregatedListWarningData(od);
+      checkInstanceAggregatedListWarningData(
+          od as api.InstanceAggregatedListWarningData);
     });
   });
 
@@ -29631,7 +30083,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceAggregatedListWarning();
       var od = api.InstanceAggregatedListWarning.fromJson(o.toJson());
-      checkInstanceAggregatedListWarning(od);
+      checkInstanceAggregatedListWarning(
+          od as api.InstanceAggregatedListWarning);
     });
   });
 
@@ -29639,7 +30092,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceAggregatedList();
       var od = api.InstanceAggregatedList.fromJson(o.toJson());
-      checkInstanceAggregatedList(od);
+      checkInstanceAggregatedList(od as api.InstanceAggregatedList);
     });
   });
 
@@ -29647,7 +30100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroup();
       var od = api.InstanceGroup.fromJson(o.toJson());
-      checkInstanceGroup(od);
+      checkInstanceGroup(od as api.InstanceGroup);
     });
   });
 
@@ -29655,7 +30108,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupAggregatedListWarningData();
       var od = api.InstanceGroupAggregatedListWarningData.fromJson(o.toJson());
-      checkInstanceGroupAggregatedListWarningData(od);
+      checkInstanceGroupAggregatedListWarningData(
+          od as api.InstanceGroupAggregatedListWarningData);
     });
   });
 
@@ -29663,7 +30117,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupAggregatedListWarning();
       var od = api.InstanceGroupAggregatedListWarning.fromJson(o.toJson());
-      checkInstanceGroupAggregatedListWarning(od);
+      checkInstanceGroupAggregatedListWarning(
+          od as api.InstanceGroupAggregatedListWarning);
     });
   });
 
@@ -29671,7 +30126,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupAggregatedList();
       var od = api.InstanceGroupAggregatedList.fromJson(o.toJson());
-      checkInstanceGroupAggregatedList(od);
+      checkInstanceGroupAggregatedList(od as api.InstanceGroupAggregatedList);
     });
   });
 
@@ -29679,7 +30134,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupListWarningData();
       var od = api.InstanceGroupListWarningData.fromJson(o.toJson());
-      checkInstanceGroupListWarningData(od);
+      checkInstanceGroupListWarningData(od as api.InstanceGroupListWarningData);
     });
   });
 
@@ -29687,7 +30142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupListWarning();
       var od = api.InstanceGroupListWarning.fromJson(o.toJson());
-      checkInstanceGroupListWarning(od);
+      checkInstanceGroupListWarning(od as api.InstanceGroupListWarning);
     });
   });
 
@@ -29695,7 +30150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupList();
       var od = api.InstanceGroupList.fromJson(o.toJson());
-      checkInstanceGroupList(od);
+      checkInstanceGroupList(od as api.InstanceGroupList);
     });
   });
 
@@ -29703,7 +30158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManager();
       var od = api.InstanceGroupManager.fromJson(o.toJson());
-      checkInstanceGroupManager(od);
+      checkInstanceGroupManager(od as api.InstanceGroupManager);
     });
   });
 
@@ -29711,7 +30166,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerActionsSummary();
       var od = api.InstanceGroupManagerActionsSummary.fromJson(o.toJson());
-      checkInstanceGroupManagerActionsSummary(od);
+      checkInstanceGroupManagerActionsSummary(
+          od as api.InstanceGroupManagerActionsSummary);
     });
   });
 
@@ -29721,7 +30177,8 @@
       var o = buildInstanceGroupManagerAggregatedListWarningData();
       var od = api.InstanceGroupManagerAggregatedListWarningData.fromJson(
           o.toJson());
-      checkInstanceGroupManagerAggregatedListWarningData(od);
+      checkInstanceGroupManagerAggregatedListWarningData(
+          od as api.InstanceGroupManagerAggregatedListWarningData);
     });
   });
 
@@ -29730,7 +30187,8 @@
       var o = buildInstanceGroupManagerAggregatedListWarning();
       var od =
           api.InstanceGroupManagerAggregatedListWarning.fromJson(o.toJson());
-      checkInstanceGroupManagerAggregatedListWarning(od);
+      checkInstanceGroupManagerAggregatedListWarning(
+          od as api.InstanceGroupManagerAggregatedListWarning);
     });
   });
 
@@ -29738,7 +30196,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerAggregatedList();
       var od = api.InstanceGroupManagerAggregatedList.fromJson(o.toJson());
-      checkInstanceGroupManagerAggregatedList(od);
+      checkInstanceGroupManagerAggregatedList(
+          od as api.InstanceGroupManagerAggregatedList);
     });
   });
 
@@ -29746,7 +30205,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerAutoHealingPolicy();
       var od = api.InstanceGroupManagerAutoHealingPolicy.fromJson(o.toJson());
-      checkInstanceGroupManagerAutoHealingPolicy(od);
+      checkInstanceGroupManagerAutoHealingPolicy(
+          od as api.InstanceGroupManagerAutoHealingPolicy);
     });
   });
 
@@ -29754,7 +30214,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerListWarningData();
       var od = api.InstanceGroupManagerListWarningData.fromJson(o.toJson());
-      checkInstanceGroupManagerListWarningData(od);
+      checkInstanceGroupManagerListWarningData(
+          od as api.InstanceGroupManagerListWarningData);
     });
   });
 
@@ -29762,7 +30223,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerListWarning();
       var od = api.InstanceGroupManagerListWarning.fromJson(o.toJson());
-      checkInstanceGroupManagerListWarning(od);
+      checkInstanceGroupManagerListWarning(
+          od as api.InstanceGroupManagerListWarning);
     });
   });
 
@@ -29770,7 +30232,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerList();
       var od = api.InstanceGroupManagerList.fromJson(o.toJson());
-      checkInstanceGroupManagerList(od);
+      checkInstanceGroupManagerList(od as api.InstanceGroupManagerList);
     });
   });
 
@@ -29778,7 +30240,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerStatus();
       var od = api.InstanceGroupManagerStatus.fromJson(o.toJson());
-      checkInstanceGroupManagerStatus(od);
+      checkInstanceGroupManagerStatus(od as api.InstanceGroupManagerStatus);
     });
   });
 
@@ -29786,7 +30248,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerStatusStateful();
       var od = api.InstanceGroupManagerStatusStateful.fromJson(o.toJson());
-      checkInstanceGroupManagerStatusStateful(od);
+      checkInstanceGroupManagerStatusStateful(
+          od as api.InstanceGroupManagerStatusStateful);
     });
   });
 
@@ -29797,7 +30260,8 @@
       var od =
           api.InstanceGroupManagerStatusStatefulPerInstanceConfigs.fromJson(
               o.toJson());
-      checkInstanceGroupManagerStatusStatefulPerInstanceConfigs(od);
+      checkInstanceGroupManagerStatusStatefulPerInstanceConfigs(
+          od as api.InstanceGroupManagerStatusStatefulPerInstanceConfigs);
     });
   });
 
@@ -29805,7 +30269,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerStatusVersionTarget();
       var od = api.InstanceGroupManagerStatusVersionTarget.fromJson(o.toJson());
-      checkInstanceGroupManagerStatusVersionTarget(od);
+      checkInstanceGroupManagerStatusVersionTarget(
+          od as api.InstanceGroupManagerStatusVersionTarget);
     });
   });
 
@@ -29813,7 +30278,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerUpdatePolicy();
       var od = api.InstanceGroupManagerUpdatePolicy.fromJson(o.toJson());
-      checkInstanceGroupManagerUpdatePolicy(od);
+      checkInstanceGroupManagerUpdatePolicy(
+          od as api.InstanceGroupManagerUpdatePolicy);
     });
   });
 
@@ -29821,7 +30287,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagerVersion();
       var od = api.InstanceGroupManagerVersion.fromJson(o.toJson());
-      checkInstanceGroupManagerVersion(od);
+      checkInstanceGroupManagerVersion(od as api.InstanceGroupManagerVersion);
     });
   });
 
@@ -29830,7 +30296,8 @@
       var o = buildInstanceGroupManagersAbandonInstancesRequest();
       var od =
           api.InstanceGroupManagersAbandonInstancesRequest.fromJson(o.toJson());
-      checkInstanceGroupManagersAbandonInstancesRequest(od);
+      checkInstanceGroupManagersAbandonInstancesRequest(
+          od as api.InstanceGroupManagersAbandonInstancesRequest);
     });
   });
 
@@ -29839,7 +30306,8 @@
       var o = buildInstanceGroupManagersApplyUpdatesRequest();
       var od =
           api.InstanceGroupManagersApplyUpdatesRequest.fromJson(o.toJson());
-      checkInstanceGroupManagersApplyUpdatesRequest(od);
+      checkInstanceGroupManagersApplyUpdatesRequest(
+          od as api.InstanceGroupManagersApplyUpdatesRequest);
     });
   });
 
@@ -29848,7 +30316,8 @@
       var o = buildInstanceGroupManagersCreateInstancesRequest();
       var od =
           api.InstanceGroupManagersCreateInstancesRequest.fromJson(o.toJson());
-      checkInstanceGroupManagersCreateInstancesRequest(od);
+      checkInstanceGroupManagersCreateInstancesRequest(
+          od as api.InstanceGroupManagersCreateInstancesRequest);
     });
   });
 
@@ -29857,7 +30326,8 @@
       var o = buildInstanceGroupManagersDeleteInstancesRequest();
       var od =
           api.InstanceGroupManagersDeleteInstancesRequest.fromJson(o.toJson());
-      checkInstanceGroupManagersDeleteInstancesRequest(od);
+      checkInstanceGroupManagersDeleteInstancesRequest(
+          od as api.InstanceGroupManagersDeleteInstancesRequest);
     });
   });
 
@@ -29867,7 +30337,8 @@
       var o = buildInstanceGroupManagersDeletePerInstanceConfigsReq();
       var od = api.InstanceGroupManagersDeletePerInstanceConfigsReq.fromJson(
           o.toJson());
-      checkInstanceGroupManagersDeletePerInstanceConfigsReq(od);
+      checkInstanceGroupManagersDeletePerInstanceConfigsReq(
+          od as api.InstanceGroupManagersDeletePerInstanceConfigsReq);
     });
   });
 
@@ -29875,7 +30346,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagersListErrorsResponse();
       var od = api.InstanceGroupManagersListErrorsResponse.fromJson(o.toJson());
-      checkInstanceGroupManagersListErrorsResponse(od);
+      checkInstanceGroupManagersListErrorsResponse(
+          od as api.InstanceGroupManagersListErrorsResponse);
     });
   });
 
@@ -29885,7 +30357,8 @@
       var o = buildInstanceGroupManagersListManagedInstancesResponse();
       var od = api.InstanceGroupManagersListManagedInstancesResponse.fromJson(
           o.toJson());
-      checkInstanceGroupManagersListManagedInstancesResponse(od);
+      checkInstanceGroupManagersListManagedInstancesResponse(
+          od as api.InstanceGroupManagersListManagedInstancesResponse);
     });
   });
 
@@ -29896,7 +30369,8 @@
       var o = buildInstanceGroupManagersListPerInstanceConfigsRespWarningData();
       var od = api.InstanceGroupManagersListPerInstanceConfigsRespWarningData
           .fromJson(o.toJson());
-      checkInstanceGroupManagersListPerInstanceConfigsRespWarningData(od);
+      checkInstanceGroupManagersListPerInstanceConfigsRespWarningData(
+          od as api.InstanceGroupManagersListPerInstanceConfigsRespWarningData);
     });
   });
 
@@ -29907,7 +30381,8 @@
       var od =
           api.InstanceGroupManagersListPerInstanceConfigsRespWarning.fromJson(
               o.toJson());
-      checkInstanceGroupManagersListPerInstanceConfigsRespWarning(od);
+      checkInstanceGroupManagersListPerInstanceConfigsRespWarning(
+          od as api.InstanceGroupManagersListPerInstanceConfigsRespWarning);
     });
   });
 
@@ -29917,7 +30392,8 @@
       var o = buildInstanceGroupManagersListPerInstanceConfigsResp();
       var od = api.InstanceGroupManagersListPerInstanceConfigsResp.fromJson(
           o.toJson());
-      checkInstanceGroupManagersListPerInstanceConfigsResp(od);
+      checkInstanceGroupManagersListPerInstanceConfigsResp(
+          od as api.InstanceGroupManagersListPerInstanceConfigsResp);
     });
   });
 
@@ -29927,7 +30403,8 @@
       var o = buildInstanceGroupManagersPatchPerInstanceConfigsReq();
       var od = api.InstanceGroupManagersPatchPerInstanceConfigsReq.fromJson(
           o.toJson());
-      checkInstanceGroupManagersPatchPerInstanceConfigsReq(od);
+      checkInstanceGroupManagersPatchPerInstanceConfigsReq(
+          od as api.InstanceGroupManagersPatchPerInstanceConfigsReq);
     });
   });
 
@@ -29937,7 +30414,8 @@
       var o = buildInstanceGroupManagersRecreateInstancesRequest();
       var od = api.InstanceGroupManagersRecreateInstancesRequest.fromJson(
           o.toJson());
-      checkInstanceGroupManagersRecreateInstancesRequest(od);
+      checkInstanceGroupManagersRecreateInstancesRequest(
+          od as api.InstanceGroupManagersRecreateInstancesRequest);
     });
   });
 
@@ -29946,7 +30424,8 @@
       var o = buildInstanceGroupManagersScopedListWarningData();
       var od =
           api.InstanceGroupManagersScopedListWarningData.fromJson(o.toJson());
-      checkInstanceGroupManagersScopedListWarningData(od);
+      checkInstanceGroupManagersScopedListWarningData(
+          od as api.InstanceGroupManagersScopedListWarningData);
     });
   });
 
@@ -29954,7 +30433,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagersScopedListWarning();
       var od = api.InstanceGroupManagersScopedListWarning.fromJson(o.toJson());
-      checkInstanceGroupManagersScopedListWarning(od);
+      checkInstanceGroupManagersScopedListWarning(
+          od as api.InstanceGroupManagersScopedListWarning);
     });
   });
 
@@ -29962,7 +30442,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupManagersScopedList();
       var od = api.InstanceGroupManagersScopedList.fromJson(o.toJson());
-      checkInstanceGroupManagersScopedList(od);
+      checkInstanceGroupManagersScopedList(
+          od as api.InstanceGroupManagersScopedList);
     });
   });
 
@@ -29972,7 +30453,8 @@
       var o = buildInstanceGroupManagersSetInstanceTemplateRequest();
       var od = api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(
           o.toJson());
-      checkInstanceGroupManagersSetInstanceTemplateRequest(od);
+      checkInstanceGroupManagersSetInstanceTemplateRequest(
+          od as api.InstanceGroupManagersSetInstanceTemplateRequest);
     });
   });
 
@@ -29981,7 +30463,8 @@
       var o = buildInstanceGroupManagersSetTargetPoolsRequest();
       var od =
           api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(o.toJson());
-      checkInstanceGroupManagersSetTargetPoolsRequest(od);
+      checkInstanceGroupManagersSetTargetPoolsRequest(
+          od as api.InstanceGroupManagersSetTargetPoolsRequest);
     });
   });
 
@@ -29991,7 +30474,8 @@
       var o = buildInstanceGroupManagersUpdatePerInstanceConfigsReq();
       var od = api.InstanceGroupManagersUpdatePerInstanceConfigsReq.fromJson(
           o.toJson());
-      checkInstanceGroupManagersUpdatePerInstanceConfigsReq(od);
+      checkInstanceGroupManagersUpdatePerInstanceConfigsReq(
+          od as api.InstanceGroupManagersUpdatePerInstanceConfigsReq);
     });
   });
 
@@ -29999,7 +30483,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsAddInstancesRequest();
       var od = api.InstanceGroupsAddInstancesRequest.fromJson(o.toJson());
-      checkInstanceGroupsAddInstancesRequest(od);
+      checkInstanceGroupsAddInstancesRequest(
+          od as api.InstanceGroupsAddInstancesRequest);
     });
   });
 
@@ -30007,7 +30492,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsListInstancesWarningData();
       var od = api.InstanceGroupsListInstancesWarningData.fromJson(o.toJson());
-      checkInstanceGroupsListInstancesWarningData(od);
+      checkInstanceGroupsListInstancesWarningData(
+          od as api.InstanceGroupsListInstancesWarningData);
     });
   });
 
@@ -30015,7 +30501,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsListInstancesWarning();
       var od = api.InstanceGroupsListInstancesWarning.fromJson(o.toJson());
-      checkInstanceGroupsListInstancesWarning(od);
+      checkInstanceGroupsListInstancesWarning(
+          od as api.InstanceGroupsListInstancesWarning);
     });
   });
 
@@ -30023,7 +30510,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsListInstances();
       var od = api.InstanceGroupsListInstances.fromJson(o.toJson());
-      checkInstanceGroupsListInstances(od);
+      checkInstanceGroupsListInstances(od as api.InstanceGroupsListInstances);
     });
   });
 
@@ -30031,7 +30518,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsListInstancesRequest();
       var od = api.InstanceGroupsListInstancesRequest.fromJson(o.toJson());
-      checkInstanceGroupsListInstancesRequest(od);
+      checkInstanceGroupsListInstancesRequest(
+          od as api.InstanceGroupsListInstancesRequest);
     });
   });
 
@@ -30039,7 +30527,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsRemoveInstancesRequest();
       var od = api.InstanceGroupsRemoveInstancesRequest.fromJson(o.toJson());
-      checkInstanceGroupsRemoveInstancesRequest(od);
+      checkInstanceGroupsRemoveInstancesRequest(
+          od as api.InstanceGroupsRemoveInstancesRequest);
     });
   });
 
@@ -30047,7 +30536,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsScopedListWarningData();
       var od = api.InstanceGroupsScopedListWarningData.fromJson(o.toJson());
-      checkInstanceGroupsScopedListWarningData(od);
+      checkInstanceGroupsScopedListWarningData(
+          od as api.InstanceGroupsScopedListWarningData);
     });
   });
 
@@ -30055,7 +30545,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsScopedListWarning();
       var od = api.InstanceGroupsScopedListWarning.fromJson(o.toJson());
-      checkInstanceGroupsScopedListWarning(od);
+      checkInstanceGroupsScopedListWarning(
+          od as api.InstanceGroupsScopedListWarning);
     });
   });
 
@@ -30063,7 +30554,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsScopedList();
       var od = api.InstanceGroupsScopedList.fromJson(o.toJson());
-      checkInstanceGroupsScopedList(od);
+      checkInstanceGroupsScopedList(od as api.InstanceGroupsScopedList);
     });
   });
 
@@ -30071,7 +30562,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupsSetNamedPortsRequest();
       var od = api.InstanceGroupsSetNamedPortsRequest.fromJson(o.toJson());
-      checkInstanceGroupsSetNamedPortsRequest(od);
+      checkInstanceGroupsSetNamedPortsRequest(
+          od as api.InstanceGroupsSetNamedPortsRequest);
     });
   });
 
@@ -30079,7 +30571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceListWarningData();
       var od = api.InstanceListWarningData.fromJson(o.toJson());
-      checkInstanceListWarningData(od);
+      checkInstanceListWarningData(od as api.InstanceListWarningData);
     });
   });
 
@@ -30087,7 +30579,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceListWarning();
       var od = api.InstanceListWarning.fromJson(o.toJson());
-      checkInstanceListWarning(od);
+      checkInstanceListWarning(od as api.InstanceListWarning);
     });
   });
 
@@ -30095,7 +30587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceList();
       var od = api.InstanceList.fromJson(o.toJson());
-      checkInstanceList(od);
+      checkInstanceList(od as api.InstanceList);
     });
   });
 
@@ -30103,7 +30595,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceListReferrersWarningData();
       var od = api.InstanceListReferrersWarningData.fromJson(o.toJson());
-      checkInstanceListReferrersWarningData(od);
+      checkInstanceListReferrersWarningData(
+          od as api.InstanceListReferrersWarningData);
     });
   });
 
@@ -30111,7 +30604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceListReferrersWarning();
       var od = api.InstanceListReferrersWarning.fromJson(o.toJson());
-      checkInstanceListReferrersWarning(od);
+      checkInstanceListReferrersWarning(od as api.InstanceListReferrersWarning);
     });
   });
 
@@ -30119,7 +30612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceListReferrers();
       var od = api.InstanceListReferrers.fromJson(o.toJson());
-      checkInstanceListReferrers(od);
+      checkInstanceListReferrers(od as api.InstanceListReferrers);
     });
   });
 
@@ -30127,7 +30620,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceManagedByIgmError();
       var od = api.InstanceManagedByIgmError.fromJson(o.toJson());
-      checkInstanceManagedByIgmError(od);
+      checkInstanceManagedByIgmError(od as api.InstanceManagedByIgmError);
     });
   });
 
@@ -30137,7 +30630,8 @@
       var o = buildInstanceManagedByIgmErrorInstanceActionDetails();
       var od = api.InstanceManagedByIgmErrorInstanceActionDetails.fromJson(
           o.toJson());
-      checkInstanceManagedByIgmErrorInstanceActionDetails(od);
+      checkInstanceManagedByIgmErrorInstanceActionDetails(
+          od as api.InstanceManagedByIgmErrorInstanceActionDetails);
     });
   });
 
@@ -30147,7 +30641,8 @@
       var o = buildInstanceManagedByIgmErrorManagedInstanceError();
       var od = api.InstanceManagedByIgmErrorManagedInstanceError.fromJson(
           o.toJson());
-      checkInstanceManagedByIgmErrorManagedInstanceError(od);
+      checkInstanceManagedByIgmErrorManagedInstanceError(
+          od as api.InstanceManagedByIgmErrorManagedInstanceError);
     });
   });
 
@@ -30155,7 +30650,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceMoveRequest();
       var od = api.InstanceMoveRequest.fromJson(o.toJson());
-      checkInstanceMoveRequest(od);
+      checkInstanceMoveRequest(od as api.InstanceMoveRequest);
     });
   });
 
@@ -30163,7 +30658,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceProperties();
       var od = api.InstanceProperties.fromJson(o.toJson());
-      checkInstanceProperties(od);
+      checkInstanceProperties(od as api.InstanceProperties);
     });
   });
 
@@ -30171,7 +30666,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceReference();
       var od = api.InstanceReference.fromJson(o.toJson());
-      checkInstanceReference(od);
+      checkInstanceReference(od as api.InstanceReference);
     });
   });
 
@@ -30179,7 +30674,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceTemplate();
       var od = api.InstanceTemplate.fromJson(o.toJson());
-      checkInstanceTemplate(od);
+      checkInstanceTemplate(od as api.InstanceTemplate);
     });
   });
 
@@ -30187,7 +30682,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceTemplateListWarningData();
       var od = api.InstanceTemplateListWarningData.fromJson(o.toJson());
-      checkInstanceTemplateListWarningData(od);
+      checkInstanceTemplateListWarningData(
+          od as api.InstanceTemplateListWarningData);
     });
   });
 
@@ -30195,7 +30691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceTemplateListWarning();
       var od = api.InstanceTemplateListWarning.fromJson(o.toJson());
-      checkInstanceTemplateListWarning(od);
+      checkInstanceTemplateListWarning(od as api.InstanceTemplateListWarning);
     });
   });
 
@@ -30203,7 +30699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceTemplateList();
       var od = api.InstanceTemplateList.fromJson(o.toJson());
-      checkInstanceTemplateList(od);
+      checkInstanceTemplateList(od as api.InstanceTemplateList);
     });
   });
 
@@ -30211,7 +30707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceWithNamedPorts();
       var od = api.InstanceWithNamedPorts.fromJson(o.toJson());
-      checkInstanceWithNamedPorts(od);
+      checkInstanceWithNamedPorts(od as api.InstanceWithNamedPorts);
     });
   });
 
@@ -30219,7 +30715,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesAddResourcePoliciesRequest();
       var od = api.InstancesAddResourcePoliciesRequest.fromJson(o.toJson());
-      checkInstancesAddResourcePoliciesRequest(od);
+      checkInstancesAddResourcePoliciesRequest(
+          od as api.InstancesAddResourcePoliciesRequest);
     });
   });
 
@@ -30227,7 +30724,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesRemoveResourcePoliciesRequest();
       var od = api.InstancesRemoveResourcePoliciesRequest.fromJson(o.toJson());
-      checkInstancesRemoveResourcePoliciesRequest(od);
+      checkInstancesRemoveResourcePoliciesRequest(
+          od as api.InstancesRemoveResourcePoliciesRequest);
     });
   });
 
@@ -30235,7 +30733,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesScopedListWarningData();
       var od = api.InstancesScopedListWarningData.fromJson(o.toJson());
-      checkInstancesScopedListWarningData(od);
+      checkInstancesScopedListWarningData(
+          od as api.InstancesScopedListWarningData);
     });
   });
 
@@ -30243,7 +30742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesScopedListWarning();
       var od = api.InstancesScopedListWarning.fromJson(o.toJson());
-      checkInstancesScopedListWarning(od);
+      checkInstancesScopedListWarning(od as api.InstancesScopedListWarning);
     });
   });
 
@@ -30251,7 +30750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesScopedList();
       var od = api.InstancesScopedList.fromJson(o.toJson());
-      checkInstancesScopedList(od);
+      checkInstancesScopedList(od as api.InstancesScopedList);
     });
   });
 
@@ -30259,7 +30758,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesSetLabelsRequest();
       var od = api.InstancesSetLabelsRequest.fromJson(o.toJson());
-      checkInstancesSetLabelsRequest(od);
+      checkInstancesSetLabelsRequest(od as api.InstancesSetLabelsRequest);
     });
   });
 
@@ -30267,7 +30766,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesSetMachineResourcesRequest();
       var od = api.InstancesSetMachineResourcesRequest.fromJson(o.toJson());
-      checkInstancesSetMachineResourcesRequest(od);
+      checkInstancesSetMachineResourcesRequest(
+          od as api.InstancesSetMachineResourcesRequest);
     });
   });
 
@@ -30275,7 +30775,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesSetMachineTypeRequest();
       var od = api.InstancesSetMachineTypeRequest.fromJson(o.toJson());
-      checkInstancesSetMachineTypeRequest(od);
+      checkInstancesSetMachineTypeRequest(
+          od as api.InstancesSetMachineTypeRequest);
     });
   });
 
@@ -30283,7 +30784,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesSetMinCpuPlatformRequest();
       var od = api.InstancesSetMinCpuPlatformRequest.fromJson(o.toJson());
-      checkInstancesSetMinCpuPlatformRequest(od);
+      checkInstancesSetMinCpuPlatformRequest(
+          od as api.InstancesSetMinCpuPlatformRequest);
     });
   });
 
@@ -30291,7 +30793,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesSetServiceAccountRequest();
       var od = api.InstancesSetServiceAccountRequest.fromJson(o.toJson());
-      checkInstancesSetServiceAccountRequest(od);
+      checkInstancesSetServiceAccountRequest(
+          od as api.InstancesSetServiceAccountRequest);
     });
   });
 
@@ -30299,7 +30802,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstancesStartWithEncryptionKeyRequest();
       var od = api.InstancesStartWithEncryptionKeyRequest.fromJson(o.toJson());
-      checkInstancesStartWithEncryptionKeyRequest(od);
+      checkInstancesStartWithEncryptionKeyRequest(
+          od as api.InstancesStartWithEncryptionKeyRequest);
     });
   });
 
@@ -30307,7 +30811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInt64RangeMatch();
       var od = api.Int64RangeMatch.fromJson(o.toJson());
-      checkInt64RangeMatch(od);
+      checkInt64RangeMatch(od as api.Int64RangeMatch);
     });
   });
 
@@ -30315,7 +30819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnect();
       var od = api.Interconnect.fromJson(o.toJson());
-      checkInterconnect(od);
+      checkInterconnect(od as api.Interconnect);
     });
   });
 
@@ -30323,7 +30827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachment();
       var od = api.InterconnectAttachment.fromJson(o.toJson());
-      checkInterconnectAttachment(od);
+      checkInterconnectAttachment(od as api.InterconnectAttachment);
     });
   });
 
@@ -30333,7 +30837,8 @@
       var o = buildInterconnectAttachmentAggregatedListWarningData();
       var od = api.InterconnectAttachmentAggregatedListWarningData.fromJson(
           o.toJson());
-      checkInterconnectAttachmentAggregatedListWarningData(od);
+      checkInterconnectAttachmentAggregatedListWarningData(
+          od as api.InterconnectAttachmentAggregatedListWarningData);
     });
   });
 
@@ -30342,7 +30847,8 @@
       var o = buildInterconnectAttachmentAggregatedListWarning();
       var od =
           api.InterconnectAttachmentAggregatedListWarning.fromJson(o.toJson());
-      checkInterconnectAttachmentAggregatedListWarning(od);
+      checkInterconnectAttachmentAggregatedListWarning(
+          od as api.InterconnectAttachmentAggregatedListWarning);
     });
   });
 
@@ -30350,7 +30856,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachmentAggregatedList();
       var od = api.InterconnectAttachmentAggregatedList.fromJson(o.toJson());
-      checkInterconnectAttachmentAggregatedList(od);
+      checkInterconnectAttachmentAggregatedList(
+          od as api.InterconnectAttachmentAggregatedList);
     });
   });
 
@@ -30358,7 +30865,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachmentListWarningData();
       var od = api.InterconnectAttachmentListWarningData.fromJson(o.toJson());
-      checkInterconnectAttachmentListWarningData(od);
+      checkInterconnectAttachmentListWarningData(
+          od as api.InterconnectAttachmentListWarningData);
     });
   });
 
@@ -30366,7 +30874,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachmentListWarning();
       var od = api.InterconnectAttachmentListWarning.fromJson(o.toJson());
-      checkInterconnectAttachmentListWarning(od);
+      checkInterconnectAttachmentListWarning(
+          od as api.InterconnectAttachmentListWarning);
     });
   });
 
@@ -30374,7 +30883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachmentList();
       var od = api.InterconnectAttachmentList.fromJson(o.toJson());
-      checkInterconnectAttachmentList(od);
+      checkInterconnectAttachmentList(od as api.InterconnectAttachmentList);
     });
   });
 
@@ -30382,7 +30891,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachmentPartnerMetadata();
       var od = api.InterconnectAttachmentPartnerMetadata.fromJson(o.toJson());
-      checkInterconnectAttachmentPartnerMetadata(od);
+      checkInterconnectAttachmentPartnerMetadata(
+          od as api.InterconnectAttachmentPartnerMetadata);
     });
   });
 
@@ -30390,7 +30900,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachmentPrivateInfo();
       var od = api.InterconnectAttachmentPrivateInfo.fromJson(o.toJson());
-      checkInterconnectAttachmentPrivateInfo(od);
+      checkInterconnectAttachmentPrivateInfo(
+          od as api.InterconnectAttachmentPrivateInfo);
     });
   });
 
@@ -30399,7 +30910,8 @@
       var o = buildInterconnectAttachmentsScopedListWarningData();
       var od =
           api.InterconnectAttachmentsScopedListWarningData.fromJson(o.toJson());
-      checkInterconnectAttachmentsScopedListWarningData(od);
+      checkInterconnectAttachmentsScopedListWarningData(
+          od as api.InterconnectAttachmentsScopedListWarningData);
     });
   });
 
@@ -30408,7 +30920,8 @@
       var o = buildInterconnectAttachmentsScopedListWarning();
       var od =
           api.InterconnectAttachmentsScopedListWarning.fromJson(o.toJson());
-      checkInterconnectAttachmentsScopedListWarning(od);
+      checkInterconnectAttachmentsScopedListWarning(
+          od as api.InterconnectAttachmentsScopedListWarning);
     });
   });
 
@@ -30416,7 +30929,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectAttachmentsScopedList();
       var od = api.InterconnectAttachmentsScopedList.fromJson(o.toJson());
-      checkInterconnectAttachmentsScopedList(od);
+      checkInterconnectAttachmentsScopedList(
+          od as api.InterconnectAttachmentsScopedList);
     });
   });
 
@@ -30424,7 +30938,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectCircuitInfo();
       var od = api.InterconnectCircuitInfo.fromJson(o.toJson());
-      checkInterconnectCircuitInfo(od);
+      checkInterconnectCircuitInfo(od as api.InterconnectCircuitInfo);
     });
   });
 
@@ -30432,7 +30946,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectDiagnostics();
       var od = api.InterconnectDiagnostics.fromJson(o.toJson());
-      checkInterconnectDiagnostics(od);
+      checkInterconnectDiagnostics(od as api.InterconnectDiagnostics);
     });
   });
 
@@ -30440,7 +30954,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectDiagnosticsARPEntry();
       var od = api.InterconnectDiagnosticsARPEntry.fromJson(o.toJson());
-      checkInterconnectDiagnosticsARPEntry(od);
+      checkInterconnectDiagnosticsARPEntry(
+          od as api.InterconnectDiagnosticsARPEntry);
     });
   });
 
@@ -30448,7 +30963,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectDiagnosticsLinkLACPStatus();
       var od = api.InterconnectDiagnosticsLinkLACPStatus.fromJson(o.toJson());
-      checkInterconnectDiagnosticsLinkLACPStatus(od);
+      checkInterconnectDiagnosticsLinkLACPStatus(
+          od as api.InterconnectDiagnosticsLinkLACPStatus);
     });
   });
 
@@ -30456,7 +30972,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectDiagnosticsLinkOpticalPower();
       var od = api.InterconnectDiagnosticsLinkOpticalPower.fromJson(o.toJson());
-      checkInterconnectDiagnosticsLinkOpticalPower(od);
+      checkInterconnectDiagnosticsLinkOpticalPower(
+          od as api.InterconnectDiagnosticsLinkOpticalPower);
     });
   });
 
@@ -30464,7 +30981,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectDiagnosticsLinkStatus();
       var od = api.InterconnectDiagnosticsLinkStatus.fromJson(o.toJson());
-      checkInterconnectDiagnosticsLinkStatus(od);
+      checkInterconnectDiagnosticsLinkStatus(
+          od as api.InterconnectDiagnosticsLinkStatus);
     });
   });
 
@@ -30472,7 +30990,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectListWarningData();
       var od = api.InterconnectListWarningData.fromJson(o.toJson());
-      checkInterconnectListWarningData(od);
+      checkInterconnectListWarningData(od as api.InterconnectListWarningData);
     });
   });
 
@@ -30480,7 +30998,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectListWarning();
       var od = api.InterconnectListWarning.fromJson(o.toJson());
-      checkInterconnectListWarning(od);
+      checkInterconnectListWarning(od as api.InterconnectListWarning);
     });
   });
 
@@ -30488,7 +31006,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectList();
       var od = api.InterconnectList.fromJson(o.toJson());
-      checkInterconnectList(od);
+      checkInterconnectList(od as api.InterconnectList);
     });
   });
 
@@ -30496,7 +31014,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectLocation();
       var od = api.InterconnectLocation.fromJson(o.toJson());
-      checkInterconnectLocation(od);
+      checkInterconnectLocation(od as api.InterconnectLocation);
     });
   });
 
@@ -30504,7 +31022,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectLocationListWarningData();
       var od = api.InterconnectLocationListWarningData.fromJson(o.toJson());
-      checkInterconnectLocationListWarningData(od);
+      checkInterconnectLocationListWarningData(
+          od as api.InterconnectLocationListWarningData);
     });
   });
 
@@ -30512,7 +31031,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectLocationListWarning();
       var od = api.InterconnectLocationListWarning.fromJson(o.toJson());
-      checkInterconnectLocationListWarning(od);
+      checkInterconnectLocationListWarning(
+          od as api.InterconnectLocationListWarning);
     });
   });
 
@@ -30520,7 +31040,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectLocationList();
       var od = api.InterconnectLocationList.fromJson(o.toJson());
-      checkInterconnectLocationList(od);
+      checkInterconnectLocationList(od as api.InterconnectLocationList);
     });
   });
 
@@ -30528,7 +31048,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectLocationRegionInfo();
       var od = api.InterconnectLocationRegionInfo.fromJson(o.toJson());
-      checkInterconnectLocationRegionInfo(od);
+      checkInterconnectLocationRegionInfo(
+          od as api.InterconnectLocationRegionInfo);
     });
   });
 
@@ -30536,7 +31057,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectOutageNotification();
       var od = api.InterconnectOutageNotification.fromJson(o.toJson());
-      checkInterconnectOutageNotification(od);
+      checkInterconnectOutageNotification(
+          od as api.InterconnectOutageNotification);
     });
   });
 
@@ -30544,7 +31066,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterconnectsGetDiagnosticsResponse();
       var od = api.InterconnectsGetDiagnosticsResponse.fromJson(o.toJson());
-      checkInterconnectsGetDiagnosticsResponse(od);
+      checkInterconnectsGetDiagnosticsResponse(
+          od as api.InterconnectsGetDiagnosticsResponse);
     });
   });
 
@@ -30552,7 +31075,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicense();
       var od = api.License.fromJson(o.toJson());
-      checkLicense(od);
+      checkLicense(od as api.License);
     });
   });
 
@@ -30560,7 +31083,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicenseCode();
       var od = api.LicenseCode.fromJson(o.toJson());
-      checkLicenseCode(od);
+      checkLicenseCode(od as api.LicenseCode);
     });
   });
 
@@ -30568,7 +31091,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicenseCodeLicenseAlias();
       var od = api.LicenseCodeLicenseAlias.fromJson(o.toJson());
-      checkLicenseCodeLicenseAlias(od);
+      checkLicenseCodeLicenseAlias(od as api.LicenseCodeLicenseAlias);
     });
   });
 
@@ -30576,7 +31099,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicenseResourceCommitment();
       var od = api.LicenseResourceCommitment.fromJson(o.toJson());
-      checkLicenseResourceCommitment(od);
+      checkLicenseResourceCommitment(od as api.LicenseResourceCommitment);
     });
   });
 
@@ -30584,7 +31107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicenseResourceRequirements();
       var od = api.LicenseResourceRequirements.fromJson(o.toJson());
-      checkLicenseResourceRequirements(od);
+      checkLicenseResourceRequirements(od as api.LicenseResourceRequirements);
     });
   });
 
@@ -30592,7 +31115,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicensesListResponseWarningData();
       var od = api.LicensesListResponseWarningData.fromJson(o.toJson());
-      checkLicensesListResponseWarningData(od);
+      checkLicensesListResponseWarningData(
+          od as api.LicensesListResponseWarningData);
     });
   });
 
@@ -30600,7 +31124,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicensesListResponseWarning();
       var od = api.LicensesListResponseWarning.fromJson(o.toJson());
-      checkLicensesListResponseWarning(od);
+      checkLicensesListResponseWarning(od as api.LicensesListResponseWarning);
     });
   });
 
@@ -30608,7 +31132,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicensesListResponse();
       var od = api.LicensesListResponse.fromJson(o.toJson());
-      checkLicensesListResponse(od);
+      checkLicensesListResponse(od as api.LicensesListResponse);
     });
   });
 
@@ -30616,7 +31140,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfig();
       var od = api.LogConfig.fromJson(o.toJson());
-      checkLogConfig(od);
+      checkLogConfig(od as api.LogConfig);
     });
   });
 
@@ -30624,7 +31148,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigCloudAuditOptions();
       var od = api.LogConfigCloudAuditOptions.fromJson(o.toJson());
-      checkLogConfigCloudAuditOptions(od);
+      checkLogConfigCloudAuditOptions(od as api.LogConfigCloudAuditOptions);
     });
   });
 
@@ -30632,7 +31156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigCounterOptions();
       var od = api.LogConfigCounterOptions.fromJson(o.toJson());
-      checkLogConfigCounterOptions(od);
+      checkLogConfigCounterOptions(od as api.LogConfigCounterOptions);
     });
   });
 
@@ -30640,7 +31164,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigCounterOptionsCustomField();
       var od = api.LogConfigCounterOptionsCustomField.fromJson(o.toJson());
-      checkLogConfigCounterOptionsCustomField(od);
+      checkLogConfigCounterOptionsCustomField(
+          od as api.LogConfigCounterOptionsCustomField);
     });
   });
 
@@ -30648,7 +31173,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigDataAccessOptions();
       var od = api.LogConfigDataAccessOptions.fromJson(o.toJson());
-      checkLogConfigDataAccessOptions(od);
+      checkLogConfigDataAccessOptions(od as api.LogConfigDataAccessOptions);
     });
   });
 
@@ -30656,7 +31181,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeAccelerators();
       var od = api.MachineTypeAccelerators.fromJson(o.toJson());
-      checkMachineTypeAccelerators(od);
+      checkMachineTypeAccelerators(od as api.MachineTypeAccelerators);
     });
   });
 
@@ -30664,7 +31189,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeScratchDisks();
       var od = api.MachineTypeScratchDisks.fromJson(o.toJson());
-      checkMachineTypeScratchDisks(od);
+      checkMachineTypeScratchDisks(od as api.MachineTypeScratchDisks);
     });
   });
 
@@ -30672,7 +31197,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineType();
       var od = api.MachineType.fromJson(o.toJson());
-      checkMachineType(od);
+      checkMachineType(od as api.MachineType);
     });
   });
 
@@ -30680,7 +31205,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeAggregatedListWarningData();
       var od = api.MachineTypeAggregatedListWarningData.fromJson(o.toJson());
-      checkMachineTypeAggregatedListWarningData(od);
+      checkMachineTypeAggregatedListWarningData(
+          od as api.MachineTypeAggregatedListWarningData);
     });
   });
 
@@ -30688,7 +31214,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeAggregatedListWarning();
       var od = api.MachineTypeAggregatedListWarning.fromJson(o.toJson());
-      checkMachineTypeAggregatedListWarning(od);
+      checkMachineTypeAggregatedListWarning(
+          od as api.MachineTypeAggregatedListWarning);
     });
   });
 
@@ -30696,7 +31223,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeAggregatedList();
       var od = api.MachineTypeAggregatedList.fromJson(o.toJson());
-      checkMachineTypeAggregatedList(od);
+      checkMachineTypeAggregatedList(od as api.MachineTypeAggregatedList);
     });
   });
 
@@ -30704,7 +31231,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeListWarningData();
       var od = api.MachineTypeListWarningData.fromJson(o.toJson());
-      checkMachineTypeListWarningData(od);
+      checkMachineTypeListWarningData(od as api.MachineTypeListWarningData);
     });
   });
 
@@ -30712,7 +31239,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeListWarning();
       var od = api.MachineTypeListWarning.fromJson(o.toJson());
-      checkMachineTypeListWarning(od);
+      checkMachineTypeListWarning(od as api.MachineTypeListWarning);
     });
   });
 
@@ -30720,7 +31247,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypeList();
       var od = api.MachineTypeList.fromJson(o.toJson());
-      checkMachineTypeList(od);
+      checkMachineTypeList(od as api.MachineTypeList);
     });
   });
 
@@ -30728,7 +31255,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypesScopedListWarningData();
       var od = api.MachineTypesScopedListWarningData.fromJson(o.toJson());
-      checkMachineTypesScopedListWarningData(od);
+      checkMachineTypesScopedListWarningData(
+          od as api.MachineTypesScopedListWarningData);
     });
   });
 
@@ -30736,7 +31264,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypesScopedListWarning();
       var od = api.MachineTypesScopedListWarning.fromJson(o.toJson());
-      checkMachineTypesScopedListWarning(od);
+      checkMachineTypesScopedListWarning(
+          od as api.MachineTypesScopedListWarning);
     });
   });
 
@@ -30744,7 +31273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMachineTypesScopedList();
       var od = api.MachineTypesScopedList.fromJson(o.toJson());
-      checkMachineTypesScopedList(od);
+      checkMachineTypesScopedList(od as api.MachineTypesScopedList);
     });
   });
 
@@ -30752,7 +31281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedInstance();
       var od = api.ManagedInstance.fromJson(o.toJson());
-      checkManagedInstance(od);
+      checkManagedInstance(od as api.ManagedInstance);
     });
   });
 
@@ -30760,7 +31289,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedInstanceInstanceHealth();
       var od = api.ManagedInstanceInstanceHealth.fromJson(o.toJson());
-      checkManagedInstanceInstanceHealth(od);
+      checkManagedInstanceInstanceHealth(
+          od as api.ManagedInstanceInstanceHealth);
     });
   });
 
@@ -30768,7 +31298,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedInstanceLastAttemptErrorsErrors();
       var od = api.ManagedInstanceLastAttemptErrorsErrors.fromJson(o.toJson());
-      checkManagedInstanceLastAttemptErrorsErrors(od);
+      checkManagedInstanceLastAttemptErrorsErrors(
+          od as api.ManagedInstanceLastAttemptErrorsErrors);
     });
   });
 
@@ -30776,7 +31307,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedInstanceLastAttemptErrors();
       var od = api.ManagedInstanceLastAttemptErrors.fromJson(o.toJson());
-      checkManagedInstanceLastAttemptErrors(od);
+      checkManagedInstanceLastAttemptErrors(
+          od as api.ManagedInstanceLastAttemptErrors);
     });
   });
 
@@ -30784,7 +31316,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedInstanceLastAttempt();
       var od = api.ManagedInstanceLastAttempt.fromJson(o.toJson());
-      checkManagedInstanceLastAttempt(od);
+      checkManagedInstanceLastAttempt(od as api.ManagedInstanceLastAttempt);
     });
   });
 
@@ -30792,7 +31324,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedInstanceVersion();
       var od = api.ManagedInstanceVersion.fromJson(o.toJson());
-      checkManagedInstanceVersion(od);
+      checkManagedInstanceVersion(od as api.ManagedInstanceVersion);
     });
   });
 
@@ -30800,7 +31332,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadataItems();
       var od = api.MetadataItems.fromJson(o.toJson());
-      checkMetadataItems(od);
+      checkMetadataItems(od as api.MetadataItems);
     });
   });
 
@@ -30808,7 +31340,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadata();
       var od = api.Metadata.fromJson(o.toJson());
-      checkMetadata(od);
+      checkMetadata(od as api.Metadata);
     });
   });
 
@@ -30816,7 +31348,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadataFilter();
       var od = api.MetadataFilter.fromJson(o.toJson());
-      checkMetadataFilter(od);
+      checkMetadataFilter(od as api.MetadataFilter);
     });
   });
 
@@ -30824,7 +31356,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadataFilterLabelMatch();
       var od = api.MetadataFilterLabelMatch.fromJson(o.toJson());
-      checkMetadataFilterLabelMatch(od);
+      checkMetadataFilterLabelMatch(od as api.MetadataFilterLabelMatch);
     });
   });
 
@@ -30832,7 +31364,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedPort();
       var od = api.NamedPort.fromJson(o.toJson());
-      checkNamedPort(od);
+      checkNamedPort(od as api.NamedPort);
     });
   });
 
@@ -30840,7 +31372,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetwork();
       var od = api.Network.fromJson(o.toJson());
-      checkNetwork(od);
+      checkNetwork(od as api.Network);
     });
   });
 
@@ -30848,7 +31380,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpoint();
       var od = api.NetworkEndpoint.fromJson(o.toJson());
-      checkNetworkEndpoint(od);
+      checkNetworkEndpoint(od as api.NetworkEndpoint);
     });
   });
 
@@ -30856,7 +31388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroup();
       var od = api.NetworkEndpointGroup.fromJson(o.toJson());
-      checkNetworkEndpointGroup(od);
+      checkNetworkEndpointGroup(od as api.NetworkEndpointGroup);
     });
   });
 
@@ -30866,7 +31398,8 @@
       var o = buildNetworkEndpointGroupAggregatedListWarningData();
       var od = api.NetworkEndpointGroupAggregatedListWarningData.fromJson(
           o.toJson());
-      checkNetworkEndpointGroupAggregatedListWarningData(od);
+      checkNetworkEndpointGroupAggregatedListWarningData(
+          od as api.NetworkEndpointGroupAggregatedListWarningData);
     });
   });
 
@@ -30875,7 +31408,8 @@
       var o = buildNetworkEndpointGroupAggregatedListWarning();
       var od =
           api.NetworkEndpointGroupAggregatedListWarning.fromJson(o.toJson());
-      checkNetworkEndpointGroupAggregatedListWarning(od);
+      checkNetworkEndpointGroupAggregatedListWarning(
+          od as api.NetworkEndpointGroupAggregatedListWarning);
     });
   });
 
@@ -30883,7 +31417,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupAggregatedList();
       var od = api.NetworkEndpointGroupAggregatedList.fromJson(o.toJson());
-      checkNetworkEndpointGroupAggregatedList(od);
+      checkNetworkEndpointGroupAggregatedList(
+          od as api.NetworkEndpointGroupAggregatedList);
     });
   });
 
@@ -30891,7 +31426,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupAppEngine();
       var od = api.NetworkEndpointGroupAppEngine.fromJson(o.toJson());
-      checkNetworkEndpointGroupAppEngine(od);
+      checkNetworkEndpointGroupAppEngine(
+          od as api.NetworkEndpointGroupAppEngine);
     });
   });
 
@@ -30899,7 +31435,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupCloudFunction();
       var od = api.NetworkEndpointGroupCloudFunction.fromJson(o.toJson());
-      checkNetworkEndpointGroupCloudFunction(od);
+      checkNetworkEndpointGroupCloudFunction(
+          od as api.NetworkEndpointGroupCloudFunction);
     });
   });
 
@@ -30907,7 +31444,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupCloudRun();
       var od = api.NetworkEndpointGroupCloudRun.fromJson(o.toJson());
-      checkNetworkEndpointGroupCloudRun(od);
+      checkNetworkEndpointGroupCloudRun(od as api.NetworkEndpointGroupCloudRun);
     });
   });
 
@@ -30915,7 +31452,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupListWarningData();
       var od = api.NetworkEndpointGroupListWarningData.fromJson(o.toJson());
-      checkNetworkEndpointGroupListWarningData(od);
+      checkNetworkEndpointGroupListWarningData(
+          od as api.NetworkEndpointGroupListWarningData);
     });
   });
 
@@ -30923,7 +31461,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupListWarning();
       var od = api.NetworkEndpointGroupListWarning.fromJson(o.toJson());
-      checkNetworkEndpointGroupListWarning(od);
+      checkNetworkEndpointGroupListWarning(
+          od as api.NetworkEndpointGroupListWarning);
     });
   });
 
@@ -30931,7 +31470,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupList();
       var od = api.NetworkEndpointGroupList.fromJson(o.toJson());
-      checkNetworkEndpointGroupList(od);
+      checkNetworkEndpointGroupList(od as api.NetworkEndpointGroupList);
     });
   });
 
@@ -30940,7 +31479,8 @@
       var o = buildNetworkEndpointGroupsAttachEndpointsRequest();
       var od =
           api.NetworkEndpointGroupsAttachEndpointsRequest.fromJson(o.toJson());
-      checkNetworkEndpointGroupsAttachEndpointsRequest(od);
+      checkNetworkEndpointGroupsAttachEndpointsRequest(
+          od as api.NetworkEndpointGroupsAttachEndpointsRequest);
     });
   });
 
@@ -30949,7 +31489,8 @@
       var o = buildNetworkEndpointGroupsDetachEndpointsRequest();
       var od =
           api.NetworkEndpointGroupsDetachEndpointsRequest.fromJson(o.toJson());
-      checkNetworkEndpointGroupsDetachEndpointsRequest(od);
+      checkNetworkEndpointGroupsDetachEndpointsRequest(
+          od as api.NetworkEndpointGroupsDetachEndpointsRequest);
     });
   });
 
@@ -30958,7 +31499,8 @@
       var o = buildNetworkEndpointGroupsListEndpointsRequest();
       var od =
           api.NetworkEndpointGroupsListEndpointsRequest.fromJson(o.toJson());
-      checkNetworkEndpointGroupsListEndpointsRequest(od);
+      checkNetworkEndpointGroupsListEndpointsRequest(
+          od as api.NetworkEndpointGroupsListEndpointsRequest);
     });
   });
 
@@ -30969,7 +31511,8 @@
       var od =
           api.NetworkEndpointGroupsListNetworkEndpointsWarningData.fromJson(
               o.toJson());
-      checkNetworkEndpointGroupsListNetworkEndpointsWarningData(od);
+      checkNetworkEndpointGroupsListNetworkEndpointsWarningData(
+          od as api.NetworkEndpointGroupsListNetworkEndpointsWarningData);
     });
   });
 
@@ -30979,7 +31522,8 @@
       var o = buildNetworkEndpointGroupsListNetworkEndpointsWarning();
       var od = api.NetworkEndpointGroupsListNetworkEndpointsWarning.fromJson(
           o.toJson());
-      checkNetworkEndpointGroupsListNetworkEndpointsWarning(od);
+      checkNetworkEndpointGroupsListNetworkEndpointsWarning(
+          od as api.NetworkEndpointGroupsListNetworkEndpointsWarning);
     });
   });
 
@@ -30988,7 +31532,8 @@
       var o = buildNetworkEndpointGroupsListNetworkEndpoints();
       var od =
           api.NetworkEndpointGroupsListNetworkEndpoints.fromJson(o.toJson());
-      checkNetworkEndpointGroupsListNetworkEndpoints(od);
+      checkNetworkEndpointGroupsListNetworkEndpoints(
+          od as api.NetworkEndpointGroupsListNetworkEndpoints);
     });
   });
 
@@ -30997,7 +31542,8 @@
       var o = buildNetworkEndpointGroupsScopedListWarningData();
       var od =
           api.NetworkEndpointGroupsScopedListWarningData.fromJson(o.toJson());
-      checkNetworkEndpointGroupsScopedListWarningData(od);
+      checkNetworkEndpointGroupsScopedListWarningData(
+          od as api.NetworkEndpointGroupsScopedListWarningData);
     });
   });
 
@@ -31005,7 +31551,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupsScopedListWarning();
       var od = api.NetworkEndpointGroupsScopedListWarning.fromJson(o.toJson());
-      checkNetworkEndpointGroupsScopedListWarning(od);
+      checkNetworkEndpointGroupsScopedListWarning(
+          od as api.NetworkEndpointGroupsScopedListWarning);
     });
   });
 
@@ -31013,7 +31560,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointGroupsScopedList();
       var od = api.NetworkEndpointGroupsScopedList.fromJson(o.toJson());
-      checkNetworkEndpointGroupsScopedList(od);
+      checkNetworkEndpointGroupsScopedList(
+          od as api.NetworkEndpointGroupsScopedList);
     });
   });
 
@@ -31021,7 +31569,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpointWithHealthStatus();
       var od = api.NetworkEndpointWithHealthStatus.fromJson(o.toJson());
-      checkNetworkEndpointWithHealthStatus(od);
+      checkNetworkEndpointWithHealthStatus(
+          od as api.NetworkEndpointWithHealthStatus);
     });
   });
 
@@ -31029,7 +31578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkInterface();
       var od = api.NetworkInterface.fromJson(o.toJson());
-      checkNetworkInterface(od);
+      checkNetworkInterface(od as api.NetworkInterface);
     });
   });
 
@@ -31037,7 +31586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkListWarningData();
       var od = api.NetworkListWarningData.fromJson(o.toJson());
-      checkNetworkListWarningData(od);
+      checkNetworkListWarningData(od as api.NetworkListWarningData);
     });
   });
 
@@ -31045,7 +31594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkListWarning();
       var od = api.NetworkListWarning.fromJson(o.toJson());
-      checkNetworkListWarning(od);
+      checkNetworkListWarning(od as api.NetworkListWarning);
     });
   });
 
@@ -31053,7 +31602,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkList();
       var od = api.NetworkList.fromJson(o.toJson());
-      checkNetworkList(od);
+      checkNetworkList(od as api.NetworkList);
     });
   });
 
@@ -31061,7 +31610,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkPeering();
       var od = api.NetworkPeering.fromJson(o.toJson());
-      checkNetworkPeering(od);
+      checkNetworkPeering(od as api.NetworkPeering);
     });
   });
 
@@ -31069,7 +31618,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkRoutingConfig();
       var od = api.NetworkRoutingConfig.fromJson(o.toJson());
-      checkNetworkRoutingConfig(od);
+      checkNetworkRoutingConfig(od as api.NetworkRoutingConfig);
     });
   });
 
@@ -31077,7 +31626,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworksAddPeeringRequest();
       var od = api.NetworksAddPeeringRequest.fromJson(o.toJson());
-      checkNetworksAddPeeringRequest(od);
+      checkNetworksAddPeeringRequest(od as api.NetworksAddPeeringRequest);
     });
   });
 
@@ -31085,7 +31634,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworksRemovePeeringRequest();
       var od = api.NetworksRemovePeeringRequest.fromJson(o.toJson());
-      checkNetworksRemovePeeringRequest(od);
+      checkNetworksRemovePeeringRequest(od as api.NetworksRemovePeeringRequest);
     });
   });
 
@@ -31093,7 +31642,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworksUpdatePeeringRequest();
       var od = api.NetworksUpdatePeeringRequest.fromJson(o.toJson());
-      checkNetworksUpdatePeeringRequest(od);
+      checkNetworksUpdatePeeringRequest(od as api.NetworksUpdatePeeringRequest);
     });
   });
 
@@ -31101,7 +31650,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroup();
       var od = api.NodeGroup.fromJson(o.toJson());
-      checkNodeGroup(od);
+      checkNodeGroup(od as api.NodeGroup);
     });
   });
 
@@ -31109,7 +31658,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupAggregatedListWarningData();
       var od = api.NodeGroupAggregatedListWarningData.fromJson(o.toJson());
-      checkNodeGroupAggregatedListWarningData(od);
+      checkNodeGroupAggregatedListWarningData(
+          od as api.NodeGroupAggregatedListWarningData);
     });
   });
 
@@ -31117,7 +31667,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupAggregatedListWarning();
       var od = api.NodeGroupAggregatedListWarning.fromJson(o.toJson());
-      checkNodeGroupAggregatedListWarning(od);
+      checkNodeGroupAggregatedListWarning(
+          od as api.NodeGroupAggregatedListWarning);
     });
   });
 
@@ -31125,7 +31676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupAggregatedList();
       var od = api.NodeGroupAggregatedList.fromJson(o.toJson());
-      checkNodeGroupAggregatedList(od);
+      checkNodeGroupAggregatedList(od as api.NodeGroupAggregatedList);
     });
   });
 
@@ -31133,7 +31684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupAutoscalingPolicy();
       var od = api.NodeGroupAutoscalingPolicy.fromJson(o.toJson());
-      checkNodeGroupAutoscalingPolicy(od);
+      checkNodeGroupAutoscalingPolicy(od as api.NodeGroupAutoscalingPolicy);
     });
   });
 
@@ -31141,7 +31692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupListWarningData();
       var od = api.NodeGroupListWarningData.fromJson(o.toJson());
-      checkNodeGroupListWarningData(od);
+      checkNodeGroupListWarningData(od as api.NodeGroupListWarningData);
     });
   });
 
@@ -31149,7 +31700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupListWarning();
       var od = api.NodeGroupListWarning.fromJson(o.toJson());
-      checkNodeGroupListWarning(od);
+      checkNodeGroupListWarning(od as api.NodeGroupListWarning);
     });
   });
 
@@ -31157,7 +31708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupList();
       var od = api.NodeGroupList.fromJson(o.toJson());
-      checkNodeGroupList(od);
+      checkNodeGroupList(od as api.NodeGroupList);
     });
   });
 
@@ -31165,7 +31716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupNode();
       var od = api.NodeGroupNode.fromJson(o.toJson());
-      checkNodeGroupNode(od);
+      checkNodeGroupNode(od as api.NodeGroupNode);
     });
   });
 
@@ -31173,7 +31724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsAddNodesRequest();
       var od = api.NodeGroupsAddNodesRequest.fromJson(o.toJson());
-      checkNodeGroupsAddNodesRequest(od);
+      checkNodeGroupsAddNodesRequest(od as api.NodeGroupsAddNodesRequest);
     });
   });
 
@@ -31181,7 +31732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsDeleteNodesRequest();
       var od = api.NodeGroupsDeleteNodesRequest.fromJson(o.toJson());
-      checkNodeGroupsDeleteNodesRequest(od);
+      checkNodeGroupsDeleteNodesRequest(od as api.NodeGroupsDeleteNodesRequest);
     });
   });
 
@@ -31189,7 +31740,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsListNodesWarningData();
       var od = api.NodeGroupsListNodesWarningData.fromJson(o.toJson());
-      checkNodeGroupsListNodesWarningData(od);
+      checkNodeGroupsListNodesWarningData(
+          od as api.NodeGroupsListNodesWarningData);
     });
   });
 
@@ -31197,7 +31749,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsListNodesWarning();
       var od = api.NodeGroupsListNodesWarning.fromJson(o.toJson());
-      checkNodeGroupsListNodesWarning(od);
+      checkNodeGroupsListNodesWarning(od as api.NodeGroupsListNodesWarning);
     });
   });
 
@@ -31205,7 +31757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsListNodes();
       var od = api.NodeGroupsListNodes.fromJson(o.toJson());
-      checkNodeGroupsListNodes(od);
+      checkNodeGroupsListNodes(od as api.NodeGroupsListNodes);
     });
   });
 
@@ -31213,7 +31765,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsScopedListWarningData();
       var od = api.NodeGroupsScopedListWarningData.fromJson(o.toJson());
-      checkNodeGroupsScopedListWarningData(od);
+      checkNodeGroupsScopedListWarningData(
+          od as api.NodeGroupsScopedListWarningData);
     });
   });
 
@@ -31221,7 +31774,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsScopedListWarning();
       var od = api.NodeGroupsScopedListWarning.fromJson(o.toJson());
-      checkNodeGroupsScopedListWarning(od);
+      checkNodeGroupsScopedListWarning(od as api.NodeGroupsScopedListWarning);
     });
   });
 
@@ -31229,7 +31782,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsScopedList();
       var od = api.NodeGroupsScopedList.fromJson(o.toJson());
-      checkNodeGroupsScopedList(od);
+      checkNodeGroupsScopedList(od as api.NodeGroupsScopedList);
     });
   });
 
@@ -31237,7 +31790,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupsSetNodeTemplateRequest();
       var od = api.NodeGroupsSetNodeTemplateRequest.fromJson(o.toJson());
-      checkNodeGroupsSetNodeTemplateRequest(od);
+      checkNodeGroupsSetNodeTemplateRequest(
+          od as api.NodeGroupsSetNodeTemplateRequest);
     });
   });
 
@@ -31245,7 +31799,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplate();
       var od = api.NodeTemplate.fromJson(o.toJson());
-      checkNodeTemplate(od);
+      checkNodeTemplate(od as api.NodeTemplate);
     });
   });
 
@@ -31253,7 +31807,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplateAggregatedListWarningData();
       var od = api.NodeTemplateAggregatedListWarningData.fromJson(o.toJson());
-      checkNodeTemplateAggregatedListWarningData(od);
+      checkNodeTemplateAggregatedListWarningData(
+          od as api.NodeTemplateAggregatedListWarningData);
     });
   });
 
@@ -31261,7 +31816,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplateAggregatedListWarning();
       var od = api.NodeTemplateAggregatedListWarning.fromJson(o.toJson());
-      checkNodeTemplateAggregatedListWarning(od);
+      checkNodeTemplateAggregatedListWarning(
+          od as api.NodeTemplateAggregatedListWarning);
     });
   });
 
@@ -31269,7 +31825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplateAggregatedList();
       var od = api.NodeTemplateAggregatedList.fromJson(o.toJson());
-      checkNodeTemplateAggregatedList(od);
+      checkNodeTemplateAggregatedList(od as api.NodeTemplateAggregatedList);
     });
   });
 
@@ -31277,7 +31833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplateListWarningData();
       var od = api.NodeTemplateListWarningData.fromJson(o.toJson());
-      checkNodeTemplateListWarningData(od);
+      checkNodeTemplateListWarningData(od as api.NodeTemplateListWarningData);
     });
   });
 
@@ -31285,7 +31841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplateListWarning();
       var od = api.NodeTemplateListWarning.fromJson(o.toJson());
-      checkNodeTemplateListWarning(od);
+      checkNodeTemplateListWarning(od as api.NodeTemplateListWarning);
     });
   });
 
@@ -31293,7 +31849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplateList();
       var od = api.NodeTemplateList.fromJson(o.toJson());
-      checkNodeTemplateList(od);
+      checkNodeTemplateList(od as api.NodeTemplateList);
     });
   });
 
@@ -31301,7 +31857,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplateNodeTypeFlexibility();
       var od = api.NodeTemplateNodeTypeFlexibility.fromJson(o.toJson());
-      checkNodeTemplateNodeTypeFlexibility(od);
+      checkNodeTemplateNodeTypeFlexibility(
+          od as api.NodeTemplateNodeTypeFlexibility);
     });
   });
 
@@ -31309,7 +31866,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplatesScopedListWarningData();
       var od = api.NodeTemplatesScopedListWarningData.fromJson(o.toJson());
-      checkNodeTemplatesScopedListWarningData(od);
+      checkNodeTemplatesScopedListWarningData(
+          od as api.NodeTemplatesScopedListWarningData);
     });
   });
 
@@ -31317,7 +31875,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplatesScopedListWarning();
       var od = api.NodeTemplatesScopedListWarning.fromJson(o.toJson());
-      checkNodeTemplatesScopedListWarning(od);
+      checkNodeTemplatesScopedListWarning(
+          od as api.NodeTemplatesScopedListWarning);
     });
   });
 
@@ -31325,7 +31884,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTemplatesScopedList();
       var od = api.NodeTemplatesScopedList.fromJson(o.toJson());
-      checkNodeTemplatesScopedList(od);
+      checkNodeTemplatesScopedList(od as api.NodeTemplatesScopedList);
     });
   });
 
@@ -31333,7 +31892,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeType();
       var od = api.NodeType.fromJson(o.toJson());
-      checkNodeType(od);
+      checkNodeType(od as api.NodeType);
     });
   });
 
@@ -31341,7 +31900,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypeAggregatedListWarningData();
       var od = api.NodeTypeAggregatedListWarningData.fromJson(o.toJson());
-      checkNodeTypeAggregatedListWarningData(od);
+      checkNodeTypeAggregatedListWarningData(
+          od as api.NodeTypeAggregatedListWarningData);
     });
   });
 
@@ -31349,7 +31909,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypeAggregatedListWarning();
       var od = api.NodeTypeAggregatedListWarning.fromJson(o.toJson());
-      checkNodeTypeAggregatedListWarning(od);
+      checkNodeTypeAggregatedListWarning(
+          od as api.NodeTypeAggregatedListWarning);
     });
   });
 
@@ -31357,7 +31918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypeAggregatedList();
       var od = api.NodeTypeAggregatedList.fromJson(o.toJson());
-      checkNodeTypeAggregatedList(od);
+      checkNodeTypeAggregatedList(od as api.NodeTypeAggregatedList);
     });
   });
 
@@ -31365,7 +31926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypeListWarningData();
       var od = api.NodeTypeListWarningData.fromJson(o.toJson());
-      checkNodeTypeListWarningData(od);
+      checkNodeTypeListWarningData(od as api.NodeTypeListWarningData);
     });
   });
 
@@ -31373,7 +31934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypeListWarning();
       var od = api.NodeTypeListWarning.fromJson(o.toJson());
-      checkNodeTypeListWarning(od);
+      checkNodeTypeListWarning(od as api.NodeTypeListWarning);
     });
   });
 
@@ -31381,7 +31942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypeList();
       var od = api.NodeTypeList.fromJson(o.toJson());
-      checkNodeTypeList(od);
+      checkNodeTypeList(od as api.NodeTypeList);
     });
   });
 
@@ -31389,7 +31950,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypesScopedListWarningData();
       var od = api.NodeTypesScopedListWarningData.fromJson(o.toJson());
-      checkNodeTypesScopedListWarningData(od);
+      checkNodeTypesScopedListWarningData(
+          od as api.NodeTypesScopedListWarningData);
     });
   });
 
@@ -31397,7 +31959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypesScopedListWarning();
       var od = api.NodeTypesScopedListWarning.fromJson(o.toJson());
-      checkNodeTypesScopedListWarning(od);
+      checkNodeTypesScopedListWarning(od as api.NodeTypesScopedListWarning);
     });
   });
 
@@ -31405,7 +31967,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTypesScopedList();
       var od = api.NodeTypesScopedList.fromJson(o.toJson());
-      checkNodeTypesScopedList(od);
+      checkNodeTypesScopedList(od as api.NodeTypesScopedList);
     });
   });
 
@@ -31413,7 +31975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationEndpoint();
       var od = api.NotificationEndpoint.fromJson(o.toJson());
-      checkNotificationEndpoint(od);
+      checkNotificationEndpoint(od as api.NotificationEndpoint);
     });
   });
 
@@ -31421,7 +31983,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationEndpointGrpcSettings();
       var od = api.NotificationEndpointGrpcSettings.fromJson(o.toJson());
-      checkNotificationEndpointGrpcSettings(od);
+      checkNotificationEndpointGrpcSettings(
+          od as api.NotificationEndpointGrpcSettings);
     });
   });
 
@@ -31429,7 +31992,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationEndpointListWarningData();
       var od = api.NotificationEndpointListWarningData.fromJson(o.toJson());
-      checkNotificationEndpointListWarningData(od);
+      checkNotificationEndpointListWarningData(
+          od as api.NotificationEndpointListWarningData);
     });
   });
 
@@ -31437,7 +32001,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationEndpointListWarning();
       var od = api.NotificationEndpointListWarning.fromJson(o.toJson());
-      checkNotificationEndpointListWarning(od);
+      checkNotificationEndpointListWarning(
+          od as api.NotificationEndpointListWarning);
     });
   });
 
@@ -31445,7 +32010,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationEndpointList();
       var od = api.NotificationEndpointList.fromJson(o.toJson());
-      checkNotificationEndpointList(od);
+      checkNotificationEndpointList(od as api.NotificationEndpointList);
     });
   });
 
@@ -31453,7 +32018,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationErrorErrors();
       var od = api.OperationErrorErrors.fromJson(o.toJson());
-      checkOperationErrorErrors(od);
+      checkOperationErrorErrors(od as api.OperationErrorErrors);
     });
   });
 
@@ -31461,7 +32026,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationError();
       var od = api.OperationError.fromJson(o.toJson());
-      checkOperationError(od);
+      checkOperationError(od as api.OperationError);
     });
   });
 
@@ -31469,7 +32034,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationWarningsData();
       var od = api.OperationWarningsData.fromJson(o.toJson());
-      checkOperationWarningsData(od);
+      checkOperationWarningsData(od as api.OperationWarningsData);
     });
   });
 
@@ -31477,7 +32042,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationWarnings();
       var od = api.OperationWarnings.fromJson(o.toJson());
-      checkOperationWarnings(od);
+      checkOperationWarnings(od as api.OperationWarnings);
     });
   });
 
@@ -31485,7 +32050,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -31493,7 +32058,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationAggregatedListWarningData();
       var od = api.OperationAggregatedListWarningData.fromJson(o.toJson());
-      checkOperationAggregatedListWarningData(od);
+      checkOperationAggregatedListWarningData(
+          od as api.OperationAggregatedListWarningData);
     });
   });
 
@@ -31501,7 +32067,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationAggregatedListWarning();
       var od = api.OperationAggregatedListWarning.fromJson(o.toJson());
-      checkOperationAggregatedListWarning(od);
+      checkOperationAggregatedListWarning(
+          od as api.OperationAggregatedListWarning);
     });
   });
 
@@ -31509,7 +32076,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationAggregatedList();
       var od = api.OperationAggregatedList.fromJson(o.toJson());
-      checkOperationAggregatedList(od);
+      checkOperationAggregatedList(od as api.OperationAggregatedList);
     });
   });
 
@@ -31517,7 +32084,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationListWarningData();
       var od = api.OperationListWarningData.fromJson(o.toJson());
-      checkOperationListWarningData(od);
+      checkOperationListWarningData(od as api.OperationListWarningData);
     });
   });
 
@@ -31525,7 +32092,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationListWarning();
       var od = api.OperationListWarning.fromJson(o.toJson());
-      checkOperationListWarning(od);
+      checkOperationListWarning(od as api.OperationListWarning);
     });
   });
 
@@ -31533,7 +32100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationList();
       var od = api.OperationList.fromJson(o.toJson());
-      checkOperationList(od);
+      checkOperationList(od as api.OperationList);
     });
   });
 
@@ -31541,7 +32108,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationsScopedListWarningData();
       var od = api.OperationsScopedListWarningData.fromJson(o.toJson());
-      checkOperationsScopedListWarningData(od);
+      checkOperationsScopedListWarningData(
+          od as api.OperationsScopedListWarningData);
     });
   });
 
@@ -31549,7 +32117,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationsScopedListWarning();
       var od = api.OperationsScopedListWarning.fromJson(o.toJson());
-      checkOperationsScopedListWarning(od);
+      checkOperationsScopedListWarning(od as api.OperationsScopedListWarning);
     });
   });
 
@@ -31557,7 +32125,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationsScopedList();
       var od = api.OperationsScopedList.fromJson(o.toJson());
-      checkOperationsScopedList(od);
+      checkOperationsScopedList(od as api.OperationsScopedList);
     });
   });
 
@@ -31565,7 +32133,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutlierDetection();
       var od = api.OutlierDetection.fromJson(o.toJson());
-      checkOutlierDetection(od);
+      checkOutlierDetection(od as api.OutlierDetection);
     });
   });
 
@@ -31573,7 +32141,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroring();
       var od = api.PacketMirroring.fromJson(o.toJson());
-      checkPacketMirroring(od);
+      checkPacketMirroring(od as api.PacketMirroring);
     });
   });
 
@@ -31582,7 +32150,8 @@
       var o = buildPacketMirroringAggregatedListWarningData();
       var od =
           api.PacketMirroringAggregatedListWarningData.fromJson(o.toJson());
-      checkPacketMirroringAggregatedListWarningData(od);
+      checkPacketMirroringAggregatedListWarningData(
+          od as api.PacketMirroringAggregatedListWarningData);
     });
   });
 
@@ -31590,7 +32159,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringAggregatedListWarning();
       var od = api.PacketMirroringAggregatedListWarning.fromJson(o.toJson());
-      checkPacketMirroringAggregatedListWarning(od);
+      checkPacketMirroringAggregatedListWarning(
+          od as api.PacketMirroringAggregatedListWarning);
     });
   });
 
@@ -31598,7 +32168,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringAggregatedList();
       var od = api.PacketMirroringAggregatedList.fromJson(o.toJson());
-      checkPacketMirroringAggregatedList(od);
+      checkPacketMirroringAggregatedList(
+          od as api.PacketMirroringAggregatedList);
     });
   });
 
@@ -31606,7 +32177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringFilter();
       var od = api.PacketMirroringFilter.fromJson(o.toJson());
-      checkPacketMirroringFilter(od);
+      checkPacketMirroringFilter(od as api.PacketMirroringFilter);
     });
   });
 
@@ -31614,7 +32185,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringForwardingRuleInfo();
       var od = api.PacketMirroringForwardingRuleInfo.fromJson(o.toJson());
-      checkPacketMirroringForwardingRuleInfo(od);
+      checkPacketMirroringForwardingRuleInfo(
+          od as api.PacketMirroringForwardingRuleInfo);
     });
   });
 
@@ -31622,7 +32194,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringListWarningData();
       var od = api.PacketMirroringListWarningData.fromJson(o.toJson());
-      checkPacketMirroringListWarningData(od);
+      checkPacketMirroringListWarningData(
+          od as api.PacketMirroringListWarningData);
     });
   });
 
@@ -31630,7 +32203,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringListWarning();
       var od = api.PacketMirroringListWarning.fromJson(o.toJson());
-      checkPacketMirroringListWarning(od);
+      checkPacketMirroringListWarning(od as api.PacketMirroringListWarning);
     });
   });
 
@@ -31638,7 +32211,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringList();
       var od = api.PacketMirroringList.fromJson(o.toJson());
-      checkPacketMirroringList(od);
+      checkPacketMirroringList(od as api.PacketMirroringList);
     });
   });
 
@@ -31646,7 +32219,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringMirroredResourceInfo();
       var od = api.PacketMirroringMirroredResourceInfo.fromJson(o.toJson());
-      checkPacketMirroringMirroredResourceInfo(od);
+      checkPacketMirroringMirroredResourceInfo(
+          od as api.PacketMirroringMirroredResourceInfo);
     });
   });
 
@@ -31656,7 +32230,8 @@
       var o = buildPacketMirroringMirroredResourceInfoInstanceInfo();
       var od = api.PacketMirroringMirroredResourceInfoInstanceInfo.fromJson(
           o.toJson());
-      checkPacketMirroringMirroredResourceInfoInstanceInfo(od);
+      checkPacketMirroringMirroredResourceInfoInstanceInfo(
+          od as api.PacketMirroringMirroredResourceInfoInstanceInfo);
     });
   });
 
@@ -31666,7 +32241,8 @@
       var o = buildPacketMirroringMirroredResourceInfoSubnetInfo();
       var od = api.PacketMirroringMirroredResourceInfoSubnetInfo.fromJson(
           o.toJson());
-      checkPacketMirroringMirroredResourceInfoSubnetInfo(od);
+      checkPacketMirroringMirroredResourceInfoSubnetInfo(
+          od as api.PacketMirroringMirroredResourceInfoSubnetInfo);
     });
   });
 
@@ -31674,7 +32250,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringNetworkInfo();
       var od = api.PacketMirroringNetworkInfo.fromJson(o.toJson());
-      checkPacketMirroringNetworkInfo(od);
+      checkPacketMirroringNetworkInfo(od as api.PacketMirroringNetworkInfo);
     });
   });
 
@@ -31682,7 +32258,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringsScopedListWarningData();
       var od = api.PacketMirroringsScopedListWarningData.fromJson(o.toJson());
-      checkPacketMirroringsScopedListWarningData(od);
+      checkPacketMirroringsScopedListWarningData(
+          od as api.PacketMirroringsScopedListWarningData);
     });
   });
 
@@ -31690,7 +32267,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringsScopedListWarning();
       var od = api.PacketMirroringsScopedListWarning.fromJson(o.toJson());
-      checkPacketMirroringsScopedListWarning(od);
+      checkPacketMirroringsScopedListWarning(
+          od as api.PacketMirroringsScopedListWarning);
     });
   });
 
@@ -31698,7 +32276,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacketMirroringsScopedList();
       var od = api.PacketMirroringsScopedList.fromJson(o.toJson());
-      checkPacketMirroringsScopedList(od);
+      checkPacketMirroringsScopedList(od as api.PacketMirroringsScopedList);
     });
   });
 
@@ -31706,7 +32284,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathMatcher();
       var od = api.PathMatcher.fromJson(o.toJson());
-      checkPathMatcher(od);
+      checkPathMatcher(od as api.PathMatcher);
     });
   });
 
@@ -31714,7 +32292,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathRule();
       var od = api.PathRule.fromJson(o.toJson());
-      checkPathRule(od);
+      checkPathRule(od as api.PathRule);
     });
   });
 
@@ -31722,7 +32300,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerInstanceConfig();
       var od = api.PerInstanceConfig.fromJson(o.toJson());
-      checkPerInstanceConfig(od);
+      checkPerInstanceConfig(od as api.PerInstanceConfig);
     });
   });
 
@@ -31730,7 +32308,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -31738,7 +32316,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPreconfiguredWafSet();
       var od = api.PreconfiguredWafSet.fromJson(o.toJson());
-      checkPreconfiguredWafSet(od);
+      checkPreconfiguredWafSet(od as api.PreconfiguredWafSet);
     });
   });
 
@@ -31746,7 +32324,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPreservedState();
       var od = api.PreservedState.fromJson(o.toJson());
-      checkPreservedState(od);
+      checkPreservedState(od as api.PreservedState);
     });
   });
 
@@ -31754,7 +32332,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPreservedStatePreservedDisk();
       var od = api.PreservedStatePreservedDisk.fromJson(o.toJson());
-      checkPreservedStatePreservedDisk(od);
+      checkPreservedStatePreservedDisk(od as api.PreservedStatePreservedDisk);
     });
   });
 
@@ -31762,7 +32340,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProject();
       var od = api.Project.fromJson(o.toJson());
-      checkProject(od);
+      checkProject(od as api.Project);
     });
   });
 
@@ -31770,7 +32348,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectsDisableXpnResourceRequest();
       var od = api.ProjectsDisableXpnResourceRequest.fromJson(o.toJson());
-      checkProjectsDisableXpnResourceRequest(od);
+      checkProjectsDisableXpnResourceRequest(
+          od as api.ProjectsDisableXpnResourceRequest);
     });
   });
 
@@ -31778,7 +32357,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectsEnableXpnResourceRequest();
       var od = api.ProjectsEnableXpnResourceRequest.fromJson(o.toJson());
-      checkProjectsEnableXpnResourceRequest(od);
+      checkProjectsEnableXpnResourceRequest(
+          od as api.ProjectsEnableXpnResourceRequest);
     });
   });
 
@@ -31786,7 +32366,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectsGetXpnResources();
       var od = api.ProjectsGetXpnResources.fromJson(o.toJson());
-      checkProjectsGetXpnResources(od);
+      checkProjectsGetXpnResources(od as api.ProjectsGetXpnResources);
     });
   });
 
@@ -31794,7 +32374,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectsListXpnHostsRequest();
       var od = api.ProjectsListXpnHostsRequest.fromJson(o.toJson());
-      checkProjectsListXpnHostsRequest(od);
+      checkProjectsListXpnHostsRequest(od as api.ProjectsListXpnHostsRequest);
     });
   });
 
@@ -31802,7 +32382,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectsSetDefaultNetworkTierRequest();
       var od = api.ProjectsSetDefaultNetworkTierRequest.fromJson(o.toJson());
-      checkProjectsSetDefaultNetworkTierRequest(od);
+      checkProjectsSetDefaultNetworkTierRequest(
+          od as api.ProjectsSetDefaultNetworkTierRequest);
     });
   });
 
@@ -31810,7 +32391,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuota();
       var od = api.Quota.fromJson(o.toJson());
-      checkQuota(od);
+      checkQuota(od as api.Quota);
     });
   });
 
@@ -31818,7 +32399,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReference();
       var od = api.Reference.fromJson(o.toJson());
-      checkReference(od);
+      checkReference(od as api.Reference);
     });
   });
 
@@ -31826,7 +32407,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegion();
       var od = api.Region.fromJson(o.toJson());
-      checkRegion(od);
+      checkRegion(od as api.Region);
     });
   });
 
@@ -31834,7 +32415,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionAutoscalerListWarningData();
       var od = api.RegionAutoscalerListWarningData.fromJson(o.toJson());
-      checkRegionAutoscalerListWarningData(od);
+      checkRegionAutoscalerListWarningData(
+          od as api.RegionAutoscalerListWarningData);
     });
   });
 
@@ -31842,7 +32424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionAutoscalerListWarning();
       var od = api.RegionAutoscalerListWarning.fromJson(o.toJson());
-      checkRegionAutoscalerListWarning(od);
+      checkRegionAutoscalerListWarning(od as api.RegionAutoscalerListWarning);
     });
   });
 
@@ -31850,7 +32432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionAutoscalerList();
       var od = api.RegionAutoscalerList.fromJson(o.toJson());
-      checkRegionAutoscalerList(od);
+      checkRegionAutoscalerList(od as api.RegionAutoscalerList);
     });
   });
 
@@ -31858,7 +32440,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionDiskTypeListWarningData();
       var od = api.RegionDiskTypeListWarningData.fromJson(o.toJson());
-      checkRegionDiskTypeListWarningData(od);
+      checkRegionDiskTypeListWarningData(
+          od as api.RegionDiskTypeListWarningData);
     });
   });
 
@@ -31866,7 +32449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionDiskTypeListWarning();
       var od = api.RegionDiskTypeListWarning.fromJson(o.toJson());
-      checkRegionDiskTypeListWarning(od);
+      checkRegionDiskTypeListWarning(od as api.RegionDiskTypeListWarning);
     });
   });
 
@@ -31874,7 +32457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionDiskTypeList();
       var od = api.RegionDiskTypeList.fromJson(o.toJson());
-      checkRegionDiskTypeList(od);
+      checkRegionDiskTypeList(od as api.RegionDiskTypeList);
     });
   });
 
@@ -31882,7 +32465,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionDisksAddResourcePoliciesRequest();
       var od = api.RegionDisksAddResourcePoliciesRequest.fromJson(o.toJson());
-      checkRegionDisksAddResourcePoliciesRequest(od);
+      checkRegionDisksAddResourcePoliciesRequest(
+          od as api.RegionDisksAddResourcePoliciesRequest);
     });
   });
 
@@ -31891,7 +32475,8 @@
       var o = buildRegionDisksRemoveResourcePoliciesRequest();
       var od =
           api.RegionDisksRemoveResourcePoliciesRequest.fromJson(o.toJson());
-      checkRegionDisksRemoveResourcePoliciesRequest(od);
+      checkRegionDisksRemoveResourcePoliciesRequest(
+          od as api.RegionDisksRemoveResourcePoliciesRequest);
     });
   });
 
@@ -31899,7 +32484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionDisksResizeRequest();
       var od = api.RegionDisksResizeRequest.fromJson(o.toJson());
-      checkRegionDisksResizeRequest(od);
+      checkRegionDisksResizeRequest(od as api.RegionDisksResizeRequest);
     });
   });
 
@@ -31907,7 +32492,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionInstanceGroupListWarningData();
       var od = api.RegionInstanceGroupListWarningData.fromJson(o.toJson());
-      checkRegionInstanceGroupListWarningData(od);
+      checkRegionInstanceGroupListWarningData(
+          od as api.RegionInstanceGroupListWarningData);
     });
   });
 
@@ -31915,7 +32501,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionInstanceGroupListWarning();
       var od = api.RegionInstanceGroupListWarning.fromJson(o.toJson());
-      checkRegionInstanceGroupListWarning(od);
+      checkRegionInstanceGroupListWarning(
+          od as api.RegionInstanceGroupListWarning);
     });
   });
 
@@ -31923,7 +32510,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionInstanceGroupList();
       var od = api.RegionInstanceGroupList.fromJson(o.toJson());
-      checkRegionInstanceGroupList(od);
+      checkRegionInstanceGroupList(od as api.RegionInstanceGroupList);
     });
   });
 
@@ -31933,7 +32520,8 @@
       var o = buildRegionInstanceGroupManagerDeleteInstanceConfigReq();
       var od = api.RegionInstanceGroupManagerDeleteInstanceConfigReq.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagerDeleteInstanceConfigReq(od);
+      checkRegionInstanceGroupManagerDeleteInstanceConfigReq(
+          od as api.RegionInstanceGroupManagerDeleteInstanceConfigReq);
     });
   });
 
@@ -31942,7 +32530,8 @@
       var o = buildRegionInstanceGroupManagerListWarningData();
       var od =
           api.RegionInstanceGroupManagerListWarningData.fromJson(o.toJson());
-      checkRegionInstanceGroupManagerListWarningData(od);
+      checkRegionInstanceGroupManagerListWarningData(
+          od as api.RegionInstanceGroupManagerListWarningData);
     });
   });
 
@@ -31950,7 +32539,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionInstanceGroupManagerListWarning();
       var od = api.RegionInstanceGroupManagerListWarning.fromJson(o.toJson());
-      checkRegionInstanceGroupManagerListWarning(od);
+      checkRegionInstanceGroupManagerListWarning(
+          od as api.RegionInstanceGroupManagerListWarning);
     });
   });
 
@@ -31958,7 +32548,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionInstanceGroupManagerList();
       var od = api.RegionInstanceGroupManagerList.fromJson(o.toJson());
-      checkRegionInstanceGroupManagerList(od);
+      checkRegionInstanceGroupManagerList(
+          od as api.RegionInstanceGroupManagerList);
     });
   });
 
@@ -31968,7 +32559,8 @@
       var o = buildRegionInstanceGroupManagerPatchInstanceConfigReq();
       var od = api.RegionInstanceGroupManagerPatchInstanceConfigReq.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagerPatchInstanceConfigReq(od);
+      checkRegionInstanceGroupManagerPatchInstanceConfigReq(
+          od as api.RegionInstanceGroupManagerPatchInstanceConfigReq);
     });
   });
 
@@ -31978,7 +32570,8 @@
       var o = buildRegionInstanceGroupManagerUpdateInstanceConfigReq();
       var od = api.RegionInstanceGroupManagerUpdateInstanceConfigReq.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagerUpdateInstanceConfigReq(od);
+      checkRegionInstanceGroupManagerUpdateInstanceConfigReq(
+          od as api.RegionInstanceGroupManagerUpdateInstanceConfigReq);
     });
   });
 
@@ -31988,7 +32581,8 @@
       var o = buildRegionInstanceGroupManagersAbandonInstancesRequest();
       var od = api.RegionInstanceGroupManagersAbandonInstancesRequest.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersAbandonInstancesRequest(od);
+      checkRegionInstanceGroupManagersAbandonInstancesRequest(
+          od as api.RegionInstanceGroupManagersAbandonInstancesRequest);
     });
   });
 
@@ -31998,7 +32592,8 @@
       var o = buildRegionInstanceGroupManagersApplyUpdatesRequest();
       var od = api.RegionInstanceGroupManagersApplyUpdatesRequest.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersApplyUpdatesRequest(od);
+      checkRegionInstanceGroupManagersApplyUpdatesRequest(
+          od as api.RegionInstanceGroupManagersApplyUpdatesRequest);
     });
   });
 
@@ -32008,7 +32603,8 @@
       var o = buildRegionInstanceGroupManagersCreateInstancesRequest();
       var od = api.RegionInstanceGroupManagersCreateInstancesRequest.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersCreateInstancesRequest(od);
+      checkRegionInstanceGroupManagersCreateInstancesRequest(
+          od as api.RegionInstanceGroupManagersCreateInstancesRequest);
     });
   });
 
@@ -32018,7 +32614,8 @@
       var o = buildRegionInstanceGroupManagersDeleteInstancesRequest();
       var od = api.RegionInstanceGroupManagersDeleteInstancesRequest.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersDeleteInstancesRequest(od);
+      checkRegionInstanceGroupManagersDeleteInstancesRequest(
+          od as api.RegionInstanceGroupManagersDeleteInstancesRequest);
     });
   });
 
@@ -32028,7 +32625,8 @@
       var o = buildRegionInstanceGroupManagersListErrorsResponse();
       var od = api.RegionInstanceGroupManagersListErrorsResponse.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersListErrorsResponse(od);
+      checkRegionInstanceGroupManagersListErrorsResponse(
+          od as api.RegionInstanceGroupManagersListErrorsResponse);
     });
   });
 
@@ -32040,7 +32638,8 @@
           buildRegionInstanceGroupManagersListInstanceConfigsRespWarningData();
       var od = api.RegionInstanceGroupManagersListInstanceConfigsRespWarningData
           .fromJson(o.toJson());
-      checkRegionInstanceGroupManagersListInstanceConfigsRespWarningData(od);
+      checkRegionInstanceGroupManagersListInstanceConfigsRespWarningData(od
+          as api.RegionInstanceGroupManagersListInstanceConfigsRespWarningData);
     });
   });
 
@@ -32051,7 +32650,8 @@
       var o = buildRegionInstanceGroupManagersListInstanceConfigsRespWarning();
       var od = api.RegionInstanceGroupManagersListInstanceConfigsRespWarning
           .fromJson(o.toJson());
-      checkRegionInstanceGroupManagersListInstanceConfigsRespWarning(od);
+      checkRegionInstanceGroupManagersListInstanceConfigsRespWarning(
+          od as api.RegionInstanceGroupManagersListInstanceConfigsRespWarning);
     });
   });
 
@@ -32061,7 +32661,8 @@
       var o = buildRegionInstanceGroupManagersListInstanceConfigsResp();
       var od = api.RegionInstanceGroupManagersListInstanceConfigsResp.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersListInstanceConfigsResp(od);
+      checkRegionInstanceGroupManagersListInstanceConfigsResp(
+          od as api.RegionInstanceGroupManagersListInstanceConfigsResp);
     });
   });
 
@@ -32071,7 +32672,8 @@
       var o = buildRegionInstanceGroupManagersListInstancesResponse();
       var od = api.RegionInstanceGroupManagersListInstancesResponse.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersListInstancesResponse(od);
+      checkRegionInstanceGroupManagersListInstancesResponse(
+          od as api.RegionInstanceGroupManagersListInstancesResponse);
     });
   });
 
@@ -32080,7 +32682,8 @@
       var o = buildRegionInstanceGroupManagersRecreateRequest();
       var od =
           api.RegionInstanceGroupManagersRecreateRequest.fromJson(o.toJson());
-      checkRegionInstanceGroupManagersRecreateRequest(od);
+      checkRegionInstanceGroupManagersRecreateRequest(
+          od as api.RegionInstanceGroupManagersRecreateRequest);
     });
   });
 
@@ -32090,7 +32693,8 @@
       var o = buildRegionInstanceGroupManagersSetTargetPoolsRequest();
       var od = api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersSetTargetPoolsRequest(od);
+      checkRegionInstanceGroupManagersSetTargetPoolsRequest(
+          od as api.RegionInstanceGroupManagersSetTargetPoolsRequest);
     });
   });
 
@@ -32100,7 +32704,8 @@
       var o = buildRegionInstanceGroupManagersSetTemplateRequest();
       var od = api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(
           o.toJson());
-      checkRegionInstanceGroupManagersSetTemplateRequest(od);
+      checkRegionInstanceGroupManagersSetTemplateRequest(
+          od as api.RegionInstanceGroupManagersSetTemplateRequest);
     });
   });
 
@@ -32109,7 +32714,8 @@
       var o = buildRegionInstanceGroupsListInstancesWarningData();
       var od =
           api.RegionInstanceGroupsListInstancesWarningData.fromJson(o.toJson());
-      checkRegionInstanceGroupsListInstancesWarningData(od);
+      checkRegionInstanceGroupsListInstancesWarningData(
+          od as api.RegionInstanceGroupsListInstancesWarningData);
     });
   });
 
@@ -32118,7 +32724,8 @@
       var o = buildRegionInstanceGroupsListInstancesWarning();
       var od =
           api.RegionInstanceGroupsListInstancesWarning.fromJson(o.toJson());
-      checkRegionInstanceGroupsListInstancesWarning(od);
+      checkRegionInstanceGroupsListInstancesWarning(
+          od as api.RegionInstanceGroupsListInstancesWarning);
     });
   });
 
@@ -32126,7 +32733,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionInstanceGroupsListInstances();
       var od = api.RegionInstanceGroupsListInstances.fromJson(o.toJson());
-      checkRegionInstanceGroupsListInstances(od);
+      checkRegionInstanceGroupsListInstances(
+          od as api.RegionInstanceGroupsListInstances);
     });
   });
 
@@ -32135,7 +32743,8 @@
       var o = buildRegionInstanceGroupsListInstancesRequest();
       var od =
           api.RegionInstanceGroupsListInstancesRequest.fromJson(o.toJson());
-      checkRegionInstanceGroupsListInstancesRequest(od);
+      checkRegionInstanceGroupsListInstancesRequest(
+          od as api.RegionInstanceGroupsListInstancesRequest);
     });
   });
 
@@ -32144,7 +32753,8 @@
       var o = buildRegionInstanceGroupsSetNamedPortsRequest();
       var od =
           api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(o.toJson());
-      checkRegionInstanceGroupsSetNamedPortsRequest(od);
+      checkRegionInstanceGroupsSetNamedPortsRequest(
+          od as api.RegionInstanceGroupsSetNamedPortsRequest);
     });
   });
 
@@ -32152,7 +32762,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionListWarningData();
       var od = api.RegionListWarningData.fromJson(o.toJson());
-      checkRegionListWarningData(od);
+      checkRegionListWarningData(od as api.RegionListWarningData);
     });
   });
 
@@ -32160,7 +32770,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionListWarning();
       var od = api.RegionListWarning.fromJson(o.toJson());
-      checkRegionListWarning(od);
+      checkRegionListWarning(od as api.RegionListWarning);
     });
   });
 
@@ -32168,7 +32778,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionList();
       var od = api.RegionList.fromJson(o.toJson());
-      checkRegionList(od);
+      checkRegionList(od as api.RegionList);
     });
   });
 
@@ -32176,7 +32786,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionSetLabelsRequest();
       var od = api.RegionSetLabelsRequest.fromJson(o.toJson());
-      checkRegionSetLabelsRequest(od);
+      checkRegionSetLabelsRequest(od as api.RegionSetLabelsRequest);
     });
   });
 
@@ -32184,7 +32794,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionSetPolicyRequest();
       var od = api.RegionSetPolicyRequest.fromJson(o.toJson());
-      checkRegionSetPolicyRequest(od);
+      checkRegionSetPolicyRequest(od as api.RegionSetPolicyRequest);
     });
   });
 
@@ -32194,7 +32804,8 @@
       var o = buildRegionTargetHttpsProxiesSetSslCertificatesRequest();
       var od = api.RegionTargetHttpsProxiesSetSslCertificatesRequest.fromJson(
           o.toJson());
-      checkRegionTargetHttpsProxiesSetSslCertificatesRequest(od);
+      checkRegionTargetHttpsProxiesSetSslCertificatesRequest(
+          od as api.RegionTargetHttpsProxiesSetSslCertificatesRequest);
     });
   });
 
@@ -32202,7 +32813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionUrlMapsValidateRequest();
       var od = api.RegionUrlMapsValidateRequest.fromJson(o.toJson());
-      checkRegionUrlMapsValidateRequest(od);
+      checkRegionUrlMapsValidateRequest(od as api.RegionUrlMapsValidateRequest);
     });
   });
 
@@ -32210,7 +32821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestMirrorPolicy();
       var od = api.RequestMirrorPolicy.fromJson(o.toJson());
-      checkRequestMirrorPolicy(od);
+      checkRequestMirrorPolicy(od as api.RequestMirrorPolicy);
     });
   });
 
@@ -32218,7 +32829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservation();
       var od = api.Reservation.fromJson(o.toJson());
-      checkReservation(od);
+      checkReservation(od as api.Reservation);
     });
   });
 
@@ -32226,7 +32837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationAffinity();
       var od = api.ReservationAffinity.fromJson(o.toJson());
-      checkReservationAffinity(od);
+      checkReservationAffinity(od as api.ReservationAffinity);
     });
   });
 
@@ -32234,7 +32845,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationAggregatedListWarningData();
       var od = api.ReservationAggregatedListWarningData.fromJson(o.toJson());
-      checkReservationAggregatedListWarningData(od);
+      checkReservationAggregatedListWarningData(
+          od as api.ReservationAggregatedListWarningData);
     });
   });
 
@@ -32242,7 +32854,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationAggregatedListWarning();
       var od = api.ReservationAggregatedListWarning.fromJson(o.toJson());
-      checkReservationAggregatedListWarning(od);
+      checkReservationAggregatedListWarning(
+          od as api.ReservationAggregatedListWarning);
     });
   });
 
@@ -32250,7 +32863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationAggregatedList();
       var od = api.ReservationAggregatedList.fromJson(o.toJson());
-      checkReservationAggregatedList(od);
+      checkReservationAggregatedList(od as api.ReservationAggregatedList);
     });
   });
 
@@ -32258,7 +32871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationListWarningData();
       var od = api.ReservationListWarningData.fromJson(o.toJson());
-      checkReservationListWarningData(od);
+      checkReservationListWarningData(od as api.ReservationListWarningData);
     });
   });
 
@@ -32266,7 +32879,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationListWarning();
       var od = api.ReservationListWarning.fromJson(o.toJson());
-      checkReservationListWarning(od);
+      checkReservationListWarning(od as api.ReservationListWarning);
     });
   });
 
@@ -32274,7 +32887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationList();
       var od = api.ReservationList.fromJson(o.toJson());
-      checkReservationList(od);
+      checkReservationList(od as api.ReservationList);
     });
   });
 
@@ -32282,7 +32895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationsResizeRequest();
       var od = api.ReservationsResizeRequest.fromJson(o.toJson());
-      checkReservationsResizeRequest(od);
+      checkReservationsResizeRequest(od as api.ReservationsResizeRequest);
     });
   });
 
@@ -32290,7 +32903,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationsScopedListWarningData();
       var od = api.ReservationsScopedListWarningData.fromJson(o.toJson());
-      checkReservationsScopedListWarningData(od);
+      checkReservationsScopedListWarningData(
+          od as api.ReservationsScopedListWarningData);
     });
   });
 
@@ -32298,7 +32912,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationsScopedListWarning();
       var od = api.ReservationsScopedListWarning.fromJson(o.toJson());
-      checkReservationsScopedListWarning(od);
+      checkReservationsScopedListWarning(
+          od as api.ReservationsScopedListWarning);
     });
   });
 
@@ -32306,7 +32921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationsScopedList();
       var od = api.ReservationsScopedList.fromJson(o.toJson());
-      checkReservationsScopedList(od);
+      checkReservationsScopedList(od as api.ReservationsScopedList);
     });
   });
 
@@ -32314,7 +32929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceCommitment();
       var od = api.ResourceCommitment.fromJson(o.toJson());
-      checkResourceCommitment(od);
+      checkResourceCommitment(od as api.ResourceCommitment);
     });
   });
 
@@ -32322,7 +32937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceGroupReference();
       var od = api.ResourceGroupReference.fromJson(o.toJson());
-      checkResourceGroupReference(od);
+      checkResourceGroupReference(od as api.ResourceGroupReference);
     });
   });
 
@@ -32330,7 +32945,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePoliciesScopedListWarningData();
       var od = api.ResourcePoliciesScopedListWarningData.fromJson(o.toJson());
-      checkResourcePoliciesScopedListWarningData(od);
+      checkResourcePoliciesScopedListWarningData(
+          od as api.ResourcePoliciesScopedListWarningData);
     });
   });
 
@@ -32338,7 +32954,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePoliciesScopedListWarning();
       var od = api.ResourcePoliciesScopedListWarning.fromJson(o.toJson());
-      checkResourcePoliciesScopedListWarning(od);
+      checkResourcePoliciesScopedListWarning(
+          od as api.ResourcePoliciesScopedListWarning);
     });
   });
 
@@ -32346,7 +32963,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePoliciesScopedList();
       var od = api.ResourcePoliciesScopedList.fromJson(o.toJson());
-      checkResourcePoliciesScopedList(od);
+      checkResourcePoliciesScopedList(od as api.ResourcePoliciesScopedList);
     });
   });
 
@@ -32354,7 +32971,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicy();
       var od = api.ResourcePolicy.fromJson(o.toJson());
-      checkResourcePolicy(od);
+      checkResourcePolicy(od as api.ResourcePolicy);
     });
   });
 
@@ -32362,7 +32979,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyAggregatedListWarningData();
       var od = api.ResourcePolicyAggregatedListWarningData.fromJson(o.toJson());
-      checkResourcePolicyAggregatedListWarningData(od);
+      checkResourcePolicyAggregatedListWarningData(
+          od as api.ResourcePolicyAggregatedListWarningData);
     });
   });
 
@@ -32370,7 +32988,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyAggregatedListWarning();
       var od = api.ResourcePolicyAggregatedListWarning.fromJson(o.toJson());
-      checkResourcePolicyAggregatedListWarning(od);
+      checkResourcePolicyAggregatedListWarning(
+          od as api.ResourcePolicyAggregatedListWarning);
     });
   });
 
@@ -32378,7 +32997,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyAggregatedList();
       var od = api.ResourcePolicyAggregatedList.fromJson(o.toJson());
-      checkResourcePolicyAggregatedList(od);
+      checkResourcePolicyAggregatedList(od as api.ResourcePolicyAggregatedList);
     });
   });
 
@@ -32386,7 +33005,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyDailyCycle();
       var od = api.ResourcePolicyDailyCycle.fromJson(o.toJson());
-      checkResourcePolicyDailyCycle(od);
+      checkResourcePolicyDailyCycle(od as api.ResourcePolicyDailyCycle);
     });
   });
 
@@ -32394,7 +33013,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyGroupPlacementPolicy();
       var od = api.ResourcePolicyGroupPlacementPolicy.fromJson(o.toJson());
-      checkResourcePolicyGroupPlacementPolicy(od);
+      checkResourcePolicyGroupPlacementPolicy(
+          od as api.ResourcePolicyGroupPlacementPolicy);
     });
   });
 
@@ -32402,7 +33022,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyHourlyCycle();
       var od = api.ResourcePolicyHourlyCycle.fromJson(o.toJson());
-      checkResourcePolicyHourlyCycle(od);
+      checkResourcePolicyHourlyCycle(od as api.ResourcePolicyHourlyCycle);
     });
   });
 
@@ -32410,7 +33030,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyListWarningData();
       var od = api.ResourcePolicyListWarningData.fromJson(o.toJson());
-      checkResourcePolicyListWarningData(od);
+      checkResourcePolicyListWarningData(
+          od as api.ResourcePolicyListWarningData);
     });
   });
 
@@ -32418,7 +33039,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyListWarning();
       var od = api.ResourcePolicyListWarning.fromJson(o.toJson());
-      checkResourcePolicyListWarning(od);
+      checkResourcePolicyListWarning(od as api.ResourcePolicyListWarning);
     });
   });
 
@@ -32426,7 +33047,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyList();
       var od = api.ResourcePolicyList.fromJson(o.toJson());
-      checkResourcePolicyList(od);
+      checkResourcePolicyList(od as api.ResourcePolicyList);
     });
   });
 
@@ -32434,7 +33055,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicySnapshotSchedulePolicy();
       var od = api.ResourcePolicySnapshotSchedulePolicy.fromJson(o.toJson());
-      checkResourcePolicySnapshotSchedulePolicy(od);
+      checkResourcePolicySnapshotSchedulePolicy(
+          od as api.ResourcePolicySnapshotSchedulePolicy);
     });
   });
 
@@ -32444,7 +33066,8 @@
       var o = buildResourcePolicySnapshotSchedulePolicyRetentionPolicy();
       var od = api.ResourcePolicySnapshotSchedulePolicyRetentionPolicy.fromJson(
           o.toJson());
-      checkResourcePolicySnapshotSchedulePolicyRetentionPolicy(od);
+      checkResourcePolicySnapshotSchedulePolicyRetentionPolicy(
+          od as api.ResourcePolicySnapshotSchedulePolicyRetentionPolicy);
     });
   });
 
@@ -32453,7 +33076,8 @@
       var o = buildResourcePolicySnapshotSchedulePolicySchedule();
       var od =
           api.ResourcePolicySnapshotSchedulePolicySchedule.fromJson(o.toJson());
-      checkResourcePolicySnapshotSchedulePolicySchedule(od);
+      checkResourcePolicySnapshotSchedulePolicySchedule(
+          od as api.ResourcePolicySnapshotSchedulePolicySchedule);
     });
   });
 
@@ -32464,7 +33088,8 @@
       var od =
           api.ResourcePolicySnapshotSchedulePolicySnapshotProperties.fromJson(
               o.toJson());
-      checkResourcePolicySnapshotSchedulePolicySnapshotProperties(od);
+      checkResourcePolicySnapshotSchedulePolicySnapshotProperties(
+          od as api.ResourcePolicySnapshotSchedulePolicySnapshotProperties);
     });
   });
 
@@ -32472,7 +33097,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyWeeklyCycle();
       var od = api.ResourcePolicyWeeklyCycle.fromJson(o.toJson());
-      checkResourcePolicyWeeklyCycle(od);
+      checkResourcePolicyWeeklyCycle(od as api.ResourcePolicyWeeklyCycle);
     });
   });
 
@@ -32480,7 +33105,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcePolicyWeeklyCycleDayOfWeek();
       var od = api.ResourcePolicyWeeklyCycleDayOfWeek.fromJson(o.toJson());
-      checkResourcePolicyWeeklyCycleDayOfWeek(od);
+      checkResourcePolicyWeeklyCycleDayOfWeek(
+          od as api.ResourcePolicyWeeklyCycleDayOfWeek);
     });
   });
 
@@ -32488,7 +33114,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteWarningsData();
       var od = api.RouteWarningsData.fromJson(o.toJson());
-      checkRouteWarningsData(od);
+      checkRouteWarningsData(od as api.RouteWarningsData);
     });
   });
 
@@ -32496,7 +33122,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteWarnings();
       var od = api.RouteWarnings.fromJson(o.toJson());
-      checkRouteWarnings(od);
+      checkRouteWarnings(od as api.RouteWarnings);
     });
   });
 
@@ -32504,7 +33130,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoute();
       var od = api.Route.fromJson(o.toJson());
-      checkRoute(od);
+      checkRoute(od as api.Route);
     });
   });
 
@@ -32512,7 +33138,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteListWarningData();
       var od = api.RouteListWarningData.fromJson(o.toJson());
-      checkRouteListWarningData(od);
+      checkRouteListWarningData(od as api.RouteListWarningData);
     });
   });
 
@@ -32520,7 +33146,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteListWarning();
       var od = api.RouteListWarning.fromJson(o.toJson());
-      checkRouteListWarning(od);
+      checkRouteListWarning(od as api.RouteListWarning);
     });
   });
 
@@ -32528,7 +33154,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteList();
       var od = api.RouteList.fromJson(o.toJson());
-      checkRouteList(od);
+      checkRouteList(od as api.RouteList);
     });
   });
 
@@ -32536,7 +33162,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouter();
       var od = api.Router.fromJson(o.toJson());
-      checkRouter(od);
+      checkRouter(od as api.Router);
     });
   });
 
@@ -32544,7 +33170,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterAdvertisedIpRange();
       var od = api.RouterAdvertisedIpRange.fromJson(o.toJson());
-      checkRouterAdvertisedIpRange(od);
+      checkRouterAdvertisedIpRange(od as api.RouterAdvertisedIpRange);
     });
   });
 
@@ -32552,7 +33178,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterAggregatedListWarningData();
       var od = api.RouterAggregatedListWarningData.fromJson(o.toJson());
-      checkRouterAggregatedListWarningData(od);
+      checkRouterAggregatedListWarningData(
+          od as api.RouterAggregatedListWarningData);
     });
   });
 
@@ -32560,7 +33187,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterAggregatedListWarning();
       var od = api.RouterAggregatedListWarning.fromJson(o.toJson());
-      checkRouterAggregatedListWarning(od);
+      checkRouterAggregatedListWarning(od as api.RouterAggregatedListWarning);
     });
   });
 
@@ -32568,7 +33195,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterAggregatedList();
       var od = api.RouterAggregatedList.fromJson(o.toJson());
-      checkRouterAggregatedList(od);
+      checkRouterAggregatedList(od as api.RouterAggregatedList);
     });
   });
 
@@ -32576,7 +33203,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterBgp();
       var od = api.RouterBgp.fromJson(o.toJson());
-      checkRouterBgp(od);
+      checkRouterBgp(od as api.RouterBgp);
     });
   });
 
@@ -32584,7 +33211,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterBgpPeer();
       var od = api.RouterBgpPeer.fromJson(o.toJson());
-      checkRouterBgpPeer(od);
+      checkRouterBgpPeer(od as api.RouterBgpPeer);
     });
   });
 
@@ -32592,7 +33219,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterInterface();
       var od = api.RouterInterface.fromJson(o.toJson());
-      checkRouterInterface(od);
+      checkRouterInterface(od as api.RouterInterface);
     });
   });
 
@@ -32600,7 +33227,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterListWarningData();
       var od = api.RouterListWarningData.fromJson(o.toJson());
-      checkRouterListWarningData(od);
+      checkRouterListWarningData(od as api.RouterListWarningData);
     });
   });
 
@@ -32608,7 +33235,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterListWarning();
       var od = api.RouterListWarning.fromJson(o.toJson());
-      checkRouterListWarning(od);
+      checkRouterListWarning(od as api.RouterListWarning);
     });
   });
 
@@ -32616,7 +33243,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterList();
       var od = api.RouterList.fromJson(o.toJson());
-      checkRouterList(od);
+      checkRouterList(od as api.RouterList);
     });
   });
 
@@ -32624,7 +33251,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterNat();
       var od = api.RouterNat.fromJson(o.toJson());
-      checkRouterNat(od);
+      checkRouterNat(od as api.RouterNat);
     });
   });
 
@@ -32632,7 +33259,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterNatLogConfig();
       var od = api.RouterNatLogConfig.fromJson(o.toJson());
-      checkRouterNatLogConfig(od);
+      checkRouterNatLogConfig(od as api.RouterNatLogConfig);
     });
   });
 
@@ -32640,7 +33267,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterNatSubnetworkToNat();
       var od = api.RouterNatSubnetworkToNat.fromJson(o.toJson());
-      checkRouterNatSubnetworkToNat(od);
+      checkRouterNatSubnetworkToNat(od as api.RouterNatSubnetworkToNat);
     });
   });
 
@@ -32648,7 +33275,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterStatus();
       var od = api.RouterStatus.fromJson(o.toJson());
-      checkRouterStatus(od);
+      checkRouterStatus(od as api.RouterStatus);
     });
   });
 
@@ -32656,7 +33283,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterStatusBgpPeerStatus();
       var od = api.RouterStatusBgpPeerStatus.fromJson(o.toJson());
-      checkRouterStatusBgpPeerStatus(od);
+      checkRouterStatusBgpPeerStatus(od as api.RouterStatusBgpPeerStatus);
     });
   });
 
@@ -32664,7 +33291,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterStatusNatStatus();
       var od = api.RouterStatusNatStatus.fromJson(o.toJson());
-      checkRouterStatusNatStatus(od);
+      checkRouterStatusNatStatus(od as api.RouterStatusNatStatus);
     });
   });
 
@@ -32672,7 +33299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouterStatusResponse();
       var od = api.RouterStatusResponse.fromJson(o.toJson());
-      checkRouterStatusResponse(od);
+      checkRouterStatusResponse(od as api.RouterStatusResponse);
     });
   });
 
@@ -32680,7 +33307,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoutersPreviewResponse();
       var od = api.RoutersPreviewResponse.fromJson(o.toJson());
-      checkRoutersPreviewResponse(od);
+      checkRoutersPreviewResponse(od as api.RoutersPreviewResponse);
     });
   });
 
@@ -32688,7 +33315,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoutersScopedListWarningData();
       var od = api.RoutersScopedListWarningData.fromJson(o.toJson());
-      checkRoutersScopedListWarningData(od);
+      checkRoutersScopedListWarningData(od as api.RoutersScopedListWarningData);
     });
   });
 
@@ -32696,7 +33323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoutersScopedListWarning();
       var od = api.RoutersScopedListWarning.fromJson(o.toJson());
-      checkRoutersScopedListWarning(od);
+      checkRoutersScopedListWarning(od as api.RoutersScopedListWarning);
     });
   });
 
@@ -32704,7 +33331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoutersScopedList();
       var od = api.RoutersScopedList.fromJson(o.toJson());
-      checkRoutersScopedList(od);
+      checkRoutersScopedList(od as api.RoutersScopedList);
     });
   });
 
@@ -32712,7 +33339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRule();
       var od = api.Rule.fromJson(o.toJson());
-      checkRule(od);
+      checkRule(od as api.Rule);
     });
   });
 
@@ -32720,7 +33347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSSLHealthCheck();
       var od = api.SSLHealthCheck.fromJson(o.toJson());
-      checkSSLHealthCheck(od);
+      checkSSLHealthCheck(od as api.SSLHealthCheck);
     });
   });
 
@@ -32728,7 +33355,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScheduling();
       var od = api.Scheduling.fromJson(o.toJson());
-      checkScheduling(od);
+      checkScheduling(od as api.Scheduling);
     });
   });
 
@@ -32736,7 +33363,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchedulingNodeAffinity();
       var od = api.SchedulingNodeAffinity.fromJson(o.toJson());
-      checkSchedulingNodeAffinity(od);
+      checkSchedulingNodeAffinity(od as api.SchedulingNodeAffinity);
     });
   });
 
@@ -32744,7 +33371,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScreenshot();
       var od = api.Screenshot.fromJson(o.toJson());
-      checkScreenshot(od);
+      checkScreenshot(od as api.Screenshot);
     });
   });
 
@@ -32755,7 +33382,8 @@
       var od =
           api.SecurityPoliciesListPreconfiguredExpressionSetsResponse.fromJson(
               o.toJson());
-      checkSecurityPoliciesListPreconfiguredExpressionSetsResponse(od);
+      checkSecurityPoliciesListPreconfiguredExpressionSetsResponse(
+          od as api.SecurityPoliciesListPreconfiguredExpressionSetsResponse);
     });
   });
 
@@ -32763,7 +33391,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPoliciesWafConfig();
       var od = api.SecurityPoliciesWafConfig.fromJson(o.toJson());
-      checkSecurityPoliciesWafConfig(od);
+      checkSecurityPoliciesWafConfig(od as api.SecurityPoliciesWafConfig);
     });
   });
 
@@ -32771,7 +33399,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicy();
       var od = api.SecurityPolicy.fromJson(o.toJson());
-      checkSecurityPolicy(od);
+      checkSecurityPolicy(od as api.SecurityPolicy);
     });
   });
 
@@ -32779,7 +33407,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicyListWarningData();
       var od = api.SecurityPolicyListWarningData.fromJson(o.toJson());
-      checkSecurityPolicyListWarningData(od);
+      checkSecurityPolicyListWarningData(
+          od as api.SecurityPolicyListWarningData);
     });
   });
 
@@ -32787,7 +33416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicyListWarning();
       var od = api.SecurityPolicyListWarning.fromJson(o.toJson());
-      checkSecurityPolicyListWarning(od);
+      checkSecurityPolicyListWarning(od as api.SecurityPolicyListWarning);
     });
   });
 
@@ -32795,7 +33424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicyList();
       var od = api.SecurityPolicyList.fromJson(o.toJson());
-      checkSecurityPolicyList(od);
+      checkSecurityPolicyList(od as api.SecurityPolicyList);
     });
   });
 
@@ -32803,7 +33432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicyReference();
       var od = api.SecurityPolicyReference.fromJson(o.toJson());
-      checkSecurityPolicyReference(od);
+      checkSecurityPolicyReference(od as api.SecurityPolicyReference);
     });
   });
 
@@ -32811,7 +33440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicyRule();
       var od = api.SecurityPolicyRule.fromJson(o.toJson());
-      checkSecurityPolicyRule(od);
+      checkSecurityPolicyRule(od as api.SecurityPolicyRule);
     });
   });
 
@@ -32819,7 +33448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicyRuleMatcher();
       var od = api.SecurityPolicyRuleMatcher.fromJson(o.toJson());
-      checkSecurityPolicyRuleMatcher(od);
+      checkSecurityPolicyRuleMatcher(od as api.SecurityPolicyRuleMatcher);
     });
   });
 
@@ -32827,7 +33456,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityPolicyRuleMatcherConfig();
       var od = api.SecurityPolicyRuleMatcherConfig.fromJson(o.toJson());
-      checkSecurityPolicyRuleMatcherConfig(od);
+      checkSecurityPolicyRuleMatcherConfig(
+          od as api.SecurityPolicyRuleMatcherConfig);
     });
   });
 
@@ -32835,7 +33465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSerialPortOutput();
       var od = api.SerialPortOutput.fromJson(o.toJson());
-      checkSerialPortOutput(od);
+      checkSerialPortOutput(od as api.SerialPortOutput);
     });
   });
 
@@ -32843,7 +33473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServerBinding();
       var od = api.ServerBinding.fromJson(o.toJson());
-      checkServerBinding(od);
+      checkServerBinding(od as api.ServerBinding);
     });
   });
 
@@ -32851,7 +33481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccount();
       var od = api.ServiceAccount.fromJson(o.toJson());
-      checkServiceAccount(od);
+      checkServiceAccount(od as api.ServiceAccount);
     });
   });
 
@@ -32859,7 +33489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShieldedInstanceConfig();
       var od = api.ShieldedInstanceConfig.fromJson(o.toJson());
-      checkShieldedInstanceConfig(od);
+      checkShieldedInstanceConfig(od as api.ShieldedInstanceConfig);
     });
   });
 
@@ -32867,7 +33497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShieldedInstanceIdentity();
       var od = api.ShieldedInstanceIdentity.fromJson(o.toJson());
-      checkShieldedInstanceIdentity(od);
+      checkShieldedInstanceIdentity(od as api.ShieldedInstanceIdentity);
     });
   });
 
@@ -32875,7 +33505,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildShieldedInstanceIdentityEntry();
       var od = api.ShieldedInstanceIdentityEntry.fromJson(o.toJson());
-      checkShieldedInstanceIdentityEntry(od);
+      checkShieldedInstanceIdentityEntry(
+          od as api.ShieldedInstanceIdentityEntry);
     });
   });
 
@@ -32883,7 +33514,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildShieldedInstanceIntegrityPolicy();
       var od = api.ShieldedInstanceIntegrityPolicy.fromJson(o.toJson());
-      checkShieldedInstanceIntegrityPolicy(od);
+      checkShieldedInstanceIntegrityPolicy(
+          od as api.ShieldedInstanceIntegrityPolicy);
     });
   });
 
@@ -32891,7 +33523,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignedUrlKey();
       var od = api.SignedUrlKey.fromJson(o.toJson());
-      checkSignedUrlKey(od);
+      checkSignedUrlKey(od as api.SignedUrlKey);
     });
   });
 
@@ -32899,7 +33531,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshot();
       var od = api.Snapshot.fromJson(o.toJson());
-      checkSnapshot(od);
+      checkSnapshot(od as api.Snapshot);
     });
   });
 
@@ -32907,7 +33539,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshotListWarningData();
       var od = api.SnapshotListWarningData.fromJson(o.toJson());
-      checkSnapshotListWarningData(od);
+      checkSnapshotListWarningData(od as api.SnapshotListWarningData);
     });
   });
 
@@ -32915,7 +33547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshotListWarning();
       var od = api.SnapshotListWarning.fromJson(o.toJson());
-      checkSnapshotListWarning(od);
+      checkSnapshotListWarning(od as api.SnapshotListWarning);
     });
   });
 
@@ -32923,7 +33555,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshotList();
       var od = api.SnapshotList.fromJson(o.toJson());
-      checkSnapshotList(od);
+      checkSnapshotList(od as api.SnapshotList);
     });
   });
 
@@ -32931,7 +33563,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceInstanceParams();
       var od = api.SourceInstanceParams.fromJson(o.toJson());
-      checkSourceInstanceParams(od);
+      checkSourceInstanceParams(od as api.SourceInstanceParams);
     });
   });
 
@@ -32939,7 +33571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificate();
       var od = api.SslCertificate.fromJson(o.toJson());
-      checkSslCertificate(od);
+      checkSslCertificate(od as api.SslCertificate);
     });
   });
 
@@ -32947,7 +33579,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateAggregatedListWarningData();
       var od = api.SslCertificateAggregatedListWarningData.fromJson(o.toJson());
-      checkSslCertificateAggregatedListWarningData(od);
+      checkSslCertificateAggregatedListWarningData(
+          od as api.SslCertificateAggregatedListWarningData);
     });
   });
 
@@ -32955,7 +33588,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateAggregatedListWarning();
       var od = api.SslCertificateAggregatedListWarning.fromJson(o.toJson());
-      checkSslCertificateAggregatedListWarning(od);
+      checkSslCertificateAggregatedListWarning(
+          od as api.SslCertificateAggregatedListWarning);
     });
   });
 
@@ -32963,7 +33597,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateAggregatedList();
       var od = api.SslCertificateAggregatedList.fromJson(o.toJson());
-      checkSslCertificateAggregatedList(od);
+      checkSslCertificateAggregatedList(od as api.SslCertificateAggregatedList);
     });
   });
 
@@ -32971,7 +33605,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateListWarningData();
       var od = api.SslCertificateListWarningData.fromJson(o.toJson());
-      checkSslCertificateListWarningData(od);
+      checkSslCertificateListWarningData(
+          od as api.SslCertificateListWarningData);
     });
   });
 
@@ -32979,7 +33614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateListWarning();
       var od = api.SslCertificateListWarning.fromJson(o.toJson());
-      checkSslCertificateListWarning(od);
+      checkSslCertificateListWarning(od as api.SslCertificateListWarning);
     });
   });
 
@@ -32987,7 +33622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateList();
       var od = api.SslCertificateList.fromJson(o.toJson());
-      checkSslCertificateList(od);
+      checkSslCertificateList(od as api.SslCertificateList);
     });
   });
 
@@ -32995,7 +33630,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateManagedSslCertificate();
       var od = api.SslCertificateManagedSslCertificate.fromJson(o.toJson());
-      checkSslCertificateManagedSslCertificate(od);
+      checkSslCertificateManagedSslCertificate(
+          od as api.SslCertificateManagedSslCertificate);
     });
   });
 
@@ -33003,7 +33639,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificateSelfManagedSslCertificate();
       var od = api.SslCertificateSelfManagedSslCertificate.fromJson(o.toJson());
-      checkSslCertificateSelfManagedSslCertificate(od);
+      checkSslCertificateSelfManagedSslCertificate(
+          od as api.SslCertificateSelfManagedSslCertificate);
     });
   });
 
@@ -33011,7 +33648,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificatesScopedListWarningData();
       var od = api.SslCertificatesScopedListWarningData.fromJson(o.toJson());
-      checkSslCertificatesScopedListWarningData(od);
+      checkSslCertificatesScopedListWarningData(
+          od as api.SslCertificatesScopedListWarningData);
     });
   });
 
@@ -33019,7 +33657,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificatesScopedListWarning();
       var od = api.SslCertificatesScopedListWarning.fromJson(o.toJson());
-      checkSslCertificatesScopedListWarning(od);
+      checkSslCertificatesScopedListWarning(
+          od as api.SslCertificatesScopedListWarning);
     });
   });
 
@@ -33027,7 +33666,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslCertificatesScopedList();
       var od = api.SslCertificatesScopedList.fromJson(o.toJson());
-      checkSslCertificatesScopedList(od);
+      checkSslCertificatesScopedList(od as api.SslCertificatesScopedList);
     });
   });
 
@@ -33035,7 +33674,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslPoliciesListWarningData();
       var od = api.SslPoliciesListWarningData.fromJson(o.toJson());
-      checkSslPoliciesListWarningData(od);
+      checkSslPoliciesListWarningData(od as api.SslPoliciesListWarningData);
     });
   });
 
@@ -33043,7 +33682,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslPoliciesListWarning();
       var od = api.SslPoliciesListWarning.fromJson(o.toJson());
-      checkSslPoliciesListWarning(od);
+      checkSslPoliciesListWarning(od as api.SslPoliciesListWarning);
     });
   });
 
@@ -33051,7 +33690,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslPoliciesList();
       var od = api.SslPoliciesList.fromJson(o.toJson());
-      checkSslPoliciesList(od);
+      checkSslPoliciesList(od as api.SslPoliciesList);
     });
   });
 
@@ -33060,7 +33699,8 @@
       var o = buildSslPoliciesListAvailableFeaturesResponse();
       var od =
           api.SslPoliciesListAvailableFeaturesResponse.fromJson(o.toJson());
-      checkSslPoliciesListAvailableFeaturesResponse(od);
+      checkSslPoliciesListAvailableFeaturesResponse(
+          od as api.SslPoliciesListAvailableFeaturesResponse);
     });
   });
 
@@ -33068,7 +33708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslPolicyWarningsData();
       var od = api.SslPolicyWarningsData.fromJson(o.toJson());
-      checkSslPolicyWarningsData(od);
+      checkSslPolicyWarningsData(od as api.SslPolicyWarningsData);
     });
   });
 
@@ -33076,7 +33716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslPolicyWarnings();
       var od = api.SslPolicyWarnings.fromJson(o.toJson());
-      checkSslPolicyWarnings(od);
+      checkSslPolicyWarnings(od as api.SslPolicyWarnings);
     });
   });
 
@@ -33084,7 +33724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslPolicy();
       var od = api.SslPolicy.fromJson(o.toJson());
-      checkSslPolicy(od);
+      checkSslPolicy(od as api.SslPolicy);
     });
   });
 
@@ -33092,7 +33732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSslPolicyReference();
       var od = api.SslPolicyReference.fromJson(o.toJson());
-      checkSslPolicyReference(od);
+      checkSslPolicyReference(od as api.SslPolicyReference);
     });
   });
 
@@ -33100,7 +33740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatefulPolicy();
       var od = api.StatefulPolicy.fromJson(o.toJson());
-      checkStatefulPolicy(od);
+      checkStatefulPolicy(od as api.StatefulPolicy);
     });
   });
 
@@ -33108,7 +33748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatefulPolicyPreservedState();
       var od = api.StatefulPolicyPreservedState.fromJson(o.toJson());
-      checkStatefulPolicyPreservedState(od);
+      checkStatefulPolicyPreservedState(od as api.StatefulPolicyPreservedState);
     });
   });
 
@@ -33116,7 +33756,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatefulPolicyPreservedStateDiskDevice();
       var od = api.StatefulPolicyPreservedStateDiskDevice.fromJson(o.toJson());
-      checkStatefulPolicyPreservedStateDiskDevice(od);
+      checkStatefulPolicyPreservedStateDiskDevice(
+          od as api.StatefulPolicyPreservedStateDiskDevice);
     });
   });
 
@@ -33124,7 +33765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetwork();
       var od = api.Subnetwork.fromJson(o.toJson());
-      checkSubnetwork(od);
+      checkSubnetwork(od as api.Subnetwork);
     });
   });
 
@@ -33132,7 +33773,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkAggregatedListWarningData();
       var od = api.SubnetworkAggregatedListWarningData.fromJson(o.toJson());
-      checkSubnetworkAggregatedListWarningData(od);
+      checkSubnetworkAggregatedListWarningData(
+          od as api.SubnetworkAggregatedListWarningData);
     });
   });
 
@@ -33140,7 +33782,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkAggregatedListWarning();
       var od = api.SubnetworkAggregatedListWarning.fromJson(o.toJson());
-      checkSubnetworkAggregatedListWarning(od);
+      checkSubnetworkAggregatedListWarning(
+          od as api.SubnetworkAggregatedListWarning);
     });
   });
 
@@ -33148,7 +33791,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkAggregatedList();
       var od = api.SubnetworkAggregatedList.fromJson(o.toJson());
-      checkSubnetworkAggregatedList(od);
+      checkSubnetworkAggregatedList(od as api.SubnetworkAggregatedList);
     });
   });
 
@@ -33156,7 +33799,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkListWarningData();
       var od = api.SubnetworkListWarningData.fromJson(o.toJson());
-      checkSubnetworkListWarningData(od);
+      checkSubnetworkListWarningData(od as api.SubnetworkListWarningData);
     });
   });
 
@@ -33164,7 +33807,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkListWarning();
       var od = api.SubnetworkListWarning.fromJson(o.toJson());
-      checkSubnetworkListWarning(od);
+      checkSubnetworkListWarning(od as api.SubnetworkListWarning);
     });
   });
 
@@ -33172,7 +33815,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkList();
       var od = api.SubnetworkList.fromJson(o.toJson());
-      checkSubnetworkList(od);
+      checkSubnetworkList(od as api.SubnetworkList);
     });
   });
 
@@ -33180,7 +33823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkLogConfig();
       var od = api.SubnetworkLogConfig.fromJson(o.toJson());
-      checkSubnetworkLogConfig(od);
+      checkSubnetworkLogConfig(od as api.SubnetworkLogConfig);
     });
   });
 
@@ -33188,7 +33831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworkSecondaryRange();
       var od = api.SubnetworkSecondaryRange.fromJson(o.toJson());
-      checkSubnetworkSecondaryRange(od);
+      checkSubnetworkSecondaryRange(od as api.SubnetworkSecondaryRange);
     });
   });
 
@@ -33196,7 +33839,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworksExpandIpCidrRangeRequest();
       var od = api.SubnetworksExpandIpCidrRangeRequest.fromJson(o.toJson());
-      checkSubnetworksExpandIpCidrRangeRequest(od);
+      checkSubnetworksExpandIpCidrRangeRequest(
+          od as api.SubnetworksExpandIpCidrRangeRequest);
     });
   });
 
@@ -33204,7 +33848,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworksScopedListWarningData();
       var od = api.SubnetworksScopedListWarningData.fromJson(o.toJson());
-      checkSubnetworksScopedListWarningData(od);
+      checkSubnetworksScopedListWarningData(
+          od as api.SubnetworksScopedListWarningData);
     });
   });
 
@@ -33212,7 +33857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworksScopedListWarning();
       var od = api.SubnetworksScopedListWarning.fromJson(o.toJson());
-      checkSubnetworksScopedListWarning(od);
+      checkSubnetworksScopedListWarning(od as api.SubnetworksScopedListWarning);
     });
   });
 
@@ -33220,7 +33865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetworksScopedList();
       var od = api.SubnetworksScopedList.fromJson(o.toJson());
-      checkSubnetworksScopedList(od);
+      checkSubnetworksScopedList(od as api.SubnetworksScopedList);
     });
   });
 
@@ -33229,7 +33874,8 @@
       var o = buildSubnetworksSetPrivateIpGoogleAccessRequest();
       var od =
           api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(o.toJson());
-      checkSubnetworksSetPrivateIpGoogleAccessRequest(od);
+      checkSubnetworksSetPrivateIpGoogleAccessRequest(
+          od as api.SubnetworksSetPrivateIpGoogleAccessRequest);
     });
   });
 
@@ -33237,7 +33883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTCPHealthCheck();
       var od = api.TCPHealthCheck.fromJson(o.toJson());
-      checkTCPHealthCheck(od);
+      checkTCPHealthCheck(od as api.TCPHealthCheck);
     });
   });
 
@@ -33245,7 +33891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTags();
       var od = api.Tags.fromJson(o.toJson());
-      checkTags(od);
+      checkTags(od as api.Tags);
     });
   });
 
@@ -33253,7 +33899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetGrpcProxy();
       var od = api.TargetGrpcProxy.fromJson(o.toJson());
-      checkTargetGrpcProxy(od);
+      checkTargetGrpcProxy(od as api.TargetGrpcProxy);
     });
   });
 
@@ -33261,7 +33907,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetGrpcProxyListWarningData();
       var od = api.TargetGrpcProxyListWarningData.fromJson(o.toJson());
-      checkTargetGrpcProxyListWarningData(od);
+      checkTargetGrpcProxyListWarningData(
+          od as api.TargetGrpcProxyListWarningData);
     });
   });
 
@@ -33269,7 +33916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetGrpcProxyListWarning();
       var od = api.TargetGrpcProxyListWarning.fromJson(o.toJson());
-      checkTargetGrpcProxyListWarning(od);
+      checkTargetGrpcProxyListWarning(od as api.TargetGrpcProxyListWarning);
     });
   });
 
@@ -33277,7 +33924,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetGrpcProxyList();
       var od = api.TargetGrpcProxyList.fromJson(o.toJson());
-      checkTargetGrpcProxyList(od);
+      checkTargetGrpcProxyList(od as api.TargetGrpcProxyList);
     });
   });
 
@@ -33285,7 +33932,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxiesScopedListWarningData();
       var od = api.TargetHttpProxiesScopedListWarningData.fromJson(o.toJson());
-      checkTargetHttpProxiesScopedListWarningData(od);
+      checkTargetHttpProxiesScopedListWarningData(
+          od as api.TargetHttpProxiesScopedListWarningData);
     });
   });
 
@@ -33293,7 +33941,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxiesScopedListWarning();
       var od = api.TargetHttpProxiesScopedListWarning.fromJson(o.toJson());
-      checkTargetHttpProxiesScopedListWarning(od);
+      checkTargetHttpProxiesScopedListWarning(
+          od as api.TargetHttpProxiesScopedListWarning);
     });
   });
 
@@ -33301,7 +33950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxiesScopedList();
       var od = api.TargetHttpProxiesScopedList.fromJson(o.toJson());
-      checkTargetHttpProxiesScopedList(od);
+      checkTargetHttpProxiesScopedList(od as api.TargetHttpProxiesScopedList);
     });
   });
 
@@ -33309,7 +33958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxy();
       var od = api.TargetHttpProxy.fromJson(o.toJson());
-      checkTargetHttpProxy(od);
+      checkTargetHttpProxy(od as api.TargetHttpProxy);
     });
   });
 
@@ -33317,7 +33966,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxyAggregatedList();
       var od = api.TargetHttpProxyAggregatedList.fromJson(o.toJson());
-      checkTargetHttpProxyAggregatedList(od);
+      checkTargetHttpProxyAggregatedList(
+          od as api.TargetHttpProxyAggregatedList);
     });
   });
 
@@ -33325,7 +33975,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxyListWarningData();
       var od = api.TargetHttpProxyListWarningData.fromJson(o.toJson());
-      checkTargetHttpProxyListWarningData(od);
+      checkTargetHttpProxyListWarningData(
+          od as api.TargetHttpProxyListWarningData);
     });
   });
 
@@ -33333,7 +33984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxyListWarning();
       var od = api.TargetHttpProxyListWarning.fromJson(o.toJson());
-      checkTargetHttpProxyListWarning(od);
+      checkTargetHttpProxyListWarning(od as api.TargetHttpProxyListWarning);
     });
   });
 
@@ -33341,7 +33992,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpProxyList();
       var od = api.TargetHttpProxyList.fromJson(o.toJson());
-      checkTargetHttpProxyList(od);
+      checkTargetHttpProxyList(od as api.TargetHttpProxyList);
     });
   });
 
@@ -33349,7 +34000,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxiesScopedListWarningData();
       var od = api.TargetHttpsProxiesScopedListWarningData.fromJson(o.toJson());
-      checkTargetHttpsProxiesScopedListWarningData(od);
+      checkTargetHttpsProxiesScopedListWarningData(
+          od as api.TargetHttpsProxiesScopedListWarningData);
     });
   });
 
@@ -33357,7 +34009,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxiesScopedListWarning();
       var od = api.TargetHttpsProxiesScopedListWarning.fromJson(o.toJson());
-      checkTargetHttpsProxiesScopedListWarning(od);
+      checkTargetHttpsProxiesScopedListWarning(
+          od as api.TargetHttpsProxiesScopedListWarning);
     });
   });
 
@@ -33365,7 +34018,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxiesScopedList();
       var od = api.TargetHttpsProxiesScopedList.fromJson(o.toJson());
-      checkTargetHttpsProxiesScopedList(od);
+      checkTargetHttpsProxiesScopedList(od as api.TargetHttpsProxiesScopedList);
     });
   });
 
@@ -33374,7 +34027,8 @@
       var o = buildTargetHttpsProxiesSetQuicOverrideRequest();
       var od =
           api.TargetHttpsProxiesSetQuicOverrideRequest.fromJson(o.toJson());
-      checkTargetHttpsProxiesSetQuicOverrideRequest(od);
+      checkTargetHttpsProxiesSetQuicOverrideRequest(
+          od as api.TargetHttpsProxiesSetQuicOverrideRequest);
     });
   });
 
@@ -33383,7 +34037,8 @@
       var o = buildTargetHttpsProxiesSetSslCertificatesRequest();
       var od =
           api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(o.toJson());
-      checkTargetHttpsProxiesSetSslCertificatesRequest(od);
+      checkTargetHttpsProxiesSetSslCertificatesRequest(
+          od as api.TargetHttpsProxiesSetSslCertificatesRequest);
     });
   });
 
@@ -33391,7 +34046,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxy();
       var od = api.TargetHttpsProxy.fromJson(o.toJson());
-      checkTargetHttpsProxy(od);
+      checkTargetHttpsProxy(od as api.TargetHttpsProxy);
     });
   });
 
@@ -33400,7 +34055,8 @@
       var o = buildTargetHttpsProxyAggregatedListWarningData();
       var od =
           api.TargetHttpsProxyAggregatedListWarningData.fromJson(o.toJson());
-      checkTargetHttpsProxyAggregatedListWarningData(od);
+      checkTargetHttpsProxyAggregatedListWarningData(
+          od as api.TargetHttpsProxyAggregatedListWarningData);
     });
   });
 
@@ -33408,7 +34064,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxyAggregatedListWarning();
       var od = api.TargetHttpsProxyAggregatedListWarning.fromJson(o.toJson());
-      checkTargetHttpsProxyAggregatedListWarning(od);
+      checkTargetHttpsProxyAggregatedListWarning(
+          od as api.TargetHttpsProxyAggregatedListWarning);
     });
   });
 
@@ -33416,7 +34073,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxyAggregatedList();
       var od = api.TargetHttpsProxyAggregatedList.fromJson(o.toJson());
-      checkTargetHttpsProxyAggregatedList(od);
+      checkTargetHttpsProxyAggregatedList(
+          od as api.TargetHttpsProxyAggregatedList);
     });
   });
 
@@ -33424,7 +34082,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxyListWarningData();
       var od = api.TargetHttpsProxyListWarningData.fromJson(o.toJson());
-      checkTargetHttpsProxyListWarningData(od);
+      checkTargetHttpsProxyListWarningData(
+          od as api.TargetHttpsProxyListWarningData);
     });
   });
 
@@ -33432,7 +34091,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxyListWarning();
       var od = api.TargetHttpsProxyListWarning.fromJson(o.toJson());
-      checkTargetHttpsProxyListWarning(od);
+      checkTargetHttpsProxyListWarning(od as api.TargetHttpsProxyListWarning);
     });
   });
 
@@ -33440,7 +34099,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetHttpsProxyList();
       var od = api.TargetHttpsProxyList.fromJson(o.toJson());
-      checkTargetHttpsProxyList(od);
+      checkTargetHttpsProxyList(od as api.TargetHttpsProxyList);
     });
   });
 
@@ -33448,7 +34107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstance();
       var od = api.TargetInstance.fromJson(o.toJson());
-      checkTargetInstance(od);
+      checkTargetInstance(od as api.TargetInstance);
     });
   });
 
@@ -33456,7 +34115,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstanceAggregatedListWarningData();
       var od = api.TargetInstanceAggregatedListWarningData.fromJson(o.toJson());
-      checkTargetInstanceAggregatedListWarningData(od);
+      checkTargetInstanceAggregatedListWarningData(
+          od as api.TargetInstanceAggregatedListWarningData);
     });
   });
 
@@ -33464,7 +34124,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstanceAggregatedListWarning();
       var od = api.TargetInstanceAggregatedListWarning.fromJson(o.toJson());
-      checkTargetInstanceAggregatedListWarning(od);
+      checkTargetInstanceAggregatedListWarning(
+          od as api.TargetInstanceAggregatedListWarning);
     });
   });
 
@@ -33472,7 +34133,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstanceAggregatedList();
       var od = api.TargetInstanceAggregatedList.fromJson(o.toJson());
-      checkTargetInstanceAggregatedList(od);
+      checkTargetInstanceAggregatedList(od as api.TargetInstanceAggregatedList);
     });
   });
 
@@ -33480,7 +34141,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstanceListWarningData();
       var od = api.TargetInstanceListWarningData.fromJson(o.toJson());
-      checkTargetInstanceListWarningData(od);
+      checkTargetInstanceListWarningData(
+          od as api.TargetInstanceListWarningData);
     });
   });
 
@@ -33488,7 +34150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstanceListWarning();
       var od = api.TargetInstanceListWarning.fromJson(o.toJson());
-      checkTargetInstanceListWarning(od);
+      checkTargetInstanceListWarning(od as api.TargetInstanceListWarning);
     });
   });
 
@@ -33496,7 +34158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstanceList();
       var od = api.TargetInstanceList.fromJson(o.toJson());
-      checkTargetInstanceList(od);
+      checkTargetInstanceList(od as api.TargetInstanceList);
     });
   });
 
@@ -33504,7 +34166,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstancesScopedListWarningData();
       var od = api.TargetInstancesScopedListWarningData.fromJson(o.toJson());
-      checkTargetInstancesScopedListWarningData(od);
+      checkTargetInstancesScopedListWarningData(
+          od as api.TargetInstancesScopedListWarningData);
     });
   });
 
@@ -33512,7 +34175,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstancesScopedListWarning();
       var od = api.TargetInstancesScopedListWarning.fromJson(o.toJson());
-      checkTargetInstancesScopedListWarning(od);
+      checkTargetInstancesScopedListWarning(
+          od as api.TargetInstancesScopedListWarning);
     });
   });
 
@@ -33520,7 +34184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetInstancesScopedList();
       var od = api.TargetInstancesScopedList.fromJson(o.toJson());
-      checkTargetInstancesScopedList(od);
+      checkTargetInstancesScopedList(od as api.TargetInstancesScopedList);
     });
   });
 
@@ -33528,7 +34192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPool();
       var od = api.TargetPool.fromJson(o.toJson());
-      checkTargetPool(od);
+      checkTargetPool(od as api.TargetPool);
     });
   });
 
@@ -33536,7 +34200,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolAggregatedListWarningData();
       var od = api.TargetPoolAggregatedListWarningData.fromJson(o.toJson());
-      checkTargetPoolAggregatedListWarningData(od);
+      checkTargetPoolAggregatedListWarningData(
+          od as api.TargetPoolAggregatedListWarningData);
     });
   });
 
@@ -33544,7 +34209,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolAggregatedListWarning();
       var od = api.TargetPoolAggregatedListWarning.fromJson(o.toJson());
-      checkTargetPoolAggregatedListWarning(od);
+      checkTargetPoolAggregatedListWarning(
+          od as api.TargetPoolAggregatedListWarning);
     });
   });
 
@@ -33552,7 +34218,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolAggregatedList();
       var od = api.TargetPoolAggregatedList.fromJson(o.toJson());
-      checkTargetPoolAggregatedList(od);
+      checkTargetPoolAggregatedList(od as api.TargetPoolAggregatedList);
     });
   });
 
@@ -33560,7 +34226,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolInstanceHealth();
       var od = api.TargetPoolInstanceHealth.fromJson(o.toJson());
-      checkTargetPoolInstanceHealth(od);
+      checkTargetPoolInstanceHealth(od as api.TargetPoolInstanceHealth);
     });
   });
 
@@ -33568,7 +34234,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolListWarningData();
       var od = api.TargetPoolListWarningData.fromJson(o.toJson());
-      checkTargetPoolListWarningData(od);
+      checkTargetPoolListWarningData(od as api.TargetPoolListWarningData);
     });
   });
 
@@ -33576,7 +34242,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolListWarning();
       var od = api.TargetPoolListWarning.fromJson(o.toJson());
-      checkTargetPoolListWarning(od);
+      checkTargetPoolListWarning(od as api.TargetPoolListWarning);
     });
   });
 
@@ -33584,7 +34250,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolList();
       var od = api.TargetPoolList.fromJson(o.toJson());
-      checkTargetPoolList(od);
+      checkTargetPoolList(od as api.TargetPoolList);
     });
   });
 
@@ -33592,7 +34258,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolsAddHealthCheckRequest();
       var od = api.TargetPoolsAddHealthCheckRequest.fromJson(o.toJson());
-      checkTargetPoolsAddHealthCheckRequest(od);
+      checkTargetPoolsAddHealthCheckRequest(
+          od as api.TargetPoolsAddHealthCheckRequest);
     });
   });
 
@@ -33600,7 +34267,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolsAddInstanceRequest();
       var od = api.TargetPoolsAddInstanceRequest.fromJson(o.toJson());
-      checkTargetPoolsAddInstanceRequest(od);
+      checkTargetPoolsAddInstanceRequest(
+          od as api.TargetPoolsAddInstanceRequest);
     });
   });
 
@@ -33608,7 +34276,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolsRemoveHealthCheckRequest();
       var od = api.TargetPoolsRemoveHealthCheckRequest.fromJson(o.toJson());
-      checkTargetPoolsRemoveHealthCheckRequest(od);
+      checkTargetPoolsRemoveHealthCheckRequest(
+          od as api.TargetPoolsRemoveHealthCheckRequest);
     });
   });
 
@@ -33616,7 +34285,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolsRemoveInstanceRequest();
       var od = api.TargetPoolsRemoveInstanceRequest.fromJson(o.toJson());
-      checkTargetPoolsRemoveInstanceRequest(od);
+      checkTargetPoolsRemoveInstanceRequest(
+          od as api.TargetPoolsRemoveInstanceRequest);
     });
   });
 
@@ -33624,7 +34294,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolsScopedListWarningData();
       var od = api.TargetPoolsScopedListWarningData.fromJson(o.toJson());
-      checkTargetPoolsScopedListWarningData(od);
+      checkTargetPoolsScopedListWarningData(
+          od as api.TargetPoolsScopedListWarningData);
     });
   });
 
@@ -33632,7 +34303,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolsScopedListWarning();
       var od = api.TargetPoolsScopedListWarning.fromJson(o.toJson());
-      checkTargetPoolsScopedListWarning(od);
+      checkTargetPoolsScopedListWarning(od as api.TargetPoolsScopedListWarning);
     });
   });
 
@@ -33640,7 +34311,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetPoolsScopedList();
       var od = api.TargetPoolsScopedList.fromJson(o.toJson());
-      checkTargetPoolsScopedList(od);
+      checkTargetPoolsScopedList(od as api.TargetPoolsScopedList);
     });
   });
 
@@ -33648,7 +34319,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetReference();
       var od = api.TargetReference.fromJson(o.toJson());
-      checkTargetReference(od);
+      checkTargetReference(od as api.TargetReference);
     });
   });
 
@@ -33657,7 +34328,8 @@
       var o = buildTargetSslProxiesSetBackendServiceRequest();
       var od =
           api.TargetSslProxiesSetBackendServiceRequest.fromJson(o.toJson());
-      checkTargetSslProxiesSetBackendServiceRequest(od);
+      checkTargetSslProxiesSetBackendServiceRequest(
+          od as api.TargetSslProxiesSetBackendServiceRequest);
     });
   });
 
@@ -33665,7 +34337,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetSslProxiesSetProxyHeaderRequest();
       var od = api.TargetSslProxiesSetProxyHeaderRequest.fromJson(o.toJson());
-      checkTargetSslProxiesSetProxyHeaderRequest(od);
+      checkTargetSslProxiesSetProxyHeaderRequest(
+          od as api.TargetSslProxiesSetProxyHeaderRequest);
     });
   });
 
@@ -33674,7 +34347,8 @@
       var o = buildTargetSslProxiesSetSslCertificatesRequest();
       var od =
           api.TargetSslProxiesSetSslCertificatesRequest.fromJson(o.toJson());
-      checkTargetSslProxiesSetSslCertificatesRequest(od);
+      checkTargetSslProxiesSetSslCertificatesRequest(
+          od as api.TargetSslProxiesSetSslCertificatesRequest);
     });
   });
 
@@ -33682,7 +34356,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetSslProxy();
       var od = api.TargetSslProxy.fromJson(o.toJson());
-      checkTargetSslProxy(od);
+      checkTargetSslProxy(od as api.TargetSslProxy);
     });
   });
 
@@ -33690,7 +34364,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetSslProxyListWarningData();
       var od = api.TargetSslProxyListWarningData.fromJson(o.toJson());
-      checkTargetSslProxyListWarningData(od);
+      checkTargetSslProxyListWarningData(
+          od as api.TargetSslProxyListWarningData);
     });
   });
 
@@ -33698,7 +34373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetSslProxyListWarning();
       var od = api.TargetSslProxyListWarning.fromJson(o.toJson());
-      checkTargetSslProxyListWarning(od);
+      checkTargetSslProxyListWarning(od as api.TargetSslProxyListWarning);
     });
   });
 
@@ -33706,7 +34381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetSslProxyList();
       var od = api.TargetSslProxyList.fromJson(o.toJson());
-      checkTargetSslProxyList(od);
+      checkTargetSslProxyList(od as api.TargetSslProxyList);
     });
   });
 
@@ -33715,7 +34390,8 @@
       var o = buildTargetTcpProxiesSetBackendServiceRequest();
       var od =
           api.TargetTcpProxiesSetBackendServiceRequest.fromJson(o.toJson());
-      checkTargetTcpProxiesSetBackendServiceRequest(od);
+      checkTargetTcpProxiesSetBackendServiceRequest(
+          od as api.TargetTcpProxiesSetBackendServiceRequest);
     });
   });
 
@@ -33723,7 +34399,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetTcpProxiesSetProxyHeaderRequest();
       var od = api.TargetTcpProxiesSetProxyHeaderRequest.fromJson(o.toJson());
-      checkTargetTcpProxiesSetProxyHeaderRequest(od);
+      checkTargetTcpProxiesSetProxyHeaderRequest(
+          od as api.TargetTcpProxiesSetProxyHeaderRequest);
     });
   });
 
@@ -33731,7 +34408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetTcpProxy();
       var od = api.TargetTcpProxy.fromJson(o.toJson());
-      checkTargetTcpProxy(od);
+      checkTargetTcpProxy(od as api.TargetTcpProxy);
     });
   });
 
@@ -33739,7 +34416,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetTcpProxyListWarningData();
       var od = api.TargetTcpProxyListWarningData.fromJson(o.toJson());
-      checkTargetTcpProxyListWarningData(od);
+      checkTargetTcpProxyListWarningData(
+          od as api.TargetTcpProxyListWarningData);
     });
   });
 
@@ -33747,7 +34425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetTcpProxyListWarning();
       var od = api.TargetTcpProxyListWarning.fromJson(o.toJson());
-      checkTargetTcpProxyListWarning(od);
+      checkTargetTcpProxyListWarning(od as api.TargetTcpProxyListWarning);
     });
   });
 
@@ -33755,7 +34433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetTcpProxyList();
       var od = api.TargetTcpProxyList.fromJson(o.toJson());
-      checkTargetTcpProxyList(od);
+      checkTargetTcpProxyList(od as api.TargetTcpProxyList);
     });
   });
 
@@ -33763,7 +34441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGateway();
       var od = api.TargetVpnGateway.fromJson(o.toJson());
-      checkTargetVpnGateway(od);
+      checkTargetVpnGateway(od as api.TargetVpnGateway);
     });
   });
 
@@ -33772,7 +34450,8 @@
       var o = buildTargetVpnGatewayAggregatedListWarningData();
       var od =
           api.TargetVpnGatewayAggregatedListWarningData.fromJson(o.toJson());
-      checkTargetVpnGatewayAggregatedListWarningData(od);
+      checkTargetVpnGatewayAggregatedListWarningData(
+          od as api.TargetVpnGatewayAggregatedListWarningData);
     });
   });
 
@@ -33780,7 +34459,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewayAggregatedListWarning();
       var od = api.TargetVpnGatewayAggregatedListWarning.fromJson(o.toJson());
-      checkTargetVpnGatewayAggregatedListWarning(od);
+      checkTargetVpnGatewayAggregatedListWarning(
+          od as api.TargetVpnGatewayAggregatedListWarning);
     });
   });
 
@@ -33788,7 +34468,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewayAggregatedList();
       var od = api.TargetVpnGatewayAggregatedList.fromJson(o.toJson());
-      checkTargetVpnGatewayAggregatedList(od);
+      checkTargetVpnGatewayAggregatedList(
+          od as api.TargetVpnGatewayAggregatedList);
     });
   });
 
@@ -33796,7 +34477,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewayListWarningData();
       var od = api.TargetVpnGatewayListWarningData.fromJson(o.toJson());
-      checkTargetVpnGatewayListWarningData(od);
+      checkTargetVpnGatewayListWarningData(
+          od as api.TargetVpnGatewayListWarningData);
     });
   });
 
@@ -33804,7 +34486,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewayListWarning();
       var od = api.TargetVpnGatewayListWarning.fromJson(o.toJson());
-      checkTargetVpnGatewayListWarning(od);
+      checkTargetVpnGatewayListWarning(od as api.TargetVpnGatewayListWarning);
     });
   });
 
@@ -33812,7 +34494,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewayList();
       var od = api.TargetVpnGatewayList.fromJson(o.toJson());
-      checkTargetVpnGatewayList(od);
+      checkTargetVpnGatewayList(od as api.TargetVpnGatewayList);
     });
   });
 
@@ -33820,7 +34502,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewaysScopedListWarningData();
       var od = api.TargetVpnGatewaysScopedListWarningData.fromJson(o.toJson());
-      checkTargetVpnGatewaysScopedListWarningData(od);
+      checkTargetVpnGatewaysScopedListWarningData(
+          od as api.TargetVpnGatewaysScopedListWarningData);
     });
   });
 
@@ -33828,7 +34511,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewaysScopedListWarning();
       var od = api.TargetVpnGatewaysScopedListWarning.fromJson(o.toJson());
-      checkTargetVpnGatewaysScopedListWarning(od);
+      checkTargetVpnGatewaysScopedListWarning(
+          od as api.TargetVpnGatewaysScopedListWarning);
     });
   });
 
@@ -33836,7 +34520,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetVpnGatewaysScopedList();
       var od = api.TargetVpnGatewaysScopedList.fromJson(o.toJson());
-      checkTargetVpnGatewaysScopedList(od);
+      checkTargetVpnGatewaysScopedList(od as api.TargetVpnGatewaysScopedList);
     });
   });
 
@@ -33844,7 +34528,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestFailure();
       var od = api.TestFailure.fromJson(o.toJson());
-      checkTestFailure(od);
+      checkTestFailure(od as api.TestFailure);
     });
   });
 
@@ -33852,7 +34536,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestPermissionsRequest();
       var od = api.TestPermissionsRequest.fromJson(o.toJson());
-      checkTestPermissionsRequest(od);
+      checkTestPermissionsRequest(od as api.TestPermissionsRequest);
     });
   });
 
@@ -33860,7 +34544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestPermissionsResponse();
       var od = api.TestPermissionsResponse.fromJson(o.toJson());
-      checkTestPermissionsResponse(od);
+      checkTestPermissionsResponse(od as api.TestPermissionsResponse);
     });
   });
 
@@ -33868,7 +34552,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMap();
       var od = api.UrlMap.fromJson(o.toJson());
-      checkUrlMap(od);
+      checkUrlMap(od as api.UrlMap);
     });
   });
 
@@ -33876,7 +34560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapListWarningData();
       var od = api.UrlMapListWarningData.fromJson(o.toJson());
-      checkUrlMapListWarningData(od);
+      checkUrlMapListWarningData(od as api.UrlMapListWarningData);
     });
   });
 
@@ -33884,7 +34568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapListWarning();
       var od = api.UrlMapListWarning.fromJson(o.toJson());
-      checkUrlMapListWarning(od);
+      checkUrlMapListWarning(od as api.UrlMapListWarning);
     });
   });
 
@@ -33892,7 +34576,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapList();
       var od = api.UrlMapList.fromJson(o.toJson());
-      checkUrlMapList(od);
+      checkUrlMapList(od as api.UrlMapList);
     });
   });
 
@@ -33900,7 +34584,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapReference();
       var od = api.UrlMapReference.fromJson(o.toJson());
-      checkUrlMapReference(od);
+      checkUrlMapReference(od as api.UrlMapReference);
     });
   });
 
@@ -33908,7 +34592,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapTest();
       var od = api.UrlMapTest.fromJson(o.toJson());
-      checkUrlMapTest(od);
+      checkUrlMapTest(od as api.UrlMapTest);
     });
   });
 
@@ -33916,7 +34600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapValidationResult();
       var od = api.UrlMapValidationResult.fromJson(o.toJson());
-      checkUrlMapValidationResult(od);
+      checkUrlMapValidationResult(od as api.UrlMapValidationResult);
     });
   });
 
@@ -33924,7 +34608,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsAggregatedListWarningData();
       var od = api.UrlMapsAggregatedListWarningData.fromJson(o.toJson());
-      checkUrlMapsAggregatedListWarningData(od);
+      checkUrlMapsAggregatedListWarningData(
+          od as api.UrlMapsAggregatedListWarningData);
     });
   });
 
@@ -33932,7 +34617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsAggregatedListWarning();
       var od = api.UrlMapsAggregatedListWarning.fromJson(o.toJson());
-      checkUrlMapsAggregatedListWarning(od);
+      checkUrlMapsAggregatedListWarning(od as api.UrlMapsAggregatedListWarning);
     });
   });
 
@@ -33940,7 +34625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsAggregatedList();
       var od = api.UrlMapsAggregatedList.fromJson(o.toJson());
-      checkUrlMapsAggregatedList(od);
+      checkUrlMapsAggregatedList(od as api.UrlMapsAggregatedList);
     });
   });
 
@@ -33948,7 +34633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsScopedListWarningData();
       var od = api.UrlMapsScopedListWarningData.fromJson(o.toJson());
-      checkUrlMapsScopedListWarningData(od);
+      checkUrlMapsScopedListWarningData(od as api.UrlMapsScopedListWarningData);
     });
   });
 
@@ -33956,7 +34641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsScopedListWarning();
       var od = api.UrlMapsScopedListWarning.fromJson(o.toJson());
-      checkUrlMapsScopedListWarning(od);
+      checkUrlMapsScopedListWarning(od as api.UrlMapsScopedListWarning);
     });
   });
 
@@ -33964,7 +34649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsScopedList();
       var od = api.UrlMapsScopedList.fromJson(o.toJson());
-      checkUrlMapsScopedList(od);
+      checkUrlMapsScopedList(od as api.UrlMapsScopedList);
     });
   });
 
@@ -33972,7 +34657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsValidateRequest();
       var od = api.UrlMapsValidateRequest.fromJson(o.toJson());
-      checkUrlMapsValidateRequest(od);
+      checkUrlMapsValidateRequest(od as api.UrlMapsValidateRequest);
     });
   });
 
@@ -33980,7 +34665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlMapsValidateResponse();
       var od = api.UrlMapsValidateResponse.fromJson(o.toJson());
-      checkUrlMapsValidateResponse(od);
+      checkUrlMapsValidateResponse(od as api.UrlMapsValidateResponse);
     });
   });
 
@@ -33988,7 +34673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlRewrite();
       var od = api.UrlRewrite.fromJson(o.toJson());
-      checkUrlRewrite(od);
+      checkUrlRewrite(od as api.UrlRewrite);
     });
   });
 
@@ -33996,7 +34681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsableSubnetwork();
       var od = api.UsableSubnetwork.fromJson(o.toJson());
-      checkUsableSubnetwork(od);
+      checkUsableSubnetwork(od as api.UsableSubnetwork);
     });
   });
 
@@ -34004,7 +34689,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsableSubnetworkSecondaryRange();
       var od = api.UsableSubnetworkSecondaryRange.fromJson(o.toJson());
-      checkUsableSubnetworkSecondaryRange(od);
+      checkUsableSubnetworkSecondaryRange(
+          od as api.UsableSubnetworkSecondaryRange);
     });
   });
 
@@ -34013,7 +34699,8 @@
       var o = buildUsableSubnetworksAggregatedListWarningData();
       var od =
           api.UsableSubnetworksAggregatedListWarningData.fromJson(o.toJson());
-      checkUsableSubnetworksAggregatedListWarningData(od);
+      checkUsableSubnetworksAggregatedListWarningData(
+          od as api.UsableSubnetworksAggregatedListWarningData);
     });
   });
 
@@ -34021,7 +34708,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsableSubnetworksAggregatedListWarning();
       var od = api.UsableSubnetworksAggregatedListWarning.fromJson(o.toJson());
-      checkUsableSubnetworksAggregatedListWarning(od);
+      checkUsableSubnetworksAggregatedListWarning(
+          od as api.UsableSubnetworksAggregatedListWarning);
     });
   });
 
@@ -34029,7 +34717,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsableSubnetworksAggregatedList();
       var od = api.UsableSubnetworksAggregatedList.fromJson(o.toJson());
-      checkUsableSubnetworksAggregatedList(od);
+      checkUsableSubnetworksAggregatedList(
+          od as api.UsableSubnetworksAggregatedList);
     });
   });
 
@@ -34037,7 +34726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageExportLocation();
       var od = api.UsageExportLocation.fromJson(o.toJson());
-      checkUsageExportLocation(od);
+      checkUsageExportLocation(od as api.UsageExportLocation);
     });
   });
 
@@ -34045,7 +34734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVmEndpointNatMappings();
       var od = api.VmEndpointNatMappings.fromJson(o.toJson());
-      checkVmEndpointNatMappings(od);
+      checkVmEndpointNatMappings(od as api.VmEndpointNatMappings);
     });
   });
 
@@ -34054,7 +34743,8 @@
       var o = buildVmEndpointNatMappingsInterfaceNatMappings();
       var od =
           api.VmEndpointNatMappingsInterfaceNatMappings.fromJson(o.toJson());
-      checkVmEndpointNatMappingsInterfaceNatMappings(od);
+      checkVmEndpointNatMappingsInterfaceNatMappings(
+          od as api.VmEndpointNatMappingsInterfaceNatMappings);
     });
   });
 
@@ -34062,7 +34752,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVmEndpointNatMappingsListWarningData();
       var od = api.VmEndpointNatMappingsListWarningData.fromJson(o.toJson());
-      checkVmEndpointNatMappingsListWarningData(od);
+      checkVmEndpointNatMappingsListWarningData(
+          od as api.VmEndpointNatMappingsListWarningData);
     });
   });
 
@@ -34070,7 +34761,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVmEndpointNatMappingsListWarning();
       var od = api.VmEndpointNatMappingsListWarning.fromJson(o.toJson());
-      checkVmEndpointNatMappingsListWarning(od);
+      checkVmEndpointNatMappingsListWarning(
+          od as api.VmEndpointNatMappingsListWarning);
     });
   });
 
@@ -34078,7 +34770,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVmEndpointNatMappingsList();
       var od = api.VmEndpointNatMappingsList.fromJson(o.toJson());
-      checkVmEndpointNatMappingsList(od);
+      checkVmEndpointNatMappingsList(od as api.VmEndpointNatMappingsList);
     });
   });
 
@@ -34086,7 +34778,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGateway();
       var od = api.VpnGateway.fromJson(o.toJson());
-      checkVpnGateway(od);
+      checkVpnGateway(od as api.VpnGateway);
     });
   });
 
@@ -34094,7 +34786,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayAggregatedListWarningData();
       var od = api.VpnGatewayAggregatedListWarningData.fromJson(o.toJson());
-      checkVpnGatewayAggregatedListWarningData(od);
+      checkVpnGatewayAggregatedListWarningData(
+          od as api.VpnGatewayAggregatedListWarningData);
     });
   });
 
@@ -34102,7 +34795,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayAggregatedListWarning();
       var od = api.VpnGatewayAggregatedListWarning.fromJson(o.toJson());
-      checkVpnGatewayAggregatedListWarning(od);
+      checkVpnGatewayAggregatedListWarning(
+          od as api.VpnGatewayAggregatedListWarning);
     });
   });
 
@@ -34110,7 +34804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayAggregatedList();
       var od = api.VpnGatewayAggregatedList.fromJson(o.toJson());
-      checkVpnGatewayAggregatedList(od);
+      checkVpnGatewayAggregatedList(od as api.VpnGatewayAggregatedList);
     });
   });
 
@@ -34118,7 +34812,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayListWarningData();
       var od = api.VpnGatewayListWarningData.fromJson(o.toJson());
-      checkVpnGatewayListWarningData(od);
+      checkVpnGatewayListWarningData(od as api.VpnGatewayListWarningData);
     });
   });
 
@@ -34126,7 +34820,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayListWarning();
       var od = api.VpnGatewayListWarning.fromJson(o.toJson());
-      checkVpnGatewayListWarning(od);
+      checkVpnGatewayListWarning(od as api.VpnGatewayListWarning);
     });
   });
 
@@ -34134,7 +34828,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayList();
       var od = api.VpnGatewayList.fromJson(o.toJson());
-      checkVpnGatewayList(od);
+      checkVpnGatewayList(od as api.VpnGatewayList);
     });
   });
 
@@ -34142,7 +34836,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayStatus();
       var od = api.VpnGatewayStatus.fromJson(o.toJson());
-      checkVpnGatewayStatus(od);
+      checkVpnGatewayStatus(od as api.VpnGatewayStatus);
     });
   });
 
@@ -34152,7 +34846,8 @@
       var o = buildVpnGatewayStatusHighAvailabilityRequirementState();
       var od = api.VpnGatewayStatusHighAvailabilityRequirementState.fromJson(
           o.toJson());
-      checkVpnGatewayStatusHighAvailabilityRequirementState(od);
+      checkVpnGatewayStatusHighAvailabilityRequirementState(
+          od as api.VpnGatewayStatusHighAvailabilityRequirementState);
     });
   });
 
@@ -34160,7 +34855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayStatusTunnel();
       var od = api.VpnGatewayStatusTunnel.fromJson(o.toJson());
-      checkVpnGatewayStatusTunnel(od);
+      checkVpnGatewayStatusTunnel(od as api.VpnGatewayStatusTunnel);
     });
   });
 
@@ -34168,7 +34863,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayStatusVpnConnection();
       var od = api.VpnGatewayStatusVpnConnection.fromJson(o.toJson());
-      checkVpnGatewayStatusVpnConnection(od);
+      checkVpnGatewayStatusVpnConnection(
+          od as api.VpnGatewayStatusVpnConnection);
     });
   });
 
@@ -34176,7 +34872,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayVpnGatewayInterface();
       var od = api.VpnGatewayVpnGatewayInterface.fromJson(o.toJson());
-      checkVpnGatewayVpnGatewayInterface(od);
+      checkVpnGatewayVpnGatewayInterface(
+          od as api.VpnGatewayVpnGatewayInterface);
     });
   });
 
@@ -34184,7 +34881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewaysGetStatusResponse();
       var od = api.VpnGatewaysGetStatusResponse.fromJson(o.toJson());
-      checkVpnGatewaysGetStatusResponse(od);
+      checkVpnGatewaysGetStatusResponse(od as api.VpnGatewaysGetStatusResponse);
     });
   });
 
@@ -34192,7 +34889,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewaysScopedListWarningData();
       var od = api.VpnGatewaysScopedListWarningData.fromJson(o.toJson());
-      checkVpnGatewaysScopedListWarningData(od);
+      checkVpnGatewaysScopedListWarningData(
+          od as api.VpnGatewaysScopedListWarningData);
     });
   });
 
@@ -34200,7 +34898,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewaysScopedListWarning();
       var od = api.VpnGatewaysScopedListWarning.fromJson(o.toJson());
-      checkVpnGatewaysScopedListWarning(od);
+      checkVpnGatewaysScopedListWarning(od as api.VpnGatewaysScopedListWarning);
     });
   });
 
@@ -34208,7 +34906,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewaysScopedList();
       var od = api.VpnGatewaysScopedList.fromJson(o.toJson());
-      checkVpnGatewaysScopedList(od);
+      checkVpnGatewaysScopedList(od as api.VpnGatewaysScopedList);
     });
   });
 
@@ -34216,7 +34914,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnel();
       var od = api.VpnTunnel.fromJson(o.toJson());
-      checkVpnTunnel(od);
+      checkVpnTunnel(od as api.VpnTunnel);
     });
   });
 
@@ -34224,7 +34922,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelAggregatedListWarningData();
       var od = api.VpnTunnelAggregatedListWarningData.fromJson(o.toJson());
-      checkVpnTunnelAggregatedListWarningData(od);
+      checkVpnTunnelAggregatedListWarningData(
+          od as api.VpnTunnelAggregatedListWarningData);
     });
   });
 
@@ -34232,7 +34931,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelAggregatedListWarning();
       var od = api.VpnTunnelAggregatedListWarning.fromJson(o.toJson());
-      checkVpnTunnelAggregatedListWarning(od);
+      checkVpnTunnelAggregatedListWarning(
+          od as api.VpnTunnelAggregatedListWarning);
     });
   });
 
@@ -34240,7 +34940,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelAggregatedList();
       var od = api.VpnTunnelAggregatedList.fromJson(o.toJson());
-      checkVpnTunnelAggregatedList(od);
+      checkVpnTunnelAggregatedList(od as api.VpnTunnelAggregatedList);
     });
   });
 
@@ -34248,7 +34948,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelListWarningData();
       var od = api.VpnTunnelListWarningData.fromJson(o.toJson());
-      checkVpnTunnelListWarningData(od);
+      checkVpnTunnelListWarningData(od as api.VpnTunnelListWarningData);
     });
   });
 
@@ -34256,7 +34956,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelListWarning();
       var od = api.VpnTunnelListWarning.fromJson(o.toJson());
-      checkVpnTunnelListWarning(od);
+      checkVpnTunnelListWarning(od as api.VpnTunnelListWarning);
     });
   });
 
@@ -34264,7 +34964,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelList();
       var od = api.VpnTunnelList.fromJson(o.toJson());
-      checkVpnTunnelList(od);
+      checkVpnTunnelList(od as api.VpnTunnelList);
     });
   });
 
@@ -34272,7 +34972,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelsScopedListWarningData();
       var od = api.VpnTunnelsScopedListWarningData.fromJson(o.toJson());
-      checkVpnTunnelsScopedListWarningData(od);
+      checkVpnTunnelsScopedListWarningData(
+          od as api.VpnTunnelsScopedListWarningData);
     });
   });
 
@@ -34280,7 +34981,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelsScopedListWarning();
       var od = api.VpnTunnelsScopedListWarning.fromJson(o.toJson());
-      checkVpnTunnelsScopedListWarning(od);
+      checkVpnTunnelsScopedListWarning(od as api.VpnTunnelsScopedListWarning);
     });
   });
 
@@ -34288,7 +34989,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelsScopedList();
       var od = api.VpnTunnelsScopedList.fromJson(o.toJson());
-      checkVpnTunnelsScopedList(od);
+      checkVpnTunnelsScopedList(od as api.VpnTunnelsScopedList);
     });
   });
 
@@ -34296,7 +34997,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWafExpressionSet();
       var od = api.WafExpressionSet.fromJson(o.toJson());
-      checkWafExpressionSet(od);
+      checkWafExpressionSet(od as api.WafExpressionSet);
     });
   });
 
@@ -34304,7 +35005,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWafExpressionSetExpression();
       var od = api.WafExpressionSetExpression.fromJson(o.toJson());
-      checkWafExpressionSetExpression(od);
+      checkWafExpressionSetExpression(od as api.WafExpressionSetExpression);
     });
   });
 
@@ -34312,7 +35013,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWeightedBackendService();
       var od = api.WeightedBackendService.fromJson(o.toJson());
-      checkWeightedBackendService(od);
+      checkWeightedBackendService(od as api.WeightedBackendService);
     });
   });
 
@@ -34320,7 +35021,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildXpnHostListWarningData();
       var od = api.XpnHostListWarningData.fromJson(o.toJson());
-      checkXpnHostListWarningData(od);
+      checkXpnHostListWarningData(od as api.XpnHostListWarningData);
     });
   });
 
@@ -34328,7 +35029,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildXpnHostListWarning();
       var od = api.XpnHostListWarning.fromJson(o.toJson());
-      checkXpnHostListWarning(od);
+      checkXpnHostListWarning(od as api.XpnHostListWarning);
     });
   });
 
@@ -34336,7 +35037,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildXpnHostList();
       var od = api.XpnHostList.fromJson(o.toJson());
-      checkXpnHostList(od);
+      checkXpnHostList(od as api.XpnHostList);
     });
   });
 
@@ -34344,7 +35045,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildXpnResourceId();
       var od = api.XpnResourceId.fromJson(o.toJson());
-      checkXpnResourceId(od);
+      checkXpnResourceId(od as api.XpnResourceId);
     });
   });
 
@@ -34352,7 +35053,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZone();
       var od = api.Zone.fromJson(o.toJson());
-      checkZone(od);
+      checkZone(od as api.Zone);
     });
   });
 
@@ -34360,7 +35061,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneListWarningData();
       var od = api.ZoneListWarningData.fromJson(o.toJson());
-      checkZoneListWarningData(od);
+      checkZoneListWarningData(od as api.ZoneListWarningData);
     });
   });
 
@@ -34368,7 +35069,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneListWarning();
       var od = api.ZoneListWarning.fromJson(o.toJson());
-      checkZoneListWarning(od);
+      checkZoneListWarning(od as api.ZoneListWarning);
     });
   });
 
@@ -34376,7 +35077,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneList();
       var od = api.ZoneList.fromJson(o.toJson());
-      checkZoneList(od);
+      checkZoneList(od as api.ZoneList);
     });
   });
 
@@ -34384,7 +35085,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneSetLabelsRequest();
       var od = api.ZoneSetLabelsRequest.fromJson(o.toJson());
-      checkZoneSetLabelsRequest(od);
+      checkZoneSetLabelsRequest(od as api.ZoneSetLabelsRequest);
     });
   });
 
@@ -34392,7 +35093,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneSetPolicyRequest();
       var od = api.ZoneSetPolicyRequest.fromJson(o.toJson());
-      checkZoneSetPolicyRequest(od);
+      checkZoneSetPolicyRequest(od as api.ZoneSetPolicyRequest);
     });
   });
 
@@ -34461,7 +35162,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAcceleratorTypeAggregatedList(response);
+        checkAcceleratorTypeAggregatedList(
+            response as api.AcceleratorTypeAggregatedList);
       })));
     });
 
@@ -34507,7 +35209,7 @@
       res
           .get(arg_project, arg_zone, arg_acceleratorType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAcceleratorType(response);
+        checkAcceleratorType(response as api.AcceleratorType);
       })));
     });
 
@@ -34572,7 +35274,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAcceleratorTypeList(response);
+        checkAcceleratorTypeList(response as api.AcceleratorTypeList);
       })));
     });
   });
@@ -34642,7 +35344,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddressAggregatedList(response);
+        checkAddressAggregatedList(response as api.AddressAggregatedList);
       })));
     });
 
@@ -34692,7 +35394,7 @@
           .delete(arg_project, arg_region, arg_address,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -34738,7 +35440,7 @@
       res
           .get(arg_project, arg_region, arg_address, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddress(response);
+        checkAddress(response as api.Address);
       })));
     });
 
@@ -34751,8 +35453,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Address.fromJson(json);
-        checkAddress(obj);
+        var obj =
+            api.Address.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAddress(obj as api.Address);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -34791,7 +35494,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -34856,7 +35559,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddressList(response);
+        checkAddressList(response as api.AddressList);
       })));
     });
   });
@@ -34926,7 +35629,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalerAggregatedList(response);
+        checkAutoscalerAggregatedList(response as api.AutoscalerAggregatedList);
       })));
     });
 
@@ -34976,7 +35679,7 @@
           .delete(arg_project, arg_zone, arg_autoscaler,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35022,7 +35725,7 @@
       res
           .get(arg_project, arg_zone, arg_autoscaler, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscaler(response);
+        checkAutoscaler(response as api.Autoscaler);
       })));
     });
 
@@ -35035,8 +35738,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Autoscaler.fromJson(json);
-        checkAutoscaler(obj);
+        var obj = api.Autoscaler.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscaler(obj as api.Autoscaler);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35075,7 +35779,7 @@
           .insert(arg_request, arg_project, arg_zone,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35140,7 +35844,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalerList(response);
+        checkAutoscalerList(response as api.AutoscalerList);
       })));
     });
 
@@ -35154,8 +35858,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Autoscaler.fromJson(json);
-        checkAutoscaler(obj);
+        var obj = api.Autoscaler.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscaler(obj as api.Autoscaler);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35198,7 +35903,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35212,8 +35917,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Autoscaler.fromJson(json);
-        checkAutoscaler(obj);
+        var obj = api.Autoscaler.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscaler(obj as api.Autoscaler);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35256,7 +35962,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -35271,8 +35977,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SignedUrlKey.fromJson(json);
-        checkSignedUrlKey(obj);
+        var obj = api.SignedUrlKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSignedUrlKey(obj as api.SignedUrlKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35311,7 +36018,7 @@
           .addSignedUrlKey(arg_request, arg_project, arg_backendBucket,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35360,7 +36067,7 @@
           .delete(arg_project, arg_backendBucket,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35412,7 +36119,7 @@
           .deleteSignedUrlKey(arg_project, arg_backendBucket, arg_keyName,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35457,7 +36164,7 @@
       res
           .get(arg_project, arg_backendBucket, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendBucket(response);
+        checkBackendBucket(response as api.BackendBucket);
       })));
     });
 
@@ -35469,8 +36176,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendBucket.fromJson(json);
-        checkBackendBucket(obj);
+        var obj = api.BackendBucket.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendBucket(obj as api.BackendBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35509,7 +36217,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35573,7 +36281,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendBucketList(response);
+        checkBackendBucketList(response as api.BackendBucketList);
       })));
     });
 
@@ -35586,8 +36294,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendBucket.fromJson(json);
-        checkBackendBucket(obj);
+        var obj = api.BackendBucket.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendBucket(obj as api.BackendBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35626,7 +36335,7 @@
           .patch(arg_request, arg_project, arg_backendBucket,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35639,8 +36348,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendBucket.fromJson(json);
-        checkBackendBucket(obj);
+        var obj = api.BackendBucket.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendBucket(obj as api.BackendBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35679,7 +36389,7 @@
           .update(arg_request, arg_project, arg_backendBucket,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -35694,8 +36404,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SignedUrlKey.fromJson(json);
-        checkSignedUrlKey(obj);
+        var obj = api.SignedUrlKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSignedUrlKey(obj as api.SignedUrlKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35734,7 +36445,7 @@
           .addSignedUrlKey(arg_request, arg_project, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35802,7 +36513,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendServiceAggregatedList(response);
+        checkBackendServiceAggregatedList(
+            response as api.BackendServiceAggregatedList);
       })));
     });
 
@@ -35851,7 +36563,7 @@
           .delete(arg_project, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35903,7 +36615,7 @@
           .deleteSignedUrlKey(arg_project, arg_backendService, arg_keyName,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -35948,7 +36660,7 @@
       res
           .get(arg_project, arg_backendService, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendService(response);
+        checkBackendService(response as api.BackendService);
       })));
     });
 
@@ -35960,8 +36672,9 @@
       var arg_backendService = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResourceGroupReference.fromJson(json);
-        checkResourceGroupReference(obj);
+        var obj = api.ResourceGroupReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResourceGroupReference(obj as api.ResourceGroupReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -35998,7 +36711,8 @@
           .getHealth(arg_request, arg_project, arg_backendService,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendServiceGroupHealth(response);
+        checkBackendServiceGroupHealth(
+            response as api.BackendServiceGroupHealth);
       })));
     });
 
@@ -36010,8 +36724,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendService.fromJson(json);
-        checkBackendService(obj);
+        var obj = api.BackendService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendService(obj as api.BackendService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36050,7 +36765,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36114,7 +36829,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendServiceList(response);
+        checkBackendServiceList(response as api.BackendServiceList);
       })));
     });
 
@@ -36127,8 +36842,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendService.fromJson(json);
-        checkBackendService(obj);
+        var obj = api.BackendService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendService(obj as api.BackendService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36167,7 +36883,7 @@
           .patch(arg_request, arg_project, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36180,8 +36896,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SecurityPolicyReference.fromJson(json);
-        checkSecurityPolicyReference(obj);
+        var obj = api.SecurityPolicyReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSecurityPolicyReference(obj as api.SecurityPolicyReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36220,7 +36937,7 @@
           .setSecurityPolicy(arg_request, arg_project, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36233,8 +36950,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendService.fromJson(json);
-        checkBackendService(obj);
+        var obj = api.BackendService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendService(obj as api.BackendService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36273,7 +36991,7 @@
           .update(arg_request, arg_project, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -36343,7 +37061,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiskTypeAggregatedList(response);
+        checkDiskTypeAggregatedList(response as api.DiskTypeAggregatedList);
       })));
     });
 
@@ -36389,7 +37107,7 @@
       res
           .get(arg_project, arg_zone, arg_diskType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiskType(response);
+        checkDiskType(response as api.DiskType);
       })));
     });
 
@@ -36454,7 +37172,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiskTypeList(response);
+        checkDiskTypeList(response as api.DiskTypeList);
       })));
     });
   });
@@ -36470,8 +37188,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisksAddResourcePoliciesRequest.fromJson(json);
-        checkDisksAddResourcePoliciesRequest(obj);
+        var obj = api.DisksAddResourcePoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisksAddResourcePoliciesRequest(
+            obj as api.DisksAddResourcePoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36510,7 +37230,7 @@
           .addResourcePolicies(arg_request, arg_project, arg_zone, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36578,7 +37298,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiskAggregatedList(response);
+        checkDiskAggregatedList(response as api.DiskAggregatedList);
       })));
     });
 
@@ -36593,8 +37313,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Snapshot.fromJson(json);
-        checkSnapshot(obj);
+        var obj =
+            api.Snapshot.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSnapshot(obj as api.Snapshot);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36637,7 +37358,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36687,7 +37408,7 @@
           .delete(arg_project, arg_zone, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36733,7 +37454,7 @@
       res
           .get(arg_project, arg_zone, arg_disk, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDisk(response);
+        checkDisk(response as api.Disk);
       })));
     });
 
@@ -36785,7 +37506,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -36799,8 +37520,9 @@
       var arg_sourceImage = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Disk.fromJson(json);
-        checkDisk(obj);
+        var obj =
+            api.Disk.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDisk(obj as api.Disk);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36843,7 +37565,7 @@
               sourceImage: arg_sourceImage,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36908,7 +37630,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiskList(response);
+        checkDiskList(response as api.DiskList);
       })));
     });
 
@@ -36922,8 +37644,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisksRemoveResourcePoliciesRequest.fromJson(json);
-        checkDisksRemoveResourcePoliciesRequest(obj);
+        var obj = api.DisksRemoveResourcePoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisksRemoveResourcePoliciesRequest(
+            obj as api.DisksRemoveResourcePoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -36962,7 +37686,7 @@
           .removeResourcePolicies(arg_request, arg_project, arg_zone, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -36976,8 +37700,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisksResizeRequest.fromJson(json);
-        checkDisksResizeRequest(obj);
+        var obj = api.DisksResizeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisksResizeRequest(obj as api.DisksResizeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37016,7 +37741,7 @@
           .resize(arg_request, arg_project, arg_zone, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37029,8 +37754,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ZoneSetPolicyRequest.fromJson(json);
-        checkZoneSetPolicyRequest(obj);
+        var obj = api.ZoneSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkZoneSetPolicyRequest(obj as api.ZoneSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37067,7 +37793,7 @@
           .setIamPolicy(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -37081,8 +37807,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ZoneSetLabelsRequest.fromJson(json);
-        checkZoneSetLabelsRequest(obj);
+        var obj = api.ZoneSetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkZoneSetLabelsRequest(obj as api.ZoneSetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37121,7 +37848,7 @@
           .setLabels(arg_request, arg_project, arg_zone, arg_resource,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37134,8 +37861,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37172,7 +37900,7 @@
           .testIamPermissions(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -37223,7 +37951,7 @@
           .delete(arg_project, arg_externalVpnGateway,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37268,7 +37996,7 @@
       res
           .get(arg_project, arg_externalVpnGateway, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExternalVpnGateway(response);
+        checkExternalVpnGateway(response as api.ExternalVpnGateway);
       })));
     });
 
@@ -37280,8 +38008,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExternalVpnGateway.fromJson(json);
-        checkExternalVpnGateway(obj);
+        var obj = api.ExternalVpnGateway.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExternalVpnGateway(obj as api.ExternalVpnGateway);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37320,7 +38049,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37384,7 +38113,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExternalVpnGatewayList(response);
+        checkExternalVpnGatewayList(response as api.ExternalVpnGatewayList);
       })));
     });
 
@@ -37396,8 +38125,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetLabelsRequest.fromJson(json);
-        checkGlobalSetLabelsRequest(obj);
+        var obj = api.GlobalSetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetLabelsRequest(obj as api.GlobalSetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37434,7 +38164,7 @@
           .setLabels(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37446,8 +38176,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37484,7 +38215,7 @@
           .testIamPermissions(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -37535,7 +38266,7 @@
           .delete(arg_project, arg_firewall,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37580,7 +38311,7 @@
       res
           .get(arg_project, arg_firewall, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFirewall(response);
+        checkFirewall(response as api.Firewall);
       })));
     });
 
@@ -37592,8 +38323,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Firewall.fromJson(json);
-        checkFirewall(obj);
+        var obj =
+            api.Firewall.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFirewall(obj as api.Firewall);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37632,7 +38364,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37696,7 +38428,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFirewallList(response);
+        checkFirewallList(response as api.FirewallList);
       })));
     });
 
@@ -37709,8 +38441,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Firewall.fromJson(json);
-        checkFirewall(obj);
+        var obj =
+            api.Firewall.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFirewall(obj as api.Firewall);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37749,7 +38482,7 @@
           .patch(arg_request, arg_project, arg_firewall,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37762,8 +38495,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Firewall.fromJson(json);
-        checkFirewall(obj);
+        var obj =
+            api.Firewall.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFirewall(obj as api.Firewall);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -37802,7 +38536,7 @@
           .update(arg_request, arg_project, arg_firewall,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -37872,7 +38606,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkForwardingRuleAggregatedList(response);
+        checkForwardingRuleAggregatedList(
+            response as api.ForwardingRuleAggregatedList);
       })));
     });
 
@@ -37922,7 +38657,7 @@
           .delete(arg_project, arg_region, arg_forwardingRule,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -37969,7 +38704,7 @@
           .get(arg_project, arg_region, arg_forwardingRule,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkForwardingRule(response);
+        checkForwardingRule(response as api.ForwardingRule);
       })));
     });
 
@@ -37982,8 +38717,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ForwardingRule.fromJson(json);
-        checkForwardingRule(obj);
+        var obj = api.ForwardingRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkForwardingRule(obj as api.ForwardingRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38022,7 +38758,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38087,7 +38823,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkForwardingRuleList(response);
+        checkForwardingRuleList(response as api.ForwardingRuleList);
       })));
     });
 
@@ -38101,8 +38837,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ForwardingRule.fromJson(json);
-        checkForwardingRule(obj);
+        var obj = api.ForwardingRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkForwardingRule(obj as api.ForwardingRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38141,7 +38878,7 @@
           .patch(arg_request, arg_project, arg_region, arg_forwardingRule,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38155,8 +38892,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetReference.fromJson(json);
-        checkTargetReference(obj);
+        var obj = api.TargetReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetReference(obj as api.TargetReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38195,7 +38933,7 @@
           .setTarget(arg_request, arg_project, arg_region, arg_forwardingRule,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -38246,7 +38984,7 @@
           .delete(arg_project, arg_address,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38291,7 +39029,7 @@
       res
           .get(arg_project, arg_address, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddress(response);
+        checkAddress(response as api.Address);
       })));
     });
 
@@ -38303,8 +39041,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Address.fromJson(json);
-        checkAddress(obj);
+        var obj =
+            api.Address.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAddress(obj as api.Address);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38343,7 +39082,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38407,7 +39146,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddressList(response);
+        checkAddressList(response as api.AddressList);
       })));
     });
   });
@@ -38458,7 +39197,7 @@
           .delete(arg_project, arg_forwardingRule,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38503,7 +39242,7 @@
       res
           .get(arg_project, arg_forwardingRule, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkForwardingRule(response);
+        checkForwardingRule(response as api.ForwardingRule);
       })));
     });
 
@@ -38515,8 +39254,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ForwardingRule.fromJson(json);
-        checkForwardingRule(obj);
+        var obj = api.ForwardingRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkForwardingRule(obj as api.ForwardingRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38555,7 +39295,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38619,7 +39359,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkForwardingRuleList(response);
+        checkForwardingRuleList(response as api.ForwardingRuleList);
       })));
     });
 
@@ -38632,8 +39372,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ForwardingRule.fromJson(json);
-        checkForwardingRule(obj);
+        var obj = api.ForwardingRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkForwardingRule(obj as api.ForwardingRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38672,7 +39413,7 @@
           .patch(arg_request, arg_project, arg_forwardingRule,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38685,8 +39426,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetReference.fromJson(json);
-        checkTargetReference(obj);
+        var obj = api.TargetReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetReference(obj as api.TargetReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38725,7 +39467,7 @@
           .setTarget(arg_request, arg_project, arg_forwardingRule,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -38743,8 +39485,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GlobalNetworkEndpointGroupsAttachEndpointsRequest.fromJson(
-                json);
-        checkGlobalNetworkEndpointGroupsAttachEndpointsRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGlobalNetworkEndpointGroupsAttachEndpointsRequest(
+            obj as api.GlobalNetworkEndpointGroupsAttachEndpointsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38784,7 +39527,7 @@
               arg_request, arg_project, arg_networkEndpointGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38833,7 +39576,7 @@
           .delete(arg_project, arg_networkEndpointGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38849,8 +39592,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GlobalNetworkEndpointGroupsDetachEndpointsRequest.fromJson(
-                json);
-        checkGlobalNetworkEndpointGroupsDetachEndpointsRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGlobalNetworkEndpointGroupsDetachEndpointsRequest(
+            obj as api.GlobalNetworkEndpointGroupsDetachEndpointsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38890,7 +39634,7 @@
               arg_request, arg_project, arg_networkEndpointGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -38935,7 +39679,7 @@
       res
           .get(arg_project, arg_networkEndpointGroup, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroup(response);
+        checkNetworkEndpointGroup(response as api.NetworkEndpointGroup);
       })));
     });
 
@@ -38947,8 +39691,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworkEndpointGroup.fromJson(json);
-        checkNetworkEndpointGroup(obj);
+        var obj = api.NetworkEndpointGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworkEndpointGroup(obj as api.NetworkEndpointGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -38987,7 +39732,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -39051,7 +39796,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroupList(response);
+        checkNetworkEndpointGroupList(response as api.NetworkEndpointGroupList);
       })));
     });
 
@@ -39117,7 +39862,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroupsListNetworkEndpoints(response);
+        checkNetworkEndpointGroupsListNetworkEndpoints(
+            response as api.NetworkEndpointGroupsListNetworkEndpoints);
       })));
     });
   });
@@ -39187,7 +39933,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperationAggregatedList(response);
+        checkOperationAggregatedList(response as api.OperationAggregatedList);
       })));
     });
 
@@ -39275,7 +40021,7 @@
       res
           .get(arg_project, arg_operation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -39339,7 +40085,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperationList(response);
+        checkOperationList(response as api.OperationList);
       })));
     });
 
@@ -39384,7 +40130,7 @@
       res
           .wait(arg_project, arg_operation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -39454,7 +40200,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHealthChecksAggregatedList(response);
+        checkHealthChecksAggregatedList(
+            response as api.HealthChecksAggregatedList);
       })));
     });
 
@@ -39503,7 +40250,7 @@
           .delete(arg_project, arg_healthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -39548,7 +40295,7 @@
       res
           .get(arg_project, arg_healthCheck, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHealthCheck(response);
+        checkHealthCheck(response as api.HealthCheck);
       })));
     });
 
@@ -39560,8 +40307,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheck.fromJson(json);
-        checkHealthCheck(obj);
+        var obj = api.HealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheck(obj as api.HealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -39600,7 +40348,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -39664,7 +40412,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHealthCheckList(response);
+        checkHealthCheckList(response as api.HealthCheckList);
       })));
     });
 
@@ -39677,8 +40425,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheck.fromJson(json);
-        checkHealthCheck(obj);
+        var obj = api.HealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheck(obj as api.HealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -39717,7 +40466,7 @@
           .patch(arg_request, arg_project, arg_healthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -39730,8 +40479,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheck.fromJson(json);
-        checkHealthCheck(obj);
+        var obj = api.HealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheck(obj as api.HealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -39770,7 +40520,7 @@
           .update(arg_request, arg_project, arg_healthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -39821,7 +40571,7 @@
           .delete(arg_project, arg_httpHealthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -39866,7 +40616,7 @@
       res
           .get(arg_project, arg_httpHealthCheck, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpHealthCheck(response);
+        checkHttpHealthCheck(response as api.HttpHealthCheck);
       })));
     });
 
@@ -39878,8 +40628,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpHealthCheck.fromJson(json);
-        checkHttpHealthCheck(obj);
+        var obj = api.HttpHealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHttpHealthCheck(obj as api.HttpHealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -39918,7 +40669,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -39982,7 +40733,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpHealthCheckList(response);
+        checkHttpHealthCheckList(response as api.HttpHealthCheckList);
       })));
     });
 
@@ -39995,8 +40746,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpHealthCheck.fromJson(json);
-        checkHttpHealthCheck(obj);
+        var obj = api.HttpHealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHttpHealthCheck(obj as api.HttpHealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40035,7 +40787,7 @@
           .patch(arg_request, arg_project, arg_httpHealthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40048,8 +40800,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpHealthCheck.fromJson(json);
-        checkHttpHealthCheck(obj);
+        var obj = api.HttpHealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHttpHealthCheck(obj as api.HttpHealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40088,7 +40841,7 @@
           .update(arg_request, arg_project, arg_httpHealthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -40139,7 +40892,7 @@
           .delete(arg_project, arg_httpsHealthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40184,7 +40937,7 @@
       res
           .get(arg_project, arg_httpsHealthCheck, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpsHealthCheck(response);
+        checkHttpsHealthCheck(response as api.HttpsHealthCheck);
       })));
     });
 
@@ -40196,8 +40949,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpsHealthCheck.fromJson(json);
-        checkHttpsHealthCheck(obj);
+        var obj = api.HttpsHealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHttpsHealthCheck(obj as api.HttpsHealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40236,7 +40990,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40300,7 +41054,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpsHealthCheckList(response);
+        checkHttpsHealthCheckList(response as api.HttpsHealthCheckList);
       })));
     });
 
@@ -40313,8 +41067,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpsHealthCheck.fromJson(json);
-        checkHttpsHealthCheck(obj);
+        var obj = api.HttpsHealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHttpsHealthCheck(obj as api.HttpsHealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40353,7 +41108,7 @@
           .patch(arg_request, arg_project, arg_httpsHealthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40366,8 +41121,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpsHealthCheck.fromJson(json);
-        checkHttpsHealthCheck(obj);
+        var obj = api.HttpsHealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHttpsHealthCheck(obj as api.HttpsHealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40406,7 +41162,7 @@
           .update(arg_request, arg_project, arg_httpsHealthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -40457,7 +41213,7 @@
           .delete(arg_project, arg_image,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40470,8 +41226,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeprecationStatus.fromJson(json);
-        checkDeprecationStatus(obj);
+        var obj = api.DeprecationStatus.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeprecationStatus(obj as api.DeprecationStatus);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40510,7 +41267,7 @@
           .deprecate(arg_request, arg_project, arg_image,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40555,7 +41312,7 @@
       res
           .get(arg_project, arg_image, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImage(response);
+        checkImage(response as api.Image);
       })));
     });
 
@@ -40600,7 +41357,7 @@
       res
           .getFromFamily(arg_project, arg_family, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImage(response);
+        checkImage(response as api.Image);
       })));
     });
 
@@ -40651,7 +41408,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -40664,8 +41421,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Image.fromJson(json);
-        checkImage(obj);
+        var obj =
+            api.Image.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkImage(obj as api.Image);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40708,7 +41466,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40772,7 +41530,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImageList(response);
+        checkImageList(response as api.ImageList);
       })));
     });
 
@@ -40785,8 +41543,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Image.fromJson(json);
-        checkImage(obj);
+        var obj =
+            api.Image.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkImage(obj as api.Image);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40825,7 +41584,7 @@
           .patch(arg_request, arg_project, arg_image,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40837,8 +41596,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetPolicyRequest.fromJson(json);
-        checkGlobalSetPolicyRequest(obj);
+        var obj = api.GlobalSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetPolicyRequest(obj as api.GlobalSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40875,7 +41635,7 @@
           .setIamPolicy(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -40887,8 +41647,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetLabelsRequest.fromJson(json);
-        checkGlobalSetLabelsRequest(obj);
+        var obj = api.GlobalSetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetLabelsRequest(obj as api.GlobalSetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40925,7 +41686,7 @@
           .setLabels(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -40937,8 +41698,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -40975,7 +41737,7 @@
           .testIamPermissions(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -40991,9 +41753,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersAbandonInstancesRequest.fromJson(json);
-        checkInstanceGroupManagersAbandonInstancesRequest(obj);
+        var obj = api.InstanceGroupManagersAbandonInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersAbandonInstancesRequest(
+            obj as api.InstanceGroupManagersAbandonInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41033,7 +41796,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41102,7 +41865,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupManagerAggregatedList(response);
+        checkInstanceGroupManagerAggregatedList(
+            response as api.InstanceGroupManagerAggregatedList);
       })));
     });
 
@@ -41115,8 +41879,10 @@
       var arg_instanceGroupManager = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupManagersApplyUpdatesRequest.fromJson(json);
-        checkInstanceGroupManagersApplyUpdatesRequest(obj);
+        var obj = api.InstanceGroupManagersApplyUpdatesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersApplyUpdatesRequest(
+            obj as api.InstanceGroupManagersApplyUpdatesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41154,7 +41920,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41168,9 +41934,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersCreateInstancesRequest.fromJson(json);
-        checkInstanceGroupManagersCreateInstancesRequest(obj);
+        var obj = api.InstanceGroupManagersCreateInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersCreateInstancesRequest(
+            obj as api.InstanceGroupManagersCreateInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41210,7 +41977,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41260,7 +42027,7 @@
           .delete(arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41274,9 +42041,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersDeleteInstancesRequest.fromJson(json);
-        checkInstanceGroupManagersDeleteInstancesRequest(obj);
+        var obj = api.InstanceGroupManagersDeleteInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersDeleteInstancesRequest(
+            obj as api.InstanceGroupManagersDeleteInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41316,7 +42084,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41329,9 +42097,10 @@
       var arg_instanceGroupManager = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersDeletePerInstanceConfigsReq.fromJson(json);
-        checkInstanceGroupManagersDeletePerInstanceConfigsReq(obj);
+        var obj = api.InstanceGroupManagersDeletePerInstanceConfigsReq.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersDeletePerInstanceConfigsReq(
+            obj as api.InstanceGroupManagersDeletePerInstanceConfigsReq);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41369,7 +42138,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41416,7 +42185,7 @@
           .get(arg_project, arg_zone, arg_instanceGroupManager,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupManager(response);
+        checkInstanceGroupManager(response as api.InstanceGroupManager);
       })));
     });
 
@@ -41429,8 +42198,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupManager.fromJson(json);
-        checkInstanceGroupManager(obj);
+        var obj = api.InstanceGroupManager.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManager(obj as api.InstanceGroupManager);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41469,7 +42239,7 @@
           .insert(arg_request, arg_project, arg_zone,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41534,7 +42304,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupManagerList(response);
+        checkInstanceGroupManagerList(response as api.InstanceGroupManagerList);
       })));
     });
 
@@ -41601,7 +42371,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupManagersListErrorsResponse(response);
+        checkInstanceGroupManagersListErrorsResponse(
+            response as api.InstanceGroupManagersListErrorsResponse);
       })));
     });
 
@@ -41668,7 +42439,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupManagersListManagedInstancesResponse(response);
+        checkInstanceGroupManagersListManagedInstancesResponse(
+            response as api.InstanceGroupManagersListManagedInstancesResponse);
       })));
     });
 
@@ -41736,7 +42508,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupManagersListPerInstanceConfigsResp(response);
+        checkInstanceGroupManagersListPerInstanceConfigsResp(
+            response as api.InstanceGroupManagersListPerInstanceConfigsResp);
       })));
     });
 
@@ -41750,8 +42523,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupManager.fromJson(json);
-        checkInstanceGroupManager(obj);
+        var obj = api.InstanceGroupManager.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManager(obj as api.InstanceGroupManager);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41790,7 +42564,7 @@
           .patch(arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41804,9 +42578,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersPatchPerInstanceConfigsReq.fromJson(json);
-        checkInstanceGroupManagersPatchPerInstanceConfigsReq(obj);
+        var obj = api.InstanceGroupManagersPatchPerInstanceConfigsReq.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersPatchPerInstanceConfigsReq(
+            obj as api.InstanceGroupManagersPatchPerInstanceConfigsReq);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41846,7 +42621,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41860,9 +42635,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersRecreateInstancesRequest.fromJson(json);
-        checkInstanceGroupManagersRecreateInstancesRequest(obj);
+        var obj = api.InstanceGroupManagersRecreateInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersRecreateInstancesRequest(
+            obj as api.InstanceGroupManagersRecreateInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -41902,7 +42678,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41955,7 +42731,7 @@
           .resize(arg_project, arg_zone, arg_instanceGroupManager, arg_size,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -41969,9 +42745,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(json);
-        checkInstanceGroupManagersSetInstanceTemplateRequest(obj);
+        var obj = api.InstanceGroupManagersSetInstanceTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersSetInstanceTemplateRequest(
+            obj as api.InstanceGroupManagersSetInstanceTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42011,7 +42788,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42025,8 +42802,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(json);
-        checkInstanceGroupManagersSetTargetPoolsRequest(obj);
+        var obj = api.InstanceGroupManagersSetTargetPoolsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersSetTargetPoolsRequest(
+            obj as api.InstanceGroupManagersSetTargetPoolsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42066,7 +42845,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42080,9 +42859,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.InstanceGroupManagersUpdatePerInstanceConfigsReq.fromJson(json);
-        checkInstanceGroupManagersUpdatePerInstanceConfigsReq(obj);
+        var obj = api.InstanceGroupManagersUpdatePerInstanceConfigsReq.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManagersUpdatePerInstanceConfigsReq(
+            obj as api.InstanceGroupManagersUpdatePerInstanceConfigsReq);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42122,7 +42902,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -42138,8 +42918,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupsAddInstancesRequest.fromJson(json);
-        checkInstanceGroupsAddInstancesRequest(obj);
+        var obj = api.InstanceGroupsAddInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupsAddInstancesRequest(
+            obj as api.InstanceGroupsAddInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42178,7 +42960,7 @@
           .addInstances(arg_request, arg_project, arg_zone, arg_instanceGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42246,7 +43028,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupAggregatedList(response);
+        checkInstanceGroupAggregatedList(
+            response as api.InstanceGroupAggregatedList);
       })));
     });
 
@@ -42296,7 +43079,7 @@
           .delete(arg_project, arg_zone, arg_instanceGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42342,7 +43125,7 @@
       res
           .get(arg_project, arg_zone, arg_instanceGroup, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroup(response);
+        checkInstanceGroup(response as api.InstanceGroup);
       })));
     });
 
@@ -42355,8 +43138,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroup.fromJson(json);
-        checkInstanceGroup(obj);
+        var obj = api.InstanceGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroup(obj as api.InstanceGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42395,7 +43179,7 @@
           .insert(arg_request, arg_project, arg_zone,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42460,7 +43244,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupList(response);
+        checkInstanceGroupList(response as api.InstanceGroupList);
       })));
     });
 
@@ -42478,8 +43262,10 @@
       var arg_returnPartialSuccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupsListInstancesRequest.fromJson(json);
-        checkInstanceGroupsListInstancesRequest(obj);
+        var obj = api.InstanceGroupsListInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupsListInstancesRequest(
+            obj as api.InstanceGroupsListInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42530,7 +43316,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupsListInstances(response);
+        checkInstanceGroupsListInstances(
+            response as api.InstanceGroupsListInstances);
       })));
     });
 
@@ -42544,8 +43331,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupsRemoveInstancesRequest.fromJson(json);
-        checkInstanceGroupsRemoveInstancesRequest(obj);
+        var obj = api.InstanceGroupsRemoveInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupsRemoveInstancesRequest(
+            obj as api.InstanceGroupsRemoveInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42585,7 +43374,7 @@
               arg_request, arg_project, arg_zone, arg_instanceGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42599,8 +43388,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupsSetNamedPortsRequest.fromJson(json);
-        checkInstanceGroupsSetNamedPortsRequest(obj);
+        var obj = api.InstanceGroupsSetNamedPortsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupsSetNamedPortsRequest(
+            obj as api.InstanceGroupsSetNamedPortsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42639,7 +43430,7 @@
           .setNamedPorts(arg_request, arg_project, arg_zone, arg_instanceGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -42690,7 +43481,7 @@
           .delete(arg_project, arg_instanceTemplate,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42735,7 +43526,7 @@
       res
           .get(arg_project, arg_instanceTemplate, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceTemplate(response);
+        checkInstanceTemplate(response as api.InstanceTemplate);
       })));
     });
 
@@ -42786,7 +43577,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -42798,8 +43589,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceTemplate.fromJson(json);
-        checkInstanceTemplate(obj);
+        var obj = api.InstanceTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceTemplate(obj as api.InstanceTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42838,7 +43630,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -42902,7 +43694,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceTemplateList(response);
+        checkInstanceTemplateList(response as api.InstanceTemplateList);
       })));
     });
 
@@ -42914,8 +43706,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetPolicyRequest.fromJson(json);
-        checkGlobalSetPolicyRequest(obj);
+        var obj = api.GlobalSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetPolicyRequest(obj as api.GlobalSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -42952,7 +43745,7 @@
           .setIamPolicy(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -42964,8 +43757,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -43002,7 +43796,7 @@
           .testIamPermissions(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -43019,8 +43813,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessConfig.fromJson(json);
-        checkAccessConfig(obj);
+        var obj = api.AccessConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessConfig(obj as api.AccessConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -43062,7 +43857,7 @@
               arg_networkInterface,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43076,8 +43871,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesAddResourcePoliciesRequest.fromJson(json);
-        checkInstancesAddResourcePoliciesRequest(obj);
+        var obj = api.InstancesAddResourcePoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesAddResourcePoliciesRequest(
+            obj as api.InstancesAddResourcePoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -43116,7 +43913,7 @@
           .addResourcePolicies(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43184,7 +43981,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceAggregatedList(response);
+        checkInstanceAggregatedList(response as api.InstanceAggregatedList);
       })));
     });
 
@@ -43199,8 +43996,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AttachedDisk.fromJson(json);
-        checkAttachedDisk(obj);
+        var obj = api.AttachedDisk.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAttachedDisk(obj as api.AttachedDisk);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -43243,7 +44041,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43293,7 +44091,7 @@
           .delete(arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43350,7 +44148,7 @@
               arg_accessConfig, arg_networkInterface,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43403,7 +44201,7 @@
           .detachDisk(arg_project, arg_zone, arg_instance, arg_deviceName,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43449,7 +44247,7 @@
       res
           .get(arg_project, arg_zone, arg_instance, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstance(response);
+        checkInstance(response as api.Instance);
       })));
     });
 
@@ -43504,7 +44302,7 @@
               variableKey: arg_variableKey,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGuestAttributes(response);
+        checkGuestAttributes(response as api.GuestAttributes);
       })));
     });
 
@@ -43556,7 +44354,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -43603,7 +44401,7 @@
           .getScreenshot(arg_project, arg_zone, arg_instance,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScreenshot(response);
+        checkScreenshot(response as api.Screenshot);
       })));
     });
 
@@ -43655,7 +44453,7 @@
           .getSerialPortOutput(arg_project, arg_zone, arg_instance,
               port: arg_port, start_1: arg_start_1, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSerialPortOutput(response);
+        checkSerialPortOutput(response as api.SerialPortOutput);
       })));
     });
 
@@ -43702,7 +44500,7 @@
           .getShieldedInstanceIdentity(arg_project, arg_zone, arg_instance,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShieldedInstanceIdentity(response);
+        checkShieldedInstanceIdentity(response as api.ShieldedInstanceIdentity);
       })));
     });
 
@@ -43716,8 +44514,9 @@
       var arg_sourceInstanceTemplate = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -43760,7 +44559,7 @@
               sourceInstanceTemplate: arg_sourceInstanceTemplate,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43825,7 +44624,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceList(response);
+        checkInstanceList(response as api.InstanceList);
       })));
     });
 
@@ -43891,7 +44690,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceListReferrers(response);
+        checkInstanceListReferrers(response as api.InstanceListReferrers);
       })));
     });
 
@@ -43905,8 +44704,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesRemoveResourcePoliciesRequest.fromJson(json);
-        checkInstancesRemoveResourcePoliciesRequest(obj);
+        var obj = api.InstancesRemoveResourcePoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesRemoveResourcePoliciesRequest(
+            obj as api.InstancesRemoveResourcePoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -43946,7 +44747,7 @@
               arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -43996,7 +44797,7 @@
           .reset(arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44051,7 +44852,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44108,7 +44909,7 @@
               arg_autoDelete, arg_deviceName,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44121,8 +44922,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ZoneSetPolicyRequest.fromJson(json);
-        checkZoneSetPolicyRequest(obj);
+        var obj = api.ZoneSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkZoneSetPolicyRequest(obj as api.ZoneSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44159,7 +44961,7 @@
           .setIamPolicy(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -44173,8 +44975,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesSetLabelsRequest.fromJson(json);
-        checkInstancesSetLabelsRequest(obj);
+        var obj = api.InstancesSetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesSetLabelsRequest(obj as api.InstancesSetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44213,7 +45016,7 @@
           .setLabels(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44227,8 +45030,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesSetMachineResourcesRequest.fromJson(json);
-        checkInstancesSetMachineResourcesRequest(obj);
+        var obj = api.InstancesSetMachineResourcesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesSetMachineResourcesRequest(
+            obj as api.InstancesSetMachineResourcesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44267,7 +45072,7 @@
           .setMachineResources(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44281,8 +45086,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesSetMachineTypeRequest.fromJson(json);
-        checkInstancesSetMachineTypeRequest(obj);
+        var obj = api.InstancesSetMachineTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesSetMachineTypeRequest(
+            obj as api.InstancesSetMachineTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44321,7 +45128,7 @@
           .setMachineType(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44335,8 +45142,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Metadata.fromJson(json);
-        checkMetadata(obj);
+        var obj =
+            api.Metadata.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMetadata(obj as api.Metadata);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44375,7 +45183,7 @@
           .setMetadata(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44389,8 +45197,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesSetMinCpuPlatformRequest.fromJson(json);
-        checkInstancesSetMinCpuPlatformRequest(obj);
+        var obj = api.InstancesSetMinCpuPlatformRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesSetMinCpuPlatformRequest(
+            obj as api.InstancesSetMinCpuPlatformRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44429,7 +45239,7 @@
           .setMinCpuPlatform(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44443,8 +45253,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Scheduling.fromJson(json);
-        checkScheduling(obj);
+        var obj = api.Scheduling.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkScheduling(obj as api.Scheduling);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44483,7 +45294,7 @@
           .setScheduling(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44497,8 +45308,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesSetServiceAccountRequest.fromJson(json);
-        checkInstancesSetServiceAccountRequest(obj);
+        var obj = api.InstancesSetServiceAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesSetServiceAccountRequest(
+            obj as api.InstancesSetServiceAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44537,7 +45350,7 @@
           .setServiceAccount(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44551,8 +45364,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ShieldedInstanceIntegrityPolicy.fromJson(json);
-        checkShieldedInstanceIntegrityPolicy(obj);
+        var obj = api.ShieldedInstanceIntegrityPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkShieldedInstanceIntegrityPolicy(
+            obj as api.ShieldedInstanceIntegrityPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44592,7 +45407,7 @@
               arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44606,8 +45421,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Tags.fromJson(json);
-        checkTags(obj);
+        var obj =
+            api.Tags.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTags(obj as api.Tags);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44646,7 +45462,7 @@
           .setTags(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44693,7 +45509,7 @@
           .simulateMaintenanceEvent(arg_project, arg_zone, arg_instance,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44743,7 +45559,7 @@
           .start(arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44757,8 +45573,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstancesStartWithEncryptionKeyRequest.fromJson(json);
-        checkInstancesStartWithEncryptionKeyRequest(obj);
+        var obj = api.InstancesStartWithEncryptionKeyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstancesStartWithEncryptionKeyRequest(
+            obj as api.InstancesStartWithEncryptionKeyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44798,7 +45616,7 @@
               arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44848,7 +45666,7 @@
           .stop(arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44861,8 +45679,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44899,7 +45718,7 @@
           .testIamPermissions(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
 
@@ -44915,8 +45734,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -44962,7 +45782,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -44977,8 +45797,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccessConfig.fromJson(json);
-        checkAccessConfig(obj);
+        var obj = api.AccessConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccessConfig(obj as api.AccessConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45020,7 +45841,7 @@
               arg_networkInterface,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -45034,8 +45855,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisplayDevice.fromJson(json);
-        checkDisplayDevice(obj);
+        var obj = api.DisplayDevice.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisplayDevice(obj as api.DisplayDevice);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45074,7 +45896,7 @@
           .updateDisplayDevice(arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -45089,8 +45911,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworkInterface.fromJson(json);
-        checkNetworkInterface(obj);
+        var obj = api.NetworkInterface.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworkInterface(obj as api.NetworkInterface);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45132,7 +45955,7 @@
               arg_instance, arg_networkInterface,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -45146,8 +45969,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ShieldedInstanceConfig.fromJson(json);
-        checkShieldedInstanceConfig(obj);
+        var obj = api.ShieldedInstanceConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkShieldedInstanceConfig(obj as api.ShieldedInstanceConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45187,7 +46011,7 @@
               arg_request, arg_project, arg_zone, arg_instance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -45258,7 +46082,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnectAttachmentAggregatedList(response);
+        checkInterconnectAttachmentAggregatedList(
+            response as api.InterconnectAttachmentAggregatedList);
       })));
     });
 
@@ -45308,7 +46133,7 @@
           .delete(arg_project, arg_region, arg_interconnectAttachment,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -45355,7 +46180,7 @@
           .get(arg_project, arg_region, arg_interconnectAttachment,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnectAttachment(response);
+        checkInterconnectAttachment(response as api.InterconnectAttachment);
       })));
     });
 
@@ -45369,8 +46194,9 @@
       var arg_validateOnly = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InterconnectAttachment.fromJson(json);
-        checkInterconnectAttachment(obj);
+        var obj = api.InterconnectAttachment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInterconnectAttachment(obj as api.InterconnectAttachment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45413,7 +46239,7 @@
               validateOnly: arg_validateOnly,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -45478,7 +46304,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnectAttachmentList(response);
+        checkInterconnectAttachmentList(
+            response as api.InterconnectAttachmentList);
       })));
     });
 
@@ -45492,8 +46319,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InterconnectAttachment.fromJson(json);
-        checkInterconnectAttachment(obj);
+        var obj = api.InterconnectAttachment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInterconnectAttachment(obj as api.InterconnectAttachment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45533,7 +46361,7 @@
               arg_request, arg_project, arg_region, arg_interconnectAttachment,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -45580,7 +46408,7 @@
       res
           .get(arg_project, arg_interconnectLocation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnectLocation(response);
+        checkInterconnectLocation(response as api.InterconnectLocation);
       })));
     });
 
@@ -45644,7 +46472,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnectLocationList(response);
+        checkInterconnectLocationList(response as api.InterconnectLocationList);
       })));
     });
   });
@@ -45695,7 +46523,7 @@
           .delete(arg_project, arg_interconnect,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -45740,7 +46568,7 @@
       res
           .get(arg_project, arg_interconnect, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnect(response);
+        checkInterconnect(response as api.Interconnect);
       })));
     });
 
@@ -45786,7 +46614,8 @@
       res
           .getDiagnostics(arg_project, arg_interconnect, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnectsGetDiagnosticsResponse(response);
+        checkInterconnectsGetDiagnosticsResponse(
+            response as api.InterconnectsGetDiagnosticsResponse);
       })));
     });
 
@@ -45798,8 +46627,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Interconnect.fromJson(json);
-        checkInterconnect(obj);
+        var obj = api.Interconnect.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInterconnect(obj as api.Interconnect);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45838,7 +46668,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -45902,7 +46732,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInterconnectList(response);
+        checkInterconnectList(response as api.InterconnectList);
       })));
     });
 
@@ -45915,8 +46745,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Interconnect.fromJson(json);
-        checkInterconnect(obj);
+        var obj = api.Interconnect.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInterconnect(obj as api.Interconnect);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -45955,7 +46786,7 @@
           .patch(arg_request, arg_project, arg_interconnect,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -46002,7 +46833,7 @@
       res
           .get(arg_project, arg_licenseCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicenseCode(response);
+        checkLicenseCode(response as api.LicenseCode);
       })));
     });
 
@@ -46014,8 +46845,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -46052,7 +46884,7 @@
           .testIamPermissions(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -46103,7 +46935,7 @@
           .delete(arg_project, arg_license,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -46148,7 +46980,7 @@
       res
           .get(arg_project, arg_license, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicense(response);
+        checkLicense(response as api.License);
       })));
     });
 
@@ -46199,7 +47031,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -46211,8 +47043,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.License.fromJson(json);
-        checkLicense(obj);
+        var obj =
+            api.License.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLicense(obj as api.License);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -46251,7 +47084,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -46315,7 +47148,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicensesListResponse(response);
+        checkLicensesListResponse(response as api.LicensesListResponse);
       })));
     });
 
@@ -46327,8 +47160,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetPolicyRequest.fromJson(json);
-        checkGlobalSetPolicyRequest(obj);
+        var obj = api.GlobalSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetPolicyRequest(obj as api.GlobalSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -46365,7 +47199,7 @@
           .setIamPolicy(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -46377,8 +47211,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -46415,7 +47250,7 @@
           .testIamPermissions(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -46485,7 +47320,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMachineTypeAggregatedList(response);
+        checkMachineTypeAggregatedList(
+            response as api.MachineTypeAggregatedList);
       })));
     });
 
@@ -46531,7 +47367,7 @@
       res
           .get(arg_project, arg_zone, arg_machineType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMachineType(response);
+        checkMachineType(response as api.MachineType);
       })));
     });
 
@@ -46596,7 +47432,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMachineTypeList(response);
+        checkMachineTypeList(response as api.MachineTypeList);
       })));
     });
   });
@@ -46667,7 +47503,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroupAggregatedList(response);
+        checkNetworkEndpointGroupAggregatedList(
+            response as api.NetworkEndpointGroupAggregatedList);
       })));
     });
 
@@ -46681,9 +47518,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.NetworkEndpointGroupsAttachEndpointsRequest.fromJson(json);
-        checkNetworkEndpointGroupsAttachEndpointsRequest(obj);
+        var obj = api.NetworkEndpointGroupsAttachEndpointsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworkEndpointGroupsAttachEndpointsRequest(
+            obj as api.NetworkEndpointGroupsAttachEndpointsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -46723,7 +47561,7 @@
               arg_request, arg_project, arg_zone, arg_networkEndpointGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -46773,7 +47611,7 @@
           .delete(arg_project, arg_zone, arg_networkEndpointGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -46787,9 +47625,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.NetworkEndpointGroupsDetachEndpointsRequest.fromJson(json);
-        checkNetworkEndpointGroupsDetachEndpointsRequest(obj);
+        var obj = api.NetworkEndpointGroupsDetachEndpointsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworkEndpointGroupsDetachEndpointsRequest(
+            obj as api.NetworkEndpointGroupsDetachEndpointsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -46829,7 +47668,7 @@
               arg_request, arg_project, arg_zone, arg_networkEndpointGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -46876,7 +47715,7 @@
           .get(arg_project, arg_zone, arg_networkEndpointGroup,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroup(response);
+        checkNetworkEndpointGroup(response as api.NetworkEndpointGroup);
       })));
     });
 
@@ -46889,8 +47728,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworkEndpointGroup.fromJson(json);
-        checkNetworkEndpointGroup(obj);
+        var obj = api.NetworkEndpointGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworkEndpointGroup(obj as api.NetworkEndpointGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -46929,7 +47769,7 @@
           .insert(arg_request, arg_project, arg_zone,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -46994,7 +47834,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroupList(response);
+        checkNetworkEndpointGroupList(response as api.NetworkEndpointGroupList);
       })));
     });
 
@@ -47012,8 +47852,10 @@
       var arg_returnPartialSuccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworkEndpointGroupsListEndpointsRequest.fromJson(json);
-        checkNetworkEndpointGroupsListEndpointsRequest(obj);
+        var obj = api.NetworkEndpointGroupsListEndpointsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworkEndpointGroupsListEndpointsRequest(
+            obj as api.NetworkEndpointGroupsListEndpointsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47066,7 +47908,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroupsListNetworkEndpoints(response);
+        checkNetworkEndpointGroupsListNetworkEndpoints(
+            response as api.NetworkEndpointGroupsListNetworkEndpoints);
       })));
     });
 
@@ -47079,8 +47922,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47117,7 +47961,7 @@
           .testIamPermissions(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -47132,8 +47976,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworksAddPeeringRequest.fromJson(json);
-        checkNetworksAddPeeringRequest(obj);
+        var obj = api.NetworksAddPeeringRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworksAddPeeringRequest(obj as api.NetworksAddPeeringRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47172,7 +48017,7 @@
           .addPeering(arg_request, arg_project, arg_network,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47221,7 +48066,7 @@
           .delete(arg_project, arg_network,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47266,7 +48111,7 @@
       res
           .get(arg_project, arg_network, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetwork(response);
+        checkNetwork(response as api.Network);
       })));
     });
 
@@ -47278,8 +48123,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Network.fromJson(json);
-        checkNetwork(obj);
+        var obj =
+            api.Network.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkNetwork(obj as api.Network);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47318,7 +48164,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47382,7 +48228,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkList(response);
+        checkNetworkList(response as api.NetworkList);
       })));
     });
 
@@ -47458,7 +48304,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExchangedPeeringRoutesList(response);
+        checkExchangedPeeringRoutesList(
+            response as api.ExchangedPeeringRoutesList);
       })));
     });
 
@@ -47471,8 +48318,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Network.fromJson(json);
-        checkNetwork(obj);
+        var obj =
+            api.Network.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkNetwork(obj as api.Network);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47511,7 +48359,7 @@
           .patch(arg_request, arg_project, arg_network,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47524,8 +48372,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworksRemovePeeringRequest.fromJson(json);
-        checkNetworksRemovePeeringRequest(obj);
+        var obj = api.NetworksRemovePeeringRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworksRemovePeeringRequest(
+            obj as api.NetworksRemovePeeringRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47564,7 +48414,7 @@
           .removePeering(arg_request, arg_project, arg_network,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47613,7 +48463,7 @@
           .switchToCustomMode(arg_project, arg_network,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47626,8 +48476,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworksUpdatePeeringRequest.fromJson(json);
-        checkNetworksUpdatePeeringRequest(obj);
+        var obj = api.NetworksUpdatePeeringRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworksUpdatePeeringRequest(
+            obj as api.NetworksUpdatePeeringRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47666,7 +48518,7 @@
           .updatePeering(arg_request, arg_project, arg_network,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -47682,8 +48534,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NodeGroupsAddNodesRequest.fromJson(json);
-        checkNodeGroupsAddNodesRequest(obj);
+        var obj = api.NodeGroupsAddNodesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNodeGroupsAddNodesRequest(obj as api.NodeGroupsAddNodesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47722,7 +48575,7 @@
           .addNodes(arg_request, arg_project, arg_zone, arg_nodeGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47790,7 +48643,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeGroupAggregatedList(response);
+        checkNodeGroupAggregatedList(response as api.NodeGroupAggregatedList);
       })));
     });
 
@@ -47840,7 +48693,7 @@
           .delete(arg_project, arg_zone, arg_nodeGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47854,8 +48707,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NodeGroupsDeleteNodesRequest.fromJson(json);
-        checkNodeGroupsDeleteNodesRequest(obj);
+        var obj = api.NodeGroupsDeleteNodesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNodeGroupsDeleteNodesRequest(
+            obj as api.NodeGroupsDeleteNodesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -47894,7 +48749,7 @@
           .deleteNodes(arg_request, arg_project, arg_zone, arg_nodeGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -47940,7 +48795,7 @@
       res
           .get(arg_project, arg_zone, arg_nodeGroup, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeGroup(response);
+        checkNodeGroup(response as api.NodeGroup);
       })));
     });
 
@@ -47992,7 +48847,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -48006,8 +48861,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NodeGroup.fromJson(json);
-        checkNodeGroup(obj);
+        var obj =
+            api.NodeGroup.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkNodeGroup(obj as api.NodeGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48048,7 +48904,7 @@
           .insert(arg_request, arg_project, arg_zone, arg_initialNodeCount,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -48113,7 +48969,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeGroupList(response);
+        checkNodeGroupList(response as api.NodeGroupList);
       })));
     });
 
@@ -48179,7 +49035,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeGroupsListNodes(response);
+        checkNodeGroupsListNodes(response as api.NodeGroupsListNodes);
       })));
     });
 
@@ -48193,8 +49049,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NodeGroup.fromJson(json);
-        checkNodeGroup(obj);
+        var obj =
+            api.NodeGroup.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkNodeGroup(obj as api.NodeGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48233,7 +49090,7 @@
           .patch(arg_request, arg_project, arg_zone, arg_nodeGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -48246,8 +49103,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ZoneSetPolicyRequest.fromJson(json);
-        checkZoneSetPolicyRequest(obj);
+        var obj = api.ZoneSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkZoneSetPolicyRequest(obj as api.ZoneSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48284,7 +49142,7 @@
           .setIamPolicy(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -48298,8 +49156,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NodeGroupsSetNodeTemplateRequest.fromJson(json);
-        checkNodeGroupsSetNodeTemplateRequest(obj);
+        var obj = api.NodeGroupsSetNodeTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNodeGroupsSetNodeTemplateRequest(
+            obj as api.NodeGroupsSetNodeTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48338,7 +49198,7 @@
           .setNodeTemplate(arg_request, arg_project, arg_zone, arg_nodeGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -48351,8 +49211,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48389,7 +49250,7 @@
           .testIamPermissions(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -48459,7 +49320,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeTemplateAggregatedList(response);
+        checkNodeTemplateAggregatedList(
+            response as api.NodeTemplateAggregatedList);
       })));
     });
 
@@ -48509,7 +49371,7 @@
           .delete(arg_project, arg_region, arg_nodeTemplate,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -48555,7 +49417,7 @@
       res
           .get(arg_project, arg_region, arg_nodeTemplate, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeTemplate(response);
+        checkNodeTemplate(response as api.NodeTemplate);
       })));
     });
 
@@ -48607,7 +49469,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -48620,8 +49482,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NodeTemplate.fromJson(json);
-        checkNodeTemplate(obj);
+        var obj = api.NodeTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNodeTemplate(obj as api.NodeTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48660,7 +49523,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -48725,7 +49588,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeTemplateList(response);
+        checkNodeTemplateList(response as api.NodeTemplateList);
       })));
     });
 
@@ -48738,8 +49601,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionSetPolicyRequest.fromJson(json);
-        checkRegionSetPolicyRequest(obj);
+        var obj = api.RegionSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionSetPolicyRequest(obj as api.RegionSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48776,7 +49640,7 @@
           .setIamPolicy(arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -48789,8 +49653,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -48828,7 +49693,7 @@
               arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -48898,7 +49763,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeTypeAggregatedList(response);
+        checkNodeTypeAggregatedList(response as api.NodeTypeAggregatedList);
       })));
     });
 
@@ -48944,7 +49809,7 @@
       res
           .get(arg_project, arg_zone, arg_nodeType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeType(response);
+        checkNodeType(response as api.NodeType);
       })));
     });
 
@@ -49009,7 +49874,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodeTypeList(response);
+        checkNodeTypeList(response as api.NodeTypeList);
       })));
     });
   });
@@ -49079,7 +49944,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPacketMirroringAggregatedList(response);
+        checkPacketMirroringAggregatedList(
+            response as api.PacketMirroringAggregatedList);
       })));
     });
 
@@ -49129,7 +49995,7 @@
           .delete(arg_project, arg_region, arg_packetMirroring,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49176,7 +50042,7 @@
           .get(arg_project, arg_region, arg_packetMirroring,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPacketMirroring(response);
+        checkPacketMirroring(response as api.PacketMirroring);
       })));
     });
 
@@ -49189,8 +50055,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PacketMirroring.fromJson(json);
-        checkPacketMirroring(obj);
+        var obj = api.PacketMirroring.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPacketMirroring(obj as api.PacketMirroring);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49229,7 +50096,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49294,7 +50161,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPacketMirroringList(response);
+        checkPacketMirroringList(response as api.PacketMirroringList);
       })));
     });
 
@@ -49308,8 +50175,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PacketMirroring.fromJson(json);
-        checkPacketMirroring(obj);
+        var obj = api.PacketMirroring.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPacketMirroring(obj as api.PacketMirroring);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49348,7 +50216,7 @@
           .patch(arg_request, arg_project, arg_region, arg_packetMirroring,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49361,8 +50229,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49400,7 +50269,7 @@
               arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -49450,7 +50319,7 @@
           .disableXpnHost(arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49462,8 +50331,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProjectsDisableXpnResourceRequest.fromJson(json);
-        checkProjectsDisableXpnResourceRequest(obj);
+        var obj = api.ProjectsDisableXpnResourceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProjectsDisableXpnResourceRequest(
+            obj as api.ProjectsDisableXpnResourceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49502,7 +50373,7 @@
           .disableXpnResource(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49550,7 +50421,7 @@
           .enableXpnHost(arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49562,8 +50433,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProjectsEnableXpnResourceRequest.fromJson(json);
-        checkProjectsEnableXpnResourceRequest(obj);
+        var obj = api.ProjectsEnableXpnResourceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProjectsEnableXpnResourceRequest(
+            obj as api.ProjectsEnableXpnResourceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49602,7 +50475,7 @@
           .enableXpnResource(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49646,7 +50519,7 @@
       res
           .get(arg_project, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
 
@@ -49690,7 +50563,7 @@
       res
           .getXpnHost(arg_project, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
 
@@ -49754,7 +50627,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProjectsGetXpnResources(response);
+        checkProjectsGetXpnResources(response as api.ProjectsGetXpnResources);
       })));
     });
 
@@ -49770,8 +50643,10 @@
       var arg_returnPartialSuccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProjectsListXpnHostsRequest.fromJson(json);
-        checkProjectsListXpnHostsRequest(obj);
+        var obj = api.ProjectsListXpnHostsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProjectsListXpnHostsRequest(
+            obj as api.ProjectsListXpnHostsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49822,7 +50697,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkXpnHostList(response);
+        checkXpnHostList(response as api.XpnHostList);
       })));
     });
 
@@ -49834,8 +50709,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DiskMoveRequest.fromJson(json);
-        checkDiskMoveRequest(obj);
+        var obj = api.DiskMoveRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDiskMoveRequest(obj as api.DiskMoveRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49874,7 +50750,7 @@
           .moveDisk(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49886,8 +50762,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceMoveRequest.fromJson(json);
-        checkInstanceMoveRequest(obj);
+        var obj = api.InstanceMoveRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceMoveRequest(obj as api.InstanceMoveRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49926,7 +50803,7 @@
           .moveInstance(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49938,8 +50815,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Metadata.fromJson(json);
-        checkMetadata(obj);
+        var obj =
+            api.Metadata.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMetadata(obj as api.Metadata);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -49978,7 +50856,7 @@
           .setCommonInstanceMetadata(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -49990,8 +50868,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProjectsSetDefaultNetworkTierRequest.fromJson(json);
-        checkProjectsSetDefaultNetworkTierRequest(obj);
+        var obj = api.ProjectsSetDefaultNetworkTierRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProjectsSetDefaultNetworkTierRequest(
+            obj as api.ProjectsSetDefaultNetworkTierRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50030,7 +50910,7 @@
           .setDefaultNetworkTier(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -50042,8 +50922,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UsageExportLocation.fromJson(json);
-        checkUsageExportLocation(obj);
+        var obj = api.UsageExportLocation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUsageExportLocation(obj as api.UsageExportLocation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50082,7 +50963,7 @@
           .setUsageExportBucket(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -50134,7 +51015,7 @@
           .delete(arg_project, arg_region, arg_autoscaler,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -50180,7 +51061,7 @@
       res
           .get(arg_project, arg_region, arg_autoscaler, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscaler(response);
+        checkAutoscaler(response as api.Autoscaler);
       })));
     });
 
@@ -50193,8 +51074,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Autoscaler.fromJson(json);
-        checkAutoscaler(obj);
+        var obj = api.Autoscaler.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscaler(obj as api.Autoscaler);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50233,7 +51115,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -50298,7 +51180,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionAutoscalerList(response);
+        checkRegionAutoscalerList(response as api.RegionAutoscalerList);
       })));
     });
 
@@ -50312,8 +51194,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Autoscaler.fromJson(json);
-        checkAutoscaler(obj);
+        var obj = api.Autoscaler.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscaler(obj as api.Autoscaler);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50356,7 +51239,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -50370,8 +51253,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Autoscaler.fromJson(json);
-        checkAutoscaler(obj);
+        var obj = api.Autoscaler.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscaler(obj as api.Autoscaler);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50414,7 +51298,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -50466,7 +51350,7 @@
           .delete(arg_project, arg_region, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -50513,7 +51397,7 @@
           .get(arg_project, arg_region, arg_backendService,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendService(response);
+        checkBackendService(response as api.BackendService);
       })));
     });
 
@@ -50526,8 +51410,9 @@
       var arg_backendService = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResourceGroupReference.fromJson(json);
-        checkResourceGroupReference(obj);
+        var obj = api.ResourceGroupReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResourceGroupReference(obj as api.ResourceGroupReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50564,7 +51449,8 @@
           .getHealth(arg_request, arg_project, arg_region, arg_backendService,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendServiceGroupHealth(response);
+        checkBackendServiceGroupHealth(
+            response as api.BackendServiceGroupHealth);
       })));
     });
 
@@ -50577,8 +51463,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendService.fromJson(json);
-        checkBackendService(obj);
+        var obj = api.BackendService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendService(obj as api.BackendService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50617,7 +51504,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -50682,7 +51569,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackendServiceList(response);
+        checkBackendServiceList(response as api.BackendServiceList);
       })));
     });
 
@@ -50696,8 +51583,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendService.fromJson(json);
-        checkBackendService(obj);
+        var obj = api.BackendService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendService(obj as api.BackendService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50736,7 +51624,7 @@
           .patch(arg_request, arg_project, arg_region, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -50750,8 +51638,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BackendService.fromJson(json);
-        checkBackendService(obj);
+        var obj = api.BackendService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBackendService(obj as api.BackendService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50790,7 +51679,7 @@
           .update(arg_request, arg_project, arg_region, arg_backendService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -50860,7 +51749,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommitmentAggregatedList(response);
+        checkCommitmentAggregatedList(response as api.CommitmentAggregatedList);
       })));
     });
 
@@ -50906,7 +51795,7 @@
       res
           .get(arg_project, arg_region, arg_commitment, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommitment(response);
+        checkCommitment(response as api.Commitment);
       })));
     });
 
@@ -50919,8 +51808,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Commitment.fromJson(json);
-        checkCommitment(obj);
+        var obj = api.Commitment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommitment(obj as api.Commitment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -50959,7 +51849,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51024,7 +51914,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommitmentList(response);
+        checkCommitmentList(response as api.CommitmentList);
       })));
     });
   });
@@ -51072,7 +51962,7 @@
       res
           .get(arg_project, arg_region, arg_diskType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiskType(response);
+        checkDiskType(response as api.DiskType);
       })));
     });
 
@@ -51137,7 +52027,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionDiskTypeList(response);
+        checkRegionDiskTypeList(response as api.RegionDiskTypeList);
       })));
     });
   });
@@ -51153,8 +52043,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionDisksAddResourcePoliciesRequest.fromJson(json);
-        checkRegionDisksAddResourcePoliciesRequest(obj);
+        var obj = api.RegionDisksAddResourcePoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionDisksAddResourcePoliciesRequest(
+            obj as api.RegionDisksAddResourcePoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51193,7 +52085,7 @@
           .addResourcePolicies(arg_request, arg_project, arg_region, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51207,8 +52099,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Snapshot.fromJson(json);
-        checkSnapshot(obj);
+        var obj =
+            api.Snapshot.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSnapshot(obj as api.Snapshot);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51247,7 +52140,7 @@
           .createSnapshot(arg_request, arg_project, arg_region, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51297,7 +52190,7 @@
           .delete(arg_project, arg_region, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51343,7 +52236,7 @@
       res
           .get(arg_project, arg_region, arg_disk, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDisk(response);
+        checkDisk(response as api.Disk);
       })));
     });
 
@@ -51395,7 +52288,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -51409,8 +52302,9 @@
       var arg_sourceImage = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Disk.fromJson(json);
-        checkDisk(obj);
+        var obj =
+            api.Disk.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDisk(obj as api.Disk);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51453,7 +52347,7 @@
               sourceImage: arg_sourceImage,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51518,7 +52412,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDiskList(response);
+        checkDiskList(response as api.DiskList);
       })));
     });
 
@@ -51532,8 +52426,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionDisksRemoveResourcePoliciesRequest.fromJson(json);
-        checkRegionDisksRemoveResourcePoliciesRequest(obj);
+        var obj = api.RegionDisksRemoveResourcePoliciesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionDisksRemoveResourcePoliciesRequest(
+            obj as api.RegionDisksRemoveResourcePoliciesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51573,7 +52469,7 @@
               arg_request, arg_project, arg_region, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51587,8 +52483,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionDisksResizeRequest.fromJson(json);
-        checkRegionDisksResizeRequest(obj);
+        var obj = api.RegionDisksResizeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionDisksResizeRequest(obj as api.RegionDisksResizeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51627,7 +52524,7 @@
           .resize(arg_request, arg_project, arg_region, arg_disk,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51640,8 +52537,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionSetPolicyRequest.fromJson(json);
-        checkRegionSetPolicyRequest(obj);
+        var obj = api.RegionSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionSetPolicyRequest(obj as api.RegionSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51678,7 +52576,7 @@
           .setIamPolicy(arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -51692,8 +52590,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionSetLabelsRequest.fromJson(json);
-        checkRegionSetLabelsRequest(obj);
+        var obj = api.RegionSetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionSetLabelsRequest(obj as api.RegionSetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51732,7 +52631,7 @@
           .setLabels(arg_request, arg_project, arg_region, arg_resource,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51745,8 +52644,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51784,7 +52684,7 @@
               arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -51836,7 +52736,7 @@
           .delete(arg_project, arg_region, arg_healthCheckService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -51883,7 +52783,7 @@
           .get(arg_project, arg_region, arg_healthCheckService,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHealthCheckService(response);
+        checkHealthCheckService(response as api.HealthCheckService);
       })));
     });
 
@@ -51896,8 +52796,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheckService.fromJson(json);
-        checkHealthCheckService(obj);
+        var obj = api.HealthCheckService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheckService(obj as api.HealthCheckService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -51936,7 +52837,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52001,7 +52902,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHealthCheckServicesList(response);
+        checkHealthCheckServicesList(response as api.HealthCheckServicesList);
       })));
     });
 
@@ -52015,8 +52916,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheckService.fromJson(json);
-        checkHealthCheckService(obj);
+        var obj = api.HealthCheckService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheckService(obj as api.HealthCheckService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52055,7 +52957,7 @@
           .patch(arg_request, arg_project, arg_region, arg_healthCheckService,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -52107,7 +53009,7 @@
           .delete(arg_project, arg_region, arg_healthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52153,7 +53055,7 @@
       res
           .get(arg_project, arg_region, arg_healthCheck, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHealthCheck(response);
+        checkHealthCheck(response as api.HealthCheck);
       })));
     });
 
@@ -52166,8 +53068,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheck.fromJson(json);
-        checkHealthCheck(obj);
+        var obj = api.HealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheck(obj as api.HealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52206,7 +53109,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52271,7 +53174,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHealthCheckList(response);
+        checkHealthCheckList(response as api.HealthCheckList);
       })));
     });
 
@@ -52285,8 +53188,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheck.fromJson(json);
-        checkHealthCheck(obj);
+        var obj = api.HealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheck(obj as api.HealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52325,7 +53229,7 @@
           .patch(arg_request, arg_project, arg_region, arg_healthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52339,8 +53243,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HealthCheck.fromJson(json);
-        checkHealthCheck(obj);
+        var obj = api.HealthCheck.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHealthCheck(obj as api.HealthCheck);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52379,7 +53284,7 @@
           .update(arg_request, arg_project, arg_region, arg_healthCheck,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -52398,8 +53303,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.RegionInstanceGroupManagersAbandonInstancesRequest.fromJson(
-                json);
-        checkRegionInstanceGroupManagersAbandonInstancesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagersAbandonInstancesRequest(
+            obj as api.RegionInstanceGroupManagersAbandonInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52439,7 +53345,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52452,9 +53358,10 @@
       var arg_instanceGroupManager = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.RegionInstanceGroupManagersApplyUpdatesRequest.fromJson(json);
-        checkRegionInstanceGroupManagersApplyUpdatesRequest(obj);
+        var obj = api.RegionInstanceGroupManagersApplyUpdatesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagersApplyUpdatesRequest(
+            obj as api.RegionInstanceGroupManagersApplyUpdatesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52492,7 +53399,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52509,8 +53416,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.RegionInstanceGroupManagersCreateInstancesRequest.fromJson(
-                json);
-        checkRegionInstanceGroupManagersCreateInstancesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagersCreateInstancesRequest(
+            obj as api.RegionInstanceGroupManagersCreateInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52550,7 +53458,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52600,7 +53508,7 @@
           .delete(arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52617,8 +53525,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.RegionInstanceGroupManagersDeleteInstancesRequest.fromJson(
-                json);
-        checkRegionInstanceGroupManagersDeleteInstancesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagersDeleteInstancesRequest(
+            obj as api.RegionInstanceGroupManagersDeleteInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52658,7 +53567,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52674,8 +53583,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.RegionInstanceGroupManagerDeleteInstanceConfigReq.fromJson(
-                json);
-        checkRegionInstanceGroupManagerDeleteInstanceConfigReq(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagerDeleteInstanceConfigReq(
+            obj as api.RegionInstanceGroupManagerDeleteInstanceConfigReq);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52713,7 +53623,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52760,7 +53670,7 @@
           .get(arg_project, arg_region, arg_instanceGroupManager,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroupManager(response);
+        checkInstanceGroupManager(response as api.InstanceGroupManager);
       })));
     });
 
@@ -52773,8 +53683,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupManager.fromJson(json);
-        checkInstanceGroupManager(obj);
+        var obj = api.InstanceGroupManager.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManager(obj as api.InstanceGroupManager);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -52813,7 +53724,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -52878,7 +53789,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionInstanceGroupManagerList(response);
+        checkRegionInstanceGroupManagerList(
+            response as api.RegionInstanceGroupManagerList);
       })));
     });
 
@@ -52945,7 +53857,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionInstanceGroupManagersListErrorsResponse(response);
+        checkRegionInstanceGroupManagersListErrorsResponse(
+            response as api.RegionInstanceGroupManagersListErrorsResponse);
       })));
     });
 
@@ -53013,7 +53926,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionInstanceGroupManagersListInstancesResponse(response);
+        checkRegionInstanceGroupManagersListInstancesResponse(
+            response as api.RegionInstanceGroupManagersListInstancesResponse);
       })));
     });
 
@@ -53081,7 +53995,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionInstanceGroupManagersListInstanceConfigsResp(response);
+        checkRegionInstanceGroupManagersListInstanceConfigsResp(
+            response as api.RegionInstanceGroupManagersListInstanceConfigsResp);
       })));
     });
 
@@ -53095,8 +54010,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceGroupManager.fromJson(json);
-        checkInstanceGroupManager(obj);
+        var obj = api.InstanceGroupManager.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceGroupManager(obj as api.InstanceGroupManager);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53135,7 +54051,7 @@
           .patch(arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53149,9 +54065,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.RegionInstanceGroupManagerPatchInstanceConfigReq.fromJson(json);
-        checkRegionInstanceGroupManagerPatchInstanceConfigReq(obj);
+        var obj = api.RegionInstanceGroupManagerPatchInstanceConfigReq.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagerPatchInstanceConfigReq(
+            obj as api.RegionInstanceGroupManagerPatchInstanceConfigReq);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53191,7 +54108,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53205,8 +54122,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionInstanceGroupManagersRecreateRequest.fromJson(json);
-        checkRegionInstanceGroupManagersRecreateRequest(obj);
+        var obj = api.RegionInstanceGroupManagersRecreateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagersRecreateRequest(
+            obj as api.RegionInstanceGroupManagersRecreateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53246,7 +54165,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53299,7 +54218,7 @@
           .resize(arg_project, arg_region, arg_instanceGroupManager, arg_size,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53313,9 +54232,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(json);
-        checkRegionInstanceGroupManagersSetTemplateRequest(obj);
+        var obj = api.RegionInstanceGroupManagersSetTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagersSetTemplateRequest(
+            obj as api.RegionInstanceGroupManagersSetTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53355,7 +54275,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53369,9 +54289,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(json);
-        checkRegionInstanceGroupManagersSetTargetPoolsRequest(obj);
+        var obj = api.RegionInstanceGroupManagersSetTargetPoolsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagersSetTargetPoolsRequest(
+            obj as api.RegionInstanceGroupManagersSetTargetPoolsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53411,7 +54332,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53428,8 +54349,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.RegionInstanceGroupManagerUpdateInstanceConfigReq.fromJson(
-                json);
-        checkRegionInstanceGroupManagerUpdateInstanceConfigReq(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupManagerUpdateInstanceConfigReq(
+            obj as api.RegionInstanceGroupManagerUpdateInstanceConfigReq);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53469,7 +54391,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroupManager,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -53517,7 +54439,7 @@
       res
           .get(arg_project, arg_region, arg_instanceGroup, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceGroup(response);
+        checkInstanceGroup(response as api.InstanceGroup);
       })));
     });
 
@@ -53582,7 +54504,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionInstanceGroupList(response);
+        checkRegionInstanceGroupList(response as api.RegionInstanceGroupList);
       })));
     });
 
@@ -53600,8 +54522,10 @@
       var arg_returnPartialSuccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionInstanceGroupsListInstancesRequest.fromJson(json);
-        checkRegionInstanceGroupsListInstancesRequest(obj);
+        var obj = api.RegionInstanceGroupsListInstancesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupsListInstancesRequest(
+            obj as api.RegionInstanceGroupsListInstancesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53654,7 +54578,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionInstanceGroupsListInstances(response);
+        checkRegionInstanceGroupsListInstances(
+            response as api.RegionInstanceGroupsListInstances);
       })));
     });
 
@@ -53668,8 +54593,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(json);
-        checkRegionInstanceGroupsSetNamedPortsRequest(obj);
+        var obj = api.RegionInstanceGroupsSetNamedPortsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionInstanceGroupsSetNamedPortsRequest(
+            obj as api.RegionInstanceGroupsSetNamedPortsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53709,7 +54636,7 @@
               arg_request, arg_project, arg_region, arg_instanceGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -53761,7 +54688,7 @@
           .delete(arg_project, arg_region, arg_networkEndpointGroup,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53808,7 +54735,7 @@
           .get(arg_project, arg_region, arg_networkEndpointGroup,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroup(response);
+        checkNetworkEndpointGroup(response as api.NetworkEndpointGroup);
       })));
     });
 
@@ -53821,8 +54748,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NetworkEndpointGroup.fromJson(json);
-        checkNetworkEndpointGroup(obj);
+        var obj = api.NetworkEndpointGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNetworkEndpointGroup(obj as api.NetworkEndpointGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -53861,7 +54789,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -53926,7 +54854,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNetworkEndpointGroupList(response);
+        checkNetworkEndpointGroupList(response as api.NetworkEndpointGroupList);
       })));
     });
   });
@@ -53978,7 +54906,7 @@
           .delete(arg_project, arg_region, arg_notificationEndpoint,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54025,7 +54953,7 @@
           .get(arg_project, arg_region, arg_notificationEndpoint,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationEndpoint(response);
+        checkNotificationEndpoint(response as api.NotificationEndpoint);
       })));
     });
 
@@ -54038,8 +54966,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NotificationEndpoint.fromJson(json);
-        checkNotificationEndpoint(obj);
+        var obj = api.NotificationEndpoint.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNotificationEndpoint(obj as api.NotificationEndpoint);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -54078,7 +55007,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54143,7 +55072,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationEndpointList(response);
+        checkNotificationEndpointList(response as api.NotificationEndpointList);
       })));
     });
   });
@@ -54235,7 +55164,7 @@
       res
           .get(arg_project, arg_region, arg_operation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54300,7 +55229,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperationList(response);
+        checkOperationList(response as api.OperationList);
       })));
     });
 
@@ -54346,7 +55275,7 @@
       res
           .wait(arg_project, arg_region, arg_operation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -54398,7 +55327,7 @@
           .delete(arg_project, arg_region, arg_sslCertificate,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54445,7 +55374,7 @@
           .get(arg_project, arg_region, arg_sslCertificate,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslCertificate(response);
+        checkSslCertificate(response as api.SslCertificate);
       })));
     });
 
@@ -54458,8 +55387,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SslCertificate.fromJson(json);
-        checkSslCertificate(obj);
+        var obj = api.SslCertificate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSslCertificate(obj as api.SslCertificate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -54498,7 +55428,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54563,7 +55493,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslCertificateList(response);
+        checkSslCertificateList(response as api.SslCertificateList);
       })));
     });
   });
@@ -54615,7 +55545,7 @@
           .delete(arg_project, arg_region, arg_targetHttpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54662,7 +55592,7 @@
           .get(arg_project, arg_region, arg_targetHttpProxy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpProxy(response);
+        checkTargetHttpProxy(response as api.TargetHttpProxy);
       })));
     });
 
@@ -54675,8 +55605,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetHttpProxy.fromJson(json);
-        checkTargetHttpProxy(obj);
+        var obj = api.TargetHttpProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetHttpProxy(obj as api.TargetHttpProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -54715,7 +55646,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54780,7 +55711,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpProxyList(response);
+        checkTargetHttpProxyList(response as api.TargetHttpProxyList);
       })));
     });
 
@@ -54794,8 +55725,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMapReference.fromJson(json);
-        checkUrlMapReference(obj);
+        var obj = api.UrlMapReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUrlMapReference(obj as api.UrlMapReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -54834,7 +55766,7 @@
           .setUrlMap(arg_request, arg_project, arg_region, arg_targetHttpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -54886,7 +55818,7 @@
           .delete(arg_project, arg_region, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -54933,7 +55865,7 @@
           .get(arg_project, arg_region, arg_targetHttpsProxy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpsProxy(response);
+        checkTargetHttpsProxy(response as api.TargetHttpsProxy);
       })));
     });
 
@@ -54946,8 +55878,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetHttpsProxy.fromJson(json);
-        checkTargetHttpsProxy(obj);
+        var obj = api.TargetHttpsProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetHttpsProxy(obj as api.TargetHttpsProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -54986,7 +55919,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55051,7 +55984,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpsProxyList(response);
+        checkTargetHttpsProxyList(response as api.TargetHttpsProxyList);
       })));
     });
 
@@ -55068,8 +56001,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.RegionTargetHttpsProxiesSetSslCertificatesRequest.fromJson(
-                json);
-        checkRegionTargetHttpsProxiesSetSslCertificatesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkRegionTargetHttpsProxiesSetSslCertificatesRequest(
+            obj as api.RegionTargetHttpsProxiesSetSslCertificatesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -55109,7 +56043,7 @@
               arg_request, arg_project, arg_region, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55123,8 +56057,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMapReference.fromJson(json);
-        checkUrlMapReference(obj);
+        var obj = api.UrlMapReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUrlMapReference(obj as api.UrlMapReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -55163,7 +56098,7 @@
           .setUrlMap(arg_request, arg_project, arg_region, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -55215,7 +56150,7 @@
           .delete(arg_project, arg_region, arg_urlMap,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55261,7 +56196,7 @@
       res
           .get(arg_project, arg_region, arg_urlMap, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlMap(response);
+        checkUrlMap(response as api.UrlMap);
       })));
     });
 
@@ -55274,8 +56209,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMap.fromJson(json);
-        checkUrlMap(obj);
+        var obj =
+            api.UrlMap.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUrlMap(obj as api.UrlMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -55314,7 +56250,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55379,7 +56315,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlMapList(response);
+        checkUrlMapList(response as api.UrlMapList);
       })));
     });
 
@@ -55393,8 +56329,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMap.fromJson(json);
-        checkUrlMap(obj);
+        var obj =
+            api.UrlMap.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUrlMap(obj as api.UrlMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -55433,7 +56370,7 @@
           .patch(arg_request, arg_project, arg_region, arg_urlMap,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55447,8 +56384,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMap.fromJson(json);
-        checkUrlMap(obj);
+        var obj =
+            api.UrlMap.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUrlMap(obj as api.UrlMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -55487,7 +56425,7 @@
           .update(arg_request, arg_project, arg_region, arg_urlMap,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55500,8 +56438,10 @@
       var arg_urlMap = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionUrlMapsValidateRequest.fromJson(json);
-        checkRegionUrlMapsValidateRequest(obj);
+        var obj = api.RegionUrlMapsValidateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionUrlMapsValidateRequest(
+            obj as api.RegionUrlMapsValidateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -55538,7 +56478,7 @@
           .validate(arg_request, arg_project, arg_region, arg_urlMap,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlMapsValidateResponse(response);
+        checkUrlMapsValidateResponse(response as api.UrlMapsValidateResponse);
       })));
     });
   });
@@ -55585,7 +56525,7 @@
       res
           .get(arg_project, arg_region, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegion(response);
+        checkRegion(response as api.Region);
       })));
     });
 
@@ -55649,7 +56589,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionList(response);
+        checkRegionList(response as api.RegionList);
       })));
     });
   });
@@ -55719,7 +56659,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReservationAggregatedList(response);
+        checkReservationAggregatedList(
+            response as api.ReservationAggregatedList);
       })));
     });
 
@@ -55769,7 +56710,7 @@
           .delete(arg_project, arg_zone, arg_reservation,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55815,7 +56756,7 @@
       res
           .get(arg_project, arg_zone, arg_reservation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReservation(response);
+        checkReservation(response as api.Reservation);
       })));
     });
 
@@ -55867,7 +56808,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -55880,8 +56821,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Reservation.fromJson(json);
-        checkReservation(obj);
+        var obj = api.Reservation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReservation(obj as api.Reservation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -55920,7 +56862,7 @@
           .insert(arg_request, arg_project, arg_zone,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -55985,7 +56927,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReservationList(response);
+        checkReservationList(response as api.ReservationList);
       })));
     });
 
@@ -55999,8 +56941,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReservationsResizeRequest.fromJson(json);
-        checkReservationsResizeRequest(obj);
+        var obj = api.ReservationsResizeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReservationsResizeRequest(obj as api.ReservationsResizeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -56039,7 +56982,7 @@
           .resize(arg_request, arg_project, arg_zone, arg_reservation,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -56052,8 +56995,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ZoneSetPolicyRequest.fromJson(json);
-        checkZoneSetPolicyRequest(obj);
+        var obj = api.ZoneSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkZoneSetPolicyRequest(obj as api.ZoneSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -56090,7 +57034,7 @@
           .setIamPolicy(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -56103,8 +57047,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -56141,7 +57086,7 @@
           .testIamPermissions(arg_request, arg_project, arg_zone, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -56211,7 +57156,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResourcePolicyAggregatedList(response);
+        checkResourcePolicyAggregatedList(
+            response as api.ResourcePolicyAggregatedList);
       })));
     });
 
@@ -56261,7 +57207,7 @@
           .delete(arg_project, arg_region, arg_resourcePolicy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -56308,7 +57254,7 @@
           .get(arg_project, arg_region, arg_resourcePolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResourcePolicy(response);
+        checkResourcePolicy(response as api.ResourcePolicy);
       })));
     });
 
@@ -56360,7 +57306,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -56373,8 +57319,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResourcePolicy.fromJson(json);
-        checkResourcePolicy(obj);
+        var obj = api.ResourcePolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResourcePolicy(obj as api.ResourcePolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -56413,7 +57360,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -56478,7 +57425,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResourcePolicyList(response);
+        checkResourcePolicyList(response as api.ResourcePolicyList);
       })));
     });
 
@@ -56491,8 +57438,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionSetPolicyRequest.fromJson(json);
-        checkRegionSetPolicyRequest(obj);
+        var obj = api.RegionSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionSetPolicyRequest(obj as api.RegionSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -56529,7 +57477,7 @@
           .setIamPolicy(arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -56542,8 +57490,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -56581,7 +57530,7 @@
               arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -56651,7 +57600,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRouterAggregatedList(response);
+        checkRouterAggregatedList(response as api.RouterAggregatedList);
       })));
     });
 
@@ -56701,7 +57650,7 @@
           .delete(arg_project, arg_region, arg_router,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -56747,7 +57696,7 @@
       res
           .get(arg_project, arg_region, arg_router, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRouter(response);
+        checkRouter(response as api.Router);
       })));
     });
 
@@ -56813,7 +57762,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVmEndpointNatMappingsList(response);
+        checkVmEndpointNatMappingsList(
+            response as api.VmEndpointNatMappingsList);
       })));
     });
 
@@ -56860,7 +57810,7 @@
           .getRouterStatus(arg_project, arg_region, arg_router,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRouterStatusResponse(response);
+        checkRouterStatusResponse(response as api.RouterStatusResponse);
       })));
     });
 
@@ -56873,8 +57823,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Router.fromJson(json);
-        checkRouter(obj);
+        var obj =
+            api.Router.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRouter(obj as api.Router);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -56913,7 +57864,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -56978,7 +57929,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRouterList(response);
+        checkRouterList(response as api.RouterList);
       })));
     });
 
@@ -56992,8 +57943,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Router.fromJson(json);
-        checkRouter(obj);
+        var obj =
+            api.Router.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRouter(obj as api.Router);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57032,7 +57984,7 @@
           .patch(arg_request, arg_project, arg_region, arg_router,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57045,8 +57997,9 @@
       var arg_router = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Router.fromJson(json);
-        checkRouter(obj);
+        var obj =
+            api.Router.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRouter(obj as api.Router);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57083,7 +58036,7 @@
           .preview(arg_request, arg_project, arg_region, arg_router,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoutersPreviewResponse(response);
+        checkRoutersPreviewResponse(response as api.RoutersPreviewResponse);
       })));
     });
 
@@ -57097,8 +58050,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Router.fromJson(json);
-        checkRouter(obj);
+        var obj =
+            api.Router.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRouter(obj as api.Router);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57137,7 +58091,7 @@
           .update(arg_request, arg_project, arg_region, arg_router,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -57188,7 +58142,7 @@
           .delete(arg_project, arg_route,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57233,7 +58187,7 @@
       res
           .get(arg_project, arg_route, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoute(response);
+        checkRoute(response as api.Route);
       })));
     });
 
@@ -57245,8 +58199,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Route.fromJson(json);
-        checkRoute(obj);
+        var obj =
+            api.Route.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRoute(obj as api.Route);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57285,7 +58240,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57349,7 +58304,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRouteList(response);
+        checkRouteList(response as api.RouteList);
       })));
     });
   });
@@ -57363,8 +58318,9 @@
       var arg_securityPolicy = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SecurityPolicyRule.fromJson(json);
-        checkSecurityPolicyRule(obj);
+        var obj = api.SecurityPolicyRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSecurityPolicyRule(obj as api.SecurityPolicyRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57401,7 +58357,7 @@
           .addRule(arg_request, arg_project, arg_securityPolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57450,7 +58406,7 @@
           .delete(arg_project, arg_securityPolicy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57495,7 +58451,7 @@
       res
           .get(arg_project, arg_securityPolicy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecurityPolicy(response);
+        checkSecurityPolicy(response as api.SecurityPolicy);
       })));
     });
 
@@ -57544,7 +58500,7 @@
           .getRule(arg_project, arg_securityPolicy,
               priority: arg_priority, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecurityPolicyRule(response);
+        checkSecurityPolicyRule(response as api.SecurityPolicyRule);
       })));
     });
 
@@ -57556,8 +58512,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SecurityPolicy.fromJson(json);
-        checkSecurityPolicy(obj);
+        var obj = api.SecurityPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSecurityPolicy(obj as api.SecurityPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57596,7 +58553,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57660,7 +58617,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecurityPolicyList(response);
+        checkSecurityPolicyList(response as api.SecurityPolicyList);
       })));
     });
 
@@ -57725,7 +58682,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecurityPoliciesListPreconfiguredExpressionSetsResponse(response);
+        checkSecurityPoliciesListPreconfiguredExpressionSetsResponse(response
+            as api.SecurityPoliciesListPreconfiguredExpressionSetsResponse);
       })));
     });
 
@@ -57738,8 +58696,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SecurityPolicy.fromJson(json);
-        checkSecurityPolicy(obj);
+        var obj = api.SecurityPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSecurityPolicy(obj as api.SecurityPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57778,7 +58737,7 @@
           .patch(arg_request, arg_project, arg_securityPolicy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57791,8 +58750,9 @@
       var arg_priority = 42;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SecurityPolicyRule.fromJson(json);
-        checkSecurityPolicyRule(obj);
+        var obj = api.SecurityPolicyRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSecurityPolicyRule(obj as api.SecurityPolicyRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -57831,7 +58791,7 @@
           .patchRule(arg_request, arg_project, arg_securityPolicy,
               priority: arg_priority, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57880,7 +58840,7 @@
           .removeRule(arg_project, arg_securityPolicy,
               priority: arg_priority, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -57931,7 +58891,7 @@
           .delete(arg_project, arg_snapshot,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -57976,7 +58936,7 @@
       res
           .get(arg_project, arg_snapshot, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSnapshot(response);
+        checkSnapshot(response as api.Snapshot);
       })));
     });
 
@@ -58027,7 +58987,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -58091,7 +59051,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSnapshotList(response);
+        checkSnapshotList(response as api.SnapshotList);
       })));
     });
 
@@ -58103,8 +59063,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetPolicyRequest.fromJson(json);
-        checkGlobalSetPolicyRequest(obj);
+        var obj = api.GlobalSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetPolicyRequest(obj as api.GlobalSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -58141,7 +59102,7 @@
           .setIamPolicy(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -58153,8 +59114,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetLabelsRequest.fromJson(json);
-        checkGlobalSetLabelsRequest(obj);
+        var obj = api.GlobalSetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetLabelsRequest(obj as api.GlobalSetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -58191,7 +59153,7 @@
           .setLabels(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -58203,8 +59165,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -58241,7 +59204,7 @@
           .testIamPermissions(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -58311,7 +59274,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslCertificateAggregatedList(response);
+        checkSslCertificateAggregatedList(
+            response as api.SslCertificateAggregatedList);
       })));
     });
 
@@ -58360,7 +59324,7 @@
           .delete(arg_project, arg_sslCertificate,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -58405,7 +59369,7 @@
       res
           .get(arg_project, arg_sslCertificate, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslCertificate(response);
+        checkSslCertificate(response as api.SslCertificate);
       })));
     });
 
@@ -58417,8 +59381,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SslCertificate.fromJson(json);
-        checkSslCertificate(obj);
+        var obj = api.SslCertificate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSslCertificate(obj as api.SslCertificate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -58457,7 +59422,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -58521,7 +59486,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslCertificateList(response);
+        checkSslCertificateList(response as api.SslCertificateList);
       })));
     });
   });
@@ -58572,7 +59537,7 @@
           .delete(arg_project, arg_sslPolicy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -58617,7 +59582,7 @@
       res
           .get(arg_project, arg_sslPolicy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslPolicy(response);
+        checkSslPolicy(response as api.SslPolicy);
       })));
     });
 
@@ -58629,8 +59594,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SslPolicy.fromJson(json);
-        checkSslPolicy(obj);
+        var obj =
+            api.SslPolicy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSslPolicy(obj as api.SslPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -58669,7 +59635,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -58733,7 +59699,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslPoliciesList(response);
+        checkSslPoliciesList(response as api.SslPoliciesList);
       })));
     });
 
@@ -58798,7 +59764,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSslPoliciesListAvailableFeaturesResponse(response);
+        checkSslPoliciesListAvailableFeaturesResponse(
+            response as api.SslPoliciesListAvailableFeaturesResponse);
       })));
     });
 
@@ -58811,8 +59778,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SslPolicy.fromJson(json);
-        checkSslPolicy(obj);
+        var obj =
+            api.SslPolicy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSslPolicy(obj as api.SslPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -58851,7 +59819,7 @@
           .patch(arg_request, arg_project, arg_sslPolicy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -58921,7 +59889,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubnetworkAggregatedList(response);
+        checkSubnetworkAggregatedList(response as api.SubnetworkAggregatedList);
       })));
     });
 
@@ -58971,7 +59939,7 @@
           .delete(arg_project, arg_region, arg_subnetwork,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -58985,8 +59953,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SubnetworksExpandIpCidrRangeRequest.fromJson(json);
-        checkSubnetworksExpandIpCidrRangeRequest(obj);
+        var obj = api.SubnetworksExpandIpCidrRangeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubnetworksExpandIpCidrRangeRequest(
+            obj as api.SubnetworksExpandIpCidrRangeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59026,7 +59996,7 @@
               arg_request, arg_project, arg_region, arg_subnetwork,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -59072,7 +60042,7 @@
       res
           .get(arg_project, arg_region, arg_subnetwork, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubnetwork(response);
+        checkSubnetwork(response as api.Subnetwork);
       })));
     });
 
@@ -59124,7 +60094,7 @@
               optionsRequestedPolicyVersion: arg_optionsRequestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -59137,8 +60107,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subnetwork.fromJson(json);
-        checkSubnetwork(obj);
+        var obj = api.Subnetwork.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubnetwork(obj as api.Subnetwork);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59177,7 +60148,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -59242,7 +60213,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubnetworkList(response);
+        checkSubnetworkList(response as api.SubnetworkList);
       })));
     });
 
@@ -59306,7 +60277,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUsableSubnetworksAggregatedList(response);
+        checkUsableSubnetworksAggregatedList(
+            response as api.UsableSubnetworksAggregatedList);
       })));
     });
 
@@ -59321,8 +60293,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subnetwork.fromJson(json);
-        checkSubnetwork(obj);
+        var obj = api.Subnetwork.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubnetwork(obj as api.Subnetwork);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59365,7 +60338,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -59378,8 +60351,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionSetPolicyRequest.fromJson(json);
-        checkRegionSetPolicyRequest(obj);
+        var obj = api.RegionSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionSetPolicyRequest(obj as api.RegionSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59416,7 +60390,7 @@
           .setIamPolicy(arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -59430,8 +60404,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(json);
-        checkSubnetworksSetPrivateIpGoogleAccessRequest(obj);
+        var obj = api.SubnetworksSetPrivateIpGoogleAccessRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubnetworksSetPrivateIpGoogleAccessRequest(
+            obj as api.SubnetworksSetPrivateIpGoogleAccessRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59471,7 +60447,7 @@
               arg_request, arg_project, arg_region, arg_subnetwork,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -59484,8 +60460,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59523,7 +60500,7 @@
               arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -59574,7 +60551,7 @@
           .delete(arg_project, arg_targetGrpcProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -59619,7 +60596,7 @@
       res
           .get(arg_project, arg_targetGrpcProxy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetGrpcProxy(response);
+        checkTargetGrpcProxy(response as api.TargetGrpcProxy);
       })));
     });
 
@@ -59631,8 +60608,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetGrpcProxy.fromJson(json);
-        checkTargetGrpcProxy(obj);
+        var obj = api.TargetGrpcProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetGrpcProxy(obj as api.TargetGrpcProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59671,7 +60649,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -59735,7 +60713,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetGrpcProxyList(response);
+        checkTargetGrpcProxyList(response as api.TargetGrpcProxyList);
       })));
     });
 
@@ -59748,8 +60726,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetGrpcProxy.fromJson(json);
-        checkTargetGrpcProxy(obj);
+        var obj = api.TargetGrpcProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetGrpcProxy(obj as api.TargetGrpcProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -59788,7 +60767,7 @@
           .patch(arg_request, arg_project, arg_targetGrpcProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -59858,7 +60837,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpProxyAggregatedList(response);
+        checkTargetHttpProxyAggregatedList(
+            response as api.TargetHttpProxyAggregatedList);
       })));
     });
 
@@ -59907,7 +60887,7 @@
           .delete(arg_project, arg_targetHttpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -59952,7 +60932,7 @@
       res
           .get(arg_project, arg_targetHttpProxy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpProxy(response);
+        checkTargetHttpProxy(response as api.TargetHttpProxy);
       })));
     });
 
@@ -59964,8 +60944,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetHttpProxy.fromJson(json);
-        checkTargetHttpProxy(obj);
+        var obj = api.TargetHttpProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetHttpProxy(obj as api.TargetHttpProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60004,7 +60985,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60068,7 +61049,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpProxyList(response);
+        checkTargetHttpProxyList(response as api.TargetHttpProxyList);
       })));
     });
 
@@ -60081,8 +61062,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetHttpProxy.fromJson(json);
-        checkTargetHttpProxy(obj);
+        var obj = api.TargetHttpProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetHttpProxy(obj as api.TargetHttpProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60121,7 +61103,7 @@
           .patch(arg_request, arg_project, arg_targetHttpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60134,8 +61116,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMapReference.fromJson(json);
-        checkUrlMapReference(obj);
+        var obj = api.UrlMapReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUrlMapReference(obj as api.UrlMapReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60174,7 +61157,7 @@
           .setUrlMap(arg_request, arg_project, arg_targetHttpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -60244,7 +61227,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpsProxyAggregatedList(response);
+        checkTargetHttpsProxyAggregatedList(
+            response as api.TargetHttpsProxyAggregatedList);
       })));
     });
 
@@ -60293,7 +61277,7 @@
           .delete(arg_project, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60338,7 +61322,7 @@
       res
           .get(arg_project, arg_targetHttpsProxy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpsProxy(response);
+        checkTargetHttpsProxy(response as api.TargetHttpsProxy);
       })));
     });
 
@@ -60350,8 +61334,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetHttpsProxy.fromJson(json);
-        checkTargetHttpsProxy(obj);
+        var obj = api.TargetHttpsProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetHttpsProxy(obj as api.TargetHttpsProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60390,7 +61375,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60454,7 +61439,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetHttpsProxyList(response);
+        checkTargetHttpsProxyList(response as api.TargetHttpsProxyList);
       })));
     });
 
@@ -60467,8 +61452,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetHttpsProxiesSetQuicOverrideRequest.fromJson(json);
-        checkTargetHttpsProxiesSetQuicOverrideRequest(obj);
+        var obj = api.TargetHttpsProxiesSetQuicOverrideRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetHttpsProxiesSetQuicOverrideRequest(
+            obj as api.TargetHttpsProxiesSetQuicOverrideRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60507,7 +61494,7 @@
           .setQuicOverride(arg_request, arg_project, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60520,9 +61507,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(json);
-        checkTargetHttpsProxiesSetSslCertificatesRequest(obj);
+        var obj = api.TargetHttpsProxiesSetSslCertificatesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetHttpsProxiesSetSslCertificatesRequest(
+            obj as api.TargetHttpsProxiesSetSslCertificatesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60561,7 +61549,7 @@
           .setSslCertificates(arg_request, arg_project, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60574,8 +61562,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SslPolicyReference.fromJson(json);
-        checkSslPolicyReference(obj);
+        var obj = api.SslPolicyReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSslPolicyReference(obj as api.SslPolicyReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60614,7 +61603,7 @@
           .setSslPolicy(arg_request, arg_project, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60627,8 +61616,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMapReference.fromJson(json);
-        checkUrlMapReference(obj);
+        var obj = api.UrlMapReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUrlMapReference(obj as api.UrlMapReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60667,7 +61657,7 @@
           .setUrlMap(arg_request, arg_project, arg_targetHttpsProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -60737,7 +61727,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetInstanceAggregatedList(response);
+        checkTargetInstanceAggregatedList(
+            response as api.TargetInstanceAggregatedList);
       })));
     });
 
@@ -60787,7 +61778,7 @@
           .delete(arg_project, arg_zone, arg_targetInstance,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60833,7 +61824,7 @@
       res
           .get(arg_project, arg_zone, arg_targetInstance, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetInstance(response);
+        checkTargetInstance(response as api.TargetInstance);
       })));
     });
 
@@ -60846,8 +61837,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetInstance.fromJson(json);
-        checkTargetInstance(obj);
+        var obj = api.TargetInstance.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetInstance(obj as api.TargetInstance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -60886,7 +61878,7 @@
           .insert(arg_request, arg_project, arg_zone,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -60951,7 +61943,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetInstanceList(response);
+        checkTargetInstanceList(response as api.TargetInstanceList);
       })));
     });
   });
@@ -60967,8 +61959,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetPoolsAddHealthCheckRequest.fromJson(json);
-        checkTargetPoolsAddHealthCheckRequest(obj);
+        var obj = api.TargetPoolsAddHealthCheckRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetPoolsAddHealthCheckRequest(
+            obj as api.TargetPoolsAddHealthCheckRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61007,7 +62001,7 @@
           .addHealthCheck(arg_request, arg_project, arg_region, arg_targetPool,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61021,8 +62015,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetPoolsAddInstanceRequest.fromJson(json);
-        checkTargetPoolsAddInstanceRequest(obj);
+        var obj = api.TargetPoolsAddInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetPoolsAddInstanceRequest(
+            obj as api.TargetPoolsAddInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61061,7 +62057,7 @@
           .addInstance(arg_request, arg_project, arg_region, arg_targetPool,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61129,7 +62125,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetPoolAggregatedList(response);
+        checkTargetPoolAggregatedList(response as api.TargetPoolAggregatedList);
       })));
     });
 
@@ -61179,7 +62175,7 @@
           .delete(arg_project, arg_region, arg_targetPool,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61225,7 +62221,7 @@
       res
           .get(arg_project, arg_region, arg_targetPool, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetPool(response);
+        checkTargetPool(response as api.TargetPool);
       })));
     });
 
@@ -61238,8 +62234,9 @@
       var arg_targetPool = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstanceReference.fromJson(json);
-        checkInstanceReference(obj);
+        var obj = api.InstanceReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstanceReference(obj as api.InstanceReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61276,7 +62273,7 @@
           .getHealth(arg_request, arg_project, arg_region, arg_targetPool,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetPoolInstanceHealth(response);
+        checkTargetPoolInstanceHealth(response as api.TargetPoolInstanceHealth);
       })));
     });
 
@@ -61289,8 +62286,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetPool.fromJson(json);
-        checkTargetPool(obj);
+        var obj = api.TargetPool.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetPool(obj as api.TargetPool);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61329,7 +62327,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61394,7 +62392,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetPoolList(response);
+        checkTargetPoolList(response as api.TargetPoolList);
       })));
     });
 
@@ -61408,8 +62406,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetPoolsRemoveHealthCheckRequest.fromJson(json);
-        checkTargetPoolsRemoveHealthCheckRequest(obj);
+        var obj = api.TargetPoolsRemoveHealthCheckRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetPoolsRemoveHealthCheckRequest(
+            obj as api.TargetPoolsRemoveHealthCheckRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61449,7 +62449,7 @@
               arg_request, arg_project, arg_region, arg_targetPool,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61463,8 +62463,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetPoolsRemoveInstanceRequest.fromJson(json);
-        checkTargetPoolsRemoveInstanceRequest(obj);
+        var obj = api.TargetPoolsRemoveInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetPoolsRemoveInstanceRequest(
+            obj as api.TargetPoolsRemoveInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61503,7 +62505,7 @@
           .removeInstance(arg_request, arg_project, arg_region, arg_targetPool,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61518,8 +62520,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetReference.fromJson(json);
-        checkTargetReference(obj);
+        var obj = api.TargetReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetReference(obj as api.TargetReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61562,7 +62565,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -61613,7 +62616,7 @@
           .delete(arg_project, arg_targetSslProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61658,7 +62661,7 @@
       res
           .get(arg_project, arg_targetSslProxy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetSslProxy(response);
+        checkTargetSslProxy(response as api.TargetSslProxy);
       })));
     });
 
@@ -61670,8 +62673,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetSslProxy.fromJson(json);
-        checkTargetSslProxy(obj);
+        var obj = api.TargetSslProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetSslProxy(obj as api.TargetSslProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61710,7 +62714,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61774,7 +62778,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetSslProxyList(response);
+        checkTargetSslProxyList(response as api.TargetSslProxyList);
       })));
     });
 
@@ -61787,8 +62791,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetSslProxiesSetBackendServiceRequest.fromJson(json);
-        checkTargetSslProxiesSetBackendServiceRequest(obj);
+        var obj = api.TargetSslProxiesSetBackendServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetSslProxiesSetBackendServiceRequest(
+            obj as api.TargetSslProxiesSetBackendServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61827,7 +62833,7 @@
           .setBackendService(arg_request, arg_project, arg_targetSslProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61840,8 +62846,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetSslProxiesSetProxyHeaderRequest.fromJson(json);
-        checkTargetSslProxiesSetProxyHeaderRequest(obj);
+        var obj = api.TargetSslProxiesSetProxyHeaderRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetSslProxiesSetProxyHeaderRequest(
+            obj as api.TargetSslProxiesSetProxyHeaderRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61880,7 +62888,7 @@
           .setProxyHeader(arg_request, arg_project, arg_targetSslProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61893,8 +62901,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetSslProxiesSetSslCertificatesRequest.fromJson(json);
-        checkTargetSslProxiesSetSslCertificatesRequest(obj);
+        var obj = api.TargetSslProxiesSetSslCertificatesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetSslProxiesSetSslCertificatesRequest(
+            obj as api.TargetSslProxiesSetSslCertificatesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61933,7 +62943,7 @@
           .setSslCertificates(arg_request, arg_project, arg_targetSslProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -61946,8 +62956,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SslPolicyReference.fromJson(json);
-        checkSslPolicyReference(obj);
+        var obj = api.SslPolicyReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSslPolicyReference(obj as api.SslPolicyReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -61986,7 +62997,7 @@
           .setSslPolicy(arg_request, arg_project, arg_targetSslProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -62037,7 +63048,7 @@
           .delete(arg_project, arg_targetTcpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62082,7 +63093,7 @@
       res
           .get(arg_project, arg_targetTcpProxy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetTcpProxy(response);
+        checkTargetTcpProxy(response as api.TargetTcpProxy);
       })));
     });
 
@@ -62094,8 +63105,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetTcpProxy.fromJson(json);
-        checkTargetTcpProxy(obj);
+        var obj = api.TargetTcpProxy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetTcpProxy(obj as api.TargetTcpProxy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -62134,7 +63146,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62198,7 +63210,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetTcpProxyList(response);
+        checkTargetTcpProxyList(response as api.TargetTcpProxyList);
       })));
     });
 
@@ -62211,8 +63223,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetTcpProxiesSetBackendServiceRequest.fromJson(json);
-        checkTargetTcpProxiesSetBackendServiceRequest(obj);
+        var obj = api.TargetTcpProxiesSetBackendServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetTcpProxiesSetBackendServiceRequest(
+            obj as api.TargetTcpProxiesSetBackendServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -62251,7 +63265,7 @@
           .setBackendService(arg_request, arg_project, arg_targetTcpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62264,8 +63278,10 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetTcpProxiesSetProxyHeaderRequest.fromJson(json);
-        checkTargetTcpProxiesSetProxyHeaderRequest(obj);
+        var obj = api.TargetTcpProxiesSetProxyHeaderRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetTcpProxiesSetProxyHeaderRequest(
+            obj as api.TargetTcpProxiesSetProxyHeaderRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -62304,7 +63320,7 @@
           .setProxyHeader(arg_request, arg_project, arg_targetTcpProxy,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -62374,7 +63390,8 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetVpnGatewayAggregatedList(response);
+        checkTargetVpnGatewayAggregatedList(
+            response as api.TargetVpnGatewayAggregatedList);
       })));
     });
 
@@ -62424,7 +63441,7 @@
           .delete(arg_project, arg_region, arg_targetVpnGateway,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62471,7 +63488,7 @@
           .get(arg_project, arg_region, arg_targetVpnGateway,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetVpnGateway(response);
+        checkTargetVpnGateway(response as api.TargetVpnGateway);
       })));
     });
 
@@ -62484,8 +63501,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetVpnGateway.fromJson(json);
-        checkTargetVpnGateway(obj);
+        var obj = api.TargetVpnGateway.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetVpnGateway(obj as api.TargetVpnGateway);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -62524,7 +63542,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62589,7 +63607,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetVpnGatewayList(response);
+        checkTargetVpnGatewayList(response as api.TargetVpnGatewayList);
       })));
     });
   });
@@ -62659,7 +63677,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlMapsAggregatedList(response);
+        checkUrlMapsAggregatedList(response as api.UrlMapsAggregatedList);
       })));
     });
 
@@ -62708,7 +63726,7 @@
           .delete(arg_project, arg_urlMap,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62753,7 +63771,7 @@
       res
           .get(arg_project, arg_urlMap, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlMap(response);
+        checkUrlMap(response as api.UrlMap);
       })));
     });
 
@@ -62765,8 +63783,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMap.fromJson(json);
-        checkUrlMap(obj);
+        var obj =
+            api.UrlMap.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUrlMap(obj as api.UrlMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -62805,7 +63824,7 @@
           .insert(arg_request, arg_project,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62818,8 +63837,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CacheInvalidationRule.fromJson(json);
-        checkCacheInvalidationRule(obj);
+        var obj = api.CacheInvalidationRule.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCacheInvalidationRule(obj as api.CacheInvalidationRule);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -62858,7 +63878,7 @@
           .invalidateCache(arg_request, arg_project, arg_urlMap,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62922,7 +63942,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlMapList(response);
+        checkUrlMapList(response as api.UrlMapList);
       })));
     });
 
@@ -62935,8 +63955,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMap.fromJson(json);
-        checkUrlMap(obj);
+        var obj =
+            api.UrlMap.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUrlMap(obj as api.UrlMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -62975,7 +63996,7 @@
           .patch(arg_request, arg_project, arg_urlMap,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -62988,8 +64009,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMap.fromJson(json);
-        checkUrlMap(obj);
+        var obj =
+            api.UrlMap.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUrlMap(obj as api.UrlMap);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -63028,7 +64050,7 @@
           .update(arg_request, arg_project, arg_urlMap,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -63040,8 +64062,9 @@
       var arg_urlMap = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlMapsValidateRequest.fromJson(json);
-        checkUrlMapsValidateRequest(obj);
+        var obj = api.UrlMapsValidateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUrlMapsValidateRequest(obj as api.UrlMapsValidateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -63077,7 +64100,7 @@
       res
           .validate(arg_request, arg_project, arg_urlMap, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlMapsValidateResponse(response);
+        checkUrlMapsValidateResponse(response as api.UrlMapsValidateResponse);
       })));
     });
   });
@@ -63147,7 +64170,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVpnGatewayAggregatedList(response);
+        checkVpnGatewayAggregatedList(response as api.VpnGatewayAggregatedList);
       })));
     });
 
@@ -63197,7 +64220,7 @@
           .delete(arg_project, arg_region, arg_vpnGateway,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -63243,7 +64266,7 @@
       res
           .get(arg_project, arg_region, arg_vpnGateway, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVpnGateway(response);
+        checkVpnGateway(response as api.VpnGateway);
       })));
     });
 
@@ -63290,7 +64313,8 @@
           .getStatus(arg_project, arg_region, arg_vpnGateway,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVpnGatewaysGetStatusResponse(response);
+        checkVpnGatewaysGetStatusResponse(
+            response as api.VpnGatewaysGetStatusResponse);
       })));
     });
 
@@ -63303,8 +64327,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.VpnGateway.fromJson(json);
-        checkVpnGateway(obj);
+        var obj = api.VpnGateway.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkVpnGateway(obj as api.VpnGateway);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -63343,7 +64368,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -63408,7 +64433,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVpnGatewayList(response);
+        checkVpnGatewayList(response as api.VpnGatewayList);
       })));
     });
 
@@ -63422,8 +64447,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionSetLabelsRequest.fromJson(json);
-        checkRegionSetLabelsRequest(obj);
+        var obj = api.RegionSetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionSetLabelsRequest(obj as api.RegionSetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -63462,7 +64488,7 @@
           .setLabels(arg_request, arg_project, arg_region, arg_resource,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -63475,8 +64501,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -63514,7 +64541,7 @@
               arg_request, arg_project, arg_region, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
   });
@@ -63584,7 +64611,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVpnTunnelAggregatedList(response);
+        checkVpnTunnelAggregatedList(response as api.VpnTunnelAggregatedList);
       })));
     });
 
@@ -63634,7 +64661,7 @@
           .delete(arg_project, arg_region, arg_vpnTunnel,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -63680,7 +64707,7 @@
       res
           .get(arg_project, arg_region, arg_vpnTunnel, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVpnTunnel(response);
+        checkVpnTunnel(response as api.VpnTunnel);
       })));
     });
 
@@ -63693,8 +64720,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.VpnTunnel.fromJson(json);
-        checkVpnTunnel(obj);
+        var obj =
+            api.VpnTunnel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVpnTunnel(obj as api.VpnTunnel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -63733,7 +64761,7 @@
           .insert(arg_request, arg_project, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -63798,7 +64826,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVpnTunnelList(response);
+        checkVpnTunnelList(response as api.VpnTunnelList);
       })));
     });
   });
@@ -63890,7 +64918,7 @@
       res
           .get(arg_project, arg_zone, arg_operation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -63955,7 +64983,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperationList(response);
+        checkOperationList(response as api.OperationList);
       })));
     });
 
@@ -64001,7 +65029,7 @@
       res
           .wait(arg_project, arg_zone, arg_operation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -64048,7 +65076,7 @@
       res
           .get(arg_project, arg_zone, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkZone(response);
+        checkZone(response as api.Zone);
       })));
     });
 
@@ -64112,7 +65140,7 @@
               returnPartialSuccess: arg_returnPartialSuccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkZoneList(response);
+        checkZoneList(response as api.ZoneList);
       })));
     });
   });
diff --git a/generated/googleapis/test/container/v1_test.dart b/generated/googleapis/test/container/v1_test.dart
index aa5be05..678345c 100644
--- a/generated/googleapis/test/container/v1_test.dart
+++ b/generated/googleapis/test/container/v1_test.dart
@@ -115,13 +115,15 @@
 void checkAddonsConfig(api.AddonsConfig o) {
   buildCounterAddonsConfig++;
   if (buildCounterAddonsConfig < 3) {
-    checkCloudRunConfig(o.cloudRunConfig);
-    checkConfigConnectorConfig(o.configConnectorConfig);
-    checkDnsCacheConfig(o.dnsCacheConfig);
-    checkHorizontalPodAutoscaling(o.horizontalPodAutoscaling);
-    checkHttpLoadBalancing(o.httpLoadBalancing);
-    checkKubernetesDashboard(o.kubernetesDashboard);
-    checkNetworkPolicyConfig(o.networkPolicyConfig);
+    checkCloudRunConfig(o.cloudRunConfig as api.CloudRunConfig);
+    checkConfigConnectorConfig(
+        o.configConnectorConfig as api.ConfigConnectorConfig);
+    checkDnsCacheConfig(o.dnsCacheConfig as api.DnsCacheConfig);
+    checkHorizontalPodAutoscaling(
+        o.horizontalPodAutoscaling as api.HorizontalPodAutoscaling);
+    checkHttpLoadBalancing(o.httpLoadBalancing as api.HttpLoadBalancing);
+    checkKubernetesDashboard(o.kubernetesDashboard as api.KubernetesDashboard);
+    checkNetworkPolicyConfig(o.networkPolicyConfig as api.NetworkPolicyConfig);
   }
   buildCounterAddonsConfig--;
 }
@@ -207,12 +209,13 @@
     unittest.expect(o.bootDiskKmsKey, unittest.equals('foo'));
     unittest.expect(o.diskSizeGb, unittest.equals(42));
     unittest.expect(o.diskType, unittest.equals('foo'));
-    checkNodeManagement(o.management);
+    checkNodeManagement(o.management as api.NodeManagement);
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
     checkUnnamed1741(o.oauthScopes);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkShieldedInstanceConfig(o.shieldedInstanceConfig);
-    checkUpgradeSettings(o.upgradeSettings);
+    checkShieldedInstanceConfig(
+        o.shieldedInstanceConfig as api.ShieldedInstanceConfig);
+    checkUpgradeSettings(o.upgradeSettings as api.UpgradeSettings);
   }
   buildCounterAutoprovisioningNodePoolDefaults--;
 }
@@ -350,8 +353,8 @@
 
 void checkUnnamed1742(core.List<api.StatusCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatusCondition(o[0]);
-  checkStatusCondition(o[1]);
+  checkStatusCondition(o[0] as api.StatusCondition);
+  checkStatusCondition(o[1] as api.StatusCondition);
 }
 
 core.List<core.String> buildUnnamed1743() {
@@ -389,8 +392,8 @@
 
 void checkUnnamed1745(core.List<api.NodePool> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodePool(o[0]);
-  checkNodePool(o[1]);
+  checkNodePool(o[0] as api.NodePool);
+  checkNodePool(o[1] as api.NodePool);
 }
 
 core.Map<core.String, core.String> buildUnnamed1746() {
@@ -470,18 +473,19 @@
 void checkCluster(api.Cluster o) {
   buildCounterCluster++;
   if (buildCounterCluster < 3) {
-    checkAddonsConfig(o.addonsConfig);
-    checkAuthenticatorGroupsConfig(o.authenticatorGroupsConfig);
-    checkClusterAutoscaling(o.autoscaling);
-    checkBinaryAuthorization(o.binaryAuthorization);
+    checkAddonsConfig(o.addonsConfig as api.AddonsConfig);
+    checkAuthenticatorGroupsConfig(
+        o.authenticatorGroupsConfig as api.AuthenticatorGroupsConfig);
+    checkClusterAutoscaling(o.autoscaling as api.ClusterAutoscaling);
+    checkBinaryAuthorization(o.binaryAuthorization as api.BinaryAuthorization);
     unittest.expect(o.clusterIpv4Cidr, unittest.equals('foo'));
     checkUnnamed1742(o.conditions);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.currentMasterVersion, unittest.equals('foo'));
     unittest.expect(o.currentNodeCount, unittest.equals(42));
     unittest.expect(o.currentNodeVersion, unittest.equals('foo'));
-    checkDatabaseEncryption(o.databaseEncryption);
-    checkMaxPodsConstraint(o.defaultMaxPodsConstraint);
+    checkDatabaseEncryption(o.databaseEncryption as api.DatabaseEncryption);
+    checkMaxPodsConstraint(o.defaultMaxPodsConstraint as api.MaxPodsConstraint);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.enableKubernetesAlpha, unittest.isTrue);
     unittest.expect(o.enableTpu, unittest.isTrue);
@@ -490,36 +494,41 @@
     unittest.expect(o.initialClusterVersion, unittest.equals('foo'));
     unittest.expect(o.initialNodeCount, unittest.equals(42));
     checkUnnamed1743(o.instanceGroupUrls);
-    checkIPAllocationPolicy(o.ipAllocationPolicy);
+    checkIPAllocationPolicy(o.ipAllocationPolicy as api.IPAllocationPolicy);
     unittest.expect(o.labelFingerprint, unittest.equals('foo'));
-    checkLegacyAbac(o.legacyAbac);
+    checkLegacyAbac(o.legacyAbac as api.LegacyAbac);
     unittest.expect(o.location, unittest.equals('foo'));
     checkUnnamed1744(o.locations);
     unittest.expect(o.loggingService, unittest.equals('foo'));
-    checkMaintenancePolicy(o.maintenancePolicy);
-    checkMasterAuth(o.masterAuth);
-    checkMasterAuthorizedNetworksConfig(o.masterAuthorizedNetworksConfig);
+    checkMaintenancePolicy(o.maintenancePolicy as api.MaintenancePolicy);
+    checkMasterAuth(o.masterAuth as api.MasterAuth);
+    checkMasterAuthorizedNetworksConfig(
+        o.masterAuthorizedNetworksConfig as api.MasterAuthorizedNetworksConfig);
     unittest.expect(o.monitoringService, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
-    checkNetworkConfig(o.networkConfig);
-    checkNetworkPolicy(o.networkPolicy);
-    checkNodeConfig(o.nodeConfig);
+    checkNetworkConfig(o.networkConfig as api.NetworkConfig);
+    checkNetworkPolicy(o.networkPolicy as api.NetworkPolicy);
+    checkNodeConfig(o.nodeConfig as api.NodeConfig);
     unittest.expect(o.nodeIpv4CidrSize, unittest.equals(42));
     checkUnnamed1745(o.nodePools);
-    checkPrivateClusterConfig(o.privateClusterConfig);
-    checkReleaseChannel(o.releaseChannel);
+    checkPrivateClusterConfig(
+        o.privateClusterConfig as api.PrivateClusterConfig);
+    checkReleaseChannel(o.releaseChannel as api.ReleaseChannel);
     checkUnnamed1746(o.resourceLabels);
-    checkResourceUsageExportConfig(o.resourceUsageExportConfig);
+    checkResourceUsageExportConfig(
+        o.resourceUsageExportConfig as api.ResourceUsageExportConfig);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.servicesIpv4Cidr, unittest.equals('foo'));
-    checkShieldedNodes(o.shieldedNodes);
+    checkShieldedNodes(o.shieldedNodes as api.ShieldedNodes);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
     unittest.expect(o.subnetwork, unittest.equals('foo'));
     unittest.expect(o.tpuIpv4CidrBlock, unittest.equals('foo'));
-    checkVerticalPodAutoscaling(o.verticalPodAutoscaling);
-    checkWorkloadIdentityConfig(o.workloadIdentityConfig);
+    checkVerticalPodAutoscaling(
+        o.verticalPodAutoscaling as api.VerticalPodAutoscaling);
+    checkWorkloadIdentityConfig(
+        o.workloadIdentityConfig as api.WorkloadIdentityConfig);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterCluster--;
@@ -547,8 +556,8 @@
 
 void checkUnnamed1748(core.List<api.ResourceLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceLimit(o[0]);
-  checkResourceLimit(o[1]);
+  checkResourceLimit(o[0] as api.ResourceLimit);
+  checkResourceLimit(o[1] as api.ResourceLimit);
 }
 
 core.int buildCounterClusterAutoscaling = 0;
@@ -570,7 +579,8 @@
   buildCounterClusterAutoscaling++;
   if (buildCounterClusterAutoscaling < 3) {
     checkUnnamed1747(o.autoprovisioningLocations);
-    checkAutoprovisioningNodePoolDefaults(o.autoprovisioningNodePoolDefaults);
+    checkAutoprovisioningNodePoolDefaults(o.autoprovisioningNodePoolDefaults
+        as api.AutoprovisioningNodePoolDefaults);
     unittest.expect(o.enableNodeAutoprovisioning, unittest.isTrue);
     checkUnnamed1748(o.resourceLimits);
   }
@@ -625,28 +635,37 @@
 void checkClusterUpdate(api.ClusterUpdate o) {
   buildCounterClusterUpdate++;
   if (buildCounterClusterUpdate < 3) {
-    checkAddonsConfig(o.desiredAddonsConfig);
-    checkBinaryAuthorization(o.desiredBinaryAuthorization);
-    checkClusterAutoscaling(o.desiredClusterAutoscaling);
-    checkDatabaseEncryption(o.desiredDatabaseEncryption);
-    checkDefaultSnatStatus(o.desiredDefaultSnatStatus);
+    checkAddonsConfig(o.desiredAddonsConfig as api.AddonsConfig);
+    checkBinaryAuthorization(
+        o.desiredBinaryAuthorization as api.BinaryAuthorization);
+    checkClusterAutoscaling(
+        o.desiredClusterAutoscaling as api.ClusterAutoscaling);
+    checkDatabaseEncryption(
+        o.desiredDatabaseEncryption as api.DatabaseEncryption);
+    checkDefaultSnatStatus(o.desiredDefaultSnatStatus as api.DefaultSnatStatus);
     unittest.expect(o.desiredImageType, unittest.equals('foo'));
-    checkIntraNodeVisibilityConfig(o.desiredIntraNodeVisibilityConfig);
+    checkIntraNodeVisibilityConfig(
+        o.desiredIntraNodeVisibilityConfig as api.IntraNodeVisibilityConfig);
     checkUnnamed1749(o.desiredLocations);
     unittest.expect(o.desiredLoggingService, unittest.equals('foo'));
-    checkMasterAuthorizedNetworksConfig(
-        o.desiredMasterAuthorizedNetworksConfig);
+    checkMasterAuthorizedNetworksConfig(o.desiredMasterAuthorizedNetworksConfig
+        as api.MasterAuthorizedNetworksConfig);
     unittest.expect(o.desiredMasterVersion, unittest.equals('foo'));
     unittest.expect(o.desiredMonitoringService, unittest.equals('foo'));
-    checkNodePoolAutoscaling(o.desiredNodePoolAutoscaling);
+    checkNodePoolAutoscaling(
+        o.desiredNodePoolAutoscaling as api.NodePoolAutoscaling);
     unittest.expect(o.desiredNodePoolId, unittest.equals('foo'));
     unittest.expect(o.desiredNodeVersion, unittest.equals('foo'));
-    checkPrivateClusterConfig(o.desiredPrivateClusterConfig);
-    checkReleaseChannel(o.desiredReleaseChannel);
-    checkResourceUsageExportConfig(o.desiredResourceUsageExportConfig);
-    checkShieldedNodes(o.desiredShieldedNodes);
-    checkVerticalPodAutoscaling(o.desiredVerticalPodAutoscaling);
-    checkWorkloadIdentityConfig(o.desiredWorkloadIdentityConfig);
+    checkPrivateClusterConfig(
+        o.desiredPrivateClusterConfig as api.PrivateClusterConfig);
+    checkReleaseChannel(o.desiredReleaseChannel as api.ReleaseChannel);
+    checkResourceUsageExportConfig(
+        o.desiredResourceUsageExportConfig as api.ResourceUsageExportConfig);
+    checkShieldedNodes(o.desiredShieldedNodes as api.ShieldedNodes);
+    checkVerticalPodAutoscaling(
+        o.desiredVerticalPodAutoscaling as api.VerticalPodAutoscaling);
+    checkWorkloadIdentityConfig(
+        o.desiredWorkloadIdentityConfig as api.WorkloadIdentityConfig);
   }
   buildCounterClusterUpdate--;
 }
@@ -731,7 +750,7 @@
 void checkCreateClusterRequest(api.CreateClusterRequest o) {
   buildCounterCreateClusterRequest++;
   if (buildCounterCreateClusterRequest < 3) {
-    checkCluster(o.cluster);
+    checkCluster(o.cluster as api.Cluster);
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
@@ -758,7 +777,7 @@
   buildCounterCreateNodePoolRequest++;
   if (buildCounterCreateNodePoolRequest < 3) {
     unittest.expect(o.clusterId, unittest.equals('foo'));
-    checkNodePool(o.nodePool);
+    checkNodePool(o.nodePool as api.NodePool);
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
@@ -870,8 +889,8 @@
 
 void checkUnnamed1750(core.List<api.Jwk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJwk(o[0]);
-  checkJwk(o[1]);
+  checkJwk(o[0] as api.Jwk);
+  checkJwk(o[1] as api.Jwk);
 }
 
 core.int buildCounterGetJSONWebKeysResponse = 0;
@@ -889,7 +908,8 @@
 void checkGetJSONWebKeysResponse(api.GetJSONWebKeysResponse o) {
   buildCounterGetJSONWebKeysResponse++;
   if (buildCounterGetJSONWebKeysResponse < 3) {
-    checkHttpCacheControlResponseHeader(o.cacheHeader);
+    checkHttpCacheControlResponseHeader(
+        o.cacheHeader as api.HttpCacheControlResponseHeader);
     checkUnnamed1750(o.keys);
   }
   buildCounterGetJSONWebKeysResponse--;
@@ -981,7 +1001,8 @@
 void checkGetOpenIDConfigResponse(api.GetOpenIDConfigResponse o) {
   buildCounterGetOpenIDConfigResponse++;
   if (buildCounterGetOpenIDConfigResponse < 3) {
-    checkHttpCacheControlResponseHeader(o.cacheHeader);
+    checkHttpCacheControlResponseHeader(
+        o.cacheHeader as api.HttpCacheControlResponseHeader);
     checkUnnamed1751(o.claimsSupported);
     checkUnnamed1752(o.grantTypes);
     checkUnnamed1753(o.idTokenSigningAlgValuesSupported);
@@ -1198,8 +1219,8 @@
 
 void checkUnnamed1756(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCluster(o[0]);
-  checkCluster(o[1]);
+  checkCluster(o[0] as api.Cluster);
+  checkCluster(o[1] as api.Cluster);
 }
 
 core.List<core.String> buildUnnamed1757() {
@@ -1245,8 +1266,8 @@
 
 void checkUnnamed1758(core.List<api.NodePool> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodePool(o[0]);
-  checkNodePool(o[1]);
+  checkNodePool(o[0] as api.NodePool);
+  checkNodePool(o[1] as api.NodePool);
 }
 
 core.int buildCounterListNodePoolsResponse = 0;
@@ -1290,8 +1311,8 @@
 
 void checkUnnamed1760(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1324,8 +1345,8 @@
 
 void checkUnnamed1761(core.List<api.UsableSubnetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsableSubnetwork(o[0]);
-  checkUsableSubnetwork(o[1]);
+  checkUsableSubnetwork(o[0] as api.UsableSubnetwork);
+  checkUsableSubnetwork(o[1] as api.UsableSubnetwork);
 }
 
 core.int buildCounterListUsableSubnetworksResponse = 0;
@@ -1365,7 +1386,7 @@
   buildCounterMaintenancePolicy++;
   if (buildCounterMaintenancePolicy < 3) {
     unittest.expect(o.resourceVersion, unittest.equals('foo'));
-    checkMaintenanceWindow(o.window);
+    checkMaintenanceWindow(o.window as api.MaintenanceWindow);
   }
   buildCounterMaintenancePolicy--;
 }
@@ -1379,8 +1400,8 @@
 
 void checkUnnamed1762(core.Map<core.String, api.TimeWindow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimeWindow(o['x']);
-  checkTimeWindow(o['y']);
+  checkTimeWindow(o['x'] as api.TimeWindow);
+  checkTimeWindow(o['y'] as api.TimeWindow);
 }
 
 core.int buildCounterMaintenanceWindow = 0;
@@ -1399,9 +1420,10 @@
 void checkMaintenanceWindow(api.MaintenanceWindow o) {
   buildCounterMaintenanceWindow++;
   if (buildCounterMaintenanceWindow < 3) {
-    checkDailyMaintenanceWindow(o.dailyMaintenanceWindow);
+    checkDailyMaintenanceWindow(
+        o.dailyMaintenanceWindow as api.DailyMaintenanceWindow);
     checkUnnamed1762(o.maintenanceExclusions);
-    checkRecurringTimeWindow(o.recurringWindow);
+    checkRecurringTimeWindow(o.recurringWindow as api.RecurringTimeWindow);
   }
   buildCounterMaintenanceWindow--;
 }
@@ -1426,7 +1448,8 @@
   buildCounterMasterAuth++;
   if (buildCounterMasterAuth < 3) {
     unittest.expect(o.clientCertificate, unittest.equals('foo'));
-    checkClientCertificateConfig(o.clientCertificateConfig);
+    checkClientCertificateConfig(
+        o.clientCertificateConfig as api.ClientCertificateConfig);
     unittest.expect(o.clientKey, unittest.equals('foo'));
     unittest.expect(o.clusterCaCertificate, unittest.equals('foo'));
     unittest.expect(o.password, unittest.equals('foo'));
@@ -1444,8 +1467,8 @@
 
 void checkUnnamed1763(core.List<api.CidrBlock> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCidrBlock(o[0]);
-  checkCidrBlock(o[1]);
+  checkCidrBlock(o[0] as api.CidrBlock);
+  checkCidrBlock(o[1] as api.CidrBlock);
 }
 
 core.int buildCounterMasterAuthorizedNetworksConfig = 0;
@@ -1530,7 +1553,7 @@
 void checkNetworkConfig(api.NetworkConfig o) {
   buildCounterNetworkConfig++;
   if (buildCounterNetworkConfig < 3) {
-    checkDefaultSnatStatus(o.defaultSnatStatus);
+    checkDefaultSnatStatus(o.defaultSnatStatus as api.DefaultSnatStatus);
     unittest.expect(o.enableIntraNodeVisibility, unittest.isTrue);
     unittest.expect(o.network, unittest.equals('foo'));
     unittest.expect(o.subnetwork, unittest.equals('foo'));
@@ -1587,8 +1610,8 @@
 
 void checkUnnamed1764(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorConfig(o[0]);
-  checkAcceleratorConfig(o[1]);
+  checkAcceleratorConfig(o[0] as api.AcceleratorConfig);
+  checkAcceleratorConfig(o[1] as api.AcceleratorConfig);
 }
 
 core.Map<core.String, core.String> buildUnnamed1765() {
@@ -1652,8 +1675,8 @@
 
 void checkUnnamed1769(core.List<api.NodeTaint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeTaint(o[0]);
-  checkNodeTaint(o[1]);
+  checkNodeTaint(o[0] as api.NodeTaint);
+  checkNodeTaint(o[1] as api.NodeTaint);
 }
 
 core.int buildCounterNodeConfig = 0;
@@ -1702,13 +1725,15 @@
     unittest.expect(o.nodeGroup, unittest.equals('foo'));
     checkUnnamed1767(o.oauthScopes);
     unittest.expect(o.preemptible, unittest.isTrue);
-    checkReservationAffinity(o.reservationAffinity);
-    checkSandboxConfig(o.sandboxConfig);
+    checkReservationAffinity(o.reservationAffinity as api.ReservationAffinity);
+    checkSandboxConfig(o.sandboxConfig as api.SandboxConfig);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkShieldedInstanceConfig(o.shieldedInstanceConfig);
+    checkShieldedInstanceConfig(
+        o.shieldedInstanceConfig as api.ShieldedInstanceConfig);
     checkUnnamed1768(o.tags);
     checkUnnamed1769(o.taints);
-    checkWorkloadMetadataConfig(o.workloadMetadataConfig);
+    checkWorkloadMetadataConfig(
+        o.workloadMetadataConfig as api.WorkloadMetadataConfig);
   }
   buildCounterNodeConfig--;
 }
@@ -1731,7 +1756,7 @@
   if (buildCounterNodeManagement < 3) {
     unittest.expect(o.autoRepair, unittest.isTrue);
     unittest.expect(o.autoUpgrade, unittest.isTrue);
-    checkAutoUpgradeOptions(o.upgradeOptions);
+    checkAutoUpgradeOptions(o.upgradeOptions as api.AutoUpgradeOptions);
   }
   buildCounterNodeManagement--;
 }
@@ -1745,8 +1770,8 @@
 
 void checkUnnamed1770(core.List<api.StatusCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatusCondition(o[0]);
-  checkStatusCondition(o[1]);
+  checkStatusCondition(o[0] as api.StatusCondition);
+  checkStatusCondition(o[1] as api.StatusCondition);
 }
 
 core.List<core.String> buildUnnamed1771() {
@@ -1803,20 +1828,20 @@
 void checkNodePool(api.NodePool o) {
   buildCounterNodePool++;
   if (buildCounterNodePool < 3) {
-    checkNodePoolAutoscaling(o.autoscaling);
+    checkNodePoolAutoscaling(o.autoscaling as api.NodePoolAutoscaling);
     checkUnnamed1770(o.conditions);
-    checkNodeConfig(o.config);
+    checkNodeConfig(o.config as api.NodeConfig);
     unittest.expect(o.initialNodeCount, unittest.equals(42));
     checkUnnamed1771(o.instanceGroupUrls);
     checkUnnamed1772(o.locations);
-    checkNodeManagement(o.management);
-    checkMaxPodsConstraint(o.maxPodsConstraint);
+    checkNodeManagement(o.management as api.NodeManagement);
+    checkMaxPodsConstraint(o.maxPodsConstraint as api.MaxPodsConstraint);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.podIpv4CidrSize, unittest.equals(42));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.statusMessage, unittest.equals('foo'));
-    checkUpgradeSettings(o.upgradeSettings);
+    checkUpgradeSettings(o.upgradeSettings as api.UpgradeSettings);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterNodePool--;
@@ -1879,8 +1904,8 @@
 
 void checkUnnamed1773(core.List<api.StatusCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatusCondition(o[0]);
-  checkStatusCondition(o[1]);
+  checkStatusCondition(o[0] as api.StatusCondition);
+  checkStatusCondition(o[1] as api.StatusCondition);
 }
 
 core.List<api.StatusCondition> buildUnnamed1774() {
@@ -1892,8 +1917,8 @@
 
 void checkUnnamed1774(core.List<api.StatusCondition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatusCondition(o[0]);
-  checkStatusCondition(o[1]);
+  checkStatusCondition(o[0] as api.StatusCondition);
+  checkStatusCondition(o[1] as api.StatusCondition);
 }
 
 core.int buildCounterOperation = 0;
@@ -1930,7 +1955,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1774(o.nodepoolConditions);
     unittest.expect(o.operationType, unittest.equals('foo'));
-    checkOperationProgress(o.progress);
+    checkOperationProgress(o.progress as api.OperationProgress);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -1950,8 +1975,8 @@
 
 void checkUnnamed1775(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.OperationProgress> buildUnnamed1776() {
@@ -1963,8 +1988,8 @@
 
 void checkUnnamed1776(core.List<api.OperationProgress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationProgress(o[0]);
-  checkOperationProgress(o[1]);
+  checkOperationProgress(o[0] as api.OperationProgress);
+  checkOperationProgress(o[1] as api.OperationProgress);
 }
 
 core.int buildCounterOperationProgress = 0;
@@ -2014,7 +2039,8 @@
   if (buildCounterPrivateClusterConfig < 3) {
     unittest.expect(o.enablePrivateEndpoint, unittest.isTrue);
     unittest.expect(o.enablePrivateNodes, unittest.isTrue);
-    checkPrivateClusterMasterGlobalAccessConfig(o.masterGlobalAccessConfig);
+    checkPrivateClusterMasterGlobalAccessConfig(o.masterGlobalAccessConfig
+        as api.PrivateClusterMasterGlobalAccessConfig);
     unittest.expect(o.masterIpv4CidrBlock, unittest.equals('foo'));
     unittest.expect(o.peeringName, unittest.equals('foo'));
     unittest.expect(o.privateEndpoint, unittest.equals('foo'));
@@ -2060,7 +2086,7 @@
   buildCounterRecurringTimeWindow++;
   if (buildCounterRecurringTimeWindow < 3) {
     unittest.expect(o.recurrence, unittest.equals('foo'));
-    checkTimeWindow(o.window);
+    checkTimeWindow(o.window as api.TimeWindow);
   }
   buildCounterRecurringTimeWindow--;
 }
@@ -2195,8 +2221,9 @@
 void checkResourceUsageExportConfig(api.ResourceUsageExportConfig o) {
   buildCounterResourceUsageExportConfig++;
   if (buildCounterResourceUsageExportConfig < 3) {
-    checkBigQueryDestination(o.bigqueryDestination);
-    checkConsumptionMeteringConfig(o.consumptionMeteringConfig);
+    checkBigQueryDestination(o.bigqueryDestination as api.BigQueryDestination);
+    checkConsumptionMeteringConfig(
+        o.consumptionMeteringConfig as api.ConsumptionMeteringConfig);
     unittest.expect(o.enableNetworkEgressMetering, unittest.isTrue);
   }
   buildCounterResourceUsageExportConfig--;
@@ -2257,8 +2284,8 @@
 
 void checkUnnamed1779(core.List<api.ReleaseChannelConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReleaseChannelConfig(o[0]);
-  checkReleaseChannelConfig(o[1]);
+  checkReleaseChannelConfig(o[0] as api.ReleaseChannelConfig);
+  checkReleaseChannelConfig(o[1] as api.ReleaseChannelConfig);
 }
 
 core.List<core.String> buildUnnamed1780() {
@@ -2347,7 +2374,7 @@
 void checkSetAddonsConfigRequest(api.SetAddonsConfigRequest o) {
   buildCounterSetAddonsConfigRequest++;
   if (buildCounterSetAddonsConfigRequest < 3) {
-    checkAddonsConfig(o.addonsConfig);
+    checkAddonsConfig(o.addonsConfig as api.AddonsConfig);
     unittest.expect(o.clusterId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
@@ -2511,7 +2538,7 @@
   buildCounterSetMaintenancePolicyRequest++;
   if (buildCounterSetMaintenancePolicyRequest < 3) {
     unittest.expect(o.clusterId, unittest.equals('foo'));
-    checkMaintenancePolicy(o.maintenancePolicy);
+    checkMaintenancePolicy(o.maintenancePolicy as api.MaintenancePolicy);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
@@ -2542,7 +2569,7 @@
     unittest.expect(o.clusterId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkMasterAuth(o.update);
+    checkMasterAuth(o.update as api.MasterAuth);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterSetMasterAuthRequest--;
@@ -2595,7 +2622,7 @@
   if (buildCounterSetNetworkPolicyRequest < 3) {
     unittest.expect(o.clusterId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNetworkPolicy(o.networkPolicy);
+    checkNetworkPolicy(o.networkPolicy as api.NetworkPolicy);
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.zone, unittest.equals('foo'));
   }
@@ -2621,7 +2648,7 @@
 void checkSetNodePoolAutoscalingRequest(api.SetNodePoolAutoscalingRequest o) {
   buildCounterSetNodePoolAutoscalingRequest++;
   if (buildCounterSetNodePoolAutoscalingRequest < 3) {
-    checkNodePoolAutoscaling(o.autoscaling);
+    checkNodePoolAutoscaling(o.autoscaling as api.NodePoolAutoscaling);
     unittest.expect(o.clusterId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nodePoolId, unittest.equals('foo'));
@@ -2651,7 +2678,7 @@
   buildCounterSetNodePoolManagementRequest++;
   if (buildCounterSetNodePoolManagementRequest < 3) {
     unittest.expect(o.clusterId, unittest.equals('foo'));
-    checkNodeManagement(o.management);
+    checkNodeManagement(o.management as api.NodeManagement);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nodePoolId, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
@@ -2819,7 +2846,7 @@
     unittest.expect(o.clusterId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkClusterUpdate(o.update);
+    checkClusterUpdate(o.update as api.ClusterUpdate);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterUpdateClusterRequest--;
@@ -2895,8 +2922,9 @@
     unittest.expect(o.nodePoolId, unittest.equals('foo'));
     unittest.expect(o.nodeVersion, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkUpgradeSettings(o.upgradeSettings);
-    checkWorkloadMetadataConfig(o.workloadMetadataConfig);
+    checkUpgradeSettings(o.upgradeSettings as api.UpgradeSettings);
+    checkWorkloadMetadataConfig(
+        o.workloadMetadataConfig as api.WorkloadMetadataConfig);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterUpdateNodePoolRequest--;
@@ -2961,8 +2989,10 @@
 
 void checkUnnamed1786(core.List<api.UsableSubnetworkSecondaryRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsableSubnetworkSecondaryRange(o[0]);
-  checkUsableSubnetworkSecondaryRange(o[1]);
+  checkUsableSubnetworkSecondaryRange(
+      o[0] as api.UsableSubnetworkSecondaryRange);
+  checkUsableSubnetworkSecondaryRange(
+      o[1] as api.UsableSubnetworkSecondaryRange);
 }
 
 core.int buildCounterUsableSubnetwork = 0;
@@ -3077,7 +3107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorConfig();
       var od = api.AcceleratorConfig.fromJson(o.toJson());
-      checkAcceleratorConfig(od);
+      checkAcceleratorConfig(od as api.AcceleratorConfig);
     });
   });
 
@@ -3085,7 +3115,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddonsConfig();
       var od = api.AddonsConfig.fromJson(o.toJson());
-      checkAddonsConfig(od);
+      checkAddonsConfig(od as api.AddonsConfig);
     });
   });
 
@@ -3093,7 +3123,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthenticatorGroupsConfig();
       var od = api.AuthenticatorGroupsConfig.fromJson(o.toJson());
-      checkAuthenticatorGroupsConfig(od);
+      checkAuthenticatorGroupsConfig(od as api.AuthenticatorGroupsConfig);
     });
   });
 
@@ -3101,7 +3131,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoUpgradeOptions();
       var od = api.AutoUpgradeOptions.fromJson(o.toJson());
-      checkAutoUpgradeOptions(od);
+      checkAutoUpgradeOptions(od as api.AutoUpgradeOptions);
     });
   });
 
@@ -3109,7 +3139,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoprovisioningNodePoolDefaults();
       var od = api.AutoprovisioningNodePoolDefaults.fromJson(o.toJson());
-      checkAutoprovisioningNodePoolDefaults(od);
+      checkAutoprovisioningNodePoolDefaults(
+          od as api.AutoprovisioningNodePoolDefaults);
     });
   });
 
@@ -3117,7 +3148,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigQueryDestination();
       var od = api.BigQueryDestination.fromJson(o.toJson());
-      checkBigQueryDestination(od);
+      checkBigQueryDestination(od as api.BigQueryDestination);
     });
   });
 
@@ -3125,7 +3156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinaryAuthorization();
       var od = api.BinaryAuthorization.fromJson(o.toJson());
-      checkBinaryAuthorization(od);
+      checkBinaryAuthorization(od as api.BinaryAuthorization);
     });
   });
 
@@ -3133,7 +3164,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -3141,7 +3172,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCidrBlock();
       var od = api.CidrBlock.fromJson(o.toJson());
-      checkCidrBlock(od);
+      checkCidrBlock(od as api.CidrBlock);
     });
   });
 
@@ -3149,7 +3180,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClientCertificateConfig();
       var od = api.ClientCertificateConfig.fromJson(o.toJson());
-      checkClientCertificateConfig(od);
+      checkClientCertificateConfig(od as api.ClientCertificateConfig);
     });
   });
 
@@ -3157,7 +3188,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudRunConfig();
       var od = api.CloudRunConfig.fromJson(o.toJson());
-      checkCloudRunConfig(od);
+      checkCloudRunConfig(od as api.CloudRunConfig);
     });
   });
 
@@ -3165,7 +3196,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCluster();
       var od = api.Cluster.fromJson(o.toJson());
-      checkCluster(od);
+      checkCluster(od as api.Cluster);
     });
   });
 
@@ -3173,7 +3204,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterAutoscaling();
       var od = api.ClusterAutoscaling.fromJson(o.toJson());
-      checkClusterAutoscaling(od);
+      checkClusterAutoscaling(od as api.ClusterAutoscaling);
     });
   });
 
@@ -3181,7 +3212,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterUpdate();
       var od = api.ClusterUpdate.fromJson(o.toJson());
-      checkClusterUpdate(od);
+      checkClusterUpdate(od as api.ClusterUpdate);
     });
   });
 
@@ -3189,7 +3220,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompleteIPRotationRequest();
       var od = api.CompleteIPRotationRequest.fromJson(o.toJson());
-      checkCompleteIPRotationRequest(od);
+      checkCompleteIPRotationRequest(od as api.CompleteIPRotationRequest);
     });
   });
 
@@ -3197,7 +3228,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigConnectorConfig();
       var od = api.ConfigConnectorConfig.fromJson(o.toJson());
-      checkConfigConnectorConfig(od);
+      checkConfigConnectorConfig(od as api.ConfigConnectorConfig);
     });
   });
 
@@ -3205,7 +3236,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConsumptionMeteringConfig();
       var od = api.ConsumptionMeteringConfig.fromJson(o.toJson());
-      checkConsumptionMeteringConfig(od);
+      checkConsumptionMeteringConfig(od as api.ConsumptionMeteringConfig);
     });
   });
 
@@ -3213,7 +3244,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateClusterRequest();
       var od = api.CreateClusterRequest.fromJson(o.toJson());
-      checkCreateClusterRequest(od);
+      checkCreateClusterRequest(od as api.CreateClusterRequest);
     });
   });
 
@@ -3221,7 +3252,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateNodePoolRequest();
       var od = api.CreateNodePoolRequest.fromJson(o.toJson());
-      checkCreateNodePoolRequest(od);
+      checkCreateNodePoolRequest(od as api.CreateNodePoolRequest);
     });
   });
 
@@ -3229,7 +3260,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDailyMaintenanceWindow();
       var od = api.DailyMaintenanceWindow.fromJson(o.toJson());
-      checkDailyMaintenanceWindow(od);
+      checkDailyMaintenanceWindow(od as api.DailyMaintenanceWindow);
     });
   });
 
@@ -3237,7 +3268,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatabaseEncryption();
       var od = api.DatabaseEncryption.fromJson(o.toJson());
-      checkDatabaseEncryption(od);
+      checkDatabaseEncryption(od as api.DatabaseEncryption);
     });
   });
 
@@ -3245,7 +3276,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDefaultSnatStatus();
       var od = api.DefaultSnatStatus.fromJson(o.toJson());
-      checkDefaultSnatStatus(od);
+      checkDefaultSnatStatus(od as api.DefaultSnatStatus);
     });
   });
 
@@ -3253,7 +3284,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDnsCacheConfig();
       var od = api.DnsCacheConfig.fromJson(o.toJson());
-      checkDnsCacheConfig(od);
+      checkDnsCacheConfig(od as api.DnsCacheConfig);
     });
   });
 
@@ -3261,7 +3292,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3269,7 +3300,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetJSONWebKeysResponse();
       var od = api.GetJSONWebKeysResponse.fromJson(o.toJson());
-      checkGetJSONWebKeysResponse(od);
+      checkGetJSONWebKeysResponse(od as api.GetJSONWebKeysResponse);
     });
   });
 
@@ -3277,7 +3308,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetOpenIDConfigResponse();
       var od = api.GetOpenIDConfigResponse.fromJson(o.toJson());
-      checkGetOpenIDConfigResponse(od);
+      checkGetOpenIDConfigResponse(od as api.GetOpenIDConfigResponse);
     });
   });
 
@@ -3285,7 +3316,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHorizontalPodAutoscaling();
       var od = api.HorizontalPodAutoscaling.fromJson(o.toJson());
-      checkHorizontalPodAutoscaling(od);
+      checkHorizontalPodAutoscaling(od as api.HorizontalPodAutoscaling);
     });
   });
 
@@ -3293,7 +3324,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpCacheControlResponseHeader();
       var od = api.HttpCacheControlResponseHeader.fromJson(o.toJson());
-      checkHttpCacheControlResponseHeader(od);
+      checkHttpCacheControlResponseHeader(
+          od as api.HttpCacheControlResponseHeader);
     });
   });
 
@@ -3301,7 +3333,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpLoadBalancing();
       var od = api.HttpLoadBalancing.fromJson(o.toJson());
-      checkHttpLoadBalancing(od);
+      checkHttpLoadBalancing(od as api.HttpLoadBalancing);
     });
   });
 
@@ -3309,7 +3341,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIPAllocationPolicy();
       var od = api.IPAllocationPolicy.fromJson(o.toJson());
-      checkIPAllocationPolicy(od);
+      checkIPAllocationPolicy(od as api.IPAllocationPolicy);
     });
   });
 
@@ -3317,7 +3349,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntraNodeVisibilityConfig();
       var od = api.IntraNodeVisibilityConfig.fromJson(o.toJson());
-      checkIntraNodeVisibilityConfig(od);
+      checkIntraNodeVisibilityConfig(od as api.IntraNodeVisibilityConfig);
     });
   });
 
@@ -3325,7 +3357,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJwk();
       var od = api.Jwk.fromJson(o.toJson());
-      checkJwk(od);
+      checkJwk(od as api.Jwk);
     });
   });
 
@@ -3333,7 +3365,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKubernetesDashboard();
       var od = api.KubernetesDashboard.fromJson(o.toJson());
-      checkKubernetesDashboard(od);
+      checkKubernetesDashboard(od as api.KubernetesDashboard);
     });
   });
 
@@ -3341,7 +3373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLegacyAbac();
       var od = api.LegacyAbac.fromJson(o.toJson());
-      checkLegacyAbac(od);
+      checkLegacyAbac(od as api.LegacyAbac);
     });
   });
 
@@ -3349,7 +3381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListClustersResponse();
       var od = api.ListClustersResponse.fromJson(o.toJson());
-      checkListClustersResponse(od);
+      checkListClustersResponse(od as api.ListClustersResponse);
     });
   });
 
@@ -3357,7 +3389,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListNodePoolsResponse();
       var od = api.ListNodePoolsResponse.fromJson(o.toJson());
-      checkListNodePoolsResponse(od);
+      checkListNodePoolsResponse(od as api.ListNodePoolsResponse);
     });
   });
 
@@ -3365,7 +3397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3373,7 +3405,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUsableSubnetworksResponse();
       var od = api.ListUsableSubnetworksResponse.fromJson(o.toJson());
-      checkListUsableSubnetworksResponse(od);
+      checkListUsableSubnetworksResponse(
+          od as api.ListUsableSubnetworksResponse);
     });
   });
 
@@ -3381,7 +3414,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMaintenancePolicy();
       var od = api.MaintenancePolicy.fromJson(o.toJson());
-      checkMaintenancePolicy(od);
+      checkMaintenancePolicy(od as api.MaintenancePolicy);
     });
   });
 
@@ -3389,7 +3422,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMaintenanceWindow();
       var od = api.MaintenanceWindow.fromJson(o.toJson());
-      checkMaintenanceWindow(od);
+      checkMaintenanceWindow(od as api.MaintenanceWindow);
     });
   });
 
@@ -3397,7 +3430,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMasterAuth();
       var od = api.MasterAuth.fromJson(o.toJson());
-      checkMasterAuth(od);
+      checkMasterAuth(od as api.MasterAuth);
     });
   });
 
@@ -3405,7 +3438,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMasterAuthorizedNetworksConfig();
       var od = api.MasterAuthorizedNetworksConfig.fromJson(o.toJson());
-      checkMasterAuthorizedNetworksConfig(od);
+      checkMasterAuthorizedNetworksConfig(
+          od as api.MasterAuthorizedNetworksConfig);
     });
   });
 
@@ -3413,7 +3447,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMaxPodsConstraint();
       var od = api.MaxPodsConstraint.fromJson(o.toJson());
-      checkMaxPodsConstraint(od);
+      checkMaxPodsConstraint(od as api.MaxPodsConstraint);
     });
   });
 
@@ -3421,7 +3455,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetric();
       var od = api.Metric.fromJson(o.toJson());
-      checkMetric(od);
+      checkMetric(od as api.Metric);
     });
   });
 
@@ -3429,7 +3463,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkConfig();
       var od = api.NetworkConfig.fromJson(o.toJson());
-      checkNetworkConfig(od);
+      checkNetworkConfig(od as api.NetworkConfig);
     });
   });
 
@@ -3437,7 +3471,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkPolicy();
       var od = api.NetworkPolicy.fromJson(o.toJson());
-      checkNetworkPolicy(od);
+      checkNetworkPolicy(od as api.NetworkPolicy);
     });
   });
 
@@ -3445,7 +3479,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkPolicyConfig();
       var od = api.NetworkPolicyConfig.fromJson(o.toJson());
-      checkNetworkPolicyConfig(od);
+      checkNetworkPolicyConfig(od as api.NetworkPolicyConfig);
     });
   });
 
@@ -3453,7 +3487,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeConfig();
       var od = api.NodeConfig.fromJson(o.toJson());
-      checkNodeConfig(od);
+      checkNodeConfig(od as api.NodeConfig);
     });
   });
 
@@ -3461,7 +3495,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeManagement();
       var od = api.NodeManagement.fromJson(o.toJson());
-      checkNodeManagement(od);
+      checkNodeManagement(od as api.NodeManagement);
     });
   });
 
@@ -3469,7 +3503,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodePool();
       var od = api.NodePool.fromJson(o.toJson());
-      checkNodePool(od);
+      checkNodePool(od as api.NodePool);
     });
   });
 
@@ -3477,7 +3511,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodePoolAutoscaling();
       var od = api.NodePoolAutoscaling.fromJson(o.toJson());
-      checkNodePoolAutoscaling(od);
+      checkNodePoolAutoscaling(od as api.NodePoolAutoscaling);
     });
   });
 
@@ -3485,7 +3519,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeTaint();
       var od = api.NodeTaint.fromJson(o.toJson());
-      checkNodeTaint(od);
+      checkNodeTaint(od as api.NodeTaint);
     });
   });
 
@@ -3493,7 +3527,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3501,7 +3535,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationProgress();
       var od = api.OperationProgress.fromJson(o.toJson());
-      checkOperationProgress(od);
+      checkOperationProgress(od as api.OperationProgress);
     });
   });
 
@@ -3509,7 +3543,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrivateClusterConfig();
       var od = api.PrivateClusterConfig.fromJson(o.toJson());
-      checkPrivateClusterConfig(od);
+      checkPrivateClusterConfig(od as api.PrivateClusterConfig);
     });
   });
 
@@ -3517,7 +3551,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrivateClusterMasterGlobalAccessConfig();
       var od = api.PrivateClusterMasterGlobalAccessConfig.fromJson(o.toJson());
-      checkPrivateClusterMasterGlobalAccessConfig(od);
+      checkPrivateClusterMasterGlobalAccessConfig(
+          od as api.PrivateClusterMasterGlobalAccessConfig);
     });
   });
 
@@ -3525,7 +3560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecurringTimeWindow();
       var od = api.RecurringTimeWindow.fromJson(o.toJson());
-      checkRecurringTimeWindow(od);
+      checkRecurringTimeWindow(od as api.RecurringTimeWindow);
     });
   });
 
@@ -3533,7 +3568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReleaseChannel();
       var od = api.ReleaseChannel.fromJson(o.toJson());
-      checkReleaseChannel(od);
+      checkReleaseChannel(od as api.ReleaseChannel);
     });
   });
 
@@ -3541,7 +3576,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReleaseChannelConfig();
       var od = api.ReleaseChannelConfig.fromJson(o.toJson());
-      checkReleaseChannelConfig(od);
+      checkReleaseChannelConfig(od as api.ReleaseChannelConfig);
     });
   });
 
@@ -3549,7 +3584,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationAffinity();
       var od = api.ReservationAffinity.fromJson(o.toJson());
-      checkReservationAffinity(od);
+      checkReservationAffinity(od as api.ReservationAffinity);
     });
   });
 
@@ -3557,7 +3592,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceLimit();
       var od = api.ResourceLimit.fromJson(o.toJson());
-      checkResourceLimit(od);
+      checkResourceLimit(od as api.ResourceLimit);
     });
   });
 
@@ -3565,7 +3600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceUsageExportConfig();
       var od = api.ResourceUsageExportConfig.fromJson(o.toJson());
-      checkResourceUsageExportConfig(od);
+      checkResourceUsageExportConfig(od as api.ResourceUsageExportConfig);
     });
   });
 
@@ -3573,7 +3608,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRollbackNodePoolUpgradeRequest();
       var od = api.RollbackNodePoolUpgradeRequest.fromJson(o.toJson());
-      checkRollbackNodePoolUpgradeRequest(od);
+      checkRollbackNodePoolUpgradeRequest(
+          od as api.RollbackNodePoolUpgradeRequest);
     });
   });
 
@@ -3581,7 +3617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSandboxConfig();
       var od = api.SandboxConfig.fromJson(o.toJson());
-      checkSandboxConfig(od);
+      checkSandboxConfig(od as api.SandboxConfig);
     });
   });
 
@@ -3589,7 +3625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServerConfig();
       var od = api.ServerConfig.fromJson(o.toJson());
-      checkServerConfig(od);
+      checkServerConfig(od as api.ServerConfig);
     });
   });
 
@@ -3597,7 +3633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetAddonsConfigRequest();
       var od = api.SetAddonsConfigRequest.fromJson(o.toJson());
-      checkSetAddonsConfigRequest(od);
+      checkSetAddonsConfigRequest(od as api.SetAddonsConfigRequest);
     });
   });
 
@@ -3605,7 +3641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetLabelsRequest();
       var od = api.SetLabelsRequest.fromJson(o.toJson());
-      checkSetLabelsRequest(od);
+      checkSetLabelsRequest(od as api.SetLabelsRequest);
     });
   });
 
@@ -3613,7 +3649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetLegacyAbacRequest();
       var od = api.SetLegacyAbacRequest.fromJson(o.toJson());
-      checkSetLegacyAbacRequest(od);
+      checkSetLegacyAbacRequest(od as api.SetLegacyAbacRequest);
     });
   });
 
@@ -3621,7 +3657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetLocationsRequest();
       var od = api.SetLocationsRequest.fromJson(o.toJson());
-      checkSetLocationsRequest(od);
+      checkSetLocationsRequest(od as api.SetLocationsRequest);
     });
   });
 
@@ -3629,7 +3665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetLoggingServiceRequest();
       var od = api.SetLoggingServiceRequest.fromJson(o.toJson());
-      checkSetLoggingServiceRequest(od);
+      checkSetLoggingServiceRequest(od as api.SetLoggingServiceRequest);
     });
   });
 
@@ -3637,7 +3673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetMaintenancePolicyRequest();
       var od = api.SetMaintenancePolicyRequest.fromJson(o.toJson());
-      checkSetMaintenancePolicyRequest(od);
+      checkSetMaintenancePolicyRequest(od as api.SetMaintenancePolicyRequest);
     });
   });
 
@@ -3645,7 +3681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetMasterAuthRequest();
       var od = api.SetMasterAuthRequest.fromJson(o.toJson());
-      checkSetMasterAuthRequest(od);
+      checkSetMasterAuthRequest(od as api.SetMasterAuthRequest);
     });
   });
 
@@ -3653,7 +3689,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetMonitoringServiceRequest();
       var od = api.SetMonitoringServiceRequest.fromJson(o.toJson());
-      checkSetMonitoringServiceRequest(od);
+      checkSetMonitoringServiceRequest(od as api.SetMonitoringServiceRequest);
     });
   });
 
@@ -3661,7 +3697,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetNetworkPolicyRequest();
       var od = api.SetNetworkPolicyRequest.fromJson(o.toJson());
-      checkSetNetworkPolicyRequest(od);
+      checkSetNetworkPolicyRequest(od as api.SetNetworkPolicyRequest);
     });
   });
 
@@ -3669,7 +3705,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetNodePoolAutoscalingRequest();
       var od = api.SetNodePoolAutoscalingRequest.fromJson(o.toJson());
-      checkSetNodePoolAutoscalingRequest(od);
+      checkSetNodePoolAutoscalingRequest(
+          od as api.SetNodePoolAutoscalingRequest);
     });
   });
 
@@ -3677,7 +3714,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetNodePoolManagementRequest();
       var od = api.SetNodePoolManagementRequest.fromJson(o.toJson());
-      checkSetNodePoolManagementRequest(od);
+      checkSetNodePoolManagementRequest(od as api.SetNodePoolManagementRequest);
     });
   });
 
@@ -3685,7 +3722,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetNodePoolSizeRequest();
       var od = api.SetNodePoolSizeRequest.fromJson(o.toJson());
-      checkSetNodePoolSizeRequest(od);
+      checkSetNodePoolSizeRequest(od as api.SetNodePoolSizeRequest);
     });
   });
 
@@ -3693,7 +3730,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShieldedInstanceConfig();
       var od = api.ShieldedInstanceConfig.fromJson(o.toJson());
-      checkShieldedInstanceConfig(od);
+      checkShieldedInstanceConfig(od as api.ShieldedInstanceConfig);
     });
   });
 
@@ -3701,7 +3738,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShieldedNodes();
       var od = api.ShieldedNodes.fromJson(o.toJson());
-      checkShieldedNodes(od);
+      checkShieldedNodes(od as api.ShieldedNodes);
     });
   });
 
@@ -3709,7 +3746,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartIPRotationRequest();
       var od = api.StartIPRotationRequest.fromJson(o.toJson());
-      checkStartIPRotationRequest(od);
+      checkStartIPRotationRequest(od as api.StartIPRotationRequest);
     });
   });
 
@@ -3717,7 +3754,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatusCondition();
       var od = api.StatusCondition.fromJson(o.toJson());
-      checkStatusCondition(od);
+      checkStatusCondition(od as api.StatusCondition);
     });
   });
 
@@ -3725,7 +3762,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeWindow();
       var od = api.TimeWindow.fromJson(o.toJson());
-      checkTimeWindow(od);
+      checkTimeWindow(od as api.TimeWindow);
     });
   });
 
@@ -3733,7 +3770,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateClusterRequest();
       var od = api.UpdateClusterRequest.fromJson(o.toJson());
-      checkUpdateClusterRequest(od);
+      checkUpdateClusterRequest(od as api.UpdateClusterRequest);
     });
   });
 
@@ -3741,7 +3778,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateMasterRequest();
       var od = api.UpdateMasterRequest.fromJson(o.toJson());
-      checkUpdateMasterRequest(od);
+      checkUpdateMasterRequest(od as api.UpdateMasterRequest);
     });
   });
 
@@ -3749,7 +3786,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateNodePoolRequest();
       var od = api.UpdateNodePoolRequest.fromJson(o.toJson());
-      checkUpdateNodePoolRequest(od);
+      checkUpdateNodePoolRequest(od as api.UpdateNodePoolRequest);
     });
   });
 
@@ -3757,7 +3794,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpgradeEvent();
       var od = api.UpgradeEvent.fromJson(o.toJson());
-      checkUpgradeEvent(od);
+      checkUpgradeEvent(od as api.UpgradeEvent);
     });
   });
 
@@ -3765,7 +3802,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpgradeSettings();
       var od = api.UpgradeSettings.fromJson(o.toJson());
-      checkUpgradeSettings(od);
+      checkUpgradeSettings(od as api.UpgradeSettings);
     });
   });
 
@@ -3773,7 +3810,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsableSubnetwork();
       var od = api.UsableSubnetwork.fromJson(o.toJson());
-      checkUsableSubnetwork(od);
+      checkUsableSubnetwork(od as api.UsableSubnetwork);
     });
   });
 
@@ -3781,7 +3818,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsableSubnetworkSecondaryRange();
       var od = api.UsableSubnetworkSecondaryRange.fromJson(o.toJson());
-      checkUsableSubnetworkSecondaryRange(od);
+      checkUsableSubnetworkSecondaryRange(
+          od as api.UsableSubnetworkSecondaryRange);
     });
   });
 
@@ -3789,7 +3827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerticalPodAutoscaling();
       var od = api.VerticalPodAutoscaling.fromJson(o.toJson());
-      checkVerticalPodAutoscaling(od);
+      checkVerticalPodAutoscaling(od as api.VerticalPodAutoscaling);
     });
   });
 
@@ -3797,7 +3835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkloadIdentityConfig();
       var od = api.WorkloadIdentityConfig.fromJson(o.toJson());
-      checkWorkloadIdentityConfig(od);
+      checkWorkloadIdentityConfig(od as api.WorkloadIdentityConfig);
     });
   });
 
@@ -3805,7 +3843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkloadMetadataConfig();
       var od = api.WorkloadMetadataConfig.fromJson(o.toJson());
-      checkWorkloadMetadataConfig(od);
+      checkWorkloadMetadataConfig(od as api.WorkloadMetadataConfig);
     });
   });
 
@@ -3866,7 +3904,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUsableSubnetworksResponse(response);
+        checkListUsableSubnetworksResponse(
+            response as api.ListUsableSubnetworksResponse);
       })));
     });
   });
@@ -3922,7 +3961,7 @@
           .getServerConfig(arg_name,
               projectId: arg_projectId, zone: arg_zone, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServerConfig(response);
+        checkServerConfig(response as api.ServerConfig);
       })));
     });
   });
@@ -3935,8 +3974,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CompleteIPRotationRequest.fromJson(json);
-        checkCompleteIPRotationRequest(obj);
+        var obj = api.CompleteIPRotationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCompleteIPRotationRequest(obj as api.CompleteIPRotationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3976,7 +4016,7 @@
       res
           .completeIpRotation(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3987,8 +4027,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateClusterRequest.fromJson(json);
-        checkCreateClusterRequest(obj);
+        var obj = api.CreateClusterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateClusterRequest(obj as api.CreateClusterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4028,7 +4069,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4088,7 +4129,7 @@
               zone: arg_zone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4148,7 +4189,7 @@
               zone: arg_zone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCluster(response);
+        checkCluster(response as api.Cluster);
       })));
     });
 
@@ -4196,7 +4237,7 @@
       res
           .getJwks(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetJSONWebKeysResponse(response);
+        checkGetJSONWebKeysResponse(response as api.GetJSONWebKeysResponse);
       })));
     });
 
@@ -4250,7 +4291,7 @@
           .list(arg_parent,
               projectId: arg_projectId, zone: arg_zone, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListClustersResponse(response);
+        checkListClustersResponse(response as api.ListClustersResponse);
       })));
     });
 
@@ -4261,8 +4302,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetAddonsConfigRequest.fromJson(json);
-        checkSetAddonsConfigRequest(obj);
+        var obj = api.SetAddonsConfigRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetAddonsConfigRequest(obj as api.SetAddonsConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4302,7 +4344,7 @@
       res
           .setAddons(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4313,8 +4355,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLegacyAbacRequest.fromJson(json);
-        checkSetLegacyAbacRequest(obj);
+        var obj = api.SetLegacyAbacRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLegacyAbacRequest(obj as api.SetLegacyAbacRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4354,7 +4397,7 @@
       res
           .setLegacyAbac(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4365,8 +4408,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLocationsRequest.fromJson(json);
-        checkSetLocationsRequest(obj);
+        var obj = api.SetLocationsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLocationsRequest(obj as api.SetLocationsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4406,7 +4450,7 @@
       res
           .setLocations(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4417,8 +4461,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLoggingServiceRequest.fromJson(json);
-        checkSetLoggingServiceRequest(obj);
+        var obj = api.SetLoggingServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLoggingServiceRequest(obj as api.SetLoggingServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4458,7 +4503,7 @@
       res
           .setLogging(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4469,8 +4514,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetMaintenancePolicyRequest.fromJson(json);
-        checkSetMaintenancePolicyRequest(obj);
+        var obj = api.SetMaintenancePolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetMaintenancePolicyRequest(
+            obj as api.SetMaintenancePolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4510,7 +4557,7 @@
       res
           .setMaintenancePolicy(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4521,8 +4568,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetMasterAuthRequest.fromJson(json);
-        checkSetMasterAuthRequest(obj);
+        var obj = api.SetMasterAuthRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetMasterAuthRequest(obj as api.SetMasterAuthRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4562,7 +4610,7 @@
       res
           .setMasterAuth(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4573,8 +4621,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetMonitoringServiceRequest.fromJson(json);
-        checkSetMonitoringServiceRequest(obj);
+        var obj = api.SetMonitoringServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetMonitoringServiceRequest(
+            obj as api.SetMonitoringServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4614,7 +4664,7 @@
       res
           .setMonitoring(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4625,8 +4675,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNetworkPolicyRequest.fromJson(json);
-        checkSetNetworkPolicyRequest(obj);
+        var obj = api.SetNetworkPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNetworkPolicyRequest(obj as api.SetNetworkPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4666,7 +4717,7 @@
       res
           .setNetworkPolicy(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4677,8 +4728,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLabelsRequest.fromJson(json);
-        checkSetLabelsRequest(obj);
+        var obj = api.SetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLabelsRequest(obj as api.SetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4718,7 +4770,7 @@
       res
           .setResourceLabels(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4729,8 +4781,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartIPRotationRequest.fromJson(json);
-        checkStartIPRotationRequest(obj);
+        var obj = api.StartIPRotationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartIPRotationRequest(obj as api.StartIPRotationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4770,7 +4823,7 @@
       res
           .startIpRotation(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4781,8 +4834,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateClusterRequest.fromJson(json);
-        checkUpdateClusterRequest(obj);
+        var obj = api.UpdateClusterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateClusterRequest(obj as api.UpdateClusterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4822,7 +4876,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4833,8 +4887,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateMasterRequest.fromJson(json);
-        checkUpdateMasterRequest(obj);
+        var obj = api.UpdateMasterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateMasterRequest(obj as api.UpdateMasterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4874,7 +4929,7 @@
       res
           .updateMaster(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -4887,8 +4942,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateNodePoolRequest.fromJson(json);
-        checkCreateNodePoolRequest(obj);
+        var obj = api.CreateNodePoolRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateNodePoolRequest(obj as api.CreateNodePoolRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4928,7 +4984,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4992,7 +5048,7 @@
               zone: arg_zone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5056,7 +5112,7 @@
               zone: arg_zone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodePool(response);
+        checkNodePool(response as api.NodePool);
       })));
     });
 
@@ -5116,7 +5172,7 @@
               zone: arg_zone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNodePoolsResponse(response);
+        checkListNodePoolsResponse(response as api.ListNodePoolsResponse);
       })));
     });
 
@@ -5127,8 +5183,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RollbackNodePoolUpgradeRequest.fromJson(json);
-        checkRollbackNodePoolUpgradeRequest(obj);
+        var obj = api.RollbackNodePoolUpgradeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRollbackNodePoolUpgradeRequest(
+            obj as api.RollbackNodePoolUpgradeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5168,7 +5226,7 @@
       res
           .rollback(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5179,8 +5237,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNodePoolAutoscalingRequest.fromJson(json);
-        checkSetNodePoolAutoscalingRequest(obj);
+        var obj = api.SetNodePoolAutoscalingRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNodePoolAutoscalingRequest(
+            obj as api.SetNodePoolAutoscalingRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5220,7 +5280,7 @@
       res
           .setAutoscaling(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5231,8 +5291,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNodePoolManagementRequest.fromJson(json);
-        checkSetNodePoolManagementRequest(obj);
+        var obj = api.SetNodePoolManagementRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNodePoolManagementRequest(
+            obj as api.SetNodePoolManagementRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5272,7 +5334,7 @@
       res
           .setManagement(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5283,8 +5345,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNodePoolSizeRequest.fromJson(json);
-        checkSetNodePoolSizeRequest(obj);
+        var obj = api.SetNodePoolSizeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNodePoolSizeRequest(obj as api.SetNodePoolSizeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5324,7 +5387,7 @@
       res
           .setSize(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5335,8 +5398,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateNodePoolRequest.fromJson(json);
-        checkUpdateNodePoolRequest(obj);
+        var obj = api.UpdateNodePoolRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateNodePoolRequest(obj as api.UpdateNodePoolRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5376,7 +5440,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -5426,7 +5490,7 @@
       res
           .getOpenid_configuration(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetOpenIDConfigResponse(response);
+        checkGetOpenIDConfigResponse(response as api.GetOpenIDConfigResponse);
       })));
     });
   });
@@ -5439,8 +5503,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5480,7 +5545,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5540,7 +5605,7 @@
               zone: arg_zone,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5594,7 +5659,7 @@
           .list(arg_parent,
               projectId: arg_projectId, zone: arg_zone, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -5665,7 +5730,7 @@
           .getServerconfig(arg_projectId, arg_zone,
               name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServerConfig(response);
+        checkServerConfig(response as api.ServerConfig);
       })));
     });
   });
@@ -5680,8 +5745,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetAddonsConfigRequest.fromJson(json);
-        checkSetAddonsConfigRequest(obj);
+        var obj = api.SetAddonsConfigRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetAddonsConfigRequest(obj as api.SetAddonsConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5748,7 +5814,7 @@
           .addons(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5761,8 +5827,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CompleteIPRotationRequest.fromJson(json);
-        checkCompleteIPRotationRequest(obj);
+        var obj = api.CompleteIPRotationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCompleteIPRotationRequest(obj as api.CompleteIPRotationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5830,7 +5897,7 @@
               arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5842,8 +5909,9 @@
       var arg_zone = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateClusterRequest.fromJson(json);
-        checkCreateClusterRequest(obj);
+        var obj = api.CreateClusterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateClusterRequest(obj as api.CreateClusterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5900,7 +5968,7 @@
       res
           .create(arg_request, arg_projectId, arg_zone, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5973,7 +6041,7 @@
           .delete(arg_projectId, arg_zone, arg_clusterId,
               name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6046,7 +6114,7 @@
           .get(arg_projectId, arg_zone, arg_clusterId,
               name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCluster(response);
+        checkCluster(response as api.Cluster);
       })));
     });
 
@@ -6059,8 +6127,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLegacyAbacRequest.fromJson(json);
-        checkSetLegacyAbacRequest(obj);
+        var obj = api.SetLegacyAbacRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLegacyAbacRequest(obj as api.SetLegacyAbacRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6127,7 +6196,7 @@
           .legacyAbac(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6196,7 +6265,7 @@
           .list(arg_projectId, arg_zone,
               parent: arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListClustersResponse(response);
+        checkListClustersResponse(response as api.ListClustersResponse);
       })));
     });
 
@@ -6209,8 +6278,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLocationsRequest.fromJson(json);
-        checkSetLocationsRequest(obj);
+        var obj = api.SetLocationsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLocationsRequest(obj as api.SetLocationsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6277,7 +6347,7 @@
           .locations(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6290,8 +6360,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLoggingServiceRequest.fromJson(json);
-        checkSetLoggingServiceRequest(obj);
+        var obj = api.SetLoggingServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLoggingServiceRequest(obj as api.SetLoggingServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6358,7 +6429,7 @@
           .logging(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6371,8 +6442,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateMasterRequest.fromJson(json);
-        checkUpdateMasterRequest(obj);
+        var obj = api.UpdateMasterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateMasterRequest(obj as api.UpdateMasterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6439,7 +6511,7 @@
           .master(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6452,8 +6524,10 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetMonitoringServiceRequest.fromJson(json);
-        checkSetMonitoringServiceRequest(obj);
+        var obj = api.SetMonitoringServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetMonitoringServiceRequest(
+            obj as api.SetMonitoringServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6520,7 +6594,7 @@
           .monitoring(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6533,8 +6607,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetLabelsRequest.fromJson(json);
-        checkSetLabelsRequest(obj);
+        var obj = api.SetLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetLabelsRequest(obj as api.SetLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6601,7 +6676,7 @@
           .resourceLabels(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6614,8 +6689,10 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetMaintenancePolicyRequest.fromJson(json);
-        checkSetMaintenancePolicyRequest(obj);
+        var obj = api.SetMaintenancePolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetMaintenancePolicyRequest(
+            obj as api.SetMaintenancePolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6683,7 +6760,7 @@
               arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6696,8 +6773,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetMasterAuthRequest.fromJson(json);
-        checkSetMasterAuthRequest(obj);
+        var obj = api.SetMasterAuthRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetMasterAuthRequest(obj as api.SetMasterAuthRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6764,7 +6842,7 @@
           .setMasterAuth(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6777,8 +6855,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNetworkPolicyRequest.fromJson(json);
-        checkSetNetworkPolicyRequest(obj);
+        var obj = api.SetNetworkPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNetworkPolicyRequest(obj as api.SetNetworkPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6845,7 +6924,7 @@
           .setNetworkPolicy(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6858,8 +6937,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartIPRotationRequest.fromJson(json);
-        checkStartIPRotationRequest(obj);
+        var obj = api.StartIPRotationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartIPRotationRequest(obj as api.StartIPRotationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6926,7 +7006,7 @@
           .startIpRotation(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6939,8 +7019,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateClusterRequest.fromJson(json);
-        checkUpdateClusterRequest(obj);
+        var obj = api.UpdateClusterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateClusterRequest(obj as api.UpdateClusterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7001,7 +7082,7 @@
           .update(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -7017,8 +7098,10 @@
       var arg_nodePoolId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNodePoolAutoscalingRequest.fromJson(json);
-        checkSetNodePoolAutoscalingRequest(obj);
+        var obj = api.SetNodePoolAutoscalingRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNodePoolAutoscalingRequest(
+            obj as api.SetNodePoolAutoscalingRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7095,7 +7178,7 @@
               arg_nodePoolId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7108,8 +7191,9 @@
       var arg_clusterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateNodePoolRequest.fromJson(json);
-        checkCreateNodePoolRequest(obj);
+        var obj = api.CreateNodePoolRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateNodePoolRequest(obj as api.CreateNodePoolRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7176,7 +7260,7 @@
           .create(arg_request, arg_projectId, arg_zone, arg_clusterId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7259,7 +7343,7 @@
           .delete(arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId,
               name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7342,7 +7426,7 @@
           .get(arg_projectId, arg_zone, arg_clusterId, arg_nodePoolId,
               name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNodePool(response);
+        checkNodePool(response as api.NodePool);
       })));
     });
 
@@ -7421,7 +7505,7 @@
           .list(arg_projectId, arg_zone, arg_clusterId,
               parent: arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNodePoolsResponse(response);
+        checkListNodePoolsResponse(response as api.ListNodePoolsResponse);
       })));
     });
 
@@ -7435,8 +7519,10 @@
       var arg_nodePoolId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RollbackNodePoolUpgradeRequest.fromJson(json);
-        checkRollbackNodePoolUpgradeRequest(obj);
+        var obj = api.RollbackNodePoolUpgradeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRollbackNodePoolUpgradeRequest(
+            obj as api.RollbackNodePoolUpgradeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7513,7 +7599,7 @@
               arg_nodePoolId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7527,8 +7613,10 @@
       var arg_nodePoolId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNodePoolManagementRequest.fromJson(json);
-        checkSetNodePoolManagementRequest(obj);
+        var obj = api.SetNodePoolManagementRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNodePoolManagementRequest(
+            obj as api.SetNodePoolManagementRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7605,7 +7693,7 @@
               arg_nodePoolId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7619,8 +7707,9 @@
       var arg_nodePoolId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetNodePoolSizeRequest.fromJson(json);
-        checkSetNodePoolSizeRequest(obj);
+        var obj = api.SetNodePoolSizeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetNodePoolSizeRequest(obj as api.SetNodePoolSizeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7697,7 +7786,7 @@
               arg_nodePoolId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7711,8 +7800,9 @@
       var arg_nodePoolId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateNodePoolRequest.fromJson(json);
-        checkUpdateNodePoolRequest(obj);
+        var obj = api.UpdateNodePoolRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateNodePoolRequest(obj as api.UpdateNodePoolRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7789,7 +7879,7 @@
               arg_nodePoolId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -7804,8 +7894,9 @@
       var arg_operationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7872,7 +7963,7 @@
           .cancel(arg_request, arg_projectId, arg_zone, arg_operationId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -7945,7 +8036,7 @@
           .get(arg_projectId, arg_zone, arg_operationId,
               name: arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -8014,7 +8105,7 @@
           .list(arg_projectId, arg_zone,
               parent: arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/content/v2_1_test.dart b/generated/googleapis/test/content/v2_1_test.dart
index 233f748..c9f1574 100644
--- a/generated/googleapis/test/content/v2_1_test.dart
+++ b/generated/googleapis/test/content/v2_1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed3669(core.List<api.AccountAdsLink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountAdsLink(o[0]);
-  checkAccountAdsLink(o[1]);
+  checkAccountAdsLink(o[0] as api.AccountAdsLink);
+  checkAccountAdsLink(o[1] as api.AccountAdsLink);
 }
 
 core.List<core.String> buildUnnamed3670() {
@@ -109,8 +109,8 @@
 
 void checkUnnamed3671(core.List<api.AccountUser> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountUser(o[0]);
-  checkAccountUser(o[1]);
+  checkAccountUser(o[0] as api.AccountUser);
+  checkAccountUser(o[1] as api.AccountUser);
 }
 
 core.List<api.AccountYouTubeChannelLink> buildUnnamed3672() {
@@ -122,8 +122,8 @@
 
 void checkUnnamed3672(core.List<api.AccountYouTubeChannelLink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountYouTubeChannelLink(o[0]);
-  checkAccountYouTubeChannelLink(o[1]);
+  checkAccountYouTubeChannelLink(o[0] as api.AccountYouTubeChannelLink);
+  checkAccountYouTubeChannelLink(o[1] as api.AccountYouTubeChannelLink);
 }
 
 core.int buildCounterAccount = 0;
@@ -154,9 +154,11 @@
   if (buildCounterAccount < 3) {
     checkUnnamed3669(o.adsLinks);
     unittest.expect(o.adultContent, unittest.isTrue);
-    checkAccountBusinessInformation(o.businessInformation);
+    checkAccountBusinessInformation(
+        o.businessInformation as api.AccountBusinessInformation);
     unittest.expect(o.cssId, unittest.equals('foo'));
-    checkAccountGoogleMyBusinessLink(o.googleMyBusinessLink);
+    checkAccountGoogleMyBusinessLink(
+        o.googleMyBusinessLink as api.AccountGoogleMyBusinessLink);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3670(o.labelIds);
@@ -233,8 +235,9 @@
 void checkAccountBusinessInformation(api.AccountBusinessInformation o) {
   buildCounterAccountBusinessInformation++;
   if (buildCounterAccountBusinessInformation < 3) {
-    checkAccountAddress(o.address);
-    checkAccountCustomerService(o.customerService);
+    checkAccountAddress(o.address as api.AccountAddress);
+    checkAccountCustomerService(
+        o.customerService as api.AccountCustomerService);
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
   }
   buildCounterAccountBusinessInformation--;
@@ -316,8 +319,10 @@
 
 void checkUnnamed3673(core.List<api.AccountStatusAccountLevelIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountStatusAccountLevelIssue(o[0]);
-  checkAccountStatusAccountLevelIssue(o[1]);
+  checkAccountStatusAccountLevelIssue(
+      o[0] as api.AccountStatusAccountLevelIssue);
+  checkAccountStatusAccountLevelIssue(
+      o[1] as api.AccountStatusAccountLevelIssue);
 }
 
 core.List<api.AccountStatusProducts> buildUnnamed3674() {
@@ -329,8 +334,8 @@
 
 void checkUnnamed3674(core.List<api.AccountStatusProducts> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountStatusProducts(o[0]);
-  checkAccountStatusProducts(o[1]);
+  checkAccountStatusProducts(o[0] as api.AccountStatusProducts);
+  checkAccountStatusProducts(o[1] as api.AccountStatusProducts);
 }
 
 core.int buildCounterAccountStatus = 0;
@@ -433,8 +438,8 @@
 
 void checkUnnamed3675(core.List<api.AccountStatusItemLevelIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountStatusItemLevelIssue(o[0]);
-  checkAccountStatusItemLevelIssue(o[1]);
+  checkAccountStatusItemLevelIssue(o[0] as api.AccountStatusItemLevelIssue);
+  checkAccountStatusItemLevelIssue(o[1] as api.AccountStatusItemLevelIssue);
 }
 
 core.int buildCounterAccountStatusProducts = 0;
@@ -459,7 +464,7 @@
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.destination, unittest.equals('foo'));
     checkUnnamed3675(o.itemLevelIssues);
-    checkAccountStatusStatistics(o.statistics);
+    checkAccountStatusStatistics(o.statistics as api.AccountStatusStatistics);
   }
   buildCounterAccountStatusProducts--;
 }
@@ -498,8 +503,8 @@
 
 void checkUnnamed3676(core.List<api.AccountTaxTaxRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountTaxTaxRule(o[0]);
-  checkAccountTaxTaxRule(o[1]);
+  checkAccountTaxTaxRule(o[0] as api.AccountTaxTaxRule);
+  checkAccountTaxTaxRule(o[1] as api.AccountTaxTaxRule);
 }
 
 core.int buildCounterAccountTax = 0;
@@ -609,8 +614,8 @@
 
 void checkUnnamed3677(core.List<api.AccountIdentifier> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountIdentifier(o[0]);
-  checkAccountIdentifier(o[1]);
+  checkAccountIdentifier(o[0] as api.AccountIdentifier);
+  checkAccountIdentifier(o[1] as api.AccountIdentifier);
 }
 
 core.int buildCounterAccountsAuthInfoResponse = 0;
@@ -662,8 +667,10 @@
 
 void checkUnnamed3678(core.List<api.AccountsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountsCustomBatchRequestEntry(o[0]);
-  checkAccountsCustomBatchRequestEntry(o[1]);
+  checkAccountsCustomBatchRequestEntry(
+      o[0] as api.AccountsCustomBatchRequestEntry);
+  checkAccountsCustomBatchRequestEntry(
+      o[1] as api.AccountsCustomBatchRequestEntry);
 }
 
 core.int buildCounterAccountsCustomBatchRequest = 0;
@@ -722,12 +729,13 @@
     api.AccountsCustomBatchRequestEntry o) {
   buildCounterAccountsCustomBatchRequestEntry++;
   if (buildCounterAccountsCustomBatchRequestEntry < 3) {
-    checkAccount(o.account);
+    checkAccount(o.account as api.Account);
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.batchId, unittest.equals(42));
     unittest.expect(o.force, unittest.isTrue);
     checkUnnamed3679(o.labelIds);
-    checkAccountsCustomBatchRequestEntryLinkRequest(o.linkRequest);
+    checkAccountsCustomBatchRequestEntryLinkRequest(
+        o.linkRequest as api.AccountsCustomBatchRequestEntryLinkRequest);
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.overwrite, unittest.isTrue);
@@ -785,8 +793,10 @@
 
 void checkUnnamed3681(core.List<api.AccountsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountsCustomBatchResponseEntry(o[0]);
-  checkAccountsCustomBatchResponseEntry(o[1]);
+  checkAccountsCustomBatchResponseEntry(
+      o[0] as api.AccountsCustomBatchResponseEntry);
+  checkAccountsCustomBatchResponseEntry(
+      o[1] as api.AccountsCustomBatchResponseEntry);
 }
 
 core.int buildCounterAccountsCustomBatchResponse = 0;
@@ -828,9 +838,9 @@
     api.AccountsCustomBatchResponseEntry o) {
   buildCounterAccountsCustomBatchResponseEntry++;
   if (buildCounterAccountsCustomBatchResponseEntry < 3) {
-    checkAccount(o.account);
+    checkAccount(o.account as api.Account);
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccountsCustomBatchResponseEntry--;
@@ -902,8 +912,8 @@
 
 void checkUnnamed3683(core.List<api.LinkedAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLinkedAccount(o[0]);
-  checkLinkedAccount(o[1]);
+  checkLinkedAccount(o[0] as api.LinkedAccount);
+  checkLinkedAccount(o[1] as api.LinkedAccount);
 }
 
 core.int buildCounterAccountsListLinksResponse = 0;
@@ -938,8 +948,8 @@
 
 void checkUnnamed3684(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccountsListResponse = 0;
@@ -1025,8 +1035,10 @@
 
 void checkUnnamed3686(core.List<api.AccountstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountstatusesCustomBatchRequestEntry(o[0]);
-  checkAccountstatusesCustomBatchRequestEntry(o[1]);
+  checkAccountstatusesCustomBatchRequestEntry(
+      o[0] as api.AccountstatusesCustomBatchRequestEntry);
+  checkAccountstatusesCustomBatchRequestEntry(
+      o[1] as api.AccountstatusesCustomBatchRequestEntry);
 }
 
 core.int buildCounterAccountstatusesCustomBatchRequest = 0;
@@ -1101,8 +1113,10 @@
 void checkUnnamed3688(
     core.List<api.AccountstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountstatusesCustomBatchResponseEntry(o[0]);
-  checkAccountstatusesCustomBatchResponseEntry(o[1]);
+  checkAccountstatusesCustomBatchResponseEntry(
+      o[0] as api.AccountstatusesCustomBatchResponseEntry);
+  checkAccountstatusesCustomBatchResponseEntry(
+      o[1] as api.AccountstatusesCustomBatchResponseEntry);
 }
 
 core.int buildCounterAccountstatusesCustomBatchResponse = 0;
@@ -1146,9 +1160,9 @@
     api.AccountstatusesCustomBatchResponseEntry o) {
   buildCounterAccountstatusesCustomBatchResponseEntry++;
   if (buildCounterAccountstatusesCustomBatchResponseEntry < 3) {
-    checkAccountStatus(o.accountStatus);
+    checkAccountStatus(o.accountStatus as api.AccountStatus);
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
   }
   buildCounterAccountstatusesCustomBatchResponseEntry--;
 }
@@ -1162,8 +1176,8 @@
 
 void checkUnnamed3689(core.List<api.AccountStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountStatus(o[0]);
-  checkAccountStatus(o[1]);
+  checkAccountStatus(o[0] as api.AccountStatus);
+  checkAccountStatus(o[1] as api.AccountStatus);
 }
 
 core.int buildCounterAccountstatusesListResponse = 0;
@@ -1198,8 +1212,10 @@
 
 void checkUnnamed3690(core.List<api.AccounttaxCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccounttaxCustomBatchRequestEntry(o[0]);
-  checkAccounttaxCustomBatchRequestEntry(o[1]);
+  checkAccounttaxCustomBatchRequestEntry(
+      o[0] as api.AccounttaxCustomBatchRequestEntry);
+  checkAccounttaxCustomBatchRequestEntry(
+      o[1] as api.AccounttaxCustomBatchRequestEntry);
 }
 
 core.int buildCounterAccounttaxCustomBatchRequest = 0;
@@ -1241,7 +1257,7 @@
   buildCounterAccounttaxCustomBatchRequestEntry++;
   if (buildCounterAccounttaxCustomBatchRequestEntry < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkAccountTax(o.accountTax);
+    checkAccountTax(o.accountTax as api.AccountTax);
     unittest.expect(o.batchId, unittest.equals(42));
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
@@ -1258,8 +1274,10 @@
 
 void checkUnnamed3691(core.List<api.AccounttaxCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccounttaxCustomBatchResponseEntry(o[0]);
-  checkAccounttaxCustomBatchResponseEntry(o[1]);
+  checkAccounttaxCustomBatchResponseEntry(
+      o[0] as api.AccounttaxCustomBatchResponseEntry);
+  checkAccounttaxCustomBatchResponseEntry(
+      o[1] as api.AccounttaxCustomBatchResponseEntry);
 }
 
 core.int buildCounterAccounttaxCustomBatchResponse = 0;
@@ -1302,9 +1320,9 @@
     api.AccounttaxCustomBatchResponseEntry o) {
   buildCounterAccounttaxCustomBatchResponseEntry++;
   if (buildCounterAccounttaxCustomBatchResponseEntry < 3) {
-    checkAccountTax(o.accountTax);
+    checkAccountTax(o.accountTax as api.AccountTax);
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterAccounttaxCustomBatchResponseEntry--;
@@ -1319,8 +1337,8 @@
 
 void checkUnnamed3692(core.List<api.AccountTax> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountTax(o[0]);
-  checkAccountTax(o[1]);
+  checkAccountTax(o[0] as api.AccountTax);
+  checkAccountTax(o[1] as api.AccountTax);
 }
 
 core.int buildCounterAccounttaxListResponse = 0;
@@ -1361,8 +1379,8 @@
 void checkAmount(api.Amount o) {
   buildCounterAmount++;
   if (buildCounterAmount < 3) {
-    checkPrice(o.priceAmount);
-    checkPrice(o.taxAmount);
+    checkPrice(o.priceAmount as api.Price);
+    checkPrice(o.taxAmount as api.Price);
   }
   buildCounterAmount--;
 }
@@ -1420,7 +1438,7 @@
   if (buildCounterCarrierRate < 3) {
     unittest.expect(o.carrierName, unittest.equals('foo'));
     unittest.expect(o.carrierService, unittest.equals('foo'));
-    checkPrice(o.flatAdjustment);
+    checkPrice(o.flatAdjustment as api.Price);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.originPostalCode, unittest.equals('foo'));
     unittest.expect(o.percentageAdjustment, unittest.equals('foo'));
@@ -1473,8 +1491,8 @@
 
 void checkUnnamed3695(core.List<api.CustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttribute(o[0]);
-  checkCustomAttribute(o[1]);
+  checkCustomAttribute(o[0] as api.CustomAttribute);
+  checkCustomAttribute(o[1] as api.CustomAttribute);
 }
 
 core.int buildCounterCustomAttribute = 0;
@@ -1553,8 +1571,8 @@
 
 void checkUnnamed3696(core.List<api.DatafeedTarget> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedTarget(o[0]);
-  checkDatafeedTarget(o[1]);
+  checkDatafeedTarget(o[0] as api.DatafeedTarget);
+  checkDatafeedTarget(o[1] as api.DatafeedTarget);
 }
 
 core.int buildCounterDatafeed = 0;
@@ -1581,9 +1599,9 @@
   if (buildCounterDatafeed < 3) {
     unittest.expect(o.attributeLanguage, unittest.equals('foo'));
     unittest.expect(o.contentType, unittest.equals('foo'));
-    checkDatafeedFetchSchedule(o.fetchSchedule);
+    checkDatafeedFetchSchedule(o.fetchSchedule as api.DatafeedFetchSchedule);
     unittest.expect(o.fileName, unittest.equals('foo'));
-    checkDatafeedFormat(o.format);
+    checkDatafeedFormat(o.format as api.DatafeedFormat);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1659,8 +1677,8 @@
 
 void checkUnnamed3697(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedStatusError(o[0]);
-  checkDatafeedStatusError(o[1]);
+  checkDatafeedStatusError(o[0] as api.DatafeedStatusError);
+  checkDatafeedStatusError(o[1] as api.DatafeedStatusError);
 }
 
 core.List<api.DatafeedStatusError> buildUnnamed3698() {
@@ -1672,8 +1690,8 @@
 
 void checkUnnamed3698(core.List<api.DatafeedStatusError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedStatusError(o[0]);
-  checkDatafeedStatusError(o[1]);
+  checkDatafeedStatusError(o[0] as api.DatafeedStatusError);
+  checkDatafeedStatusError(o[1] as api.DatafeedStatusError);
 }
 
 core.int buildCounterDatafeedStatus = 0;
@@ -1722,8 +1740,8 @@
 
 void checkUnnamed3699(core.List<api.DatafeedStatusExample> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedStatusExample(o[0]);
-  checkDatafeedStatusExample(o[1]);
+  checkDatafeedStatusExample(o[0] as api.DatafeedStatusExample);
+  checkDatafeedStatusExample(o[1] as api.DatafeedStatusExample);
 }
 
 core.int buildCounterDatafeedStatusError = 0;
@@ -1834,8 +1852,10 @@
 
 void checkUnnamed3702(core.List<api.DatafeedsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedsCustomBatchRequestEntry(o[0]);
-  checkDatafeedsCustomBatchRequestEntry(o[1]);
+  checkDatafeedsCustomBatchRequestEntry(
+      o[0] as api.DatafeedsCustomBatchRequestEntry);
+  checkDatafeedsCustomBatchRequestEntry(
+      o[1] as api.DatafeedsCustomBatchRequestEntry);
 }
 
 core.int buildCounterDatafeedsCustomBatchRequest = 0;
@@ -1877,7 +1897,7 @@
   buildCounterDatafeedsCustomBatchRequestEntry++;
   if (buildCounterDatafeedsCustomBatchRequestEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkDatafeed(o.datafeed);
+    checkDatafeed(o.datafeed as api.Datafeed);
     unittest.expect(o.datafeedId, unittest.equals('foo'));
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
@@ -1894,8 +1914,10 @@
 
 void checkUnnamed3703(core.List<api.DatafeedsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedsCustomBatchResponseEntry(o[0]);
-  checkDatafeedsCustomBatchResponseEntry(o[1]);
+  checkDatafeedsCustomBatchResponseEntry(
+      o[0] as api.DatafeedsCustomBatchResponseEntry);
+  checkDatafeedsCustomBatchResponseEntry(
+      o[1] as api.DatafeedsCustomBatchResponseEntry);
 }
 
 core.int buildCounterDatafeedsCustomBatchResponse = 0;
@@ -1937,8 +1959,8 @@
   buildCounterDatafeedsCustomBatchResponseEntry++;
   if (buildCounterDatafeedsCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkDatafeed(o.datafeed);
-    checkErrors(o.errors);
+    checkDatafeed(o.datafeed as api.Datafeed);
+    checkErrors(o.errors as api.Errors);
   }
   buildCounterDatafeedsCustomBatchResponseEntry--;
 }
@@ -1971,8 +1993,8 @@
 
 void checkUnnamed3704(core.List<api.Datafeed> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeed(o[0]);
-  checkDatafeed(o[1]);
+  checkDatafeed(o[0] as api.Datafeed);
+  checkDatafeed(o[1] as api.Datafeed);
 }
 
 core.int buildCounterDatafeedsListResponse = 0;
@@ -2008,8 +2030,10 @@
 void checkUnnamed3705(
     core.List<api.DatafeedstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedstatusesCustomBatchRequestEntry(o[0]);
-  checkDatafeedstatusesCustomBatchRequestEntry(o[1]);
+  checkDatafeedstatusesCustomBatchRequestEntry(
+      o[0] as api.DatafeedstatusesCustomBatchRequestEntry);
+  checkDatafeedstatusesCustomBatchRequestEntry(
+      o[1] as api.DatafeedstatusesCustomBatchRequestEntry);
 }
 
 core.int buildCounterDatafeedstatusesCustomBatchRequest = 0;
@@ -2074,8 +2098,10 @@
 void checkUnnamed3706(
     core.List<api.DatafeedstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedstatusesCustomBatchResponseEntry(o[0]);
-  checkDatafeedstatusesCustomBatchResponseEntry(o[1]);
+  checkDatafeedstatusesCustomBatchResponseEntry(
+      o[0] as api.DatafeedstatusesCustomBatchResponseEntry);
+  checkDatafeedstatusesCustomBatchResponseEntry(
+      o[1] as api.DatafeedstatusesCustomBatchResponseEntry);
 }
 
 core.int buildCounterDatafeedstatusesCustomBatchResponse = 0;
@@ -2120,8 +2146,8 @@
   buildCounterDatafeedstatusesCustomBatchResponseEntry++;
   if (buildCounterDatafeedstatusesCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkDatafeedStatus(o.datafeedStatus);
-    checkErrors(o.errors);
+    checkDatafeedStatus(o.datafeedStatus as api.DatafeedStatus);
+    checkErrors(o.errors as api.Errors);
   }
   buildCounterDatafeedstatusesCustomBatchResponseEntry--;
 }
@@ -2135,8 +2161,8 @@
 
 void checkUnnamed3707(core.List<api.DatafeedStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatafeedStatus(o[0]);
-  checkDatafeedStatus(o[1]);
+  checkDatafeedStatus(o[0] as api.DatafeedStatus);
+  checkDatafeedStatus(o[1] as api.DatafeedStatus);
 }
 
 core.int buildCounterDatafeedstatusesListResponse = 0;
@@ -2171,8 +2197,8 @@
 
 void checkUnnamed3708(core.List<api.HolidayCutoff> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHolidayCutoff(o[0]);
-  checkHolidayCutoff(o[1]);
+  checkHolidayCutoff(o[0] as api.HolidayCutoff);
+  checkHolidayCutoff(o[1] as api.HolidayCutoff);
 }
 
 core.int buildCounterDeliveryTime = 0;
@@ -2197,15 +2223,16 @@
 void checkDeliveryTime(api.DeliveryTime o) {
   buildCounterDeliveryTime++;
   if (buildCounterDeliveryTime < 3) {
-    checkCutoffTime(o.cutoffTime);
-    checkBusinessDayConfig(o.handlingBusinessDayConfig);
+    checkCutoffTime(o.cutoffTime as api.CutoffTime);
+    checkBusinessDayConfig(
+        o.handlingBusinessDayConfig as api.BusinessDayConfig);
     checkUnnamed3708(o.holidayCutoffs);
     unittest.expect(o.maxHandlingTimeInDays, unittest.equals(42));
     unittest.expect(o.maxTransitTimeInDays, unittest.equals(42));
     unittest.expect(o.minHandlingTimeInDays, unittest.equals(42));
     unittest.expect(o.minTransitTimeInDays, unittest.equals(42));
-    checkBusinessDayConfig(o.transitBusinessDayConfig);
-    checkTransitTable(o.transitTimeTable);
+    checkBusinessDayConfig(o.transitBusinessDayConfig as api.BusinessDayConfig);
+    checkTransitTable(o.transitTimeTable as api.TransitTable);
   }
   buildCounterDeliveryTime--;
 }
@@ -2242,8 +2269,8 @@
 
 void checkUnnamed3709(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkError(o[0]);
-  checkError(o[1]);
+  checkError(o[0] as api.Error);
+  checkError(o[1] as api.Error);
 }
 
 core.int buildCounterErrors = 0;
@@ -2278,8 +2305,8 @@
 
 void checkUnnamed3710(core.List<api.GmbAccountsGmbAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGmbAccountsGmbAccount(o[0]);
-  checkGmbAccountsGmbAccount(o[1]);
+  checkGmbAccountsGmbAccount(o[0] as api.GmbAccountsGmbAccount);
+  checkGmbAccountsGmbAccount(o[1] as api.GmbAccountsGmbAccount);
 }
 
 core.int buildCounterGmbAccounts = 0;
@@ -2337,8 +2364,8 @@
 
 void checkUnnamed3711(core.List<api.LocationIdSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocationIdSet(o[0]);
-  checkLocationIdSet(o[1]);
+  checkLocationIdSet(o[0] as api.LocationIdSet);
+  checkLocationIdSet(o[1] as api.LocationIdSet);
 }
 
 core.List<core.String> buildUnnamed3712() {
@@ -2376,8 +2403,8 @@
 
 void checkUnnamed3714(core.List<api.Price> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPrice(o[0]);
-  checkPrice(o[1]);
+  checkPrice(o[0] as api.Price);
+  checkPrice(o[1] as api.Price);
 }
 
 core.List<api.Weight> buildUnnamed3715() {
@@ -2389,8 +2416,8 @@
 
 void checkUnnamed3715(core.List<api.Weight> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWeight(o[0]);
-  checkWeight(o[1]);
+  checkWeight(o[0] as api.Weight);
+  checkWeight(o[1] as api.Weight);
 }
 
 core.int buildCounterHeaders = 0;
@@ -2491,7 +2518,7 @@
 void checkInstallment(api.Installment o) {
   buildCounterInstallment++;
   if (buildCounterInstallment < 3) {
-    checkPrice(o.amount);
+    checkPrice(o.amount as api.Price);
     unittest.expect(o.months, unittest.equals('foo'));
   }
   buildCounterInstallment--;
@@ -2506,8 +2533,10 @@
 
 void checkUnnamed3716(core.List<api.InvoiceSummaryAdditionalChargeSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInvoiceSummaryAdditionalChargeSummary(o[0]);
-  checkInvoiceSummaryAdditionalChargeSummary(o[1]);
+  checkInvoiceSummaryAdditionalChargeSummary(
+      o[0] as api.InvoiceSummaryAdditionalChargeSummary);
+  checkInvoiceSummaryAdditionalChargeSummary(
+      o[1] as api.InvoiceSummaryAdditionalChargeSummary);
 }
 
 core.int buildCounterInvoiceSummary = 0;
@@ -2526,7 +2555,7 @@
   buildCounterInvoiceSummary++;
   if (buildCounterInvoiceSummary < 3) {
     checkUnnamed3716(o.additionalChargeSummaries);
-    checkAmount(o.productTotal);
+    checkAmount(o.productTotal as api.Amount);
   }
   buildCounterInvoiceSummary--;
 }
@@ -2548,7 +2577,7 @@
     api.InvoiceSummaryAdditionalChargeSummary o) {
   buildCounterInvoiceSummaryAdditionalChargeSummary++;
   if (buildCounterInvoiceSummaryAdditionalChargeSummary < 3) {
-    checkAmount(o.totalAmount);
+    checkAmount(o.totalAmount as api.Amount);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterInvoiceSummaryAdditionalChargeSummary--;
@@ -2595,12 +2624,13 @@
 void checkLiaCountrySettings(api.LiaCountrySettings o) {
   buildCounterLiaCountrySettings++;
   if (buildCounterLiaCountrySettings < 3) {
-    checkLiaAboutPageSettings(o.about);
+    checkLiaAboutPageSettings(o.about as api.LiaAboutPageSettings);
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.hostedLocalStorefrontActive, unittest.isTrue);
-    checkLiaInventorySettings(o.inventory);
-    checkLiaOnDisplayToOrderSettings(o.onDisplayToOrder);
-    checkLiaPosDataProvider(o.posDataProvider);
+    checkLiaInventorySettings(o.inventory as api.LiaInventorySettings);
+    checkLiaOnDisplayToOrderSettings(
+        o.onDisplayToOrder as api.LiaOnDisplayToOrderSettings);
+    checkLiaPosDataProvider(o.posDataProvider as api.LiaPosDataProvider);
     unittest.expect(o.storePickupActive, unittest.isTrue);
   }
   buildCounterLiaCountrySettings--;
@@ -2684,8 +2714,8 @@
 
 void checkUnnamed3717(core.List<api.LiaCountrySettings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiaCountrySettings(o[0]);
-  checkLiaCountrySettings(o[1]);
+  checkLiaCountrySettings(o[0] as api.LiaCountrySettings);
+  checkLiaCountrySettings(o[1] as api.LiaCountrySettings);
 }
 
 core.int buildCounterLiaSettings = 0;
@@ -2720,8 +2750,10 @@
 
 void checkUnnamed3718(core.List<api.LiasettingsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiasettingsCustomBatchRequestEntry(o[0]);
-  checkLiasettingsCustomBatchRequestEntry(o[1]);
+  checkLiasettingsCustomBatchRequestEntry(
+      o[0] as api.LiasettingsCustomBatchRequestEntry);
+  checkLiasettingsCustomBatchRequestEntry(
+      o[1] as api.LiasettingsCustomBatchRequestEntry);
 }
 
 core.int buildCounterLiasettingsCustomBatchRequest = 0;
@@ -2775,7 +2807,7 @@
     unittest.expect(o.contactName, unittest.equals('foo'));
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.gmbEmail, unittest.equals('foo'));
-    checkLiaSettings(o.liaSettings);
+    checkLiaSettings(o.liaSettings as api.LiaSettings);
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.posDataProviderId, unittest.equals('foo'));
@@ -2793,8 +2825,10 @@
 
 void checkUnnamed3719(core.List<api.LiasettingsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiasettingsCustomBatchResponseEntry(o[0]);
-  checkLiasettingsCustomBatchResponseEntry(o[1]);
+  checkLiasettingsCustomBatchResponseEntry(
+      o[0] as api.LiasettingsCustomBatchResponseEntry);
+  checkLiasettingsCustomBatchResponseEntry(
+      o[1] as api.LiasettingsCustomBatchResponseEntry);
 }
 
 core.int buildCounterLiasettingsCustomBatchResponse = 0;
@@ -2827,8 +2861,8 @@
 
 void checkUnnamed3720(core.List<api.PosDataProviders> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPosDataProviders(o[0]);
-  checkPosDataProviders(o[1]);
+  checkPosDataProviders(o[0] as api.PosDataProviders);
+  checkPosDataProviders(o[1] as api.PosDataProviders);
 }
 
 core.int buildCounterLiasettingsCustomBatchResponseEntry = 0;
@@ -2853,10 +2887,10 @@
   buildCounterLiasettingsCustomBatchResponseEntry++;
   if (buildCounterLiasettingsCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
-    checkGmbAccounts(o.gmbAccounts);
+    checkErrors(o.errors as api.Errors);
+    checkGmbAccounts(o.gmbAccounts as api.GmbAccounts);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLiaSettings(o.liaSettings);
+    checkLiaSettings(o.liaSettings as api.LiaSettings);
     checkUnnamed3720(o.posDataProviders);
   }
   buildCounterLiasettingsCustomBatchResponseEntry--;
@@ -2871,8 +2905,8 @@
 
 void checkUnnamed3721(core.List<api.GmbAccountsGmbAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGmbAccountsGmbAccount(o[0]);
-  checkGmbAccountsGmbAccount(o[1]);
+  checkGmbAccountsGmbAccount(o[0] as api.GmbAccountsGmbAccount);
+  checkGmbAccountsGmbAccount(o[1] as api.GmbAccountsGmbAccount);
 }
 
 core.int buildCounterLiasettingsGetAccessibleGmbAccountsResponse = 0;
@@ -2909,8 +2943,8 @@
 
 void checkUnnamed3722(core.List<api.PosDataProviders> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPosDataProviders(o[0]);
-  checkPosDataProviders(o[1]);
+  checkPosDataProviders(o[0] as api.PosDataProviders);
+  checkPosDataProviders(o[1] as api.PosDataProviders);
 }
 
 core.int buildCounterLiasettingsListPosDataProvidersResponse = 0;
@@ -2945,8 +2979,8 @@
 
 void checkUnnamed3723(core.List<api.LiaSettings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiaSettings(o[0]);
-  checkLiaSettings(o[1]);
+  checkLiaSettings(o[0] as api.LiaSettings);
+  checkLiaSettings(o[1] as api.LiaSettings);
 }
 
 core.int buildCounterLiasettingsListResponse = 0;
@@ -3086,8 +3120,8 @@
 
 void checkUnnamed3724(core.List<api.LinkService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLinkService(o[0]);
-  checkLinkService(o[1]);
+  checkLinkService(o[0] as api.LinkService);
+  checkLinkService(o[1] as api.LinkService);
 }
 
 core.int buildCounterLinkedAccount = 0;
@@ -3139,9 +3173,9 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.pickupMethod, unittest.equals('foo'));
     unittest.expect(o.pickupSla, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.quantity, unittest.equals(42));
-    checkPrice(o.salePrice);
+    checkPrice(o.salePrice as api.Price);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
     unittest.expect(o.storeCode, unittest.equals('foo'));
   }
@@ -3157,8 +3191,10 @@
 
 void checkUnnamed3725(core.List<api.LocalinventoryCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalinventoryCustomBatchRequestEntry(o[0]);
-  checkLocalinventoryCustomBatchRequestEntry(o[1]);
+  checkLocalinventoryCustomBatchRequestEntry(
+      o[0] as api.LocalinventoryCustomBatchRequestEntry);
+  checkLocalinventoryCustomBatchRequestEntry(
+      o[1] as api.LocalinventoryCustomBatchRequestEntry);
 }
 
 core.int buildCounterLocalinventoryCustomBatchRequest = 0;
@@ -3202,7 +3238,7 @@
   buildCounterLocalinventoryCustomBatchRequestEntry++;
   if (buildCounterLocalinventoryCustomBatchRequestEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkLocalInventory(o.localInventory);
+    checkLocalInventory(o.localInventory as api.LocalInventory);
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
@@ -3219,8 +3255,10 @@
 
 void checkUnnamed3726(core.List<api.LocalinventoryCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalinventoryCustomBatchResponseEntry(o[0]);
-  checkLocalinventoryCustomBatchResponseEntry(o[1]);
+  checkLocalinventoryCustomBatchResponseEntry(
+      o[0] as api.LocalinventoryCustomBatchResponseEntry);
+  checkLocalinventoryCustomBatchResponseEntry(
+      o[1] as api.LocalinventoryCustomBatchResponseEntry);
 }
 
 core.int buildCounterLocalinventoryCustomBatchResponse = 0;
@@ -3264,7 +3302,7 @@
   buildCounterLocalinventoryCustomBatchResponseEntry++;
   if (buildCounterLocalinventoryCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterLocalinventoryCustomBatchResponseEntry--;
@@ -3334,8 +3372,8 @@
 
 void checkUnnamed3728(core.List<api.MerchantOrderReturnItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMerchantOrderReturnItem(o[0]);
-  checkMerchantOrderReturnItem(o[1]);
+  checkMerchantOrderReturnItem(o[0] as api.MerchantOrderReturnItem);
+  checkMerchantOrderReturnItem(o[1] as api.MerchantOrderReturnItem);
 }
 
 core.List<api.ReturnShipment> buildUnnamed3729() {
@@ -3347,8 +3385,8 @@
 
 void checkUnnamed3729(core.List<api.ReturnShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnShipment(o[0]);
-  checkReturnShipment(o[1]);
+  checkReturnShipment(o[0] as api.ReturnShipment);
+  checkReturnShipment(o[1] as api.ReturnShipment);
 }
 
 core.int buildCounterMerchantOrderReturn = 0;
@@ -3376,7 +3414,7 @@
     unittest.expect(o.orderId, unittest.equals('foo'));
     unittest.expect(o.orderReturnId, unittest.equals('foo'));
     checkUnnamed3728(o.returnItems);
-    checkReturnPricingInfo(o.returnPricingInfo);
+    checkReturnPricingInfo(o.returnPricingInfo as api.ReturnPricingInfo);
     checkUnnamed3729(o.returnShipments);
   }
   buildCounterMerchantOrderReturn--;
@@ -3419,12 +3457,14 @@
 void checkMerchantOrderReturnItem(api.MerchantOrderReturnItem o) {
   buildCounterMerchantOrderReturnItem++;
   if (buildCounterMerchantOrderReturnItem < 3) {
-    checkCustomerReturnReason(o.customerReturnReason);
+    checkCustomerReturnReason(
+        o.customerReturnReason as api.CustomerReturnReason);
     unittest.expect(o.itemId, unittest.equals('foo'));
-    checkMerchantRejectionReason(o.merchantRejectionReason);
-    checkRefundReason(o.merchantReturnReason);
-    checkOrderLineItemProduct(o.product);
-    checkMonetaryAmount(o.refundableAmount);
+    checkMerchantRejectionReason(
+        o.merchantRejectionReason as api.MerchantRejectionReason);
+    checkRefundReason(o.merchantReturnReason as api.RefundReason);
+    checkOrderLineItemProduct(o.product as api.OrderLineItemProduct);
+    checkMonetaryAmount(o.refundableAmount as api.MonetaryAmount);
     unittest.expect(o.returnItemId, unittest.equals('foo'));
     checkUnnamed3730(o.returnShipmentIds);
     unittest.expect(o.shipmentGroupId, unittest.equals('foo'));
@@ -3465,8 +3505,10 @@
 void checkUnnamed3731(
     core.List<api.MinimumOrderValueTableStoreCodeSetWithMov> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMinimumOrderValueTableStoreCodeSetWithMov(o[0]);
-  checkMinimumOrderValueTableStoreCodeSetWithMov(o[1]);
+  checkMinimumOrderValueTableStoreCodeSetWithMov(
+      o[0] as api.MinimumOrderValueTableStoreCodeSetWithMov);
+  checkMinimumOrderValueTableStoreCodeSetWithMov(
+      o[1] as api.MinimumOrderValueTableStoreCodeSetWithMov);
 }
 
 core.int buildCounterMinimumOrderValueTable = 0;
@@ -3519,7 +3561,7 @@
   buildCounterMinimumOrderValueTableStoreCodeSetWithMov++;
   if (buildCounterMinimumOrderValueTableStoreCodeSetWithMov < 3) {
     checkUnnamed3732(o.storeCodes);
-    checkPrice(o.value);
+    checkPrice(o.value as api.Price);
   }
   buildCounterMinimumOrderValueTableStoreCodeSetWithMov--;
 }
@@ -3539,8 +3581,8 @@
 void checkMonetaryAmount(api.MonetaryAmount o) {
   buildCounterMonetaryAmount++;
   if (buildCounterMonetaryAmount < 3) {
-    checkPrice(o.priceAmount);
-    checkPrice(o.taxAmount);
+    checkPrice(o.priceAmount as api.Price);
+    checkPrice(o.taxAmount as api.Price);
   }
   buildCounterMonetaryAmount--;
 }
@@ -3554,8 +3596,8 @@
 
 void checkUnnamed3733(core.List<api.OrderOrderAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderOrderAnnotation(o[0]);
-  checkOrderOrderAnnotation(o[1]);
+  checkOrderOrderAnnotation(o[0] as api.OrderOrderAnnotation);
+  checkOrderOrderAnnotation(o[1] as api.OrderOrderAnnotation);
 }
 
 core.List<api.OrderLineItem> buildUnnamed3734() {
@@ -3567,8 +3609,8 @@
 
 void checkUnnamed3734(core.List<api.OrderLineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderLineItem(o[0]);
-  checkOrderLineItem(o[1]);
+  checkOrderLineItem(o[0] as api.OrderLineItem);
+  checkOrderLineItem(o[1] as api.OrderLineItem);
 }
 
 core.List<api.OrderPromotion> buildUnnamed3735() {
@@ -3580,8 +3622,8 @@
 
 void checkUnnamed3735(core.List<api.OrderPromotion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderPromotion(o[0]);
-  checkOrderPromotion(o[1]);
+  checkOrderPromotion(o[0] as api.OrderPromotion);
+  checkOrderPromotion(o[1] as api.OrderPromotion);
 }
 
 core.List<api.OrderRefund> buildUnnamed3736() {
@@ -3593,8 +3635,8 @@
 
 void checkUnnamed3736(core.List<api.OrderRefund> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderRefund(o[0]);
-  checkOrderRefund(o[1]);
+  checkOrderRefund(o[0] as api.OrderRefund);
+  checkOrderRefund(o[1] as api.OrderRefund);
 }
 
 core.List<api.OrderShipment> buildUnnamed3737() {
@@ -3606,8 +3648,8 @@
 
 void checkUnnamed3737(core.List<api.OrderShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderShipment(o[0]);
-  checkOrderShipment(o[1]);
+  checkOrderShipment(o[0] as api.OrderShipment);
+  checkOrderShipment(o[1] as api.OrderShipment);
 }
 
 core.int buildCounterOrder = 0;
@@ -3647,24 +3689,24 @@
   if (buildCounterOrder < 3) {
     unittest.expect(o.acknowledged, unittest.isTrue);
     checkUnnamed3733(o.annotations);
-    checkOrderAddress(o.billingAddress);
-    checkOrderCustomer(o.customer);
-    checkOrderDeliveryDetails(o.deliveryDetails);
+    checkOrderAddress(o.billingAddress as api.OrderAddress);
+    checkOrderCustomer(o.customer as api.OrderCustomer);
+    checkOrderDeliveryDetails(o.deliveryDetails as api.OrderDeliveryDetails);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3734(o.lineItems);
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.merchantOrderId, unittest.equals('foo'));
-    checkPrice(o.netPriceAmount);
-    checkPrice(o.netTaxAmount);
+    checkPrice(o.netPriceAmount as api.Price);
+    checkPrice(o.netTaxAmount as api.Price);
     unittest.expect(o.paymentStatus, unittest.equals('foo'));
-    checkOrderPickupDetails(o.pickupDetails);
+    checkOrderPickupDetails(o.pickupDetails as api.OrderPickupDetails);
     unittest.expect(o.placedDate, unittest.equals('foo'));
     checkUnnamed3735(o.promotions);
     checkUnnamed3736(o.refunds);
     checkUnnamed3737(o.shipments);
-    checkPrice(o.shippingCost);
-    checkPrice(o.shippingCostTax);
+    checkPrice(o.shippingCost as api.Price);
+    checkPrice(o.shippingCostTax as api.Price);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.taxCollector, unittest.equals('foo'));
   }
@@ -3776,8 +3818,10 @@
   if (buildCounterOrderCustomer < 3) {
     unittest.expect(o.fullName, unittest.equals('foo'));
     unittest.expect(o.invoiceReceivingEmail, unittest.equals('foo'));
-    checkOrderCustomerLoyaltyInfo(o.loyaltyInfo);
-    checkOrderCustomerMarketingRightsInfo(o.marketingRightsInfo);
+    checkOrderCustomerLoyaltyInfo(
+        o.loyaltyInfo as api.OrderCustomerLoyaltyInfo);
+    checkOrderCustomerMarketingRightsInfo(
+        o.marketingRightsInfo as api.OrderCustomerMarketingRightsInfo);
   }
   buildCounterOrderCustomer--;
 }
@@ -3842,7 +3886,7 @@
 void checkOrderDeliveryDetails(api.OrderDeliveryDetails o) {
   buildCounterOrderDeliveryDetails++;
   if (buildCounterOrderDeliveryDetails < 3) {
-    checkOrderAddress(o.address);
+    checkOrderAddress(o.address as api.OrderAddress);
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
   }
   buildCounterOrderDeliveryDetails--;
@@ -3857,8 +3901,8 @@
 
 void checkUnnamed3740(core.List<api.OrderLineItemAdjustment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderLineItemAdjustment(o[0]);
-  checkOrderLineItemAdjustment(o[1]);
+  checkOrderLineItemAdjustment(o[0] as api.OrderLineItemAdjustment);
+  checkOrderLineItemAdjustment(o[1] as api.OrderLineItemAdjustment);
 }
 
 core.List<api.OrderMerchantProvidedAnnotation> buildUnnamed3741() {
@@ -3870,8 +3914,10 @@
 
 void checkUnnamed3741(core.List<api.OrderMerchantProvidedAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderMerchantProvidedAnnotation(o[0]);
-  checkOrderMerchantProvidedAnnotation(o[1]);
+  checkOrderMerchantProvidedAnnotation(
+      o[0] as api.OrderMerchantProvidedAnnotation);
+  checkOrderMerchantProvidedAnnotation(
+      o[1] as api.OrderMerchantProvidedAnnotation);
 }
 
 core.List<api.OrderCancellation> buildUnnamed3742() {
@@ -3883,8 +3929,8 @@
 
 void checkUnnamed3742(core.List<api.OrderCancellation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderCancellation(o[0]);
-  checkOrderCancellation(o[1]);
+  checkOrderCancellation(o[0] as api.OrderCancellation);
+  checkOrderCancellation(o[1] as api.OrderCancellation);
 }
 
 core.List<api.OrderReturn> buildUnnamed3743() {
@@ -3896,8 +3942,8 @@
 
 void checkUnnamed3743(core.List<api.OrderReturn> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderReturn(o[0]);
-  checkOrderReturn(o[1]);
+  checkOrderReturn(o[0] as api.OrderReturn);
+  checkOrderReturn(o[1] as api.OrderReturn);
 }
 
 core.int buildCounterOrderLineItem = 0;
@@ -3935,8 +3981,8 @@
     checkUnnamed3741(o.annotations);
     checkUnnamed3742(o.cancellations);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkPrice(o.price);
-    checkOrderLineItemProduct(o.product);
+    checkPrice(o.price as api.Price);
+    checkOrderLineItemProduct(o.product as api.OrderLineItemProduct);
     unittest.expect(o.quantityCanceled, unittest.equals(42));
     unittest.expect(o.quantityDelivered, unittest.equals(42));
     unittest.expect(o.quantityOrdered, unittest.equals(42));
@@ -3945,10 +3991,11 @@
     unittest.expect(o.quantityReturned, unittest.equals(42));
     unittest.expect(o.quantityShipped, unittest.equals(42));
     unittest.expect(o.quantityUndeliverable, unittest.equals(42));
-    checkOrderLineItemReturnInfo(o.returnInfo);
+    checkOrderLineItemReturnInfo(o.returnInfo as api.OrderLineItemReturnInfo);
     checkUnnamed3743(o.returns);
-    checkOrderLineItemShippingDetails(o.shippingDetails);
-    checkPrice(o.tax);
+    checkOrderLineItemShippingDetails(
+        o.shippingDetails as api.OrderLineItemShippingDetails);
+    checkPrice(o.tax as api.Price);
   }
   buildCounterOrderLineItem--;
 }
@@ -3969,8 +4016,8 @@
 void checkOrderLineItemAdjustment(api.OrderLineItemAdjustment o) {
   buildCounterOrderLineItemAdjustment++;
   if (buildCounterOrderLineItemAdjustment < 3) {
-    checkPrice(o.priceAdjustment);
-    checkPrice(o.taxAdjustment);
+    checkPrice(o.priceAdjustment as api.Price);
+    checkPrice(o.taxAdjustment as api.Price);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterOrderLineItemAdjustment--;
@@ -3985,8 +4032,8 @@
 
 void checkUnnamed3744(core.List<api.OrderLineItemProductFee> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderLineItemProductFee(o[0]);
-  checkOrderLineItemProductFee(o[1]);
+  checkOrderLineItemProductFee(o[0] as api.OrderLineItemProductFee);
+  checkOrderLineItemProductFee(o[1] as api.OrderLineItemProductFee);
 }
 
 core.List<api.OrderLineItemProductVariantAttribute> buildUnnamed3745() {
@@ -3998,8 +4045,10 @@
 
 void checkUnnamed3745(core.List<api.OrderLineItemProductVariantAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderLineItemProductVariantAttribute(o[0]);
-  checkOrderLineItemProductVariantAttribute(o[1]);
+  checkOrderLineItemProductVariantAttribute(
+      o[0] as api.OrderLineItemProductVariantAttribute);
+  checkOrderLineItemProductVariantAttribute(
+      o[1] as api.OrderLineItemProductVariantAttribute);
 }
 
 core.int buildCounterOrderLineItemProduct = 0;
@@ -4040,7 +4089,7 @@
     unittest.expect(o.itemGroupId, unittest.equals('foo'));
     unittest.expect(o.mpn, unittest.equals('foo'));
     unittest.expect(o.offerId, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.shownImage, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -4064,7 +4113,7 @@
 void checkOrderLineItemProductFee(api.OrderLineItemProductFee o) {
   buildCounterOrderLineItemProductFee++;
   if (buildCounterOrderLineItemProductFee < 3) {
-    checkPrice(o.amount);
+    checkPrice(o.amount as api.Price);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterOrderLineItemProductFee--;
@@ -4135,7 +4184,8 @@
   buildCounterOrderLineItemShippingDetails++;
   if (buildCounterOrderLineItemShippingDetails < 3) {
     unittest.expect(o.deliverByDate, unittest.equals('foo'));
-    checkOrderLineItemShippingDetailsMethod(o.method);
+    checkOrderLineItemShippingDetailsMethod(
+        o.method as api.OrderLineItemShippingDetailsMethod);
     unittest.expect(o.pickupPromiseInMinutes, unittest.equals(42));
     unittest.expect(o.shipByDate, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -4222,8 +4272,8 @@
 
 void checkUnnamed3746(core.List<api.OrderPickupDetailsCollector> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderPickupDetailsCollector(o[0]);
-  checkOrderPickupDetailsCollector(o[1]);
+  checkOrderPickupDetailsCollector(o[0] as api.OrderPickupDetailsCollector);
+  checkOrderPickupDetailsCollector(o[1] as api.OrderPickupDetailsCollector);
 }
 
 core.int buildCounterOrderPickupDetails = 0;
@@ -4243,7 +4293,7 @@
 void checkOrderPickupDetails(api.OrderPickupDetails o) {
   buildCounterOrderPickupDetails++;
   if (buildCounterOrderPickupDetails < 3) {
-    checkOrderAddress(o.address);
+    checkOrderAddress(o.address as api.OrderAddress);
     checkUnnamed3746(o.collectors);
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.pickupType, unittest.equals('foo'));
@@ -4281,8 +4331,8 @@
 
 void checkUnnamed3747(core.List<api.OrderPromotionItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderPromotionItem(o[0]);
-  checkOrderPromotionItem(o[1]);
+  checkOrderPromotionItem(o[0] as api.OrderPromotionItem);
+  checkOrderPromotionItem(o[1] as api.OrderPromotionItem);
 }
 
 core.List<api.OrderPromotionItem> buildUnnamed3748() {
@@ -4294,8 +4344,8 @@
 
 void checkUnnamed3748(core.List<api.OrderPromotionItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderPromotionItem(o[0]);
-  checkOrderPromotionItem(o[1]);
+  checkOrderPromotionItem(o[0] as api.OrderPromotionItem);
+  checkOrderPromotionItem(o[1] as api.OrderPromotionItem);
 }
 
 core.int buildCounterOrderPromotion = 0;
@@ -4328,11 +4378,11 @@
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.funder, unittest.equals('foo'));
     unittest.expect(o.merchantPromotionId, unittest.equals('foo'));
-    checkPrice(o.priceValue);
+    checkPrice(o.priceValue as api.Price);
     unittest.expect(o.shortTitle, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.subtype, unittest.equals('foo'));
-    checkPrice(o.taxValue);
+    checkPrice(o.taxValue as api.Price);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -4383,7 +4433,7 @@
   buildCounterOrderRefund++;
   if (buildCounterOrderRefund < 3) {
     unittest.expect(o.actor, unittest.equals('foo'));
-    checkPrice(o.amount);
+    checkPrice(o.amount as api.Price);
     unittest.expect(o.creationDate, unittest.equals('foo'));
     unittest.expect(o.reason, unittest.equals('foo'));
     unittest.expect(o.reasonText, unittest.equals('foo'));
@@ -4409,7 +4459,7 @@
 void checkOrderReportDisbursement(api.OrderReportDisbursement o) {
   buildCounterOrderReportDisbursement++;
   if (buildCounterOrderReportDisbursement < 3) {
-    checkPrice(o.disbursementAmount);
+    checkPrice(o.disbursementAmount as api.Price);
     unittest.expect(o.disbursementCreationDate, unittest.equals('foo'));
     unittest.expect(o.disbursementDate, unittest.equals('foo'));
     unittest.expect(o.disbursementId, unittest.equals('foo'));
@@ -4440,14 +4490,14 @@
 void checkOrderReportTransaction(api.OrderReportTransaction o) {
   buildCounterOrderReportTransaction++;
   if (buildCounterOrderReportTransaction < 3) {
-    checkPrice(o.disbursementAmount);
+    checkPrice(o.disbursementAmount as api.Price);
     unittest.expect(o.disbursementCreationDate, unittest.equals('foo'));
     unittest.expect(o.disbursementDate, unittest.equals('foo'));
     unittest.expect(o.disbursementId, unittest.equals('foo'));
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.merchantOrderId, unittest.equals('foo'));
     unittest.expect(o.orderId, unittest.equals('foo'));
-    checkProductAmount(o.productAmount);
+    checkProductAmount(o.productAmount as api.ProductAmount);
     unittest.expect(o.transactionDate, unittest.equals('foo'));
   }
   buildCounterOrderReportTransaction--;
@@ -4489,8 +4539,8 @@
 
 void checkUnnamed3749(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderShipmentLineItemShipment(o[0]);
-  checkOrderShipmentLineItemShipment(o[1]);
+  checkOrderShipmentLineItemShipment(o[0] as api.OrderShipmentLineItemShipment);
+  checkOrderShipmentLineItemShipment(o[1] as api.OrderShipmentLineItemShipment);
 }
 
 core.int buildCounterOrderShipment = 0;
@@ -4520,7 +4570,8 @@
     unittest.expect(o.deliveryDate, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkUnnamed3749(o.lineItems);
-    checkOrderShipmentScheduledDeliveryDetails(o.scheduledDeliveryDetails);
+    checkOrderShipmentScheduledDeliveryDetails(o.scheduledDeliveryDetails
+        as api.OrderShipmentScheduledDeliveryDetails);
     unittest.expect(o.shipmentGroupId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.trackingId, unittest.equals('foo'));
@@ -4583,8 +4634,10 @@
 
 void checkUnnamed3750(core.List<api.ShipmentInvoiceLineItemInvoice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkShipmentInvoiceLineItemInvoice(o[0]);
-  checkShipmentInvoiceLineItemInvoice(o[1]);
+  checkShipmentInvoiceLineItemInvoice(
+      o[0] as api.ShipmentInvoiceLineItemInvoice);
+  checkShipmentInvoiceLineItemInvoice(
+      o[1] as api.ShipmentInvoiceLineItemInvoice);
 }
 
 core.int buildCounterOrderinvoicesCreateChargeInvoiceRequest = 0;
@@ -4608,7 +4661,7 @@
   buildCounterOrderinvoicesCreateChargeInvoiceRequest++;
   if (buildCounterOrderinvoicesCreateChargeInvoiceRequest < 3) {
     unittest.expect(o.invoiceId, unittest.equals('foo'));
-    checkInvoiceSummary(o.invoiceSummary);
+    checkInvoiceSummary(o.invoiceSummary as api.InvoiceSummary);
     checkUnnamed3750(o.lineItemInvoices);
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.shipmentGroupId, unittest.equals('foo'));
@@ -4648,8 +4701,8 @@
 
 void checkUnnamed3751(core.List<api.ShipmentInvoice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkShipmentInvoice(o[0]);
-  checkShipmentInvoice(o[1]);
+  checkShipmentInvoice(o[0] as api.ShipmentInvoice);
+  checkShipmentInvoice(o[1] as api.ShipmentInvoice);
 }
 
 core.int buildCounterOrderinvoicesCreateRefundInvoiceRequest = 0;
@@ -4677,9 +4730,11 @@
     unittest.expect(o.invoiceId, unittest.equals('foo'));
     unittest.expect(o.operationId, unittest.equals('foo'));
     checkOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption(
-        o.refundOnlyOption);
+        o.refundOnlyOption as api
+            .OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption);
     checkOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption(
-        o.returnOption);
+        o.returnOption as api
+            .OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption);
     checkUnnamed3751(o.shipmentInvoices);
   }
   buildCounterOrderinvoicesCreateRefundInvoiceRequest--;
@@ -4773,8 +4828,8 @@
 
 void checkUnnamed3752(core.List<api.OrderReportDisbursement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderReportDisbursement(o[0]);
-  checkOrderReportDisbursement(o[1]);
+  checkOrderReportDisbursement(o[0] as api.OrderReportDisbursement);
+  checkOrderReportDisbursement(o[1] as api.OrderReportDisbursement);
 }
 
 core.int buildCounterOrderreportsListDisbursementsResponse = 0;
@@ -4811,8 +4866,8 @@
 
 void checkUnnamed3753(core.List<api.OrderReportTransaction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderReportTransaction(o[0]);
-  checkOrderReportTransaction(o[1]);
+  checkOrderReportTransaction(o[0] as api.OrderReportTransaction);
+  checkOrderReportTransaction(o[1] as api.OrderReportTransaction);
 }
 
 core.int buildCounterOrderreportsListTransactionsResponse = 0;
@@ -4890,8 +4945,8 @@
 
 void checkUnnamed3754(core.List<api.OrderreturnsLineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderreturnsLineItem(o[0]);
-  checkOrderreturnsLineItem(o[1]);
+  checkOrderreturnsLineItem(o[0] as api.OrderreturnsLineItem);
+  checkOrderreturnsLineItem(o[1] as api.OrderreturnsLineItem);
 }
 
 core.int buildCounterOrderreturnsCreateOrderReturnRequest = 0;
@@ -4941,7 +4996,7 @@
   if (buildCounterOrderreturnsCreateOrderReturnResponse < 3) {
     unittest.expect(o.executionStatus, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkMerchantOrderReturn(o.orderReturn);
+    checkMerchantOrderReturn(o.orderReturn as api.MerchantOrderReturn);
   }
   buildCounterOrderreturnsCreateOrderReturnResponse--;
 }
@@ -4976,8 +5031,8 @@
 
 void checkUnnamed3755(core.List<api.MerchantOrderReturn> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMerchantOrderReturn(o[0]);
-  checkMerchantOrderReturn(o[1]);
+  checkMerchantOrderReturn(o[0] as api.MerchantOrderReturn);
+  checkMerchantOrderReturn(o[1] as api.MerchantOrderReturn);
 }
 
 core.int buildCounterOrderreturnsListResponse = 0;
@@ -5018,8 +5073,8 @@
 void checkOrderreturnsPartialRefund(api.OrderreturnsPartialRefund o) {
   buildCounterOrderreturnsPartialRefund++;
   if (buildCounterOrderreturnsPartialRefund < 3) {
-    checkPrice(o.priceAmount);
-    checkPrice(o.taxAmount);
+    checkPrice(o.priceAmount as api.Price);
+    checkPrice(o.taxAmount as api.Price);
   }
   buildCounterOrderreturnsPartialRefund--;
 }
@@ -5033,8 +5088,8 @@
 
 void checkUnnamed3756(core.List<api.OrderreturnsReturnItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderreturnsReturnItem(o[0]);
-  checkOrderreturnsReturnItem(o[1]);
+  checkOrderreturnsReturnItem(o[0] as api.OrderreturnsReturnItem);
+  checkOrderreturnsReturnItem(o[1] as api.OrderreturnsReturnItem);
 }
 
 core.int buildCounterOrderreturnsProcessRequest = 0;
@@ -5056,7 +5111,8 @@
   if (buildCounterOrderreturnsProcessRequest < 3) {
     unittest.expect(o.fullChargeReturnShippingCost, unittest.isTrue);
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkOrderreturnsRefundOperation(o.refundShippingFee);
+    checkOrderreturnsRefundOperation(
+        o.refundShippingFee as api.OrderreturnsRefundOperation);
     checkUnnamed3756(o.returnItems);
   }
   buildCounterOrderreturnsProcessRequest--;
@@ -5102,7 +5158,8 @@
   buildCounterOrderreturnsRefundOperation++;
   if (buildCounterOrderreturnsRefundOperation < 3) {
     unittest.expect(o.fullRefund, unittest.isTrue);
-    checkOrderreturnsPartialRefund(o.partialRefund);
+    checkOrderreturnsPartialRefund(
+        o.partialRefund as api.OrderreturnsPartialRefund);
     unittest.expect(o.paymentType, unittest.equals('foo'));
     unittest.expect(o.reasonText, unittest.equals('foo'));
     unittest.expect(o.returnRefundReason, unittest.equals('foo'));
@@ -5147,8 +5204,10 @@
 void checkOrderreturnsReturnItem(api.OrderreturnsReturnItem o) {
   buildCounterOrderreturnsReturnItem++;
   if (buildCounterOrderreturnsReturnItem < 3) {
-    checkOrderreturnsRefundOperation(o.refund);
-    checkOrderreturnsRejectOperation(o.reject);
+    checkOrderreturnsRefundOperation(
+        o.refund as api.OrderreturnsRefundOperation);
+    checkOrderreturnsRejectOperation(
+        o.reject as api.OrderreturnsRejectOperation);
     unittest.expect(o.returnItemId, unittest.equals('foo'));
   }
   buildCounterOrderreturnsReturnItem--;
@@ -5367,7 +5426,7 @@
   if (buildCounterOrdersCreateTestOrderRequest < 3) {
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.templateName, unittest.equals('foo'));
-    checkTestOrder(o.testOrder);
+    checkTestOrder(o.testOrder as api.TestOrder);
   }
   buildCounterOrdersCreateTestOrderRequest--;
 }
@@ -5404,8 +5463,10 @@
 void checkUnnamed3757(
     core.List<api.OrdersCustomBatchRequestEntryCreateTestReturnReturnItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrdersCustomBatchRequestEntryCreateTestReturnReturnItem(o[0]);
-  checkOrdersCustomBatchRequestEntryCreateTestReturnReturnItem(o[1]);
+  checkOrdersCustomBatchRequestEntryCreateTestReturnReturnItem(
+      o[0] as api.OrdersCustomBatchRequestEntryCreateTestReturnReturnItem);
+  checkOrdersCustomBatchRequestEntryCreateTestReturnReturnItem(
+      o[1] as api.OrdersCustomBatchRequestEntryCreateTestReturnReturnItem);
 }
 
 core.int buildCounterOrdersCreateTestReturnRequest = 0;
@@ -5492,7 +5553,7 @@
     api.OrdersCustomBatchRequestEntryRefundItemItem o) {
   buildCounterOrdersCustomBatchRequestEntryRefundItemItem++;
   if (buildCounterOrdersCustomBatchRequestEntryRefundItemItem < 3) {
-    checkMonetaryAmount(o.amount);
+    checkMonetaryAmount(o.amount as api.MonetaryAmount);
     unittest.expect(o.fullRefund, unittest.isTrue);
     unittest.expect(o.lineItemId, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
@@ -5518,7 +5579,7 @@
     api.OrdersCustomBatchRequestEntryRefundItemShipping o) {
   buildCounterOrdersCustomBatchRequestEntryRefundItemShipping++;
   if (buildCounterOrdersCustomBatchRequestEntryRefundItemShipping < 3) {
-    checkPrice(o.amount);
+    checkPrice(o.amount as api.Price);
     unittest.expect(o.fullRefund, unittest.isTrue);
   }
   buildCounterOrdersCustomBatchRequestEntryRefundItemShipping--;
@@ -5567,7 +5628,7 @@
   buildCounterOrdersGetByMerchantOrderIdResponse++;
   if (buildCounterOrdersGetByMerchantOrderIdResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkOrder(o.order);
+    checkOrder(o.order as api.Order);
   }
   buildCounterOrdersGetByMerchantOrderIdResponse--;
 }
@@ -5590,7 +5651,7 @@
   buildCounterOrdersGetTestOrderTemplateResponse++;
   if (buildCounterOrdersGetTestOrderTemplateResponse < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkTestOrder(o.template);
+    checkTestOrder(o.template as api.TestOrder);
   }
   buildCounterOrdersGetTestOrderTemplateResponse--;
 }
@@ -5620,12 +5681,12 @@
   if (buildCounterOrdersInStoreRefundLineItemRequest < 3) {
     unittest.expect(o.lineItemId, unittest.equals('foo'));
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkPrice(o.priceAmount);
+    checkPrice(o.priceAmount as api.Price);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.quantity, unittest.equals(42));
     unittest.expect(o.reason, unittest.equals('foo'));
     unittest.expect(o.reasonText, unittest.equals('foo'));
-    checkPrice(o.taxAmount);
+    checkPrice(o.taxAmount as api.Price);
   }
   buildCounterOrdersInStoreRefundLineItemRequest--;
 }
@@ -5662,8 +5723,8 @@
 
 void checkUnnamed3758(core.List<api.Order> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrder(o[0]);
-  checkOrder(o[1]);
+  checkOrder(o[0] as api.Order);
+  checkOrder(o[1] as api.Order);
 }
 
 core.int buildCounterOrdersListResponse = 0;
@@ -5699,8 +5760,10 @@
 void checkUnnamed3759(
     core.List<api.OrdersCustomBatchRequestEntryRefundItemItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrdersCustomBatchRequestEntryRefundItemItem(o[0]);
-  checkOrdersCustomBatchRequestEntryRefundItemItem(o[1]);
+  checkOrdersCustomBatchRequestEntryRefundItemItem(
+      o[0] as api.OrdersCustomBatchRequestEntryRefundItemItem);
+  checkOrdersCustomBatchRequestEntryRefundItemItem(
+      o[1] as api.OrdersCustomBatchRequestEntryRefundItemItem);
 }
 
 core.int buildCounterOrdersRefundItemRequest = 0;
@@ -5725,7 +5788,8 @@
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.reason, unittest.equals('foo'));
     unittest.expect(o.reasonText, unittest.equals('foo'));
-    checkOrdersCustomBatchRequestEntryRefundItemShipping(o.shipping);
+    checkOrdersCustomBatchRequestEntryRefundItemShipping(
+        o.shipping as api.OrdersCustomBatchRequestEntryRefundItemShipping);
   }
   buildCounterOrdersRefundItemRequest--;
 }
@@ -5769,7 +5833,7 @@
 void checkOrdersRefundOrderRequest(api.OrdersRefundOrderRequest o) {
   buildCounterOrdersRefundOrderRequest++;
   if (buildCounterOrdersRefundOrderRequest < 3) {
-    checkMonetaryAmount(o.amount);
+    checkMonetaryAmount(o.amount as api.MonetaryAmount);
     unittest.expect(o.fullRefund, unittest.isTrue);
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.reason, unittest.equals('foo'));
@@ -5876,12 +5940,12 @@
   if (buildCounterOrdersReturnRefundLineItemRequest < 3) {
     unittest.expect(o.lineItemId, unittest.equals('foo'));
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkPrice(o.priceAmount);
+    checkPrice(o.priceAmount as api.Price);
     unittest.expect(o.productId, unittest.equals('foo'));
     unittest.expect(o.quantity, unittest.equals(42));
     unittest.expect(o.reason, unittest.equals('foo'));
     unittest.expect(o.reasonText, unittest.equals('foo'));
-    checkPrice(o.taxAmount);
+    checkPrice(o.taxAmount as api.Price);
   }
   buildCounterOrdersReturnRefundLineItemRequest--;
 }
@@ -5918,8 +5982,10 @@
 
 void checkUnnamed3760(core.List<api.OrderMerchantProvidedAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderMerchantProvidedAnnotation(o[0]);
-  checkOrderMerchantProvidedAnnotation(o[1]);
+  checkOrderMerchantProvidedAnnotation(
+      o[0] as api.OrderMerchantProvidedAnnotation);
+  checkOrderMerchantProvidedAnnotation(
+      o[1] as api.OrderMerchantProvidedAnnotation);
 }
 
 core.int buildCounterOrdersSetLineItemMetadataRequest = 0;
@@ -5979,8 +6045,8 @@
 
 void checkUnnamed3761(core.List<api.OrderShipmentLineItemShipment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderShipmentLineItemShipment(o[0]);
-  checkOrderShipmentLineItemShipment(o[1]);
+  checkOrderShipmentLineItemShipment(o[0] as api.OrderShipmentLineItemShipment);
+  checkOrderShipmentLineItemShipment(o[1] as api.OrderShipmentLineItemShipment);
 }
 
 core.List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo>
@@ -5994,8 +6060,10 @@
 void checkUnnamed3762(
     core.List<api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(o[0]);
-  checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(o[1]);
+  checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(
+      o[0] as api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo);
+  checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(
+      o[1] as api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo);
 }
 
 core.int buildCounterOrdersShipLineItemsRequest = 0;
@@ -6251,8 +6319,8 @@
 
 void checkUnnamed3763(core.List<api.PosCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPosCustomBatchRequestEntry(o[0]);
-  checkPosCustomBatchRequestEntry(o[1]);
+  checkPosCustomBatchRequestEntry(o[0] as api.PosCustomBatchRequestEntry);
+  checkPosCustomBatchRequestEntry(o[1] as api.PosCustomBatchRequestEntry);
 }
 
 core.int buildCounterPosCustomBatchRequest = 0;
@@ -6296,11 +6364,11 @@
   buildCounterPosCustomBatchRequestEntry++;
   if (buildCounterPosCustomBatchRequestEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkPosInventory(o.inventory);
+    checkPosInventory(o.inventory as api.PosInventory);
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
-    checkPosSale(o.sale);
-    checkPosStore(o.store);
+    checkPosSale(o.sale as api.PosSale);
+    checkPosStore(o.store as api.PosStore);
     unittest.expect(o.storeCode, unittest.equals('foo'));
     unittest.expect(o.targetMerchantId, unittest.equals('foo'));
   }
@@ -6316,8 +6384,8 @@
 
 void checkUnnamed3764(core.List<api.PosCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPosCustomBatchResponseEntry(o[0]);
-  checkPosCustomBatchResponseEntry(o[1]);
+  checkPosCustomBatchResponseEntry(o[0] as api.PosCustomBatchResponseEntry);
+  checkPosCustomBatchResponseEntry(o[1] as api.PosCustomBatchResponseEntry);
 }
 
 core.int buildCounterPosCustomBatchResponse = 0;
@@ -6361,11 +6429,11 @@
   buildCounterPosCustomBatchResponseEntry++;
   if (buildCounterPosCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
-    checkPosInventory(o.inventory);
+    checkErrors(o.errors as api.Errors);
+    checkPosInventory(o.inventory as api.PosInventory);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPosSale(o.sale);
-    checkPosStore(o.store);
+    checkPosSale(o.sale as api.PosSale);
+    checkPosStore(o.store as api.PosStore);
   }
   buildCounterPosCustomBatchResponseEntry--;
 }
@@ -6379,8 +6447,10 @@
 
 void checkUnnamed3765(core.List<api.PosDataProvidersPosDataProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPosDataProvidersPosDataProvider(o[0]);
-  checkPosDataProvidersPosDataProvider(o[1]);
+  checkPosDataProvidersPosDataProvider(
+      o[0] as api.PosDataProvidersPosDataProvider);
+  checkPosDataProvidersPosDataProvider(
+      o[1] as api.PosDataProvidersPosDataProvider);
 }
 
 core.int buildCounterPosDataProviders = 0;
@@ -6454,7 +6524,7 @@
     unittest.expect(o.gtin, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.quantity, unittest.equals('foo'));
     unittest.expect(o.storeCode, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
@@ -6487,7 +6557,7 @@
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
     unittest.expect(o.gtin, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.quantity, unittest.equals('foo'));
     unittest.expect(o.storeCode, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
@@ -6522,7 +6592,7 @@
     unittest.expect(o.gtin, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.quantity, unittest.equals('foo'));
     unittest.expect(o.storeCode, unittest.equals('foo'));
     unittest.expect(o.targetCountry, unittest.equals('foo'));
@@ -6540,8 +6610,8 @@
 
 void checkUnnamed3766(core.List<api.PosStore> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPosStore(o[0]);
-  checkPosStore(o[1]);
+  checkPosStore(o[0] as api.PosStore);
+  checkPosStore(o[1] as api.PosStore);
 }
 
 core.int buildCounterPosListResponse = 0;
@@ -6592,7 +6662,7 @@
     unittest.expect(o.gtin, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.quantity, unittest.equals('foo'));
     unittest.expect(o.saleId, unittest.equals('foo'));
     unittest.expect(o.storeCode, unittest.equals('foo'));
@@ -6627,7 +6697,7 @@
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
     unittest.expect(o.gtin, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.quantity, unittest.equals('foo'));
     unittest.expect(o.saleId, unittest.equals('foo'));
     unittest.expect(o.storeCode, unittest.equals('foo'));
@@ -6664,7 +6734,7 @@
     unittest.expect(o.gtin, unittest.equals('foo'));
     unittest.expect(o.itemId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.quantity, unittest.equals('foo'));
     unittest.expect(o.saleId, unittest.equals('foo'));
     unittest.expect(o.storeCode, unittest.equals('foo'));
@@ -6706,8 +6776,8 @@
 
 void checkUnnamed3767(core.List<api.PostalCodeRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPostalCodeRange(o[0]);
-  checkPostalCodeRange(o[1]);
+  checkPostalCodeRange(o[0] as api.PostalCodeRange);
+  checkPostalCodeRange(o[1] as api.PostalCodeRange);
 }
 
 core.int buildCounterPostalCodeGroup = 0;
@@ -6810,8 +6880,8 @@
 
 void checkUnnamed3770(core.List<api.CustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttribute(o[0]);
-  checkCustomAttribute(o[1]);
+  checkCustomAttribute(o[0] as api.CustomAttribute);
+  checkCustomAttribute(o[1] as api.CustomAttribute);
 }
 
 core.List<core.String> buildUnnamed3771() {
@@ -6862,8 +6932,8 @@
 
 void checkUnnamed3774(core.List<api.ProductProductDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductProductDetail(o[0]);
-  checkProductProductDetail(o[1]);
+  checkProductProductDetail(o[0] as api.ProductProductDetail);
+  checkProductProductDetail(o[1] as api.ProductProductDetail);
 }
 
 core.List<core.String> buildUnnamed3775() {
@@ -6914,8 +6984,8 @@
 
 void checkUnnamed3778(core.List<api.ProductShipping> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductShipping(o[0]);
-  checkProductShipping(o[1]);
+  checkProductShipping(o[0] as api.ProductShipping);
+  checkProductShipping(o[1] as api.ProductShipping);
 }
 
 core.List<core.String> buildUnnamed3779() {
@@ -6953,8 +7023,8 @@
 
 void checkUnnamed3781(core.List<api.ProductTax> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductTax(o[0]);
-  checkProductTax(o[1]);
+  checkProductTax(o[0] as api.ProductTax);
+  checkProductTax(o[1] as api.ProductTax);
 }
 
 core.int buildCounterProduct = 0;
@@ -7064,7 +7134,7 @@
     unittest.expect(o.color, unittest.equals('foo'));
     unittest.expect(o.condition, unittest.equals('foo'));
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
-    checkPrice(o.costOfGoodsSold);
+    checkPrice(o.costOfGoodsSold as api.Price);
     checkUnnamed3770(o.customAttributes);
     unittest.expect(o.customLabel0, unittest.equals('foo'));
     unittest.expect(o.customLabel1, unittest.equals('foo'));
@@ -7087,12 +7157,12 @@
     unittest.expect(o.identifierExists, unittest.isTrue);
     unittest.expect(o.imageLink, unittest.equals('foo'));
     checkUnnamed3773(o.includedDestinations);
-    checkInstallment(o.installment);
+    checkInstallment(o.installment as api.Installment);
     unittest.expect(o.isBundle, unittest.isTrue);
     unittest.expect(o.itemGroupId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.link, unittest.equals('foo'));
-    checkLoyaltyPoints(o.loyaltyPoints);
+    checkLoyaltyPoints(o.loyaltyPoints as api.LoyaltyPoints);
     unittest.expect(o.material, unittest.equals('foo'));
     unittest.expect(o.maxEnergyEfficiencyClass, unittest.equals('foo'));
     unittest.expect(o.maxHandlingTime, unittest.equals('foo'));
@@ -7103,33 +7173,39 @@
     unittest.expect(o.multipack, unittest.equals('foo'));
     unittest.expect(o.offerId, unittest.equals('foo'));
     unittest.expect(o.pattern, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     checkUnnamed3774(o.productDetails);
     checkUnnamed3775(o.productHighlights);
     checkUnnamed3776(o.productTypes);
     checkUnnamed3777(o.promotionIds);
-    checkPrice(o.salePrice);
+    checkPrice(o.salePrice as api.Price);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
     unittest.expect(o.sellOnGoogleQuantity, unittest.equals('foo'));
     checkUnnamed3778(o.shipping);
-    checkProductShippingDimension(o.shippingHeight);
+    checkProductShippingDimension(
+        o.shippingHeight as api.ProductShippingDimension);
     unittest.expect(o.shippingLabel, unittest.equals('foo'));
-    checkProductShippingDimension(o.shippingLength);
-    checkProductShippingWeight(o.shippingWeight);
-    checkProductShippingDimension(o.shippingWidth);
+    checkProductShippingDimension(
+        o.shippingLength as api.ProductShippingDimension);
+    checkProductShippingWeight(o.shippingWeight as api.ProductShippingWeight);
+    checkProductShippingDimension(
+        o.shippingWidth as api.ProductShippingDimension);
     checkUnnamed3779(o.shoppingAdsExcludedCountries);
     unittest.expect(o.sizeSystem, unittest.equals('foo'));
     unittest.expect(o.sizeType, unittest.equals('foo'));
     checkUnnamed3780(o.sizes);
     unittest.expect(o.source, unittest.equals('foo'));
-    checkProductSubscriptionCost(o.subscriptionCost);
+    checkProductSubscriptionCost(
+        o.subscriptionCost as api.ProductSubscriptionCost);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
     unittest.expect(o.taxCategory, unittest.equals('foo'));
     checkUnnamed3781(o.taxes);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.transitTimeLabel, unittest.equals('foo'));
-    checkProductUnitPricingBaseMeasure(o.unitPricingBaseMeasure);
-    checkProductUnitPricingMeasure(o.unitPricingMeasure);
+    checkProductUnitPricingBaseMeasure(
+        o.unitPricingBaseMeasure as api.ProductUnitPricingBaseMeasure);
+    checkProductUnitPricingMeasure(
+        o.unitPricingMeasure as api.ProductUnitPricingMeasure);
   }
   buildCounterProduct--;
 }
@@ -7150,9 +7226,9 @@
 void checkProductAmount(api.ProductAmount o) {
   buildCounterProductAmount++;
   if (buildCounterProductAmount < 3) {
-    checkPrice(o.priceAmount);
-    checkPrice(o.remittedTaxAmount);
-    checkPrice(o.taxAmount);
+    checkPrice(o.priceAmount as api.Price);
+    checkPrice(o.remittedTaxAmount as api.Price);
+    checkPrice(o.taxAmount as api.Price);
   }
   buildCounterProductAmount--;
 }
@@ -7204,7 +7280,7 @@
     unittest.expect(o.locationGroupName, unittest.equals('foo'));
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.service, unittest.equals('foo'));
   }
@@ -7262,8 +7338,10 @@
 
 void checkUnnamed3782(core.List<api.ProductStatusDestinationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductStatusDestinationStatus(o[0]);
-  checkProductStatusDestinationStatus(o[1]);
+  checkProductStatusDestinationStatus(
+      o[0] as api.ProductStatusDestinationStatus);
+  checkProductStatusDestinationStatus(
+      o[1] as api.ProductStatusDestinationStatus);
 }
 
 core.List<api.ProductStatusItemLevelIssue> buildUnnamed3783() {
@@ -7275,8 +7353,8 @@
 
 void checkUnnamed3783(core.List<api.ProductStatusItemLevelIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductStatusItemLevelIssue(o[0]);
-  checkProductStatusItemLevelIssue(o[1]);
+  checkProductStatusItemLevelIssue(o[0] as api.ProductStatusItemLevelIssue);
+  checkProductStatusItemLevelIssue(o[1] as api.ProductStatusItemLevelIssue);
 }
 
 core.int buildCounterProductStatus = 0;
@@ -7444,7 +7522,7 @@
 void checkProductSubscriptionCost(api.ProductSubscriptionCost o) {
   buildCounterProductSubscriptionCost++;
   if (buildCounterProductSubscriptionCost < 3) {
-    checkPrice(o.amount);
+    checkPrice(o.amount as api.Price);
     unittest.expect(o.period, unittest.equals('foo'));
     unittest.expect(o.periodLength, unittest.equals('foo'));
   }
@@ -7531,8 +7609,10 @@
 
 void checkUnnamed3788(core.List<api.ProductsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductsCustomBatchRequestEntry(o[0]);
-  checkProductsCustomBatchRequestEntry(o[1]);
+  checkProductsCustomBatchRequestEntry(
+      o[0] as api.ProductsCustomBatchRequestEntry);
+  checkProductsCustomBatchRequestEntry(
+      o[1] as api.ProductsCustomBatchRequestEntry);
 }
 
 core.int buildCounterProductsCustomBatchRequest = 0;
@@ -7578,7 +7658,7 @@
     unittest.expect(o.feedId, unittest.equals('foo'));
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
-    checkProduct(o.product);
+    checkProduct(o.product as api.Product);
     unittest.expect(o.productId, unittest.equals('foo'));
   }
   buildCounterProductsCustomBatchRequestEntry--;
@@ -7593,8 +7673,10 @@
 
 void checkUnnamed3789(core.List<api.ProductsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductsCustomBatchResponseEntry(o[0]);
-  checkProductsCustomBatchResponseEntry(o[1]);
+  checkProductsCustomBatchResponseEntry(
+      o[0] as api.ProductsCustomBatchResponseEntry);
+  checkProductsCustomBatchResponseEntry(
+      o[1] as api.ProductsCustomBatchResponseEntry);
 }
 
 core.int buildCounterProductsCustomBatchResponse = 0;
@@ -7637,9 +7719,9 @@
   buildCounterProductsCustomBatchResponseEntry++;
   if (buildCounterProductsCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkProduct(o.product);
+    checkProduct(o.product as api.Product);
   }
   buildCounterProductsCustomBatchResponseEntry--;
 }
@@ -7653,8 +7735,8 @@
 
 void checkUnnamed3790(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProduct(o[0]);
-  checkProduct(o[1]);
+  checkProduct(o[0] as api.Product);
+  checkProduct(o[1] as api.Product);
 }
 
 core.int buildCounterProductsListResponse = 0;
@@ -7689,8 +7771,10 @@
 
 void checkUnnamed3791(core.List<api.ProductstatusesCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductstatusesCustomBatchRequestEntry(o[0]);
-  checkProductstatusesCustomBatchRequestEntry(o[1]);
+  checkProductstatusesCustomBatchRequestEntry(
+      o[0] as api.ProductstatusesCustomBatchRequestEntry);
+  checkProductstatusesCustomBatchRequestEntry(
+      o[1] as api.ProductstatusesCustomBatchRequestEntry);
 }
 
 core.int buildCounterProductstatusesCustomBatchRequest = 0;
@@ -7767,8 +7851,10 @@
 void checkUnnamed3793(
     core.List<api.ProductstatusesCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductstatusesCustomBatchResponseEntry(o[0]);
-  checkProductstatusesCustomBatchResponseEntry(o[1]);
+  checkProductstatusesCustomBatchResponseEntry(
+      o[0] as api.ProductstatusesCustomBatchResponseEntry);
+  checkProductstatusesCustomBatchResponseEntry(
+      o[1] as api.ProductstatusesCustomBatchResponseEntry);
 }
 
 core.int buildCounterProductstatusesCustomBatchResponse = 0;
@@ -7814,9 +7900,9 @@
   buildCounterProductstatusesCustomBatchResponseEntry++;
   if (buildCounterProductstatusesCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkProductStatus(o.productStatus);
+    checkProductStatus(o.productStatus as api.ProductStatus);
   }
   buildCounterProductstatusesCustomBatchResponseEntry--;
 }
@@ -7830,8 +7916,8 @@
 
 void checkUnnamed3794(core.List<api.ProductStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductStatus(o[0]);
-  checkProductStatus(o[1]);
+  checkProductStatus(o[0] as api.ProductStatus);
+  checkProductStatus(o[1] as api.ProductStatus);
 }
 
 core.int buildCounterProductstatusesListResponse = 0;
@@ -7915,8 +8001,8 @@
 
 void checkUnnamed3797(core.List<api.CarrierRate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCarrierRate(o[0]);
-  checkCarrierRate(o[1]);
+  checkCarrierRate(o[0] as api.CarrierRate);
+  checkCarrierRate(o[1] as api.CarrierRate);
 }
 
 core.List<api.Table> buildUnnamed3798() {
@@ -7928,8 +8014,8 @@
 
 void checkUnnamed3798(core.List<api.Table> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTable(o[0]);
-  checkTable(o[1]);
+  checkTable(o[0] as api.Table);
+  checkTable(o[1] as api.Table);
 }
 
 core.int buildCounterRateGroup = 0;
@@ -7953,9 +8039,9 @@
   if (buildCounterRateGroup < 3) {
     checkUnnamed3796(o.applicableShippingLabels);
     checkUnnamed3797(o.carrierRates);
-    checkTable(o.mainTable);
+    checkTable(o.mainTable as api.Table);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkValue(o.singleValue);
+    checkValue(o.singleValue as api.Value);
     checkUnnamed3798(o.subtables);
   }
   buildCounterRateGroup--;
@@ -7991,8 +8077,8 @@
 
 void checkUnnamed3799(core.List<api.CustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttribute(o[0]);
-  checkCustomAttribute(o[1]);
+  checkCustomAttribute(o[0] as api.CustomAttribute);
+  checkCustomAttribute(o[1] as api.CustomAttribute);
 }
 
 core.int buildCounterRegionalInventory = 0;
@@ -8018,9 +8104,9 @@
     unittest.expect(o.availability, unittest.equals('foo'));
     checkUnnamed3799(o.customAttributes);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.regionId, unittest.equals('foo'));
-    checkPrice(o.salePrice);
+    checkPrice(o.salePrice as api.Price);
     unittest.expect(o.salePriceEffectiveDate, unittest.equals('foo'));
   }
   buildCounterRegionalInventory--;
@@ -8036,8 +8122,10 @@
 void checkUnnamed3800(
     core.List<api.RegionalinventoryCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionalinventoryCustomBatchRequestEntry(o[0]);
-  checkRegionalinventoryCustomBatchRequestEntry(o[1]);
+  checkRegionalinventoryCustomBatchRequestEntry(
+      o[0] as api.RegionalinventoryCustomBatchRequestEntry);
+  checkRegionalinventoryCustomBatchRequestEntry(
+      o[1] as api.RegionalinventoryCustomBatchRequestEntry);
 }
 
 core.int buildCounterRegionalinventoryCustomBatchRequest = 0;
@@ -8085,7 +8173,7 @@
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
-    checkRegionalInventory(o.regionalInventory);
+    checkRegionalInventory(o.regionalInventory as api.RegionalInventory);
   }
   buildCounterRegionalinventoryCustomBatchRequestEntry--;
 }
@@ -8100,8 +8188,10 @@
 void checkUnnamed3801(
     core.List<api.RegionalinventoryCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegionalinventoryCustomBatchResponseEntry(o[0]);
-  checkRegionalinventoryCustomBatchResponseEntry(o[1]);
+  checkRegionalinventoryCustomBatchResponseEntry(
+      o[0] as api.RegionalinventoryCustomBatchResponseEntry);
+  checkRegionalinventoryCustomBatchResponseEntry(
+      o[1] as api.RegionalinventoryCustomBatchResponseEntry);
 }
 
 core.int buildCounterRegionalinventoryCustomBatchResponse = 0;
@@ -8147,9 +8237,9 @@
   buildCounterRegionalinventoryCustomBatchResponseEntry++;
   if (buildCounterRegionalinventoryCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkRegionalInventory(o.regionalInventory);
+    checkRegionalInventory(o.regionalInventory as api.RegionalInventory);
   }
   buildCounterRegionalinventoryCustomBatchResponseEntry--;
 }
@@ -8173,7 +8263,7 @@
 void checkReturnAddress(api.ReturnAddress o) {
   buildCounterReturnAddress++;
   if (buildCounterReturnAddress < 3) {
-    checkReturnAddressAddress(o.address);
+    checkReturnAddressAddress(o.address as api.ReturnAddressAddress);
     unittest.expect(o.country, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.label, unittest.equals('foo'));
@@ -8247,8 +8337,8 @@
 
 void checkUnnamed3804(core.List<api.ReturnPolicySeasonalOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnPolicySeasonalOverride(o[0]);
-  checkReturnPolicySeasonalOverride(o[1]);
+  checkReturnPolicySeasonalOverride(o[0] as api.ReturnPolicySeasonalOverride);
+  checkReturnPolicySeasonalOverride(o[1] as api.ReturnPolicySeasonalOverride);
 }
 
 core.int buildCounterReturnPolicy = 0;
@@ -8277,7 +8367,7 @@
     unittest.expect(o.label, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3803(o.nonFreeReturnReasons);
-    checkReturnPolicyPolicy(o.policy);
+    checkReturnPolicyPolicy(o.policy as api.ReturnPolicyPolicy);
     unittest.expect(o.returnPolicyId, unittest.equals('foo'));
     checkUnnamed3804(o.seasonalOverrides);
   }
@@ -8326,7 +8416,7 @@
   if (buildCounterReturnPolicySeasonalOverride < 3) {
     unittest.expect(o.endDate, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkReturnPolicyPolicy(o.policy);
+    checkReturnPolicyPolicy(o.policy as api.ReturnPolicyPolicy);
     unittest.expect(o.startDate, unittest.equals('foo'));
   }
   buildCounterReturnPolicySeasonalOverride--;
@@ -8351,10 +8441,10 @@
   buildCounterReturnPricingInfo++;
   if (buildCounterReturnPricingInfo < 3) {
     unittest.expect(o.chargeReturnShippingFee, unittest.isTrue);
-    checkMonetaryAmount(o.maxReturnShippingFee);
-    checkMonetaryAmount(o.refundableItemsTotalAmount);
-    checkMonetaryAmount(o.refundableShippingAmount);
-    checkMonetaryAmount(o.totalRefundedAmount);
+    checkMonetaryAmount(o.maxReturnShippingFee as api.MonetaryAmount);
+    checkMonetaryAmount(o.refundableItemsTotalAmount as api.MonetaryAmount);
+    checkMonetaryAmount(o.refundableShippingAmount as api.MonetaryAmount);
+    checkMonetaryAmount(o.totalRefundedAmount as api.MonetaryAmount);
   }
   buildCounterReturnPricingInfo--;
 }
@@ -8368,8 +8458,8 @@
 
 void checkUnnamed3805(core.List<api.ShipmentTrackingInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkShipmentTrackingInfo(o[0]);
-  checkShipmentTrackingInfo(o[1]);
+  checkShipmentTrackingInfo(o[0] as api.ShipmentTrackingInfo);
+  checkShipmentTrackingInfo(o[1] as api.ShipmentTrackingInfo);
 }
 
 core.int buildCounterReturnShipment = 0;
@@ -8412,8 +8502,10 @@
 
 void checkUnnamed3806(core.List<api.ReturnaddressCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnaddressCustomBatchRequestEntry(o[0]);
-  checkReturnaddressCustomBatchRequestEntry(o[1]);
+  checkReturnaddressCustomBatchRequestEntry(
+      o[0] as api.ReturnaddressCustomBatchRequestEntry);
+  checkReturnaddressCustomBatchRequestEntry(
+      o[1] as api.ReturnaddressCustomBatchRequestEntry);
 }
 
 core.int buildCounterReturnaddressCustomBatchRequest = 0;
@@ -8459,7 +8551,7 @@
     unittest.expect(o.batchId, unittest.equals(42));
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
-    checkReturnAddress(o.returnAddress);
+    checkReturnAddress(o.returnAddress as api.ReturnAddress);
     unittest.expect(o.returnAddressId, unittest.equals('foo'));
   }
   buildCounterReturnaddressCustomBatchRequestEntry--;
@@ -8474,8 +8566,10 @@
 
 void checkUnnamed3807(core.List<api.ReturnaddressCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnaddressCustomBatchResponseEntry(o[0]);
-  checkReturnaddressCustomBatchResponseEntry(o[1]);
+  checkReturnaddressCustomBatchResponseEntry(
+      o[0] as api.ReturnaddressCustomBatchResponseEntry);
+  checkReturnaddressCustomBatchResponseEntry(
+      o[1] as api.ReturnaddressCustomBatchResponseEntry);
 }
 
 core.int buildCounterReturnaddressCustomBatchResponse = 0;
@@ -8520,9 +8614,9 @@
   buildCounterReturnaddressCustomBatchResponseEntry++;
   if (buildCounterReturnaddressCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkReturnAddress(o.returnAddress);
+    checkReturnAddress(o.returnAddress as api.ReturnAddress);
   }
   buildCounterReturnaddressCustomBatchResponseEntry--;
 }
@@ -8536,8 +8630,8 @@
 
 void checkUnnamed3808(core.List<api.ReturnAddress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnAddress(o[0]);
-  checkReturnAddress(o[1]);
+  checkReturnAddress(o[0] as api.ReturnAddress);
+  checkReturnAddress(o[1] as api.ReturnAddress);
 }
 
 core.int buildCounterReturnaddressListResponse = 0;
@@ -8572,8 +8666,10 @@
 
 void checkUnnamed3809(core.List<api.ReturnpolicyCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnpolicyCustomBatchRequestEntry(o[0]);
-  checkReturnpolicyCustomBatchRequestEntry(o[1]);
+  checkReturnpolicyCustomBatchRequestEntry(
+      o[0] as api.ReturnpolicyCustomBatchRequestEntry);
+  checkReturnpolicyCustomBatchRequestEntry(
+      o[1] as api.ReturnpolicyCustomBatchRequestEntry);
 }
 
 core.int buildCounterReturnpolicyCustomBatchRequest = 0;
@@ -8618,7 +8714,7 @@
     unittest.expect(o.batchId, unittest.equals(42));
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
-    checkReturnPolicy(o.returnPolicy);
+    checkReturnPolicy(o.returnPolicy as api.ReturnPolicy);
     unittest.expect(o.returnPolicyId, unittest.equals('foo'));
   }
   buildCounterReturnpolicyCustomBatchRequestEntry--;
@@ -8633,8 +8729,10 @@
 
 void checkUnnamed3810(core.List<api.ReturnpolicyCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnpolicyCustomBatchResponseEntry(o[0]);
-  checkReturnpolicyCustomBatchResponseEntry(o[1]);
+  checkReturnpolicyCustomBatchResponseEntry(
+      o[0] as api.ReturnpolicyCustomBatchResponseEntry);
+  checkReturnpolicyCustomBatchResponseEntry(
+      o[1] as api.ReturnpolicyCustomBatchResponseEntry);
 }
 
 core.int buildCounterReturnpolicyCustomBatchResponse = 0;
@@ -8679,9 +8777,9 @@
   buildCounterReturnpolicyCustomBatchResponseEntry++;
   if (buildCounterReturnpolicyCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkReturnPolicy(o.returnPolicy);
+    checkReturnPolicy(o.returnPolicy as api.ReturnPolicy);
   }
   buildCounterReturnpolicyCustomBatchResponseEntry--;
 }
@@ -8695,8 +8793,8 @@
 
 void checkUnnamed3811(core.List<api.ReturnPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReturnPolicy(o[0]);
-  checkReturnPolicy(o[1]);
+  checkReturnPolicy(o[0] as api.ReturnPolicy);
+  checkReturnPolicy(o[1] as api.ReturnPolicy);
 }
 
 core.int buildCounterReturnpolicyListResponse = 0;
@@ -8729,8 +8827,8 @@
 
 void checkUnnamed3812(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o[0]);
-  checkValue(o[1]);
+  checkValue(o[0] as api.Value);
+  checkValue(o[1] as api.Value);
 }
 
 core.int buildCounterRow = 0;
@@ -8761,8 +8859,8 @@
 
 void checkUnnamed3813(core.List<api.RateGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRateGroup(o[0]);
-  checkRateGroup(o[1]);
+  checkRateGroup(o[0] as api.RateGroup);
+  checkRateGroup(o[1] as api.RateGroup);
 }
 
 core.int buildCounterService = 0;
@@ -8792,12 +8890,13 @@
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.currency, unittest.equals('foo'));
     unittest.expect(o.deliveryCountry, unittest.equals('foo'));
-    checkDeliveryTime(o.deliveryTime);
+    checkDeliveryTime(o.deliveryTime as api.DeliveryTime);
     unittest.expect(o.eligibility, unittest.equals('foo'));
-    checkPrice(o.minimumOrderValue);
-    checkMinimumOrderValueTable(o.minimumOrderValueTable);
+    checkPrice(o.minimumOrderValue as api.Price);
+    checkMinimumOrderValueTable(
+        o.minimumOrderValueTable as api.MinimumOrderValueTable);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPickupCarrierService(o.pickupService);
+    checkPickupCarrierService(o.pickupService as api.PickupCarrierService);
     checkUnnamed3813(o.rateGroups);
     unittest.expect(o.shipmentType, unittest.equals('foo'));
   }
@@ -8840,10 +8939,10 @@
   if (buildCounterSettlementReport < 3) {
     unittest.expect(o.endDate, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPrice(o.previousBalance);
+    checkPrice(o.previousBalance as api.Price);
     unittest.expect(o.settlementId, unittest.equals('foo'));
     unittest.expect(o.startDate, unittest.equals('foo'));
-    checkPrice(o.transferAmount);
+    checkPrice(o.transferAmount as api.Price);
     unittest.expect(o.transferDate, unittest.equals('foo'));
     checkUnnamed3814(o.transferIds);
   }
@@ -8867,10 +8966,13 @@
 void checkSettlementTransaction(api.SettlementTransaction o) {
   buildCounterSettlementTransaction++;
   if (buildCounterSettlementTransaction < 3) {
-    checkSettlementTransactionAmount(o.amount);
-    checkSettlementTransactionIdentifiers(o.identifiers);
+    checkSettlementTransactionAmount(
+        o.amount as api.SettlementTransactionAmount);
+    checkSettlementTransactionIdentifiers(
+        o.identifiers as api.SettlementTransactionIdentifiers);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSettlementTransactionTransaction(o.transaction);
+    checkSettlementTransactionTransaction(
+        o.transaction as api.SettlementTransactionTransaction);
   }
   buildCounterSettlementTransaction--;
 }
@@ -8892,9 +8994,10 @@
 void checkSettlementTransactionAmount(api.SettlementTransactionAmount o) {
   buildCounterSettlementTransactionAmount++;
   if (buildCounterSettlementTransactionAmount < 3) {
-    checkSettlementTransactionAmountCommission(o.commission);
+    checkSettlementTransactionAmountCommission(
+        o.commission as api.SettlementTransactionAmountCommission);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkPrice(o.transactionAmount);
+    checkPrice(o.transactionAmount as api.Price);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterSettlementTransactionAmount--;
@@ -8997,8 +9100,8 @@
 
 void checkUnnamed3816(core.List<api.SettlementReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSettlementReport(o[0]);
-  checkSettlementReport(o[1]);
+  checkSettlementReport(o[0] as api.SettlementReport);
+  checkSettlementReport(o[1] as api.SettlementReport);
 }
 
 core.int buildCounterSettlementreportsListResponse = 0;
@@ -9033,8 +9136,8 @@
 
 void checkUnnamed3817(core.List<api.SettlementTransaction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSettlementTransaction(o[0]);
-  checkSettlementTransaction(o[1]);
+  checkSettlementTransaction(o[0] as api.SettlementTransaction);
+  checkSettlementTransaction(o[1] as api.SettlementTransaction);
 }
 
 core.int buildCounterSettlementtransactionsListResponse = 0;
@@ -9071,8 +9174,10 @@
 
 void checkUnnamed3818(core.List<api.ShipmentInvoiceLineItemInvoice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkShipmentInvoiceLineItemInvoice(o[0]);
-  checkShipmentInvoiceLineItemInvoice(o[1]);
+  checkShipmentInvoiceLineItemInvoice(
+      o[0] as api.ShipmentInvoiceLineItemInvoice);
+  checkShipmentInvoiceLineItemInvoice(
+      o[1] as api.ShipmentInvoiceLineItemInvoice);
 }
 
 core.int buildCounterShipmentInvoice = 0;
@@ -9091,7 +9196,7 @@
 void checkShipmentInvoice(api.ShipmentInvoice o) {
   buildCounterShipmentInvoice++;
   if (buildCounterShipmentInvoice < 3) {
-    checkInvoiceSummary(o.invoiceSummary);
+    checkInvoiceSummary(o.invoiceSummary as api.InvoiceSummary);
     checkUnnamed3818(o.lineItemInvoices);
     unittest.expect(o.shipmentGroupId, unittest.equals('foo'));
   }
@@ -9131,7 +9236,7 @@
     unittest.expect(o.lineItemId, unittest.equals('foo'));
     unittest.expect(o.productId, unittest.equals('foo'));
     checkUnnamed3819(o.shipmentUnitIds);
-    checkUnitInvoice(o.unitInvoice);
+    checkUnitInvoice(o.unitInvoice as api.UnitInvoice);
   }
   buildCounterShipmentInvoiceLineItemInvoice--;
 }
@@ -9166,8 +9271,8 @@
 
 void checkUnnamed3820(core.List<api.PostalCodeGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPostalCodeGroup(o[0]);
-  checkPostalCodeGroup(o[1]);
+  checkPostalCodeGroup(o[0] as api.PostalCodeGroup);
+  checkPostalCodeGroup(o[1] as api.PostalCodeGroup);
 }
 
 core.List<api.Service> buildUnnamed3821() {
@@ -9179,8 +9284,8 @@
 
 void checkUnnamed3821(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkService(o[0]);
-  checkService(o[1]);
+  checkService(o[0] as api.Service);
+  checkService(o[1] as api.Service);
 }
 
 core.int buildCounterShippingSettings = 0;
@@ -9216,8 +9321,10 @@
 void checkUnnamed3822(
     core.List<api.ShippingsettingsCustomBatchRequestEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkShippingsettingsCustomBatchRequestEntry(o[0]);
-  checkShippingsettingsCustomBatchRequestEntry(o[1]);
+  checkShippingsettingsCustomBatchRequestEntry(
+      o[0] as api.ShippingsettingsCustomBatchRequestEntry);
+  checkShippingsettingsCustomBatchRequestEntry(
+      o[1] as api.ShippingsettingsCustomBatchRequestEntry);
 }
 
 core.int buildCounterShippingsettingsCustomBatchRequest = 0;
@@ -9265,7 +9372,7 @@
     unittest.expect(o.batchId, unittest.equals(42));
     unittest.expect(o.merchantId, unittest.equals('foo'));
     unittest.expect(o.method, unittest.equals('foo'));
-    checkShippingSettings(o.shippingSettings);
+    checkShippingSettings(o.shippingSettings as api.ShippingSettings);
   }
   buildCounterShippingsettingsCustomBatchRequestEntry--;
 }
@@ -9280,8 +9387,10 @@
 void checkUnnamed3823(
     core.List<api.ShippingsettingsCustomBatchResponseEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkShippingsettingsCustomBatchResponseEntry(o[0]);
-  checkShippingsettingsCustomBatchResponseEntry(o[1]);
+  checkShippingsettingsCustomBatchResponseEntry(
+      o[0] as api.ShippingsettingsCustomBatchResponseEntry);
+  checkShippingsettingsCustomBatchResponseEntry(
+      o[1] as api.ShippingsettingsCustomBatchResponseEntry);
 }
 
 core.int buildCounterShippingsettingsCustomBatchResponse = 0;
@@ -9327,9 +9436,9 @@
   buildCounterShippingsettingsCustomBatchResponseEntry++;
   if (buildCounterShippingsettingsCustomBatchResponseEntry < 3) {
     unittest.expect(o.batchId, unittest.equals(42));
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkShippingSettings(o.shippingSettings);
+    checkShippingSettings(o.shippingSettings as api.ShippingSettings);
   }
   buildCounterShippingsettingsCustomBatchResponseEntry--;
 }
@@ -9343,8 +9452,8 @@
 
 void checkUnnamed3824(core.List<api.CarriersCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCarriersCarrier(o[0]);
-  checkCarriersCarrier(o[1]);
+  checkCarriersCarrier(o[0] as api.CarriersCarrier);
+  checkCarriersCarrier(o[1] as api.CarriersCarrier);
 }
 
 core.int buildCounterShippingsettingsGetSupportedCarriersResponse = 0;
@@ -9379,8 +9488,8 @@
 
 void checkUnnamed3825(core.List<api.HolidaysHoliday> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHolidaysHoliday(o[0]);
-  checkHolidaysHoliday(o[1]);
+  checkHolidaysHoliday(o[0] as api.HolidaysHoliday);
+  checkHolidaysHoliday(o[1] as api.HolidaysHoliday);
 }
 
 core.int buildCounterShippingsettingsGetSupportedHolidaysResponse = 0;
@@ -9415,8 +9524,8 @@
 
 void checkUnnamed3826(core.List<api.PickupServicesPickupService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPickupServicesPickupService(o[0]);
-  checkPickupServicesPickupService(o[1]);
+  checkPickupServicesPickupService(o[0] as api.PickupServicesPickupService);
+  checkPickupServicesPickupService(o[1] as api.PickupServicesPickupService);
 }
 
 core.int buildCounterShippingsettingsGetSupportedPickupServicesResponse = 0;
@@ -9451,8 +9560,8 @@
 
 void checkUnnamed3827(core.List<api.ShippingSettings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkShippingSettings(o[0]);
-  checkShippingSettings(o[1]);
+  checkShippingSettings(o[0] as api.ShippingSettings);
+  checkShippingSettings(o[1] as api.ShippingSettings);
 }
 
 core.int buildCounterShippingsettingsListResponse = 0;
@@ -9487,8 +9596,8 @@
 
 void checkUnnamed3828(core.List<api.Row> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRow(o[0]);
-  checkRow(o[1]);
+  checkRow(o[0] as api.Row);
+  checkRow(o[1] as api.Row);
 }
 
 core.int buildCounterTable = 0;
@@ -9508,9 +9617,9 @@
 void checkTable(api.Table o) {
   buildCounterTable++;
   if (buildCounterTable < 3) {
-    checkHeaders(o.columnHeaders);
+    checkHeaders(o.columnHeaders as api.Headers);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkHeaders(o.rowHeaders);
+    checkHeaders(o.rowHeaders as api.Headers);
     checkUnnamed3828(o.rows);
   }
   buildCounterTable--;
@@ -9525,8 +9634,8 @@
 
 void checkUnnamed3829(core.List<api.TestOrderLineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTestOrderLineItem(o[0]);
-  checkTestOrderLineItem(o[1]);
+  checkTestOrderLineItem(o[0] as api.TestOrderLineItem);
+  checkTestOrderLineItem(o[1] as api.TestOrderLineItem);
 }
 
 core.List<api.OrderPromotion> buildUnnamed3830() {
@@ -9538,8 +9647,8 @@
 
 void checkUnnamed3830(core.List<api.OrderPromotion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderPromotion(o[0]);
-  checkOrderPromotion(o[1]);
+  checkOrderPromotion(o[0] as api.OrderPromotion);
+  checkOrderPromotion(o[1] as api.OrderPromotion);
 }
 
 core.int buildCounterTestOrder = 0;
@@ -9568,18 +9677,19 @@
 void checkTestOrder(api.TestOrder o) {
   buildCounterTestOrder++;
   if (buildCounterTestOrder < 3) {
-    checkTestOrderDeliveryDetails(o.deliveryDetails);
+    checkTestOrderDeliveryDetails(
+        o.deliveryDetails as api.TestOrderDeliveryDetails);
     unittest.expect(o.enableOrderinvoices, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3829(o.lineItems);
     unittest.expect(o.notificationMode, unittest.equals('foo'));
-    checkTestOrderPickupDetails(o.pickupDetails);
+    checkTestOrderPickupDetails(o.pickupDetails as api.TestOrderPickupDetails);
     unittest.expect(o.predefinedBillingAddress, unittest.equals('foo'));
     unittest.expect(o.predefinedDeliveryAddress, unittest.equals('foo'));
     unittest.expect(o.predefinedEmail, unittest.equals('foo'));
     unittest.expect(o.predefinedPickupDetails, unittest.equals('foo'));
     checkUnnamed3830(o.promotions);
-    checkPrice(o.shippingCost);
+    checkPrice(o.shippingCost as api.Price);
     unittest.expect(o.shippingOption, unittest.equals('foo'));
   }
   buildCounterTestOrder--;
@@ -9659,7 +9769,7 @@
 void checkTestOrderDeliveryDetails(api.TestOrderDeliveryDetails o) {
   buildCounterTestOrderDeliveryDetails++;
   if (buildCounterTestOrderDeliveryDetails < 3) {
-    checkTestOrderAddress(o.address);
+    checkTestOrderAddress(o.address as api.TestOrderAddress);
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
   }
   buildCounterTestOrderDeliveryDetails--;
@@ -9682,10 +9792,11 @@
 void checkTestOrderLineItem(api.TestOrderLineItem o) {
   buildCounterTestOrderLineItem++;
   if (buildCounterTestOrderLineItem < 3) {
-    checkTestOrderLineItemProduct(o.product);
+    checkTestOrderLineItemProduct(o.product as api.TestOrderLineItemProduct);
     unittest.expect(o.quantityOrdered, unittest.equals(42));
-    checkOrderLineItemReturnInfo(o.returnInfo);
-    checkOrderLineItemShippingDetails(o.shippingDetails);
+    checkOrderLineItemReturnInfo(o.returnInfo as api.OrderLineItemReturnInfo);
+    checkOrderLineItemShippingDetails(
+        o.shippingDetails as api.OrderLineItemShippingDetails);
   }
   buildCounterTestOrderLineItem--;
 }
@@ -9699,8 +9810,8 @@
 
 void checkUnnamed3833(core.List<api.OrderLineItemProductFee> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderLineItemProductFee(o[0]);
-  checkOrderLineItemProductFee(o[1]);
+  checkOrderLineItemProductFee(o[0] as api.OrderLineItemProductFee);
+  checkOrderLineItemProductFee(o[1] as api.OrderLineItemProductFee);
 }
 
 core.List<api.OrderLineItemProductVariantAttribute> buildUnnamed3834() {
@@ -9712,8 +9823,10 @@
 
 void checkUnnamed3834(core.List<api.OrderLineItemProductVariantAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderLineItemProductVariantAttribute(o[0]);
-  checkOrderLineItemProductVariantAttribute(o[1]);
+  checkOrderLineItemProductVariantAttribute(
+      o[0] as api.OrderLineItemProductVariantAttribute);
+  checkOrderLineItemProductVariantAttribute(
+      o[1] as api.OrderLineItemProductVariantAttribute);
 }
 
 core.int buildCounterTestOrderLineItemProduct = 0;
@@ -9751,7 +9864,7 @@
     unittest.expect(o.itemGroupId, unittest.equals('foo'));
     unittest.expect(o.mpn, unittest.equals('foo'));
     unittest.expect(o.offerId, unittest.equals('foo'));
-    checkPrice(o.price);
+    checkPrice(o.price as api.Price);
     unittest.expect(o.targetCountry, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     checkUnnamed3834(o.variantAttributes);
@@ -9768,8 +9881,10 @@
 
 void checkUnnamed3835(core.List<api.TestOrderPickupDetailsPickupPerson> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTestOrderPickupDetailsPickupPerson(o[0]);
-  checkTestOrderPickupDetailsPickupPerson(o[1]);
+  checkTestOrderPickupDetailsPickupPerson(
+      o[0] as api.TestOrderPickupDetailsPickupPerson);
+  checkTestOrderPickupDetailsPickupPerson(
+      o[1] as api.TestOrderPickupDetailsPickupPerson);
 }
 
 core.int buildCounterTestOrderPickupDetails = 0;
@@ -9790,7 +9905,7 @@
   buildCounterTestOrderPickupDetails++;
   if (buildCounterTestOrderPickupDetails < 3) {
     unittest.expect(o.locationCode, unittest.equals('foo'));
-    checkTestOrderAddress(o.pickupLocationAddress);
+    checkTestOrderAddress(o.pickupLocationAddress as api.TestOrderAddress);
     unittest.expect(o.pickupLocationType, unittest.equals('foo'));
     checkUnnamed3835(o.pickupPersons);
   }
@@ -9842,8 +9957,8 @@
 
 void checkUnnamed3837(core.List<api.TransitTableTransitTimeRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransitTableTransitTimeRow(o[0]);
-  checkTransitTableTransitTimeRow(o[1]);
+  checkTransitTableTransitTimeRow(o[0] as api.TransitTableTransitTimeRow);
+  checkTransitTableTransitTimeRow(o[1] as api.TransitTableTransitTimeRow);
 }
 
 core.List<core.String> buildUnnamed3838() {
@@ -9892,8 +10007,10 @@
 void checkUnnamed3839(
     core.List<api.TransitTableTransitTimeRowTransitTimeValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransitTableTransitTimeRowTransitTimeValue(o[0]);
-  checkTransitTableTransitTimeRowTransitTimeValue(o[1]);
+  checkTransitTableTransitTimeRowTransitTimeValue(
+      o[0] as api.TransitTableTransitTimeRowTransitTimeValue);
+  checkTransitTableTransitTimeRowTransitTimeValue(
+      o[1] as api.TransitTableTransitTimeRowTransitTimeValue);
 }
 
 core.int buildCounterTransitTableTransitTimeRow = 0;
@@ -9947,8 +10064,8 @@
 
 void checkUnnamed3840(core.List<api.UnitInvoiceAdditionalCharge> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnitInvoiceAdditionalCharge(o[0]);
-  checkUnitInvoiceAdditionalCharge(o[1]);
+  checkUnitInvoiceAdditionalCharge(o[0] as api.UnitInvoiceAdditionalCharge);
+  checkUnitInvoiceAdditionalCharge(o[1] as api.UnitInvoiceAdditionalCharge);
 }
 
 core.List<api.UnitInvoiceTaxLine> buildUnnamed3841() {
@@ -9960,8 +10077,8 @@
 
 void checkUnnamed3841(core.List<api.UnitInvoiceTaxLine> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUnitInvoiceTaxLine(o[0]);
-  checkUnitInvoiceTaxLine(o[1]);
+  checkUnitInvoiceTaxLine(o[0] as api.UnitInvoiceTaxLine);
+  checkUnitInvoiceTaxLine(o[1] as api.UnitInvoiceTaxLine);
 }
 
 core.int buildCounterUnitInvoice = 0;
@@ -9981,7 +10098,7 @@
   buildCounterUnitInvoice++;
   if (buildCounterUnitInvoice < 3) {
     checkUnnamed3840(o.additionalCharges);
-    checkPrice(o.unitPrice);
+    checkPrice(o.unitPrice as api.Price);
     checkUnnamed3841(o.unitPriceTaxes);
   }
   buildCounterUnitInvoice--;
@@ -10002,7 +10119,7 @@
 void checkUnitInvoiceAdditionalCharge(api.UnitInvoiceAdditionalCharge o) {
   buildCounterUnitInvoiceAdditionalCharge++;
   if (buildCounterUnitInvoiceAdditionalCharge < 3) {
-    checkAmount(o.additionalChargeAmount);
+    checkAmount(o.additionalChargeAmount as api.Amount);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterUnitInvoiceAdditionalCharge--;
@@ -10024,7 +10141,7 @@
 void checkUnitInvoiceTaxLine(api.UnitInvoiceTaxLine o) {
   buildCounterUnitInvoiceTaxLine++;
   if (buildCounterUnitInvoiceTaxLine < 3) {
-    checkPrice(o.taxAmount);
+    checkPrice(o.taxAmount as api.Price);
     unittest.expect(o.taxName, unittest.equals('foo'));
     unittest.expect(o.taxType, unittest.equals('foo'));
   }
@@ -10050,7 +10167,7 @@
   buildCounterValue++;
   if (buildCounterValue < 3) {
     unittest.expect(o.carrierRateName, unittest.equals('foo'));
-    checkPrice(o.flatRate);
+    checkPrice(o.flatRate as api.Price);
     unittest.expect(o.noShipping, unittest.isTrue);
     unittest.expect(o.pricePercentage, unittest.equals('foo'));
     unittest.expect(o.subtableName, unittest.equals('foo'));
@@ -10227,7 +10344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -10235,7 +10352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountAddress();
       var od = api.AccountAddress.fromJson(o.toJson());
-      checkAccountAddress(od);
+      checkAccountAddress(od as api.AccountAddress);
     });
   });
 
@@ -10243,7 +10360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountAdsLink();
       var od = api.AccountAdsLink.fromJson(o.toJson());
-      checkAccountAdsLink(od);
+      checkAccountAdsLink(od as api.AccountAdsLink);
     });
   });
 
@@ -10251,7 +10368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountBusinessInformation();
       var od = api.AccountBusinessInformation.fromJson(o.toJson());
-      checkAccountBusinessInformation(od);
+      checkAccountBusinessInformation(od as api.AccountBusinessInformation);
     });
   });
 
@@ -10259,7 +10376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountCustomerService();
       var od = api.AccountCustomerService.fromJson(o.toJson());
-      checkAccountCustomerService(od);
+      checkAccountCustomerService(od as api.AccountCustomerService);
     });
   });
 
@@ -10267,7 +10384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountGoogleMyBusinessLink();
       var od = api.AccountGoogleMyBusinessLink.fromJson(o.toJson());
-      checkAccountGoogleMyBusinessLink(od);
+      checkAccountGoogleMyBusinessLink(od as api.AccountGoogleMyBusinessLink);
     });
   });
 
@@ -10275,7 +10392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountIdentifier();
       var od = api.AccountIdentifier.fromJson(o.toJson());
-      checkAccountIdentifier(od);
+      checkAccountIdentifier(od as api.AccountIdentifier);
     });
   });
 
@@ -10283,7 +10400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountStatus();
       var od = api.AccountStatus.fromJson(o.toJson());
-      checkAccountStatus(od);
+      checkAccountStatus(od as api.AccountStatus);
     });
   });
 
@@ -10291,7 +10408,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountStatusAccountLevelIssue();
       var od = api.AccountStatusAccountLevelIssue.fromJson(o.toJson());
-      checkAccountStatusAccountLevelIssue(od);
+      checkAccountStatusAccountLevelIssue(
+          od as api.AccountStatusAccountLevelIssue);
     });
   });
 
@@ -10299,7 +10417,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountStatusItemLevelIssue();
       var od = api.AccountStatusItemLevelIssue.fromJson(o.toJson());
-      checkAccountStatusItemLevelIssue(od);
+      checkAccountStatusItemLevelIssue(od as api.AccountStatusItemLevelIssue);
     });
   });
 
@@ -10307,7 +10425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountStatusProducts();
       var od = api.AccountStatusProducts.fromJson(o.toJson());
-      checkAccountStatusProducts(od);
+      checkAccountStatusProducts(od as api.AccountStatusProducts);
     });
   });
 
@@ -10315,7 +10433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountStatusStatistics();
       var od = api.AccountStatusStatistics.fromJson(o.toJson());
-      checkAccountStatusStatistics(od);
+      checkAccountStatusStatistics(od as api.AccountStatusStatistics);
     });
   });
 
@@ -10323,7 +10441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountTax();
       var od = api.AccountTax.fromJson(o.toJson());
-      checkAccountTax(od);
+      checkAccountTax(od as api.AccountTax);
     });
   });
 
@@ -10331,7 +10449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountTaxTaxRule();
       var od = api.AccountTaxTaxRule.fromJson(o.toJson());
-      checkAccountTaxTaxRule(od);
+      checkAccountTaxTaxRule(od as api.AccountTaxTaxRule);
     });
   });
 
@@ -10339,7 +10457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountUser();
       var od = api.AccountUser.fromJson(o.toJson());
-      checkAccountUser(od);
+      checkAccountUser(od as api.AccountUser);
     });
   });
 
@@ -10347,7 +10465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountYouTubeChannelLink();
       var od = api.AccountYouTubeChannelLink.fromJson(o.toJson());
-      checkAccountYouTubeChannelLink(od);
+      checkAccountYouTubeChannelLink(od as api.AccountYouTubeChannelLink);
     });
   });
 
@@ -10355,7 +10473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsAuthInfoResponse();
       var od = api.AccountsAuthInfoResponse.fromJson(o.toJson());
-      checkAccountsAuthInfoResponse(od);
+      checkAccountsAuthInfoResponse(od as api.AccountsAuthInfoResponse);
     });
   });
 
@@ -10363,7 +10481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsClaimWebsiteResponse();
       var od = api.AccountsClaimWebsiteResponse.fromJson(o.toJson());
-      checkAccountsClaimWebsiteResponse(od);
+      checkAccountsClaimWebsiteResponse(od as api.AccountsClaimWebsiteResponse);
     });
   });
 
@@ -10371,7 +10489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsCustomBatchRequest();
       var od = api.AccountsCustomBatchRequest.fromJson(o.toJson());
-      checkAccountsCustomBatchRequest(od);
+      checkAccountsCustomBatchRequest(od as api.AccountsCustomBatchRequest);
     });
   });
 
@@ -10379,7 +10497,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsCustomBatchRequestEntry();
       var od = api.AccountsCustomBatchRequestEntry.fromJson(o.toJson());
-      checkAccountsCustomBatchRequestEntry(od);
+      checkAccountsCustomBatchRequestEntry(
+          od as api.AccountsCustomBatchRequestEntry);
     });
   });
 
@@ -10388,7 +10507,8 @@
       var o = buildAccountsCustomBatchRequestEntryLinkRequest();
       var od =
           api.AccountsCustomBatchRequestEntryLinkRequest.fromJson(o.toJson());
-      checkAccountsCustomBatchRequestEntryLinkRequest(od);
+      checkAccountsCustomBatchRequestEntryLinkRequest(
+          od as api.AccountsCustomBatchRequestEntryLinkRequest);
     });
   });
 
@@ -10396,7 +10516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsCustomBatchResponse();
       var od = api.AccountsCustomBatchResponse.fromJson(o.toJson());
-      checkAccountsCustomBatchResponse(od);
+      checkAccountsCustomBatchResponse(od as api.AccountsCustomBatchResponse);
     });
   });
 
@@ -10404,7 +10524,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsCustomBatchResponseEntry();
       var od = api.AccountsCustomBatchResponseEntry.fromJson(o.toJson());
-      checkAccountsCustomBatchResponseEntry(od);
+      checkAccountsCustomBatchResponseEntry(
+          od as api.AccountsCustomBatchResponseEntry);
     });
   });
 
@@ -10412,7 +10533,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsLinkRequest();
       var od = api.AccountsLinkRequest.fromJson(o.toJson());
-      checkAccountsLinkRequest(od);
+      checkAccountsLinkRequest(od as api.AccountsLinkRequest);
     });
   });
 
@@ -10420,7 +10541,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsLinkResponse();
       var od = api.AccountsLinkResponse.fromJson(o.toJson());
-      checkAccountsLinkResponse(od);
+      checkAccountsLinkResponse(od as api.AccountsLinkResponse);
     });
   });
 
@@ -10428,7 +10549,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsListLinksResponse();
       var od = api.AccountsListLinksResponse.fromJson(o.toJson());
-      checkAccountsListLinksResponse(od);
+      checkAccountsListLinksResponse(od as api.AccountsListLinksResponse);
     });
   });
 
@@ -10436,7 +10557,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsListResponse();
       var od = api.AccountsListResponse.fromJson(o.toJson());
-      checkAccountsListResponse(od);
+      checkAccountsListResponse(od as api.AccountsListResponse);
     });
   });
 
@@ -10444,7 +10565,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsUpdateLabelsRequest();
       var od = api.AccountsUpdateLabelsRequest.fromJson(o.toJson());
-      checkAccountsUpdateLabelsRequest(od);
+      checkAccountsUpdateLabelsRequest(od as api.AccountsUpdateLabelsRequest);
     });
   });
 
@@ -10452,7 +10573,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsUpdateLabelsResponse();
       var od = api.AccountsUpdateLabelsResponse.fromJson(o.toJson());
-      checkAccountsUpdateLabelsResponse(od);
+      checkAccountsUpdateLabelsResponse(od as api.AccountsUpdateLabelsResponse);
     });
   });
 
@@ -10460,7 +10581,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountstatusesCustomBatchRequest();
       var od = api.AccountstatusesCustomBatchRequest.fromJson(o.toJson());
-      checkAccountstatusesCustomBatchRequest(od);
+      checkAccountstatusesCustomBatchRequest(
+          od as api.AccountstatusesCustomBatchRequest);
     });
   });
 
@@ -10468,7 +10590,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountstatusesCustomBatchRequestEntry();
       var od = api.AccountstatusesCustomBatchRequestEntry.fromJson(o.toJson());
-      checkAccountstatusesCustomBatchRequestEntry(od);
+      checkAccountstatusesCustomBatchRequestEntry(
+          od as api.AccountstatusesCustomBatchRequestEntry);
     });
   });
 
@@ -10476,7 +10599,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountstatusesCustomBatchResponse();
       var od = api.AccountstatusesCustomBatchResponse.fromJson(o.toJson());
-      checkAccountstatusesCustomBatchResponse(od);
+      checkAccountstatusesCustomBatchResponse(
+          od as api.AccountstatusesCustomBatchResponse);
     });
   });
 
@@ -10484,7 +10608,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountstatusesCustomBatchResponseEntry();
       var od = api.AccountstatusesCustomBatchResponseEntry.fromJson(o.toJson());
-      checkAccountstatusesCustomBatchResponseEntry(od);
+      checkAccountstatusesCustomBatchResponseEntry(
+          od as api.AccountstatusesCustomBatchResponseEntry);
     });
   });
 
@@ -10492,7 +10617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountstatusesListResponse();
       var od = api.AccountstatusesListResponse.fromJson(o.toJson());
-      checkAccountstatusesListResponse(od);
+      checkAccountstatusesListResponse(od as api.AccountstatusesListResponse);
     });
   });
 
@@ -10500,7 +10625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounttaxCustomBatchRequest();
       var od = api.AccounttaxCustomBatchRequest.fromJson(o.toJson());
-      checkAccounttaxCustomBatchRequest(od);
+      checkAccounttaxCustomBatchRequest(od as api.AccounttaxCustomBatchRequest);
     });
   });
 
@@ -10508,7 +10633,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounttaxCustomBatchRequestEntry();
       var od = api.AccounttaxCustomBatchRequestEntry.fromJson(o.toJson());
-      checkAccounttaxCustomBatchRequestEntry(od);
+      checkAccounttaxCustomBatchRequestEntry(
+          od as api.AccounttaxCustomBatchRequestEntry);
     });
   });
 
@@ -10516,7 +10642,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounttaxCustomBatchResponse();
       var od = api.AccounttaxCustomBatchResponse.fromJson(o.toJson());
-      checkAccounttaxCustomBatchResponse(od);
+      checkAccounttaxCustomBatchResponse(
+          od as api.AccounttaxCustomBatchResponse);
     });
   });
 
@@ -10524,7 +10651,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounttaxCustomBatchResponseEntry();
       var od = api.AccounttaxCustomBatchResponseEntry.fromJson(o.toJson());
-      checkAccounttaxCustomBatchResponseEntry(od);
+      checkAccounttaxCustomBatchResponseEntry(
+          od as api.AccounttaxCustomBatchResponseEntry);
     });
   });
 
@@ -10532,7 +10660,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccounttaxListResponse();
       var od = api.AccounttaxListResponse.fromJson(o.toJson());
-      checkAccounttaxListResponse(od);
+      checkAccounttaxListResponse(od as api.AccounttaxListResponse);
     });
   });
 
@@ -10540,7 +10668,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAmount();
       var od = api.Amount.fromJson(o.toJson());
-      checkAmount(od);
+      checkAmount(od as api.Amount);
     });
   });
 
@@ -10548,7 +10676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBusinessDayConfig();
       var od = api.BusinessDayConfig.fromJson(o.toJson());
-      checkBusinessDayConfig(od);
+      checkBusinessDayConfig(od as api.BusinessDayConfig);
     });
   });
 
@@ -10556,7 +10684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCarrierRate();
       var od = api.CarrierRate.fromJson(o.toJson());
-      checkCarrierRate(od);
+      checkCarrierRate(od as api.CarrierRate);
     });
   });
 
@@ -10564,7 +10692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCarriersCarrier();
       var od = api.CarriersCarrier.fromJson(o.toJson());
-      checkCarriersCarrier(od);
+      checkCarriersCarrier(od as api.CarriersCarrier);
     });
   });
 
@@ -10572,7 +10700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAttribute();
       var od = api.CustomAttribute.fromJson(o.toJson());
-      checkCustomAttribute(od);
+      checkCustomAttribute(od as api.CustomAttribute);
     });
   });
 
@@ -10580,7 +10708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerReturnReason();
       var od = api.CustomerReturnReason.fromJson(o.toJson());
-      checkCustomerReturnReason(od);
+      checkCustomerReturnReason(od as api.CustomerReturnReason);
     });
   });
 
@@ -10588,7 +10716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCutoffTime();
       var od = api.CutoffTime.fromJson(o.toJson());
-      checkCutoffTime(od);
+      checkCutoffTime(od as api.CutoffTime);
     });
   });
 
@@ -10596,7 +10724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeed();
       var od = api.Datafeed.fromJson(o.toJson());
-      checkDatafeed(od);
+      checkDatafeed(od as api.Datafeed);
     });
   });
 
@@ -10604,7 +10732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedFetchSchedule();
       var od = api.DatafeedFetchSchedule.fromJson(o.toJson());
-      checkDatafeedFetchSchedule(od);
+      checkDatafeedFetchSchedule(od as api.DatafeedFetchSchedule);
     });
   });
 
@@ -10612,7 +10740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedFormat();
       var od = api.DatafeedFormat.fromJson(o.toJson());
-      checkDatafeedFormat(od);
+      checkDatafeedFormat(od as api.DatafeedFormat);
     });
   });
 
@@ -10620,7 +10748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedStatus();
       var od = api.DatafeedStatus.fromJson(o.toJson());
-      checkDatafeedStatus(od);
+      checkDatafeedStatus(od as api.DatafeedStatus);
     });
   });
 
@@ -10628,7 +10756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedStatusError();
       var od = api.DatafeedStatusError.fromJson(o.toJson());
-      checkDatafeedStatusError(od);
+      checkDatafeedStatusError(od as api.DatafeedStatusError);
     });
   });
 
@@ -10636,7 +10764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedStatusExample();
       var od = api.DatafeedStatusExample.fromJson(o.toJson());
-      checkDatafeedStatusExample(od);
+      checkDatafeedStatusExample(od as api.DatafeedStatusExample);
     });
   });
 
@@ -10644,7 +10772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedTarget();
       var od = api.DatafeedTarget.fromJson(o.toJson());
-      checkDatafeedTarget(od);
+      checkDatafeedTarget(od as api.DatafeedTarget);
     });
   });
 
@@ -10652,7 +10780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedsCustomBatchRequest();
       var od = api.DatafeedsCustomBatchRequest.fromJson(o.toJson());
-      checkDatafeedsCustomBatchRequest(od);
+      checkDatafeedsCustomBatchRequest(od as api.DatafeedsCustomBatchRequest);
     });
   });
 
@@ -10660,7 +10788,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedsCustomBatchRequestEntry();
       var od = api.DatafeedsCustomBatchRequestEntry.fromJson(o.toJson());
-      checkDatafeedsCustomBatchRequestEntry(od);
+      checkDatafeedsCustomBatchRequestEntry(
+          od as api.DatafeedsCustomBatchRequestEntry);
     });
   });
 
@@ -10668,7 +10797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedsCustomBatchResponse();
       var od = api.DatafeedsCustomBatchResponse.fromJson(o.toJson());
-      checkDatafeedsCustomBatchResponse(od);
+      checkDatafeedsCustomBatchResponse(od as api.DatafeedsCustomBatchResponse);
     });
   });
 
@@ -10676,7 +10805,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedsCustomBatchResponseEntry();
       var od = api.DatafeedsCustomBatchResponseEntry.fromJson(o.toJson());
-      checkDatafeedsCustomBatchResponseEntry(od);
+      checkDatafeedsCustomBatchResponseEntry(
+          od as api.DatafeedsCustomBatchResponseEntry);
     });
   });
 
@@ -10684,7 +10814,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedsFetchNowResponse();
       var od = api.DatafeedsFetchNowResponse.fromJson(o.toJson());
-      checkDatafeedsFetchNowResponse(od);
+      checkDatafeedsFetchNowResponse(od as api.DatafeedsFetchNowResponse);
     });
   });
 
@@ -10692,7 +10822,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedsListResponse();
       var od = api.DatafeedsListResponse.fromJson(o.toJson());
-      checkDatafeedsListResponse(od);
+      checkDatafeedsListResponse(od as api.DatafeedsListResponse);
     });
   });
 
@@ -10700,7 +10830,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedstatusesCustomBatchRequest();
       var od = api.DatafeedstatusesCustomBatchRequest.fromJson(o.toJson());
-      checkDatafeedstatusesCustomBatchRequest(od);
+      checkDatafeedstatusesCustomBatchRequest(
+          od as api.DatafeedstatusesCustomBatchRequest);
     });
   });
 
@@ -10708,7 +10839,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedstatusesCustomBatchRequestEntry();
       var od = api.DatafeedstatusesCustomBatchRequestEntry.fromJson(o.toJson());
-      checkDatafeedstatusesCustomBatchRequestEntry(od);
+      checkDatafeedstatusesCustomBatchRequestEntry(
+          od as api.DatafeedstatusesCustomBatchRequestEntry);
     });
   });
 
@@ -10716,7 +10848,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedstatusesCustomBatchResponse();
       var od = api.DatafeedstatusesCustomBatchResponse.fromJson(o.toJson());
-      checkDatafeedstatusesCustomBatchResponse(od);
+      checkDatafeedstatusesCustomBatchResponse(
+          od as api.DatafeedstatusesCustomBatchResponse);
     });
   });
 
@@ -10725,7 +10858,8 @@
       var o = buildDatafeedstatusesCustomBatchResponseEntry();
       var od =
           api.DatafeedstatusesCustomBatchResponseEntry.fromJson(o.toJson());
-      checkDatafeedstatusesCustomBatchResponseEntry(od);
+      checkDatafeedstatusesCustomBatchResponseEntry(
+          od as api.DatafeedstatusesCustomBatchResponseEntry);
     });
   });
 
@@ -10733,7 +10867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatafeedstatusesListResponse();
       var od = api.DatafeedstatusesListResponse.fromJson(o.toJson());
-      checkDatafeedstatusesListResponse(od);
+      checkDatafeedstatusesListResponse(od as api.DatafeedstatusesListResponse);
     });
   });
 
@@ -10741,7 +10875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeliveryTime();
       var od = api.DeliveryTime.fromJson(o.toJson());
-      checkDeliveryTime(od);
+      checkDeliveryTime(od as api.DeliveryTime);
     });
   });
 
@@ -10749,7 +10883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildError();
       var od = api.Error.fromJson(o.toJson());
-      checkError(od);
+      checkError(od as api.Error);
     });
   });
 
@@ -10757,7 +10891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrors();
       var od = api.Errors.fromJson(o.toJson());
-      checkErrors(od);
+      checkErrors(od as api.Errors);
     });
   });
 
@@ -10765,7 +10899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGmbAccounts();
       var od = api.GmbAccounts.fromJson(o.toJson());
-      checkGmbAccounts(od);
+      checkGmbAccounts(od as api.GmbAccounts);
     });
   });
 
@@ -10773,7 +10907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGmbAccountsGmbAccount();
       var od = api.GmbAccountsGmbAccount.fromJson(o.toJson());
-      checkGmbAccountsGmbAccount(od);
+      checkGmbAccountsGmbAccount(od as api.GmbAccountsGmbAccount);
     });
   });
 
@@ -10781,7 +10915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeaders();
       var od = api.Headers.fromJson(o.toJson());
-      checkHeaders(od);
+      checkHeaders(od as api.Headers);
     });
   });
 
@@ -10789,7 +10923,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHolidayCutoff();
       var od = api.HolidayCutoff.fromJson(o.toJson());
-      checkHolidayCutoff(od);
+      checkHolidayCutoff(od as api.HolidayCutoff);
     });
   });
 
@@ -10797,7 +10931,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHolidaysHoliday();
       var od = api.HolidaysHoliday.fromJson(o.toJson());
-      checkHolidaysHoliday(od);
+      checkHolidaysHoliday(od as api.HolidaysHoliday);
     });
   });
 
@@ -10805,7 +10939,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstallment();
       var od = api.Installment.fromJson(o.toJson());
-      checkInstallment(od);
+      checkInstallment(od as api.Installment);
     });
   });
 
@@ -10813,7 +10947,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInvoiceSummary();
       var od = api.InvoiceSummary.fromJson(o.toJson());
-      checkInvoiceSummary(od);
+      checkInvoiceSummary(od as api.InvoiceSummary);
     });
   });
 
@@ -10821,7 +10955,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInvoiceSummaryAdditionalChargeSummary();
       var od = api.InvoiceSummaryAdditionalChargeSummary.fromJson(o.toJson());
-      checkInvoiceSummaryAdditionalChargeSummary(od);
+      checkInvoiceSummaryAdditionalChargeSummary(
+          od as api.InvoiceSummaryAdditionalChargeSummary);
     });
   });
 
@@ -10829,7 +10964,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiaAboutPageSettings();
       var od = api.LiaAboutPageSettings.fromJson(o.toJson());
-      checkLiaAboutPageSettings(od);
+      checkLiaAboutPageSettings(od as api.LiaAboutPageSettings);
     });
   });
 
@@ -10837,7 +10972,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiaCountrySettings();
       var od = api.LiaCountrySettings.fromJson(o.toJson());
-      checkLiaCountrySettings(od);
+      checkLiaCountrySettings(od as api.LiaCountrySettings);
     });
   });
 
@@ -10845,7 +10980,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiaInventorySettings();
       var od = api.LiaInventorySettings.fromJson(o.toJson());
-      checkLiaInventorySettings(od);
+      checkLiaInventorySettings(od as api.LiaInventorySettings);
     });
   });
 
@@ -10853,7 +10988,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiaOnDisplayToOrderSettings();
       var od = api.LiaOnDisplayToOrderSettings.fromJson(o.toJson());
-      checkLiaOnDisplayToOrderSettings(od);
+      checkLiaOnDisplayToOrderSettings(od as api.LiaOnDisplayToOrderSettings);
     });
   });
 
@@ -10861,7 +10996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiaPosDataProvider();
       var od = api.LiaPosDataProvider.fromJson(o.toJson());
-      checkLiaPosDataProvider(od);
+      checkLiaPosDataProvider(od as api.LiaPosDataProvider);
     });
   });
 
@@ -10869,7 +11004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiaSettings();
       var od = api.LiaSettings.fromJson(o.toJson());
-      checkLiaSettings(od);
+      checkLiaSettings(od as api.LiaSettings);
     });
   });
 
@@ -10877,7 +11012,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsCustomBatchRequest();
       var od = api.LiasettingsCustomBatchRequest.fromJson(o.toJson());
-      checkLiasettingsCustomBatchRequest(od);
+      checkLiasettingsCustomBatchRequest(
+          od as api.LiasettingsCustomBatchRequest);
     });
   });
 
@@ -10885,7 +11021,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsCustomBatchRequestEntry();
       var od = api.LiasettingsCustomBatchRequestEntry.fromJson(o.toJson());
-      checkLiasettingsCustomBatchRequestEntry(od);
+      checkLiasettingsCustomBatchRequestEntry(
+          od as api.LiasettingsCustomBatchRequestEntry);
     });
   });
 
@@ -10893,7 +11030,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsCustomBatchResponse();
       var od = api.LiasettingsCustomBatchResponse.fromJson(o.toJson());
-      checkLiasettingsCustomBatchResponse(od);
+      checkLiasettingsCustomBatchResponse(
+          od as api.LiasettingsCustomBatchResponse);
     });
   });
 
@@ -10901,7 +11039,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsCustomBatchResponseEntry();
       var od = api.LiasettingsCustomBatchResponseEntry.fromJson(o.toJson());
-      checkLiasettingsCustomBatchResponseEntry(od);
+      checkLiasettingsCustomBatchResponseEntry(
+          od as api.LiasettingsCustomBatchResponseEntry);
     });
   });
 
@@ -10910,7 +11049,8 @@
       var o = buildLiasettingsGetAccessibleGmbAccountsResponse();
       var od =
           api.LiasettingsGetAccessibleGmbAccountsResponse.fromJson(o.toJson());
-      checkLiasettingsGetAccessibleGmbAccountsResponse(od);
+      checkLiasettingsGetAccessibleGmbAccountsResponse(
+          od as api.LiasettingsGetAccessibleGmbAccountsResponse);
     });
   });
 
@@ -10918,7 +11058,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsListPosDataProvidersResponse();
       var od = api.LiasettingsListPosDataProvidersResponse.fromJson(o.toJson());
-      checkLiasettingsListPosDataProvidersResponse(od);
+      checkLiasettingsListPosDataProvidersResponse(
+          od as api.LiasettingsListPosDataProvidersResponse);
     });
   });
 
@@ -10926,7 +11067,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsListResponse();
       var od = api.LiasettingsListResponse.fromJson(o.toJson());
-      checkLiasettingsListResponse(od);
+      checkLiasettingsListResponse(od as api.LiasettingsListResponse);
     });
   });
 
@@ -10934,7 +11075,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsRequestGmbAccessResponse();
       var od = api.LiasettingsRequestGmbAccessResponse.fromJson(o.toJson());
-      checkLiasettingsRequestGmbAccessResponse(od);
+      checkLiasettingsRequestGmbAccessResponse(
+          od as api.LiasettingsRequestGmbAccessResponse);
     });
   });
 
@@ -10944,7 +11086,8 @@
       var o = buildLiasettingsRequestInventoryVerificationResponse();
       var od = api.LiasettingsRequestInventoryVerificationResponse.fromJson(
           o.toJson());
-      checkLiasettingsRequestInventoryVerificationResponse(od);
+      checkLiasettingsRequestInventoryVerificationResponse(
+          od as api.LiasettingsRequestInventoryVerificationResponse);
     });
   });
 
@@ -10954,7 +11097,8 @@
       var o = buildLiasettingsSetInventoryVerificationContactResponse();
       var od = api.LiasettingsSetInventoryVerificationContactResponse.fromJson(
           o.toJson());
-      checkLiasettingsSetInventoryVerificationContactResponse(od);
+      checkLiasettingsSetInventoryVerificationContactResponse(
+          od as api.LiasettingsSetInventoryVerificationContactResponse);
     });
   });
 
@@ -10962,7 +11106,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiasettingsSetPosDataProviderResponse();
       var od = api.LiasettingsSetPosDataProviderResponse.fromJson(o.toJson());
-      checkLiasettingsSetPosDataProviderResponse(od);
+      checkLiasettingsSetPosDataProviderResponse(
+          od as api.LiasettingsSetPosDataProviderResponse);
     });
   });
 
@@ -10970,7 +11115,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinkService();
       var od = api.LinkService.fromJson(o.toJson());
-      checkLinkService(od);
+      checkLinkService(od as api.LinkService);
     });
   });
 
@@ -10978,7 +11123,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinkedAccount();
       var od = api.LinkedAccount.fromJson(o.toJson());
-      checkLinkedAccount(od);
+      checkLinkedAccount(od as api.LinkedAccount);
     });
   });
 
@@ -10986,7 +11131,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalInventory();
       var od = api.LocalInventory.fromJson(o.toJson());
-      checkLocalInventory(od);
+      checkLocalInventory(od as api.LocalInventory);
     });
   });
 
@@ -10994,7 +11139,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalinventoryCustomBatchRequest();
       var od = api.LocalinventoryCustomBatchRequest.fromJson(o.toJson());
-      checkLocalinventoryCustomBatchRequest(od);
+      checkLocalinventoryCustomBatchRequest(
+          od as api.LocalinventoryCustomBatchRequest);
     });
   });
 
@@ -11002,7 +11148,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalinventoryCustomBatchRequestEntry();
       var od = api.LocalinventoryCustomBatchRequestEntry.fromJson(o.toJson());
-      checkLocalinventoryCustomBatchRequestEntry(od);
+      checkLocalinventoryCustomBatchRequestEntry(
+          od as api.LocalinventoryCustomBatchRequestEntry);
     });
   });
 
@@ -11010,7 +11157,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalinventoryCustomBatchResponse();
       var od = api.LocalinventoryCustomBatchResponse.fromJson(o.toJson());
-      checkLocalinventoryCustomBatchResponse(od);
+      checkLocalinventoryCustomBatchResponse(
+          od as api.LocalinventoryCustomBatchResponse);
     });
   });
 
@@ -11018,7 +11166,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalinventoryCustomBatchResponseEntry();
       var od = api.LocalinventoryCustomBatchResponseEntry.fromJson(o.toJson());
-      checkLocalinventoryCustomBatchResponseEntry(od);
+      checkLocalinventoryCustomBatchResponseEntry(
+          od as api.LocalinventoryCustomBatchResponseEntry);
     });
   });
 
@@ -11026,7 +11175,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationIdSet();
       var od = api.LocationIdSet.fromJson(o.toJson());
-      checkLocationIdSet(od);
+      checkLocationIdSet(od as api.LocationIdSet);
     });
   });
 
@@ -11034,7 +11183,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoyaltyPoints();
       var od = api.LoyaltyPoints.fromJson(o.toJson());
-      checkLoyaltyPoints(od);
+      checkLoyaltyPoints(od as api.LoyaltyPoints);
     });
   });
 
@@ -11042,7 +11191,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMerchantOrderReturn();
       var od = api.MerchantOrderReturn.fromJson(o.toJson());
-      checkMerchantOrderReturn(od);
+      checkMerchantOrderReturn(od as api.MerchantOrderReturn);
     });
   });
 
@@ -11050,7 +11199,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMerchantOrderReturnItem();
       var od = api.MerchantOrderReturnItem.fromJson(o.toJson());
-      checkMerchantOrderReturnItem(od);
+      checkMerchantOrderReturnItem(od as api.MerchantOrderReturnItem);
     });
   });
 
@@ -11058,7 +11207,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMerchantRejectionReason();
       var od = api.MerchantRejectionReason.fromJson(o.toJson());
-      checkMerchantRejectionReason(od);
+      checkMerchantRejectionReason(od as api.MerchantRejectionReason);
     });
   });
 
@@ -11066,7 +11215,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMinimumOrderValueTable();
       var od = api.MinimumOrderValueTable.fromJson(o.toJson());
-      checkMinimumOrderValueTable(od);
+      checkMinimumOrderValueTable(od as api.MinimumOrderValueTable);
     });
   });
 
@@ -11075,7 +11224,8 @@
       var o = buildMinimumOrderValueTableStoreCodeSetWithMov();
       var od =
           api.MinimumOrderValueTableStoreCodeSetWithMov.fromJson(o.toJson());
-      checkMinimumOrderValueTableStoreCodeSetWithMov(od);
+      checkMinimumOrderValueTableStoreCodeSetWithMov(
+          od as api.MinimumOrderValueTableStoreCodeSetWithMov);
     });
   });
 
@@ -11083,7 +11233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonetaryAmount();
       var od = api.MonetaryAmount.fromJson(o.toJson());
-      checkMonetaryAmount(od);
+      checkMonetaryAmount(od as api.MonetaryAmount);
     });
   });
 
@@ -11091,7 +11241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrder();
       var od = api.Order.fromJson(o.toJson());
-      checkOrder(od);
+      checkOrder(od as api.Order);
     });
   });
 
@@ -11099,7 +11249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderAddress();
       var od = api.OrderAddress.fromJson(o.toJson());
-      checkOrderAddress(od);
+      checkOrderAddress(od as api.OrderAddress);
     });
   });
 
@@ -11107,7 +11257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderCancellation();
       var od = api.OrderCancellation.fromJson(o.toJson());
-      checkOrderCancellation(od);
+      checkOrderCancellation(od as api.OrderCancellation);
     });
   });
 
@@ -11115,7 +11265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderCustomer();
       var od = api.OrderCustomer.fromJson(o.toJson());
-      checkOrderCustomer(od);
+      checkOrderCustomer(od as api.OrderCustomer);
     });
   });
 
@@ -11123,7 +11273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderCustomerLoyaltyInfo();
       var od = api.OrderCustomerLoyaltyInfo.fromJson(o.toJson());
-      checkOrderCustomerLoyaltyInfo(od);
+      checkOrderCustomerLoyaltyInfo(od as api.OrderCustomerLoyaltyInfo);
     });
   });
 
@@ -11131,7 +11281,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderCustomerMarketingRightsInfo();
       var od = api.OrderCustomerMarketingRightsInfo.fromJson(o.toJson());
-      checkOrderCustomerMarketingRightsInfo(od);
+      checkOrderCustomerMarketingRightsInfo(
+          od as api.OrderCustomerMarketingRightsInfo);
     });
   });
 
@@ -11139,7 +11290,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderDeliveryDetails();
       var od = api.OrderDeliveryDetails.fromJson(o.toJson());
-      checkOrderDeliveryDetails(od);
+      checkOrderDeliveryDetails(od as api.OrderDeliveryDetails);
     });
   });
 
@@ -11147,7 +11298,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItem();
       var od = api.OrderLineItem.fromJson(o.toJson());
-      checkOrderLineItem(od);
+      checkOrderLineItem(od as api.OrderLineItem);
     });
   });
 
@@ -11155,7 +11306,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItemAdjustment();
       var od = api.OrderLineItemAdjustment.fromJson(o.toJson());
-      checkOrderLineItemAdjustment(od);
+      checkOrderLineItemAdjustment(od as api.OrderLineItemAdjustment);
     });
   });
 
@@ -11163,7 +11314,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItemProduct();
       var od = api.OrderLineItemProduct.fromJson(o.toJson());
-      checkOrderLineItemProduct(od);
+      checkOrderLineItemProduct(od as api.OrderLineItemProduct);
     });
   });
 
@@ -11171,7 +11322,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItemProductFee();
       var od = api.OrderLineItemProductFee.fromJson(o.toJson());
-      checkOrderLineItemProductFee(od);
+      checkOrderLineItemProductFee(od as api.OrderLineItemProductFee);
     });
   });
 
@@ -11179,7 +11330,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItemProductVariantAttribute();
       var od = api.OrderLineItemProductVariantAttribute.fromJson(o.toJson());
-      checkOrderLineItemProductVariantAttribute(od);
+      checkOrderLineItemProductVariantAttribute(
+          od as api.OrderLineItemProductVariantAttribute);
     });
   });
 
@@ -11187,7 +11339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItemReturnInfo();
       var od = api.OrderLineItemReturnInfo.fromJson(o.toJson());
-      checkOrderLineItemReturnInfo(od);
+      checkOrderLineItemReturnInfo(od as api.OrderLineItemReturnInfo);
     });
   });
 
@@ -11195,7 +11347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItemShippingDetails();
       var od = api.OrderLineItemShippingDetails.fromJson(o.toJson());
-      checkOrderLineItemShippingDetails(od);
+      checkOrderLineItemShippingDetails(od as api.OrderLineItemShippingDetails);
     });
   });
 
@@ -11203,7 +11355,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderLineItemShippingDetailsMethod();
       var od = api.OrderLineItemShippingDetailsMethod.fromJson(o.toJson());
-      checkOrderLineItemShippingDetailsMethod(od);
+      checkOrderLineItemShippingDetailsMethod(
+          od as api.OrderLineItemShippingDetailsMethod);
     });
   });
 
@@ -11211,7 +11364,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderMerchantProvidedAnnotation();
       var od = api.OrderMerchantProvidedAnnotation.fromJson(o.toJson());
-      checkOrderMerchantProvidedAnnotation(od);
+      checkOrderMerchantProvidedAnnotation(
+          od as api.OrderMerchantProvidedAnnotation);
     });
   });
 
@@ -11219,7 +11373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderOrderAnnotation();
       var od = api.OrderOrderAnnotation.fromJson(o.toJson());
-      checkOrderOrderAnnotation(od);
+      checkOrderOrderAnnotation(od as api.OrderOrderAnnotation);
     });
   });
 
@@ -11227,7 +11381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderPickupDetails();
       var od = api.OrderPickupDetails.fromJson(o.toJson());
-      checkOrderPickupDetails(od);
+      checkOrderPickupDetails(od as api.OrderPickupDetails);
     });
   });
 
@@ -11235,7 +11389,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderPickupDetailsCollector();
       var od = api.OrderPickupDetailsCollector.fromJson(o.toJson());
-      checkOrderPickupDetailsCollector(od);
+      checkOrderPickupDetailsCollector(od as api.OrderPickupDetailsCollector);
     });
   });
 
@@ -11243,7 +11397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderPromotion();
       var od = api.OrderPromotion.fromJson(o.toJson());
-      checkOrderPromotion(od);
+      checkOrderPromotion(od as api.OrderPromotion);
     });
   });
 
@@ -11251,7 +11405,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderPromotionItem();
       var od = api.OrderPromotionItem.fromJson(o.toJson());
-      checkOrderPromotionItem(od);
+      checkOrderPromotionItem(od as api.OrderPromotionItem);
     });
   });
 
@@ -11259,7 +11413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderRefund();
       var od = api.OrderRefund.fromJson(o.toJson());
-      checkOrderRefund(od);
+      checkOrderRefund(od as api.OrderRefund);
     });
   });
 
@@ -11267,7 +11421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderReportDisbursement();
       var od = api.OrderReportDisbursement.fromJson(o.toJson());
-      checkOrderReportDisbursement(od);
+      checkOrderReportDisbursement(od as api.OrderReportDisbursement);
     });
   });
 
@@ -11275,7 +11429,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderReportTransaction();
       var od = api.OrderReportTransaction.fromJson(o.toJson());
-      checkOrderReportTransaction(od);
+      checkOrderReportTransaction(od as api.OrderReportTransaction);
     });
   });
 
@@ -11283,7 +11437,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderReturn();
       var od = api.OrderReturn.fromJson(o.toJson());
-      checkOrderReturn(od);
+      checkOrderReturn(od as api.OrderReturn);
     });
   });
 
@@ -11291,7 +11445,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderShipment();
       var od = api.OrderShipment.fromJson(o.toJson());
-      checkOrderShipment(od);
+      checkOrderShipment(od as api.OrderShipment);
     });
   });
 
@@ -11299,7 +11453,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderShipmentLineItemShipment();
       var od = api.OrderShipmentLineItemShipment.fromJson(o.toJson());
-      checkOrderShipmentLineItemShipment(od);
+      checkOrderShipmentLineItemShipment(
+          od as api.OrderShipmentLineItemShipment);
     });
   });
 
@@ -11307,7 +11462,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderShipmentScheduledDeliveryDetails();
       var od = api.OrderShipmentScheduledDeliveryDetails.fromJson(o.toJson());
-      checkOrderShipmentScheduledDeliveryDetails(od);
+      checkOrderShipmentScheduledDeliveryDetails(
+          od as api.OrderShipmentScheduledDeliveryDetails);
     });
   });
 
@@ -11315,7 +11471,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderinvoicesCreateChargeInvoiceRequest();
       var od = api.OrderinvoicesCreateChargeInvoiceRequest.fromJson(o.toJson());
-      checkOrderinvoicesCreateChargeInvoiceRequest(od);
+      checkOrderinvoicesCreateChargeInvoiceRequest(
+          od as api.OrderinvoicesCreateChargeInvoiceRequest);
     });
   });
 
@@ -11324,7 +11481,8 @@
       var o = buildOrderinvoicesCreateChargeInvoiceResponse();
       var od =
           api.OrderinvoicesCreateChargeInvoiceResponse.fromJson(o.toJson());
-      checkOrderinvoicesCreateChargeInvoiceResponse(od);
+      checkOrderinvoicesCreateChargeInvoiceResponse(
+          od as api.OrderinvoicesCreateChargeInvoiceResponse);
     });
   });
 
@@ -11332,7 +11490,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderinvoicesCreateRefundInvoiceRequest();
       var od = api.OrderinvoicesCreateRefundInvoiceRequest.fromJson(o.toJson());
-      checkOrderinvoicesCreateRefundInvoiceRequest(od);
+      checkOrderinvoicesCreateRefundInvoiceRequest(
+          od as api.OrderinvoicesCreateRefundInvoiceRequest);
     });
   });
 
@@ -11341,7 +11500,8 @@
       var o = buildOrderinvoicesCreateRefundInvoiceResponse();
       var od =
           api.OrderinvoicesCreateRefundInvoiceResponse.fromJson(o.toJson());
-      checkOrderinvoicesCreateRefundInvoiceResponse(od);
+      checkOrderinvoicesCreateRefundInvoiceResponse(
+          od as api.OrderinvoicesCreateRefundInvoiceResponse);
     });
   });
 
@@ -11355,7 +11515,8 @@
           api.OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption
               .fromJson(o.toJson());
       checkOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption(
-          od);
+          od as api
+              .OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceRefundOption);
     });
   });
 
@@ -11369,7 +11530,8 @@
           api.OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption
               .fromJson(o.toJson());
       checkOrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption(
-          od);
+          od as api
+              .OrderinvoicesCustomBatchRequestEntryCreateRefundInvoiceReturnOption);
     });
   });
 
@@ -11377,7 +11539,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreportsListDisbursementsResponse();
       var od = api.OrderreportsListDisbursementsResponse.fromJson(o.toJson());
-      checkOrderreportsListDisbursementsResponse(od);
+      checkOrderreportsListDisbursementsResponse(
+          od as api.OrderreportsListDisbursementsResponse);
     });
   });
 
@@ -11385,7 +11548,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreportsListTransactionsResponse();
       var od = api.OrderreportsListTransactionsResponse.fromJson(o.toJson());
-      checkOrderreportsListTransactionsResponse(od);
+      checkOrderreportsListTransactionsResponse(
+          od as api.OrderreportsListTransactionsResponse);
     });
   });
 
@@ -11393,7 +11557,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsAcknowledgeRequest();
       var od = api.OrderreturnsAcknowledgeRequest.fromJson(o.toJson());
-      checkOrderreturnsAcknowledgeRequest(od);
+      checkOrderreturnsAcknowledgeRequest(
+          od as api.OrderreturnsAcknowledgeRequest);
     });
   });
 
@@ -11401,7 +11566,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsAcknowledgeResponse();
       var od = api.OrderreturnsAcknowledgeResponse.fromJson(o.toJson());
-      checkOrderreturnsAcknowledgeResponse(od);
+      checkOrderreturnsAcknowledgeResponse(
+          od as api.OrderreturnsAcknowledgeResponse);
     });
   });
 
@@ -11409,7 +11575,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsCreateOrderReturnRequest();
       var od = api.OrderreturnsCreateOrderReturnRequest.fromJson(o.toJson());
-      checkOrderreturnsCreateOrderReturnRequest(od);
+      checkOrderreturnsCreateOrderReturnRequest(
+          od as api.OrderreturnsCreateOrderReturnRequest);
     });
   });
 
@@ -11417,7 +11584,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsCreateOrderReturnResponse();
       var od = api.OrderreturnsCreateOrderReturnResponse.fromJson(o.toJson());
-      checkOrderreturnsCreateOrderReturnResponse(od);
+      checkOrderreturnsCreateOrderReturnResponse(
+          od as api.OrderreturnsCreateOrderReturnResponse);
     });
   });
 
@@ -11425,7 +11593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsLineItem();
       var od = api.OrderreturnsLineItem.fromJson(o.toJson());
-      checkOrderreturnsLineItem(od);
+      checkOrderreturnsLineItem(od as api.OrderreturnsLineItem);
     });
   });
 
@@ -11433,7 +11601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsListResponse();
       var od = api.OrderreturnsListResponse.fromJson(o.toJson());
-      checkOrderreturnsListResponse(od);
+      checkOrderreturnsListResponse(od as api.OrderreturnsListResponse);
     });
   });
 
@@ -11441,7 +11609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsPartialRefund();
       var od = api.OrderreturnsPartialRefund.fromJson(o.toJson());
-      checkOrderreturnsPartialRefund(od);
+      checkOrderreturnsPartialRefund(od as api.OrderreturnsPartialRefund);
     });
   });
 
@@ -11449,7 +11617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsProcessRequest();
       var od = api.OrderreturnsProcessRequest.fromJson(o.toJson());
-      checkOrderreturnsProcessRequest(od);
+      checkOrderreturnsProcessRequest(od as api.OrderreturnsProcessRequest);
     });
   });
 
@@ -11457,7 +11625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsProcessResponse();
       var od = api.OrderreturnsProcessResponse.fromJson(o.toJson());
-      checkOrderreturnsProcessResponse(od);
+      checkOrderreturnsProcessResponse(od as api.OrderreturnsProcessResponse);
     });
   });
 
@@ -11465,7 +11633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsRefundOperation();
       var od = api.OrderreturnsRefundOperation.fromJson(o.toJson());
-      checkOrderreturnsRefundOperation(od);
+      checkOrderreturnsRefundOperation(od as api.OrderreturnsRefundOperation);
     });
   });
 
@@ -11473,7 +11641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsRejectOperation();
       var od = api.OrderreturnsRejectOperation.fromJson(o.toJson());
-      checkOrderreturnsRejectOperation(od);
+      checkOrderreturnsRejectOperation(od as api.OrderreturnsRejectOperation);
     });
   });
 
@@ -11481,7 +11649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderreturnsReturnItem();
       var od = api.OrderreturnsReturnItem.fromJson(o.toJson());
-      checkOrderreturnsReturnItem(od);
+      checkOrderreturnsReturnItem(od as api.OrderreturnsReturnItem);
     });
   });
 
@@ -11489,7 +11657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersAcknowledgeRequest();
       var od = api.OrdersAcknowledgeRequest.fromJson(o.toJson());
-      checkOrdersAcknowledgeRequest(od);
+      checkOrdersAcknowledgeRequest(od as api.OrdersAcknowledgeRequest);
     });
   });
 
@@ -11497,7 +11665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersAcknowledgeResponse();
       var od = api.OrdersAcknowledgeResponse.fromJson(o.toJson());
-      checkOrdersAcknowledgeResponse(od);
+      checkOrdersAcknowledgeResponse(od as api.OrdersAcknowledgeResponse);
     });
   });
 
@@ -11505,7 +11673,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersAdvanceTestOrderResponse();
       var od = api.OrdersAdvanceTestOrderResponse.fromJson(o.toJson());
-      checkOrdersAdvanceTestOrderResponse(od);
+      checkOrdersAdvanceTestOrderResponse(
+          od as api.OrdersAdvanceTestOrderResponse);
     });
   });
 
@@ -11513,7 +11682,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCancelLineItemRequest();
       var od = api.OrdersCancelLineItemRequest.fromJson(o.toJson());
-      checkOrdersCancelLineItemRequest(od);
+      checkOrdersCancelLineItemRequest(od as api.OrdersCancelLineItemRequest);
     });
   });
 
@@ -11521,7 +11690,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCancelLineItemResponse();
       var od = api.OrdersCancelLineItemResponse.fromJson(o.toJson());
-      checkOrdersCancelLineItemResponse(od);
+      checkOrdersCancelLineItemResponse(od as api.OrdersCancelLineItemResponse);
     });
   });
 
@@ -11529,7 +11698,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCancelRequest();
       var od = api.OrdersCancelRequest.fromJson(o.toJson());
-      checkOrdersCancelRequest(od);
+      checkOrdersCancelRequest(od as api.OrdersCancelRequest);
     });
   });
 
@@ -11537,7 +11706,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCancelResponse();
       var od = api.OrdersCancelResponse.fromJson(o.toJson());
-      checkOrdersCancelResponse(od);
+      checkOrdersCancelResponse(od as api.OrdersCancelResponse);
     });
   });
 
@@ -11545,7 +11714,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCancelTestOrderByCustomerRequest();
       var od = api.OrdersCancelTestOrderByCustomerRequest.fromJson(o.toJson());
-      checkOrdersCancelTestOrderByCustomerRequest(od);
+      checkOrdersCancelTestOrderByCustomerRequest(
+          od as api.OrdersCancelTestOrderByCustomerRequest);
     });
   });
 
@@ -11553,7 +11723,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCancelTestOrderByCustomerResponse();
       var od = api.OrdersCancelTestOrderByCustomerResponse.fromJson(o.toJson());
-      checkOrdersCancelTestOrderByCustomerResponse(od);
+      checkOrdersCancelTestOrderByCustomerResponse(
+          od as api.OrdersCancelTestOrderByCustomerResponse);
     });
   });
 
@@ -11561,7 +11732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCreateTestOrderRequest();
       var od = api.OrdersCreateTestOrderRequest.fromJson(o.toJson());
-      checkOrdersCreateTestOrderRequest(od);
+      checkOrdersCreateTestOrderRequest(od as api.OrdersCreateTestOrderRequest);
     });
   });
 
@@ -11569,7 +11740,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCreateTestOrderResponse();
       var od = api.OrdersCreateTestOrderResponse.fromJson(o.toJson());
-      checkOrdersCreateTestOrderResponse(od);
+      checkOrdersCreateTestOrderResponse(
+          od as api.OrdersCreateTestOrderResponse);
     });
   });
 
@@ -11577,7 +11749,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCreateTestReturnRequest();
       var od = api.OrdersCreateTestReturnRequest.fromJson(o.toJson());
-      checkOrdersCreateTestReturnRequest(od);
+      checkOrdersCreateTestReturnRequest(
+          od as api.OrdersCreateTestReturnRequest);
     });
   });
 
@@ -11585,7 +11758,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersCreateTestReturnResponse();
       var od = api.OrdersCreateTestReturnResponse.fromJson(o.toJson());
-      checkOrdersCreateTestReturnResponse(od);
+      checkOrdersCreateTestReturnResponse(
+          od as api.OrdersCreateTestReturnResponse);
     });
   });
 
@@ -11596,7 +11770,8 @@
       var od =
           api.OrdersCustomBatchRequestEntryCreateTestReturnReturnItem.fromJson(
               o.toJson());
-      checkOrdersCustomBatchRequestEntryCreateTestReturnReturnItem(od);
+      checkOrdersCustomBatchRequestEntryCreateTestReturnReturnItem(
+          od as api.OrdersCustomBatchRequestEntryCreateTestReturnReturnItem);
     });
   });
 
@@ -11605,7 +11780,8 @@
       var o = buildOrdersCustomBatchRequestEntryRefundItemItem();
       var od =
           api.OrdersCustomBatchRequestEntryRefundItemItem.fromJson(o.toJson());
-      checkOrdersCustomBatchRequestEntryRefundItemItem(od);
+      checkOrdersCustomBatchRequestEntryRefundItemItem(
+          od as api.OrdersCustomBatchRequestEntryRefundItemItem);
     });
   });
 
@@ -11615,7 +11791,8 @@
       var o = buildOrdersCustomBatchRequestEntryRefundItemShipping();
       var od = api.OrdersCustomBatchRequestEntryRefundItemShipping.fromJson(
           o.toJson());
-      checkOrdersCustomBatchRequestEntryRefundItemShipping(od);
+      checkOrdersCustomBatchRequestEntryRefundItemShipping(
+          od as api.OrdersCustomBatchRequestEntryRefundItemShipping);
     });
   });
 
@@ -11626,7 +11803,8 @@
       var od =
           api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo.fromJson(
               o.toJson());
-      checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(od);
+      checkOrdersCustomBatchRequestEntryShipLineItemsShipmentInfo(
+          od as api.OrdersCustomBatchRequestEntryShipLineItemsShipmentInfo);
     });
   });
 
@@ -11634,7 +11812,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersGetByMerchantOrderIdResponse();
       var od = api.OrdersGetByMerchantOrderIdResponse.fromJson(o.toJson());
-      checkOrdersGetByMerchantOrderIdResponse(od);
+      checkOrdersGetByMerchantOrderIdResponse(
+          od as api.OrdersGetByMerchantOrderIdResponse);
     });
   });
 
@@ -11642,7 +11821,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersGetTestOrderTemplateResponse();
       var od = api.OrdersGetTestOrderTemplateResponse.fromJson(o.toJson());
-      checkOrdersGetTestOrderTemplateResponse(od);
+      checkOrdersGetTestOrderTemplateResponse(
+          od as api.OrdersGetTestOrderTemplateResponse);
     });
   });
 
@@ -11650,7 +11830,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersInStoreRefundLineItemRequest();
       var od = api.OrdersInStoreRefundLineItemRequest.fromJson(o.toJson());
-      checkOrdersInStoreRefundLineItemRequest(od);
+      checkOrdersInStoreRefundLineItemRequest(
+          od as api.OrdersInStoreRefundLineItemRequest);
     });
   });
 
@@ -11658,7 +11839,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersInStoreRefundLineItemResponse();
       var od = api.OrdersInStoreRefundLineItemResponse.fromJson(o.toJson());
-      checkOrdersInStoreRefundLineItemResponse(od);
+      checkOrdersInStoreRefundLineItemResponse(
+          od as api.OrdersInStoreRefundLineItemResponse);
     });
   });
 
@@ -11666,7 +11848,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersListResponse();
       var od = api.OrdersListResponse.fromJson(o.toJson());
-      checkOrdersListResponse(od);
+      checkOrdersListResponse(od as api.OrdersListResponse);
     });
   });
 
@@ -11674,7 +11856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersRefundItemRequest();
       var od = api.OrdersRefundItemRequest.fromJson(o.toJson());
-      checkOrdersRefundItemRequest(od);
+      checkOrdersRefundItemRequest(od as api.OrdersRefundItemRequest);
     });
   });
 
@@ -11682,7 +11864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersRefundItemResponse();
       var od = api.OrdersRefundItemResponse.fromJson(o.toJson());
-      checkOrdersRefundItemResponse(od);
+      checkOrdersRefundItemResponse(od as api.OrdersRefundItemResponse);
     });
   });
 
@@ -11690,7 +11872,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersRefundOrderRequest();
       var od = api.OrdersRefundOrderRequest.fromJson(o.toJson());
-      checkOrdersRefundOrderRequest(od);
+      checkOrdersRefundOrderRequest(od as api.OrdersRefundOrderRequest);
     });
   });
 
@@ -11698,7 +11880,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersRefundOrderResponse();
       var od = api.OrdersRefundOrderResponse.fromJson(o.toJson());
-      checkOrdersRefundOrderResponse(od);
+      checkOrdersRefundOrderResponse(od as api.OrdersRefundOrderResponse);
     });
   });
 
@@ -11706,7 +11888,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersRejectReturnLineItemRequest();
       var od = api.OrdersRejectReturnLineItemRequest.fromJson(o.toJson());
-      checkOrdersRejectReturnLineItemRequest(od);
+      checkOrdersRejectReturnLineItemRequest(
+          od as api.OrdersRejectReturnLineItemRequest);
     });
   });
 
@@ -11714,7 +11897,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersRejectReturnLineItemResponse();
       var od = api.OrdersRejectReturnLineItemResponse.fromJson(o.toJson());
-      checkOrdersRejectReturnLineItemResponse(od);
+      checkOrdersRejectReturnLineItemResponse(
+          od as api.OrdersRejectReturnLineItemResponse);
     });
   });
 
@@ -11722,7 +11906,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersReturnRefundLineItemRequest();
       var od = api.OrdersReturnRefundLineItemRequest.fromJson(o.toJson());
-      checkOrdersReturnRefundLineItemRequest(od);
+      checkOrdersReturnRefundLineItemRequest(
+          od as api.OrdersReturnRefundLineItemRequest);
     });
   });
 
@@ -11730,7 +11915,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersReturnRefundLineItemResponse();
       var od = api.OrdersReturnRefundLineItemResponse.fromJson(o.toJson());
-      checkOrdersReturnRefundLineItemResponse(od);
+      checkOrdersReturnRefundLineItemResponse(
+          od as api.OrdersReturnRefundLineItemResponse);
     });
   });
 
@@ -11738,7 +11924,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersSetLineItemMetadataRequest();
       var od = api.OrdersSetLineItemMetadataRequest.fromJson(o.toJson());
-      checkOrdersSetLineItemMetadataRequest(od);
+      checkOrdersSetLineItemMetadataRequest(
+          od as api.OrdersSetLineItemMetadataRequest);
     });
   });
 
@@ -11746,7 +11933,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersSetLineItemMetadataResponse();
       var od = api.OrdersSetLineItemMetadataResponse.fromJson(o.toJson());
-      checkOrdersSetLineItemMetadataResponse(od);
+      checkOrdersSetLineItemMetadataResponse(
+          od as api.OrdersSetLineItemMetadataResponse);
     });
   });
 
@@ -11754,7 +11942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersShipLineItemsRequest();
       var od = api.OrdersShipLineItemsRequest.fromJson(o.toJson());
-      checkOrdersShipLineItemsRequest(od);
+      checkOrdersShipLineItemsRequest(od as api.OrdersShipLineItemsRequest);
     });
   });
 
@@ -11762,7 +11950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersShipLineItemsResponse();
       var od = api.OrdersShipLineItemsResponse.fromJson(o.toJson());
-      checkOrdersShipLineItemsResponse(od);
+      checkOrdersShipLineItemsResponse(od as api.OrdersShipLineItemsResponse);
     });
   });
 
@@ -11771,7 +11959,8 @@
       var o = buildOrdersUpdateLineItemShippingDetailsRequest();
       var od =
           api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(o.toJson());
-      checkOrdersUpdateLineItemShippingDetailsRequest(od);
+      checkOrdersUpdateLineItemShippingDetailsRequest(
+          od as api.OrdersUpdateLineItemShippingDetailsRequest);
     });
   });
 
@@ -11780,7 +11969,8 @@
       var o = buildOrdersUpdateLineItemShippingDetailsResponse();
       var od =
           api.OrdersUpdateLineItemShippingDetailsResponse.fromJson(o.toJson());
-      checkOrdersUpdateLineItemShippingDetailsResponse(od);
+      checkOrdersUpdateLineItemShippingDetailsResponse(
+          od as api.OrdersUpdateLineItemShippingDetailsResponse);
     });
   });
 
@@ -11788,7 +11978,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersUpdateMerchantOrderIdRequest();
       var od = api.OrdersUpdateMerchantOrderIdRequest.fromJson(o.toJson());
-      checkOrdersUpdateMerchantOrderIdRequest(od);
+      checkOrdersUpdateMerchantOrderIdRequest(
+          od as api.OrdersUpdateMerchantOrderIdRequest);
     });
   });
 
@@ -11796,7 +11987,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersUpdateMerchantOrderIdResponse();
       var od = api.OrdersUpdateMerchantOrderIdResponse.fromJson(o.toJson());
-      checkOrdersUpdateMerchantOrderIdResponse(od);
+      checkOrdersUpdateMerchantOrderIdResponse(
+          od as api.OrdersUpdateMerchantOrderIdResponse);
     });
   });
 
@@ -11804,7 +11996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersUpdateShipmentRequest();
       var od = api.OrdersUpdateShipmentRequest.fromJson(o.toJson());
-      checkOrdersUpdateShipmentRequest(od);
+      checkOrdersUpdateShipmentRequest(od as api.OrdersUpdateShipmentRequest);
     });
   });
 
@@ -11812,7 +12004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersUpdateShipmentResponse();
       var od = api.OrdersUpdateShipmentResponse.fromJson(o.toJson());
-      checkOrdersUpdateShipmentResponse(od);
+      checkOrdersUpdateShipmentResponse(od as api.OrdersUpdateShipmentResponse);
     });
   });
 
@@ -11820,7 +12012,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPickupCarrierService();
       var od = api.PickupCarrierService.fromJson(o.toJson());
-      checkPickupCarrierService(od);
+      checkPickupCarrierService(od as api.PickupCarrierService);
     });
   });
 
@@ -11828,7 +12020,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPickupServicesPickupService();
       var od = api.PickupServicesPickupService.fromJson(o.toJson());
-      checkPickupServicesPickupService(od);
+      checkPickupServicesPickupService(od as api.PickupServicesPickupService);
     });
   });
 
@@ -11836,7 +12028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosCustomBatchRequest();
       var od = api.PosCustomBatchRequest.fromJson(o.toJson());
-      checkPosCustomBatchRequest(od);
+      checkPosCustomBatchRequest(od as api.PosCustomBatchRequest);
     });
   });
 
@@ -11844,7 +12036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosCustomBatchRequestEntry();
       var od = api.PosCustomBatchRequestEntry.fromJson(o.toJson());
-      checkPosCustomBatchRequestEntry(od);
+      checkPosCustomBatchRequestEntry(od as api.PosCustomBatchRequestEntry);
     });
   });
 
@@ -11852,7 +12044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosCustomBatchResponse();
       var od = api.PosCustomBatchResponse.fromJson(o.toJson());
-      checkPosCustomBatchResponse(od);
+      checkPosCustomBatchResponse(od as api.PosCustomBatchResponse);
     });
   });
 
@@ -11860,7 +12052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosCustomBatchResponseEntry();
       var od = api.PosCustomBatchResponseEntry.fromJson(o.toJson());
-      checkPosCustomBatchResponseEntry(od);
+      checkPosCustomBatchResponseEntry(od as api.PosCustomBatchResponseEntry);
     });
   });
 
@@ -11868,7 +12060,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosDataProviders();
       var od = api.PosDataProviders.fromJson(o.toJson());
-      checkPosDataProviders(od);
+      checkPosDataProviders(od as api.PosDataProviders);
     });
   });
 
@@ -11876,7 +12068,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosDataProvidersPosDataProvider();
       var od = api.PosDataProvidersPosDataProvider.fromJson(o.toJson());
-      checkPosDataProvidersPosDataProvider(od);
+      checkPosDataProvidersPosDataProvider(
+          od as api.PosDataProvidersPosDataProvider);
     });
   });
 
@@ -11884,7 +12077,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosInventory();
       var od = api.PosInventory.fromJson(o.toJson());
-      checkPosInventory(od);
+      checkPosInventory(od as api.PosInventory);
     });
   });
 
@@ -11892,7 +12085,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosInventoryRequest();
       var od = api.PosInventoryRequest.fromJson(o.toJson());
-      checkPosInventoryRequest(od);
+      checkPosInventoryRequest(od as api.PosInventoryRequest);
     });
   });
 
@@ -11900,7 +12093,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosInventoryResponse();
       var od = api.PosInventoryResponse.fromJson(o.toJson());
-      checkPosInventoryResponse(od);
+      checkPosInventoryResponse(od as api.PosInventoryResponse);
     });
   });
 
@@ -11908,7 +12101,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosListResponse();
       var od = api.PosListResponse.fromJson(o.toJson());
-      checkPosListResponse(od);
+      checkPosListResponse(od as api.PosListResponse);
     });
   });
 
@@ -11916,7 +12109,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosSale();
       var od = api.PosSale.fromJson(o.toJson());
-      checkPosSale(od);
+      checkPosSale(od as api.PosSale);
     });
   });
 
@@ -11924,7 +12117,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosSaleRequest();
       var od = api.PosSaleRequest.fromJson(o.toJson());
-      checkPosSaleRequest(od);
+      checkPosSaleRequest(od as api.PosSaleRequest);
     });
   });
 
@@ -11932,7 +12125,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosSaleResponse();
       var od = api.PosSaleResponse.fromJson(o.toJson());
-      checkPosSaleResponse(od);
+      checkPosSaleResponse(od as api.PosSaleResponse);
     });
   });
 
@@ -11940,7 +12133,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosStore();
       var od = api.PosStore.fromJson(o.toJson());
-      checkPosStore(od);
+      checkPosStore(od as api.PosStore);
     });
   });
 
@@ -11948,7 +12141,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostalCodeGroup();
       var od = api.PostalCodeGroup.fromJson(o.toJson());
-      checkPostalCodeGroup(od);
+      checkPostalCodeGroup(od as api.PostalCodeGroup);
     });
   });
 
@@ -11956,7 +12149,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostalCodeRange();
       var od = api.PostalCodeRange.fromJson(o.toJson());
-      checkPostalCodeRange(od);
+      checkPostalCodeRange(od as api.PostalCodeRange);
     });
   });
 
@@ -11964,7 +12157,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrice();
       var od = api.Price.fromJson(o.toJson());
-      checkPrice(od);
+      checkPrice(od as api.Price);
     });
   });
 
@@ -11972,7 +12165,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProduct();
       var od = api.Product.fromJson(o.toJson());
-      checkProduct(od);
+      checkProduct(od as api.Product);
     });
   });
 
@@ -11980,7 +12173,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductAmount();
       var od = api.ProductAmount.fromJson(o.toJson());
-      checkProductAmount(od);
+      checkProductAmount(od as api.ProductAmount);
     });
   });
 
@@ -11988,7 +12181,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductProductDetail();
       var od = api.ProductProductDetail.fromJson(o.toJson());
-      checkProductProductDetail(od);
+      checkProductProductDetail(od as api.ProductProductDetail);
     });
   });
 
@@ -11996,7 +12189,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductShipping();
       var od = api.ProductShipping.fromJson(o.toJson());
-      checkProductShipping(od);
+      checkProductShipping(od as api.ProductShipping);
     });
   });
 
@@ -12004,7 +12197,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductShippingDimension();
       var od = api.ProductShippingDimension.fromJson(o.toJson());
-      checkProductShippingDimension(od);
+      checkProductShippingDimension(od as api.ProductShippingDimension);
     });
   });
 
@@ -12012,7 +12205,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductShippingWeight();
       var od = api.ProductShippingWeight.fromJson(o.toJson());
-      checkProductShippingWeight(od);
+      checkProductShippingWeight(od as api.ProductShippingWeight);
     });
   });
 
@@ -12020,7 +12213,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductStatus();
       var od = api.ProductStatus.fromJson(o.toJson());
-      checkProductStatus(od);
+      checkProductStatus(od as api.ProductStatus);
     });
   });
 
@@ -12028,7 +12221,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductStatusDestinationStatus();
       var od = api.ProductStatusDestinationStatus.fromJson(o.toJson());
-      checkProductStatusDestinationStatus(od);
+      checkProductStatusDestinationStatus(
+          od as api.ProductStatusDestinationStatus);
     });
   });
 
@@ -12036,7 +12230,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductStatusItemLevelIssue();
       var od = api.ProductStatusItemLevelIssue.fromJson(o.toJson());
-      checkProductStatusItemLevelIssue(od);
+      checkProductStatusItemLevelIssue(od as api.ProductStatusItemLevelIssue);
     });
   });
 
@@ -12044,7 +12238,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductSubscriptionCost();
       var od = api.ProductSubscriptionCost.fromJson(o.toJson());
-      checkProductSubscriptionCost(od);
+      checkProductSubscriptionCost(od as api.ProductSubscriptionCost);
     });
   });
 
@@ -12052,7 +12246,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductTax();
       var od = api.ProductTax.fromJson(o.toJson());
-      checkProductTax(od);
+      checkProductTax(od as api.ProductTax);
     });
   });
 
@@ -12060,7 +12254,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductUnitPricingBaseMeasure();
       var od = api.ProductUnitPricingBaseMeasure.fromJson(o.toJson());
-      checkProductUnitPricingBaseMeasure(od);
+      checkProductUnitPricingBaseMeasure(
+          od as api.ProductUnitPricingBaseMeasure);
     });
   });
 
@@ -12068,7 +12263,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductUnitPricingMeasure();
       var od = api.ProductUnitPricingMeasure.fromJson(o.toJson());
-      checkProductUnitPricingMeasure(od);
+      checkProductUnitPricingMeasure(od as api.ProductUnitPricingMeasure);
     });
   });
 
@@ -12076,7 +12271,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsCustomBatchRequest();
       var od = api.ProductsCustomBatchRequest.fromJson(o.toJson());
-      checkProductsCustomBatchRequest(od);
+      checkProductsCustomBatchRequest(od as api.ProductsCustomBatchRequest);
     });
   });
 
@@ -12084,7 +12279,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsCustomBatchRequestEntry();
       var od = api.ProductsCustomBatchRequestEntry.fromJson(o.toJson());
-      checkProductsCustomBatchRequestEntry(od);
+      checkProductsCustomBatchRequestEntry(
+          od as api.ProductsCustomBatchRequestEntry);
     });
   });
 
@@ -12092,7 +12288,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsCustomBatchResponse();
       var od = api.ProductsCustomBatchResponse.fromJson(o.toJson());
-      checkProductsCustomBatchResponse(od);
+      checkProductsCustomBatchResponse(od as api.ProductsCustomBatchResponse);
     });
   });
 
@@ -12100,7 +12296,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsCustomBatchResponseEntry();
       var od = api.ProductsCustomBatchResponseEntry.fromJson(o.toJson());
-      checkProductsCustomBatchResponseEntry(od);
+      checkProductsCustomBatchResponseEntry(
+          od as api.ProductsCustomBatchResponseEntry);
     });
   });
 
@@ -12108,7 +12305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductsListResponse();
       var od = api.ProductsListResponse.fromJson(o.toJson());
-      checkProductsListResponse(od);
+      checkProductsListResponse(od as api.ProductsListResponse);
     });
   });
 
@@ -12116,7 +12313,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductstatusesCustomBatchRequest();
       var od = api.ProductstatusesCustomBatchRequest.fromJson(o.toJson());
-      checkProductstatusesCustomBatchRequest(od);
+      checkProductstatusesCustomBatchRequest(
+          od as api.ProductstatusesCustomBatchRequest);
     });
   });
 
@@ -12124,7 +12322,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductstatusesCustomBatchRequestEntry();
       var od = api.ProductstatusesCustomBatchRequestEntry.fromJson(o.toJson());
-      checkProductstatusesCustomBatchRequestEntry(od);
+      checkProductstatusesCustomBatchRequestEntry(
+          od as api.ProductstatusesCustomBatchRequestEntry);
     });
   });
 
@@ -12132,7 +12331,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductstatusesCustomBatchResponse();
       var od = api.ProductstatusesCustomBatchResponse.fromJson(o.toJson());
-      checkProductstatusesCustomBatchResponse(od);
+      checkProductstatusesCustomBatchResponse(
+          od as api.ProductstatusesCustomBatchResponse);
     });
   });
 
@@ -12140,7 +12340,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductstatusesCustomBatchResponseEntry();
       var od = api.ProductstatusesCustomBatchResponseEntry.fromJson(o.toJson());
-      checkProductstatusesCustomBatchResponseEntry(od);
+      checkProductstatusesCustomBatchResponseEntry(
+          od as api.ProductstatusesCustomBatchResponseEntry);
     });
   });
 
@@ -12148,7 +12349,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductstatusesListResponse();
       var od = api.ProductstatusesListResponse.fromJson(o.toJson());
-      checkProductstatusesListResponse(od);
+      checkProductstatusesListResponse(od as api.ProductstatusesListResponse);
     });
   });
 
@@ -12156,7 +12357,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPubsubNotificationSettings();
       var od = api.PubsubNotificationSettings.fromJson(o.toJson());
-      checkPubsubNotificationSettings(od);
+      checkPubsubNotificationSettings(od as api.PubsubNotificationSettings);
     });
   });
 
@@ -12164,7 +12365,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRateGroup();
       var od = api.RateGroup.fromJson(o.toJson());
-      checkRateGroup(od);
+      checkRateGroup(od as api.RateGroup);
     });
   });
 
@@ -12172,7 +12373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRefundReason();
       var od = api.RefundReason.fromJson(o.toJson());
-      checkRefundReason(od);
+      checkRefundReason(od as api.RefundReason);
     });
   });
 
@@ -12180,7 +12381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionalInventory();
       var od = api.RegionalInventory.fromJson(o.toJson());
-      checkRegionalInventory(od);
+      checkRegionalInventory(od as api.RegionalInventory);
     });
   });
 
@@ -12188,7 +12389,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionalinventoryCustomBatchRequest();
       var od = api.RegionalinventoryCustomBatchRequest.fromJson(o.toJson());
-      checkRegionalinventoryCustomBatchRequest(od);
+      checkRegionalinventoryCustomBatchRequest(
+          od as api.RegionalinventoryCustomBatchRequest);
     });
   });
 
@@ -12197,7 +12399,8 @@
       var o = buildRegionalinventoryCustomBatchRequestEntry();
       var od =
           api.RegionalinventoryCustomBatchRequestEntry.fromJson(o.toJson());
-      checkRegionalinventoryCustomBatchRequestEntry(od);
+      checkRegionalinventoryCustomBatchRequestEntry(
+          od as api.RegionalinventoryCustomBatchRequestEntry);
     });
   });
 
@@ -12205,7 +12408,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionalinventoryCustomBatchResponse();
       var od = api.RegionalinventoryCustomBatchResponse.fromJson(o.toJson());
-      checkRegionalinventoryCustomBatchResponse(od);
+      checkRegionalinventoryCustomBatchResponse(
+          od as api.RegionalinventoryCustomBatchResponse);
     });
   });
 
@@ -12214,7 +12418,8 @@
       var o = buildRegionalinventoryCustomBatchResponseEntry();
       var od =
           api.RegionalinventoryCustomBatchResponseEntry.fromJson(o.toJson());
-      checkRegionalinventoryCustomBatchResponseEntry(od);
+      checkRegionalinventoryCustomBatchResponseEntry(
+          od as api.RegionalinventoryCustomBatchResponseEntry);
     });
   });
 
@@ -12222,7 +12427,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnAddress();
       var od = api.ReturnAddress.fromJson(o.toJson());
-      checkReturnAddress(od);
+      checkReturnAddress(od as api.ReturnAddress);
     });
   });
 
@@ -12230,7 +12435,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnAddressAddress();
       var od = api.ReturnAddressAddress.fromJson(o.toJson());
-      checkReturnAddressAddress(od);
+      checkReturnAddressAddress(od as api.ReturnAddressAddress);
     });
   });
 
@@ -12238,7 +12443,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnPolicy();
       var od = api.ReturnPolicy.fromJson(o.toJson());
-      checkReturnPolicy(od);
+      checkReturnPolicy(od as api.ReturnPolicy);
     });
   });
 
@@ -12246,7 +12451,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnPolicyPolicy();
       var od = api.ReturnPolicyPolicy.fromJson(o.toJson());
-      checkReturnPolicyPolicy(od);
+      checkReturnPolicyPolicy(od as api.ReturnPolicyPolicy);
     });
   });
 
@@ -12254,7 +12459,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnPolicySeasonalOverride();
       var od = api.ReturnPolicySeasonalOverride.fromJson(o.toJson());
-      checkReturnPolicySeasonalOverride(od);
+      checkReturnPolicySeasonalOverride(od as api.ReturnPolicySeasonalOverride);
     });
   });
 
@@ -12262,7 +12467,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnPricingInfo();
       var od = api.ReturnPricingInfo.fromJson(o.toJson());
-      checkReturnPricingInfo(od);
+      checkReturnPricingInfo(od as api.ReturnPricingInfo);
     });
   });
 
@@ -12270,7 +12475,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnShipment();
       var od = api.ReturnShipment.fromJson(o.toJson());
-      checkReturnShipment(od);
+      checkReturnShipment(od as api.ReturnShipment);
     });
   });
 
@@ -12278,7 +12483,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnaddressCustomBatchRequest();
       var od = api.ReturnaddressCustomBatchRequest.fromJson(o.toJson());
-      checkReturnaddressCustomBatchRequest(od);
+      checkReturnaddressCustomBatchRequest(
+          od as api.ReturnaddressCustomBatchRequest);
     });
   });
 
@@ -12286,7 +12492,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnaddressCustomBatchRequestEntry();
       var od = api.ReturnaddressCustomBatchRequestEntry.fromJson(o.toJson());
-      checkReturnaddressCustomBatchRequestEntry(od);
+      checkReturnaddressCustomBatchRequestEntry(
+          od as api.ReturnaddressCustomBatchRequestEntry);
     });
   });
 
@@ -12294,7 +12501,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnaddressCustomBatchResponse();
       var od = api.ReturnaddressCustomBatchResponse.fromJson(o.toJson());
-      checkReturnaddressCustomBatchResponse(od);
+      checkReturnaddressCustomBatchResponse(
+          od as api.ReturnaddressCustomBatchResponse);
     });
   });
 
@@ -12302,7 +12510,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnaddressCustomBatchResponseEntry();
       var od = api.ReturnaddressCustomBatchResponseEntry.fromJson(o.toJson());
-      checkReturnaddressCustomBatchResponseEntry(od);
+      checkReturnaddressCustomBatchResponseEntry(
+          od as api.ReturnaddressCustomBatchResponseEntry);
     });
   });
 
@@ -12310,7 +12519,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnaddressListResponse();
       var od = api.ReturnaddressListResponse.fromJson(o.toJson());
-      checkReturnaddressListResponse(od);
+      checkReturnaddressListResponse(od as api.ReturnaddressListResponse);
     });
   });
 
@@ -12318,7 +12527,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnpolicyCustomBatchRequest();
       var od = api.ReturnpolicyCustomBatchRequest.fromJson(o.toJson());
-      checkReturnpolicyCustomBatchRequest(od);
+      checkReturnpolicyCustomBatchRequest(
+          od as api.ReturnpolicyCustomBatchRequest);
     });
   });
 
@@ -12326,7 +12536,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnpolicyCustomBatchRequestEntry();
       var od = api.ReturnpolicyCustomBatchRequestEntry.fromJson(o.toJson());
-      checkReturnpolicyCustomBatchRequestEntry(od);
+      checkReturnpolicyCustomBatchRequestEntry(
+          od as api.ReturnpolicyCustomBatchRequestEntry);
     });
   });
 
@@ -12334,7 +12545,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnpolicyCustomBatchResponse();
       var od = api.ReturnpolicyCustomBatchResponse.fromJson(o.toJson());
-      checkReturnpolicyCustomBatchResponse(od);
+      checkReturnpolicyCustomBatchResponse(
+          od as api.ReturnpolicyCustomBatchResponse);
     });
   });
 
@@ -12342,7 +12554,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnpolicyCustomBatchResponseEntry();
       var od = api.ReturnpolicyCustomBatchResponseEntry.fromJson(o.toJson());
-      checkReturnpolicyCustomBatchResponseEntry(od);
+      checkReturnpolicyCustomBatchResponseEntry(
+          od as api.ReturnpolicyCustomBatchResponseEntry);
     });
   });
 
@@ -12350,7 +12563,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReturnpolicyListResponse();
       var od = api.ReturnpolicyListResponse.fromJson(o.toJson());
-      checkReturnpolicyListResponse(od);
+      checkReturnpolicyListResponse(od as api.ReturnpolicyListResponse);
     });
   });
 
@@ -12358,7 +12571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRow();
       var od = api.Row.fromJson(o.toJson());
-      checkRow(od);
+      checkRow(od as api.Row);
     });
   });
 
@@ -12366,7 +12579,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -12374,7 +12587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementReport();
       var od = api.SettlementReport.fromJson(o.toJson());
-      checkSettlementReport(od);
+      checkSettlementReport(od as api.SettlementReport);
     });
   });
 
@@ -12382,7 +12595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementTransaction();
       var od = api.SettlementTransaction.fromJson(o.toJson());
-      checkSettlementTransaction(od);
+      checkSettlementTransaction(od as api.SettlementTransaction);
     });
   });
 
@@ -12390,7 +12603,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementTransactionAmount();
       var od = api.SettlementTransactionAmount.fromJson(o.toJson());
-      checkSettlementTransactionAmount(od);
+      checkSettlementTransactionAmount(od as api.SettlementTransactionAmount);
     });
   });
 
@@ -12398,7 +12611,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementTransactionAmountCommission();
       var od = api.SettlementTransactionAmountCommission.fromJson(o.toJson());
-      checkSettlementTransactionAmountCommission(od);
+      checkSettlementTransactionAmountCommission(
+          od as api.SettlementTransactionAmountCommission);
     });
   });
 
@@ -12406,7 +12620,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementTransactionIdentifiers();
       var od = api.SettlementTransactionIdentifiers.fromJson(o.toJson());
-      checkSettlementTransactionIdentifiers(od);
+      checkSettlementTransactionIdentifiers(
+          od as api.SettlementTransactionIdentifiers);
     });
   });
 
@@ -12414,7 +12629,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementTransactionTransaction();
       var od = api.SettlementTransactionTransaction.fromJson(o.toJson());
-      checkSettlementTransactionTransaction(od);
+      checkSettlementTransactionTransaction(
+          od as api.SettlementTransactionTransaction);
     });
   });
 
@@ -12422,7 +12638,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementreportsListResponse();
       var od = api.SettlementreportsListResponse.fromJson(o.toJson());
-      checkSettlementreportsListResponse(od);
+      checkSettlementreportsListResponse(
+          od as api.SettlementreportsListResponse);
     });
   });
 
@@ -12430,7 +12647,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettlementtransactionsListResponse();
       var od = api.SettlementtransactionsListResponse.fromJson(o.toJson());
-      checkSettlementtransactionsListResponse(od);
+      checkSettlementtransactionsListResponse(
+          od as api.SettlementtransactionsListResponse);
     });
   });
 
@@ -12438,7 +12656,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShipmentInvoice();
       var od = api.ShipmentInvoice.fromJson(o.toJson());
-      checkShipmentInvoice(od);
+      checkShipmentInvoice(od as api.ShipmentInvoice);
     });
   });
 
@@ -12446,7 +12664,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildShipmentInvoiceLineItemInvoice();
       var od = api.ShipmentInvoiceLineItemInvoice.fromJson(o.toJson());
-      checkShipmentInvoiceLineItemInvoice(od);
+      checkShipmentInvoiceLineItemInvoice(
+          od as api.ShipmentInvoiceLineItemInvoice);
     });
   });
 
@@ -12454,7 +12673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShipmentTrackingInfo();
       var od = api.ShipmentTrackingInfo.fromJson(o.toJson());
-      checkShipmentTrackingInfo(od);
+      checkShipmentTrackingInfo(od as api.ShipmentTrackingInfo);
     });
   });
 
@@ -12462,7 +12681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShippingSettings();
       var od = api.ShippingSettings.fromJson(o.toJson());
-      checkShippingSettings(od);
+      checkShippingSettings(od as api.ShippingSettings);
     });
   });
 
@@ -12470,7 +12689,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildShippingsettingsCustomBatchRequest();
       var od = api.ShippingsettingsCustomBatchRequest.fromJson(o.toJson());
-      checkShippingsettingsCustomBatchRequest(od);
+      checkShippingsettingsCustomBatchRequest(
+          od as api.ShippingsettingsCustomBatchRequest);
     });
   });
 
@@ -12478,7 +12698,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildShippingsettingsCustomBatchRequestEntry();
       var od = api.ShippingsettingsCustomBatchRequestEntry.fromJson(o.toJson());
-      checkShippingsettingsCustomBatchRequestEntry(od);
+      checkShippingsettingsCustomBatchRequestEntry(
+          od as api.ShippingsettingsCustomBatchRequestEntry);
     });
   });
 
@@ -12486,7 +12707,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildShippingsettingsCustomBatchResponse();
       var od = api.ShippingsettingsCustomBatchResponse.fromJson(o.toJson());
-      checkShippingsettingsCustomBatchResponse(od);
+      checkShippingsettingsCustomBatchResponse(
+          od as api.ShippingsettingsCustomBatchResponse);
     });
   });
 
@@ -12495,7 +12717,8 @@
       var o = buildShippingsettingsCustomBatchResponseEntry();
       var od =
           api.ShippingsettingsCustomBatchResponseEntry.fromJson(o.toJson());
-      checkShippingsettingsCustomBatchResponseEntry(od);
+      checkShippingsettingsCustomBatchResponseEntry(
+          od as api.ShippingsettingsCustomBatchResponseEntry);
     });
   });
 
@@ -12504,7 +12727,8 @@
       var o = buildShippingsettingsGetSupportedCarriersResponse();
       var od =
           api.ShippingsettingsGetSupportedCarriersResponse.fromJson(o.toJson());
-      checkShippingsettingsGetSupportedCarriersResponse(od);
+      checkShippingsettingsGetSupportedCarriersResponse(
+          od as api.ShippingsettingsGetSupportedCarriersResponse);
     });
   });
 
@@ -12513,7 +12737,8 @@
       var o = buildShippingsettingsGetSupportedHolidaysResponse();
       var od =
           api.ShippingsettingsGetSupportedHolidaysResponse.fromJson(o.toJson());
-      checkShippingsettingsGetSupportedHolidaysResponse(od);
+      checkShippingsettingsGetSupportedHolidaysResponse(
+          od as api.ShippingsettingsGetSupportedHolidaysResponse);
     });
   });
 
@@ -12523,7 +12748,8 @@
       var o = buildShippingsettingsGetSupportedPickupServicesResponse();
       var od = api.ShippingsettingsGetSupportedPickupServicesResponse.fromJson(
           o.toJson());
-      checkShippingsettingsGetSupportedPickupServicesResponse(od);
+      checkShippingsettingsGetSupportedPickupServicesResponse(
+          od as api.ShippingsettingsGetSupportedPickupServicesResponse);
     });
   });
 
@@ -12531,7 +12757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShippingsettingsListResponse();
       var od = api.ShippingsettingsListResponse.fromJson(o.toJson());
-      checkShippingsettingsListResponse(od);
+      checkShippingsettingsListResponse(od as api.ShippingsettingsListResponse);
     });
   });
 
@@ -12539,7 +12765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTable();
       var od = api.Table.fromJson(o.toJson());
-      checkTable(od);
+      checkTable(od as api.Table);
     });
   });
 
@@ -12547,7 +12773,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestOrder();
       var od = api.TestOrder.fromJson(o.toJson());
-      checkTestOrder(od);
+      checkTestOrder(od as api.TestOrder);
     });
   });
 
@@ -12555,7 +12781,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestOrderAddress();
       var od = api.TestOrderAddress.fromJson(o.toJson());
-      checkTestOrderAddress(od);
+      checkTestOrderAddress(od as api.TestOrderAddress);
     });
   });
 
@@ -12563,7 +12789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestOrderDeliveryDetails();
       var od = api.TestOrderDeliveryDetails.fromJson(o.toJson());
-      checkTestOrderDeliveryDetails(od);
+      checkTestOrderDeliveryDetails(od as api.TestOrderDeliveryDetails);
     });
   });
 
@@ -12571,7 +12797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestOrderLineItem();
       var od = api.TestOrderLineItem.fromJson(o.toJson());
-      checkTestOrderLineItem(od);
+      checkTestOrderLineItem(od as api.TestOrderLineItem);
     });
   });
 
@@ -12579,7 +12805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestOrderLineItemProduct();
       var od = api.TestOrderLineItemProduct.fromJson(o.toJson());
-      checkTestOrderLineItemProduct(od);
+      checkTestOrderLineItemProduct(od as api.TestOrderLineItemProduct);
     });
   });
 
@@ -12587,7 +12813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestOrderPickupDetails();
       var od = api.TestOrderPickupDetails.fromJson(o.toJson());
-      checkTestOrderPickupDetails(od);
+      checkTestOrderPickupDetails(od as api.TestOrderPickupDetails);
     });
   });
 
@@ -12595,7 +12821,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestOrderPickupDetailsPickupPerson();
       var od = api.TestOrderPickupDetailsPickupPerson.fromJson(o.toJson());
-      checkTestOrderPickupDetailsPickupPerson(od);
+      checkTestOrderPickupDetailsPickupPerson(
+          od as api.TestOrderPickupDetailsPickupPerson);
     });
   });
 
@@ -12603,7 +12830,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransitTable();
       var od = api.TransitTable.fromJson(o.toJson());
-      checkTransitTable(od);
+      checkTransitTable(od as api.TransitTable);
     });
   });
 
@@ -12611,7 +12838,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransitTableTransitTimeRow();
       var od = api.TransitTableTransitTimeRow.fromJson(o.toJson());
-      checkTransitTableTransitTimeRow(od);
+      checkTransitTableTransitTimeRow(od as api.TransitTableTransitTimeRow);
     });
   });
 
@@ -12620,7 +12847,8 @@
       var o = buildTransitTableTransitTimeRowTransitTimeValue();
       var od =
           api.TransitTableTransitTimeRowTransitTimeValue.fromJson(o.toJson());
-      checkTransitTableTransitTimeRowTransitTimeValue(od);
+      checkTransitTableTransitTimeRowTransitTimeValue(
+          od as api.TransitTableTransitTimeRowTransitTimeValue);
     });
   });
 
@@ -12628,7 +12856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnitInvoice();
       var od = api.UnitInvoice.fromJson(o.toJson());
-      checkUnitInvoice(od);
+      checkUnitInvoice(od as api.UnitInvoice);
     });
   });
 
@@ -12636,7 +12864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnitInvoiceAdditionalCharge();
       var od = api.UnitInvoiceAdditionalCharge.fromJson(o.toJson());
-      checkUnitInvoiceAdditionalCharge(od);
+      checkUnitInvoiceAdditionalCharge(od as api.UnitInvoiceAdditionalCharge);
     });
   });
 
@@ -12644,7 +12872,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnitInvoiceTaxLine();
       var od = api.UnitInvoiceTaxLine.fromJson(o.toJson());
-      checkUnitInvoiceTaxLine(od);
+      checkUnitInvoiceTaxLine(od as api.UnitInvoiceTaxLine);
     });
   });
 
@@ -12652,7 +12880,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValue();
       var od = api.Value.fromJson(o.toJson());
-      checkValue(od);
+      checkValue(od as api.Value);
     });
   });
 
@@ -12660,7 +12888,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWeight();
       var od = api.Weight.fromJson(o.toJson());
-      checkWeight(od);
+      checkWeight(od as api.Weight);
     });
   });
 
@@ -12710,7 +12938,7 @@
       res
           .authinfo($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsAuthInfoResponse(response);
+        checkAccountsAuthInfoResponse(response as api.AccountsAuthInfoResponse);
       })));
     });
 
@@ -12759,7 +12987,8 @@
           .claimwebsite(arg_merchantId, arg_accountId,
               overwrite: arg_overwrite, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsClaimWebsiteResponse(response);
+        checkAccountsClaimWebsiteResponse(
+            response as api.AccountsClaimWebsiteResponse);
       })));
     });
 
@@ -12769,8 +12998,9 @@
       var arg_request = buildAccountsCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountsCustomBatchRequest.fromJson(json);
-        checkAccountsCustomBatchRequest(obj);
+        var obj = api.AccountsCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountsCustomBatchRequest(obj as api.AccountsCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12812,7 +13042,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsCustomBatchResponse(response);
+        checkAccountsCustomBatchResponse(
+            response as api.AccountsCustomBatchResponse);
       })));
     });
 
@@ -12906,7 +13137,7 @@
           .get(arg_merchantId, arg_accountId,
               view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -12917,8 +13148,9 @@
       var arg_merchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12954,7 +13186,7 @@
       res
           .insert(arg_request, arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -12966,8 +13198,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountsLinkRequest.fromJson(json);
-        checkAccountsLinkRequest(obj);
+        var obj = api.AccountsLinkRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountsLinkRequest(obj as api.AccountsLinkRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13004,7 +13237,7 @@
           .link(arg_request, arg_merchantId, arg_accountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsLinkResponse(response);
+        checkAccountsLinkResponse(response as api.AccountsLinkResponse);
       })));
     });
 
@@ -13063,7 +13296,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsListResponse(response);
+        checkAccountsListResponse(response as api.AccountsListResponse);
       })));
     });
 
@@ -13117,7 +13350,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsListLinksResponse(response);
+        checkAccountsListLinksResponse(
+            response as api.AccountsListLinksResponse);
       })));
     });
 
@@ -13129,8 +13363,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13167,7 +13402,7 @@
           .update(arg_request, arg_merchantId, arg_accountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -13179,8 +13414,10 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountsUpdateLabelsRequest.fromJson(json);
-        checkAccountsUpdateLabelsRequest(obj);
+        var obj = api.AccountsUpdateLabelsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountsUpdateLabelsRequest(
+            obj as api.AccountsUpdateLabelsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13217,7 +13454,8 @@
           .updatelabels(arg_request, arg_merchantId, arg_accountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsUpdateLabelsResponse(response);
+        checkAccountsUpdateLabelsResponse(
+            response as api.AccountsUpdateLabelsResponse);
       })));
     });
   });
@@ -13229,8 +13467,10 @@
       var arg_request = buildAccountstatusesCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountstatusesCustomBatchRequest.fromJson(json);
-        checkAccountstatusesCustomBatchRequest(obj);
+        var obj = api.AccountstatusesCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountstatusesCustomBatchRequest(
+            obj as api.AccountstatusesCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13273,7 +13513,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountstatusesCustomBatchResponse(response);
+        checkAccountstatusesCustomBatchResponse(
+            response as api.AccountstatusesCustomBatchResponse);
       })));
     });
 
@@ -13322,7 +13563,7 @@
           .get(arg_merchantId, arg_accountId,
               destinations: arg_destinations, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountStatus(response);
+        checkAccountStatus(response as api.AccountStatus);
       })));
     });
 
@@ -13379,7 +13620,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountstatusesListResponse(response);
+        checkAccountstatusesListResponse(
+            response as api.AccountstatusesListResponse);
       })));
     });
   });
@@ -13391,8 +13633,10 @@
       var arg_request = buildAccounttaxCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccounttaxCustomBatchRequest.fromJson(json);
-        checkAccounttaxCustomBatchRequest(obj);
+        var obj = api.AccounttaxCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccounttaxCustomBatchRequest(
+            obj as api.AccounttaxCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13434,7 +13678,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccounttaxCustomBatchResponse(response);
+        checkAccounttaxCustomBatchResponse(
+            response as api.AccounttaxCustomBatchResponse);
       })));
     });
 
@@ -13479,7 +13724,7 @@
       res
           .get(arg_merchantId, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountTax(response);
+        checkAccountTax(response as api.AccountTax);
       })));
     });
 
@@ -13532,7 +13777,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccounttaxListResponse(response);
+        checkAccounttaxListResponse(response as api.AccounttaxListResponse);
       })));
     });
 
@@ -13544,8 +13789,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountTax.fromJson(json);
-        checkAccountTax(obj);
+        var obj = api.AccountTax.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountTax(obj as api.AccountTax);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13582,7 +13828,7 @@
           .update(arg_request, arg_merchantId, arg_accountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountTax(response);
+        checkAccountTax(response as api.AccountTax);
       })));
     });
   });
@@ -13594,8 +13840,10 @@
       var arg_request = buildDatafeedsCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DatafeedsCustomBatchRequest.fromJson(json);
-        checkDatafeedsCustomBatchRequest(obj);
+        var obj = api.DatafeedsCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDatafeedsCustomBatchRequest(
+            obj as api.DatafeedsCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13637,7 +13885,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeedsCustomBatchResponse(response);
+        checkDatafeedsCustomBatchResponse(
+            response as api.DatafeedsCustomBatchResponse);
       })));
     });
 
@@ -13725,7 +13974,8 @@
       res
           .fetchnow(arg_merchantId, arg_datafeedId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeedsFetchNowResponse(response);
+        checkDatafeedsFetchNowResponse(
+            response as api.DatafeedsFetchNowResponse);
       })));
     });
 
@@ -13770,7 +14020,7 @@
       res
           .get(arg_merchantId, arg_datafeedId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeed(response);
+        checkDatafeed(response as api.Datafeed);
       })));
     });
 
@@ -13781,8 +14031,9 @@
       var arg_merchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Datafeed.fromJson(json);
-        checkDatafeed(obj);
+        var obj =
+            api.Datafeed.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDatafeed(obj as api.Datafeed);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13818,7 +14069,7 @@
       res
           .insert(arg_request, arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeed(response);
+        checkDatafeed(response as api.Datafeed);
       })));
     });
 
@@ -13871,7 +14122,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeedsListResponse(response);
+        checkDatafeedsListResponse(response as api.DatafeedsListResponse);
       })));
     });
 
@@ -13883,8 +14134,9 @@
       var arg_datafeedId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Datafeed.fromJson(json);
-        checkDatafeed(obj);
+        var obj =
+            api.Datafeed.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDatafeed(obj as api.Datafeed);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13921,7 +14173,7 @@
           .update(arg_request, arg_merchantId, arg_datafeedId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeed(response);
+        checkDatafeed(response as api.Datafeed);
       })));
     });
   });
@@ -13933,8 +14185,10 @@
       var arg_request = buildDatafeedstatusesCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DatafeedstatusesCustomBatchRequest.fromJson(json);
-        checkDatafeedstatusesCustomBatchRequest(obj);
+        var obj = api.DatafeedstatusesCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDatafeedstatusesCustomBatchRequest(
+            obj as api.DatafeedstatusesCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13977,7 +14231,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeedstatusesCustomBatchResponse(response);
+        checkDatafeedstatusesCustomBatchResponse(
+            response as api.DatafeedstatusesCustomBatchResponse);
       })));
     });
 
@@ -14031,7 +14286,7 @@
               language: arg_language,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeedStatus(response);
+        checkDatafeedStatus(response as api.DatafeedStatus);
       })));
     });
 
@@ -14084,7 +14339,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatafeedstatusesListResponse(response);
+        checkDatafeedstatusesListResponse(
+            response as api.DatafeedstatusesListResponse);
       })));
     });
   });
@@ -14096,8 +14352,10 @@
       var arg_request = buildLiasettingsCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiasettingsCustomBatchRequest.fromJson(json);
-        checkLiasettingsCustomBatchRequest(obj);
+        var obj = api.LiasettingsCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiasettingsCustomBatchRequest(
+            obj as api.LiasettingsCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14139,7 +14397,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsCustomBatchResponse(response);
+        checkLiasettingsCustomBatchResponse(
+            response as api.LiasettingsCustomBatchResponse);
       })));
     });
 
@@ -14184,7 +14443,7 @@
       res
           .get(arg_merchantId, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiaSettings(response);
+        checkLiaSettings(response as api.LiaSettings);
       })));
     });
 
@@ -14231,7 +14490,8 @@
           .getaccessiblegmbaccounts(arg_merchantId, arg_accountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsGetAccessibleGmbAccountsResponse(response);
+        checkLiasettingsGetAccessibleGmbAccountsResponse(
+            response as api.LiasettingsGetAccessibleGmbAccountsResponse);
       })));
     });
 
@@ -14284,7 +14544,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsListResponse(response);
+        checkLiasettingsListResponse(response as api.LiasettingsListResponse);
       })));
     });
 
@@ -14334,7 +14594,8 @@
       res
           .listposdataproviders($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsListPosDataProvidersResponse(response);
+        checkLiasettingsListPosDataProvidersResponse(
+            response as api.LiasettingsListPosDataProvidersResponse);
       })));
     });
 
@@ -14384,7 +14645,8 @@
           .requestgmbaccess(arg_merchantId, arg_accountId, arg_gmbEmail,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsRequestGmbAccessResponse(response);
+        checkLiasettingsRequestGmbAccessResponse(
+            response as api.LiasettingsRequestGmbAccessResponse);
       })));
     });
 
@@ -14433,7 +14695,8 @@
               arg_merchantId, arg_accountId, arg_country,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsRequestInventoryVerificationResponse(response);
+        checkLiasettingsRequestInventoryVerificationResponse(
+            response as api.LiasettingsRequestInventoryVerificationResponse);
       })));
     });
 
@@ -14493,7 +14756,8 @@
               arg_contactEmail, arg_contactName, arg_country, arg_language,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsSetInventoryVerificationContactResponse(response);
+        checkLiasettingsSetInventoryVerificationContactResponse(
+            response as api.LiasettingsSetInventoryVerificationContactResponse);
       })));
     });
 
@@ -14551,7 +14815,8 @@
               posExternalAccountId: arg_posExternalAccountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiasettingsSetPosDataProviderResponse(response);
+        checkLiasettingsSetPosDataProviderResponse(
+            response as api.LiasettingsSetPosDataProviderResponse);
       })));
     });
 
@@ -14563,8 +14828,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiaSettings.fromJson(json);
-        checkLiaSettings(obj);
+        var obj = api.LiaSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiaSettings(obj as api.LiaSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14601,7 +14867,7 @@
           .update(arg_request, arg_merchantId, arg_accountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiaSettings(response);
+        checkLiaSettings(response as api.LiaSettings);
       })));
     });
   });
@@ -14613,8 +14879,10 @@
       var arg_request = buildLocalinventoryCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LocalinventoryCustomBatchRequest.fromJson(json);
-        checkLocalinventoryCustomBatchRequest(obj);
+        var obj = api.LocalinventoryCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLocalinventoryCustomBatchRequest(
+            obj as api.LocalinventoryCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14657,7 +14925,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocalinventoryCustomBatchResponse(response);
+        checkLocalinventoryCustomBatchResponse(
+            response as api.LocalinventoryCustomBatchResponse);
       })));
     });
 
@@ -14669,8 +14938,9 @@
       var arg_productId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LocalInventory.fromJson(json);
-        checkLocalInventory(obj);
+        var obj = api.LocalInventory.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLocalInventory(obj as api.LocalInventory);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14707,7 +14977,7 @@
           .insert(arg_request, arg_merchantId, arg_productId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocalInventory(response);
+        checkLocalInventory(response as api.LocalInventory);
       })));
     });
   });
@@ -14721,8 +14991,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrderinvoicesCreateChargeInvoiceRequest.fromJson(json);
-        checkOrderinvoicesCreateChargeInvoiceRequest(obj);
+        var obj = api.OrderinvoicesCreateChargeInvoiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrderinvoicesCreateChargeInvoiceRequest(
+            obj as api.OrderinvoicesCreateChargeInvoiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14760,7 +15032,8 @@
           .createchargeinvoice(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderinvoicesCreateChargeInvoiceResponse(response);
+        checkOrderinvoicesCreateChargeInvoiceResponse(
+            response as api.OrderinvoicesCreateChargeInvoiceResponse);
       })));
     });
 
@@ -14772,8 +15045,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrderinvoicesCreateRefundInvoiceRequest.fromJson(json);
-        checkOrderinvoicesCreateRefundInvoiceRequest(obj);
+        var obj = api.OrderinvoicesCreateRefundInvoiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrderinvoicesCreateRefundInvoiceRequest(
+            obj as api.OrderinvoicesCreateRefundInvoiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14811,7 +15086,8 @@
           .createrefundinvoice(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderinvoicesCreateRefundInvoiceResponse(response);
+        checkOrderinvoicesCreateRefundInvoiceResponse(
+            response as api.OrderinvoicesCreateRefundInvoiceResponse);
       })));
     });
   });
@@ -14874,7 +15150,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderreportsListDisbursementsResponse(response);
+        checkOrderreportsListDisbursementsResponse(
+            response as api.OrderreportsListDisbursementsResponse);
       })));
     });
 
@@ -14937,7 +15214,8 @@
               transactionEndDate: arg_transactionEndDate,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderreportsListTransactionsResponse(response);
+        checkOrderreportsListTransactionsResponse(
+            response as api.OrderreportsListTransactionsResponse);
       })));
     });
   });
@@ -14951,8 +15229,10 @@
       var arg_returnId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrderreturnsAcknowledgeRequest.fromJson(json);
-        checkOrderreturnsAcknowledgeRequest(obj);
+        var obj = api.OrderreturnsAcknowledgeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrderreturnsAcknowledgeRequest(
+            obj as api.OrderreturnsAcknowledgeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14989,7 +15269,8 @@
           .acknowledge(arg_request, arg_merchantId, arg_returnId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderreturnsAcknowledgeResponse(response);
+        checkOrderreturnsAcknowledgeResponse(
+            response as api.OrderreturnsAcknowledgeResponse);
       })));
     });
 
@@ -15000,8 +15281,10 @@
       var arg_merchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrderreturnsCreateOrderReturnRequest.fromJson(json);
-        checkOrderreturnsCreateOrderReturnRequest(obj);
+        var obj = api.OrderreturnsCreateOrderReturnRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrderreturnsCreateOrderReturnRequest(
+            obj as api.OrderreturnsCreateOrderReturnRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15038,7 +15321,8 @@
       res
           .createorderreturn(arg_request, arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderreturnsCreateOrderReturnResponse(response);
+        checkOrderreturnsCreateOrderReturnResponse(
+            response as api.OrderreturnsCreateOrderReturnResponse);
       })));
     });
 
@@ -15083,7 +15367,7 @@
       res
           .get(arg_merchantId, arg_returnId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMerchantOrderReturn(response);
+        checkMerchantOrderReturn(response as api.MerchantOrderReturn);
       })));
     });
 
@@ -15172,7 +15456,7 @@
               shipmentTypes: arg_shipmentTypes,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderreturnsListResponse(response);
+        checkOrderreturnsListResponse(response as api.OrderreturnsListResponse);
       })));
     });
 
@@ -15184,8 +15468,9 @@
       var arg_returnId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrderreturnsProcessRequest.fromJson(json);
-        checkOrderreturnsProcessRequest(obj);
+        var obj = api.OrderreturnsProcessRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrderreturnsProcessRequest(obj as api.OrderreturnsProcessRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15222,7 +15507,8 @@
           .process(arg_request, arg_merchantId, arg_returnId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderreturnsProcessResponse(response);
+        checkOrderreturnsProcessResponse(
+            response as api.OrderreturnsProcessResponse);
       })));
     });
   });
@@ -15236,8 +15522,9 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersAcknowledgeRequest.fromJson(json);
-        checkOrdersAcknowledgeRequest(obj);
+        var obj = api.OrdersAcknowledgeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersAcknowledgeRequest(obj as api.OrdersAcknowledgeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15274,7 +15561,8 @@
           .acknowledge(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersAcknowledgeResponse(response);
+        checkOrdersAcknowledgeResponse(
+            response as api.OrdersAcknowledgeResponse);
       })));
     });
 
@@ -15319,7 +15607,8 @@
       res
           .advancetestorder(arg_merchantId, arg_orderId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersAdvanceTestOrderResponse(response);
+        checkOrdersAdvanceTestOrderResponse(
+            response as api.OrdersAdvanceTestOrderResponse);
       })));
     });
 
@@ -15331,8 +15620,9 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersCancelRequest.fromJson(json);
-        checkOrdersCancelRequest(obj);
+        var obj = api.OrdersCancelRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersCancelRequest(obj as api.OrdersCancelRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15369,7 +15659,7 @@
           .cancel(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersCancelResponse(response);
+        checkOrdersCancelResponse(response as api.OrdersCancelResponse);
       })));
     });
 
@@ -15381,8 +15671,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersCancelLineItemRequest.fromJson(json);
-        checkOrdersCancelLineItemRequest(obj);
+        var obj = api.OrdersCancelLineItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersCancelLineItemRequest(
+            obj as api.OrdersCancelLineItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15419,7 +15711,8 @@
           .cancellineitem(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersCancelLineItemResponse(response);
+        checkOrdersCancelLineItemResponse(
+            response as api.OrdersCancelLineItemResponse);
       })));
     });
 
@@ -15431,8 +15724,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersCancelTestOrderByCustomerRequest.fromJson(json);
-        checkOrdersCancelTestOrderByCustomerRequest(obj);
+        var obj = api.OrdersCancelTestOrderByCustomerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersCancelTestOrderByCustomerRequest(
+            obj as api.OrdersCancelTestOrderByCustomerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15470,7 +15765,8 @@
           .canceltestorderbycustomer(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersCancelTestOrderByCustomerResponse(response);
+        checkOrdersCancelTestOrderByCustomerResponse(
+            response as api.OrdersCancelTestOrderByCustomerResponse);
       })));
     });
 
@@ -15481,8 +15777,10 @@
       var arg_merchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersCreateTestOrderRequest.fromJson(json);
-        checkOrdersCreateTestOrderRequest(obj);
+        var obj = api.OrdersCreateTestOrderRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersCreateTestOrderRequest(
+            obj as api.OrdersCreateTestOrderRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15518,7 +15816,8 @@
       res
           .createtestorder(arg_request, arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersCreateTestOrderResponse(response);
+        checkOrdersCreateTestOrderResponse(
+            response as api.OrdersCreateTestOrderResponse);
       })));
     });
 
@@ -15530,8 +15829,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersCreateTestReturnRequest.fromJson(json);
-        checkOrdersCreateTestReturnRequest(obj);
+        var obj = api.OrdersCreateTestReturnRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersCreateTestReturnRequest(
+            obj as api.OrdersCreateTestReturnRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15568,7 +15869,8 @@
           .createtestreturn(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersCreateTestReturnResponse(response);
+        checkOrdersCreateTestReturnResponse(
+            response as api.OrdersCreateTestReturnResponse);
       })));
     });
 
@@ -15613,7 +15915,7 @@
       res
           .get(arg_merchantId, arg_orderId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrder(response);
+        checkOrder(response as api.Order);
       })));
     });
 
@@ -15660,7 +15962,8 @@
           .getbymerchantorderid(arg_merchantId, arg_merchantOrderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersGetByMerchantOrderIdResponse(response);
+        checkOrdersGetByMerchantOrderIdResponse(
+            response as api.OrdersGetByMerchantOrderIdResponse);
       })));
     });
 
@@ -15710,7 +16013,8 @@
           .gettestordertemplate(arg_merchantId, arg_templateName,
               country: arg_country, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersGetTestOrderTemplateResponse(response);
+        checkOrdersGetTestOrderTemplateResponse(
+            response as api.OrdersGetTestOrderTemplateResponse);
       })));
     });
 
@@ -15722,8 +16026,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersInStoreRefundLineItemRequest.fromJson(json);
-        checkOrdersInStoreRefundLineItemRequest(obj);
+        var obj = api.OrdersInStoreRefundLineItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersInStoreRefundLineItemRequest(
+            obj as api.OrdersInStoreRefundLineItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15761,7 +16067,8 @@
           .instorerefundlineitem(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersInStoreRefundLineItemResponse(response);
+        checkOrdersInStoreRefundLineItemResponse(
+            response as api.OrdersInStoreRefundLineItemResponse);
       })));
     });
 
@@ -15833,7 +16140,7 @@
               statuses: arg_statuses,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersListResponse(response);
+        checkOrdersListResponse(response as api.OrdersListResponse);
       })));
     });
 
@@ -15845,8 +16152,9 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersRefundItemRequest.fromJson(json);
-        checkOrdersRefundItemRequest(obj);
+        var obj = api.OrdersRefundItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersRefundItemRequest(obj as api.OrdersRefundItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15883,7 +16191,7 @@
           .refunditem(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersRefundItemResponse(response);
+        checkOrdersRefundItemResponse(response as api.OrdersRefundItemResponse);
       })));
     });
 
@@ -15895,8 +16203,9 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersRefundOrderRequest.fromJson(json);
-        checkOrdersRefundOrderRequest(obj);
+        var obj = api.OrdersRefundOrderRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersRefundOrderRequest(obj as api.OrdersRefundOrderRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15933,7 +16242,8 @@
           .refundorder(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersRefundOrderResponse(response);
+        checkOrdersRefundOrderResponse(
+            response as api.OrdersRefundOrderResponse);
       })));
     });
 
@@ -15945,8 +16255,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersRejectReturnLineItemRequest.fromJson(json);
-        checkOrdersRejectReturnLineItemRequest(obj);
+        var obj = api.OrdersRejectReturnLineItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersRejectReturnLineItemRequest(
+            obj as api.OrdersRejectReturnLineItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15984,7 +16296,8 @@
           .rejectreturnlineitem(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersRejectReturnLineItemResponse(response);
+        checkOrdersRejectReturnLineItemResponse(
+            response as api.OrdersRejectReturnLineItemResponse);
       })));
     });
 
@@ -15996,8 +16309,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersReturnRefundLineItemRequest.fromJson(json);
-        checkOrdersReturnRefundLineItemRequest(obj);
+        var obj = api.OrdersReturnRefundLineItemRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersReturnRefundLineItemRequest(
+            obj as api.OrdersReturnRefundLineItemRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16035,7 +16350,8 @@
           .returnrefundlineitem(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersReturnRefundLineItemResponse(response);
+        checkOrdersReturnRefundLineItemResponse(
+            response as api.OrdersReturnRefundLineItemResponse);
       })));
     });
 
@@ -16047,8 +16363,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersSetLineItemMetadataRequest.fromJson(json);
-        checkOrdersSetLineItemMetadataRequest(obj);
+        var obj = api.OrdersSetLineItemMetadataRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersSetLineItemMetadataRequest(
+            obj as api.OrdersSetLineItemMetadataRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16086,7 +16404,8 @@
           .setlineitemmetadata(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersSetLineItemMetadataResponse(response);
+        checkOrdersSetLineItemMetadataResponse(
+            response as api.OrdersSetLineItemMetadataResponse);
       })));
     });
 
@@ -16098,8 +16417,9 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersShipLineItemsRequest.fromJson(json);
-        checkOrdersShipLineItemsRequest(obj);
+        var obj = api.OrdersShipLineItemsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersShipLineItemsRequest(obj as api.OrdersShipLineItemsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16136,7 +16456,8 @@
           .shiplineitems(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersShipLineItemsResponse(response);
+        checkOrdersShipLineItemsResponse(
+            response as api.OrdersShipLineItemsResponse);
       })));
     });
 
@@ -16148,8 +16469,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(json);
-        checkOrdersUpdateLineItemShippingDetailsRequest(obj);
+        var obj = api.OrdersUpdateLineItemShippingDetailsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersUpdateLineItemShippingDetailsRequest(
+            obj as api.OrdersUpdateLineItemShippingDetailsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16188,7 +16511,8 @@
               arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersUpdateLineItemShippingDetailsResponse(response);
+        checkOrdersUpdateLineItemShippingDetailsResponse(
+            response as api.OrdersUpdateLineItemShippingDetailsResponse);
       })));
     });
 
@@ -16200,8 +16524,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersUpdateMerchantOrderIdRequest.fromJson(json);
-        checkOrdersUpdateMerchantOrderIdRequest(obj);
+        var obj = api.OrdersUpdateMerchantOrderIdRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersUpdateMerchantOrderIdRequest(
+            obj as api.OrdersUpdateMerchantOrderIdRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16239,7 +16565,8 @@
           .updatemerchantorderid(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersUpdateMerchantOrderIdResponse(response);
+        checkOrdersUpdateMerchantOrderIdResponse(
+            response as api.OrdersUpdateMerchantOrderIdResponse);
       })));
     });
 
@@ -16251,8 +16578,10 @@
       var arg_orderId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrdersUpdateShipmentRequest.fromJson(json);
-        checkOrdersUpdateShipmentRequest(obj);
+        var obj = api.OrdersUpdateShipmentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrdersUpdateShipmentRequest(
+            obj as api.OrdersUpdateShipmentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16289,7 +16618,8 @@
           .updateshipment(arg_request, arg_merchantId, arg_orderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersUpdateShipmentResponse(response);
+        checkOrdersUpdateShipmentResponse(
+            response as api.OrdersUpdateShipmentResponse);
       })));
     });
   });
@@ -16301,8 +16631,9 @@
       var arg_request = buildPosCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PosCustomBatchRequest.fromJson(json);
-        checkPosCustomBatchRequest(obj);
+        var obj = api.PosCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPosCustomBatchRequest(obj as api.PosCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16344,7 +16675,7 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPosCustomBatchResponse(response);
+        checkPosCustomBatchResponse(response as api.PosCustomBatchResponse);
       })));
     });
 
@@ -16436,7 +16767,7 @@
           .get(arg_merchantId, arg_targetMerchantId, arg_storeCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPosStore(response);
+        checkPosStore(response as api.PosStore);
       })));
     });
 
@@ -16448,8 +16779,9 @@
       var arg_targetMerchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PosStore.fromJson(json);
-        checkPosStore(obj);
+        var obj =
+            api.PosStore.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPosStore(obj as api.PosStore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16486,7 +16818,7 @@
           .insert(arg_request, arg_merchantId, arg_targetMerchantId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPosStore(response);
+        checkPosStore(response as api.PosStore);
       })));
     });
 
@@ -16498,8 +16830,9 @@
       var arg_targetMerchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PosInventoryRequest.fromJson(json);
-        checkPosInventoryRequest(obj);
+        var obj = api.PosInventoryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPosInventoryRequest(obj as api.PosInventoryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16536,7 +16869,7 @@
           .inventory(arg_request, arg_merchantId, arg_targetMerchantId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPosInventoryResponse(response);
+        checkPosInventoryResponse(response as api.PosInventoryResponse);
       })));
     });
 
@@ -16581,7 +16914,7 @@
       res
           .list(arg_merchantId, arg_targetMerchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPosListResponse(response);
+        checkPosListResponse(response as api.PosListResponse);
       })));
     });
 
@@ -16593,8 +16926,9 @@
       var arg_targetMerchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PosSaleRequest.fromJson(json);
-        checkPosSaleRequest(obj);
+        var obj = api.PosSaleRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPosSaleRequest(obj as api.PosSaleRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16631,7 +16965,7 @@
           .sale(arg_request, arg_merchantId, arg_targetMerchantId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPosSaleResponse(response);
+        checkPosSaleResponse(response as api.PosSaleResponse);
       })));
     });
   });
@@ -16643,8 +16977,9 @@
       var arg_request = buildProductsCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProductsCustomBatchRequest.fromJson(json);
-        checkProductsCustomBatchRequest(obj);
+        var obj = api.ProductsCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProductsCustomBatchRequest(obj as api.ProductsCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16686,7 +17021,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductsCustomBatchResponse(response);
+        checkProductsCustomBatchResponse(
+            response as api.ProductsCustomBatchResponse);
       })));
     });
 
@@ -16777,7 +17113,7 @@
       res
           .get(arg_merchantId, arg_productId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -16789,8 +17125,9 @@
       var arg_feedId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Product.fromJson(json);
-        checkProduct(obj);
+        var obj =
+            api.Product.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProduct(obj as api.Product);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16828,7 +17165,7 @@
           .insert(arg_request, arg_merchantId,
               feedId: arg_feedId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -16881,7 +17218,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductsListResponse(response);
+        checkProductsListResponse(response as api.ProductsListResponse);
       })));
     });
   });
@@ -16893,8 +17230,10 @@
       var arg_request = buildProductstatusesCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProductstatusesCustomBatchRequest.fromJson(json);
-        checkProductstatusesCustomBatchRequest(obj);
+        var obj = api.ProductstatusesCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProductstatusesCustomBatchRequest(
+            obj as api.ProductstatusesCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16937,7 +17276,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductstatusesCustomBatchResponse(response);
+        checkProductstatusesCustomBatchResponse(
+            response as api.ProductstatusesCustomBatchResponse);
       })));
     });
 
@@ -16986,7 +17326,7 @@
           .get(arg_merchantId, arg_productId,
               destinations: arg_destinations, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductStatus(response);
+        checkProductStatus(response as api.ProductStatus);
       })));
     });
 
@@ -17043,7 +17383,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductstatusesListResponse(response);
+        checkProductstatusesListResponse(
+            response as api.ProductstatusesListResponse);
       })));
     });
   });
@@ -17089,7 +17430,8 @@
       res
           .get(arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPubsubNotificationSettings(response);
+        checkPubsubNotificationSettings(
+            response as api.PubsubNotificationSettings);
       })));
     });
 
@@ -17100,8 +17442,9 @@
       var arg_merchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PubsubNotificationSettings.fromJson(json);
-        checkPubsubNotificationSettings(obj);
+        var obj = api.PubsubNotificationSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPubsubNotificationSettings(obj as api.PubsubNotificationSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17137,7 +17480,8 @@
       res
           .update(arg_request, arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPubsubNotificationSettings(response);
+        checkPubsubNotificationSettings(
+            response as api.PubsubNotificationSettings);
       })));
     });
   });
@@ -17149,8 +17493,10 @@
       var arg_request = buildRegionalinventoryCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionalinventoryCustomBatchRequest.fromJson(json);
-        checkRegionalinventoryCustomBatchRequest(obj);
+        var obj = api.RegionalinventoryCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionalinventoryCustomBatchRequest(
+            obj as api.RegionalinventoryCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17193,7 +17539,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionalinventoryCustomBatchResponse(response);
+        checkRegionalinventoryCustomBatchResponse(
+            response as api.RegionalinventoryCustomBatchResponse);
       })));
     });
 
@@ -17205,8 +17552,9 @@
       var arg_productId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RegionalInventory.fromJson(json);
-        checkRegionalInventory(obj);
+        var obj = api.RegionalInventory.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRegionalInventory(obj as api.RegionalInventory);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17243,7 +17591,7 @@
           .insert(arg_request, arg_merchantId, arg_productId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionalInventory(response);
+        checkRegionalInventory(response as api.RegionalInventory);
       })));
     });
   });
@@ -17255,8 +17603,10 @@
       var arg_request = buildReturnaddressCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReturnaddressCustomBatchRequest.fromJson(json);
-        checkReturnaddressCustomBatchRequest(obj);
+        var obj = api.ReturnaddressCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReturnaddressCustomBatchRequest(
+            obj as api.ReturnaddressCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17298,7 +17648,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnaddressCustomBatchResponse(response);
+        checkReturnaddressCustomBatchResponse(
+            response as api.ReturnaddressCustomBatchResponse);
       })));
     });
 
@@ -17386,7 +17737,7 @@
       res
           .get(arg_merchantId, arg_returnAddressId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnAddress(response);
+        checkReturnAddress(response as api.ReturnAddress);
       })));
     });
 
@@ -17397,8 +17748,9 @@
       var arg_merchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReturnAddress.fromJson(json);
-        checkReturnAddress(obj);
+        var obj = api.ReturnAddress.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReturnAddress(obj as api.ReturnAddress);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17434,7 +17786,7 @@
       res
           .insert(arg_request, arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnAddress(response);
+        checkReturnAddress(response as api.ReturnAddress);
       })));
     });
 
@@ -17491,7 +17843,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnaddressListResponse(response);
+        checkReturnaddressListResponse(
+            response as api.ReturnaddressListResponse);
       })));
     });
   });
@@ -17503,8 +17856,10 @@
       var arg_request = buildReturnpolicyCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReturnpolicyCustomBatchRequest.fromJson(json);
-        checkReturnpolicyCustomBatchRequest(obj);
+        var obj = api.ReturnpolicyCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReturnpolicyCustomBatchRequest(
+            obj as api.ReturnpolicyCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17546,7 +17901,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnpolicyCustomBatchResponse(response);
+        checkReturnpolicyCustomBatchResponse(
+            response as api.ReturnpolicyCustomBatchResponse);
       })));
     });
 
@@ -17634,7 +17990,7 @@
       res
           .get(arg_merchantId, arg_returnPolicyId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnPolicy(response);
+        checkReturnPolicy(response as api.ReturnPolicy);
       })));
     });
 
@@ -17645,8 +18001,9 @@
       var arg_merchantId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReturnPolicy.fromJson(json);
-        checkReturnPolicy(obj);
+        var obj = api.ReturnPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReturnPolicy(obj as api.ReturnPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17682,7 +18039,7 @@
       res
           .insert(arg_request, arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnPolicy(response);
+        checkReturnPolicy(response as api.ReturnPolicy);
       })));
     });
 
@@ -17726,7 +18083,7 @@
       res
           .list(arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReturnpolicyListResponse(response);
+        checkReturnpolicyListResponse(response as api.ReturnpolicyListResponse);
       })));
     });
   });
@@ -17773,7 +18130,7 @@
       res
           .get(arg_merchantId, arg_settlementId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSettlementReport(response);
+        checkSettlementReport(response as api.SettlementReport);
       })));
     });
 
@@ -17834,7 +18191,8 @@
               transferStartDate: arg_transferStartDate,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSettlementreportsListResponse(response);
+        checkSettlementreportsListResponse(
+            response as api.SettlementreportsListResponse);
       })));
     });
   });
@@ -17895,7 +18253,8 @@
               transactionIds: arg_transactionIds,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSettlementtransactionsListResponse(response);
+        checkSettlementtransactionsListResponse(
+            response as api.SettlementtransactionsListResponse);
       })));
     });
   });
@@ -17907,8 +18266,10 @@
       var arg_request = buildShippingsettingsCustomBatchRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ShippingsettingsCustomBatchRequest.fromJson(json);
-        checkShippingsettingsCustomBatchRequest(obj);
+        var obj = api.ShippingsettingsCustomBatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkShippingsettingsCustomBatchRequest(
+            obj as api.ShippingsettingsCustomBatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17951,7 +18312,8 @@
       res
           .custombatch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShippingsettingsCustomBatchResponse(response);
+        checkShippingsettingsCustomBatchResponse(
+            response as api.ShippingsettingsCustomBatchResponse);
       })));
     });
 
@@ -17996,7 +18358,7 @@
       res
           .get(arg_merchantId, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShippingSettings(response);
+        checkShippingSettings(response as api.ShippingSettings);
       })));
     });
 
@@ -18041,7 +18403,8 @@
       res
           .getsupportedcarriers(arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShippingsettingsGetSupportedCarriersResponse(response);
+        checkShippingsettingsGetSupportedCarriersResponse(
+            response as api.ShippingsettingsGetSupportedCarriersResponse);
       })));
     });
 
@@ -18086,7 +18449,8 @@
       res
           .getsupportedholidays(arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShippingsettingsGetSupportedHolidaysResponse(response);
+        checkShippingsettingsGetSupportedHolidaysResponse(
+            response as api.ShippingsettingsGetSupportedHolidaysResponse);
       })));
     });
 
@@ -18131,7 +18495,8 @@
       res
           .getsupportedpickupservices(arg_merchantId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShippingsettingsGetSupportedPickupServicesResponse(response);
+        checkShippingsettingsGetSupportedPickupServicesResponse(
+            response as api.ShippingsettingsGetSupportedPickupServicesResponse);
       })));
     });
 
@@ -18184,7 +18549,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShippingsettingsListResponse(response);
+        checkShippingsettingsListResponse(
+            response as api.ShippingsettingsListResponse);
       })));
     });
 
@@ -18196,8 +18562,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ShippingSettings.fromJson(json);
-        checkShippingSettings(obj);
+        var obj = api.ShippingSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkShippingSettings(obj as api.ShippingSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18234,7 +18601,7 @@
           .update(arg_request, arg_merchantId, arg_accountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkShippingSettings(response);
+        checkShippingSettings(response as api.ShippingSettings);
       })));
     });
   });
diff --git a/generated/googleapis/test/customsearch/v1_test.dart b/generated/googleapis/test/customsearch/v1_test.dart
index c7d4206..c36bc7c 100644
--- a/generated/googleapis/test/customsearch/v1_test.dart
+++ b/generated/googleapis/test/customsearch/v1_test.dart
@@ -108,8 +108,8 @@
 
 void checkUnnamed3956(core.List<api.PromotionBodyLines> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPromotionBodyLines(o[0]);
-  checkPromotionBodyLines(o[1]);
+  checkPromotionBodyLines(o[0] as api.PromotionBodyLines);
+  checkPromotionBodyLines(o[1] as api.PromotionBodyLines);
 }
 
 core.int buildCounterPromotionImage = 0;
@@ -157,7 +157,7 @@
     checkUnnamed3956(o.bodyLines);
     unittest.expect(o.displayLink, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
-    checkPromotionImage(o.image);
+    checkPromotionImage(o.image as api.PromotionImage);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -227,8 +227,8 @@
 
 void checkUnnamed3957(core.List<api.ResultLabels> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResultLabels(o[0]);
-  checkResultLabels(o[1]);
+  checkResultLabels(o[0] as api.ResultLabels);
+  checkResultLabels(o[1] as api.ResultLabels);
 }
 
 core.Map<core.String, core.Object> buildUnnamed3958() {
@@ -295,7 +295,7 @@
     unittest.expect(o.htmlFormattedUrl, unittest.equals('foo'));
     unittest.expect(o.htmlSnippet, unittest.equals('foo'));
     unittest.expect(o.htmlTitle, unittest.equals('foo'));
-    checkResultImage(o.image);
+    checkResultImage(o.image as api.ResultImage);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3957(o.labels);
     unittest.expect(o.link, unittest.equals('foo'));
@@ -345,8 +345,8 @@
 
 void checkUnnamed3960(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResult(o[0]);
-  checkResult(o[1]);
+  checkResult(o[0] as api.Result);
+  checkResult(o[1] as api.Result);
 }
 
 core.List<api.Promotion> buildUnnamed3961() {
@@ -358,8 +358,8 @@
 
 void checkUnnamed3961(core.List<api.Promotion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPromotion(o[0]);
-  checkPromotion(o[1]);
+  checkPromotion(o[0] as api.Promotion);
+  checkPromotion(o[1] as api.Promotion);
 }
 
 core.int buildCounterSearchQueriesNextPage = 0;
@@ -460,8 +460,8 @@
 
 void checkUnnamed3962(core.List<api.SearchQueriesNextPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchQueriesNextPage(o[0]);
-  checkSearchQueriesNextPage(o[1]);
+  checkSearchQueriesNextPage(o[0] as api.SearchQueriesNextPage);
+  checkSearchQueriesNextPage(o[1] as api.SearchQueriesNextPage);
 }
 
 core.int buildCounterSearchQueriesPreviousPage = 0;
@@ -562,8 +562,8 @@
 
 void checkUnnamed3963(core.List<api.SearchQueriesPreviousPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchQueriesPreviousPage(o[0]);
-  checkSearchQueriesPreviousPage(o[1]);
+  checkSearchQueriesPreviousPage(o[0] as api.SearchQueriesPreviousPage);
+  checkSearchQueriesPreviousPage(o[1] as api.SearchQueriesPreviousPage);
 }
 
 core.int buildCounterSearchQueriesRequest = 0;
@@ -664,8 +664,8 @@
 
 void checkUnnamed3964(core.List<api.SearchQueriesRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchQueriesRequest(o[0]);
-  checkSearchQueriesRequest(o[1]);
+  checkSearchQueriesRequest(o[0] as api.SearchQueriesRequest);
+  checkSearchQueriesRequest(o[1] as api.SearchQueriesRequest);
 }
 
 core.int buildCounterSearchQueries = 0;
@@ -783,10 +783,11 @@
     checkUnnamed3960(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3961(o.promotions);
-    checkSearchQueries(o.queries);
-    checkSearchSearchInformation(o.searchInformation);
-    checkSearchSpelling(o.spelling);
-    checkSearchUrl(o.url);
+    checkSearchQueries(o.queries as api.SearchQueries);
+    checkSearchSearchInformation(
+        o.searchInformation as api.SearchSearchInformation);
+    checkSearchSpelling(o.spelling as api.SearchSpelling);
+    checkSearchUrl(o.url as api.SearchUrl);
   }
   buildCounterSearch--;
 }
@@ -796,7 +797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPromotionBodyLines();
       var od = api.PromotionBodyLines.fromJson(o.toJson());
-      checkPromotionBodyLines(od);
+      checkPromotionBodyLines(od as api.PromotionBodyLines);
     });
   });
 
@@ -804,7 +805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPromotionImage();
       var od = api.PromotionImage.fromJson(o.toJson());
-      checkPromotionImage(od);
+      checkPromotionImage(od as api.PromotionImage);
     });
   });
 
@@ -812,7 +813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPromotion();
       var od = api.Promotion.fromJson(o.toJson());
-      checkPromotion(od);
+      checkPromotion(od as api.Promotion);
     });
   });
 
@@ -820,7 +821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultImage();
       var od = api.ResultImage.fromJson(o.toJson());
-      checkResultImage(od);
+      checkResultImage(od as api.ResultImage);
     });
   });
 
@@ -828,7 +829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultLabels();
       var od = api.ResultLabels.fromJson(o.toJson());
-      checkResultLabels(od);
+      checkResultLabels(od as api.ResultLabels);
     });
   });
 
@@ -836,7 +837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResult();
       var od = api.Result.fromJson(o.toJson());
-      checkResult(od);
+      checkResult(od as api.Result);
     });
   });
 
@@ -844,7 +845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchQueriesNextPage();
       var od = api.SearchQueriesNextPage.fromJson(o.toJson());
-      checkSearchQueriesNextPage(od);
+      checkSearchQueriesNextPage(od as api.SearchQueriesNextPage);
     });
   });
 
@@ -852,7 +853,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchQueriesPreviousPage();
       var od = api.SearchQueriesPreviousPage.fromJson(o.toJson());
-      checkSearchQueriesPreviousPage(od);
+      checkSearchQueriesPreviousPage(od as api.SearchQueriesPreviousPage);
     });
   });
 
@@ -860,7 +861,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchQueriesRequest();
       var od = api.SearchQueriesRequest.fromJson(o.toJson());
-      checkSearchQueriesRequest(od);
+      checkSearchQueriesRequest(od as api.SearchQueriesRequest);
     });
   });
 
@@ -868,7 +869,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchQueries();
       var od = api.SearchQueries.fromJson(o.toJson());
-      checkSearchQueries(od);
+      checkSearchQueries(od as api.SearchQueries);
     });
   });
 
@@ -876,7 +877,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchSearchInformation();
       var od = api.SearchSearchInformation.fromJson(o.toJson());
-      checkSearchSearchInformation(od);
+      checkSearchSearchInformation(od as api.SearchSearchInformation);
     });
   });
 
@@ -884,7 +885,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchSpelling();
       var od = api.SearchSpelling.fromJson(o.toJson());
-      checkSearchSpelling(od);
+      checkSearchSpelling(od as api.SearchSpelling);
     });
   });
 
@@ -892,7 +893,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchUrl();
       var od = api.SearchUrl.fromJson(o.toJson());
-      checkSearchUrl(od);
+      checkSearchUrl(od as api.SearchUrl);
     });
   });
 
@@ -900,7 +901,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearch();
       var od = api.Search.fromJson(o.toJson());
-      checkSearch(od);
+      checkSearch(od as api.Search);
     });
   });
 
@@ -1060,7 +1061,7 @@
               start: arg_start,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearch(response);
+        checkSearch(response as api.Search);
       })));
     });
   });
@@ -1221,7 +1222,7 @@
               start: arg_start,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearch(response);
+        checkSearch(response as api.Search);
       })));
     });
   });
diff --git a/generated/googleapis/test/dataproc/v1_test.dart b/generated/googleapis/test/dataproc/v1_test.dart
index 0e2be0f..50f01e1 100644
--- a/generated/googleapis/test/dataproc/v1_test.dart
+++ b/generated/googleapis/test/dataproc/v1_test.dart
@@ -132,11 +132,14 @@
 void checkAutoscalingPolicy(api.AutoscalingPolicy o) {
   buildCounterAutoscalingPolicy++;
   if (buildCounterAutoscalingPolicy < 3) {
-    checkBasicAutoscalingAlgorithm(o.basicAlgorithm);
+    checkBasicAutoscalingAlgorithm(
+        o.basicAlgorithm as api.BasicAutoscalingAlgorithm);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkInstanceGroupAutoscalingPolicyConfig(o.secondaryWorkerConfig);
-    checkInstanceGroupAutoscalingPolicyConfig(o.workerConfig);
+    checkInstanceGroupAutoscalingPolicyConfig(
+        o.secondaryWorkerConfig as api.InstanceGroupAutoscalingPolicyConfig);
+    checkInstanceGroupAutoscalingPolicyConfig(
+        o.workerConfig as api.InstanceGroupAutoscalingPolicyConfig);
   }
   buildCounterAutoscalingPolicy--;
 }
@@ -157,7 +160,8 @@
   buildCounterBasicAutoscalingAlgorithm++;
   if (buildCounterBasicAutoscalingAlgorithm < 3) {
     unittest.expect(o.cooldownPeriod, unittest.equals('foo'));
-    checkBasicYarnAutoscalingConfig(o.yarnConfig);
+    checkBasicYarnAutoscalingConfig(
+        o.yarnConfig as api.BasicYarnAutoscalingConfig);
   }
   buildCounterBasicAutoscalingAlgorithm--;
 }
@@ -220,7 +224,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2517(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -264,8 +268,8 @@
 
 void checkUnnamed2519(core.List<api.ClusterStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClusterStatus(o[0]);
-  checkClusterStatus(o[1]);
+  checkClusterStatus(o[0] as api.ClusterStatus);
+  checkClusterStatus(o[1] as api.ClusterStatus);
 }
 
 core.int buildCounterCluster = 0;
@@ -291,11 +295,11 @@
   if (buildCounterCluster < 3) {
     unittest.expect(o.clusterName, unittest.equals('foo'));
     unittest.expect(o.clusterUuid, unittest.equals('foo'));
-    checkClusterConfig(o.config);
+    checkClusterConfig(o.config as api.ClusterConfig);
     checkUnnamed2518(o.labels);
-    checkClusterMetrics(o.metrics);
+    checkClusterMetrics(o.metrics as api.ClusterMetrics);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkClusterStatus(o.status);
+    checkClusterStatus(o.status as api.ClusterStatus);
     checkUnnamed2519(o.statusHistory);
   }
   buildCounterCluster--;
@@ -310,8 +314,8 @@
 
 void checkUnnamed2520(core.List<api.NodeInitializationAction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNodeInitializationAction(o[0]);
-  checkNodeInitializationAction(o[1]);
+  checkNodeInitializationAction(o[0] as api.NodeInitializationAction);
+  checkNodeInitializationAction(o[1] as api.NodeInitializationAction);
 }
 
 core.int buildCounterClusterConfig = 0;
@@ -340,19 +344,20 @@
 void checkClusterConfig(api.ClusterConfig o) {
   buildCounterClusterConfig++;
   if (buildCounterClusterConfig < 3) {
-    checkAutoscalingConfig(o.autoscalingConfig);
+    checkAutoscalingConfig(o.autoscalingConfig as api.AutoscalingConfig);
     unittest.expect(o.configBucket, unittest.equals('foo'));
-    checkEncryptionConfig(o.encryptionConfig);
-    checkEndpointConfig(o.endpointConfig);
-    checkGceClusterConfig(o.gceClusterConfig);
+    checkEncryptionConfig(o.encryptionConfig as api.EncryptionConfig);
+    checkEndpointConfig(o.endpointConfig as api.EndpointConfig);
+    checkGceClusterConfig(o.gceClusterConfig as api.GceClusterConfig);
     checkUnnamed2520(o.initializationActions);
-    checkLifecycleConfig(o.lifecycleConfig);
-    checkInstanceGroupConfig(o.masterConfig);
-    checkInstanceGroupConfig(o.secondaryWorkerConfig);
-    checkSecurityConfig(o.securityConfig);
-    checkSoftwareConfig(o.softwareConfig);
+    checkLifecycleConfig(o.lifecycleConfig as api.LifecycleConfig);
+    checkInstanceGroupConfig(o.masterConfig as api.InstanceGroupConfig);
+    checkInstanceGroupConfig(
+        o.secondaryWorkerConfig as api.InstanceGroupConfig);
+    checkSecurityConfig(o.securityConfig as api.SecurityConfig);
+    checkSoftwareConfig(o.softwareConfig as api.SoftwareConfig);
     unittest.expect(o.tempBucket, unittest.equals('foo'));
-    checkInstanceGroupConfig(o.workerConfig);
+    checkInstanceGroupConfig(o.workerConfig as api.InstanceGroupConfig);
   }
   buildCounterClusterConfig--;
 }
@@ -449,8 +454,8 @@
 
 void checkUnnamed2524(core.List<api.ClusterOperationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClusterOperationStatus(o[0]);
-  checkClusterOperationStatus(o[1]);
+  checkClusterOperationStatus(o[0] as api.ClusterOperationStatus);
+  checkClusterOperationStatus(o[1] as api.ClusterOperationStatus);
 }
 
 core.List<core.String> buildUnnamed2525() {
@@ -492,7 +497,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed2523(o.labels);
     unittest.expect(o.operationType, unittest.equals('foo'));
-    checkClusterOperationStatus(o.status);
+    checkClusterOperationStatus(o.status as api.ClusterOperationStatus);
     checkUnnamed2524(o.statusHistory);
     checkUnnamed2525(o.warnings);
   }
@@ -799,9 +804,9 @@
     unittest.expect(o.internalIpOnly, unittest.isTrue);
     checkUnnamed2528(o.metadata);
     unittest.expect(o.networkUri, unittest.equals('foo'));
-    checkNodeGroupAffinity(o.nodeGroupAffinity);
+    checkNodeGroupAffinity(o.nodeGroupAffinity as api.NodeGroupAffinity);
     unittest.expect(o.privateIpv6GoogleAccess, unittest.equals('foo'));
-    checkReservationAffinity(o.reservationAffinity);
+    checkReservationAffinity(o.reservationAffinity as api.ReservationAffinity);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
     checkUnnamed2529(o.serviceAccountScopes);
     unittest.expect(o.subnetworkUri, unittest.equals('foo'));
@@ -825,7 +830,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -939,7 +944,7 @@
     checkUnnamed2532(o.args);
     checkUnnamed2533(o.fileUris);
     checkUnnamed2534(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
+    checkLoggingConfig(o.loggingConfig as api.LoggingConfig);
     unittest.expect(o.mainClass, unittest.equals('foo'));
     unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
     checkUnnamed2535(o.properties);
@@ -1009,7 +1014,7 @@
     checkUnnamed2536(o.jarFileUris);
     checkUnnamed2537(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
-    checkQueryList(o.queryList);
+    checkQueryList(o.queryList as api.QueryList);
     checkUnnamed2538(o.scriptVariables);
   }
   buildCounterHiveJob--;
@@ -1049,8 +1054,8 @@
 
 void checkUnnamed2539(core.List<api.AcceleratorConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorConfig(o[0]);
-  checkAcceleratorConfig(o[1]);
+  checkAcceleratorConfig(o[0] as api.AcceleratorConfig);
+  checkAcceleratorConfig(o[1] as api.AcceleratorConfig);
 }
 
 core.List<core.String> buildUnnamed2540() {
@@ -1075,8 +1080,8 @@
 
 void checkUnnamed2541(core.List<api.InstanceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceReference(o[0]);
-  checkInstanceReference(o[1]);
+  checkInstanceReference(o[0] as api.InstanceReference);
+  checkInstanceReference(o[1] as api.InstanceReference);
 }
 
 core.int buildCounterInstanceGroupConfig = 0;
@@ -1104,13 +1109,13 @@
   buildCounterInstanceGroupConfig++;
   if (buildCounterInstanceGroupConfig < 3) {
     checkUnnamed2539(o.accelerators);
-    checkDiskConfig(o.diskConfig);
+    checkDiskConfig(o.diskConfig as api.DiskConfig);
     unittest.expect(o.imageUri, unittest.equals('foo'));
     checkUnnamed2540(o.instanceNames);
     checkUnnamed2541(o.instanceReferences);
     unittest.expect(o.isPreemptible, unittest.isTrue);
     unittest.expect(o.machineTypeUri, unittest.equals('foo'));
-    checkManagedGroupConfig(o.managedGroupConfig);
+    checkManagedGroupConfig(o.managedGroupConfig as api.ManagedGroupConfig);
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
     unittest.expect(o.numInstances, unittest.equals(42));
     unittest.expect(o.preemptibility, unittest.equals('foo'));
@@ -1199,8 +1204,8 @@
 
 void checkUnnamed2544(core.List<api.JobStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJobStatus(o[0]);
-  checkJobStatus(o[1]);
+  checkJobStatus(o[0] as api.JobStatus);
+  checkJobStatus(o[1] as api.JobStatus);
 }
 
 core.List<api.YarnApplication> buildUnnamed2545() {
@@ -1212,8 +1217,8 @@
 
 void checkUnnamed2545(core.List<api.YarnApplication> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkYarnApplication(o[0]);
-  checkYarnApplication(o[1]);
+  checkYarnApplication(o[0] as api.YarnApplication);
+  checkYarnApplication(o[1] as api.YarnApplication);
 }
 
 core.int buildCounterJob = 0;
@@ -1251,20 +1256,20 @@
     unittest.expect(o.done, unittest.isTrue);
     unittest.expect(o.driverControlFilesUri, unittest.equals('foo'));
     unittest.expect(o.driverOutputResourceUri, unittest.equals('foo'));
-    checkHadoopJob(o.hadoopJob);
-    checkHiveJob(o.hiveJob);
+    checkHadoopJob(o.hadoopJob as api.HadoopJob);
+    checkHiveJob(o.hiveJob as api.HiveJob);
     unittest.expect(o.jobUuid, unittest.equals('foo'));
     checkUnnamed2543(o.labels);
-    checkPigJob(o.pigJob);
-    checkJobPlacement(o.placement);
-    checkPrestoJob(o.prestoJob);
-    checkPySparkJob(o.pysparkJob);
-    checkJobReference(o.reference);
-    checkJobScheduling(o.scheduling);
-    checkSparkJob(o.sparkJob);
-    checkSparkRJob(o.sparkRJob);
-    checkSparkSqlJob(o.sparkSqlJob);
-    checkJobStatus(o.status);
+    checkPigJob(o.pigJob as api.PigJob);
+    checkJobPlacement(o.placement as api.JobPlacement);
+    checkPrestoJob(o.prestoJob as api.PrestoJob);
+    checkPySparkJob(o.pysparkJob as api.PySparkJob);
+    checkJobReference(o.reference as api.JobReference);
+    checkJobScheduling(o.scheduling as api.JobScheduling);
+    checkSparkJob(o.sparkJob as api.SparkJob);
+    checkSparkRJob(o.sparkRJob as api.SparkRJob);
+    checkSparkSqlJob(o.sparkSqlJob as api.SparkSqlJob);
+    checkJobStatus(o.status as api.JobStatus);
     checkUnnamed2544(o.statusHistory);
     checkUnnamed2545(o.yarnApplications);
   }
@@ -1291,7 +1296,7 @@
     unittest.expect(o.jobId, unittest.equals('foo'));
     unittest.expect(o.operationType, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkJobStatus(o.status);
+    checkJobStatus(o.status as api.JobStatus);
   }
   buildCounterJobMetadata--;
 }
@@ -1463,8 +1468,8 @@
 
 void checkUnnamed2546(core.List<api.AutoscalingPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAutoscalingPolicy(o[0]);
-  checkAutoscalingPolicy(o[1]);
+  checkAutoscalingPolicy(o[0] as api.AutoscalingPolicy);
+  checkAutoscalingPolicy(o[1] as api.AutoscalingPolicy);
 }
 
 core.int buildCounterListAutoscalingPoliciesResponse = 0;
@@ -1498,8 +1503,8 @@
 
 void checkUnnamed2547(core.List<api.Cluster> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCluster(o[0]);
-  checkCluster(o[1]);
+  checkCluster(o[0] as api.Cluster);
+  checkCluster(o[1] as api.Cluster);
 }
 
 core.int buildCounterListClustersResponse = 0;
@@ -1532,8 +1537,8 @@
 
 void checkUnnamed2548(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJob(o[0]);
-  checkJob(o[1]);
+  checkJob(o[0] as api.Job);
+  checkJob(o[1] as api.Job);
 }
 
 core.int buildCounterListJobsResponse = 0;
@@ -1566,8 +1571,8 @@
 
 void checkUnnamed2549(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1600,8 +1605,8 @@
 
 void checkUnnamed2550(core.List<api.WorkflowTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWorkflowTemplate(o[0]);
-  checkWorkflowTemplate(o[1]);
+  checkWorkflowTemplate(o[0] as api.WorkflowTemplate);
+  checkWorkflowTemplate(o[1] as api.WorkflowTemplate);
 }
 
 core.int buildCounterListWorkflowTemplatesResponse = 0;
@@ -1687,7 +1692,7 @@
   buildCounterManagedCluster++;
   if (buildCounterManagedCluster < 3) {
     unittest.expect(o.clusterName, unittest.equals('foo'));
-    checkClusterConfig(o.config);
+    checkClusterConfig(o.config as api.ClusterConfig);
     checkUnnamed2552(o.labels);
   }
   buildCounterManagedCluster--;
@@ -1831,7 +1836,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed2553(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2554(o.response);
@@ -1890,17 +1895,17 @@
 void checkOrderedJob(api.OrderedJob o) {
   buildCounterOrderedJob++;
   if (buildCounterOrderedJob < 3) {
-    checkHadoopJob(o.hadoopJob);
-    checkHiveJob(o.hiveJob);
+    checkHadoopJob(o.hadoopJob as api.HadoopJob);
+    checkHiveJob(o.hiveJob as api.HiveJob);
     checkUnnamed2555(o.labels);
-    checkPigJob(o.pigJob);
+    checkPigJob(o.pigJob as api.PigJob);
     checkUnnamed2556(o.prerequisiteStepIds);
-    checkPrestoJob(o.prestoJob);
-    checkPySparkJob(o.pysparkJob);
-    checkJobScheduling(o.scheduling);
-    checkSparkJob(o.sparkJob);
-    checkSparkRJob(o.sparkRJob);
-    checkSparkSqlJob(o.sparkSqlJob);
+    checkPrestoJob(o.prestoJob as api.PrestoJob);
+    checkPySparkJob(o.pysparkJob as api.PySparkJob);
+    checkJobScheduling(o.scheduling as api.JobScheduling);
+    checkSparkJob(o.sparkJob as api.SparkJob);
+    checkSparkRJob(o.sparkRJob as api.SparkRJob);
+    checkSparkSqlJob(o.sparkSqlJob as api.SparkSqlJob);
     unittest.expect(o.stepId, unittest.equals('foo'));
   }
   buildCounterOrderedJob--;
@@ -1921,8 +1926,8 @@
 void checkParameterValidation(api.ParameterValidation o) {
   buildCounterParameterValidation++;
   if (buildCounterParameterValidation < 3) {
-    checkRegexValidation(o.regex);
-    checkValueValidation(o.values);
+    checkRegexValidation(o.regex as api.RegexValidation);
+    checkValueValidation(o.values as api.ValueValidation);
   }
   buildCounterParameterValidation--;
 }
@@ -1988,10 +1993,10 @@
   if (buildCounterPigJob < 3) {
     unittest.expect(o.continueOnFailure, unittest.isTrue);
     checkUnnamed2557(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
+    checkLoggingConfig(o.loggingConfig as api.LoggingConfig);
     checkUnnamed2558(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
-    checkQueryList(o.queryList);
+    checkQueryList(o.queryList as api.QueryList);
     checkUnnamed2559(o.scriptVariables);
   }
   buildCounterPigJob--;
@@ -2006,8 +2011,8 @@
 
 void checkUnnamed2560(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -2081,11 +2086,11 @@
   if (buildCounterPrestoJob < 3) {
     checkUnnamed2561(o.clientTags);
     unittest.expect(o.continueOnFailure, unittest.isTrue);
-    checkLoggingConfig(o.loggingConfig);
+    checkLoggingConfig(o.loggingConfig as api.LoggingConfig);
     unittest.expect(o.outputFormat, unittest.equals('foo'));
     checkUnnamed2562(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
-    checkQueryList(o.queryList);
+    checkQueryList(o.queryList as api.QueryList);
   }
   buildCounterPrestoJob--;
 }
@@ -2193,7 +2198,7 @@
     checkUnnamed2564(o.args);
     checkUnnamed2565(o.fileUris);
     checkUnnamed2566(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
+    checkLoggingConfig(o.loggingConfig as api.LoggingConfig);
     unittest.expect(o.mainPythonFileUri, unittest.equals('foo'));
     checkUnnamed2567(o.properties);
     checkUnnamed2568(o.pythonFileUris);
@@ -2315,7 +2320,7 @@
 void checkSecurityConfig(api.SecurityConfig o) {
   buildCounterSecurityConfig++;
   if (buildCounterSecurityConfig < 3) {
-    checkKerberosConfig(o.kerberosConfig);
+    checkKerberosConfig(o.kerberosConfig as api.KerberosConfig);
   }
   buildCounterSecurityConfig--;
 }
@@ -2334,7 +2339,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -2478,7 +2483,7 @@
     checkUnnamed2575(o.args);
     checkUnnamed2576(o.fileUris);
     checkUnnamed2577(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
+    checkLoggingConfig(o.loggingConfig as api.LoggingConfig);
     unittest.expect(o.mainClass, unittest.equals('foo'));
     unittest.expect(o.mainJarFileUri, unittest.equals('foo'));
     checkUnnamed2578(o.properties);
@@ -2560,7 +2565,7 @@
     checkUnnamed2579(o.archiveUris);
     checkUnnamed2580(o.args);
     checkUnnamed2581(o.fileUris);
-    checkLoggingConfig(o.loggingConfig);
+    checkLoggingConfig(o.loggingConfig as api.LoggingConfig);
     unittest.expect(o.mainRFileUri, unittest.equals('foo'));
     checkUnnamed2582(o.properties);
   }
@@ -2626,10 +2631,10 @@
   buildCounterSparkSqlJob++;
   if (buildCounterSparkSqlJob < 3) {
     checkUnnamed2583(o.jarFileUris);
-    checkLoggingConfig(o.loggingConfig);
+    checkLoggingConfig(o.loggingConfig as api.LoggingConfig);
     checkUnnamed2584(o.properties);
     unittest.expect(o.queryFileUri, unittest.equals('foo'));
-    checkQueryList(o.queryList);
+    checkQueryList(o.queryList as api.QueryList);
     checkUnnamed2585(o.scriptVariables);
   }
   buildCounterSparkSqlJob--;
@@ -2715,7 +2720,7 @@
 void checkSubmitJobRequest(api.SubmitJobRequest o) {
   buildCounterSubmitJobRequest++;
   if (buildCounterSubmitJobRequest < 3) {
-    checkJob(o.job);
+    checkJob(o.job as api.Job);
     unittest.expect(o.requestId, unittest.equals('foo'));
   }
   buildCounterSubmitJobRequest--;
@@ -2754,7 +2759,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed2588(o.fields);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkParameterValidation(o.validation);
+    checkParameterValidation(o.validation as api.ParameterValidation);
   }
   buildCounterTemplateParameter--;
 }
@@ -2864,8 +2869,8 @@
 
 void checkUnnamed2592(core.List<api.WorkflowNode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWorkflowNode(o[0]);
-  checkWorkflowNode(o[1]);
+  checkWorkflowNode(o[0] as api.WorkflowNode);
+  checkWorkflowNode(o[1] as api.WorkflowNode);
 }
 
 core.int buildCounterWorkflowGraph = 0;
@@ -2926,10 +2931,10 @@
   if (buildCounterWorkflowMetadata < 3) {
     unittest.expect(o.clusterName, unittest.equals('foo'));
     unittest.expect(o.clusterUuid, unittest.equals('foo'));
-    checkClusterOperation(o.createCluster);
-    checkClusterOperation(o.deleteCluster);
+    checkClusterOperation(o.createCluster as api.ClusterOperation);
+    checkClusterOperation(o.deleteCluster as api.ClusterOperation);
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkWorkflowGraph(o.graph);
+    checkWorkflowGraph(o.graph as api.WorkflowGraph);
     checkUnnamed2593(o.parameters);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -2988,8 +2993,8 @@
 
 void checkUnnamed2595(core.List<api.OrderedJob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderedJob(o[0]);
-  checkOrderedJob(o[1]);
+  checkOrderedJob(o[0] as api.OrderedJob);
+  checkOrderedJob(o[1] as api.OrderedJob);
 }
 
 core.Map<core.String, core.String> buildUnnamed2596() {
@@ -3014,8 +3019,8 @@
 
 void checkUnnamed2597(core.List<api.TemplateParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTemplateParameter(o[0]);
-  checkTemplateParameter(o[1]);
+  checkTemplateParameter(o[0] as api.TemplateParameter);
+  checkTemplateParameter(o[1] as api.TemplateParameter);
 }
 
 core.int buildCounterWorkflowTemplate = 0;
@@ -3046,7 +3051,8 @@
     checkUnnamed2596(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2597(o.parameters);
-    checkWorkflowTemplatePlacement(o.placement);
+    checkWorkflowTemplatePlacement(
+        o.placement as api.WorkflowTemplatePlacement);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals(42));
   }
@@ -3068,8 +3074,8 @@
 void checkWorkflowTemplatePlacement(api.WorkflowTemplatePlacement o) {
   buildCounterWorkflowTemplatePlacement++;
   if (buildCounterWorkflowTemplatePlacement < 3) {
-    checkClusterSelector(o.clusterSelector);
-    checkManagedCluster(o.managedCluster);
+    checkClusterSelector(o.clusterSelector as api.ClusterSelector);
+    checkManagedCluster(o.managedCluster as api.ManagedCluster);
   }
   buildCounterWorkflowTemplatePlacement--;
 }
@@ -3104,7 +3110,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorConfig();
       var od = api.AcceleratorConfig.fromJson(o.toJson());
-      checkAcceleratorConfig(od);
+      checkAcceleratorConfig(od as api.AcceleratorConfig);
     });
   });
 
@@ -3112,7 +3118,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalingConfig();
       var od = api.AutoscalingConfig.fromJson(o.toJson());
-      checkAutoscalingConfig(od);
+      checkAutoscalingConfig(od as api.AutoscalingConfig);
     });
   });
 
@@ -3120,7 +3126,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoscalingPolicy();
       var od = api.AutoscalingPolicy.fromJson(o.toJson());
-      checkAutoscalingPolicy(od);
+      checkAutoscalingPolicy(od as api.AutoscalingPolicy);
     });
   });
 
@@ -3128,7 +3134,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicAutoscalingAlgorithm();
       var od = api.BasicAutoscalingAlgorithm.fromJson(o.toJson());
-      checkBasicAutoscalingAlgorithm(od);
+      checkBasicAutoscalingAlgorithm(od as api.BasicAutoscalingAlgorithm);
     });
   });
 
@@ -3136,7 +3142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicYarnAutoscalingConfig();
       var od = api.BasicYarnAutoscalingConfig.fromJson(o.toJson());
-      checkBasicYarnAutoscalingConfig(od);
+      checkBasicYarnAutoscalingConfig(od as api.BasicYarnAutoscalingConfig);
     });
   });
 
@@ -3144,7 +3150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -3152,7 +3158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelJobRequest();
       var od = api.CancelJobRequest.fromJson(o.toJson());
-      checkCancelJobRequest(od);
+      checkCancelJobRequest(od as api.CancelJobRequest);
     });
   });
 
@@ -3160,7 +3166,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCluster();
       var od = api.Cluster.fromJson(o.toJson());
-      checkCluster(od);
+      checkCluster(od as api.Cluster);
     });
   });
 
@@ -3168,7 +3174,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterConfig();
       var od = api.ClusterConfig.fromJson(o.toJson());
-      checkClusterConfig(od);
+      checkClusterConfig(od as api.ClusterConfig);
     });
   });
 
@@ -3176,7 +3182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterMetrics();
       var od = api.ClusterMetrics.fromJson(o.toJson());
-      checkClusterMetrics(od);
+      checkClusterMetrics(od as api.ClusterMetrics);
     });
   });
 
@@ -3184,7 +3190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterOperation();
       var od = api.ClusterOperation.fromJson(o.toJson());
-      checkClusterOperation(od);
+      checkClusterOperation(od as api.ClusterOperation);
     });
   });
 
@@ -3192,7 +3198,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterOperationMetadata();
       var od = api.ClusterOperationMetadata.fromJson(o.toJson());
-      checkClusterOperationMetadata(od);
+      checkClusterOperationMetadata(od as api.ClusterOperationMetadata);
     });
   });
 
@@ -3200,7 +3206,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterOperationStatus();
       var od = api.ClusterOperationStatus.fromJson(o.toJson());
-      checkClusterOperationStatus(od);
+      checkClusterOperationStatus(od as api.ClusterOperationStatus);
     });
   });
 
@@ -3208,7 +3214,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterSelector();
       var od = api.ClusterSelector.fromJson(o.toJson());
-      checkClusterSelector(od);
+      checkClusterSelector(od as api.ClusterSelector);
     });
   });
 
@@ -3216,7 +3222,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterStatus();
       var od = api.ClusterStatus.fromJson(o.toJson());
-      checkClusterStatus(od);
+      checkClusterStatus(od as api.ClusterStatus);
     });
   });
 
@@ -3224,7 +3230,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiagnoseClusterRequest();
       var od = api.DiagnoseClusterRequest.fromJson(o.toJson());
-      checkDiagnoseClusterRequest(od);
+      checkDiagnoseClusterRequest(od as api.DiagnoseClusterRequest);
     });
   });
 
@@ -3232,7 +3238,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiagnoseClusterResults();
       var od = api.DiagnoseClusterResults.fromJson(o.toJson());
-      checkDiagnoseClusterResults(od);
+      checkDiagnoseClusterResults(od as api.DiagnoseClusterResults);
     });
   });
 
@@ -3240,7 +3246,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiskConfig();
       var od = api.DiskConfig.fromJson(o.toJson());
-      checkDiskConfig(od);
+      checkDiskConfig(od as api.DiskConfig);
     });
   });
 
@@ -3248,7 +3254,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3256,7 +3262,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEncryptionConfig();
       var od = api.EncryptionConfig.fromJson(o.toJson());
-      checkEncryptionConfig(od);
+      checkEncryptionConfig(od as api.EncryptionConfig);
     });
   });
 
@@ -3264,7 +3270,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpointConfig();
       var od = api.EndpointConfig.fromJson(o.toJson());
-      checkEndpointConfig(od);
+      checkEndpointConfig(od as api.EndpointConfig);
     });
   });
 
@@ -3272,7 +3278,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -3280,7 +3286,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGceClusterConfig();
       var od = api.GceClusterConfig.fromJson(o.toJson());
-      checkGceClusterConfig(od);
+      checkGceClusterConfig(od as api.GceClusterConfig);
     });
   });
 
@@ -3288,7 +3294,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -3296,7 +3302,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -3304,7 +3310,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHadoopJob();
       var od = api.HadoopJob.fromJson(o.toJson());
-      checkHadoopJob(od);
+      checkHadoopJob(od as api.HadoopJob);
     });
   });
 
@@ -3312,7 +3318,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHiveJob();
       var od = api.HiveJob.fromJson(o.toJson());
-      checkHiveJob(od);
+      checkHiveJob(od as api.HiveJob);
     });
   });
 
@@ -3320,7 +3326,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupAutoscalingPolicyConfig();
       var od = api.InstanceGroupAutoscalingPolicyConfig.fromJson(o.toJson());
-      checkInstanceGroupAutoscalingPolicyConfig(od);
+      checkInstanceGroupAutoscalingPolicyConfig(
+          od as api.InstanceGroupAutoscalingPolicyConfig);
     });
   });
 
@@ -3328,7 +3335,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceGroupConfig();
       var od = api.InstanceGroupConfig.fromJson(o.toJson());
-      checkInstanceGroupConfig(od);
+      checkInstanceGroupConfig(od as api.InstanceGroupConfig);
     });
   });
 
@@ -3336,7 +3343,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceReference();
       var od = api.InstanceReference.fromJson(o.toJson());
-      checkInstanceReference(od);
+      checkInstanceReference(od as api.InstanceReference);
     });
   });
 
@@ -3344,7 +3351,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstantiateWorkflowTemplateRequest();
       var od = api.InstantiateWorkflowTemplateRequest.fromJson(o.toJson());
-      checkInstantiateWorkflowTemplateRequest(od);
+      checkInstantiateWorkflowTemplateRequest(
+          od as api.InstantiateWorkflowTemplateRequest);
     });
   });
 
@@ -3352,7 +3360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJob();
       var od = api.Job.fromJson(o.toJson());
-      checkJob(od);
+      checkJob(od as api.Job);
     });
   });
 
@@ -3360,7 +3368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobMetadata();
       var od = api.JobMetadata.fromJson(o.toJson());
-      checkJobMetadata(od);
+      checkJobMetadata(od as api.JobMetadata);
     });
   });
 
@@ -3368,7 +3376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobPlacement();
       var od = api.JobPlacement.fromJson(o.toJson());
-      checkJobPlacement(od);
+      checkJobPlacement(od as api.JobPlacement);
     });
   });
 
@@ -3376,7 +3384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobReference();
       var od = api.JobReference.fromJson(o.toJson());
-      checkJobReference(od);
+      checkJobReference(od as api.JobReference);
     });
   });
 
@@ -3384,7 +3392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobScheduling();
       var od = api.JobScheduling.fromJson(o.toJson());
-      checkJobScheduling(od);
+      checkJobScheduling(od as api.JobScheduling);
     });
   });
 
@@ -3392,7 +3400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobStatus();
       var od = api.JobStatus.fromJson(o.toJson());
-      checkJobStatus(od);
+      checkJobStatus(od as api.JobStatus);
     });
   });
 
@@ -3400,7 +3408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKerberosConfig();
       var od = api.KerberosConfig.fromJson(o.toJson());
-      checkKerberosConfig(od);
+      checkKerberosConfig(od as api.KerberosConfig);
     });
   });
 
@@ -3408,7 +3416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLifecycleConfig();
       var od = api.LifecycleConfig.fromJson(o.toJson());
-      checkLifecycleConfig(od);
+      checkLifecycleConfig(od as api.LifecycleConfig);
     });
   });
 
@@ -3416,7 +3424,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAutoscalingPoliciesResponse();
       var od = api.ListAutoscalingPoliciesResponse.fromJson(o.toJson());
-      checkListAutoscalingPoliciesResponse(od);
+      checkListAutoscalingPoliciesResponse(
+          od as api.ListAutoscalingPoliciesResponse);
     });
   });
 
@@ -3424,7 +3433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListClustersResponse();
       var od = api.ListClustersResponse.fromJson(o.toJson());
-      checkListClustersResponse(od);
+      checkListClustersResponse(od as api.ListClustersResponse);
     });
   });
 
@@ -3432,7 +3441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListJobsResponse();
       var od = api.ListJobsResponse.fromJson(o.toJson());
-      checkListJobsResponse(od);
+      checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
 
@@ -3440,7 +3449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3448,7 +3457,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListWorkflowTemplatesResponse();
       var od = api.ListWorkflowTemplatesResponse.fromJson(o.toJson());
-      checkListWorkflowTemplatesResponse(od);
+      checkListWorkflowTemplatesResponse(
+          od as api.ListWorkflowTemplatesResponse);
     });
   });
 
@@ -3456,7 +3466,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoggingConfig();
       var od = api.LoggingConfig.fromJson(o.toJson());
-      checkLoggingConfig(od);
+      checkLoggingConfig(od as api.LoggingConfig);
     });
   });
 
@@ -3464,7 +3474,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedCluster();
       var od = api.ManagedCluster.fromJson(o.toJson());
-      checkManagedCluster(od);
+      checkManagedCluster(od as api.ManagedCluster);
     });
   });
 
@@ -3472,7 +3482,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedGroupConfig();
       var od = api.ManagedGroupConfig.fromJson(o.toJson());
-      checkManagedGroupConfig(od);
+      checkManagedGroupConfig(od as api.ManagedGroupConfig);
     });
   });
 
@@ -3480,7 +3490,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeGroupAffinity();
       var od = api.NodeGroupAffinity.fromJson(o.toJson());
-      checkNodeGroupAffinity(od);
+      checkNodeGroupAffinity(od as api.NodeGroupAffinity);
     });
   });
 
@@ -3488,7 +3498,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNodeInitializationAction();
       var od = api.NodeInitializationAction.fromJson(o.toJson());
-      checkNodeInitializationAction(od);
+      checkNodeInitializationAction(od as api.NodeInitializationAction);
     });
   });
 
@@ -3496,7 +3506,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3504,7 +3514,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderedJob();
       var od = api.OrderedJob.fromJson(o.toJson());
-      checkOrderedJob(od);
+      checkOrderedJob(od as api.OrderedJob);
     });
   });
 
@@ -3512,7 +3522,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParameterValidation();
       var od = api.ParameterValidation.fromJson(o.toJson());
-      checkParameterValidation(od);
+      checkParameterValidation(od as api.ParameterValidation);
     });
   });
 
@@ -3520,7 +3530,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPigJob();
       var od = api.PigJob.fromJson(o.toJson());
-      checkPigJob(od);
+      checkPigJob(od as api.PigJob);
     });
   });
 
@@ -3528,7 +3538,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -3536,7 +3546,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrestoJob();
       var od = api.PrestoJob.fromJson(o.toJson());
-      checkPrestoJob(od);
+      checkPrestoJob(od as api.PrestoJob);
     });
   });
 
@@ -3544,7 +3554,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPySparkJob();
       var od = api.PySparkJob.fromJson(o.toJson());
-      checkPySparkJob(od);
+      checkPySparkJob(od as api.PySparkJob);
     });
   });
 
@@ -3552,7 +3562,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryList();
       var od = api.QueryList.fromJson(o.toJson());
-      checkQueryList(od);
+      checkQueryList(od as api.QueryList);
     });
   });
 
@@ -3560,7 +3570,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegexValidation();
       var od = api.RegexValidation.fromJson(o.toJson());
-      checkRegexValidation(od);
+      checkRegexValidation(od as api.RegexValidation);
     });
   });
 
@@ -3568,7 +3578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReservationAffinity();
       var od = api.ReservationAffinity.fromJson(o.toJson());
-      checkReservationAffinity(od);
+      checkReservationAffinity(od as api.ReservationAffinity);
     });
   });
 
@@ -3576,7 +3586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityConfig();
       var od = api.SecurityConfig.fromJson(o.toJson());
-      checkSecurityConfig(od);
+      checkSecurityConfig(od as api.SecurityConfig);
     });
   });
 
@@ -3584,7 +3594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -3592,7 +3602,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSoftwareConfig();
       var od = api.SoftwareConfig.fromJson(o.toJson());
-      checkSoftwareConfig(od);
+      checkSoftwareConfig(od as api.SoftwareConfig);
     });
   });
 
@@ -3600,7 +3610,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSparkJob();
       var od = api.SparkJob.fromJson(o.toJson());
-      checkSparkJob(od);
+      checkSparkJob(od as api.SparkJob);
     });
   });
 
@@ -3608,7 +3618,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSparkRJob();
       var od = api.SparkRJob.fromJson(o.toJson());
-      checkSparkRJob(od);
+      checkSparkRJob(od as api.SparkRJob);
     });
   });
 
@@ -3616,7 +3626,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSparkSqlJob();
       var od = api.SparkSqlJob.fromJson(o.toJson());
-      checkSparkSqlJob(od);
+      checkSparkSqlJob(od as api.SparkSqlJob);
     });
   });
 
@@ -3624,7 +3634,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3632,7 +3642,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubmitJobRequest();
       var od = api.SubmitJobRequest.fromJson(o.toJson());
-      checkSubmitJobRequest(od);
+      checkSubmitJobRequest(od as api.SubmitJobRequest);
     });
   });
 
@@ -3640,7 +3650,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTemplateParameter();
       var od = api.TemplateParameter.fromJson(o.toJson());
-      checkTemplateParameter(od);
+      checkTemplateParameter(od as api.TemplateParameter);
     });
   });
 
@@ -3648,7 +3658,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -3656,7 +3666,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -3664,7 +3674,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValueValidation();
       var od = api.ValueValidation.fromJson(o.toJson());
-      checkValueValidation(od);
+      checkValueValidation(od as api.ValueValidation);
     });
   });
 
@@ -3672,7 +3682,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkflowGraph();
       var od = api.WorkflowGraph.fromJson(o.toJson());
-      checkWorkflowGraph(od);
+      checkWorkflowGraph(od as api.WorkflowGraph);
     });
   });
 
@@ -3680,7 +3690,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkflowMetadata();
       var od = api.WorkflowMetadata.fromJson(o.toJson());
-      checkWorkflowMetadata(od);
+      checkWorkflowMetadata(od as api.WorkflowMetadata);
     });
   });
 
@@ -3688,7 +3698,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkflowNode();
       var od = api.WorkflowNode.fromJson(o.toJson());
-      checkWorkflowNode(od);
+      checkWorkflowNode(od as api.WorkflowNode);
     });
   });
 
@@ -3696,7 +3706,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkflowTemplate();
       var od = api.WorkflowTemplate.fromJson(o.toJson());
-      checkWorkflowTemplate(od);
+      checkWorkflowTemplate(od as api.WorkflowTemplate);
     });
   });
 
@@ -3704,7 +3714,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkflowTemplatePlacement();
       var od = api.WorkflowTemplatePlacement.fromJson(o.toJson());
-      checkWorkflowTemplatePlacement(od);
+      checkWorkflowTemplatePlacement(od as api.WorkflowTemplatePlacement);
     });
   });
 
@@ -3712,7 +3722,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildYarnApplication();
       var od = api.YarnApplication.fromJson(o.toJson());
-      checkYarnApplication(od);
+      checkYarnApplication(od as api.YarnApplication);
     });
   });
 
@@ -3725,8 +3735,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AutoscalingPolicy.fromJson(json);
-        checkAutoscalingPolicy(obj);
+        var obj = api.AutoscalingPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscalingPolicy(obj as api.AutoscalingPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3766,7 +3777,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalingPolicy(response);
+        checkAutoscalingPolicy(response as api.AutoscalingPolicy);
       })));
     });
 
@@ -3814,7 +3825,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3862,7 +3873,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalingPolicy(response);
+        checkAutoscalingPolicy(response as api.AutoscalingPolicy);
       })));
     });
 
@@ -3873,8 +3884,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3914,7 +3926,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3971,7 +3983,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAutoscalingPoliciesResponse(response);
+        checkListAutoscalingPoliciesResponse(
+            response as api.ListAutoscalingPoliciesResponse);
       })));
     });
 
@@ -3982,8 +3995,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4023,7 +4037,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4034,8 +4048,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4075,7 +4090,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -4086,8 +4102,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AutoscalingPolicy.fromJson(json);
-        checkAutoscalingPolicy(obj);
+        var obj = api.AutoscalingPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscalingPolicy(obj as api.AutoscalingPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4127,7 +4144,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalingPolicy(response);
+        checkAutoscalingPolicy(response as api.AutoscalingPolicy);
       })));
     });
   });
@@ -4140,8 +4157,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WorkflowTemplate.fromJson(json);
-        checkWorkflowTemplate(obj);
+        var obj = api.WorkflowTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWorkflowTemplate(obj as api.WorkflowTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4181,7 +4199,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkflowTemplate(response);
+        checkWorkflowTemplate(response as api.WorkflowTemplate);
       })));
     });
 
@@ -4232,7 +4250,7 @@
       res
           .delete(arg_name, version: arg_version, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4283,7 +4301,7 @@
       res
           .get(arg_name, version: arg_version, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkflowTemplate(response);
+        checkWorkflowTemplate(response as api.WorkflowTemplate);
       })));
     });
 
@@ -4294,8 +4312,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4335,7 +4354,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4346,8 +4365,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstantiateWorkflowTemplateRequest.fromJson(json);
-        checkInstantiateWorkflowTemplateRequest(obj);
+        var obj = api.InstantiateWorkflowTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstantiateWorkflowTemplateRequest(
+            obj as api.InstantiateWorkflowTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4387,7 +4408,7 @@
       res
           .instantiate(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4399,8 +4420,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WorkflowTemplate.fromJson(json);
-        checkWorkflowTemplate(obj);
+        var obj = api.WorkflowTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWorkflowTemplate(obj as api.WorkflowTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4443,7 +4465,7 @@
           .instantiateInline(arg_request, arg_parent,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4500,7 +4522,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListWorkflowTemplatesResponse(response);
+        checkListWorkflowTemplatesResponse(
+            response as api.ListWorkflowTemplatesResponse);
       })));
     });
 
@@ -4511,8 +4534,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4552,7 +4576,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4563,8 +4587,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4604,7 +4629,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -4615,8 +4641,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WorkflowTemplate.fromJson(json);
-        checkWorkflowTemplate(obj);
+        var obj = api.WorkflowTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWorkflowTemplate(obj as api.WorkflowTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4656,7 +4683,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkflowTemplate(response);
+        checkWorkflowTemplate(response as api.WorkflowTemplate);
       })));
     });
   });
@@ -4669,8 +4696,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AutoscalingPolicy.fromJson(json);
-        checkAutoscalingPolicy(obj);
+        var obj = api.AutoscalingPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscalingPolicy(obj as api.AutoscalingPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4710,7 +4738,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalingPolicy(response);
+        checkAutoscalingPolicy(response as api.AutoscalingPolicy);
       })));
     });
 
@@ -4758,7 +4786,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4806,7 +4834,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalingPolicy(response);
+        checkAutoscalingPolicy(response as api.AutoscalingPolicy);
       })));
     });
 
@@ -4817,8 +4845,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4858,7 +4887,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4915,7 +4944,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAutoscalingPoliciesResponse(response);
+        checkListAutoscalingPoliciesResponse(
+            response as api.ListAutoscalingPoliciesResponse);
       })));
     });
 
@@ -4926,8 +4956,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4967,7 +4998,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4978,8 +5009,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5019,7 +5051,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -5030,8 +5063,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AutoscalingPolicy.fromJson(json);
-        checkAutoscalingPolicy(obj);
+        var obj = api.AutoscalingPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoscalingPolicy(obj as api.AutoscalingPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5071,7 +5105,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoscalingPolicy(response);
+        checkAutoscalingPolicy(response as api.AutoscalingPolicy);
       })));
     });
   });
@@ -5086,8 +5120,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Cluster.fromJson(json);
-        checkCluster(obj);
+        var obj =
+            api.Cluster.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCluster(obj as api.Cluster);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5147,7 +5182,7 @@
           .create(arg_request, arg_projectId, arg_region,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5226,7 +5261,7 @@
               requestId: arg_requestId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5239,8 +5274,9 @@
       var arg_clusterName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DiagnoseClusterRequest.fromJson(json);
-        checkDiagnoseClusterRequest(obj);
+        var obj = api.DiagnoseClusterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDiagnoseClusterRequest(obj as api.DiagnoseClusterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5307,7 +5343,7 @@
           .diagnose(arg_request, arg_projectId, arg_region, arg_clusterName,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5377,7 +5413,7 @@
       res
           .get(arg_projectId, arg_region, arg_clusterName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCluster(response);
+        checkCluster(response as api.Cluster);
       })));
     });
 
@@ -5388,8 +5424,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5429,7 +5466,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5507,7 +5544,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListClustersResponse(response);
+        checkListClustersResponse(response as api.ListClustersResponse);
       })));
     });
 
@@ -5523,8 +5560,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Cluster.fromJson(json);
-        checkCluster(obj);
+        var obj =
+            api.Cluster.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCluster(obj as api.Cluster);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5594,7 +5632,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5605,8 +5643,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5646,7 +5685,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5657,8 +5696,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5698,7 +5738,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -5713,8 +5754,9 @@
       var arg_jobId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelJobRequest.fromJson(json);
-        checkCancelJobRequest(obj);
+        var obj = api.CancelJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelJobRequest(obj as api.CancelJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5781,7 +5823,7 @@
           .cancel(arg_request, arg_projectId, arg_region, arg_jobId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -5851,7 +5893,7 @@
       res
           .delete(arg_projectId, arg_region, arg_jobId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5921,7 +5963,7 @@
       res
           .get(arg_projectId, arg_region, arg_jobId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -5932,8 +5974,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5973,7 +6016,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -6059,7 +6102,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListJobsResponse(response);
+        checkListJobsResponse(response as api.ListJobsResponse);
       })));
     });
 
@@ -6073,8 +6116,8 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Job.fromJson(json);
-        checkJob(obj);
+        var obj = api.Job.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkJob(obj as api.Job);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6137,7 +6180,7 @@
           .patch(arg_request, arg_projectId, arg_region, arg_jobId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -6148,8 +6191,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6189,7 +6233,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -6201,8 +6245,9 @@
       var arg_region = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SubmitJobRequest.fromJson(json);
-        checkSubmitJobRequest(obj);
+        var obj = api.SubmitJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubmitJobRequest(obj as api.SubmitJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6259,7 +6304,7 @@
       res
           .submit(arg_request, arg_projectId, arg_region, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -6271,8 +6316,9 @@
       var arg_region = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SubmitJobRequest.fromJson(json);
-        checkSubmitJobRequest(obj);
+        var obj = api.SubmitJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubmitJobRequest(obj as api.SubmitJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6330,7 +6376,7 @@
           .submitAsOperation(arg_request, arg_projectId, arg_region,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6341,8 +6387,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6382,7 +6429,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -6432,7 +6480,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6480,7 +6528,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6528,7 +6576,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6539,8 +6587,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6580,7 +6629,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -6640,7 +6689,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
 
@@ -6651,8 +6700,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6692,7 +6742,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -6703,8 +6753,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6744,7 +6795,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -6757,8 +6809,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WorkflowTemplate.fromJson(json);
-        checkWorkflowTemplate(obj);
+        var obj = api.WorkflowTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWorkflowTemplate(obj as api.WorkflowTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6798,7 +6851,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkflowTemplate(response);
+        checkWorkflowTemplate(response as api.WorkflowTemplate);
       })));
     });
 
@@ -6849,7 +6902,7 @@
       res
           .delete(arg_name, version: arg_version, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6900,7 +6953,7 @@
       res
           .get(arg_name, version: arg_version, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkflowTemplate(response);
+        checkWorkflowTemplate(response as api.WorkflowTemplate);
       })));
     });
 
@@ -6911,8 +6964,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6952,7 +7006,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -6963,8 +7017,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InstantiateWorkflowTemplateRequest.fromJson(json);
-        checkInstantiateWorkflowTemplateRequest(obj);
+        var obj = api.InstantiateWorkflowTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInstantiateWorkflowTemplateRequest(
+            obj as api.InstantiateWorkflowTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7004,7 +7060,7 @@
       res
           .instantiate(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7016,8 +7072,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WorkflowTemplate.fromJson(json);
-        checkWorkflowTemplate(obj);
+        var obj = api.WorkflowTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWorkflowTemplate(obj as api.WorkflowTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7060,7 +7117,7 @@
           .instantiateInline(arg_request, arg_parent,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7117,7 +7174,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListWorkflowTemplatesResponse(response);
+        checkListWorkflowTemplatesResponse(
+            response as api.ListWorkflowTemplatesResponse);
       })));
     });
 
@@ -7128,8 +7186,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7169,7 +7228,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -7180,8 +7239,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7221,7 +7281,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -7232,8 +7293,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WorkflowTemplate.fromJson(json);
-        checkWorkflowTemplate(obj);
+        var obj = api.WorkflowTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWorkflowTemplate(obj as api.WorkflowTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7273,7 +7335,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkflowTemplate(response);
+        checkWorkflowTemplate(response as api.WorkflowTemplate);
       })));
     });
   });
diff --git a/generated/googleapis/test/datastore/v1_test.dart b/generated/googleapis/test/datastore/v1_test.dart
index 0a19e7d..d3b64a5 100644
--- a/generated/googleapis/test/datastore/v1_test.dart
+++ b/generated/googleapis/test/datastore/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed0(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKey(o[0]);
-  checkKey(o[1]);
+  checkKey(o[0] as api.Key);
+  checkKey(o[1] as api.Key);
 }
 
 core.int buildCounterAllocateIdsRequest = 0;
@@ -115,8 +115,8 @@
 
 void checkUnnamed1(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKey(o[0]);
-  checkKey(o[1]);
+  checkKey(o[0] as api.Key);
+  checkKey(o[1] as api.Key);
 }
 
 core.int buildCounterAllocateIdsResponse = 0;
@@ -147,8 +147,8 @@
 
 void checkUnnamed2(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o[0]);
-  checkValue(o[1]);
+  checkValue(o[0] as api.Value);
+  checkValue(o[1] as api.Value);
 }
 
 core.int buildCounterArrayValue = 0;
@@ -184,7 +184,7 @@
 void checkBeginTransactionRequest(api.BeginTransactionRequest o) {
   buildCounterBeginTransactionRequest++;
   if (buildCounterBeginTransactionRequest < 3) {
-    checkTransactionOptions(o.transactionOptions);
+    checkTransactionOptions(o.transactionOptions as api.TransactionOptions);
   }
   buildCounterBeginTransactionRequest--;
 }
@@ -217,8 +217,8 @@
 
 void checkUnnamed3(core.List<api.Mutation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMutation(o[0]);
-  checkMutation(o[1]);
+  checkMutation(o[0] as api.Mutation);
+  checkMutation(o[1] as api.Mutation);
 }
 
 core.int buildCounterCommitRequest = 0;
@@ -253,8 +253,8 @@
 
 void checkUnnamed4(core.List<api.MutationResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMutationResult(o[0]);
-  checkMutationResult(o[1]);
+  checkMutationResult(o[0] as api.MutationResult);
+  checkMutationResult(o[1] as api.MutationResult);
 }
 
 core.int buildCounterCommitResponse = 0;
@@ -287,8 +287,8 @@
 
 void checkUnnamed5(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilter(o[0]);
-  checkFilter(o[1]);
+  checkFilter(o[0] as api.Filter);
+  checkFilter(o[1] as api.Filter);
 }
 
 core.int buildCounterCompositeFilter = 0;
@@ -336,8 +336,8 @@
 
 void checkUnnamed6(core.Map<core.String, api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o['x']);
-  checkValue(o['y']);
+  checkValue(o['x'] as api.Value);
+  checkValue(o['y'] as api.Value);
 }
 
 core.int buildCounterEntity = 0;
@@ -355,7 +355,7 @@
 void checkEntity(api.Entity o) {
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
-    checkKey(o.key);
+    checkKey(o.key as api.Key);
     checkUnnamed6(o.properties);
   }
   buildCounterEntity--;
@@ -378,7 +378,7 @@
   buildCounterEntityResult++;
   if (buildCounterEntityResult < 3) {
     unittest.expect(o.cursor, unittest.equals('foo'));
-    checkEntity(o.entity);
+    checkEntity(o.entity as api.Entity);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterEntityResult--;
@@ -399,8 +399,8 @@
 void checkFilter(api.Filter o) {
   buildCounterFilter++;
   if (buildCounterFilter < 3) {
-    checkCompositeFilter(o.compositeFilter);
-    checkPropertyFilter(o.propertyFilter);
+    checkCompositeFilter(o.compositeFilter as api.CompositeFilter);
+    checkPropertyFilter(o.propertyFilter as api.PropertyFilter);
   }
   buildCounterFilter--;
 }
@@ -516,11 +516,15 @@
     api.GoogleDatastoreAdminV1ExportEntitiesMetadata o) {
   buildCounterGoogleDatastoreAdminV1ExportEntitiesMetadata++;
   if (buildCounterGoogleDatastoreAdminV1ExportEntitiesMetadata < 3) {
-    checkGoogleDatastoreAdminV1CommonMetadata(o.common);
-    checkGoogleDatastoreAdminV1EntityFilter(o.entityFilter);
+    checkGoogleDatastoreAdminV1CommonMetadata(
+        o.common as api.GoogleDatastoreAdminV1CommonMetadata);
+    checkGoogleDatastoreAdminV1EntityFilter(
+        o.entityFilter as api.GoogleDatastoreAdminV1EntityFilter);
     unittest.expect(o.outputUrlPrefix, unittest.equals('foo'));
-    checkGoogleDatastoreAdminV1Progress(o.progressBytes);
-    checkGoogleDatastoreAdminV1Progress(o.progressEntities);
+    checkGoogleDatastoreAdminV1Progress(
+        o.progressBytes as api.GoogleDatastoreAdminV1Progress);
+    checkGoogleDatastoreAdminV1Progress(
+        o.progressEntities as api.GoogleDatastoreAdminV1Progress);
   }
   buildCounterGoogleDatastoreAdminV1ExportEntitiesMetadata--;
 }
@@ -556,7 +560,8 @@
     api.GoogleDatastoreAdminV1ExportEntitiesRequest o) {
   buildCounterGoogleDatastoreAdminV1ExportEntitiesRequest++;
   if (buildCounterGoogleDatastoreAdminV1ExportEntitiesRequest < 3) {
-    checkGoogleDatastoreAdminV1EntityFilter(o.entityFilter);
+    checkGoogleDatastoreAdminV1EntityFilter(
+        o.entityFilter as api.GoogleDatastoreAdminV1EntityFilter);
     checkUnnamed10(o.labels);
     unittest.expect(o.outputUrlPrefix, unittest.equals('foo'));
   }
@@ -604,11 +609,15 @@
     api.GoogleDatastoreAdminV1ImportEntitiesMetadata o) {
   buildCounterGoogleDatastoreAdminV1ImportEntitiesMetadata++;
   if (buildCounterGoogleDatastoreAdminV1ImportEntitiesMetadata < 3) {
-    checkGoogleDatastoreAdminV1CommonMetadata(o.common);
-    checkGoogleDatastoreAdminV1EntityFilter(o.entityFilter);
+    checkGoogleDatastoreAdminV1CommonMetadata(
+        o.common as api.GoogleDatastoreAdminV1CommonMetadata);
+    checkGoogleDatastoreAdminV1EntityFilter(
+        o.entityFilter as api.GoogleDatastoreAdminV1EntityFilter);
     unittest.expect(o.inputUrl, unittest.equals('foo'));
-    checkGoogleDatastoreAdminV1Progress(o.progressBytes);
-    checkGoogleDatastoreAdminV1Progress(o.progressEntities);
+    checkGoogleDatastoreAdminV1Progress(
+        o.progressBytes as api.GoogleDatastoreAdminV1Progress);
+    checkGoogleDatastoreAdminV1Progress(
+        o.progressEntities as api.GoogleDatastoreAdminV1Progress);
   }
   buildCounterGoogleDatastoreAdminV1ImportEntitiesMetadata--;
 }
@@ -644,7 +653,8 @@
     api.GoogleDatastoreAdminV1ImportEntitiesRequest o) {
   buildCounterGoogleDatastoreAdminV1ImportEntitiesRequest++;
   if (buildCounterGoogleDatastoreAdminV1ImportEntitiesRequest < 3) {
-    checkGoogleDatastoreAdminV1EntityFilter(o.entityFilter);
+    checkGoogleDatastoreAdminV1EntityFilter(
+        o.entityFilter as api.GoogleDatastoreAdminV1EntityFilter);
     unittest.expect(o.inputUrl, unittest.equals('foo'));
     checkUnnamed11(o.labels);
   }
@@ -660,8 +670,10 @@
 
 void checkUnnamed12(core.List<api.GoogleDatastoreAdminV1IndexedProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDatastoreAdminV1IndexedProperty(o[0]);
-  checkGoogleDatastoreAdminV1IndexedProperty(o[1]);
+  checkGoogleDatastoreAdminV1IndexedProperty(
+      o[0] as api.GoogleDatastoreAdminV1IndexedProperty);
+  checkGoogleDatastoreAdminV1IndexedProperty(
+      o[1] as api.GoogleDatastoreAdminV1IndexedProperty);
 }
 
 core.int buildCounterGoogleDatastoreAdminV1Index = 0;
@@ -711,9 +723,11 @@
     api.GoogleDatastoreAdminV1IndexOperationMetadata o) {
   buildCounterGoogleDatastoreAdminV1IndexOperationMetadata++;
   if (buildCounterGoogleDatastoreAdminV1IndexOperationMetadata < 3) {
-    checkGoogleDatastoreAdminV1CommonMetadata(o.common);
+    checkGoogleDatastoreAdminV1CommonMetadata(
+        o.common as api.GoogleDatastoreAdminV1CommonMetadata);
     unittest.expect(o.indexId, unittest.equals('foo'));
-    checkGoogleDatastoreAdminV1Progress(o.progressEntities);
+    checkGoogleDatastoreAdminV1Progress(
+        o.progressEntities as api.GoogleDatastoreAdminV1Progress);
   }
   buildCounterGoogleDatastoreAdminV1IndexOperationMetadata--;
 }
@@ -750,8 +764,8 @@
 
 void checkUnnamed13(core.List<api.GoogleDatastoreAdminV1Index> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDatastoreAdminV1Index(o[0]);
-  checkGoogleDatastoreAdminV1Index(o[1]);
+  checkGoogleDatastoreAdminV1Index(o[0] as api.GoogleDatastoreAdminV1Index);
+  checkGoogleDatastoreAdminV1Index(o[1] as api.GoogleDatastoreAdminV1Index);
 }
 
 core.int buildCounterGoogleDatastoreAdminV1ListIndexesResponse = 0;
@@ -909,11 +923,15 @@
     api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata o) {
   buildCounterGoogleDatastoreAdminV1beta1ExportEntitiesMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1ExportEntitiesMetadata < 3) {
-    checkGoogleDatastoreAdminV1beta1CommonMetadata(o.common);
-    checkGoogleDatastoreAdminV1beta1EntityFilter(o.entityFilter);
+    checkGoogleDatastoreAdminV1beta1CommonMetadata(
+        o.common as api.GoogleDatastoreAdminV1beta1CommonMetadata);
+    checkGoogleDatastoreAdminV1beta1EntityFilter(
+        o.entityFilter as api.GoogleDatastoreAdminV1beta1EntityFilter);
     unittest.expect(o.outputUrlPrefix, unittest.equals('foo'));
-    checkGoogleDatastoreAdminV1beta1Progress(o.progressBytes);
-    checkGoogleDatastoreAdminV1beta1Progress(o.progressEntities);
+    checkGoogleDatastoreAdminV1beta1Progress(
+        o.progressBytes as api.GoogleDatastoreAdminV1beta1Progress);
+    checkGoogleDatastoreAdminV1beta1Progress(
+        o.progressEntities as api.GoogleDatastoreAdminV1beta1Progress);
   }
   buildCounterGoogleDatastoreAdminV1beta1ExportEntitiesMetadata--;
 }
@@ -959,11 +977,15 @@
     api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata o) {
   buildCounterGoogleDatastoreAdminV1beta1ImportEntitiesMetadata++;
   if (buildCounterGoogleDatastoreAdminV1beta1ImportEntitiesMetadata < 3) {
-    checkGoogleDatastoreAdminV1beta1CommonMetadata(o.common);
-    checkGoogleDatastoreAdminV1beta1EntityFilter(o.entityFilter);
+    checkGoogleDatastoreAdminV1beta1CommonMetadata(
+        o.common as api.GoogleDatastoreAdminV1beta1CommonMetadata);
+    checkGoogleDatastoreAdminV1beta1EntityFilter(
+        o.entityFilter as api.GoogleDatastoreAdminV1beta1EntityFilter);
     unittest.expect(o.inputUrl, unittest.equals('foo'));
-    checkGoogleDatastoreAdminV1beta1Progress(o.progressBytes);
-    checkGoogleDatastoreAdminV1beta1Progress(o.progressEntities);
+    checkGoogleDatastoreAdminV1beta1Progress(
+        o.progressBytes as api.GoogleDatastoreAdminV1beta1Progress);
+    checkGoogleDatastoreAdminV1beta1Progress(
+        o.progressEntities as api.GoogleDatastoreAdminV1beta1Progress);
   }
   buildCounterGoogleDatastoreAdminV1beta1ImportEntitiesMetadata--;
 }
@@ -1000,8 +1022,8 @@
 
 void checkUnnamed17(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleLongrunningOperation(o[0]);
-  checkGoogleLongrunningOperation(o[1]);
+  checkGoogleLongrunningOperation(o[0] as api.GoogleLongrunningOperation);
+  checkGoogleLongrunningOperation(o[1] as api.GoogleLongrunningOperation);
 }
 
 core.int buildCounterGoogleLongrunningListOperationsResponse = 0;
@@ -1104,7 +1126,7 @@
   buildCounterGoogleLongrunningOperation++;
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed18(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed19(o.response);
@@ -1121,8 +1143,8 @@
 
 void checkUnnamed20(core.Map<core.String, api.GqlQueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGqlQueryParameter(o['x']);
-  checkGqlQueryParameter(o['y']);
+  checkGqlQueryParameter(o['x'] as api.GqlQueryParameter);
+  checkGqlQueryParameter(o['y'] as api.GqlQueryParameter);
 }
 
 core.List<api.GqlQueryParameter> buildUnnamed21() {
@@ -1134,8 +1156,8 @@
 
 void checkUnnamed21(core.List<api.GqlQueryParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGqlQueryParameter(o[0]);
-  checkGqlQueryParameter(o[1]);
+  checkGqlQueryParameter(o[0] as api.GqlQueryParameter);
+  checkGqlQueryParameter(o[1] as api.GqlQueryParameter);
 }
 
 core.int buildCounterGqlQuery = 0;
@@ -1179,7 +1201,7 @@
   buildCounterGqlQueryParameter++;
   if (buildCounterGqlQueryParameter < 3) {
     unittest.expect(o.cursor, unittest.equals('foo'));
-    checkValue(o.value);
+    checkValue(o.value as api.Value);
   }
   buildCounterGqlQueryParameter--;
 }
@@ -1193,8 +1215,8 @@
 
 void checkUnnamed22(core.List<api.PathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPathElement(o[0]);
-  checkPathElement(o[1]);
+  checkPathElement(o[0] as api.PathElement);
+  checkPathElement(o[1] as api.PathElement);
 }
 
 core.int buildCounterKey = 0;
@@ -1212,7 +1234,7 @@
 void checkKey(api.Key o) {
   buildCounterKey++;
   if (buildCounterKey < 3) {
-    checkPartitionId(o.partitionId);
+    checkPartitionId(o.partitionId as api.PartitionId);
     checkUnnamed22(o.path);
   }
   buildCounterKey--;
@@ -1267,8 +1289,8 @@
 
 void checkUnnamed23(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKey(o[0]);
-  checkKey(o[1]);
+  checkKey(o[0] as api.Key);
+  checkKey(o[1] as api.Key);
 }
 
 core.int buildCounterLookupRequest = 0;
@@ -1287,7 +1309,7 @@
   buildCounterLookupRequest++;
   if (buildCounterLookupRequest < 3) {
     checkUnnamed23(o.keys);
-    checkReadOptions(o.readOptions);
+    checkReadOptions(o.readOptions as api.ReadOptions);
   }
   buildCounterLookupRequest--;
 }
@@ -1301,8 +1323,8 @@
 
 void checkUnnamed24(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKey(o[0]);
-  checkKey(o[1]);
+  checkKey(o[0] as api.Key);
+  checkKey(o[1] as api.Key);
 }
 
 core.List<api.EntityResult> buildUnnamed25() {
@@ -1314,8 +1336,8 @@
 
 void checkUnnamed25(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityResult(o[0]);
-  checkEntityResult(o[1]);
+  checkEntityResult(o[0] as api.EntityResult);
+  checkEntityResult(o[1] as api.EntityResult);
 }
 
 core.List<api.EntityResult> buildUnnamed26() {
@@ -1327,8 +1349,8 @@
 
 void checkUnnamed26(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityResult(o[0]);
-  checkEntityResult(o[1]);
+  checkEntityResult(o[0] as api.EntityResult);
+  checkEntityResult(o[1] as api.EntityResult);
 }
 
 core.int buildCounterLookupResponse = 0;
@@ -1373,10 +1395,10 @@
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
     unittest.expect(o.baseVersion, unittest.equals('foo'));
-    checkKey(o.delete);
-    checkEntity(o.insert);
-    checkEntity(o.update);
-    checkEntity(o.upsert);
+    checkKey(o.delete as api.Key);
+    checkEntity(o.insert as api.Entity);
+    checkEntity(o.update as api.Entity);
+    checkEntity(o.upsert as api.Entity);
   }
   buildCounterMutation--;
 }
@@ -1398,7 +1420,7 @@
   buildCounterMutationResult++;
   if (buildCounterMutationResult < 3) {
     unittest.expect(o.conflictDetected, unittest.isTrue);
-    checkKey(o.key);
+    checkKey(o.key as api.Key);
     unittest.expect(o.version, unittest.equals('foo'));
   }
   buildCounterMutationResult--;
@@ -1462,7 +1484,7 @@
 void checkProjection(api.Projection o) {
   buildCounterProjection++;
   if (buildCounterProjection < 3) {
-    checkPropertyReference(o.property);
+    checkPropertyReference(o.property as api.PropertyReference);
   }
   buildCounterProjection--;
 }
@@ -1484,8 +1506,8 @@
   buildCounterPropertyFilter++;
   if (buildCounterPropertyFilter < 3) {
     unittest.expect(o.op, unittest.equals('foo'));
-    checkPropertyReference(o.property);
-    checkValue(o.value);
+    checkPropertyReference(o.property as api.PropertyReference);
+    checkValue(o.value as api.Value);
   }
   buildCounterPropertyFilter--;
 }
@@ -1506,7 +1528,7 @@
   buildCounterPropertyOrder++;
   if (buildCounterPropertyOrder < 3) {
     unittest.expect(o.direction, unittest.equals('foo'));
-    checkPropertyReference(o.property);
+    checkPropertyReference(o.property as api.PropertyReference);
   }
   buildCounterPropertyOrder--;
 }
@@ -1539,8 +1561,8 @@
 
 void checkUnnamed27(core.List<api.PropertyReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPropertyReference(o[0]);
-  checkPropertyReference(o[1]);
+  checkPropertyReference(o[0] as api.PropertyReference);
+  checkPropertyReference(o[1] as api.PropertyReference);
 }
 
 core.List<api.KindExpression> buildUnnamed28() {
@@ -1552,8 +1574,8 @@
 
 void checkUnnamed28(core.List<api.KindExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKindExpression(o[0]);
-  checkKindExpression(o[1]);
+  checkKindExpression(o[0] as api.KindExpression);
+  checkKindExpression(o[1] as api.KindExpression);
 }
 
 core.List<api.PropertyOrder> buildUnnamed29() {
@@ -1565,8 +1587,8 @@
 
 void checkUnnamed29(core.List<api.PropertyOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPropertyOrder(o[0]);
-  checkPropertyOrder(o[1]);
+  checkPropertyOrder(o[0] as api.PropertyOrder);
+  checkPropertyOrder(o[1] as api.PropertyOrder);
 }
 
 core.List<api.Projection> buildUnnamed30() {
@@ -1578,8 +1600,8 @@
 
 void checkUnnamed30(core.List<api.Projection> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProjection(o[0]);
-  checkProjection(o[1]);
+  checkProjection(o[0] as api.Projection);
+  checkProjection(o[1] as api.Projection);
 }
 
 core.int buildCounterQuery = 0;
@@ -1606,7 +1628,7 @@
   if (buildCounterQuery < 3) {
     checkUnnamed27(o.distinctOn);
     unittest.expect(o.endCursor, unittest.equals('foo'));
-    checkFilter(o.filter);
+    checkFilter(o.filter as api.Filter);
     checkUnnamed28(o.kind);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
@@ -1626,8 +1648,8 @@
 
 void checkUnnamed31(core.List<api.EntityResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityResult(o[0]);
-  checkEntityResult(o[1]);
+  checkEntityResult(o[0] as api.EntityResult);
+  checkEntityResult(o[1] as api.EntityResult);
 }
 
 core.int buildCounterQueryResultBatch = 0;
@@ -1725,8 +1747,8 @@
 
 void checkUnnamed32(core.List<api.Key> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKey(o[0]);
-  checkKey(o[1]);
+  checkKey(o[0] as api.Key);
+  checkKey(o[1] as api.Key);
 }
 
 core.int buildCounterReserveIdsRequest = 0;
@@ -1816,10 +1838,10 @@
 void checkRunQueryRequest(api.RunQueryRequest o) {
   buildCounterRunQueryRequest++;
   if (buildCounterRunQueryRequest < 3) {
-    checkGqlQuery(o.gqlQuery);
-    checkPartitionId(o.partitionId);
-    checkQuery(o.query);
-    checkReadOptions(o.readOptions);
+    checkGqlQuery(o.gqlQuery as api.GqlQuery);
+    checkPartitionId(o.partitionId as api.PartitionId);
+    checkQuery(o.query as api.Query);
+    checkReadOptions(o.readOptions as api.ReadOptions);
   }
   buildCounterRunQueryRequest--;
 }
@@ -1839,8 +1861,8 @@
 void checkRunQueryResponse(api.RunQueryResponse o) {
   buildCounterRunQueryResponse++;
   if (buildCounterRunQueryResponse < 3) {
-    checkQueryResultBatch(o.batch);
-    checkQuery(o.query);
+    checkQueryResultBatch(o.batch as api.QueryResultBatch);
+    checkQuery(o.query as api.Query);
   }
   buildCounterRunQueryResponse--;
 }
@@ -1925,8 +1947,8 @@
 void checkTransactionOptions(api.TransactionOptions o) {
   buildCounterTransactionOptions++;
   if (buildCounterTransactionOptions < 3) {
-    checkReadOnly(o.readOnly);
-    checkReadWrite(o.readWrite);
+    checkReadOnly(o.readOnly as api.ReadOnly);
+    checkReadWrite(o.readWrite as api.ReadWrite);
   }
   buildCounterTransactionOptions--;
 }
@@ -1957,15 +1979,15 @@
 void checkValue(api.Value o) {
   buildCounterValue++;
   if (buildCounterValue < 3) {
-    checkArrayValue(o.arrayValue);
+    checkArrayValue(o.arrayValue as api.ArrayValue);
     unittest.expect(o.blobValue, unittest.equals('foo'));
     unittest.expect(o.booleanValue, unittest.isTrue);
     unittest.expect(o.doubleValue, unittest.equals(42.0));
-    checkEntity(o.entityValue);
+    checkEntity(o.entityValue as api.Entity);
     unittest.expect(o.excludeFromIndexes, unittest.isTrue);
-    checkLatLng(o.geoPointValue);
+    checkLatLng(o.geoPointValue as api.LatLng);
     unittest.expect(o.integerValue, unittest.equals('foo'));
-    checkKey(o.keyValue);
+    checkKey(o.keyValue as api.Key);
     unittest.expect(o.meaning, unittest.equals(42));
     unittest.expect(o.nullValue, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
@@ -1979,7 +2001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAllocateIdsRequest();
       var od = api.AllocateIdsRequest.fromJson(o.toJson());
-      checkAllocateIdsRequest(od);
+      checkAllocateIdsRequest(od as api.AllocateIdsRequest);
     });
   });
 
@@ -1987,7 +2009,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAllocateIdsResponse();
       var od = api.AllocateIdsResponse.fromJson(o.toJson());
-      checkAllocateIdsResponse(od);
+      checkAllocateIdsResponse(od as api.AllocateIdsResponse);
     });
   });
 
@@ -1995,7 +2017,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArrayValue();
       var od = api.ArrayValue.fromJson(o.toJson());
-      checkArrayValue(od);
+      checkArrayValue(od as api.ArrayValue);
     });
   });
 
@@ -2003,7 +2025,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBeginTransactionRequest();
       var od = api.BeginTransactionRequest.fromJson(o.toJson());
-      checkBeginTransactionRequest(od);
+      checkBeginTransactionRequest(od as api.BeginTransactionRequest);
     });
   });
 
@@ -2011,7 +2033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBeginTransactionResponse();
       var od = api.BeginTransactionResponse.fromJson(o.toJson());
-      checkBeginTransactionResponse(od);
+      checkBeginTransactionResponse(od as api.BeginTransactionResponse);
     });
   });
 
@@ -2019,7 +2041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitRequest();
       var od = api.CommitRequest.fromJson(o.toJson());
-      checkCommitRequest(od);
+      checkCommitRequest(od as api.CommitRequest);
     });
   });
 
@@ -2027,7 +2049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitResponse();
       var od = api.CommitResponse.fromJson(o.toJson());
-      checkCommitResponse(od);
+      checkCommitResponse(od as api.CommitResponse);
     });
   });
 
@@ -2035,7 +2057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompositeFilter();
       var od = api.CompositeFilter.fromJson(o.toJson());
-      checkCompositeFilter(od);
+      checkCompositeFilter(od as api.CompositeFilter);
     });
   });
 
@@ -2043,7 +2065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2051,7 +2073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntity();
       var od = api.Entity.fromJson(o.toJson());
-      checkEntity(od);
+      checkEntity(od as api.Entity);
     });
   });
 
@@ -2059,7 +2081,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityResult();
       var od = api.EntityResult.fromJson(o.toJson());
-      checkEntityResult(od);
+      checkEntityResult(od as api.EntityResult);
     });
   });
 
@@ -2067,7 +2089,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilter();
       var od = api.Filter.fromJson(o.toJson());
-      checkFilter(od);
+      checkFilter(od as api.Filter);
     });
   });
 
@@ -2075,7 +2097,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDatastoreAdminV1CommonMetadata();
       var od = api.GoogleDatastoreAdminV1CommonMetadata.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1CommonMetadata(od);
+      checkGoogleDatastoreAdminV1CommonMetadata(
+          od as api.GoogleDatastoreAdminV1CommonMetadata);
     });
   });
 
@@ -2083,7 +2106,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDatastoreAdminV1EntityFilter();
       var od = api.GoogleDatastoreAdminV1EntityFilter.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1EntityFilter(od);
+      checkGoogleDatastoreAdminV1EntityFilter(
+          od as api.GoogleDatastoreAdminV1EntityFilter);
     });
   });
 
@@ -2092,7 +2116,8 @@
       var o = buildGoogleDatastoreAdminV1ExportEntitiesMetadata();
       var od =
           api.GoogleDatastoreAdminV1ExportEntitiesMetadata.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1ExportEntitiesMetadata(od);
+      checkGoogleDatastoreAdminV1ExportEntitiesMetadata(
+          od as api.GoogleDatastoreAdminV1ExportEntitiesMetadata);
     });
   });
 
@@ -2101,7 +2126,8 @@
       var o = buildGoogleDatastoreAdminV1ExportEntitiesRequest();
       var od =
           api.GoogleDatastoreAdminV1ExportEntitiesRequest.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1ExportEntitiesRequest(od);
+      checkGoogleDatastoreAdminV1ExportEntitiesRequest(
+          od as api.GoogleDatastoreAdminV1ExportEntitiesRequest);
     });
   });
 
@@ -2110,7 +2136,8 @@
       var o = buildGoogleDatastoreAdminV1ExportEntitiesResponse();
       var od =
           api.GoogleDatastoreAdminV1ExportEntitiesResponse.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1ExportEntitiesResponse(od);
+      checkGoogleDatastoreAdminV1ExportEntitiesResponse(
+          od as api.GoogleDatastoreAdminV1ExportEntitiesResponse);
     });
   });
 
@@ -2119,7 +2146,8 @@
       var o = buildGoogleDatastoreAdminV1ImportEntitiesMetadata();
       var od =
           api.GoogleDatastoreAdminV1ImportEntitiesMetadata.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1ImportEntitiesMetadata(od);
+      checkGoogleDatastoreAdminV1ImportEntitiesMetadata(
+          od as api.GoogleDatastoreAdminV1ImportEntitiesMetadata);
     });
   });
 
@@ -2128,7 +2156,8 @@
       var o = buildGoogleDatastoreAdminV1ImportEntitiesRequest();
       var od =
           api.GoogleDatastoreAdminV1ImportEntitiesRequest.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1ImportEntitiesRequest(od);
+      checkGoogleDatastoreAdminV1ImportEntitiesRequest(
+          od as api.GoogleDatastoreAdminV1ImportEntitiesRequest);
     });
   });
 
@@ -2136,7 +2165,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDatastoreAdminV1Index();
       var od = api.GoogleDatastoreAdminV1Index.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1Index(od);
+      checkGoogleDatastoreAdminV1Index(od as api.GoogleDatastoreAdminV1Index);
     });
   });
 
@@ -2145,7 +2174,8 @@
       var o = buildGoogleDatastoreAdminV1IndexOperationMetadata();
       var od =
           api.GoogleDatastoreAdminV1IndexOperationMetadata.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1IndexOperationMetadata(od);
+      checkGoogleDatastoreAdminV1IndexOperationMetadata(
+          od as api.GoogleDatastoreAdminV1IndexOperationMetadata);
     });
   });
 
@@ -2153,7 +2183,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDatastoreAdminV1IndexedProperty();
       var od = api.GoogleDatastoreAdminV1IndexedProperty.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1IndexedProperty(od);
+      checkGoogleDatastoreAdminV1IndexedProperty(
+          od as api.GoogleDatastoreAdminV1IndexedProperty);
     });
   });
 
@@ -2162,7 +2193,8 @@
       var o = buildGoogleDatastoreAdminV1ListIndexesResponse();
       var od =
           api.GoogleDatastoreAdminV1ListIndexesResponse.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1ListIndexesResponse(od);
+      checkGoogleDatastoreAdminV1ListIndexesResponse(
+          od as api.GoogleDatastoreAdminV1ListIndexesResponse);
     });
   });
 
@@ -2170,7 +2202,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDatastoreAdminV1Progress();
       var od = api.GoogleDatastoreAdminV1Progress.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1Progress(od);
+      checkGoogleDatastoreAdminV1Progress(
+          od as api.GoogleDatastoreAdminV1Progress);
     });
   });
 
@@ -2179,7 +2212,8 @@
       var o = buildGoogleDatastoreAdminV1beta1CommonMetadata();
       var od =
           api.GoogleDatastoreAdminV1beta1CommonMetadata.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1beta1CommonMetadata(od);
+      checkGoogleDatastoreAdminV1beta1CommonMetadata(
+          od as api.GoogleDatastoreAdminV1beta1CommonMetadata);
     });
   });
 
@@ -2187,7 +2221,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDatastoreAdminV1beta1EntityFilter();
       var od = api.GoogleDatastoreAdminV1beta1EntityFilter.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1beta1EntityFilter(od);
+      checkGoogleDatastoreAdminV1beta1EntityFilter(
+          od as api.GoogleDatastoreAdminV1beta1EntityFilter);
     });
   });
 
@@ -2197,7 +2232,8 @@
       var o = buildGoogleDatastoreAdminV1beta1ExportEntitiesMetadata();
       var od = api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata.fromJson(
           o.toJson());
-      checkGoogleDatastoreAdminV1beta1ExportEntitiesMetadata(od);
+      checkGoogleDatastoreAdminV1beta1ExportEntitiesMetadata(
+          od as api.GoogleDatastoreAdminV1beta1ExportEntitiesMetadata);
     });
   });
 
@@ -2207,7 +2243,8 @@
       var o = buildGoogleDatastoreAdminV1beta1ExportEntitiesResponse();
       var od = api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse.fromJson(
           o.toJson());
-      checkGoogleDatastoreAdminV1beta1ExportEntitiesResponse(od);
+      checkGoogleDatastoreAdminV1beta1ExportEntitiesResponse(
+          od as api.GoogleDatastoreAdminV1beta1ExportEntitiesResponse);
     });
   });
 
@@ -2217,7 +2254,8 @@
       var o = buildGoogleDatastoreAdminV1beta1ImportEntitiesMetadata();
       var od = api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata.fromJson(
           o.toJson());
-      checkGoogleDatastoreAdminV1beta1ImportEntitiesMetadata(od);
+      checkGoogleDatastoreAdminV1beta1ImportEntitiesMetadata(
+          od as api.GoogleDatastoreAdminV1beta1ImportEntitiesMetadata);
     });
   });
 
@@ -2225,7 +2263,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDatastoreAdminV1beta1Progress();
       var od = api.GoogleDatastoreAdminV1beta1Progress.fromJson(o.toJson());
-      checkGoogleDatastoreAdminV1beta1Progress(od);
+      checkGoogleDatastoreAdminV1beta1Progress(
+          od as api.GoogleDatastoreAdminV1beta1Progress);
     });
   });
 
@@ -2233,7 +2272,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningListOperationsResponse();
       var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
-      checkGoogleLongrunningListOperationsResponse(od);
+      checkGoogleLongrunningListOperationsResponse(
+          od as api.GoogleLongrunningListOperationsResponse);
     });
   });
 
@@ -2241,7 +2281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningOperation();
       var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
-      checkGoogleLongrunningOperation(od);
+      checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
 
@@ -2249,7 +2289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGqlQuery();
       var od = api.GqlQuery.fromJson(o.toJson());
-      checkGqlQuery(od);
+      checkGqlQuery(od as api.GqlQuery);
     });
   });
 
@@ -2257,7 +2297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGqlQueryParameter();
       var od = api.GqlQueryParameter.fromJson(o.toJson());
-      checkGqlQueryParameter(od);
+      checkGqlQueryParameter(od as api.GqlQueryParameter);
     });
   });
 
@@ -2265,7 +2305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKey();
       var od = api.Key.fromJson(o.toJson());
-      checkKey(od);
+      checkKey(od as api.Key);
     });
   });
 
@@ -2273,7 +2313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKindExpression();
       var od = api.KindExpression.fromJson(o.toJson());
-      checkKindExpression(od);
+      checkKindExpression(od as api.KindExpression);
     });
   });
 
@@ -2281,7 +2321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatLng();
       var od = api.LatLng.fromJson(o.toJson());
-      checkLatLng(od);
+      checkLatLng(od as api.LatLng);
     });
   });
 
@@ -2289,7 +2329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLookupRequest();
       var od = api.LookupRequest.fromJson(o.toJson());
-      checkLookupRequest(od);
+      checkLookupRequest(od as api.LookupRequest);
     });
   });
 
@@ -2297,7 +2337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLookupResponse();
       var od = api.LookupResponse.fromJson(o.toJson());
-      checkLookupResponse(od);
+      checkLookupResponse(od as api.LookupResponse);
     });
   });
 
@@ -2305,7 +2345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMutation();
       var od = api.Mutation.fromJson(o.toJson());
-      checkMutation(od);
+      checkMutation(od as api.Mutation);
     });
   });
 
@@ -2313,7 +2353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMutationResult();
       var od = api.MutationResult.fromJson(o.toJson());
-      checkMutationResult(od);
+      checkMutationResult(od as api.MutationResult);
     });
   });
 
@@ -2321,7 +2361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionId();
       var od = api.PartitionId.fromJson(o.toJson());
-      checkPartitionId(od);
+      checkPartitionId(od as api.PartitionId);
     });
   });
 
@@ -2329,7 +2369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathElement();
       var od = api.PathElement.fromJson(o.toJson());
-      checkPathElement(od);
+      checkPathElement(od as api.PathElement);
     });
   });
 
@@ -2337,7 +2377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjection();
       var od = api.Projection.fromJson(o.toJson());
-      checkProjection(od);
+      checkProjection(od as api.Projection);
     });
   });
 
@@ -2345,7 +2385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPropertyFilter();
       var od = api.PropertyFilter.fromJson(o.toJson());
-      checkPropertyFilter(od);
+      checkPropertyFilter(od as api.PropertyFilter);
     });
   });
 
@@ -2353,7 +2393,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPropertyOrder();
       var od = api.PropertyOrder.fromJson(o.toJson());
-      checkPropertyOrder(od);
+      checkPropertyOrder(od as api.PropertyOrder);
     });
   });
 
@@ -2361,7 +2401,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPropertyReference();
       var od = api.PropertyReference.fromJson(o.toJson());
-      checkPropertyReference(od);
+      checkPropertyReference(od as api.PropertyReference);
     });
   });
 
@@ -2369,7 +2409,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuery();
       var od = api.Query.fromJson(o.toJson());
-      checkQuery(od);
+      checkQuery(od as api.Query);
     });
   });
 
@@ -2377,7 +2417,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryResultBatch();
       var od = api.QueryResultBatch.fromJson(o.toJson());
-      checkQueryResultBatch(od);
+      checkQueryResultBatch(od as api.QueryResultBatch);
     });
   });
 
@@ -2385,7 +2425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadOnly();
       var od = api.ReadOnly.fromJson(o.toJson());
-      checkReadOnly(od);
+      checkReadOnly(od as api.ReadOnly);
     });
   });
 
@@ -2393,7 +2433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadOptions();
       var od = api.ReadOptions.fromJson(o.toJson());
-      checkReadOptions(od);
+      checkReadOptions(od as api.ReadOptions);
     });
   });
 
@@ -2401,7 +2441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadWrite();
       var od = api.ReadWrite.fromJson(o.toJson());
-      checkReadWrite(od);
+      checkReadWrite(od as api.ReadWrite);
     });
   });
 
@@ -2409,7 +2449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReserveIdsRequest();
       var od = api.ReserveIdsRequest.fromJson(o.toJson());
-      checkReserveIdsRequest(od);
+      checkReserveIdsRequest(od as api.ReserveIdsRequest);
     });
   });
 
@@ -2417,7 +2457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReserveIdsResponse();
       var od = api.ReserveIdsResponse.fromJson(o.toJson());
-      checkReserveIdsResponse(od);
+      checkReserveIdsResponse(od as api.ReserveIdsResponse);
     });
   });
 
@@ -2425,7 +2465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRollbackRequest();
       var od = api.RollbackRequest.fromJson(o.toJson());
-      checkRollbackRequest(od);
+      checkRollbackRequest(od as api.RollbackRequest);
     });
   });
 
@@ -2433,7 +2473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRollbackResponse();
       var od = api.RollbackResponse.fromJson(o.toJson());
-      checkRollbackResponse(od);
+      checkRollbackResponse(od as api.RollbackResponse);
     });
   });
 
@@ -2441,7 +2481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunQueryRequest();
       var od = api.RunQueryRequest.fromJson(o.toJson());
-      checkRunQueryRequest(od);
+      checkRunQueryRequest(od as api.RunQueryRequest);
     });
   });
 
@@ -2449,7 +2489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunQueryResponse();
       var od = api.RunQueryResponse.fromJson(o.toJson());
-      checkRunQueryResponse(od);
+      checkRunQueryResponse(od as api.RunQueryResponse);
     });
   });
 
@@ -2457,7 +2497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2465,7 +2505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransactionOptions();
       var od = api.TransactionOptions.fromJson(o.toJson());
-      checkTransactionOptions(od);
+      checkTransactionOptions(od as api.TransactionOptions);
     });
   });
 
@@ -2473,7 +2513,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValue();
       var od = api.Value.fromJson(o.toJson());
-      checkValue(od);
+      checkValue(od as api.Value);
     });
   });
 
@@ -2485,8 +2525,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AllocateIdsRequest.fromJson(json);
-        checkAllocateIdsRequest(obj);
+        var obj = api.AllocateIdsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAllocateIdsRequest(obj as api.AllocateIdsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2534,7 +2575,7 @@
       res
           .allocateIds(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAllocateIdsResponse(response);
+        checkAllocateIdsResponse(response as api.AllocateIdsResponse);
       })));
     });
 
@@ -2545,8 +2586,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BeginTransactionRequest.fromJson(json);
-        checkBeginTransactionRequest(obj);
+        var obj = api.BeginTransactionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBeginTransactionRequest(obj as api.BeginTransactionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2594,7 +2636,7 @@
       res
           .beginTransaction(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBeginTransactionResponse(response);
+        checkBeginTransactionResponse(response as api.BeginTransactionResponse);
       })));
     });
 
@@ -2605,8 +2647,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommitRequest.fromJson(json);
-        checkCommitRequest(obj);
+        var obj = api.CommitRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommitRequest(obj as api.CommitRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2654,7 +2697,7 @@
       res
           .commit(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommitResponse(response);
+        checkCommitResponse(response as api.CommitResponse);
       })));
     });
 
@@ -2665,9 +2708,10 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleDatastoreAdminV1ExportEntitiesRequest.fromJson(json);
-        checkGoogleDatastoreAdminV1ExportEntitiesRequest(obj);
+        var obj = api.GoogleDatastoreAdminV1ExportEntitiesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleDatastoreAdminV1ExportEntitiesRequest(
+            obj as api.GoogleDatastoreAdminV1ExportEntitiesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2715,7 +2759,8 @@
       res
           .export(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -2726,9 +2771,10 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleDatastoreAdminV1ImportEntitiesRequest.fromJson(json);
-        checkGoogleDatastoreAdminV1ImportEntitiesRequest(obj);
+        var obj = api.GoogleDatastoreAdminV1ImportEntitiesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleDatastoreAdminV1ImportEntitiesRequest(
+            obj as api.GoogleDatastoreAdminV1ImportEntitiesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2776,7 +2822,8 @@
       res
           .import(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -2787,8 +2834,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LookupRequest.fromJson(json);
-        checkLookupRequest(obj);
+        var obj = api.LookupRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLookupRequest(obj as api.LookupRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2836,7 +2884,7 @@
       res
           .lookup(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLookupResponse(response);
+        checkLookupResponse(response as api.LookupResponse);
       })));
     });
 
@@ -2847,8 +2895,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReserveIdsRequest.fromJson(json);
-        checkReserveIdsRequest(obj);
+        var obj = api.ReserveIdsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReserveIdsRequest(obj as api.ReserveIdsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2896,7 +2945,7 @@
       res
           .reserveIds(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReserveIdsResponse(response);
+        checkReserveIdsResponse(response as api.ReserveIdsResponse);
       })));
     });
 
@@ -2907,8 +2956,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RollbackRequest.fromJson(json);
-        checkRollbackRequest(obj);
+        var obj = api.RollbackRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRollbackRequest(obj as api.RollbackRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2956,7 +3006,7 @@
       res
           .rollback(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRollbackResponse(response);
+        checkRollbackResponse(response as api.RollbackResponse);
       })));
     });
 
@@ -2967,8 +3017,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RunQueryRequest.fromJson(json);
-        checkRunQueryRequest(obj);
+        var obj = api.RunQueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRunQueryRequest(obj as api.RunQueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3016,7 +3067,7 @@
       res
           .runQuery(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRunQueryResponse(response);
+        checkRunQueryResponse(response as api.RunQueryResponse);
       })));
     });
   });
@@ -3029,8 +3080,10 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleDatastoreAdminV1Index.fromJson(json);
-        checkGoogleDatastoreAdminV1Index(obj);
+        var obj = api.GoogleDatastoreAdminV1Index.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleDatastoreAdminV1Index(
+            obj as api.GoogleDatastoreAdminV1Index);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3078,7 +3131,8 @@
       res
           .create(arg_request, arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -3138,7 +3192,8 @@
       res
           .delete(arg_projectId, arg_indexId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -3198,7 +3253,8 @@
       res
           .get(arg_projectId, arg_indexId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleDatastoreAdminV1Index(response);
+        checkGoogleDatastoreAdminV1Index(
+            response as api.GoogleDatastoreAdminV1Index);
       })));
     });
 
@@ -3267,7 +3323,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleDatastoreAdminV1ListIndexesResponse(response);
+        checkGoogleDatastoreAdminV1ListIndexesResponse(
+            response as api.GoogleDatastoreAdminV1ListIndexesResponse);
       })));
     });
   });
@@ -3317,7 +3374,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3365,7 +3422,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3413,7 +3470,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -3474,7 +3532,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningListOperationsResponse(response);
+        checkGoogleLongrunningListOperationsResponse(
+            response as api.GoogleLongrunningListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/deploymentmanager/v2_test.dart b/generated/googleapis/test/deploymentmanager/v2_test.dart
index e757ac1..c16e457 100644
--- a/generated/googleapis/test/deploymentmanager/v2_test.dart
+++ b/generated/googleapis/test/deploymentmanager/v2_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed3922(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.List<core.String> buildUnnamed3923() {
@@ -207,7 +207,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed3925(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -282,8 +282,8 @@
 
 void checkUnnamed3927(core.List<api.DeploymentLabelEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeploymentLabelEntry(o[0]);
-  checkDeploymentLabelEntry(o[1]);
+  checkDeploymentLabelEntry(o[0] as api.DeploymentLabelEntry);
+  checkDeploymentLabelEntry(o[1] as api.DeploymentLabelEntry);
 }
 
 core.int buildCounterDeployment = 0;
@@ -318,10 +318,10 @@
     checkUnnamed3927(o.labels);
     unittest.expect(o.manifest, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOperation(o.operation);
+    checkOperation(o.operation as api.Operation);
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTargetConfiguration(o.target);
-    checkDeploymentUpdate(o.update);
+    checkTargetConfiguration(o.target as api.TargetConfiguration);
+    checkDeploymentUpdate(o.update as api.DeploymentUpdate);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterDeployment--;
@@ -357,8 +357,8 @@
 
 void checkUnnamed3928(core.List<api.DeploymentUpdateLabelEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeploymentUpdateLabelEntry(o[0]);
-  checkDeploymentUpdateLabelEntry(o[1]);
+  checkDeploymentUpdateLabelEntry(o[0] as api.DeploymentUpdateLabelEntry);
+  checkDeploymentUpdateLabelEntry(o[1] as api.DeploymentUpdateLabelEntry);
 }
 
 core.int buildCounterDeploymentUpdate = 0;
@@ -434,8 +434,8 @@
 
 void checkUnnamed3929(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeployment(o[0]);
-  checkDeployment(o[1]);
+  checkDeployment(o[0] as api.Deployment);
+  checkDeployment(o[1] as api.Deployment);
 }
 
 core.int buildCounterDeploymentsListResponse = 0;
@@ -512,8 +512,8 @@
 
 void checkUnnamed3930(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterGlobalSetPolicyRequest = 0;
@@ -534,7 +534,7 @@
   if (buildCounterGlobalSetPolicyRequest < 3) {
     checkUnnamed3930(o.bindings);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterGlobalSetPolicyRequest--;
 }
@@ -576,9 +576,11 @@
 void checkLogConfig(api.LogConfig o) {
   buildCounterLogConfig++;
   if (buildCounterLogConfig < 3) {
-    checkLogConfigCloudAuditOptions(o.cloudAudit);
-    checkLogConfigCounterOptions(o.counter);
-    checkLogConfigDataAccessOptions(o.dataAccess);
+    checkLogConfigCloudAuditOptions(
+        o.cloudAudit as api.LogConfigCloudAuditOptions);
+    checkLogConfigCounterOptions(o.counter as api.LogConfigCounterOptions);
+    checkLogConfigDataAccessOptions(
+        o.dataAccess as api.LogConfigDataAccessOptions);
   }
   buildCounterLogConfig--;
 }
@@ -598,7 +600,8 @@
 void checkLogConfigCloudAuditOptions(api.LogConfigCloudAuditOptions o) {
   buildCounterLogConfigCloudAuditOptions++;
   if (buildCounterLogConfigCloudAuditOptions < 3) {
-    checkAuthorizationLoggingOptions(o.authorizationLoggingOptions);
+    checkAuthorizationLoggingOptions(
+        o.authorizationLoggingOptions as api.AuthorizationLoggingOptions);
     unittest.expect(o.logName, unittest.equals('foo'));
   }
   buildCounterLogConfigCloudAuditOptions--;
@@ -613,8 +616,10 @@
 
 void checkUnnamed3931(core.List<api.LogConfigCounterOptionsCustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogConfigCounterOptionsCustomField(o[0]);
-  checkLogConfigCounterOptionsCustomField(o[1]);
+  checkLogConfigCounterOptionsCustomField(
+      o[0] as api.LogConfigCounterOptionsCustomField);
+  checkLogConfigCounterOptionsCustomField(
+      o[1] as api.LogConfigCounterOptionsCustomField);
 }
 
 core.int buildCounterLogConfigCounterOptions = 0;
@@ -691,8 +696,8 @@
 
 void checkUnnamed3932(core.List<api.ImportFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImportFile(o[0]);
-  checkImportFile(o[1]);
+  checkImportFile(o[0] as api.ImportFile);
+  checkImportFile(o[1] as api.ImportFile);
 }
 
 core.int buildCounterManifest = 0;
@@ -716,7 +721,7 @@
 void checkManifest(api.Manifest o) {
   buildCounterManifest++;
   if (buildCounterManifest < 3) {
-    checkConfigFile(o.config);
+    checkConfigFile(o.config as api.ConfigFile);
     unittest.expect(o.expandedConfig, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     checkUnnamed3932(o.imports);
@@ -737,8 +742,8 @@
 
 void checkUnnamed3933(core.List<api.Manifest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManifest(o[0]);
-  checkManifest(o[1]);
+  checkManifest(o[0] as api.Manifest);
+  checkManifest(o[1] as api.Manifest);
 }
 
 core.int buildCounterManifestsListResponse = 0;
@@ -794,8 +799,8 @@
 
 void checkUnnamed3934(core.List<api.OperationErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationErrorErrors(o[0]);
-  checkOperationErrorErrors(o[1]);
+  checkOperationErrorErrors(o[0] as api.OperationErrorErrors);
+  checkOperationErrorErrors(o[1] as api.OperationErrorErrors);
 }
 
 core.int buildCounterOperationError = 0;
@@ -847,8 +852,8 @@
 
 void checkUnnamed3935(core.List<api.OperationWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationWarningsData(o[0]);
-  checkOperationWarningsData(o[1]);
+  checkOperationWarningsData(o[0] as api.OperationWarningsData);
+  checkOperationWarningsData(o[1] as api.OperationWarningsData);
 }
 
 core.int buildCounterOperationWarnings = 0;
@@ -883,8 +888,8 @@
 
 void checkUnnamed3936(core.List<api.OperationWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationWarnings(o[0]);
-  checkOperationWarnings(o[1]);
+  checkOperationWarnings(o[0] as api.OperationWarnings);
+  checkOperationWarnings(o[1] as api.OperationWarnings);
 }
 
 core.int buildCounterOperation = 0;
@@ -927,7 +932,7 @@
     unittest.expect(o.creationTimestamp, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkOperationError(o.error);
+    checkOperationError(o.error as api.OperationError);
     unittest.expect(o.httpErrorMessage, unittest.equals('foo'));
     unittest.expect(o.httpErrorStatusCode, unittest.equals(42));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -959,8 +964,8 @@
 
 void checkUnnamed3937(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterOperationsListResponse = 0;
@@ -993,8 +998,8 @@
 
 void checkUnnamed3938(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed3939() {
@@ -1006,8 +1011,8 @@
 
 void checkUnnamed3939(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.List<api.Rule> buildUnnamed3940() {
@@ -1019,8 +1024,8 @@
 
 void checkUnnamed3940(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
+  checkRule(o[0] as api.Rule);
+  checkRule(o[1] as api.Rule);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1082,8 +1087,8 @@
 
 void checkUnnamed3941(core.List<api.ResourceWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceWarningsData(o[0]);
-  checkResourceWarningsData(o[1]);
+  checkResourceWarningsData(o[0] as api.ResourceWarningsData);
+  checkResourceWarningsData(o[1] as api.ResourceWarningsData);
 }
 
 core.int buildCounterResourceWarnings = 0;
@@ -1118,8 +1123,8 @@
 
 void checkUnnamed3942(core.List<api.ResourceWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceWarnings(o[0]);
-  checkResourceWarnings(o[1]);
+  checkResourceWarnings(o[0] as api.ResourceWarnings);
+  checkResourceWarnings(o[1] as api.ResourceWarnings);
 }
 
 core.int buildCounterResource = 0;
@@ -1147,7 +1152,7 @@
 void checkResource(api.Resource o) {
   buildCounterResource++;
   if (buildCounterResource < 3) {
-    checkResourceAccessControl(o.accessControl);
+    checkResourceAccessControl(o.accessControl as api.ResourceAccessControl);
     unittest.expect(o.finalProperties, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.insertTime, unittest.equals('foo'));
@@ -1155,7 +1160,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.properties, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkResourceUpdate(o.update);
+    checkResourceUpdate(o.update as api.ResourceUpdate);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
     checkUnnamed3942(o.warnings);
@@ -1214,8 +1219,8 @@
 
 void checkUnnamed3943(core.List<api.ResourceUpdateErrorErrors> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceUpdateErrorErrors(o[0]);
-  checkResourceUpdateErrorErrors(o[1]);
+  checkResourceUpdateErrorErrors(o[0] as api.ResourceUpdateErrorErrors);
+  checkResourceUpdateErrorErrors(o[1] as api.ResourceUpdateErrorErrors);
 }
 
 core.int buildCounterResourceUpdateError = 0;
@@ -1267,8 +1272,8 @@
 
 void checkUnnamed3944(core.List<api.ResourceUpdateWarningsData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceUpdateWarningsData(o[0]);
-  checkResourceUpdateWarningsData(o[1]);
+  checkResourceUpdateWarningsData(o[0] as api.ResourceUpdateWarningsData);
+  checkResourceUpdateWarningsData(o[1] as api.ResourceUpdateWarningsData);
 }
 
 core.int buildCounterResourceUpdateWarnings = 0;
@@ -1303,8 +1308,8 @@
 
 void checkUnnamed3945(core.List<api.ResourceUpdateWarnings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceUpdateWarnings(o[0]);
-  checkResourceUpdateWarnings(o[1]);
+  checkResourceUpdateWarnings(o[0] as api.ResourceUpdateWarnings);
+  checkResourceUpdateWarnings(o[1] as api.ResourceUpdateWarnings);
 }
 
 core.int buildCounterResourceUpdate = 0;
@@ -1328,8 +1333,8 @@
 void checkResourceUpdate(api.ResourceUpdate o) {
   buildCounterResourceUpdate++;
   if (buildCounterResourceUpdate < 3) {
-    checkResourceAccessControl(o.accessControl);
-    checkResourceUpdateError(o.error);
+    checkResourceAccessControl(o.accessControl as api.ResourceAccessControl);
+    checkResourceUpdateError(o.error as api.ResourceUpdateError);
     unittest.expect(o.finalProperties, unittest.equals('foo'));
     unittest.expect(o.intent, unittest.equals('foo'));
     unittest.expect(o.manifest, unittest.equals('foo'));
@@ -1349,8 +1354,8 @@
 
 void checkUnnamed3946(core.List<api.Resource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResource(o[0]);
-  checkResource(o[1]);
+  checkResource(o[0] as api.Resource);
+  checkResource(o[1] as api.Resource);
 }
 
 core.int buildCounterResourcesListResponse = 0;
@@ -1383,8 +1388,8 @@
 
 void checkUnnamed3947(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<core.String> buildUnnamed3948() {
@@ -1409,8 +1414,8 @@
 
 void checkUnnamed3949(core.List<api.LogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogConfig(o[0]);
-  checkLogConfig(o[1]);
+  checkLogConfig(o[0] as api.LogConfig);
+  checkLogConfig(o[1] as api.LogConfig);
 }
 
 core.List<core.String> buildUnnamed3950() {
@@ -1479,8 +1484,8 @@
 
 void checkUnnamed3952(core.List<api.ImportFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImportFile(o[0]);
-  checkImportFile(o[1]);
+  checkImportFile(o[0] as api.ImportFile);
+  checkImportFile(o[1] as api.ImportFile);
 }
 
 core.int buildCounterTargetConfiguration = 0;
@@ -1498,7 +1503,7 @@
 void checkTargetConfiguration(api.TargetConfiguration o) {
   buildCounterTargetConfiguration++;
   if (buildCounterTargetConfiguration < 3) {
-    checkConfigFile(o.config);
+    checkConfigFile(o.config as api.ConfigFile);
     checkUnnamed3952(o.imports);
   }
   buildCounterTargetConfiguration--;
@@ -1589,7 +1594,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.insertTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOperation(o.operation);
+    checkOperation(o.operation as api.Operation);
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
   buildCounterType--;
@@ -1604,8 +1609,8 @@
 
 void checkUnnamed3955(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.int buildCounterTypesListResponse = 0;
@@ -1634,7 +1639,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1642,7 +1647,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1650,7 +1655,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizationLoggingOptions();
       var od = api.AuthorizationLoggingOptions.fromJson(o.toJson());
-      checkAuthorizationLoggingOptions(od);
+      checkAuthorizationLoggingOptions(od as api.AuthorizationLoggingOptions);
     });
   });
 
@@ -1658,7 +1663,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1666,7 +1671,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCondition();
       var od = api.Condition.fromJson(o.toJson());
-      checkCondition(od);
+      checkCondition(od as api.Condition);
     });
   });
 
@@ -1674,7 +1679,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigFile();
       var od = api.ConfigFile.fromJson(o.toJson());
-      checkConfigFile(od);
+      checkConfigFile(od as api.ConfigFile);
     });
   });
 
@@ -1682,7 +1687,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeployment();
       var od = api.Deployment.fromJson(o.toJson());
-      checkDeployment(od);
+      checkDeployment(od as api.Deployment);
     });
   });
 
@@ -1690,7 +1695,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeploymentLabelEntry();
       var od = api.DeploymentLabelEntry.fromJson(o.toJson());
-      checkDeploymentLabelEntry(od);
+      checkDeploymentLabelEntry(od as api.DeploymentLabelEntry);
     });
   });
 
@@ -1698,7 +1703,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeploymentUpdate();
       var od = api.DeploymentUpdate.fromJson(o.toJson());
-      checkDeploymentUpdate(od);
+      checkDeploymentUpdate(od as api.DeploymentUpdate);
     });
   });
 
@@ -1706,7 +1711,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeploymentUpdateLabelEntry();
       var od = api.DeploymentUpdateLabelEntry.fromJson(o.toJson());
-      checkDeploymentUpdateLabelEntry(od);
+      checkDeploymentUpdateLabelEntry(od as api.DeploymentUpdateLabelEntry);
     });
   });
 
@@ -1714,7 +1719,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeploymentsCancelPreviewRequest();
       var od = api.DeploymentsCancelPreviewRequest.fromJson(o.toJson());
-      checkDeploymentsCancelPreviewRequest(od);
+      checkDeploymentsCancelPreviewRequest(
+          od as api.DeploymentsCancelPreviewRequest);
     });
   });
 
@@ -1722,7 +1728,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeploymentsListResponse();
       var od = api.DeploymentsListResponse.fromJson(o.toJson());
-      checkDeploymentsListResponse(od);
+      checkDeploymentsListResponse(od as api.DeploymentsListResponse);
     });
   });
 
@@ -1730,7 +1736,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeploymentsStopRequest();
       var od = api.DeploymentsStopRequest.fromJson(o.toJson());
-      checkDeploymentsStopRequest(od);
+      checkDeploymentsStopRequest(od as api.DeploymentsStopRequest);
     });
   });
 
@@ -1738,7 +1744,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1746,7 +1752,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGlobalSetPolicyRequest();
       var od = api.GlobalSetPolicyRequest.fromJson(o.toJson());
-      checkGlobalSetPolicyRequest(od);
+      checkGlobalSetPolicyRequest(od as api.GlobalSetPolicyRequest);
     });
   });
 
@@ -1754,7 +1760,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportFile();
       var od = api.ImportFile.fromJson(o.toJson());
-      checkImportFile(od);
+      checkImportFile(od as api.ImportFile);
     });
   });
 
@@ -1762,7 +1768,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfig();
       var od = api.LogConfig.fromJson(o.toJson());
-      checkLogConfig(od);
+      checkLogConfig(od as api.LogConfig);
     });
   });
 
@@ -1770,7 +1776,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigCloudAuditOptions();
       var od = api.LogConfigCloudAuditOptions.fromJson(o.toJson());
-      checkLogConfigCloudAuditOptions(od);
+      checkLogConfigCloudAuditOptions(od as api.LogConfigCloudAuditOptions);
     });
   });
 
@@ -1778,7 +1784,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigCounterOptions();
       var od = api.LogConfigCounterOptions.fromJson(o.toJson());
-      checkLogConfigCounterOptions(od);
+      checkLogConfigCounterOptions(od as api.LogConfigCounterOptions);
     });
   });
 
@@ -1786,7 +1792,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigCounterOptionsCustomField();
       var od = api.LogConfigCounterOptionsCustomField.fromJson(o.toJson());
-      checkLogConfigCounterOptionsCustomField(od);
+      checkLogConfigCounterOptionsCustomField(
+          od as api.LogConfigCounterOptionsCustomField);
     });
   });
 
@@ -1794,7 +1801,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogConfigDataAccessOptions();
       var od = api.LogConfigDataAccessOptions.fromJson(o.toJson());
-      checkLogConfigDataAccessOptions(od);
+      checkLogConfigDataAccessOptions(od as api.LogConfigDataAccessOptions);
     });
   });
 
@@ -1802,7 +1809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManifest();
       var od = api.Manifest.fromJson(o.toJson());
-      checkManifest(od);
+      checkManifest(od as api.Manifest);
     });
   });
 
@@ -1810,7 +1817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManifestsListResponse();
       var od = api.ManifestsListResponse.fromJson(o.toJson());
-      checkManifestsListResponse(od);
+      checkManifestsListResponse(od as api.ManifestsListResponse);
     });
   });
 
@@ -1818,7 +1825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationErrorErrors();
       var od = api.OperationErrorErrors.fromJson(o.toJson());
-      checkOperationErrorErrors(od);
+      checkOperationErrorErrors(od as api.OperationErrorErrors);
     });
   });
 
@@ -1826,7 +1833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationError();
       var od = api.OperationError.fromJson(o.toJson());
-      checkOperationError(od);
+      checkOperationError(od as api.OperationError);
     });
   });
 
@@ -1834,7 +1841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationWarningsData();
       var od = api.OperationWarningsData.fromJson(o.toJson());
-      checkOperationWarningsData(od);
+      checkOperationWarningsData(od as api.OperationWarningsData);
     });
   });
 
@@ -1842,7 +1849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationWarnings();
       var od = api.OperationWarnings.fromJson(o.toJson());
-      checkOperationWarnings(od);
+      checkOperationWarnings(od as api.OperationWarnings);
     });
   });
 
@@ -1850,7 +1857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1858,7 +1865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationsListResponse();
       var od = api.OperationsListResponse.fromJson(o.toJson());
-      checkOperationsListResponse(od);
+      checkOperationsListResponse(od as api.OperationsListResponse);
     });
   });
 
@@ -1866,7 +1873,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1874,7 +1881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceWarningsData();
       var od = api.ResourceWarningsData.fromJson(o.toJson());
-      checkResourceWarningsData(od);
+      checkResourceWarningsData(od as api.ResourceWarningsData);
     });
   });
 
@@ -1882,7 +1889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceWarnings();
       var od = api.ResourceWarnings.fromJson(o.toJson());
-      checkResourceWarnings(od);
+      checkResourceWarnings(od as api.ResourceWarnings);
     });
   });
 
@@ -1890,7 +1897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResource();
       var od = api.Resource.fromJson(o.toJson());
-      checkResource(od);
+      checkResource(od as api.Resource);
     });
   });
 
@@ -1898,7 +1905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceAccessControl();
       var od = api.ResourceAccessControl.fromJson(o.toJson());
-      checkResourceAccessControl(od);
+      checkResourceAccessControl(od as api.ResourceAccessControl);
     });
   });
 
@@ -1906,7 +1913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceUpdateErrorErrors();
       var od = api.ResourceUpdateErrorErrors.fromJson(o.toJson());
-      checkResourceUpdateErrorErrors(od);
+      checkResourceUpdateErrorErrors(od as api.ResourceUpdateErrorErrors);
     });
   });
 
@@ -1914,7 +1921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceUpdateError();
       var od = api.ResourceUpdateError.fromJson(o.toJson());
-      checkResourceUpdateError(od);
+      checkResourceUpdateError(od as api.ResourceUpdateError);
     });
   });
 
@@ -1922,7 +1929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceUpdateWarningsData();
       var od = api.ResourceUpdateWarningsData.fromJson(o.toJson());
-      checkResourceUpdateWarningsData(od);
+      checkResourceUpdateWarningsData(od as api.ResourceUpdateWarningsData);
     });
   });
 
@@ -1930,7 +1937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceUpdateWarnings();
       var od = api.ResourceUpdateWarnings.fromJson(o.toJson());
-      checkResourceUpdateWarnings(od);
+      checkResourceUpdateWarnings(od as api.ResourceUpdateWarnings);
     });
   });
 
@@ -1938,7 +1945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceUpdate();
       var od = api.ResourceUpdate.fromJson(o.toJson());
-      checkResourceUpdate(od);
+      checkResourceUpdate(od as api.ResourceUpdate);
     });
   });
 
@@ -1946,7 +1953,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourcesListResponse();
       var od = api.ResourcesListResponse.fromJson(o.toJson());
-      checkResourcesListResponse(od);
+      checkResourcesListResponse(od as api.ResourcesListResponse);
     });
   });
 
@@ -1954,7 +1961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRule();
       var od = api.Rule.fromJson(o.toJson());
-      checkRule(od);
+      checkRule(od as api.Rule);
     });
   });
 
@@ -1962,7 +1969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetConfiguration();
       var od = api.TargetConfiguration.fromJson(o.toJson());
-      checkTargetConfiguration(od);
+      checkTargetConfiguration(od as api.TargetConfiguration);
     });
   });
 
@@ -1970,7 +1977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestPermissionsRequest();
       var od = api.TestPermissionsRequest.fromJson(o.toJson());
-      checkTestPermissionsRequest(od);
+      checkTestPermissionsRequest(od as api.TestPermissionsRequest);
     });
   });
 
@@ -1978,7 +1985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestPermissionsResponse();
       var od = api.TestPermissionsResponse.fromJson(o.toJson());
-      checkTestPermissionsResponse(od);
+      checkTestPermissionsResponse(od as api.TestPermissionsResponse);
     });
   });
 
@@ -1986,7 +1993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildType();
       var od = api.Type.fromJson(o.toJson());
-      checkType(od);
+      checkType(od as api.Type);
     });
   });
 
@@ -1994,7 +2001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTypesListResponse();
       var od = api.TypesListResponse.fromJson(o.toJson());
-      checkTypesListResponse(od);
+      checkTypesListResponse(od as api.TypesListResponse);
     });
   });
 
@@ -2007,8 +2014,10 @@
       var arg_deployment = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeploymentsCancelPreviewRequest.fromJson(json);
-        checkDeploymentsCancelPreviewRequest(obj);
+        var obj = api.DeploymentsCancelPreviewRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeploymentsCancelPreviewRequest(
+            obj as api.DeploymentsCancelPreviewRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2045,7 +2054,7 @@
           .cancelPreview(arg_request, arg_project, arg_deployment,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2094,7 +2103,7 @@
           .delete(arg_project, arg_deployment,
               deletePolicy: arg_deletePolicy, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2139,7 +2148,7 @@
       res
           .get(arg_project, arg_deployment, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeployment(response);
+        checkDeployment(response as api.Deployment);
       })));
     });
 
@@ -2184,7 +2193,7 @@
       res
           .getIamPolicy(arg_project, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2197,8 +2206,9 @@
       var arg_preview = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Deployment.fromJson(json);
-        checkDeployment(obj);
+        var obj = api.Deployment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeployment(obj as api.Deployment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2241,7 +2251,7 @@
               preview: arg_preview,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2301,7 +2311,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeploymentsListResponse(response);
+        checkDeploymentsListResponse(response as api.DeploymentsListResponse);
       })));
     });
 
@@ -2316,8 +2326,9 @@
       var arg_preview = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Deployment.fromJson(json);
-        checkDeployment(obj);
+        var obj = api.Deployment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeployment(obj as api.Deployment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2363,7 +2374,7 @@
               preview: arg_preview,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2375,8 +2386,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GlobalSetPolicyRequest.fromJson(json);
-        checkGlobalSetPolicyRequest(obj);
+        var obj = api.GlobalSetPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGlobalSetPolicyRequest(obj as api.GlobalSetPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2413,7 +2425,7 @@
           .setIamPolicy(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2425,8 +2437,9 @@
       var arg_deployment = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeploymentsStopRequest.fromJson(json);
-        checkDeploymentsStopRequest(obj);
+        var obj = api.DeploymentsStopRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeploymentsStopRequest(obj as api.DeploymentsStopRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2462,7 +2475,7 @@
       res
           .stop(arg_request, arg_project, arg_deployment, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2474,8 +2487,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestPermissionsRequest.fromJson(json);
-        checkTestPermissionsRequest(obj);
+        var obj = api.TestPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestPermissionsRequest(obj as api.TestPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2512,7 +2526,7 @@
           .testIamPermissions(arg_request, arg_project, arg_resource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestPermissionsResponse(response);
+        checkTestPermissionsResponse(response as api.TestPermissionsResponse);
       })));
     });
 
@@ -2527,8 +2541,9 @@
       var arg_preview = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Deployment.fromJson(json);
-        checkDeployment(obj);
+        var obj = api.Deployment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeployment(obj as api.Deployment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2574,7 +2589,7 @@
               preview: arg_preview,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2622,7 +2637,7 @@
       res
           .get(arg_project, arg_deployment, arg_manifest, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManifest(response);
+        checkManifest(response as api.Manifest);
       })));
     });
 
@@ -2683,7 +2698,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManifestsListResponse(response);
+        checkManifestsListResponse(response as api.ManifestsListResponse);
       })));
     });
   });
@@ -2730,7 +2745,7 @@
       res
           .get(arg_project, arg_operation, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2790,7 +2805,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperationsListResponse(response);
+        checkOperationsListResponse(response as api.OperationsListResponse);
       })));
     });
   });
@@ -2838,7 +2853,7 @@
       res
           .get(arg_project, arg_deployment, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResource(response);
+        checkResource(response as api.Resource);
       })));
     });
 
@@ -2899,7 +2914,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResourcesListResponse(response);
+        checkResourcesListResponse(response as api.ResourcesListResponse);
       })));
     });
   });
@@ -2961,7 +2976,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTypesListResponse(response);
+        checkTypesListResponse(response as api.TypesListResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/dfareporting/v3_4_test.dart b/generated/googleapis/test/dfareporting/v3_4_test.dart
index 5eb6e08..cf745f1 100644
--- a/generated/googleapis/test/dfareporting/v3_4_test.dart
+++ b/generated/googleapis/test/dfareporting/v3_4_test.dart
@@ -148,7 +148,8 @@
     unittest.expect(o.maximumImageSize, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nielsenOcrEnabled, unittest.isTrue);
-    checkReportsConfiguration(o.reportsConfiguration);
+    checkReportsConfiguration(
+        o.reportsConfiguration as api.ReportsConfiguration);
     unittest.expect(o.shareReportsWithTwitter, unittest.isTrue);
     unittest.expect(o.teaserSizeLimit, unittest.equals('foo'));
   }
@@ -256,8 +257,8 @@
 
 void checkUnnamed3996(core.List<api.AccountPermissionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountPermissionGroup(o[0]);
-  checkAccountPermissionGroup(o[1]);
+  checkAccountPermissionGroup(o[0] as api.AccountPermissionGroup);
+  checkAccountPermissionGroup(o[1] as api.AccountPermissionGroup);
 }
 
 core.int buildCounterAccountPermissionGroupsListResponse = 0;
@@ -292,8 +293,8 @@
 
 void checkUnnamed3997(core.List<api.AccountPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountPermission(o[0]);
-  checkAccountPermission(o[1]);
+  checkAccountPermission(o[0] as api.AccountPermission);
+  checkAccountPermission(o[1] as api.AccountPermission);
 }
 
 core.int buildCounterAccountPermissionsListResponse = 0;
@@ -348,19 +349,19 @@
   if (buildCounterAccountUserProfile < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
-    checkObjectFilter(o.advertiserFilter);
-    checkObjectFilter(o.campaignFilter);
+    checkObjectFilter(o.advertiserFilter as api.ObjectFilter);
+    checkObjectFilter(o.campaignFilter as api.ObjectFilter);
     unittest.expect(o.comments, unittest.equals('foo'));
     unittest.expect(o.email, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkObjectFilter(o.siteFilter);
+    checkObjectFilter(o.siteFilter as api.ObjectFilter);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     unittest.expect(o.traffickerType, unittest.equals('foo'));
     unittest.expect(o.userAccessType, unittest.equals('foo'));
-    checkObjectFilter(o.userRoleFilter);
+    checkObjectFilter(o.userRoleFilter as api.ObjectFilter);
     unittest.expect(o.userRoleId, unittest.equals('foo'));
   }
   buildCounterAccountUserProfile--;
@@ -375,8 +376,8 @@
 
 void checkUnnamed3998(core.List<api.AccountUserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccountUserProfile(o[0]);
-  checkAccountUserProfile(o[1]);
+  checkAccountUserProfile(o[0] as api.AccountUserProfile);
+  checkAccountUserProfile(o[1] as api.AccountUserProfile);
 }
 
 core.int buildCounterAccountUserProfilesListResponse = 0;
@@ -412,8 +413,8 @@
 
 void checkUnnamed3999(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterAccountsListResponse = 0;
@@ -448,8 +449,8 @@
 
 void checkUnnamed4000(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<core.String> buildUnnamed4001() {
@@ -497,8 +498,8 @@
 
 void checkUnnamed4002(core.List<api.CreativeGroupAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeGroupAssignment(o[0]);
-  checkCreativeGroupAssignment(o[1]);
+  checkCreativeGroupAssignment(o[0] as api.CreativeGroupAssignment);
+  checkCreativeGroupAssignment(o[1] as api.CreativeGroupAssignment);
 }
 
 core.List<api.EventTagOverride> buildUnnamed4003() {
@@ -510,8 +511,8 @@
 
 void checkUnnamed4003(core.List<api.EventTagOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventTagOverride(o[0]);
-  checkEventTagOverride(o[1]);
+  checkEventTagOverride(o[0] as api.EventTagOverride);
+  checkEventTagOverride(o[1] as api.EventTagOverride);
 }
 
 core.List<api.PlacementAssignment> buildUnnamed4004() {
@@ -523,8 +524,8 @@
 
 void checkUnnamed4004(core.List<api.PlacementAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlacementAssignment(o[0]);
-  checkPlacementAssignment(o[1]);
+  checkPlacementAssignment(o[0] as api.PlacementAssignment);
+  checkPlacementAssignment(o[1] as api.PlacementAssignment);
 }
 
 core.int buildCounterAd = 0;
@@ -583,44 +584,48 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.archived, unittest.isTrue);
     unittest.expect(o.audienceSegmentId, unittest.equals('foo'));
     unittest.expect(o.campaignId, unittest.equals('foo'));
-    checkDimensionValue(o.campaignIdDimensionValue);
-    checkClickThroughUrl(o.clickThroughUrl);
-    checkClickThroughUrlSuffixProperties(o.clickThroughUrlSuffixProperties);
+    checkDimensionValue(o.campaignIdDimensionValue as api.DimensionValue);
+    checkClickThroughUrl(o.clickThroughUrl as api.ClickThroughUrl);
+    checkClickThroughUrlSuffixProperties(o.clickThroughUrlSuffixProperties
+        as api.ClickThroughUrlSuffixProperties);
     unittest.expect(o.comments, unittest.equals('foo'));
     unittest.expect(o.compatibility, unittest.equals('foo'));
-    checkLastModifiedInfo(o.createInfo);
+    checkLastModifiedInfo(o.createInfo as api.LastModifiedInfo);
     checkUnnamed4002(o.creativeGroupAssignments);
-    checkCreativeRotation(o.creativeRotation);
-    checkDayPartTargeting(o.dayPartTargeting);
+    checkCreativeRotation(o.creativeRotation as api.CreativeRotation);
+    checkDayPartTargeting(o.dayPartTargeting as api.DayPartTargeting);
     checkDefaultClickThroughEventTagProperties(
-        o.defaultClickThroughEventTagProperties);
-    checkDeliverySchedule(o.deliverySchedule);
+        o.defaultClickThroughEventTagProperties
+            as api.DefaultClickThroughEventTagProperties);
+    checkDeliverySchedule(o.deliverySchedule as api.DeliverySchedule);
     unittest.expect(o.dynamicClickTracker, unittest.isTrue);
     unittest.expect(
         o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUnnamed4003(o.eventTagOverrides);
-    checkGeoTargeting(o.geoTargeting);
+    checkGeoTargeting(o.geoTargeting as api.GeoTargeting);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
-    checkKeyValueTargetingExpression(o.keyValueTargetingExpression);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
+    checkKeyValueTargetingExpression(
+        o.keyValueTargetingExpression as api.KeyValueTargetingExpression);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLanguageTargeting(o.languageTargeting);
-    checkLastModifiedInfo(o.lastModifiedInfo);
+    checkLanguageTargeting(o.languageTargeting as api.LanguageTargeting);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4004(o.placementAssignments);
-    checkListTargetingExpression(o.remarketingListExpression);
-    checkSize(o.size);
+    checkListTargetingExpression(
+        o.remarketingListExpression as api.ListTargetingExpression);
+    checkSize(o.size as api.Size);
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.sslRequired, unittest.isTrue);
     unittest.expect(o.startTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     unittest.expect(o.targetingTemplateId, unittest.equals('foo'));
-    checkTechnologyTargeting(o.technologyTargeting);
+    checkTechnologyTargeting(o.technologyTargeting as api.TechnologyTargeting);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAd--;
@@ -693,8 +698,8 @@
 
 void checkUnnamed4005(core.List<api.Ad> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAd(o[0]);
-  checkAd(o[1]);
+  checkAd(o[0] as api.Ad);
+  checkAd(o[1] as api.Ad);
 }
 
 core.int buildCounterAdsListResponse = 0;
@@ -754,9 +759,10 @@
     unittest.expect(o.defaultClickThroughEventTagId, unittest.equals('foo'));
     unittest.expect(o.defaultEmail, unittest.equals('foo'));
     unittest.expect(o.floodlightConfigurationId, unittest.equals('foo'));
-    checkDimensionValue(o.floodlightConfigurationIdDimensionValue);
+    checkDimensionValue(
+        o.floodlightConfigurationIdDimensionValue as api.DimensionValue);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(
@@ -802,8 +808,8 @@
 
 void checkUnnamed4006(core.List<api.AdvertiserGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdvertiserGroup(o[0]);
-  checkAdvertiserGroup(o[1]);
+  checkAdvertiserGroup(o[0] as api.AdvertiserGroup);
+  checkAdvertiserGroup(o[1] as api.AdvertiserGroup);
 }
 
 core.int buildCounterAdvertiserGroupsListResponse = 0;
@@ -838,8 +844,8 @@
 
 void checkUnnamed4007(core.List<api.LandingPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLandingPage(o[0]);
-  checkLandingPage(o[1]);
+  checkLandingPage(o[0] as api.LandingPage);
+  checkLandingPage(o[1] as api.LandingPage);
 }
 
 core.int buildCounterAdvertiserLandingPagesListResponse = 0;
@@ -876,8 +882,8 @@
 
 void checkUnnamed4008(core.List<api.Advertiser> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdvertiser(o[0]);
-  checkAdvertiser(o[1]);
+  checkAdvertiser(o[0] as api.Advertiser);
+  checkAdvertiser(o[1] as api.Advertiser);
 }
 
 core.int buildCounterAdvertisersListResponse = 0;
@@ -935,8 +941,8 @@
 
 void checkUnnamed4009(core.List<api.AudienceSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAudienceSegment(o[0]);
-  checkAudienceSegment(o[1]);
+  checkAudienceSegment(o[0] as api.AudienceSegment);
+  checkAudienceSegment(o[1] as api.AudienceSegment);
 }
 
 core.int buildCounterAudienceSegmentGroup = 0;
@@ -1000,8 +1006,8 @@
 
 void checkUnnamed4010(core.List<api.Browser> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBrowser(o[0]);
-  checkBrowser(o[1]);
+  checkBrowser(o[0] as api.Browser);
+  checkBrowser(o[1] as api.Browser);
 }
 
 core.int buildCounterBrowsersListResponse = 0;
@@ -1034,8 +1040,10 @@
 
 void checkUnnamed4011(core.List<api.CreativeOptimizationConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeOptimizationConfiguration(o[0]);
-  checkCreativeOptimizationConfiguration(o[1]);
+  checkCreativeOptimizationConfiguration(
+      o[0] as api.CreativeOptimizationConfiguration);
+  checkCreativeOptimizationConfiguration(
+      o[1] as api.CreativeOptimizationConfiguration);
 }
 
 core.List<api.AudienceSegmentGroup> buildUnnamed4012() {
@@ -1047,8 +1055,8 @@
 
 void checkUnnamed4012(core.List<api.AudienceSegmentGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAudienceSegmentGroup(o[0]);
-  checkAudienceSegmentGroup(o[1]);
+  checkAudienceSegmentGroup(o[0] as api.AudienceSegmentGroup);
+  checkAudienceSegmentGroup(o[1] as api.AudienceSegmentGroup);
 }
 
 core.List<core.String> buildUnnamed4013() {
@@ -1073,8 +1081,8 @@
 
 void checkUnnamed4014(core.List<api.EventTagOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventTagOverride(o[0]);
-  checkEventTagOverride(o[1]);
+  checkEventTagOverride(o[0] as api.EventTagOverride);
+  checkEventTagOverride(o[1] as api.EventTagOverride);
 }
 
 core.List<core.String> buildUnnamed4015() {
@@ -1134,30 +1142,34 @@
   buildCounterCampaign++;
   if (buildCounterCampaign < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkAdBlockingConfiguration(o.adBlockingConfiguration);
+    checkAdBlockingConfiguration(
+        o.adBlockingConfiguration as api.AdBlockingConfiguration);
     checkUnnamed4011(o.additionalCreativeOptimizationConfigurations);
     unittest.expect(o.advertiserGroupId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.archived, unittest.isTrue);
     checkUnnamed4012(o.audienceSegmentGroups);
     unittest.expect(o.billingInvoiceCode, unittest.equals('foo'));
-    checkClickThroughUrlSuffixProperties(o.clickThroughUrlSuffixProperties);
+    checkClickThroughUrlSuffixProperties(o.clickThroughUrlSuffixProperties
+        as api.ClickThroughUrlSuffixProperties);
     unittest.expect(o.comment, unittest.equals('foo'));
-    checkLastModifiedInfo(o.createInfo);
+    checkLastModifiedInfo(o.createInfo as api.LastModifiedInfo);
     checkUnnamed4013(o.creativeGroupIds);
-    checkCreativeOptimizationConfiguration(o.creativeOptimizationConfiguration);
+    checkCreativeOptimizationConfiguration(o.creativeOptimizationConfiguration
+        as api.CreativeOptimizationConfiguration);
     checkDefaultClickThroughEventTagProperties(
-        o.defaultClickThroughEventTagProperties);
+        o.defaultClickThroughEventTagProperties
+            as api.DefaultClickThroughEventTagProperties);
     unittest.expect(o.defaultLandingPageId, unittest.equals('foo'));
     unittest.expect(
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     checkUnnamed4014(o.eventTagOverrides);
     unittest.expect(o.externalId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLastModifiedInfo(o.lastModifiedInfo);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nielsenOcrEnabled, unittest.isTrue);
     unittest.expect(o.startDate,
@@ -1198,8 +1210,8 @@
 
 void checkUnnamed4016(core.List<api.CampaignCreativeAssociation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCampaignCreativeAssociation(o[0]);
-  checkCampaignCreativeAssociation(o[1]);
+  checkCampaignCreativeAssociation(o[0] as api.CampaignCreativeAssociation);
+  checkCampaignCreativeAssociation(o[1] as api.CampaignCreativeAssociation);
 }
 
 core.int buildCounterCampaignCreativeAssociationsListResponse = 0;
@@ -1265,8 +1277,8 @@
 
 void checkUnnamed4017(core.List<api.Campaign> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCampaign(o[0]);
-  checkCampaign(o[1]);
+  checkCampaign(o[0] as api.Campaign);
+  checkCampaign(o[1] as api.Campaign);
 }
 
 core.int buildCounterCampaignsListResponse = 0;
@@ -1347,8 +1359,8 @@
 
 void checkUnnamed4018(core.List<api.ChangeLog> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChangeLog(o[0]);
-  checkChangeLog(o[1]);
+  checkChangeLog(o[0] as api.ChangeLog);
+  checkChangeLog(o[1] as api.ChangeLog);
 }
 
 core.int buildCounterChangeLogsListResponse = 0;
@@ -1383,8 +1395,8 @@
 
 void checkUnnamed4019(core.List<api.ChannelGroupingRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannelGroupingRule(o[0]);
-  checkChannelGroupingRule(o[1]);
+  checkChannelGroupingRule(o[0] as api.ChannelGroupingRule);
+  checkChannelGroupingRule(o[1] as api.ChannelGroupingRule);
 }
 
 core.int buildCounterChannelGrouping = 0;
@@ -1421,8 +1433,8 @@
 
 void checkUnnamed4020(core.List<api.DisjunctiveMatchStatement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisjunctiveMatchStatement(o[0]);
-  checkDisjunctiveMatchStatement(o[1]);
+  checkDisjunctiveMatchStatement(o[0] as api.DisjunctiveMatchStatement);
+  checkDisjunctiveMatchStatement(o[1] as api.DisjunctiveMatchStatement);
 }
 
 core.int buildCounterChannelGroupingRule = 0;
@@ -1457,8 +1469,8 @@
 
 void checkUnnamed4021(core.List<api.City> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCity(o[0]);
-  checkCity(o[1]);
+  checkCity(o[0] as api.City);
+  checkCity(o[1] as api.City);
 }
 
 core.int buildCounterCitiesListResponse = 0;
@@ -1533,7 +1545,8 @@
 void checkClickTag(api.ClickTag o) {
   buildCounterClickTag++;
   if (buildCounterClickTag < 3) {
-    checkCreativeClickThroughUrl(o.clickThroughUrl);
+    checkCreativeClickThroughUrl(
+        o.clickThroughUrl as api.CreativeClickThroughUrl);
     unittest.expect(o.eventName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -1602,7 +1615,7 @@
 void checkCompanionClickThroughOverride(api.CompanionClickThroughOverride o) {
   buildCounterCompanionClickThroughOverride++;
   if (buildCounterCompanionClickThroughOverride < 3) {
-    checkClickThroughUrl(o.clickThroughUrl);
+    checkClickThroughUrl(o.clickThroughUrl as api.ClickThroughUrl);
     unittest.expect(o.creativeId, unittest.equals('foo'));
   }
   buildCounterCompanionClickThroughOverride--;
@@ -1617,8 +1630,8 @@
 
 void checkUnnamed4022(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSize(o[0]);
-  checkSize(o[1]);
+  checkSize(o[0] as api.Size);
+  checkSize(o[1] as api.Size);
 }
 
 core.int buildCounterCompanionSetting = 0;
@@ -1671,15 +1684,22 @@
   buildCounterCompatibleFields++;
   if (buildCounterCompatibleFields < 3) {
     checkCrossDimensionReachReportCompatibleFields(
-        o.crossDimensionReachReportCompatibleFields);
-    checkFloodlightReportCompatibleFields(o.floodlightReportCompatibleFields);
+        o.crossDimensionReachReportCompatibleFields
+            as api.CrossDimensionReachReportCompatibleFields);
+    checkFloodlightReportCompatibleFields(o.floodlightReportCompatibleFields
+        as api.FloodlightReportCompatibleFields);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPathReportCompatibleFields(o.pathAttributionReportCompatibleFields);
-    checkPathReportCompatibleFields(o.pathReportCompatibleFields);
+    checkPathReportCompatibleFields(o.pathAttributionReportCompatibleFields
+        as api.PathReportCompatibleFields);
+    checkPathReportCompatibleFields(
+        o.pathReportCompatibleFields as api.PathReportCompatibleFields);
     checkPathToConversionReportCompatibleFields(
-        o.pathToConversionReportCompatibleFields);
-    checkReachReportCompatibleFields(o.reachReportCompatibleFields);
-    checkReportCompatibleFields(o.reportCompatibleFields);
+        o.pathToConversionReportCompatibleFields
+            as api.PathToConversionReportCompatibleFields);
+    checkReachReportCompatibleFields(
+        o.reachReportCompatibleFields as api.ReachReportCompatibleFields);
+    checkReportCompatibleFields(
+        o.reportCompatibleFields as api.ReportCompatibleFields);
   }
   buildCounterCompatibleFields--;
 }
@@ -1716,8 +1736,8 @@
 
 void checkUnnamed4023(core.List<api.ConnectionType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConnectionType(o[0]);
-  checkConnectionType(o[1]);
+  checkConnectionType(o[0] as api.ConnectionType);
+  checkConnectionType(o[1] as api.ConnectionType);
 }
 
 core.int buildCounterConnectionTypesListResponse = 0;
@@ -1750,8 +1770,8 @@
 
 void checkUnnamed4024(core.List<api.ContentCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContentCategory(o[0]);
-  checkContentCategory(o[1]);
+  checkContentCategory(o[0] as api.ContentCategory);
+  checkContentCategory(o[1] as api.ContentCategory);
 }
 
 core.int buildCounterContentCategoriesListResponse = 0;
@@ -1811,8 +1831,8 @@
 
 void checkUnnamed4025(core.List<api.CustomFloodlightVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomFloodlightVariable(o[0]);
-  checkCustomFloodlightVariable(o[1]);
+  checkCustomFloodlightVariable(o[0] as api.CustomFloodlightVariable);
+  checkCustomFloodlightVariable(o[1] as api.CustomFloodlightVariable);
 }
 
 core.List<core.String> buildUnnamed4026() {
@@ -1913,8 +1933,8 @@
 
 void checkUnnamed4027(core.List<api.ConversionError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConversionError(o[0]);
-  checkConversionError(o[1]);
+  checkConversionError(o[0] as api.ConversionError);
+  checkConversionError(o[1] as api.ConversionError);
 }
 
 core.int buildCounterConversionStatus = 0;
@@ -1933,7 +1953,7 @@
 void checkConversionStatus(api.ConversionStatus o) {
   buildCounterConversionStatus++;
   if (buildCounterConversionStatus < 3) {
-    checkConversion(o.conversion);
+    checkConversion(o.conversion as api.Conversion);
     checkUnnamed4027(o.errors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -1949,8 +1969,8 @@
 
 void checkUnnamed4028(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConversion(o[0]);
-  checkConversion(o[1]);
+  checkConversion(o[0] as api.Conversion);
+  checkConversion(o[1] as api.Conversion);
 }
 
 core.int buildCounterConversionsBatchInsertRequest = 0;
@@ -1970,7 +1990,7 @@
   buildCounterConversionsBatchInsertRequest++;
   if (buildCounterConversionsBatchInsertRequest < 3) {
     checkUnnamed4028(o.conversions);
-    checkEncryptionInfo(o.encryptionInfo);
+    checkEncryptionInfo(o.encryptionInfo as api.EncryptionInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionsBatchInsertRequest--;
@@ -1985,8 +2005,8 @@
 
 void checkUnnamed4029(core.List<api.ConversionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConversionStatus(o[0]);
-  checkConversionStatus(o[1]);
+  checkConversionStatus(o[0] as api.ConversionStatus);
+  checkConversionStatus(o[1] as api.ConversionStatus);
 }
 
 core.int buildCounterConversionsBatchInsertResponse = 0;
@@ -2021,8 +2041,8 @@
 
 void checkUnnamed4030(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConversion(o[0]);
-  checkConversion(o[1]);
+  checkConversion(o[0] as api.Conversion);
+  checkConversion(o[1] as api.Conversion);
 }
 
 core.int buildCounterConversionsBatchUpdateRequest = 0;
@@ -2042,7 +2062,7 @@
   buildCounterConversionsBatchUpdateRequest++;
   if (buildCounterConversionsBatchUpdateRequest < 3) {
     checkUnnamed4030(o.conversions);
-    checkEncryptionInfo(o.encryptionInfo);
+    checkEncryptionInfo(o.encryptionInfo as api.EncryptionInfo);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterConversionsBatchUpdateRequest--;
@@ -2057,8 +2077,8 @@
 
 void checkUnnamed4031(core.List<api.ConversionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConversionStatus(o[0]);
-  checkConversionStatus(o[1]);
+  checkConversionStatus(o[0] as api.ConversionStatus);
+  checkConversionStatus(o[1] as api.ConversionStatus);
 }
 
 core.int buildCounterConversionsBatchUpdateResponse = 0;
@@ -2093,8 +2113,8 @@
 
 void checkUnnamed4032(core.List<api.Country> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCountry(o[0]);
-  checkCountry(o[1]);
+  checkCountry(o[0] as api.Country);
+  checkCountry(o[1] as api.Country);
 }
 
 core.int buildCounterCountriesListResponse = 0;
@@ -2167,8 +2187,8 @@
 
 void checkUnnamed4034(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSize(o[0]);
-  checkSize(o[1]);
+  checkSize(o[0] as api.Size);
+  checkSize(o[1] as api.Size);
 }
 
 core.List<core.String> buildUnnamed4035() {
@@ -2193,8 +2213,8 @@
 
 void checkUnnamed4036(core.List<api.ClickTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClickTag(o[0]);
-  checkClickTag(o[1]);
+  checkClickTag(o[0] as api.ClickTag);
+  checkClickTag(o[1] as api.ClickTag);
 }
 
 core.List<core.String> buildUnnamed4037() {
@@ -2232,8 +2252,8 @@
 
 void checkUnnamed4039(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCustomEvent(o[0]);
-  checkCreativeCustomEvent(o[1]);
+  checkCreativeCustomEvent(o[0] as api.CreativeCustomEvent);
+  checkCreativeCustomEvent(o[1] as api.CreativeCustomEvent);
 }
 
 core.List<api.CreativeAsset> buildUnnamed4040() {
@@ -2245,8 +2265,8 @@
 
 void checkUnnamed4040(core.List<api.CreativeAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeAsset(o[0]);
-  checkCreativeAsset(o[1]);
+  checkCreativeAsset(o[0] as api.CreativeAsset);
+  checkCreativeAsset(o[1] as api.CreativeAsset);
 }
 
 core.List<api.CreativeFieldAssignment> buildUnnamed4041() {
@@ -2258,8 +2278,8 @@
 
 void checkUnnamed4041(core.List<api.CreativeFieldAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeFieldAssignment(o[0]);
-  checkCreativeFieldAssignment(o[1]);
+  checkCreativeFieldAssignment(o[0] as api.CreativeFieldAssignment);
+  checkCreativeFieldAssignment(o[1] as api.CreativeFieldAssignment);
 }
 
 core.List<core.String> buildUnnamed4042() {
@@ -2284,8 +2304,8 @@
 
 void checkUnnamed4043(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCustomEvent(o[0]);
-  checkCreativeCustomEvent(o[1]);
+  checkCreativeCustomEvent(o[0] as api.CreativeCustomEvent);
+  checkCreativeCustomEvent(o[1] as api.CreativeCustomEvent);
 }
 
 core.List<api.ThirdPartyTrackingUrl> buildUnnamed4044() {
@@ -2297,8 +2317,8 @@
 
 void checkUnnamed4044(core.List<api.ThirdPartyTrackingUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThirdPartyTrackingUrl(o[0]);
-  checkThirdPartyTrackingUrl(o[1]);
+  checkThirdPartyTrackingUrl(o[0] as api.ThirdPartyTrackingUrl);
+  checkThirdPartyTrackingUrl(o[1] as api.ThirdPartyTrackingUrl);
 }
 
 core.List<api.CreativeCustomEvent> buildUnnamed4045() {
@@ -2310,8 +2330,8 @@
 
 void checkUnnamed4045(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCustomEvent(o[0]);
-  checkCreativeCustomEvent(o[1]);
+  checkCreativeCustomEvent(o[0] as api.CreativeCustomEvent);
+  checkCreativeCustomEvent(o[1] as api.CreativeCustomEvent);
 }
 
 core.int buildCounterCreative = 0;
@@ -2405,43 +2425,45 @@
     unittest.expect(o.authoringTool, unittest.equals('foo'));
     unittest.expect(o.autoAdvanceImages, unittest.isTrue);
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
-    checkCreativeClickThroughUrl(o.backupImageClickThroughUrl);
+    checkCreativeClickThroughUrl(
+        o.backupImageClickThroughUrl as api.CreativeClickThroughUrl);
     checkUnnamed4035(o.backupImageFeatures);
     unittest.expect(o.backupImageReportingLabel, unittest.equals('foo'));
-    checkTargetWindow(o.backupImageTargetWindow);
+    checkTargetWindow(o.backupImageTargetWindow as api.TargetWindow);
     checkUnnamed4036(o.clickTags);
     unittest.expect(o.commercialId, unittest.equals('foo'));
     checkUnnamed4037(o.companionCreatives);
     checkUnnamed4038(o.compatibility);
     unittest.expect(o.convertFlashToHtml5, unittest.isTrue);
     checkUnnamed4039(o.counterCustomEvents);
-    checkCreativeAssetSelection(o.creativeAssetSelection);
+    checkCreativeAssetSelection(
+        o.creativeAssetSelection as api.CreativeAssetSelection);
     checkUnnamed4040(o.creativeAssets);
     checkUnnamed4041(o.creativeFieldAssignments);
     checkUnnamed4042(o.customKeyValues);
     unittest.expect(o.dynamicAssetSelection, unittest.isTrue);
     checkUnnamed4043(o.exitCustomEvents);
-    checkFsCommand(o.fsCommand);
+    checkFsCommand(o.fsCommand as api.FsCommand);
     unittest.expect(o.htmlCode, unittest.equals('foo'));
     unittest.expect(o.htmlCodeLocked, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLastModifiedInfo(o.lastModifiedInfo);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
     unittest.expect(o.latestTraffickedCreativeId, unittest.equals('foo'));
     unittest.expect(o.mediaDescription, unittest.equals('foo'));
     unittest.expect(o.mediaDuration, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkObaIcon(o.obaIcon);
+    checkObaIcon(o.obaIcon as api.ObaIcon);
     unittest.expect(o.overrideCss, unittest.equals('foo'));
-    checkVideoOffset(o.progressOffset);
+    checkVideoOffset(o.progressOffset as api.VideoOffset);
     unittest.expect(o.redirectUrl, unittest.equals('foo'));
     unittest.expect(o.renderingId, unittest.equals('foo'));
-    checkDimensionValue(o.renderingIdDimensionValue);
+    checkDimensionValue(o.renderingIdDimensionValue as api.DimensionValue);
     unittest.expect(o.requiredFlashPluginVersion, unittest.equals('foo'));
     unittest.expect(o.requiredFlashVersion, unittest.equals(42));
-    checkSize(o.size);
-    checkVideoOffset(o.skipOffset);
+    checkSize(o.size as api.Size);
+    checkVideoOffset(o.skipOffset as api.VideoOffset);
     unittest.expect(o.skippable, unittest.isTrue);
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.sslOverride, unittest.isTrue);
@@ -2457,7 +2479,7 @@
     checkUnnamed4045(o.timerCustomEvents);
     unittest.expect(o.totalFileSize, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkUniversalAdId(o.universalAdId);
+    checkUniversalAdId(o.universalAdId as api.UniversalAdId);
     unittest.expect(o.version, unittest.equals(42));
   }
   buildCounterCreative--;
@@ -2472,8 +2494,8 @@
 
 void checkUnnamed4046(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSize(o[0]);
-  checkSize(o[1]);
+  checkSize(o[0] as api.Size);
+  checkSize(o[1] as api.Size);
 }
 
 core.List<core.String> buildUnnamed4047() {
@@ -2570,20 +2592,20 @@
     checkUnnamed4046(o.additionalSizes);
     unittest.expect(o.alignment, unittest.equals('foo'));
     unittest.expect(o.artworkType, unittest.equals('foo'));
-    checkCreativeAssetId(o.assetIdentifier);
+    checkCreativeAssetId(o.assetIdentifier as api.CreativeAssetId);
     unittest.expect(o.audioBitRate, unittest.equals(42));
     unittest.expect(o.audioSampleRate, unittest.equals(42));
-    checkCreativeCustomEvent(o.backupImageExit);
+    checkCreativeCustomEvent(o.backupImageExit as api.CreativeCustomEvent);
     unittest.expect(o.bitRate, unittest.equals(42));
     unittest.expect(o.childAssetType, unittest.equals('foo'));
-    checkSize(o.collapsedSize);
+    checkSize(o.collapsedSize as api.Size);
     checkUnnamed4047(o.companionCreativeIds);
     unittest.expect(o.customStartTimeValue, unittest.equals(42));
     checkUnnamed4048(o.detectedFeatures);
     unittest.expect(o.displayType, unittest.equals('foo'));
     unittest.expect(o.duration, unittest.equals(42));
     unittest.expect(o.durationType, unittest.equals('foo'));
-    checkSize(o.expandedDimension);
+    checkSize(o.expandedDimension as api.Size);
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.flashVersion, unittest.equals(42));
     unittest.expect(o.frameRate, unittest.equals(42.0));
@@ -2591,21 +2613,21 @@
     unittest.expect(o.hideSelectionBoxes, unittest.isTrue);
     unittest.expect(o.horizontallyLocked, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.mediaDuration, unittest.equals(42.0));
     unittest.expect(o.mimeType, unittest.equals('foo'));
-    checkOffsetPosition(o.offset);
+    checkOffsetPosition(o.offset as api.OffsetPosition);
     unittest.expect(o.orientation, unittest.equals('foo'));
     unittest.expect(o.originalBackup, unittest.isTrue);
     unittest.expect(o.politeLoad, unittest.isTrue);
-    checkOffsetPosition(o.position);
+    checkOffsetPosition(o.position as api.OffsetPosition);
     unittest.expect(o.positionLeftUnit, unittest.equals('foo'));
     unittest.expect(o.positionTopUnit, unittest.equals('foo'));
     unittest.expect(o.progressiveServingUrl, unittest.equals('foo'));
     unittest.expect(o.pushdown, unittest.isTrue);
     unittest.expect(o.pushdownDuration, unittest.equals(42.0));
     unittest.expect(o.role, unittest.equals('foo'));
-    checkSize(o.size);
+    checkSize(o.size as api.Size);
     unittest.expect(o.sslCompliant, unittest.isTrue);
     unittest.expect(o.startTimeType, unittest.equals('foo'));
     unittest.expect(o.streamingServingUrl, unittest.equals('foo'));
@@ -2649,8 +2671,8 @@
 
 void checkUnnamed4049(core.List<api.ClickTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClickTag(o[0]);
-  checkClickTag(o[1]);
+  checkClickTag(o[0] as api.ClickTag);
+  checkClickTag(o[1] as api.ClickTag);
 }
 
 core.List<api.CreativeCustomEvent> buildUnnamed4050() {
@@ -2662,8 +2684,8 @@
 
 void checkUnnamed4050(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCustomEvent(o[0]);
-  checkCreativeCustomEvent(o[1]);
+  checkCreativeCustomEvent(o[0] as api.CreativeCustomEvent);
+  checkCreativeCustomEvent(o[1] as api.CreativeCustomEvent);
 }
 
 core.List<core.String> buildUnnamed4051() {
@@ -2688,8 +2710,8 @@
 
 void checkUnnamed4052(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCustomEvent(o[0]);
-  checkCreativeCustomEvent(o[1]);
+  checkCreativeCustomEvent(o[0] as api.CreativeCustomEvent);
+  checkCreativeCustomEvent(o[1] as api.CreativeCustomEvent);
 }
 
 core.List<api.CreativeCustomEvent> buildUnnamed4053() {
@@ -2701,8 +2723,8 @@
 
 void checkUnnamed4053(core.List<api.CreativeCustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeCustomEvent(o[0]);
-  checkCreativeCustomEvent(o[1]);
+  checkCreativeCustomEvent(o[0] as api.CreativeCustomEvent);
+  checkCreativeCustomEvent(o[1] as api.CreativeCustomEvent);
 }
 
 core.List<core.String> buildUnnamed4054() {
@@ -2742,13 +2764,13 @@
 void checkCreativeAssetMetadata(api.CreativeAssetMetadata o) {
   buildCounterCreativeAssetMetadata++;
   if (buildCounterCreativeAssetMetadata < 3) {
-    checkCreativeAssetId(o.assetIdentifier);
+    checkCreativeAssetId(o.assetIdentifier as api.CreativeAssetId);
     checkUnnamed4049(o.clickTags);
     checkUnnamed4050(o.counterCustomEvents);
     checkUnnamed4051(o.detectedFeatures);
     checkUnnamed4052(o.exitCustomEvents);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.richMedia, unittest.isTrue);
     checkUnnamed4053(o.timerCustomEvents);
@@ -2766,8 +2788,8 @@
 
 void checkUnnamed4055(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
+  checkRule(o[0] as api.Rule);
+  checkRule(o[1] as api.Rule);
 }
 
 core.int buildCounterCreativeAssetSelection = 0;
@@ -2800,8 +2822,8 @@
 
 void checkUnnamed4056(core.List<api.CompanionClickThroughOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompanionClickThroughOverride(o[0]);
-  checkCompanionClickThroughOverride(o[1]);
+  checkCompanionClickThroughOverride(o[0] as api.CompanionClickThroughOverride);
+  checkCompanionClickThroughOverride(o[1] as api.CompanionClickThroughOverride);
 }
 
 core.List<api.CreativeGroupAssignment> buildUnnamed4057() {
@@ -2813,8 +2835,8 @@
 
 void checkUnnamed4057(core.List<api.CreativeGroupAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeGroupAssignment(o[0]);
-  checkCreativeGroupAssignment(o[1]);
+  checkCreativeGroupAssignment(o[0] as api.CreativeGroupAssignment);
+  checkCreativeGroupAssignment(o[1] as api.CreativeGroupAssignment);
 }
 
 core.List<api.RichMediaExitOverride> buildUnnamed4058() {
@@ -2826,8 +2848,8 @@
 
 void checkUnnamed4058(core.List<api.RichMediaExitOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRichMediaExitOverride(o[0]);
-  checkRichMediaExitOverride(o[1]);
+  checkRichMediaExitOverride(o[0] as api.RichMediaExitOverride);
+  checkRichMediaExitOverride(o[1] as api.RichMediaExitOverride);
 }
 
 core.int buildCounterCreativeAssignment = 0;
@@ -2858,11 +2880,11 @@
   if (buildCounterCreativeAssignment < 3) {
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.applyEventTags, unittest.isTrue);
-    checkClickThroughUrl(o.clickThroughUrl);
+    checkClickThroughUrl(o.clickThroughUrl as api.ClickThroughUrl);
     checkUnnamed4056(o.companionCreativeOverrides);
     checkUnnamed4057(o.creativeGroupAssignments);
     unittest.expect(o.creativeId, unittest.equals('foo'));
-    checkDimensionValue(o.creativeIdDimensionValue);
+    checkDimensionValue(o.creativeIdDimensionValue as api.DimensionValue);
     unittest.expect(
         o.endTime, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     checkUnnamed4058(o.richMediaExitOverrides);
@@ -2926,9 +2948,11 @@
     unittest.expect(o.advertiserCustomEventType, unittest.equals('foo'));
     unittest.expect(o.artworkLabel, unittest.equals('foo'));
     unittest.expect(o.artworkType, unittest.equals('foo'));
-    checkCreativeClickThroughUrl(o.exitClickThroughUrl);
+    checkCreativeClickThroughUrl(
+        o.exitClickThroughUrl as api.CreativeClickThroughUrl);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkPopupWindowProperties(o.popupWindowProperties);
+    checkPopupWindowProperties(
+        o.popupWindowProperties as api.PopupWindowProperties);
     unittest.expect(o.targetType, unittest.equals('foo'));
     unittest.expect(o.videoReportingId, unittest.equals('foo'));
   }
@@ -2957,7 +2981,7 @@
   if (buildCounterCreativeField < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -3019,8 +3043,8 @@
 
 void checkUnnamed4059(core.List<api.CreativeFieldValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeFieldValue(o[0]);
-  checkCreativeFieldValue(o[1]);
+  checkCreativeFieldValue(o[0] as api.CreativeFieldValue);
+  checkCreativeFieldValue(o[1] as api.CreativeFieldValue);
 }
 
 core.int buildCounterCreativeFieldValuesListResponse = 0;
@@ -3056,8 +3080,8 @@
 
 void checkUnnamed4060(core.List<api.CreativeField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeField(o[0]);
-  checkCreativeField(o[1]);
+  checkCreativeField(o[0] as api.CreativeField);
+  checkCreativeField(o[1] as api.CreativeField);
 }
 
 core.int buildCounterCreativeFieldsListResponse = 0;
@@ -3106,7 +3130,7 @@
   if (buildCounterCreativeGroup < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.groupNumber, unittest.equals(42));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -3146,8 +3170,8 @@
 
 void checkUnnamed4061(core.List<api.CreativeGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeGroup(o[0]);
-  checkCreativeGroup(o[1]);
+  checkCreativeGroup(o[0] as api.CreativeGroup);
+  checkCreativeGroup(o[1] as api.CreativeGroup);
 }
 
 core.int buildCounterCreativeGroupsListResponse = 0;
@@ -3182,8 +3206,8 @@
 
 void checkUnnamed4062(core.List<api.OptimizationActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOptimizationActivity(o[0]);
-  checkOptimizationActivity(o[1]);
+  checkOptimizationActivity(o[0] as api.OptimizationActivity);
+  checkOptimizationActivity(o[1] as api.OptimizationActivity);
 }
 
 core.int buildCounterCreativeOptimizationConfiguration = 0;
@@ -3221,8 +3245,8 @@
 
 void checkUnnamed4063(core.List<api.CreativeAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeAssignment(o[0]);
-  checkCreativeAssignment(o[1]);
+  checkCreativeAssignment(o[0] as api.CreativeAssignment);
+  checkCreativeAssignment(o[1] as api.CreativeAssignment);
 }
 
 core.int buildCounterCreativeRotation = 0;
@@ -3260,8 +3284,8 @@
 
 void checkUnnamed4064(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreative(o[0]);
-  checkCreative(o[1]);
+  checkCreative(o[0] as api.Creative);
+  checkCreative(o[1] as api.Creative);
 }
 
 core.int buildCounterCreativesListResponse = 0;
@@ -3296,8 +3320,8 @@
 
 void checkUnnamed4065(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Dimension> buildUnnamed4066() {
@@ -3309,8 +3333,8 @@
 
 void checkUnnamed4066(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Metric> buildUnnamed4067() {
@@ -3322,8 +3346,8 @@
 
 void checkUnnamed4067(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.Metric> buildUnnamed4068() {
@@ -3335,8 +3359,8 @@
 
 void checkUnnamed4068(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.int buildCounterCrossDimensionReachReportCompatibleFields = 0;
@@ -3377,8 +3401,8 @@
 
 void checkUnnamed4069(core.List<api.CustomVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomVariable(o[0]);
-  checkCustomVariable(o[1]);
+  checkCustomVariable(o[0] as api.CustomVariable);
+  checkCustomVariable(o[1] as api.CustomVariable);
 }
 
 core.int buildCounterCustomEvent = 0;
@@ -3403,12 +3427,14 @@
 void checkCustomEvent(api.CustomEvent o) {
   buildCounterCustomEvent++;
   if (buildCounterCustomEvent < 3) {
-    checkCustomEventClickAnnotation(o.annotateClickEvent);
-    checkCustomEventImpressionAnnotation(o.annotateImpressionEvent);
+    checkCustomEventClickAnnotation(
+        o.annotateClickEvent as api.CustomEventClickAnnotation);
+    checkCustomEventImpressionAnnotation(
+        o.annotateImpressionEvent as api.CustomEventImpressionAnnotation);
     checkUnnamed4069(o.customVariables);
     unittest.expect(o.eventType, unittest.equals('foo'));
     unittest.expect(o.floodlightConfigurationId, unittest.equals('foo'));
-    checkCustomEventInsert(o.insertEvent);
+    checkCustomEventInsert(o.insertEvent as api.CustomEventInsert);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.ordinal, unittest.equals('foo'));
     unittest.expect(o.timestampMicros, unittest.equals('foo'));
@@ -3501,8 +3527,8 @@
 void checkCustomEventInsert(api.CustomEventInsert o) {
   buildCounterCustomEventInsert++;
   if (buildCounterCustomEventInsert < 3) {
-    checkCampaignManagerIds(o.cmDimensions);
-    checkDV3Ids(o.dv3Dimensions);
+    checkCampaignManagerIds(o.cmDimensions as api.CampaignManagerIds);
+    checkDV3Ids(o.dv3Dimensions as api.DV3Ids);
     unittest.expect(o.insertEventType, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.matchId, unittest.equals('foo'));
@@ -3520,8 +3546,8 @@
 
 void checkUnnamed4070(core.List<api.CustomEventError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomEventError(o[0]);
-  checkCustomEventError(o[1]);
+  checkCustomEventError(o[0] as api.CustomEventError);
+  checkCustomEventError(o[1] as api.CustomEventError);
 }
 
 core.int buildCounterCustomEventStatus = 0;
@@ -3540,7 +3566,7 @@
 void checkCustomEventStatus(api.CustomEventStatus o) {
   buildCounterCustomEventStatus++;
   if (buildCounterCustomEventStatus < 3) {
-    checkCustomEvent(o.customEvent);
+    checkCustomEvent(o.customEvent as api.CustomEvent);
     checkUnnamed4070(o.errors);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
@@ -3556,8 +3582,8 @@
 
 void checkUnnamed4071(core.List<api.CustomEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomEvent(o[0]);
-  checkCustomEvent(o[1]);
+  checkCustomEvent(o[0] as api.CustomEvent);
+  checkCustomEvent(o[1] as api.CustomEvent);
 }
 
 core.int buildCounterCustomEventsBatchInsertRequest = 0;
@@ -3590,8 +3616,8 @@
 
 void checkUnnamed4072(core.List<api.CustomEventStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomEventStatus(o[0]);
-  checkCustomEventStatus(o[1]);
+  checkCustomEventStatus(o[0] as api.CustomEventStatus);
+  checkCustomEventStatus(o[1] as api.CustomEventStatus);
 }
 
 core.int buildCounterCustomEventsBatchInsertResponse = 0;
@@ -3650,8 +3676,8 @@
 
 void checkUnnamed4073(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.int buildCounterCustomRichMediaEvents = 0;
@@ -3714,7 +3740,8 @@
 void checkCustomViewabilityMetric(api.CustomViewabilityMetric o) {
   buildCounterCustomViewabilityMetric++;
   if (buildCounterCustomViewabilityMetric < 3) {
-    checkCustomViewabilityMetricConfiguration(o.configuration);
+    checkCustomViewabilityMetricConfiguration(
+        o.configuration as api.CustomViewabilityMetricConfiguration);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -3887,7 +3914,7 @@
     unittest.expect(o.appUrl, unittest.equals('foo'));
     unittest.expect(o.fallbackUrl, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkMobileApp(o.mobileApp);
+    checkMobileApp(o.mobileApp as api.MobileApp);
     checkUnnamed4076(o.remarketingListIds);
   }
   buildCounterDeepLink--;
@@ -3933,7 +3960,7 @@
 void checkDeliverySchedule(api.DeliverySchedule o) {
   buildCounterDeliverySchedule++;
   if (buildCounterDeliverySchedule < 3) {
-    checkFrequencyCap(o.frequencyCap);
+    checkFrequencyCap(o.frequencyCap as api.FrequencyCap);
     unittest.expect(o.hardCutoff, unittest.isTrue);
     unittest.expect(o.impressionRatio, unittest.equals('foo'));
     unittest.expect(o.priority, unittest.equals('foo'));
@@ -4050,8 +4077,8 @@
 
 void checkUnnamed4077(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.int buildCounterDimensionValueList = 0;
@@ -4088,8 +4115,8 @@
 
 void checkUnnamed4078(core.List<api.DimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionFilter(o[0]);
-  checkDimensionFilter(o[1]);
+  checkDimensionFilter(o[0] as api.DimensionFilter);
+  checkDimensionFilter(o[1] as api.DimensionFilter);
 }
 
 core.int buildCounterDimensionValueRequest = 0;
@@ -4169,12 +4196,12 @@
   buildCounterDirectorySite++;
   if (buildCounterDirectorySite < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     checkUnnamed4079(o.inpageTagFormats);
     checkUnnamed4080(o.interstitialTagFormats);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkDirectorySiteSettings(o.settings);
+    checkDirectorySiteSettings(o.settings as api.DirectorySiteSettings);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterDirectorySite--;
@@ -4198,7 +4225,7 @@
   buildCounterDirectorySiteSettings++;
   if (buildCounterDirectorySiteSettings < 3) {
     unittest.expect(o.activeViewOptOut, unittest.isTrue);
-    checkDfpSettings(o.dfpSettings);
+    checkDfpSettings(o.dfpSettings as api.DfpSettings);
     unittest.expect(o.instreamVideoPlacementAccepted, unittest.isTrue);
     unittest.expect(o.interstitialPlacementAccepted, unittest.isTrue);
   }
@@ -4214,8 +4241,8 @@
 
 void checkUnnamed4081(core.List<api.DirectorySite> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDirectorySite(o[0]);
-  checkDirectorySite(o[1]);
+  checkDirectorySite(o[0] as api.DirectorySite);
+  checkDirectorySite(o[1] as api.DirectorySite);
 }
 
 core.int buildCounterDirectorySitesListResponse = 0;
@@ -4250,8 +4277,8 @@
 
 void checkUnnamed4082(core.List<api.EventFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventFilter(o[0]);
-  checkEventFilter(o[1]);
+  checkEventFilter(o[0] as api.EventFilter);
+  checkEventFilter(o[1] as api.EventFilter);
 }
 
 core.int buildCounterDisjunctiveMatchStatement = 0;
@@ -4309,8 +4336,8 @@
 
 void checkUnnamed4083(core.List<api.DynamicTargetingKey> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDynamicTargetingKey(o[0]);
-  checkDynamicTargetingKey(o[1]);
+  checkDynamicTargetingKey(o[0] as api.DynamicTargetingKey);
+  checkDynamicTargetingKey(o[1] as api.DynamicTargetingKey);
 }
 
 core.int buildCounterDynamicTargetingKeysListResponse = 0;
@@ -4375,7 +4402,8 @@
 void checkEventFilter(api.EventFilter o) {
   buildCounterEventFilter++;
   if (buildCounterEventFilter < 3) {
-    checkPathReportDimensionValue(o.dimensionFilter);
+    checkPathReportDimensionValue(
+        o.dimensionFilter as api.PathReportDimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
   }
   buildCounterEventFilter--;
@@ -4427,9 +4455,9 @@
   if (buildCounterEventTag < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.campaignId, unittest.equals('foo'));
-    checkDimensionValue(o.campaignIdDimensionValue);
+    checkDimensionValue(o.campaignIdDimensionValue as api.DimensionValue);
     unittest.expect(o.enabledByDefault, unittest.isTrue);
     unittest.expect(o.excludeFromAdxRequests, unittest.isTrue);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -4477,8 +4505,8 @@
 
 void checkUnnamed4085(core.List<api.EventTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventTag(o[0]);
-  checkEventTag(o[1]);
+  checkEventTag(o[0] as api.EventTag);
+  checkEventTag(o[1] as api.EventTag);
 }
 
 core.int buildCounterEventTagsListResponse = 0;
@@ -4546,7 +4574,7 @@
 void checkFile(api.File o) {
   buildCounterFile++;
   if (buildCounterFile < 3) {
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.fileName, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
@@ -4555,7 +4583,7 @@
     unittest.expect(o.lastModifiedTime, unittest.equals('foo'));
     unittest.expect(o.reportId, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkFileUrls(o.urls);
+    checkFileUrls(o.urls as api.FileUrls);
   }
   buildCounterFile--;
 }
@@ -4569,8 +4597,8 @@
 
 void checkUnnamed4086(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFile(o[0]);
-  checkFile(o[1]);
+  checkFile(o[0] as api.File);
+  checkFile(o[1] as api.File);
 }
 
 core.int buildCounterFileList = 0;
@@ -4659,8 +4687,8 @@
 
 void checkUnnamed4087(core.List<api.FloodlightActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFloodlightActivity(o[0]);
-  checkFloodlightActivity(o[1]);
+  checkFloodlightActivity(o[0] as api.FloodlightActivity);
+  checkFloodlightActivity(o[1] as api.FloodlightActivity);
 }
 
 core.int buildCounterFloodlightActivitiesListResponse = 0;
@@ -4696,8 +4724,8 @@
 
 void checkUnnamed4088(core.List<api.FloodlightActivityDynamicTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFloodlightActivityDynamicTag(o[0]);
-  checkFloodlightActivityDynamicTag(o[1]);
+  checkFloodlightActivityDynamicTag(o[0] as api.FloodlightActivityDynamicTag);
+  checkFloodlightActivityDynamicTag(o[1] as api.FloodlightActivityDynamicTag);
 }
 
 core.List<api.FloodlightActivityPublisherDynamicTag> buildUnnamed4089() {
@@ -4709,8 +4737,10 @@
 
 void checkUnnamed4089(core.List<api.FloodlightActivityPublisherDynamicTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFloodlightActivityPublisherDynamicTag(o[0]);
-  checkFloodlightActivityPublisherDynamicTag(o[1]);
+  checkFloodlightActivityPublisherDynamicTag(
+      o[0] as api.FloodlightActivityPublisherDynamicTag);
+  checkFloodlightActivityPublisherDynamicTag(
+      o[1] as api.FloodlightActivityPublisherDynamicTag);
 }
 
 core.List<core.String> buildUnnamed4090() {
@@ -4770,7 +4800,7 @@
   if (buildCounterFloodlightActivity < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.attributionEnabled, unittest.isTrue);
     unittest.expect(o.cacheBustingType, unittest.equals('foo'));
     unittest.expect(o.countingMethod, unittest.equals('foo'));
@@ -4781,10 +4811,11 @@
     unittest.expect(o.floodlightActivityGroupTagString, unittest.equals('foo'));
     unittest.expect(o.floodlightActivityGroupType, unittest.equals('foo'));
     unittest.expect(o.floodlightConfigurationId, unittest.equals('foo'));
-    checkDimensionValue(o.floodlightConfigurationIdDimensionValue);
+    checkDimensionValue(
+        o.floodlightConfigurationIdDimensionValue as api.DimensionValue);
     unittest.expect(o.floodlightTagType, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
@@ -4851,11 +4882,12 @@
   if (buildCounterFloodlightActivityGroup < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.floodlightConfigurationId, unittest.equals('foo'));
-    checkDimensionValue(o.floodlightConfigurationIdDimensionValue);
+    checkDimensionValue(
+        o.floodlightConfigurationIdDimensionValue as api.DimensionValue);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
@@ -4874,8 +4906,8 @@
 
 void checkUnnamed4091(core.List<api.FloodlightActivityGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFloodlightActivityGroup(o[0]);
-  checkFloodlightActivityGroup(o[1]);
+  checkFloodlightActivityGroup(o[0] as api.FloodlightActivityGroup);
+  checkFloodlightActivityGroup(o[1] as api.FloodlightActivityGroup);
 }
 
 core.int buildCounterFloodlightActivityGroupsListResponse = 0;
@@ -4926,9 +4958,10 @@
   if (buildCounterFloodlightActivityPublisherDynamicTag < 3) {
     unittest.expect(o.clickThrough, unittest.isTrue);
     unittest.expect(o.directorySiteId, unittest.equals('foo'));
-    checkFloodlightActivityDynamicTag(o.dynamicTag);
+    checkFloodlightActivityDynamicTag(
+        o.dynamicTag as api.FloodlightActivityDynamicTag);
     unittest.expect(o.siteId, unittest.equals('foo'));
-    checkDimensionValue(o.siteIdDimensionValue);
+    checkDimensionValue(o.siteIdDimensionValue as api.DimensionValue);
     unittest.expect(o.viewThrough, unittest.isTrue);
   }
   buildCounterFloodlightActivityPublisherDynamicTag--;
@@ -4943,8 +4976,8 @@
 
 void checkUnnamed4092(core.List<api.ThirdPartyAuthenticationToken> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThirdPartyAuthenticationToken(o[0]);
-  checkThirdPartyAuthenticationToken(o[1]);
+  checkThirdPartyAuthenticationToken(o[0] as api.ThirdPartyAuthenticationToken);
+  checkThirdPartyAuthenticationToken(o[1] as api.ThirdPartyAuthenticationToken);
 }
 
 core.List<api.UserDefinedVariableConfiguration> buildUnnamed4093() {
@@ -4956,8 +4989,10 @@
 
 void checkUnnamed4093(core.List<api.UserDefinedVariableConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserDefinedVariableConfiguration(o[0]);
-  checkUserDefinedVariableConfiguration(o[1]);
+  checkUserDefinedVariableConfiguration(
+      o[0] as api.UserDefinedVariableConfiguration);
+  checkUserDefinedVariableConfiguration(
+      o[1] as api.UserDefinedVariableConfiguration);
 }
 
 core.int buildCounterFloodlightConfiguration = 0;
@@ -4993,21 +5028,23 @@
   if (buildCounterFloodlightConfiguration < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.analyticsDataSharingEnabled, unittest.isTrue);
-    checkCustomViewabilityMetric(o.customViewabilityMetric);
+    checkCustomViewabilityMetric(
+        o.customViewabilityMetric as api.CustomViewabilityMetric);
     unittest.expect(o.exposureToConversionEnabled, unittest.isTrue);
     unittest.expect(o.firstDayOfWeek, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.inAppAttributionTrackingEnabled, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLookbackConfiguration(o.lookbackConfiguration);
+    checkLookbackConfiguration(
+        o.lookbackConfiguration as api.LookbackConfiguration);
     unittest.expect(
         o.naturalSearchConversionAttributionOption, unittest.equals('foo'));
-    checkOmnitureSettings(o.omnitureSettings);
+    checkOmnitureSettings(o.omnitureSettings as api.OmnitureSettings);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
-    checkTagSettings(o.tagSettings);
+    checkTagSettings(o.tagSettings as api.TagSettings);
     checkUnnamed4092(o.thirdPartyAuthenticationTokens);
     checkUnnamed4093(o.userDefinedVariableConfigurations);
   }
@@ -5023,8 +5060,8 @@
 
 void checkUnnamed4094(core.List<api.FloodlightConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFloodlightConfiguration(o[0]);
-  checkFloodlightConfiguration(o[1]);
+  checkFloodlightConfiguration(o[0] as api.FloodlightConfiguration);
+  checkFloodlightConfiguration(o[1] as api.FloodlightConfiguration);
 }
 
 core.int buildCounterFloodlightConfigurationsListResponse = 0;
@@ -5059,8 +5096,8 @@
 
 void checkUnnamed4095(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Dimension> buildUnnamed4096() {
@@ -5072,8 +5109,8 @@
 
 void checkUnnamed4096(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Metric> buildUnnamed4097() {
@@ -5085,8 +5122,8 @@
 
 void checkUnnamed4097(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.int buildCounterFloodlightReportCompatibleFields = 0;
@@ -5172,8 +5209,8 @@
 
 void checkUnnamed4098(core.List<api.City> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCity(o[0]);
-  checkCity(o[1]);
+  checkCity(o[0] as api.City);
+  checkCity(o[1] as api.City);
 }
 
 core.List<api.Country> buildUnnamed4099() {
@@ -5185,8 +5222,8 @@
 
 void checkUnnamed4099(core.List<api.Country> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCountry(o[0]);
-  checkCountry(o[1]);
+  checkCountry(o[0] as api.Country);
+  checkCountry(o[1] as api.Country);
 }
 
 core.List<api.Metro> buildUnnamed4100() {
@@ -5198,8 +5235,8 @@
 
 void checkUnnamed4100(core.List<api.Metro> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetro(o[0]);
-  checkMetro(o[1]);
+  checkMetro(o[0] as api.Metro);
+  checkMetro(o[1] as api.Metro);
 }
 
 core.List<api.PostalCode> buildUnnamed4101() {
@@ -5211,8 +5248,8 @@
 
 void checkUnnamed4101(core.List<api.PostalCode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPostalCode(o[0]);
-  checkPostalCode(o[1]);
+  checkPostalCode(o[0] as api.PostalCode);
+  checkPostalCode(o[1] as api.PostalCode);
 }
 
 core.List<api.Region> buildUnnamed4102() {
@@ -5224,8 +5261,8 @@
 
 void checkUnnamed4102(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegion(o[0]);
-  checkRegion(o[1]);
+  checkRegion(o[0] as api.Region);
+  checkRegion(o[1] as api.Region);
 }
 
 core.int buildCounterGeoTargeting = 0;
@@ -5266,8 +5303,8 @@
 
 void checkUnnamed4103(core.List<api.AdSlot> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdSlot(o[0]);
-  checkAdSlot(o[1]);
+  checkAdSlot(o[0] as api.AdSlot);
+  checkAdSlot(o[1] as api.AdSlot);
 }
 
 core.int buildCounterInventoryItem = 0;
@@ -5312,12 +5349,12 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.inPlan, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLastModifiedInfo(o.lastModifiedInfo);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.negotiationChannelId, unittest.equals('foo'));
     unittest.expect(o.orderId, unittest.equals('foo'));
     unittest.expect(o.placementStrategyId, unittest.equals('foo'));
-    checkPricing(o.pricing);
+    checkPricing(o.pricing as api.Pricing);
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.rfpId, unittest.equals('foo'));
     unittest.expect(o.siteId, unittest.equals('foo'));
@@ -5336,8 +5373,8 @@
 
 void checkUnnamed4104(core.List<api.InventoryItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInventoryItem(o[0]);
-  checkInventoryItem(o[1]);
+  checkInventoryItem(o[0] as api.InventoryItem);
+  checkInventoryItem(o[1] as api.InventoryItem);
 }
 
 core.int buildCounterInventoryItemsListResponse = 0;
@@ -5391,8 +5428,8 @@
 
 void checkUnnamed4105(core.List<api.DeepLink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeepLink(o[0]);
-  checkDeepLink(o[1]);
+  checkDeepLink(o[0] as api.DeepLink);
+  checkDeepLink(o[1] as api.DeepLink);
 }
 
 core.int buildCounterLandingPage = 0;
@@ -5460,8 +5497,8 @@
 
 void checkUnnamed4106(core.List<api.Language> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLanguage(o[0]);
-  checkLanguage(o[1]);
+  checkLanguage(o[0] as api.Language);
+  checkLanguage(o[1] as api.Language);
 }
 
 core.int buildCounterLanguageTargeting = 0;
@@ -5492,8 +5529,8 @@
 
 void checkUnnamed4107(core.List<api.Language> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLanguage(o[0]);
-  checkLanguage(o[1]);
+  checkLanguage(o[0] as api.Language);
+  checkLanguage(o[1] as api.Language);
 }
 
 core.int buildCounterLanguagesListResponse = 0;
@@ -5545,8 +5582,8 @@
 
 void checkUnnamed4108(core.List<api.ListPopulationTerm> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkListPopulationTerm(o[0]);
-  checkListPopulationTerm(o[1]);
+  checkListPopulationTerm(o[0] as api.ListPopulationTerm);
+  checkListPopulationTerm(o[1] as api.ListPopulationTerm);
 }
 
 core.int buildCounterListPopulationClause = 0;
@@ -5577,8 +5614,8 @@
 
 void checkUnnamed4109(core.List<api.ListPopulationClause> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkListPopulationClause(o[0]);
-  checkListPopulationClause(o[1]);
+  checkListPopulationClause(o[0] as api.ListPopulationClause);
+  checkListPopulationClause(o[1] as api.ListPopulationClause);
 }
 
 core.int buildCounterListPopulationRule = 0;
@@ -5738,8 +5775,8 @@
 
 void checkUnnamed4110(core.List<api.Metro> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetro(o[0]);
-  checkMetro(o[1]);
+  checkMetro(o[0] as api.Metro);
+  checkMetro(o[1] as api.Metro);
 }
 
 core.int buildCounterMetrosListResponse = 0;
@@ -5799,8 +5836,8 @@
 
 void checkUnnamed4111(core.List<api.MobileApp> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMobileApp(o[0]);
-  checkMobileApp(o[1]);
+  checkMobileApp(o[0] as api.MobileApp);
+  checkMobileApp(o[1] as api.MobileApp);
 }
 
 core.int buildCounterMobileAppsListResponse = 0;
@@ -5862,8 +5899,8 @@
 
 void checkUnnamed4112(core.List<api.MobileCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMobileCarrier(o[0]);
-  checkMobileCarrier(o[1]);
+  checkMobileCarrier(o[0] as api.MobileCarrier);
+  checkMobileCarrier(o[1] as api.MobileCarrier);
 }
 
 core.int buildCounterMobileCarriersListResponse = 0;
@@ -5913,7 +5950,7 @@
     unittest.expect(o.iconViewTrackingUrl, unittest.equals('foo'));
     unittest.expect(o.program, unittest.equals('foo'));
     unittest.expect(o.resourceUrl, unittest.equals('foo'));
-    checkSize(o.size);
+    checkSize(o.size as api.Size);
     unittest.expect(o.xPosition, unittest.equals('foo'));
     unittest.expect(o.yPosition, unittest.equals('foo'));
   }
@@ -6049,7 +6086,7 @@
     unittest.expect(o.majorVersion, unittest.equals('foo'));
     unittest.expect(o.minorVersion, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOperatingSystem(o.operatingSystem);
+    checkOperatingSystem(o.operatingSystem as api.OperatingSystem);
   }
   buildCounterOperatingSystemVersion--;
 }
@@ -6063,8 +6100,8 @@
 
 void checkUnnamed4114(core.List<api.OperatingSystemVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperatingSystemVersion(o[0]);
-  checkOperatingSystemVersion(o[1]);
+  checkOperatingSystemVersion(o[0] as api.OperatingSystemVersion);
+  checkOperatingSystemVersion(o[1] as api.OperatingSystemVersion);
 }
 
 core.int buildCounterOperatingSystemVersionsListResponse = 0;
@@ -6099,8 +6136,8 @@
 
 void checkUnnamed4115(core.List<api.OperatingSystem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperatingSystem(o[0]);
-  checkOperatingSystem(o[1]);
+  checkOperatingSystem(o[0] as api.OperatingSystem);
+  checkOperatingSystem(o[1] as api.OperatingSystem);
 }
 
 core.int buildCounterOperatingSystemsListResponse = 0;
@@ -6141,7 +6178,8 @@
   buildCounterOptimizationActivity++;
   if (buildCounterOptimizationActivity < 3) {
     unittest.expect(o.floodlightActivityId, unittest.equals('foo'));
-    checkDimensionValue(o.floodlightActivityIdDimensionValue);
+    checkDimensionValue(
+        o.floodlightActivityIdDimensionValue as api.DimensionValue);
     unittest.expect(o.weight, unittest.equals(42));
   }
   buildCounterOptimizationActivity--;
@@ -6169,8 +6207,8 @@
 
 void checkUnnamed4117(core.List<api.OrderContact> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderContact(o[0]);
-  checkOrderContact(o[1]);
+  checkOrderContact(o[0] as api.OrderContact);
+  checkOrderContact(o[1] as api.OrderContact);
 }
 
 core.List<core.String> buildUnnamed4118() {
@@ -6241,7 +6279,7 @@
     checkUnnamed4117(o.contacts);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLastModifiedInfo(o.lastModifiedInfo);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.planningTermId, unittest.equals('foo'));
@@ -6344,7 +6382,7 @@
     unittest.expect(o.amendedOrderDocumentId, unittest.equals('foo'));
     checkUnnamed4120(o.approvedByUserProfileIds);
     unittest.expect(o.cancelled, unittest.isTrue);
-    checkLastModifiedInfo(o.createdInfo);
+    checkLastModifiedInfo(o.createdInfo as api.LastModifiedInfo);
     unittest.expect(o.effectiveDate,
         unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -6371,8 +6409,8 @@
 
 void checkUnnamed4122(core.List<api.OrderDocument> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrderDocument(o[0]);
-  checkOrderDocument(o[1]);
+  checkOrderDocument(o[0] as api.OrderDocument);
+  checkOrderDocument(o[1] as api.OrderDocument);
 }
 
 core.int buildCounterOrderDocumentsListResponse = 0;
@@ -6407,8 +6445,8 @@
 
 void checkUnnamed4123(core.List<api.Order> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrder(o[0]);
-  checkOrder(o[1]);
+  checkOrder(o[0] as api.Order);
+  checkOrder(o[1] as api.Order);
 }
 
 core.int buildCounterOrdersListResponse = 0;
@@ -6443,8 +6481,8 @@
 
 void checkUnnamed4124(core.List<api.EventFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventFilter(o[0]);
-  checkEventFilter(o[1]);
+  checkEventFilter(o[0] as api.EventFilter);
+  checkEventFilter(o[1] as api.EventFilter);
 }
 
 core.int buildCounterPathFilter = 0;
@@ -6479,8 +6517,8 @@
 
 void checkUnnamed4125(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Dimension> buildUnnamed4126() {
@@ -6492,8 +6530,8 @@
 
 void checkUnnamed4126(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Metric> buildUnnamed4127() {
@@ -6505,8 +6543,8 @@
 
 void checkUnnamed4127(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.Dimension> buildUnnamed4128() {
@@ -6518,8 +6556,8 @@
 
 void checkUnnamed4128(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.int buildCounterPathReportCompatibleFields = 0;
@@ -6611,8 +6649,8 @@
 
 void checkUnnamed4131(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Dimension> buildUnnamed4132() {
@@ -6624,8 +6662,8 @@
 
 void checkUnnamed4132(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Metric> buildUnnamed4133() {
@@ -6637,8 +6675,8 @@
 
 void checkUnnamed4133(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.Dimension> buildUnnamed4134() {
@@ -6650,8 +6688,8 @@
 
 void checkUnnamed4134(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.int buildCounterPathToConversionReportCompatibleFields = 0;
@@ -6692,8 +6730,8 @@
 
 void checkUnnamed4135(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSize(o[0]);
-  checkSize(o[1]);
+  checkSize(o[0] as api.Size);
+  checkSize(o[1] as api.Size);
 }
 
 core.List<core.String> buildUnnamed4136() {
@@ -6767,42 +6805,43 @@
     unittest.expect(o.adBlockingOptOut, unittest.isTrue);
     checkUnnamed4135(o.additionalSizes);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.archived, unittest.isTrue);
     unittest.expect(o.campaignId, unittest.equals('foo'));
-    checkDimensionValue(o.campaignIdDimensionValue);
+    checkDimensionValue(o.campaignIdDimensionValue as api.DimensionValue);
     unittest.expect(o.comment, unittest.equals('foo'));
     unittest.expect(o.compatibility, unittest.equals('foo'));
     unittest.expect(o.contentCategoryId, unittest.equals('foo'));
-    checkLastModifiedInfo(o.createInfo);
+    checkLastModifiedInfo(o.createInfo as api.LastModifiedInfo);
     unittest.expect(o.directorySiteId, unittest.equals('foo'));
-    checkDimensionValue(o.directorySiteIdDimensionValue);
+    checkDimensionValue(o.directorySiteIdDimensionValue as api.DimensionValue);
     unittest.expect(o.externalId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.keyName, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLastModifiedInfo(o.lastModifiedInfo);
-    checkLookbackConfiguration(o.lookbackConfiguration);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
+    checkLookbackConfiguration(
+        o.lookbackConfiguration as api.LookbackConfiguration);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.paymentApproved, unittest.isTrue);
     unittest.expect(o.paymentSource, unittest.equals('foo'));
     unittest.expect(o.placementGroupId, unittest.equals('foo'));
-    checkDimensionValue(o.placementGroupIdDimensionValue);
+    checkDimensionValue(o.placementGroupIdDimensionValue as api.DimensionValue);
     unittest.expect(o.placementStrategyId, unittest.equals('foo'));
-    checkPricingSchedule(o.pricingSchedule);
+    checkPricingSchedule(o.pricingSchedule as api.PricingSchedule);
     unittest.expect(o.primary, unittest.isTrue);
-    checkLastModifiedInfo(o.publisherUpdateInfo);
+    checkLastModifiedInfo(o.publisherUpdateInfo as api.LastModifiedInfo);
     unittest.expect(o.siteId, unittest.equals('foo'));
-    checkDimensionValue(o.siteIdDimensionValue);
-    checkSize(o.size);
+    checkDimensionValue(o.siteIdDimensionValue as api.DimensionValue);
+    checkSize(o.size as api.Size);
     unittest.expect(o.sslRequired, unittest.isTrue);
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
     checkUnnamed4136(o.tagFormats);
-    checkTagSetting(o.tagSetting);
+    checkTagSetting(o.tagSetting as api.TagSetting);
     unittest.expect(o.videoActiveViewOptOut, unittest.isTrue);
-    checkVideoSettings(o.videoSettings);
+    checkVideoSettings(o.videoSettings as api.VideoSettings);
     unittest.expect(o.vpaidAdapterChoice, unittest.equals('foo'));
   }
   buildCounterPlacement--;
@@ -6827,7 +6866,7 @@
   if (buildCounterPlacementAssignment < 3) {
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.placementId, unittest.equals('foo'));
-    checkDimensionValue(o.placementIdDimensionValue);
+    checkDimensionValue(o.placementIdDimensionValue as api.DimensionValue);
     unittest.expect(o.sslRequired, unittest.isTrue);
   }
   buildCounterPlacementAssignment--;
@@ -6887,29 +6926,30 @@
   if (buildCounterPlacementGroup < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.archived, unittest.isTrue);
     unittest.expect(o.campaignId, unittest.equals('foo'));
-    checkDimensionValue(o.campaignIdDimensionValue);
+    checkDimensionValue(o.campaignIdDimensionValue as api.DimensionValue);
     checkUnnamed4137(o.childPlacementIds);
     unittest.expect(o.comment, unittest.equals('foo'));
     unittest.expect(o.contentCategoryId, unittest.equals('foo'));
-    checkLastModifiedInfo(o.createInfo);
+    checkLastModifiedInfo(o.createInfo as api.LastModifiedInfo);
     unittest.expect(o.directorySiteId, unittest.equals('foo'));
-    checkDimensionValue(o.directorySiteIdDimensionValue);
+    checkDimensionValue(o.directorySiteIdDimensionValue as api.DimensionValue);
     unittest.expect(o.externalId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLastModifiedInfo(o.lastModifiedInfo);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.placementGroupType, unittest.equals('foo'));
     unittest.expect(o.placementStrategyId, unittest.equals('foo'));
-    checkPricingSchedule(o.pricingSchedule);
+    checkPricingSchedule(o.pricingSchedule as api.PricingSchedule);
     unittest.expect(o.primaryPlacementId, unittest.equals('foo'));
-    checkDimensionValue(o.primaryPlacementIdDimensionValue);
+    checkDimensionValue(
+        o.primaryPlacementIdDimensionValue as api.DimensionValue);
     unittest.expect(o.siteId, unittest.equals('foo'));
-    checkDimensionValue(o.siteIdDimensionValue);
+    checkDimensionValue(o.siteIdDimensionValue as api.DimensionValue);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
   }
   buildCounterPlacementGroup--;
@@ -6924,8 +6964,8 @@
 
 void checkUnnamed4138(core.List<api.PlacementGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlacementGroup(o[0]);
-  checkPlacementGroup(o[1]);
+  checkPlacementGroup(o[0] as api.PlacementGroup);
+  checkPlacementGroup(o[1] as api.PlacementGroup);
 }
 
 core.int buildCounterPlacementGroupsListResponse = 0;
@@ -6960,8 +7000,8 @@
 
 void checkUnnamed4139(core.List<api.PlacementStrategy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlacementStrategy(o[0]);
-  checkPlacementStrategy(o[1]);
+  checkPlacementStrategy(o[0] as api.PlacementStrategy);
+  checkPlacementStrategy(o[1] as api.PlacementStrategy);
 }
 
 core.int buildCounterPlacementStrategiesListResponse = 0;
@@ -7022,8 +7062,8 @@
 
 void checkUnnamed4140(core.List<api.TagData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTagData(o[0]);
-  checkTagData(o[1]);
+  checkTagData(o[0] as api.TagData);
+  checkTagData(o[1] as api.TagData);
 }
 
 core.int buildCounterPlacementTag = 0;
@@ -7056,8 +7096,8 @@
 
 void checkUnnamed4141(core.List<api.PlacementTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlacementTag(o[0]);
-  checkPlacementTag(o[1]);
+  checkPlacementTag(o[0] as api.PlacementTag);
+  checkPlacementTag(o[1] as api.PlacementTag);
 }
 
 core.int buildCounterPlacementsGenerateTagsResponse = 0;
@@ -7090,8 +7130,8 @@
 
 void checkUnnamed4142(core.List<api.Placement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlacement(o[0]);
-  checkPlacement(o[1]);
+  checkPlacement(o[0] as api.Placement);
+  checkPlacement(o[1] as api.Placement);
 }
 
 core.int buildCounterPlacementsListResponse = 0;
@@ -7149,8 +7189,8 @@
 
 void checkUnnamed4143(core.List<api.PlatformType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlatformType(o[0]);
-  checkPlatformType(o[1]);
+  checkPlatformType(o[0] as api.PlatformType);
+  checkPlatformType(o[1] as api.PlatformType);
 }
 
 core.int buildCounterPlatformTypesListResponse = 0;
@@ -7196,8 +7236,8 @@
 void checkPopupWindowProperties(api.PopupWindowProperties o) {
   buildCounterPopupWindowProperties++;
   if (buildCounterPopupWindowProperties < 3) {
-    checkSize(o.dimension);
-    checkOffsetPosition(o.offset);
+    checkSize(o.dimension as api.Size);
+    checkOffsetPosition(o.offset as api.OffsetPosition);
     unittest.expect(o.positionType, unittest.equals('foo'));
     unittest.expect(o.showAddressBar, unittest.isTrue);
     unittest.expect(o.showMenuBar, unittest.isTrue);
@@ -7245,8 +7285,8 @@
 
 void checkUnnamed4144(core.List<api.PostalCode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPostalCode(o[0]);
-  checkPostalCode(o[1]);
+  checkPostalCode(o[0] as api.PostalCode);
+  checkPostalCode(o[1] as api.PostalCode);
 }
 
 core.int buildCounterPostalCodesListResponse = 0;
@@ -7279,8 +7319,8 @@
 
 void checkUnnamed4145(core.List<api.Flight> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFlight(o[0]);
-  checkFlight(o[1]);
+  checkFlight(o[0] as api.Flight);
+  checkFlight(o[1] as api.Flight);
 }
 
 core.int buildCounterPricing = 0;
@@ -7323,8 +7363,8 @@
 
 void checkUnnamed4146(core.List<api.PricingSchedulePricingPeriod> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPricingSchedulePricingPeriod(o[0]);
-  checkPricingSchedulePricingPeriod(o[1]);
+  checkPricingSchedulePricingPeriod(o[0] as api.PricingSchedulePricingPeriod);
+  checkPricingSchedulePricingPeriod(o[1] as api.PricingSchedulePricingPeriod);
 }
 
 core.int buildCounterPricingSchedule = 0;
@@ -7438,7 +7478,7 @@
         o.endDate, unittest.equals(core.DateTime.parse("2002-02-27T00:00:00")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLastModifiedInfo(o.lastModifiedInfo);
+    checkLastModifiedInfo(o.lastModifiedInfo as api.LastModifiedInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.overview, unittest.equals('foo'));
     unittest.expect(o.startDate,
@@ -7464,8 +7504,8 @@
 
 void checkUnnamed4147(core.List<api.Project> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProject(o[0]);
-  checkProject(o[1]);
+  checkProject(o[0] as api.Project);
+  checkProject(o[1] as api.Project);
 }
 
 core.int buildCounterProjectsListResponse = 0;
@@ -7500,8 +7540,8 @@
 
 void checkUnnamed4148(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Dimension> buildUnnamed4149() {
@@ -7513,8 +7553,8 @@
 
 void checkUnnamed4149(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Metric> buildUnnamed4150() {
@@ -7526,8 +7566,8 @@
 
 void checkUnnamed4150(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.Metric> buildUnnamed4151() {
@@ -7539,8 +7579,8 @@
 
 void checkUnnamed4151(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.Metric> buildUnnamed4152() {
@@ -7552,8 +7592,8 @@
 
 void checkUnnamed4152(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.int buildCounterReachReportCompatibleFields = 0;
@@ -7646,8 +7686,8 @@
 
 void checkUnnamed4153(core.List<api.Region> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRegion(o[0]);
-  checkRegion(o[1]);
+  checkRegion(o[0] as api.Region);
+  checkRegion(o[1] as api.Region);
 }
 
 core.int buildCounterRegionsListResponse = 0;
@@ -7700,12 +7740,12 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lifeSpan, unittest.equals('foo'));
-    checkListPopulationRule(o.listPopulationRule);
+    checkListPopulationRule(o.listPopulationRule as api.ListPopulationRule);
     unittest.expect(o.listSize, unittest.equals('foo'));
     unittest.expect(o.listSource, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -7774,8 +7814,8 @@
 
 void checkUnnamed4156(core.List<api.RemarketingList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRemarketingList(o[0]);
-  checkRemarketingList(o[1]);
+  checkRemarketingList(o[0] as api.RemarketingList);
+  checkRemarketingList(o[1] as api.RemarketingList);
 }
 
 core.int buildCounterRemarketingListsListResponse = 0;
@@ -7810,8 +7850,8 @@
 
 void checkUnnamed4157(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<api.SortedDimension> buildUnnamed4158() {
@@ -7823,8 +7863,8 @@
 
 void checkUnnamed4158(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<core.String> buildUnnamed4159() {
@@ -7859,9 +7899,10 @@
 void checkReportCriteria(api.ReportCriteria o) {
   buildCounterReportCriteria++;
   if (buildCounterReportCriteria < 3) {
-    checkActivities(o.activities);
-    checkCustomRichMediaEvents(o.customRichMediaEvents);
-    checkDateRange(o.dateRange);
+    checkActivities(o.activities as api.Activities);
+    checkCustomRichMediaEvents(
+        o.customRichMediaEvents as api.CustomRichMediaEvents);
+    checkDateRange(o.dateRange as api.DateRange);
     checkUnnamed4157(o.dimensionFilters);
     checkUnnamed4158(o.dimensions);
     checkUnnamed4159(o.metricNames);
@@ -7878,8 +7919,8 @@
 
 void checkUnnamed4160(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<api.DimensionValue> buildUnnamed4161() {
@@ -7891,8 +7932,8 @@
 
 void checkUnnamed4161(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<core.String> buildUnnamed4162() {
@@ -7943,7 +7984,7 @@
   buildCounterReportCrossDimensionReachCriteria++;
   if (buildCounterReportCrossDimensionReachCriteria < 3) {
     checkUnnamed4160(o.breakdown);
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     unittest.expect(o.dimension, unittest.equals('foo'));
     checkUnnamed4161(o.dimensionFilters);
     checkUnnamed4162(o.metricNames);
@@ -7962,8 +8003,8 @@
 
 void checkUnnamed4164(core.List<api.Recipient> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRecipient(o[0]);
-  checkRecipient(o[1]);
+  checkRecipient(o[0] as api.Recipient);
+  checkRecipient(o[1] as api.Recipient);
 }
 
 core.int buildCounterReportDelivery = 0;
@@ -8000,8 +8041,8 @@
 
 void checkUnnamed4165(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<api.DimensionValue> buildUnnamed4166() {
@@ -8013,8 +8054,8 @@
 
 void checkUnnamed4166(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<api.SortedDimension> buildUnnamed4167() {
@@ -8026,8 +8067,8 @@
 
 void checkUnnamed4167(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<core.String> buildUnnamed4168() {
@@ -8089,12 +8130,13 @@
   buildCounterReportFloodlightCriteria++;
   if (buildCounterReportFloodlightCriteria < 3) {
     checkUnnamed4165(o.customRichMediaEvents);
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     checkUnnamed4166(o.dimensionFilters);
     checkUnnamed4167(o.dimensions);
-    checkDimensionValue(o.floodlightConfigId);
+    checkDimensionValue(o.floodlightConfigId as api.DimensionValue);
     checkUnnamed4168(o.metricNames);
-    checkReportFloodlightCriteriaReportProperties(o.reportProperties);
+    checkReportFloodlightCriteriaReportProperties(
+        o.reportProperties as api.ReportFloodlightCriteriaReportProperties);
   }
   buildCounterReportFloodlightCriteria--;
 }
@@ -8108,8 +8150,8 @@
 
 void checkUnnamed4169(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<api.SortedDimension> buildUnnamed4170() {
@@ -8121,8 +8163,8 @@
 
 void checkUnnamed4170(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<core.String> buildUnnamed4171() {
@@ -8147,8 +8189,8 @@
 
 void checkUnnamed4172(core.List<api.PathFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPathFilter(o[0]);
-  checkPathFilter(o[1]);
+  checkPathFilter(o[0] as api.PathFilter);
+  checkPathFilter(o[1] as api.PathFilter);
 }
 
 core.int buildCounterReportPathAttributionCriteria = 0;
@@ -8172,10 +8214,10 @@
   buildCounterReportPathAttributionCriteria++;
   if (buildCounterReportPathAttributionCriteria < 3) {
     checkUnnamed4169(o.activityFilters);
-    checkChannelGrouping(o.customChannelGrouping);
-    checkDateRange(o.dateRange);
+    checkChannelGrouping(o.customChannelGrouping as api.ChannelGrouping);
+    checkDateRange(o.dateRange as api.DateRange);
     checkUnnamed4170(o.dimensions);
-    checkDimensionValue(o.floodlightConfigId);
+    checkDimensionValue(o.floodlightConfigId as api.DimensionValue);
     checkUnnamed4171(o.metricNames);
     checkUnnamed4172(o.pathFilters);
   }
@@ -8191,8 +8233,8 @@
 
 void checkUnnamed4173(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<api.SortedDimension> buildUnnamed4174() {
@@ -8204,8 +8246,8 @@
 
 void checkUnnamed4174(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<core.String> buildUnnamed4175() {
@@ -8230,8 +8272,8 @@
 
 void checkUnnamed4176(core.List<api.PathFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPathFilter(o[0]);
-  checkPathFilter(o[1]);
+  checkPathFilter(o[0] as api.PathFilter);
+  checkPathFilter(o[1] as api.PathFilter);
 }
 
 core.int buildCounterReportPathCriteria = 0;
@@ -8255,10 +8297,10 @@
   buildCounterReportPathCriteria++;
   if (buildCounterReportPathCriteria < 3) {
     checkUnnamed4173(o.activityFilters);
-    checkChannelGrouping(o.customChannelGrouping);
-    checkDateRange(o.dateRange);
+    checkChannelGrouping(o.customChannelGrouping as api.ChannelGrouping);
+    checkDateRange(o.dateRange as api.DateRange);
     checkUnnamed4174(o.dimensions);
-    checkDimensionValue(o.floodlightConfigId);
+    checkDimensionValue(o.floodlightConfigId as api.DimensionValue);
     checkUnnamed4175(o.metricNames);
     checkUnnamed4176(o.pathFilters);
   }
@@ -8274,8 +8316,8 @@
 
 void checkUnnamed4177(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<api.SortedDimension> buildUnnamed4178() {
@@ -8287,8 +8329,8 @@
 
 void checkUnnamed4178(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<api.SortedDimension> buildUnnamed4179() {
@@ -8300,8 +8342,8 @@
 
 void checkUnnamed4179(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<api.DimensionValue> buildUnnamed4180() {
@@ -8313,8 +8355,8 @@
 
 void checkUnnamed4180(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<core.String> buildUnnamed4181() {
@@ -8339,8 +8381,8 @@
 
 void checkUnnamed4182(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.int buildCounterReportPathToConversionCriteriaReportProperties = 0;
@@ -8406,11 +8448,12 @@
     checkUnnamed4178(o.conversionDimensions);
     checkUnnamed4179(o.customFloodlightVariables);
     checkUnnamed4180(o.customRichMediaEvents);
-    checkDateRange(o.dateRange);
-    checkDimensionValue(o.floodlightConfigId);
+    checkDateRange(o.dateRange as api.DateRange);
+    checkDimensionValue(o.floodlightConfigId as api.DimensionValue);
     checkUnnamed4181(o.metricNames);
     checkUnnamed4182(o.perInteractionDimensions);
-    checkReportPathToConversionCriteriaReportProperties(o.reportProperties);
+    checkReportPathToConversionCriteriaReportProperties(o.reportProperties
+        as api.ReportPathToConversionCriteriaReportProperties);
   }
   buildCounterReportPathToConversionCriteria--;
 }
@@ -8424,8 +8467,8 @@
 
 void checkUnnamed4183(core.List<api.DimensionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionValue(o[0]);
-  checkDimensionValue(o[1]);
+  checkDimensionValue(o[0] as api.DimensionValue);
+  checkDimensionValue(o[1] as api.DimensionValue);
 }
 
 core.List<api.SortedDimension> buildUnnamed4184() {
@@ -8437,8 +8480,8 @@
 
 void checkUnnamed4184(core.List<api.SortedDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortedDimension(o[0]);
-  checkSortedDimension(o[1]);
+  checkSortedDimension(o[0] as api.SortedDimension);
+  checkSortedDimension(o[1] as api.SortedDimension);
 }
 
 core.List<core.String> buildUnnamed4185() {
@@ -8488,9 +8531,10 @@
 void checkReportReachCriteria(api.ReportReachCriteria o) {
   buildCounterReportReachCriteria++;
   if (buildCounterReportReachCriteria < 3) {
-    checkActivities(o.activities);
-    checkCustomRichMediaEvents(o.customRichMediaEvents);
-    checkDateRange(o.dateRange);
+    checkActivities(o.activities as api.Activities);
+    checkCustomRichMediaEvents(
+        o.customRichMediaEvents as api.CustomRichMediaEvents);
+    checkDateRange(o.dateRange as api.DateRange);
     checkUnnamed4183(o.dimensionFilters);
     checkUnnamed4184(o.dimensions);
     unittest.expect(o.enableAllDimensionCombinations, unittest.isTrue);
@@ -8580,23 +8624,27 @@
   buildCounterReport++;
   if (buildCounterReport < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkReportCriteria(o.criteria);
-    checkReportCrossDimensionReachCriteria(o.crossDimensionReachCriteria);
-    checkReportDelivery(o.delivery);
+    checkReportCriteria(o.criteria as api.ReportCriteria);
+    checkReportCrossDimensionReachCriteria(
+        o.crossDimensionReachCriteria as api.ReportCrossDimensionReachCriteria);
+    checkReportDelivery(o.delivery as api.ReportDelivery);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.fileName, unittest.equals('foo'));
-    checkReportFloodlightCriteria(o.floodlightCriteria);
+    checkReportFloodlightCriteria(
+        o.floodlightCriteria as api.ReportFloodlightCriteria);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastModifiedTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.ownerProfileId, unittest.equals('foo'));
-    checkReportPathAttributionCriteria(o.pathAttributionCriteria);
-    checkReportPathCriteria(o.pathCriteria);
-    checkReportPathToConversionCriteria(o.pathToConversionCriteria);
-    checkReportReachCriteria(o.reachCriteria);
-    checkReportSchedule(o.schedule);
+    checkReportPathAttributionCriteria(
+        o.pathAttributionCriteria as api.ReportPathAttributionCriteria);
+    checkReportPathCriteria(o.pathCriteria as api.ReportPathCriteria);
+    checkReportPathToConversionCriteria(
+        o.pathToConversionCriteria as api.ReportPathToConversionCriteria);
+    checkReportReachCriteria(o.reachCriteria as api.ReportReachCriteria);
+    checkReportSchedule(o.schedule as api.ReportSchedule);
     unittest.expect(o.subAccountId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -8612,8 +8660,8 @@
 
 void checkUnnamed4188(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Dimension> buildUnnamed4189() {
@@ -8625,8 +8673,8 @@
 
 void checkUnnamed4189(core.List<api.Dimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimension(o[0]);
-  checkDimension(o[1]);
+  checkDimension(o[0] as api.Dimension);
+  checkDimension(o[1] as api.Dimension);
 }
 
 core.List<api.Metric> buildUnnamed4190() {
@@ -8638,8 +8686,8 @@
 
 void checkUnnamed4190(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.List<api.Metric> buildUnnamed4191() {
@@ -8651,8 +8699,8 @@
 
 void checkUnnamed4191(core.List<api.Metric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetric(o[0]);
-  checkMetric(o[1]);
+  checkMetric(o[0] as api.Metric);
+  checkMetric(o[1] as api.Metric);
 }
 
 core.int buildCounterReportCompatibleFields = 0;
@@ -8691,8 +8739,8 @@
 
 void checkUnnamed4192(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReport(o[0]);
-  checkReport(o[1]);
+  checkReport(o[0] as api.Report);
+  checkReport(o[1] as api.Report);
 }
 
 core.int buildCounterReportList = 0;
@@ -8737,7 +8785,8 @@
   buildCounterReportsConfiguration++;
   if (buildCounterReportsConfiguration < 3) {
     unittest.expect(o.exposureToConversionEnabled, unittest.isTrue);
-    checkLookbackConfiguration(o.lookbackConfiguration);
+    checkLookbackConfiguration(
+        o.lookbackConfiguration as api.LookbackConfiguration);
     unittest.expect(o.reportGenerationTimeZoneId, unittest.equals('foo'));
   }
   buildCounterReportsConfiguration--;
@@ -8759,7 +8808,7 @@
 void checkRichMediaExitOverride(api.RichMediaExitOverride o) {
   buildCounterRichMediaExitOverride++;
   if (buildCounterRichMediaExitOverride < 3) {
-    checkClickThroughUrl(o.clickThroughUrl);
+    checkClickThroughUrl(o.clickThroughUrl as api.ClickThroughUrl);
     unittest.expect(o.enabled, unittest.isTrue);
     unittest.expect(o.exitId, unittest.equals('foo'));
   }
@@ -8798,8 +8847,8 @@
 
 void checkUnnamed4193(core.List<api.SiteContact> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSiteContact(o[0]);
-  checkSiteContact(o[1]);
+  checkSiteContact(o[0] as api.SiteContact);
+  checkSiteContact(o[1] as api.SiteContact);
 }
 
 core.int buildCounterSite = 0;
@@ -8831,16 +8880,16 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.approved, unittest.isTrue);
     unittest.expect(o.directorySiteId, unittest.equals('foo'));
-    checkDimensionValue(o.directorySiteIdDimensionValue);
+    checkDimensionValue(o.directorySiteIdDimensionValue as api.DimensionValue);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDimensionValue(o.idDimensionValue);
+    checkDimensionValue(o.idDimensionValue as api.DimensionValue);
     unittest.expect(o.keyName, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4193(o.siteContacts);
-    checkSiteSettings(o.siteSettings);
+    checkSiteSettings(o.siteSettings as api.SiteSettings);
     unittest.expect(o.subaccountId, unittest.equals('foo'));
-    checkSiteVideoSettings(o.videoSettings);
+    checkSiteVideoSettings(o.videoSettings as api.SiteVideoSettings);
   }
   buildCounterSite--;
 }
@@ -8854,8 +8903,8 @@
 
 void checkUnnamed4194(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSize(o[0]);
-  checkSize(o[1]);
+  checkSize(o[0] as api.Size);
+  checkSize(o[1] as api.Size);
 }
 
 core.int buildCounterSiteCompanionSetting = 0;
@@ -8938,7 +8987,7 @@
     unittest.expect(o.activeViewOptOut, unittest.isTrue);
     unittest.expect(o.adBlockingOptOut, unittest.isTrue);
     unittest.expect(o.disableNewCookie, unittest.isTrue);
-    checkTagSetting(o.tagSetting);
+    checkTagSetting(o.tagSetting as api.TagSetting);
     unittest.expect(o.videoActiveViewOptOutTemplate, unittest.isTrue);
     unittest.expect(o.vpaidAdapterChoiceTemplate, unittest.equals('foo'));
   }
@@ -8963,8 +9012,8 @@
   buildCounterSiteSkippableSetting++;
   if (buildCounterSiteSkippableSetting < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkVideoOffset(o.progressOffset);
-    checkVideoOffset(o.skipOffset);
+    checkVideoOffset(o.progressOffset as api.VideoOffset);
+    checkVideoOffset(o.skipOffset as api.VideoOffset);
     unittest.expect(o.skippable, unittest.isTrue);
   }
   buildCounterSiteSkippableSetting--;
@@ -9024,13 +9073,13 @@
 void checkSiteVideoSettings(api.SiteVideoSettings o) {
   buildCounterSiteVideoSettings++;
   if (buildCounterSiteVideoSettings < 3) {
-    checkSiteCompanionSetting(o.companionSettings);
+    checkSiteCompanionSetting(o.companionSettings as api.SiteCompanionSetting);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.obaEnabled, unittest.isTrue);
-    checkObaIcon(o.obaSettings);
+    checkObaIcon(o.obaSettings as api.ObaIcon);
     unittest.expect(o.orientation, unittest.equals('foo'));
-    checkSiteSkippableSetting(o.skippableSettings);
-    checkSiteTranscodeSetting(o.transcodeSettings);
+    checkSiteSkippableSetting(o.skippableSettings as api.SiteSkippableSetting);
+    checkSiteTranscodeSetting(o.transcodeSettings as api.SiteTranscodeSetting);
   }
   buildCounterSiteVideoSettings--;
 }
@@ -9044,8 +9093,8 @@
 
 void checkUnnamed4196(core.List<api.Site> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSite(o[0]);
-  checkSite(o[1]);
+  checkSite(o[0] as api.Site);
+  checkSite(o[1] as api.Site);
 }
 
 core.int buildCounterSitesListResponse = 0;
@@ -9107,8 +9156,8 @@
 
 void checkUnnamed4197(core.List<api.Size> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSize(o[0]);
-  checkSize(o[1]);
+  checkSize(o[0] as api.Size);
+  checkSize(o[1] as api.Size);
 }
 
 core.int buildCounterSizesListResponse = 0;
@@ -9150,8 +9199,8 @@
   buildCounterSkippableSetting++;
   if (buildCounterSkippableSetting < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkVideoOffset(o.progressOffset);
-    checkVideoOffset(o.skipOffset);
+    checkVideoOffset(o.progressOffset as api.VideoOffset);
+    checkVideoOffset(o.skipOffset as api.VideoOffset);
     unittest.expect(o.skippable, unittest.isTrue);
   }
   buildCounterSkippableSetting--;
@@ -9229,8 +9278,8 @@
 
 void checkUnnamed4199(core.List<api.Subaccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubaccount(o[0]);
-  checkSubaccount(o[1]);
+  checkSubaccount(o[0] as api.Subaccount);
+  checkSubaccount(o[1] as api.Subaccount);
 }
 
 core.int buildCounterSubaccountsListResponse = 0;
@@ -9378,7 +9427,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.active, unittest.isTrue);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -9400,8 +9449,8 @@
 
 void checkUnnamed4200(core.List<api.TargetableRemarketingList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetableRemarketingList(o[0]);
-  checkTargetableRemarketingList(o[1]);
+  checkTargetableRemarketingList(o[0] as api.TargetableRemarketingList);
+  checkTargetableRemarketingList(o[1] as api.TargetableRemarketingList);
 }
 
 core.int buildCounterTargetableRemarketingListsListResponse = 0;
@@ -9457,17 +9506,19 @@
   if (buildCounterTargetingTemplate < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkDimensionValue(o.advertiserIdDimensionValue);
-    checkDayPartTargeting(o.dayPartTargeting);
-    checkGeoTargeting(o.geoTargeting);
+    checkDimensionValue(o.advertiserIdDimensionValue as api.DimensionValue);
+    checkDayPartTargeting(o.dayPartTargeting as api.DayPartTargeting);
+    checkGeoTargeting(o.geoTargeting as api.GeoTargeting);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkKeyValueTargetingExpression(o.keyValueTargetingExpression);
+    checkKeyValueTargetingExpression(
+        o.keyValueTargetingExpression as api.KeyValueTargetingExpression);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLanguageTargeting(o.languageTargeting);
-    checkListTargetingExpression(o.listTargetingExpression);
+    checkLanguageTargeting(o.languageTargeting as api.LanguageTargeting);
+    checkListTargetingExpression(
+        o.listTargetingExpression as api.ListTargetingExpression);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.subaccountId, unittest.equals('foo'));
-    checkTechnologyTargeting(o.technologyTargeting);
+    checkTechnologyTargeting(o.technologyTargeting as api.TechnologyTargeting);
   }
   buildCounterTargetingTemplate--;
 }
@@ -9481,8 +9532,8 @@
 
 void checkUnnamed4201(core.List<api.TargetingTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetingTemplate(o[0]);
-  checkTargetingTemplate(o[1]);
+  checkTargetingTemplate(o[0] as api.TargetingTemplate);
+  checkTargetingTemplate(o[1] as api.TargetingTemplate);
 }
 
 core.int buildCounterTargetingTemplatesListResponse = 0;
@@ -9517,8 +9568,8 @@
 
 void checkUnnamed4202(core.List<api.Browser> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBrowser(o[0]);
-  checkBrowser(o[1]);
+  checkBrowser(o[0] as api.Browser);
+  checkBrowser(o[1] as api.Browser);
 }
 
 core.List<api.ConnectionType> buildUnnamed4203() {
@@ -9530,8 +9581,8 @@
 
 void checkUnnamed4203(core.List<api.ConnectionType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConnectionType(o[0]);
-  checkConnectionType(o[1]);
+  checkConnectionType(o[0] as api.ConnectionType);
+  checkConnectionType(o[1] as api.ConnectionType);
 }
 
 core.List<api.MobileCarrier> buildUnnamed4204() {
@@ -9543,8 +9594,8 @@
 
 void checkUnnamed4204(core.List<api.MobileCarrier> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMobileCarrier(o[0]);
-  checkMobileCarrier(o[1]);
+  checkMobileCarrier(o[0] as api.MobileCarrier);
+  checkMobileCarrier(o[1] as api.MobileCarrier);
 }
 
 core.List<api.OperatingSystemVersion> buildUnnamed4205() {
@@ -9556,8 +9607,8 @@
 
 void checkUnnamed4205(core.List<api.OperatingSystemVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperatingSystemVersion(o[0]);
-  checkOperatingSystemVersion(o[1]);
+  checkOperatingSystemVersion(o[0] as api.OperatingSystemVersion);
+  checkOperatingSystemVersion(o[1] as api.OperatingSystemVersion);
 }
 
 core.List<api.OperatingSystem> buildUnnamed4206() {
@@ -9569,8 +9620,8 @@
 
 void checkUnnamed4206(core.List<api.OperatingSystem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperatingSystem(o[0]);
-  checkOperatingSystem(o[1]);
+  checkOperatingSystem(o[0] as api.OperatingSystem);
+  checkOperatingSystem(o[1] as api.OperatingSystem);
 }
 
 core.List<api.PlatformType> buildUnnamed4207() {
@@ -9582,8 +9633,8 @@
 
 void checkUnnamed4207(core.List<api.PlatformType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlatformType(o[0]);
-  checkPlatformType(o[1]);
+  checkPlatformType(o[0] as api.PlatformType);
+  checkPlatformType(o[1] as api.PlatformType);
 }
 
 core.int buildCounterTechnologyTargeting = 0;
@@ -9778,8 +9829,8 @@
 
 void checkUnnamed4209(core.List<api.UserProfile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserProfile(o[0]);
-  checkUserProfile(o[1]);
+  checkUserProfile(o[0] as api.UserProfile);
+  checkUserProfile(o[1] as api.UserProfile);
 }
 
 core.int buildCounterUserProfileList = 0;
@@ -9814,8 +9865,8 @@
 
 void checkUnnamed4210(core.List<api.UserRolePermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserRolePermission(o[0]);
-  checkUserRolePermission(o[1]);
+  checkUserRolePermission(o[0] as api.UserRolePermission);
+  checkUserRolePermission(o[1] as api.UserRolePermission);
 }
 
 core.int buildCounterUserRole = 0;
@@ -9910,8 +9961,8 @@
 
 void checkUnnamed4211(core.List<api.UserRolePermissionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserRolePermissionGroup(o[0]);
-  checkUserRolePermissionGroup(o[1]);
+  checkUserRolePermissionGroup(o[0] as api.UserRolePermissionGroup);
+  checkUserRolePermissionGroup(o[1] as api.UserRolePermissionGroup);
 }
 
 core.int buildCounterUserRolePermissionGroupsListResponse = 0;
@@ -9946,8 +9997,8 @@
 
 void checkUnnamed4212(core.List<api.UserRolePermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserRolePermission(o[0]);
-  checkUserRolePermission(o[1]);
+  checkUserRolePermission(o[0] as api.UserRolePermission);
+  checkUserRolePermission(o[1] as api.UserRolePermission);
 }
 
 core.int buildCounterUserRolePermissionsListResponse = 0;
@@ -9981,8 +10032,8 @@
 
 void checkUnnamed4213(core.List<api.UserRole> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserRole(o[0]);
-  checkUserRole(o[1]);
+  checkUserRole(o[0] as api.UserRole);
+  checkUserRole(o[1] as api.UserRole);
 }
 
 core.int buildCounterUserRolesListResponse = 0;
@@ -10029,7 +10080,7 @@
     unittest.expect(o.fileType, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSize(o.resolution);
+    checkSize(o.resolution as api.Size);
     unittest.expect(o.targetBitRate, unittest.equals(42));
   }
   buildCounterVideoFormat--;
@@ -10044,8 +10095,8 @@
 
 void checkUnnamed4214(core.List<api.VideoFormat> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoFormat(o[0]);
-  checkVideoFormat(o[1]);
+  checkVideoFormat(o[0] as api.VideoFormat);
+  checkVideoFormat(o[1] as api.VideoFormat);
 }
 
 core.int buildCounterVideoFormatsListResponse = 0;
@@ -10110,13 +10161,13 @@
 void checkVideoSettings(api.VideoSettings o) {
   buildCounterVideoSettings++;
   if (buildCounterVideoSettings < 3) {
-    checkCompanionSetting(o.companionSettings);
+    checkCompanionSetting(o.companionSettings as api.CompanionSetting);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.obaEnabled, unittest.isTrue);
-    checkObaIcon(o.obaSettings);
+    checkObaIcon(o.obaSettings as api.ObaIcon);
     unittest.expect(o.orientation, unittest.equals('foo'));
-    checkSkippableSetting(o.skippableSettings);
-    checkTranscodeSetting(o.transcodeSettings);
+    checkSkippableSetting(o.skippableSettings as api.SkippableSetting);
+    checkTranscodeSetting(o.transcodeSettings as api.TranscodeSetting);
   }
   buildCounterVideoSettings--;
 }
@@ -11309,7 +11360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -11317,7 +11368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountActiveAdSummary();
       var od = api.AccountActiveAdSummary.fromJson(o.toJson());
-      checkAccountActiveAdSummary(od);
+      checkAccountActiveAdSummary(od as api.AccountActiveAdSummary);
     });
   });
 
@@ -11325,7 +11376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountPermission();
       var od = api.AccountPermission.fromJson(o.toJson());
-      checkAccountPermission(od);
+      checkAccountPermission(od as api.AccountPermission);
     });
   });
 
@@ -11333,7 +11384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountPermissionGroup();
       var od = api.AccountPermissionGroup.fromJson(o.toJson());
-      checkAccountPermissionGroup(od);
+      checkAccountPermissionGroup(od as api.AccountPermissionGroup);
     });
   });
 
@@ -11341,7 +11392,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountPermissionGroupsListResponse();
       var od = api.AccountPermissionGroupsListResponse.fromJson(o.toJson());
-      checkAccountPermissionGroupsListResponse(od);
+      checkAccountPermissionGroupsListResponse(
+          od as api.AccountPermissionGroupsListResponse);
     });
   });
 
@@ -11349,7 +11401,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountPermissionsListResponse();
       var od = api.AccountPermissionsListResponse.fromJson(o.toJson());
-      checkAccountPermissionsListResponse(od);
+      checkAccountPermissionsListResponse(
+          od as api.AccountPermissionsListResponse);
     });
   });
 
@@ -11357,7 +11410,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountUserProfile();
       var od = api.AccountUserProfile.fromJson(o.toJson());
-      checkAccountUserProfile(od);
+      checkAccountUserProfile(od as api.AccountUserProfile);
     });
   });
 
@@ -11365,7 +11418,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountUserProfilesListResponse();
       var od = api.AccountUserProfilesListResponse.fromJson(o.toJson());
-      checkAccountUserProfilesListResponse(od);
+      checkAccountUserProfilesListResponse(
+          od as api.AccountUserProfilesListResponse);
     });
   });
 
@@ -11373,7 +11427,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountsListResponse();
       var od = api.AccountsListResponse.fromJson(o.toJson());
-      checkAccountsListResponse(od);
+      checkAccountsListResponse(od as api.AccountsListResponse);
     });
   });
 
@@ -11381,7 +11435,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivities();
       var od = api.Activities.fromJson(o.toJson());
-      checkActivities(od);
+      checkActivities(od as api.Activities);
     });
   });
 
@@ -11389,7 +11443,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAd();
       var od = api.Ad.fromJson(o.toJson());
-      checkAd(od);
+      checkAd(od as api.Ad);
     });
   });
 
@@ -11397,7 +11451,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdBlockingConfiguration();
       var od = api.AdBlockingConfiguration.fromJson(o.toJson());
-      checkAdBlockingConfiguration(od);
+      checkAdBlockingConfiguration(od as api.AdBlockingConfiguration);
     });
   });
 
@@ -11405,7 +11459,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdSlot();
       var od = api.AdSlot.fromJson(o.toJson());
-      checkAdSlot(od);
+      checkAdSlot(od as api.AdSlot);
     });
   });
 
@@ -11413,7 +11467,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdsListResponse();
       var od = api.AdsListResponse.fromJson(o.toJson());
-      checkAdsListResponse(od);
+      checkAdsListResponse(od as api.AdsListResponse);
     });
   });
 
@@ -11421,7 +11475,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiser();
       var od = api.Advertiser.fromJson(o.toJson());
-      checkAdvertiser(od);
+      checkAdvertiser(od as api.Advertiser);
     });
   });
 
@@ -11429,7 +11483,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserGroup();
       var od = api.AdvertiserGroup.fromJson(o.toJson());
-      checkAdvertiserGroup(od);
+      checkAdvertiserGroup(od as api.AdvertiserGroup);
     });
   });
 
@@ -11437,7 +11491,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserGroupsListResponse();
       var od = api.AdvertiserGroupsListResponse.fromJson(o.toJson());
-      checkAdvertiserGroupsListResponse(od);
+      checkAdvertiserGroupsListResponse(od as api.AdvertiserGroupsListResponse);
     });
   });
 
@@ -11445,7 +11499,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserLandingPagesListResponse();
       var od = api.AdvertiserLandingPagesListResponse.fromJson(o.toJson());
-      checkAdvertiserLandingPagesListResponse(od);
+      checkAdvertiserLandingPagesListResponse(
+          od as api.AdvertiserLandingPagesListResponse);
     });
   });
 
@@ -11453,7 +11508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertisersListResponse();
       var od = api.AdvertisersListResponse.fromJson(o.toJson());
-      checkAdvertisersListResponse(od);
+      checkAdvertisersListResponse(od as api.AdvertisersListResponse);
     });
   });
 
@@ -11461,7 +11516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAudienceSegment();
       var od = api.AudienceSegment.fromJson(o.toJson());
-      checkAudienceSegment(od);
+      checkAudienceSegment(od as api.AudienceSegment);
     });
   });
 
@@ -11469,7 +11524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAudienceSegmentGroup();
       var od = api.AudienceSegmentGroup.fromJson(o.toJson());
-      checkAudienceSegmentGroup(od);
+      checkAudienceSegmentGroup(od as api.AudienceSegmentGroup);
     });
   });
 
@@ -11477,7 +11532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBrowser();
       var od = api.Browser.fromJson(o.toJson());
-      checkBrowser(od);
+      checkBrowser(od as api.Browser);
     });
   });
 
@@ -11485,7 +11540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBrowsersListResponse();
       var od = api.BrowsersListResponse.fromJson(o.toJson());
-      checkBrowsersListResponse(od);
+      checkBrowsersListResponse(od as api.BrowsersListResponse);
     });
   });
 
@@ -11493,7 +11548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCampaign();
       var od = api.Campaign.fromJson(o.toJson());
-      checkCampaign(od);
+      checkCampaign(od as api.Campaign);
     });
   });
 
@@ -11501,7 +11556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCampaignCreativeAssociation();
       var od = api.CampaignCreativeAssociation.fromJson(o.toJson());
-      checkCampaignCreativeAssociation(od);
+      checkCampaignCreativeAssociation(od as api.CampaignCreativeAssociation);
     });
   });
 
@@ -11510,7 +11565,8 @@
       var o = buildCampaignCreativeAssociationsListResponse();
       var od =
           api.CampaignCreativeAssociationsListResponse.fromJson(o.toJson());
-      checkCampaignCreativeAssociationsListResponse(od);
+      checkCampaignCreativeAssociationsListResponse(
+          od as api.CampaignCreativeAssociationsListResponse);
     });
   });
 
@@ -11518,7 +11574,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCampaignManagerIds();
       var od = api.CampaignManagerIds.fromJson(o.toJson());
-      checkCampaignManagerIds(od);
+      checkCampaignManagerIds(od as api.CampaignManagerIds);
     });
   });
 
@@ -11526,7 +11582,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCampaignsListResponse();
       var od = api.CampaignsListResponse.fromJson(o.toJson());
-      checkCampaignsListResponse(od);
+      checkCampaignsListResponse(od as api.CampaignsListResponse);
     });
   });
 
@@ -11534,7 +11590,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChangeLog();
       var od = api.ChangeLog.fromJson(o.toJson());
-      checkChangeLog(od);
+      checkChangeLog(od as api.ChangeLog);
     });
   });
 
@@ -11542,7 +11598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChangeLogsListResponse();
       var od = api.ChangeLogsListResponse.fromJson(o.toJson());
-      checkChangeLogsListResponse(od);
+      checkChangeLogsListResponse(od as api.ChangeLogsListResponse);
     });
   });
 
@@ -11550,7 +11606,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelGrouping();
       var od = api.ChannelGrouping.fromJson(o.toJson());
-      checkChannelGrouping(od);
+      checkChannelGrouping(od as api.ChannelGrouping);
     });
   });
 
@@ -11558,7 +11614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelGroupingRule();
       var od = api.ChannelGroupingRule.fromJson(o.toJson());
-      checkChannelGroupingRule(od);
+      checkChannelGroupingRule(od as api.ChannelGroupingRule);
     });
   });
 
@@ -11566,7 +11622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCitiesListResponse();
       var od = api.CitiesListResponse.fromJson(o.toJson());
-      checkCitiesListResponse(od);
+      checkCitiesListResponse(od as api.CitiesListResponse);
     });
   });
 
@@ -11574,7 +11630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCity();
       var od = api.City.fromJson(o.toJson());
-      checkCity(od);
+      checkCity(od as api.City);
     });
   });
 
@@ -11582,7 +11638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClickTag();
       var od = api.ClickTag.fromJson(o.toJson());
-      checkClickTag(od);
+      checkClickTag(od as api.ClickTag);
     });
   });
 
@@ -11590,7 +11646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClickThroughUrl();
       var od = api.ClickThroughUrl.fromJson(o.toJson());
-      checkClickThroughUrl(od);
+      checkClickThroughUrl(od as api.ClickThroughUrl);
     });
   });
 
@@ -11598,7 +11654,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildClickThroughUrlSuffixProperties();
       var od = api.ClickThroughUrlSuffixProperties.fromJson(o.toJson());
-      checkClickThroughUrlSuffixProperties(od);
+      checkClickThroughUrlSuffixProperties(
+          od as api.ClickThroughUrlSuffixProperties);
     });
   });
 
@@ -11606,7 +11663,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompanionClickThroughOverride();
       var od = api.CompanionClickThroughOverride.fromJson(o.toJson());
-      checkCompanionClickThroughOverride(od);
+      checkCompanionClickThroughOverride(
+          od as api.CompanionClickThroughOverride);
     });
   });
 
@@ -11614,7 +11672,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompanionSetting();
       var od = api.CompanionSetting.fromJson(o.toJson());
-      checkCompanionSetting(od);
+      checkCompanionSetting(od as api.CompanionSetting);
     });
   });
 
@@ -11622,7 +11680,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompatibleFields();
       var od = api.CompatibleFields.fromJson(o.toJson());
-      checkCompatibleFields(od);
+      checkCompatibleFields(od as api.CompatibleFields);
     });
   });
 
@@ -11630,7 +11688,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConnectionType();
       var od = api.ConnectionType.fromJson(o.toJson());
-      checkConnectionType(od);
+      checkConnectionType(od as api.ConnectionType);
     });
   });
 
@@ -11638,7 +11696,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConnectionTypesListResponse();
       var od = api.ConnectionTypesListResponse.fromJson(o.toJson());
-      checkConnectionTypesListResponse(od);
+      checkConnectionTypesListResponse(od as api.ConnectionTypesListResponse);
     });
   });
 
@@ -11646,7 +11704,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildContentCategoriesListResponse();
       var od = api.ContentCategoriesListResponse.fromJson(o.toJson());
-      checkContentCategoriesListResponse(od);
+      checkContentCategoriesListResponse(
+          od as api.ContentCategoriesListResponse);
     });
   });
 
@@ -11654,7 +11713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContentCategory();
       var od = api.ContentCategory.fromJson(o.toJson());
-      checkContentCategory(od);
+      checkContentCategory(od as api.ContentCategory);
     });
   });
 
@@ -11662,7 +11721,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversion();
       var od = api.Conversion.fromJson(o.toJson());
-      checkConversion(od);
+      checkConversion(od as api.Conversion);
     });
   });
 
@@ -11670,7 +11729,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionError();
       var od = api.ConversionError.fromJson(o.toJson());
-      checkConversionError(od);
+      checkConversionError(od as api.ConversionError);
     });
   });
 
@@ -11678,7 +11737,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionStatus();
       var od = api.ConversionStatus.fromJson(o.toJson());
-      checkConversionStatus(od);
+      checkConversionStatus(od as api.ConversionStatus);
     });
   });
 
@@ -11686,7 +11745,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionsBatchInsertRequest();
       var od = api.ConversionsBatchInsertRequest.fromJson(o.toJson());
-      checkConversionsBatchInsertRequest(od);
+      checkConversionsBatchInsertRequest(
+          od as api.ConversionsBatchInsertRequest);
     });
   });
 
@@ -11694,7 +11754,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionsBatchInsertResponse();
       var od = api.ConversionsBatchInsertResponse.fromJson(o.toJson());
-      checkConversionsBatchInsertResponse(od);
+      checkConversionsBatchInsertResponse(
+          od as api.ConversionsBatchInsertResponse);
     });
   });
 
@@ -11702,7 +11763,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionsBatchUpdateRequest();
       var od = api.ConversionsBatchUpdateRequest.fromJson(o.toJson());
-      checkConversionsBatchUpdateRequest(od);
+      checkConversionsBatchUpdateRequest(
+          od as api.ConversionsBatchUpdateRequest);
     });
   });
 
@@ -11710,7 +11772,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionsBatchUpdateResponse();
       var od = api.ConversionsBatchUpdateResponse.fromJson(o.toJson());
-      checkConversionsBatchUpdateResponse(od);
+      checkConversionsBatchUpdateResponse(
+          od as api.ConversionsBatchUpdateResponse);
     });
   });
 
@@ -11718,7 +11781,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCountriesListResponse();
       var od = api.CountriesListResponse.fromJson(o.toJson());
-      checkCountriesListResponse(od);
+      checkCountriesListResponse(od as api.CountriesListResponse);
     });
   });
 
@@ -11726,7 +11789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCountry();
       var od = api.Country.fromJson(o.toJson());
-      checkCountry(od);
+      checkCountry(od as api.Country);
     });
   });
 
@@ -11734,7 +11797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreative();
       var od = api.Creative.fromJson(o.toJson());
-      checkCreative(od);
+      checkCreative(od as api.Creative);
     });
   });
 
@@ -11742,7 +11805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeAsset();
       var od = api.CreativeAsset.fromJson(o.toJson());
-      checkCreativeAsset(od);
+      checkCreativeAsset(od as api.CreativeAsset);
     });
   });
 
@@ -11750,7 +11813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeAssetId();
       var od = api.CreativeAssetId.fromJson(o.toJson());
-      checkCreativeAssetId(od);
+      checkCreativeAssetId(od as api.CreativeAssetId);
     });
   });
 
@@ -11758,7 +11821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeAssetMetadata();
       var od = api.CreativeAssetMetadata.fromJson(o.toJson());
-      checkCreativeAssetMetadata(od);
+      checkCreativeAssetMetadata(od as api.CreativeAssetMetadata);
     });
   });
 
@@ -11766,7 +11829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeAssetSelection();
       var od = api.CreativeAssetSelection.fromJson(o.toJson());
-      checkCreativeAssetSelection(od);
+      checkCreativeAssetSelection(od as api.CreativeAssetSelection);
     });
   });
 
@@ -11774,7 +11837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeAssignment();
       var od = api.CreativeAssignment.fromJson(o.toJson());
-      checkCreativeAssignment(od);
+      checkCreativeAssignment(od as api.CreativeAssignment);
     });
   });
 
@@ -11782,7 +11845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeClickThroughUrl();
       var od = api.CreativeClickThroughUrl.fromJson(o.toJson());
-      checkCreativeClickThroughUrl(od);
+      checkCreativeClickThroughUrl(od as api.CreativeClickThroughUrl);
     });
   });
 
@@ -11790,7 +11853,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeCustomEvent();
       var od = api.CreativeCustomEvent.fromJson(o.toJson());
-      checkCreativeCustomEvent(od);
+      checkCreativeCustomEvent(od as api.CreativeCustomEvent);
     });
   });
 
@@ -11798,7 +11861,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeField();
       var od = api.CreativeField.fromJson(o.toJson());
-      checkCreativeField(od);
+      checkCreativeField(od as api.CreativeField);
     });
   });
 
@@ -11806,7 +11869,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFieldAssignment();
       var od = api.CreativeFieldAssignment.fromJson(o.toJson());
-      checkCreativeFieldAssignment(od);
+      checkCreativeFieldAssignment(od as api.CreativeFieldAssignment);
     });
   });
 
@@ -11814,7 +11877,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFieldValue();
       var od = api.CreativeFieldValue.fromJson(o.toJson());
-      checkCreativeFieldValue(od);
+      checkCreativeFieldValue(od as api.CreativeFieldValue);
     });
   });
 
@@ -11822,7 +11885,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFieldValuesListResponse();
       var od = api.CreativeFieldValuesListResponse.fromJson(o.toJson());
-      checkCreativeFieldValuesListResponse(od);
+      checkCreativeFieldValuesListResponse(
+          od as api.CreativeFieldValuesListResponse);
     });
   });
 
@@ -11830,7 +11894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeFieldsListResponse();
       var od = api.CreativeFieldsListResponse.fromJson(o.toJson());
-      checkCreativeFieldsListResponse(od);
+      checkCreativeFieldsListResponse(od as api.CreativeFieldsListResponse);
     });
   });
 
@@ -11838,7 +11902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeGroup();
       var od = api.CreativeGroup.fromJson(o.toJson());
-      checkCreativeGroup(od);
+      checkCreativeGroup(od as api.CreativeGroup);
     });
   });
 
@@ -11846,7 +11910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeGroupAssignment();
       var od = api.CreativeGroupAssignment.fromJson(o.toJson());
-      checkCreativeGroupAssignment(od);
+      checkCreativeGroupAssignment(od as api.CreativeGroupAssignment);
     });
   });
 
@@ -11854,7 +11918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeGroupsListResponse();
       var od = api.CreativeGroupsListResponse.fromJson(o.toJson());
-      checkCreativeGroupsListResponse(od);
+      checkCreativeGroupsListResponse(od as api.CreativeGroupsListResponse);
     });
   });
 
@@ -11862,7 +11926,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeOptimizationConfiguration();
       var od = api.CreativeOptimizationConfiguration.fromJson(o.toJson());
-      checkCreativeOptimizationConfiguration(od);
+      checkCreativeOptimizationConfiguration(
+          od as api.CreativeOptimizationConfiguration);
     });
   });
 
@@ -11870,7 +11935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeRotation();
       var od = api.CreativeRotation.fromJson(o.toJson());
-      checkCreativeRotation(od);
+      checkCreativeRotation(od as api.CreativeRotation);
     });
   });
 
@@ -11878,7 +11943,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativesListResponse();
       var od = api.CreativesListResponse.fromJson(o.toJson());
-      checkCreativesListResponse(od);
+      checkCreativesListResponse(od as api.CreativesListResponse);
     });
   });
 
@@ -11887,7 +11952,8 @@
       var o = buildCrossDimensionReachReportCompatibleFields();
       var od =
           api.CrossDimensionReachReportCompatibleFields.fromJson(o.toJson());
-      checkCrossDimensionReachReportCompatibleFields(od);
+      checkCrossDimensionReachReportCompatibleFields(
+          od as api.CrossDimensionReachReportCompatibleFields);
     });
   });
 
@@ -11895,7 +11961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEvent();
       var od = api.CustomEvent.fromJson(o.toJson());
-      checkCustomEvent(od);
+      checkCustomEvent(od as api.CustomEvent);
     });
   });
 
@@ -11903,7 +11969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEventClickAnnotation();
       var od = api.CustomEventClickAnnotation.fromJson(o.toJson());
-      checkCustomEventClickAnnotation(od);
+      checkCustomEventClickAnnotation(od as api.CustomEventClickAnnotation);
     });
   });
 
@@ -11911,7 +11977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEventError();
       var od = api.CustomEventError.fromJson(o.toJson());
-      checkCustomEventError(od);
+      checkCustomEventError(od as api.CustomEventError);
     });
   });
 
@@ -11919,7 +11985,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEventImpressionAnnotation();
       var od = api.CustomEventImpressionAnnotation.fromJson(o.toJson());
-      checkCustomEventImpressionAnnotation(od);
+      checkCustomEventImpressionAnnotation(
+          od as api.CustomEventImpressionAnnotation);
     });
   });
 
@@ -11927,7 +11994,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEventInsert();
       var od = api.CustomEventInsert.fromJson(o.toJson());
-      checkCustomEventInsert(od);
+      checkCustomEventInsert(od as api.CustomEventInsert);
     });
   });
 
@@ -11935,7 +12002,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEventStatus();
       var od = api.CustomEventStatus.fromJson(o.toJson());
-      checkCustomEventStatus(od);
+      checkCustomEventStatus(od as api.CustomEventStatus);
     });
   });
 
@@ -11943,7 +12010,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEventsBatchInsertRequest();
       var od = api.CustomEventsBatchInsertRequest.fromJson(o.toJson());
-      checkCustomEventsBatchInsertRequest(od);
+      checkCustomEventsBatchInsertRequest(
+          od as api.CustomEventsBatchInsertRequest);
     });
   });
 
@@ -11951,7 +12019,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomEventsBatchInsertResponse();
       var od = api.CustomEventsBatchInsertResponse.fromJson(o.toJson());
-      checkCustomEventsBatchInsertResponse(od);
+      checkCustomEventsBatchInsertResponse(
+          od as api.CustomEventsBatchInsertResponse);
     });
   });
 
@@ -11959,7 +12028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomFloodlightVariable();
       var od = api.CustomFloodlightVariable.fromJson(o.toJson());
-      checkCustomFloodlightVariable(od);
+      checkCustomFloodlightVariable(od as api.CustomFloodlightVariable);
     });
   });
 
@@ -11967,7 +12036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomRichMediaEvents();
       var od = api.CustomRichMediaEvents.fromJson(o.toJson());
-      checkCustomRichMediaEvents(od);
+      checkCustomRichMediaEvents(od as api.CustomRichMediaEvents);
     });
   });
 
@@ -11975,7 +12044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomVariable();
       var od = api.CustomVariable.fromJson(o.toJson());
-      checkCustomVariable(od);
+      checkCustomVariable(od as api.CustomVariable);
     });
   });
 
@@ -11983,7 +12052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomViewabilityMetric();
       var od = api.CustomViewabilityMetric.fromJson(o.toJson());
-      checkCustomViewabilityMetric(od);
+      checkCustomViewabilityMetric(od as api.CustomViewabilityMetric);
     });
   });
 
@@ -11991,7 +12060,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomViewabilityMetricConfiguration();
       var od = api.CustomViewabilityMetricConfiguration.fromJson(o.toJson());
-      checkCustomViewabilityMetricConfiguration(od);
+      checkCustomViewabilityMetricConfiguration(
+          od as api.CustomViewabilityMetricConfiguration);
     });
   });
 
@@ -11999,7 +12069,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDV3Ids();
       var od = api.DV3Ids.fromJson(o.toJson());
-      checkDV3Ids(od);
+      checkDV3Ids(od as api.DV3Ids);
     });
   });
 
@@ -12007,7 +12077,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateRange();
       var od = api.DateRange.fromJson(o.toJson());
-      checkDateRange(od);
+      checkDateRange(od as api.DateRange);
     });
   });
 
@@ -12015,7 +12085,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDayPartTargeting();
       var od = api.DayPartTargeting.fromJson(o.toJson());
-      checkDayPartTargeting(od);
+      checkDayPartTargeting(od as api.DayPartTargeting);
     });
   });
 
@@ -12023,7 +12093,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeepLink();
       var od = api.DeepLink.fromJson(o.toJson());
-      checkDeepLink(od);
+      checkDeepLink(od as api.DeepLink);
     });
   });
 
@@ -12031,7 +12101,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDefaultClickThroughEventTagProperties();
       var od = api.DefaultClickThroughEventTagProperties.fromJson(o.toJson());
-      checkDefaultClickThroughEventTagProperties(od);
+      checkDefaultClickThroughEventTagProperties(
+          od as api.DefaultClickThroughEventTagProperties);
     });
   });
 
@@ -12039,7 +12110,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeliverySchedule();
       var od = api.DeliverySchedule.fromJson(o.toJson());
-      checkDeliverySchedule(od);
+      checkDeliverySchedule(od as api.DeliverySchedule);
     });
   });
 
@@ -12047,7 +12118,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDfpSettings();
       var od = api.DfpSettings.fromJson(o.toJson());
-      checkDfpSettings(od);
+      checkDfpSettings(od as api.DfpSettings);
     });
   });
 
@@ -12055,7 +12126,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimension();
       var od = api.Dimension.fromJson(o.toJson());
-      checkDimension(od);
+      checkDimension(od as api.Dimension);
     });
   });
 
@@ -12063,7 +12134,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionFilter();
       var od = api.DimensionFilter.fromJson(o.toJson());
-      checkDimensionFilter(od);
+      checkDimensionFilter(od as api.DimensionFilter);
     });
   });
 
@@ -12071,7 +12142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionValue();
       var od = api.DimensionValue.fromJson(o.toJson());
-      checkDimensionValue(od);
+      checkDimensionValue(od as api.DimensionValue);
     });
   });
 
@@ -12079,7 +12150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionValueList();
       var od = api.DimensionValueList.fromJson(o.toJson());
-      checkDimensionValueList(od);
+      checkDimensionValueList(od as api.DimensionValueList);
     });
   });
 
@@ -12087,7 +12158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionValueRequest();
       var od = api.DimensionValueRequest.fromJson(o.toJson());
-      checkDimensionValueRequest(od);
+      checkDimensionValueRequest(od as api.DimensionValueRequest);
     });
   });
 
@@ -12095,7 +12166,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectorySite();
       var od = api.DirectorySite.fromJson(o.toJson());
-      checkDirectorySite(od);
+      checkDirectorySite(od as api.DirectorySite);
     });
   });
 
@@ -12103,7 +12174,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectorySiteSettings();
       var od = api.DirectorySiteSettings.fromJson(o.toJson());
-      checkDirectorySiteSettings(od);
+      checkDirectorySiteSettings(od as api.DirectorySiteSettings);
     });
   });
 
@@ -12111,7 +12182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectorySitesListResponse();
       var od = api.DirectorySitesListResponse.fromJson(o.toJson());
-      checkDirectorySitesListResponse(od);
+      checkDirectorySitesListResponse(od as api.DirectorySitesListResponse);
     });
   });
 
@@ -12119,7 +12190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisjunctiveMatchStatement();
       var od = api.DisjunctiveMatchStatement.fromJson(o.toJson());
-      checkDisjunctiveMatchStatement(od);
+      checkDisjunctiveMatchStatement(od as api.DisjunctiveMatchStatement);
     });
   });
 
@@ -12127,7 +12198,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDynamicTargetingKey();
       var od = api.DynamicTargetingKey.fromJson(o.toJson());
-      checkDynamicTargetingKey(od);
+      checkDynamicTargetingKey(od as api.DynamicTargetingKey);
     });
   });
 
@@ -12135,7 +12206,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDynamicTargetingKeysListResponse();
       var od = api.DynamicTargetingKeysListResponse.fromJson(o.toJson());
-      checkDynamicTargetingKeysListResponse(od);
+      checkDynamicTargetingKeysListResponse(
+          od as api.DynamicTargetingKeysListResponse);
     });
   });
 
@@ -12143,7 +12215,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEncryptionInfo();
       var od = api.EncryptionInfo.fromJson(o.toJson());
-      checkEncryptionInfo(od);
+      checkEncryptionInfo(od as api.EncryptionInfo);
     });
   });
 
@@ -12151,7 +12223,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventFilter();
       var od = api.EventFilter.fromJson(o.toJson());
-      checkEventFilter(od);
+      checkEventFilter(od as api.EventFilter);
     });
   });
 
@@ -12159,7 +12231,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventTag();
       var od = api.EventTag.fromJson(o.toJson());
-      checkEventTag(od);
+      checkEventTag(od as api.EventTag);
     });
   });
 
@@ -12167,7 +12239,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventTagOverride();
       var od = api.EventTagOverride.fromJson(o.toJson());
-      checkEventTagOverride(od);
+      checkEventTagOverride(od as api.EventTagOverride);
     });
   });
 
@@ -12175,7 +12247,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventTagsListResponse();
       var od = api.EventTagsListResponse.fromJson(o.toJson());
-      checkEventTagsListResponse(od);
+      checkEventTagsListResponse(od as api.EventTagsListResponse);
     });
   });
 
@@ -12183,7 +12255,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileUrls();
       var od = api.FileUrls.fromJson(o.toJson());
-      checkFileUrls(od);
+      checkFileUrls(od as api.FileUrls);
     });
   });
 
@@ -12191,7 +12263,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFile();
       var od = api.File.fromJson(o.toJson());
-      checkFile(od);
+      checkFile(od as api.File);
     });
   });
 
@@ -12199,7 +12271,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileList();
       var od = api.FileList.fromJson(o.toJson());
-      checkFileList(od);
+      checkFileList(od as api.FileList);
     });
   });
 
@@ -12207,7 +12279,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFlight();
       var od = api.Flight.fromJson(o.toJson());
-      checkFlight(od);
+      checkFlight(od as api.Flight);
     });
   });
 
@@ -12215,7 +12287,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightActivitiesGenerateTagResponse();
       var od = api.FloodlightActivitiesGenerateTagResponse.fromJson(o.toJson());
-      checkFloodlightActivitiesGenerateTagResponse(od);
+      checkFloodlightActivitiesGenerateTagResponse(
+          od as api.FloodlightActivitiesGenerateTagResponse);
     });
   });
 
@@ -12223,7 +12296,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightActivitiesListResponse();
       var od = api.FloodlightActivitiesListResponse.fromJson(o.toJson());
-      checkFloodlightActivitiesListResponse(od);
+      checkFloodlightActivitiesListResponse(
+          od as api.FloodlightActivitiesListResponse);
     });
   });
 
@@ -12231,7 +12305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightActivity();
       var od = api.FloodlightActivity.fromJson(o.toJson());
-      checkFloodlightActivity(od);
+      checkFloodlightActivity(od as api.FloodlightActivity);
     });
   });
 
@@ -12239,7 +12313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightActivityDynamicTag();
       var od = api.FloodlightActivityDynamicTag.fromJson(o.toJson());
-      checkFloodlightActivityDynamicTag(od);
+      checkFloodlightActivityDynamicTag(od as api.FloodlightActivityDynamicTag);
     });
   });
 
@@ -12247,7 +12321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightActivityGroup();
       var od = api.FloodlightActivityGroup.fromJson(o.toJson());
-      checkFloodlightActivityGroup(od);
+      checkFloodlightActivityGroup(od as api.FloodlightActivityGroup);
     });
   });
 
@@ -12255,7 +12329,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightActivityGroupsListResponse();
       var od = api.FloodlightActivityGroupsListResponse.fromJson(o.toJson());
-      checkFloodlightActivityGroupsListResponse(od);
+      checkFloodlightActivityGroupsListResponse(
+          od as api.FloodlightActivityGroupsListResponse);
     });
   });
 
@@ -12263,7 +12338,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightActivityPublisherDynamicTag();
       var od = api.FloodlightActivityPublisherDynamicTag.fromJson(o.toJson());
-      checkFloodlightActivityPublisherDynamicTag(od);
+      checkFloodlightActivityPublisherDynamicTag(
+          od as api.FloodlightActivityPublisherDynamicTag);
     });
   });
 
@@ -12271,7 +12347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightConfiguration();
       var od = api.FloodlightConfiguration.fromJson(o.toJson());
-      checkFloodlightConfiguration(od);
+      checkFloodlightConfiguration(od as api.FloodlightConfiguration);
     });
   });
 
@@ -12279,7 +12355,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightConfigurationsListResponse();
       var od = api.FloodlightConfigurationsListResponse.fromJson(o.toJson());
-      checkFloodlightConfigurationsListResponse(od);
+      checkFloodlightConfigurationsListResponse(
+          od as api.FloodlightConfigurationsListResponse);
     });
   });
 
@@ -12287,7 +12364,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightReportCompatibleFields();
       var od = api.FloodlightReportCompatibleFields.fromJson(o.toJson());
-      checkFloodlightReportCompatibleFields(od);
+      checkFloodlightReportCompatibleFields(
+          od as api.FloodlightReportCompatibleFields);
     });
   });
 
@@ -12295,7 +12373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFrequencyCap();
       var od = api.FrequencyCap.fromJson(o.toJson());
-      checkFrequencyCap(od);
+      checkFrequencyCap(od as api.FrequencyCap);
     });
   });
 
@@ -12303,7 +12381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFsCommand();
       var od = api.FsCommand.fromJson(o.toJson());
-      checkFsCommand(od);
+      checkFsCommand(od as api.FsCommand);
     });
   });
 
@@ -12311,7 +12389,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeoTargeting();
       var od = api.GeoTargeting.fromJson(o.toJson());
-      checkGeoTargeting(od);
+      checkGeoTargeting(od as api.GeoTargeting);
     });
   });
 
@@ -12319,7 +12397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventoryItem();
       var od = api.InventoryItem.fromJson(o.toJson());
-      checkInventoryItem(od);
+      checkInventoryItem(od as api.InventoryItem);
     });
   });
 
@@ -12327,7 +12405,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventoryItemsListResponse();
       var od = api.InventoryItemsListResponse.fromJson(o.toJson());
-      checkInventoryItemsListResponse(od);
+      checkInventoryItemsListResponse(od as api.InventoryItemsListResponse);
     });
   });
 
@@ -12335,7 +12413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyValueTargetingExpression();
       var od = api.KeyValueTargetingExpression.fromJson(o.toJson());
-      checkKeyValueTargetingExpression(od);
+      checkKeyValueTargetingExpression(od as api.KeyValueTargetingExpression);
     });
   });
 
@@ -12343,7 +12421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLandingPage();
       var od = api.LandingPage.fromJson(o.toJson());
-      checkLandingPage(od);
+      checkLandingPage(od as api.LandingPage);
     });
   });
 
@@ -12351,7 +12429,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguage();
       var od = api.Language.fromJson(o.toJson());
-      checkLanguage(od);
+      checkLanguage(od as api.Language);
     });
   });
 
@@ -12359,7 +12437,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguageTargeting();
       var od = api.LanguageTargeting.fromJson(o.toJson());
-      checkLanguageTargeting(od);
+      checkLanguageTargeting(od as api.LanguageTargeting);
     });
   });
 
@@ -12367,7 +12445,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguagesListResponse();
       var od = api.LanguagesListResponse.fromJson(o.toJson());
-      checkLanguagesListResponse(od);
+      checkLanguagesListResponse(od as api.LanguagesListResponse);
     });
   });
 
@@ -12375,7 +12453,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLastModifiedInfo();
       var od = api.LastModifiedInfo.fromJson(o.toJson());
-      checkLastModifiedInfo(od);
+      checkLastModifiedInfo(od as api.LastModifiedInfo);
     });
   });
 
@@ -12383,7 +12461,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPopulationClause();
       var od = api.ListPopulationClause.fromJson(o.toJson());
-      checkListPopulationClause(od);
+      checkListPopulationClause(od as api.ListPopulationClause);
     });
   });
 
@@ -12391,7 +12469,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPopulationRule();
       var od = api.ListPopulationRule.fromJson(o.toJson());
-      checkListPopulationRule(od);
+      checkListPopulationRule(od as api.ListPopulationRule);
     });
   });
 
@@ -12399,7 +12477,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPopulationTerm();
       var od = api.ListPopulationTerm.fromJson(o.toJson());
-      checkListPopulationTerm(od);
+      checkListPopulationTerm(od as api.ListPopulationTerm);
     });
   });
 
@@ -12407,7 +12485,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTargetingExpression();
       var od = api.ListTargetingExpression.fromJson(o.toJson());
-      checkListTargetingExpression(od);
+      checkListTargetingExpression(od as api.ListTargetingExpression);
     });
   });
 
@@ -12415,7 +12493,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLookbackConfiguration();
       var od = api.LookbackConfiguration.fromJson(o.toJson());
-      checkLookbackConfiguration(od);
+      checkLookbackConfiguration(od as api.LookbackConfiguration);
     });
   });
 
@@ -12423,7 +12501,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetric();
       var od = api.Metric.fromJson(o.toJson());
-      checkMetric(od);
+      checkMetric(od as api.Metric);
     });
   });
 
@@ -12431,7 +12509,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetro();
       var od = api.Metro.fromJson(o.toJson());
-      checkMetro(od);
+      checkMetro(od as api.Metro);
     });
   });
 
@@ -12439,7 +12517,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetrosListResponse();
       var od = api.MetrosListResponse.fromJson(o.toJson());
-      checkMetrosListResponse(od);
+      checkMetrosListResponse(od as api.MetrosListResponse);
     });
   });
 
@@ -12447,7 +12525,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileApp();
       var od = api.MobileApp.fromJson(o.toJson());
-      checkMobileApp(od);
+      checkMobileApp(od as api.MobileApp);
     });
   });
 
@@ -12455,7 +12533,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileAppsListResponse();
       var od = api.MobileAppsListResponse.fromJson(o.toJson());
-      checkMobileAppsListResponse(od);
+      checkMobileAppsListResponse(od as api.MobileAppsListResponse);
     });
   });
 
@@ -12463,7 +12541,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileCarrier();
       var od = api.MobileCarrier.fromJson(o.toJson());
-      checkMobileCarrier(od);
+      checkMobileCarrier(od as api.MobileCarrier);
     });
   });
 
@@ -12471,7 +12549,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileCarriersListResponse();
       var od = api.MobileCarriersListResponse.fromJson(o.toJson());
-      checkMobileCarriersListResponse(od);
+      checkMobileCarriersListResponse(od as api.MobileCarriersListResponse);
     });
   });
 
@@ -12479,7 +12557,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObaIcon();
       var od = api.ObaIcon.fromJson(o.toJson());
-      checkObaIcon(od);
+      checkObaIcon(od as api.ObaIcon);
     });
   });
 
@@ -12487,7 +12565,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectFilter();
       var od = api.ObjectFilter.fromJson(o.toJson());
-      checkObjectFilter(od);
+      checkObjectFilter(od as api.ObjectFilter);
     });
   });
 
@@ -12495,7 +12573,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOffsetPosition();
       var od = api.OffsetPosition.fromJson(o.toJson());
-      checkOffsetPosition(od);
+      checkOffsetPosition(od as api.OffsetPosition);
     });
   });
 
@@ -12503,7 +12581,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOmnitureSettings();
       var od = api.OmnitureSettings.fromJson(o.toJson());
-      checkOmnitureSettings(od);
+      checkOmnitureSettings(od as api.OmnitureSettings);
     });
   });
 
@@ -12511,7 +12589,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperatingSystem();
       var od = api.OperatingSystem.fromJson(o.toJson());
-      checkOperatingSystem(od);
+      checkOperatingSystem(od as api.OperatingSystem);
     });
   });
 
@@ -12519,7 +12597,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperatingSystemVersion();
       var od = api.OperatingSystemVersion.fromJson(o.toJson());
-      checkOperatingSystemVersion(od);
+      checkOperatingSystemVersion(od as api.OperatingSystemVersion);
     });
   });
 
@@ -12527,7 +12605,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperatingSystemVersionsListResponse();
       var od = api.OperatingSystemVersionsListResponse.fromJson(o.toJson());
-      checkOperatingSystemVersionsListResponse(od);
+      checkOperatingSystemVersionsListResponse(
+          od as api.OperatingSystemVersionsListResponse);
     });
   });
 
@@ -12535,7 +12614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperatingSystemsListResponse();
       var od = api.OperatingSystemsListResponse.fromJson(o.toJson());
-      checkOperatingSystemsListResponse(od);
+      checkOperatingSystemsListResponse(od as api.OperatingSystemsListResponse);
     });
   });
 
@@ -12543,7 +12622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOptimizationActivity();
       var od = api.OptimizationActivity.fromJson(o.toJson());
-      checkOptimizationActivity(od);
+      checkOptimizationActivity(od as api.OptimizationActivity);
     });
   });
 
@@ -12551,7 +12630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrder();
       var od = api.Order.fromJson(o.toJson());
-      checkOrder(od);
+      checkOrder(od as api.Order);
     });
   });
 
@@ -12559,7 +12638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderContact();
       var od = api.OrderContact.fromJson(o.toJson());
-      checkOrderContact(od);
+      checkOrderContact(od as api.OrderContact);
     });
   });
 
@@ -12567,7 +12646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderDocument();
       var od = api.OrderDocument.fromJson(o.toJson());
-      checkOrderDocument(od);
+      checkOrderDocument(od as api.OrderDocument);
     });
   });
 
@@ -12575,7 +12654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrderDocumentsListResponse();
       var od = api.OrderDocumentsListResponse.fromJson(o.toJson());
-      checkOrderDocumentsListResponse(od);
+      checkOrderDocumentsListResponse(od as api.OrderDocumentsListResponse);
     });
   });
 
@@ -12583,7 +12662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrdersListResponse();
       var od = api.OrdersListResponse.fromJson(o.toJson());
-      checkOrdersListResponse(od);
+      checkOrdersListResponse(od as api.OrdersListResponse);
     });
   });
 
@@ -12591,7 +12670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathFilter();
       var od = api.PathFilter.fromJson(o.toJson());
-      checkPathFilter(od);
+      checkPathFilter(od as api.PathFilter);
     });
   });
 
@@ -12599,7 +12678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathReportCompatibleFields();
       var od = api.PathReportCompatibleFields.fromJson(o.toJson());
-      checkPathReportCompatibleFields(od);
+      checkPathReportCompatibleFields(od as api.PathReportCompatibleFields);
     });
   });
 
@@ -12607,7 +12686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathReportDimensionValue();
       var od = api.PathReportDimensionValue.fromJson(o.toJson());
-      checkPathReportDimensionValue(od);
+      checkPathReportDimensionValue(od as api.PathReportDimensionValue);
     });
   });
 
@@ -12615,7 +12694,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathToConversionReportCompatibleFields();
       var od = api.PathToConversionReportCompatibleFields.fromJson(o.toJson());
-      checkPathToConversionReportCompatibleFields(od);
+      checkPathToConversionReportCompatibleFields(
+          od as api.PathToConversionReportCompatibleFields);
     });
   });
 
@@ -12623,7 +12703,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacement();
       var od = api.Placement.fromJson(o.toJson());
-      checkPlacement(od);
+      checkPlacement(od as api.Placement);
     });
   });
 
@@ -12631,7 +12711,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementAssignment();
       var od = api.PlacementAssignment.fromJson(o.toJson());
-      checkPlacementAssignment(od);
+      checkPlacementAssignment(od as api.PlacementAssignment);
     });
   });
 
@@ -12639,7 +12719,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementGroup();
       var od = api.PlacementGroup.fromJson(o.toJson());
-      checkPlacementGroup(od);
+      checkPlacementGroup(od as api.PlacementGroup);
     });
   });
 
@@ -12647,7 +12727,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementGroupsListResponse();
       var od = api.PlacementGroupsListResponse.fromJson(o.toJson());
-      checkPlacementGroupsListResponse(od);
+      checkPlacementGroupsListResponse(od as api.PlacementGroupsListResponse);
     });
   });
 
@@ -12655,7 +12735,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementStrategiesListResponse();
       var od = api.PlacementStrategiesListResponse.fromJson(o.toJson());
-      checkPlacementStrategiesListResponse(od);
+      checkPlacementStrategiesListResponse(
+          od as api.PlacementStrategiesListResponse);
     });
   });
 
@@ -12663,7 +12744,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementStrategy();
       var od = api.PlacementStrategy.fromJson(o.toJson());
-      checkPlacementStrategy(od);
+      checkPlacementStrategy(od as api.PlacementStrategy);
     });
   });
 
@@ -12671,7 +12752,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementTag();
       var od = api.PlacementTag.fromJson(o.toJson());
-      checkPlacementTag(od);
+      checkPlacementTag(od as api.PlacementTag);
     });
   });
 
@@ -12679,7 +12760,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementsGenerateTagsResponse();
       var od = api.PlacementsGenerateTagsResponse.fromJson(o.toJson());
-      checkPlacementsGenerateTagsResponse(od);
+      checkPlacementsGenerateTagsResponse(
+          od as api.PlacementsGenerateTagsResponse);
     });
   });
 
@@ -12687,7 +12769,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlacementsListResponse();
       var od = api.PlacementsListResponse.fromJson(o.toJson());
-      checkPlacementsListResponse(od);
+      checkPlacementsListResponse(od as api.PlacementsListResponse);
     });
   });
 
@@ -12695,7 +12777,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlatformType();
       var od = api.PlatformType.fromJson(o.toJson());
-      checkPlatformType(od);
+      checkPlatformType(od as api.PlatformType);
     });
   });
 
@@ -12703,7 +12785,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlatformTypesListResponse();
       var od = api.PlatformTypesListResponse.fromJson(o.toJson());
-      checkPlatformTypesListResponse(od);
+      checkPlatformTypesListResponse(od as api.PlatformTypesListResponse);
     });
   });
 
@@ -12711,7 +12793,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPopupWindowProperties();
       var od = api.PopupWindowProperties.fromJson(o.toJson());
-      checkPopupWindowProperties(od);
+      checkPopupWindowProperties(od as api.PopupWindowProperties);
     });
   });
 
@@ -12719,7 +12801,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostalCode();
       var od = api.PostalCode.fromJson(o.toJson());
-      checkPostalCode(od);
+      checkPostalCode(od as api.PostalCode);
     });
   });
 
@@ -12727,7 +12809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostalCodesListResponse();
       var od = api.PostalCodesListResponse.fromJson(o.toJson());
-      checkPostalCodesListResponse(od);
+      checkPostalCodesListResponse(od as api.PostalCodesListResponse);
     });
   });
 
@@ -12735,7 +12817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPricing();
       var od = api.Pricing.fromJson(o.toJson());
-      checkPricing(od);
+      checkPricing(od as api.Pricing);
     });
   });
 
@@ -12743,7 +12825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPricingSchedule();
       var od = api.PricingSchedule.fromJson(o.toJson());
-      checkPricingSchedule(od);
+      checkPricingSchedule(od as api.PricingSchedule);
     });
   });
 
@@ -12751,7 +12833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPricingSchedulePricingPeriod();
       var od = api.PricingSchedulePricingPeriod.fromJson(o.toJson());
-      checkPricingSchedulePricingPeriod(od);
+      checkPricingSchedulePricingPeriod(od as api.PricingSchedulePricingPeriod);
     });
   });
 
@@ -12759,7 +12841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProject();
       var od = api.Project.fromJson(o.toJson());
-      checkProject(od);
+      checkProject(od as api.Project);
     });
   });
 
@@ -12767,7 +12849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectsListResponse();
       var od = api.ProjectsListResponse.fromJson(o.toJson());
-      checkProjectsListResponse(od);
+      checkProjectsListResponse(od as api.ProjectsListResponse);
     });
   });
 
@@ -12775,7 +12857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReachReportCompatibleFields();
       var od = api.ReachReportCompatibleFields.fromJson(o.toJson());
-      checkReachReportCompatibleFields(od);
+      checkReachReportCompatibleFields(od as api.ReachReportCompatibleFields);
     });
   });
 
@@ -12783,7 +12865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecipient();
       var od = api.Recipient.fromJson(o.toJson());
-      checkRecipient(od);
+      checkRecipient(od as api.Recipient);
     });
   });
 
@@ -12791,7 +12873,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegion();
       var od = api.Region.fromJson(o.toJson());
-      checkRegion(od);
+      checkRegion(od as api.Region);
     });
   });
 
@@ -12799,7 +12881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegionsListResponse();
       var od = api.RegionsListResponse.fromJson(o.toJson());
-      checkRegionsListResponse(od);
+      checkRegionsListResponse(od as api.RegionsListResponse);
     });
   });
 
@@ -12807,7 +12889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemarketingList();
       var od = api.RemarketingList.fromJson(o.toJson());
-      checkRemarketingList(od);
+      checkRemarketingList(od as api.RemarketingList);
     });
   });
 
@@ -12815,7 +12897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemarketingListShare();
       var od = api.RemarketingListShare.fromJson(o.toJson());
-      checkRemarketingListShare(od);
+      checkRemarketingListShare(od as api.RemarketingListShare);
     });
   });
 
@@ -12823,7 +12905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemarketingListsListResponse();
       var od = api.RemarketingListsListResponse.fromJson(o.toJson());
-      checkRemarketingListsListResponse(od);
+      checkRemarketingListsListResponse(od as api.RemarketingListsListResponse);
     });
   });
 
@@ -12831,7 +12913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportCriteria();
       var od = api.ReportCriteria.fromJson(o.toJson());
-      checkReportCriteria(od);
+      checkReportCriteria(od as api.ReportCriteria);
     });
   });
 
@@ -12839,7 +12921,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportCrossDimensionReachCriteria();
       var od = api.ReportCrossDimensionReachCriteria.fromJson(o.toJson());
-      checkReportCrossDimensionReachCriteria(od);
+      checkReportCrossDimensionReachCriteria(
+          od as api.ReportCrossDimensionReachCriteria);
     });
   });
 
@@ -12847,7 +12930,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportDelivery();
       var od = api.ReportDelivery.fromJson(o.toJson());
-      checkReportDelivery(od);
+      checkReportDelivery(od as api.ReportDelivery);
     });
   });
 
@@ -12856,7 +12939,8 @@
       var o = buildReportFloodlightCriteriaReportProperties();
       var od =
           api.ReportFloodlightCriteriaReportProperties.fromJson(o.toJson());
-      checkReportFloodlightCriteriaReportProperties(od);
+      checkReportFloodlightCriteriaReportProperties(
+          od as api.ReportFloodlightCriteriaReportProperties);
     });
   });
 
@@ -12864,7 +12948,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportFloodlightCriteria();
       var od = api.ReportFloodlightCriteria.fromJson(o.toJson());
-      checkReportFloodlightCriteria(od);
+      checkReportFloodlightCriteria(od as api.ReportFloodlightCriteria);
     });
   });
 
@@ -12872,7 +12956,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportPathAttributionCriteria();
       var od = api.ReportPathAttributionCriteria.fromJson(o.toJson());
-      checkReportPathAttributionCriteria(od);
+      checkReportPathAttributionCriteria(
+          od as api.ReportPathAttributionCriteria);
     });
   });
 
@@ -12880,7 +12965,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportPathCriteria();
       var od = api.ReportPathCriteria.fromJson(o.toJson());
-      checkReportPathCriteria(od);
+      checkReportPathCriteria(od as api.ReportPathCriteria);
     });
   });
 
@@ -12890,7 +12975,8 @@
       var o = buildReportPathToConversionCriteriaReportProperties();
       var od = api.ReportPathToConversionCriteriaReportProperties.fromJson(
           o.toJson());
-      checkReportPathToConversionCriteriaReportProperties(od);
+      checkReportPathToConversionCriteriaReportProperties(
+          od as api.ReportPathToConversionCriteriaReportProperties);
     });
   });
 
@@ -12898,7 +12984,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportPathToConversionCriteria();
       var od = api.ReportPathToConversionCriteria.fromJson(o.toJson());
-      checkReportPathToConversionCriteria(od);
+      checkReportPathToConversionCriteria(
+          od as api.ReportPathToConversionCriteria);
     });
   });
 
@@ -12906,7 +12993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportReachCriteria();
       var od = api.ReportReachCriteria.fromJson(o.toJson());
-      checkReportReachCriteria(od);
+      checkReportReachCriteria(od as api.ReportReachCriteria);
     });
   });
 
@@ -12914,7 +13001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportSchedule();
       var od = api.ReportSchedule.fromJson(o.toJson());
-      checkReportSchedule(od);
+      checkReportSchedule(od as api.ReportSchedule);
     });
   });
 
@@ -12922,7 +13009,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReport();
       var od = api.Report.fromJson(o.toJson());
-      checkReport(od);
+      checkReport(od as api.Report);
     });
   });
 
@@ -12930,7 +13017,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportCompatibleFields();
       var od = api.ReportCompatibleFields.fromJson(o.toJson());
-      checkReportCompatibleFields(od);
+      checkReportCompatibleFields(od as api.ReportCompatibleFields);
     });
   });
 
@@ -12938,7 +13025,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportList();
       var od = api.ReportList.fromJson(o.toJson());
-      checkReportList(od);
+      checkReportList(od as api.ReportList);
     });
   });
 
@@ -12946,7 +13033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportsConfiguration();
       var od = api.ReportsConfiguration.fromJson(o.toJson());
-      checkReportsConfiguration(od);
+      checkReportsConfiguration(od as api.ReportsConfiguration);
     });
   });
 
@@ -12954,7 +13041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRichMediaExitOverride();
       var od = api.RichMediaExitOverride.fromJson(o.toJson());
-      checkRichMediaExitOverride(od);
+      checkRichMediaExitOverride(od as api.RichMediaExitOverride);
     });
   });
 
@@ -12962,7 +13049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRule();
       var od = api.Rule.fromJson(o.toJson());
-      checkRule(od);
+      checkRule(od as api.Rule);
     });
   });
 
@@ -12970,7 +13057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSite();
       var od = api.Site.fromJson(o.toJson());
-      checkSite(od);
+      checkSite(od as api.Site);
     });
   });
 
@@ -12978,7 +13065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteCompanionSetting();
       var od = api.SiteCompanionSetting.fromJson(o.toJson());
-      checkSiteCompanionSetting(od);
+      checkSiteCompanionSetting(od as api.SiteCompanionSetting);
     });
   });
 
@@ -12986,7 +13073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteContact();
       var od = api.SiteContact.fromJson(o.toJson());
-      checkSiteContact(od);
+      checkSiteContact(od as api.SiteContact);
     });
   });
 
@@ -12994,7 +13081,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteSettings();
       var od = api.SiteSettings.fromJson(o.toJson());
-      checkSiteSettings(od);
+      checkSiteSettings(od as api.SiteSettings);
     });
   });
 
@@ -13002,7 +13089,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteSkippableSetting();
       var od = api.SiteSkippableSetting.fromJson(o.toJson());
-      checkSiteSkippableSetting(od);
+      checkSiteSkippableSetting(od as api.SiteSkippableSetting);
     });
   });
 
@@ -13010,7 +13097,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteTranscodeSetting();
       var od = api.SiteTranscodeSetting.fromJson(o.toJson());
-      checkSiteTranscodeSetting(od);
+      checkSiteTranscodeSetting(od as api.SiteTranscodeSetting);
     });
   });
 
@@ -13018,7 +13105,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteVideoSettings();
       var od = api.SiteVideoSettings.fromJson(o.toJson());
-      checkSiteVideoSettings(od);
+      checkSiteVideoSettings(od as api.SiteVideoSettings);
     });
   });
 
@@ -13026,7 +13113,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSitesListResponse();
       var od = api.SitesListResponse.fromJson(o.toJson());
-      checkSitesListResponse(od);
+      checkSitesListResponse(od as api.SitesListResponse);
     });
   });
 
@@ -13034,7 +13121,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSize();
       var od = api.Size.fromJson(o.toJson());
-      checkSize(od);
+      checkSize(od as api.Size);
     });
   });
 
@@ -13042,7 +13129,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSizesListResponse();
       var od = api.SizesListResponse.fromJson(o.toJson());
-      checkSizesListResponse(od);
+      checkSizesListResponse(od as api.SizesListResponse);
     });
   });
 
@@ -13050,7 +13137,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSkippableSetting();
       var od = api.SkippableSetting.fromJson(o.toJson());
-      checkSkippableSetting(od);
+      checkSkippableSetting(od as api.SkippableSetting);
     });
   });
 
@@ -13058,7 +13145,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSortedDimension();
       var od = api.SortedDimension.fromJson(o.toJson());
-      checkSortedDimension(od);
+      checkSortedDimension(od as api.SortedDimension);
     });
   });
 
@@ -13066,7 +13153,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubaccount();
       var od = api.Subaccount.fromJson(o.toJson());
-      checkSubaccount(od);
+      checkSubaccount(od as api.Subaccount);
     });
   });
 
@@ -13074,7 +13161,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubaccountsListResponse();
       var od = api.SubaccountsListResponse.fromJson(o.toJson());
-      checkSubaccountsListResponse(od);
+      checkSubaccountsListResponse(od as api.SubaccountsListResponse);
     });
   });
 
@@ -13082,7 +13169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTagData();
       var od = api.TagData.fromJson(o.toJson());
-      checkTagData(od);
+      checkTagData(od as api.TagData);
     });
   });
 
@@ -13090,7 +13177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTagSetting();
       var od = api.TagSetting.fromJson(o.toJson());
-      checkTagSetting(od);
+      checkTagSetting(od as api.TagSetting);
     });
   });
 
@@ -13098,7 +13185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTagSettings();
       var od = api.TagSettings.fromJson(o.toJson());
-      checkTagSettings(od);
+      checkTagSettings(od as api.TagSettings);
     });
   });
 
@@ -13106,7 +13193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetWindow();
       var od = api.TargetWindow.fromJson(o.toJson());
-      checkTargetWindow(od);
+      checkTargetWindow(od as api.TargetWindow);
     });
   });
 
@@ -13114,7 +13201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetableRemarketingList();
       var od = api.TargetableRemarketingList.fromJson(o.toJson());
-      checkTargetableRemarketingList(od);
+      checkTargetableRemarketingList(od as api.TargetableRemarketingList);
     });
   });
 
@@ -13122,7 +13209,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetableRemarketingListsListResponse();
       var od = api.TargetableRemarketingListsListResponse.fromJson(o.toJson());
-      checkTargetableRemarketingListsListResponse(od);
+      checkTargetableRemarketingListsListResponse(
+          od as api.TargetableRemarketingListsListResponse);
     });
   });
 
@@ -13130,7 +13218,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingTemplate();
       var od = api.TargetingTemplate.fromJson(o.toJson());
-      checkTargetingTemplate(od);
+      checkTargetingTemplate(od as api.TargetingTemplate);
     });
   });
 
@@ -13138,7 +13226,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingTemplatesListResponse();
       var od = api.TargetingTemplatesListResponse.fromJson(o.toJson());
-      checkTargetingTemplatesListResponse(od);
+      checkTargetingTemplatesListResponse(
+          od as api.TargetingTemplatesListResponse);
     });
   });
 
@@ -13146,7 +13235,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTechnologyTargeting();
       var od = api.TechnologyTargeting.fromJson(o.toJson());
-      checkTechnologyTargeting(od);
+      checkTechnologyTargeting(od as api.TechnologyTargeting);
     });
   });
 
@@ -13154,7 +13243,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyAuthenticationToken();
       var od = api.ThirdPartyAuthenticationToken.fromJson(o.toJson());
-      checkThirdPartyAuthenticationToken(od);
+      checkThirdPartyAuthenticationToken(
+          od as api.ThirdPartyAuthenticationToken);
     });
   });
 
@@ -13162,7 +13252,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyTrackingUrl();
       var od = api.ThirdPartyTrackingUrl.fromJson(o.toJson());
-      checkThirdPartyTrackingUrl(od);
+      checkThirdPartyTrackingUrl(od as api.ThirdPartyTrackingUrl);
     });
   });
 
@@ -13170,7 +13260,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTranscodeSetting();
       var od = api.TranscodeSetting.fromJson(o.toJson());
-      checkTranscodeSetting(od);
+      checkTranscodeSetting(od as api.TranscodeSetting);
     });
   });
 
@@ -13178,7 +13268,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUniversalAdId();
       var od = api.UniversalAdId.fromJson(o.toJson());
-      checkUniversalAdId(od);
+      checkUniversalAdId(od as api.UniversalAdId);
     });
   });
 
@@ -13186,7 +13276,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserDefinedVariableConfiguration();
       var od = api.UserDefinedVariableConfiguration.fromJson(o.toJson());
-      checkUserDefinedVariableConfiguration(od);
+      checkUserDefinedVariableConfiguration(
+          od as api.UserDefinedVariableConfiguration);
     });
   });
 
@@ -13194,7 +13285,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserProfile();
       var od = api.UserProfile.fromJson(o.toJson());
-      checkUserProfile(od);
+      checkUserProfile(od as api.UserProfile);
     });
   });
 
@@ -13202,7 +13293,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserProfileList();
       var od = api.UserProfileList.fromJson(o.toJson());
-      checkUserProfileList(od);
+      checkUserProfileList(od as api.UserProfileList);
     });
   });
 
@@ -13210,7 +13301,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRole();
       var od = api.UserRole.fromJson(o.toJson());
-      checkUserRole(od);
+      checkUserRole(od as api.UserRole);
     });
   });
 
@@ -13218,7 +13309,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRolePermission();
       var od = api.UserRolePermission.fromJson(o.toJson());
-      checkUserRolePermission(od);
+      checkUserRolePermission(od as api.UserRolePermission);
     });
   });
 
@@ -13226,7 +13317,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRolePermissionGroup();
       var od = api.UserRolePermissionGroup.fromJson(o.toJson());
-      checkUserRolePermissionGroup(od);
+      checkUserRolePermissionGroup(od as api.UserRolePermissionGroup);
     });
   });
 
@@ -13234,7 +13325,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRolePermissionGroupsListResponse();
       var od = api.UserRolePermissionGroupsListResponse.fromJson(o.toJson());
-      checkUserRolePermissionGroupsListResponse(od);
+      checkUserRolePermissionGroupsListResponse(
+          od as api.UserRolePermissionGroupsListResponse);
     });
   });
 
@@ -13242,7 +13334,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRolePermissionsListResponse();
       var od = api.UserRolePermissionsListResponse.fromJson(o.toJson());
-      checkUserRolePermissionsListResponse(od);
+      checkUserRolePermissionsListResponse(
+          od as api.UserRolePermissionsListResponse);
     });
   });
 
@@ -13250,7 +13343,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserRolesListResponse();
       var od = api.UserRolesListResponse.fromJson(o.toJson());
-      checkUserRolesListResponse(od);
+      checkUserRolesListResponse(od as api.UserRolesListResponse);
     });
   });
 
@@ -13258,7 +13351,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoFormat();
       var od = api.VideoFormat.fromJson(o.toJson());
-      checkVideoFormat(od);
+      checkVideoFormat(od as api.VideoFormat);
     });
   });
 
@@ -13266,7 +13359,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoFormatsListResponse();
       var od = api.VideoFormatsListResponse.fromJson(o.toJson());
-      checkVideoFormatsListResponse(od);
+      checkVideoFormatsListResponse(od as api.VideoFormatsListResponse);
     });
   });
 
@@ -13274,7 +13367,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoOffset();
       var od = api.VideoOffset.fromJson(o.toJson());
-      checkVideoOffset(od);
+      checkVideoOffset(od as api.VideoOffset);
     });
   });
 
@@ -13282,7 +13375,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoSettings();
       var od = api.VideoSettings.fromJson(o.toJson());
-      checkVideoSettings(od);
+      checkVideoSettings(od as api.VideoSettings);
     });
   });
 
@@ -13346,7 +13439,7 @@
       res
           .get(arg_profileId, arg_summaryAccountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountActiveAdSummary(response);
+        checkAccountActiveAdSummary(response as api.AccountActiveAdSummary);
       })));
     });
   });
@@ -13411,7 +13504,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountPermissionGroup(response);
+        checkAccountPermissionGroup(response as api.AccountPermissionGroup);
       })));
     });
 
@@ -13471,7 +13564,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountPermissionGroupsListResponse(response);
+        checkAccountPermissionGroupsListResponse(
+            response as api.AccountPermissionGroupsListResponse);
       })));
     });
   });
@@ -13536,7 +13630,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountPermission(response);
+        checkAccountPermission(response as api.AccountPermission);
       })));
     });
 
@@ -13595,7 +13689,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountPermissionsListResponse(response);
+        checkAccountPermissionsListResponse(
+            response as api.AccountPermissionsListResponse);
       })));
     });
   });
@@ -13660,7 +13755,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountUserProfile(response);
+        checkAccountUserProfile(response as api.AccountUserProfile);
       })));
     });
 
@@ -13671,8 +13766,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountUserProfile.fromJson(json);
-        checkAccountUserProfile(obj);
+        var obj = api.AccountUserProfile.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountUserProfile(obj as api.AccountUserProfile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13723,7 +13819,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountUserProfile(response);
+        checkAccountUserProfile(response as api.AccountUserProfile);
       })));
     });
 
@@ -13818,7 +13914,8 @@
               userRoleId: arg_userRoleId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountUserProfilesListResponse(response);
+        checkAccountUserProfilesListResponse(
+            response as api.AccountUserProfilesListResponse);
       })));
     });
 
@@ -13830,8 +13927,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountUserProfile.fromJson(json);
-        checkAccountUserProfile(obj);
+        var obj = api.AccountUserProfile.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountUserProfile(obj as api.AccountUserProfile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13883,7 +13981,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountUserProfile(response);
+        checkAccountUserProfile(response as api.AccountUserProfile);
       })));
     });
 
@@ -13894,8 +13992,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AccountUserProfile.fromJson(json);
-        checkAccountUserProfile(obj);
+        var obj = api.AccountUserProfile.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAccountUserProfile(obj as api.AccountUserProfile);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13946,7 +14045,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountUserProfile(response);
+        checkAccountUserProfile(response as api.AccountUserProfile);
       })));
     });
   });
@@ -14011,7 +14110,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -14098,7 +14197,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccountsListResponse(response);
+        checkAccountsListResponse(response as api.AccountsListResponse);
       })));
     });
 
@@ -14110,8 +14209,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14163,7 +14263,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -14174,8 +14274,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14226,7 +14327,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
   });
@@ -14291,7 +14392,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAd(response);
+        checkAd(response as api.Ad);
       })));
     });
 
@@ -14302,8 +14403,8 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Ad.fromJson(json);
-        checkAd(obj);
+        var obj = api.Ad.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAd(obj as api.Ad);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14354,7 +14455,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAd(response);
+        checkAd(response as api.Ad);
       })));
     });
 
@@ -14504,7 +14605,7 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdsListResponse(response);
+        checkAdsListResponse(response as api.AdsListResponse);
       })));
     });
 
@@ -14516,8 +14617,8 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Ad.fromJson(json);
-        checkAd(obj);
+        var obj = api.Ad.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAd(obj as api.Ad);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14569,7 +14670,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAd(response);
+        checkAd(response as api.Ad);
       })));
     });
 
@@ -14580,8 +14681,8 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Ad.fromJson(json);
-        checkAd(obj);
+        var obj = api.Ad.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAd(obj as api.Ad);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14632,7 +14733,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAd(response);
+        checkAd(response as api.Ad);
       })));
     });
   });
@@ -14758,7 +14859,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiserGroup(response);
+        checkAdvertiserGroup(response as api.AdvertiserGroup);
       })));
     });
 
@@ -14769,8 +14870,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AdvertiserGroup.fromJson(json);
-        checkAdvertiserGroup(obj);
+        var obj = api.AdvertiserGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiserGroup(obj as api.AdvertiserGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14821,7 +14923,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiserGroup(response);
+        checkAdvertiserGroup(response as api.AdvertiserGroup);
       })));
     });
 
@@ -14904,7 +15006,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiserGroupsListResponse(response);
+        checkAdvertiserGroupsListResponse(
+            response as api.AdvertiserGroupsListResponse);
       })));
     });
 
@@ -14916,8 +15019,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AdvertiserGroup.fromJson(json);
-        checkAdvertiserGroup(obj);
+        var obj = api.AdvertiserGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiserGroup(obj as api.AdvertiserGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14969,7 +15073,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiserGroup(response);
+        checkAdvertiserGroup(response as api.AdvertiserGroup);
       })));
     });
 
@@ -14980,8 +15084,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AdvertiserGroup.fromJson(json);
-        checkAdvertiserGroup(obj);
+        var obj = api.AdvertiserGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiserGroup(obj as api.AdvertiserGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15032,7 +15137,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiserGroup(response);
+        checkAdvertiserGroup(response as api.AdvertiserGroup);
       })));
     });
   });
@@ -15097,7 +15202,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLandingPage(response);
+        checkLandingPage(response as api.LandingPage);
       })));
     });
 
@@ -15108,8 +15213,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LandingPage.fromJson(json);
-        checkLandingPage(obj);
+        var obj = api.LandingPage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLandingPage(obj as api.LandingPage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15160,7 +15266,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLandingPage(response);
+        checkLandingPage(response as api.LandingPage);
       })));
     });
 
@@ -15260,7 +15366,8 @@
               subaccountId: arg_subaccountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiserLandingPagesListResponse(response);
+        checkAdvertiserLandingPagesListResponse(
+            response as api.AdvertiserLandingPagesListResponse);
       })));
     });
 
@@ -15272,8 +15379,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LandingPage.fromJson(json);
-        checkLandingPage(obj);
+        var obj = api.LandingPage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLandingPage(obj as api.LandingPage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15325,7 +15433,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLandingPage(response);
+        checkLandingPage(response as api.LandingPage);
       })));
     });
 
@@ -15336,8 +15444,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LandingPage.fromJson(json);
-        checkLandingPage(obj);
+        var obj = api.LandingPage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLandingPage(obj as api.LandingPage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15388,7 +15497,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLandingPage(response);
+        checkLandingPage(response as api.LandingPage);
       })));
     });
   });
@@ -15453,7 +15562,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiser(response);
+        checkAdvertiser(response as api.Advertiser);
       })));
     });
 
@@ -15464,8 +15573,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Advertiser.fromJson(json);
-        checkAdvertiser(obj);
+        var obj = api.Advertiser.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiser(obj as api.Advertiser);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15516,7 +15626,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiser(response);
+        checkAdvertiser(response as api.Advertiser);
       })));
     });
 
@@ -15623,7 +15733,7 @@
               subaccountId: arg_subaccountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertisersListResponse(response);
+        checkAdvertisersListResponse(response as api.AdvertisersListResponse);
       })));
     });
 
@@ -15635,8 +15745,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Advertiser.fromJson(json);
-        checkAdvertiser(obj);
+        var obj = api.Advertiser.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiser(obj as api.Advertiser);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15688,7 +15799,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiser(response);
+        checkAdvertiser(response as api.Advertiser);
       })));
     });
 
@@ -15699,8 +15810,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Advertiser.fromJson(json);
-        checkAdvertiser(obj);
+        var obj = api.Advertiser.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiser(obj as api.Advertiser);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15751,7 +15863,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiser(response);
+        checkAdvertiser(response as api.Advertiser);
       })));
     });
   });
@@ -15812,7 +15924,7 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBrowsersListResponse(response);
+        checkBrowsersListResponse(response as api.BrowsersListResponse);
       })));
     });
   });
@@ -15826,8 +15938,10 @@
       var arg_campaignId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CampaignCreativeAssociation.fromJson(json);
-        checkCampaignCreativeAssociation(obj);
+        var obj = api.CampaignCreativeAssociation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCampaignCreativeAssociation(
+            obj as api.CampaignCreativeAssociation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15888,7 +16002,8 @@
           .insert(arg_request, arg_profileId, arg_campaignId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaignCreativeAssociation(response);
+        checkCampaignCreativeAssociation(
+            response as api.CampaignCreativeAssociation);
       })));
     });
 
@@ -15971,7 +16086,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaignCreativeAssociationsListResponse(response);
+        checkCampaignCreativeAssociationsListResponse(
+            response as api.CampaignCreativeAssociationsListResponse);
       })));
     });
   });
@@ -16036,7 +16152,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaign(response);
+        checkCampaign(response as api.Campaign);
       })));
     });
 
@@ -16047,8 +16163,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Campaign.fromJson(json);
-        checkCampaign(obj);
+        var obj =
+            api.Campaign.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCampaign(obj as api.Campaign);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16099,7 +16216,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaign(response);
+        checkCampaign(response as api.Campaign);
       })));
     });
 
@@ -16211,7 +16328,7 @@
               subaccountId: arg_subaccountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaignsListResponse(response);
+        checkCampaignsListResponse(response as api.CampaignsListResponse);
       })));
     });
 
@@ -16223,8 +16340,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Campaign.fromJson(json);
-        checkCampaign(obj);
+        var obj =
+            api.Campaign.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCampaign(obj as api.Campaign);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16276,7 +16394,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaign(response);
+        checkCampaign(response as api.Campaign);
       })));
     });
 
@@ -16287,8 +16405,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Campaign.fromJson(json);
-        checkCampaign(obj);
+        var obj =
+            api.Campaign.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCampaign(obj as api.Campaign);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16339,7 +16458,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaign(response);
+        checkCampaign(response as api.Campaign);
       })));
     });
   });
@@ -16404,7 +16523,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChangeLog(response);
+        checkChangeLog(response as api.ChangeLog);
       })));
     });
 
@@ -16501,7 +16620,7 @@
               userProfileIds: arg_userProfileIds,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChangeLogsListResponse(response);
+        checkChangeLogsListResponse(response as api.ChangeLogsListResponse);
       })));
     });
   });
@@ -16578,7 +16697,7 @@
               regionDartIds: arg_regionDartIds,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCitiesListResponse(response);
+        checkCitiesListResponse(response as api.CitiesListResponse);
       })));
     });
   });
@@ -16643,7 +16762,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConnectionType(response);
+        checkConnectionType(response as api.ConnectionType);
       })));
     });
 
@@ -16702,7 +16821,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConnectionTypesListResponse(response);
+        checkConnectionTypesListResponse(
+            response as api.ConnectionTypesListResponse);
       })));
     });
   });
@@ -16828,7 +16948,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContentCategory(response);
+        checkContentCategory(response as api.ContentCategory);
       })));
     });
 
@@ -16839,8 +16959,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ContentCategory.fromJson(json);
-        checkContentCategory(obj);
+        var obj = api.ContentCategory.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkContentCategory(obj as api.ContentCategory);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -16891,7 +17012,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContentCategory(response);
+        checkContentCategory(response as api.ContentCategory);
       })));
     });
 
@@ -16974,7 +17095,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContentCategoriesListResponse(response);
+        checkContentCategoriesListResponse(
+            response as api.ContentCategoriesListResponse);
       })));
     });
 
@@ -16986,8 +17108,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ContentCategory.fromJson(json);
-        checkContentCategory(obj);
+        var obj = api.ContentCategory.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkContentCategory(obj as api.ContentCategory);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17039,7 +17162,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContentCategory(response);
+        checkContentCategory(response as api.ContentCategory);
       })));
     });
 
@@ -17050,8 +17173,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ContentCategory.fromJson(json);
-        checkContentCategory(obj);
+        var obj = api.ContentCategory.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkContentCategory(obj as api.ContentCategory);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17102,7 +17226,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContentCategory(response);
+        checkContentCategory(response as api.ContentCategory);
       })));
     });
   });
@@ -17115,8 +17239,10 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ConversionsBatchInsertRequest.fromJson(json);
-        checkConversionsBatchInsertRequest(obj);
+        var obj = api.ConversionsBatchInsertRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConversionsBatchInsertRequest(
+            obj as api.ConversionsBatchInsertRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17167,7 +17293,8 @@
       res
           .batchinsert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConversionsBatchInsertResponse(response);
+        checkConversionsBatchInsertResponse(
+            response as api.ConversionsBatchInsertResponse);
       })));
     });
 
@@ -17178,8 +17305,10 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ConversionsBatchUpdateRequest.fromJson(json);
-        checkConversionsBatchUpdateRequest(obj);
+        var obj = api.ConversionsBatchUpdateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConversionsBatchUpdateRequest(
+            obj as api.ConversionsBatchUpdateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17230,7 +17359,8 @@
       res
           .batchupdate(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConversionsBatchUpdateResponse(response);
+        checkConversionsBatchUpdateResponse(
+            response as api.ConversionsBatchUpdateResponse);
       })));
     });
   });
@@ -17295,7 +17425,7 @@
       res
           .get(arg_profileId, arg_dartId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCountry(response);
+        checkCountry(response as api.Country);
       })));
     });
 
@@ -17354,7 +17484,7 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCountriesListResponse(response);
+        checkCountriesListResponse(response as api.CountriesListResponse);
       })));
     });
   });
@@ -17371,8 +17501,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeAssetMetadata.fromJson(json);
-        checkCreativeAssetMetadata(obj);
+        var obj = api.CreativeAssetMetadata.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeAssetMetadata(obj as api.CreativeAssetMetadata);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17433,7 +17564,7 @@
           .insert(arg_request, arg_profileId, arg_advertiserId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeAssetMetadata(response);
+        checkCreativeAssetMetadata(response as api.CreativeAssetMetadata);
       })));
     });
   });
@@ -17580,7 +17711,7 @@
       res
           .get(arg_profileId, arg_creativeFieldId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeFieldValue(response);
+        checkCreativeFieldValue(response as api.CreativeFieldValue);
       })));
     });
 
@@ -17592,8 +17723,9 @@
       var arg_creativeFieldId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeFieldValue.fromJson(json);
-        checkCreativeFieldValue(obj);
+        var obj = api.CreativeFieldValue.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeFieldValue(obj as api.CreativeFieldValue);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17654,7 +17786,7 @@
           .insert(arg_request, arg_profileId, arg_creativeFieldId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeFieldValue(response);
+        checkCreativeFieldValue(response as api.CreativeFieldValue);
       })));
     });
 
@@ -17747,7 +17879,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeFieldValuesListResponse(response);
+        checkCreativeFieldValuesListResponse(
+            response as api.CreativeFieldValuesListResponse);
       })));
     });
 
@@ -17760,8 +17893,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeFieldValue.fromJson(json);
-        checkCreativeFieldValue(obj);
+        var obj = api.CreativeFieldValue.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeFieldValue(obj as api.CreativeFieldValue);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17823,7 +17957,7 @@
           .patch(arg_request, arg_profileId, arg_creativeFieldId, arg_id,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeFieldValue(response);
+        checkCreativeFieldValue(response as api.CreativeFieldValue);
       })));
     });
 
@@ -17835,8 +17969,9 @@
       var arg_creativeFieldId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeFieldValue.fromJson(json);
-        checkCreativeFieldValue(obj);
+        var obj = api.CreativeFieldValue.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeFieldValue(obj as api.CreativeFieldValue);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -17897,7 +18032,7 @@
           .update(arg_request, arg_profileId, arg_creativeFieldId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeFieldValue(response);
+        checkCreativeFieldValue(response as api.CreativeFieldValue);
       })));
     });
   });
@@ -18023,7 +18158,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeField(response);
+        checkCreativeField(response as api.CreativeField);
       })));
     });
 
@@ -18034,8 +18169,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeField.fromJson(json);
-        checkCreativeField(obj);
+        var obj = api.CreativeField.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeField(obj as api.CreativeField);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18086,7 +18222,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeField(response);
+        checkCreativeField(response as api.CreativeField);
       })));
     });
 
@@ -18173,7 +18309,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeFieldsListResponse(response);
+        checkCreativeFieldsListResponse(
+            response as api.CreativeFieldsListResponse);
       })));
     });
 
@@ -18185,8 +18322,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeField.fromJson(json);
-        checkCreativeField(obj);
+        var obj = api.CreativeField.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeField(obj as api.CreativeField);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18238,7 +18376,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeField(response);
+        checkCreativeField(response as api.CreativeField);
       })));
     });
 
@@ -18249,8 +18387,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeField.fromJson(json);
-        checkCreativeField(obj);
+        var obj = api.CreativeField.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeField(obj as api.CreativeField);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18301,7 +18440,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeField(response);
+        checkCreativeField(response as api.CreativeField);
       })));
     });
   });
@@ -18366,7 +18505,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeGroup(response);
+        checkCreativeGroup(response as api.CreativeGroup);
       })));
     });
 
@@ -18377,8 +18516,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeGroup.fromJson(json);
-        checkCreativeGroup(obj);
+        var obj = api.CreativeGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeGroup(obj as api.CreativeGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18429,7 +18569,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeGroup(response);
+        checkCreativeGroup(response as api.CreativeGroup);
       })));
     });
 
@@ -18520,7 +18660,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeGroupsListResponse(response);
+        checkCreativeGroupsListResponse(
+            response as api.CreativeGroupsListResponse);
       })));
     });
 
@@ -18532,8 +18673,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeGroup.fromJson(json);
-        checkCreativeGroup(obj);
+        var obj = api.CreativeGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeGroup(obj as api.CreativeGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18585,7 +18727,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeGroup(response);
+        checkCreativeGroup(response as api.CreativeGroup);
       })));
     });
 
@@ -18596,8 +18738,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreativeGroup.fromJson(json);
-        checkCreativeGroup(obj);
+        var obj = api.CreativeGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreativeGroup(obj as api.CreativeGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18648,7 +18791,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativeGroup(response);
+        checkCreativeGroup(response as api.CreativeGroup);
       })));
     });
   });
@@ -18713,7 +18856,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -18724,8 +18867,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Creative.fromJson(json);
-        checkCreative(obj);
+        var obj =
+            api.Creative.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCreative(obj as api.Creative);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18776,7 +18920,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -18897,7 +19041,7 @@
               types: arg_types,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreativesListResponse(response);
+        checkCreativesListResponse(response as api.CreativesListResponse);
       })));
     });
 
@@ -18909,8 +19053,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Creative.fromJson(json);
-        checkCreative(obj);
+        var obj =
+            api.Creative.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCreative(obj as api.Creative);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -18962,7 +19107,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -18973,8 +19118,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Creative.fromJson(json);
-        checkCreative(obj);
+        var obj =
+            api.Creative.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCreative(obj as api.Creative);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -19025,7 +19171,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
   });
@@ -19038,8 +19184,10 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomEventsBatchInsertRequest.fromJson(json);
-        checkCustomEventsBatchInsertRequest(obj);
+        var obj = api.CustomEventsBatchInsertRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomEventsBatchInsertRequest(
+            obj as api.CustomEventsBatchInsertRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -19090,7 +19238,8 @@
       res
           .batchinsert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomEventsBatchInsertResponse(response);
+        checkCustomEventsBatchInsertResponse(
+            response as api.CustomEventsBatchInsertResponse);
       })));
     });
   });
@@ -19105,8 +19254,9 @@
       var arg_pageToken = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DimensionValueRequest.fromJson(json);
-        checkDimensionValueRequest(obj);
+        var obj = api.DimensionValueRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDimensionValueRequest(obj as api.DimensionValueRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -19164,7 +19314,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDimensionValueList(response);
+        checkDimensionValueList(response as api.DimensionValueList);
       })));
     });
   });
@@ -19229,7 +19379,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDirectorySite(response);
+        checkDirectorySite(response as api.DirectorySite);
       })));
     });
 
@@ -19240,8 +19390,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DirectorySite.fromJson(json);
-        checkDirectorySite(obj);
+        var obj = api.DirectorySite.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDirectorySite(obj as api.DirectorySite);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -19292,7 +19443,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDirectorySite(response);
+        checkDirectorySite(response as api.DirectorySite);
       })));
     });
 
@@ -19397,7 +19548,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDirectorySitesListResponse(response);
+        checkDirectorySitesListResponse(
+            response as api.DirectorySitesListResponse);
       })));
     });
   });
@@ -19477,8 +19629,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DynamicTargetingKey.fromJson(json);
-        checkDynamicTargetingKey(obj);
+        var obj = api.DynamicTargetingKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDynamicTargetingKey(obj as api.DynamicTargetingKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -19529,7 +19682,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDynamicTargetingKey(response);
+        checkDynamicTargetingKey(response as api.DynamicTargetingKey);
       })));
     });
 
@@ -19604,7 +19757,8 @@
               objectType: arg_objectType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDynamicTargetingKeysListResponse(response);
+        checkDynamicTargetingKeysListResponse(
+            response as api.DynamicTargetingKeysListResponse);
       })));
     });
   });
@@ -19730,7 +19884,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEventTag(response);
+        checkEventTag(response as api.EventTag);
       })));
     });
 
@@ -19741,8 +19895,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EventTag.fromJson(json);
-        checkEventTag(obj);
+        var obj =
+            api.EventTag.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEventTag(obj as api.EventTag);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -19793,7 +19948,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEventTag(response);
+        checkEventTag(response as api.EventTag);
       })));
     });
 
@@ -19891,7 +20046,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEventTagsListResponse(response);
+        checkEventTagsListResponse(response as api.EventTagsListResponse);
       })));
     });
 
@@ -19903,8 +20058,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EventTag.fromJson(json);
-        checkEventTag(obj);
+        var obj =
+            api.EventTag.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEventTag(obj as api.EventTag);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -19956,7 +20112,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEventTag(response);
+        checkEventTag(response as api.EventTag);
       })));
     });
 
@@ -19967,8 +20123,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EventTag.fromJson(json);
-        checkEventTag(obj);
+        var obj =
+            api.EventTag.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEventTag(obj as api.EventTag);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -20019,7 +20176,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEventTag(response);
+        checkEventTag(response as api.EventTag);
       })));
     });
   });
@@ -20087,7 +20244,7 @@
       res
           .get(arg_reportId, arg_fileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -20166,7 +20323,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFileList(response);
+        checkFileList(response as api.FileList);
       })));
     });
   });
@@ -20294,7 +20451,8 @@
               floodlightActivityId: arg_floodlightActivityId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivitiesGenerateTagResponse(response);
+        checkFloodlightActivitiesGenerateTagResponse(
+            response as api.FloodlightActivitiesGenerateTagResponse);
       })));
     });
 
@@ -20357,7 +20515,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivity(response);
+        checkFloodlightActivity(response as api.FloodlightActivity);
       })));
     });
 
@@ -20368,8 +20526,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightActivity.fromJson(json);
-        checkFloodlightActivity(obj);
+        var obj = api.FloodlightActivity.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightActivity(obj as api.FloodlightActivity);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -20420,7 +20579,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivity(response);
+        checkFloodlightActivity(response as api.FloodlightActivity);
       })));
     });
 
@@ -20532,7 +20691,8 @@
               tagString: arg_tagString,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivitiesListResponse(response);
+        checkFloodlightActivitiesListResponse(
+            response as api.FloodlightActivitiesListResponse);
       })));
     });
 
@@ -20544,8 +20704,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightActivity.fromJson(json);
-        checkFloodlightActivity(obj);
+        var obj = api.FloodlightActivity.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightActivity(obj as api.FloodlightActivity);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -20597,7 +20758,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivity(response);
+        checkFloodlightActivity(response as api.FloodlightActivity);
       })));
     });
 
@@ -20608,8 +20769,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightActivity.fromJson(json);
-        checkFloodlightActivity(obj);
+        var obj = api.FloodlightActivity.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightActivity(obj as api.FloodlightActivity);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -20660,7 +20822,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivity(response);
+        checkFloodlightActivity(response as api.FloodlightActivity);
       })));
     });
   });
@@ -20725,7 +20887,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivityGroup(response);
+        checkFloodlightActivityGroup(response as api.FloodlightActivityGroup);
       })));
     });
 
@@ -20736,8 +20898,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightActivityGroup.fromJson(json);
-        checkFloodlightActivityGroup(obj);
+        var obj = api.FloodlightActivityGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightActivityGroup(obj as api.FloodlightActivityGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -20788,7 +20951,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivityGroup(response);
+        checkFloodlightActivityGroup(response as api.FloodlightActivityGroup);
       })));
     });
 
@@ -20883,7 +21046,8 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivityGroupsListResponse(response);
+        checkFloodlightActivityGroupsListResponse(
+            response as api.FloodlightActivityGroupsListResponse);
       })));
     });
 
@@ -20895,8 +21059,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightActivityGroup.fromJson(json);
-        checkFloodlightActivityGroup(obj);
+        var obj = api.FloodlightActivityGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightActivityGroup(obj as api.FloodlightActivityGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -20948,7 +21113,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivityGroup(response);
+        checkFloodlightActivityGroup(response as api.FloodlightActivityGroup);
       })));
     });
 
@@ -20959,8 +21124,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightActivityGroup.fromJson(json);
-        checkFloodlightActivityGroup(obj);
+        var obj = api.FloodlightActivityGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightActivityGroup(obj as api.FloodlightActivityGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -21011,7 +21177,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightActivityGroup(response);
+        checkFloodlightActivityGroup(response as api.FloodlightActivityGroup);
       })));
     });
   });
@@ -21076,7 +21242,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightConfiguration(response);
+        checkFloodlightConfiguration(response as api.FloodlightConfiguration);
       })));
     });
 
@@ -21138,7 +21304,8 @@
       res
           .list(arg_profileId, ids: arg_ids, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightConfigurationsListResponse(response);
+        checkFloodlightConfigurationsListResponse(
+            response as api.FloodlightConfigurationsListResponse);
       })));
     });
 
@@ -21150,8 +21317,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightConfiguration.fromJson(json);
-        checkFloodlightConfiguration(obj);
+        var obj = api.FloodlightConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightConfiguration(obj as api.FloodlightConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -21203,7 +21371,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightConfiguration(response);
+        checkFloodlightConfiguration(response as api.FloodlightConfiguration);
       })));
     });
 
@@ -21214,8 +21382,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightConfiguration.fromJson(json);
-        checkFloodlightConfiguration(obj);
+        var obj = api.FloodlightConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightConfiguration(obj as api.FloodlightConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -21266,7 +21435,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightConfiguration(response);
+        checkFloodlightConfiguration(response as api.FloodlightConfiguration);
       })));
     });
   });
@@ -21341,7 +21510,7 @@
       res
           .get(arg_profileId, arg_projectId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInventoryItem(response);
+        checkInventoryItem(response as api.InventoryItem);
       })));
     });
 
@@ -21443,7 +21612,8 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInventoryItemsListResponse(response);
+        checkInventoryItemsListResponse(
+            response as api.InventoryItemsListResponse);
       })));
     });
   });
@@ -21504,7 +21674,7 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLanguagesListResponse(response);
+        checkLanguagesListResponse(response as api.LanguagesListResponse);
       })));
     });
   });
@@ -21565,7 +21735,7 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMetrosListResponse(response);
+        checkMetrosListResponse(response as api.MetrosListResponse);
       })));
     });
   });
@@ -21630,7 +21800,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMobileApp(response);
+        checkMobileApp(response as api.MobileApp);
       })));
     });
 
@@ -21709,7 +21879,7 @@
               searchString: arg_searchString,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMobileAppsListResponse(response);
+        checkMobileAppsListResponse(response as api.MobileAppsListResponse);
       })));
     });
   });
@@ -21774,7 +21944,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMobileCarrier(response);
+        checkMobileCarrier(response as api.MobileCarrier);
       })));
     });
 
@@ -21833,7 +22003,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMobileCarriersListResponse(response);
+        checkMobileCarriersListResponse(
+            response as api.MobileCarriersListResponse);
       })));
     });
   });
@@ -21898,7 +22069,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperatingSystemVersion(response);
+        checkOperatingSystemVersion(response as api.OperatingSystemVersion);
       })));
     });
 
@@ -21958,7 +22129,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperatingSystemVersionsListResponse(response);
+        checkOperatingSystemVersionsListResponse(
+            response as api.OperatingSystemVersionsListResponse);
       })));
     });
   });
@@ -22023,7 +22195,7 @@
       res
           .get(arg_profileId, arg_dartId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperatingSystem(response);
+        checkOperatingSystem(response as api.OperatingSystem);
       })));
     });
 
@@ -22082,7 +22254,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperatingSystemsListResponse(response);
+        checkOperatingSystemsListResponse(
+            response as api.OperatingSystemsListResponse);
       })));
     });
   });
@@ -22157,7 +22330,7 @@
       res
           .get(arg_profileId, arg_projectId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderDocument(response);
+        checkOrderDocument(response as api.OrderDocument);
       })));
     });
 
@@ -22260,7 +22433,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrderDocumentsListResponse(response);
+        checkOrderDocumentsListResponse(
+            response as api.OrderDocumentsListResponse);
       })));
     });
   });
@@ -22335,7 +22509,7 @@
       res
           .get(arg_profileId, arg_projectId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrder(response);
+        checkOrder(response as api.Order);
       })));
     });
 
@@ -22431,7 +22605,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrdersListResponse(response);
+        checkOrdersListResponse(response as api.OrdersListResponse);
       })));
     });
   });
@@ -22496,7 +22670,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementGroup(response);
+        checkPlacementGroup(response as api.PlacementGroup);
       })));
     });
 
@@ -22507,8 +22681,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlacementGroup.fromJson(json);
-        checkPlacementGroup(obj);
+        var obj = api.PlacementGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlacementGroup(obj as api.PlacementGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -22559,7 +22734,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementGroup(response);
+        checkPlacementGroup(response as api.PlacementGroup);
       })));
     });
 
@@ -22693,7 +22868,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementGroupsListResponse(response);
+        checkPlacementGroupsListResponse(
+            response as api.PlacementGroupsListResponse);
       })));
     });
 
@@ -22705,8 +22881,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlacementGroup.fromJson(json);
-        checkPlacementGroup(obj);
+        var obj = api.PlacementGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlacementGroup(obj as api.PlacementGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -22758,7 +22935,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementGroup(response);
+        checkPlacementGroup(response as api.PlacementGroup);
       })));
     });
 
@@ -22769,8 +22946,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlacementGroup.fromJson(json);
-        checkPlacementGroup(obj);
+        var obj = api.PlacementGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlacementGroup(obj as api.PlacementGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -22821,7 +22999,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementGroup(response);
+        checkPlacementGroup(response as api.PlacementGroup);
       })));
     });
   });
@@ -22947,7 +23125,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementStrategy(response);
+        checkPlacementStrategy(response as api.PlacementStrategy);
       })));
     });
 
@@ -22958,8 +23136,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlacementStrategy.fromJson(json);
-        checkPlacementStrategy(obj);
+        var obj = api.PlacementStrategy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlacementStrategy(obj as api.PlacementStrategy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -23010,7 +23189,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementStrategy(response);
+        checkPlacementStrategy(response as api.PlacementStrategy);
       })));
     });
 
@@ -23093,7 +23272,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementStrategiesListResponse(response);
+        checkPlacementStrategiesListResponse(
+            response as api.PlacementStrategiesListResponse);
       })));
     });
 
@@ -23105,8 +23285,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlacementStrategy.fromJson(json);
-        checkPlacementStrategy(obj);
+        var obj = api.PlacementStrategy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlacementStrategy(obj as api.PlacementStrategy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -23158,7 +23339,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementStrategy(response);
+        checkPlacementStrategy(response as api.PlacementStrategy);
       })));
     });
 
@@ -23169,8 +23350,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlacementStrategy.fromJson(json);
-        checkPlacementStrategy(obj);
+        var obj = api.PlacementStrategy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlacementStrategy(obj as api.PlacementStrategy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -23221,7 +23403,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementStrategy(response);
+        checkPlacementStrategy(response as api.PlacementStrategy);
       })));
     });
   });
@@ -23295,7 +23477,8 @@
               tagFormats: arg_tagFormats,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementsGenerateTagsResponse(response);
+        checkPlacementsGenerateTagsResponse(
+            response as api.PlacementsGenerateTagsResponse);
       })));
     });
 
@@ -23358,7 +23541,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacement(response);
+        checkPlacement(response as api.Placement);
       })));
     });
 
@@ -23369,8 +23552,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Placement.fromJson(json);
-        checkPlacement(obj);
+        var obj =
+            api.Placement.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPlacement(obj as api.Placement);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -23421,7 +23605,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacement(response);
+        checkPlacement(response as api.Placement);
       })));
     });
 
@@ -23565,7 +23749,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacementsListResponse(response);
+        checkPlacementsListResponse(response as api.PlacementsListResponse);
       })));
     });
 
@@ -23577,8 +23761,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Placement.fromJson(json);
-        checkPlacement(obj);
+        var obj =
+            api.Placement.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPlacement(obj as api.Placement);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -23630,7 +23815,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacement(response);
+        checkPlacement(response as api.Placement);
       })));
     });
 
@@ -23641,8 +23826,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Placement.fromJson(json);
-        checkPlacement(obj);
+        var obj =
+            api.Placement.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPlacement(obj as api.Placement);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -23693,7 +23879,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlacement(response);
+        checkPlacement(response as api.Placement);
       })));
     });
   });
@@ -23758,7 +23944,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlatformType(response);
+        checkPlatformType(response as api.PlatformType);
       })));
     });
 
@@ -23817,7 +24003,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlatformTypesListResponse(response);
+        checkPlatformTypesListResponse(
+            response as api.PlatformTypesListResponse);
       })));
     });
   });
@@ -23882,7 +24069,7 @@
       res
           .get(arg_profileId, arg_code, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPostalCode(response);
+        checkPostalCode(response as api.PostalCode);
       })));
     });
 
@@ -23941,7 +24128,7 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPostalCodesListResponse(response);
+        checkPostalCodesListResponse(response as api.PostalCodesListResponse);
       })));
     });
   });
@@ -24006,7 +24193,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
 
@@ -24093,7 +24280,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProjectsListResponse(response);
+        checkProjectsListResponse(response as api.ProjectsListResponse);
       })));
     });
   });
@@ -24154,7 +24341,7 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRegionsListResponse(response);
+        checkRegionsListResponse(response as api.RegionsListResponse);
       })));
     });
   });
@@ -24219,7 +24406,7 @@
       res
           .get(arg_profileId, arg_remarketingListId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingListShare(response);
+        checkRemarketingListShare(response as api.RemarketingListShare);
       })));
     });
 
@@ -24231,8 +24418,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingListShare.fromJson(json);
-        checkRemarketingListShare(obj);
+        var obj = api.RemarketingListShare.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingListShare(obj as api.RemarketingListShare);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -24284,7 +24472,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingListShare(response);
+        checkRemarketingListShare(response as api.RemarketingListShare);
       })));
     });
 
@@ -24295,8 +24483,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingListShare.fromJson(json);
-        checkRemarketingListShare(obj);
+        var obj = api.RemarketingListShare.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingListShare(obj as api.RemarketingListShare);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -24347,7 +24536,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingListShare(response);
+        checkRemarketingListShare(response as api.RemarketingListShare);
       })));
     });
   });
@@ -24412,7 +24601,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingList(response);
+        checkRemarketingList(response as api.RemarketingList);
       })));
     });
 
@@ -24423,8 +24612,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingList.fromJson(json);
-        checkRemarketingList(obj);
+        var obj = api.RemarketingList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingList(obj as api.RemarketingList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -24475,7 +24665,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingList(response);
+        checkRemarketingList(response as api.RemarketingList);
       })));
     });
 
@@ -24565,7 +24755,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingListsListResponse(response);
+        checkRemarketingListsListResponse(
+            response as api.RemarketingListsListResponse);
       })));
     });
 
@@ -24577,8 +24768,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingList.fromJson(json);
-        checkRemarketingList(obj);
+        var obj = api.RemarketingList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingList(obj as api.RemarketingList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -24630,7 +24822,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingList(response);
+        checkRemarketingList(response as api.RemarketingList);
       })));
     });
 
@@ -24641,8 +24833,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemarketingList.fromJson(json);
-        checkRemarketingList(obj);
+        var obj = api.RemarketingList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemarketingList(obj as api.RemarketingList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -24693,7 +24886,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemarketingList(response);
+        checkRemarketingList(response as api.RemarketingList);
       })));
     });
   });
@@ -24819,7 +25012,7 @@
       res
           .get(arg_profileId, arg_reportId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
 
@@ -24830,8 +25023,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Report.fromJson(json);
-        checkReport(obj);
+        var obj =
+            api.Report.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkReport(obj as api.Report);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -24882,7 +25076,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
 
@@ -24961,7 +25155,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReportList(response);
+        checkReportList(response as api.ReportList);
       })));
     });
 
@@ -24973,8 +25167,9 @@
       var arg_reportId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Report.fromJson(json);
-        checkReport(obj);
+        var obj =
+            api.Report.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkReport(obj as api.Report);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -25028,7 +25223,7 @@
       res
           .patch(arg_request, arg_profileId, arg_reportId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
 
@@ -25101,7 +25296,7 @@
           .run(arg_profileId, arg_reportId,
               synchronous: arg_synchronous, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -25113,8 +25308,9 @@
       var arg_reportId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Report.fromJson(json);
-        checkReport(obj);
+        var obj =
+            api.Report.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkReport(obj as api.Report);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -25169,7 +25365,7 @@
           .update(arg_request, arg_profileId, arg_reportId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
   });
@@ -25182,8 +25378,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Report.fromJson(json);
-        checkReport(obj);
+        var obj =
+            api.Report.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkReport(obj as api.Report);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -25234,7 +25431,7 @@
       res
           .query(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompatibleFields(response);
+        checkCompatibleFields(response as api.CompatibleFields);
       })));
     });
   });
@@ -25312,7 +25509,7 @@
       res
           .get(arg_profileId, arg_reportId, arg_fileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -25398,7 +25595,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFileList(response);
+        checkFileList(response as api.FileList);
       })));
     });
   });
@@ -25463,7 +25660,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSite(response);
+        checkSite(response as api.Site);
       })));
     });
 
@@ -25474,8 +25671,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Site.fromJson(json);
-        checkSite(obj);
+        var obj =
+            api.Site.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSite(obj as api.Site);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -25526,7 +25724,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSite(response);
+        checkSite(response as api.Site);
       })));
     });
 
@@ -25647,7 +25845,7 @@
               unmappedSite: arg_unmappedSite,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSitesListResponse(response);
+        checkSitesListResponse(response as api.SitesListResponse);
       })));
     });
 
@@ -25659,8 +25857,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Site.fromJson(json);
-        checkSite(obj);
+        var obj =
+            api.Site.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSite(obj as api.Site);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -25712,7 +25911,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSite(response);
+        checkSite(response as api.Site);
       })));
     });
 
@@ -25723,8 +25922,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Site.fromJson(json);
-        checkSite(obj);
+        var obj =
+            api.Site.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSite(obj as api.Site);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -25775,7 +25975,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSite(response);
+        checkSite(response as api.Site);
       })));
     });
   });
@@ -25840,7 +26040,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSize(response);
+        checkSize(response as api.Size);
       })));
     });
 
@@ -25851,8 +26051,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Size.fromJson(json);
-        checkSize(obj);
+        var obj =
+            api.Size.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSize(obj as api.Size);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -25903,7 +26104,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSize(response);
+        checkSize(response as api.Size);
       })));
     });
 
@@ -25978,7 +26179,7 @@
               width: arg_width,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSizesListResponse(response);
+        checkSizesListResponse(response as api.SizesListResponse);
       })));
     });
   });
@@ -26043,7 +26244,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubaccount(response);
+        checkSubaccount(response as api.Subaccount);
       })));
     });
 
@@ -26054,8 +26255,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subaccount.fromJson(json);
-        checkSubaccount(obj);
+        var obj = api.Subaccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubaccount(obj as api.Subaccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -26106,7 +26308,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubaccount(response);
+        checkSubaccount(response as api.Subaccount);
       })));
     });
 
@@ -26189,7 +26391,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubaccountsListResponse(response);
+        checkSubaccountsListResponse(response as api.SubaccountsListResponse);
       })));
     });
 
@@ -26201,8 +26403,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subaccount.fromJson(json);
-        checkSubaccount(obj);
+        var obj = api.Subaccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubaccount(obj as api.Subaccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -26254,7 +26457,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubaccount(response);
+        checkSubaccount(response as api.Subaccount);
       })));
     });
 
@@ -26265,8 +26468,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subaccount.fromJson(json);
-        checkSubaccount(obj);
+        var obj = api.Subaccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubaccount(obj as api.Subaccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -26317,7 +26521,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubaccount(response);
+        checkSubaccount(response as api.Subaccount);
       })));
     });
   });
@@ -26382,7 +26586,8 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetableRemarketingList(response);
+        checkTargetableRemarketingList(
+            response as api.TargetableRemarketingList);
       })));
     });
 
@@ -26469,7 +26674,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetableRemarketingListsListResponse(response);
+        checkTargetableRemarketingListsListResponse(
+            response as api.TargetableRemarketingListsListResponse);
       })));
     });
   });
@@ -26534,7 +26740,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetingTemplate(response);
+        checkTargetingTemplate(response as api.TargetingTemplate);
       })));
     });
 
@@ -26545,8 +26751,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetingTemplate.fromJson(json);
-        checkTargetingTemplate(obj);
+        var obj = api.TargetingTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetingTemplate(obj as api.TargetingTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -26597,7 +26804,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetingTemplate(response);
+        checkTargetingTemplate(response as api.TargetingTemplate);
       })));
     });
 
@@ -26684,7 +26891,8 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetingTemplatesListResponse(response);
+        checkTargetingTemplatesListResponse(
+            response as api.TargetingTemplatesListResponse);
       })));
     });
 
@@ -26696,8 +26904,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetingTemplate.fromJson(json);
-        checkTargetingTemplate(obj);
+        var obj = api.TargetingTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetingTemplate(obj as api.TargetingTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -26749,7 +26958,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetingTemplate(response);
+        checkTargetingTemplate(response as api.TargetingTemplate);
       })));
     });
 
@@ -26760,8 +26969,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TargetingTemplate.fromJson(json);
-        checkTargetingTemplate(obj);
+        var obj = api.TargetingTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTargetingTemplate(obj as api.TargetingTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -26812,7 +27022,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetingTemplate(response);
+        checkTargetingTemplate(response as api.TargetingTemplate);
       })));
     });
   });
@@ -26867,7 +27077,7 @@
       res
           .get(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserProfile(response);
+        checkUserProfile(response as api.UserProfile);
       })));
     });
 
@@ -26914,7 +27124,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkUserProfileList(response);
+        checkUserProfileList(response as api.UserProfileList);
       })));
     });
   });
@@ -26979,7 +27189,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRolePermissionGroup(response);
+        checkUserRolePermissionGroup(response as api.UserRolePermissionGroup);
       })));
     });
 
@@ -27039,7 +27249,8 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRolePermissionGroupsListResponse(response);
+        checkUserRolePermissionGroupsListResponse(
+            response as api.UserRolePermissionGroupsListResponse);
       })));
     });
   });
@@ -27104,7 +27315,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRolePermission(response);
+        checkUserRolePermission(response as api.UserRolePermission);
       })));
     });
 
@@ -27165,7 +27376,8 @@
       res
           .list(arg_profileId, ids: arg_ids, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRolePermissionsListResponse(response);
+        checkUserRolePermissionsListResponse(
+            response as api.UserRolePermissionsListResponse);
       })));
     });
   });
@@ -27291,7 +27503,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRole(response);
+        checkUserRole(response as api.UserRole);
       })));
     });
 
@@ -27302,8 +27514,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserRole.fromJson(json);
-        checkUserRole(obj);
+        var obj =
+            api.UserRole.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUserRole(obj as api.UserRole);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -27354,7 +27567,7 @@
       res
           .insert(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRole(response);
+        checkUserRole(response as api.UserRole);
       })));
     });
 
@@ -27445,7 +27658,7 @@
               subaccountId: arg_subaccountId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRolesListResponse(response);
+        checkUserRolesListResponse(response as api.UserRolesListResponse);
       })));
     });
 
@@ -27457,8 +27670,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserRole.fromJson(json);
-        checkUserRole(obj);
+        var obj =
+            api.UserRole.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUserRole(obj as api.UserRole);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -27510,7 +27724,7 @@
       res
           .patch(arg_request, arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRole(response);
+        checkUserRole(response as api.UserRole);
       })));
     });
 
@@ -27521,8 +27735,9 @@
       var arg_profileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserRole.fromJson(json);
-        checkUserRole(obj);
+        var obj =
+            api.UserRole.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUserRole(obj as api.UserRole);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -27573,7 +27788,7 @@
       res
           .update(arg_request, arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserRole(response);
+        checkUserRole(response as api.UserRole);
       })));
     });
   });
@@ -27638,7 +27853,7 @@
       res
           .get(arg_profileId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideoFormat(response);
+        checkVideoFormat(response as api.VideoFormat);
       })));
     });
 
@@ -27697,7 +27912,7 @@
       res
           .list(arg_profileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideoFormatsListResponse(response);
+        checkVideoFormatsListResponse(response as api.VideoFormatsListResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/dialogflow/v2_test.dart b/generated/googleapis/test/dialogflow/v2_test.dart
index 9bd8539..757d91f 100644
--- a/generated/googleapis/test/dialogflow/v2_test.dart
+++ b/generated/googleapis/test/dialogflow/v2_test.dart
@@ -161,7 +161,8 @@
   buildCounterGoogleCloudDialogflowCxV3beta1PageInfo++;
   if (buildCounterGoogleCloudDialogflowCxV3beta1PageInfo < 3) {
     unittest.expect(o.currentPage, unittest.equals('foo'));
-    checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfo(o.formInfo);
+    checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfo(
+        o.formInfo as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfo);
   }
   buildCounterGoogleCloudDialogflowCxV3beta1PageInfo--;
 }
@@ -178,8 +179,10 @@
     core.List<api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(o[0]);
-  checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(o[1]);
+  checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(
+      o[0] as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo);
+  checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(
+      o[1] as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo);
 }
 
 core.int buildCounterGoogleCloudDialogflowCxV3beta1PageInfoFormInfo = 0;
@@ -301,17 +304,24 @@
   buildCounterGoogleCloudDialogflowCxV3beta1ResponseMessage++;
   if (buildCounterGoogleCloudDialogflowCxV3beta1ResponseMessage < 3) {
     checkGoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess(
-        o.conversationSuccess);
+        o.conversationSuccess as api
+            .GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess);
     checkGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction(
-        o.endInteraction);
-    checkGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff(
-        o.liveAgentHandoff);
-    checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio(o.mixedAudio);
-    checkGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText(
-        o.outputAudioText);
+        o.endInteraction
+            as api.GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction);
+    checkGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff(o
+            .liveAgentHandoff
+        as api.GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff);
+    checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio(o.mixedAudio
+        as api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio);
+    checkGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText(o
+            .outputAudioText
+        as api.GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText);
     checkUnnamed5287(o.payload);
-    checkGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio(o.playAudio);
-    checkGoogleCloudDialogflowCxV3beta1ResponseMessageText(o.text);
+    checkGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio(o.playAudio
+        as api.GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio);
+    checkGoogleCloudDialogflowCxV3beta1ResponseMessageText(
+        o.text as api.GoogleCloudDialogflowCxV3beta1ResponseMessageText);
   }
   buildCounterGoogleCloudDialogflowCxV3beta1ResponseMessage--;
 }
@@ -459,8 +469,10 @@
             api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(o[0]);
-  checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(o[1]);
+  checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(o[0]
+      as api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment);
+  checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(o[1]
+      as api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment);
 }
 
 core.int buildCounterGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio =
@@ -665,8 +677,10 @@
 void checkUnnamed5293(
     core.List<api.GoogleCloudDialogflowCxV3beta1ResponseMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(o[0]);
-  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(o[1]);
+  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(
+      o[0] as api.GoogleCloudDialogflowCxV3beta1ResponseMessage);
+  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(
+      o[1] as api.GoogleCloudDialogflowCxV3beta1ResponseMessage);
 }
 
 core.Map<core.String, core.Object> buildUnnamed5294() {
@@ -724,12 +738,16 @@
   if (buildCounterGoogleCloudDialogflowCxV3beta1WebhookRequest < 3) {
     unittest.expect(o.detectIntentResponseId, unittest.equals('foo'));
     checkGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo(
-        o.fulfillmentInfo);
-    checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo(o.intentInfo);
+        o.fulfillmentInfo
+            as api.GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo);
+    checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo(o.intentInfo
+        as api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo);
     checkUnnamed5293(o.messages);
-    checkGoogleCloudDialogflowCxV3beta1PageInfo(o.pageInfo);
+    checkGoogleCloudDialogflowCxV3beta1PageInfo(
+        o.pageInfo as api.GoogleCloudDialogflowCxV3beta1PageInfo);
     checkUnnamed5294(o.payload);
-    checkGoogleCloudDialogflowCxV3beta1SessionInfo(o.sessionInfo);
+    checkGoogleCloudDialogflowCxV3beta1SessionInfo(
+        o.sessionInfo as api.GoogleCloudDialogflowCxV3beta1SessionInfo);
   }
   buildCounterGoogleCloudDialogflowCxV3beta1WebhookRequest--;
 }
@@ -776,9 +794,11 @@
         o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue(
-      o['x']);
+      o['x'] as api
+          .GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue);
   checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue(
-      o['y']);
+      o['y'] as api
+          .GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue);
 }
 
 core.int buildCounterGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo = 0;
@@ -893,10 +913,13 @@
   buildCounterGoogleCloudDialogflowCxV3beta1WebhookResponse++;
   if (buildCounterGoogleCloudDialogflowCxV3beta1WebhookResponse < 3) {
     checkGoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse(
-        o.fulfillmentResponse);
-    checkGoogleCloudDialogflowCxV3beta1PageInfo(o.pageInfo);
+        o.fulfillmentResponse as api
+            .GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse);
+    checkGoogleCloudDialogflowCxV3beta1PageInfo(
+        o.pageInfo as api.GoogleCloudDialogflowCxV3beta1PageInfo);
     checkUnnamed5296(o.payload);
-    checkGoogleCloudDialogflowCxV3beta1SessionInfo(o.sessionInfo);
+    checkGoogleCloudDialogflowCxV3beta1SessionInfo(
+        o.sessionInfo as api.GoogleCloudDialogflowCxV3beta1SessionInfo);
     unittest.expect(o.targetFlow, unittest.equals('foo'));
     unittest.expect(o.targetPage, unittest.equals('foo'));
   }
@@ -914,8 +937,10 @@
 void checkUnnamed5297(
     core.List<api.GoogleCloudDialogflowCxV3beta1ResponseMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(o[0]);
-  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(o[1]);
+  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(
+      o[0] as api.GoogleCloudDialogflowCxV3beta1ResponseMessage);
+  checkGoogleCloudDialogflowCxV3beta1ResponseMessage(
+      o[1] as api.GoogleCloudDialogflowCxV3beta1ResponseMessage);
 }
 
 core.int
@@ -1043,8 +1068,10 @@
 void checkUnnamed5299(
     core.List<api.GoogleCloudDialogflowV2EntityTypeEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[0]);
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[1]);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[0] as api.GoogleCloudDialogflowV2EntityTypeEntity);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[1] as api.GoogleCloudDialogflowV2EntityTypeEntity);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2BatchCreateEntitiesRequest = 0;
@@ -1149,8 +1176,8 @@
 
 void checkUnnamed5302(core.List<api.GoogleCloudDialogflowV2Intent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Intent(o[0]);
-  checkGoogleCloudDialogflowV2Intent(o[1]);
+  checkGoogleCloudDialogflowV2Intent(o[0] as api.GoogleCloudDialogflowV2Intent);
+  checkGoogleCloudDialogflowV2Intent(o[1] as api.GoogleCloudDialogflowV2Intent);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2BatchDeleteIntentsRequest = 0;
@@ -1184,8 +1211,10 @@
 void checkUnnamed5303(
     core.List<api.GoogleCloudDialogflowV2EntityTypeEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[0]);
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[1]);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[0] as api.GoogleCloudDialogflowV2EntityTypeEntity);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[1] as api.GoogleCloudDialogflowV2EntityTypeEntity);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2BatchUpdateEntitiesRequest = 0;
@@ -1232,7 +1261,8 @@
     api.GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest o) {
   buildCounterGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest++;
   if (buildCounterGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest < 3) {
-    checkGoogleCloudDialogflowV2EntityTypeBatch(o.entityTypeBatchInline);
+    checkGoogleCloudDialogflowV2EntityTypeBatch(
+        o.entityTypeBatchInline as api.GoogleCloudDialogflowV2EntityTypeBatch);
     unittest.expect(o.entityTypeBatchUri, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.updateMask, unittest.equals('foo'));
@@ -1249,8 +1279,10 @@
 
 void checkUnnamed5304(core.List<api.GoogleCloudDialogflowV2EntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2EntityType(o[0]);
-  checkGoogleCloudDialogflowV2EntityType(o[1]);
+  checkGoogleCloudDialogflowV2EntityType(
+      o[0] as api.GoogleCloudDialogflowV2EntityType);
+  checkGoogleCloudDialogflowV2EntityType(
+      o[1] as api.GoogleCloudDialogflowV2EntityType);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2BatchUpdateEntityTypesResponse = 0;
@@ -1294,7 +1326,8 @@
     api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest o) {
   buildCounterGoogleCloudDialogflowV2BatchUpdateIntentsRequest++;
   if (buildCounterGoogleCloudDialogflowV2BatchUpdateIntentsRequest < 3) {
-    checkGoogleCloudDialogflowV2IntentBatch(o.intentBatchInline);
+    checkGoogleCloudDialogflowV2IntentBatch(
+        o.intentBatchInline as api.GoogleCloudDialogflowV2IntentBatch);
     unittest.expect(o.intentBatchUri, unittest.equals('foo'));
     unittest.expect(o.intentView, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
@@ -1312,8 +1345,8 @@
 
 void checkUnnamed5305(core.List<api.GoogleCloudDialogflowV2Intent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Intent(o[0]);
-  checkGoogleCloudDialogflowV2Intent(o[1]);
+  checkGoogleCloudDialogflowV2Intent(o[0] as api.GoogleCloudDialogflowV2Intent);
+  checkGoogleCloudDialogflowV2Intent(o[1] as api.GoogleCloudDialogflowV2Intent);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2BatchUpdateIntentsResponse = 0;
@@ -1409,8 +1442,9 @@
   buildCounterGoogleCloudDialogflowV2ConversationEvent++;
   if (buildCounterGoogleCloudDialogflowV2ConversationEvent < 3) {
     unittest.expect(o.conversation, unittest.equals('foo'));
-    checkGoogleRpcStatus(o.errorStatus);
-    checkGoogleCloudDialogflowV2Message(o.newMessagePayload);
+    checkGoogleRpcStatus(o.errorStatus as api.GoogleRpcStatus);
+    checkGoogleCloudDialogflowV2Message(
+        o.newMessagePayload as api.GoogleCloudDialogflowV2Message);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2ConversationEvent--;
@@ -1437,10 +1471,13 @@
   buildCounterGoogleCloudDialogflowV2DetectIntentRequest++;
   if (buildCounterGoogleCloudDialogflowV2DetectIntentRequest < 3) {
     unittest.expect(o.inputAudio, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2OutputAudioConfig(o.outputAudioConfig);
+    checkGoogleCloudDialogflowV2OutputAudioConfig(
+        o.outputAudioConfig as api.GoogleCloudDialogflowV2OutputAudioConfig);
     unittest.expect(o.outputAudioConfigMask, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2QueryInput(o.queryInput);
-    checkGoogleCloudDialogflowV2QueryParameters(o.queryParams);
+    checkGoogleCloudDialogflowV2QueryInput(
+        o.queryInput as api.GoogleCloudDialogflowV2QueryInput);
+    checkGoogleCloudDialogflowV2QueryParameters(
+        o.queryParams as api.GoogleCloudDialogflowV2QueryParameters);
   }
   buildCounterGoogleCloudDialogflowV2DetectIntentRequest--;
 }
@@ -1466,10 +1503,12 @@
   buildCounterGoogleCloudDialogflowV2DetectIntentResponse++;
   if (buildCounterGoogleCloudDialogflowV2DetectIntentResponse < 3) {
     unittest.expect(o.outputAudio, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2OutputAudioConfig(o.outputAudioConfig);
-    checkGoogleCloudDialogflowV2QueryResult(o.queryResult);
+    checkGoogleCloudDialogflowV2OutputAudioConfig(
+        o.outputAudioConfig as api.GoogleCloudDialogflowV2OutputAudioConfig);
+    checkGoogleCloudDialogflowV2QueryResult(
+        o.queryResult as api.GoogleCloudDialogflowV2QueryResult);
     unittest.expect(o.responseId, unittest.equals('foo'));
-    checkGoogleRpcStatus(o.webhookStatus);
+    checkGoogleRpcStatus(o.webhookStatus as api.GoogleRpcStatus);
   }
   buildCounterGoogleCloudDialogflowV2DetectIntentResponse--;
 }
@@ -1484,8 +1523,10 @@
 void checkUnnamed5307(
     core.List<api.GoogleCloudDialogflowV2EntityTypeEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[0]);
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[1]);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[0] as api.GoogleCloudDialogflowV2EntityTypeEntity);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[1] as api.GoogleCloudDialogflowV2EntityTypeEntity);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2EntityType = 0;
@@ -1527,8 +1568,10 @@
 
 void checkUnnamed5308(core.List<api.GoogleCloudDialogflowV2EntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2EntityType(o[0]);
-  checkGoogleCloudDialogflowV2EntityType(o[1]);
+  checkGoogleCloudDialogflowV2EntityType(
+      o[0] as api.GoogleCloudDialogflowV2EntityType);
+  checkGoogleCloudDialogflowV2EntityType(
+      o[1] as api.GoogleCloudDialogflowV2EntityType);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2EntityTypeBatch = 0;
@@ -1724,8 +1767,10 @@
 void checkUnnamed5311(
     core.List<api.GoogleCloudDialogflowV2FulfillmentFeature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2FulfillmentFeature(o[0]);
-  checkGoogleCloudDialogflowV2FulfillmentFeature(o[1]);
+  checkGoogleCloudDialogflowV2FulfillmentFeature(
+      o[0] as api.GoogleCloudDialogflowV2FulfillmentFeature);
+  checkGoogleCloudDialogflowV2FulfillmentFeature(
+      o[1] as api.GoogleCloudDialogflowV2FulfillmentFeature);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2Fulfillment = 0;
@@ -1752,8 +1797,8 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.enabled, unittest.isTrue);
     checkUnnamed5311(o.features);
-    checkGoogleCloudDialogflowV2FulfillmentGenericWebService(
-        o.genericWebService);
+    checkGoogleCloudDialogflowV2FulfillmentGenericWebService(o.genericWebService
+        as api.GoogleCloudDialogflowV2FulfillmentGenericWebService);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2Fulfillment--;
@@ -1854,8 +1899,8 @@
 
 void checkUnnamed5313(core.List<api.GoogleRpcStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleRpcStatus(o[0]);
-  checkGoogleRpcStatus(o[1]);
+  checkGoogleRpcStatus(o[0] as api.GoogleRpcStatus);
+  checkGoogleRpcStatus(o[1] as api.GoogleRpcStatus);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2ImportDocumentsResponse = 0;
@@ -1901,8 +1946,10 @@
 
 void checkUnnamed5315(core.List<api.GoogleCloudDialogflowV2SpeechContext> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2SpeechContext(o[0]);
-  checkGoogleCloudDialogflowV2SpeechContext(o[1]);
+  checkGoogleCloudDialogflowV2SpeechContext(
+      o[0] as api.GoogleCloudDialogflowV2SpeechContext);
+  checkGoogleCloudDialogflowV2SpeechContext(
+      o[1] as api.GoogleCloudDialogflowV2SpeechContext);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2InputAudioConfig = 0;
@@ -1979,8 +2026,10 @@
 void checkUnnamed5318(
     core.List<api.GoogleCloudDialogflowV2IntentFollowupIntentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(o[0]);
-  checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(o[1]);
+  checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(
+      o[0] as api.GoogleCloudDialogflowV2IntentFollowupIntentInfo);
+  checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(
+      o[1] as api.GoogleCloudDialogflowV2IntentFollowupIntentInfo);
 }
 
 core.List<core.String> buildUnnamed5319() {
@@ -2005,8 +2054,10 @@
 
 void checkUnnamed5320(core.List<api.GoogleCloudDialogflowV2IntentMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessage(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessage(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessage(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessage);
+  checkGoogleCloudDialogflowV2IntentMessage(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessage);
 }
 
 core.List<api.GoogleCloudDialogflowV2Context> buildUnnamed5321() {
@@ -2018,8 +2069,10 @@
 
 void checkUnnamed5321(core.List<api.GoogleCloudDialogflowV2Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Context(o[0]);
-  checkGoogleCloudDialogflowV2Context(o[1]);
+  checkGoogleCloudDialogflowV2Context(
+      o[0] as api.GoogleCloudDialogflowV2Context);
+  checkGoogleCloudDialogflowV2Context(
+      o[1] as api.GoogleCloudDialogflowV2Context);
 }
 
 core.List<api.GoogleCloudDialogflowV2IntentParameter> buildUnnamed5322() {
@@ -2031,8 +2084,10 @@
 
 void checkUnnamed5322(core.List<api.GoogleCloudDialogflowV2IntentParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentParameter(o[0]);
-  checkGoogleCloudDialogflowV2IntentParameter(o[1]);
+  checkGoogleCloudDialogflowV2IntentParameter(
+      o[0] as api.GoogleCloudDialogflowV2IntentParameter);
+  checkGoogleCloudDialogflowV2IntentParameter(
+      o[1] as api.GoogleCloudDialogflowV2IntentParameter);
 }
 
 core.List<api.GoogleCloudDialogflowV2IntentTrainingPhrase> buildUnnamed5323() {
@@ -2045,8 +2100,10 @@
 void checkUnnamed5323(
     core.List<api.GoogleCloudDialogflowV2IntentTrainingPhrase> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentTrainingPhrase(o[0]);
-  checkGoogleCloudDialogflowV2IntentTrainingPhrase(o[1]);
+  checkGoogleCloudDialogflowV2IntentTrainingPhrase(
+      o[0] as api.GoogleCloudDialogflowV2IntentTrainingPhrase);
+  checkGoogleCloudDialogflowV2IntentTrainingPhrase(
+      o[1] as api.GoogleCloudDialogflowV2IntentTrainingPhrase);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2Intent = 0;
@@ -2111,8 +2168,8 @@
 
 void checkUnnamed5324(core.List<api.GoogleCloudDialogflowV2Intent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Intent(o[0]);
-  checkGoogleCloudDialogflowV2Intent(o[1]);
+  checkGoogleCloudDialogflowV2Intent(o[0] as api.GoogleCloudDialogflowV2Intent);
+  checkGoogleCloudDialogflowV2Intent(o[1] as api.GoogleCloudDialogflowV2Intent);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentBatch = 0;
@@ -2222,23 +2279,36 @@
     api.GoogleCloudDialogflowV2IntentMessage o) {
   buildCounterGoogleCloudDialogflowV2IntentMessage++;
   if (buildCounterGoogleCloudDialogflowV2IntentMessage < 3) {
-    checkGoogleCloudDialogflowV2IntentMessageBasicCard(o.basicCard);
+    checkGoogleCloudDialogflowV2IntentMessageBasicCard(
+        o.basicCard as api.GoogleCloudDialogflowV2IntentMessageBasicCard);
     checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard(
-        o.browseCarouselCard);
-    checkGoogleCloudDialogflowV2IntentMessageCard(o.card);
-    checkGoogleCloudDialogflowV2IntentMessageCarouselSelect(o.carouselSelect);
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.image);
+        o.browseCarouselCard
+            as api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard);
+    checkGoogleCloudDialogflowV2IntentMessageCard(
+        o.card as api.GoogleCloudDialogflowV2IntentMessageCard);
+    checkGoogleCloudDialogflowV2IntentMessageCarouselSelect(o.carouselSelect
+        as api.GoogleCloudDialogflowV2IntentMessageCarouselSelect);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2IntentMessageImage);
     checkGoogleCloudDialogflowV2IntentMessageLinkOutSuggestion(
-        o.linkOutSuggestion);
-    checkGoogleCloudDialogflowV2IntentMessageListSelect(o.listSelect);
-    checkGoogleCloudDialogflowV2IntentMessageMediaContent(o.mediaContent);
+        o.linkOutSuggestion
+            as api.GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion);
+    checkGoogleCloudDialogflowV2IntentMessageListSelect(
+        o.listSelect as api.GoogleCloudDialogflowV2IntentMessageListSelect);
+    checkGoogleCloudDialogflowV2IntentMessageMediaContent(
+        o.mediaContent as api.GoogleCloudDialogflowV2IntentMessageMediaContent);
     checkUnnamed5325(o.payload);
     unittest.expect(o.platform, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2IntentMessageQuickReplies(o.quickReplies);
-    checkGoogleCloudDialogflowV2IntentMessageSimpleResponses(o.simpleResponses);
-    checkGoogleCloudDialogflowV2IntentMessageSuggestions(o.suggestions);
-    checkGoogleCloudDialogflowV2IntentMessageTableCard(o.tableCard);
-    checkGoogleCloudDialogflowV2IntentMessageText(o.text);
+    checkGoogleCloudDialogflowV2IntentMessageQuickReplies(
+        o.quickReplies as api.GoogleCloudDialogflowV2IntentMessageQuickReplies);
+    checkGoogleCloudDialogflowV2IntentMessageSimpleResponses(o.simpleResponses
+        as api.GoogleCloudDialogflowV2IntentMessageSimpleResponses);
+    checkGoogleCloudDialogflowV2IntentMessageSuggestions(
+        o.suggestions as api.GoogleCloudDialogflowV2IntentMessageSuggestions);
+    checkGoogleCloudDialogflowV2IntentMessageTableCard(
+        o.tableCard as api.GoogleCloudDialogflowV2IntentMessageTableCard);
+    checkGoogleCloudDialogflowV2IntentMessageText(
+        o.text as api.GoogleCloudDialogflowV2IntentMessageText);
   }
   buildCounterGoogleCloudDialogflowV2IntentMessage--;
 }
@@ -2254,8 +2324,10 @@
 void checkUnnamed5326(
     core.List<api.GoogleCloudDialogflowV2IntentMessageBasicCardButton> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageBasicCardButton);
+  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageBasicCardButton);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageBasicCard = 0;
@@ -2280,7 +2352,8 @@
   if (buildCounterGoogleCloudDialogflowV2IntentMessageBasicCard < 3) {
     checkUnnamed5326(o.buttons);
     unittest.expect(o.formattedText, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.image);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2IntentMessageImage);
     unittest.expect(o.subtitle, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -2306,7 +2379,8 @@
   buildCounterGoogleCloudDialogflowV2IntentMessageBasicCardButton++;
   if (buildCounterGoogleCloudDialogflowV2IntentMessageBasicCardButton < 3) {
     checkGoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction(
-        o.openUriAction);
+        o.openUriAction as api
+            .GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2IntentMessageBasicCardButton--;
@@ -2356,9 +2430,11 @@
         o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
-      o[0]);
+      o[0] as api
+          .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
   checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
-      o[1]);
+      o[1] as api
+          .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard = 0;
@@ -2413,9 +2489,11 @@
       3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.footer, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.image);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2IntentMessageImage);
     checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
-        o.openUriAction);
+        o.openUriAction as api
+            .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem--;
@@ -2461,8 +2539,10 @@
 void checkUnnamed5328(
     core.List<api.GoogleCloudDialogflowV2IntentMessageCardButton> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageCardButton(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageCardButton(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageCardButton(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageCardButton);
+  checkGoogleCloudDialogflowV2IntentMessageCardButton(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageCardButton);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageCard = 0;
@@ -2526,8 +2606,10 @@
 void checkUnnamed5329(
     core.List<api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem);
+  checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageCarouselSelect = 0;
@@ -2571,8 +2653,10 @@
   buildCounterGoogleCloudDialogflowV2IntentMessageCarouselSelectItem++;
   if (buildCounterGoogleCloudDialogflowV2IntentMessageCarouselSelectItem < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.image);
-    checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(o.info);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2IntentMessageImage);
+    checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(
+        o.info as api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2IntentMessageCarouselSelectItem--;
@@ -2658,8 +2742,10 @@
 void checkUnnamed5330(
     core.List<api.GoogleCloudDialogflowV2IntentMessageListSelectItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageListSelectItem(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageListSelectItem(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageListSelectItem(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageListSelectItem);
+  checkGoogleCloudDialogflowV2IntentMessageListSelectItem(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageListSelectItem);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageListSelect = 0;
@@ -2707,8 +2793,10 @@
   buildCounterGoogleCloudDialogflowV2IntentMessageListSelectItem++;
   if (buildCounterGoogleCloudDialogflowV2IntentMessageListSelectItem < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.image);
-    checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(o.info);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2IntentMessageImage);
+    checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(
+        o.info as api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2IntentMessageListSelectItem--;
@@ -2731,10 +2819,12 @@
             api.GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject(
-      o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject(
-      o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject(o[0]
+      as api
+          .GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject);
+  checkGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject(o[1]
+      as api
+          .GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageMediaContent = 0;
@@ -2787,8 +2877,10 @@
       3) {
     unittest.expect(o.contentUrl, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.icon);
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.largeImage);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.icon as api.GoogleCloudDialogflowV2IntentMessageImage);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.largeImage as api.GoogleCloudDialogflowV2IntentMessageImage);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject--;
@@ -2902,8 +2994,10 @@
 void checkUnnamed5334(
     core.List<api.GoogleCloudDialogflowV2IntentMessageSimpleResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageSimpleResponse);
+  checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageSimpleResponse);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageSimpleResponses = 0;
@@ -2959,8 +3053,10 @@
 void checkUnnamed5335(
     core.List<api.GoogleCloudDialogflowV2IntentMessageSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageSuggestion(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageSuggestion(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageSuggestion(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageSuggestion);
+  checkGoogleCloudDialogflowV2IntentMessageSuggestion(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageSuggestion);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageSuggestions = 0;
@@ -2995,8 +3091,10 @@
 void checkUnnamed5336(
     core.List<api.GoogleCloudDialogflowV2IntentMessageBasicCardButton> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageBasicCardButton);
+  checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageBasicCardButton);
 }
 
 core.List<api.GoogleCloudDialogflowV2IntentMessageColumnProperties>
@@ -3010,8 +3108,10 @@
 void checkUnnamed5337(
     core.List<api.GoogleCloudDialogflowV2IntentMessageColumnProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageColumnProperties(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageColumnProperties(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageColumnProperties(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageColumnProperties);
+  checkGoogleCloudDialogflowV2IntentMessageColumnProperties(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageColumnProperties);
 }
 
 core.List<api.GoogleCloudDialogflowV2IntentMessageTableCardRow>
@@ -3025,8 +3125,10 @@
 void checkUnnamed5338(
     core.List<api.GoogleCloudDialogflowV2IntentMessageTableCardRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageTableCardRow(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageTableCardRow(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageTableCardRow(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageTableCardRow);
+  checkGoogleCloudDialogflowV2IntentMessageTableCardRow(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageTableCardRow);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageTableCard = 0;
@@ -3052,7 +3154,8 @@
   if (buildCounterGoogleCloudDialogflowV2IntentMessageTableCard < 3) {
     checkUnnamed5336(o.buttons);
     checkUnnamed5337(o.columnProperties);
-    checkGoogleCloudDialogflowV2IntentMessageImage(o.image);
+    checkGoogleCloudDialogflowV2IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2IntentMessageImage);
     checkUnnamed5338(o.rows);
     unittest.expect(o.subtitle, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -3092,8 +3195,10 @@
 void checkUnnamed5339(
     core.List<api.GoogleCloudDialogflowV2IntentMessageTableCardCell> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessageTableCardCell(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessageTableCardCell(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessageTableCardCell(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessageTableCardCell);
+  checkGoogleCloudDialogflowV2IntentMessageTableCardCell(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessageTableCardCell);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentMessageTableCardRow = 0;
@@ -3212,8 +3317,10 @@
 void checkUnnamed5342(
     core.List<api.GoogleCloudDialogflowV2IntentTrainingPhrasePart> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(o[0]);
-  checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(o[1]);
+  checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(
+      o[0] as api.GoogleCloudDialogflowV2IntentTrainingPhrasePart);
+  checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(
+      o[1] as api.GoogleCloudDialogflowV2IntentTrainingPhrasePart);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2IntentTrainingPhrase = 0;
@@ -3279,8 +3386,10 @@
 
 void checkUnnamed5343(core.List<api.GoogleCloudDialogflowV2Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Context(o[0]);
-  checkGoogleCloudDialogflowV2Context(o[1]);
+  checkGoogleCloudDialogflowV2Context(
+      o[0] as api.GoogleCloudDialogflowV2Context);
+  checkGoogleCloudDialogflowV2Context(
+      o[1] as api.GoogleCloudDialogflowV2Context);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2ListContextsResponse = 0;
@@ -3315,8 +3424,10 @@
 
 void checkUnnamed5344(core.List<api.GoogleCloudDialogflowV2EntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2EntityType(o[0]);
-  checkGoogleCloudDialogflowV2EntityType(o[1]);
+  checkGoogleCloudDialogflowV2EntityType(
+      o[0] as api.GoogleCloudDialogflowV2EntityType);
+  checkGoogleCloudDialogflowV2EntityType(
+      o[1] as api.GoogleCloudDialogflowV2EntityType);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2ListEntityTypesResponse = 0;
@@ -3351,8 +3462,10 @@
 
 void checkUnnamed5345(core.List<api.GoogleCloudDialogflowV2Environment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Environment(o[0]);
-  checkGoogleCloudDialogflowV2Environment(o[1]);
+  checkGoogleCloudDialogflowV2Environment(
+      o[0] as api.GoogleCloudDialogflowV2Environment);
+  checkGoogleCloudDialogflowV2Environment(
+      o[1] as api.GoogleCloudDialogflowV2Environment);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2ListEnvironmentsResponse = 0;
@@ -3387,8 +3500,8 @@
 
 void checkUnnamed5346(core.List<api.GoogleCloudDialogflowV2Intent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Intent(o[0]);
-  checkGoogleCloudDialogflowV2Intent(o[1]);
+  checkGoogleCloudDialogflowV2Intent(o[0] as api.GoogleCloudDialogflowV2Intent);
+  checkGoogleCloudDialogflowV2Intent(o[1] as api.GoogleCloudDialogflowV2Intent);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2ListIntentsResponse = 0;
@@ -3424,8 +3537,10 @@
 void checkUnnamed5347(
     core.List<api.GoogleCloudDialogflowV2SessionEntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2SessionEntityType(o[0]);
-  checkGoogleCloudDialogflowV2SessionEntityType(o[1]);
+  checkGoogleCloudDialogflowV2SessionEntityType(
+      o[0] as api.GoogleCloudDialogflowV2SessionEntityType);
+  checkGoogleCloudDialogflowV2SessionEntityType(
+      o[1] as api.GoogleCloudDialogflowV2SessionEntityType);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2ListSessionEntityTypesResponse = 0;
@@ -3474,7 +3589,8 @@
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2MessageAnnotation(o.messageAnnotation);
+    checkGoogleCloudDialogflowV2MessageAnnotation(
+        o.messageAnnotation as api.GoogleCloudDialogflowV2MessageAnnotation);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.participant, unittest.equals('foo'));
     unittest.expect(o.participantRole, unittest.equals('foo'));
@@ -3492,8 +3608,10 @@
 void checkUnnamed5348(
     core.List<api.GoogleCloudDialogflowV2AnnotatedMessagePart> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2AnnotatedMessagePart(o[0]);
-  checkGoogleCloudDialogflowV2AnnotatedMessagePart(o[1]);
+  checkGoogleCloudDialogflowV2AnnotatedMessagePart(
+      o[0] as api.GoogleCloudDialogflowV2AnnotatedMessagePart);
+  checkGoogleCloudDialogflowV2AnnotatedMessagePart(
+      o[1] as api.GoogleCloudDialogflowV2AnnotatedMessagePart);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2MessageAnnotation = 0;
@@ -3594,8 +3712,8 @@
   if (buildCounterGoogleCloudDialogflowV2OutputAudioConfig < 3) {
     unittest.expect(o.audioEncoding, unittest.equals('foo'));
     unittest.expect(o.sampleRateHertz, unittest.equals(42));
-    checkGoogleCloudDialogflowV2SynthesizeSpeechConfig(
-        o.synthesizeSpeechConfig);
+    checkGoogleCloudDialogflowV2SynthesizeSpeechConfig(o.synthesizeSpeechConfig
+        as api.GoogleCloudDialogflowV2SynthesizeSpeechConfig);
   }
   buildCounterGoogleCloudDialogflowV2OutputAudioConfig--;
 }
@@ -3617,9 +3735,12 @@
     api.GoogleCloudDialogflowV2QueryInput o) {
   buildCounterGoogleCloudDialogflowV2QueryInput++;
   if (buildCounterGoogleCloudDialogflowV2QueryInput < 3) {
-    checkGoogleCloudDialogflowV2InputAudioConfig(o.audioConfig);
-    checkGoogleCloudDialogflowV2EventInput(o.event);
-    checkGoogleCloudDialogflowV2TextInput(o.text);
+    checkGoogleCloudDialogflowV2InputAudioConfig(
+        o.audioConfig as api.GoogleCloudDialogflowV2InputAudioConfig);
+    checkGoogleCloudDialogflowV2EventInput(
+        o.event as api.GoogleCloudDialogflowV2EventInput);
+    checkGoogleCloudDialogflowV2TextInput(
+        o.text as api.GoogleCloudDialogflowV2TextInput);
   }
   buildCounterGoogleCloudDialogflowV2QueryInput--;
 }
@@ -3633,8 +3754,10 @@
 
 void checkUnnamed5350(core.List<api.GoogleCloudDialogflowV2Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Context(o[0]);
-  checkGoogleCloudDialogflowV2Context(o[1]);
+  checkGoogleCloudDialogflowV2Context(
+      o[0] as api.GoogleCloudDialogflowV2Context);
+  checkGoogleCloudDialogflowV2Context(
+      o[1] as api.GoogleCloudDialogflowV2Context);
 }
 
 core.Map<core.String, core.Object> buildUnnamed5351() {
@@ -3676,8 +3799,10 @@
 void checkUnnamed5352(
     core.List<api.GoogleCloudDialogflowV2SessionEntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2SessionEntityType(o[0]);
-  checkGoogleCloudDialogflowV2SessionEntityType(o[1]);
+  checkGoogleCloudDialogflowV2SessionEntityType(
+      o[0] as api.GoogleCloudDialogflowV2SessionEntityType);
+  checkGoogleCloudDialogflowV2SessionEntityType(
+      o[1] as api.GoogleCloudDialogflowV2SessionEntityType);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2QueryParameters = 0;
@@ -3704,11 +3829,12 @@
   buildCounterGoogleCloudDialogflowV2QueryParameters++;
   if (buildCounterGoogleCloudDialogflowV2QueryParameters < 3) {
     checkUnnamed5350(o.contexts);
-    checkGoogleTypeLatLng(o.geoLocation);
+    checkGoogleTypeLatLng(o.geoLocation as api.GoogleTypeLatLng);
     checkUnnamed5351(o.payload);
     unittest.expect(o.resetContexts, unittest.isTrue);
     checkGoogleCloudDialogflowV2SentimentAnalysisRequestConfig(
-        o.sentimentAnalysisRequestConfig);
+        o.sentimentAnalysisRequestConfig
+            as api.GoogleCloudDialogflowV2SentimentAnalysisRequestConfig);
     checkUnnamed5352(o.sessionEntityTypes);
     unittest.expect(o.timeZone, unittest.equals('foo'));
   }
@@ -3753,8 +3879,10 @@
 
 void checkUnnamed5354(core.List<api.GoogleCloudDialogflowV2IntentMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessage(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessage(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessage(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessage);
+  checkGoogleCloudDialogflowV2IntentMessage(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessage);
 }
 
 core.List<api.GoogleCloudDialogflowV2Context> buildUnnamed5355() {
@@ -3766,8 +3894,10 @@
 
 void checkUnnamed5355(core.List<api.GoogleCloudDialogflowV2Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Context(o[0]);
-  checkGoogleCloudDialogflowV2Context(o[1]);
+  checkGoogleCloudDialogflowV2Context(
+      o[0] as api.GoogleCloudDialogflowV2Context);
+  checkGoogleCloudDialogflowV2Context(
+      o[1] as api.GoogleCloudDialogflowV2Context);
 }
 
 core.Map<core.String, core.Object> buildUnnamed5356() {
@@ -3864,14 +3994,16 @@
     checkUnnamed5353(o.diagnosticInfo);
     checkUnnamed5354(o.fulfillmentMessages);
     unittest.expect(o.fulfillmentText, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2Intent(o.intent);
+    checkGoogleCloudDialogflowV2Intent(
+        o.intent as api.GoogleCloudDialogflowV2Intent);
     unittest.expect(o.intentDetectionConfidence, unittest.equals(42.0));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     checkUnnamed5355(o.outputContexts);
     checkUnnamed5356(o.parameters);
     unittest.expect(o.queryText, unittest.equals('foo'));
     checkGoogleCloudDialogflowV2SentimentAnalysisResult(
-        o.sentimentAnalysisResult);
+        o.sentimentAnalysisResult
+            as api.GoogleCloudDialogflowV2SentimentAnalysisResult);
     unittest.expect(o.speechRecognitionConfidence, unittest.equals(42.0));
     checkUnnamed5357(o.webhookPayload);
     unittest.expect(o.webhookSource, unittest.equals('foo'));
@@ -3911,8 +4043,8 @@
 
 void checkUnnamed5358(core.List<api.GoogleCloudDialogflowV2Agent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Agent(o[0]);
-  checkGoogleCloudDialogflowV2Agent(o[1]);
+  checkGoogleCloudDialogflowV2Agent(o[0] as api.GoogleCloudDialogflowV2Agent);
+  checkGoogleCloudDialogflowV2Agent(o[1] as api.GoogleCloudDialogflowV2Agent);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2SearchAgentsResponse = 0;
@@ -3997,7 +4129,8 @@
     api.GoogleCloudDialogflowV2SentimentAnalysisResult o) {
   buildCounterGoogleCloudDialogflowV2SentimentAnalysisResult++;
   if (buildCounterGoogleCloudDialogflowV2SentimentAnalysisResult < 3) {
-    checkGoogleCloudDialogflowV2Sentiment(o.queryTextSentiment);
+    checkGoogleCloudDialogflowV2Sentiment(
+        o.queryTextSentiment as api.GoogleCloudDialogflowV2Sentiment);
   }
   buildCounterGoogleCloudDialogflowV2SentimentAnalysisResult--;
 }
@@ -4012,8 +4145,10 @@
 void checkUnnamed5359(
     core.List<api.GoogleCloudDialogflowV2EntityTypeEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[0]);
-  checkGoogleCloudDialogflowV2EntityTypeEntity(o[1]);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[0] as api.GoogleCloudDialogflowV2EntityTypeEntity);
+  checkGoogleCloudDialogflowV2EntityTypeEntity(
+      o[1] as api.GoogleCloudDialogflowV2EntityTypeEntity);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2SessionEntityType = 0;
@@ -4113,7 +4248,8 @@
     checkUnnamed5361(o.effectsProfileId);
     unittest.expect(o.pitch, unittest.equals(42.0));
     unittest.expect(o.speakingRate, unittest.equals(42.0));
-    checkGoogleCloudDialogflowV2VoiceSelectionParams(o.voice);
+    checkGoogleCloudDialogflowV2VoiceSelectionParams(
+        o.voice as api.GoogleCloudDialogflowV2VoiceSelectionParams);
     unittest.expect(o.volumeGainDb, unittest.equals(42.0));
   }
   buildCounterGoogleCloudDialogflowV2SynthesizeSpeechConfig--;
@@ -4205,8 +4341,10 @@
 
 void checkUnnamed5363(core.List<api.GoogleCloudDialogflowV2ValidationError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2ValidationError(o[0]);
-  checkGoogleCloudDialogflowV2ValidationError(o[1]);
+  checkGoogleCloudDialogflowV2ValidationError(
+      o[0] as api.GoogleCloudDialogflowV2ValidationError);
+  checkGoogleCloudDialogflowV2ValidationError(
+      o[1] as api.GoogleCloudDialogflowV2ValidationError);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2ValidationResult = 0;
@@ -4274,8 +4412,10 @@
   buildCounterGoogleCloudDialogflowV2WebhookRequest++;
   if (buildCounterGoogleCloudDialogflowV2WebhookRequest < 3) {
     checkGoogleCloudDialogflowV2OriginalDetectIntentRequest(
-        o.originalDetectIntentRequest);
-    checkGoogleCloudDialogflowV2QueryResult(o.queryResult);
+        o.originalDetectIntentRequest
+            as api.GoogleCloudDialogflowV2OriginalDetectIntentRequest);
+    checkGoogleCloudDialogflowV2QueryResult(
+        o.queryResult as api.GoogleCloudDialogflowV2QueryResult);
     unittest.expect(o.responseId, unittest.equals('foo'));
     unittest.expect(o.session, unittest.equals('foo'));
   }
@@ -4291,8 +4431,10 @@
 
 void checkUnnamed5364(core.List<api.GoogleCloudDialogflowV2IntentMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2IntentMessage(o[0]);
-  checkGoogleCloudDialogflowV2IntentMessage(o[1]);
+  checkGoogleCloudDialogflowV2IntentMessage(
+      o[0] as api.GoogleCloudDialogflowV2IntentMessage);
+  checkGoogleCloudDialogflowV2IntentMessage(
+      o[1] as api.GoogleCloudDialogflowV2IntentMessage);
 }
 
 core.List<api.GoogleCloudDialogflowV2Context> buildUnnamed5365() {
@@ -4304,8 +4446,10 @@
 
 void checkUnnamed5365(core.List<api.GoogleCloudDialogflowV2Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2Context(o[0]);
-  checkGoogleCloudDialogflowV2Context(o[1]);
+  checkGoogleCloudDialogflowV2Context(
+      o[0] as api.GoogleCloudDialogflowV2Context);
+  checkGoogleCloudDialogflowV2Context(
+      o[1] as api.GoogleCloudDialogflowV2Context);
 }
 
 core.Map<core.String, core.Object> buildUnnamed5366() {
@@ -4347,8 +4491,10 @@
 void checkUnnamed5367(
     core.List<api.GoogleCloudDialogflowV2SessionEntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2SessionEntityType(o[0]);
-  checkGoogleCloudDialogflowV2SessionEntityType(o[1]);
+  checkGoogleCloudDialogflowV2SessionEntityType(
+      o[0] as api.GoogleCloudDialogflowV2SessionEntityType);
+  checkGoogleCloudDialogflowV2SessionEntityType(
+      o[1] as api.GoogleCloudDialogflowV2SessionEntityType);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2WebhookResponse = 0;
@@ -4373,7 +4519,8 @@
     api.GoogleCloudDialogflowV2WebhookResponse o) {
   buildCounterGoogleCloudDialogflowV2WebhookResponse++;
   if (buildCounterGoogleCloudDialogflowV2WebhookResponse < 3) {
-    checkGoogleCloudDialogflowV2EventInput(o.followupEventInput);
+    checkGoogleCloudDialogflowV2EventInput(
+        o.followupEventInput as api.GoogleCloudDialogflowV2EventInput);
     checkUnnamed5364(o.fulfillmentMessages);
     unittest.expect(o.fulfillmentText, unittest.equals('foo'));
     checkUnnamed5365(o.outputContexts);
@@ -4460,8 +4607,10 @@
 
 void checkUnnamed5368(core.List<api.GoogleCloudDialogflowV2beta1EntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1EntityType(o[0]);
-  checkGoogleCloudDialogflowV2beta1EntityType(o[1]);
+  checkGoogleCloudDialogflowV2beta1EntityType(
+      o[0] as api.GoogleCloudDialogflowV2beta1EntityType);
+  checkGoogleCloudDialogflowV2beta1EntityType(
+      o[1] as api.GoogleCloudDialogflowV2beta1EntityType);
 }
 
 core.int
@@ -4497,8 +4646,10 @@
 
 void checkUnnamed5369(core.List<api.GoogleCloudDialogflowV2beta1Intent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1Intent(o[0]);
-  checkGoogleCloudDialogflowV2beta1Intent(o[1]);
+  checkGoogleCloudDialogflowV2beta1Intent(
+      o[0] as api.GoogleCloudDialogflowV2beta1Intent);
+  checkGoogleCloudDialogflowV2beta1Intent(
+      o[1] as api.GoogleCloudDialogflowV2beta1Intent);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse = 0;
@@ -4533,8 +4684,10 @@
 void checkUnnamed5370(
     core.List<api.GoogleCloudDialogflowV2beta1SmartMessagingEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1SmartMessagingEntry(o[0]);
-  checkGoogleCloudDialogflowV2beta1SmartMessagingEntry(o[1]);
+  checkGoogleCloudDialogflowV2beta1SmartMessagingEntry(
+      o[0] as api.GoogleCloudDialogflowV2beta1SmartMessagingEntry);
+  checkGoogleCloudDialogflowV2beta1SmartMessagingEntry(
+      o[1] as api.GoogleCloudDialogflowV2beta1SmartMessagingEntry);
 }
 
 core.int
@@ -4628,8 +4781,10 @@
 void checkUnnamed5372(
     core.List<api.GoogleCloudDialogflowV2beta1EntityTypeEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(o[0]);
-  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(o[1]);
+  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(
+      o[0] as api.GoogleCloudDialogflowV2beta1EntityTypeEntity);
+  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(
+      o[1] as api.GoogleCloudDialogflowV2beta1EntityTypeEntity);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1EntityType = 0;
@@ -4785,8 +4940,8 @@
 
 void checkUnnamed5375(core.List<api.GoogleRpcStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleRpcStatus(o[0]);
-  checkGoogleRpcStatus(o[1]);
+  checkGoogleRpcStatus(o[0] as api.GoogleRpcStatus);
+  checkGoogleRpcStatus(o[1] as api.GoogleRpcStatus);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1ImportDocumentsResponse = 0;
@@ -4847,8 +5002,10 @@
 void checkUnnamed5378(
     core.List<api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo);
+  checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo);
 }
 
 core.List<core.String> buildUnnamed5379() {
@@ -4874,8 +5031,10 @@
 void checkUnnamed5380(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessage(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessage(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessage(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessage);
+  checkGoogleCloudDialogflowV2beta1IntentMessage(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessage);
 }
 
 core.List<api.GoogleCloudDialogflowV2beta1Context> buildUnnamed5381() {
@@ -4887,8 +5046,10 @@
 
 void checkUnnamed5381(core.List<api.GoogleCloudDialogflowV2beta1Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1Context(o[0]);
-  checkGoogleCloudDialogflowV2beta1Context(o[1]);
+  checkGoogleCloudDialogflowV2beta1Context(
+      o[0] as api.GoogleCloudDialogflowV2beta1Context);
+  checkGoogleCloudDialogflowV2beta1Context(
+      o[1] as api.GoogleCloudDialogflowV2beta1Context);
 }
 
 core.List<api.GoogleCloudDialogflowV2beta1IntentParameter> buildUnnamed5382() {
@@ -4901,8 +5062,10 @@
 void checkUnnamed5382(
     core.List<api.GoogleCloudDialogflowV2beta1IntentParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentParameter(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentParameter(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentParameter(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentParameter);
+  checkGoogleCloudDialogflowV2beta1IntentParameter(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentParameter);
 }
 
 core.List<api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase>
@@ -4916,8 +5079,10 @@
 void checkUnnamed5383(
     core.List<api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase);
+  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1Intent = 0;
@@ -5078,36 +5243,55 @@
     api.GoogleCloudDialogflowV2beta1IntentMessage o) {
   buildCounterGoogleCloudDialogflowV2beta1IntentMessage++;
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessage < 3) {
-    checkGoogleCloudDialogflowV2beta1IntentMessageBasicCard(o.basicCard);
+    checkGoogleCloudDialogflowV2beta1IntentMessageBasicCard(
+        o.basicCard as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCard);
     checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard(
-        o.browseCarouselCard);
-    checkGoogleCloudDialogflowV2beta1IntentMessageCard(o.card);
+        o.browseCarouselCard
+            as api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard);
+    checkGoogleCloudDialogflowV2beta1IntentMessageCard(
+        o.card as api.GoogleCloudDialogflowV2beta1IntentMessageCard);
     checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect(
-        o.carouselSelect);
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.image);
+        o.carouselSelect
+            as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     checkGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion(
-        o.linkOutSuggestion);
-    checkGoogleCloudDialogflowV2beta1IntentMessageListSelect(o.listSelect);
-    checkGoogleCloudDialogflowV2beta1IntentMessageMediaContent(o.mediaContent);
+        o.linkOutSuggestion
+            as api.GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion);
+    checkGoogleCloudDialogflowV2beta1IntentMessageListSelect(o.listSelect
+        as api.GoogleCloudDialogflowV2beta1IntentMessageListSelect);
+    checkGoogleCloudDialogflowV2beta1IntentMessageMediaContent(o.mediaContent
+        as api.GoogleCloudDialogflowV2beta1IntentMessageMediaContent);
     checkUnnamed5384(o.payload);
     unittest.expect(o.platform, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1IntentMessageQuickReplies(o.quickReplies);
+    checkGoogleCloudDialogflowV2beta1IntentMessageQuickReplies(o.quickReplies
+        as api.GoogleCloudDialogflowV2beta1IntentMessageQuickReplies);
     checkGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard(
-        o.rbmCarouselRichCard);
+        o.rbmCarouselRichCard
+            as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard);
     checkGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard(
-        o.rbmStandaloneRichCard);
-    checkGoogleCloudDialogflowV2beta1IntentMessageRbmText(o.rbmText);
+        o.rbmStandaloneRichCard
+            as api.GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard);
+    checkGoogleCloudDialogflowV2beta1IntentMessageRbmText(
+        o.rbmText as api.GoogleCloudDialogflowV2beta1IntentMessageRbmText);
     checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses(
-        o.simpleResponses);
-    checkGoogleCloudDialogflowV2beta1IntentMessageSuggestions(o.suggestions);
-    checkGoogleCloudDialogflowV2beta1IntentMessageTableCard(o.tableCard);
+        o.simpleResponses
+            as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses);
+    checkGoogleCloudDialogflowV2beta1IntentMessageSuggestions(o.suggestions
+        as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestions);
+    checkGoogleCloudDialogflowV2beta1IntentMessageTableCard(
+        o.tableCard as api.GoogleCloudDialogflowV2beta1IntentMessageTableCard);
     checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio(
-        o.telephonyPlayAudio);
+        o.telephonyPlayAudio
+            as api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio);
     checkGoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech(
-        o.telephonySynthesizeSpeech);
-    checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall(
-        o.telephonyTransferCall);
-    checkGoogleCloudDialogflowV2beta1IntentMessageText(o.text);
+        o.telephonySynthesizeSpeech as api
+            .GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech);
+    checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall(o
+            .telephonyTransferCall
+        as api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall);
+    checkGoogleCloudDialogflowV2beta1IntentMessageText(
+        o.text as api.GoogleCloudDialogflowV2beta1IntentMessageText);
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessage--;
 }
@@ -5123,8 +5307,10 @@
 void checkUnnamed5385(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton);
+  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageBasicCard = 0;
@@ -5149,7 +5335,8 @@
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageBasicCard < 3) {
     checkUnnamed5385(o.buttons);
     unittest.expect(o.formattedText, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.image);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     unittest.expect(o.subtitle, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -5178,7 +5365,8 @@
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton <
       3) {
     checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction(
-        o.openUriAction);
+        o.openUriAction as api
+            .GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton--;
@@ -5229,9 +5417,11 @@
         o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
-      o[0]);
+      o[0] as api
+          .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
   checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
-      o[1]);
+      o[1] as api
+          .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
 }
 
 core.int
@@ -5289,9 +5479,11 @@
       3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.footer, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.image);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
-        o.openUriAction);
+        o.openUriAction as api
+            .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem--;
@@ -5337,8 +5529,10 @@
 void checkUnnamed5387(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageCardButton> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageCardButton);
+  checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageCardButton);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageCard = 0;
@@ -5403,8 +5597,10 @@
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem);
+  checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect =
@@ -5452,8 +5648,10 @@
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem <
       3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.image);
-    checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(o.info);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
+    checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(
+        o.info as api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem--;
@@ -5545,8 +5743,10 @@
 void checkUnnamed5389(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem);
+  checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageListSelect = 0;
@@ -5595,8 +5795,10 @@
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageListSelectItem++;
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageListSelectItem < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.image);
-    checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(o.info);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
+    checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(
+        o.info as api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageListSelectItem--;
@@ -5620,9 +5822,11 @@
         o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject(
-      o[0]);
+      o[0] as api
+          .GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject);
   checkGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject(
-      o[1]);
+      o[1] as api
+          .GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageMediaContent = 0;
@@ -5676,8 +5880,10 @@
       3) {
     unittest.expect(o.contentUrl, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.icon);
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.largeImage);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.icon as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.largeImage as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject--;
@@ -5730,8 +5936,10 @@
 void checkUnnamed5392(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion);
+  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent =
@@ -5756,8 +5964,8 @@
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent++;
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia(
-        o.media);
+    checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia(o.media
+        as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia);
     checkUnnamed5392(o.suggestions);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -5804,8 +6012,10 @@
 void checkUnnamed5393(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent);
+  checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard =
@@ -5856,7 +6066,8 @@
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard++;
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard <
       3) {
-    checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(o.cardContent);
+    checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(o.cardContent
+        as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent);
     unittest.expect(o.cardOrientation, unittest.equals('foo'));
     unittest.expect(o.thumbnailImageAlignment, unittest.equals('foo'));
   }
@@ -5890,12 +6101,15 @@
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction <
       3) {
     checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial(
-        o.dial);
+        o.dial as api
+            .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial);
     checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri(
-        o.openUrl);
+        o.openUrl as api
+            .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri);
     unittest.expect(o.postbackData, unittest.equals('foo'));
     checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation(
-        o.shareLocation);
+        o.shareLocation as api
+            .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction--;
@@ -6022,8 +6236,10 @@
     api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion o) {
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion++;
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion < 3) {
-    checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction(o.action);
-    checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply(o.reply);
+    checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction(o.action
+        as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction);
+    checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply(o.reply
+        as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply);
   }
   buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion--;
 }
@@ -6039,8 +6255,10 @@
 void checkUnnamed5394(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion);
+  checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageRbmText = 0;
@@ -6140,8 +6358,10 @@
 void checkUnnamed5396(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse);
+  checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses =
@@ -6200,8 +6420,10 @@
 void checkUnnamed5397(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion);
+  checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageSuggestions = 0;
@@ -6236,8 +6458,10 @@
 void checkUnnamed5398(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton);
+  checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton);
 }
 
 core.List<api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties>
@@ -6252,8 +6476,10 @@
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties);
+  checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties);
 }
 
 core.List<api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow>
@@ -6267,8 +6493,10 @@
 void checkUnnamed5400(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow);
+  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageTableCard = 0;
@@ -6294,7 +6522,8 @@
   if (buildCounterGoogleCloudDialogflowV2beta1IntentMessageTableCard < 3) {
     checkUnnamed5398(o.buttons);
     checkUnnamed5399(o.columnProperties);
-    checkGoogleCloudDialogflowV2beta1IntentMessageImage(o.image);
+    checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+        o.image as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     checkUnnamed5400(o.rows);
     unittest.expect(o.subtitle, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -6334,8 +6563,10 @@
 void checkUnnamed5401(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell);
+  checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentMessageTableCardRow = 0;
@@ -6531,8 +6762,10 @@
 void checkUnnamed5404(
     core.List<api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart);
+  checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1IntentTrainingPhrase = 0;
@@ -6600,8 +6833,10 @@
 void checkUnnamed5405(
     core.List<api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(o[0]);
-  checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(o[1]);
+  checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(
+      o[0] as api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer);
+  checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(
+      o[1] as api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1KnowledgeAnswers = 0;
@@ -6693,7 +6928,8 @@
   buildCounterGoogleCloudDialogflowV2beta1LabelConversationResponse++;
   if (buildCounterGoogleCloudDialogflowV2beta1LabelConversationResponse < 3) {
     checkGoogleCloudDialogflowV2beta1AnnotatedConversationDataset(
-        o.annotatedConversationDataset);
+        o.annotatedConversationDataset
+            as api.GoogleCloudDialogflowV2beta1AnnotatedConversationDataset);
   }
   buildCounterGoogleCloudDialogflowV2beta1LabelConversationResponse--;
 }
@@ -6792,8 +7028,10 @@
 void checkUnnamed5408(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessage(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessage(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessage(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessage);
+  checkGoogleCloudDialogflowV2beta1IntentMessage(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessage);
 }
 
 core.List<api.GoogleCloudDialogflowV2beta1Context> buildUnnamed5409() {
@@ -6805,8 +7043,10 @@
 
 void checkUnnamed5409(core.List<api.GoogleCloudDialogflowV2beta1Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1Context(o[0]);
-  checkGoogleCloudDialogflowV2beta1Context(o[1]);
+  checkGoogleCloudDialogflowV2beta1Context(
+      o[0] as api.GoogleCloudDialogflowV2beta1Context);
+  checkGoogleCloudDialogflowV2beta1Context(
+      o[1] as api.GoogleCloudDialogflowV2beta1Context);
 }
 
 core.Map<core.String, core.Object> buildUnnamed5410() {
@@ -6904,15 +7144,18 @@
     checkUnnamed5407(o.diagnosticInfo);
     checkUnnamed5408(o.fulfillmentMessages);
     unittest.expect(o.fulfillmentText, unittest.equals('foo'));
-    checkGoogleCloudDialogflowV2beta1Intent(o.intent);
+    checkGoogleCloudDialogflowV2beta1Intent(
+        o.intent as api.GoogleCloudDialogflowV2beta1Intent);
     unittest.expect(o.intentDetectionConfidence, unittest.equals(42.0));
-    checkGoogleCloudDialogflowV2beta1KnowledgeAnswers(o.knowledgeAnswers);
+    checkGoogleCloudDialogflowV2beta1KnowledgeAnswers(
+        o.knowledgeAnswers as api.GoogleCloudDialogflowV2beta1KnowledgeAnswers);
     unittest.expect(o.languageCode, unittest.equals('foo'));
     checkUnnamed5409(o.outputContexts);
     checkUnnamed5410(o.parameters);
     unittest.expect(o.queryText, unittest.equals('foo'));
     checkGoogleCloudDialogflowV2beta1SentimentAnalysisResult(
-        o.sentimentAnalysisResult);
+        o.sentimentAnalysisResult
+            as api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult);
     unittest.expect(o.speechRecognitionConfidence, unittest.equals(42.0));
     checkUnnamed5411(o.webhookPayload);
     unittest.expect(o.webhookSource, unittest.equals('foo'));
@@ -6959,7 +7202,8 @@
     api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult o) {
   buildCounterGoogleCloudDialogflowV2beta1SentimentAnalysisResult++;
   if (buildCounterGoogleCloudDialogflowV2beta1SentimentAnalysisResult < 3) {
-    checkGoogleCloudDialogflowV2beta1Sentiment(o.queryTextSentiment);
+    checkGoogleCloudDialogflowV2beta1Sentiment(
+        o.queryTextSentiment as api.GoogleCloudDialogflowV2beta1Sentiment);
   }
   buildCounterGoogleCloudDialogflowV2beta1SentimentAnalysisResult--;
 }
@@ -6974,8 +7218,10 @@
 void checkUnnamed5412(
     core.List<api.GoogleCloudDialogflowV2beta1EntityTypeEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(o[0]);
-  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(o[1]);
+  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(
+      o[0] as api.GoogleCloudDialogflowV2beta1EntityTypeEntity);
+  checkGoogleCloudDialogflowV2beta1EntityTypeEntity(
+      o[1] as api.GoogleCloudDialogflowV2beta1EntityTypeEntity);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1SessionEntityType = 0;
@@ -7022,7 +7268,8 @@
     api.GoogleCloudDialogflowV2beta1SmartMessagingEntry o) {
   buildCounterGoogleCloudDialogflowV2beta1SmartMessagingEntry++;
   if (buildCounterGoogleCloudDialogflowV2beta1SmartMessagingEntry < 3) {
-    checkGoogleCloudDialogflowV2beta1SmartMessagingEntryInfo(o.messageInfo);
+    checkGoogleCloudDialogflowV2beta1SmartMessagingEntryInfo(o.messageInfo
+        as api.GoogleCloudDialogflowV2beta1SmartMessagingEntryInfo);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.rawText, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -7063,8 +7310,10 @@
 void checkUnnamed5413(
     core.List<api.GoogleCloudDialogflowV2beta1QueryResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1QueryResult(o[0]);
-  checkGoogleCloudDialogflowV2beta1QueryResult(o[1]);
+  checkGoogleCloudDialogflowV2beta1QueryResult(
+      o[0] as api.GoogleCloudDialogflowV2beta1QueryResult);
+  checkGoogleCloudDialogflowV2beta1QueryResult(
+      o[1] as api.GoogleCloudDialogflowV2beta1QueryResult);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1WebhookRequest = 0;
@@ -7090,8 +7339,10 @@
   if (buildCounterGoogleCloudDialogflowV2beta1WebhookRequest < 3) {
     checkUnnamed5413(o.alternativeQueryResults);
     checkGoogleCloudDialogflowV2beta1OriginalDetectIntentRequest(
-        o.originalDetectIntentRequest);
-    checkGoogleCloudDialogflowV2beta1QueryResult(o.queryResult);
+        o.originalDetectIntentRequest
+            as api.GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest);
+    checkGoogleCloudDialogflowV2beta1QueryResult(
+        o.queryResult as api.GoogleCloudDialogflowV2beta1QueryResult);
     unittest.expect(o.responseId, unittest.equals('foo'));
     unittest.expect(o.session, unittest.equals('foo'));
   }
@@ -7108,8 +7359,10 @@
 void checkUnnamed5414(
     core.List<api.GoogleCloudDialogflowV2beta1IntentMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1IntentMessage(o[0]);
-  checkGoogleCloudDialogflowV2beta1IntentMessage(o[1]);
+  checkGoogleCloudDialogflowV2beta1IntentMessage(
+      o[0] as api.GoogleCloudDialogflowV2beta1IntentMessage);
+  checkGoogleCloudDialogflowV2beta1IntentMessage(
+      o[1] as api.GoogleCloudDialogflowV2beta1IntentMessage);
 }
 
 core.List<api.GoogleCloudDialogflowV2beta1Context> buildUnnamed5415() {
@@ -7121,8 +7374,10 @@
 
 void checkUnnamed5415(core.List<api.GoogleCloudDialogflowV2beta1Context> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1Context(o[0]);
-  checkGoogleCloudDialogflowV2beta1Context(o[1]);
+  checkGoogleCloudDialogflowV2beta1Context(
+      o[0] as api.GoogleCloudDialogflowV2beta1Context);
+  checkGoogleCloudDialogflowV2beta1Context(
+      o[1] as api.GoogleCloudDialogflowV2beta1Context);
 }
 
 core.Map<core.String, core.Object> buildUnnamed5416() {
@@ -7165,8 +7420,10 @@
 void checkUnnamed5417(
     core.List<api.GoogleCloudDialogflowV2beta1SessionEntityType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudDialogflowV2beta1SessionEntityType(o[0]);
-  checkGoogleCloudDialogflowV2beta1SessionEntityType(o[1]);
+  checkGoogleCloudDialogflowV2beta1SessionEntityType(
+      o[0] as api.GoogleCloudDialogflowV2beta1SessionEntityType);
+  checkGoogleCloudDialogflowV2beta1SessionEntityType(
+      o[1] as api.GoogleCloudDialogflowV2beta1SessionEntityType);
 }
 
 core.int buildCounterGoogleCloudDialogflowV2beta1WebhookResponse = 0;
@@ -7193,7 +7450,8 @@
   buildCounterGoogleCloudDialogflowV2beta1WebhookResponse++;
   if (buildCounterGoogleCloudDialogflowV2beta1WebhookResponse < 3) {
     unittest.expect(o.endInteraction, unittest.isTrue);
-    checkGoogleCloudDialogflowV2beta1EventInput(o.followupEventInput);
+    checkGoogleCloudDialogflowV2beta1EventInput(
+        o.followupEventInput as api.GoogleCloudDialogflowV2beta1EventInput);
     checkUnnamed5414(o.fulfillmentMessages);
     unittest.expect(o.fulfillmentText, unittest.equals('foo'));
     checkUnnamed5415(o.outputContexts);
@@ -7348,8 +7606,8 @@
 
 void checkUnnamed5419(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleLongrunningOperation(o[0]);
-  checkGoogleLongrunningOperation(o[1]);
+  checkGoogleLongrunningOperation(o[0] as api.GoogleLongrunningOperation);
+  checkGoogleLongrunningOperation(o[1] as api.GoogleLongrunningOperation);
 }
 
 core.int buildCounterGoogleLongrunningListOperationsResponse = 0;
@@ -7452,7 +7710,7 @@
   buildCounterGoogleLongrunningOperation++;
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkGoogleRpcStatus(o.error);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
     checkUnnamed5420(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5421(o.response);
@@ -7570,7 +7828,8 @@
           buildGoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata();
       var od = api.GoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata(od);
+      checkGoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata(od
+          as api.GoogleCloudDialogflowCxV3beta1CreateVersionOperationMetadata);
     });
   });
 
@@ -7580,7 +7839,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1ExportAgentResponse();
       var od = api.GoogleCloudDialogflowCxV3beta1ExportAgentResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ExportAgentResponse(od);
+      checkGoogleCloudDialogflowCxV3beta1ExportAgentResponse(
+          od as api.GoogleCloudDialogflowCxV3beta1ExportAgentResponse);
     });
   });
 
@@ -7590,7 +7850,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1ImportAgentResponse();
       var od = api.GoogleCloudDialogflowCxV3beta1ImportAgentResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ImportAgentResponse(od);
+      checkGoogleCloudDialogflowCxV3beta1ImportAgentResponse(
+          od as api.GoogleCloudDialogflowCxV3beta1ImportAgentResponse);
     });
   });
 
@@ -7598,7 +7859,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowCxV3beta1PageInfo();
       var od = api.GoogleCloudDialogflowCxV3beta1PageInfo.fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1PageInfo(od);
+      checkGoogleCloudDialogflowCxV3beta1PageInfo(
+          od as api.GoogleCloudDialogflowCxV3beta1PageInfo);
     });
   });
 
@@ -7608,7 +7870,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1PageInfoFormInfo();
       var od = api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfo.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfo(od);
+      checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfo(
+          od as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfo);
     });
   });
 
@@ -7620,7 +7883,8 @@
           buildGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo();
       var od = api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(od);
+      checkGoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo(od
+          as api.GoogleCloudDialogflowCxV3beta1PageInfoFormInfoParameterInfo);
     });
   });
 
@@ -7630,7 +7894,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessage();
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessage.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessage(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessage(
+          od as api.GoogleCloudDialogflowCxV3beta1ResponseMessage);
     });
   });
 
@@ -7643,7 +7908,9 @@
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess
               .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess(od
+          as api
+              .GoogleCloudDialogflowCxV3beta1ResponseMessageConversationSuccess);
     });
   });
 
@@ -7655,7 +7922,8 @@
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction();
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction(od
+          as api.GoogleCloudDialogflowCxV3beta1ResponseMessageEndInteraction);
     });
   });
 
@@ -7667,7 +7935,8 @@
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff();
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff(od
+          as api.GoogleCloudDialogflowCxV3beta1ResponseMessageLiveAgentHandoff);
     });
   });
 
@@ -7678,7 +7947,8 @@
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio(
+          od as api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudio);
     });
   });
 
@@ -7691,7 +7961,9 @@
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment
               .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment(od
+          as api
+              .GoogleCloudDialogflowCxV3beta1ResponseMessageMixedAudioSegment);
     });
   });
 
@@ -7703,7 +7975,8 @@
           buildGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText();
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText(od
+          as api.GoogleCloudDialogflowCxV3beta1ResponseMessageOutputAudioText);
     });
   });
 
@@ -7714,7 +7987,8 @@
       var od =
           api.GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio(
+          od as api.GoogleCloudDialogflowCxV3beta1ResponseMessagePlayAudio);
     });
   });
 
@@ -7724,7 +7998,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1ResponseMessageText();
       var od = api.GoogleCloudDialogflowCxV3beta1ResponseMessageText.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1ResponseMessageText(od);
+      checkGoogleCloudDialogflowCxV3beta1ResponseMessageText(
+          od as api.GoogleCloudDialogflowCxV3beta1ResponseMessageText);
     });
   });
 
@@ -7733,7 +8008,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1SessionInfo();
       var od =
           api.GoogleCloudDialogflowCxV3beta1SessionInfo.fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1SessionInfo(od);
+      checkGoogleCloudDialogflowCxV3beta1SessionInfo(
+          od as api.GoogleCloudDialogflowCxV3beta1SessionInfo);
     });
   });
 
@@ -7742,7 +8018,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookRequest();
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1WebhookRequest(od);
+      checkGoogleCloudDialogflowCxV3beta1WebhookRequest(
+          od as api.GoogleCloudDialogflowCxV3beta1WebhookRequest);
     });
   });
 
@@ -7754,7 +8031,8 @@
           buildGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo();
       var od = api.GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo(od);
+      checkGoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo(od
+          as api.GoogleCloudDialogflowCxV3beta1WebhookRequestFulfillmentInfo);
     });
   });
 
@@ -7765,7 +8043,8 @@
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo(od);
+      checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo(
+          od as api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfo);
     });
   });
 
@@ -7779,7 +8058,8 @@
           api.GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue(
-          od);
+          od as api
+              .GoogleCloudDialogflowCxV3beta1WebhookRequestIntentInfoIntentParameterValue);
     });
   });
 
@@ -7789,7 +8069,8 @@
       var o = buildGoogleCloudDialogflowCxV3beta1WebhookResponse();
       var od = api.GoogleCloudDialogflowCxV3beta1WebhookResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1WebhookResponse(od);
+      checkGoogleCloudDialogflowCxV3beta1WebhookResponse(
+          od as api.GoogleCloudDialogflowCxV3beta1WebhookResponse);
     });
   });
 
@@ -7802,7 +8083,9 @@
       var od =
           api.GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse
               .fromJson(o.toJson());
-      checkGoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse(od);
+      checkGoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse(od
+          as api
+              .GoogleCloudDialogflowCxV3beta1WebhookResponseFulfillmentResponse);
     });
   });
 
@@ -7810,7 +8093,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2Agent();
       var od = api.GoogleCloudDialogflowV2Agent.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2Agent(od);
+      checkGoogleCloudDialogflowV2Agent(od as api.GoogleCloudDialogflowV2Agent);
     });
   });
 
@@ -7819,7 +8102,8 @@
       var o = buildGoogleCloudDialogflowV2AnnotatedMessagePart();
       var od =
           api.GoogleCloudDialogflowV2AnnotatedMessagePart.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2AnnotatedMessagePart(od);
+      checkGoogleCloudDialogflowV2AnnotatedMessagePart(
+          od as api.GoogleCloudDialogflowV2AnnotatedMessagePart);
     });
   });
 
@@ -7829,7 +8113,8 @@
       var o = buildGoogleCloudDialogflowV2BatchCreateEntitiesRequest();
       var od = api.GoogleCloudDialogflowV2BatchCreateEntitiesRequest.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2BatchCreateEntitiesRequest(od);
+      checkGoogleCloudDialogflowV2BatchCreateEntitiesRequest(
+          od as api.GoogleCloudDialogflowV2BatchCreateEntitiesRequest);
     });
   });
 
@@ -7839,7 +8124,8 @@
       var o = buildGoogleCloudDialogflowV2BatchDeleteEntitiesRequest();
       var od = api.GoogleCloudDialogflowV2BatchDeleteEntitiesRequest.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2BatchDeleteEntitiesRequest(od);
+      checkGoogleCloudDialogflowV2BatchDeleteEntitiesRequest(
+          od as api.GoogleCloudDialogflowV2BatchDeleteEntitiesRequest);
     });
   });
 
@@ -7850,7 +8136,8 @@
       var od =
           api.GoogleCloudDialogflowV2BatchDeleteEntityTypesRequest.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2BatchDeleteEntityTypesRequest(od);
+      checkGoogleCloudDialogflowV2BatchDeleteEntityTypesRequest(
+          od as api.GoogleCloudDialogflowV2BatchDeleteEntityTypesRequest);
     });
   });
 
@@ -7860,7 +8147,8 @@
       var o = buildGoogleCloudDialogflowV2BatchDeleteIntentsRequest();
       var od = api.GoogleCloudDialogflowV2BatchDeleteIntentsRequest.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2BatchDeleteIntentsRequest(od);
+      checkGoogleCloudDialogflowV2BatchDeleteIntentsRequest(
+          od as api.GoogleCloudDialogflowV2BatchDeleteIntentsRequest);
     });
   });
 
@@ -7870,7 +8158,8 @@
       var o = buildGoogleCloudDialogflowV2BatchUpdateEntitiesRequest();
       var od = api.GoogleCloudDialogflowV2BatchUpdateEntitiesRequest.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2BatchUpdateEntitiesRequest(od);
+      checkGoogleCloudDialogflowV2BatchUpdateEntitiesRequest(
+          od as api.GoogleCloudDialogflowV2BatchUpdateEntitiesRequest);
     });
   });
 
@@ -7881,7 +8170,8 @@
       var od =
           api.GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest(od);
+      checkGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest(
+          od as api.GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest);
     });
   });
 
@@ -7892,7 +8182,8 @@
       var od =
           api.GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2BatchUpdateEntityTypesResponse(od);
+      checkGoogleCloudDialogflowV2BatchUpdateEntityTypesResponse(
+          od as api.GoogleCloudDialogflowV2BatchUpdateEntityTypesResponse);
     });
   });
 
@@ -7902,7 +8193,8 @@
       var o = buildGoogleCloudDialogflowV2BatchUpdateIntentsRequest();
       var od = api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2BatchUpdateIntentsRequest(od);
+      checkGoogleCloudDialogflowV2BatchUpdateIntentsRequest(
+          od as api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest);
     });
   });
 
@@ -7912,7 +8204,8 @@
       var o = buildGoogleCloudDialogflowV2BatchUpdateIntentsResponse();
       var od = api.GoogleCloudDialogflowV2BatchUpdateIntentsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2BatchUpdateIntentsResponse(od);
+      checkGoogleCloudDialogflowV2BatchUpdateIntentsResponse(
+          od as api.GoogleCloudDialogflowV2BatchUpdateIntentsResponse);
     });
   });
 
@@ -7920,7 +8213,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2Context();
       var od = api.GoogleCloudDialogflowV2Context.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2Context(od);
+      checkGoogleCloudDialogflowV2Context(
+          od as api.GoogleCloudDialogflowV2Context);
     });
   });
 
@@ -7929,7 +8223,8 @@
       var o = buildGoogleCloudDialogflowV2ConversationEvent();
       var od =
           api.GoogleCloudDialogflowV2ConversationEvent.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ConversationEvent(od);
+      checkGoogleCloudDialogflowV2ConversationEvent(
+          od as api.GoogleCloudDialogflowV2ConversationEvent);
     });
   });
 
@@ -7938,7 +8233,8 @@
       var o = buildGoogleCloudDialogflowV2DetectIntentRequest();
       var od =
           api.GoogleCloudDialogflowV2DetectIntentRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2DetectIntentRequest(od);
+      checkGoogleCloudDialogflowV2DetectIntentRequest(
+          od as api.GoogleCloudDialogflowV2DetectIntentRequest);
     });
   });
 
@@ -7947,7 +8243,8 @@
       var o = buildGoogleCloudDialogflowV2DetectIntentResponse();
       var od =
           api.GoogleCloudDialogflowV2DetectIntentResponse.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2DetectIntentResponse(od);
+      checkGoogleCloudDialogflowV2DetectIntentResponse(
+          od as api.GoogleCloudDialogflowV2DetectIntentResponse);
     });
   });
 
@@ -7955,7 +8252,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2EntityType();
       var od = api.GoogleCloudDialogflowV2EntityType.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2EntityType(od);
+      checkGoogleCloudDialogflowV2EntityType(
+          od as api.GoogleCloudDialogflowV2EntityType);
     });
   });
 
@@ -7963,7 +8261,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2EntityTypeBatch();
       var od = api.GoogleCloudDialogflowV2EntityTypeBatch.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2EntityTypeBatch(od);
+      checkGoogleCloudDialogflowV2EntityTypeBatch(
+          od as api.GoogleCloudDialogflowV2EntityTypeBatch);
     });
   });
 
@@ -7971,7 +8270,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2EntityTypeEntity();
       var od = api.GoogleCloudDialogflowV2EntityTypeEntity.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2EntityTypeEntity(od);
+      checkGoogleCloudDialogflowV2EntityTypeEntity(
+          od as api.GoogleCloudDialogflowV2EntityTypeEntity);
     });
   });
 
@@ -7979,7 +8279,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2Environment();
       var od = api.GoogleCloudDialogflowV2Environment.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2Environment(od);
+      checkGoogleCloudDialogflowV2Environment(
+          od as api.GoogleCloudDialogflowV2Environment);
     });
   });
 
@@ -7987,7 +8288,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2EventInput();
       var od = api.GoogleCloudDialogflowV2EventInput.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2EventInput(od);
+      checkGoogleCloudDialogflowV2EventInput(
+          od as api.GoogleCloudDialogflowV2EventInput);
     });
   });
 
@@ -7996,7 +8298,8 @@
       var o = buildGoogleCloudDialogflowV2ExportAgentRequest();
       var od =
           api.GoogleCloudDialogflowV2ExportAgentRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ExportAgentRequest(od);
+      checkGoogleCloudDialogflowV2ExportAgentRequest(
+          od as api.GoogleCloudDialogflowV2ExportAgentRequest);
     });
   });
 
@@ -8005,7 +8308,8 @@
       var o = buildGoogleCloudDialogflowV2ExportAgentResponse();
       var od =
           api.GoogleCloudDialogflowV2ExportAgentResponse.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ExportAgentResponse(od);
+      checkGoogleCloudDialogflowV2ExportAgentResponse(
+          od as api.GoogleCloudDialogflowV2ExportAgentResponse);
     });
   });
 
@@ -8013,7 +8317,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2Fulfillment();
       var od = api.GoogleCloudDialogflowV2Fulfillment.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2Fulfillment(od);
+      checkGoogleCloudDialogflowV2Fulfillment(
+          od as api.GoogleCloudDialogflowV2Fulfillment);
     });
   });
 
@@ -8022,7 +8327,8 @@
       var o = buildGoogleCloudDialogflowV2FulfillmentFeature();
       var od =
           api.GoogleCloudDialogflowV2FulfillmentFeature.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2FulfillmentFeature(od);
+      checkGoogleCloudDialogflowV2FulfillmentFeature(
+          od as api.GoogleCloudDialogflowV2FulfillmentFeature);
     });
   });
 
@@ -8032,7 +8338,8 @@
       var o = buildGoogleCloudDialogflowV2FulfillmentGenericWebService();
       var od = api.GoogleCloudDialogflowV2FulfillmentGenericWebService.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2FulfillmentGenericWebService(od);
+      checkGoogleCloudDialogflowV2FulfillmentGenericWebService(
+          od as api.GoogleCloudDialogflowV2FulfillmentGenericWebService);
     });
   });
 
@@ -8041,7 +8348,8 @@
       var o = buildGoogleCloudDialogflowV2ImportAgentRequest();
       var od =
           api.GoogleCloudDialogflowV2ImportAgentRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ImportAgentRequest(od);
+      checkGoogleCloudDialogflowV2ImportAgentRequest(
+          od as api.GoogleCloudDialogflowV2ImportAgentRequest);
     });
   });
 
@@ -8051,7 +8359,8 @@
       var o = buildGoogleCloudDialogflowV2ImportDocumentsResponse();
       var od = api.GoogleCloudDialogflowV2ImportDocumentsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2ImportDocumentsResponse(od);
+      checkGoogleCloudDialogflowV2ImportDocumentsResponse(
+          od as api.GoogleCloudDialogflowV2ImportDocumentsResponse);
     });
   });
 
@@ -8059,7 +8368,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2InputAudioConfig();
       var od = api.GoogleCloudDialogflowV2InputAudioConfig.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2InputAudioConfig(od);
+      checkGoogleCloudDialogflowV2InputAudioConfig(
+          od as api.GoogleCloudDialogflowV2InputAudioConfig);
     });
   });
 
@@ -8067,7 +8377,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2Intent();
       var od = api.GoogleCloudDialogflowV2Intent.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2Intent(od);
+      checkGoogleCloudDialogflowV2Intent(
+          od as api.GoogleCloudDialogflowV2Intent);
     });
   });
 
@@ -8075,7 +8386,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2IntentBatch();
       var od = api.GoogleCloudDialogflowV2IntentBatch.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentBatch(od);
+      checkGoogleCloudDialogflowV2IntentBatch(
+          od as api.GoogleCloudDialogflowV2IntentBatch);
     });
   });
 
@@ -8085,7 +8397,8 @@
       var o = buildGoogleCloudDialogflowV2IntentFollowupIntentInfo();
       var od = api.GoogleCloudDialogflowV2IntentFollowupIntentInfo.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(od);
+      checkGoogleCloudDialogflowV2IntentFollowupIntentInfo(
+          od as api.GoogleCloudDialogflowV2IntentFollowupIntentInfo);
     });
   });
 
@@ -8093,7 +8406,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2IntentMessage();
       var od = api.GoogleCloudDialogflowV2IntentMessage.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessage(od);
+      checkGoogleCloudDialogflowV2IntentMessage(
+          od as api.GoogleCloudDialogflowV2IntentMessage);
     });
   });
 
@@ -8103,7 +8417,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageBasicCard();
       var od = api.GoogleCloudDialogflowV2IntentMessageBasicCard.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageBasicCard(od);
+      checkGoogleCloudDialogflowV2IntentMessageBasicCard(
+          od as api.GoogleCloudDialogflowV2IntentMessageBasicCard);
     });
   });
 
@@ -8113,7 +8428,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageBasicCardButton();
       var od = api.GoogleCloudDialogflowV2IntentMessageBasicCardButton.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(od);
+      checkGoogleCloudDialogflowV2IntentMessageBasicCardButton(
+          od as api.GoogleCloudDialogflowV2IntentMessageBasicCardButton);
     });
   });
 
@@ -8126,7 +8442,9 @@
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction
               .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction(od);
+      checkGoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction(od
+          as api
+              .GoogleCloudDialogflowV2IntentMessageBasicCardButtonOpenUriAction);
     });
   });
 
@@ -8137,7 +8455,8 @@
       var od =
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard(od);
+      checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCard(
+          od as api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCard);
     });
   });
 
@@ -8151,7 +8470,8 @@
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
     });
   });
 
@@ -8165,7 +8485,8 @@
           api.GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
     });
   });
 
@@ -8174,7 +8495,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageCard();
       var od =
           api.GoogleCloudDialogflowV2IntentMessageCard.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageCard(od);
+      checkGoogleCloudDialogflowV2IntentMessageCard(
+          od as api.GoogleCloudDialogflowV2IntentMessageCard);
     });
   });
 
@@ -8184,7 +8506,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageCardButton();
       var od = api.GoogleCloudDialogflowV2IntentMessageCardButton.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageCardButton(od);
+      checkGoogleCloudDialogflowV2IntentMessageCardButton(
+          od as api.GoogleCloudDialogflowV2IntentMessageCardButton);
     });
   });
 
@@ -8194,7 +8517,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageCarouselSelect();
       var od = api.GoogleCloudDialogflowV2IntentMessageCarouselSelect.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageCarouselSelect(od);
+      checkGoogleCloudDialogflowV2IntentMessageCarouselSelect(
+          od as api.GoogleCloudDialogflowV2IntentMessageCarouselSelect);
     });
   });
 
@@ -8205,7 +8529,8 @@
       var od =
           api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(od);
+      checkGoogleCloudDialogflowV2IntentMessageCarouselSelectItem(
+          od as api.GoogleCloudDialogflowV2IntentMessageCarouselSelectItem);
     });
   });
 
@@ -8216,7 +8541,8 @@
       var od =
           api.GoogleCloudDialogflowV2IntentMessageColumnProperties.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageColumnProperties(od);
+      checkGoogleCloudDialogflowV2IntentMessageColumnProperties(
+          od as api.GoogleCloudDialogflowV2IntentMessageColumnProperties);
     });
   });
 
@@ -8225,7 +8551,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageImage();
       var od =
           api.GoogleCloudDialogflowV2IntentMessageImage.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageImage(od);
+      checkGoogleCloudDialogflowV2IntentMessageImage(
+          od as api.GoogleCloudDialogflowV2IntentMessageImage);
     });
   });
 
@@ -8236,7 +8563,8 @@
       var od =
           api.GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageLinkOutSuggestion(od);
+      checkGoogleCloudDialogflowV2IntentMessageLinkOutSuggestion(
+          od as api.GoogleCloudDialogflowV2IntentMessageLinkOutSuggestion);
     });
   });
 
@@ -8246,7 +8574,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageListSelect();
       var od = api.GoogleCloudDialogflowV2IntentMessageListSelect.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageListSelect(od);
+      checkGoogleCloudDialogflowV2IntentMessageListSelect(
+          od as api.GoogleCloudDialogflowV2IntentMessageListSelect);
     });
   });
 
@@ -8256,7 +8585,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageListSelectItem();
       var od = api.GoogleCloudDialogflowV2IntentMessageListSelectItem.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageListSelectItem(od);
+      checkGoogleCloudDialogflowV2IntentMessageListSelectItem(
+          od as api.GoogleCloudDialogflowV2IntentMessageListSelectItem);
     });
   });
 
@@ -8266,7 +8596,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageMediaContent();
       var od = api.GoogleCloudDialogflowV2IntentMessageMediaContent.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageMediaContent(od);
+      checkGoogleCloudDialogflowV2IntentMessageMediaContent(
+          od as api.GoogleCloudDialogflowV2IntentMessageMediaContent);
     });
   });
 
@@ -8280,7 +8611,8 @@
           api.GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2IntentMessageMediaContentResponseMediaObject);
     });
   });
 
@@ -8290,7 +8622,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageQuickReplies();
       var od = api.GoogleCloudDialogflowV2IntentMessageQuickReplies.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageQuickReplies(od);
+      checkGoogleCloudDialogflowV2IntentMessageQuickReplies(
+          od as api.GoogleCloudDialogflowV2IntentMessageQuickReplies);
     });
   });
 
@@ -8300,7 +8633,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageSelectItemInfo();
       var od = api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(od);
+      checkGoogleCloudDialogflowV2IntentMessageSelectItemInfo(
+          od as api.GoogleCloudDialogflowV2IntentMessageSelectItemInfo);
     });
   });
 
@@ -8310,7 +8644,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageSimpleResponse();
       var od = api.GoogleCloudDialogflowV2IntentMessageSimpleResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(od);
+      checkGoogleCloudDialogflowV2IntentMessageSimpleResponse(
+          od as api.GoogleCloudDialogflowV2IntentMessageSimpleResponse);
     });
   });
 
@@ -8320,7 +8655,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageSimpleResponses();
       var od = api.GoogleCloudDialogflowV2IntentMessageSimpleResponses.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageSimpleResponses(od);
+      checkGoogleCloudDialogflowV2IntentMessageSimpleResponses(
+          od as api.GoogleCloudDialogflowV2IntentMessageSimpleResponses);
     });
   });
 
@@ -8330,7 +8666,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageSuggestion();
       var od = api.GoogleCloudDialogflowV2IntentMessageSuggestion.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageSuggestion(od);
+      checkGoogleCloudDialogflowV2IntentMessageSuggestion(
+          od as api.GoogleCloudDialogflowV2IntentMessageSuggestion);
     });
   });
 
@@ -8340,7 +8677,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageSuggestions();
       var od = api.GoogleCloudDialogflowV2IntentMessageSuggestions.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageSuggestions(od);
+      checkGoogleCloudDialogflowV2IntentMessageSuggestions(
+          od as api.GoogleCloudDialogflowV2IntentMessageSuggestions);
     });
   });
 
@@ -8350,7 +8688,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCard();
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCard.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageTableCard(od);
+      checkGoogleCloudDialogflowV2IntentMessageTableCard(
+          od as api.GoogleCloudDialogflowV2IntentMessageTableCard);
     });
   });
 
@@ -8360,7 +8699,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCardCell();
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCardCell.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageTableCardCell(od);
+      checkGoogleCloudDialogflowV2IntentMessageTableCardCell(
+          od as api.GoogleCloudDialogflowV2IntentMessageTableCardCell);
     });
   });
 
@@ -8370,7 +8710,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageTableCardRow();
       var od = api.GoogleCloudDialogflowV2IntentMessageTableCardRow.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageTableCardRow(od);
+      checkGoogleCloudDialogflowV2IntentMessageTableCardRow(
+          od as api.GoogleCloudDialogflowV2IntentMessageTableCardRow);
     });
   });
 
@@ -8379,7 +8720,8 @@
       var o = buildGoogleCloudDialogflowV2IntentMessageText();
       var od =
           api.GoogleCloudDialogflowV2IntentMessageText.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentMessageText(od);
+      checkGoogleCloudDialogflowV2IntentMessageText(
+          od as api.GoogleCloudDialogflowV2IntentMessageText);
     });
   });
 
@@ -8387,7 +8729,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2IntentParameter();
       var od = api.GoogleCloudDialogflowV2IntentParameter.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentParameter(od);
+      checkGoogleCloudDialogflowV2IntentParameter(
+          od as api.GoogleCloudDialogflowV2IntentParameter);
     });
   });
 
@@ -8396,7 +8739,8 @@
       var o = buildGoogleCloudDialogflowV2IntentTrainingPhrase();
       var od =
           api.GoogleCloudDialogflowV2IntentTrainingPhrase.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2IntentTrainingPhrase(od);
+      checkGoogleCloudDialogflowV2IntentTrainingPhrase(
+          od as api.GoogleCloudDialogflowV2IntentTrainingPhrase);
     });
   });
 
@@ -8406,7 +8750,8 @@
       var o = buildGoogleCloudDialogflowV2IntentTrainingPhrasePart();
       var od = api.GoogleCloudDialogflowV2IntentTrainingPhrasePart.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(od);
+      checkGoogleCloudDialogflowV2IntentTrainingPhrasePart(
+          od as api.GoogleCloudDialogflowV2IntentTrainingPhrasePart);
     });
   });
 
@@ -8415,7 +8760,8 @@
       var o = buildGoogleCloudDialogflowV2ListContextsResponse();
       var od =
           api.GoogleCloudDialogflowV2ListContextsResponse.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ListContextsResponse(od);
+      checkGoogleCloudDialogflowV2ListContextsResponse(
+          od as api.GoogleCloudDialogflowV2ListContextsResponse);
     });
   });
 
@@ -8425,7 +8771,8 @@
       var o = buildGoogleCloudDialogflowV2ListEntityTypesResponse();
       var od = api.GoogleCloudDialogflowV2ListEntityTypesResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2ListEntityTypesResponse(od);
+      checkGoogleCloudDialogflowV2ListEntityTypesResponse(
+          od as api.GoogleCloudDialogflowV2ListEntityTypesResponse);
     });
   });
 
@@ -8435,7 +8782,8 @@
       var o = buildGoogleCloudDialogflowV2ListEnvironmentsResponse();
       var od = api.GoogleCloudDialogflowV2ListEnvironmentsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2ListEnvironmentsResponse(od);
+      checkGoogleCloudDialogflowV2ListEnvironmentsResponse(
+          od as api.GoogleCloudDialogflowV2ListEnvironmentsResponse);
     });
   });
 
@@ -8444,7 +8792,8 @@
       var o = buildGoogleCloudDialogflowV2ListIntentsResponse();
       var od =
           api.GoogleCloudDialogflowV2ListIntentsResponse.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ListIntentsResponse(od);
+      checkGoogleCloudDialogflowV2ListIntentsResponse(
+          od as api.GoogleCloudDialogflowV2ListIntentsResponse);
     });
   });
 
@@ -8455,7 +8804,8 @@
       var od =
           api.GoogleCloudDialogflowV2ListSessionEntityTypesResponse.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2ListSessionEntityTypesResponse(od);
+      checkGoogleCloudDialogflowV2ListSessionEntityTypesResponse(
+          od as api.GoogleCloudDialogflowV2ListSessionEntityTypesResponse);
     });
   });
 
@@ -8463,7 +8813,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2Message();
       var od = api.GoogleCloudDialogflowV2Message.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2Message(od);
+      checkGoogleCloudDialogflowV2Message(
+          od as api.GoogleCloudDialogflowV2Message);
     });
   });
 
@@ -8472,7 +8823,8 @@
       var o = buildGoogleCloudDialogflowV2MessageAnnotation();
       var od =
           api.GoogleCloudDialogflowV2MessageAnnotation.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2MessageAnnotation(od);
+      checkGoogleCloudDialogflowV2MessageAnnotation(
+          od as api.GoogleCloudDialogflowV2MessageAnnotation);
     });
   });
 
@@ -8482,7 +8834,8 @@
       var o = buildGoogleCloudDialogflowV2OriginalDetectIntentRequest();
       var od = api.GoogleCloudDialogflowV2OriginalDetectIntentRequest.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2OriginalDetectIntentRequest(od);
+      checkGoogleCloudDialogflowV2OriginalDetectIntentRequest(
+          od as api.GoogleCloudDialogflowV2OriginalDetectIntentRequest);
     });
   });
 
@@ -8491,7 +8844,8 @@
       var o = buildGoogleCloudDialogflowV2OutputAudioConfig();
       var od =
           api.GoogleCloudDialogflowV2OutputAudioConfig.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2OutputAudioConfig(od);
+      checkGoogleCloudDialogflowV2OutputAudioConfig(
+          od as api.GoogleCloudDialogflowV2OutputAudioConfig);
     });
   });
 
@@ -8499,7 +8853,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2QueryInput();
       var od = api.GoogleCloudDialogflowV2QueryInput.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2QueryInput(od);
+      checkGoogleCloudDialogflowV2QueryInput(
+          od as api.GoogleCloudDialogflowV2QueryInput);
     });
   });
 
@@ -8507,7 +8862,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2QueryParameters();
       var od = api.GoogleCloudDialogflowV2QueryParameters.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2QueryParameters(od);
+      checkGoogleCloudDialogflowV2QueryParameters(
+          od as api.GoogleCloudDialogflowV2QueryParameters);
     });
   });
 
@@ -8515,7 +8871,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2QueryResult();
       var od = api.GoogleCloudDialogflowV2QueryResult.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2QueryResult(od);
+      checkGoogleCloudDialogflowV2QueryResult(
+          od as api.GoogleCloudDialogflowV2QueryResult);
     });
   });
 
@@ -8524,7 +8881,8 @@
       var o = buildGoogleCloudDialogflowV2RestoreAgentRequest();
       var od =
           api.GoogleCloudDialogflowV2RestoreAgentRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2RestoreAgentRequest(od);
+      checkGoogleCloudDialogflowV2RestoreAgentRequest(
+          od as api.GoogleCloudDialogflowV2RestoreAgentRequest);
     });
   });
 
@@ -8533,7 +8891,8 @@
       var o = buildGoogleCloudDialogflowV2SearchAgentsResponse();
       var od =
           api.GoogleCloudDialogflowV2SearchAgentsResponse.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2SearchAgentsResponse(od);
+      checkGoogleCloudDialogflowV2SearchAgentsResponse(
+          od as api.GoogleCloudDialogflowV2SearchAgentsResponse);
     });
   });
 
@@ -8541,7 +8900,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2Sentiment();
       var od = api.GoogleCloudDialogflowV2Sentiment.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2Sentiment(od);
+      checkGoogleCloudDialogflowV2Sentiment(
+          od as api.GoogleCloudDialogflowV2Sentiment);
     });
   });
 
@@ -8552,7 +8912,8 @@
       var od =
           api.GoogleCloudDialogflowV2SentimentAnalysisRequestConfig.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2SentimentAnalysisRequestConfig(od);
+      checkGoogleCloudDialogflowV2SentimentAnalysisRequestConfig(
+          od as api.GoogleCloudDialogflowV2SentimentAnalysisRequestConfig);
     });
   });
 
@@ -8562,7 +8923,8 @@
       var o = buildGoogleCloudDialogflowV2SentimentAnalysisResult();
       var od = api.GoogleCloudDialogflowV2SentimentAnalysisResult.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2SentimentAnalysisResult(od);
+      checkGoogleCloudDialogflowV2SentimentAnalysisResult(
+          od as api.GoogleCloudDialogflowV2SentimentAnalysisResult);
     });
   });
 
@@ -8571,7 +8933,8 @@
       var o = buildGoogleCloudDialogflowV2SessionEntityType();
       var od =
           api.GoogleCloudDialogflowV2SessionEntityType.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2SessionEntityType(od);
+      checkGoogleCloudDialogflowV2SessionEntityType(
+          od as api.GoogleCloudDialogflowV2SessionEntityType);
     });
   });
 
@@ -8579,7 +8942,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2SpeechContext();
       var od = api.GoogleCloudDialogflowV2SpeechContext.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2SpeechContext(od);
+      checkGoogleCloudDialogflowV2SpeechContext(
+          od as api.GoogleCloudDialogflowV2SpeechContext);
     });
   });
 
@@ -8589,7 +8953,8 @@
       var o = buildGoogleCloudDialogflowV2SynthesizeSpeechConfig();
       var od = api.GoogleCloudDialogflowV2SynthesizeSpeechConfig.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2SynthesizeSpeechConfig(od);
+      checkGoogleCloudDialogflowV2SynthesizeSpeechConfig(
+          od as api.GoogleCloudDialogflowV2SynthesizeSpeechConfig);
     });
   });
 
@@ -8597,7 +8962,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2TextInput();
       var od = api.GoogleCloudDialogflowV2TextInput.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2TextInput(od);
+      checkGoogleCloudDialogflowV2TextInput(
+          od as api.GoogleCloudDialogflowV2TextInput);
     });
   });
 
@@ -8606,7 +8972,8 @@
       var o = buildGoogleCloudDialogflowV2TrainAgentRequest();
       var od =
           api.GoogleCloudDialogflowV2TrainAgentRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2TrainAgentRequest(od);
+      checkGoogleCloudDialogflowV2TrainAgentRequest(
+          od as api.GoogleCloudDialogflowV2TrainAgentRequest);
     });
   });
 
@@ -8614,7 +8981,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2ValidationError();
       var od = api.GoogleCloudDialogflowV2ValidationError.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ValidationError(od);
+      checkGoogleCloudDialogflowV2ValidationError(
+          od as api.GoogleCloudDialogflowV2ValidationError);
     });
   });
 
@@ -8622,7 +8990,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2ValidationResult();
       var od = api.GoogleCloudDialogflowV2ValidationResult.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2ValidationResult(od);
+      checkGoogleCloudDialogflowV2ValidationResult(
+          od as api.GoogleCloudDialogflowV2ValidationResult);
     });
   });
 
@@ -8631,7 +9000,8 @@
       var o = buildGoogleCloudDialogflowV2VoiceSelectionParams();
       var od =
           api.GoogleCloudDialogflowV2VoiceSelectionParams.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2VoiceSelectionParams(od);
+      checkGoogleCloudDialogflowV2VoiceSelectionParams(
+          od as api.GoogleCloudDialogflowV2VoiceSelectionParams);
     });
   });
 
@@ -8639,7 +9009,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2WebhookRequest();
       var od = api.GoogleCloudDialogflowV2WebhookRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2WebhookRequest(od);
+      checkGoogleCloudDialogflowV2WebhookRequest(
+          od as api.GoogleCloudDialogflowV2WebhookRequest);
     });
   });
 
@@ -8647,7 +9018,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2WebhookResponse();
       var od = api.GoogleCloudDialogflowV2WebhookResponse.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2WebhookResponse(od);
+      checkGoogleCloudDialogflowV2WebhookResponse(
+          od as api.GoogleCloudDialogflowV2WebhookResponse);
     });
   });
 
@@ -8659,7 +9031,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1AnnotatedConversationDataset.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1AnnotatedConversationDataset(od);
+      checkGoogleCloudDialogflowV2beta1AnnotatedConversationDataset(
+          od as api.GoogleCloudDialogflowV2beta1AnnotatedConversationDataset);
     });
   });
 
@@ -8673,7 +9046,8 @@
           api.GoogleCloudDialogflowV2beta1AutoApproveSmartMessagingEntriesResponse
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1AutoApproveSmartMessagingEntriesResponse(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1AutoApproveSmartMessagingEntriesResponse);
     });
   });
 
@@ -8684,7 +9058,8 @@
       var o = buildGoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse();
       var od = api.GoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse(od);
+      checkGoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse(
+          od as api.GoogleCloudDialogflowV2beta1BatchUpdateEntityTypesResponse);
     });
   });
 
@@ -8695,7 +9070,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse(od);
+      checkGoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse(
+          od as api.GoogleCloudDialogflowV2beta1BatchUpdateIntentsResponse);
     });
   });
 
@@ -8709,7 +9085,8 @@
           api.GoogleCloudDialogflowV2beta1BatchUpdateSmartMessagingEntriesResponse
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1BatchUpdateSmartMessagingEntriesResponse(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1BatchUpdateSmartMessagingEntriesResponse);
     });
   });
 
@@ -8717,7 +9094,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2beta1Context();
       var od = api.GoogleCloudDialogflowV2beta1Context.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1Context(od);
+      checkGoogleCloudDialogflowV2beta1Context(
+          od as api.GoogleCloudDialogflowV2beta1Context);
     });
   });
 
@@ -8725,7 +9103,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2beta1EntityType();
       var od = api.GoogleCloudDialogflowV2beta1EntityType.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1EntityType(od);
+      checkGoogleCloudDialogflowV2beta1EntityType(
+          od as api.GoogleCloudDialogflowV2beta1EntityType);
     });
   });
 
@@ -8734,7 +9113,8 @@
       var o = buildGoogleCloudDialogflowV2beta1EntityTypeEntity();
       var od =
           api.GoogleCloudDialogflowV2beta1EntityTypeEntity.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1EntityTypeEntity(od);
+      checkGoogleCloudDialogflowV2beta1EntityTypeEntity(
+          od as api.GoogleCloudDialogflowV2beta1EntityTypeEntity);
     });
   });
 
@@ -8742,7 +9122,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2beta1EventInput();
       var od = api.GoogleCloudDialogflowV2beta1EventInput.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1EventInput(od);
+      checkGoogleCloudDialogflowV2beta1EventInput(
+          od as api.GoogleCloudDialogflowV2beta1EventInput);
     });
   });
 
@@ -8752,7 +9133,8 @@
       var o = buildGoogleCloudDialogflowV2beta1ExportAgentResponse();
       var od = api.GoogleCloudDialogflowV2beta1ExportAgentResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1ExportAgentResponse(od);
+      checkGoogleCloudDialogflowV2beta1ExportAgentResponse(
+          od as api.GoogleCloudDialogflowV2beta1ExportAgentResponse);
     });
   });
 
@@ -8762,7 +9144,8 @@
       var o = buildGoogleCloudDialogflowV2beta1ImportDocumentsResponse();
       var od = api.GoogleCloudDialogflowV2beta1ImportDocumentsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1ImportDocumentsResponse(od);
+      checkGoogleCloudDialogflowV2beta1ImportDocumentsResponse(
+          od as api.GoogleCloudDialogflowV2beta1ImportDocumentsResponse);
     });
   });
 
@@ -8770,7 +9153,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2beta1Intent();
       var od = api.GoogleCloudDialogflowV2beta1Intent.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1Intent(od);
+      checkGoogleCloudDialogflowV2beta1Intent(
+          od as api.GoogleCloudDialogflowV2beta1Intent);
     });
   });
 
@@ -8781,7 +9165,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(od);
+      checkGoogleCloudDialogflowV2beta1IntentFollowupIntentInfo(
+          od as api.GoogleCloudDialogflowV2beta1IntentFollowupIntentInfo);
     });
   });
 
@@ -8790,7 +9175,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessage();
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessage.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessage(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessage(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessage);
     });
   });
 
@@ -8800,7 +9186,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageBasicCard();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageBasicCard.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageBasicCard(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageBasicCard(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCard);
     });
   });
 
@@ -8812,7 +9199,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButton(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButton);
     });
   });
 
@@ -8826,7 +9214,8 @@
           api.GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1IntentMessageBasicCardButtonOpenUriAction);
     });
   });
 
@@ -8838,7 +9227,8 @@
           buildGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard(od
+          as api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCard);
     });
   });
 
@@ -8852,7 +9242,8 @@
           api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItem);
     });
   });
 
@@ -8866,7 +9257,8 @@
           api.GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1IntentMessageBrowseCarouselCardBrowseCarouselCardItemOpenUrlAction);
     });
   });
 
@@ -8876,7 +9268,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCard();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCard.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageCard(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageCard(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageCard);
     });
   });
 
@@ -8886,7 +9279,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageCardButton();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCardButton.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageCardButton(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageCardButton);
     });
   });
 
@@ -8897,7 +9291,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelect(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelect);
     });
   });
 
@@ -8909,7 +9304,8 @@
           buildGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem(od
+          as api.GoogleCloudDialogflowV2beta1IntentMessageCarouselSelectItem);
     });
   });
 
@@ -8920,7 +9316,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageColumnProperties();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageColumnProperties(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageColumnProperties);
     });
   });
 
@@ -8930,7 +9327,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageImage();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageImage.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageImage(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageImage(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageImage);
     });
   });
 
@@ -8941,7 +9339,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageLinkOutSuggestion);
     });
   });
 
@@ -8951,7 +9350,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageListSelect();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageListSelect.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageListSelect(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageListSelect(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageListSelect);
     });
   });
 
@@ -8962,7 +9362,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageListSelectItem(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageListSelectItem);
     });
   });
 
@@ -8973,7 +9374,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageMediaContent.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageMediaContent(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageMediaContent(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageMediaContent);
     });
   });
 
@@ -8987,7 +9389,8 @@
           api.GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1IntentMessageMediaContentResponseMediaObject);
     });
   });
 
@@ -8998,7 +9401,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageQuickReplies.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageQuickReplies(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageQuickReplies(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageQuickReplies);
     });
   });
 
@@ -9009,7 +9413,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContent(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContent);
     });
   });
 
@@ -9022,7 +9427,9 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia
               .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia(od
+          as api
+              .GoogleCloudDialogflowV2beta1IntentMessageRbmCardContentRbmMedia);
     });
   });
 
@@ -9034,7 +9441,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmCarouselCard);
     });
   });
 
@@ -9045,7 +9453,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmStandaloneCard);
     });
   });
 
@@ -9057,7 +9466,8 @@
           buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction(od
+          as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedAction);
     });
   });
 
@@ -9071,7 +9481,8 @@
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionDial);
     });
   });
 
@@ -9085,7 +9496,8 @@
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionOpenUri);
     });
   });
 
@@ -9099,7 +9511,8 @@
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation
               .fromJson(o.toJson());
       checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation(
-          od);
+          od as api
+              .GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedActionRbmSuggestedActionShareLocation);
     });
   });
 
@@ -9110,7 +9523,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestedReply);
     });
   });
 
@@ -9121,7 +9535,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmSuggestion);
     });
   });
 
@@ -9131,7 +9546,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageRbmText();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageRbmText.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageRbmText(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageRbmText(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageRbmText);
     });
   });
 
@@ -9142,7 +9558,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageSelectItemInfo);
     });
   });
 
@@ -9153,7 +9570,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponse(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponse);
     });
   });
 
@@ -9165,7 +9583,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageSimpleResponses(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageSimpleResponses);
     });
   });
 
@@ -9175,7 +9594,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageSuggestion();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageSuggestion(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestion);
     });
   });
 
@@ -9186,7 +9606,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageSuggestions.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageSuggestions(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageSuggestions(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageSuggestions);
     });
   });
 
@@ -9196,7 +9617,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageTableCard();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageTableCard.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageTableCard(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageTableCard(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCard);
     });
   });
 
@@ -9207,7 +9629,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageTableCardCell(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardCell);
     });
   });
 
@@ -9218,7 +9641,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageTableCardRow(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageTableCardRow);
     });
   });
 
@@ -9230,7 +9654,8 @@
           buildGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio
           .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio(od
+          as api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyPlayAudio);
     });
   });
 
@@ -9243,8 +9668,9 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech
               .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech(
-          od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech(od
+          as api
+              .GoogleCloudDialogflowV2beta1IntentMessageTelephonySynthesizeSpeech);
     });
   });
 
@@ -9257,7 +9683,9 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall
               .fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall(od
+          as api
+              .GoogleCloudDialogflowV2beta1IntentMessageTelephonyTransferCall);
     });
   });
 
@@ -9267,7 +9695,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentMessageText();
       var od = api.GoogleCloudDialogflowV2beta1IntentMessageText.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentMessageText(od);
+      checkGoogleCloudDialogflowV2beta1IntentMessageText(
+          od as api.GoogleCloudDialogflowV2beta1IntentMessageText);
     });
   });
 
@@ -9276,7 +9705,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentParameter();
       var od =
           api.GoogleCloudDialogflowV2beta1IntentParameter.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentParameter(od);
+      checkGoogleCloudDialogflowV2beta1IntentParameter(
+          od as api.GoogleCloudDialogflowV2beta1IntentParameter);
     });
   });
 
@@ -9286,7 +9716,8 @@
       var o = buildGoogleCloudDialogflowV2beta1IntentTrainingPhrase();
       var od = api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(od);
+      checkGoogleCloudDialogflowV2beta1IntentTrainingPhrase(
+          od as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrase);
     });
   });
 
@@ -9297,7 +9728,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(od);
+      checkGoogleCloudDialogflowV2beta1IntentTrainingPhrasePart(
+          od as api.GoogleCloudDialogflowV2beta1IntentTrainingPhrasePart);
     });
   });
 
@@ -9306,7 +9738,8 @@
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeAnswers();
       var od =
           api.GoogleCloudDialogflowV2beta1KnowledgeAnswers.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1KnowledgeAnswers(od);
+      checkGoogleCloudDialogflowV2beta1KnowledgeAnswers(
+          od as api.GoogleCloudDialogflowV2beta1KnowledgeAnswers);
     });
   });
 
@@ -9316,7 +9749,8 @@
       var o = buildGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer();
       var od = api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(od);
+      checkGoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer(
+          od as api.GoogleCloudDialogflowV2beta1KnowledgeAnswersAnswer);
     });
   });
 
@@ -9327,7 +9761,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1KnowledgeOperationMetadata(od);
+      checkGoogleCloudDialogflowV2beta1KnowledgeOperationMetadata(
+          od as api.GoogleCloudDialogflowV2beta1KnowledgeOperationMetadata);
     });
   });
 
@@ -9338,7 +9773,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1LabelConversationResponse.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1LabelConversationResponse(od);
+      checkGoogleCloudDialogflowV2beta1LabelConversationResponse(
+          od as api.GoogleCloudDialogflowV2beta1LabelConversationResponse);
     });
   });
 
@@ -9349,7 +9785,8 @@
       var od =
           api.GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV2beta1OriginalDetectIntentRequest(od);
+      checkGoogleCloudDialogflowV2beta1OriginalDetectIntentRequest(
+          od as api.GoogleCloudDialogflowV2beta1OriginalDetectIntentRequest);
     });
   });
 
@@ -9357,7 +9794,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2beta1QueryResult();
       var od = api.GoogleCloudDialogflowV2beta1QueryResult.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1QueryResult(od);
+      checkGoogleCloudDialogflowV2beta1QueryResult(
+          od as api.GoogleCloudDialogflowV2beta1QueryResult);
     });
   });
 
@@ -9365,7 +9803,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudDialogflowV2beta1Sentiment();
       var od = api.GoogleCloudDialogflowV2beta1Sentiment.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1Sentiment(od);
+      checkGoogleCloudDialogflowV2beta1Sentiment(
+          od as api.GoogleCloudDialogflowV2beta1Sentiment);
     });
   });
 
@@ -9375,7 +9814,8 @@
       var o = buildGoogleCloudDialogflowV2beta1SentimentAnalysisResult();
       var od = api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1SentimentAnalysisResult(od);
+      checkGoogleCloudDialogflowV2beta1SentimentAnalysisResult(
+          od as api.GoogleCloudDialogflowV2beta1SentimentAnalysisResult);
     });
   });
 
@@ -9385,7 +9825,8 @@
       var o = buildGoogleCloudDialogflowV2beta1SessionEntityType();
       var od = api.GoogleCloudDialogflowV2beta1SessionEntityType.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1SessionEntityType(od);
+      checkGoogleCloudDialogflowV2beta1SessionEntityType(
+          od as api.GoogleCloudDialogflowV2beta1SessionEntityType);
     });
   });
 
@@ -9395,7 +9836,8 @@
       var o = buildGoogleCloudDialogflowV2beta1SmartMessagingEntry();
       var od = api.GoogleCloudDialogflowV2beta1SmartMessagingEntry.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1SmartMessagingEntry(od);
+      checkGoogleCloudDialogflowV2beta1SmartMessagingEntry(
+          od as api.GoogleCloudDialogflowV2beta1SmartMessagingEntry);
     });
   });
 
@@ -9405,7 +9847,8 @@
       var o = buildGoogleCloudDialogflowV2beta1SmartMessagingEntryInfo();
       var od = api.GoogleCloudDialogflowV2beta1SmartMessagingEntryInfo.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV2beta1SmartMessagingEntryInfo(od);
+      checkGoogleCloudDialogflowV2beta1SmartMessagingEntryInfo(
+          od as api.GoogleCloudDialogflowV2beta1SmartMessagingEntryInfo);
     });
   });
 
@@ -9414,7 +9857,8 @@
       var o = buildGoogleCloudDialogflowV2beta1WebhookRequest();
       var od =
           api.GoogleCloudDialogflowV2beta1WebhookRequest.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1WebhookRequest(od);
+      checkGoogleCloudDialogflowV2beta1WebhookRequest(
+          od as api.GoogleCloudDialogflowV2beta1WebhookRequest);
     });
   });
 
@@ -9423,7 +9867,8 @@
       var o = buildGoogleCloudDialogflowV2beta1WebhookResponse();
       var od =
           api.GoogleCloudDialogflowV2beta1WebhookResponse.fromJson(o.toJson());
-      checkGoogleCloudDialogflowV2beta1WebhookResponse(od);
+      checkGoogleCloudDialogflowV2beta1WebhookResponse(
+          od as api.GoogleCloudDialogflowV2beta1WebhookResponse);
     });
   });
 
@@ -9433,7 +9878,8 @@
       var o = buildGoogleCloudDialogflowV3alpha1ExportAgentResponse();
       var od = api.GoogleCloudDialogflowV3alpha1ExportAgentResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV3alpha1ExportAgentResponse(od);
+      checkGoogleCloudDialogflowV3alpha1ExportAgentResponse(
+          od as api.GoogleCloudDialogflowV3alpha1ExportAgentResponse);
     });
   });
 
@@ -9444,7 +9890,8 @@
       var od =
           api.GoogleCloudDialogflowV3alpha1ExportTestCasesMetadata.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV3alpha1ExportTestCasesMetadata(od);
+      checkGoogleCloudDialogflowV3alpha1ExportTestCasesMetadata(
+          od as api.GoogleCloudDialogflowV3alpha1ExportTestCasesMetadata);
     });
   });
 
@@ -9455,7 +9902,8 @@
       var od =
           api.GoogleCloudDialogflowV3alpha1ExportTestCasesResponse.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV3alpha1ExportTestCasesResponse(od);
+      checkGoogleCloudDialogflowV3alpha1ExportTestCasesResponse(
+          od as api.GoogleCloudDialogflowV3alpha1ExportTestCasesResponse);
     });
   });
 
@@ -9465,7 +9913,8 @@
       var o = buildGoogleCloudDialogflowV3alpha1ImportAgentResponse();
       var od = api.GoogleCloudDialogflowV3alpha1ImportAgentResponse.fromJson(
           o.toJson());
-      checkGoogleCloudDialogflowV3alpha1ImportAgentResponse(od);
+      checkGoogleCloudDialogflowV3alpha1ImportAgentResponse(
+          od as api.GoogleCloudDialogflowV3alpha1ImportAgentResponse);
     });
   });
 
@@ -9476,7 +9925,8 @@
       var od =
           api.GoogleCloudDialogflowV3alpha1ImportTestCasesMetadata.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV3alpha1ImportTestCasesMetadata(od);
+      checkGoogleCloudDialogflowV3alpha1ImportTestCasesMetadata(
+          od as api.GoogleCloudDialogflowV3alpha1ImportTestCasesMetadata);
     });
   });
 
@@ -9487,7 +9937,8 @@
       var od =
           api.GoogleCloudDialogflowV3alpha1ImportTestCasesResponse.fromJson(
               o.toJson());
-      checkGoogleCloudDialogflowV3alpha1ImportTestCasesResponse(od);
+      checkGoogleCloudDialogflowV3alpha1ImportTestCasesResponse(
+          od as api.GoogleCloudDialogflowV3alpha1ImportTestCasesResponse);
     });
   });
 
@@ -9495,7 +9946,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningListOperationsResponse();
       var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
-      checkGoogleLongrunningListOperationsResponse(od);
+      checkGoogleLongrunningListOperationsResponse(
+          od as api.GoogleLongrunningListOperationsResponse);
     });
   });
 
@@ -9503,7 +9955,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningOperation();
       var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
-      checkGoogleLongrunningOperation(od);
+      checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
 
@@ -9511,7 +9963,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleProtobufEmpty();
       var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
-      checkGoogleProtobufEmpty(od);
+      checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
 
@@ -9519,7 +9971,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcStatus();
       var od = api.GoogleRpcStatus.fromJson(o.toJson());
-      checkGoogleRpcStatus(od);
+      checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
 
@@ -9527,7 +9979,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleTypeLatLng();
       var od = api.GoogleTypeLatLng.fromJson(o.toJson());
-      checkGoogleTypeLatLng(od);
+      checkGoogleTypeLatLng(od as api.GoogleTypeLatLng);
     });
   });
 
@@ -9576,7 +10028,7 @@
       res
           .deleteAgent(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -9624,7 +10076,8 @@
       res
           .getAgent(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Agent(response);
+        checkGoogleCloudDialogflowV2Agent(
+            response as api.GoogleCloudDialogflowV2Agent);
       })));
     });
 
@@ -9636,8 +10089,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Agent.fromJson(json);
-        checkGoogleCloudDialogflowV2Agent(obj);
+        var obj = api.GoogleCloudDialogflowV2Agent.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Agent(
+            obj as api.GoogleCloudDialogflowV2Agent);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9680,7 +10135,8 @@
           .setAgent(arg_request, arg_parent,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Agent(response);
+        checkGoogleCloudDialogflowV2Agent(
+            response as api.GoogleCloudDialogflowV2Agent);
       })));
     });
   });
@@ -9693,8 +10149,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2ExportAgentRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2ExportAgentRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2ExportAgentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2ExportAgentRequest(
+            obj as api.GoogleCloudDialogflowV2ExportAgentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9734,7 +10192,8 @@
       res
           .export(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -9783,7 +10242,8 @@
       res
           .getFulfillment(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Fulfillment(response);
+        checkGoogleCloudDialogflowV2Fulfillment(
+            response as api.GoogleCloudDialogflowV2Fulfillment);
       })));
     });
 
@@ -9836,7 +10296,8 @@
           .getValidationResult(arg_parent,
               languageCode: arg_languageCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ValidationResult(response);
+        checkGoogleCloudDialogflowV2ValidationResult(
+            response as api.GoogleCloudDialogflowV2ValidationResult);
       })));
     });
 
@@ -9847,8 +10308,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2ImportAgentRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2ImportAgentRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2ImportAgentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2ImportAgentRequest(
+            obj as api.GoogleCloudDialogflowV2ImportAgentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9888,7 +10351,8 @@
       res
           .import(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -9899,8 +10363,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2RestoreAgentRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2RestoreAgentRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2RestoreAgentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2RestoreAgentRequest(
+            obj as api.GoogleCloudDialogflowV2RestoreAgentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9940,7 +10406,8 @@
       res
           .restore(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -9998,7 +10465,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2SearchAgentsResponse(response);
+        checkGoogleCloudDialogflowV2SearchAgentsResponse(
+            response as api.GoogleCloudDialogflowV2SearchAgentsResponse);
       })));
     });
 
@@ -10009,8 +10477,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2TrainAgentRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2TrainAgentRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2TrainAgentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2TrainAgentRequest(
+            obj as api.GoogleCloudDialogflowV2TrainAgentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10050,7 +10520,8 @@
       res
           .train(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -10062,8 +10533,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Fulfillment.fromJson(json);
-        checkGoogleCloudDialogflowV2Fulfillment(obj);
+        var obj = api.GoogleCloudDialogflowV2Fulfillment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Fulfillment(
+            obj as api.GoogleCloudDialogflowV2Fulfillment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10107,7 +10580,8 @@
           .updateFulfillment(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Fulfillment(response);
+        checkGoogleCloudDialogflowV2Fulfillment(
+            response as api.GoogleCloudDialogflowV2Fulfillment);
       })));
     });
   });
@@ -10123,8 +10597,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudDialogflowV2BatchDeleteEntityTypesRequest.fromJson(
-                json);
-        checkGoogleCloudDialogflowV2BatchDeleteEntityTypesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2BatchDeleteEntityTypesRequest(
+            obj as api.GoogleCloudDialogflowV2BatchDeleteEntityTypesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10164,7 +10639,8 @@
       res
           .batchDelete(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -10178,8 +10654,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest.fromJson(
-                json);
-        checkGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2BatchUpdateEntityTypesRequest(
+            obj as api.GoogleCloudDialogflowV2BatchUpdateEntityTypesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10219,7 +10696,8 @@
       res
           .batchUpdate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -10231,8 +10709,10 @@
       var arg_languageCode = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2EntityType.fromJson(json);
-        checkGoogleCloudDialogflowV2EntityType(obj);
+        var obj = api.GoogleCloudDialogflowV2EntityType.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2EntityType(
+            obj as api.GoogleCloudDialogflowV2EntityType);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10276,7 +10756,8 @@
           .create(arg_request, arg_parent,
               languageCode: arg_languageCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2EntityType(response);
+        checkGoogleCloudDialogflowV2EntityType(
+            response as api.GoogleCloudDialogflowV2EntityType);
       })));
     });
 
@@ -10324,7 +10805,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -10376,7 +10857,8 @@
       res
           .get(arg_name, languageCode: arg_languageCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2EntityType(response);
+        checkGoogleCloudDialogflowV2EntityType(
+            response as api.GoogleCloudDialogflowV2EntityType);
       })));
     });
 
@@ -10438,7 +10920,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ListEntityTypesResponse(response);
+        checkGoogleCloudDialogflowV2ListEntityTypesResponse(
+            response as api.GoogleCloudDialogflowV2ListEntityTypesResponse);
       })));
     });
 
@@ -10451,8 +10934,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2EntityType.fromJson(json);
-        checkGoogleCloudDialogflowV2EntityType(obj);
+        var obj = api.GoogleCloudDialogflowV2EntityType.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2EntityType(
+            obj as api.GoogleCloudDialogflowV2EntityType);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10500,7 +10985,8 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2EntityType(response);
+        checkGoogleCloudDialogflowV2EntityType(
+            response as api.GoogleCloudDialogflowV2EntityType);
       })));
     });
   });
@@ -10516,8 +11002,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudDialogflowV2BatchCreateEntitiesRequest.fromJson(
-                json);
-        checkGoogleCloudDialogflowV2BatchCreateEntitiesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2BatchCreateEntitiesRequest(
+            obj as api.GoogleCloudDialogflowV2BatchCreateEntitiesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10557,7 +11044,8 @@
       res
           .batchCreate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -10571,8 +11059,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudDialogflowV2BatchDeleteEntitiesRequest.fromJson(
-                json);
-        checkGoogleCloudDialogflowV2BatchDeleteEntitiesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2BatchDeleteEntitiesRequest(
+            obj as api.GoogleCloudDialogflowV2BatchDeleteEntitiesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10612,7 +11101,8 @@
       res
           .batchDelete(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -10626,8 +11116,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudDialogflowV2BatchUpdateEntitiesRequest.fromJson(
-                json);
-        checkGoogleCloudDialogflowV2BatchUpdateEntitiesRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2BatchUpdateEntitiesRequest(
+            obj as api.GoogleCloudDialogflowV2BatchUpdateEntitiesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10667,7 +11158,8 @@
       res
           .batchUpdate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -10727,7 +11219,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ListEnvironmentsResponse(response);
+        checkGoogleCloudDialogflowV2ListEnvironmentsResponse(
+            response as api.GoogleCloudDialogflowV2ListEnvironmentsResponse);
       })));
     });
   });
@@ -10779,7 +11272,7 @@
       res
           .deleteContexts(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -10791,8 +11284,10 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2DetectIntentRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2DetectIntentRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2DetectIntentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2DetectIntentRequest(
+            obj as api.GoogleCloudDialogflowV2DetectIntentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10833,7 +11328,8 @@
       res
           .detectIntent(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2DetectIntentResponse(response);
+        checkGoogleCloudDialogflowV2DetectIntentResponse(
+            response as api.GoogleCloudDialogflowV2DetectIntentResponse);
       })));
     });
   });
@@ -10853,8 +11349,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Context.fromJson(json);
-        checkGoogleCloudDialogflowV2Context(obj);
+        var obj = api.GoogleCloudDialogflowV2Context.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Context(
+            obj as api.GoogleCloudDialogflowV2Context);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10894,7 +11392,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Context(response);
+        checkGoogleCloudDialogflowV2Context(
+            response as api.GoogleCloudDialogflowV2Context);
       })));
     });
 
@@ -10948,7 +11447,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11002,7 +11501,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Context(response);
+        checkGoogleCloudDialogflowV2Context(
+            response as api.GoogleCloudDialogflowV2Context);
       })));
     });
 
@@ -11066,7 +11566,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ListContextsResponse(response);
+        checkGoogleCloudDialogflowV2ListContextsResponse(
+            response as api.GoogleCloudDialogflowV2ListContextsResponse);
       })));
     });
 
@@ -11084,8 +11585,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Context.fromJson(json);
-        checkGoogleCloudDialogflowV2Context(obj);
+        var obj = api.GoogleCloudDialogflowV2Context.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Context(
+            obj as api.GoogleCloudDialogflowV2Context);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11128,7 +11631,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Context(response);
+        checkGoogleCloudDialogflowV2Context(
+            response as api.GoogleCloudDialogflowV2Context);
       })));
     });
   });
@@ -11149,8 +11653,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(json);
-        checkGoogleCloudDialogflowV2SessionEntityType(obj);
+        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            obj as api.GoogleCloudDialogflowV2SessionEntityType);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11191,7 +11697,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2SessionEntityType(response);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            response as api.GoogleCloudDialogflowV2SessionEntityType);
       })));
     });
 
@@ -11245,7 +11752,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11300,7 +11807,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2SessionEntityType(response);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            response as api.GoogleCloudDialogflowV2SessionEntityType);
       })));
     });
 
@@ -11364,7 +11872,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ListSessionEntityTypesResponse(response);
+        checkGoogleCloudDialogflowV2ListSessionEntityTypesResponse(response
+            as api.GoogleCloudDialogflowV2ListSessionEntityTypesResponse);
       })));
     });
 
@@ -11382,8 +11891,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(json);
-        checkGoogleCloudDialogflowV2SessionEntityType(obj);
+        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            obj as api.GoogleCloudDialogflowV2SessionEntityType);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11427,7 +11938,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2SessionEntityType(response);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            response as api.GoogleCloudDialogflowV2SessionEntityType);
       })));
     });
   });
@@ -11440,9 +11952,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleCloudDialogflowV2BatchDeleteIntentsRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2BatchDeleteIntentsRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2BatchDeleteIntentsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2BatchDeleteIntentsRequest(
+            obj as api.GoogleCloudDialogflowV2BatchDeleteIntentsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11482,7 +11995,8 @@
       res
           .batchDelete(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11493,9 +12007,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2BatchUpdateIntentsRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2BatchUpdateIntentsRequest(
+            obj as api.GoogleCloudDialogflowV2BatchUpdateIntentsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11535,7 +12050,8 @@
       res
           .batchUpdate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -11548,8 +12064,10 @@
       var arg_languageCode = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Intent.fromJson(json);
-        checkGoogleCloudDialogflowV2Intent(obj);
+        var obj = api.GoogleCloudDialogflowV2Intent.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Intent(
+            obj as api.GoogleCloudDialogflowV2Intent);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11596,7 +12114,8 @@
               languageCode: arg_languageCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Intent(response);
+        checkGoogleCloudDialogflowV2Intent(
+            response as api.GoogleCloudDialogflowV2Intent);
       })));
     });
 
@@ -11644,7 +12163,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11701,7 +12220,8 @@
               languageCode: arg_languageCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Intent(response);
+        checkGoogleCloudDialogflowV2Intent(
+            response as api.GoogleCloudDialogflowV2Intent);
       })));
     });
 
@@ -11767,7 +12287,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ListIntentsResponse(response);
+        checkGoogleCloudDialogflowV2ListIntentsResponse(
+            response as api.GoogleCloudDialogflowV2ListIntentsResponse);
       })));
     });
 
@@ -11781,8 +12302,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Intent.fromJson(json);
-        checkGoogleCloudDialogflowV2Intent(obj);
+        var obj = api.GoogleCloudDialogflowV2Intent.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Intent(
+            obj as api.GoogleCloudDialogflowV2Intent);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11832,7 +12355,8 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Intent(response);
+        checkGoogleCloudDialogflowV2Intent(
+            response as api.GoogleCloudDialogflowV2Intent);
       })));
     });
   });
@@ -11882,7 +12406,7 @@
       res
           .deleteContexts(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11893,8 +12417,10 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2DetectIntentRequest.fromJson(json);
-        checkGoogleCloudDialogflowV2DetectIntentRequest(obj);
+        var obj = api.GoogleCloudDialogflowV2DetectIntentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2DetectIntentRequest(
+            obj as api.GoogleCloudDialogflowV2DetectIntentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11935,7 +12461,8 @@
       res
           .detectIntent(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2DetectIntentResponse(response);
+        checkGoogleCloudDialogflowV2DetectIntentResponse(
+            response as api.GoogleCloudDialogflowV2DetectIntentResponse);
       })));
     });
   });
@@ -11948,8 +12475,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Context.fromJson(json);
-        checkGoogleCloudDialogflowV2Context(obj);
+        var obj = api.GoogleCloudDialogflowV2Context.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Context(
+            obj as api.GoogleCloudDialogflowV2Context);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11989,7 +12518,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Context(response);
+        checkGoogleCloudDialogflowV2Context(
+            response as api.GoogleCloudDialogflowV2Context);
       })));
     });
 
@@ -12037,7 +12567,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12085,7 +12615,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Context(response);
+        checkGoogleCloudDialogflowV2Context(
+            response as api.GoogleCloudDialogflowV2Context);
       })));
     });
 
@@ -12143,7 +12674,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ListContextsResponse(response);
+        checkGoogleCloudDialogflowV2ListContextsResponse(
+            response as api.GoogleCloudDialogflowV2ListContextsResponse);
       })));
     });
 
@@ -12155,8 +12687,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2Context.fromJson(json);
-        checkGoogleCloudDialogflowV2Context(obj);
+        var obj = api.GoogleCloudDialogflowV2Context.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2Context(
+            obj as api.GoogleCloudDialogflowV2Context);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12199,7 +12733,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2Context(response);
+        checkGoogleCloudDialogflowV2Context(
+            response as api.GoogleCloudDialogflowV2Context);
       })));
     });
   });
@@ -12212,8 +12747,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(json);
-        checkGoogleCloudDialogflowV2SessionEntityType(obj);
+        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            obj as api.GoogleCloudDialogflowV2SessionEntityType);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12254,7 +12791,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2SessionEntityType(response);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            response as api.GoogleCloudDialogflowV2SessionEntityType);
       })));
     });
 
@@ -12302,7 +12840,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12351,7 +12889,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2SessionEntityType(response);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            response as api.GoogleCloudDialogflowV2SessionEntityType);
       })));
     });
 
@@ -12409,7 +12948,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2ListSessionEntityTypesResponse(response);
+        checkGoogleCloudDialogflowV2ListSessionEntityTypesResponse(response
+            as api.GoogleCloudDialogflowV2ListSessionEntityTypesResponse);
       })));
     });
 
@@ -12421,8 +12961,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(json);
-        checkGoogleCloudDialogflowV2SessionEntityType(obj);
+        var obj = api.GoogleCloudDialogflowV2SessionEntityType.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            obj as api.GoogleCloudDialogflowV2SessionEntityType);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12466,7 +13008,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudDialogflowV2SessionEntityType(response);
+        checkGoogleCloudDialogflowV2SessionEntityType(
+            response as api.GoogleCloudDialogflowV2SessionEntityType);
       })));
     });
   });
@@ -12516,7 +13059,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12564,7 +13107,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -12625,7 +13169,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningListOperationsResponse(response);
+        checkGoogleLongrunningListOperationsResponse(
+            response as api.GoogleLongrunningListOperationsResponse);
       })));
     });
   });
@@ -12675,7 +13220,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12723,7 +13268,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -12784,7 +13330,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningListOperationsResponse(response);
+        checkGoogleLongrunningListOperationsResponse(
+            response as api.GoogleLongrunningListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/digitalassetlinks/v1_test.dart b/generated/googleapis/test/digitalassetlinks/v1_test.dart
index 963066b..262b39f 100644
--- a/generated/googleapis/test/digitalassetlinks/v1_test.dart
+++ b/generated/googleapis/test/digitalassetlinks/v1_test.dart
@@ -89,7 +89,7 @@
 void checkAndroidAppAsset(api.AndroidAppAsset o) {
   buildCounterAndroidAppAsset++;
   if (buildCounterAndroidAppAsset < 3) {
-    checkCertificateInfo(o.certificate);
+    checkCertificateInfo(o.certificate as api.CertificateInfo);
     unittest.expect(o.packageName, unittest.equals('foo'));
   }
   buildCounterAndroidAppAsset--;
@@ -110,8 +110,8 @@
 void checkAsset(api.Asset o) {
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
-    checkAndroidAppAsset(o.androidApp);
-    checkWebAsset(o.web);
+    checkAndroidAppAsset(o.androidApp as api.AndroidAppAsset);
+    checkWebAsset(o.web as api.WebAsset);
   }
   buildCounterAsset--;
 }
@@ -195,8 +195,8 @@
 
 void checkUnnamed2774(core.List<api.Statement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatement(o[0]);
-  checkStatement(o[1]);
+  checkStatement(o[0] as api.Statement);
+  checkStatement(o[1] as api.Statement);
 }
 
 core.int buildCounterListResponse = 0;
@@ -241,8 +241,8 @@
   buildCounterStatement++;
   if (buildCounterStatement < 3) {
     unittest.expect(o.relation, unittest.equals('foo'));
-    checkAsset(o.source);
-    checkAsset(o.target);
+    checkAsset(o.source as api.Asset);
+    checkAsset(o.target as api.Asset);
   }
   buildCounterStatement--;
 }
@@ -271,7 +271,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidAppAsset();
       var od = api.AndroidAppAsset.fromJson(o.toJson());
-      checkAndroidAppAsset(od);
+      checkAndroidAppAsset(od as api.AndroidAppAsset);
     });
   });
 
@@ -279,7 +279,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsset();
       var od = api.Asset.fromJson(o.toJson());
-      checkAsset(od);
+      checkAsset(od as api.Asset);
     });
   });
 
@@ -287,7 +287,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCertificateInfo();
       var od = api.CertificateInfo.fromJson(o.toJson());
-      checkCertificateInfo(od);
+      checkCertificateInfo(od as api.CertificateInfo);
     });
   });
 
@@ -295,7 +295,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckResponse();
       var od = api.CheckResponse.fromJson(o.toJson());
-      checkCheckResponse(od);
+      checkCheckResponse(od as api.CheckResponse);
     });
   });
 
@@ -303,7 +303,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListResponse();
       var od = api.ListResponse.fromJson(o.toJson());
-      checkListResponse(od);
+      checkListResponse(od as api.ListResponse);
     });
   });
 
@@ -311,7 +311,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatement();
       var od = api.Statement.fromJson(o.toJson());
-      checkStatement(od);
+      checkStatement(od as api.Statement);
     });
   });
 
@@ -319,7 +319,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebAsset();
       var od = api.WebAsset.fromJson(o.toJson());
-      checkWebAsset(od);
+      checkWebAsset(od as api.WebAsset);
     });
   });
 
@@ -401,7 +401,7 @@
               target_web_site: arg_target_web_site,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCheckResponse(response);
+        checkCheckResponse(response as api.CheckResponse);
       })));
     });
   });
@@ -469,7 +469,7 @@
               source_web_site: arg_source_web_site,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListResponse(response);
+        checkListResponse(response as api.ListResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/discovery/v1_test.dart b/generated/googleapis/test/discovery/v1_test.dart
index e1281e8..43e6d70 100644
--- a/generated/googleapis/test/discovery/v1_test.dart
+++ b/generated/googleapis/test/discovery/v1_test.dart
@@ -137,7 +137,7 @@
     unittest.expect(o.discoveryLink, unittest.equals('foo'));
     unittest.expect(o.discoveryRestUrl, unittest.equals('foo'));
     unittest.expect(o.documentationLink, unittest.equals('foo'));
-    checkDirectoryListItemsIcons(o.icons);
+    checkDirectoryListItemsIcons(o.icons as api.DirectoryListItemsIcons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed551(o.labels);
@@ -158,8 +158,8 @@
 
 void checkUnnamed552(core.List<api.DirectoryListItems> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDirectoryListItems(o[0]);
-  checkDirectoryListItems(o[1]);
+  checkDirectoryListItems(o[0] as api.DirectoryListItems);
+  checkDirectoryListItems(o[1] as api.DirectoryListItems);
 }
 
 core.int buildCounterDirectoryList = 0;
@@ -252,8 +252,8 @@
 
 void checkUnnamed556(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJsonSchema(o['x']);
-  checkJsonSchema(o['y']);
+  checkJsonSchema(o['x'] as api.JsonSchema);
+  checkJsonSchema(o['y'] as api.JsonSchema);
 }
 
 core.int buildCounterJsonSchemaVariantMap = 0;
@@ -286,8 +286,8 @@
 
 void checkUnnamed557(core.List<api.JsonSchemaVariantMap> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJsonSchemaVariantMap(o[0]);
-  checkJsonSchemaVariantMap(o[1]);
+  checkJsonSchemaVariantMap(o[0] as api.JsonSchemaVariantMap);
+  checkJsonSchemaVariantMap(o[1] as api.JsonSchemaVariantMap);
 }
 
 core.int buildCounterJsonSchemaVariant = 0;
@@ -345,15 +345,15 @@
   buildCounterJsonSchema++;
   if (buildCounterJsonSchema < 3) {
     unittest.expect(o.P_ref, unittest.equals('foo'));
-    checkJsonSchema(o.additionalProperties);
-    checkJsonSchemaAnnotations(o.annotations);
+    checkJsonSchema(o.additionalProperties as api.JsonSchema);
+    checkJsonSchemaAnnotations(o.annotations as api.JsonSchemaAnnotations);
     unittest.expect(o.default_, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed554(o.enum_);
     checkUnnamed555(o.enumDescriptions);
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkJsonSchema(o.items);
+    checkJsonSchema(o.items as api.JsonSchema);
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.maximum, unittest.equals('foo'));
     unittest.expect(o.minimum, unittest.equals('foo'));
@@ -363,7 +363,7 @@
     unittest.expect(o.repeated, unittest.isTrue);
     unittest.expect(o.required, unittest.isTrue);
     unittest.expect(o.type, unittest.equals('foo'));
-    checkJsonSchemaVariant(o.variant);
+    checkJsonSchemaVariant(o.variant as api.JsonSchemaVariant);
   }
   buildCounterJsonSchema--;
 }
@@ -400,8 +400,10 @@
 void checkUnnamed558(
     core.Map<core.String, api.RestDescriptionAuthOauth2ScopesValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRestDescriptionAuthOauth2ScopesValue(o['x']);
-  checkRestDescriptionAuthOauth2ScopesValue(o['y']);
+  checkRestDescriptionAuthOauth2ScopesValue(
+      o['x'] as api.RestDescriptionAuthOauth2ScopesValue);
+  checkRestDescriptionAuthOauth2ScopesValue(
+      o['y'] as api.RestDescriptionAuthOauth2ScopesValue);
 }
 
 core.int buildCounterRestDescriptionAuthOauth2 = 0;
@@ -437,7 +439,7 @@
 void checkRestDescriptionAuth(api.RestDescriptionAuth o) {
   buildCounterRestDescriptionAuth++;
   if (buildCounterRestDescriptionAuth < 3) {
-    checkRestDescriptionAuthOauth2(o.oauth2);
+    checkRestDescriptionAuthOauth2(o.oauth2 as api.RestDescriptionAuthOauth2);
   }
   buildCounterRestDescriptionAuth--;
 }
@@ -498,8 +500,8 @@
 
 void checkUnnamed561(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRestMethod(o['x']);
-  checkRestMethod(o['y']);
+  checkRestMethod(o['x'] as api.RestMethod);
+  checkRestMethod(o['y'] as api.RestMethod);
 }
 
 core.Map<core.String, api.JsonSchema> buildUnnamed562() {
@@ -511,8 +513,8 @@
 
 void checkUnnamed562(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJsonSchema(o['x']);
-  checkJsonSchema(o['y']);
+  checkJsonSchema(o['x'] as api.JsonSchema);
+  checkJsonSchema(o['y'] as api.JsonSchema);
 }
 
 core.Map<core.String, api.RestResource> buildUnnamed563() {
@@ -524,8 +526,8 @@
 
 void checkUnnamed563(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRestResource(o['x']);
-  checkRestResource(o['y']);
+  checkRestResource(o['x'] as api.RestResource);
+  checkRestResource(o['y'] as api.RestResource);
 }
 
 core.Map<core.String, api.JsonSchema> buildUnnamed564() {
@@ -537,8 +539,8 @@
 
 void checkUnnamed564(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJsonSchema(o['x']);
-  checkJsonSchema(o['y']);
+  checkJsonSchema(o['x'] as api.JsonSchema);
+  checkJsonSchema(o['y'] as api.JsonSchema);
 }
 
 core.int buildCounterRestDescription = 0;
@@ -584,7 +586,7 @@
 void checkRestDescription(api.RestDescription o) {
   buildCounterRestDescription++;
   if (buildCounterRestDescription < 3) {
-    checkRestDescriptionAuth(o.auth);
+    checkRestDescriptionAuth(o.auth as api.RestDescriptionAuth);
     unittest.expect(o.basePath, unittest.equals('foo'));
     unittest.expect(o.baseUrl, unittest.equals('foo'));
     unittest.expect(o.batchPath, unittest.equals('foo'));
@@ -595,7 +597,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.exponentialBackoffDefault, unittest.isTrue);
     checkUnnamed559(o.features);
-    checkRestDescriptionIcons(o.icons);
+    checkRestDescriptionIcons(o.icons as api.RestDescriptionIcons);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed560(o.labels);
@@ -692,8 +694,10 @@
 void checkRestMethodMediaUploadProtocols(api.RestMethodMediaUploadProtocols o) {
   buildCounterRestMethodMediaUploadProtocols++;
   if (buildCounterRestMethodMediaUploadProtocols < 3) {
-    checkRestMethodMediaUploadProtocolsResumable(o.resumable);
-    checkRestMethodMediaUploadProtocolsSimple(o.simple);
+    checkRestMethodMediaUploadProtocolsResumable(
+        o.resumable as api.RestMethodMediaUploadProtocolsResumable);
+    checkRestMethodMediaUploadProtocolsSimple(
+        o.simple as api.RestMethodMediaUploadProtocolsSimple);
   }
   buildCounterRestMethodMediaUploadProtocols--;
 }
@@ -716,7 +720,8 @@
   if (buildCounterRestMethodMediaUpload < 3) {
     checkUnnamed565(o.accept);
     unittest.expect(o.maxSize, unittest.equals('foo'));
-    checkRestMethodMediaUploadProtocols(o.protocols);
+    checkRestMethodMediaUploadProtocols(
+        o.protocols as api.RestMethodMediaUploadProtocols);
   }
   buildCounterRestMethodMediaUpload--;
 }
@@ -743,8 +748,8 @@
 
 void checkUnnamed567(core.Map<core.String, api.JsonSchema> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJsonSchema(o['x']);
-  checkJsonSchema(o['y']);
+  checkJsonSchema(o['x'] as api.JsonSchema);
+  checkJsonSchema(o['y'] as api.JsonSchema);
 }
 
 core.int buildCounterRestMethodRequest = 0;
@@ -832,12 +837,12 @@
     unittest.expect(o.etagRequired, unittest.isTrue);
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkRestMethodMediaUpload(o.mediaUpload);
+    checkRestMethodMediaUpload(o.mediaUpload as api.RestMethodMediaUpload);
     checkUnnamed566(o.parameterOrder);
     checkUnnamed567(o.parameters);
     unittest.expect(o.path, unittest.equals('foo'));
-    checkRestMethodRequest(o.request);
-    checkRestMethodResponse(o.response);
+    checkRestMethodRequest(o.request as api.RestMethodRequest);
+    checkRestMethodResponse(o.response as api.RestMethodResponse);
     checkUnnamed568(o.scopes);
     unittest.expect(o.supportsMediaDownload, unittest.isTrue);
     unittest.expect(o.supportsMediaUpload, unittest.isTrue);
@@ -856,8 +861,8 @@
 
 void checkUnnamed569(core.Map<core.String, api.RestMethod> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRestMethod(o['x']);
-  checkRestMethod(o['y']);
+  checkRestMethod(o['x'] as api.RestMethod);
+  checkRestMethod(o['y'] as api.RestMethod);
 }
 
 core.Map<core.String, api.RestResource> buildUnnamed570() {
@@ -869,8 +874,8 @@
 
 void checkUnnamed570(core.Map<core.String, api.RestResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRestResource(o['x']);
-  checkRestResource(o['y']);
+  checkRestResource(o['x'] as api.RestResource);
+  checkRestResource(o['y'] as api.RestResource);
 }
 
 core.int buildCounterRestResource = 0;
@@ -899,7 +904,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectoryListItemsIcons();
       var od = api.DirectoryListItemsIcons.fromJson(o.toJson());
-      checkDirectoryListItemsIcons(od);
+      checkDirectoryListItemsIcons(od as api.DirectoryListItemsIcons);
     });
   });
 
@@ -907,7 +912,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectoryListItems();
       var od = api.DirectoryListItems.fromJson(o.toJson());
-      checkDirectoryListItems(od);
+      checkDirectoryListItems(od as api.DirectoryListItems);
     });
   });
 
@@ -915,7 +920,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDirectoryList();
       var od = api.DirectoryList.fromJson(o.toJson());
-      checkDirectoryList(od);
+      checkDirectoryList(od as api.DirectoryList);
     });
   });
 
@@ -923,7 +928,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJsonSchemaAnnotations();
       var od = api.JsonSchemaAnnotations.fromJson(o.toJson());
-      checkJsonSchemaAnnotations(od);
+      checkJsonSchemaAnnotations(od as api.JsonSchemaAnnotations);
     });
   });
 
@@ -931,7 +936,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJsonSchemaVariantMap();
       var od = api.JsonSchemaVariantMap.fromJson(o.toJson());
-      checkJsonSchemaVariantMap(od);
+      checkJsonSchemaVariantMap(od as api.JsonSchemaVariantMap);
     });
   });
 
@@ -939,7 +944,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJsonSchemaVariant();
       var od = api.JsonSchemaVariant.fromJson(o.toJson());
-      checkJsonSchemaVariant(od);
+      checkJsonSchemaVariant(od as api.JsonSchemaVariant);
     });
   });
 
@@ -947,7 +952,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJsonSchema();
       var od = api.JsonSchema.fromJson(o.toJson());
-      checkJsonSchema(od);
+      checkJsonSchema(od as api.JsonSchema);
     });
   });
 
@@ -955,7 +960,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestDescriptionAuthOauth2ScopesValue();
       var od = api.RestDescriptionAuthOauth2ScopesValue.fromJson(o.toJson());
-      checkRestDescriptionAuthOauth2ScopesValue(od);
+      checkRestDescriptionAuthOauth2ScopesValue(
+          od as api.RestDescriptionAuthOauth2ScopesValue);
     });
   });
 
@@ -963,7 +969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestDescriptionAuthOauth2();
       var od = api.RestDescriptionAuthOauth2.fromJson(o.toJson());
-      checkRestDescriptionAuthOauth2(od);
+      checkRestDescriptionAuthOauth2(od as api.RestDescriptionAuthOauth2);
     });
   });
 
@@ -971,7 +977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestDescriptionAuth();
       var od = api.RestDescriptionAuth.fromJson(o.toJson());
-      checkRestDescriptionAuth(od);
+      checkRestDescriptionAuth(od as api.RestDescriptionAuth);
     });
   });
 
@@ -979,7 +985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestDescriptionIcons();
       var od = api.RestDescriptionIcons.fromJson(o.toJson());
-      checkRestDescriptionIcons(od);
+      checkRestDescriptionIcons(od as api.RestDescriptionIcons);
     });
   });
 
@@ -987,7 +993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestDescription();
       var od = api.RestDescription.fromJson(o.toJson());
-      checkRestDescription(od);
+      checkRestDescription(od as api.RestDescription);
     });
   });
 
@@ -995,7 +1001,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestMethodMediaUploadProtocolsResumable();
       var od = api.RestMethodMediaUploadProtocolsResumable.fromJson(o.toJson());
-      checkRestMethodMediaUploadProtocolsResumable(od);
+      checkRestMethodMediaUploadProtocolsResumable(
+          od as api.RestMethodMediaUploadProtocolsResumable);
     });
   });
 
@@ -1003,7 +1010,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestMethodMediaUploadProtocolsSimple();
       var od = api.RestMethodMediaUploadProtocolsSimple.fromJson(o.toJson());
-      checkRestMethodMediaUploadProtocolsSimple(od);
+      checkRestMethodMediaUploadProtocolsSimple(
+          od as api.RestMethodMediaUploadProtocolsSimple);
     });
   });
 
@@ -1011,7 +1019,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestMethodMediaUploadProtocols();
       var od = api.RestMethodMediaUploadProtocols.fromJson(o.toJson());
-      checkRestMethodMediaUploadProtocols(od);
+      checkRestMethodMediaUploadProtocols(
+          od as api.RestMethodMediaUploadProtocols);
     });
   });
 
@@ -1019,7 +1028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestMethodMediaUpload();
       var od = api.RestMethodMediaUpload.fromJson(o.toJson());
-      checkRestMethodMediaUpload(od);
+      checkRestMethodMediaUpload(od as api.RestMethodMediaUpload);
     });
   });
 
@@ -1027,7 +1036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestMethodRequest();
       var od = api.RestMethodRequest.fromJson(o.toJson());
-      checkRestMethodRequest(od);
+      checkRestMethodRequest(od as api.RestMethodRequest);
     });
   });
 
@@ -1035,7 +1044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestMethodResponse();
       var od = api.RestMethodResponse.fromJson(o.toJson());
-      checkRestMethodResponse(od);
+      checkRestMethodResponse(od as api.RestMethodResponse);
     });
   });
 
@@ -1043,7 +1052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestMethod();
       var od = api.RestMethod.fromJson(o.toJson());
-      checkRestMethod(od);
+      checkRestMethod(od as api.RestMethod);
     });
   });
 
@@ -1051,7 +1060,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestResource();
       var od = api.RestResource.fromJson(o.toJson());
-      checkRestResource(od);
+      checkRestResource(od as api.RestResource);
     });
   });
 
@@ -1121,7 +1130,7 @@
       res
           .getRest(arg_api, arg_version, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRestDescription(response);
+        checkRestDescription(response as api.RestDescription);
       })));
     });
 
@@ -1175,7 +1184,7 @@
       res
           .list(name: arg_name, preferred: arg_preferred, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDirectoryList(response);
+        checkDirectoryList(response as api.DirectoryList);
       })));
     });
   });
diff --git a/generated/googleapis/test/displayvideo/v1_test.dart b/generated/googleapis/test/displayvideo/v1_test.dart
index 884cdae..d2da67e 100644
--- a/generated/googleapis/test/displayvideo/v1_test.dart
+++ b/generated/googleapis/test/displayvideo/v1_test.dart
@@ -160,17 +160,22 @@
 void checkAdvertiser(api.Advertiser o) {
   buildCounterAdvertiser++;
   if (buildCounterAdvertiser < 3) {
-    checkAdvertiserAdServerConfig(o.adServerConfig);
+    checkAdvertiserAdServerConfig(
+        o.adServerConfig as api.AdvertiserAdServerConfig);
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkAdvertiserCreativeConfig(o.creativeConfig);
-    checkAdvertiserDataAccessConfig(o.dataAccessConfig);
+    checkAdvertiserCreativeConfig(
+        o.creativeConfig as api.AdvertiserCreativeConfig);
+    checkAdvertiserDataAccessConfig(
+        o.dataAccessConfig as api.AdvertiserDataAccessConfig);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.entityStatus, unittest.equals('foo'));
-    checkAdvertiserGeneralConfig(o.generalConfig);
-    checkIntegrationDetails(o.integrationDetails);
+    checkAdvertiserGeneralConfig(
+        o.generalConfig as api.AdvertiserGeneralConfig);
+    checkIntegrationDetails(o.integrationDetails as api.IntegrationDetails);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.partnerId, unittest.equals('foo'));
-    checkAdvertiserTargetingConfig(o.servingConfig);
+    checkAdvertiserTargetingConfig(
+        o.servingConfig as api.AdvertiserTargetingConfig);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterAdvertiser--;
@@ -191,8 +196,9 @@
 void checkAdvertiserAdServerConfig(api.AdvertiserAdServerConfig o) {
   buildCounterAdvertiserAdServerConfig++;
   if (buildCounterAdvertiserAdServerConfig < 3) {
-    checkCmHybridConfig(o.cmHybridConfig);
-    checkThirdPartyOnlyConfig(o.thirdPartyOnlyConfig);
+    checkCmHybridConfig(o.cmHybridConfig as api.CmHybridConfig);
+    checkThirdPartyOnlyConfig(
+        o.thirdPartyOnlyConfig as api.ThirdPartyOnlyConfig);
   }
   buildCounterAdvertiserAdServerConfig--;
 }
@@ -236,7 +242,7 @@
 void checkAdvertiserDataAccessConfig(api.AdvertiserDataAccessConfig o) {
   buildCounterAdvertiserDataAccessConfig++;
   if (buildCounterAdvertiserDataAccessConfig < 3) {
-    checkAdvertiserSdfConfig(o.sdfConfig);
+    checkAdvertiserSdfConfig(o.sdfConfig as api.AdvertiserSdfConfig);
   }
   buildCounterAdvertiserDataAccessConfig--;
 }
@@ -280,7 +286,7 @@
   buildCounterAdvertiserSdfConfig++;
   if (buildCounterAdvertiserSdfConfig < 3) {
     unittest.expect(o.overridePartnerSdfConfig, unittest.isTrue);
-    checkSdfConfig(o.sdfConfig);
+    checkSdfConfig(o.sdfConfig as api.SdfConfig);
   }
   buildCounterAdvertiserSdfConfig--;
 }
@@ -451,7 +457,7 @@
 void checkAssetAssociation(api.AssetAssociation o) {
   buildCounterAssetAssociation++;
   if (buildCounterAssetAssociation < 3) {
-    checkAsset(o.asset);
+    checkAsset(o.asset as api.Asset);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterAssetAssociation--;
@@ -575,64 +581,96 @@
 void checkAssignedTargetingOption(api.AssignedTargetingOption o) {
   buildCounterAssignedTargetingOption++;
   if (buildCounterAssignedTargetingOption < 3) {
-    checkAgeRangeAssignedTargetingOptionDetails(o.ageRangeDetails);
-    checkAppCategoryAssignedTargetingOptionDetails(o.appCategoryDetails);
-    checkAppAssignedTargetingOptionDetails(o.appDetails);
+    checkAgeRangeAssignedTargetingOptionDetails(
+        o.ageRangeDetails as api.AgeRangeAssignedTargetingOptionDetails);
+    checkAppCategoryAssignedTargetingOptionDetails(
+        o.appCategoryDetails as api.AppCategoryAssignedTargetingOptionDetails);
+    checkAppAssignedTargetingOptionDetails(
+        o.appDetails as api.AppAssignedTargetingOptionDetails);
     unittest.expect(o.assignedTargetingOptionId, unittest.equals('foo'));
-    checkAudienceGroupAssignedTargetingOptionDetails(o.audienceGroupDetails);
+    checkAudienceGroupAssignedTargetingOptionDetails(o.audienceGroupDetails
+        as api.AudienceGroupAssignedTargetingOptionDetails);
     checkAuthorizedSellerStatusAssignedTargetingOptionDetails(
-        o.authorizedSellerStatusDetails);
-    checkBrowserAssignedTargetingOptionDetails(o.browserDetails);
-    checkCarrierAndIspAssignedTargetingOptionDetails(o.carrierAndIspDetails);
-    checkCategoryAssignedTargetingOptionDetails(o.categoryDetails);
-    checkChannelAssignedTargetingOptionDetails(o.channelDetails);
+        o.authorizedSellerStatusDetails
+            as api.AuthorizedSellerStatusAssignedTargetingOptionDetails);
+    checkBrowserAssignedTargetingOptionDetails(
+        o.browserDetails as api.BrowserAssignedTargetingOptionDetails);
+    checkCarrierAndIspAssignedTargetingOptionDetails(o.carrierAndIspDetails
+        as api.CarrierAndIspAssignedTargetingOptionDetails);
+    checkCategoryAssignedTargetingOptionDetails(
+        o.categoryDetails as api.CategoryAssignedTargetingOptionDetails);
+    checkChannelAssignedTargetingOptionDetails(
+        o.channelDetails as api.ChannelAssignedTargetingOptionDetails);
     checkContentInstreamPositionAssignedTargetingOptionDetails(
-        o.contentInstreamPositionDetails);
+        o.contentInstreamPositionDetails
+            as api.ContentInstreamPositionAssignedTargetingOptionDetails);
     checkContentOutstreamPositionAssignedTargetingOptionDetails(
-        o.contentOutstreamPositionDetails);
-    checkDayAndTimeAssignedTargetingOptionDetails(o.dayAndTimeDetails);
-    checkDeviceMakeModelAssignedTargetingOptionDetails(
-        o.deviceMakeModelDetails);
-    checkDeviceTypeAssignedTargetingOptionDetails(o.deviceTypeDetails);
+        o.contentOutstreamPositionDetails
+            as api.ContentOutstreamPositionAssignedTargetingOptionDetails);
+    checkDayAndTimeAssignedTargetingOptionDetails(
+        o.dayAndTimeDetails as api.DayAndTimeAssignedTargetingOptionDetails);
+    checkDeviceMakeModelAssignedTargetingOptionDetails(o.deviceMakeModelDetails
+        as api.DeviceMakeModelAssignedTargetingOptionDetails);
+    checkDeviceTypeAssignedTargetingOptionDetails(
+        o.deviceTypeDetails as api.DeviceTypeAssignedTargetingOptionDetails);
     checkDigitalContentLabelAssignedTargetingOptionDetails(
-        o.digitalContentLabelExclusionDetails);
-    checkEnvironmentAssignedTargetingOptionDetails(o.environmentDetails);
-    checkExchangeAssignedTargetingOptionDetails(o.exchangeDetails);
-    checkGenderAssignedTargetingOptionDetails(o.genderDetails);
-    checkGeoRegionAssignedTargetingOptionDetails(o.geoRegionDetails);
-    checkHouseholdIncomeAssignedTargetingOptionDetails(
-        o.householdIncomeDetails);
+        o.digitalContentLabelExclusionDetails
+            as api.DigitalContentLabelAssignedTargetingOptionDetails);
+    checkEnvironmentAssignedTargetingOptionDetails(
+        o.environmentDetails as api.EnvironmentAssignedTargetingOptionDetails);
+    checkExchangeAssignedTargetingOptionDetails(
+        o.exchangeDetails as api.ExchangeAssignedTargetingOptionDetails);
+    checkGenderAssignedTargetingOptionDetails(
+        o.genderDetails as api.GenderAssignedTargetingOptionDetails);
+    checkGeoRegionAssignedTargetingOptionDetails(
+        o.geoRegionDetails as api.GeoRegionAssignedTargetingOptionDetails);
+    checkHouseholdIncomeAssignedTargetingOptionDetails(o.householdIncomeDetails
+        as api.HouseholdIncomeAssignedTargetingOptionDetails);
     unittest.expect(o.inheritance, unittest.equals('foo'));
-    checkInventorySourceAssignedTargetingOptionDetails(
-        o.inventorySourceDetails);
+    checkInventorySourceAssignedTargetingOptionDetails(o.inventorySourceDetails
+        as api.InventorySourceAssignedTargetingOptionDetails);
     checkInventorySourceGroupAssignedTargetingOptionDetails(
-        o.inventorySourceGroupDetails);
-    checkKeywordAssignedTargetingOptionDetails(o.keywordDetails);
-    checkLanguageAssignedTargetingOptionDetails(o.languageDetails);
+        o.inventorySourceGroupDetails
+            as api.InventorySourceGroupAssignedTargetingOptionDetails);
+    checkKeywordAssignedTargetingOptionDetails(
+        o.keywordDetails as api.KeywordAssignedTargetingOptionDetails);
+    checkLanguageAssignedTargetingOptionDetails(
+        o.languageDetails as api.LanguageAssignedTargetingOptionDetails);
     unittest.expect(o.name, unittest.equals('foo'));
     checkNegativeKeywordListAssignedTargetingOptionDetails(
-        o.negativeKeywordListDetails);
+        o.negativeKeywordListDetails
+            as api.NegativeKeywordListAssignedTargetingOptionDetails);
     checkOnScreenPositionAssignedTargetingOptionDetails(
-        o.onScreenPositionDetails);
-    checkOperatingSystemAssignedTargetingOptionDetails(
-        o.operatingSystemDetails);
-    checkParentalStatusAssignedTargetingOptionDetails(o.parentalStatusDetails);
+        o.onScreenPositionDetails
+            as api.OnScreenPositionAssignedTargetingOptionDetails);
+    checkOperatingSystemAssignedTargetingOptionDetails(o.operatingSystemDetails
+        as api.OperatingSystemAssignedTargetingOptionDetails);
+    checkParentalStatusAssignedTargetingOptionDetails(o.parentalStatusDetails
+        as api.ParentalStatusAssignedTargetingOptionDetails);
     checkProximityLocationListAssignedTargetingOptionDetails(
-        o.proximityLocationListDetails);
+        o.proximityLocationListDetails
+            as api.ProximityLocationListAssignedTargetingOptionDetails);
     checkRegionalLocationListAssignedTargetingOptionDetails(
-        o.regionalLocationListDetails);
+        o.regionalLocationListDetails
+            as api.RegionalLocationListAssignedTargetingOptionDetails);
     checkSensitiveCategoryAssignedTargetingOptionDetails(
-        o.sensitiveCategoryExclusionDetails);
-    checkSubExchangeAssignedTargetingOptionDetails(o.subExchangeDetails);
+        o.sensitiveCategoryExclusionDetails
+            as api.SensitiveCategoryAssignedTargetingOptionDetails);
+    checkSubExchangeAssignedTargetingOptionDetails(
+        o.subExchangeDetails as api.SubExchangeAssignedTargetingOptionDetails);
     unittest.expect(o.targetingType, unittest.equals('foo'));
     checkThirdPartyVerifierAssignedTargetingOptionDetails(
-        o.thirdPartyVerifierDetails);
-    checkUrlAssignedTargetingOptionDetails(o.urlDetails);
+        o.thirdPartyVerifierDetails
+            as api.ThirdPartyVerifierAssignedTargetingOptionDetails);
+    checkUrlAssignedTargetingOptionDetails(
+        o.urlDetails as api.UrlAssignedTargetingOptionDetails);
     checkUserRewardedContentAssignedTargetingOptionDetails(
-        o.userRewardedContentDetails);
-    checkVideoPlayerSizeAssignedTargetingOptionDetails(
-        o.videoPlayerSizeDetails);
-    checkViewabilityAssignedTargetingOptionDetails(o.viewabilityDetails);
+        o.userRewardedContentDetails
+            as api.UserRewardedContentAssignedTargetingOptionDetails);
+    checkVideoPlayerSizeAssignedTargetingOptionDetails(o.videoPlayerSizeDetails
+        as api.VideoPlayerSizeAssignedTargetingOptionDetails);
+    checkViewabilityAssignedTargetingOptionDetails(
+        o.viewabilityDetails as api.ViewabilityAssignedTargetingOptionDetails);
   }
   buildCounterAssignedTargetingOption--;
 }
@@ -671,8 +709,10 @@
 
 void checkUnnamed4567(core.List<api.FirstAndThirdPartyAudienceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirstAndThirdPartyAudienceGroup(o[0]);
-  checkFirstAndThirdPartyAudienceGroup(o[1]);
+  checkFirstAndThirdPartyAudienceGroup(
+      o[0] as api.FirstAndThirdPartyAudienceGroup);
+  checkFirstAndThirdPartyAudienceGroup(
+      o[1] as api.FirstAndThirdPartyAudienceGroup);
 }
 
 core.int buildCounterAudienceGroupAssignedTargetingOptionDetails = 0;
@@ -698,12 +738,16 @@
   buildCounterAudienceGroupAssignedTargetingOptionDetails++;
   if (buildCounterAudienceGroupAssignedTargetingOptionDetails < 3) {
     checkFirstAndThirdPartyAudienceGroup(
-        o.excludedFirstAndThirdPartyAudienceGroup);
-    checkGoogleAudienceGroup(o.excludedGoogleAudienceGroup);
-    checkCombinedAudienceGroup(o.includedCombinedAudienceGroup);
-    checkCustomListGroup(o.includedCustomListGroup);
+        o.excludedFirstAndThirdPartyAudienceGroup
+            as api.FirstAndThirdPartyAudienceGroup);
+    checkGoogleAudienceGroup(
+        o.excludedGoogleAudienceGroup as api.GoogleAudienceGroup);
+    checkCombinedAudienceGroup(
+        o.includedCombinedAudienceGroup as api.CombinedAudienceGroup);
+    checkCustomListGroup(o.includedCustomListGroup as api.CustomListGroup);
     checkUnnamed4567(o.includedFirstAndThirdPartyAudienceGroups);
-    checkGoogleAudienceGroup(o.includedGoogleAudienceGroup);
+    checkGoogleAudienceGroup(
+        o.includedGoogleAudienceGroup as api.GoogleAudienceGroup);
   }
   buildCounterAudienceGroupAssignedTargetingOptionDetails--;
 }
@@ -822,9 +866,11 @@
 void checkBiddingStrategy(api.BiddingStrategy o) {
   buildCounterBiddingStrategy++;
   if (buildCounterBiddingStrategy < 3) {
-    checkFixedBidStrategy(o.fixedBid);
-    checkMaximizeSpendBidStrategy(o.maximizeSpendAutoBid);
-    checkPerformanceGoalBidStrategy(o.performanceGoalAutoBid);
+    checkFixedBidStrategy(o.fixedBid as api.FixedBidStrategy);
+    checkMaximizeSpendBidStrategy(
+        o.maximizeSpendAutoBid as api.MaximizeSpendBidStrategy);
+    checkPerformanceGoalBidStrategy(
+        o.performanceGoalAutoBid as api.PerformanceGoalBidStrategy);
   }
   buildCounterBiddingStrategy--;
 }
@@ -882,8 +928,10 @@
 
 void checkUnnamed4568(core.List<api.CreateAssignedTargetingOptionsRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreateAssignedTargetingOptionsRequest(o[0]);
-  checkCreateAssignedTargetingOptionsRequest(o[1]);
+  checkCreateAssignedTargetingOptionsRequest(
+      o[0] as api.CreateAssignedTargetingOptionsRequest);
+  checkCreateAssignedTargetingOptionsRequest(
+      o[1] as api.CreateAssignedTargetingOptionsRequest);
 }
 
 core.List<api.DeleteAssignedTargetingOptionsRequest> buildUnnamed4569() {
@@ -895,8 +943,10 @@
 
 void checkUnnamed4569(core.List<api.DeleteAssignedTargetingOptionsRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeleteAssignedTargetingOptionsRequest(o[0]);
-  checkDeleteAssignedTargetingOptionsRequest(o[1]);
+  checkDeleteAssignedTargetingOptionsRequest(
+      o[0] as api.DeleteAssignedTargetingOptionsRequest);
+  checkDeleteAssignedTargetingOptionsRequest(
+      o[1] as api.DeleteAssignedTargetingOptionsRequest);
 }
 
 core.int buildCounterBulkEditAdvertiserAssignedTargetingOptionsRequest = 0;
@@ -931,8 +981,8 @@
 
 void checkUnnamed4570(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterBulkEditAdvertiserAssignedTargetingOptionsResponse = 0;
@@ -965,8 +1015,8 @@
 
 void checkUnnamed4571(core.List<api.AssignedInventorySource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedInventorySource(o[0]);
-  checkAssignedInventorySource(o[1]);
+  checkAssignedInventorySource(o[0] as api.AssignedInventorySource);
+  checkAssignedInventorySource(o[1] as api.AssignedInventorySource);
 }
 
 core.List<core.String> buildUnnamed4572() {
@@ -1018,8 +1068,8 @@
 
 void checkUnnamed4573(core.List<api.AssignedInventorySource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedInventorySource(o[0]);
-  checkAssignedInventorySource(o[1]);
+  checkAssignedInventorySource(o[0] as api.AssignedInventorySource);
+  checkAssignedInventorySource(o[1] as api.AssignedInventorySource);
 }
 
 core.int buildCounterBulkEditAssignedInventorySourcesResponse = 0;
@@ -1052,8 +1102,8 @@
 
 void checkUnnamed4574(core.List<api.AssignedLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedLocation(o[0]);
-  checkAssignedLocation(o[1]);
+  checkAssignedLocation(o[0] as api.AssignedLocation);
+  checkAssignedLocation(o[1] as api.AssignedLocation);
 }
 
 core.List<core.String> buildUnnamed4575() {
@@ -1100,8 +1150,8 @@
 
 void checkUnnamed4576(core.List<api.AssignedLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedLocation(o[0]);
-  checkAssignedLocation(o[1]);
+  checkAssignedLocation(o[0] as api.AssignedLocation);
+  checkAssignedLocation(o[1] as api.AssignedLocation);
 }
 
 core.int buildCounterBulkEditAssignedLocationsResponse = 0;
@@ -1133,8 +1183,8 @@
 
 void checkUnnamed4577(core.List<api.AssignedUserRole> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedUserRole(o[0]);
-  checkAssignedUserRole(o[1]);
+  checkAssignedUserRole(o[0] as api.AssignedUserRole);
+  checkAssignedUserRole(o[1] as api.AssignedUserRole);
 }
 
 core.List<core.String> buildUnnamed4578() {
@@ -1181,8 +1231,8 @@
 
 void checkUnnamed4579(core.List<api.AssignedUserRole> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedUserRole(o[0]);
-  checkAssignedUserRole(o[1]);
+  checkAssignedUserRole(o[0] as api.AssignedUserRole);
+  checkAssignedUserRole(o[1] as api.AssignedUserRole);
 }
 
 core.int buildCounterBulkEditAssignedUserRolesResponse = 0;
@@ -1214,8 +1264,10 @@
 
 void checkUnnamed4580(core.List<api.CreateAssignedTargetingOptionsRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreateAssignedTargetingOptionsRequest(o[0]);
-  checkCreateAssignedTargetingOptionsRequest(o[1]);
+  checkCreateAssignedTargetingOptionsRequest(
+      o[0] as api.CreateAssignedTargetingOptionsRequest);
+  checkCreateAssignedTargetingOptionsRequest(
+      o[1] as api.CreateAssignedTargetingOptionsRequest);
 }
 
 core.List<api.DeleteAssignedTargetingOptionsRequest> buildUnnamed4581() {
@@ -1227,8 +1279,10 @@
 
 void checkUnnamed4581(core.List<api.DeleteAssignedTargetingOptionsRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeleteAssignedTargetingOptionsRequest(o[0]);
-  checkDeleteAssignedTargetingOptionsRequest(o[1]);
+  checkDeleteAssignedTargetingOptionsRequest(
+      o[0] as api.DeleteAssignedTargetingOptionsRequest);
+  checkDeleteAssignedTargetingOptionsRequest(
+      o[1] as api.DeleteAssignedTargetingOptionsRequest);
 }
 
 core.int buildCounterBulkEditLineItemAssignedTargetingOptionsRequest = 0;
@@ -1263,8 +1317,8 @@
 
 void checkUnnamed4582(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterBulkEditLineItemAssignedTargetingOptionsResponse = 0;
@@ -1297,8 +1351,8 @@
 
 void checkUnnamed4583(core.List<api.NegativeKeyword> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNegativeKeyword(o[0]);
-  checkNegativeKeyword(o[1]);
+  checkNegativeKeyword(o[0] as api.NegativeKeyword);
+  checkNegativeKeyword(o[1] as api.NegativeKeyword);
 }
 
 core.List<core.String> buildUnnamed4584() {
@@ -1345,8 +1399,8 @@
 
 void checkUnnamed4585(core.List<api.NegativeKeyword> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNegativeKeyword(o[0]);
-  checkNegativeKeyword(o[1]);
+  checkNegativeKeyword(o[0] as api.NegativeKeyword);
+  checkNegativeKeyword(o[1] as api.NegativeKeyword);
 }
 
 core.int buildCounterBulkEditNegativeKeywordsResponse = 0;
@@ -1378,8 +1432,10 @@
 
 void checkUnnamed4586(core.List<api.CreateAssignedTargetingOptionsRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreateAssignedTargetingOptionsRequest(o[0]);
-  checkCreateAssignedTargetingOptionsRequest(o[1]);
+  checkCreateAssignedTargetingOptionsRequest(
+      o[0] as api.CreateAssignedTargetingOptionsRequest);
+  checkCreateAssignedTargetingOptionsRequest(
+      o[1] as api.CreateAssignedTargetingOptionsRequest);
 }
 
 core.List<api.DeleteAssignedTargetingOptionsRequest> buildUnnamed4587() {
@@ -1391,8 +1447,10 @@
 
 void checkUnnamed4587(core.List<api.DeleteAssignedTargetingOptionsRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeleteAssignedTargetingOptionsRequest(o[0]);
-  checkDeleteAssignedTargetingOptionsRequest(o[1]);
+  checkDeleteAssignedTargetingOptionsRequest(
+      o[0] as api.DeleteAssignedTargetingOptionsRequest);
+  checkDeleteAssignedTargetingOptionsRequest(
+      o[1] as api.DeleteAssignedTargetingOptionsRequest);
 }
 
 core.int buildCounterBulkEditPartnerAssignedTargetingOptionsRequest = 0;
@@ -1427,8 +1485,8 @@
 
 void checkUnnamed4588(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterBulkEditPartnerAssignedTargetingOptionsResponse = 0;
@@ -1461,8 +1519,8 @@
 
 void checkUnnamed4589(core.List<api.Site> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSite(o[0]);
-  checkSite(o[1]);
+  checkSite(o[0] as api.Site);
+  checkSite(o[1] as api.Site);
 }
 
 core.List<core.String> buildUnnamed4590() {
@@ -1512,8 +1570,8 @@
 
 void checkUnnamed4591(core.List<api.Site> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSite(o[0]);
-  checkSite(o[1]);
+  checkSite(o[0] as api.Site);
+  checkSite(o[1] as api.Site);
 }
 
 core.int buildCounterBulkEditSitesResponse = 0;
@@ -1544,8 +1602,8 @@
 
 void checkUnnamed4592(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterBulkListAdvertiserAssignedTargetingOptionsResponse = 0;
@@ -1580,8 +1638,8 @@
 
 void checkUnnamed4593(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterBulkListLineItemAssignedTargetingOptionsResponse = 0;
@@ -1630,12 +1688,12 @@
   buildCounterCampaign++;
   if (buildCounterCampaign < 3) {
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkCampaignFlight(o.campaignFlight);
-    checkCampaignGoal(o.campaignGoal);
+    checkCampaignFlight(o.campaignFlight as api.CampaignFlight);
+    checkCampaignGoal(o.campaignGoal as api.CampaignGoal);
     unittest.expect(o.campaignId, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.entityStatus, unittest.equals('foo'));
-    checkFrequencyCap(o.frequencyCap);
+    checkFrequencyCap(o.frequencyCap as api.FrequencyCap);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -1657,7 +1715,7 @@
 void checkCampaignFlight(api.CampaignFlight o) {
   buildCounterCampaignFlight++;
   if (buildCounterCampaignFlight < 3) {
-    checkDateRange(o.plannedDates);
+    checkDateRange(o.plannedDates as api.DateRange);
     unittest.expect(o.plannedSpendAmountMicros, unittest.equals('foo'));
   }
   buildCounterCampaignFlight--;
@@ -1679,7 +1737,7 @@
   buildCounterCampaignGoal++;
   if (buildCounterCampaignGoal < 3) {
     unittest.expect(o.campaignGoalType, unittest.equals('foo'));
-    checkPerformanceGoal(o.performanceGoal);
+    checkPerformanceGoal(o.performanceGoal as api.PerformanceGoal);
   }
   buildCounterCampaignGoal--;
 }
@@ -1923,8 +1981,10 @@
 
 void checkUnnamed4595(core.List<api.CombinedAudienceTargetingSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCombinedAudienceTargetingSetting(o[0]);
-  checkCombinedAudienceTargetingSetting(o[1]);
+  checkCombinedAudienceTargetingSetting(
+      o[0] as api.CombinedAudienceTargetingSetting);
+  checkCombinedAudienceTargetingSetting(
+      o[1] as api.CombinedAudienceTargetingSetting);
 }
 
 core.int buildCounterCombinedAudienceGroup = 0;
@@ -2063,8 +2123,10 @@
 
 void checkUnnamed4596(core.List<api.TrackingFloodlightActivityConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrackingFloodlightActivityConfig(o[0]);
-  checkTrackingFloodlightActivityConfig(o[1]);
+  checkTrackingFloodlightActivityConfig(
+      o[0] as api.TrackingFloodlightActivityConfig);
+  checkTrackingFloodlightActivityConfig(
+      o[1] as api.TrackingFloodlightActivityConfig);
 }
 
 core.int buildCounterConversionCountingConfig = 0;
@@ -2142,7 +2204,7 @@
 void checkCreateAssetResponse(api.CreateAssetResponse o) {
   buildCounterCreateAssetResponse++;
   if (buildCounterCreateAssetResponse < 3) {
-    checkAsset(o.asset);
+    checkAsset(o.asset as api.Asset);
   }
   buildCounterCreateAssetResponse--;
 }
@@ -2156,8 +2218,8 @@
 
 void checkUnnamed4597(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterCreateAssignedTargetingOptionsRequest = 0;
@@ -2203,9 +2265,10 @@
   buildCounterCreateSdfDownloadTaskRequest++;
   if (buildCounterCreateSdfDownloadTaskRequest < 3) {
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkIdFilter(o.idFilter);
-    checkInventorySourceFilter(o.inventorySourceFilter);
-    checkParentEntityFilter(o.parentEntityFilter);
+    checkIdFilter(o.idFilter as api.IdFilter);
+    checkInventorySourceFilter(
+        o.inventorySourceFilter as api.InventorySourceFilter);
+    checkParentEntityFilter(o.parentEntityFilter as api.ParentEntityFilter);
     unittest.expect(o.partnerId, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -2221,8 +2284,8 @@
 
 void checkUnnamed4598(core.List<api.Dimensions> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensions(o[0]);
-  checkDimensions(o[1]);
+  checkDimensions(o[0] as api.Dimensions);
+  checkDimensions(o[1] as api.Dimensions);
 }
 
 core.List<api.AssetAssociation> buildUnnamed4599() {
@@ -2234,8 +2297,8 @@
 
 void checkUnnamed4599(core.List<api.AssetAssociation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssetAssociation(o[0]);
-  checkAssetAssociation(o[1]);
+  checkAssetAssociation(o[0] as api.AssetAssociation);
+  checkAssetAssociation(o[1] as api.AssetAssociation);
 }
 
 core.List<core.String> buildUnnamed4600() {
@@ -2260,8 +2323,8 @@
 
 void checkUnnamed4601(core.List<api.CounterEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCounterEvent(o[0]);
-  checkCounterEvent(o[1]);
+  checkCounterEvent(o[0] as api.CounterEvent);
+  checkCounterEvent(o[1] as api.CounterEvent);
 }
 
 core.List<core.String> buildUnnamed4602() {
@@ -2286,8 +2349,8 @@
 
 void checkUnnamed4603(core.List<api.ExitEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExitEvent(o[0]);
-  checkExitEvent(o[1]);
+  checkExitEvent(o[0] as api.ExitEvent);
+  checkExitEvent(o[1] as api.ExitEvent);
 }
 
 core.List<core.String> buildUnnamed4604() {
@@ -2312,8 +2375,8 @@
 
 void checkUnnamed4605(core.List<api.ThirdPartyUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThirdPartyUrl(o[0]);
-  checkThirdPartyUrl(o[1]);
+  checkThirdPartyUrl(o[0] as api.ThirdPartyUrl);
+  checkThirdPartyUrl(o[1] as api.ThirdPartyUrl);
 }
 
 core.List<api.TimerEvent> buildUnnamed4606() {
@@ -2325,8 +2388,8 @@
 
 void checkUnnamed4606(core.List<api.TimerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimerEvent(o[0]);
-  checkTimerEvent(o[1]);
+  checkTimerEvent(o[0] as api.TimerEvent);
+  checkTimerEvent(o[1] as api.TimerEvent);
 }
 
 core.List<core.String> buildUnnamed4607() {
@@ -2351,8 +2414,8 @@
 
 void checkUnnamed4608(core.List<api.Transcode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTranscode(o[0]);
-  checkTranscode(o[1]);
+  checkTranscode(o[0] as api.Transcode);
+  checkTranscode(o[1] as api.Transcode);
 }
 
 core.int buildCounterCreative = 0;
@@ -2418,14 +2481,14 @@
     unittest.expect(o.appendedTag, unittest.equals('foo'));
     checkUnnamed4599(o.assets);
     unittest.expect(o.cmPlacementId, unittest.equals('foo'));
-    checkCmTrackingAd(o.cmTrackingAd);
+    checkCmTrackingAd(o.cmTrackingAd as api.CmTrackingAd);
     checkUnnamed4600(o.companionCreativeIds);
     checkUnnamed4601(o.counterEvents);
     unittest.expect(o.createTime, unittest.equals('foo'));
     checkUnnamed4602(o.creativeAttributes);
     unittest.expect(o.creativeId, unittest.equals('foo'));
     unittest.expect(o.creativeType, unittest.equals('foo'));
-    checkDimensions(o.dimensions);
+    checkDimensions(o.dimensions as api.Dimensions);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.dynamic, unittest.isTrue);
     unittest.expect(o.entityStatus, unittest.equals('foo'));
@@ -2441,20 +2504,20 @@
     unittest.expect(o.mediaDuration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
-    checkObaIcon(o.obaIcon);
-    checkAudioVideoOffset(o.progressOffset);
+    checkObaIcon(o.obaIcon as api.ObaIcon);
+    checkAudioVideoOffset(o.progressOffset as api.AudioVideoOffset);
     unittest.expect(o.requireHtml5, unittest.isTrue);
     unittest.expect(o.requireMraid, unittest.isTrue);
     unittest.expect(o.requirePingForAttribution, unittest.isTrue);
-    checkReviewStatusInfo(o.reviewStatus);
-    checkAudioVideoOffset(o.skipOffset);
+    checkReviewStatusInfo(o.reviewStatus as api.ReviewStatusInfo);
+    checkAudioVideoOffset(o.skipOffset as api.AudioVideoOffset);
     unittest.expect(o.skippable, unittest.isTrue);
     unittest.expect(o.thirdPartyTag, unittest.equals('foo'));
     checkUnnamed4605(o.thirdPartyUrls);
     checkUnnamed4606(o.timerEvents);
     checkUnnamed4607(o.trackerUrls);
     checkUnnamed4608(o.transcodes);
-    checkUniversalAdId(o.universalAdId);
+    checkUniversalAdId(o.universalAdId as api.UniversalAdId);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.vastTagUrl, unittest.equals('foo'));
     unittest.expect(o.vpaid, unittest.isTrue);
@@ -2479,8 +2542,10 @@
   buildCounterCreativeConfig++;
   if (buildCounterCreativeConfig < 3) {
     unittest.expect(o.creativeType, unittest.equals('foo'));
-    checkInventorySourceDisplayCreativeConfig(o.displayCreativeConfig);
-    checkInventorySourceVideoCreativeConfig(o.videoCreativeConfig);
+    checkInventorySourceDisplayCreativeConfig(
+        o.displayCreativeConfig as api.InventorySourceDisplayCreativeConfig);
+    checkInventorySourceVideoCreativeConfig(
+        o.videoCreativeConfig as api.InventorySourceVideoCreativeConfig);
   }
   buildCounterCreativeConfig--;
 }
@@ -2548,8 +2613,8 @@
 
 void checkUnnamed4609(core.List<api.CustomListTargetingSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomListTargetingSetting(o[0]);
-  checkCustomListTargetingSetting(o[1]);
+  checkCustomListTargetingSetting(o[0] as api.CustomListTargetingSetting);
+  checkCustomListTargetingSetting(o[1] as api.CustomListTargetingSetting);
 }
 
 core.int buildCounterCustomListGroup = 0;
@@ -2628,8 +2693,8 @@
 void checkDateRange(api.DateRange o) {
   buildCounterDateRange++;
   if (buildCounterDateRange < 3) {
-    checkDate(o.endDate);
-    checkDate(o.startDate);
+    checkDate(o.endDate as api.Date);
+    checkDate(o.startDate as api.Date);
   }
   buildCounterDateRange--;
 }
@@ -2883,12 +2948,17 @@
 void checkDoubleVerify(api.DoubleVerify o) {
   buildCounterDoubleVerify++;
   if (buildCounterDoubleVerify < 3) {
-    checkDoubleVerifyAppStarRating(o.appStarRating);
+    checkDoubleVerifyAppStarRating(
+        o.appStarRating as api.DoubleVerifyAppStarRating);
     checkUnnamed4611(o.avoidedAgeRatings);
-    checkDoubleVerifyBrandSafetyCategories(o.brandSafetyCategories);
-    checkDoubleVerifyDisplayViewability(o.displayViewability);
-    checkDoubleVerifyFraudInvalidTraffic(o.fraudInvalidTraffic);
-    checkDoubleVerifyVideoViewability(o.videoViewability);
+    checkDoubleVerifyBrandSafetyCategories(
+        o.brandSafetyCategories as api.DoubleVerifyBrandSafetyCategories);
+    checkDoubleVerifyDisplayViewability(
+        o.displayViewability as api.DoubleVerifyDisplayViewability);
+    checkDoubleVerifyFraudInvalidTraffic(
+        o.fraudInvalidTraffic as api.DoubleVerifyFraudInvalidTraffic);
+    checkDoubleVerifyVideoViewability(
+        o.videoViewability as api.DoubleVerifyVideoViewability);
   }
   buildCounterDoubleVerify--;
 }
@@ -3118,8 +3188,8 @@
 
 void checkUnnamed4614(core.List<api.ExchangeConfigEnabledExchange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExchangeConfigEnabledExchange(o[0]);
-  checkExchangeConfigEnabledExchange(o[1]);
+  checkExchangeConfigEnabledExchange(o[0] as api.ExchangeConfigEnabledExchange);
+  checkExchangeConfigEnabledExchange(o[1] as api.ExchangeConfigEnabledExchange);
 }
 
 core.int buildCounterExchangeConfig = 0;
@@ -3288,8 +3358,10 @@
 void checkUnnamed4615(
     core.List<api.FirstAndThirdPartyAudienceTargetingSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirstAndThirdPartyAudienceTargetingSetting(o[0]);
-  checkFirstAndThirdPartyAudienceTargetingSetting(o[1]);
+  checkFirstAndThirdPartyAudienceTargetingSetting(
+      o[0] as api.FirstAndThirdPartyAudienceTargetingSetting);
+  checkFirstAndThirdPartyAudienceTargetingSetting(
+      o[1] as api.FirstAndThirdPartyAudienceTargetingSetting);
 }
 
 core.int buildCounterFirstAndThirdPartyAudienceGroup = 0;
@@ -3403,11 +3475,12 @@
 void checkFloodlightGroup(api.FloodlightGroup o) {
   buildCounterFloodlightGroup++;
   if (buildCounterFloodlightGroup < 3) {
-    checkActiveViewVideoViewabilityMetricConfig(o.activeViewConfig);
+    checkActiveViewVideoViewabilityMetricConfig(
+        o.activeViewConfig as api.ActiveViewVideoViewabilityMetricConfig);
     checkUnnamed4616(o.customVariables);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.floodlightGroupId, unittest.equals('foo'));
-    checkLookbackWindow(o.lookbackWindow);
+    checkLookbackWindow(o.lookbackWindow as api.LookbackWindow);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.webTagType, unittest.equals('foo'));
   }
@@ -3564,8 +3637,10 @@
 
 void checkUnnamed4617(core.List<api.GoogleAudienceTargetingSetting> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAudienceTargetingSetting(o[0]);
-  checkGoogleAudienceTargetingSetting(o[1]);
+  checkGoogleAudienceTargetingSetting(
+      o[0] as api.GoogleAudienceTargetingSetting);
+  checkGoogleAudienceTargetingSetting(
+      o[1] as api.GoogleAudienceTargetingSetting);
 }
 
 core.int buildCounterGoogleAudienceGroup = 0;
@@ -3785,8 +3860,8 @@
 
 void checkUnnamed4624(core.List<api.PartnerCost> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPartnerCost(o[0]);
-  checkPartnerCost(o[1]);
+  checkPartnerCost(o[0] as api.PartnerCost);
+  checkPartnerCost(o[1] as api.PartnerCost);
 }
 
 core.int buildCounterInsertionOrder = 0;
@@ -3817,18 +3892,18 @@
   buildCounterInsertionOrder++;
   if (buildCounterInsertionOrder < 3) {
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkBiddingStrategy(o.bidStrategy);
-    checkInsertionOrderBudget(o.budget);
+    checkBiddingStrategy(o.bidStrategy as api.BiddingStrategy);
+    checkInsertionOrderBudget(o.budget as api.InsertionOrderBudget);
     unittest.expect(o.campaignId, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.entityStatus, unittest.equals('foo'));
-    checkFrequencyCap(o.frequencyCap);
+    checkFrequencyCap(o.frequencyCap as api.FrequencyCap);
     unittest.expect(o.insertionOrderId, unittest.equals('foo'));
-    checkIntegrationDetails(o.integrationDetails);
+    checkIntegrationDetails(o.integrationDetails as api.IntegrationDetails);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPacing(o.pacing);
+    checkPacing(o.pacing as api.Pacing);
     checkUnnamed4624(o.partnerCosts);
-    checkPerformanceGoal(o.performanceGoal);
+    checkPerformanceGoal(o.performanceGoal as api.PerformanceGoal);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterInsertionOrder--;
@@ -3843,8 +3918,8 @@
 
 void checkUnnamed4625(core.List<api.InsertionOrderBudgetSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInsertionOrderBudgetSegment(o[0]);
-  checkInsertionOrderBudgetSegment(o[1]);
+  checkInsertionOrderBudgetSegment(o[0] as api.InsertionOrderBudgetSegment);
+  checkInsertionOrderBudgetSegment(o[1] as api.InsertionOrderBudgetSegment);
 }
 
 core.int buildCounterInsertionOrderBudget = 0;
@@ -3889,7 +3964,7 @@
   if (buildCounterInsertionOrderBudgetSegment < 3) {
     unittest.expect(o.budgetAmountMicros, unittest.equals('foo'));
     unittest.expect(o.campaignBudgetId, unittest.equals('foo'));
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     unittest.expect(o.description, unittest.equals('foo'));
   }
   buildCounterInsertionOrderBudgetSegment--;
@@ -3968,8 +4043,8 @@
 
 void checkUnnamed4626(core.List<api.CreativeConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreativeConfig(o[0]);
-  checkCreativeConfig(o[1]);
+  checkCreativeConfig(o[0] as api.CreativeConfig);
+  checkCreativeConfig(o[1] as api.CreativeConfig);
 }
 
 core.int buildCounterInventorySource = 0;
@@ -4009,9 +4084,9 @@
     unittest.expect(o.inventorySourceType, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.publisherName, unittest.equals('foo'));
-    checkRateDetails(o.rateDetails);
-    checkInventorySourceStatus(o.status);
-    checkTimeRange(o.timeRange);
+    checkRateDetails(o.rateDetails as api.RateDetails);
+    checkInventorySourceStatus(o.status as api.InventorySourceStatus);
+    checkTimeRange(o.timeRange as api.TimeRange);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterInventorySource--;
@@ -4054,7 +4129,7 @@
     api.InventorySourceDisplayCreativeConfig o) {
   buildCounterInventorySourceDisplayCreativeConfig++;
   if (buildCounterInventorySourceDisplayCreativeConfig < 3) {
-    checkDimensions(o.creativeSize);
+    checkDimensions(o.creativeSize as api.Dimensions);
   }
   buildCounterInventorySourceDisplayCreativeConfig--;
 }
@@ -4285,8 +4360,8 @@
 
 void checkUnnamed4630(core.List<api.PartnerCost> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPartnerCost(o[0]);
-  checkPartnerCost(o[1]);
+  checkPartnerCost(o[0] as api.PartnerCost);
+  checkPartnerCost(o[1] as api.PartnerCost);
 }
 
 core.List<core.String> buildUnnamed4631() {
@@ -4337,24 +4412,25 @@
   buildCounterLineItem++;
   if (buildCounterLineItem < 3) {
     unittest.expect(o.advertiserId, unittest.equals('foo'));
-    checkBiddingStrategy(o.bidStrategy);
-    checkLineItemBudget(o.budget);
+    checkBiddingStrategy(o.bidStrategy as api.BiddingStrategy);
+    checkLineItemBudget(o.budget as api.LineItemBudget);
     unittest.expect(o.campaignId, unittest.equals('foo'));
-    checkConversionCountingConfig(o.conversionCounting);
+    checkConversionCountingConfig(
+        o.conversionCounting as api.ConversionCountingConfig);
     checkUnnamed4628(o.creativeIds);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.entityStatus, unittest.equals('foo'));
-    checkLineItemFlight(o.flight);
-    checkFrequencyCap(o.frequencyCap);
+    checkLineItemFlight(o.flight as api.LineItemFlight);
+    checkFrequencyCap(o.frequencyCap as api.FrequencyCap);
     unittest.expect(o.insertionOrderId, unittest.equals('foo'));
-    checkIntegrationDetails(o.integrationDetails);
+    checkIntegrationDetails(o.integrationDetails as api.IntegrationDetails);
     checkUnnamed4629(o.inventorySourceIds);
     unittest.expect(o.lineItemId, unittest.equals('foo'));
     unittest.expect(o.lineItemType, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPacing(o.pacing);
+    checkPacing(o.pacing as api.Pacing);
     checkUnnamed4630(o.partnerCosts);
-    checkPartnerRevenueModel(o.partnerRevenueModel);
+    checkPartnerRevenueModel(o.partnerRevenueModel as api.PartnerRevenueModel);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     checkUnnamed4631(o.warningMessages);
   }
@@ -4399,7 +4475,7 @@
 void checkLineItemFlight(api.LineItemFlight o) {
   buildCounterLineItemFlight++;
   if (buildCounterLineItemFlight < 3) {
-    checkDateRange(o.dateRange);
+    checkDateRange(o.dateRange as api.DateRange);
     unittest.expect(o.flightDateType, unittest.equals('foo'));
   }
   buildCounterLineItemFlight--;
@@ -4414,8 +4490,8 @@
 
 void checkUnnamed4632(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterListAdvertiserAssignedTargetingOptionsResponse = 0;
@@ -4450,8 +4526,8 @@
 
 void checkUnnamed4633(core.List<api.Advertiser> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdvertiser(o[0]);
-  checkAdvertiser(o[1]);
+  checkAdvertiser(o[0] as api.Advertiser);
+  checkAdvertiser(o[1] as api.Advertiser);
 }
 
 core.int buildCounterListAdvertisersResponse = 0;
@@ -4484,8 +4560,8 @@
 
 void checkUnnamed4634(core.List<api.AssignedInventorySource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedInventorySource(o[0]);
-  checkAssignedInventorySource(o[1]);
+  checkAssignedInventorySource(o[0] as api.AssignedInventorySource);
+  checkAssignedInventorySource(o[1] as api.AssignedInventorySource);
 }
 
 core.int buildCounterListAssignedInventorySourcesResponse = 0;
@@ -4520,8 +4596,8 @@
 
 void checkUnnamed4635(core.List<api.AssignedLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedLocation(o[0]);
-  checkAssignedLocation(o[1]);
+  checkAssignedLocation(o[0] as api.AssignedLocation);
+  checkAssignedLocation(o[1] as api.AssignedLocation);
 }
 
 core.int buildCounterListAssignedLocationsResponse = 0;
@@ -4554,8 +4630,8 @@
 
 void checkUnnamed4636(core.List<api.Campaign> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCampaign(o[0]);
-  checkCampaign(o[1]);
+  checkCampaign(o[0] as api.Campaign);
+  checkCampaign(o[1] as api.Campaign);
 }
 
 core.int buildCounterListCampaignsResponse = 0;
@@ -4588,8 +4664,8 @@
 
 void checkUnnamed4637(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannel(o[0]);
-  checkChannel(o[1]);
+  checkChannel(o[0] as api.Channel);
+  checkChannel(o[1] as api.Channel);
 }
 
 core.int buildCounterListChannelsResponse = 0;
@@ -4622,8 +4698,8 @@
 
 void checkUnnamed4638(core.List<api.CombinedAudience> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCombinedAudience(o[0]);
-  checkCombinedAudience(o[1]);
+  checkCombinedAudience(o[0] as api.CombinedAudience);
+  checkCombinedAudience(o[1] as api.CombinedAudience);
 }
 
 core.int buildCounterListCombinedAudiencesResponse = 0;
@@ -4656,8 +4732,8 @@
 
 void checkUnnamed4639(core.List<api.Creative> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCreative(o[0]);
-  checkCreative(o[1]);
+  checkCreative(o[0] as api.Creative);
+  checkCreative(o[1] as api.Creative);
 }
 
 core.int buildCounterListCreativesResponse = 0;
@@ -4690,8 +4766,8 @@
 
 void checkUnnamed4640(core.List<api.CustomBiddingAlgorithm> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomBiddingAlgorithm(o[0]);
-  checkCustomBiddingAlgorithm(o[1]);
+  checkCustomBiddingAlgorithm(o[0] as api.CustomBiddingAlgorithm);
+  checkCustomBiddingAlgorithm(o[1] as api.CustomBiddingAlgorithm);
 }
 
 core.int buildCounterListCustomBiddingAlgorithmsResponse = 0;
@@ -4726,8 +4802,8 @@
 
 void checkUnnamed4641(core.List<api.CustomList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomList(o[0]);
-  checkCustomList(o[1]);
+  checkCustomList(o[0] as api.CustomList);
+  checkCustomList(o[1] as api.CustomList);
 }
 
 core.int buildCounterListCustomListsResponse = 0;
@@ -4760,8 +4836,8 @@
 
 void checkUnnamed4642(core.List<api.FirstAndThirdPartyAudience> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFirstAndThirdPartyAudience(o[0]);
-  checkFirstAndThirdPartyAudience(o[1]);
+  checkFirstAndThirdPartyAudience(o[0] as api.FirstAndThirdPartyAudience);
+  checkFirstAndThirdPartyAudience(o[1] as api.FirstAndThirdPartyAudience);
 }
 
 core.int buildCounterListFirstAndThirdPartyAudiencesResponse = 0;
@@ -4796,8 +4872,8 @@
 
 void checkUnnamed4643(core.List<api.GoogleAudience> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAudience(o[0]);
-  checkGoogleAudience(o[1]);
+  checkGoogleAudience(o[0] as api.GoogleAudience);
+  checkGoogleAudience(o[1] as api.GoogleAudience);
 }
 
 core.int buildCounterListGoogleAudiencesResponse = 0;
@@ -4830,8 +4906,8 @@
 
 void checkUnnamed4644(core.List<api.InsertionOrder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInsertionOrder(o[0]);
-  checkInsertionOrder(o[1]);
+  checkInsertionOrder(o[0] as api.InsertionOrder);
+  checkInsertionOrder(o[1] as api.InsertionOrder);
 }
 
 core.int buildCounterListInsertionOrdersResponse = 0;
@@ -4864,8 +4940,8 @@
 
 void checkUnnamed4645(core.List<api.InventorySourceGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInventorySourceGroup(o[0]);
-  checkInventorySourceGroup(o[1]);
+  checkInventorySourceGroup(o[0] as api.InventorySourceGroup);
+  checkInventorySourceGroup(o[1] as api.InventorySourceGroup);
 }
 
 core.int buildCounterListInventorySourceGroupsResponse = 0;
@@ -4899,8 +4975,8 @@
 
 void checkUnnamed4646(core.List<api.InventorySource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInventorySource(o[0]);
-  checkInventorySource(o[1]);
+  checkInventorySource(o[0] as api.InventorySource);
+  checkInventorySource(o[1] as api.InventorySource);
 }
 
 core.int buildCounterListInventorySourcesResponse = 0;
@@ -4933,8 +5009,8 @@
 
 void checkUnnamed4647(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterListLineItemAssignedTargetingOptionsResponse = 0;
@@ -4969,8 +5045,8 @@
 
 void checkUnnamed4648(core.List<api.LineItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLineItem(o[0]);
-  checkLineItem(o[1]);
+  checkLineItem(o[0] as api.LineItem);
+  checkLineItem(o[1] as api.LineItem);
 }
 
 core.int buildCounterListLineItemsResponse = 0;
@@ -5003,8 +5079,8 @@
 
 void checkUnnamed4649(core.List<api.LocationList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocationList(o[0]);
-  checkLocationList(o[1]);
+  checkLocationList(o[0] as api.LocationList);
+  checkLocationList(o[1] as api.LocationList);
 }
 
 core.int buildCounterListLocationListsResponse = 0;
@@ -5037,8 +5113,8 @@
 
 void checkUnnamed4650(core.List<api.NegativeKeywordList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNegativeKeywordList(o[0]);
-  checkNegativeKeywordList(o[1]);
+  checkNegativeKeywordList(o[0] as api.NegativeKeywordList);
+  checkNegativeKeywordList(o[1] as api.NegativeKeywordList);
 }
 
 core.int buildCounterListNegativeKeywordListsResponse = 0;
@@ -5072,8 +5148,8 @@
 
 void checkUnnamed4651(core.List<api.NegativeKeyword> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNegativeKeyword(o[0]);
-  checkNegativeKeyword(o[1]);
+  checkNegativeKeyword(o[0] as api.NegativeKeyword);
+  checkNegativeKeyword(o[1] as api.NegativeKeyword);
 }
 
 core.int buildCounterListNegativeKeywordsResponse = 0;
@@ -5106,8 +5182,8 @@
 
 void checkUnnamed4652(core.List<api.AssignedTargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedTargetingOption(o[0]);
-  checkAssignedTargetingOption(o[1]);
+  checkAssignedTargetingOption(o[0] as api.AssignedTargetingOption);
+  checkAssignedTargetingOption(o[1] as api.AssignedTargetingOption);
 }
 
 core.int buildCounterListPartnerAssignedTargetingOptionsResponse = 0;
@@ -5142,8 +5218,8 @@
 
 void checkUnnamed4653(core.List<api.Partner> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPartner(o[0]);
-  checkPartner(o[1]);
+  checkPartner(o[0] as api.Partner);
+  checkPartner(o[1] as api.Partner);
 }
 
 core.int buildCounterListPartnersResponse = 0;
@@ -5176,8 +5252,8 @@
 
 void checkUnnamed4654(core.List<api.Site> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSite(o[0]);
-  checkSite(o[1]);
+  checkSite(o[0] as api.Site);
+  checkSite(o[1] as api.Site);
 }
 
 core.int buildCounterListSitesResponse = 0;
@@ -5210,8 +5286,8 @@
 
 void checkUnnamed4655(core.List<api.TargetingOption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetingOption(o[0]);
-  checkTargetingOption(o[1]);
+  checkTargetingOption(o[0] as api.TargetingOption);
+  checkTargetingOption(o[1] as api.TargetingOption);
 }
 
 core.int buildCounterListTargetingOptionsResponse = 0;
@@ -5244,8 +5320,8 @@
 
 void checkUnnamed4656(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUser(o[0]);
-  checkUser(o[1]);
+  checkUser(o[0] as api.User);
+  checkUser(o[1] as api.User);
 }
 
 core.int buildCounterListUsersResponse = 0;
@@ -5473,7 +5549,7 @@
   buildCounterObaIcon++;
   if (buildCounterObaIcon < 3) {
     unittest.expect(o.clickTrackingUrl, unittest.equals('foo'));
-    checkDimensions(o.dimensions);
+    checkDimensions(o.dimensions as api.Dimensions);
     unittest.expect(o.landingPageUrl, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals('foo'));
     unittest.expect(o.program, unittest.equals('foo'));
@@ -5651,7 +5727,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed4657(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4658(o.response);
@@ -5799,12 +5875,13 @@
 void checkPartner(api.Partner o) {
   buildCounterPartner++;
   if (buildCounterPartner < 3) {
-    checkPartnerAdServerConfig(o.adServerConfig);
-    checkPartnerDataAccessConfig(o.dataAccessConfig);
+    checkPartnerAdServerConfig(o.adServerConfig as api.PartnerAdServerConfig);
+    checkPartnerDataAccessConfig(
+        o.dataAccessConfig as api.PartnerDataAccessConfig);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.entityStatus, unittest.equals('foo'));
-    checkExchangeConfig(o.exchangeConfig);
-    checkPartnerGeneralConfig(o.generalConfig);
+    checkExchangeConfig(o.exchangeConfig as api.ExchangeConfig);
+    checkPartnerGeneralConfig(o.generalConfig as api.PartnerGeneralConfig);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.partnerId, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -5826,7 +5903,7 @@
 void checkPartnerAdServerConfig(api.PartnerAdServerConfig o) {
   buildCounterPartnerAdServerConfig++;
   if (buildCounterPartnerAdServerConfig < 3) {
-    checkMeasurementConfig(o.measurementConfig);
+    checkMeasurementConfig(o.measurementConfig as api.MeasurementConfig);
   }
   buildCounterPartnerAdServerConfig--;
 }
@@ -5872,7 +5949,7 @@
 void checkPartnerDataAccessConfig(api.PartnerDataAccessConfig o) {
   buildCounterPartnerDataAccessConfig++;
   if (buildCounterPartnerDataAccessConfig < 3) {
-    checkSdfConfig(o.sdfConfig);
+    checkSdfConfig(o.sdfConfig as api.SdfConfig);
   }
   buildCounterPartnerDataAccessConfig--;
 }
@@ -6031,8 +6108,8 @@
   buildCounterRateDetails++;
   if (buildCounterRateDetails < 3) {
     unittest.expect(o.inventorySourceRateType, unittest.equals('foo'));
-    checkMoney(o.minimumSpend);
-    checkMoney(o.rate);
+    checkMoney(o.minimumSpend as api.Money);
+    checkMoney(o.rate as api.Money);
     unittest.expect(o.unitsPurchased, unittest.equals('foo'));
   }
   buildCounterRateDetails--;
@@ -6070,8 +6147,8 @@
 
 void checkUnnamed4661(core.List<api.ExchangeReviewStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExchangeReviewStatus(o[0]);
-  checkExchangeReviewStatus(o[1]);
+  checkExchangeReviewStatus(o[0] as api.ExchangeReviewStatus);
+  checkExchangeReviewStatus(o[1] as api.ExchangeReviewStatus);
 }
 
 core.List<api.PublisherReviewStatus> buildUnnamed4662() {
@@ -6083,8 +6160,8 @@
 
 void checkUnnamed4662(core.List<api.PublisherReviewStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPublisherReviewStatus(o[0]);
-  checkPublisherReviewStatus(o[1]);
+  checkPublisherReviewStatus(o[0] as api.PublisherReviewStatus);
+  checkPublisherReviewStatus(o[1] as api.PublisherReviewStatus);
 }
 
 core.int buildCounterReviewStatusInfo = 0;
@@ -6395,39 +6472,62 @@
 void checkTargetingOption(api.TargetingOption o) {
   buildCounterTargetingOption++;
   if (buildCounterTargetingOption < 3) {
-    checkAgeRangeTargetingOptionDetails(o.ageRangeDetails);
-    checkAppCategoryTargetingOptionDetails(o.appCategoryDetails);
+    checkAgeRangeTargetingOptionDetails(
+        o.ageRangeDetails as api.AgeRangeTargetingOptionDetails);
+    checkAppCategoryTargetingOptionDetails(
+        o.appCategoryDetails as api.AppCategoryTargetingOptionDetails);
     checkAuthorizedSellerStatusTargetingOptionDetails(
-        o.authorizedSellerStatusDetails);
-    checkBrowserTargetingOptionDetails(o.browserDetails);
-    checkCarrierAndIspTargetingOptionDetails(o.carrierAndIspDetails);
-    checkCategoryTargetingOptionDetails(o.categoryDetails);
+        o.authorizedSellerStatusDetails
+            as api.AuthorizedSellerStatusTargetingOptionDetails);
+    checkBrowserTargetingOptionDetails(
+        o.browserDetails as api.BrowserTargetingOptionDetails);
+    checkCarrierAndIspTargetingOptionDetails(
+        o.carrierAndIspDetails as api.CarrierAndIspTargetingOptionDetails);
+    checkCategoryTargetingOptionDetails(
+        o.categoryDetails as api.CategoryTargetingOptionDetails);
     checkContentInstreamPositionTargetingOptionDetails(
-        o.contentInstreamPositionDetails);
+        o.contentInstreamPositionDetails
+            as api.ContentInstreamPositionTargetingOptionDetails);
     checkContentOutstreamPositionTargetingOptionDetails(
-        o.contentOutstreamPositionDetails);
-    checkDeviceMakeModelTargetingOptionDetails(o.deviceMakeModelDetails);
-    checkDeviceTypeTargetingOptionDetails(o.deviceTypeDetails);
-    checkDigitalContentLabelTargetingOptionDetails(
-        o.digitalContentLabelDetails);
-    checkEnvironmentTargetingOptionDetails(o.environmentDetails);
-    checkExchangeTargetingOptionDetails(o.exchangeDetails);
-    checkGenderTargetingOptionDetails(o.genderDetails);
-    checkGeoRegionTargetingOptionDetails(o.geoRegionDetails);
-    checkHouseholdIncomeTargetingOptionDetails(o.householdIncomeDetails);
-    checkLanguageTargetingOptionDetails(o.languageDetails);
+        o.contentOutstreamPositionDetails
+            as api.ContentOutstreamPositionTargetingOptionDetails);
+    checkDeviceMakeModelTargetingOptionDetails(
+        o.deviceMakeModelDetails as api.DeviceMakeModelTargetingOptionDetails);
+    checkDeviceTypeTargetingOptionDetails(
+        o.deviceTypeDetails as api.DeviceTypeTargetingOptionDetails);
+    checkDigitalContentLabelTargetingOptionDetails(o.digitalContentLabelDetails
+        as api.DigitalContentLabelTargetingOptionDetails);
+    checkEnvironmentTargetingOptionDetails(
+        o.environmentDetails as api.EnvironmentTargetingOptionDetails);
+    checkExchangeTargetingOptionDetails(
+        o.exchangeDetails as api.ExchangeTargetingOptionDetails);
+    checkGenderTargetingOptionDetails(
+        o.genderDetails as api.GenderTargetingOptionDetails);
+    checkGeoRegionTargetingOptionDetails(
+        o.geoRegionDetails as api.GeoRegionTargetingOptionDetails);
+    checkHouseholdIncomeTargetingOptionDetails(
+        o.householdIncomeDetails as api.HouseholdIncomeTargetingOptionDetails);
+    checkLanguageTargetingOptionDetails(
+        o.languageDetails as api.LanguageTargetingOptionDetails);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOnScreenPositionTargetingOptionDetails(o.onScreenPositionDetails);
-    checkOperatingSystemTargetingOptionDetails(o.operatingSystemDetails);
-    checkParentalStatusTargetingOptionDetails(o.parentalStatusDetails);
-    checkSensitiveCategoryTargetingOptionDetails(o.sensitiveCategoryDetails);
-    checkSubExchangeTargetingOptionDetails(o.subExchangeDetails);
+    checkOnScreenPositionTargetingOptionDetails(o.onScreenPositionDetails
+        as api.OnScreenPositionTargetingOptionDetails);
+    checkOperatingSystemTargetingOptionDetails(
+        o.operatingSystemDetails as api.OperatingSystemTargetingOptionDetails);
+    checkParentalStatusTargetingOptionDetails(
+        o.parentalStatusDetails as api.ParentalStatusTargetingOptionDetails);
+    checkSensitiveCategoryTargetingOptionDetails(o.sensitiveCategoryDetails
+        as api.SensitiveCategoryTargetingOptionDetails);
+    checkSubExchangeTargetingOptionDetails(
+        o.subExchangeDetails as api.SubExchangeTargetingOptionDetails);
     unittest.expect(o.targetingOptionId, unittest.equals('foo'));
     unittest.expect(o.targetingType, unittest.equals('foo'));
-    checkUserRewardedContentTargetingOptionDetails(
-        o.userRewardedContentDetails);
-    checkVideoPlayerSizeTargetingOptionDetails(o.videoPlayerSizeDetails);
-    checkViewabilityTargetingOptionDetails(o.viewabilityDetails);
+    checkUserRewardedContentTargetingOptionDetails(o.userRewardedContentDetails
+        as api.UserRewardedContentTargetingOptionDetails);
+    checkVideoPlayerSizeTargetingOptionDetails(
+        o.videoPlayerSizeDetails as api.VideoPlayerSizeTargetingOptionDetails);
+    checkViewabilityTargetingOptionDetails(
+        o.viewabilityDetails as api.ViewabilityTargetingOptionDetails);
   }
   buildCounterTargetingOption--;
 }
@@ -6490,9 +6590,9 @@
     api.ThirdPartyVerifierAssignedTargetingOptionDetails o) {
   buildCounterThirdPartyVerifierAssignedTargetingOptionDetails++;
   if (buildCounterThirdPartyVerifierAssignedTargetingOptionDetails < 3) {
-    checkAdloox(o.adloox);
-    checkDoubleVerify(o.doubleVerify);
-    checkIntegralAdScience(o.integralAdScience);
+    checkAdloox(o.adloox as api.Adloox);
+    checkDoubleVerify(o.doubleVerify as api.DoubleVerify);
+    checkIntegralAdScience(o.integralAdScience as api.IntegralAdScience);
   }
   buildCounterThirdPartyVerifierAssignedTargetingOptionDetails--;
 }
@@ -6588,7 +6688,7 @@
     unittest.expect(o.audioBitRateKbps, unittest.equals('foo'));
     unittest.expect(o.audioSampleRateHz, unittest.equals('foo'));
     unittest.expect(o.bitRateKbps, unittest.equals('foo'));
-    checkDimensions(o.dimensions);
+    checkDimensions(o.dimensions as api.Dimensions);
     unittest.expect(o.fileSizeBytes, unittest.equals('foo'));
     unittest.expect(o.frameRate, unittest.equals(42.0));
     unittest.expect(o.mimeType, unittest.equals('foo'));
@@ -6650,8 +6750,8 @@
 
 void checkUnnamed4665(core.List<api.AssignedUserRole> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssignedUserRole(o[0]);
-  checkAssignedUserRole(o[1]);
+  checkAssignedUserRole(o[0] as api.AssignedUserRole);
+  checkAssignedUserRole(o[1] as api.AssignedUserRole);
 }
 
 core.int buildCounterUser = 0;
@@ -6817,7 +6917,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActiveViewVideoViewabilityMetricConfig();
       var od = api.ActiveViewVideoViewabilityMetricConfig.fromJson(o.toJson());
-      checkActiveViewVideoViewabilityMetricConfig(od);
+      checkActiveViewVideoViewabilityMetricConfig(
+          od as api.ActiveViewVideoViewabilityMetricConfig);
     });
   });
 
@@ -6825,7 +6926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdloox();
       var od = api.Adloox.fromJson(o.toJson());
-      checkAdloox(od);
+      checkAdloox(od as api.Adloox);
     });
   });
 
@@ -6833,7 +6934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiser();
       var od = api.Advertiser.fromJson(o.toJson());
-      checkAdvertiser(od);
+      checkAdvertiser(od as api.Advertiser);
     });
   });
 
@@ -6841,7 +6942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserAdServerConfig();
       var od = api.AdvertiserAdServerConfig.fromJson(o.toJson());
-      checkAdvertiserAdServerConfig(od);
+      checkAdvertiserAdServerConfig(od as api.AdvertiserAdServerConfig);
     });
   });
 
@@ -6849,7 +6950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserCreativeConfig();
       var od = api.AdvertiserCreativeConfig.fromJson(o.toJson());
-      checkAdvertiserCreativeConfig(od);
+      checkAdvertiserCreativeConfig(od as api.AdvertiserCreativeConfig);
     });
   });
 
@@ -6857,7 +6958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserDataAccessConfig();
       var od = api.AdvertiserDataAccessConfig.fromJson(o.toJson());
-      checkAdvertiserDataAccessConfig(od);
+      checkAdvertiserDataAccessConfig(od as api.AdvertiserDataAccessConfig);
     });
   });
 
@@ -6865,7 +6966,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserGeneralConfig();
       var od = api.AdvertiserGeneralConfig.fromJson(o.toJson());
-      checkAdvertiserGeneralConfig(od);
+      checkAdvertiserGeneralConfig(od as api.AdvertiserGeneralConfig);
     });
   });
 
@@ -6873,7 +6974,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserSdfConfig();
       var od = api.AdvertiserSdfConfig.fromJson(o.toJson());
-      checkAdvertiserSdfConfig(od);
+      checkAdvertiserSdfConfig(od as api.AdvertiserSdfConfig);
     });
   });
 
@@ -6881,7 +6982,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvertiserTargetingConfig();
       var od = api.AdvertiserTargetingConfig.fromJson(o.toJson());
-      checkAdvertiserTargetingConfig(od);
+      checkAdvertiserTargetingConfig(od as api.AdvertiserTargetingConfig);
     });
   });
 
@@ -6889,7 +6990,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAgeRangeAssignedTargetingOptionDetails();
       var od = api.AgeRangeAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkAgeRangeAssignedTargetingOptionDetails(od);
+      checkAgeRangeAssignedTargetingOptionDetails(
+          od as api.AgeRangeAssignedTargetingOptionDetails);
     });
   });
 
@@ -6897,7 +6999,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAgeRangeTargetingOptionDetails();
       var od = api.AgeRangeTargetingOptionDetails.fromJson(o.toJson());
-      checkAgeRangeTargetingOptionDetails(od);
+      checkAgeRangeTargetingOptionDetails(
+          od as api.AgeRangeTargetingOptionDetails);
     });
   });
 
@@ -6905,7 +7008,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppAssignedTargetingOptionDetails();
       var od = api.AppAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkAppAssignedTargetingOptionDetails(od);
+      checkAppAssignedTargetingOptionDetails(
+          od as api.AppAssignedTargetingOptionDetails);
     });
   });
 
@@ -6914,7 +7018,8 @@
       var o = buildAppCategoryAssignedTargetingOptionDetails();
       var od =
           api.AppCategoryAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkAppCategoryAssignedTargetingOptionDetails(od);
+      checkAppCategoryAssignedTargetingOptionDetails(
+          od as api.AppCategoryAssignedTargetingOptionDetails);
     });
   });
 
@@ -6922,7 +7027,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppCategoryTargetingOptionDetails();
       var od = api.AppCategoryTargetingOptionDetails.fromJson(o.toJson());
-      checkAppCategoryTargetingOptionDetails(od);
+      checkAppCategoryTargetingOptionDetails(
+          od as api.AppCategoryTargetingOptionDetails);
     });
   });
 
@@ -6930,7 +7036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsset();
       var od = api.Asset.fromJson(o.toJson());
-      checkAsset(od);
+      checkAsset(od as api.Asset);
     });
   });
 
@@ -6938,7 +7044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssetAssociation();
       var od = api.AssetAssociation.fromJson(o.toJson());
-      checkAssetAssociation(od);
+      checkAssetAssociation(od as api.AssetAssociation);
     });
   });
 
@@ -6946,7 +7052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignedInventorySource();
       var od = api.AssignedInventorySource.fromJson(o.toJson());
-      checkAssignedInventorySource(od);
+      checkAssignedInventorySource(od as api.AssignedInventorySource);
     });
   });
 
@@ -6954,7 +7060,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignedLocation();
       var od = api.AssignedLocation.fromJson(o.toJson());
-      checkAssignedLocation(od);
+      checkAssignedLocation(od as api.AssignedLocation);
     });
   });
 
@@ -6962,7 +7068,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignedTargetingOption();
       var od = api.AssignedTargetingOption.fromJson(o.toJson());
-      checkAssignedTargetingOption(od);
+      checkAssignedTargetingOption(od as api.AssignedTargetingOption);
     });
   });
 
@@ -6970,7 +7076,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignedUserRole();
       var od = api.AssignedUserRole.fromJson(o.toJson());
-      checkAssignedUserRole(od);
+      checkAssignedUserRole(od as api.AssignedUserRole);
     });
   });
 
@@ -6979,7 +7085,8 @@
       var o = buildAudienceGroupAssignedTargetingOptionDetails();
       var od =
           api.AudienceGroupAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkAudienceGroupAssignedTargetingOptionDetails(od);
+      checkAudienceGroupAssignedTargetingOptionDetails(
+          od as api.AudienceGroupAssignedTargetingOptionDetails);
     });
   });
 
@@ -6987,7 +7094,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAudioVideoOffset();
       var od = api.AudioVideoOffset.fromJson(o.toJson());
-      checkAudioVideoOffset(od);
+      checkAudioVideoOffset(od as api.AudioVideoOffset);
     });
   });
 
@@ -6995,7 +7102,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditAdvertiserResponse();
       var od = api.AuditAdvertiserResponse.fromJson(o.toJson());
-      checkAuditAdvertiserResponse(od);
+      checkAuditAdvertiserResponse(od as api.AuditAdvertiserResponse);
     });
   });
 
@@ -7006,7 +7113,8 @@
       var od =
           api.AuthorizedSellerStatusAssignedTargetingOptionDetails.fromJson(
               o.toJson());
-      checkAuthorizedSellerStatusAssignedTargetingOptionDetails(od);
+      checkAuthorizedSellerStatusAssignedTargetingOptionDetails(
+          od as api.AuthorizedSellerStatusAssignedTargetingOptionDetails);
     });
   });
 
@@ -7015,7 +7123,8 @@
       var o = buildAuthorizedSellerStatusTargetingOptionDetails();
       var od =
           api.AuthorizedSellerStatusTargetingOptionDetails.fromJson(o.toJson());
-      checkAuthorizedSellerStatusTargetingOptionDetails(od);
+      checkAuthorizedSellerStatusTargetingOptionDetails(
+          od as api.AuthorizedSellerStatusTargetingOptionDetails);
     });
   });
 
@@ -7023,7 +7132,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBiddingStrategy();
       var od = api.BiddingStrategy.fromJson(o.toJson());
-      checkBiddingStrategy(od);
+      checkBiddingStrategy(od as api.BiddingStrategy);
     });
   });
 
@@ -7031,7 +7140,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBrowserAssignedTargetingOptionDetails();
       var od = api.BrowserAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkBrowserAssignedTargetingOptionDetails(od);
+      checkBrowserAssignedTargetingOptionDetails(
+          od as api.BrowserAssignedTargetingOptionDetails);
     });
   });
 
@@ -7039,7 +7149,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBrowserTargetingOptionDetails();
       var od = api.BrowserTargetingOptionDetails.fromJson(o.toJson());
-      checkBrowserTargetingOptionDetails(od);
+      checkBrowserTargetingOptionDetails(
+          od as api.BrowserTargetingOptionDetails);
     });
   });
 
@@ -7049,7 +7160,8 @@
       var o = buildBulkEditAdvertiserAssignedTargetingOptionsRequest();
       var od = api.BulkEditAdvertiserAssignedTargetingOptionsRequest.fromJson(
           o.toJson());
-      checkBulkEditAdvertiserAssignedTargetingOptionsRequest(od);
+      checkBulkEditAdvertiserAssignedTargetingOptionsRequest(
+          od as api.BulkEditAdvertiserAssignedTargetingOptionsRequest);
     });
   });
 
@@ -7059,7 +7171,8 @@
       var o = buildBulkEditAdvertiserAssignedTargetingOptionsResponse();
       var od = api.BulkEditAdvertiserAssignedTargetingOptionsResponse.fromJson(
           o.toJson());
-      checkBulkEditAdvertiserAssignedTargetingOptionsResponse(od);
+      checkBulkEditAdvertiserAssignedTargetingOptionsResponse(
+          od as api.BulkEditAdvertiserAssignedTargetingOptionsResponse);
     });
   });
 
@@ -7067,7 +7180,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditAssignedInventorySourcesRequest();
       var od = api.BulkEditAssignedInventorySourcesRequest.fromJson(o.toJson());
-      checkBulkEditAssignedInventorySourcesRequest(od);
+      checkBulkEditAssignedInventorySourcesRequest(
+          od as api.BulkEditAssignedInventorySourcesRequest);
     });
   });
 
@@ -7076,7 +7190,8 @@
       var o = buildBulkEditAssignedInventorySourcesResponse();
       var od =
           api.BulkEditAssignedInventorySourcesResponse.fromJson(o.toJson());
-      checkBulkEditAssignedInventorySourcesResponse(od);
+      checkBulkEditAssignedInventorySourcesResponse(
+          od as api.BulkEditAssignedInventorySourcesResponse);
     });
   });
 
@@ -7084,7 +7199,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditAssignedLocationsRequest();
       var od = api.BulkEditAssignedLocationsRequest.fromJson(o.toJson());
-      checkBulkEditAssignedLocationsRequest(od);
+      checkBulkEditAssignedLocationsRequest(
+          od as api.BulkEditAssignedLocationsRequest);
     });
   });
 
@@ -7092,7 +7208,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditAssignedLocationsResponse();
       var od = api.BulkEditAssignedLocationsResponse.fromJson(o.toJson());
-      checkBulkEditAssignedLocationsResponse(od);
+      checkBulkEditAssignedLocationsResponse(
+          od as api.BulkEditAssignedLocationsResponse);
     });
   });
 
@@ -7100,7 +7217,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditAssignedUserRolesRequest();
       var od = api.BulkEditAssignedUserRolesRequest.fromJson(o.toJson());
-      checkBulkEditAssignedUserRolesRequest(od);
+      checkBulkEditAssignedUserRolesRequest(
+          od as api.BulkEditAssignedUserRolesRequest);
     });
   });
 
@@ -7108,7 +7226,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditAssignedUserRolesResponse();
       var od = api.BulkEditAssignedUserRolesResponse.fromJson(o.toJson());
-      checkBulkEditAssignedUserRolesResponse(od);
+      checkBulkEditAssignedUserRolesResponse(
+          od as api.BulkEditAssignedUserRolesResponse);
     });
   });
 
@@ -7118,7 +7237,8 @@
       var o = buildBulkEditLineItemAssignedTargetingOptionsRequest();
       var od = api.BulkEditLineItemAssignedTargetingOptionsRequest.fromJson(
           o.toJson());
-      checkBulkEditLineItemAssignedTargetingOptionsRequest(od);
+      checkBulkEditLineItemAssignedTargetingOptionsRequest(
+          od as api.BulkEditLineItemAssignedTargetingOptionsRequest);
     });
   });
 
@@ -7128,7 +7248,8 @@
       var o = buildBulkEditLineItemAssignedTargetingOptionsResponse();
       var od = api.BulkEditLineItemAssignedTargetingOptionsResponse.fromJson(
           o.toJson());
-      checkBulkEditLineItemAssignedTargetingOptionsResponse(od);
+      checkBulkEditLineItemAssignedTargetingOptionsResponse(
+          od as api.BulkEditLineItemAssignedTargetingOptionsResponse);
     });
   });
 
@@ -7136,7 +7257,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditNegativeKeywordsRequest();
       var od = api.BulkEditNegativeKeywordsRequest.fromJson(o.toJson());
-      checkBulkEditNegativeKeywordsRequest(od);
+      checkBulkEditNegativeKeywordsRequest(
+          od as api.BulkEditNegativeKeywordsRequest);
     });
   });
 
@@ -7144,7 +7266,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditNegativeKeywordsResponse();
       var od = api.BulkEditNegativeKeywordsResponse.fromJson(o.toJson());
-      checkBulkEditNegativeKeywordsResponse(od);
+      checkBulkEditNegativeKeywordsResponse(
+          od as api.BulkEditNegativeKeywordsResponse);
     });
   });
 
@@ -7154,7 +7277,8 @@
       var o = buildBulkEditPartnerAssignedTargetingOptionsRequest();
       var od = api.BulkEditPartnerAssignedTargetingOptionsRequest.fromJson(
           o.toJson());
-      checkBulkEditPartnerAssignedTargetingOptionsRequest(od);
+      checkBulkEditPartnerAssignedTargetingOptionsRequest(
+          od as api.BulkEditPartnerAssignedTargetingOptionsRequest);
     });
   });
 
@@ -7164,7 +7288,8 @@
       var o = buildBulkEditPartnerAssignedTargetingOptionsResponse();
       var od = api.BulkEditPartnerAssignedTargetingOptionsResponse.fromJson(
           o.toJson());
-      checkBulkEditPartnerAssignedTargetingOptionsResponse(od);
+      checkBulkEditPartnerAssignedTargetingOptionsResponse(
+          od as api.BulkEditPartnerAssignedTargetingOptionsResponse);
     });
   });
 
@@ -7172,7 +7297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditSitesRequest();
       var od = api.BulkEditSitesRequest.fromJson(o.toJson());
-      checkBulkEditSitesRequest(od);
+      checkBulkEditSitesRequest(od as api.BulkEditSitesRequest);
     });
   });
 
@@ -7180,7 +7305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulkEditSitesResponse();
       var od = api.BulkEditSitesResponse.fromJson(o.toJson());
-      checkBulkEditSitesResponse(od);
+      checkBulkEditSitesResponse(od as api.BulkEditSitesResponse);
     });
   });
 
@@ -7190,7 +7315,8 @@
       var o = buildBulkListAdvertiserAssignedTargetingOptionsResponse();
       var od = api.BulkListAdvertiserAssignedTargetingOptionsResponse.fromJson(
           o.toJson());
-      checkBulkListAdvertiserAssignedTargetingOptionsResponse(od);
+      checkBulkListAdvertiserAssignedTargetingOptionsResponse(
+          od as api.BulkListAdvertiserAssignedTargetingOptionsResponse);
     });
   });
 
@@ -7200,7 +7326,8 @@
       var o = buildBulkListLineItemAssignedTargetingOptionsResponse();
       var od = api.BulkListLineItemAssignedTargetingOptionsResponse.fromJson(
           o.toJson());
-      checkBulkListLineItemAssignedTargetingOptionsResponse(od);
+      checkBulkListLineItemAssignedTargetingOptionsResponse(
+          od as api.BulkListLineItemAssignedTargetingOptionsResponse);
     });
   });
 
@@ -7208,7 +7335,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCampaign();
       var od = api.Campaign.fromJson(o.toJson());
-      checkCampaign(od);
+      checkCampaign(od as api.Campaign);
     });
   });
 
@@ -7216,7 +7343,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCampaignFlight();
       var od = api.CampaignFlight.fromJson(o.toJson());
-      checkCampaignFlight(od);
+      checkCampaignFlight(od as api.CampaignFlight);
     });
   });
 
@@ -7224,7 +7351,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCampaignGoal();
       var od = api.CampaignGoal.fromJson(o.toJson());
-      checkCampaignGoal(od);
+      checkCampaignGoal(od as api.CampaignGoal);
     });
   });
 
@@ -7233,7 +7360,8 @@
       var o = buildCarrierAndIspAssignedTargetingOptionDetails();
       var od =
           api.CarrierAndIspAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkCarrierAndIspAssignedTargetingOptionDetails(od);
+      checkCarrierAndIspAssignedTargetingOptionDetails(
+          od as api.CarrierAndIspAssignedTargetingOptionDetails);
     });
   });
 
@@ -7241,7 +7369,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCarrierAndIspTargetingOptionDetails();
       var od = api.CarrierAndIspTargetingOptionDetails.fromJson(o.toJson());
-      checkCarrierAndIspTargetingOptionDetails(od);
+      checkCarrierAndIspTargetingOptionDetails(
+          od as api.CarrierAndIspTargetingOptionDetails);
     });
   });
 
@@ -7249,7 +7378,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategoryAssignedTargetingOptionDetails();
       var od = api.CategoryAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkCategoryAssignedTargetingOptionDetails(od);
+      checkCategoryAssignedTargetingOptionDetails(
+          od as api.CategoryAssignedTargetingOptionDetails);
     });
   });
 
@@ -7257,7 +7387,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategoryTargetingOptionDetails();
       var od = api.CategoryTargetingOptionDetails.fromJson(o.toJson());
-      checkCategoryTargetingOptionDetails(od);
+      checkCategoryTargetingOptionDetails(
+          od as api.CategoryTargetingOptionDetails);
     });
   });
 
@@ -7265,7 +7396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -7273,7 +7404,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelAssignedTargetingOptionDetails();
       var od = api.ChannelAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkChannelAssignedTargetingOptionDetails(od);
+      checkChannelAssignedTargetingOptionDetails(
+          od as api.ChannelAssignedTargetingOptionDetails);
     });
   });
 
@@ -7281,7 +7413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCmHybridConfig();
       var od = api.CmHybridConfig.fromJson(o.toJson());
-      checkCmHybridConfig(od);
+      checkCmHybridConfig(od as api.CmHybridConfig);
     });
   });
 
@@ -7289,7 +7421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCmTrackingAd();
       var od = api.CmTrackingAd.fromJson(o.toJson());
-      checkCmTrackingAd(od);
+      checkCmTrackingAd(od as api.CmTrackingAd);
     });
   });
 
@@ -7297,7 +7429,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCombinedAudience();
       var od = api.CombinedAudience.fromJson(o.toJson());
-      checkCombinedAudience(od);
+      checkCombinedAudience(od as api.CombinedAudience);
     });
   });
 
@@ -7305,7 +7437,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCombinedAudienceGroup();
       var od = api.CombinedAudienceGroup.fromJson(o.toJson());
-      checkCombinedAudienceGroup(od);
+      checkCombinedAudienceGroup(od as api.CombinedAudienceGroup);
     });
   });
 
@@ -7313,7 +7445,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCombinedAudienceTargetingSetting();
       var od = api.CombinedAudienceTargetingSetting.fromJson(o.toJson());
-      checkCombinedAudienceTargetingSetting(od);
+      checkCombinedAudienceTargetingSetting(
+          od as api.CombinedAudienceTargetingSetting);
     });
   });
 
@@ -7324,7 +7457,8 @@
       var od =
           api.ContentInstreamPositionAssignedTargetingOptionDetails.fromJson(
               o.toJson());
-      checkContentInstreamPositionAssignedTargetingOptionDetails(od);
+      checkContentInstreamPositionAssignedTargetingOptionDetails(
+          od as api.ContentInstreamPositionAssignedTargetingOptionDetails);
     });
   });
 
@@ -7334,7 +7468,8 @@
       var o = buildContentInstreamPositionTargetingOptionDetails();
       var od = api.ContentInstreamPositionTargetingOptionDetails.fromJson(
           o.toJson());
-      checkContentInstreamPositionTargetingOptionDetails(od);
+      checkContentInstreamPositionTargetingOptionDetails(
+          od as api.ContentInstreamPositionTargetingOptionDetails);
     });
   });
 
@@ -7345,7 +7480,8 @@
       var od =
           api.ContentOutstreamPositionAssignedTargetingOptionDetails.fromJson(
               o.toJson());
-      checkContentOutstreamPositionAssignedTargetingOptionDetails(od);
+      checkContentOutstreamPositionAssignedTargetingOptionDetails(
+          od as api.ContentOutstreamPositionAssignedTargetingOptionDetails);
     });
   });
 
@@ -7355,7 +7491,8 @@
       var o = buildContentOutstreamPositionTargetingOptionDetails();
       var od = api.ContentOutstreamPositionTargetingOptionDetails.fromJson(
           o.toJson());
-      checkContentOutstreamPositionTargetingOptionDetails(od);
+      checkContentOutstreamPositionTargetingOptionDetails(
+          od as api.ContentOutstreamPositionTargetingOptionDetails);
     });
   });
 
@@ -7363,7 +7500,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionCountingConfig();
       var od = api.ConversionCountingConfig.fromJson(o.toJson());
-      checkConversionCountingConfig(od);
+      checkConversionCountingConfig(od as api.ConversionCountingConfig);
     });
   });
 
@@ -7371,7 +7508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCounterEvent();
       var od = api.CounterEvent.fromJson(o.toJson());
-      checkCounterEvent(od);
+      checkCounterEvent(od as api.CounterEvent);
     });
   });
 
@@ -7379,7 +7516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateAssetRequest();
       var od = api.CreateAssetRequest.fromJson(o.toJson());
-      checkCreateAssetRequest(od);
+      checkCreateAssetRequest(od as api.CreateAssetRequest);
     });
   });
 
@@ -7387,7 +7524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateAssetResponse();
       var od = api.CreateAssetResponse.fromJson(o.toJson());
-      checkCreateAssetResponse(od);
+      checkCreateAssetResponse(od as api.CreateAssetResponse);
     });
   });
 
@@ -7395,7 +7532,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateAssignedTargetingOptionsRequest();
       var od = api.CreateAssignedTargetingOptionsRequest.fromJson(o.toJson());
-      checkCreateAssignedTargetingOptionsRequest(od);
+      checkCreateAssignedTargetingOptionsRequest(
+          od as api.CreateAssignedTargetingOptionsRequest);
     });
   });
 
@@ -7403,7 +7541,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSdfDownloadTaskRequest();
       var od = api.CreateSdfDownloadTaskRequest.fromJson(o.toJson());
-      checkCreateSdfDownloadTaskRequest(od);
+      checkCreateSdfDownloadTaskRequest(od as api.CreateSdfDownloadTaskRequest);
     });
   });
 
@@ -7411,7 +7549,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreative();
       var od = api.Creative.fromJson(o.toJson());
-      checkCreative(od);
+      checkCreative(od as api.Creative);
     });
   });
 
@@ -7419,7 +7557,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreativeConfig();
       var od = api.CreativeConfig.fromJson(o.toJson());
-      checkCreativeConfig(od);
+      checkCreativeConfig(od as api.CreativeConfig);
     });
   });
 
@@ -7427,7 +7565,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomBiddingAlgorithm();
       var od = api.CustomBiddingAlgorithm.fromJson(o.toJson());
-      checkCustomBiddingAlgorithm(od);
+      checkCustomBiddingAlgorithm(od as api.CustomBiddingAlgorithm);
     });
   });
 
@@ -7435,7 +7573,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomList();
       var od = api.CustomList.fromJson(o.toJson());
-      checkCustomList(od);
+      checkCustomList(od as api.CustomList);
     });
   });
 
@@ -7443,7 +7581,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomListGroup();
       var od = api.CustomListGroup.fromJson(o.toJson());
-      checkCustomListGroup(od);
+      checkCustomListGroup(od as api.CustomListGroup);
     });
   });
 
@@ -7451,7 +7589,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomListTargetingSetting();
       var od = api.CustomListTargetingSetting.fromJson(o.toJson());
-      checkCustomListTargetingSetting(od);
+      checkCustomListTargetingSetting(od as api.CustomListTargetingSetting);
     });
   });
 
@@ -7459,7 +7597,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -7467,7 +7605,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateRange();
       var od = api.DateRange.fromJson(o.toJson());
-      checkDateRange(od);
+      checkDateRange(od as api.DateRange);
     });
   });
 
@@ -7476,7 +7614,8 @@
       var o = buildDayAndTimeAssignedTargetingOptionDetails();
       var od =
           api.DayAndTimeAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkDayAndTimeAssignedTargetingOptionDetails(od);
+      checkDayAndTimeAssignedTargetingOptionDetails(
+          od as api.DayAndTimeAssignedTargetingOptionDetails);
     });
   });
 
@@ -7484,7 +7623,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteAssignedTargetingOptionsRequest();
       var od = api.DeleteAssignedTargetingOptionsRequest.fromJson(o.toJson());
-      checkDeleteAssignedTargetingOptionsRequest(od);
+      checkDeleteAssignedTargetingOptionsRequest(
+          od as api.DeleteAssignedTargetingOptionsRequest);
     });
   });
 
@@ -7494,7 +7634,8 @@
       var o = buildDeviceMakeModelAssignedTargetingOptionDetails();
       var od = api.DeviceMakeModelAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkDeviceMakeModelAssignedTargetingOptionDetails(od);
+      checkDeviceMakeModelAssignedTargetingOptionDetails(
+          od as api.DeviceMakeModelAssignedTargetingOptionDetails);
     });
   });
 
@@ -7502,7 +7643,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceMakeModelTargetingOptionDetails();
       var od = api.DeviceMakeModelTargetingOptionDetails.fromJson(o.toJson());
-      checkDeviceMakeModelTargetingOptionDetails(od);
+      checkDeviceMakeModelTargetingOptionDetails(
+          od as api.DeviceMakeModelTargetingOptionDetails);
     });
   });
 
@@ -7511,7 +7653,8 @@
       var o = buildDeviceTypeAssignedTargetingOptionDetails();
       var od =
           api.DeviceTypeAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkDeviceTypeAssignedTargetingOptionDetails(od);
+      checkDeviceTypeAssignedTargetingOptionDetails(
+          od as api.DeviceTypeAssignedTargetingOptionDetails);
     });
   });
 
@@ -7519,7 +7662,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceTypeTargetingOptionDetails();
       var od = api.DeviceTypeTargetingOptionDetails.fromJson(o.toJson());
-      checkDeviceTypeTargetingOptionDetails(od);
+      checkDeviceTypeTargetingOptionDetails(
+          od as api.DeviceTypeTargetingOptionDetails);
     });
   });
 
@@ -7529,7 +7673,8 @@
       var o = buildDigitalContentLabelAssignedTargetingOptionDetails();
       var od = api.DigitalContentLabelAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkDigitalContentLabelAssignedTargetingOptionDetails(od);
+      checkDigitalContentLabelAssignedTargetingOptionDetails(
+          od as api.DigitalContentLabelAssignedTargetingOptionDetails);
     });
   });
 
@@ -7538,7 +7683,8 @@
       var o = buildDigitalContentLabelTargetingOptionDetails();
       var od =
           api.DigitalContentLabelTargetingOptionDetails.fromJson(o.toJson());
-      checkDigitalContentLabelTargetingOptionDetails(od);
+      checkDigitalContentLabelTargetingOptionDetails(
+          od as api.DigitalContentLabelTargetingOptionDetails);
     });
   });
 
@@ -7546,7 +7692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensions();
       var od = api.Dimensions.fromJson(o.toJson());
-      checkDimensions(od);
+      checkDimensions(od as api.Dimensions);
     });
   });
 
@@ -7554,7 +7700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleVerify();
       var od = api.DoubleVerify.fromJson(o.toJson());
-      checkDoubleVerify(od);
+      checkDoubleVerify(od as api.DoubleVerify);
     });
   });
 
@@ -7562,7 +7708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleVerifyAppStarRating();
       var od = api.DoubleVerifyAppStarRating.fromJson(o.toJson());
-      checkDoubleVerifyAppStarRating(od);
+      checkDoubleVerifyAppStarRating(od as api.DoubleVerifyAppStarRating);
     });
   });
 
@@ -7570,7 +7716,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleVerifyBrandSafetyCategories();
       var od = api.DoubleVerifyBrandSafetyCategories.fromJson(o.toJson());
-      checkDoubleVerifyBrandSafetyCategories(od);
+      checkDoubleVerifyBrandSafetyCategories(
+          od as api.DoubleVerifyBrandSafetyCategories);
     });
   });
 
@@ -7578,7 +7725,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleVerifyDisplayViewability();
       var od = api.DoubleVerifyDisplayViewability.fromJson(o.toJson());
-      checkDoubleVerifyDisplayViewability(od);
+      checkDoubleVerifyDisplayViewability(
+          od as api.DoubleVerifyDisplayViewability);
     });
   });
 
@@ -7586,7 +7734,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleVerifyFraudInvalidTraffic();
       var od = api.DoubleVerifyFraudInvalidTraffic.fromJson(o.toJson());
-      checkDoubleVerifyFraudInvalidTraffic(od);
+      checkDoubleVerifyFraudInvalidTraffic(
+          od as api.DoubleVerifyFraudInvalidTraffic);
     });
   });
 
@@ -7594,7 +7743,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDoubleVerifyVideoViewability();
       var od = api.DoubleVerifyVideoViewability.fromJson(o.toJson());
-      checkDoubleVerifyVideoViewability(od);
+      checkDoubleVerifyVideoViewability(od as api.DoubleVerifyVideoViewability);
     });
   });
 
@@ -7602,7 +7751,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -7611,7 +7760,8 @@
       var o = buildEnvironmentAssignedTargetingOptionDetails();
       var od =
           api.EnvironmentAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkEnvironmentAssignedTargetingOptionDetails(od);
+      checkEnvironmentAssignedTargetingOptionDetails(
+          od as api.EnvironmentAssignedTargetingOptionDetails);
     });
   });
 
@@ -7619,7 +7769,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironmentTargetingOptionDetails();
       var od = api.EnvironmentTargetingOptionDetails.fromJson(o.toJson());
-      checkEnvironmentTargetingOptionDetails(od);
+      checkEnvironmentTargetingOptionDetails(
+          od as api.EnvironmentTargetingOptionDetails);
     });
   });
 
@@ -7627,7 +7778,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangeAssignedTargetingOptionDetails();
       var od = api.ExchangeAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkExchangeAssignedTargetingOptionDetails(od);
+      checkExchangeAssignedTargetingOptionDetails(
+          od as api.ExchangeAssignedTargetingOptionDetails);
     });
   });
 
@@ -7635,7 +7787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangeConfig();
       var od = api.ExchangeConfig.fromJson(o.toJson());
-      checkExchangeConfig(od);
+      checkExchangeConfig(od as api.ExchangeConfig);
     });
   });
 
@@ -7643,7 +7795,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangeConfigEnabledExchange();
       var od = api.ExchangeConfigEnabledExchange.fromJson(o.toJson());
-      checkExchangeConfigEnabledExchange(od);
+      checkExchangeConfigEnabledExchange(
+          od as api.ExchangeConfigEnabledExchange);
     });
   });
 
@@ -7651,7 +7804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangeReviewStatus();
       var od = api.ExchangeReviewStatus.fromJson(o.toJson());
-      checkExchangeReviewStatus(od);
+      checkExchangeReviewStatus(od as api.ExchangeReviewStatus);
     });
   });
 
@@ -7659,7 +7812,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExchangeTargetingOptionDetails();
       var od = api.ExchangeTargetingOptionDetails.fromJson(o.toJson());
-      checkExchangeTargetingOptionDetails(od);
+      checkExchangeTargetingOptionDetails(
+          od as api.ExchangeTargetingOptionDetails);
     });
   });
 
@@ -7667,7 +7821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExitEvent();
       var od = api.ExitEvent.fromJson(o.toJson());
-      checkExitEvent(od);
+      checkExitEvent(od as api.ExitEvent);
     });
   });
 
@@ -7675,7 +7829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirstAndThirdPartyAudience();
       var od = api.FirstAndThirdPartyAudience.fromJson(o.toJson());
-      checkFirstAndThirdPartyAudience(od);
+      checkFirstAndThirdPartyAudience(od as api.FirstAndThirdPartyAudience);
     });
   });
 
@@ -7683,7 +7837,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirstAndThirdPartyAudienceGroup();
       var od = api.FirstAndThirdPartyAudienceGroup.fromJson(o.toJson());
-      checkFirstAndThirdPartyAudienceGroup(od);
+      checkFirstAndThirdPartyAudienceGroup(
+          od as api.FirstAndThirdPartyAudienceGroup);
     });
   });
 
@@ -7692,7 +7847,8 @@
       var o = buildFirstAndThirdPartyAudienceTargetingSetting();
       var od =
           api.FirstAndThirdPartyAudienceTargetingSetting.fromJson(o.toJson());
-      checkFirstAndThirdPartyAudienceTargetingSetting(od);
+      checkFirstAndThirdPartyAudienceTargetingSetting(
+          od as api.FirstAndThirdPartyAudienceTargetingSetting);
     });
   });
 
@@ -7700,7 +7856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFixedBidStrategy();
       var od = api.FixedBidStrategy.fromJson(o.toJson());
-      checkFixedBidStrategy(od);
+      checkFixedBidStrategy(od as api.FixedBidStrategy);
     });
   });
 
@@ -7708,7 +7864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFloodlightGroup();
       var od = api.FloodlightGroup.fromJson(o.toJson());
-      checkFloodlightGroup(od);
+      checkFloodlightGroup(od as api.FloodlightGroup);
     });
   });
 
@@ -7716,7 +7872,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFrequencyCap();
       var od = api.FrequencyCap.fromJson(o.toJson());
-      checkFrequencyCap(od);
+      checkFrequencyCap(od as api.FrequencyCap);
     });
   });
 
@@ -7724,7 +7880,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenderAssignedTargetingOptionDetails();
       var od = api.GenderAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkGenderAssignedTargetingOptionDetails(od);
+      checkGenderAssignedTargetingOptionDetails(
+          od as api.GenderAssignedTargetingOptionDetails);
     });
   });
 
@@ -7732,7 +7889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenderTargetingOptionDetails();
       var od = api.GenderTargetingOptionDetails.fromJson(o.toJson());
-      checkGenderTargetingOptionDetails(od);
+      checkGenderTargetingOptionDetails(od as api.GenderTargetingOptionDetails);
     });
   });
 
@@ -7740,7 +7897,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeoRegionAssignedTargetingOptionDetails();
       var od = api.GeoRegionAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkGeoRegionAssignedTargetingOptionDetails(od);
+      checkGeoRegionAssignedTargetingOptionDetails(
+          od as api.GeoRegionAssignedTargetingOptionDetails);
     });
   });
 
@@ -7748,7 +7906,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeoRegionTargetingOptionDetails();
       var od = api.GeoRegionTargetingOptionDetails.fromJson(o.toJson());
-      checkGeoRegionTargetingOptionDetails(od);
+      checkGeoRegionTargetingOptionDetails(
+          od as api.GeoRegionTargetingOptionDetails);
     });
   });
 
@@ -7756,7 +7915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAudience();
       var od = api.GoogleAudience.fromJson(o.toJson());
-      checkGoogleAudience(od);
+      checkGoogleAudience(od as api.GoogleAudience);
     });
   });
 
@@ -7764,7 +7923,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAudienceGroup();
       var od = api.GoogleAudienceGroup.fromJson(o.toJson());
-      checkGoogleAudienceGroup(od);
+      checkGoogleAudienceGroup(od as api.GoogleAudienceGroup);
     });
   });
 
@@ -7772,7 +7931,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAudienceTargetingSetting();
       var od = api.GoogleAudienceTargetingSetting.fromJson(o.toJson());
-      checkGoogleAudienceTargetingSetting(od);
+      checkGoogleAudienceTargetingSetting(
+          od as api.GoogleAudienceTargetingSetting);
     });
   });
 
@@ -7780,7 +7940,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleBytestreamMedia();
       var od = api.GoogleBytestreamMedia.fromJson(o.toJson());
-      checkGoogleBytestreamMedia(od);
+      checkGoogleBytestreamMedia(od as api.GoogleBytestreamMedia);
     });
   });
 
@@ -7790,7 +7950,8 @@
       var o = buildHouseholdIncomeAssignedTargetingOptionDetails();
       var od = api.HouseholdIncomeAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkHouseholdIncomeAssignedTargetingOptionDetails(od);
+      checkHouseholdIncomeAssignedTargetingOptionDetails(
+          od as api.HouseholdIncomeAssignedTargetingOptionDetails);
     });
   });
 
@@ -7798,7 +7959,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildHouseholdIncomeTargetingOptionDetails();
       var od = api.HouseholdIncomeTargetingOptionDetails.fromJson(o.toJson());
-      checkHouseholdIncomeTargetingOptionDetails(od);
+      checkHouseholdIncomeTargetingOptionDetails(
+          od as api.HouseholdIncomeTargetingOptionDetails);
     });
   });
 
@@ -7806,7 +7968,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIdFilter();
       var od = api.IdFilter.fromJson(o.toJson());
-      checkIdFilter(od);
+      checkIdFilter(od as api.IdFilter);
     });
   });
 
@@ -7814,7 +7976,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertionOrder();
       var od = api.InsertionOrder.fromJson(o.toJson());
-      checkInsertionOrder(od);
+      checkInsertionOrder(od as api.InsertionOrder);
     });
   });
 
@@ -7822,7 +7984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertionOrderBudget();
       var od = api.InsertionOrderBudget.fromJson(o.toJson());
-      checkInsertionOrderBudget(od);
+      checkInsertionOrderBudget(od as api.InsertionOrderBudget);
     });
   });
 
@@ -7830,7 +7992,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertionOrderBudgetSegment();
       var od = api.InsertionOrderBudgetSegment.fromJson(o.toJson());
-      checkInsertionOrderBudgetSegment(od);
+      checkInsertionOrderBudgetSegment(od as api.InsertionOrderBudgetSegment);
     });
   });
 
@@ -7838,7 +8000,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntegralAdScience();
       var od = api.IntegralAdScience.fromJson(o.toJson());
-      checkIntegralAdScience(od);
+      checkIntegralAdScience(od as api.IntegralAdScience);
     });
   });
 
@@ -7846,7 +8008,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntegrationDetails();
       var od = api.IntegrationDetails.fromJson(o.toJson());
-      checkIntegrationDetails(od);
+      checkIntegrationDetails(od as api.IntegrationDetails);
     });
   });
 
@@ -7854,7 +8016,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventorySource();
       var od = api.InventorySource.fromJson(o.toJson());
-      checkInventorySource(od);
+      checkInventorySource(od as api.InventorySource);
     });
   });
 
@@ -7864,7 +8026,8 @@
       var o = buildInventorySourceAssignedTargetingOptionDetails();
       var od = api.InventorySourceAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkInventorySourceAssignedTargetingOptionDetails(od);
+      checkInventorySourceAssignedTargetingOptionDetails(
+          od as api.InventorySourceAssignedTargetingOptionDetails);
     });
   });
 
@@ -7872,7 +8035,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventorySourceDisplayCreativeConfig();
       var od = api.InventorySourceDisplayCreativeConfig.fromJson(o.toJson());
-      checkInventorySourceDisplayCreativeConfig(od);
+      checkInventorySourceDisplayCreativeConfig(
+          od as api.InventorySourceDisplayCreativeConfig);
     });
   });
 
@@ -7880,7 +8044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventorySourceFilter();
       var od = api.InventorySourceFilter.fromJson(o.toJson());
-      checkInventorySourceFilter(od);
+      checkInventorySourceFilter(od as api.InventorySourceFilter);
     });
   });
 
@@ -7888,7 +8052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventorySourceGroup();
       var od = api.InventorySourceGroup.fromJson(o.toJson());
-      checkInventorySourceGroup(od);
+      checkInventorySourceGroup(od as api.InventorySourceGroup);
     });
   });
 
@@ -7898,7 +8062,8 @@
       var o = buildInventorySourceGroupAssignedTargetingOptionDetails();
       var od = api.InventorySourceGroupAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkInventorySourceGroupAssignedTargetingOptionDetails(od);
+      checkInventorySourceGroupAssignedTargetingOptionDetails(
+          od as api.InventorySourceGroupAssignedTargetingOptionDetails);
     });
   });
 
@@ -7906,7 +8071,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventorySourceStatus();
       var od = api.InventorySourceStatus.fromJson(o.toJson());
-      checkInventorySourceStatus(od);
+      checkInventorySourceStatus(od as api.InventorySourceStatus);
     });
   });
 
@@ -7914,7 +8079,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInventorySourceVideoCreativeConfig();
       var od = api.InventorySourceVideoCreativeConfig.fromJson(o.toJson());
-      checkInventorySourceVideoCreativeConfig(od);
+      checkInventorySourceVideoCreativeConfig(
+          od as api.InventorySourceVideoCreativeConfig);
     });
   });
 
@@ -7922,7 +8088,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeywordAssignedTargetingOptionDetails();
       var od = api.KeywordAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkKeywordAssignedTargetingOptionDetails(od);
+      checkKeywordAssignedTargetingOptionDetails(
+          od as api.KeywordAssignedTargetingOptionDetails);
     });
   });
 
@@ -7930,7 +8097,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguageAssignedTargetingOptionDetails();
       var od = api.LanguageAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkLanguageAssignedTargetingOptionDetails(od);
+      checkLanguageAssignedTargetingOptionDetails(
+          od as api.LanguageAssignedTargetingOptionDetails);
     });
   });
 
@@ -7938,7 +8106,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguageTargetingOptionDetails();
       var od = api.LanguageTargetingOptionDetails.fromJson(o.toJson());
-      checkLanguageTargetingOptionDetails(od);
+      checkLanguageTargetingOptionDetails(
+          od as api.LanguageTargetingOptionDetails);
     });
   });
 
@@ -7946,7 +8115,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLineItem();
       var od = api.LineItem.fromJson(o.toJson());
-      checkLineItem(od);
+      checkLineItem(od as api.LineItem);
     });
   });
 
@@ -7954,7 +8123,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLineItemBudget();
       var od = api.LineItemBudget.fromJson(o.toJson());
-      checkLineItemBudget(od);
+      checkLineItemBudget(od as api.LineItemBudget);
     });
   });
 
@@ -7962,7 +8131,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLineItemFlight();
       var od = api.LineItemFlight.fromJson(o.toJson());
-      checkLineItemFlight(od);
+      checkLineItemFlight(od as api.LineItemFlight);
     });
   });
 
@@ -7972,7 +8141,8 @@
       var o = buildListAdvertiserAssignedTargetingOptionsResponse();
       var od = api.ListAdvertiserAssignedTargetingOptionsResponse.fromJson(
           o.toJson());
-      checkListAdvertiserAssignedTargetingOptionsResponse(od);
+      checkListAdvertiserAssignedTargetingOptionsResponse(
+          od as api.ListAdvertiserAssignedTargetingOptionsResponse);
     });
   });
 
@@ -7980,7 +8150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAdvertisersResponse();
       var od = api.ListAdvertisersResponse.fromJson(o.toJson());
-      checkListAdvertisersResponse(od);
+      checkListAdvertisersResponse(od as api.ListAdvertisersResponse);
     });
   });
 
@@ -7988,7 +8158,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAssignedInventorySourcesResponse();
       var od = api.ListAssignedInventorySourcesResponse.fromJson(o.toJson());
-      checkListAssignedInventorySourcesResponse(od);
+      checkListAssignedInventorySourcesResponse(
+          od as api.ListAssignedInventorySourcesResponse);
     });
   });
 
@@ -7996,7 +8167,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAssignedLocationsResponse();
       var od = api.ListAssignedLocationsResponse.fromJson(o.toJson());
-      checkListAssignedLocationsResponse(od);
+      checkListAssignedLocationsResponse(
+          od as api.ListAssignedLocationsResponse);
     });
   });
 
@@ -8004,7 +8176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCampaignsResponse();
       var od = api.ListCampaignsResponse.fromJson(o.toJson());
-      checkListCampaignsResponse(od);
+      checkListCampaignsResponse(od as api.ListCampaignsResponse);
     });
   });
 
@@ -8012,7 +8184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListChannelsResponse();
       var od = api.ListChannelsResponse.fromJson(o.toJson());
-      checkListChannelsResponse(od);
+      checkListChannelsResponse(od as api.ListChannelsResponse);
     });
   });
 
@@ -8020,7 +8192,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCombinedAudiencesResponse();
       var od = api.ListCombinedAudiencesResponse.fromJson(o.toJson());
-      checkListCombinedAudiencesResponse(od);
+      checkListCombinedAudiencesResponse(
+          od as api.ListCombinedAudiencesResponse);
     });
   });
 
@@ -8028,7 +8201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCreativesResponse();
       var od = api.ListCreativesResponse.fromJson(o.toJson());
-      checkListCreativesResponse(od);
+      checkListCreativesResponse(od as api.ListCreativesResponse);
     });
   });
 
@@ -8036,7 +8209,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCustomBiddingAlgorithmsResponse();
       var od = api.ListCustomBiddingAlgorithmsResponse.fromJson(o.toJson());
-      checkListCustomBiddingAlgorithmsResponse(od);
+      checkListCustomBiddingAlgorithmsResponse(
+          od as api.ListCustomBiddingAlgorithmsResponse);
     });
   });
 
@@ -8044,7 +8218,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCustomListsResponse();
       var od = api.ListCustomListsResponse.fromJson(o.toJson());
-      checkListCustomListsResponse(od);
+      checkListCustomListsResponse(od as api.ListCustomListsResponse);
     });
   });
 
@@ -8052,7 +8226,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFirstAndThirdPartyAudiencesResponse();
       var od = api.ListFirstAndThirdPartyAudiencesResponse.fromJson(o.toJson());
-      checkListFirstAndThirdPartyAudiencesResponse(od);
+      checkListFirstAndThirdPartyAudiencesResponse(
+          od as api.ListFirstAndThirdPartyAudiencesResponse);
     });
   });
 
@@ -8060,7 +8235,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGoogleAudiencesResponse();
       var od = api.ListGoogleAudiencesResponse.fromJson(o.toJson());
-      checkListGoogleAudiencesResponse(od);
+      checkListGoogleAudiencesResponse(od as api.ListGoogleAudiencesResponse);
     });
   });
 
@@ -8068,7 +8243,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInsertionOrdersResponse();
       var od = api.ListInsertionOrdersResponse.fromJson(o.toJson());
-      checkListInsertionOrdersResponse(od);
+      checkListInsertionOrdersResponse(od as api.ListInsertionOrdersResponse);
     });
   });
 
@@ -8076,7 +8251,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInventorySourceGroupsResponse();
       var od = api.ListInventorySourceGroupsResponse.fromJson(o.toJson());
-      checkListInventorySourceGroupsResponse(od);
+      checkListInventorySourceGroupsResponse(
+          od as api.ListInventorySourceGroupsResponse);
     });
   });
 
@@ -8084,7 +8260,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInventorySourcesResponse();
       var od = api.ListInventorySourcesResponse.fromJson(o.toJson());
-      checkListInventorySourcesResponse(od);
+      checkListInventorySourcesResponse(od as api.ListInventorySourcesResponse);
     });
   });
 
@@ -8093,7 +8269,8 @@
       var o = buildListLineItemAssignedTargetingOptionsResponse();
       var od =
           api.ListLineItemAssignedTargetingOptionsResponse.fromJson(o.toJson());
-      checkListLineItemAssignedTargetingOptionsResponse(od);
+      checkListLineItemAssignedTargetingOptionsResponse(
+          od as api.ListLineItemAssignedTargetingOptionsResponse);
     });
   });
 
@@ -8101,7 +8278,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLineItemsResponse();
       var od = api.ListLineItemsResponse.fromJson(o.toJson());
-      checkListLineItemsResponse(od);
+      checkListLineItemsResponse(od as api.ListLineItemsResponse);
     });
   });
 
@@ -8109,7 +8286,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationListsResponse();
       var od = api.ListLocationListsResponse.fromJson(o.toJson());
-      checkListLocationListsResponse(od);
+      checkListLocationListsResponse(od as api.ListLocationListsResponse);
     });
   });
 
@@ -8117,7 +8294,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListNegativeKeywordListsResponse();
       var od = api.ListNegativeKeywordListsResponse.fromJson(o.toJson());
-      checkListNegativeKeywordListsResponse(od);
+      checkListNegativeKeywordListsResponse(
+          od as api.ListNegativeKeywordListsResponse);
     });
   });
 
@@ -8125,7 +8303,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListNegativeKeywordsResponse();
       var od = api.ListNegativeKeywordsResponse.fromJson(o.toJson());
-      checkListNegativeKeywordsResponse(od);
+      checkListNegativeKeywordsResponse(od as api.ListNegativeKeywordsResponse);
     });
   });
 
@@ -8134,7 +8312,8 @@
       var o = buildListPartnerAssignedTargetingOptionsResponse();
       var od =
           api.ListPartnerAssignedTargetingOptionsResponse.fromJson(o.toJson());
-      checkListPartnerAssignedTargetingOptionsResponse(od);
+      checkListPartnerAssignedTargetingOptionsResponse(
+          od as api.ListPartnerAssignedTargetingOptionsResponse);
     });
   });
 
@@ -8142,7 +8321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPartnersResponse();
       var od = api.ListPartnersResponse.fromJson(o.toJson());
-      checkListPartnersResponse(od);
+      checkListPartnersResponse(od as api.ListPartnersResponse);
     });
   });
 
@@ -8150,7 +8329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSitesResponse();
       var od = api.ListSitesResponse.fromJson(o.toJson());
-      checkListSitesResponse(od);
+      checkListSitesResponse(od as api.ListSitesResponse);
     });
   });
 
@@ -8158,7 +8337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTargetingOptionsResponse();
       var od = api.ListTargetingOptionsResponse.fromJson(o.toJson());
-      checkListTargetingOptionsResponse(od);
+      checkListTargetingOptionsResponse(od as api.ListTargetingOptionsResponse);
     });
   });
 
@@ -8166,7 +8345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUsersResponse();
       var od = api.ListUsersResponse.fromJson(o.toJson());
-      checkListUsersResponse(od);
+      checkListUsersResponse(od as api.ListUsersResponse);
     });
   });
 
@@ -8174,7 +8353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationList();
       var od = api.LocationList.fromJson(o.toJson());
-      checkLocationList(od);
+      checkLocationList(od as api.LocationList);
     });
   });
 
@@ -8182,7 +8361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLookbackWindow();
       var od = api.LookbackWindow.fromJson(o.toJson());
-      checkLookbackWindow(od);
+      checkLookbackWindow(od as api.LookbackWindow);
     });
   });
 
@@ -8190,7 +8369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMaximizeSpendBidStrategy();
       var od = api.MaximizeSpendBidStrategy.fromJson(o.toJson());
-      checkMaximizeSpendBidStrategy(od);
+      checkMaximizeSpendBidStrategy(od as api.MaximizeSpendBidStrategy);
     });
   });
 
@@ -8198,7 +8377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMeasurementConfig();
       var od = api.MeasurementConfig.fromJson(o.toJson());
-      checkMeasurementConfig(od);
+      checkMeasurementConfig(od as api.MeasurementConfig);
     });
   });
 
@@ -8206,7 +8385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoney();
       var od = api.Money.fromJson(o.toJson());
-      checkMoney(od);
+      checkMoney(od as api.Money);
     });
   });
 
@@ -8214,7 +8393,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNegativeKeyword();
       var od = api.NegativeKeyword.fromJson(o.toJson());
-      checkNegativeKeyword(od);
+      checkNegativeKeyword(od as api.NegativeKeyword);
     });
   });
 
@@ -8222,7 +8401,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNegativeKeywordList();
       var od = api.NegativeKeywordList.fromJson(o.toJson());
-      checkNegativeKeywordList(od);
+      checkNegativeKeywordList(od as api.NegativeKeywordList);
     });
   });
 
@@ -8232,7 +8411,8 @@
       var o = buildNegativeKeywordListAssignedTargetingOptionDetails();
       var od = api.NegativeKeywordListAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkNegativeKeywordListAssignedTargetingOptionDetails(od);
+      checkNegativeKeywordListAssignedTargetingOptionDetails(
+          od as api.NegativeKeywordListAssignedTargetingOptionDetails);
     });
   });
 
@@ -8240,7 +8420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObaIcon();
       var od = api.ObaIcon.fromJson(o.toJson());
-      checkObaIcon(od);
+      checkObaIcon(od as api.ObaIcon);
     });
   });
 
@@ -8250,7 +8430,8 @@
       var o = buildOnScreenPositionAssignedTargetingOptionDetails();
       var od = api.OnScreenPositionAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkOnScreenPositionAssignedTargetingOptionDetails(od);
+      checkOnScreenPositionAssignedTargetingOptionDetails(
+          od as api.OnScreenPositionAssignedTargetingOptionDetails);
     });
   });
 
@@ -8258,7 +8439,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOnScreenPositionTargetingOptionDetails();
       var od = api.OnScreenPositionTargetingOptionDetails.fromJson(o.toJson());
-      checkOnScreenPositionTargetingOptionDetails(od);
+      checkOnScreenPositionTargetingOptionDetails(
+          od as api.OnScreenPositionTargetingOptionDetails);
     });
   });
 
@@ -8268,7 +8450,8 @@
       var o = buildOperatingSystemAssignedTargetingOptionDetails();
       var od = api.OperatingSystemAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkOperatingSystemAssignedTargetingOptionDetails(od);
+      checkOperatingSystemAssignedTargetingOptionDetails(
+          od as api.OperatingSystemAssignedTargetingOptionDetails);
     });
   });
 
@@ -8276,7 +8459,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperatingSystemTargetingOptionDetails();
       var od = api.OperatingSystemTargetingOptionDetails.fromJson(o.toJson());
-      checkOperatingSystemTargetingOptionDetails(od);
+      checkOperatingSystemTargetingOptionDetails(
+          od as api.OperatingSystemTargetingOptionDetails);
     });
   });
 
@@ -8284,7 +8468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -8292,7 +8476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPacing();
       var od = api.Pacing.fromJson(o.toJson());
-      checkPacing(od);
+      checkPacing(od as api.Pacing);
     });
   });
 
@@ -8300,7 +8484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParentEntityFilter();
       var od = api.ParentEntityFilter.fromJson(o.toJson());
-      checkParentEntityFilter(od);
+      checkParentEntityFilter(od as api.ParentEntityFilter);
     });
   });
 
@@ -8309,7 +8493,8 @@
       var o = buildParentalStatusAssignedTargetingOptionDetails();
       var od =
           api.ParentalStatusAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkParentalStatusAssignedTargetingOptionDetails(od);
+      checkParentalStatusAssignedTargetingOptionDetails(
+          od as api.ParentalStatusAssignedTargetingOptionDetails);
     });
   });
 
@@ -8317,7 +8502,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildParentalStatusTargetingOptionDetails();
       var od = api.ParentalStatusTargetingOptionDetails.fromJson(o.toJson());
-      checkParentalStatusTargetingOptionDetails(od);
+      checkParentalStatusTargetingOptionDetails(
+          od as api.ParentalStatusTargetingOptionDetails);
     });
   });
 
@@ -8325,7 +8511,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartner();
       var od = api.Partner.fromJson(o.toJson());
-      checkPartner(od);
+      checkPartner(od as api.Partner);
     });
   });
 
@@ -8333,7 +8519,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartnerAdServerConfig();
       var od = api.PartnerAdServerConfig.fromJson(o.toJson());
-      checkPartnerAdServerConfig(od);
+      checkPartnerAdServerConfig(od as api.PartnerAdServerConfig);
     });
   });
 
@@ -8341,7 +8527,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartnerCost();
       var od = api.PartnerCost.fromJson(o.toJson());
-      checkPartnerCost(od);
+      checkPartnerCost(od as api.PartnerCost);
     });
   });
 
@@ -8349,7 +8535,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartnerDataAccessConfig();
       var od = api.PartnerDataAccessConfig.fromJson(o.toJson());
-      checkPartnerDataAccessConfig(od);
+      checkPartnerDataAccessConfig(od as api.PartnerDataAccessConfig);
     });
   });
 
@@ -8357,7 +8543,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartnerGeneralConfig();
       var od = api.PartnerGeneralConfig.fromJson(o.toJson());
-      checkPartnerGeneralConfig(od);
+      checkPartnerGeneralConfig(od as api.PartnerGeneralConfig);
     });
   });
 
@@ -8365,7 +8551,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartnerRevenueModel();
       var od = api.PartnerRevenueModel.fromJson(o.toJson());
-      checkPartnerRevenueModel(od);
+      checkPartnerRevenueModel(od as api.PartnerRevenueModel);
     });
   });
 
@@ -8373,7 +8559,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerformanceGoal();
       var od = api.PerformanceGoal.fromJson(o.toJson());
-      checkPerformanceGoal(od);
+      checkPerformanceGoal(od as api.PerformanceGoal);
     });
   });
 
@@ -8381,7 +8567,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerformanceGoalBidStrategy();
       var od = api.PerformanceGoalBidStrategy.fromJson(o.toJson());
-      checkPerformanceGoalBidStrategy(od);
+      checkPerformanceGoalBidStrategy(od as api.PerformanceGoalBidStrategy);
     });
   });
 
@@ -8391,7 +8577,8 @@
       var o = buildProximityLocationListAssignedTargetingOptionDetails();
       var od = api.ProximityLocationListAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkProximityLocationListAssignedTargetingOptionDetails(od);
+      checkProximityLocationListAssignedTargetingOptionDetails(
+          od as api.ProximityLocationListAssignedTargetingOptionDetails);
     });
   });
 
@@ -8399,7 +8586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublisherReviewStatus();
       var od = api.PublisherReviewStatus.fromJson(o.toJson());
-      checkPublisherReviewStatus(od);
+      checkPublisherReviewStatus(od as api.PublisherReviewStatus);
     });
   });
 
@@ -8407,7 +8594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRateDetails();
       var od = api.RateDetails.fromJson(o.toJson());
-      checkRateDetails(od);
+      checkRateDetails(od as api.RateDetails);
     });
   });
 
@@ -8417,7 +8604,8 @@
       var o = buildRegionalLocationListAssignedTargetingOptionDetails();
       var od = api.RegionalLocationListAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkRegionalLocationListAssignedTargetingOptionDetails(od);
+      checkRegionalLocationListAssignedTargetingOptionDetails(
+          od as api.RegionalLocationListAssignedTargetingOptionDetails);
     });
   });
 
@@ -8425,7 +8613,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReviewStatusInfo();
       var od = api.ReviewStatusInfo.fromJson(o.toJson());
-      checkReviewStatusInfo(od);
+      checkReviewStatusInfo(od as api.ReviewStatusInfo);
     });
   });
 
@@ -8433,7 +8621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSdfConfig();
       var od = api.SdfConfig.fromJson(o.toJson());
-      checkSdfConfig(od);
+      checkSdfConfig(od as api.SdfConfig);
     });
   });
 
@@ -8441,7 +8629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSdfDownloadTask();
       var od = api.SdfDownloadTask.fromJson(o.toJson());
-      checkSdfDownloadTask(od);
+      checkSdfDownloadTask(od as api.SdfDownloadTask);
     });
   });
 
@@ -8449,7 +8637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSdfDownloadTaskMetadata();
       var od = api.SdfDownloadTaskMetadata.fromJson(o.toJson());
-      checkSdfDownloadTaskMetadata(od);
+      checkSdfDownloadTaskMetadata(od as api.SdfDownloadTaskMetadata);
     });
   });
 
@@ -8459,7 +8647,8 @@
       var o = buildSensitiveCategoryAssignedTargetingOptionDetails();
       var od = api.SensitiveCategoryAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkSensitiveCategoryAssignedTargetingOptionDetails(od);
+      checkSensitiveCategoryAssignedTargetingOptionDetails(
+          od as api.SensitiveCategoryAssignedTargetingOptionDetails);
     });
   });
 
@@ -8467,7 +8656,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSensitiveCategoryTargetingOptionDetails();
       var od = api.SensitiveCategoryTargetingOptionDetails.fromJson(o.toJson());
-      checkSensitiveCategoryTargetingOptionDetails(od);
+      checkSensitiveCategoryTargetingOptionDetails(
+          od as api.SensitiveCategoryTargetingOptionDetails);
     });
   });
 
@@ -8475,7 +8665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSite();
       var od = api.Site.fromJson(o.toJson());
-      checkSite(od);
+      checkSite(od as api.Site);
     });
   });
 
@@ -8483,7 +8673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -8492,7 +8682,8 @@
       var o = buildSubExchangeAssignedTargetingOptionDetails();
       var od =
           api.SubExchangeAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkSubExchangeAssignedTargetingOptionDetails(od);
+      checkSubExchangeAssignedTargetingOptionDetails(
+          od as api.SubExchangeAssignedTargetingOptionDetails);
     });
   });
 
@@ -8500,7 +8691,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubExchangeTargetingOptionDetails();
       var od = api.SubExchangeTargetingOptionDetails.fromJson(o.toJson());
-      checkSubExchangeTargetingOptionDetails(od);
+      checkSubExchangeTargetingOptionDetails(
+          od as api.SubExchangeTargetingOptionDetails);
     });
   });
 
@@ -8508,7 +8700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetingOption();
       var od = api.TargetingOption.fromJson(o.toJson());
-      checkTargetingOption(od);
+      checkTargetingOption(od as api.TargetingOption);
     });
   });
 
@@ -8516,7 +8708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyOnlyConfig();
       var od = api.ThirdPartyOnlyConfig.fromJson(o.toJson());
-      checkThirdPartyOnlyConfig(od);
+      checkThirdPartyOnlyConfig(od as api.ThirdPartyOnlyConfig);
     });
   });
 
@@ -8524,7 +8716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyUrl();
       var od = api.ThirdPartyUrl.fromJson(o.toJson());
-      checkThirdPartyUrl(od);
+      checkThirdPartyUrl(od as api.ThirdPartyUrl);
     });
   });
 
@@ -8534,7 +8726,8 @@
       var o = buildThirdPartyVerifierAssignedTargetingOptionDetails();
       var od = api.ThirdPartyVerifierAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkThirdPartyVerifierAssignedTargetingOptionDetails(od);
+      checkThirdPartyVerifierAssignedTargetingOptionDetails(
+          od as api.ThirdPartyVerifierAssignedTargetingOptionDetails);
     });
   });
 
@@ -8542,7 +8735,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeRange();
       var od = api.TimeRange.fromJson(o.toJson());
-      checkTimeRange(od);
+      checkTimeRange(od as api.TimeRange);
     });
   });
 
@@ -8550,7 +8743,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimerEvent();
       var od = api.TimerEvent.fromJson(o.toJson());
-      checkTimerEvent(od);
+      checkTimerEvent(od as api.TimerEvent);
     });
   });
 
@@ -8558,7 +8751,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrackingFloodlightActivityConfig();
       var od = api.TrackingFloodlightActivityConfig.fromJson(o.toJson());
-      checkTrackingFloodlightActivityConfig(od);
+      checkTrackingFloodlightActivityConfig(
+          od as api.TrackingFloodlightActivityConfig);
     });
   });
 
@@ -8566,7 +8760,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTranscode();
       var od = api.Transcode.fromJson(o.toJson());
-      checkTranscode(od);
+      checkTranscode(od as api.Transcode);
     });
   });
 
@@ -8574,7 +8768,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUniversalAdId();
       var od = api.UniversalAdId.fromJson(o.toJson());
-      checkUniversalAdId(od);
+      checkUniversalAdId(od as api.UniversalAdId);
     });
   });
 
@@ -8582,7 +8776,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlAssignedTargetingOptionDetails();
       var od = api.UrlAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkUrlAssignedTargetingOptionDetails(od);
+      checkUrlAssignedTargetingOptionDetails(
+          od as api.UrlAssignedTargetingOptionDetails);
     });
   });
 
@@ -8590,7 +8785,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -8600,7 +8795,8 @@
       var o = buildUserRewardedContentAssignedTargetingOptionDetails();
       var od = api.UserRewardedContentAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkUserRewardedContentAssignedTargetingOptionDetails(od);
+      checkUserRewardedContentAssignedTargetingOptionDetails(
+          od as api.UserRewardedContentAssignedTargetingOptionDetails);
     });
   });
 
@@ -8609,7 +8805,8 @@
       var o = buildUserRewardedContentTargetingOptionDetails();
       var od =
           api.UserRewardedContentTargetingOptionDetails.fromJson(o.toJson());
-      checkUserRewardedContentTargetingOptionDetails(od);
+      checkUserRewardedContentTargetingOptionDetails(
+          od as api.UserRewardedContentTargetingOptionDetails);
     });
   });
 
@@ -8619,7 +8816,8 @@
       var o = buildVideoPlayerSizeAssignedTargetingOptionDetails();
       var od = api.VideoPlayerSizeAssignedTargetingOptionDetails.fromJson(
           o.toJson());
-      checkVideoPlayerSizeAssignedTargetingOptionDetails(od);
+      checkVideoPlayerSizeAssignedTargetingOptionDetails(
+          od as api.VideoPlayerSizeAssignedTargetingOptionDetails);
     });
   });
 
@@ -8627,7 +8825,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoPlayerSizeTargetingOptionDetails();
       var od = api.VideoPlayerSizeTargetingOptionDetails.fromJson(o.toJson());
-      checkVideoPlayerSizeTargetingOptionDetails(od);
+      checkVideoPlayerSizeTargetingOptionDetails(
+          od as api.VideoPlayerSizeTargetingOptionDetails);
     });
   });
 
@@ -8636,7 +8835,8 @@
       var o = buildViewabilityAssignedTargetingOptionDetails();
       var od =
           api.ViewabilityAssignedTargetingOptionDetails.fromJson(o.toJson());
-      checkViewabilityAssignedTargetingOptionDetails(od);
+      checkViewabilityAssignedTargetingOptionDetails(
+          od as api.ViewabilityAssignedTargetingOptionDetails);
     });
   });
 
@@ -8644,7 +8844,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildViewabilityTargetingOptionDetails();
       var od = api.ViewabilityTargetingOptionDetails.fromJson(o.toJson());
-      checkViewabilityTargetingOptionDetails(od);
+      checkViewabilityTargetingOptionDetails(
+          od as api.ViewabilityTargetingOptionDetails);
     });
   });
 
@@ -8696,7 +8897,7 @@
       res
           .audit(arg_advertiserId, readMask: arg_readMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAuditAdvertiserResponse(response);
+        checkAuditAdvertiserResponse(response as api.AuditAdvertiserResponse);
       })));
     });
 
@@ -8710,8 +8911,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.BulkEditAdvertiserAssignedTargetingOptionsRequest.fromJson(
-                json);
-        checkBulkEditAdvertiserAssignedTargetingOptionsRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkBulkEditAdvertiserAssignedTargetingOptionsRequest(
+            obj as api.BulkEditAdvertiserAssignedTargetingOptionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8754,7 +8956,8 @@
               arg_request, arg_advertiserId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditAdvertiserAssignedTargetingOptionsResponse(response);
+        checkBulkEditAdvertiserAssignedTargetingOptionsResponse(
+            response as api.BulkEditAdvertiserAssignedTargetingOptionsResponse);
       })));
     });
 
@@ -8819,7 +9022,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkListAdvertiserAssignedTargetingOptionsResponse(response);
+        checkBulkListAdvertiserAssignedTargetingOptionsResponse(
+            response as api.BulkListAdvertiserAssignedTargetingOptionsResponse);
       })));
     });
 
@@ -8829,8 +9033,9 @@
       var arg_request = buildAdvertiser();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Advertiser.fromJson(json);
-        checkAdvertiser(obj);
+        var obj = api.Advertiser.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiser(obj as api.Advertiser);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8869,7 +9074,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiser(response);
+        checkAdvertiser(response as api.Advertiser);
       })));
     });
 
@@ -8917,7 +9122,7 @@
       res
           .delete(arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -8965,7 +9170,7 @@
       res
           .get(arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiser(response);
+        checkAdvertiser(response as api.Advertiser);
       })));
     });
 
@@ -9031,7 +9236,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAdvertisersResponse(response);
+        checkListAdvertisersResponse(response as api.ListAdvertisersResponse);
       })));
     });
 
@@ -9043,8 +9248,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Advertiser.fromJson(json);
-        checkAdvertiser(obj);
+        var obj = api.Advertiser.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAdvertiser(obj as api.Advertiser);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9087,7 +9293,7 @@
           .patch(arg_request, arg_advertiserId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAdvertiser(response);
+        checkAdvertiser(response as api.Advertiser);
       })));
     });
   });
@@ -9103,8 +9309,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateAssetRequest.fromJson(json);
-        checkCreateAssetRequest(obj);
+        var obj = api.CreateAssetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateAssetRequest(obj as api.CreateAssetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9144,7 +9351,7 @@
       res
           .upload(arg_request, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateAssetResponse(response);
+        checkCreateAssetResponse(response as api.CreateAssetResponse);
       })));
     });
   });
@@ -9157,8 +9364,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Campaign.fromJson(json);
-        checkCampaign(obj);
+        var obj =
+            api.Campaign.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCampaign(obj as api.Campaign);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9198,7 +9406,7 @@
       res
           .create(arg_request, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaign(response);
+        checkCampaign(response as api.Campaign);
       })));
     });
 
@@ -9247,7 +9455,7 @@
       res
           .delete(arg_advertiserId, arg_campaignId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -9296,7 +9504,7 @@
       res
           .get(arg_advertiserId, arg_campaignId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaign(response);
+        checkCampaign(response as api.Campaign);
       })));
     });
 
@@ -9360,7 +9568,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCampaignsResponse(response);
+        checkListCampaignsResponse(response as api.ListCampaignsResponse);
       })));
     });
 
@@ -9373,8 +9581,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Campaign.fromJson(json);
-        checkCampaign(obj);
+        var obj =
+            api.Campaign.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCampaign(obj as api.Campaign);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9417,7 +9626,7 @@
           .patch(arg_request, arg_advertiserId, arg_campaignId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCampaign(response);
+        checkCampaign(response as api.Campaign);
       })));
     });
   });
@@ -9431,8 +9640,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9475,7 +9685,7 @@
           .create(arg_request, arg_advertiserId,
               partnerId: arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
 
@@ -9528,7 +9738,7 @@
           .get(arg_advertiserId, arg_channelId,
               partnerId: arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
 
@@ -9596,7 +9806,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListChannelsResponse(response);
+        checkListChannelsResponse(response as api.ListChannelsResponse);
       })));
     });
 
@@ -9610,8 +9820,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9658,7 +9869,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -9672,8 +9883,9 @@
       var arg_channelId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BulkEditSitesRequest.fromJson(json);
-        checkBulkEditSitesRequest(obj);
+        var obj = api.BulkEditSitesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditSitesRequest(obj as api.BulkEditSitesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9723,7 +9935,7 @@
           .bulkEdit(arg_request, arg_advertiserId, arg_channelId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditSitesResponse(response);
+        checkBulkEditSitesResponse(response as api.BulkEditSitesResponse);
       })));
     });
 
@@ -9736,8 +9948,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Site.fromJson(json);
-        checkSite(obj);
+        var obj =
+            api.Site.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSite(obj as api.Site);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9789,7 +10002,7 @@
           .create(arg_request, arg_advertiserId, arg_channelId,
               partnerId: arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSite(response);
+        checkSite(response as api.Site);
       })));
     });
 
@@ -9852,7 +10065,7 @@
           .delete(arg_advertiserId, arg_channelId, arg_urlOrAppId,
               partnerId: arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -9921,7 +10134,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSitesResponse(response);
+        checkListSitesResponse(response as api.ListSitesResponse);
       })));
     });
   });
@@ -9934,8 +10147,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Creative.fromJson(json);
-        checkCreative(obj);
+        var obj =
+            api.Creative.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCreative(obj as api.Creative);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9975,7 +10189,7 @@
       res
           .create(arg_request, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -10024,7 +10238,7 @@
       res
           .delete(arg_advertiserId, arg_creativeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -10073,7 +10287,7 @@
       res
           .get(arg_advertiserId, arg_creativeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
 
@@ -10137,7 +10351,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCreativesResponse(response);
+        checkListCreativesResponse(response as api.ListCreativesResponse);
       })));
     });
 
@@ -10150,8 +10364,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Creative.fromJson(json);
-        checkCreative(obj);
+        var obj =
+            api.Creative.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCreative(obj as api.Creative);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10194,7 +10409,7 @@
           .patch(arg_request, arg_advertiserId, arg_creativeId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreative(response);
+        checkCreative(response as api.Creative);
       })));
     });
   });
@@ -10207,8 +10422,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InsertionOrder.fromJson(json);
-        checkInsertionOrder(obj);
+        var obj = api.InsertionOrder.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInsertionOrder(obj as api.InsertionOrder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10248,7 +10464,7 @@
       res
           .create(arg_request, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInsertionOrder(response);
+        checkInsertionOrder(response as api.InsertionOrder);
       })));
     });
 
@@ -10297,7 +10513,7 @@
       res
           .delete(arg_advertiserId, arg_insertionOrderId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -10346,7 +10562,7 @@
       res
           .get(arg_advertiserId, arg_insertionOrderId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInsertionOrder(response);
+        checkInsertionOrder(response as api.InsertionOrder);
       })));
     });
 
@@ -10410,7 +10626,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInsertionOrdersResponse(response);
+        checkListInsertionOrdersResponse(
+            response as api.ListInsertionOrdersResponse);
       })));
     });
 
@@ -10423,8 +10640,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InsertionOrder.fromJson(json);
-        checkInsertionOrder(obj);
+        var obj = api.InsertionOrder.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInsertionOrder(obj as api.InsertionOrder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10467,7 +10685,7 @@
           .patch(arg_request, arg_advertiserId, arg_insertionOrderId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInsertionOrder(response);
+        checkInsertionOrder(response as api.InsertionOrder);
       })));
     });
   });
@@ -10481,9 +10699,10 @@
       var arg_lineItemId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.BulkEditLineItemAssignedTargetingOptionsRequest.fromJson(json);
-        checkBulkEditLineItemAssignedTargetingOptionsRequest(obj);
+        var obj = api.BulkEditLineItemAssignedTargetingOptionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditLineItemAssignedTargetingOptionsRequest(
+            obj as api.BulkEditLineItemAssignedTargetingOptionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10526,7 +10745,8 @@
               arg_request, arg_advertiserId, arg_lineItemId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditLineItemAssignedTargetingOptionsResponse(response);
+        checkBulkEditLineItemAssignedTargetingOptionsResponse(
+            response as api.BulkEditLineItemAssignedTargetingOptionsResponse);
       })));
     });
 
@@ -10593,7 +10813,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkListLineItemAssignedTargetingOptionsResponse(response);
+        checkBulkListLineItemAssignedTargetingOptionsResponse(
+            response as api.BulkListLineItemAssignedTargetingOptionsResponse);
       })));
     });
 
@@ -10604,8 +10825,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LineItem.fromJson(json);
-        checkLineItem(obj);
+        var obj =
+            api.LineItem.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLineItem(obj as api.LineItem);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10645,7 +10867,7 @@
       res
           .create(arg_request, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLineItem(response);
+        checkLineItem(response as api.LineItem);
       })));
     });
 
@@ -10694,7 +10916,7 @@
       res
           .delete(arg_advertiserId, arg_lineItemId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -10743,7 +10965,7 @@
       res
           .get(arg_advertiserId, arg_lineItemId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLineItem(response);
+        checkLineItem(response as api.LineItem);
       })));
     });
 
@@ -10807,7 +11029,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLineItemsResponse(response);
+        checkListLineItemsResponse(response as api.ListLineItemsResponse);
       })));
     });
 
@@ -10820,8 +11042,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LineItem.fromJson(json);
-        checkLineItem(obj);
+        var obj =
+            api.LineItem.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLineItem(obj as api.LineItem);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10864,7 +11087,7 @@
           .patch(arg_request, arg_advertiserId, arg_lineItemId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLineItem(response);
+        checkLineItem(response as api.LineItem);
       })));
     });
   });
@@ -10885,8 +11108,9 @@
       var arg_targetingType = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AssignedTargetingOption.fromJson(json);
-        checkAssignedTargetingOption(obj);
+        var obj = api.AssignedTargetingOption.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAssignedTargetingOption(obj as api.AssignedTargetingOption);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10928,7 +11152,7 @@
               arg_request, arg_advertiserId, arg_lineItemId, arg_targetingType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedTargetingOption(response);
+        checkAssignedTargetingOption(response as api.AssignedTargetingOption);
       })));
     });
 
@@ -10985,7 +11209,7 @@
               arg_assignedTargetingOptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -11042,7 +11266,7 @@
               arg_assignedTargetingOptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedTargetingOption(response);
+        checkAssignedTargetingOption(response as api.AssignedTargetingOption);
       })));
     });
 
@@ -11113,7 +11337,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLineItemAssignedTargetingOptionsResponse(response);
+        checkListLineItemAssignedTargetingOptionsResponse(
+            response as api.ListLineItemAssignedTargetingOptionsResponse);
       })));
     });
   });
@@ -11126,8 +11351,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LocationList.fromJson(json);
-        checkLocationList(obj);
+        var obj = api.LocationList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLocationList(obj as api.LocationList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11167,7 +11393,7 @@
       res
           .create(arg_request, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocationList(response);
+        checkLocationList(response as api.LocationList);
       })));
     });
 
@@ -11216,7 +11442,7 @@
       res
           .get(arg_advertiserId, arg_locationListId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocationList(response);
+        checkLocationList(response as api.LocationList);
       })));
     });
 
@@ -11280,7 +11506,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationListsResponse(response);
+        checkListLocationListsResponse(
+            response as api.ListLocationListsResponse);
       })));
     });
 
@@ -11293,8 +11520,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LocationList.fromJson(json);
-        checkLocationList(obj);
+        var obj = api.LocationList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLocationList(obj as api.LocationList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11337,7 +11565,7 @@
           .patch(arg_request, arg_advertiserId, arg_locationListId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocationList(response);
+        checkLocationList(response as api.LocationList);
       })));
     });
   });
@@ -11353,8 +11581,10 @@
       var arg_locationListId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BulkEditAssignedLocationsRequest.fromJson(json);
-        checkBulkEditAssignedLocationsRequest(obj);
+        var obj = api.BulkEditAssignedLocationsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditAssignedLocationsRequest(
+            obj as api.BulkEditAssignedLocationsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11405,7 +11635,8 @@
           .bulkEdit(arg_request, arg_advertiserId, arg_locationListId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditAssignedLocationsResponse(response);
+        checkBulkEditAssignedLocationsResponse(
+            response as api.BulkEditAssignedLocationsResponse);
       })));
     });
 
@@ -11418,8 +11649,9 @@
       var arg_locationListId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AssignedLocation.fromJson(json);
-        checkAssignedLocation(obj);
+        var obj = api.AssignedLocation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAssignedLocation(obj as api.AssignedLocation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11477,7 +11709,7 @@
           .create(arg_request, arg_advertiserId, arg_locationListId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedLocation(response);
+        checkAssignedLocation(response as api.AssignedLocation);
       })));
     });
 
@@ -11547,7 +11779,7 @@
           .delete(arg_advertiserId, arg_locationListId, arg_assignedLocationId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -11630,7 +11862,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAssignedLocationsResponse(response);
+        checkListAssignedLocationsResponse(
+            response as api.ListAssignedLocationsResponse);
       })));
     });
   });
@@ -11643,8 +11876,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NegativeKeywordList.fromJson(json);
-        checkNegativeKeywordList(obj);
+        var obj = api.NegativeKeywordList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNegativeKeywordList(obj as api.NegativeKeywordList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11684,7 +11918,7 @@
       res
           .create(arg_request, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNegativeKeywordList(response);
+        checkNegativeKeywordList(response as api.NegativeKeywordList);
       })));
     });
 
@@ -11734,7 +11968,7 @@
           .delete(arg_advertiserId, arg_negativeKeywordListId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -11784,7 +12018,7 @@
           .get(arg_advertiserId, arg_negativeKeywordListId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNegativeKeywordList(response);
+        checkNegativeKeywordList(response as api.NegativeKeywordList);
       })));
     });
 
@@ -11841,7 +12075,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNegativeKeywordListsResponse(response);
+        checkListNegativeKeywordListsResponse(
+            response as api.ListNegativeKeywordListsResponse);
       })));
     });
 
@@ -11854,8 +12089,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NegativeKeywordList.fromJson(json);
-        checkNegativeKeywordList(obj);
+        var obj = api.NegativeKeywordList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNegativeKeywordList(obj as api.NegativeKeywordList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11898,7 +12134,7 @@
           .patch(arg_request, arg_advertiserId, arg_negativeKeywordListId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNegativeKeywordList(response);
+        checkNegativeKeywordList(response as api.NegativeKeywordList);
       })));
     });
   });
@@ -11917,8 +12153,10 @@
       var arg_negativeKeywordListId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BulkEditNegativeKeywordsRequest.fromJson(json);
-        checkBulkEditNegativeKeywordsRequest(obj);
+        var obj = api.BulkEditNegativeKeywordsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditNegativeKeywordsRequest(
+            obj as api.BulkEditNegativeKeywordsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11968,7 +12206,8 @@
           .bulkEdit(arg_request, arg_advertiserId, arg_negativeKeywordListId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditNegativeKeywordsResponse(response);
+        checkBulkEditNegativeKeywordsResponse(
+            response as api.BulkEditNegativeKeywordsResponse);
       })));
     });
 
@@ -11983,8 +12222,9 @@
       var arg_negativeKeywordListId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NegativeKeyword.fromJson(json);
-        checkNegativeKeyword(obj);
+        var obj = api.NegativeKeyword.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNegativeKeyword(obj as api.NegativeKeyword);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12034,7 +12274,7 @@
           .create(arg_request, arg_advertiserId, arg_negativeKeywordListId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNegativeKeyword(response);
+        checkNegativeKeyword(response as api.NegativeKeyword);
       })));
     });
 
@@ -12097,7 +12337,7 @@
           .delete(arg_advertiserId, arg_negativeKeywordListId, arg_keywordValue,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -12165,7 +12405,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNegativeKeywordsResponse(response);
+        checkListNegativeKeywordsResponse(
+            response as api.ListNegativeKeywordsResponse);
       })));
     });
   });
@@ -12184,8 +12425,9 @@
       var arg_targetingType = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AssignedTargetingOption.fromJson(json);
-        checkAssignedTargetingOption(obj);
+        var obj = api.AssignedTargetingOption.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAssignedTargetingOption(obj as api.AssignedTargetingOption);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12226,7 +12468,7 @@
           .create(arg_request, arg_advertiserId, arg_targetingType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedTargetingOption(response);
+        checkAssignedTargetingOption(response as api.AssignedTargetingOption);
       })));
     });
 
@@ -12281,7 +12523,7 @@
               arg_assignedTargetingOptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -12336,7 +12578,7 @@
               arg_assignedTargetingOptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedTargetingOption(response);
+        checkAssignedTargetingOption(response as api.AssignedTargetingOption);
       })));
     });
 
@@ -12405,7 +12647,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAdvertiserAssignedTargetingOptionsResponse(response);
+        checkListAdvertiserAssignedTargetingOptionsResponse(
+            response as api.ListAdvertiserAssignedTargetingOptionsResponse);
       })));
     });
   });
@@ -12464,7 +12707,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCombinedAudience(response);
+        checkCombinedAudience(response as api.CombinedAudience);
       })));
     });
 
@@ -12534,7 +12777,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCombinedAudiencesResponse(response);
+        checkListCombinedAudiencesResponse(
+            response as api.ListCombinedAudiencesResponse);
       })));
     });
   });
@@ -12593,7 +12837,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomBiddingAlgorithm(response);
+        checkCustomBiddingAlgorithm(response as api.CustomBiddingAlgorithm);
       })));
     });
 
@@ -12664,7 +12908,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCustomBiddingAlgorithmsResponse(response);
+        checkListCustomBiddingAlgorithmsResponse(
+            response as api.ListCustomBiddingAlgorithmsResponse);
       })));
     });
   });
@@ -12718,7 +12963,7 @@
           .get(arg_customListId,
               advertiserId: arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomList(response);
+        checkCustomList(response as api.CustomList);
       })));
     });
 
@@ -12784,7 +13029,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCustomListsResponse(response);
+        checkListCustomListsResponse(response as api.ListCustomListsResponse);
       })));
     });
   });
@@ -12843,7 +13088,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFirstAndThirdPartyAudience(response);
+        checkFirstAndThirdPartyAudience(
+            response as api.FirstAndThirdPartyAudience);
       })));
     });
 
@@ -12914,7 +13160,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFirstAndThirdPartyAudiencesResponse(response);
+        checkListFirstAndThirdPartyAudiencesResponse(
+            response as api.ListFirstAndThirdPartyAudiencesResponse);
       })));
     });
   });
@@ -12968,7 +13215,7 @@
           .get(arg_floodlightGroupId,
               partnerId: arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightGroup(response);
+        checkFloodlightGroup(response as api.FloodlightGroup);
       })));
     });
 
@@ -12981,8 +13228,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FloodlightGroup.fromJson(json);
-        checkFloodlightGroup(obj);
+        var obj = api.FloodlightGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFloodlightGroup(obj as api.FloodlightGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13031,7 +13279,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFloodlightGroup(response);
+        checkFloodlightGroup(response as api.FloodlightGroup);
       })));
     });
   });
@@ -13090,7 +13338,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleAudience(response);
+        checkGoogleAudience(response as api.GoogleAudience);
       })));
     });
 
@@ -13160,7 +13408,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGoogleAudiencesResponse(response);
+        checkListGoogleAudiencesResponse(
+            response as api.ListGoogleAudiencesResponse);
       })));
     });
   });
@@ -13174,8 +13423,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InventorySourceGroup.fromJson(json);
-        checkInventorySourceGroup(obj);
+        var obj = api.InventorySourceGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInventorySourceGroup(obj as api.InventorySourceGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13221,7 +13471,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInventorySourceGroup(response);
+        checkInventorySourceGroup(response as api.InventorySourceGroup);
       })));
     });
 
@@ -13278,7 +13528,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -13335,7 +13585,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInventorySourceGroup(response);
+        checkInventorySourceGroup(response as api.InventorySourceGroup);
       })));
     });
 
@@ -13406,7 +13656,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInventorySourceGroupsResponse(response);
+        checkListInventorySourceGroupsResponse(
+            response as api.ListInventorySourceGroupsResponse);
       })));
     });
 
@@ -13420,8 +13671,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InventorySourceGroup.fromJson(json);
-        checkInventorySourceGroup(obj);
+        var obj = api.InventorySourceGroup.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInventorySourceGroup(obj as api.InventorySourceGroup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13474,7 +13726,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInventorySourceGroup(response);
+        checkInventorySourceGroup(response as api.InventorySourceGroup);
       })));
     });
   });
@@ -13490,8 +13742,10 @@
       var arg_inventorySourceGroupId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BulkEditAssignedInventorySourcesRequest.fromJson(json);
-        checkBulkEditAssignedInventorySourcesRequest(obj);
+        var obj = api.BulkEditAssignedInventorySourcesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditAssignedInventorySourcesRequest(
+            obj as api.BulkEditAssignedInventorySourcesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13533,7 +13787,8 @@
           .bulkEdit(arg_request, arg_inventorySourceGroupId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditAssignedInventorySourcesResponse(response);
+        checkBulkEditAssignedInventorySourcesResponse(
+            response as api.BulkEditAssignedInventorySourcesResponse);
       })));
     });
 
@@ -13548,8 +13803,9 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AssignedInventorySource.fromJson(json);
-        checkAssignedInventorySource(obj);
+        var obj = api.AssignedInventorySource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAssignedInventorySource(obj as api.AssignedInventorySource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13596,7 +13852,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedInventorySource(response);
+        checkAssignedInventorySource(response as api.AssignedInventorySource);
       })));
     });
 
@@ -13656,7 +13912,7 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -13731,7 +13987,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAssignedInventorySourcesResponse(response);
+        checkListAssignedInventorySourcesResponse(
+            response as api.ListAssignedInventorySourcesResponse);
       })));
     });
   });
@@ -13785,7 +14042,7 @@
           .get(arg_inventorySourceId,
               partnerId: arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInventorySource(response);
+        checkInventorySource(response as api.InventorySource);
       })));
     });
 
@@ -13855,7 +14112,8 @@
               partnerId: arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInventorySourcesResponse(response);
+        checkListInventorySourcesResponse(
+            response as api.ListInventorySourcesResponse);
       })));
     });
   });
@@ -13908,7 +14166,7 @@
       res
           .download(arg_resourceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleBytestreamMedia(response);
+        checkGoogleBytestreamMedia(response as api.GoogleBytestreamMedia);
       })));
     });
   });
@@ -13921,9 +14179,10 @@
       var arg_partnerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.BulkEditPartnerAssignedTargetingOptionsRequest.fromJson(json);
-        checkBulkEditPartnerAssignedTargetingOptionsRequest(obj);
+        var obj = api.BulkEditPartnerAssignedTargetingOptionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditPartnerAssignedTargetingOptionsRequest(
+            obj as api.BulkEditPartnerAssignedTargetingOptionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13965,7 +14224,8 @@
           .bulkEditPartnerAssignedTargetingOptions(arg_request, arg_partnerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditPartnerAssignedTargetingOptionsResponse(response);
+        checkBulkEditPartnerAssignedTargetingOptionsResponse(
+            response as api.BulkEditPartnerAssignedTargetingOptionsResponse);
       })));
     });
 
@@ -14013,7 +14273,7 @@
       res
           .get(arg_partnerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPartner(response);
+        checkPartner(response as api.Partner);
       })));
     });
 
@@ -14075,7 +14335,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPartnersResponse(response);
+        checkListPartnersResponse(response as api.ListPartnersResponse);
       })));
     });
   });
@@ -14089,8 +14349,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14133,7 +14394,7 @@
           .create(arg_request, arg_partnerId,
               advertiserId: arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
 
@@ -14186,7 +14447,7 @@
           .get(arg_partnerId, arg_channelId,
               advertiserId: arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
 
@@ -14254,7 +14515,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListChannelsResponse(response);
+        checkListChannelsResponse(response as api.ListChannelsResponse);
       })));
     });
 
@@ -14268,8 +14529,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14316,7 +14578,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -14330,8 +14592,9 @@
       var arg_channelId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BulkEditSitesRequest.fromJson(json);
-        checkBulkEditSitesRequest(obj);
+        var obj = api.BulkEditSitesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditSitesRequest(obj as api.BulkEditSitesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14381,7 +14644,7 @@
           .bulkEdit(arg_request, arg_partnerId, arg_channelId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditSitesResponse(response);
+        checkBulkEditSitesResponse(response as api.BulkEditSitesResponse);
       })));
     });
 
@@ -14394,8 +14657,9 @@
       var arg_advertiserId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Site.fromJson(json);
-        checkSite(obj);
+        var obj =
+            api.Site.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSite(obj as api.Site);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14447,7 +14711,7 @@
           .create(arg_request, arg_partnerId, arg_channelId,
               advertiserId: arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSite(response);
+        checkSite(response as api.Site);
       })));
     });
 
@@ -14510,7 +14774,7 @@
           .delete(arg_partnerId, arg_channelId, arg_urlOrAppId,
               advertiserId: arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -14579,7 +14843,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSitesResponse(response);
+        checkListSitesResponse(response as api.ListSitesResponse);
       })));
     });
   });
@@ -14597,8 +14861,9 @@
       var arg_targetingType = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AssignedTargetingOption.fromJson(json);
-        checkAssignedTargetingOption(obj);
+        var obj = api.AssignedTargetingOption.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAssignedTargetingOption(obj as api.AssignedTargetingOption);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14639,7 +14904,7 @@
           .create(arg_request, arg_partnerId, arg_targetingType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedTargetingOption(response);
+        checkAssignedTargetingOption(response as api.AssignedTargetingOption);
       })));
     });
 
@@ -14694,7 +14959,7 @@
               arg_partnerId, arg_targetingType, arg_assignedTargetingOptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -14748,7 +15013,7 @@
           .get(arg_partnerId, arg_targetingType, arg_assignedTargetingOptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAssignedTargetingOption(response);
+        checkAssignedTargetingOption(response as api.AssignedTargetingOption);
       })));
     });
 
@@ -14817,7 +15082,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPartnerAssignedTargetingOptionsResponse(response);
+        checkListPartnerAssignedTargetingOptionsResponse(
+            response as api.ListPartnerAssignedTargetingOptionsResponse);
       })));
     });
   });
@@ -14829,8 +15095,10 @@
       var arg_request = buildCreateSdfDownloadTaskRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateSdfDownloadTaskRequest.fromJson(json);
-        checkCreateSdfDownloadTaskRequest(obj);
+        var obj = api.CreateSdfDownloadTaskRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateSdfDownloadTaskRequest(
+            obj as api.CreateSdfDownloadTaskRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14869,7 +15137,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -14919,7 +15187,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -14974,7 +15242,7 @@
           .get(arg_targetingType, arg_targetingOptionId,
               advertiserId: arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTargetingOption(response);
+        checkTargetingOption(response as api.TargetingOption);
       })));
     });
 
@@ -15042,7 +15310,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTargetingOptionsResponse(response);
+        checkListTargetingOptionsResponse(
+            response as api.ListTargetingOptionsResponse);
       })));
     });
   });
@@ -15055,8 +15324,10 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BulkEditAssignedUserRolesRequest.fromJson(json);
-        checkBulkEditAssignedUserRolesRequest(obj);
+        var obj = api.BulkEditAssignedUserRolesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBulkEditAssignedUserRolesRequest(
+            obj as api.BulkEditAssignedUserRolesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15098,7 +15369,8 @@
           .bulkEditAssignedUserRoles(arg_request, arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBulkEditAssignedUserRolesResponse(response);
+        checkBulkEditAssignedUserRolesResponse(
+            response as api.BulkEditAssignedUserRolesResponse);
       })));
     });
 
@@ -15108,8 +15380,9 @@
       var arg_request = buildUser();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.User.fromJson(json);
-        checkUser(obj);
+        var obj =
+            api.User.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUser(obj as api.User);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15148,7 +15421,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -15196,7 +15469,7 @@
       res
           .delete(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -15244,7 +15517,7 @@
       res
           .get(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
 
@@ -15306,7 +15579,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUsersResponse(response);
+        checkListUsersResponse(response as api.ListUsersResponse);
       })));
     });
 
@@ -15318,8 +15591,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.User.fromJson(json);
-        checkUser(obj);
+        var obj =
+            api.User.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkUser(obj as api.User);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -15362,7 +15636,7 @@
           .patch(arg_request, arg_userId,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUser(response);
+        checkUser(response as api.User);
       })));
     });
   });
diff --git a/generated/googleapis/test/dlp/v2_test.dart b/generated/googleapis/test/dlp/v2_test.dart
index 887ec94..22ebaff 100644
--- a/generated/googleapis/test/dlp/v2_test.dart
+++ b/generated/googleapis/test/dlp/v2_test.dart
@@ -94,13 +94,19 @@
 void checkGooglePrivacyDlpV2Action(api.GooglePrivacyDlpV2Action o) {
   buildCounterGooglePrivacyDlpV2Action++;
   if (buildCounterGooglePrivacyDlpV2Action < 3) {
-    checkGooglePrivacyDlpV2JobNotificationEmails(o.jobNotificationEmails);
-    checkGooglePrivacyDlpV2PublishToPubSub(o.pubSub);
+    checkGooglePrivacyDlpV2JobNotificationEmails(
+        o.jobNotificationEmails as api.GooglePrivacyDlpV2JobNotificationEmails);
+    checkGooglePrivacyDlpV2PublishToPubSub(
+        o.pubSub as api.GooglePrivacyDlpV2PublishToPubSub);
     checkGooglePrivacyDlpV2PublishFindingsToCloudDataCatalog(
-        o.publishFindingsToCloudDataCatalog);
-    checkGooglePrivacyDlpV2PublishSummaryToCscc(o.publishSummaryToCscc);
-    checkGooglePrivacyDlpV2PublishToStackdriver(o.publishToStackdriver);
-    checkGooglePrivacyDlpV2SaveFindings(o.saveFindings);
+        o.publishFindingsToCloudDataCatalog
+            as api.GooglePrivacyDlpV2PublishFindingsToCloudDataCatalog);
+    checkGooglePrivacyDlpV2PublishSummaryToCscc(
+        o.publishSummaryToCscc as api.GooglePrivacyDlpV2PublishSummaryToCscc);
+    checkGooglePrivacyDlpV2PublishToStackdriver(
+        o.publishToStackdriver as api.GooglePrivacyDlpV2PublishToStackdriver);
+    checkGooglePrivacyDlpV2SaveFindings(
+        o.saveFindings as api.GooglePrivacyDlpV2SaveFindings);
   }
   buildCounterGooglePrivacyDlpV2Action--;
 }
@@ -147,16 +153,25 @@
     api.GooglePrivacyDlpV2AnalyzeDataSourceRiskDetails o) {
   buildCounterGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails++;
   if (buildCounterGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails < 3) {
-    checkGooglePrivacyDlpV2CategoricalStatsResult(o.categoricalStatsResult);
+    checkGooglePrivacyDlpV2CategoricalStatsResult(o.categoricalStatsResult
+        as api.GooglePrivacyDlpV2CategoricalStatsResult);
     checkGooglePrivacyDlpV2DeltaPresenceEstimationResult(
-        o.deltaPresenceEstimationResult);
-    checkGooglePrivacyDlpV2KAnonymityResult(o.kAnonymityResult);
-    checkGooglePrivacyDlpV2KMapEstimationResult(o.kMapEstimationResult);
-    checkGooglePrivacyDlpV2LDiversityResult(o.lDiversityResult);
-    checkGooglePrivacyDlpV2NumericalStatsResult(o.numericalStatsResult);
-    checkGooglePrivacyDlpV2RequestedRiskAnalysisOptions(o.requestedOptions);
-    checkGooglePrivacyDlpV2PrivacyMetric(o.requestedPrivacyMetric);
-    checkGooglePrivacyDlpV2BigQueryTable(o.requestedSourceTable);
+        o.deltaPresenceEstimationResult
+            as api.GooglePrivacyDlpV2DeltaPresenceEstimationResult);
+    checkGooglePrivacyDlpV2KAnonymityResult(
+        o.kAnonymityResult as api.GooglePrivacyDlpV2KAnonymityResult);
+    checkGooglePrivacyDlpV2KMapEstimationResult(
+        o.kMapEstimationResult as api.GooglePrivacyDlpV2KMapEstimationResult);
+    checkGooglePrivacyDlpV2LDiversityResult(
+        o.lDiversityResult as api.GooglePrivacyDlpV2LDiversityResult);
+    checkGooglePrivacyDlpV2NumericalStatsResult(
+        o.numericalStatsResult as api.GooglePrivacyDlpV2NumericalStatsResult);
+    checkGooglePrivacyDlpV2RequestedRiskAnalysisOptions(o.requestedOptions
+        as api.GooglePrivacyDlpV2RequestedRiskAnalysisOptions);
+    checkGooglePrivacyDlpV2PrivacyMetric(
+        o.requestedPrivacyMetric as api.GooglePrivacyDlpV2PrivacyMetric);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.requestedSourceTable as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails--;
 }
@@ -170,8 +185,10 @@
 
 void checkUnnamed2877(core.List<api.GooglePrivacyDlpV2QuasiIdField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2QuasiIdField(o[0]);
-  checkGooglePrivacyDlpV2QuasiIdField(o[1]);
+  checkGooglePrivacyDlpV2QuasiIdField(
+      o[0] as api.GooglePrivacyDlpV2QuasiIdField);
+  checkGooglePrivacyDlpV2QuasiIdField(
+      o[1] as api.GooglePrivacyDlpV2QuasiIdField);
 }
 
 core.int buildCounterGooglePrivacyDlpV2AuxiliaryTable = 0;
@@ -192,8 +209,10 @@
   buildCounterGooglePrivacyDlpV2AuxiliaryTable++;
   if (buildCounterGooglePrivacyDlpV2AuxiliaryTable < 3) {
     checkUnnamed2877(o.quasiIds);
-    checkGooglePrivacyDlpV2FieldId(o.relativeFrequency);
-    checkGooglePrivacyDlpV2BigQueryTable(o.table);
+    checkGooglePrivacyDlpV2FieldId(
+        o.relativeFrequency as api.GooglePrivacyDlpV2FieldId);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.table as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2AuxiliaryTable--;
 }
@@ -214,8 +233,9 @@
     api.GooglePrivacyDlpV2BigQueryField o) {
   buildCounterGooglePrivacyDlpV2BigQueryField++;
   if (buildCounterGooglePrivacyDlpV2BigQueryField < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.field);
-    checkGooglePrivacyDlpV2BigQueryTable(o.table);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.table as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2BigQueryField--;
 }
@@ -236,7 +256,8 @@
   buildCounterGooglePrivacyDlpV2BigQueryKey++;
   if (buildCounterGooglePrivacyDlpV2BigQueryKey < 3) {
     unittest.expect(o.rowNumber, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2BigQueryTable(o.tableReference);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.tableReference as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2BigQueryKey--;
 }
@@ -250,8 +271,8 @@
 
 void checkUnnamed2878(core.List<api.GooglePrivacyDlpV2FieldId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldId(o[0]);
-  checkGooglePrivacyDlpV2FieldId(o[1]);
+  checkGooglePrivacyDlpV2FieldId(o[0] as api.GooglePrivacyDlpV2FieldId);
+  checkGooglePrivacyDlpV2FieldId(o[1] as api.GooglePrivacyDlpV2FieldId);
 }
 
 core.List<api.GooglePrivacyDlpV2FieldId> buildUnnamed2879() {
@@ -263,8 +284,8 @@
 
 void checkUnnamed2879(core.List<api.GooglePrivacyDlpV2FieldId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldId(o[0]);
-  checkGooglePrivacyDlpV2FieldId(o[1]);
+  checkGooglePrivacyDlpV2FieldId(o[0] as api.GooglePrivacyDlpV2FieldId);
+  checkGooglePrivacyDlpV2FieldId(o[1] as api.GooglePrivacyDlpV2FieldId);
 }
 
 core.int buildCounterGooglePrivacyDlpV2BigQueryOptions = 0;
@@ -292,7 +313,8 @@
     unittest.expect(o.rowsLimit, unittest.equals('foo'));
     unittest.expect(o.rowsLimitPercent, unittest.equals(42));
     unittest.expect(o.sampleMethod, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2BigQueryTable(o.tableReference);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.tableReference as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2BigQueryOptions--;
 }
@@ -362,9 +384,10 @@
 void checkGooglePrivacyDlpV2Bucket(api.GooglePrivacyDlpV2Bucket o) {
   buildCounterGooglePrivacyDlpV2Bucket++;
   if (buildCounterGooglePrivacyDlpV2Bucket < 3) {
-    checkGooglePrivacyDlpV2Value(o.max);
-    checkGooglePrivacyDlpV2Value(o.min);
-    checkGooglePrivacyDlpV2Value(o.replacementValue);
+    checkGooglePrivacyDlpV2Value(o.max as api.GooglePrivacyDlpV2Value);
+    checkGooglePrivacyDlpV2Value(o.min as api.GooglePrivacyDlpV2Value);
+    checkGooglePrivacyDlpV2Value(
+        o.replacementValue as api.GooglePrivacyDlpV2Value);
   }
   buildCounterGooglePrivacyDlpV2Bucket--;
 }
@@ -378,8 +401,8 @@
 
 void checkUnnamed2880(core.List<api.GooglePrivacyDlpV2Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Bucket(o[0]);
-  checkGooglePrivacyDlpV2Bucket(o[1]);
+  checkGooglePrivacyDlpV2Bucket(o[0] as api.GooglePrivacyDlpV2Bucket);
+  checkGooglePrivacyDlpV2Bucket(o[1] as api.GooglePrivacyDlpV2Bucket);
 }
 
 core.int buildCounterGooglePrivacyDlpV2BucketingConfig = 0;
@@ -457,7 +480,7 @@
     api.GooglePrivacyDlpV2CategoricalStatsConfig o) {
   buildCounterGooglePrivacyDlpV2CategoricalStatsConfig++;
   if (buildCounterGooglePrivacyDlpV2CategoricalStatsConfig < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.field);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
   }
   buildCounterGooglePrivacyDlpV2CategoricalStatsConfig--;
 }
@@ -471,8 +494,10 @@
 
 void checkUnnamed2881(core.List<api.GooglePrivacyDlpV2ValueFrequency> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2ValueFrequency(o[0]);
-  checkGooglePrivacyDlpV2ValueFrequency(o[1]);
+  checkGooglePrivacyDlpV2ValueFrequency(
+      o[0] as api.GooglePrivacyDlpV2ValueFrequency);
+  checkGooglePrivacyDlpV2ValueFrequency(
+      o[1] as api.GooglePrivacyDlpV2ValueFrequency);
 }
 
 core.int buildCounterGooglePrivacyDlpV2CategoricalStatsHistogramBucket = 0;
@@ -515,8 +540,10 @@
 void checkUnnamed2882(
     core.List<api.GooglePrivacyDlpV2CategoricalStatsHistogramBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2CategoricalStatsHistogramBucket(o[0]);
-  checkGooglePrivacyDlpV2CategoricalStatsHistogramBucket(o[1]);
+  checkGooglePrivacyDlpV2CategoricalStatsHistogramBucket(
+      o[0] as api.GooglePrivacyDlpV2CategoricalStatsHistogramBucket);
+  checkGooglePrivacyDlpV2CategoricalStatsHistogramBucket(
+      o[1] as api.GooglePrivacyDlpV2CategoricalStatsHistogramBucket);
 }
 
 core.int buildCounterGooglePrivacyDlpV2CategoricalStatsResult = 0;
@@ -549,8 +576,10 @@
 
 void checkUnnamed2883(core.List<api.GooglePrivacyDlpV2CharsToIgnore> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2CharsToIgnore(o[0]);
-  checkGooglePrivacyDlpV2CharsToIgnore(o[1]);
+  checkGooglePrivacyDlpV2CharsToIgnore(
+      o[0] as api.GooglePrivacyDlpV2CharsToIgnore);
+  checkGooglePrivacyDlpV2CharsToIgnore(
+      o[1] as api.GooglePrivacyDlpV2CharsToIgnore);
 }
 
 core.int buildCounterGooglePrivacyDlpV2CharacterMaskConfig = 0;
@@ -659,7 +688,7 @@
   if (buildCounterGooglePrivacyDlpV2CloudStorageOptions < 3) {
     unittest.expect(o.bytesLimitPerFile, unittest.equals('foo'));
     unittest.expect(o.bytesLimitPerFilePercent, unittest.equals(42));
-    checkGooglePrivacyDlpV2FileSet(o.fileSet);
+    checkGooglePrivacyDlpV2FileSet(o.fileSet as api.GooglePrivacyDlpV2FileSet);
     checkUnnamed2884(o.fileTypes);
     unittest.expect(o.filesLimitPercent, unittest.equals(42));
     unittest.expect(o.sampleMethod, unittest.equals('foo'));
@@ -778,9 +807,9 @@
 void checkGooglePrivacyDlpV2Condition(api.GooglePrivacyDlpV2Condition o) {
   buildCounterGooglePrivacyDlpV2Condition++;
   if (buildCounterGooglePrivacyDlpV2Condition < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.field);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
     unittest.expect(o.operator, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2Value(o.value);
+    checkGooglePrivacyDlpV2Value(o.value as api.GooglePrivacyDlpV2Value);
   }
   buildCounterGooglePrivacyDlpV2Condition--;
 }
@@ -794,8 +823,8 @@
 
 void checkUnnamed2887(core.List<api.GooglePrivacyDlpV2Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Condition(o[0]);
-  checkGooglePrivacyDlpV2Condition(o[1]);
+  checkGooglePrivacyDlpV2Condition(o[0] as api.GooglePrivacyDlpV2Condition);
+  checkGooglePrivacyDlpV2Condition(o[1] as api.GooglePrivacyDlpV2Condition);
 }
 
 core.int buildCounterGooglePrivacyDlpV2Conditions = 0;
@@ -864,8 +893,9 @@
 void checkGooglePrivacyDlpV2ContentItem(api.GooglePrivacyDlpV2ContentItem o) {
   buildCounterGooglePrivacyDlpV2ContentItem++;
   if (buildCounterGooglePrivacyDlpV2ContentItem < 3) {
-    checkGooglePrivacyDlpV2ByteContentItem(o.byteItem);
-    checkGooglePrivacyDlpV2Table(o.table);
+    checkGooglePrivacyDlpV2ByteContentItem(
+        o.byteItem as api.GooglePrivacyDlpV2ByteContentItem);
+    checkGooglePrivacyDlpV2Table(o.table as api.GooglePrivacyDlpV2Table);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2ContentItem--;
@@ -895,10 +925,14 @@
     unittest.expect(o.containerName, unittest.equals('foo'));
     unittest.expect(o.containerTimestamp, unittest.equals('foo'));
     unittest.expect(o.containerVersion, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2DocumentLocation(o.documentLocation);
-    checkGooglePrivacyDlpV2ImageLocation(o.imageLocation);
-    checkGooglePrivacyDlpV2MetadataLocation(o.metadataLocation);
-    checkGooglePrivacyDlpV2RecordLocation(o.recordLocation);
+    checkGooglePrivacyDlpV2DocumentLocation(
+        o.documentLocation as api.GooglePrivacyDlpV2DocumentLocation);
+    checkGooglePrivacyDlpV2ImageLocation(
+        o.imageLocation as api.GooglePrivacyDlpV2ImageLocation);
+    checkGooglePrivacyDlpV2MetadataLocation(
+        o.metadataLocation as api.GooglePrivacyDlpV2MetadataLocation);
+    checkGooglePrivacyDlpV2RecordLocation(
+        o.recordLocation as api.GooglePrivacyDlpV2RecordLocation);
   }
   buildCounterGooglePrivacyDlpV2ContentLocation--;
 }
@@ -921,7 +955,8 @@
     api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest o) {
   buildCounterGooglePrivacyDlpV2CreateDeidentifyTemplateRequest++;
   if (buildCounterGooglePrivacyDlpV2CreateDeidentifyTemplateRequest < 3) {
-    checkGooglePrivacyDlpV2DeidentifyTemplate(o.deidentifyTemplate);
+    checkGooglePrivacyDlpV2DeidentifyTemplate(
+        o.deidentifyTemplate as api.GooglePrivacyDlpV2DeidentifyTemplate);
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.templateId, unittest.equals('foo'));
   }
@@ -947,10 +982,12 @@
     api.GooglePrivacyDlpV2CreateDlpJobRequest o) {
   buildCounterGooglePrivacyDlpV2CreateDlpJobRequest++;
   if (buildCounterGooglePrivacyDlpV2CreateDlpJobRequest < 3) {
-    checkGooglePrivacyDlpV2InspectJobConfig(o.inspectJob);
+    checkGooglePrivacyDlpV2InspectJobConfig(
+        o.inspectJob as api.GooglePrivacyDlpV2InspectJobConfig);
     unittest.expect(o.jobId, unittest.equals('foo'));
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2RiskAnalysisJobConfig(o.riskJob);
+    checkGooglePrivacyDlpV2RiskAnalysisJobConfig(
+        o.riskJob as api.GooglePrivacyDlpV2RiskAnalysisJobConfig);
   }
   buildCounterGooglePrivacyDlpV2CreateDlpJobRequest--;
 }
@@ -973,7 +1010,8 @@
     api.GooglePrivacyDlpV2CreateInspectTemplateRequest o) {
   buildCounterGooglePrivacyDlpV2CreateInspectTemplateRequest++;
   if (buildCounterGooglePrivacyDlpV2CreateInspectTemplateRequest < 3) {
-    checkGooglePrivacyDlpV2InspectTemplate(o.inspectTemplate);
+    checkGooglePrivacyDlpV2InspectTemplate(
+        o.inspectTemplate as api.GooglePrivacyDlpV2InspectTemplate);
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.templateId, unittest.equals('foo'));
   }
@@ -998,7 +1036,8 @@
     api.GooglePrivacyDlpV2CreateJobTriggerRequest o) {
   buildCounterGooglePrivacyDlpV2CreateJobTriggerRequest++;
   if (buildCounterGooglePrivacyDlpV2CreateJobTriggerRequest < 3) {
-    checkGooglePrivacyDlpV2JobTrigger(o.jobTrigger);
+    checkGooglePrivacyDlpV2JobTrigger(
+        o.jobTrigger as api.GooglePrivacyDlpV2JobTrigger);
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.triggerId, unittest.equals('foo'));
   }
@@ -1023,7 +1062,8 @@
     api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest o) {
   buildCounterGooglePrivacyDlpV2CreateStoredInfoTypeRequest++;
   if (buildCounterGooglePrivacyDlpV2CreateStoredInfoTypeRequest < 3) {
-    checkGooglePrivacyDlpV2StoredInfoTypeConfig(o.config);
+    checkGooglePrivacyDlpV2StoredInfoTypeConfig(
+        o.config as api.GooglePrivacyDlpV2StoredInfoTypeConfig);
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.storedInfoTypeId, unittest.equals('foo'));
   }
@@ -1048,9 +1088,11 @@
     api.GooglePrivacyDlpV2CryptoDeterministicConfig o) {
   buildCounterGooglePrivacyDlpV2CryptoDeterministicConfig++;
   if (buildCounterGooglePrivacyDlpV2CryptoDeterministicConfig < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.context);
-    checkGooglePrivacyDlpV2CryptoKey(o.cryptoKey);
-    checkGooglePrivacyDlpV2InfoType(o.surrogateInfoType);
+    checkGooglePrivacyDlpV2FieldId(o.context as api.GooglePrivacyDlpV2FieldId);
+    checkGooglePrivacyDlpV2CryptoKey(
+        o.cryptoKey as api.GooglePrivacyDlpV2CryptoKey);
+    checkGooglePrivacyDlpV2InfoType(
+        o.surrogateInfoType as api.GooglePrivacyDlpV2InfoType);
   }
   buildCounterGooglePrivacyDlpV2CryptoDeterministicConfig--;
 }
@@ -1071,7 +1113,8 @@
     api.GooglePrivacyDlpV2CryptoHashConfig o) {
   buildCounterGooglePrivacyDlpV2CryptoHashConfig++;
   if (buildCounterGooglePrivacyDlpV2CryptoHashConfig < 3) {
-    checkGooglePrivacyDlpV2CryptoKey(o.cryptoKey);
+    checkGooglePrivacyDlpV2CryptoKey(
+        o.cryptoKey as api.GooglePrivacyDlpV2CryptoKey);
   }
   buildCounterGooglePrivacyDlpV2CryptoHashConfig--;
 }
@@ -1092,9 +1135,12 @@
 void checkGooglePrivacyDlpV2CryptoKey(api.GooglePrivacyDlpV2CryptoKey o) {
   buildCounterGooglePrivacyDlpV2CryptoKey++;
   if (buildCounterGooglePrivacyDlpV2CryptoKey < 3) {
-    checkGooglePrivacyDlpV2KmsWrappedCryptoKey(o.kmsWrapped);
-    checkGooglePrivacyDlpV2TransientCryptoKey(o.transient);
-    checkGooglePrivacyDlpV2UnwrappedCryptoKey(o.unwrapped);
+    checkGooglePrivacyDlpV2KmsWrappedCryptoKey(
+        o.kmsWrapped as api.GooglePrivacyDlpV2KmsWrappedCryptoKey);
+    checkGooglePrivacyDlpV2TransientCryptoKey(
+        o.transient as api.GooglePrivacyDlpV2TransientCryptoKey);
+    checkGooglePrivacyDlpV2UnwrappedCryptoKey(
+        o.unwrapped as api.GooglePrivacyDlpV2UnwrappedCryptoKey);
   }
   buildCounterGooglePrivacyDlpV2CryptoKey--;
 }
@@ -1121,11 +1167,13 @@
   buildCounterGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig++;
   if (buildCounterGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig < 3) {
     unittest.expect(o.commonAlphabet, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2FieldId(o.context);
-    checkGooglePrivacyDlpV2CryptoKey(o.cryptoKey);
+    checkGooglePrivacyDlpV2FieldId(o.context as api.GooglePrivacyDlpV2FieldId);
+    checkGooglePrivacyDlpV2CryptoKey(
+        o.cryptoKey as api.GooglePrivacyDlpV2CryptoKey);
     unittest.expect(o.customAlphabet, unittest.equals('foo'));
     unittest.expect(o.radix, unittest.equals(42));
-    checkGooglePrivacyDlpV2InfoType(o.surrogateInfoType);
+    checkGooglePrivacyDlpV2InfoType(
+        o.surrogateInfoType as api.GooglePrivacyDlpV2InfoType);
   }
   buildCounterGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig--;
 }
@@ -1139,8 +1187,10 @@
 
 void checkUnnamed2888(core.List<api.GooglePrivacyDlpV2DetectionRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2DetectionRule(o[0]);
-  checkGooglePrivacyDlpV2DetectionRule(o[1]);
+  checkGooglePrivacyDlpV2DetectionRule(
+      o[0] as api.GooglePrivacyDlpV2DetectionRule);
+  checkGooglePrivacyDlpV2DetectionRule(
+      o[1] as api.GooglePrivacyDlpV2DetectionRule);
 }
 
 core.int buildCounterGooglePrivacyDlpV2CustomInfoType = 0;
@@ -1166,13 +1216,17 @@
   buildCounterGooglePrivacyDlpV2CustomInfoType++;
   if (buildCounterGooglePrivacyDlpV2CustomInfoType < 3) {
     checkUnnamed2888(o.detectionRules);
-    checkGooglePrivacyDlpV2Dictionary(o.dictionary);
+    checkGooglePrivacyDlpV2Dictionary(
+        o.dictionary as api.GooglePrivacyDlpV2Dictionary);
     unittest.expect(o.exclusionType, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
     unittest.expect(o.likelihood, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2Regex(o.regex);
-    checkGooglePrivacyDlpV2StoredType(o.storedType);
-    checkGooglePrivacyDlpV2SurrogateType(o.surrogateType);
+    checkGooglePrivacyDlpV2Regex(o.regex as api.GooglePrivacyDlpV2Regex);
+    checkGooglePrivacyDlpV2StoredType(
+        o.storedType as api.GooglePrivacyDlpV2StoredType);
+    checkGooglePrivacyDlpV2SurrogateType(
+        o.surrogateType as api.GooglePrivacyDlpV2SurrogateType);
   }
   buildCounterGooglePrivacyDlpV2CustomInfoType--;
 }
@@ -1191,7 +1245,7 @@
 void checkGooglePrivacyDlpV2DatastoreKey(api.GooglePrivacyDlpV2DatastoreKey o) {
   buildCounterGooglePrivacyDlpV2DatastoreKey++;
   if (buildCounterGooglePrivacyDlpV2DatastoreKey < 3) {
-    checkGooglePrivacyDlpV2Key(o.entityKey);
+    checkGooglePrivacyDlpV2Key(o.entityKey as api.GooglePrivacyDlpV2Key);
   }
   buildCounterGooglePrivacyDlpV2DatastoreKey--;
 }
@@ -1213,8 +1267,10 @@
     api.GooglePrivacyDlpV2DatastoreOptions o) {
   buildCounterGooglePrivacyDlpV2DatastoreOptions++;
   if (buildCounterGooglePrivacyDlpV2DatastoreOptions < 3) {
-    checkGooglePrivacyDlpV2KindExpression(o.kind);
-    checkGooglePrivacyDlpV2PartitionId(o.partitionId);
+    checkGooglePrivacyDlpV2KindExpression(
+        o.kind as api.GooglePrivacyDlpV2KindExpression);
+    checkGooglePrivacyDlpV2PartitionId(
+        o.partitionId as api.GooglePrivacyDlpV2PartitionId);
   }
   buildCounterGooglePrivacyDlpV2DatastoreOptions--;
 }
@@ -1237,8 +1293,9 @@
     api.GooglePrivacyDlpV2DateShiftConfig o) {
   buildCounterGooglePrivacyDlpV2DateShiftConfig++;
   if (buildCounterGooglePrivacyDlpV2DateShiftConfig < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.context);
-    checkGooglePrivacyDlpV2CryptoKey(o.cryptoKey);
+    checkGooglePrivacyDlpV2FieldId(o.context as api.GooglePrivacyDlpV2FieldId);
+    checkGooglePrivacyDlpV2CryptoKey(
+        o.cryptoKey as api.GooglePrivacyDlpV2CryptoKey);
     unittest.expect(o.lowerBoundDays, unittest.equals(42));
     unittest.expect(o.upperBoundDays, unittest.equals(42));
   }
@@ -1262,10 +1319,11 @@
 void checkGooglePrivacyDlpV2DateTime(api.GooglePrivacyDlpV2DateTime o) {
   buildCounterGooglePrivacyDlpV2DateTime++;
   if (buildCounterGooglePrivacyDlpV2DateTime < 3) {
-    checkGoogleTypeDate(o.date);
+    checkGoogleTypeDate(o.date as api.GoogleTypeDate);
     unittest.expect(o.dayOfWeek, unittest.equals('foo'));
-    checkGoogleTypeTimeOfDay(o.time);
-    checkGooglePrivacyDlpV2TimeZone(o.timeZone);
+    checkGoogleTypeTimeOfDay(o.time as api.GoogleTypeTimeOfDay);
+    checkGooglePrivacyDlpV2TimeZone(
+        o.timeZone as api.GooglePrivacyDlpV2TimeZone);
   }
   buildCounterGooglePrivacyDlpV2DateTime--;
 }
@@ -1290,10 +1348,13 @@
     api.GooglePrivacyDlpV2DeidentifyConfig o) {
   buildCounterGooglePrivacyDlpV2DeidentifyConfig++;
   if (buildCounterGooglePrivacyDlpV2DeidentifyConfig < 3) {
-    checkGooglePrivacyDlpV2InfoTypeTransformations(o.infoTypeTransformations);
-    checkGooglePrivacyDlpV2RecordTransformations(o.recordTransformations);
+    checkGooglePrivacyDlpV2InfoTypeTransformations(o.infoTypeTransformations
+        as api.GooglePrivacyDlpV2InfoTypeTransformations);
+    checkGooglePrivacyDlpV2RecordTransformations(
+        o.recordTransformations as api.GooglePrivacyDlpV2RecordTransformations);
     checkGooglePrivacyDlpV2TransformationErrorHandling(
-        o.transformationErrorHandling);
+        o.transformationErrorHandling
+            as api.GooglePrivacyDlpV2TransformationErrorHandling);
   }
   buildCounterGooglePrivacyDlpV2DeidentifyConfig--;
 }
@@ -1319,11 +1380,14 @@
     api.GooglePrivacyDlpV2DeidentifyContentRequest o) {
   buildCounterGooglePrivacyDlpV2DeidentifyContentRequest++;
   if (buildCounterGooglePrivacyDlpV2DeidentifyContentRequest < 3) {
-    checkGooglePrivacyDlpV2DeidentifyConfig(o.deidentifyConfig);
+    checkGooglePrivacyDlpV2DeidentifyConfig(
+        o.deidentifyConfig as api.GooglePrivacyDlpV2DeidentifyConfig);
     unittest.expect(o.deidentifyTemplateName, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2InspectConfig(o.inspectConfig);
+    checkGooglePrivacyDlpV2InspectConfig(
+        o.inspectConfig as api.GooglePrivacyDlpV2InspectConfig);
     unittest.expect(o.inspectTemplateName, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2ContentItem(o.item);
+    checkGooglePrivacyDlpV2ContentItem(
+        o.item as api.GooglePrivacyDlpV2ContentItem);
     unittest.expect(o.locationId, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2DeidentifyContentRequest--;
@@ -1346,8 +1410,10 @@
     api.GooglePrivacyDlpV2DeidentifyContentResponse o) {
   buildCounterGooglePrivacyDlpV2DeidentifyContentResponse++;
   if (buildCounterGooglePrivacyDlpV2DeidentifyContentResponse < 3) {
-    checkGooglePrivacyDlpV2ContentItem(o.item);
-    checkGooglePrivacyDlpV2TransformationOverview(o.overview);
+    checkGooglePrivacyDlpV2ContentItem(
+        o.item as api.GooglePrivacyDlpV2ContentItem);
+    checkGooglePrivacyDlpV2TransformationOverview(
+        o.overview as api.GooglePrivacyDlpV2TransformationOverview);
   }
   buildCounterGooglePrivacyDlpV2DeidentifyContentResponse--;
 }
@@ -1374,7 +1440,8 @@
   buildCounterGooglePrivacyDlpV2DeidentifyTemplate++;
   if (buildCounterGooglePrivacyDlpV2DeidentifyTemplate < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2DeidentifyConfig(o.deidentifyConfig);
+    checkGooglePrivacyDlpV2DeidentifyConfig(
+        o.deidentifyConfig as api.GooglePrivacyDlpV2DeidentifyConfig);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1392,8 +1459,10 @@
 
 void checkUnnamed2889(core.List<api.GooglePrivacyDlpV2StatisticalTable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2StatisticalTable(o[0]);
-  checkGooglePrivacyDlpV2StatisticalTable(o[1]);
+  checkGooglePrivacyDlpV2StatisticalTable(
+      o[0] as api.GooglePrivacyDlpV2StatisticalTable);
+  checkGooglePrivacyDlpV2StatisticalTable(
+      o[1] as api.GooglePrivacyDlpV2StatisticalTable);
 }
 
 core.List<api.GooglePrivacyDlpV2QuasiId> buildUnnamed2890() {
@@ -1405,8 +1474,8 @@
 
 void checkUnnamed2890(core.List<api.GooglePrivacyDlpV2QuasiId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2QuasiId(o[0]);
-  checkGooglePrivacyDlpV2QuasiId(o[1]);
+  checkGooglePrivacyDlpV2QuasiId(o[0] as api.GooglePrivacyDlpV2QuasiId);
+  checkGooglePrivacyDlpV2QuasiId(o[1] as api.GooglePrivacyDlpV2QuasiId);
 }
 
 core.int buildCounterGooglePrivacyDlpV2DeltaPresenceEstimationConfig = 0;
@@ -1445,8 +1514,10 @@
 void checkUnnamed2891(
     core.List<api.GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues(o[0]);
-  checkGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues(o[1]);
+  checkGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues(
+      o[0] as api.GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues);
+  checkGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues(
+      o[1] as api.GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues);
 }
 
 core.int buildCounterGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket =
@@ -1490,8 +1561,8 @@
 
 void checkUnnamed2892(core.List<api.GooglePrivacyDlpV2Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Value(o[0]);
-  checkGooglePrivacyDlpV2Value(o[1]);
+  checkGooglePrivacyDlpV2Value(o[0] as api.GooglePrivacyDlpV2Value);
+  checkGooglePrivacyDlpV2Value(o[1] as api.GooglePrivacyDlpV2Value);
 }
 
 core.int buildCounterGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues = 0;
@@ -1528,8 +1599,10 @@
 void checkUnnamed2893(
     core.List<api.GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket(o[0]);
-  checkGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket(o[1]);
+  checkGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket(
+      o[0] as api.GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket);
+  checkGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket(
+      o[1] as api.GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket);
 }
 
 core.int buildCounterGooglePrivacyDlpV2DeltaPresenceEstimationResult = 0;
@@ -1568,7 +1641,8 @@
     api.GooglePrivacyDlpV2DetectionRule o) {
   buildCounterGooglePrivacyDlpV2DetectionRule++;
   if (buildCounterGooglePrivacyDlpV2DetectionRule < 3) {
-    checkGooglePrivacyDlpV2HotwordRule(o.hotwordRule);
+    checkGooglePrivacyDlpV2HotwordRule(
+        o.hotwordRule as api.GooglePrivacyDlpV2HotwordRule);
   }
   buildCounterGooglePrivacyDlpV2DetectionRule--;
 }
@@ -1588,8 +1662,10 @@
 void checkGooglePrivacyDlpV2Dictionary(api.GooglePrivacyDlpV2Dictionary o) {
   buildCounterGooglePrivacyDlpV2Dictionary++;
   if (buildCounterGooglePrivacyDlpV2Dictionary < 3) {
-    checkGooglePrivacyDlpV2CloudStoragePath(o.cloudStoragePath);
-    checkGooglePrivacyDlpV2WordList(o.wordList);
+    checkGooglePrivacyDlpV2CloudStoragePath(
+        o.cloudStoragePath as api.GooglePrivacyDlpV2CloudStoragePath);
+    checkGooglePrivacyDlpV2WordList(
+        o.wordList as api.GooglePrivacyDlpV2WordList);
   }
   buildCounterGooglePrivacyDlpV2Dictionary--;
 }
@@ -1603,8 +1679,8 @@
 
 void checkUnnamed2894(core.List<api.GooglePrivacyDlpV2Error> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Error(o[0]);
-  checkGooglePrivacyDlpV2Error(o[1]);
+  checkGooglePrivacyDlpV2Error(o[0] as api.GooglePrivacyDlpV2Error);
+  checkGooglePrivacyDlpV2Error(o[1] as api.GooglePrivacyDlpV2Error);
 }
 
 core.int buildCounterGooglePrivacyDlpV2DlpJob = 0;
@@ -1633,10 +1709,12 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
     checkUnnamed2894(o.errors);
-    checkGooglePrivacyDlpV2InspectDataSourceDetails(o.inspectDetails);
+    checkGooglePrivacyDlpV2InspectDataSourceDetails(
+        o.inspectDetails as api.GooglePrivacyDlpV2InspectDataSourceDetails);
     unittest.expect(o.jobTriggerName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails(o.riskDetails);
+    checkGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails(
+        o.riskDetails as api.GooglePrivacyDlpV2AnalyzeDataSourceRiskDetails);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1679,7 +1757,7 @@
 void checkGooglePrivacyDlpV2EntityId(api.GooglePrivacyDlpV2EntityId o) {
   buildCounterGooglePrivacyDlpV2EntityId++;
   if (buildCounterGooglePrivacyDlpV2EntityId < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.field);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
   }
   buildCounterGooglePrivacyDlpV2EntityId--;
 }
@@ -1712,7 +1790,7 @@
 void checkGooglePrivacyDlpV2Error(api.GooglePrivacyDlpV2Error o) {
   buildCounterGooglePrivacyDlpV2Error++;
   if (buildCounterGooglePrivacyDlpV2Error < 3) {
-    checkGoogleRpcStatus(o.details);
+    checkGoogleRpcStatus(o.details as api.GoogleRpcStatus);
     checkUnnamed2895(o.timestamps);
   }
   buildCounterGooglePrivacyDlpV2Error--;
@@ -1727,8 +1805,8 @@
 
 void checkUnnamed2896(core.List<api.GooglePrivacyDlpV2InfoType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoType(o[0]);
-  checkGooglePrivacyDlpV2InfoType(o[1]);
+  checkGooglePrivacyDlpV2InfoType(o[0] as api.GooglePrivacyDlpV2InfoType);
+  checkGooglePrivacyDlpV2InfoType(o[1] as api.GooglePrivacyDlpV2InfoType);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ExcludeInfoTypes = 0;
@@ -1770,10 +1848,12 @@
     api.GooglePrivacyDlpV2ExclusionRule o) {
   buildCounterGooglePrivacyDlpV2ExclusionRule++;
   if (buildCounterGooglePrivacyDlpV2ExclusionRule < 3) {
-    checkGooglePrivacyDlpV2Dictionary(o.dictionary);
-    checkGooglePrivacyDlpV2ExcludeInfoTypes(o.excludeInfoTypes);
+    checkGooglePrivacyDlpV2Dictionary(
+        o.dictionary as api.GooglePrivacyDlpV2Dictionary);
+    checkGooglePrivacyDlpV2ExcludeInfoTypes(
+        o.excludeInfoTypes as api.GooglePrivacyDlpV2ExcludeInfoTypes);
     unittest.expect(o.matchingType, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2Regex(o.regex);
+    checkGooglePrivacyDlpV2Regex(o.regex as api.GooglePrivacyDlpV2Regex);
   }
   buildCounterGooglePrivacyDlpV2ExclusionRule--;
 }
@@ -1793,7 +1873,8 @@
 void checkGooglePrivacyDlpV2Expressions(api.GooglePrivacyDlpV2Expressions o) {
   buildCounterGooglePrivacyDlpV2Expressions++;
   if (buildCounterGooglePrivacyDlpV2Expressions < 3) {
-    checkGooglePrivacyDlpV2Conditions(o.conditions);
+    checkGooglePrivacyDlpV2Conditions(
+        o.conditions as api.GooglePrivacyDlpV2Conditions);
     unittest.expect(o.logicalOperator, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2Expressions--;
@@ -1827,8 +1908,8 @@
 
 void checkUnnamed2897(core.List<api.GooglePrivacyDlpV2FieldId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldId(o[0]);
-  checkGooglePrivacyDlpV2FieldId(o[1]);
+  checkGooglePrivacyDlpV2FieldId(o[0] as api.GooglePrivacyDlpV2FieldId);
+  checkGooglePrivacyDlpV2FieldId(o[1] as api.GooglePrivacyDlpV2FieldId);
 }
 
 core.int buildCounterGooglePrivacyDlpV2FieldTransformation = 0;
@@ -1852,10 +1933,13 @@
     api.GooglePrivacyDlpV2FieldTransformation o) {
   buildCounterGooglePrivacyDlpV2FieldTransformation++;
   if (buildCounterGooglePrivacyDlpV2FieldTransformation < 3) {
-    checkGooglePrivacyDlpV2RecordCondition(o.condition);
+    checkGooglePrivacyDlpV2RecordCondition(
+        o.condition as api.GooglePrivacyDlpV2RecordCondition);
     checkUnnamed2897(o.fields);
-    checkGooglePrivacyDlpV2InfoTypeTransformations(o.infoTypeTransformations);
-    checkGooglePrivacyDlpV2PrimitiveTransformation(o.primitiveTransformation);
+    checkGooglePrivacyDlpV2InfoTypeTransformations(o.infoTypeTransformations
+        as api.GooglePrivacyDlpV2InfoTypeTransformations);
+    checkGooglePrivacyDlpV2PrimitiveTransformation(o.primitiveTransformation
+        as api.GooglePrivacyDlpV2PrimitiveTransformation);
   }
   buildCounterGooglePrivacyDlpV2FieldTransformation--;
 }
@@ -1875,7 +1959,8 @@
 void checkGooglePrivacyDlpV2FileSet(api.GooglePrivacyDlpV2FileSet o) {
   buildCounterGooglePrivacyDlpV2FileSet++;
   if (buildCounterGooglePrivacyDlpV2FileSet < 3) {
-    checkGooglePrivacyDlpV2CloudStorageRegexFileSet(o.regexFileSet);
+    checkGooglePrivacyDlpV2CloudStorageRegexFileSet(
+        o.regexFileSet as api.GooglePrivacyDlpV2CloudStorageRegexFileSet);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2FileSet--;
@@ -1920,15 +2005,18 @@
   buildCounterGooglePrivacyDlpV2Finding++;
   if (buildCounterGooglePrivacyDlpV2Finding < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
     unittest.expect(o.jobCreateTime, unittest.equals('foo'));
     unittest.expect(o.jobName, unittest.equals('foo'));
     checkUnnamed2898(o.labels);
     unittest.expect(o.likelihood, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2Location(o.location);
+    checkGooglePrivacyDlpV2Location(
+        o.location as api.GooglePrivacyDlpV2Location);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.quote, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2QuoteInfo(o.quoteInfo);
+    checkGooglePrivacyDlpV2QuoteInfo(
+        o.quoteInfo as api.GooglePrivacyDlpV2QuoteInfo);
     unittest.expect(o.resourceName, unittest.equals('foo'));
     unittest.expect(o.triggerName, unittest.equals('foo'));
   }
@@ -1944,8 +2032,10 @@
 
 void checkUnnamed2899(core.List<api.GooglePrivacyDlpV2InfoTypeLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoTypeLimit(o[0]);
-  checkGooglePrivacyDlpV2InfoTypeLimit(o[1]);
+  checkGooglePrivacyDlpV2InfoTypeLimit(
+      o[0] as api.GooglePrivacyDlpV2InfoTypeLimit);
+  checkGooglePrivacyDlpV2InfoTypeLimit(
+      o[1] as api.GooglePrivacyDlpV2InfoTypeLimit);
 }
 
 core.int buildCounterGooglePrivacyDlpV2FindingLimits = 0;
@@ -2008,8 +2098,8 @@
   buildCounterGooglePrivacyDlpV2FixedSizeBucketingConfig++;
   if (buildCounterGooglePrivacyDlpV2FixedSizeBucketingConfig < 3) {
     unittest.expect(o.bucketSize, unittest.equals(42.0));
-    checkGooglePrivacyDlpV2Value(o.lowerBound);
-    checkGooglePrivacyDlpV2Value(o.upperBound);
+    checkGooglePrivacyDlpV2Value(o.lowerBound as api.GooglePrivacyDlpV2Value);
+    checkGooglePrivacyDlpV2Value(o.upperBound as api.GooglePrivacyDlpV2Value);
   }
   buildCounterGooglePrivacyDlpV2FixedSizeBucketingConfig--;
 }
@@ -2030,9 +2120,11 @@
 void checkGooglePrivacyDlpV2HotwordRule(api.GooglePrivacyDlpV2HotwordRule o) {
   buildCounterGooglePrivacyDlpV2HotwordRule++;
   if (buildCounterGooglePrivacyDlpV2HotwordRule < 3) {
-    checkGooglePrivacyDlpV2Regex(o.hotwordRegex);
-    checkGooglePrivacyDlpV2LikelihoodAdjustment(o.likelihoodAdjustment);
-    checkGooglePrivacyDlpV2Proximity(o.proximity);
+    checkGooglePrivacyDlpV2Regex(o.hotwordRegex as api.GooglePrivacyDlpV2Regex);
+    checkGooglePrivacyDlpV2LikelihoodAdjustment(
+        o.likelihoodAdjustment as api.GooglePrivacyDlpV2LikelihoodAdjustment);
+    checkGooglePrivacyDlpV2Proximity(
+        o.proximity as api.GooglePrivacyDlpV2Proximity);
   }
   buildCounterGooglePrivacyDlpV2HotwordRule--;
 }
@@ -2054,8 +2146,10 @@
     api.GooglePrivacyDlpV2HybridContentItem o) {
   buildCounterGooglePrivacyDlpV2HybridContentItem++;
   if (buildCounterGooglePrivacyDlpV2HybridContentItem < 3) {
-    checkGooglePrivacyDlpV2HybridFindingDetails(o.findingDetails);
-    checkGooglePrivacyDlpV2ContentItem(o.item);
+    checkGooglePrivacyDlpV2HybridFindingDetails(
+        o.findingDetails as api.GooglePrivacyDlpV2HybridFindingDetails);
+    checkGooglePrivacyDlpV2ContentItem(
+        o.item as api.GooglePrivacyDlpV2ContentItem);
   }
   buildCounterGooglePrivacyDlpV2HybridContentItem--;
 }
@@ -2093,11 +2187,13 @@
     api.GooglePrivacyDlpV2HybridFindingDetails o) {
   buildCounterGooglePrivacyDlpV2HybridFindingDetails++;
   if (buildCounterGooglePrivacyDlpV2HybridFindingDetails < 3) {
-    checkGooglePrivacyDlpV2Container(o.containerDetails);
+    checkGooglePrivacyDlpV2Container(
+        o.containerDetails as api.GooglePrivacyDlpV2Container);
     unittest.expect(o.fileOffset, unittest.equals('foo'));
     checkUnnamed2900(o.labels);
     unittest.expect(o.rowOffset, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2TableOptions(o.tableOptions);
+    checkGooglePrivacyDlpV2TableOptions(
+        o.tableOptions as api.GooglePrivacyDlpV2TableOptions);
   }
   buildCounterGooglePrivacyDlpV2HybridFindingDetails--;
 }
@@ -2118,7 +2214,8 @@
     api.GooglePrivacyDlpV2HybridInspectDlpJobRequest o) {
   buildCounterGooglePrivacyDlpV2HybridInspectDlpJobRequest++;
   if (buildCounterGooglePrivacyDlpV2HybridInspectDlpJobRequest < 3) {
-    checkGooglePrivacyDlpV2HybridContentItem(o.hybridItem);
+    checkGooglePrivacyDlpV2HybridContentItem(
+        o.hybridItem as api.GooglePrivacyDlpV2HybridContentItem);
   }
   buildCounterGooglePrivacyDlpV2HybridInspectDlpJobRequest--;
 }
@@ -2139,7 +2236,8 @@
     api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest o) {
   buildCounterGooglePrivacyDlpV2HybridInspectJobTriggerRequest++;
   if (buildCounterGooglePrivacyDlpV2HybridInspectJobTriggerRequest < 3) {
-    checkGooglePrivacyDlpV2HybridContentItem(o.hybridItem);
+    checkGooglePrivacyDlpV2HybridContentItem(
+        o.hybridItem as api.GooglePrivacyDlpV2HybridContentItem);
   }
   buildCounterGooglePrivacyDlpV2HybridInspectJobTriggerRequest--;
 }
@@ -2233,7 +2331,8 @@
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed2901(o.labels);
     checkUnnamed2902(o.requiredFindingLabelKeys);
-    checkGooglePrivacyDlpV2TableOptions(o.tableOptions);
+    checkGooglePrivacyDlpV2TableOptions(
+        o.tableOptions as api.GooglePrivacyDlpV2TableOptions);
   }
   buildCounterGooglePrivacyDlpV2HybridOptions--;
 }
@@ -2247,8 +2346,8 @@
 
 void checkUnnamed2903(core.List<api.GooglePrivacyDlpV2BoundingBox> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2BoundingBox(o[0]);
-  checkGooglePrivacyDlpV2BoundingBox(o[1]);
+  checkGooglePrivacyDlpV2BoundingBox(o[0] as api.GooglePrivacyDlpV2BoundingBox);
+  checkGooglePrivacyDlpV2BoundingBox(o[1] as api.GooglePrivacyDlpV2BoundingBox);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ImageLocation = 0;
@@ -2289,9 +2388,11 @@
     api.GooglePrivacyDlpV2ImageRedactionConfig o) {
   buildCounterGooglePrivacyDlpV2ImageRedactionConfig++;
   if (buildCounterGooglePrivacyDlpV2ImageRedactionConfig < 3) {
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
     unittest.expect(o.redactAllText, unittest.isTrue);
-    checkGooglePrivacyDlpV2Color(o.redactionColor);
+    checkGooglePrivacyDlpV2Color(
+        o.redactionColor as api.GooglePrivacyDlpV2Color);
   }
   buildCounterGooglePrivacyDlpV2ImageRedactionConfig--;
 }
@@ -2371,7 +2472,8 @@
     api.GooglePrivacyDlpV2InfoTypeLimit o) {
   buildCounterGooglePrivacyDlpV2InfoTypeLimit++;
   if (buildCounterGooglePrivacyDlpV2InfoTypeLimit < 3) {
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
     unittest.expect(o.maxFindings, unittest.equals(42));
   }
   buildCounterGooglePrivacyDlpV2InfoTypeLimit--;
@@ -2394,7 +2496,8 @@
   buildCounterGooglePrivacyDlpV2InfoTypeStats++;
   if (buildCounterGooglePrivacyDlpV2InfoTypeStats < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
   }
   buildCounterGooglePrivacyDlpV2InfoTypeStats--;
 }
@@ -2408,8 +2511,8 @@
 
 void checkUnnamed2905(core.List<api.GooglePrivacyDlpV2InfoType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoType(o[0]);
-  checkGooglePrivacyDlpV2InfoType(o[1]);
+  checkGooglePrivacyDlpV2InfoType(o[0] as api.GooglePrivacyDlpV2InfoType);
+  checkGooglePrivacyDlpV2InfoType(o[1] as api.GooglePrivacyDlpV2InfoType);
 }
 
 core.int buildCounterGooglePrivacyDlpV2InfoTypeTransformation = 0;
@@ -2431,7 +2534,8 @@
   buildCounterGooglePrivacyDlpV2InfoTypeTransformation++;
   if (buildCounterGooglePrivacyDlpV2InfoTypeTransformation < 3) {
     checkUnnamed2905(o.infoTypes);
-    checkGooglePrivacyDlpV2PrimitiveTransformation(o.primitiveTransformation);
+    checkGooglePrivacyDlpV2PrimitiveTransformation(o.primitiveTransformation
+        as api.GooglePrivacyDlpV2PrimitiveTransformation);
   }
   buildCounterGooglePrivacyDlpV2InfoTypeTransformation--;
 }
@@ -2446,8 +2550,10 @@
 void checkUnnamed2906(
     core.List<api.GooglePrivacyDlpV2InfoTypeTransformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoTypeTransformation(o[0]);
-  checkGooglePrivacyDlpV2InfoTypeTransformation(o[1]);
+  checkGooglePrivacyDlpV2InfoTypeTransformation(
+      o[0] as api.GooglePrivacyDlpV2InfoTypeTransformation);
+  checkGooglePrivacyDlpV2InfoTypeTransformation(
+      o[1] as api.GooglePrivacyDlpV2InfoTypeTransformation);
 }
 
 core.int buildCounterGooglePrivacyDlpV2InfoTypeTransformations = 0;
@@ -2493,8 +2599,10 @@
 
 void checkUnnamed2908(core.List<api.GooglePrivacyDlpV2CustomInfoType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2CustomInfoType(o[0]);
-  checkGooglePrivacyDlpV2CustomInfoType(o[1]);
+  checkGooglePrivacyDlpV2CustomInfoType(
+      o[0] as api.GooglePrivacyDlpV2CustomInfoType);
+  checkGooglePrivacyDlpV2CustomInfoType(
+      o[1] as api.GooglePrivacyDlpV2CustomInfoType);
 }
 
 core.List<api.GooglePrivacyDlpV2InfoType> buildUnnamed2909() {
@@ -2506,8 +2614,8 @@
 
 void checkUnnamed2909(core.List<api.GooglePrivacyDlpV2InfoType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoType(o[0]);
-  checkGooglePrivacyDlpV2InfoType(o[1]);
+  checkGooglePrivacyDlpV2InfoType(o[0] as api.GooglePrivacyDlpV2InfoType);
+  checkGooglePrivacyDlpV2InfoType(o[1] as api.GooglePrivacyDlpV2InfoType);
 }
 
 core.List<api.GooglePrivacyDlpV2InspectionRuleSet> buildUnnamed2910() {
@@ -2519,8 +2627,10 @@
 
 void checkUnnamed2910(core.List<api.GooglePrivacyDlpV2InspectionRuleSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InspectionRuleSet(o[0]);
-  checkGooglePrivacyDlpV2InspectionRuleSet(o[1]);
+  checkGooglePrivacyDlpV2InspectionRuleSet(
+      o[0] as api.GooglePrivacyDlpV2InspectionRuleSet);
+  checkGooglePrivacyDlpV2InspectionRuleSet(
+      o[1] as api.GooglePrivacyDlpV2InspectionRuleSet);
 }
 
 core.int buildCounterGooglePrivacyDlpV2InspectConfig = 0;
@@ -2550,7 +2660,8 @@
     unittest.expect(o.excludeInfoTypes, unittest.isTrue);
     unittest.expect(o.includeQuote, unittest.isTrue);
     checkUnnamed2909(o.infoTypes);
-    checkGooglePrivacyDlpV2FindingLimits(o.limits);
+    checkGooglePrivacyDlpV2FindingLimits(
+        o.limits as api.GooglePrivacyDlpV2FindingLimits);
     unittest.expect(o.minLikelihood, unittest.equals('foo'));
     checkUnnamed2910(o.ruleSet);
   }
@@ -2576,9 +2687,11 @@
     api.GooglePrivacyDlpV2InspectContentRequest o) {
   buildCounterGooglePrivacyDlpV2InspectContentRequest++;
   if (buildCounterGooglePrivacyDlpV2InspectContentRequest < 3) {
-    checkGooglePrivacyDlpV2InspectConfig(o.inspectConfig);
+    checkGooglePrivacyDlpV2InspectConfig(
+        o.inspectConfig as api.GooglePrivacyDlpV2InspectConfig);
     unittest.expect(o.inspectTemplateName, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2ContentItem(o.item);
+    checkGooglePrivacyDlpV2ContentItem(
+        o.item as api.GooglePrivacyDlpV2ContentItem);
     unittest.expect(o.locationId, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2InspectContentRequest--;
@@ -2600,7 +2713,8 @@
     api.GooglePrivacyDlpV2InspectContentResponse o) {
   buildCounterGooglePrivacyDlpV2InspectContentResponse++;
   if (buildCounterGooglePrivacyDlpV2InspectContentResponse < 3) {
-    checkGooglePrivacyDlpV2InspectResult(o.result);
+    checkGooglePrivacyDlpV2InspectResult(
+        o.result as api.GooglePrivacyDlpV2InspectResult);
   }
   buildCounterGooglePrivacyDlpV2InspectContentResponse--;
 }
@@ -2622,8 +2736,9 @@
     api.GooglePrivacyDlpV2InspectDataSourceDetails o) {
   buildCounterGooglePrivacyDlpV2InspectDataSourceDetails++;
   if (buildCounterGooglePrivacyDlpV2InspectDataSourceDetails < 3) {
-    checkGooglePrivacyDlpV2RequestedOptions(o.requestedOptions);
-    checkGooglePrivacyDlpV2Result(o.result);
+    checkGooglePrivacyDlpV2RequestedOptions(
+        o.requestedOptions as api.GooglePrivacyDlpV2RequestedOptions);
+    checkGooglePrivacyDlpV2Result(o.result as api.GooglePrivacyDlpV2Result);
   }
   buildCounterGooglePrivacyDlpV2InspectDataSourceDetails--;
 }
@@ -2637,8 +2752,8 @@
 
 void checkUnnamed2911(core.List<api.GooglePrivacyDlpV2Action> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Action(o[0]);
-  checkGooglePrivacyDlpV2Action(o[1]);
+  checkGooglePrivacyDlpV2Action(o[0] as api.GooglePrivacyDlpV2Action);
+  checkGooglePrivacyDlpV2Action(o[1] as api.GooglePrivacyDlpV2Action);
 }
 
 core.int buildCounterGooglePrivacyDlpV2InspectJobConfig = 0;
@@ -2661,9 +2776,11 @@
   buildCounterGooglePrivacyDlpV2InspectJobConfig++;
   if (buildCounterGooglePrivacyDlpV2InspectJobConfig < 3) {
     checkUnnamed2911(o.actions);
-    checkGooglePrivacyDlpV2InspectConfig(o.inspectConfig);
+    checkGooglePrivacyDlpV2InspectConfig(
+        o.inspectConfig as api.GooglePrivacyDlpV2InspectConfig);
     unittest.expect(o.inspectTemplateName, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2StorageConfig(o.storageConfig);
+    checkGooglePrivacyDlpV2StorageConfig(
+        o.storageConfig as api.GooglePrivacyDlpV2StorageConfig);
   }
   buildCounterGooglePrivacyDlpV2InspectJobConfig--;
 }
@@ -2677,8 +2794,8 @@
 
 void checkUnnamed2912(core.List<api.GooglePrivacyDlpV2Finding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Finding(o[0]);
-  checkGooglePrivacyDlpV2Finding(o[1]);
+  checkGooglePrivacyDlpV2Finding(o[0] as api.GooglePrivacyDlpV2Finding);
+  checkGooglePrivacyDlpV2Finding(o[1] as api.GooglePrivacyDlpV2Finding);
 }
 
 core.int buildCounterGooglePrivacyDlpV2InspectResult = 0;
@@ -2726,7 +2843,8 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2InspectConfig(o.inspectConfig);
+    checkGooglePrivacyDlpV2InspectConfig(
+        o.inspectConfig as api.GooglePrivacyDlpV2InspectConfig);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -2749,8 +2867,10 @@
     api.GooglePrivacyDlpV2InspectionRule o) {
   buildCounterGooglePrivacyDlpV2InspectionRule++;
   if (buildCounterGooglePrivacyDlpV2InspectionRule < 3) {
-    checkGooglePrivacyDlpV2ExclusionRule(o.exclusionRule);
-    checkGooglePrivacyDlpV2HotwordRule(o.hotwordRule);
+    checkGooglePrivacyDlpV2ExclusionRule(
+        o.exclusionRule as api.GooglePrivacyDlpV2ExclusionRule);
+    checkGooglePrivacyDlpV2HotwordRule(
+        o.hotwordRule as api.GooglePrivacyDlpV2HotwordRule);
   }
   buildCounterGooglePrivacyDlpV2InspectionRule--;
 }
@@ -2764,8 +2884,8 @@
 
 void checkUnnamed2913(core.List<api.GooglePrivacyDlpV2InfoType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoType(o[0]);
-  checkGooglePrivacyDlpV2InfoType(o[1]);
+  checkGooglePrivacyDlpV2InfoType(o[0] as api.GooglePrivacyDlpV2InfoType);
+  checkGooglePrivacyDlpV2InfoType(o[1] as api.GooglePrivacyDlpV2InfoType);
 }
 
 core.List<api.GooglePrivacyDlpV2InspectionRule> buildUnnamed2914() {
@@ -2777,8 +2897,10 @@
 
 void checkUnnamed2914(core.List<api.GooglePrivacyDlpV2InspectionRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InspectionRule(o[0]);
-  checkGooglePrivacyDlpV2InspectionRule(o[1]);
+  checkGooglePrivacyDlpV2InspectionRule(
+      o[0] as api.GooglePrivacyDlpV2InspectionRule);
+  checkGooglePrivacyDlpV2InspectionRule(
+      o[1] as api.GooglePrivacyDlpV2InspectionRule);
 }
 
 core.int buildCounterGooglePrivacyDlpV2InspectionRuleSet = 0;
@@ -2830,8 +2952,8 @@
 
 void checkUnnamed2915(core.List<api.GooglePrivacyDlpV2Error> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Error(o[0]);
-  checkGooglePrivacyDlpV2Error(o[1]);
+  checkGooglePrivacyDlpV2Error(o[0] as api.GooglePrivacyDlpV2Error);
+  checkGooglePrivacyDlpV2Error(o[1] as api.GooglePrivacyDlpV2Error);
 }
 
 core.List<api.GooglePrivacyDlpV2Trigger> buildUnnamed2916() {
@@ -2843,8 +2965,8 @@
 
 void checkUnnamed2916(core.List<api.GooglePrivacyDlpV2Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Trigger(o[0]);
-  checkGooglePrivacyDlpV2Trigger(o[1]);
+  checkGooglePrivacyDlpV2Trigger(o[0] as api.GooglePrivacyDlpV2Trigger);
+  checkGooglePrivacyDlpV2Trigger(o[1] as api.GooglePrivacyDlpV2Trigger);
 }
 
 core.int buildCounterGooglePrivacyDlpV2JobTrigger = 0;
@@ -2874,7 +2996,8 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed2915(o.errors);
-    checkGooglePrivacyDlpV2InspectJobConfig(o.inspectJob);
+    checkGooglePrivacyDlpV2InspectJobConfig(
+        o.inspectJob as api.GooglePrivacyDlpV2InspectJobConfig);
     unittest.expect(o.lastRunTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
@@ -2893,8 +3016,8 @@
 
 void checkUnnamed2917(core.List<api.GooglePrivacyDlpV2FieldId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldId(o[0]);
-  checkGooglePrivacyDlpV2FieldId(o[1]);
+  checkGooglePrivacyDlpV2FieldId(o[0] as api.GooglePrivacyDlpV2FieldId);
+  checkGooglePrivacyDlpV2FieldId(o[1] as api.GooglePrivacyDlpV2FieldId);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KAnonymityConfig = 0;
@@ -2914,7 +3037,8 @@
     api.GooglePrivacyDlpV2KAnonymityConfig o) {
   buildCounterGooglePrivacyDlpV2KAnonymityConfig++;
   if (buildCounterGooglePrivacyDlpV2KAnonymityConfig < 3) {
-    checkGooglePrivacyDlpV2EntityId(o.entityId);
+    checkGooglePrivacyDlpV2EntityId(
+        o.entityId as api.GooglePrivacyDlpV2EntityId);
     checkUnnamed2917(o.quasiIds);
   }
   buildCounterGooglePrivacyDlpV2KAnonymityConfig--;
@@ -2929,8 +3053,8 @@
 
 void checkUnnamed2918(core.List<api.GooglePrivacyDlpV2Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Value(o[0]);
-  checkGooglePrivacyDlpV2Value(o[1]);
+  checkGooglePrivacyDlpV2Value(o[0] as api.GooglePrivacyDlpV2Value);
+  checkGooglePrivacyDlpV2Value(o[1] as api.GooglePrivacyDlpV2Value);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KAnonymityEquivalenceClass = 0;
@@ -2966,8 +3090,10 @@
 void checkUnnamed2919(
     core.List<api.GooglePrivacyDlpV2KAnonymityEquivalenceClass> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2KAnonymityEquivalenceClass(o[0]);
-  checkGooglePrivacyDlpV2KAnonymityEquivalenceClass(o[1]);
+  checkGooglePrivacyDlpV2KAnonymityEquivalenceClass(
+      o[0] as api.GooglePrivacyDlpV2KAnonymityEquivalenceClass);
+  checkGooglePrivacyDlpV2KAnonymityEquivalenceClass(
+      o[1] as api.GooglePrivacyDlpV2KAnonymityEquivalenceClass);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KAnonymityHistogramBucket = 0;
@@ -3009,8 +3135,10 @@
 void checkUnnamed2920(
     core.List<api.GooglePrivacyDlpV2KAnonymityHistogramBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2KAnonymityHistogramBucket(o[0]);
-  checkGooglePrivacyDlpV2KAnonymityHistogramBucket(o[1]);
+  checkGooglePrivacyDlpV2KAnonymityHistogramBucket(
+      o[0] as api.GooglePrivacyDlpV2KAnonymityHistogramBucket);
+  checkGooglePrivacyDlpV2KAnonymityHistogramBucket(
+      o[1] as api.GooglePrivacyDlpV2KAnonymityHistogramBucket);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KAnonymityResult = 0;
@@ -3043,8 +3171,10 @@
 
 void checkUnnamed2921(core.List<api.GooglePrivacyDlpV2AuxiliaryTable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2AuxiliaryTable(o[0]);
-  checkGooglePrivacyDlpV2AuxiliaryTable(o[1]);
+  checkGooglePrivacyDlpV2AuxiliaryTable(
+      o[0] as api.GooglePrivacyDlpV2AuxiliaryTable);
+  checkGooglePrivacyDlpV2AuxiliaryTable(
+      o[1] as api.GooglePrivacyDlpV2AuxiliaryTable);
 }
 
 core.List<api.GooglePrivacyDlpV2TaggedField> buildUnnamed2922() {
@@ -3056,8 +3186,8 @@
 
 void checkUnnamed2922(core.List<api.GooglePrivacyDlpV2TaggedField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2TaggedField(o[0]);
-  checkGooglePrivacyDlpV2TaggedField(o[1]);
+  checkGooglePrivacyDlpV2TaggedField(o[0] as api.GooglePrivacyDlpV2TaggedField);
+  checkGooglePrivacyDlpV2TaggedField(o[1] as api.GooglePrivacyDlpV2TaggedField);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KMapEstimationConfig = 0;
@@ -3096,8 +3226,10 @@
 void checkUnnamed2923(
     core.List<api.GooglePrivacyDlpV2KMapEstimationQuasiIdValues> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2KMapEstimationQuasiIdValues(o[0]);
-  checkGooglePrivacyDlpV2KMapEstimationQuasiIdValues(o[1]);
+  checkGooglePrivacyDlpV2KMapEstimationQuasiIdValues(
+      o[0] as api.GooglePrivacyDlpV2KMapEstimationQuasiIdValues);
+  checkGooglePrivacyDlpV2KMapEstimationQuasiIdValues(
+      o[1] as api.GooglePrivacyDlpV2KMapEstimationQuasiIdValues);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KMapEstimationHistogramBucket = 0;
@@ -3138,8 +3270,8 @@
 
 void checkUnnamed2924(core.List<api.GooglePrivacyDlpV2Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Value(o[0]);
-  checkGooglePrivacyDlpV2Value(o[1]);
+  checkGooglePrivacyDlpV2Value(o[0] as api.GooglePrivacyDlpV2Value);
+  checkGooglePrivacyDlpV2Value(o[1] as api.GooglePrivacyDlpV2Value);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KMapEstimationQuasiIdValues = 0;
@@ -3176,8 +3308,10 @@
 void checkUnnamed2925(
     core.List<api.GooglePrivacyDlpV2KMapEstimationHistogramBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2KMapEstimationHistogramBucket(o[0]);
-  checkGooglePrivacyDlpV2KMapEstimationHistogramBucket(o[1]);
+  checkGooglePrivacyDlpV2KMapEstimationHistogramBucket(
+      o[0] as api.GooglePrivacyDlpV2KMapEstimationHistogramBucket);
+  checkGooglePrivacyDlpV2KMapEstimationHistogramBucket(
+      o[1] as api.GooglePrivacyDlpV2KMapEstimationHistogramBucket);
 }
 
 core.int buildCounterGooglePrivacyDlpV2KMapEstimationResult = 0;
@@ -3210,8 +3344,8 @@
 
 void checkUnnamed2926(core.List<api.GooglePrivacyDlpV2PathElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2PathElement(o[0]);
-  checkGooglePrivacyDlpV2PathElement(o[1]);
+  checkGooglePrivacyDlpV2PathElement(o[0] as api.GooglePrivacyDlpV2PathElement);
+  checkGooglePrivacyDlpV2PathElement(o[1] as api.GooglePrivacyDlpV2PathElement);
 }
 
 core.int buildCounterGooglePrivacyDlpV2Key = 0;
@@ -3229,7 +3363,8 @@
 void checkGooglePrivacyDlpV2Key(api.GooglePrivacyDlpV2Key o) {
   buildCounterGooglePrivacyDlpV2Key++;
   if (buildCounterGooglePrivacyDlpV2Key < 3) {
-    checkGooglePrivacyDlpV2PartitionId(o.partitionId);
+    checkGooglePrivacyDlpV2PartitionId(
+        o.partitionId as api.GooglePrivacyDlpV2PartitionId);
     checkUnnamed2926(o.path);
   }
   buildCounterGooglePrivacyDlpV2Key--;
@@ -3287,8 +3422,8 @@
 
 void checkUnnamed2927(core.List<api.GooglePrivacyDlpV2FieldId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldId(o[0]);
-  checkGooglePrivacyDlpV2FieldId(o[1]);
+  checkGooglePrivacyDlpV2FieldId(o[0] as api.GooglePrivacyDlpV2FieldId);
+  checkGooglePrivacyDlpV2FieldId(o[1] as api.GooglePrivacyDlpV2FieldId);
 }
 
 core.int buildCounterGooglePrivacyDlpV2LDiversityConfig = 0;
@@ -3309,7 +3444,8 @@
   buildCounterGooglePrivacyDlpV2LDiversityConfig++;
   if (buildCounterGooglePrivacyDlpV2LDiversityConfig < 3) {
     checkUnnamed2927(o.quasiIds);
-    checkGooglePrivacyDlpV2FieldId(o.sensitiveAttribute);
+    checkGooglePrivacyDlpV2FieldId(
+        o.sensitiveAttribute as api.GooglePrivacyDlpV2FieldId);
   }
   buildCounterGooglePrivacyDlpV2LDiversityConfig--;
 }
@@ -3323,8 +3459,8 @@
 
 void checkUnnamed2928(core.List<api.GooglePrivacyDlpV2Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Value(o[0]);
-  checkGooglePrivacyDlpV2Value(o[1]);
+  checkGooglePrivacyDlpV2Value(o[0] as api.GooglePrivacyDlpV2Value);
+  checkGooglePrivacyDlpV2Value(o[1] as api.GooglePrivacyDlpV2Value);
 }
 
 core.List<api.GooglePrivacyDlpV2ValueFrequency> buildUnnamed2929() {
@@ -3336,8 +3472,10 @@
 
 void checkUnnamed2929(core.List<api.GooglePrivacyDlpV2ValueFrequency> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2ValueFrequency(o[0]);
-  checkGooglePrivacyDlpV2ValueFrequency(o[1]);
+  checkGooglePrivacyDlpV2ValueFrequency(
+      o[0] as api.GooglePrivacyDlpV2ValueFrequency);
+  checkGooglePrivacyDlpV2ValueFrequency(
+      o[1] as api.GooglePrivacyDlpV2ValueFrequency);
 }
 
 core.int buildCounterGooglePrivacyDlpV2LDiversityEquivalenceClass = 0;
@@ -3377,8 +3515,10 @@
 void checkUnnamed2930(
     core.List<api.GooglePrivacyDlpV2LDiversityEquivalenceClass> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2LDiversityEquivalenceClass(o[0]);
-  checkGooglePrivacyDlpV2LDiversityEquivalenceClass(o[1]);
+  checkGooglePrivacyDlpV2LDiversityEquivalenceClass(
+      o[0] as api.GooglePrivacyDlpV2LDiversityEquivalenceClass);
+  checkGooglePrivacyDlpV2LDiversityEquivalenceClass(
+      o[1] as api.GooglePrivacyDlpV2LDiversityEquivalenceClass);
 }
 
 core.int buildCounterGooglePrivacyDlpV2LDiversityHistogramBucket = 0;
@@ -3422,8 +3562,10 @@
 void checkUnnamed2931(
     core.List<api.GooglePrivacyDlpV2LDiversityHistogramBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2LDiversityHistogramBucket(o[0]);
-  checkGooglePrivacyDlpV2LDiversityHistogramBucket(o[1]);
+  checkGooglePrivacyDlpV2LDiversityHistogramBucket(
+      o[0] as api.GooglePrivacyDlpV2LDiversityHistogramBucket);
+  checkGooglePrivacyDlpV2LDiversityHistogramBucket(
+      o[1] as api.GooglePrivacyDlpV2LDiversityHistogramBucket);
 }
 
 core.int buildCounterGooglePrivacyDlpV2LDiversityResult = 0;
@@ -3465,9 +3607,12 @@
     api.GooglePrivacyDlpV2LargeCustomDictionaryConfig o) {
   buildCounterGooglePrivacyDlpV2LargeCustomDictionaryConfig++;
   if (buildCounterGooglePrivacyDlpV2LargeCustomDictionaryConfig < 3) {
-    checkGooglePrivacyDlpV2BigQueryField(o.bigQueryField);
-    checkGooglePrivacyDlpV2CloudStorageFileSet(o.cloudStorageFileSet);
-    checkGooglePrivacyDlpV2CloudStoragePath(o.outputPath);
+    checkGooglePrivacyDlpV2BigQueryField(
+        o.bigQueryField as api.GooglePrivacyDlpV2BigQueryField);
+    checkGooglePrivacyDlpV2CloudStorageFileSet(
+        o.cloudStorageFileSet as api.GooglePrivacyDlpV2CloudStorageFileSet);
+    checkGooglePrivacyDlpV2CloudStoragePath(
+        o.outputPath as api.GooglePrivacyDlpV2CloudStoragePath);
   }
   buildCounterGooglePrivacyDlpV2LargeCustomDictionaryConfig--;
 }
@@ -3542,8 +3687,10 @@
 
 void checkUnnamed2932(core.List<api.GooglePrivacyDlpV2DeidentifyTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2DeidentifyTemplate(o[0]);
-  checkGooglePrivacyDlpV2DeidentifyTemplate(o[1]);
+  checkGooglePrivacyDlpV2DeidentifyTemplate(
+      o[0] as api.GooglePrivacyDlpV2DeidentifyTemplate);
+  checkGooglePrivacyDlpV2DeidentifyTemplate(
+      o[1] as api.GooglePrivacyDlpV2DeidentifyTemplate);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ListDeidentifyTemplatesResponse = 0;
@@ -3578,8 +3725,8 @@
 
 void checkUnnamed2933(core.List<api.GooglePrivacyDlpV2DlpJob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2DlpJob(o[0]);
-  checkGooglePrivacyDlpV2DlpJob(o[1]);
+  checkGooglePrivacyDlpV2DlpJob(o[0] as api.GooglePrivacyDlpV2DlpJob);
+  checkGooglePrivacyDlpV2DlpJob(o[1] as api.GooglePrivacyDlpV2DlpJob);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ListDlpJobsResponse = 0;
@@ -3614,8 +3761,10 @@
 
 void checkUnnamed2934(core.List<api.GooglePrivacyDlpV2InfoTypeDescription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoTypeDescription(o[0]);
-  checkGooglePrivacyDlpV2InfoTypeDescription(o[1]);
+  checkGooglePrivacyDlpV2InfoTypeDescription(
+      o[0] as api.GooglePrivacyDlpV2InfoTypeDescription);
+  checkGooglePrivacyDlpV2InfoTypeDescription(
+      o[1] as api.GooglePrivacyDlpV2InfoTypeDescription);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ListInfoTypesResponse = 0;
@@ -3648,8 +3797,10 @@
 
 void checkUnnamed2935(core.List<api.GooglePrivacyDlpV2InspectTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InspectTemplate(o[0]);
-  checkGooglePrivacyDlpV2InspectTemplate(o[1]);
+  checkGooglePrivacyDlpV2InspectTemplate(
+      o[0] as api.GooglePrivacyDlpV2InspectTemplate);
+  checkGooglePrivacyDlpV2InspectTemplate(
+      o[1] as api.GooglePrivacyDlpV2InspectTemplate);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ListInspectTemplatesResponse = 0;
@@ -3684,8 +3835,8 @@
 
 void checkUnnamed2936(core.List<api.GooglePrivacyDlpV2JobTrigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2JobTrigger(o[0]);
-  checkGooglePrivacyDlpV2JobTrigger(o[1]);
+  checkGooglePrivacyDlpV2JobTrigger(o[0] as api.GooglePrivacyDlpV2JobTrigger);
+  checkGooglePrivacyDlpV2JobTrigger(o[1] as api.GooglePrivacyDlpV2JobTrigger);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ListJobTriggersResponse = 0;
@@ -3720,8 +3871,10 @@
 
 void checkUnnamed2937(core.List<api.GooglePrivacyDlpV2StoredInfoType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2StoredInfoType(o[0]);
-  checkGooglePrivacyDlpV2StoredInfoType(o[1]);
+  checkGooglePrivacyDlpV2StoredInfoType(
+      o[0] as api.GooglePrivacyDlpV2StoredInfoType);
+  checkGooglePrivacyDlpV2StoredInfoType(
+      o[1] as api.GooglePrivacyDlpV2StoredInfoType);
 }
 
 core.int buildCounterGooglePrivacyDlpV2ListStoredInfoTypesResponse = 0;
@@ -3756,8 +3909,10 @@
 
 void checkUnnamed2938(core.List<api.GooglePrivacyDlpV2ContentLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2ContentLocation(o[0]);
-  checkGooglePrivacyDlpV2ContentLocation(o[1]);
+  checkGooglePrivacyDlpV2ContentLocation(
+      o[0] as api.GooglePrivacyDlpV2ContentLocation);
+  checkGooglePrivacyDlpV2ContentLocation(
+      o[1] as api.GooglePrivacyDlpV2ContentLocation);
 }
 
 core.int buildCounterGooglePrivacyDlpV2Location = 0;
@@ -3777,9 +3932,11 @@
 void checkGooglePrivacyDlpV2Location(api.GooglePrivacyDlpV2Location o) {
   buildCounterGooglePrivacyDlpV2Location++;
   if (buildCounterGooglePrivacyDlpV2Location < 3) {
-    checkGooglePrivacyDlpV2Range(o.byteRange);
-    checkGooglePrivacyDlpV2Range(o.codepointRange);
-    checkGooglePrivacyDlpV2Container(o.container);
+    checkGooglePrivacyDlpV2Range(o.byteRange as api.GooglePrivacyDlpV2Range);
+    checkGooglePrivacyDlpV2Range(
+        o.codepointRange as api.GooglePrivacyDlpV2Range);
+    checkGooglePrivacyDlpV2Container(
+        o.container as api.GooglePrivacyDlpV2Container);
     checkUnnamed2938(o.contentLocations);
   }
   buildCounterGooglePrivacyDlpV2Location--;
@@ -3817,7 +3974,8 @@
     api.GooglePrivacyDlpV2MetadataLocation o) {
   buildCounterGooglePrivacyDlpV2MetadataLocation++;
   if (buildCounterGooglePrivacyDlpV2MetadataLocation < 3) {
-    checkGooglePrivacyDlpV2StorageMetadataLabel(o.storageLabel);
+    checkGooglePrivacyDlpV2StorageMetadataLabel(
+        o.storageLabel as api.GooglePrivacyDlpV2StorageMetadataLabel);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2MetadataLocation--;
@@ -3839,7 +3997,7 @@
     api.GooglePrivacyDlpV2NumericalStatsConfig o) {
   buildCounterGooglePrivacyDlpV2NumericalStatsConfig++;
   if (buildCounterGooglePrivacyDlpV2NumericalStatsConfig < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.field);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
   }
   buildCounterGooglePrivacyDlpV2NumericalStatsConfig--;
 }
@@ -3853,8 +4011,8 @@
 
 void checkUnnamed2939(core.List<api.GooglePrivacyDlpV2Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Value(o[0]);
-  checkGooglePrivacyDlpV2Value(o[1]);
+  checkGooglePrivacyDlpV2Value(o[0] as api.GooglePrivacyDlpV2Value);
+  checkGooglePrivacyDlpV2Value(o[1] as api.GooglePrivacyDlpV2Value);
 }
 
 core.int buildCounterGooglePrivacyDlpV2NumericalStatsResult = 0;
@@ -3875,8 +4033,8 @@
     api.GooglePrivacyDlpV2NumericalStatsResult o) {
   buildCounterGooglePrivacyDlpV2NumericalStatsResult++;
   if (buildCounterGooglePrivacyDlpV2NumericalStatsResult < 3) {
-    checkGooglePrivacyDlpV2Value(o.maxValue);
-    checkGooglePrivacyDlpV2Value(o.minValue);
+    checkGooglePrivacyDlpV2Value(o.maxValue as api.GooglePrivacyDlpV2Value);
+    checkGooglePrivacyDlpV2Value(o.minValue as api.GooglePrivacyDlpV2Value);
     checkUnnamed2939(o.quantileValues);
   }
   buildCounterGooglePrivacyDlpV2NumericalStatsResult--;
@@ -3900,7 +4058,8 @@
   buildCounterGooglePrivacyDlpV2OutputStorageConfig++;
   if (buildCounterGooglePrivacyDlpV2OutputStorageConfig < 3) {
     unittest.expect(o.outputSchema, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2BigQueryTable(o.table);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.table as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2OutputStorageConfig--;
 }
@@ -3979,20 +4138,28 @@
     api.GooglePrivacyDlpV2PrimitiveTransformation o) {
   buildCounterGooglePrivacyDlpV2PrimitiveTransformation++;
   if (buildCounterGooglePrivacyDlpV2PrimitiveTransformation < 3) {
-    checkGooglePrivacyDlpV2BucketingConfig(o.bucketingConfig);
-    checkGooglePrivacyDlpV2CharacterMaskConfig(o.characterMaskConfig);
-    checkGooglePrivacyDlpV2CryptoDeterministicConfig(
-        o.cryptoDeterministicConfig);
-    checkGooglePrivacyDlpV2CryptoHashConfig(o.cryptoHashConfig);
-    checkGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig(
-        o.cryptoReplaceFfxFpeConfig);
-    checkGooglePrivacyDlpV2DateShiftConfig(o.dateShiftConfig);
-    checkGooglePrivacyDlpV2FixedSizeBucketingConfig(o.fixedSizeBucketingConfig);
-    checkGooglePrivacyDlpV2RedactConfig(o.redactConfig);
-    checkGooglePrivacyDlpV2ReplaceValueConfig(o.replaceConfig);
-    checkGooglePrivacyDlpV2ReplaceWithInfoTypeConfig(
-        o.replaceWithInfoTypeConfig);
-    checkGooglePrivacyDlpV2TimePartConfig(o.timePartConfig);
+    checkGooglePrivacyDlpV2BucketingConfig(
+        o.bucketingConfig as api.GooglePrivacyDlpV2BucketingConfig);
+    checkGooglePrivacyDlpV2CharacterMaskConfig(
+        o.characterMaskConfig as api.GooglePrivacyDlpV2CharacterMaskConfig);
+    checkGooglePrivacyDlpV2CryptoDeterministicConfig(o.cryptoDeterministicConfig
+        as api.GooglePrivacyDlpV2CryptoDeterministicConfig);
+    checkGooglePrivacyDlpV2CryptoHashConfig(
+        o.cryptoHashConfig as api.GooglePrivacyDlpV2CryptoHashConfig);
+    checkGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig(o.cryptoReplaceFfxFpeConfig
+        as api.GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig);
+    checkGooglePrivacyDlpV2DateShiftConfig(
+        o.dateShiftConfig as api.GooglePrivacyDlpV2DateShiftConfig);
+    checkGooglePrivacyDlpV2FixedSizeBucketingConfig(o.fixedSizeBucketingConfig
+        as api.GooglePrivacyDlpV2FixedSizeBucketingConfig);
+    checkGooglePrivacyDlpV2RedactConfig(
+        o.redactConfig as api.GooglePrivacyDlpV2RedactConfig);
+    checkGooglePrivacyDlpV2ReplaceValueConfig(
+        o.replaceConfig as api.GooglePrivacyDlpV2ReplaceValueConfig);
+    checkGooglePrivacyDlpV2ReplaceWithInfoTypeConfig(o.replaceWithInfoTypeConfig
+        as api.GooglePrivacyDlpV2ReplaceWithInfoTypeConfig);
+    checkGooglePrivacyDlpV2TimePartConfig(
+        o.timePartConfig as api.GooglePrivacyDlpV2TimePartConfig);
   }
   buildCounterGooglePrivacyDlpV2PrimitiveTransformation--;
 }
@@ -4018,13 +4185,19 @@
     api.GooglePrivacyDlpV2PrivacyMetric o) {
   buildCounterGooglePrivacyDlpV2PrivacyMetric++;
   if (buildCounterGooglePrivacyDlpV2PrivacyMetric < 3) {
-    checkGooglePrivacyDlpV2CategoricalStatsConfig(o.categoricalStatsConfig);
+    checkGooglePrivacyDlpV2CategoricalStatsConfig(o.categoricalStatsConfig
+        as api.GooglePrivacyDlpV2CategoricalStatsConfig);
     checkGooglePrivacyDlpV2DeltaPresenceEstimationConfig(
-        o.deltaPresenceEstimationConfig);
-    checkGooglePrivacyDlpV2KAnonymityConfig(o.kAnonymityConfig);
-    checkGooglePrivacyDlpV2KMapEstimationConfig(o.kMapEstimationConfig);
-    checkGooglePrivacyDlpV2LDiversityConfig(o.lDiversityConfig);
-    checkGooglePrivacyDlpV2NumericalStatsConfig(o.numericalStatsConfig);
+        o.deltaPresenceEstimationConfig
+            as api.GooglePrivacyDlpV2DeltaPresenceEstimationConfig);
+    checkGooglePrivacyDlpV2KAnonymityConfig(
+        o.kAnonymityConfig as api.GooglePrivacyDlpV2KAnonymityConfig);
+    checkGooglePrivacyDlpV2KMapEstimationConfig(
+        o.kMapEstimationConfig as api.GooglePrivacyDlpV2KMapEstimationConfig);
+    checkGooglePrivacyDlpV2LDiversityConfig(
+        o.lDiversityConfig as api.GooglePrivacyDlpV2LDiversityConfig);
+    checkGooglePrivacyDlpV2NumericalStatsConfig(
+        o.numericalStatsConfig as api.GooglePrivacyDlpV2NumericalStatsConfig);
   }
   buildCounterGooglePrivacyDlpV2PrivacyMetric--;
 }
@@ -4139,9 +4312,10 @@
   buildCounterGooglePrivacyDlpV2QuasiId++;
   if (buildCounterGooglePrivacyDlpV2QuasiId < 3) {
     unittest.expect(o.customTag, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2FieldId(o.field);
-    checkGoogleProtobufEmpty(o.inferred);
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
+    checkGoogleProtobufEmpty(o.inferred as api.GoogleProtobufEmpty);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
   }
   buildCounterGooglePrivacyDlpV2QuasiId--;
 }
@@ -4162,7 +4336,7 @@
   buildCounterGooglePrivacyDlpV2QuasiIdField++;
   if (buildCounterGooglePrivacyDlpV2QuasiIdField < 3) {
     unittest.expect(o.customTag, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2FieldId(o.field);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
   }
   buildCounterGooglePrivacyDlpV2QuasiIdField--;
 }
@@ -4185,7 +4359,7 @@
   buildCounterGooglePrivacyDlpV2QuasiIdentifierField++;
   if (buildCounterGooglePrivacyDlpV2QuasiIdentifierField < 3) {
     unittest.expect(o.customTag, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2FieldId(o.field);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
   }
   buildCounterGooglePrivacyDlpV2QuasiIdentifierField--;
 }
@@ -4204,7 +4378,8 @@
 void checkGooglePrivacyDlpV2QuoteInfo(api.GooglePrivacyDlpV2QuoteInfo o) {
   buildCounterGooglePrivacyDlpV2QuoteInfo++;
   if (buildCounterGooglePrivacyDlpV2QuoteInfo < 3) {
-    checkGooglePrivacyDlpV2DateTime(o.dateTime);
+    checkGooglePrivacyDlpV2DateTime(
+        o.dateTime as api.GooglePrivacyDlpV2DateTime);
   }
   buildCounterGooglePrivacyDlpV2QuoteInfo--;
 }
@@ -4245,7 +4420,8 @@
     api.GooglePrivacyDlpV2RecordCondition o) {
   buildCounterGooglePrivacyDlpV2RecordCondition++;
   if (buildCounterGooglePrivacyDlpV2RecordCondition < 3) {
-    checkGooglePrivacyDlpV2Expressions(o.expressions);
+    checkGooglePrivacyDlpV2Expressions(
+        o.expressions as api.GooglePrivacyDlpV2Expressions);
   }
   buildCounterGooglePrivacyDlpV2RecordCondition--;
 }
@@ -4279,8 +4455,10 @@
 void checkGooglePrivacyDlpV2RecordKey(api.GooglePrivacyDlpV2RecordKey o) {
   buildCounterGooglePrivacyDlpV2RecordKey++;
   if (buildCounterGooglePrivacyDlpV2RecordKey < 3) {
-    checkGooglePrivacyDlpV2BigQueryKey(o.bigQueryKey);
-    checkGooglePrivacyDlpV2DatastoreKey(o.datastoreKey);
+    checkGooglePrivacyDlpV2BigQueryKey(
+        o.bigQueryKey as api.GooglePrivacyDlpV2BigQueryKey);
+    checkGooglePrivacyDlpV2DatastoreKey(
+        o.datastoreKey as api.GooglePrivacyDlpV2DatastoreKey);
     checkUnnamed2940(o.idValues);
   }
   buildCounterGooglePrivacyDlpV2RecordKey--;
@@ -4303,9 +4481,11 @@
     api.GooglePrivacyDlpV2RecordLocation o) {
   buildCounterGooglePrivacyDlpV2RecordLocation++;
   if (buildCounterGooglePrivacyDlpV2RecordLocation < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.fieldId);
-    checkGooglePrivacyDlpV2RecordKey(o.recordKey);
-    checkGooglePrivacyDlpV2TableLocation(o.tableLocation);
+    checkGooglePrivacyDlpV2FieldId(o.fieldId as api.GooglePrivacyDlpV2FieldId);
+    checkGooglePrivacyDlpV2RecordKey(
+        o.recordKey as api.GooglePrivacyDlpV2RecordKey);
+    checkGooglePrivacyDlpV2TableLocation(
+        o.tableLocation as api.GooglePrivacyDlpV2TableLocation);
   }
   buildCounterGooglePrivacyDlpV2RecordLocation--;
 }
@@ -4326,7 +4506,8 @@
     api.GooglePrivacyDlpV2RecordSuppression o) {
   buildCounterGooglePrivacyDlpV2RecordSuppression++;
   if (buildCounterGooglePrivacyDlpV2RecordSuppression < 3) {
-    checkGooglePrivacyDlpV2RecordCondition(o.condition);
+    checkGooglePrivacyDlpV2RecordCondition(
+        o.condition as api.GooglePrivacyDlpV2RecordCondition);
   }
   buildCounterGooglePrivacyDlpV2RecordSuppression--;
 }
@@ -4340,8 +4521,10 @@
 
 void checkUnnamed2941(core.List<api.GooglePrivacyDlpV2FieldTransformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldTransformation(o[0]);
-  checkGooglePrivacyDlpV2FieldTransformation(o[1]);
+  checkGooglePrivacyDlpV2FieldTransformation(
+      o[0] as api.GooglePrivacyDlpV2FieldTransformation);
+  checkGooglePrivacyDlpV2FieldTransformation(
+      o[1] as api.GooglePrivacyDlpV2FieldTransformation);
 }
 
 core.List<api.GooglePrivacyDlpV2RecordSuppression> buildUnnamed2942() {
@@ -4353,8 +4536,10 @@
 
 void checkUnnamed2942(core.List<api.GooglePrivacyDlpV2RecordSuppression> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2RecordSuppression(o[0]);
-  checkGooglePrivacyDlpV2RecordSuppression(o[1]);
+  checkGooglePrivacyDlpV2RecordSuppression(
+      o[0] as api.GooglePrivacyDlpV2RecordSuppression);
+  checkGooglePrivacyDlpV2RecordSuppression(
+      o[1] as api.GooglePrivacyDlpV2RecordSuppression);
 }
 
 core.int buildCounterGooglePrivacyDlpV2RecordTransformations = 0;
@@ -4404,8 +4589,10 @@
 
 void checkUnnamed2943(core.List<api.GooglePrivacyDlpV2ImageRedactionConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2ImageRedactionConfig(o[0]);
-  checkGooglePrivacyDlpV2ImageRedactionConfig(o[1]);
+  checkGooglePrivacyDlpV2ImageRedactionConfig(
+      o[0] as api.GooglePrivacyDlpV2ImageRedactionConfig);
+  checkGooglePrivacyDlpV2ImageRedactionConfig(
+      o[1] as api.GooglePrivacyDlpV2ImageRedactionConfig);
 }
 
 core.int buildCounterGooglePrivacyDlpV2RedactImageRequest = 0;
@@ -4428,10 +4615,12 @@
     api.GooglePrivacyDlpV2RedactImageRequest o) {
   buildCounterGooglePrivacyDlpV2RedactImageRequest++;
   if (buildCounterGooglePrivacyDlpV2RedactImageRequest < 3) {
-    checkGooglePrivacyDlpV2ByteContentItem(o.byteItem);
+    checkGooglePrivacyDlpV2ByteContentItem(
+        o.byteItem as api.GooglePrivacyDlpV2ByteContentItem);
     checkUnnamed2943(o.imageRedactionConfigs);
     unittest.expect(o.includeFindings, unittest.isTrue);
-    checkGooglePrivacyDlpV2InspectConfig(o.inspectConfig);
+    checkGooglePrivacyDlpV2InspectConfig(
+        o.inspectConfig as api.GooglePrivacyDlpV2InspectConfig);
     unittest.expect(o.locationId, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2RedactImageRequest--;
@@ -4456,7 +4645,8 @@
   buildCounterGooglePrivacyDlpV2RedactImageResponse++;
   if (buildCounterGooglePrivacyDlpV2RedactImageResponse < 3) {
     unittest.expect(o.extractedText, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2InspectResult(o.inspectResult);
+    checkGooglePrivacyDlpV2InspectResult(
+        o.inspectResult as api.GooglePrivacyDlpV2InspectResult);
     unittest.expect(o.redactedImage, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2RedactImageResponse--;
@@ -4517,11 +4707,14 @@
     api.GooglePrivacyDlpV2ReidentifyContentRequest o) {
   buildCounterGooglePrivacyDlpV2ReidentifyContentRequest++;
   if (buildCounterGooglePrivacyDlpV2ReidentifyContentRequest < 3) {
-    checkGooglePrivacyDlpV2InspectConfig(o.inspectConfig);
+    checkGooglePrivacyDlpV2InspectConfig(
+        o.inspectConfig as api.GooglePrivacyDlpV2InspectConfig);
     unittest.expect(o.inspectTemplateName, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2ContentItem(o.item);
+    checkGooglePrivacyDlpV2ContentItem(
+        o.item as api.GooglePrivacyDlpV2ContentItem);
     unittest.expect(o.locationId, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2DeidentifyConfig(o.reidentifyConfig);
+    checkGooglePrivacyDlpV2DeidentifyConfig(
+        o.reidentifyConfig as api.GooglePrivacyDlpV2DeidentifyConfig);
     unittest.expect(o.reidentifyTemplateName, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2ReidentifyContentRequest--;
@@ -4544,8 +4737,10 @@
     api.GooglePrivacyDlpV2ReidentifyContentResponse o) {
   buildCounterGooglePrivacyDlpV2ReidentifyContentResponse++;
   if (buildCounterGooglePrivacyDlpV2ReidentifyContentResponse < 3) {
-    checkGooglePrivacyDlpV2ContentItem(o.item);
-    checkGooglePrivacyDlpV2TransformationOverview(o.overview);
+    checkGooglePrivacyDlpV2ContentItem(
+        o.item as api.GooglePrivacyDlpV2ContentItem);
+    checkGooglePrivacyDlpV2TransformationOverview(
+        o.overview as api.GooglePrivacyDlpV2TransformationOverview);
   }
   buildCounterGooglePrivacyDlpV2ReidentifyContentResponse--;
 }
@@ -4566,7 +4761,7 @@
     api.GooglePrivacyDlpV2ReplaceValueConfig o) {
   buildCounterGooglePrivacyDlpV2ReplaceValueConfig++;
   if (buildCounterGooglePrivacyDlpV2ReplaceValueConfig < 3) {
-    checkGooglePrivacyDlpV2Value(o.newValue);
+    checkGooglePrivacyDlpV2Value(o.newValue as api.GooglePrivacyDlpV2Value);
   }
   buildCounterGooglePrivacyDlpV2ReplaceValueConfig--;
 }
@@ -4605,8 +4800,10 @@
     api.GooglePrivacyDlpV2RequestedOptions o) {
   buildCounterGooglePrivacyDlpV2RequestedOptions++;
   if (buildCounterGooglePrivacyDlpV2RequestedOptions < 3) {
-    checkGooglePrivacyDlpV2InspectJobConfig(o.jobConfig);
-    checkGooglePrivacyDlpV2InspectTemplate(o.snapshotInspectTemplate);
+    checkGooglePrivacyDlpV2InspectJobConfig(
+        o.jobConfig as api.GooglePrivacyDlpV2InspectJobConfig);
+    checkGooglePrivacyDlpV2InspectTemplate(
+        o.snapshotInspectTemplate as api.GooglePrivacyDlpV2InspectTemplate);
   }
   buildCounterGooglePrivacyDlpV2RequestedOptions--;
 }
@@ -4627,7 +4824,8 @@
     api.GooglePrivacyDlpV2RequestedRiskAnalysisOptions o) {
   buildCounterGooglePrivacyDlpV2RequestedRiskAnalysisOptions++;
   if (buildCounterGooglePrivacyDlpV2RequestedRiskAnalysisOptions < 3) {
-    checkGooglePrivacyDlpV2RiskAnalysisJobConfig(o.jobConfig);
+    checkGooglePrivacyDlpV2RiskAnalysisJobConfig(
+        o.jobConfig as api.GooglePrivacyDlpV2RiskAnalysisJobConfig);
   }
   buildCounterGooglePrivacyDlpV2RequestedRiskAnalysisOptions--;
 }
@@ -4641,8 +4839,10 @@
 
 void checkUnnamed2945(core.List<api.GooglePrivacyDlpV2InfoTypeStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2InfoTypeStats(o[0]);
-  checkGooglePrivacyDlpV2InfoTypeStats(o[1]);
+  checkGooglePrivacyDlpV2InfoTypeStats(
+      o[0] as api.GooglePrivacyDlpV2InfoTypeStats);
+  checkGooglePrivacyDlpV2InfoTypeStats(
+      o[1] as api.GooglePrivacyDlpV2InfoTypeStats);
 }
 
 core.int buildCounterGooglePrivacyDlpV2Result = 0;
@@ -4662,7 +4862,8 @@
 void checkGooglePrivacyDlpV2Result(api.GooglePrivacyDlpV2Result o) {
   buildCounterGooglePrivacyDlpV2Result++;
   if (buildCounterGooglePrivacyDlpV2Result < 3) {
-    checkGooglePrivacyDlpV2HybridInspectStatistics(o.hybridStats);
+    checkGooglePrivacyDlpV2HybridInspectStatistics(
+        o.hybridStats as api.GooglePrivacyDlpV2HybridInspectStatistics);
     checkUnnamed2945(o.infoTypeStats);
     unittest.expect(o.processedBytes, unittest.equals('foo'));
     unittest.expect(o.totalEstimatedBytes, unittest.equals('foo'));
@@ -4679,8 +4880,8 @@
 
 void checkUnnamed2946(core.List<api.GooglePrivacyDlpV2Action> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Action(o[0]);
-  checkGooglePrivacyDlpV2Action(o[1]);
+  checkGooglePrivacyDlpV2Action(o[0] as api.GooglePrivacyDlpV2Action);
+  checkGooglePrivacyDlpV2Action(o[1] as api.GooglePrivacyDlpV2Action);
 }
 
 core.int buildCounterGooglePrivacyDlpV2RiskAnalysisJobConfig = 0;
@@ -4702,8 +4903,10 @@
   buildCounterGooglePrivacyDlpV2RiskAnalysisJobConfig++;
   if (buildCounterGooglePrivacyDlpV2RiskAnalysisJobConfig < 3) {
     checkUnnamed2946(o.actions);
-    checkGooglePrivacyDlpV2PrivacyMetric(o.privacyMetric);
-    checkGooglePrivacyDlpV2BigQueryTable(o.sourceTable);
+    checkGooglePrivacyDlpV2PrivacyMetric(
+        o.privacyMetric as api.GooglePrivacyDlpV2PrivacyMetric);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.sourceTable as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2RiskAnalysisJobConfig--;
 }
@@ -4717,8 +4920,8 @@
 
 void checkUnnamed2947(core.List<api.GooglePrivacyDlpV2Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Value(o[0]);
-  checkGooglePrivacyDlpV2Value(o[1]);
+  checkGooglePrivacyDlpV2Value(o[0] as api.GooglePrivacyDlpV2Value);
+  checkGooglePrivacyDlpV2Value(o[1] as api.GooglePrivacyDlpV2Value);
 }
 
 core.int buildCounterGooglePrivacyDlpV2Row = 0;
@@ -4754,7 +4957,8 @@
 void checkGooglePrivacyDlpV2SaveFindings(api.GooglePrivacyDlpV2SaveFindings o) {
   buildCounterGooglePrivacyDlpV2SaveFindings++;
   if (buildCounterGooglePrivacyDlpV2SaveFindings < 3) {
-    checkGooglePrivacyDlpV2OutputStorageConfig(o.outputConfig);
+    checkGooglePrivacyDlpV2OutputStorageConfig(
+        o.outputConfig as api.GooglePrivacyDlpV2OutputStorageConfig);
   }
   buildCounterGooglePrivacyDlpV2SaveFindings--;
 }
@@ -4787,8 +4991,10 @@
 
 void checkUnnamed2948(core.List<api.GooglePrivacyDlpV2QuasiIdentifierField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2QuasiIdentifierField(o[0]);
-  checkGooglePrivacyDlpV2QuasiIdentifierField(o[1]);
+  checkGooglePrivacyDlpV2QuasiIdentifierField(
+      o[0] as api.GooglePrivacyDlpV2QuasiIdentifierField);
+  checkGooglePrivacyDlpV2QuasiIdentifierField(
+      o[1] as api.GooglePrivacyDlpV2QuasiIdentifierField);
 }
 
 core.int buildCounterGooglePrivacyDlpV2StatisticalTable = 0;
@@ -4810,8 +5016,10 @@
   buildCounterGooglePrivacyDlpV2StatisticalTable++;
   if (buildCounterGooglePrivacyDlpV2StatisticalTable < 3) {
     checkUnnamed2948(o.quasiIds);
-    checkGooglePrivacyDlpV2FieldId(o.relativeFrequency);
-    checkGooglePrivacyDlpV2BigQueryTable(o.table);
+    checkGooglePrivacyDlpV2FieldId(
+        o.relativeFrequency as api.GooglePrivacyDlpV2FieldId);
+    checkGooglePrivacyDlpV2BigQueryTable(
+        o.table as api.GooglePrivacyDlpV2BigQueryTable);
   }
   buildCounterGooglePrivacyDlpV2StatisticalTable--;
 }
@@ -4835,11 +5043,16 @@
     api.GooglePrivacyDlpV2StorageConfig o) {
   buildCounterGooglePrivacyDlpV2StorageConfig++;
   if (buildCounterGooglePrivacyDlpV2StorageConfig < 3) {
-    checkGooglePrivacyDlpV2BigQueryOptions(o.bigQueryOptions);
-    checkGooglePrivacyDlpV2CloudStorageOptions(o.cloudStorageOptions);
-    checkGooglePrivacyDlpV2DatastoreOptions(o.datastoreOptions);
-    checkGooglePrivacyDlpV2HybridOptions(o.hybridOptions);
-    checkGooglePrivacyDlpV2TimespanConfig(o.timespanConfig);
+    checkGooglePrivacyDlpV2BigQueryOptions(
+        o.bigQueryOptions as api.GooglePrivacyDlpV2BigQueryOptions);
+    checkGooglePrivacyDlpV2CloudStorageOptions(
+        o.cloudStorageOptions as api.GooglePrivacyDlpV2CloudStorageOptions);
+    checkGooglePrivacyDlpV2DatastoreOptions(
+        o.datastoreOptions as api.GooglePrivacyDlpV2DatastoreOptions);
+    checkGooglePrivacyDlpV2HybridOptions(
+        o.hybridOptions as api.GooglePrivacyDlpV2HybridOptions);
+    checkGooglePrivacyDlpV2TimespanConfig(
+        o.timespanConfig as api.GooglePrivacyDlpV2TimespanConfig);
   }
   buildCounterGooglePrivacyDlpV2StorageConfig--;
 }
@@ -4875,8 +5088,10 @@
 void checkUnnamed2949(
     core.List<api.GooglePrivacyDlpV2StoredInfoTypeVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2StoredInfoTypeVersion(o[0]);
-  checkGooglePrivacyDlpV2StoredInfoTypeVersion(o[1]);
+  checkGooglePrivacyDlpV2StoredInfoTypeVersion(
+      o[0] as api.GooglePrivacyDlpV2StoredInfoTypeVersion);
+  checkGooglePrivacyDlpV2StoredInfoTypeVersion(
+      o[1] as api.GooglePrivacyDlpV2StoredInfoTypeVersion);
 }
 
 core.int buildCounterGooglePrivacyDlpV2StoredInfoType = 0;
@@ -4896,7 +5111,8 @@
     api.GooglePrivacyDlpV2StoredInfoType o) {
   buildCounterGooglePrivacyDlpV2StoredInfoType++;
   if (buildCounterGooglePrivacyDlpV2StoredInfoType < 3) {
-    checkGooglePrivacyDlpV2StoredInfoTypeVersion(o.currentVersion);
+    checkGooglePrivacyDlpV2StoredInfoTypeVersion(
+        o.currentVersion as api.GooglePrivacyDlpV2StoredInfoTypeVersion);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2949(o.pendingVersions);
   }
@@ -4925,10 +5141,12 @@
   buildCounterGooglePrivacyDlpV2StoredInfoTypeConfig++;
   if (buildCounterGooglePrivacyDlpV2StoredInfoTypeConfig < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2Dictionary(o.dictionary);
+    checkGooglePrivacyDlpV2Dictionary(
+        o.dictionary as api.GooglePrivacyDlpV2Dictionary);
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2LargeCustomDictionaryConfig(o.largeCustomDictionary);
-    checkGooglePrivacyDlpV2Regex(o.regex);
+    checkGooglePrivacyDlpV2LargeCustomDictionaryConfig(o.largeCustomDictionary
+        as api.GooglePrivacyDlpV2LargeCustomDictionaryConfig);
+    checkGooglePrivacyDlpV2Regex(o.regex as api.GooglePrivacyDlpV2Regex);
   }
   buildCounterGooglePrivacyDlpV2StoredInfoTypeConfig--;
 }
@@ -4950,7 +5168,8 @@
     api.GooglePrivacyDlpV2StoredInfoTypeStats o) {
   buildCounterGooglePrivacyDlpV2StoredInfoTypeStats++;
   if (buildCounterGooglePrivacyDlpV2StoredInfoTypeStats < 3) {
-    checkGooglePrivacyDlpV2LargeCustomDictionaryStats(o.largeCustomDictionary);
+    checkGooglePrivacyDlpV2LargeCustomDictionaryStats(o.largeCustomDictionary
+        as api.GooglePrivacyDlpV2LargeCustomDictionaryStats);
   }
   buildCounterGooglePrivacyDlpV2StoredInfoTypeStats--;
 }
@@ -4964,8 +5183,8 @@
 
 void checkUnnamed2950(core.List<api.GooglePrivacyDlpV2Error> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Error(o[0]);
-  checkGooglePrivacyDlpV2Error(o[1]);
+  checkGooglePrivacyDlpV2Error(o[0] as api.GooglePrivacyDlpV2Error);
+  checkGooglePrivacyDlpV2Error(o[1] as api.GooglePrivacyDlpV2Error);
 }
 
 core.int buildCounterGooglePrivacyDlpV2StoredInfoTypeVersion = 0;
@@ -4988,11 +5207,13 @@
     api.GooglePrivacyDlpV2StoredInfoTypeVersion o) {
   buildCounterGooglePrivacyDlpV2StoredInfoTypeVersion++;
   if (buildCounterGooglePrivacyDlpV2StoredInfoTypeVersion < 3) {
-    checkGooglePrivacyDlpV2StoredInfoTypeConfig(o.config);
+    checkGooglePrivacyDlpV2StoredInfoTypeConfig(
+        o.config as api.GooglePrivacyDlpV2StoredInfoTypeConfig);
     unittest.expect(o.createTime, unittest.equals('foo'));
     checkUnnamed2950(o.errors);
     unittest.expect(o.state, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2StoredInfoTypeStats(o.stats);
+    checkGooglePrivacyDlpV2StoredInfoTypeStats(
+        o.stats as api.GooglePrivacyDlpV2StoredInfoTypeStats);
   }
   buildCounterGooglePrivacyDlpV2StoredInfoTypeVersion--;
 }
@@ -5067,8 +5288,8 @@
 
 void checkUnnamed2951(core.List<api.GooglePrivacyDlpV2FieldId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldId(o[0]);
-  checkGooglePrivacyDlpV2FieldId(o[1]);
+  checkGooglePrivacyDlpV2FieldId(o[0] as api.GooglePrivacyDlpV2FieldId);
+  checkGooglePrivacyDlpV2FieldId(o[1] as api.GooglePrivacyDlpV2FieldId);
 }
 
 core.List<api.GooglePrivacyDlpV2Row> buildUnnamed2952() {
@@ -5080,8 +5301,8 @@
 
 void checkUnnamed2952(core.List<api.GooglePrivacyDlpV2Row> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2Row(o[0]);
-  checkGooglePrivacyDlpV2Row(o[1]);
+  checkGooglePrivacyDlpV2Row(o[0] as api.GooglePrivacyDlpV2Row);
+  checkGooglePrivacyDlpV2Row(o[1] as api.GooglePrivacyDlpV2Row);
 }
 
 core.int buildCounterGooglePrivacyDlpV2Table = 0;
@@ -5134,8 +5355,8 @@
 
 void checkUnnamed2953(core.List<api.GooglePrivacyDlpV2FieldId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldId(o[0]);
-  checkGooglePrivacyDlpV2FieldId(o[1]);
+  checkGooglePrivacyDlpV2FieldId(o[0] as api.GooglePrivacyDlpV2FieldId);
+  checkGooglePrivacyDlpV2FieldId(o[1] as api.GooglePrivacyDlpV2FieldId);
 }
 
 core.int buildCounterGooglePrivacyDlpV2TableOptions = 0;
@@ -5175,9 +5396,10 @@
   buildCounterGooglePrivacyDlpV2TaggedField++;
   if (buildCounterGooglePrivacyDlpV2TaggedField < 3) {
     unittest.expect(o.customTag, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2FieldId(o.field);
-    checkGoogleProtobufEmpty(o.inferred);
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
+    checkGoogleProtobufEmpty(o.inferred as api.GoogleProtobufEmpty);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
   }
   buildCounterGooglePrivacyDlpV2TaggedField--;
 }
@@ -5257,7 +5479,8 @@
     unittest.expect(o.enableAutoPopulationOfTimespanConfig, unittest.isTrue);
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2FieldId(o.timestampField);
+    checkGooglePrivacyDlpV2FieldId(
+        o.timestampField as api.GooglePrivacyDlpV2FieldId);
   }
   buildCounterGooglePrivacyDlpV2TimespanConfig--;
 }
@@ -5279,8 +5502,10 @@
     api.GooglePrivacyDlpV2TransformationErrorHandling o) {
   buildCounterGooglePrivacyDlpV2TransformationErrorHandling++;
   if (buildCounterGooglePrivacyDlpV2TransformationErrorHandling < 3) {
-    checkGooglePrivacyDlpV2LeaveUntransformed(o.leaveUntransformed);
-    checkGooglePrivacyDlpV2ThrowError(o.throwError);
+    checkGooglePrivacyDlpV2LeaveUntransformed(
+        o.leaveUntransformed as api.GooglePrivacyDlpV2LeaveUntransformed);
+    checkGooglePrivacyDlpV2ThrowError(
+        o.throwError as api.GooglePrivacyDlpV2ThrowError);
   }
   buildCounterGooglePrivacyDlpV2TransformationErrorHandling--;
 }
@@ -5295,8 +5520,10 @@
 void checkUnnamed2954(
     core.List<api.GooglePrivacyDlpV2TransformationSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2TransformationSummary(o[0]);
-  checkGooglePrivacyDlpV2TransformationSummary(o[1]);
+  checkGooglePrivacyDlpV2TransformationSummary(
+      o[0] as api.GooglePrivacyDlpV2TransformationSummary);
+  checkGooglePrivacyDlpV2TransformationSummary(
+      o[1] as api.GooglePrivacyDlpV2TransformationSummary);
 }
 
 core.int buildCounterGooglePrivacyDlpV2TransformationOverview = 0;
@@ -5331,8 +5558,10 @@
 
 void checkUnnamed2955(core.List<api.GooglePrivacyDlpV2FieldTransformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2FieldTransformation(o[0]);
-  checkGooglePrivacyDlpV2FieldTransformation(o[1]);
+  checkGooglePrivacyDlpV2FieldTransformation(
+      o[0] as api.GooglePrivacyDlpV2FieldTransformation);
+  checkGooglePrivacyDlpV2FieldTransformation(
+      o[1] as api.GooglePrivacyDlpV2FieldTransformation);
 }
 
 core.List<api.GooglePrivacyDlpV2SummaryResult> buildUnnamed2956() {
@@ -5344,8 +5573,10 @@
 
 void checkUnnamed2956(core.List<api.GooglePrivacyDlpV2SummaryResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGooglePrivacyDlpV2SummaryResult(o[0]);
-  checkGooglePrivacyDlpV2SummaryResult(o[1]);
+  checkGooglePrivacyDlpV2SummaryResult(
+      o[0] as api.GooglePrivacyDlpV2SummaryResult);
+  checkGooglePrivacyDlpV2SummaryResult(
+      o[1] as api.GooglePrivacyDlpV2SummaryResult);
 }
 
 core.int buildCounterGooglePrivacyDlpV2TransformationSummary = 0;
@@ -5370,12 +5601,15 @@
     api.GooglePrivacyDlpV2TransformationSummary o) {
   buildCounterGooglePrivacyDlpV2TransformationSummary++;
   if (buildCounterGooglePrivacyDlpV2TransformationSummary < 3) {
-    checkGooglePrivacyDlpV2FieldId(o.field);
+    checkGooglePrivacyDlpV2FieldId(o.field as api.GooglePrivacyDlpV2FieldId);
     checkUnnamed2955(o.fieldTransformations);
-    checkGooglePrivacyDlpV2InfoType(o.infoType);
-    checkGooglePrivacyDlpV2RecordSuppression(o.recordSuppress);
+    checkGooglePrivacyDlpV2InfoType(
+        o.infoType as api.GooglePrivacyDlpV2InfoType);
+    checkGooglePrivacyDlpV2RecordSuppression(
+        o.recordSuppress as api.GooglePrivacyDlpV2RecordSuppression);
     checkUnnamed2956(o.results);
-    checkGooglePrivacyDlpV2PrimitiveTransformation(o.transformation);
+    checkGooglePrivacyDlpV2PrimitiveTransformation(
+        o.transformation as api.GooglePrivacyDlpV2PrimitiveTransformation);
     unittest.expect(o.transformedBytes, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2TransformationSummary--;
@@ -5417,8 +5651,9 @@
 void checkGooglePrivacyDlpV2Trigger(api.GooglePrivacyDlpV2Trigger o) {
   buildCounterGooglePrivacyDlpV2Trigger++;
   if (buildCounterGooglePrivacyDlpV2Trigger < 3) {
-    checkGooglePrivacyDlpV2Manual(o.manual);
-    checkGooglePrivacyDlpV2Schedule(o.schedule);
+    checkGooglePrivacyDlpV2Manual(o.manual as api.GooglePrivacyDlpV2Manual);
+    checkGooglePrivacyDlpV2Schedule(
+        o.schedule as api.GooglePrivacyDlpV2Schedule);
   }
   buildCounterGooglePrivacyDlpV2Trigger--;
 }
@@ -5461,7 +5696,8 @@
     api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest o) {
   buildCounterGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest++;
   if (buildCounterGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest < 3) {
-    checkGooglePrivacyDlpV2DeidentifyTemplate(o.deidentifyTemplate);
+    checkGooglePrivacyDlpV2DeidentifyTemplate(
+        o.deidentifyTemplate as api.GooglePrivacyDlpV2DeidentifyTemplate);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest--;
@@ -5484,7 +5720,8 @@
     api.GooglePrivacyDlpV2UpdateInspectTemplateRequest o) {
   buildCounterGooglePrivacyDlpV2UpdateInspectTemplateRequest++;
   if (buildCounterGooglePrivacyDlpV2UpdateInspectTemplateRequest < 3) {
-    checkGooglePrivacyDlpV2InspectTemplate(o.inspectTemplate);
+    checkGooglePrivacyDlpV2InspectTemplate(
+        o.inspectTemplate as api.GooglePrivacyDlpV2InspectTemplate);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2UpdateInspectTemplateRequest--;
@@ -5507,7 +5744,8 @@
     api.GooglePrivacyDlpV2UpdateJobTriggerRequest o) {
   buildCounterGooglePrivacyDlpV2UpdateJobTriggerRequest++;
   if (buildCounterGooglePrivacyDlpV2UpdateJobTriggerRequest < 3) {
-    checkGooglePrivacyDlpV2JobTrigger(o.jobTrigger);
+    checkGooglePrivacyDlpV2JobTrigger(
+        o.jobTrigger as api.GooglePrivacyDlpV2JobTrigger);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2UpdateJobTriggerRequest--;
@@ -5530,7 +5768,8 @@
     api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest o) {
   buildCounterGooglePrivacyDlpV2UpdateStoredInfoTypeRequest++;
   if (buildCounterGooglePrivacyDlpV2UpdateStoredInfoTypeRequest < 3) {
-    checkGooglePrivacyDlpV2StoredInfoTypeConfig(o.config);
+    checkGooglePrivacyDlpV2StoredInfoTypeConfig(
+        o.config as api.GooglePrivacyDlpV2StoredInfoTypeConfig);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2UpdateStoredInfoTypeRequest--;
@@ -5558,12 +5797,12 @@
   buildCounterGooglePrivacyDlpV2Value++;
   if (buildCounterGooglePrivacyDlpV2Value < 3) {
     unittest.expect(o.booleanValue, unittest.isTrue);
-    checkGoogleTypeDate(o.dateValue);
+    checkGoogleTypeDate(o.dateValue as api.GoogleTypeDate);
     unittest.expect(o.dayOfWeekValue, unittest.equals('foo'));
     unittest.expect(o.floatValue, unittest.equals(42.0));
     unittest.expect(o.integerValue, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
-    checkGoogleTypeTimeOfDay(o.timeValue);
+    checkGoogleTypeTimeOfDay(o.timeValue as api.GoogleTypeTimeOfDay);
     unittest.expect(o.timestampValue, unittest.equals('foo'));
   }
   buildCounterGooglePrivacyDlpV2Value--;
@@ -5586,7 +5825,7 @@
   buildCounterGooglePrivacyDlpV2ValueFrequency++;
   if (buildCounterGooglePrivacyDlpV2ValueFrequency < 3) {
     unittest.expect(o.count, unittest.equals('foo'));
-    checkGooglePrivacyDlpV2Value(o.value);
+    checkGooglePrivacyDlpV2Value(o.value as api.GooglePrivacyDlpV2Value);
   }
   buildCounterGooglePrivacyDlpV2ValueFrequency--;
 }
@@ -5756,7 +5995,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Action();
       var od = api.GooglePrivacyDlpV2Action.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Action(od);
+      checkGooglePrivacyDlpV2Action(od as api.GooglePrivacyDlpV2Action);
     });
   });
 
@@ -5765,7 +6004,8 @@
       var o = buildGooglePrivacyDlpV2ActivateJobTriggerRequest();
       var od =
           api.GooglePrivacyDlpV2ActivateJobTriggerRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ActivateJobTriggerRequest(od);
+      checkGooglePrivacyDlpV2ActivateJobTriggerRequest(
+          od as api.GooglePrivacyDlpV2ActivateJobTriggerRequest);
     });
   });
 
@@ -5775,7 +6015,8 @@
       var o = buildGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails();
       var od = api.GooglePrivacyDlpV2AnalyzeDataSourceRiskDetails.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails(od);
+      checkGooglePrivacyDlpV2AnalyzeDataSourceRiskDetails(
+          od as api.GooglePrivacyDlpV2AnalyzeDataSourceRiskDetails);
     });
   });
 
@@ -5783,7 +6024,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2AuxiliaryTable();
       var od = api.GooglePrivacyDlpV2AuxiliaryTable.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2AuxiliaryTable(od);
+      checkGooglePrivacyDlpV2AuxiliaryTable(
+          od as api.GooglePrivacyDlpV2AuxiliaryTable);
     });
   });
 
@@ -5791,7 +6033,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2BigQueryField();
       var od = api.GooglePrivacyDlpV2BigQueryField.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2BigQueryField(od);
+      checkGooglePrivacyDlpV2BigQueryField(
+          od as api.GooglePrivacyDlpV2BigQueryField);
     });
   });
 
@@ -5799,7 +6042,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2BigQueryKey();
       var od = api.GooglePrivacyDlpV2BigQueryKey.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2BigQueryKey(od);
+      checkGooglePrivacyDlpV2BigQueryKey(
+          od as api.GooglePrivacyDlpV2BigQueryKey);
     });
   });
 
@@ -5807,7 +6051,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2BigQueryOptions();
       var od = api.GooglePrivacyDlpV2BigQueryOptions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2BigQueryOptions(od);
+      checkGooglePrivacyDlpV2BigQueryOptions(
+          od as api.GooglePrivacyDlpV2BigQueryOptions);
     });
   });
 
@@ -5815,7 +6060,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2BigQueryTable();
       var od = api.GooglePrivacyDlpV2BigQueryTable.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2BigQueryTable(od);
+      checkGooglePrivacyDlpV2BigQueryTable(
+          od as api.GooglePrivacyDlpV2BigQueryTable);
     });
   });
 
@@ -5823,7 +6069,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2BoundingBox();
       var od = api.GooglePrivacyDlpV2BoundingBox.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2BoundingBox(od);
+      checkGooglePrivacyDlpV2BoundingBox(
+          od as api.GooglePrivacyDlpV2BoundingBox);
     });
   });
 
@@ -5831,7 +6078,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Bucket();
       var od = api.GooglePrivacyDlpV2Bucket.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Bucket(od);
+      checkGooglePrivacyDlpV2Bucket(od as api.GooglePrivacyDlpV2Bucket);
     });
   });
 
@@ -5839,7 +6086,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2BucketingConfig();
       var od = api.GooglePrivacyDlpV2BucketingConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2BucketingConfig(od);
+      checkGooglePrivacyDlpV2BucketingConfig(
+          od as api.GooglePrivacyDlpV2BucketingConfig);
     });
   });
 
@@ -5847,7 +6095,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ByteContentItem();
       var od = api.GooglePrivacyDlpV2ByteContentItem.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ByteContentItem(od);
+      checkGooglePrivacyDlpV2ByteContentItem(
+          od as api.GooglePrivacyDlpV2ByteContentItem);
     });
   });
 
@@ -5855,7 +6104,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CancelDlpJobRequest();
       var od = api.GooglePrivacyDlpV2CancelDlpJobRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CancelDlpJobRequest(od);
+      checkGooglePrivacyDlpV2CancelDlpJobRequest(
+          od as api.GooglePrivacyDlpV2CancelDlpJobRequest);
     });
   });
 
@@ -5864,7 +6114,8 @@
       var o = buildGooglePrivacyDlpV2CategoricalStatsConfig();
       var od =
           api.GooglePrivacyDlpV2CategoricalStatsConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CategoricalStatsConfig(od);
+      checkGooglePrivacyDlpV2CategoricalStatsConfig(
+          od as api.GooglePrivacyDlpV2CategoricalStatsConfig);
     });
   });
 
@@ -5874,7 +6125,8 @@
       var o = buildGooglePrivacyDlpV2CategoricalStatsHistogramBucket();
       var od = api.GooglePrivacyDlpV2CategoricalStatsHistogramBucket.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2CategoricalStatsHistogramBucket(od);
+      checkGooglePrivacyDlpV2CategoricalStatsHistogramBucket(
+          od as api.GooglePrivacyDlpV2CategoricalStatsHistogramBucket);
     });
   });
 
@@ -5883,7 +6135,8 @@
       var o = buildGooglePrivacyDlpV2CategoricalStatsResult();
       var od =
           api.GooglePrivacyDlpV2CategoricalStatsResult.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CategoricalStatsResult(od);
+      checkGooglePrivacyDlpV2CategoricalStatsResult(
+          od as api.GooglePrivacyDlpV2CategoricalStatsResult);
     });
   });
 
@@ -5891,7 +6144,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CharacterMaskConfig();
       var od = api.GooglePrivacyDlpV2CharacterMaskConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CharacterMaskConfig(od);
+      checkGooglePrivacyDlpV2CharacterMaskConfig(
+          od as api.GooglePrivacyDlpV2CharacterMaskConfig);
     });
   });
 
@@ -5899,7 +6153,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CharsToIgnore();
       var od = api.GooglePrivacyDlpV2CharsToIgnore.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CharsToIgnore(od);
+      checkGooglePrivacyDlpV2CharsToIgnore(
+          od as api.GooglePrivacyDlpV2CharsToIgnore);
     });
   });
 
@@ -5907,7 +6162,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CloudStorageFileSet();
       var od = api.GooglePrivacyDlpV2CloudStorageFileSet.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CloudStorageFileSet(od);
+      checkGooglePrivacyDlpV2CloudStorageFileSet(
+          od as api.GooglePrivacyDlpV2CloudStorageFileSet);
     });
   });
 
@@ -5915,7 +6171,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CloudStorageOptions();
       var od = api.GooglePrivacyDlpV2CloudStorageOptions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CloudStorageOptions(od);
+      checkGooglePrivacyDlpV2CloudStorageOptions(
+          od as api.GooglePrivacyDlpV2CloudStorageOptions);
     });
   });
 
@@ -5923,7 +6180,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CloudStoragePath();
       var od = api.GooglePrivacyDlpV2CloudStoragePath.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CloudStoragePath(od);
+      checkGooglePrivacyDlpV2CloudStoragePath(
+          od as api.GooglePrivacyDlpV2CloudStoragePath);
     });
   });
 
@@ -5932,7 +6190,8 @@
       var o = buildGooglePrivacyDlpV2CloudStorageRegexFileSet();
       var od =
           api.GooglePrivacyDlpV2CloudStorageRegexFileSet.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CloudStorageRegexFileSet(od);
+      checkGooglePrivacyDlpV2CloudStorageRegexFileSet(
+          od as api.GooglePrivacyDlpV2CloudStorageRegexFileSet);
     });
   });
 
@@ -5940,7 +6199,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Color();
       var od = api.GooglePrivacyDlpV2Color.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Color(od);
+      checkGooglePrivacyDlpV2Color(od as api.GooglePrivacyDlpV2Color);
     });
   });
 
@@ -5948,7 +6207,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Condition();
       var od = api.GooglePrivacyDlpV2Condition.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Condition(od);
+      checkGooglePrivacyDlpV2Condition(od as api.GooglePrivacyDlpV2Condition);
     });
   });
 
@@ -5956,7 +6215,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Conditions();
       var od = api.GooglePrivacyDlpV2Conditions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Conditions(od);
+      checkGooglePrivacyDlpV2Conditions(od as api.GooglePrivacyDlpV2Conditions);
     });
   });
 
@@ -5964,7 +6223,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Container();
       var od = api.GooglePrivacyDlpV2Container.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Container(od);
+      checkGooglePrivacyDlpV2Container(od as api.GooglePrivacyDlpV2Container);
     });
   });
 
@@ -5972,7 +6231,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ContentItem();
       var od = api.GooglePrivacyDlpV2ContentItem.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ContentItem(od);
+      checkGooglePrivacyDlpV2ContentItem(
+          od as api.GooglePrivacyDlpV2ContentItem);
     });
   });
 
@@ -5980,7 +6240,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ContentLocation();
       var od = api.GooglePrivacyDlpV2ContentLocation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ContentLocation(od);
+      checkGooglePrivacyDlpV2ContentLocation(
+          od as api.GooglePrivacyDlpV2ContentLocation);
     });
   });
 
@@ -5990,7 +6251,8 @@
       var o = buildGooglePrivacyDlpV2CreateDeidentifyTemplateRequest();
       var od = api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(od);
+      checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(
+          od as api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest);
     });
   });
 
@@ -5998,7 +6260,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CreateDlpJobRequest();
       var od = api.GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CreateDlpJobRequest(od);
+      checkGooglePrivacyDlpV2CreateDlpJobRequest(
+          od as api.GooglePrivacyDlpV2CreateDlpJobRequest);
     });
   });
 
@@ -6008,7 +6271,8 @@
       var o = buildGooglePrivacyDlpV2CreateInspectTemplateRequest();
       var od = api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2CreateInspectTemplateRequest(od);
+      checkGooglePrivacyDlpV2CreateInspectTemplateRequest(
+          od as api.GooglePrivacyDlpV2CreateInspectTemplateRequest);
     });
   });
 
@@ -6017,7 +6281,8 @@
       var o = buildGooglePrivacyDlpV2CreateJobTriggerRequest();
       var od =
           api.GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CreateJobTriggerRequest(od);
+      checkGooglePrivacyDlpV2CreateJobTriggerRequest(
+          od as api.GooglePrivacyDlpV2CreateJobTriggerRequest);
     });
   });
 
@@ -6027,7 +6292,8 @@
       var o = buildGooglePrivacyDlpV2CreateStoredInfoTypeRequest();
       var od = api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(od);
+      checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(
+          od as api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest);
     });
   });
 
@@ -6036,7 +6302,8 @@
       var o = buildGooglePrivacyDlpV2CryptoDeterministicConfig();
       var od =
           api.GooglePrivacyDlpV2CryptoDeterministicConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CryptoDeterministicConfig(od);
+      checkGooglePrivacyDlpV2CryptoDeterministicConfig(
+          od as api.GooglePrivacyDlpV2CryptoDeterministicConfig);
     });
   });
 
@@ -6044,7 +6311,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CryptoHashConfig();
       var od = api.GooglePrivacyDlpV2CryptoHashConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CryptoHashConfig(od);
+      checkGooglePrivacyDlpV2CryptoHashConfig(
+          od as api.GooglePrivacyDlpV2CryptoHashConfig);
     });
   });
 
@@ -6052,7 +6320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CryptoKey();
       var od = api.GooglePrivacyDlpV2CryptoKey.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CryptoKey(od);
+      checkGooglePrivacyDlpV2CryptoKey(od as api.GooglePrivacyDlpV2CryptoKey);
     });
   });
 
@@ -6061,7 +6329,8 @@
       var o = buildGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig();
       var od =
           api.GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig(od);
+      checkGooglePrivacyDlpV2CryptoReplaceFfxFpeConfig(
+          od as api.GooglePrivacyDlpV2CryptoReplaceFfxFpeConfig);
     });
   });
 
@@ -6069,7 +6338,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2CustomInfoType();
       var od = api.GooglePrivacyDlpV2CustomInfoType.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2CustomInfoType(od);
+      checkGooglePrivacyDlpV2CustomInfoType(
+          od as api.GooglePrivacyDlpV2CustomInfoType);
     });
   });
 
@@ -6077,7 +6347,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DatastoreKey();
       var od = api.GooglePrivacyDlpV2DatastoreKey.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DatastoreKey(od);
+      checkGooglePrivacyDlpV2DatastoreKey(
+          od as api.GooglePrivacyDlpV2DatastoreKey);
     });
   });
 
@@ -6085,7 +6356,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DatastoreOptions();
       var od = api.GooglePrivacyDlpV2DatastoreOptions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DatastoreOptions(od);
+      checkGooglePrivacyDlpV2DatastoreOptions(
+          od as api.GooglePrivacyDlpV2DatastoreOptions);
     });
   });
 
@@ -6093,7 +6365,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DateShiftConfig();
       var od = api.GooglePrivacyDlpV2DateShiftConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DateShiftConfig(od);
+      checkGooglePrivacyDlpV2DateShiftConfig(
+          od as api.GooglePrivacyDlpV2DateShiftConfig);
     });
   });
 
@@ -6101,7 +6374,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DateTime();
       var od = api.GooglePrivacyDlpV2DateTime.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DateTime(od);
+      checkGooglePrivacyDlpV2DateTime(od as api.GooglePrivacyDlpV2DateTime);
     });
   });
 
@@ -6109,7 +6382,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DeidentifyConfig();
       var od = api.GooglePrivacyDlpV2DeidentifyConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DeidentifyConfig(od);
+      checkGooglePrivacyDlpV2DeidentifyConfig(
+          od as api.GooglePrivacyDlpV2DeidentifyConfig);
     });
   });
 
@@ -6118,7 +6392,8 @@
       var o = buildGooglePrivacyDlpV2DeidentifyContentRequest();
       var od =
           api.GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DeidentifyContentRequest(od);
+      checkGooglePrivacyDlpV2DeidentifyContentRequest(
+          od as api.GooglePrivacyDlpV2DeidentifyContentRequest);
     });
   });
 
@@ -6127,7 +6402,8 @@
       var o = buildGooglePrivacyDlpV2DeidentifyContentResponse();
       var od =
           api.GooglePrivacyDlpV2DeidentifyContentResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DeidentifyContentResponse(od);
+      checkGooglePrivacyDlpV2DeidentifyContentResponse(
+          od as api.GooglePrivacyDlpV2DeidentifyContentResponse);
     });
   });
 
@@ -6135,7 +6411,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DeidentifyTemplate();
       var od = api.GooglePrivacyDlpV2DeidentifyTemplate.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DeidentifyTemplate(od);
+      checkGooglePrivacyDlpV2DeidentifyTemplate(
+          od as api.GooglePrivacyDlpV2DeidentifyTemplate);
     });
   });
 
@@ -6145,7 +6422,8 @@
       var o = buildGooglePrivacyDlpV2DeltaPresenceEstimationConfig();
       var od = api.GooglePrivacyDlpV2DeltaPresenceEstimationConfig.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2DeltaPresenceEstimationConfig(od);
+      checkGooglePrivacyDlpV2DeltaPresenceEstimationConfig(
+          od as api.GooglePrivacyDlpV2DeltaPresenceEstimationConfig);
     });
   });
 
@@ -6157,7 +6435,8 @@
       var od =
           api.GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket.fromJson(
               o.toJson());
-      checkGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket(od);
+      checkGooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket(
+          od as api.GooglePrivacyDlpV2DeltaPresenceEstimationHistogramBucket);
     });
   });
 
@@ -6168,7 +6447,8 @@
       var od =
           api.GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues.fromJson(
               o.toJson());
-      checkGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues(od);
+      checkGooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues(
+          od as api.GooglePrivacyDlpV2DeltaPresenceEstimationQuasiIdValues);
     });
   });
 
@@ -6178,7 +6458,8 @@
       var o = buildGooglePrivacyDlpV2DeltaPresenceEstimationResult();
       var od = api.GooglePrivacyDlpV2DeltaPresenceEstimationResult.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2DeltaPresenceEstimationResult(od);
+      checkGooglePrivacyDlpV2DeltaPresenceEstimationResult(
+          od as api.GooglePrivacyDlpV2DeltaPresenceEstimationResult);
     });
   });
 
@@ -6186,7 +6467,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DetectionRule();
       var od = api.GooglePrivacyDlpV2DetectionRule.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DetectionRule(od);
+      checkGooglePrivacyDlpV2DetectionRule(
+          od as api.GooglePrivacyDlpV2DetectionRule);
     });
   });
 
@@ -6194,7 +6476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Dictionary();
       var od = api.GooglePrivacyDlpV2Dictionary.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Dictionary(od);
+      checkGooglePrivacyDlpV2Dictionary(od as api.GooglePrivacyDlpV2Dictionary);
     });
   });
 
@@ -6202,7 +6484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DlpJob();
       var od = api.GooglePrivacyDlpV2DlpJob.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DlpJob(od);
+      checkGooglePrivacyDlpV2DlpJob(od as api.GooglePrivacyDlpV2DlpJob);
     });
   });
 
@@ -6210,7 +6492,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2DocumentLocation();
       var od = api.GooglePrivacyDlpV2DocumentLocation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2DocumentLocation(od);
+      checkGooglePrivacyDlpV2DocumentLocation(
+          od as api.GooglePrivacyDlpV2DocumentLocation);
     });
   });
 
@@ -6218,7 +6501,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2EntityId();
       var od = api.GooglePrivacyDlpV2EntityId.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2EntityId(od);
+      checkGooglePrivacyDlpV2EntityId(od as api.GooglePrivacyDlpV2EntityId);
     });
   });
 
@@ -6226,7 +6509,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Error();
       var od = api.GooglePrivacyDlpV2Error.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Error(od);
+      checkGooglePrivacyDlpV2Error(od as api.GooglePrivacyDlpV2Error);
     });
   });
 
@@ -6234,7 +6517,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ExcludeInfoTypes();
       var od = api.GooglePrivacyDlpV2ExcludeInfoTypes.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ExcludeInfoTypes(od);
+      checkGooglePrivacyDlpV2ExcludeInfoTypes(
+          od as api.GooglePrivacyDlpV2ExcludeInfoTypes);
     });
   });
 
@@ -6242,7 +6526,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ExclusionRule();
       var od = api.GooglePrivacyDlpV2ExclusionRule.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ExclusionRule(od);
+      checkGooglePrivacyDlpV2ExclusionRule(
+          od as api.GooglePrivacyDlpV2ExclusionRule);
     });
   });
 
@@ -6250,7 +6535,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Expressions();
       var od = api.GooglePrivacyDlpV2Expressions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Expressions(od);
+      checkGooglePrivacyDlpV2Expressions(
+          od as api.GooglePrivacyDlpV2Expressions);
     });
   });
 
@@ -6258,7 +6544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2FieldId();
       var od = api.GooglePrivacyDlpV2FieldId.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2FieldId(od);
+      checkGooglePrivacyDlpV2FieldId(od as api.GooglePrivacyDlpV2FieldId);
     });
   });
 
@@ -6266,7 +6552,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2FieldTransformation();
       var od = api.GooglePrivacyDlpV2FieldTransformation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2FieldTransformation(od);
+      checkGooglePrivacyDlpV2FieldTransformation(
+          od as api.GooglePrivacyDlpV2FieldTransformation);
     });
   });
 
@@ -6274,7 +6561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2FileSet();
       var od = api.GooglePrivacyDlpV2FileSet.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2FileSet(od);
+      checkGooglePrivacyDlpV2FileSet(od as api.GooglePrivacyDlpV2FileSet);
     });
   });
 
@@ -6282,7 +6569,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Finding();
       var od = api.GooglePrivacyDlpV2Finding.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Finding(od);
+      checkGooglePrivacyDlpV2Finding(od as api.GooglePrivacyDlpV2Finding);
     });
   });
 
@@ -6290,7 +6577,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2FindingLimits();
       var od = api.GooglePrivacyDlpV2FindingLimits.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2FindingLimits(od);
+      checkGooglePrivacyDlpV2FindingLimits(
+          od as api.GooglePrivacyDlpV2FindingLimits);
     });
   });
 
@@ -6298,7 +6586,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2FinishDlpJobRequest();
       var od = api.GooglePrivacyDlpV2FinishDlpJobRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2FinishDlpJobRequest(od);
+      checkGooglePrivacyDlpV2FinishDlpJobRequest(
+          od as api.GooglePrivacyDlpV2FinishDlpJobRequest);
     });
   });
 
@@ -6307,7 +6596,8 @@
       var o = buildGooglePrivacyDlpV2FixedSizeBucketingConfig();
       var od =
           api.GooglePrivacyDlpV2FixedSizeBucketingConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2FixedSizeBucketingConfig(od);
+      checkGooglePrivacyDlpV2FixedSizeBucketingConfig(
+          od as api.GooglePrivacyDlpV2FixedSizeBucketingConfig);
     });
   });
 
@@ -6315,7 +6605,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2HotwordRule();
       var od = api.GooglePrivacyDlpV2HotwordRule.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2HotwordRule(od);
+      checkGooglePrivacyDlpV2HotwordRule(
+          od as api.GooglePrivacyDlpV2HotwordRule);
     });
   });
 
@@ -6323,7 +6614,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2HybridContentItem();
       var od = api.GooglePrivacyDlpV2HybridContentItem.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2HybridContentItem(od);
+      checkGooglePrivacyDlpV2HybridContentItem(
+          od as api.GooglePrivacyDlpV2HybridContentItem);
     });
   });
 
@@ -6331,7 +6623,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2HybridFindingDetails();
       var od = api.GooglePrivacyDlpV2HybridFindingDetails.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2HybridFindingDetails(od);
+      checkGooglePrivacyDlpV2HybridFindingDetails(
+          od as api.GooglePrivacyDlpV2HybridFindingDetails);
     });
   });
 
@@ -6340,7 +6633,8 @@
       var o = buildGooglePrivacyDlpV2HybridInspectDlpJobRequest();
       var od =
           api.GooglePrivacyDlpV2HybridInspectDlpJobRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2HybridInspectDlpJobRequest(od);
+      checkGooglePrivacyDlpV2HybridInspectDlpJobRequest(
+          od as api.GooglePrivacyDlpV2HybridInspectDlpJobRequest);
     });
   });
 
@@ -6350,7 +6644,8 @@
       var o = buildGooglePrivacyDlpV2HybridInspectJobTriggerRequest();
       var od = api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2HybridInspectJobTriggerRequest(od);
+      checkGooglePrivacyDlpV2HybridInspectJobTriggerRequest(
+          od as api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest);
     });
   });
 
@@ -6358,7 +6653,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2HybridInspectResponse();
       var od = api.GooglePrivacyDlpV2HybridInspectResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2HybridInspectResponse(od);
+      checkGooglePrivacyDlpV2HybridInspectResponse(
+          od as api.GooglePrivacyDlpV2HybridInspectResponse);
     });
   });
 
@@ -6367,7 +6663,8 @@
       var o = buildGooglePrivacyDlpV2HybridInspectStatistics();
       var od =
           api.GooglePrivacyDlpV2HybridInspectStatistics.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2HybridInspectStatistics(od);
+      checkGooglePrivacyDlpV2HybridInspectStatistics(
+          od as api.GooglePrivacyDlpV2HybridInspectStatistics);
     });
   });
 
@@ -6375,7 +6672,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2HybridOptions();
       var od = api.GooglePrivacyDlpV2HybridOptions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2HybridOptions(od);
+      checkGooglePrivacyDlpV2HybridOptions(
+          od as api.GooglePrivacyDlpV2HybridOptions);
     });
   });
 
@@ -6383,7 +6681,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ImageLocation();
       var od = api.GooglePrivacyDlpV2ImageLocation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ImageLocation(od);
+      checkGooglePrivacyDlpV2ImageLocation(
+          od as api.GooglePrivacyDlpV2ImageLocation);
     });
   });
 
@@ -6391,7 +6690,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ImageRedactionConfig();
       var od = api.GooglePrivacyDlpV2ImageRedactionConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ImageRedactionConfig(od);
+      checkGooglePrivacyDlpV2ImageRedactionConfig(
+          od as api.GooglePrivacyDlpV2ImageRedactionConfig);
     });
   });
 
@@ -6399,7 +6699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InfoType();
       var od = api.GooglePrivacyDlpV2InfoType.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InfoType(od);
+      checkGooglePrivacyDlpV2InfoType(od as api.GooglePrivacyDlpV2InfoType);
     });
   });
 
@@ -6407,7 +6707,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InfoTypeDescription();
       var od = api.GooglePrivacyDlpV2InfoTypeDescription.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InfoTypeDescription(od);
+      checkGooglePrivacyDlpV2InfoTypeDescription(
+          od as api.GooglePrivacyDlpV2InfoTypeDescription);
     });
   });
 
@@ -6415,7 +6716,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InfoTypeLimit();
       var od = api.GooglePrivacyDlpV2InfoTypeLimit.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InfoTypeLimit(od);
+      checkGooglePrivacyDlpV2InfoTypeLimit(
+          od as api.GooglePrivacyDlpV2InfoTypeLimit);
     });
   });
 
@@ -6423,7 +6725,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InfoTypeStats();
       var od = api.GooglePrivacyDlpV2InfoTypeStats.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InfoTypeStats(od);
+      checkGooglePrivacyDlpV2InfoTypeStats(
+          od as api.GooglePrivacyDlpV2InfoTypeStats);
     });
   });
 
@@ -6432,7 +6735,8 @@
       var o = buildGooglePrivacyDlpV2InfoTypeTransformation();
       var od =
           api.GooglePrivacyDlpV2InfoTypeTransformation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InfoTypeTransformation(od);
+      checkGooglePrivacyDlpV2InfoTypeTransformation(
+          od as api.GooglePrivacyDlpV2InfoTypeTransformation);
     });
   });
 
@@ -6441,7 +6745,8 @@
       var o = buildGooglePrivacyDlpV2InfoTypeTransformations();
       var od =
           api.GooglePrivacyDlpV2InfoTypeTransformations.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InfoTypeTransformations(od);
+      checkGooglePrivacyDlpV2InfoTypeTransformations(
+          od as api.GooglePrivacyDlpV2InfoTypeTransformations);
     });
   });
 
@@ -6449,7 +6754,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InspectConfig();
       var od = api.GooglePrivacyDlpV2InspectConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectConfig(od);
+      checkGooglePrivacyDlpV2InspectConfig(
+          od as api.GooglePrivacyDlpV2InspectConfig);
     });
   });
 
@@ -6457,7 +6763,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InspectContentRequest();
       var od = api.GooglePrivacyDlpV2InspectContentRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectContentRequest(od);
+      checkGooglePrivacyDlpV2InspectContentRequest(
+          od as api.GooglePrivacyDlpV2InspectContentRequest);
     });
   });
 
@@ -6466,7 +6773,8 @@
       var o = buildGooglePrivacyDlpV2InspectContentResponse();
       var od =
           api.GooglePrivacyDlpV2InspectContentResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectContentResponse(od);
+      checkGooglePrivacyDlpV2InspectContentResponse(
+          od as api.GooglePrivacyDlpV2InspectContentResponse);
     });
   });
 
@@ -6475,7 +6783,8 @@
       var o = buildGooglePrivacyDlpV2InspectDataSourceDetails();
       var od =
           api.GooglePrivacyDlpV2InspectDataSourceDetails.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectDataSourceDetails(od);
+      checkGooglePrivacyDlpV2InspectDataSourceDetails(
+          od as api.GooglePrivacyDlpV2InspectDataSourceDetails);
     });
   });
 
@@ -6483,7 +6792,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InspectJobConfig();
       var od = api.GooglePrivacyDlpV2InspectJobConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectJobConfig(od);
+      checkGooglePrivacyDlpV2InspectJobConfig(
+          od as api.GooglePrivacyDlpV2InspectJobConfig);
     });
   });
 
@@ -6491,7 +6801,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InspectResult();
       var od = api.GooglePrivacyDlpV2InspectResult.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectResult(od);
+      checkGooglePrivacyDlpV2InspectResult(
+          od as api.GooglePrivacyDlpV2InspectResult);
     });
   });
 
@@ -6499,7 +6810,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InspectTemplate();
       var od = api.GooglePrivacyDlpV2InspectTemplate.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectTemplate(od);
+      checkGooglePrivacyDlpV2InspectTemplate(
+          od as api.GooglePrivacyDlpV2InspectTemplate);
     });
   });
 
@@ -6507,7 +6819,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InspectionRule();
       var od = api.GooglePrivacyDlpV2InspectionRule.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectionRule(od);
+      checkGooglePrivacyDlpV2InspectionRule(
+          od as api.GooglePrivacyDlpV2InspectionRule);
     });
   });
 
@@ -6515,7 +6828,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2InspectionRuleSet();
       var od = api.GooglePrivacyDlpV2InspectionRuleSet.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2InspectionRuleSet(od);
+      checkGooglePrivacyDlpV2InspectionRuleSet(
+          od as api.GooglePrivacyDlpV2InspectionRuleSet);
     });
   });
 
@@ -6523,7 +6837,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2JobNotificationEmails();
       var od = api.GooglePrivacyDlpV2JobNotificationEmails.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2JobNotificationEmails(od);
+      checkGooglePrivacyDlpV2JobNotificationEmails(
+          od as api.GooglePrivacyDlpV2JobNotificationEmails);
     });
   });
 
@@ -6531,7 +6846,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2JobTrigger();
       var od = api.GooglePrivacyDlpV2JobTrigger.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2JobTrigger(od);
+      checkGooglePrivacyDlpV2JobTrigger(od as api.GooglePrivacyDlpV2JobTrigger);
     });
   });
 
@@ -6539,7 +6854,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2KAnonymityConfig();
       var od = api.GooglePrivacyDlpV2KAnonymityConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KAnonymityConfig(od);
+      checkGooglePrivacyDlpV2KAnonymityConfig(
+          od as api.GooglePrivacyDlpV2KAnonymityConfig);
     });
   });
 
@@ -6548,7 +6864,8 @@
       var o = buildGooglePrivacyDlpV2KAnonymityEquivalenceClass();
       var od =
           api.GooglePrivacyDlpV2KAnonymityEquivalenceClass.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KAnonymityEquivalenceClass(od);
+      checkGooglePrivacyDlpV2KAnonymityEquivalenceClass(
+          od as api.GooglePrivacyDlpV2KAnonymityEquivalenceClass);
     });
   });
 
@@ -6557,7 +6874,8 @@
       var o = buildGooglePrivacyDlpV2KAnonymityHistogramBucket();
       var od =
           api.GooglePrivacyDlpV2KAnonymityHistogramBucket.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KAnonymityHistogramBucket(od);
+      checkGooglePrivacyDlpV2KAnonymityHistogramBucket(
+          od as api.GooglePrivacyDlpV2KAnonymityHistogramBucket);
     });
   });
 
@@ -6565,7 +6883,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2KAnonymityResult();
       var od = api.GooglePrivacyDlpV2KAnonymityResult.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KAnonymityResult(od);
+      checkGooglePrivacyDlpV2KAnonymityResult(
+          od as api.GooglePrivacyDlpV2KAnonymityResult);
     });
   });
 
@@ -6573,7 +6892,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2KMapEstimationConfig();
       var od = api.GooglePrivacyDlpV2KMapEstimationConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KMapEstimationConfig(od);
+      checkGooglePrivacyDlpV2KMapEstimationConfig(
+          od as api.GooglePrivacyDlpV2KMapEstimationConfig);
     });
   });
 
@@ -6583,7 +6903,8 @@
       var o = buildGooglePrivacyDlpV2KMapEstimationHistogramBucket();
       var od = api.GooglePrivacyDlpV2KMapEstimationHistogramBucket.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2KMapEstimationHistogramBucket(od);
+      checkGooglePrivacyDlpV2KMapEstimationHistogramBucket(
+          od as api.GooglePrivacyDlpV2KMapEstimationHistogramBucket);
     });
   });
 
@@ -6593,7 +6914,8 @@
       var o = buildGooglePrivacyDlpV2KMapEstimationQuasiIdValues();
       var od = api.GooglePrivacyDlpV2KMapEstimationQuasiIdValues.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2KMapEstimationQuasiIdValues(od);
+      checkGooglePrivacyDlpV2KMapEstimationQuasiIdValues(
+          od as api.GooglePrivacyDlpV2KMapEstimationQuasiIdValues);
     });
   });
 
@@ -6601,7 +6923,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2KMapEstimationResult();
       var od = api.GooglePrivacyDlpV2KMapEstimationResult.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KMapEstimationResult(od);
+      checkGooglePrivacyDlpV2KMapEstimationResult(
+          od as api.GooglePrivacyDlpV2KMapEstimationResult);
     });
   });
 
@@ -6609,7 +6932,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Key();
       var od = api.GooglePrivacyDlpV2Key.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Key(od);
+      checkGooglePrivacyDlpV2Key(od as api.GooglePrivacyDlpV2Key);
     });
   });
 
@@ -6617,7 +6940,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2KindExpression();
       var od = api.GooglePrivacyDlpV2KindExpression.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KindExpression(od);
+      checkGooglePrivacyDlpV2KindExpression(
+          od as api.GooglePrivacyDlpV2KindExpression);
     });
   });
 
@@ -6625,7 +6949,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2KmsWrappedCryptoKey();
       var od = api.GooglePrivacyDlpV2KmsWrappedCryptoKey.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2KmsWrappedCryptoKey(od);
+      checkGooglePrivacyDlpV2KmsWrappedCryptoKey(
+          od as api.GooglePrivacyDlpV2KmsWrappedCryptoKey);
     });
   });
 
@@ -6633,7 +6958,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2LDiversityConfig();
       var od = api.GooglePrivacyDlpV2LDiversityConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2LDiversityConfig(od);
+      checkGooglePrivacyDlpV2LDiversityConfig(
+          od as api.GooglePrivacyDlpV2LDiversityConfig);
     });
   });
 
@@ -6642,7 +6968,8 @@
       var o = buildGooglePrivacyDlpV2LDiversityEquivalenceClass();
       var od =
           api.GooglePrivacyDlpV2LDiversityEquivalenceClass.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2LDiversityEquivalenceClass(od);
+      checkGooglePrivacyDlpV2LDiversityEquivalenceClass(
+          od as api.GooglePrivacyDlpV2LDiversityEquivalenceClass);
     });
   });
 
@@ -6651,7 +6978,8 @@
       var o = buildGooglePrivacyDlpV2LDiversityHistogramBucket();
       var od =
           api.GooglePrivacyDlpV2LDiversityHistogramBucket.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2LDiversityHistogramBucket(od);
+      checkGooglePrivacyDlpV2LDiversityHistogramBucket(
+          od as api.GooglePrivacyDlpV2LDiversityHistogramBucket);
     });
   });
 
@@ -6659,7 +6987,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2LDiversityResult();
       var od = api.GooglePrivacyDlpV2LDiversityResult.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2LDiversityResult(od);
+      checkGooglePrivacyDlpV2LDiversityResult(
+          od as api.GooglePrivacyDlpV2LDiversityResult);
     });
   });
 
@@ -6669,7 +6998,8 @@
       var o = buildGooglePrivacyDlpV2LargeCustomDictionaryConfig();
       var od = api.GooglePrivacyDlpV2LargeCustomDictionaryConfig.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2LargeCustomDictionaryConfig(od);
+      checkGooglePrivacyDlpV2LargeCustomDictionaryConfig(
+          od as api.GooglePrivacyDlpV2LargeCustomDictionaryConfig);
     });
   });
 
@@ -6678,7 +7008,8 @@
       var o = buildGooglePrivacyDlpV2LargeCustomDictionaryStats();
       var od =
           api.GooglePrivacyDlpV2LargeCustomDictionaryStats.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2LargeCustomDictionaryStats(od);
+      checkGooglePrivacyDlpV2LargeCustomDictionaryStats(
+          od as api.GooglePrivacyDlpV2LargeCustomDictionaryStats);
     });
   });
 
@@ -6686,7 +7017,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2LeaveUntransformed();
       var od = api.GooglePrivacyDlpV2LeaveUntransformed.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2LeaveUntransformed(od);
+      checkGooglePrivacyDlpV2LeaveUntransformed(
+          od as api.GooglePrivacyDlpV2LeaveUntransformed);
     });
   });
 
@@ -6694,7 +7026,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2LikelihoodAdjustment();
       var od = api.GooglePrivacyDlpV2LikelihoodAdjustment.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2LikelihoodAdjustment(od);
+      checkGooglePrivacyDlpV2LikelihoodAdjustment(
+          od as api.GooglePrivacyDlpV2LikelihoodAdjustment);
     });
   });
 
@@ -6704,7 +7037,8 @@
       var o = buildGooglePrivacyDlpV2ListDeidentifyTemplatesResponse();
       var od = api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(od);
+      checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(
+          od as api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse);
     });
   });
 
@@ -6712,7 +7046,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ListDlpJobsResponse();
       var od = api.GooglePrivacyDlpV2ListDlpJobsResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ListDlpJobsResponse(od);
+      checkGooglePrivacyDlpV2ListDlpJobsResponse(
+          od as api.GooglePrivacyDlpV2ListDlpJobsResponse);
     });
   });
 
@@ -6720,7 +7055,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ListInfoTypesResponse();
       var od = api.GooglePrivacyDlpV2ListInfoTypesResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ListInfoTypesResponse(od);
+      checkGooglePrivacyDlpV2ListInfoTypesResponse(
+          od as api.GooglePrivacyDlpV2ListInfoTypesResponse);
     });
   });
 
@@ -6730,7 +7066,8 @@
       var o = buildGooglePrivacyDlpV2ListInspectTemplatesResponse();
       var od = api.GooglePrivacyDlpV2ListInspectTemplatesResponse.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2ListInspectTemplatesResponse(od);
+      checkGooglePrivacyDlpV2ListInspectTemplatesResponse(
+          od as api.GooglePrivacyDlpV2ListInspectTemplatesResponse);
     });
   });
 
@@ -6739,7 +7076,8 @@
       var o = buildGooglePrivacyDlpV2ListJobTriggersResponse();
       var od =
           api.GooglePrivacyDlpV2ListJobTriggersResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ListJobTriggersResponse(od);
+      checkGooglePrivacyDlpV2ListJobTriggersResponse(
+          od as api.GooglePrivacyDlpV2ListJobTriggersResponse);
     });
   });
 
@@ -6749,7 +7087,8 @@
       var o = buildGooglePrivacyDlpV2ListStoredInfoTypesResponse();
       var od = api.GooglePrivacyDlpV2ListStoredInfoTypesResponse.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(od);
+      checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(
+          od as api.GooglePrivacyDlpV2ListStoredInfoTypesResponse);
     });
   });
 
@@ -6757,7 +7096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Location();
       var od = api.GooglePrivacyDlpV2Location.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Location(od);
+      checkGooglePrivacyDlpV2Location(od as api.GooglePrivacyDlpV2Location);
     });
   });
 
@@ -6765,7 +7104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Manual();
       var od = api.GooglePrivacyDlpV2Manual.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Manual(od);
+      checkGooglePrivacyDlpV2Manual(od as api.GooglePrivacyDlpV2Manual);
     });
   });
 
@@ -6773,7 +7112,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2MetadataLocation();
       var od = api.GooglePrivacyDlpV2MetadataLocation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2MetadataLocation(od);
+      checkGooglePrivacyDlpV2MetadataLocation(
+          od as api.GooglePrivacyDlpV2MetadataLocation);
     });
   });
 
@@ -6781,7 +7121,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2NumericalStatsConfig();
       var od = api.GooglePrivacyDlpV2NumericalStatsConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2NumericalStatsConfig(od);
+      checkGooglePrivacyDlpV2NumericalStatsConfig(
+          od as api.GooglePrivacyDlpV2NumericalStatsConfig);
     });
   });
 
@@ -6789,7 +7130,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2NumericalStatsResult();
       var od = api.GooglePrivacyDlpV2NumericalStatsResult.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2NumericalStatsResult(od);
+      checkGooglePrivacyDlpV2NumericalStatsResult(
+          od as api.GooglePrivacyDlpV2NumericalStatsResult);
     });
   });
 
@@ -6797,7 +7139,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2OutputStorageConfig();
       var od = api.GooglePrivacyDlpV2OutputStorageConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2OutputStorageConfig(od);
+      checkGooglePrivacyDlpV2OutputStorageConfig(
+          od as api.GooglePrivacyDlpV2OutputStorageConfig);
     });
   });
 
@@ -6805,7 +7148,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2PartitionId();
       var od = api.GooglePrivacyDlpV2PartitionId.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2PartitionId(od);
+      checkGooglePrivacyDlpV2PartitionId(
+          od as api.GooglePrivacyDlpV2PartitionId);
     });
   });
 
@@ -6813,7 +7157,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2PathElement();
       var od = api.GooglePrivacyDlpV2PathElement.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2PathElement(od);
+      checkGooglePrivacyDlpV2PathElement(
+          od as api.GooglePrivacyDlpV2PathElement);
     });
   });
 
@@ -6822,7 +7167,8 @@
       var o = buildGooglePrivacyDlpV2PrimitiveTransformation();
       var od =
           api.GooglePrivacyDlpV2PrimitiveTransformation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2PrimitiveTransformation(od);
+      checkGooglePrivacyDlpV2PrimitiveTransformation(
+          od as api.GooglePrivacyDlpV2PrimitiveTransformation);
     });
   });
 
@@ -6830,7 +7176,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2PrivacyMetric();
       var od = api.GooglePrivacyDlpV2PrivacyMetric.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2PrivacyMetric(od);
+      checkGooglePrivacyDlpV2PrivacyMetric(
+          od as api.GooglePrivacyDlpV2PrivacyMetric);
     });
   });
 
@@ -6838,7 +7185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Proximity();
       var od = api.GooglePrivacyDlpV2Proximity.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Proximity(od);
+      checkGooglePrivacyDlpV2Proximity(od as api.GooglePrivacyDlpV2Proximity);
     });
   });
 
@@ -6848,7 +7195,8 @@
       var o = buildGooglePrivacyDlpV2PublishFindingsToCloudDataCatalog();
       var od = api.GooglePrivacyDlpV2PublishFindingsToCloudDataCatalog.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2PublishFindingsToCloudDataCatalog(od);
+      checkGooglePrivacyDlpV2PublishFindingsToCloudDataCatalog(
+          od as api.GooglePrivacyDlpV2PublishFindingsToCloudDataCatalog);
     });
   });
 
@@ -6856,7 +7204,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2PublishSummaryToCscc();
       var od = api.GooglePrivacyDlpV2PublishSummaryToCscc.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2PublishSummaryToCscc(od);
+      checkGooglePrivacyDlpV2PublishSummaryToCscc(
+          od as api.GooglePrivacyDlpV2PublishSummaryToCscc);
     });
   });
 
@@ -6864,7 +7213,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2PublishToPubSub();
       var od = api.GooglePrivacyDlpV2PublishToPubSub.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2PublishToPubSub(od);
+      checkGooglePrivacyDlpV2PublishToPubSub(
+          od as api.GooglePrivacyDlpV2PublishToPubSub);
     });
   });
 
@@ -6872,7 +7222,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2PublishToStackdriver();
       var od = api.GooglePrivacyDlpV2PublishToStackdriver.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2PublishToStackdriver(od);
+      checkGooglePrivacyDlpV2PublishToStackdriver(
+          od as api.GooglePrivacyDlpV2PublishToStackdriver);
     });
   });
 
@@ -6880,7 +7231,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2QuasiId();
       var od = api.GooglePrivacyDlpV2QuasiId.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2QuasiId(od);
+      checkGooglePrivacyDlpV2QuasiId(od as api.GooglePrivacyDlpV2QuasiId);
     });
   });
 
@@ -6888,7 +7239,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2QuasiIdField();
       var od = api.GooglePrivacyDlpV2QuasiIdField.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2QuasiIdField(od);
+      checkGooglePrivacyDlpV2QuasiIdField(
+          od as api.GooglePrivacyDlpV2QuasiIdField);
     });
   });
 
@@ -6896,7 +7248,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2QuasiIdentifierField();
       var od = api.GooglePrivacyDlpV2QuasiIdentifierField.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2QuasiIdentifierField(od);
+      checkGooglePrivacyDlpV2QuasiIdentifierField(
+          od as api.GooglePrivacyDlpV2QuasiIdentifierField);
     });
   });
 
@@ -6904,7 +7257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2QuoteInfo();
       var od = api.GooglePrivacyDlpV2QuoteInfo.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2QuoteInfo(od);
+      checkGooglePrivacyDlpV2QuoteInfo(od as api.GooglePrivacyDlpV2QuoteInfo);
     });
   });
 
@@ -6912,7 +7265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Range();
       var od = api.GooglePrivacyDlpV2Range.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Range(od);
+      checkGooglePrivacyDlpV2Range(od as api.GooglePrivacyDlpV2Range);
     });
   });
 
@@ -6920,7 +7273,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RecordCondition();
       var od = api.GooglePrivacyDlpV2RecordCondition.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RecordCondition(od);
+      checkGooglePrivacyDlpV2RecordCondition(
+          od as api.GooglePrivacyDlpV2RecordCondition);
     });
   });
 
@@ -6928,7 +7282,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RecordKey();
       var od = api.GooglePrivacyDlpV2RecordKey.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RecordKey(od);
+      checkGooglePrivacyDlpV2RecordKey(od as api.GooglePrivacyDlpV2RecordKey);
     });
   });
 
@@ -6936,7 +7290,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RecordLocation();
       var od = api.GooglePrivacyDlpV2RecordLocation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RecordLocation(od);
+      checkGooglePrivacyDlpV2RecordLocation(
+          od as api.GooglePrivacyDlpV2RecordLocation);
     });
   });
 
@@ -6944,7 +7299,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RecordSuppression();
       var od = api.GooglePrivacyDlpV2RecordSuppression.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RecordSuppression(od);
+      checkGooglePrivacyDlpV2RecordSuppression(
+          od as api.GooglePrivacyDlpV2RecordSuppression);
     });
   });
 
@@ -6952,7 +7308,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RecordTransformations();
       var od = api.GooglePrivacyDlpV2RecordTransformations.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RecordTransformations(od);
+      checkGooglePrivacyDlpV2RecordTransformations(
+          od as api.GooglePrivacyDlpV2RecordTransformations);
     });
   });
 
@@ -6960,7 +7317,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RedactConfig();
       var od = api.GooglePrivacyDlpV2RedactConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RedactConfig(od);
+      checkGooglePrivacyDlpV2RedactConfig(
+          od as api.GooglePrivacyDlpV2RedactConfig);
     });
   });
 
@@ -6968,7 +7326,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RedactImageRequest();
       var od = api.GooglePrivacyDlpV2RedactImageRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RedactImageRequest(od);
+      checkGooglePrivacyDlpV2RedactImageRequest(
+          od as api.GooglePrivacyDlpV2RedactImageRequest);
     });
   });
 
@@ -6976,7 +7335,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RedactImageResponse();
       var od = api.GooglePrivacyDlpV2RedactImageResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RedactImageResponse(od);
+      checkGooglePrivacyDlpV2RedactImageResponse(
+          od as api.GooglePrivacyDlpV2RedactImageResponse);
     });
   });
 
@@ -6984,7 +7344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Regex();
       var od = api.GooglePrivacyDlpV2Regex.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Regex(od);
+      checkGooglePrivacyDlpV2Regex(od as api.GooglePrivacyDlpV2Regex);
     });
   });
 
@@ -6993,7 +7353,8 @@
       var o = buildGooglePrivacyDlpV2ReidentifyContentRequest();
       var od =
           api.GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ReidentifyContentRequest(od);
+      checkGooglePrivacyDlpV2ReidentifyContentRequest(
+          od as api.GooglePrivacyDlpV2ReidentifyContentRequest);
     });
   });
 
@@ -7002,7 +7363,8 @@
       var o = buildGooglePrivacyDlpV2ReidentifyContentResponse();
       var od =
           api.GooglePrivacyDlpV2ReidentifyContentResponse.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ReidentifyContentResponse(od);
+      checkGooglePrivacyDlpV2ReidentifyContentResponse(
+          od as api.GooglePrivacyDlpV2ReidentifyContentResponse);
     });
   });
 
@@ -7010,7 +7372,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ReplaceValueConfig();
       var od = api.GooglePrivacyDlpV2ReplaceValueConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ReplaceValueConfig(od);
+      checkGooglePrivacyDlpV2ReplaceValueConfig(
+          od as api.GooglePrivacyDlpV2ReplaceValueConfig);
     });
   });
 
@@ -7019,7 +7382,8 @@
       var o = buildGooglePrivacyDlpV2ReplaceWithInfoTypeConfig();
       var od =
           api.GooglePrivacyDlpV2ReplaceWithInfoTypeConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ReplaceWithInfoTypeConfig(od);
+      checkGooglePrivacyDlpV2ReplaceWithInfoTypeConfig(
+          od as api.GooglePrivacyDlpV2ReplaceWithInfoTypeConfig);
     });
   });
 
@@ -7027,7 +7391,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RequestedOptions();
       var od = api.GooglePrivacyDlpV2RequestedOptions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RequestedOptions(od);
+      checkGooglePrivacyDlpV2RequestedOptions(
+          od as api.GooglePrivacyDlpV2RequestedOptions);
     });
   });
 
@@ -7037,7 +7402,8 @@
       var o = buildGooglePrivacyDlpV2RequestedRiskAnalysisOptions();
       var od = api.GooglePrivacyDlpV2RequestedRiskAnalysisOptions.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2RequestedRiskAnalysisOptions(od);
+      checkGooglePrivacyDlpV2RequestedRiskAnalysisOptions(
+          od as api.GooglePrivacyDlpV2RequestedRiskAnalysisOptions);
     });
   });
 
@@ -7045,7 +7411,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Result();
       var od = api.GooglePrivacyDlpV2Result.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Result(od);
+      checkGooglePrivacyDlpV2Result(od as api.GooglePrivacyDlpV2Result);
     });
   });
 
@@ -7053,7 +7419,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2RiskAnalysisJobConfig();
       var od = api.GooglePrivacyDlpV2RiskAnalysisJobConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2RiskAnalysisJobConfig(od);
+      checkGooglePrivacyDlpV2RiskAnalysisJobConfig(
+          od as api.GooglePrivacyDlpV2RiskAnalysisJobConfig);
     });
   });
 
@@ -7061,7 +7428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Row();
       var od = api.GooglePrivacyDlpV2Row.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Row(od);
+      checkGooglePrivacyDlpV2Row(od as api.GooglePrivacyDlpV2Row);
     });
   });
 
@@ -7069,7 +7436,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2SaveFindings();
       var od = api.GooglePrivacyDlpV2SaveFindings.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2SaveFindings(od);
+      checkGooglePrivacyDlpV2SaveFindings(
+          od as api.GooglePrivacyDlpV2SaveFindings);
     });
   });
 
@@ -7077,7 +7445,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Schedule();
       var od = api.GooglePrivacyDlpV2Schedule.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Schedule(od);
+      checkGooglePrivacyDlpV2Schedule(od as api.GooglePrivacyDlpV2Schedule);
     });
   });
 
@@ -7085,7 +7453,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StatisticalTable();
       var od = api.GooglePrivacyDlpV2StatisticalTable.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StatisticalTable(od);
+      checkGooglePrivacyDlpV2StatisticalTable(
+          od as api.GooglePrivacyDlpV2StatisticalTable);
     });
   });
 
@@ -7093,7 +7462,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StorageConfig();
       var od = api.GooglePrivacyDlpV2StorageConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StorageConfig(od);
+      checkGooglePrivacyDlpV2StorageConfig(
+          od as api.GooglePrivacyDlpV2StorageConfig);
     });
   });
 
@@ -7101,7 +7471,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StorageMetadataLabel();
       var od = api.GooglePrivacyDlpV2StorageMetadataLabel.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StorageMetadataLabel(od);
+      checkGooglePrivacyDlpV2StorageMetadataLabel(
+          od as api.GooglePrivacyDlpV2StorageMetadataLabel);
     });
   });
 
@@ -7109,7 +7480,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StoredInfoType();
       var od = api.GooglePrivacyDlpV2StoredInfoType.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StoredInfoType(od);
+      checkGooglePrivacyDlpV2StoredInfoType(
+          od as api.GooglePrivacyDlpV2StoredInfoType);
     });
   });
 
@@ -7117,7 +7489,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StoredInfoTypeConfig();
       var od = api.GooglePrivacyDlpV2StoredInfoTypeConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StoredInfoTypeConfig(od);
+      checkGooglePrivacyDlpV2StoredInfoTypeConfig(
+          od as api.GooglePrivacyDlpV2StoredInfoTypeConfig);
     });
   });
 
@@ -7125,7 +7498,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StoredInfoTypeStats();
       var od = api.GooglePrivacyDlpV2StoredInfoTypeStats.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StoredInfoTypeStats(od);
+      checkGooglePrivacyDlpV2StoredInfoTypeStats(
+          od as api.GooglePrivacyDlpV2StoredInfoTypeStats);
     });
   });
 
@@ -7133,7 +7507,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StoredInfoTypeVersion();
       var od = api.GooglePrivacyDlpV2StoredInfoTypeVersion.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StoredInfoTypeVersion(od);
+      checkGooglePrivacyDlpV2StoredInfoTypeVersion(
+          od as api.GooglePrivacyDlpV2StoredInfoTypeVersion);
     });
   });
 
@@ -7141,7 +7516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2StoredType();
       var od = api.GooglePrivacyDlpV2StoredType.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2StoredType(od);
+      checkGooglePrivacyDlpV2StoredType(od as api.GooglePrivacyDlpV2StoredType);
     });
   });
 
@@ -7149,7 +7524,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2SummaryResult();
       var od = api.GooglePrivacyDlpV2SummaryResult.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2SummaryResult(od);
+      checkGooglePrivacyDlpV2SummaryResult(
+          od as api.GooglePrivacyDlpV2SummaryResult);
     });
   });
 
@@ -7157,7 +7533,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2SurrogateType();
       var od = api.GooglePrivacyDlpV2SurrogateType.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2SurrogateType(od);
+      checkGooglePrivacyDlpV2SurrogateType(
+          od as api.GooglePrivacyDlpV2SurrogateType);
     });
   });
 
@@ -7165,7 +7542,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Table();
       var od = api.GooglePrivacyDlpV2Table.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Table(od);
+      checkGooglePrivacyDlpV2Table(od as api.GooglePrivacyDlpV2Table);
     });
   });
 
@@ -7173,7 +7550,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TableLocation();
       var od = api.GooglePrivacyDlpV2TableLocation.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TableLocation(od);
+      checkGooglePrivacyDlpV2TableLocation(
+          od as api.GooglePrivacyDlpV2TableLocation);
     });
   });
 
@@ -7181,7 +7559,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TableOptions();
       var od = api.GooglePrivacyDlpV2TableOptions.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TableOptions(od);
+      checkGooglePrivacyDlpV2TableOptions(
+          od as api.GooglePrivacyDlpV2TableOptions);
     });
   });
 
@@ -7189,7 +7568,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TaggedField();
       var od = api.GooglePrivacyDlpV2TaggedField.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TaggedField(od);
+      checkGooglePrivacyDlpV2TaggedField(
+          od as api.GooglePrivacyDlpV2TaggedField);
     });
   });
 
@@ -7197,7 +7577,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ThrowError();
       var od = api.GooglePrivacyDlpV2ThrowError.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ThrowError(od);
+      checkGooglePrivacyDlpV2ThrowError(od as api.GooglePrivacyDlpV2ThrowError);
     });
   });
 
@@ -7205,7 +7585,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TimePartConfig();
       var od = api.GooglePrivacyDlpV2TimePartConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TimePartConfig(od);
+      checkGooglePrivacyDlpV2TimePartConfig(
+          od as api.GooglePrivacyDlpV2TimePartConfig);
     });
   });
 
@@ -7213,7 +7594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TimeZone();
       var od = api.GooglePrivacyDlpV2TimeZone.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TimeZone(od);
+      checkGooglePrivacyDlpV2TimeZone(od as api.GooglePrivacyDlpV2TimeZone);
     });
   });
 
@@ -7221,7 +7602,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TimespanConfig();
       var od = api.GooglePrivacyDlpV2TimespanConfig.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TimespanConfig(od);
+      checkGooglePrivacyDlpV2TimespanConfig(
+          od as api.GooglePrivacyDlpV2TimespanConfig);
     });
   });
 
@@ -7231,7 +7613,8 @@
       var o = buildGooglePrivacyDlpV2TransformationErrorHandling();
       var od = api.GooglePrivacyDlpV2TransformationErrorHandling.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2TransformationErrorHandling(od);
+      checkGooglePrivacyDlpV2TransformationErrorHandling(
+          od as api.GooglePrivacyDlpV2TransformationErrorHandling);
     });
   });
 
@@ -7240,7 +7623,8 @@
       var o = buildGooglePrivacyDlpV2TransformationOverview();
       var od =
           api.GooglePrivacyDlpV2TransformationOverview.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TransformationOverview(od);
+      checkGooglePrivacyDlpV2TransformationOverview(
+          od as api.GooglePrivacyDlpV2TransformationOverview);
     });
   });
 
@@ -7248,7 +7632,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TransformationSummary();
       var od = api.GooglePrivacyDlpV2TransformationSummary.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TransformationSummary(od);
+      checkGooglePrivacyDlpV2TransformationSummary(
+          od as api.GooglePrivacyDlpV2TransformationSummary);
     });
   });
 
@@ -7256,7 +7641,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2TransientCryptoKey();
       var od = api.GooglePrivacyDlpV2TransientCryptoKey.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2TransientCryptoKey(od);
+      checkGooglePrivacyDlpV2TransientCryptoKey(
+          od as api.GooglePrivacyDlpV2TransientCryptoKey);
     });
   });
 
@@ -7264,7 +7650,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Trigger();
       var od = api.GooglePrivacyDlpV2Trigger.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Trigger(od);
+      checkGooglePrivacyDlpV2Trigger(od as api.GooglePrivacyDlpV2Trigger);
     });
   });
 
@@ -7272,7 +7658,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2UnwrappedCryptoKey();
       var od = api.GooglePrivacyDlpV2UnwrappedCryptoKey.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2UnwrappedCryptoKey(od);
+      checkGooglePrivacyDlpV2UnwrappedCryptoKey(
+          od as api.GooglePrivacyDlpV2UnwrappedCryptoKey);
     });
   });
 
@@ -7282,7 +7669,8 @@
       var o = buildGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest();
       var od = api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(od);
+      checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(
+          od as api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest);
     });
   });
 
@@ -7292,7 +7680,8 @@
       var o = buildGooglePrivacyDlpV2UpdateInspectTemplateRequest();
       var od = api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(od);
+      checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(
+          od as api.GooglePrivacyDlpV2UpdateInspectTemplateRequest);
     });
   });
 
@@ -7301,7 +7690,8 @@
       var o = buildGooglePrivacyDlpV2UpdateJobTriggerRequest();
       var od =
           api.GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2UpdateJobTriggerRequest(od);
+      checkGooglePrivacyDlpV2UpdateJobTriggerRequest(
+          od as api.GooglePrivacyDlpV2UpdateJobTriggerRequest);
     });
   });
 
@@ -7311,7 +7701,8 @@
       var o = buildGooglePrivacyDlpV2UpdateStoredInfoTypeRequest();
       var od = api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(
           o.toJson());
-      checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(od);
+      checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(
+          od as api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest);
     });
   });
 
@@ -7319,7 +7710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2Value();
       var od = api.GooglePrivacyDlpV2Value.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2Value(od);
+      checkGooglePrivacyDlpV2Value(od as api.GooglePrivacyDlpV2Value);
     });
   });
 
@@ -7327,7 +7718,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2ValueFrequency();
       var od = api.GooglePrivacyDlpV2ValueFrequency.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2ValueFrequency(od);
+      checkGooglePrivacyDlpV2ValueFrequency(
+          od as api.GooglePrivacyDlpV2ValueFrequency);
     });
   });
 
@@ -7335,7 +7727,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePrivacyDlpV2WordList();
       var od = api.GooglePrivacyDlpV2WordList.fromJson(o.toJson());
-      checkGooglePrivacyDlpV2WordList(od);
+      checkGooglePrivacyDlpV2WordList(od as api.GooglePrivacyDlpV2WordList);
     });
   });
 
@@ -7343,7 +7735,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleProtobufEmpty();
       var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
-      checkGoogleProtobufEmpty(od);
+      checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
 
@@ -7351,7 +7743,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcStatus();
       var od = api.GoogleRpcStatus.fromJson(o.toJson());
-      checkGoogleRpcStatus(od);
+      checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
 
@@ -7359,7 +7751,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleTypeDate();
       var od = api.GoogleTypeDate.fromJson(o.toJson());
-      checkGoogleTypeDate(od);
+      checkGoogleTypeDate(od as api.GoogleTypeDate);
     });
   });
 
@@ -7367,7 +7759,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleTypeTimeOfDay();
       var od = api.GoogleTypeTimeOfDay.fromJson(o.toJson());
-      checkGoogleTypeTimeOfDay(od);
+      checkGoogleTypeTimeOfDay(od as api.GoogleTypeTimeOfDay);
     });
   });
 
@@ -7430,7 +7822,8 @@
               parent: arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListInfoTypesResponse(response);
+        checkGooglePrivacyDlpV2ListInfoTypesResponse(
+            response as api.GooglePrivacyDlpV2ListInfoTypesResponse);
       })));
     });
   });
@@ -7493,7 +7886,8 @@
               locationId: arg_locationId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListInfoTypesResponse(response);
+        checkGooglePrivacyDlpV2ListInfoTypesResponse(
+            response as api.GooglePrivacyDlpV2ListInfoTypesResponse);
       })));
     });
   });
@@ -7509,8 +7903,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7551,7 +7946,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -7599,7 +7995,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -7648,7 +8044,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -7714,7 +8111,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse);
       })));
     });
 
@@ -7728,8 +8126,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7770,7 +8169,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
   });
@@ -7783,9 +8183,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7826,7 +8227,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -7874,7 +8276,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -7923,7 +8325,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -7989,7 +8392,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListInspectTemplatesResponse);
       })));
     });
 
@@ -8000,9 +8404,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8043,7 +8448,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
   });
@@ -8060,8 +8466,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8102,7 +8509,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -8150,7 +8558,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8199,7 +8607,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -8265,7 +8674,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse);
       })));
     });
 
@@ -8279,8 +8689,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8321,7 +8732,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
   });
@@ -8335,9 +8747,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8378,7 +8791,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -8426,7 +8840,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8475,7 +8889,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -8541,7 +8956,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListInspectTemplatesResponse);
       })));
     });
 
@@ -8552,9 +8968,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8595,7 +9012,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
   });
@@ -8609,9 +9027,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8651,7 +9070,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -8699,7 +9119,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8747,7 +9167,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -8813,7 +9234,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(response);
+        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(
+            response as api.GooglePrivacyDlpV2ListStoredInfoTypesResponse);
       })));
     });
 
@@ -8824,9 +9246,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8866,7 +9289,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
   });
@@ -8879,9 +9303,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8921,7 +9346,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -8969,7 +9395,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -9017,7 +9443,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -9083,7 +9510,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(response);
+        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(
+            response as api.GooglePrivacyDlpV2ListStoredInfoTypesResponse);
       })));
     });
 
@@ -9094,9 +9522,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9136,7 +9565,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
   });
@@ -9149,8 +9579,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(json);
-        checkGooglePrivacyDlpV2DeidentifyContentRequest(obj);
+        var obj = api.GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2DeidentifyContentRequest(
+            obj as api.GooglePrivacyDlpV2DeidentifyContentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9191,7 +9623,8 @@
       res
           .deidentify(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyContentResponse(response);
+        checkGooglePrivacyDlpV2DeidentifyContentResponse(
+            response as api.GooglePrivacyDlpV2DeidentifyContentResponse);
       })));
     });
 
@@ -9202,8 +9635,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2InspectContentRequest.fromJson(json);
-        checkGooglePrivacyDlpV2InspectContentRequest(obj);
+        var obj = api.GooglePrivacyDlpV2InspectContentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2InspectContentRequest(
+            obj as api.GooglePrivacyDlpV2InspectContentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9244,7 +9679,8 @@
       res
           .inspect(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectContentResponse(response);
+        checkGooglePrivacyDlpV2InspectContentResponse(
+            response as api.GooglePrivacyDlpV2InspectContentResponse);
       })));
     });
 
@@ -9255,8 +9691,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(json);
-        checkGooglePrivacyDlpV2ReidentifyContentRequest(obj);
+        var obj = api.GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2ReidentifyContentRequest(
+            obj as api.GooglePrivacyDlpV2ReidentifyContentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9297,7 +9735,8 @@
       res
           .reidentify(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ReidentifyContentResponse(response);
+        checkGooglePrivacyDlpV2ReidentifyContentResponse(
+            response as api.GooglePrivacyDlpV2ReidentifyContentResponse);
       })));
     });
   });
@@ -9313,8 +9752,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9355,7 +9795,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -9403,7 +9844,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -9452,7 +9893,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -9518,7 +9960,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse);
       })));
     });
 
@@ -9532,8 +9975,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9574,7 +10018,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
   });
@@ -9587,8 +10032,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2CancelDlpJobRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CancelDlpJobRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CancelDlpJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CancelDlpJobRequest(
+            obj as api.GooglePrivacyDlpV2CancelDlpJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9628,7 +10075,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -9639,8 +10086,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateDlpJobRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateDlpJobRequest(
+            obj as api.GooglePrivacyDlpV2CreateDlpJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9680,7 +10129,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DlpJob(response);
+        checkGooglePrivacyDlpV2DlpJob(response as api.GooglePrivacyDlpV2DlpJob);
       })));
     });
 
@@ -9728,7 +10177,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -9776,7 +10225,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DlpJob(response);
+        checkGooglePrivacyDlpV2DlpJob(response as api.GooglePrivacyDlpV2DlpJob);
       })));
     });
 
@@ -9848,7 +10297,8 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListDlpJobsResponse(response);
+        checkGooglePrivacyDlpV2ListDlpJobsResponse(
+            response as api.GooglePrivacyDlpV2ListDlpJobsResponse);
       })));
     });
   });
@@ -9861,8 +10311,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2RedactImageRequest.fromJson(json);
-        checkGooglePrivacyDlpV2RedactImageRequest(obj);
+        var obj = api.GooglePrivacyDlpV2RedactImageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2RedactImageRequest(
+            obj as api.GooglePrivacyDlpV2RedactImageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9903,7 +10355,8 @@
       res
           .redact(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2RedactImageResponse(response);
+        checkGooglePrivacyDlpV2RedactImageResponse(
+            response as api.GooglePrivacyDlpV2RedactImageResponse);
       })));
     });
   });
@@ -9916,9 +10369,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9959,7 +10413,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -10007,7 +10462,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -10056,7 +10511,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -10122,7 +10578,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListInspectTemplatesResponse);
       })));
     });
 
@@ -10133,9 +10590,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10176,7 +10634,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
   });
@@ -10189,9 +10648,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2ActivateJobTriggerRequest.fromJson(json);
-        checkGooglePrivacyDlpV2ActivateJobTriggerRequest(obj);
+        var obj = api.GooglePrivacyDlpV2ActivateJobTriggerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2ActivateJobTriggerRequest(
+            obj as api.GooglePrivacyDlpV2ActivateJobTriggerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10231,7 +10691,7 @@
       res
           .activate(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DlpJob(response);
+        checkGooglePrivacyDlpV2DlpJob(response as api.GooglePrivacyDlpV2DlpJob);
       })));
     });
 
@@ -10242,8 +10702,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateJobTriggerRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateJobTriggerRequest(
+            obj as api.GooglePrivacyDlpV2CreateJobTriggerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10283,7 +10745,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2JobTrigger(response);
+        checkGooglePrivacyDlpV2JobTrigger(
+            response as api.GooglePrivacyDlpV2JobTrigger);
       })));
     });
 
@@ -10331,7 +10794,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -10379,7 +10842,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2JobTrigger(response);
+        checkGooglePrivacyDlpV2JobTrigger(
+            response as api.GooglePrivacyDlpV2JobTrigger);
       })));
     });
 
@@ -10448,7 +10912,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListJobTriggersResponse(response);
+        checkGooglePrivacyDlpV2ListJobTriggersResponse(
+            response as api.GooglePrivacyDlpV2ListJobTriggersResponse);
       })));
     });
 
@@ -10459,8 +10924,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateJobTriggerRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateJobTriggerRequest(
+            obj as api.GooglePrivacyDlpV2UpdateJobTriggerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10500,7 +10967,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2JobTrigger(response);
+        checkGooglePrivacyDlpV2JobTrigger(
+            response as api.GooglePrivacyDlpV2JobTrigger);
       })));
     });
   });
@@ -10513,8 +10981,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(json);
-        checkGooglePrivacyDlpV2DeidentifyContentRequest(obj);
+        var obj = api.GooglePrivacyDlpV2DeidentifyContentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2DeidentifyContentRequest(
+            obj as api.GooglePrivacyDlpV2DeidentifyContentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10555,7 +11025,8 @@
       res
           .deidentify(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyContentResponse(response);
+        checkGooglePrivacyDlpV2DeidentifyContentResponse(
+            response as api.GooglePrivacyDlpV2DeidentifyContentResponse);
       })));
     });
 
@@ -10566,8 +11037,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2InspectContentRequest.fromJson(json);
-        checkGooglePrivacyDlpV2InspectContentRequest(obj);
+        var obj = api.GooglePrivacyDlpV2InspectContentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2InspectContentRequest(
+            obj as api.GooglePrivacyDlpV2InspectContentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10608,7 +11081,8 @@
       res
           .inspect(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectContentResponse(response);
+        checkGooglePrivacyDlpV2InspectContentResponse(
+            response as api.GooglePrivacyDlpV2InspectContentResponse);
       })));
     });
 
@@ -10619,8 +11093,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(json);
-        checkGooglePrivacyDlpV2ReidentifyContentRequest(obj);
+        var obj = api.GooglePrivacyDlpV2ReidentifyContentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2ReidentifyContentRequest(
+            obj as api.GooglePrivacyDlpV2ReidentifyContentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10661,7 +11137,8 @@
       res
           .reidentify(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ReidentifyContentResponse(response);
+        checkGooglePrivacyDlpV2ReidentifyContentResponse(
+            response as api.GooglePrivacyDlpV2ReidentifyContentResponse);
       })));
     });
   });
@@ -10678,8 +11155,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10720,7 +11198,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -10768,7 +11247,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -10817,7 +11296,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
 
@@ -10883,7 +11363,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListDeidentifyTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListDeidentifyTemplatesResponse);
       })));
     });
 
@@ -10897,8 +11378,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest.fromJson(
-                json);
-        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateDeidentifyTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateDeidentifyTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10939,7 +11421,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DeidentifyTemplate(response);
+        checkGooglePrivacyDlpV2DeidentifyTemplate(
+            response as api.GooglePrivacyDlpV2DeidentifyTemplate);
       })));
     });
   });
@@ -10952,8 +11435,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2CancelDlpJobRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CancelDlpJobRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CancelDlpJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CancelDlpJobRequest(
+            obj as api.GooglePrivacyDlpV2CancelDlpJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10993,7 +11478,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11004,8 +11489,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateDlpJobRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateDlpJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateDlpJobRequest(
+            obj as api.GooglePrivacyDlpV2CreateDlpJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11045,7 +11532,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DlpJob(response);
+        checkGooglePrivacyDlpV2DlpJob(response as api.GooglePrivacyDlpV2DlpJob);
       })));
     });
 
@@ -11093,7 +11580,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11104,8 +11591,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2FinishDlpJobRequest.fromJson(json);
-        checkGooglePrivacyDlpV2FinishDlpJobRequest(obj);
+        var obj = api.GooglePrivacyDlpV2FinishDlpJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2FinishDlpJobRequest(
+            obj as api.GooglePrivacyDlpV2FinishDlpJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11145,7 +11634,7 @@
       res
           .finish(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11193,7 +11682,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DlpJob(response);
+        checkGooglePrivacyDlpV2DlpJob(response as api.GooglePrivacyDlpV2DlpJob);
       })));
     });
 
@@ -11204,9 +11693,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2HybridInspectDlpJobRequest.fromJson(json);
-        checkGooglePrivacyDlpV2HybridInspectDlpJobRequest(obj);
+        var obj = api.GooglePrivacyDlpV2HybridInspectDlpJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2HybridInspectDlpJobRequest(
+            obj as api.GooglePrivacyDlpV2HybridInspectDlpJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11247,7 +11737,8 @@
       res
           .hybridInspect(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2HybridInspectResponse(response);
+        checkGooglePrivacyDlpV2HybridInspectResponse(
+            response as api.GooglePrivacyDlpV2HybridInspectResponse);
       })));
     });
 
@@ -11319,7 +11810,8 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListDlpJobsResponse(response);
+        checkGooglePrivacyDlpV2ListDlpJobsResponse(
+            response as api.GooglePrivacyDlpV2ListDlpJobsResponse);
       })));
     });
   });
@@ -11332,8 +11824,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2RedactImageRequest.fromJson(json);
-        checkGooglePrivacyDlpV2RedactImageRequest(obj);
+        var obj = api.GooglePrivacyDlpV2RedactImageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2RedactImageRequest(
+            obj as api.GooglePrivacyDlpV2RedactImageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11374,7 +11868,8 @@
       res
           .redact(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2RedactImageResponse(response);
+        checkGooglePrivacyDlpV2RedactImageResponse(
+            response as api.GooglePrivacyDlpV2RedactImageResponse);
       })));
     });
   });
@@ -11387,9 +11882,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2CreateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11430,7 +11926,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -11478,7 +11975,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11527,7 +12024,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
 
@@ -11593,7 +12091,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(response);
+        checkGooglePrivacyDlpV2ListInspectTemplatesResponse(
+            response as api.GooglePrivacyDlpV2ListInspectTemplatesResponse);
       })));
     });
 
@@ -11604,9 +12103,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateInspectTemplateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateInspectTemplateRequest(
+            obj as api.GooglePrivacyDlpV2UpdateInspectTemplateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11647,7 +12147,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2InspectTemplate(response);
+        checkGooglePrivacyDlpV2InspectTemplate(
+            response as api.GooglePrivacyDlpV2InspectTemplate);
       })));
     });
   });
@@ -11660,9 +12161,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2ActivateJobTriggerRequest.fromJson(json);
-        checkGooglePrivacyDlpV2ActivateJobTriggerRequest(obj);
+        var obj = api.GooglePrivacyDlpV2ActivateJobTriggerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2ActivateJobTriggerRequest(
+            obj as api.GooglePrivacyDlpV2ActivateJobTriggerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11702,7 +12204,7 @@
       res
           .activate(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2DlpJob(response);
+        checkGooglePrivacyDlpV2DlpJob(response as api.GooglePrivacyDlpV2DlpJob);
       })));
     });
 
@@ -11713,8 +12215,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateJobTriggerRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateJobTriggerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateJobTriggerRequest(
+            obj as api.GooglePrivacyDlpV2CreateJobTriggerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11754,7 +12258,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2JobTrigger(response);
+        checkGooglePrivacyDlpV2JobTrigger(
+            response as api.GooglePrivacyDlpV2JobTrigger);
       })));
     });
 
@@ -11802,7 +12307,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -11850,7 +12355,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2JobTrigger(response);
+        checkGooglePrivacyDlpV2JobTrigger(
+            response as api.GooglePrivacyDlpV2JobTrigger);
       })));
     });
 
@@ -11861,9 +12367,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest.fromJson(json);
-        checkGooglePrivacyDlpV2HybridInspectJobTriggerRequest(obj);
+        var obj = api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2HybridInspectJobTriggerRequest(
+            obj as api.GooglePrivacyDlpV2HybridInspectJobTriggerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11904,7 +12411,8 @@
       res
           .hybridInspect(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2HybridInspectResponse(response);
+        checkGooglePrivacyDlpV2HybridInspectResponse(
+            response as api.GooglePrivacyDlpV2HybridInspectResponse);
       })));
     });
 
@@ -11973,7 +12481,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListJobTriggersResponse(response);
+        checkGooglePrivacyDlpV2ListJobTriggersResponse(
+            response as api.GooglePrivacyDlpV2ListJobTriggersResponse);
       })));
     });
 
@@ -11984,8 +12493,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateJobTriggerRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateJobTriggerRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateJobTriggerRequest(
+            obj as api.GooglePrivacyDlpV2UpdateJobTriggerRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12025,7 +12536,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2JobTrigger(response);
+        checkGooglePrivacyDlpV2JobTrigger(
+            response as api.GooglePrivacyDlpV2JobTrigger);
       })));
     });
   });
@@ -12038,9 +12550,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12080,7 +12593,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -12128,7 +12642,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12176,7 +12690,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -12242,7 +12757,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(response);
+        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(
+            response as api.GooglePrivacyDlpV2ListStoredInfoTypesResponse);
       })));
     });
 
@@ -12253,9 +12769,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12295,7 +12812,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
   });
@@ -12308,9 +12826,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2CreateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2CreateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12350,7 +12869,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -12398,7 +12918,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -12446,7 +12966,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
 
@@ -12512,7 +13033,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(response);
+        checkGooglePrivacyDlpV2ListStoredInfoTypesResponse(
+            response as api.GooglePrivacyDlpV2ListStoredInfoTypesResponse);
       })));
     });
 
@@ -12523,9 +13045,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(json);
-        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(obj);
+        var obj = api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGooglePrivacyDlpV2UpdateStoredInfoTypeRequest(
+            obj as api.GooglePrivacyDlpV2UpdateStoredInfoTypeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12565,7 +13088,8 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGooglePrivacyDlpV2StoredInfoType(response);
+        checkGooglePrivacyDlpV2StoredInfoType(
+            response as api.GooglePrivacyDlpV2StoredInfoType);
       })));
     });
   });
diff --git a/generated/googleapis/test/dns/v1_test.dart b/generated/googleapis/test/dns/v1_test.dart
index 1c9bce4..470e452 100644
--- a/generated/googleapis/test/dns/v1_test.dart
+++ b/generated/googleapis/test/dns/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed1787(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceRecordSet(o[0]);
-  checkResourceRecordSet(o[1]);
+  checkResourceRecordSet(o[0] as api.ResourceRecordSet);
+  checkResourceRecordSet(o[1] as api.ResourceRecordSet);
 }
 
 core.List<api.ResourceRecordSet> buildUnnamed1788() {
@@ -96,8 +96,8 @@
 
 void checkUnnamed1788(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceRecordSet(o[0]);
-  checkResourceRecordSet(o[1]);
+  checkResourceRecordSet(o[0] as api.ResourceRecordSet);
+  checkResourceRecordSet(o[1] as api.ResourceRecordSet);
 }
 
 core.int buildCounterChange = 0;
@@ -140,8 +140,8 @@
 
 void checkUnnamed1789(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChange(o[0]);
-  checkChange(o[1]);
+  checkChange(o[0] as api.Change);
+  checkChange(o[1] as api.Change);
 }
 
 core.int buildCounterChangesListResponse = 0;
@@ -162,7 +162,7 @@
   buildCounterChangesListResponse++;
   if (buildCounterChangesListResponse < 3) {
     checkUnnamed1789(o.changes);
-    checkResponseHeader(o.header);
+    checkResponseHeader(o.header as api.ResponseHeader);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -178,8 +178,8 @@
 
 void checkUnnamed1790(core.List<api.DnsKeyDigest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDnsKeyDigest(o[0]);
-  checkDnsKeyDigest(o[1]);
+  checkDnsKeyDigest(o[0] as api.DnsKeyDigest);
+  checkDnsKeyDigest(o[1] as api.DnsKeyDigest);
 }
 
 core.int buildCounterDnsKey = 0;
@@ -276,8 +276,8 @@
 
 void checkUnnamed1791(core.List<api.DnsKey> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDnsKey(o[0]);
-  checkDnsKey(o[1]);
+  checkDnsKey(o[0] as api.DnsKey);
+  checkDnsKey(o[1] as api.DnsKey);
 }
 
 core.int buildCounterDnsKeysListResponse = 0;
@@ -298,7 +298,7 @@
   buildCounterDnsKeysListResponse++;
   if (buildCounterDnsKeysListResponse < 3) {
     checkUnnamed1791(o.dnsKeys);
-    checkResponseHeader(o.header);
+    checkResponseHeader(o.header as api.ResponseHeader);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
@@ -362,17 +362,21 @@
     unittest.expect(o.creationTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.dnsName, unittest.equals('foo'));
-    checkManagedZoneDnsSecConfig(o.dnssecConfig);
-    checkManagedZoneForwardingConfig(o.forwardingConfig);
+    checkManagedZoneDnsSecConfig(o.dnssecConfig as api.ManagedZoneDnsSecConfig);
+    checkManagedZoneForwardingConfig(
+        o.forwardingConfig as api.ManagedZoneForwardingConfig);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed1792(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.nameServerSet, unittest.equals('foo'));
     checkUnnamed1793(o.nameServers);
-    checkManagedZonePeeringConfig(o.peeringConfig);
-    checkManagedZonePrivateVisibilityConfig(o.privateVisibilityConfig);
-    checkManagedZoneReverseLookupConfig(o.reverseLookupConfig);
+    checkManagedZonePeeringConfig(
+        o.peeringConfig as api.ManagedZonePeeringConfig);
+    checkManagedZonePrivateVisibilityConfig(
+        o.privateVisibilityConfig as api.ManagedZonePrivateVisibilityConfig);
+    checkManagedZoneReverseLookupConfig(
+        o.reverseLookupConfig as api.ManagedZoneReverseLookupConfig);
     unittest.expect(o.visibility, unittest.equals('foo'));
   }
   buildCounterManagedZone--;
@@ -387,8 +391,8 @@
 
 void checkUnnamed1794(core.List<api.DnsKeySpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDnsKeySpec(o[0]);
-  checkDnsKeySpec(o[1]);
+  checkDnsKeySpec(o[0] as api.DnsKeySpec);
+  checkDnsKeySpec(o[1] as api.DnsKeySpec);
 }
 
 core.int buildCounterManagedZoneDnsSecConfig = 0;
@@ -426,8 +430,10 @@
 void checkUnnamed1795(
     core.List<api.ManagedZoneForwardingConfigNameServerTarget> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedZoneForwardingConfigNameServerTarget(o[0]);
-  checkManagedZoneForwardingConfigNameServerTarget(o[1]);
+  checkManagedZoneForwardingConfigNameServerTarget(
+      o[0] as api.ManagedZoneForwardingConfigNameServerTarget);
+  checkManagedZoneForwardingConfigNameServerTarget(
+      o[1] as api.ManagedZoneForwardingConfigNameServerTarget);
 }
 
 core.int buildCounterManagedZoneForwardingConfig = 0;
@@ -485,8 +491,8 @@
 
 void checkUnnamed1796(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterManagedZoneOperationsListResponse = 0;
@@ -507,7 +513,7 @@
     api.ManagedZoneOperationsListResponse o) {
   buildCounterManagedZoneOperationsListResponse++;
   if (buildCounterManagedZoneOperationsListResponse < 3) {
-    checkResponseHeader(o.header);
+    checkResponseHeader(o.header as api.ResponseHeader);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkUnnamed1796(o.operations);
@@ -531,7 +537,8 @@
   buildCounterManagedZonePeeringConfig++;
   if (buildCounterManagedZonePeeringConfig < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkManagedZonePeeringConfigTargetNetwork(o.targetNetwork);
+    checkManagedZonePeeringConfigTargetNetwork(
+        o.targetNetwork as api.ManagedZonePeeringConfigTargetNetwork);
   }
   buildCounterManagedZonePeeringConfig--;
 }
@@ -571,8 +578,10 @@
 void checkUnnamed1797(
     core.List<api.ManagedZonePrivateVisibilityConfigNetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedZonePrivateVisibilityConfigNetwork(o[0]);
-  checkManagedZonePrivateVisibilityConfigNetwork(o[1]);
+  checkManagedZonePrivateVisibilityConfigNetwork(
+      o[0] as api.ManagedZonePrivateVisibilityConfigNetwork);
+  checkManagedZonePrivateVisibilityConfigNetwork(
+      o[1] as api.ManagedZonePrivateVisibilityConfigNetwork);
 }
 
 core.int buildCounterManagedZonePrivateVisibilityConfig = 0;
@@ -649,8 +658,8 @@
 
 void checkUnnamed1798(core.List<api.ManagedZone> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedZone(o[0]);
-  checkManagedZone(o[1]);
+  checkManagedZone(o[0] as api.ManagedZone);
+  checkManagedZone(o[1] as api.ManagedZone);
 }
 
 core.int buildCounterManagedZonesListResponse = 0;
@@ -670,7 +679,7 @@
 void checkManagedZonesListResponse(api.ManagedZonesListResponse o) {
   buildCounterManagedZonesListResponse++;
   if (buildCounterManagedZonesListResponse < 3) {
-    checkResponseHeader(o.header);
+    checkResponseHeader(o.header as api.ResponseHeader);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed1798(o.managedZones);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
@@ -699,14 +708,15 @@
 void checkOperation(api.Operation o) {
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
-    checkOperationDnsKeyContext(o.dnsKeyContext);
+    checkOperationDnsKeyContext(o.dnsKeyContext as api.OperationDnsKeyContext);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.user, unittest.equals('foo'));
-    checkOperationManagedZoneContext(o.zoneContext);
+    checkOperationManagedZoneContext(
+        o.zoneContext as api.OperationManagedZoneContext);
   }
   buildCounterOperation--;
 }
@@ -726,8 +736,8 @@
 void checkOperationDnsKeyContext(api.OperationDnsKeyContext o) {
   buildCounterOperationDnsKeyContext++;
   if (buildCounterOperationDnsKeyContext < 3) {
-    checkDnsKey(o.newValue);
-    checkDnsKey(o.oldValue);
+    checkDnsKey(o.newValue as api.DnsKey);
+    checkDnsKey(o.oldValue as api.DnsKey);
   }
   buildCounterOperationDnsKeyContext--;
 }
@@ -747,8 +757,8 @@
 void checkOperationManagedZoneContext(api.OperationManagedZoneContext o) {
   buildCounterOperationManagedZoneContext++;
   if (buildCounterOperationManagedZoneContext < 3) {
-    checkManagedZone(o.newValue);
-    checkManagedZone(o.oldValue);
+    checkManagedZone(o.newValue as api.ManagedZone);
+    checkManagedZone(o.oldValue as api.ManagedZone);
   }
   buildCounterOperationManagedZoneContext--;
 }
@@ -762,8 +772,8 @@
 
 void checkUnnamed1799(core.List<api.Policy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicy(o[0]);
-  checkPolicy(o[1]);
+  checkPolicy(o[0] as api.Policy);
+  checkPolicy(o[1] as api.Policy);
 }
 
 core.int buildCounterPoliciesListResponse = 0;
@@ -783,7 +793,7 @@
 void checkPoliciesListResponse(api.PoliciesListResponse o) {
   buildCounterPoliciesListResponse++;
   if (buildCounterPoliciesListResponse < 3) {
-    checkResponseHeader(o.header);
+    checkResponseHeader(o.header as api.ResponseHeader);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkUnnamed1799(o.policies);
@@ -806,8 +816,8 @@
 void checkPoliciesPatchResponse(api.PoliciesPatchResponse o) {
   buildCounterPoliciesPatchResponse++;
   if (buildCounterPoliciesPatchResponse < 3) {
-    checkResponseHeader(o.header);
-    checkPolicy(o.policy);
+    checkResponseHeader(o.header as api.ResponseHeader);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterPoliciesPatchResponse--;
 }
@@ -827,8 +837,8 @@
 void checkPoliciesUpdateResponse(api.PoliciesUpdateResponse o) {
   buildCounterPoliciesUpdateResponse++;
   if (buildCounterPoliciesUpdateResponse < 3) {
-    checkResponseHeader(o.header);
-    checkPolicy(o.policy);
+    checkResponseHeader(o.header as api.ResponseHeader);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterPoliciesUpdateResponse--;
 }
@@ -842,8 +852,8 @@
 
 void checkUnnamed1800(core.List<api.PolicyNetwork> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicyNetwork(o[0]);
-  checkPolicyNetwork(o[1]);
+  checkPolicyNetwork(o[0] as api.PolicyNetwork);
+  checkPolicyNetwork(o[1] as api.PolicyNetwork);
 }
 
 core.int buildCounterPolicy = 0;
@@ -867,7 +877,8 @@
 void checkPolicy(api.Policy o) {
   buildCounterPolicy++;
   if (buildCounterPolicy < 3) {
-    checkPolicyAlternativeNameServerConfig(o.alternativeNameServerConfig);
+    checkPolicyAlternativeNameServerConfig(
+        o.alternativeNameServerConfig as api.PolicyAlternativeNameServerConfig);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.enableInboundForwarding, unittest.isTrue);
     unittest.expect(o.enableLogging, unittest.isTrue);
@@ -890,8 +901,10 @@
 void checkUnnamed1801(
     core.List<api.PolicyAlternativeNameServerConfigTargetNameServer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicyAlternativeNameServerConfigTargetNameServer(o[0]);
-  checkPolicyAlternativeNameServerConfigTargetNameServer(o[1]);
+  checkPolicyAlternativeNameServerConfigTargetNameServer(
+      o[0] as api.PolicyAlternativeNameServerConfigTargetNameServer);
+  checkPolicyAlternativeNameServerConfigTargetNameServer(
+      o[1] as api.PolicyAlternativeNameServerConfigTargetNameServer);
 }
 
 core.int buildCounterPolicyAlternativeNameServerConfig = 0;
@@ -982,7 +995,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.number, unittest.equals('foo'));
-    checkQuota(o.quota);
+    checkQuota(o.quota as api.Quota);
   }
   buildCounterProject--;
 }
@@ -996,8 +1009,8 @@
 
 void checkUnnamed1802(core.List<api.DnsKeySpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDnsKeySpec(o[0]);
-  checkDnsKeySpec(o[1]);
+  checkDnsKeySpec(o[0] as api.DnsKeySpec);
+  checkDnsKeySpec(o[1] as api.DnsKeySpec);
 }
 
 core.int buildCounterQuota = 0;
@@ -1111,8 +1124,8 @@
 
 void checkUnnamed1805(core.List<api.ResourceRecordSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceRecordSet(o[0]);
-  checkResourceRecordSet(o[1]);
+  checkResourceRecordSet(o[0] as api.ResourceRecordSet);
+  checkResourceRecordSet(o[1] as api.ResourceRecordSet);
 }
 
 core.int buildCounterResourceRecordSetsListResponse = 0;
@@ -1132,7 +1145,7 @@
 void checkResourceRecordSetsListResponse(api.ResourceRecordSetsListResponse o) {
   buildCounterResourceRecordSetsListResponse++;
   if (buildCounterResourceRecordSetsListResponse < 3) {
-    checkResponseHeader(o.header);
+    checkResponseHeader(o.header as api.ResponseHeader);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkUnnamed1805(o.rrsets);
@@ -1164,7 +1177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChange();
       var od = api.Change.fromJson(o.toJson());
-      checkChange(od);
+      checkChange(od as api.Change);
     });
   });
 
@@ -1172,7 +1185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChangesListResponse();
       var od = api.ChangesListResponse.fromJson(o.toJson());
-      checkChangesListResponse(od);
+      checkChangesListResponse(od as api.ChangesListResponse);
     });
   });
 
@@ -1180,7 +1193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDnsKey();
       var od = api.DnsKey.fromJson(o.toJson());
-      checkDnsKey(od);
+      checkDnsKey(od as api.DnsKey);
     });
   });
 
@@ -1188,7 +1201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDnsKeyDigest();
       var od = api.DnsKeyDigest.fromJson(o.toJson());
-      checkDnsKeyDigest(od);
+      checkDnsKeyDigest(od as api.DnsKeyDigest);
     });
   });
 
@@ -1196,7 +1209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDnsKeySpec();
       var od = api.DnsKeySpec.fromJson(o.toJson());
-      checkDnsKeySpec(od);
+      checkDnsKeySpec(od as api.DnsKeySpec);
     });
   });
 
@@ -1204,7 +1217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDnsKeysListResponse();
       var od = api.DnsKeysListResponse.fromJson(o.toJson());
-      checkDnsKeysListResponse(od);
+      checkDnsKeysListResponse(od as api.DnsKeysListResponse);
     });
   });
 
@@ -1212,7 +1225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZone();
       var od = api.ManagedZone.fromJson(o.toJson());
-      checkManagedZone(od);
+      checkManagedZone(od as api.ManagedZone);
     });
   });
 
@@ -1220,7 +1233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZoneDnsSecConfig();
       var od = api.ManagedZoneDnsSecConfig.fromJson(o.toJson());
-      checkManagedZoneDnsSecConfig(od);
+      checkManagedZoneDnsSecConfig(od as api.ManagedZoneDnsSecConfig);
     });
   });
 
@@ -1228,7 +1241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZoneForwardingConfig();
       var od = api.ManagedZoneForwardingConfig.fromJson(o.toJson());
-      checkManagedZoneForwardingConfig(od);
+      checkManagedZoneForwardingConfig(od as api.ManagedZoneForwardingConfig);
     });
   });
 
@@ -1237,7 +1250,8 @@
       var o = buildManagedZoneForwardingConfigNameServerTarget();
       var od =
           api.ManagedZoneForwardingConfigNameServerTarget.fromJson(o.toJson());
-      checkManagedZoneForwardingConfigNameServerTarget(od);
+      checkManagedZoneForwardingConfigNameServerTarget(
+          od as api.ManagedZoneForwardingConfigNameServerTarget);
     });
   });
 
@@ -1245,7 +1259,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZoneOperationsListResponse();
       var od = api.ManagedZoneOperationsListResponse.fromJson(o.toJson());
-      checkManagedZoneOperationsListResponse(od);
+      checkManagedZoneOperationsListResponse(
+          od as api.ManagedZoneOperationsListResponse);
     });
   });
 
@@ -1253,7 +1268,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZonePeeringConfig();
       var od = api.ManagedZonePeeringConfig.fromJson(o.toJson());
-      checkManagedZonePeeringConfig(od);
+      checkManagedZonePeeringConfig(od as api.ManagedZonePeeringConfig);
     });
   });
 
@@ -1261,7 +1276,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZonePeeringConfigTargetNetwork();
       var od = api.ManagedZonePeeringConfigTargetNetwork.fromJson(o.toJson());
-      checkManagedZonePeeringConfigTargetNetwork(od);
+      checkManagedZonePeeringConfigTargetNetwork(
+          od as api.ManagedZonePeeringConfigTargetNetwork);
     });
   });
 
@@ -1269,7 +1285,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZonePrivateVisibilityConfig();
       var od = api.ManagedZonePrivateVisibilityConfig.fromJson(o.toJson());
-      checkManagedZonePrivateVisibilityConfig(od);
+      checkManagedZonePrivateVisibilityConfig(
+          od as api.ManagedZonePrivateVisibilityConfig);
     });
   });
 
@@ -1278,7 +1295,8 @@
       var o = buildManagedZonePrivateVisibilityConfigNetwork();
       var od =
           api.ManagedZonePrivateVisibilityConfigNetwork.fromJson(o.toJson());
-      checkManagedZonePrivateVisibilityConfigNetwork(od);
+      checkManagedZonePrivateVisibilityConfigNetwork(
+          od as api.ManagedZonePrivateVisibilityConfigNetwork);
     });
   });
 
@@ -1286,7 +1304,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZoneReverseLookupConfig();
       var od = api.ManagedZoneReverseLookupConfig.fromJson(o.toJson());
-      checkManagedZoneReverseLookupConfig(od);
+      checkManagedZoneReverseLookupConfig(
+          od as api.ManagedZoneReverseLookupConfig);
     });
   });
 
@@ -1294,7 +1313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedZonesListResponse();
       var od = api.ManagedZonesListResponse.fromJson(o.toJson());
-      checkManagedZonesListResponse(od);
+      checkManagedZonesListResponse(od as api.ManagedZonesListResponse);
     });
   });
 
@@ -1302,7 +1321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1310,7 +1329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationDnsKeyContext();
       var od = api.OperationDnsKeyContext.fromJson(o.toJson());
-      checkOperationDnsKeyContext(od);
+      checkOperationDnsKeyContext(od as api.OperationDnsKeyContext);
     });
   });
 
@@ -1318,7 +1337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationManagedZoneContext();
       var od = api.OperationManagedZoneContext.fromJson(o.toJson());
-      checkOperationManagedZoneContext(od);
+      checkOperationManagedZoneContext(od as api.OperationManagedZoneContext);
     });
   });
 
@@ -1326,7 +1345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPoliciesListResponse();
       var od = api.PoliciesListResponse.fromJson(o.toJson());
-      checkPoliciesListResponse(od);
+      checkPoliciesListResponse(od as api.PoliciesListResponse);
     });
   });
 
@@ -1334,7 +1353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPoliciesPatchResponse();
       var od = api.PoliciesPatchResponse.fromJson(o.toJson());
-      checkPoliciesPatchResponse(od);
+      checkPoliciesPatchResponse(od as api.PoliciesPatchResponse);
     });
   });
 
@@ -1342,7 +1361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPoliciesUpdateResponse();
       var od = api.PoliciesUpdateResponse.fromJson(o.toJson());
-      checkPoliciesUpdateResponse(od);
+      checkPoliciesUpdateResponse(od as api.PoliciesUpdateResponse);
     });
   });
 
@@ -1350,7 +1369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1358,7 +1377,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyAlternativeNameServerConfig();
       var od = api.PolicyAlternativeNameServerConfig.fromJson(o.toJson());
-      checkPolicyAlternativeNameServerConfig(od);
+      checkPolicyAlternativeNameServerConfig(
+          od as api.PolicyAlternativeNameServerConfig);
     });
   });
 
@@ -1368,7 +1388,8 @@
       var o = buildPolicyAlternativeNameServerConfigTargetNameServer();
       var od = api.PolicyAlternativeNameServerConfigTargetNameServer.fromJson(
           o.toJson());
-      checkPolicyAlternativeNameServerConfigTargetNameServer(od);
+      checkPolicyAlternativeNameServerConfigTargetNameServer(
+          od as api.PolicyAlternativeNameServerConfigTargetNameServer);
     });
   });
 
@@ -1376,7 +1397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyNetwork();
       var od = api.PolicyNetwork.fromJson(o.toJson());
-      checkPolicyNetwork(od);
+      checkPolicyNetwork(od as api.PolicyNetwork);
     });
   });
 
@@ -1384,7 +1405,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProject();
       var od = api.Project.fromJson(o.toJson());
-      checkProject(od);
+      checkProject(od as api.Project);
     });
   });
 
@@ -1392,7 +1413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuota();
       var od = api.Quota.fromJson(o.toJson());
-      checkQuota(od);
+      checkQuota(od as api.Quota);
     });
   });
 
@@ -1400,7 +1421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceRecordSet();
       var od = api.ResourceRecordSet.fromJson(o.toJson());
-      checkResourceRecordSet(od);
+      checkResourceRecordSet(od as api.ResourceRecordSet);
     });
   });
 
@@ -1408,7 +1429,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceRecordSetsListResponse();
       var od = api.ResourceRecordSetsListResponse.fromJson(o.toJson());
-      checkResourceRecordSetsListResponse(od);
+      checkResourceRecordSetsListResponse(
+          od as api.ResourceRecordSetsListResponse);
     });
   });
 
@@ -1416,7 +1438,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResponseHeader();
       var od = api.ResponseHeader.fromJson(o.toJson());
-      checkResponseHeader(od);
+      checkResponseHeader(od as api.ResponseHeader);
     });
   });
 
@@ -1430,8 +1452,9 @@
       var arg_clientOperationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Change.fromJson(json);
-        checkChange(obj);
+        var obj =
+            api.Change.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChange(obj as api.Change);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1491,7 +1514,7 @@
           .create(arg_request, arg_project, arg_managedZone,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChange(response);
+        checkChange(response as api.Change);
       })));
     });
 
@@ -1565,7 +1588,7 @@
           .get(arg_project, arg_managedZone, arg_changeId,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChange(response);
+        checkChange(response as api.Change);
       })));
     });
 
@@ -1647,7 +1670,7 @@
               sortOrder: arg_sortOrder,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChangesListResponse(response);
+        checkChangesListResponse(response as api.ChangesListResponse);
       })));
     });
   });
@@ -1728,7 +1751,7 @@
               digestType: arg_digestType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDnsKey(response);
+        checkDnsKey(response as api.DnsKey);
       })));
     });
 
@@ -1807,7 +1830,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDnsKeysListResponse(response);
+        checkDnsKeysListResponse(response as api.DnsKeysListResponse);
       })));
     });
   });
@@ -1883,7 +1906,7 @@
           .get(arg_project, arg_managedZone, arg_operation,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1962,7 +1985,8 @@
               sortBy: arg_sortBy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedZoneOperationsListResponse(response);
+        checkManagedZoneOperationsListResponse(
+            response as api.ManagedZoneOperationsListResponse);
       })));
     });
   });
@@ -1976,8 +2000,9 @@
       var arg_clientOperationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ManagedZone.fromJson(json);
-        checkManagedZone(obj);
+        var obj = api.ManagedZone.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkManagedZone(obj as api.ManagedZone);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2028,7 +2053,7 @@
           .create(arg_request, arg_project,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedZone(response);
+        checkManagedZone(response as api.ManagedZone);
       })));
     });
 
@@ -2154,7 +2179,7 @@
           .get(arg_project, arg_managedZone,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedZone(response);
+        checkManagedZone(response as api.ManagedZone);
       })));
     });
 
@@ -2223,7 +2248,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedZonesListResponse(response);
+        checkManagedZonesListResponse(response as api.ManagedZonesListResponse);
       })));
     });
 
@@ -2236,8 +2261,9 @@
       var arg_clientOperationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ManagedZone.fromJson(json);
-        checkManagedZone(obj);
+        var obj = api.ManagedZone.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkManagedZone(obj as api.ManagedZone);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2291,7 +2317,7 @@
           .patch(arg_request, arg_project, arg_managedZone,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2304,8 +2330,9 @@
       var arg_clientOperationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ManagedZone.fromJson(json);
-        checkManagedZone(obj);
+        var obj = api.ManagedZone.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkManagedZone(obj as api.ManagedZone);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2359,7 +2386,7 @@
           .update(arg_request, arg_project, arg_managedZone,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2373,8 +2400,9 @@
       var arg_clientOperationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Policy.fromJson(json);
-        checkPolicy(obj);
+        var obj =
+            api.Policy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPolicy(obj as api.Policy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2425,7 +2453,7 @@
           .create(arg_request, arg_project,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2551,7 +2579,7 @@
           .get(arg_project, arg_policy,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2616,7 +2644,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPoliciesListResponse(response);
+        checkPoliciesListResponse(response as api.PoliciesListResponse);
       })));
     });
 
@@ -2629,8 +2657,9 @@
       var arg_clientOperationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Policy.fromJson(json);
-        checkPolicy(obj);
+        var obj =
+            api.Policy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPolicy(obj as api.Policy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2684,7 +2713,7 @@
           .patch(arg_request, arg_project, arg_policy,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPoliciesPatchResponse(response);
+        checkPoliciesPatchResponse(response as api.PoliciesPatchResponse);
       })));
     });
 
@@ -2697,8 +2726,9 @@
       var arg_clientOperationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Policy.fromJson(json);
-        checkPolicy(obj);
+        var obj =
+            api.Policy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPolicy(obj as api.Policy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2752,7 +2782,7 @@
           .update(arg_request, arg_project, arg_policy,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPoliciesUpdateResponse(response);
+        checkPoliciesUpdateResponse(response as api.PoliciesUpdateResponse);
       })));
     });
   });
@@ -2808,7 +2838,7 @@
           .get(arg_project,
               clientOperationId: arg_clientOperationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
   });
@@ -2891,7 +2921,8 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResourceRecordSetsListResponse(response);
+        checkResourceRecordSetsListResponse(
+            response as api.ResourceRecordSetsListResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/docs/v1_test.dart b/generated/googleapis/test/docs/v1_test.dart
index e5e9ef5..9955717 100644
--- a/generated/googleapis/test/docs/v1_test.dart
+++ b/generated/googleapis/test/docs/v1_test.dart
@@ -109,8 +109,8 @@
 
 void checkUnnamed5443(core.Map<core.String, api.SuggestedTextStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTextStyle(o['x']);
-  checkSuggestedTextStyle(o['y']);
+  checkSuggestedTextStyle(o['x'] as api.SuggestedTextStyle);
+  checkSuggestedTextStyle(o['y'] as api.SuggestedTextStyle);
 }
 
 core.int buildCounterAutoText = 0;
@@ -134,7 +134,7 @@
     checkUnnamed5441(o.suggestedDeletionIds);
     checkUnnamed5442(o.suggestedInsertionIds);
     checkUnnamed5443(o.suggestedTextStyleChanges);
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAutoText--;
@@ -154,7 +154,7 @@
 void checkBackground(api.Background o) {
   buildCounterBackground++;
   if (buildCounterBackground < 3) {
-    checkOptionalColor(o.color);
+    checkOptionalColor(o.color as api.OptionalColor);
   }
   buildCounterBackground--;
 }
@@ -187,8 +187,8 @@
 
 void checkUnnamed5444(core.List<api.Request> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRequest(o[0]);
-  checkRequest(o[1]);
+  checkRequest(o[0] as api.Request);
+  checkRequest(o[1] as api.Request);
 }
 
 core.int buildCounterBatchUpdateDocumentRequest = 0;
@@ -207,7 +207,7 @@
   buildCounterBatchUpdateDocumentRequest++;
   if (buildCounterBatchUpdateDocumentRequest < 3) {
     checkUnnamed5444(o.requests);
-    checkWriteControl(o.writeControl);
+    checkWriteControl(o.writeControl as api.WriteControl);
   }
   buildCounterBatchUpdateDocumentRequest--;
 }
@@ -221,8 +221,8 @@
 
 void checkUnnamed5445(core.List<api.Response> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResponse(o[0]);
-  checkResponse(o[1]);
+  checkResponse(o[0] as api.Response);
+  checkResponse(o[1] as api.Response);
 }
 
 core.int buildCounterBatchUpdateDocumentResponse = 0;
@@ -243,7 +243,7 @@
   if (buildCounterBatchUpdateDocumentResponse < 3) {
     unittest.expect(o.documentId, unittest.equals('foo'));
     checkUnnamed5445(o.replies);
-    checkWriteControl(o.writeControl);
+    checkWriteControl(o.writeControl as api.WriteControl);
   }
   buildCounterBatchUpdateDocumentResponse--;
 }
@@ -257,8 +257,8 @@
 
 void checkUnnamed5446(core.List<api.StructuralElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuralElement(o[0]);
-  checkStructuralElement(o[1]);
+  checkStructuralElement(o[0] as api.StructuralElement);
+  checkStructuralElement(o[1] as api.StructuralElement);
 }
 
 core.int buildCounterBody = 0;
@@ -298,7 +298,7 @@
   if (buildCounterBullet < 3) {
     unittest.expect(o.listId, unittest.equals('foo'));
     unittest.expect(o.nestingLevel, unittest.equals(42));
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterBullet--;
 }
@@ -321,7 +321,8 @@
   if (buildCounterBulletSuggestionState < 3) {
     unittest.expect(o.listIdSuggested, unittest.isTrue);
     unittest.expect(o.nestingLevelSuggested, unittest.isTrue);
-    checkTextStyleSuggestionState(o.textStyleSuggestionState);
+    checkTextStyleSuggestionState(
+        o.textStyleSuggestionState as api.TextStyleSuggestionState);
   }
   buildCounterBulletSuggestionState--;
 }
@@ -340,7 +341,7 @@
 void checkColor(api.Color o) {
   buildCounterColor++;
   if (buildCounterColor < 3) {
-    checkRgbColor(o.rgbColor);
+    checkRgbColor(o.rgbColor as api.RgbColor);
   }
   buildCounterColor--;
 }
@@ -380,8 +381,8 @@
 
 void checkUnnamed5449(core.Map<core.String, api.SuggestedTextStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTextStyle(o['x']);
-  checkSuggestedTextStyle(o['y']);
+  checkSuggestedTextStyle(o['x'] as api.SuggestedTextStyle);
+  checkSuggestedTextStyle(o['y'] as api.SuggestedTextStyle);
 }
 
 core.int buildCounterColumnBreak = 0;
@@ -404,7 +405,7 @@
     checkUnnamed5447(o.suggestedDeletionIds);
     checkUnnamed5448(o.suggestedInsertionIds);
     checkUnnamed5449(o.suggestedTextStyleChanges);
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterColumnBreak--;
 }
@@ -424,7 +425,7 @@
 void checkCreateFooterRequest(api.CreateFooterRequest o) {
   buildCounterCreateFooterRequest++;
   if (buildCounterCreateFooterRequest < 3) {
-    checkLocation(o.sectionBreakLocation);
+    checkLocation(o.sectionBreakLocation as api.Location);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCreateFooterRequest--;
@@ -464,8 +465,9 @@
 void checkCreateFootnoteRequest(api.CreateFootnoteRequest o) {
   buildCounterCreateFootnoteRequest++;
   if (buildCounterCreateFootnoteRequest < 3) {
-    checkEndOfSegmentLocation(o.endOfSegmentLocation);
-    checkLocation(o.location);
+    checkEndOfSegmentLocation(
+        o.endOfSegmentLocation as api.EndOfSegmentLocation);
+    checkLocation(o.location as api.Location);
   }
   buildCounterCreateFootnoteRequest--;
 }
@@ -504,7 +506,7 @@
 void checkCreateHeaderRequest(api.CreateHeaderRequest o) {
   buildCounterCreateHeaderRequest++;
   if (buildCounterCreateHeaderRequest < 3) {
-    checkLocation(o.sectionBreakLocation);
+    checkLocation(o.sectionBreakLocation as api.Location);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCreateHeaderRequest--;
@@ -545,7 +547,7 @@
   buildCounterCreateNamedRangeRequest++;
   if (buildCounterCreateNamedRangeRequest < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkRange(o.range);
+    checkRange(o.range as api.Range);
   }
   buildCounterCreateNamedRangeRequest--;
 }
@@ -585,7 +587,7 @@
   buildCounterCreateParagraphBulletsRequest++;
   if (buildCounterCreateParagraphBulletsRequest < 3) {
     unittest.expect(o.bulletPreset, unittest.equals('foo'));
-    checkRange(o.range);
+    checkRange(o.range as api.Range);
   }
   buildCounterCreateParagraphBulletsRequest--;
 }
@@ -658,7 +660,7 @@
 void checkDeleteContentRangeRequest(api.DeleteContentRangeRequest o) {
   buildCounterDeleteContentRangeRequest++;
   if (buildCounterDeleteContentRangeRequest < 3) {
-    checkRange(o.range);
+    checkRange(o.range as api.Range);
   }
   buildCounterDeleteContentRangeRequest--;
 }
@@ -736,7 +738,7 @@
 void checkDeleteParagraphBulletsRequest(api.DeleteParagraphBulletsRequest o) {
   buildCounterDeleteParagraphBulletsRequest++;
   if (buildCounterDeleteParagraphBulletsRequest < 3) {
-    checkRange(o.range);
+    checkRange(o.range as api.Range);
   }
   buildCounterDeleteParagraphBulletsRequest--;
 }
@@ -774,7 +776,7 @@
 void checkDeleteTableColumnRequest(api.DeleteTableColumnRequest o) {
   buildCounterDeleteTableColumnRequest++;
   if (buildCounterDeleteTableColumnRequest < 3) {
-    checkTableCellLocation(o.tableCellLocation);
+    checkTableCellLocation(o.tableCellLocation as api.TableCellLocation);
   }
   buildCounterDeleteTableColumnRequest--;
 }
@@ -793,7 +795,7 @@
 void checkDeleteTableRowRequest(api.DeleteTableRowRequest o) {
   buildCounterDeleteTableRowRequest++;
   if (buildCounterDeleteTableRowRequest < 3) {
-    checkTableCellLocation(o.tableCellLocation);
+    checkTableCellLocation(o.tableCellLocation as api.TableCellLocation);
   }
   buildCounterDeleteTableRowRequest--;
 }
@@ -828,8 +830,8 @@
 
 void checkUnnamed5450(core.Map<core.String, api.Footer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFooter(o['x']);
-  checkFooter(o['y']);
+  checkFooter(o['x'] as api.Footer);
+  checkFooter(o['y'] as api.Footer);
 }
 
 core.Map<core.String, api.Footnote> buildUnnamed5451() {
@@ -841,8 +843,8 @@
 
 void checkUnnamed5451(core.Map<core.String, api.Footnote> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFootnote(o['x']);
-  checkFootnote(o['y']);
+  checkFootnote(o['x'] as api.Footnote);
+  checkFootnote(o['y'] as api.Footnote);
 }
 
 core.Map<core.String, api.Header> buildUnnamed5452() {
@@ -854,8 +856,8 @@
 
 void checkUnnamed5452(core.Map<core.String, api.Header> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHeader(o['x']);
-  checkHeader(o['y']);
+  checkHeader(o['x'] as api.Header);
+  checkHeader(o['y'] as api.Header);
 }
 
 core.Map<core.String, api.InlineObject> buildUnnamed5453() {
@@ -867,8 +869,8 @@
 
 void checkUnnamed5453(core.Map<core.String, api.InlineObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInlineObject(o['x']);
-  checkInlineObject(o['y']);
+  checkInlineObject(o['x'] as api.InlineObject);
+  checkInlineObject(o['y'] as api.InlineObject);
 }
 
 core.Map<core.String, api.List> buildUnnamed5454() {
@@ -880,8 +882,8 @@
 
 void checkUnnamed5454(core.Map<core.String, api.List> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkList(o['x']);
-  checkList(o['y']);
+  checkList(o['x'] as api.List);
+  checkList(o['y'] as api.List);
 }
 
 core.Map<core.String, api.NamedRanges> buildUnnamed5455() {
@@ -893,8 +895,8 @@
 
 void checkUnnamed5455(core.Map<core.String, api.NamedRanges> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedRanges(o['x']);
-  checkNamedRanges(o['y']);
+  checkNamedRanges(o['x'] as api.NamedRanges);
+  checkNamedRanges(o['y'] as api.NamedRanges);
 }
 
 core.Map<core.String, api.PositionedObject> buildUnnamed5456() {
@@ -906,8 +908,8 @@
 
 void checkUnnamed5456(core.Map<core.String, api.PositionedObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPositionedObject(o['x']);
-  checkPositionedObject(o['y']);
+  checkPositionedObject(o['x'] as api.PositionedObject);
+  checkPositionedObject(o['y'] as api.PositionedObject);
 }
 
 core.Map<core.String, api.SuggestedDocumentStyle> buildUnnamed5457() {
@@ -919,8 +921,8 @@
 
 void checkUnnamed5457(core.Map<core.String, api.SuggestedDocumentStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedDocumentStyle(o['x']);
-  checkSuggestedDocumentStyle(o['y']);
+  checkSuggestedDocumentStyle(o['x'] as api.SuggestedDocumentStyle);
+  checkSuggestedDocumentStyle(o['y'] as api.SuggestedDocumentStyle);
 }
 
 core.Map<core.String, api.SuggestedNamedStyles> buildUnnamed5458() {
@@ -932,8 +934,8 @@
 
 void checkUnnamed5458(core.Map<core.String, api.SuggestedNamedStyles> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedNamedStyles(o['x']);
-  checkSuggestedNamedStyles(o['y']);
+  checkSuggestedNamedStyles(o['x'] as api.SuggestedNamedStyles);
+  checkSuggestedNamedStyles(o['y'] as api.SuggestedNamedStyles);
 }
 
 core.int buildCounterDocument = 0;
@@ -965,16 +967,16 @@
 void checkDocument(api.Document o) {
   buildCounterDocument++;
   if (buildCounterDocument < 3) {
-    checkBody(o.body);
+    checkBody(o.body as api.Body);
     unittest.expect(o.documentId, unittest.equals('foo'));
-    checkDocumentStyle(o.documentStyle);
+    checkDocumentStyle(o.documentStyle as api.DocumentStyle);
     checkUnnamed5450(o.footers);
     checkUnnamed5451(o.footnotes);
     checkUnnamed5452(o.headers);
     checkUnnamed5453(o.inlineObjects);
     checkUnnamed5454(o.lists);
     checkUnnamed5455(o.namedRanges);
-    checkNamedStyles(o.namedStyles);
+    checkNamedStyles(o.namedStyles as api.NamedStyles);
     checkUnnamed5456(o.positionedObjects);
     unittest.expect(o.revisionId, unittest.equals('foo'));
     checkUnnamed5457(o.suggestedDocumentStyleChanges);
@@ -1016,21 +1018,21 @@
 void checkDocumentStyle(api.DocumentStyle o) {
   buildCounterDocumentStyle++;
   if (buildCounterDocumentStyle < 3) {
-    checkBackground(o.background);
+    checkBackground(o.background as api.Background);
     unittest.expect(o.defaultFooterId, unittest.equals('foo'));
     unittest.expect(o.defaultHeaderId, unittest.equals('foo'));
     unittest.expect(o.evenPageFooterId, unittest.equals('foo'));
     unittest.expect(o.evenPageHeaderId, unittest.equals('foo'));
     unittest.expect(o.firstPageFooterId, unittest.equals('foo'));
     unittest.expect(o.firstPageHeaderId, unittest.equals('foo'));
-    checkDimension(o.marginBottom);
-    checkDimension(o.marginFooter);
-    checkDimension(o.marginHeader);
-    checkDimension(o.marginLeft);
-    checkDimension(o.marginRight);
-    checkDimension(o.marginTop);
+    checkDimension(o.marginBottom as api.Dimension);
+    checkDimension(o.marginFooter as api.Dimension);
+    checkDimension(o.marginHeader as api.Dimension);
+    checkDimension(o.marginLeft as api.Dimension);
+    checkDimension(o.marginRight as api.Dimension);
+    checkDimension(o.marginTop as api.Dimension);
     unittest.expect(o.pageNumberStart, unittest.equals(42));
-    checkSize(o.pageSize);
+    checkSize(o.pageSize as api.Size);
     unittest.expect(o.useCustomHeaderFooterMargins, unittest.isTrue);
     unittest.expect(o.useEvenPageHeaderFooter, unittest.isTrue);
     unittest.expect(o.useFirstPageHeaderFooter, unittest.isTrue);
@@ -1069,7 +1071,8 @@
 void checkDocumentStyleSuggestionState(api.DocumentStyleSuggestionState o) {
   buildCounterDocumentStyleSuggestionState++;
   if (buildCounterDocumentStyleSuggestionState < 3) {
-    checkBackgroundSuggestionState(o.backgroundSuggestionState);
+    checkBackgroundSuggestionState(
+        o.backgroundSuggestionState as api.BackgroundSuggestionState);
     unittest.expect(o.defaultFooterIdSuggested, unittest.isTrue);
     unittest.expect(o.defaultHeaderIdSuggested, unittest.isTrue);
     unittest.expect(o.evenPageFooterIdSuggested, unittest.isTrue);
@@ -1083,7 +1086,8 @@
     unittest.expect(o.marginRightSuggested, unittest.isTrue);
     unittest.expect(o.marginTopSuggested, unittest.isTrue);
     unittest.expect(o.pageNumberStartSuggested, unittest.isTrue);
-    checkSizeSuggestionState(o.pageSizeSuggestionState);
+    checkSizeSuggestionState(
+        o.pageSizeSuggestionState as api.SizeSuggestionState);
     unittest.expect(o.useCustomHeaderFooterMarginsSuggested, unittest.isTrue);
     unittest.expect(o.useEvenPageHeaderFooterSuggested, unittest.isTrue);
     unittest.expect(o.useFirstPageHeaderFooterSuggested, unittest.isTrue);
@@ -1148,15 +1152,18 @@
   buildCounterEmbeddedObject++;
   if (buildCounterEmbeddedObject < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkEmbeddedDrawingProperties(o.embeddedDrawingProperties);
-    checkEmbeddedObjectBorder(o.embeddedObjectBorder);
-    checkImageProperties(o.imageProperties);
-    checkLinkedContentReference(o.linkedContentReference);
-    checkDimension(o.marginBottom);
-    checkDimension(o.marginLeft);
-    checkDimension(o.marginRight);
-    checkDimension(o.marginTop);
-    checkSize(o.size);
+    checkEmbeddedDrawingProperties(
+        o.embeddedDrawingProperties as api.EmbeddedDrawingProperties);
+    checkEmbeddedObjectBorder(
+        o.embeddedObjectBorder as api.EmbeddedObjectBorder);
+    checkImageProperties(o.imageProperties as api.ImageProperties);
+    checkLinkedContentReference(
+        o.linkedContentReference as api.LinkedContentReference);
+    checkDimension(o.marginBottom as api.Dimension);
+    checkDimension(o.marginLeft as api.Dimension);
+    checkDimension(o.marginRight as api.Dimension);
+    checkDimension(o.marginTop as api.Dimension);
+    checkSize(o.size as api.Size);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterEmbeddedObject--;
@@ -1179,10 +1186,10 @@
 void checkEmbeddedObjectBorder(api.EmbeddedObjectBorder o) {
   buildCounterEmbeddedObjectBorder++;
   if (buildCounterEmbeddedObjectBorder < 3) {
-    checkOptionalColor(o.color);
+    checkOptionalColor(o.color as api.OptionalColor);
     unittest.expect(o.dashStyle, unittest.equals('foo'));
     unittest.expect(o.propertyState, unittest.equals('foo'));
-    checkDimension(o.width);
+    checkDimension(o.width as api.Dimension);
   }
   buildCounterEmbeddedObjectBorder--;
 }
@@ -1243,17 +1250,21 @@
   if (buildCounterEmbeddedObjectSuggestionState < 3) {
     unittest.expect(o.descriptionSuggested, unittest.isTrue);
     checkEmbeddedDrawingPropertiesSuggestionState(
-        o.embeddedDrawingPropertiesSuggestionState);
+        o.embeddedDrawingPropertiesSuggestionState
+            as api.EmbeddedDrawingPropertiesSuggestionState);
     checkEmbeddedObjectBorderSuggestionState(
-        o.embeddedObjectBorderSuggestionState);
-    checkImagePropertiesSuggestionState(o.imagePropertiesSuggestionState);
+        o.embeddedObjectBorderSuggestionState
+            as api.EmbeddedObjectBorderSuggestionState);
+    checkImagePropertiesSuggestionState(
+        o.imagePropertiesSuggestionState as api.ImagePropertiesSuggestionState);
     checkLinkedContentReferenceSuggestionState(
-        o.linkedContentReferenceSuggestionState);
+        o.linkedContentReferenceSuggestionState
+            as api.LinkedContentReferenceSuggestionState);
     unittest.expect(o.marginBottomSuggested, unittest.isTrue);
     unittest.expect(o.marginLeftSuggested, unittest.isTrue);
     unittest.expect(o.marginRightSuggested, unittest.isTrue);
     unittest.expect(o.marginTopSuggested, unittest.isTrue);
-    checkSizeSuggestionState(o.sizeSuggestionState);
+    checkSizeSuggestionState(o.sizeSuggestionState as api.SizeSuggestionState);
     unittest.expect(o.titleSuggested, unittest.isTrue);
   }
   buildCounterEmbeddedObjectSuggestionState--;
@@ -1334,8 +1345,8 @@
 
 void checkUnnamed5461(core.List<api.StructuralElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuralElement(o[0]);
-  checkStructuralElement(o[1]);
+  checkStructuralElement(o[0] as api.StructuralElement);
+  checkStructuralElement(o[1] as api.StructuralElement);
 }
 
 core.int buildCounterFooter = 0;
@@ -1368,8 +1379,8 @@
 
 void checkUnnamed5462(core.List<api.StructuralElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuralElement(o[0]);
-  checkStructuralElement(o[1]);
+  checkStructuralElement(o[0] as api.StructuralElement);
+  checkStructuralElement(o[1] as api.StructuralElement);
 }
 
 core.int buildCounterFootnote = 0;
@@ -1428,8 +1439,8 @@
 
 void checkUnnamed5465(core.Map<core.String, api.SuggestedTextStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTextStyle(o['x']);
-  checkSuggestedTextStyle(o['y']);
+  checkSuggestedTextStyle(o['x'] as api.SuggestedTextStyle);
+  checkSuggestedTextStyle(o['y'] as api.SuggestedTextStyle);
 }
 
 core.int buildCounterFootnoteReference = 0;
@@ -1456,7 +1467,7 @@
     checkUnnamed5463(o.suggestedDeletionIds);
     checkUnnamed5464(o.suggestedInsertionIds);
     checkUnnamed5465(o.suggestedTextStyleChanges);
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterFootnoteReference--;
 }
@@ -1470,8 +1481,8 @@
 
 void checkUnnamed5466(core.List<api.StructuralElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuralElement(o[0]);
-  checkStructuralElement(o[1]);
+  checkStructuralElement(o[0] as api.StructuralElement);
+  checkStructuralElement(o[1] as api.StructuralElement);
 }
 
 core.int buildCounterHeader = 0;
@@ -1530,8 +1541,8 @@
 
 void checkUnnamed5469(core.Map<core.String, api.SuggestedTextStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTextStyle(o['x']);
-  checkSuggestedTextStyle(o['y']);
+  checkSuggestedTextStyle(o['x'] as api.SuggestedTextStyle);
+  checkSuggestedTextStyle(o['y'] as api.SuggestedTextStyle);
 }
 
 core.int buildCounterHorizontalRule = 0;
@@ -1554,7 +1565,7 @@
     checkUnnamed5467(o.suggestedDeletionIds);
     checkUnnamed5468(o.suggestedInsertionIds);
     checkUnnamed5469(o.suggestedTextStyleChanges);
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterHorizontalRule--;
 }
@@ -1583,7 +1594,7 @@
     unittest.expect(o.brightness, unittest.equals(42.0));
     unittest.expect(o.contentUri, unittest.equals('foo'));
     unittest.expect(o.contrast, unittest.equals(42.0));
-    checkCropProperties(o.cropProperties);
+    checkCropProperties(o.cropProperties as api.CropProperties);
     unittest.expect(o.sourceUri, unittest.equals('foo'));
     unittest.expect(o.transparency, unittest.equals(42.0));
   }
@@ -1614,7 +1625,8 @@
     unittest.expect(o.brightnessSuggested, unittest.isTrue);
     unittest.expect(o.contentUriSuggested, unittest.isTrue);
     unittest.expect(o.contrastSuggested, unittest.isTrue);
-    checkCropPropertiesSuggestionState(o.cropPropertiesSuggestionState);
+    checkCropPropertiesSuggestionState(
+        o.cropPropertiesSuggestionState as api.CropPropertiesSuggestionState);
     unittest.expect(o.sourceUriSuggested, unittest.isTrue);
     unittest.expect(o.transparencySuggested, unittest.isTrue);
   }
@@ -1644,8 +1656,10 @@
 void checkUnnamed5471(
     core.Map<core.String, api.SuggestedInlineObjectProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedInlineObjectProperties(o['x']);
-  checkSuggestedInlineObjectProperties(o['y']);
+  checkSuggestedInlineObjectProperties(
+      o['x'] as api.SuggestedInlineObjectProperties);
+  checkSuggestedInlineObjectProperties(
+      o['y'] as api.SuggestedInlineObjectProperties);
 }
 
 core.int buildCounterInlineObject = 0;
@@ -1666,7 +1680,8 @@
 void checkInlineObject(api.InlineObject o) {
   buildCounterInlineObject++;
   if (buildCounterInlineObject < 3) {
-    checkInlineObjectProperties(o.inlineObjectProperties);
+    checkInlineObjectProperties(
+        o.inlineObjectProperties as api.InlineObjectProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
     checkUnnamed5470(o.suggestedDeletionIds);
     checkUnnamed5471(o.suggestedInlineObjectPropertiesChanges);
@@ -1710,8 +1725,8 @@
 
 void checkUnnamed5474(core.Map<core.String, api.SuggestedTextStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTextStyle(o['x']);
-  checkSuggestedTextStyle(o['y']);
+  checkSuggestedTextStyle(o['x'] as api.SuggestedTextStyle);
+  checkSuggestedTextStyle(o['y'] as api.SuggestedTextStyle);
 }
 
 core.int buildCounterInlineObjectElement = 0;
@@ -1736,7 +1751,7 @@
     checkUnnamed5472(o.suggestedDeletionIds);
     checkUnnamed5473(o.suggestedInsertionIds);
     checkUnnamed5474(o.suggestedTextStyleChanges);
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterInlineObjectElement--;
 }
@@ -1755,7 +1770,7 @@
 void checkInlineObjectProperties(api.InlineObjectProperties o) {
   buildCounterInlineObjectProperties++;
   if (buildCounterInlineObjectProperties < 3) {
-    checkEmbeddedObject(o.embeddedObject);
+    checkEmbeddedObject(o.embeddedObject as api.EmbeddedObject);
   }
   buildCounterInlineObjectProperties--;
 }
@@ -1776,7 +1791,8 @@
     api.InlineObjectPropertiesSuggestionState o) {
   buildCounterInlineObjectPropertiesSuggestionState++;
   if (buildCounterInlineObjectPropertiesSuggestionState < 3) {
-    checkEmbeddedObjectSuggestionState(o.embeddedObjectSuggestionState);
+    checkEmbeddedObjectSuggestionState(
+        o.embeddedObjectSuggestionState as api.EmbeddedObjectSuggestionState);
   }
   buildCounterInlineObjectPropertiesSuggestionState--;
 }
@@ -1798,9 +1814,10 @@
 void checkInsertInlineImageRequest(api.InsertInlineImageRequest o) {
   buildCounterInsertInlineImageRequest++;
   if (buildCounterInsertInlineImageRequest < 3) {
-    checkEndOfSegmentLocation(o.endOfSegmentLocation);
-    checkLocation(o.location);
-    checkSize(o.objectSize);
+    checkEndOfSegmentLocation(
+        o.endOfSegmentLocation as api.EndOfSegmentLocation);
+    checkLocation(o.location as api.Location);
+    checkSize(o.objectSize as api.Size);
     unittest.expect(o.uri, unittest.equals('foo'));
   }
   buildCounterInsertInlineImageRequest--;
@@ -1860,8 +1877,9 @@
 void checkInsertPageBreakRequest(api.InsertPageBreakRequest o) {
   buildCounterInsertPageBreakRequest++;
   if (buildCounterInsertPageBreakRequest < 3) {
-    checkEndOfSegmentLocation(o.endOfSegmentLocation);
-    checkLocation(o.location);
+    checkEndOfSegmentLocation(
+        o.endOfSegmentLocation as api.EndOfSegmentLocation);
+    checkLocation(o.location as api.Location);
   }
   buildCounterInsertPageBreakRequest--;
 }
@@ -1882,8 +1900,9 @@
 void checkInsertSectionBreakRequest(api.InsertSectionBreakRequest o) {
   buildCounterInsertSectionBreakRequest++;
   if (buildCounterInsertSectionBreakRequest < 3) {
-    checkEndOfSegmentLocation(o.endOfSegmentLocation);
-    checkLocation(o.location);
+    checkEndOfSegmentLocation(
+        o.endOfSegmentLocation as api.EndOfSegmentLocation);
+    checkLocation(o.location as api.Location);
     unittest.expect(o.sectionType, unittest.equals('foo'));
   }
   buildCounterInsertSectionBreakRequest--;
@@ -1905,7 +1924,7 @@
   buildCounterInsertTableColumnRequest++;
   if (buildCounterInsertTableColumnRequest < 3) {
     unittest.expect(o.insertRight, unittest.isTrue);
-    checkTableCellLocation(o.tableCellLocation);
+    checkTableCellLocation(o.tableCellLocation as api.TableCellLocation);
   }
   buildCounterInsertTableColumnRequest--;
 }
@@ -1928,8 +1947,9 @@
   buildCounterInsertTableRequest++;
   if (buildCounterInsertTableRequest < 3) {
     unittest.expect(o.columns, unittest.equals(42));
-    checkEndOfSegmentLocation(o.endOfSegmentLocation);
-    checkLocation(o.location);
+    checkEndOfSegmentLocation(
+        o.endOfSegmentLocation as api.EndOfSegmentLocation);
+    checkLocation(o.location as api.Location);
     unittest.expect(o.rows, unittest.equals(42));
   }
   buildCounterInsertTableRequest--;
@@ -1951,7 +1971,7 @@
   buildCounterInsertTableRowRequest++;
   if (buildCounterInsertTableRowRequest < 3) {
     unittest.expect(o.insertBelow, unittest.isTrue);
-    checkTableCellLocation(o.tableCellLocation);
+    checkTableCellLocation(o.tableCellLocation as api.TableCellLocation);
   }
   buildCounterInsertTableRowRequest--;
 }
@@ -1972,8 +1992,9 @@
 void checkInsertTextRequest(api.InsertTextRequest o) {
   buildCounterInsertTextRequest++;
   if (buildCounterInsertTextRequest < 3) {
-    checkEndOfSegmentLocation(o.endOfSegmentLocation);
-    checkLocation(o.location);
+    checkEndOfSegmentLocation(
+        o.endOfSegmentLocation as api.EndOfSegmentLocation);
+    checkLocation(o.location as api.Location);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterInsertTextRequest--;
@@ -2016,7 +2037,8 @@
 void checkLinkedContentReference(api.LinkedContentReference o) {
   buildCounterLinkedContentReference++;
   if (buildCounterLinkedContentReference < 3) {
-    checkSheetsChartReference(o.sheetsChartReference);
+    checkSheetsChartReference(
+        o.sheetsChartReference as api.SheetsChartReference);
   }
   buildCounterLinkedContentReference--;
 }
@@ -2039,7 +2061,8 @@
   buildCounterLinkedContentReferenceSuggestionState++;
   if (buildCounterLinkedContentReferenceSuggestionState < 3) {
     checkSheetsChartReferenceSuggestionState(
-        o.sheetsChartReferenceSuggestionState);
+        o.sheetsChartReferenceSuggestionState
+            as api.SheetsChartReferenceSuggestionState);
   }
   buildCounterLinkedContentReferenceSuggestionState--;
 }
@@ -2066,8 +2089,8 @@
 
 void checkUnnamed5476(core.Map<core.String, api.SuggestedListProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedListProperties(o['x']);
-  checkSuggestedListProperties(o['y']);
+  checkSuggestedListProperties(o['x'] as api.SuggestedListProperties);
+  checkSuggestedListProperties(o['y'] as api.SuggestedListProperties);
 }
 
 core.int buildCounterList = 0;
@@ -2087,7 +2110,7 @@
 void checkList(api.List o) {
   buildCounterList++;
   if (buildCounterList < 3) {
-    checkListProperties(o.listProperties);
+    checkListProperties(o.listProperties as api.ListProperties);
     checkUnnamed5475(o.suggestedDeletionIds);
     unittest.expect(o.suggestedInsertionId, unittest.equals('foo'));
     checkUnnamed5476(o.suggestedListPropertiesChanges);
@@ -2104,8 +2127,8 @@
 
 void checkUnnamed5477(core.List<api.NestingLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNestingLevel(o[0]);
-  checkNestingLevel(o[1]);
+  checkNestingLevel(o[0] as api.NestingLevel);
+  checkNestingLevel(o[1] as api.NestingLevel);
 }
 
 core.int buildCounterListProperties = 0;
@@ -2136,8 +2159,8 @@
 
 void checkUnnamed5478(core.List<api.NestingLevelSuggestionState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNestingLevelSuggestionState(o[0]);
-  checkNestingLevelSuggestionState(o[1]);
+  checkNestingLevelSuggestionState(o[0] as api.NestingLevelSuggestionState);
+  checkNestingLevelSuggestionState(o[1] as api.NestingLevelSuggestionState);
 }
 
 core.int buildCounterListPropertiesSuggestionState = 0;
@@ -2194,7 +2217,7 @@
 void checkMergeTableCellsRequest(api.MergeTableCellsRequest o) {
   buildCounterMergeTableCellsRequest++;
   if (buildCounterMergeTableCellsRequest < 3) {
-    checkTableRange(o.tableRange);
+    checkTableRange(o.tableRange as api.TableRange);
   }
   buildCounterMergeTableCellsRequest--;
 }
@@ -2208,8 +2231,8 @@
 
 void checkUnnamed5479(core.List<api.Range> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRange(o[0]);
-  checkRange(o[1]);
+  checkRange(o[0] as api.Range);
+  checkRange(o[1] as api.Range);
 }
 
 core.int buildCounterNamedRange = 0;
@@ -2244,8 +2267,8 @@
 
 void checkUnnamed5480(core.List<api.NamedRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedRange(o[0]);
-  checkNamedRange(o[1]);
+  checkNamedRange(o[0] as api.NamedRange);
+  checkNamedRange(o[1] as api.NamedRange);
 }
 
 core.int buildCounterNamedRanges = 0;
@@ -2286,8 +2309,8 @@
   buildCounterNamedStyle++;
   if (buildCounterNamedStyle < 3) {
     unittest.expect(o.namedStyleType, unittest.equals('foo'));
-    checkParagraphStyle(o.paragraphStyle);
-    checkTextStyle(o.textStyle);
+    checkParagraphStyle(o.paragraphStyle as api.ParagraphStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterNamedStyle--;
 }
@@ -2309,8 +2332,10 @@
   buildCounterNamedStyleSuggestionState++;
   if (buildCounterNamedStyleSuggestionState < 3) {
     unittest.expect(o.namedStyleType, unittest.equals('foo'));
-    checkParagraphStyleSuggestionState(o.paragraphStyleSuggestionState);
-    checkTextStyleSuggestionState(o.textStyleSuggestionState);
+    checkParagraphStyleSuggestionState(
+        o.paragraphStyleSuggestionState as api.ParagraphStyleSuggestionState);
+    checkTextStyleSuggestionState(
+        o.textStyleSuggestionState as api.TextStyleSuggestionState);
   }
   buildCounterNamedStyleSuggestionState--;
 }
@@ -2324,8 +2349,8 @@
 
 void checkUnnamed5481(core.List<api.NamedStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedStyle(o[0]);
-  checkNamedStyle(o[1]);
+  checkNamedStyle(o[0] as api.NamedStyle);
+  checkNamedStyle(o[1] as api.NamedStyle);
 }
 
 core.int buildCounterNamedStyles = 0;
@@ -2356,8 +2381,8 @@
 
 void checkUnnamed5482(core.List<api.NamedStyleSuggestionState> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedStyleSuggestionState(o[0]);
-  checkNamedStyleSuggestionState(o[1]);
+  checkNamedStyleSuggestionState(o[0] as api.NamedStyleSuggestionState);
+  checkNamedStyleSuggestionState(o[1] as api.NamedStyleSuggestionState);
 }
 
 core.int buildCounterNamedStylesSuggestionState = 0;
@@ -2404,10 +2429,10 @@
     unittest.expect(o.glyphFormat, unittest.equals('foo'));
     unittest.expect(o.glyphSymbol, unittest.equals('foo'));
     unittest.expect(o.glyphType, unittest.equals('foo'));
-    checkDimension(o.indentFirstLine);
-    checkDimension(o.indentStart);
+    checkDimension(o.indentFirstLine as api.Dimension);
+    checkDimension(o.indentStart as api.Dimension);
     unittest.expect(o.startNumber, unittest.equals(42));
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterNestingLevel--;
 }
@@ -2440,7 +2465,8 @@
     unittest.expect(o.indentFirstLineSuggested, unittest.isTrue);
     unittest.expect(o.indentStartSuggested, unittest.isTrue);
     unittest.expect(o.startNumberSuggested, unittest.isTrue);
-    checkTextStyleSuggestionState(o.textStyleSuggestionState);
+    checkTextStyleSuggestionState(
+        o.textStyleSuggestionState as api.TextStyleSuggestionState);
   }
   buildCounterNestingLevelSuggestionState--;
 }
@@ -2491,7 +2517,7 @@
 void checkOptionalColor(api.OptionalColor o) {
   buildCounterOptionalColor++;
   if (buildCounterOptionalColor < 3) {
-    checkColor(o.color);
+    checkColor(o.color as api.Color);
   }
   buildCounterOptionalColor--;
 }
@@ -2531,8 +2557,8 @@
 
 void checkUnnamed5486(core.Map<core.String, api.SuggestedTextStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTextStyle(o['x']);
-  checkSuggestedTextStyle(o['y']);
+  checkSuggestedTextStyle(o['x'] as api.SuggestedTextStyle);
+  checkSuggestedTextStyle(o['y'] as api.SuggestedTextStyle);
 }
 
 core.int buildCounterPageBreak = 0;
@@ -2555,7 +2581,7 @@
     checkUnnamed5484(o.suggestedDeletionIds);
     checkUnnamed5485(o.suggestedInsertionIds);
     checkUnnamed5486(o.suggestedTextStyleChanges);
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterPageBreak--;
 }
@@ -2569,8 +2595,8 @@
 
 void checkUnnamed5487(core.List<api.ParagraphElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParagraphElement(o[0]);
-  checkParagraphElement(o[1]);
+  checkParagraphElement(o[0] as api.ParagraphElement);
+  checkParagraphElement(o[1] as api.ParagraphElement);
 }
 
 core.List<core.String> buildUnnamed5488() {
@@ -2595,8 +2621,8 @@
 
 void checkUnnamed5489(core.Map<core.String, api.SuggestedBullet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedBullet(o['x']);
-  checkSuggestedBullet(o['y']);
+  checkSuggestedBullet(o['x'] as api.SuggestedBullet);
+  checkSuggestedBullet(o['y'] as api.SuggestedBullet);
 }
 
 core.Map<core.String, api.SuggestedParagraphStyle> buildUnnamed5490() {
@@ -2608,8 +2634,8 @@
 
 void checkUnnamed5490(core.Map<core.String, api.SuggestedParagraphStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedParagraphStyle(o['x']);
-  checkSuggestedParagraphStyle(o['y']);
+  checkSuggestedParagraphStyle(o['x'] as api.SuggestedParagraphStyle);
+  checkSuggestedParagraphStyle(o['y'] as api.SuggestedParagraphStyle);
 }
 
 core.Map<core.String, api.ObjectReferences> buildUnnamed5491() {
@@ -2621,8 +2647,8 @@
 
 void checkUnnamed5491(core.Map<core.String, api.ObjectReferences> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkObjectReferences(o['x']);
-  checkObjectReferences(o['y']);
+  checkObjectReferences(o['x'] as api.ObjectReferences);
+  checkObjectReferences(o['y'] as api.ObjectReferences);
 }
 
 core.int buildCounterParagraph = 0;
@@ -2645,9 +2671,9 @@
 void checkParagraph(api.Paragraph o) {
   buildCounterParagraph++;
   if (buildCounterParagraph < 3) {
-    checkBullet(o.bullet);
+    checkBullet(o.bullet as api.Bullet);
     checkUnnamed5487(o.elements);
-    checkParagraphStyle(o.paragraphStyle);
+    checkParagraphStyle(o.paragraphStyle as api.ParagraphStyle);
     checkUnnamed5488(o.positionedObjectIds);
     checkUnnamed5489(o.suggestedBulletChanges);
     checkUnnamed5490(o.suggestedParagraphStyleChanges);
@@ -2673,10 +2699,10 @@
 void checkParagraphBorder(api.ParagraphBorder o) {
   buildCounterParagraphBorder++;
   if (buildCounterParagraphBorder < 3) {
-    checkOptionalColor(o.color);
+    checkOptionalColor(o.color as api.OptionalColor);
     unittest.expect(o.dashStyle, unittest.equals('foo'));
-    checkDimension(o.padding);
-    checkDimension(o.width);
+    checkDimension(o.padding as api.Dimension);
+    checkDimension(o.width as api.Dimension);
   }
   buildCounterParagraphBorder--;
 }
@@ -2704,16 +2730,16 @@
 void checkParagraphElement(api.ParagraphElement o) {
   buildCounterParagraphElement++;
   if (buildCounterParagraphElement < 3) {
-    checkAutoText(o.autoText);
-    checkColumnBreak(o.columnBreak);
+    checkAutoText(o.autoText as api.AutoText);
+    checkColumnBreak(o.columnBreak as api.ColumnBreak);
     unittest.expect(o.endIndex, unittest.equals(42));
-    checkEquation(o.equation);
-    checkFootnoteReference(o.footnoteReference);
-    checkHorizontalRule(o.horizontalRule);
-    checkInlineObjectElement(o.inlineObjectElement);
-    checkPageBreak(o.pageBreak);
+    checkEquation(o.equation as api.Equation);
+    checkFootnoteReference(o.footnoteReference as api.FootnoteReference);
+    checkHorizontalRule(o.horizontalRule as api.HorizontalRule);
+    checkInlineObjectElement(o.inlineObjectElement as api.InlineObjectElement);
+    checkPageBreak(o.pageBreak as api.PageBreak);
     unittest.expect(o.startIndex, unittest.equals(42));
-    checkTextRun(o.textRun);
+    checkTextRun(o.textRun as api.TextRun);
   }
   buildCounterParagraphElement--;
 }
@@ -2727,8 +2753,8 @@
 
 void checkUnnamed5492(core.List<api.TabStop> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTabStop(o[0]);
-  checkTabStop(o[1]);
+  checkTabStop(o[0] as api.TabStop);
+  checkTabStop(o[1] as api.TabStop);
 }
 
 core.int buildCounterParagraphStyle = 0;
@@ -2767,23 +2793,23 @@
   if (buildCounterParagraphStyle < 3) {
     unittest.expect(o.alignment, unittest.equals('foo'));
     unittest.expect(o.avoidWidowAndOrphan, unittest.isTrue);
-    checkParagraphBorder(o.borderBetween);
-    checkParagraphBorder(o.borderBottom);
-    checkParagraphBorder(o.borderLeft);
-    checkParagraphBorder(o.borderRight);
-    checkParagraphBorder(o.borderTop);
+    checkParagraphBorder(o.borderBetween as api.ParagraphBorder);
+    checkParagraphBorder(o.borderBottom as api.ParagraphBorder);
+    checkParagraphBorder(o.borderLeft as api.ParagraphBorder);
+    checkParagraphBorder(o.borderRight as api.ParagraphBorder);
+    checkParagraphBorder(o.borderTop as api.ParagraphBorder);
     unittest.expect(o.direction, unittest.equals('foo'));
     unittest.expect(o.headingId, unittest.equals('foo'));
-    checkDimension(o.indentEnd);
-    checkDimension(o.indentFirstLine);
-    checkDimension(o.indentStart);
+    checkDimension(o.indentEnd as api.Dimension);
+    checkDimension(o.indentFirstLine as api.Dimension);
+    checkDimension(o.indentStart as api.Dimension);
     unittest.expect(o.keepLinesTogether, unittest.isTrue);
     unittest.expect(o.keepWithNext, unittest.isTrue);
     unittest.expect(o.lineSpacing, unittest.equals(42.0));
     unittest.expect(o.namedStyleType, unittest.equals('foo'));
-    checkShading(o.shading);
-    checkDimension(o.spaceAbove);
-    checkDimension(o.spaceBelow);
+    checkShading(o.shading as api.Shading);
+    checkDimension(o.spaceAbove as api.Dimension);
+    checkDimension(o.spaceBelow as api.Dimension);
     unittest.expect(o.spacingMode, unittest.equals('foo'));
     checkUnnamed5492(o.tabStops);
   }
@@ -2839,7 +2865,8 @@
     unittest.expect(o.keepWithNextSuggested, unittest.isTrue);
     unittest.expect(o.lineSpacingSuggested, unittest.isTrue);
     unittest.expect(o.namedStyleTypeSuggested, unittest.isTrue);
-    checkShadingSuggestionState(o.shadingSuggestionState);
+    checkShadingSuggestionState(
+        o.shadingSuggestionState as api.ShadingSuggestionState);
     unittest.expect(o.spaceAboveSuggested, unittest.isTrue);
     unittest.expect(o.spaceBelowSuggested, unittest.isTrue);
     unittest.expect(o.spacingModeSuggested, unittest.isTrue);
@@ -2871,8 +2898,10 @@
 void checkUnnamed5494(
     core.Map<core.String, api.SuggestedPositionedObjectProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedPositionedObjectProperties(o['x']);
-  checkSuggestedPositionedObjectProperties(o['y']);
+  checkSuggestedPositionedObjectProperties(
+      o['x'] as api.SuggestedPositionedObjectProperties);
+  checkSuggestedPositionedObjectProperties(
+      o['y'] as api.SuggestedPositionedObjectProperties);
 }
 
 core.int buildCounterPositionedObject = 0;
@@ -2894,7 +2923,8 @@
   buildCounterPositionedObject++;
   if (buildCounterPositionedObject < 3) {
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkPositionedObjectProperties(o.positionedObjectProperties);
+    checkPositionedObjectProperties(
+        o.positionedObjectProperties as api.PositionedObjectProperties);
     checkUnnamed5493(o.suggestedDeletionIds);
     unittest.expect(o.suggestedInsertionId, unittest.equals('foo'));
     checkUnnamed5494(o.suggestedPositionedObjectPropertiesChanges);
@@ -2919,8 +2949,8 @@
   buildCounterPositionedObjectPositioning++;
   if (buildCounterPositionedObjectPositioning < 3) {
     unittest.expect(o.layout, unittest.equals('foo'));
-    checkDimension(o.leftOffset);
-    checkDimension(o.topOffset);
+    checkDimension(o.leftOffset as api.Dimension);
+    checkDimension(o.topOffset as api.Dimension);
   }
   buildCounterPositionedObjectPositioning--;
 }
@@ -2965,8 +2995,9 @@
 void checkPositionedObjectProperties(api.PositionedObjectProperties o) {
   buildCounterPositionedObjectProperties++;
   if (buildCounterPositionedObjectProperties < 3) {
-    checkEmbeddedObject(o.embeddedObject);
-    checkPositionedObjectPositioning(o.positioning);
+    checkEmbeddedObject(o.embeddedObject as api.EmbeddedObject);
+    checkPositionedObjectPositioning(
+        o.positioning as api.PositionedObjectPositioning);
   }
   buildCounterPositionedObjectProperties--;
 }
@@ -2989,9 +3020,10 @@
     api.PositionedObjectPropertiesSuggestionState o) {
   buildCounterPositionedObjectPropertiesSuggestionState++;
   if (buildCounterPositionedObjectPropertiesSuggestionState < 3) {
-    checkEmbeddedObjectSuggestionState(o.embeddedObjectSuggestionState);
-    checkPositionedObjectPositioningSuggestionState(
-        o.positioningSuggestionState);
+    checkEmbeddedObjectSuggestionState(
+        o.embeddedObjectSuggestionState as api.EmbeddedObjectSuggestionState);
+    checkPositionedObjectPositioningSuggestionState(o.positioningSuggestionState
+        as api.PositionedObjectPositioningSuggestionState);
   }
   buildCounterPositionedObjectPropertiesSuggestionState--;
 }
@@ -3034,7 +3066,7 @@
 void checkReplaceAllTextRequest(api.ReplaceAllTextRequest o) {
   buildCounterReplaceAllTextRequest++;
   if (buildCounterReplaceAllTextRequest < 3) {
-    checkSubstringMatchCriteria(o.containsText);
+    checkSubstringMatchCriteria(o.containsText as api.SubstringMatchCriteria);
     unittest.expect(o.replaceText, unittest.equals('foo'));
   }
   buildCounterReplaceAllTextRequest--;
@@ -3151,38 +3183,59 @@
 void checkRequest(api.Request o) {
   buildCounterRequest++;
   if (buildCounterRequest < 3) {
-    checkCreateFooterRequest(o.createFooter);
-    checkCreateFootnoteRequest(o.createFootnote);
-    checkCreateHeaderRequest(o.createHeader);
-    checkCreateNamedRangeRequest(o.createNamedRange);
-    checkCreateParagraphBulletsRequest(o.createParagraphBullets);
-    checkDeleteContentRangeRequest(o.deleteContentRange);
-    checkDeleteFooterRequest(o.deleteFooter);
-    checkDeleteHeaderRequest(o.deleteHeader);
-    checkDeleteNamedRangeRequest(o.deleteNamedRange);
-    checkDeleteParagraphBulletsRequest(o.deleteParagraphBullets);
-    checkDeletePositionedObjectRequest(o.deletePositionedObject);
-    checkDeleteTableColumnRequest(o.deleteTableColumn);
-    checkDeleteTableRowRequest(o.deleteTableRow);
-    checkInsertInlineImageRequest(o.insertInlineImage);
-    checkInsertPageBreakRequest(o.insertPageBreak);
-    checkInsertSectionBreakRequest(o.insertSectionBreak);
-    checkInsertTableRequest(o.insertTable);
-    checkInsertTableColumnRequest(o.insertTableColumn);
-    checkInsertTableRowRequest(o.insertTableRow);
-    checkInsertTextRequest(o.insertText);
-    checkMergeTableCellsRequest(o.mergeTableCells);
-    checkReplaceAllTextRequest(o.replaceAllText);
-    checkReplaceImageRequest(o.replaceImage);
-    checkReplaceNamedRangeContentRequest(o.replaceNamedRangeContent);
-    checkUnmergeTableCellsRequest(o.unmergeTableCells);
-    checkUpdateDocumentStyleRequest(o.updateDocumentStyle);
-    checkUpdateParagraphStyleRequest(o.updateParagraphStyle);
-    checkUpdateSectionStyleRequest(o.updateSectionStyle);
-    checkUpdateTableCellStyleRequest(o.updateTableCellStyle);
-    checkUpdateTableColumnPropertiesRequest(o.updateTableColumnProperties);
-    checkUpdateTableRowStyleRequest(o.updateTableRowStyle);
-    checkUpdateTextStyleRequest(o.updateTextStyle);
+    checkCreateFooterRequest(o.createFooter as api.CreateFooterRequest);
+    checkCreateFootnoteRequest(o.createFootnote as api.CreateFootnoteRequest);
+    checkCreateHeaderRequest(o.createHeader as api.CreateHeaderRequest);
+    checkCreateNamedRangeRequest(
+        o.createNamedRange as api.CreateNamedRangeRequest);
+    checkCreateParagraphBulletsRequest(
+        o.createParagraphBullets as api.CreateParagraphBulletsRequest);
+    checkDeleteContentRangeRequest(
+        o.deleteContentRange as api.DeleteContentRangeRequest);
+    checkDeleteFooterRequest(o.deleteFooter as api.DeleteFooterRequest);
+    checkDeleteHeaderRequest(o.deleteHeader as api.DeleteHeaderRequest);
+    checkDeleteNamedRangeRequest(
+        o.deleteNamedRange as api.DeleteNamedRangeRequest);
+    checkDeleteParagraphBulletsRequest(
+        o.deleteParagraphBullets as api.DeleteParagraphBulletsRequest);
+    checkDeletePositionedObjectRequest(
+        o.deletePositionedObject as api.DeletePositionedObjectRequest);
+    checkDeleteTableColumnRequest(
+        o.deleteTableColumn as api.DeleteTableColumnRequest);
+    checkDeleteTableRowRequest(o.deleteTableRow as api.DeleteTableRowRequest);
+    checkInsertInlineImageRequest(
+        o.insertInlineImage as api.InsertInlineImageRequest);
+    checkInsertPageBreakRequest(
+        o.insertPageBreak as api.InsertPageBreakRequest);
+    checkInsertSectionBreakRequest(
+        o.insertSectionBreak as api.InsertSectionBreakRequest);
+    checkInsertTableRequest(o.insertTable as api.InsertTableRequest);
+    checkInsertTableColumnRequest(
+        o.insertTableColumn as api.InsertTableColumnRequest);
+    checkInsertTableRowRequest(o.insertTableRow as api.InsertTableRowRequest);
+    checkInsertTextRequest(o.insertText as api.InsertTextRequest);
+    checkMergeTableCellsRequest(
+        o.mergeTableCells as api.MergeTableCellsRequest);
+    checkReplaceAllTextRequest(o.replaceAllText as api.ReplaceAllTextRequest);
+    checkReplaceImageRequest(o.replaceImage as api.ReplaceImageRequest);
+    checkReplaceNamedRangeContentRequest(
+        o.replaceNamedRangeContent as api.ReplaceNamedRangeContentRequest);
+    checkUnmergeTableCellsRequest(
+        o.unmergeTableCells as api.UnmergeTableCellsRequest);
+    checkUpdateDocumentStyleRequest(
+        o.updateDocumentStyle as api.UpdateDocumentStyleRequest);
+    checkUpdateParagraphStyleRequest(
+        o.updateParagraphStyle as api.UpdateParagraphStyleRequest);
+    checkUpdateSectionStyleRequest(
+        o.updateSectionStyle as api.UpdateSectionStyleRequest);
+    checkUpdateTableCellStyleRequest(
+        o.updateTableCellStyle as api.UpdateTableCellStyleRequest);
+    checkUpdateTableColumnPropertiesRequest(o.updateTableColumnProperties
+        as api.UpdateTableColumnPropertiesRequest);
+    checkUpdateTableRowStyleRequest(
+        o.updateTableRowStyle as api.UpdateTableRowStyleRequest);
+    checkUpdateTextStyleRequest(
+        o.updateTextStyle as api.UpdateTextStyleRequest);
   }
   buildCounterRequest--;
 }
@@ -3207,13 +3260,16 @@
 void checkResponse(api.Response o) {
   buildCounterResponse++;
   if (buildCounterResponse < 3) {
-    checkCreateFooterResponse(o.createFooter);
-    checkCreateFootnoteResponse(o.createFootnote);
-    checkCreateHeaderResponse(o.createHeader);
-    checkCreateNamedRangeResponse(o.createNamedRange);
-    checkInsertInlineImageResponse(o.insertInlineImage);
-    checkInsertInlineSheetsChartResponse(o.insertInlineSheetsChart);
-    checkReplaceAllTextResponse(o.replaceAllText);
+    checkCreateFooterResponse(o.createFooter as api.CreateFooterResponse);
+    checkCreateFootnoteResponse(o.createFootnote as api.CreateFootnoteResponse);
+    checkCreateHeaderResponse(o.createHeader as api.CreateHeaderResponse);
+    checkCreateNamedRangeResponse(
+        o.createNamedRange as api.CreateNamedRangeResponse);
+    checkInsertInlineImageResponse(
+        o.insertInlineImage as api.InsertInlineImageResponse);
+    checkInsertInlineSheetsChartResponse(
+        o.insertInlineSheetsChart as api.InsertInlineSheetsChartResponse);
+    checkReplaceAllTextResponse(o.replaceAllText as api.ReplaceAllTextResponse);
   }
   buildCounterResponse--;
 }
@@ -3283,7 +3339,7 @@
 void checkSectionBreak(api.SectionBreak o) {
   buildCounterSectionBreak++;
   if (buildCounterSectionBreak < 3) {
-    checkSectionStyle(o.sectionStyle);
+    checkSectionStyle(o.sectionStyle as api.SectionStyle);
     checkUnnamed5495(o.suggestedDeletionIds);
     checkUnnamed5496(o.suggestedInsertionIds);
   }
@@ -3305,8 +3361,8 @@
 void checkSectionColumnProperties(api.SectionColumnProperties o) {
   buildCounterSectionColumnProperties++;
   if (buildCounterSectionColumnProperties < 3) {
-    checkDimension(o.paddingEnd);
-    checkDimension(o.width);
+    checkDimension(o.paddingEnd as api.Dimension);
+    checkDimension(o.width as api.Dimension);
   }
   buildCounterSectionColumnProperties--;
 }
@@ -3320,8 +3376,8 @@
 
 void checkUnnamed5497(core.List<api.SectionColumnProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSectionColumnProperties(o[0]);
-  checkSectionColumnProperties(o[1]);
+  checkSectionColumnProperties(o[0] as api.SectionColumnProperties);
+  checkSectionColumnProperties(o[1] as api.SectionColumnProperties);
 }
 
 core.int buildCounterSectionStyle = 0;
@@ -3364,12 +3420,12 @@
     unittest.expect(o.evenPageHeaderId, unittest.equals('foo'));
     unittest.expect(o.firstPageFooterId, unittest.equals('foo'));
     unittest.expect(o.firstPageHeaderId, unittest.equals('foo'));
-    checkDimension(o.marginBottom);
-    checkDimension(o.marginFooter);
-    checkDimension(o.marginHeader);
-    checkDimension(o.marginLeft);
-    checkDimension(o.marginRight);
-    checkDimension(o.marginTop);
+    checkDimension(o.marginBottom as api.Dimension);
+    checkDimension(o.marginFooter as api.Dimension);
+    checkDimension(o.marginHeader as api.Dimension);
+    checkDimension(o.marginLeft as api.Dimension);
+    checkDimension(o.marginRight as api.Dimension);
+    checkDimension(o.marginTop as api.Dimension);
     unittest.expect(o.pageNumberStart, unittest.equals(42));
     unittest.expect(o.sectionType, unittest.equals('foo'));
     unittest.expect(o.useFirstPageHeaderFooter, unittest.isTrue);
@@ -3391,7 +3447,7 @@
 void checkShading(api.Shading o) {
   buildCounterShading++;
   if (buildCounterShading < 3) {
-    checkOptionalColor(o.backgroundColor);
+    checkOptionalColor(o.backgroundColor as api.OptionalColor);
   }
   buildCounterShading--;
 }
@@ -3474,8 +3530,8 @@
 void checkSize(api.Size o) {
   buildCounterSize++;
   if (buildCounterSize < 3) {
-    checkDimension(o.height);
-    checkDimension(o.width);
+    checkDimension(o.height as api.Dimension);
+    checkDimension(o.width as api.Dimension);
   }
   buildCounterSize--;
 }
@@ -3521,11 +3577,11 @@
   buildCounterStructuralElement++;
   if (buildCounterStructuralElement < 3) {
     unittest.expect(o.endIndex, unittest.equals(42));
-    checkParagraph(o.paragraph);
-    checkSectionBreak(o.sectionBreak);
+    checkParagraph(o.paragraph as api.Paragraph);
+    checkSectionBreak(o.sectionBreak as api.SectionBreak);
     unittest.expect(o.startIndex, unittest.equals(42));
-    checkTable(o.table);
-    checkTableOfContents(o.tableOfContents);
+    checkTable(o.table as api.Table);
+    checkTableOfContents(o.tableOfContents as api.TableOfContents);
   }
   buildCounterStructuralElement--;
 }
@@ -3566,8 +3622,9 @@
 void checkSuggestedBullet(api.SuggestedBullet o) {
   buildCounterSuggestedBullet++;
   if (buildCounterSuggestedBullet < 3) {
-    checkBullet(o.bullet);
-    checkBulletSuggestionState(o.bulletSuggestionState);
+    checkBullet(o.bullet as api.Bullet);
+    checkBulletSuggestionState(
+        o.bulletSuggestionState as api.BulletSuggestionState);
   }
   buildCounterSuggestedBullet--;
 }
@@ -3587,8 +3644,9 @@
 void checkSuggestedDocumentStyle(api.SuggestedDocumentStyle o) {
   buildCounterSuggestedDocumentStyle++;
   if (buildCounterSuggestedDocumentStyle < 3) {
-    checkDocumentStyle(o.documentStyle);
-    checkDocumentStyleSuggestionState(o.documentStyleSuggestionState);
+    checkDocumentStyle(o.documentStyle as api.DocumentStyle);
+    checkDocumentStyleSuggestionState(
+        o.documentStyleSuggestionState as api.DocumentStyleSuggestionState);
   }
   buildCounterSuggestedDocumentStyle--;
 }
@@ -3610,9 +3668,11 @@
     api.SuggestedInlineObjectProperties o) {
   buildCounterSuggestedInlineObjectProperties++;
   if (buildCounterSuggestedInlineObjectProperties < 3) {
-    checkInlineObjectProperties(o.inlineObjectProperties);
+    checkInlineObjectProperties(
+        o.inlineObjectProperties as api.InlineObjectProperties);
     checkInlineObjectPropertiesSuggestionState(
-        o.inlineObjectPropertiesSuggestionState);
+        o.inlineObjectPropertiesSuggestionState
+            as api.InlineObjectPropertiesSuggestionState);
   }
   buildCounterSuggestedInlineObjectProperties--;
 }
@@ -3632,8 +3692,9 @@
 void checkSuggestedListProperties(api.SuggestedListProperties o) {
   buildCounterSuggestedListProperties++;
   if (buildCounterSuggestedListProperties < 3) {
-    checkListProperties(o.listProperties);
-    checkListPropertiesSuggestionState(o.listPropertiesSuggestionState);
+    checkListProperties(o.listProperties as api.ListProperties);
+    checkListPropertiesSuggestionState(
+        o.listPropertiesSuggestionState as api.ListPropertiesSuggestionState);
   }
   buildCounterSuggestedListProperties--;
 }
@@ -3653,8 +3714,9 @@
 void checkSuggestedNamedStyles(api.SuggestedNamedStyles o) {
   buildCounterSuggestedNamedStyles++;
   if (buildCounterSuggestedNamedStyles < 3) {
-    checkNamedStyles(o.namedStyles);
-    checkNamedStylesSuggestionState(o.namedStylesSuggestionState);
+    checkNamedStyles(o.namedStyles as api.NamedStyles);
+    checkNamedStylesSuggestionState(
+        o.namedStylesSuggestionState as api.NamedStylesSuggestionState);
   }
   buildCounterSuggestedNamedStyles--;
 }
@@ -3674,8 +3736,9 @@
 void checkSuggestedParagraphStyle(api.SuggestedParagraphStyle o) {
   buildCounterSuggestedParagraphStyle++;
   if (buildCounterSuggestedParagraphStyle < 3) {
-    checkParagraphStyle(o.paragraphStyle);
-    checkParagraphStyleSuggestionState(o.paragraphStyleSuggestionState);
+    checkParagraphStyle(o.paragraphStyle as api.ParagraphStyle);
+    checkParagraphStyleSuggestionState(
+        o.paragraphStyleSuggestionState as api.ParagraphStyleSuggestionState);
   }
   buildCounterSuggestedParagraphStyle--;
 }
@@ -3698,9 +3761,11 @@
     api.SuggestedPositionedObjectProperties o) {
   buildCounterSuggestedPositionedObjectProperties++;
   if (buildCounterSuggestedPositionedObjectProperties < 3) {
-    checkPositionedObjectProperties(o.positionedObjectProperties);
+    checkPositionedObjectProperties(
+        o.positionedObjectProperties as api.PositionedObjectProperties);
     checkPositionedObjectPropertiesSuggestionState(
-        o.positionedObjectPropertiesSuggestionState);
+        o.positionedObjectPropertiesSuggestionState
+            as api.PositionedObjectPropertiesSuggestionState);
   }
   buildCounterSuggestedPositionedObjectProperties--;
 }
@@ -3720,8 +3785,9 @@
 void checkSuggestedTableCellStyle(api.SuggestedTableCellStyle o) {
   buildCounterSuggestedTableCellStyle++;
   if (buildCounterSuggestedTableCellStyle < 3) {
-    checkTableCellStyle(o.tableCellStyle);
-    checkTableCellStyleSuggestionState(o.tableCellStyleSuggestionState);
+    checkTableCellStyle(o.tableCellStyle as api.TableCellStyle);
+    checkTableCellStyleSuggestionState(
+        o.tableCellStyleSuggestionState as api.TableCellStyleSuggestionState);
   }
   buildCounterSuggestedTableCellStyle--;
 }
@@ -3741,8 +3807,9 @@
 void checkSuggestedTableRowStyle(api.SuggestedTableRowStyle o) {
   buildCounterSuggestedTableRowStyle++;
   if (buildCounterSuggestedTableRowStyle < 3) {
-    checkTableRowStyle(o.tableRowStyle);
-    checkTableRowStyleSuggestionState(o.tableRowStyleSuggestionState);
+    checkTableRowStyle(o.tableRowStyle as api.TableRowStyle);
+    checkTableRowStyleSuggestionState(
+        o.tableRowStyleSuggestionState as api.TableRowStyleSuggestionState);
   }
   buildCounterSuggestedTableRowStyle--;
 }
@@ -3762,8 +3829,9 @@
 void checkSuggestedTextStyle(api.SuggestedTextStyle o) {
   buildCounterSuggestedTextStyle++;
   if (buildCounterSuggestedTextStyle < 3) {
-    checkTextStyle(o.textStyle);
-    checkTextStyleSuggestionState(o.textStyleSuggestionState);
+    checkTextStyle(o.textStyle as api.TextStyle);
+    checkTextStyleSuggestionState(
+        o.textStyleSuggestionState as api.TextStyleSuggestionState);
   }
   buildCounterSuggestedTextStyle--;
 }
@@ -3784,7 +3852,7 @@
   buildCounterTabStop++;
   if (buildCounterTabStop < 3) {
     unittest.expect(o.alignment, unittest.equals('foo'));
-    checkDimension(o.offset);
+    checkDimension(o.offset as api.Dimension);
   }
   buildCounterTabStop--;
 }
@@ -3824,8 +3892,8 @@
 
 void checkUnnamed5500(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableRow(o[0]);
-  checkTableRow(o[1]);
+  checkTableRow(o[0] as api.TableRow);
+  checkTableRow(o[1] as api.TableRow);
 }
 
 core.int buildCounterTable = 0;
@@ -3852,7 +3920,7 @@
     checkUnnamed5498(o.suggestedDeletionIds);
     checkUnnamed5499(o.suggestedInsertionIds);
     checkUnnamed5500(o.tableRows);
-    checkTableStyle(o.tableStyle);
+    checkTableStyle(o.tableStyle as api.TableStyle);
   }
   buildCounterTable--;
 }
@@ -3866,8 +3934,8 @@
 
 void checkUnnamed5501(core.List<api.StructuralElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuralElement(o[0]);
-  checkStructuralElement(o[1]);
+  checkStructuralElement(o[0] as api.StructuralElement);
+  checkStructuralElement(o[1] as api.StructuralElement);
 }
 
 core.List<core.String> buildUnnamed5502() {
@@ -3905,8 +3973,8 @@
 
 void checkUnnamed5504(core.Map<core.String, api.SuggestedTableCellStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTableCellStyle(o['x']);
-  checkSuggestedTableCellStyle(o['y']);
+  checkSuggestedTableCellStyle(o['x'] as api.SuggestedTableCellStyle);
+  checkSuggestedTableCellStyle(o['y'] as api.SuggestedTableCellStyle);
 }
 
 core.int buildCounterTableCell = 0;
@@ -3935,7 +4003,7 @@
     checkUnnamed5502(o.suggestedDeletionIds);
     checkUnnamed5503(o.suggestedInsertionIds);
     checkUnnamed5504(o.suggestedTableCellStyleChanges);
-    checkTableCellStyle(o.tableCellStyle);
+    checkTableCellStyle(o.tableCellStyle as api.TableCellStyle);
   }
   buildCounterTableCell--;
 }
@@ -3956,9 +4024,9 @@
 void checkTableCellBorder(api.TableCellBorder o) {
   buildCounterTableCellBorder++;
   if (buildCounterTableCellBorder < 3) {
-    checkOptionalColor(o.color);
+    checkOptionalColor(o.color as api.OptionalColor);
     unittest.expect(o.dashStyle, unittest.equals('foo'));
-    checkDimension(o.width);
+    checkDimension(o.width as api.Dimension);
   }
   buildCounterTableCellBorder--;
 }
@@ -3981,7 +4049,7 @@
   if (buildCounterTableCellLocation < 3) {
     unittest.expect(o.columnIndex, unittest.equals(42));
     unittest.expect(o.rowIndex, unittest.equals(42));
-    checkLocation(o.tableStartLocation);
+    checkLocation(o.tableStartLocation as api.Location);
   }
   buildCounterTableCellLocation--;
 }
@@ -4011,17 +4079,17 @@
 void checkTableCellStyle(api.TableCellStyle o) {
   buildCounterTableCellStyle++;
   if (buildCounterTableCellStyle < 3) {
-    checkOptionalColor(o.backgroundColor);
-    checkTableCellBorder(o.borderBottom);
-    checkTableCellBorder(o.borderLeft);
-    checkTableCellBorder(o.borderRight);
-    checkTableCellBorder(o.borderTop);
+    checkOptionalColor(o.backgroundColor as api.OptionalColor);
+    checkTableCellBorder(o.borderBottom as api.TableCellBorder);
+    checkTableCellBorder(o.borderLeft as api.TableCellBorder);
+    checkTableCellBorder(o.borderRight as api.TableCellBorder);
+    checkTableCellBorder(o.borderTop as api.TableCellBorder);
     unittest.expect(o.columnSpan, unittest.equals(42));
     unittest.expect(o.contentAlignment, unittest.equals('foo'));
-    checkDimension(o.paddingBottom);
-    checkDimension(o.paddingLeft);
-    checkDimension(o.paddingRight);
-    checkDimension(o.paddingTop);
+    checkDimension(o.paddingBottom as api.Dimension);
+    checkDimension(o.paddingLeft as api.Dimension);
+    checkDimension(o.paddingRight as api.Dimension);
+    checkDimension(o.paddingTop as api.Dimension);
     unittest.expect(o.rowSpan, unittest.equals(42));
   }
   buildCounterTableCellStyle--;
@@ -4083,7 +4151,7 @@
 void checkTableColumnProperties(api.TableColumnProperties o) {
   buildCounterTableColumnProperties++;
   if (buildCounterTableColumnProperties < 3) {
-    checkDimension(o.width);
+    checkDimension(o.width as api.Dimension);
     unittest.expect(o.widthType, unittest.equals('foo'));
   }
   buildCounterTableColumnProperties--;
@@ -4098,8 +4166,8 @@
 
 void checkUnnamed5505(core.List<api.StructuralElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStructuralElement(o[0]);
-  checkStructuralElement(o[1]);
+  checkStructuralElement(o[0] as api.StructuralElement);
+  checkStructuralElement(o[1] as api.StructuralElement);
 }
 
 core.List<core.String> buildUnnamed5506() {
@@ -4169,7 +4237,7 @@
   if (buildCounterTableRange < 3) {
     unittest.expect(o.columnSpan, unittest.equals(42));
     unittest.expect(o.rowSpan, unittest.equals(42));
-    checkTableCellLocation(o.tableCellLocation);
+    checkTableCellLocation(o.tableCellLocation as api.TableCellLocation);
   }
   buildCounterTableRange--;
 }
@@ -4209,8 +4277,8 @@
 
 void checkUnnamed5510(core.Map<core.String, api.SuggestedTableRowStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTableRowStyle(o['x']);
-  checkSuggestedTableRowStyle(o['y']);
+  checkSuggestedTableRowStyle(o['x'] as api.SuggestedTableRowStyle);
+  checkSuggestedTableRowStyle(o['y'] as api.SuggestedTableRowStyle);
 }
 
 core.List<api.TableCell> buildUnnamed5511() {
@@ -4222,8 +4290,8 @@
 
 void checkUnnamed5511(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableCell(o[0]);
-  checkTableCell(o[1]);
+  checkTableCell(o[0] as api.TableCell);
+  checkTableCell(o[1] as api.TableCell);
 }
 
 core.int buildCounterTableRow = 0;
@@ -4252,7 +4320,7 @@
     checkUnnamed5509(o.suggestedInsertionIds);
     checkUnnamed5510(o.suggestedTableRowStyleChanges);
     checkUnnamed5511(o.tableCells);
-    checkTableRowStyle(o.tableRowStyle);
+    checkTableRowStyle(o.tableRowStyle as api.TableRowStyle);
   }
   buildCounterTableRow--;
 }
@@ -4271,7 +4339,7 @@
 void checkTableRowStyle(api.TableRowStyle o) {
   buildCounterTableRowStyle++;
   if (buildCounterTableRowStyle < 3) {
-    checkDimension(o.minRowHeight);
+    checkDimension(o.minRowHeight as api.Dimension);
   }
   buildCounterTableRowStyle--;
 }
@@ -4304,8 +4372,8 @@
 
 void checkUnnamed5512(core.List<api.TableColumnProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableColumnProperties(o[0]);
-  checkTableColumnProperties(o[1]);
+  checkTableColumnProperties(o[0] as api.TableColumnProperties);
+  checkTableColumnProperties(o[1] as api.TableColumnProperties);
 }
 
 core.int buildCounterTableStyle = 0;
@@ -4362,8 +4430,8 @@
 
 void checkUnnamed5515(core.Map<core.String, api.SuggestedTextStyle> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuggestedTextStyle(o['x']);
-  checkSuggestedTextStyle(o['y']);
+  checkSuggestedTextStyle(o['x'] as api.SuggestedTextStyle);
+  checkSuggestedTextStyle(o['y'] as api.SuggestedTextStyle);
 }
 
 core.int buildCounterTextRun = 0;
@@ -4388,7 +4456,7 @@
     checkUnnamed5513(o.suggestedDeletionIds);
     checkUnnamed5514(o.suggestedInsertionIds);
     checkUnnamed5515(o.suggestedTextStyleChanges);
-    checkTextStyle(o.textStyle);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterTextRun--;
 }
@@ -4417,17 +4485,17 @@
 void checkTextStyle(api.TextStyle o) {
   buildCounterTextStyle++;
   if (buildCounterTextStyle < 3) {
-    checkOptionalColor(o.backgroundColor);
+    checkOptionalColor(o.backgroundColor as api.OptionalColor);
     unittest.expect(o.baselineOffset, unittest.equals('foo'));
     unittest.expect(o.bold, unittest.isTrue);
-    checkDimension(o.fontSize);
-    checkOptionalColor(o.foregroundColor);
+    checkDimension(o.fontSize as api.Dimension);
+    checkOptionalColor(o.foregroundColor as api.OptionalColor);
     unittest.expect(o.italic, unittest.isTrue);
-    checkLink(o.link);
+    checkLink(o.link as api.Link);
     unittest.expect(o.smallCaps, unittest.isTrue);
     unittest.expect(o.strikethrough, unittest.isTrue);
     unittest.expect(o.underline, unittest.isTrue);
-    checkWeightedFontFamily(o.weightedFontFamily);
+    checkWeightedFontFamily(o.weightedFontFamily as api.WeightedFontFamily);
   }
   buildCounterTextStyle--;
 }
@@ -4485,7 +4553,7 @@
 void checkUnmergeTableCellsRequest(api.UnmergeTableCellsRequest o) {
   buildCounterUnmergeTableCellsRequest++;
   if (buildCounterUnmergeTableCellsRequest < 3) {
-    checkTableRange(o.tableRange);
+    checkTableRange(o.tableRange as api.TableRange);
   }
   buildCounterUnmergeTableCellsRequest--;
 }
@@ -4505,7 +4573,7 @@
 void checkUpdateDocumentStyleRequest(api.UpdateDocumentStyleRequest o) {
   buildCounterUpdateDocumentStyleRequest++;
   if (buildCounterUpdateDocumentStyleRequest < 3) {
-    checkDocumentStyle(o.documentStyle);
+    checkDocumentStyle(o.documentStyle as api.DocumentStyle);
     unittest.expect(o.fields, unittest.equals('foo'));
   }
   buildCounterUpdateDocumentStyleRequest--;
@@ -4528,8 +4596,8 @@
   buildCounterUpdateParagraphStyleRequest++;
   if (buildCounterUpdateParagraphStyleRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkParagraphStyle(o.paragraphStyle);
-    checkRange(o.range);
+    checkParagraphStyle(o.paragraphStyle as api.ParagraphStyle);
+    checkRange(o.range as api.Range);
   }
   buildCounterUpdateParagraphStyleRequest--;
 }
@@ -4551,8 +4619,8 @@
   buildCounterUpdateSectionStyleRequest++;
   if (buildCounterUpdateSectionStyleRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkRange(o.range);
-    checkSectionStyle(o.sectionStyle);
+    checkRange(o.range as api.Range);
+    checkSectionStyle(o.sectionStyle as api.SectionStyle);
   }
   buildCounterUpdateSectionStyleRequest--;
 }
@@ -4575,9 +4643,9 @@
   buildCounterUpdateTableCellStyleRequest++;
   if (buildCounterUpdateTableCellStyleRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkTableCellStyle(o.tableCellStyle);
-    checkTableRange(o.tableRange);
-    checkLocation(o.tableStartLocation);
+    checkTableCellStyle(o.tableCellStyle as api.TableCellStyle);
+    checkTableRange(o.tableRange as api.TableRange);
+    checkLocation(o.tableStartLocation as api.Location);
   }
   buildCounterUpdateTableCellStyleRequest--;
 }
@@ -4616,8 +4684,9 @@
   if (buildCounterUpdateTableColumnPropertiesRequest < 3) {
     checkUnnamed5516(o.columnIndices);
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkTableColumnProperties(o.tableColumnProperties);
-    checkLocation(o.tableStartLocation);
+    checkTableColumnProperties(
+        o.tableColumnProperties as api.TableColumnProperties);
+    checkLocation(o.tableStartLocation as api.Location);
   }
   buildCounterUpdateTableColumnPropertiesRequest--;
 }
@@ -4654,8 +4723,8 @@
   if (buildCounterUpdateTableRowStyleRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     checkUnnamed5517(o.rowIndices);
-    checkTableRowStyle(o.tableRowStyle);
-    checkLocation(o.tableStartLocation);
+    checkTableRowStyle(o.tableRowStyle as api.TableRowStyle);
+    checkLocation(o.tableStartLocation as api.Location);
   }
   buildCounterUpdateTableRowStyleRequest--;
 }
@@ -4677,8 +4746,8 @@
   buildCounterUpdateTextStyleRequest++;
   if (buildCounterUpdateTextStyleRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkRange(o.range);
-    checkTextStyle(o.textStyle);
+    checkRange(o.range as api.Range);
+    checkTextStyle(o.textStyle as api.TextStyle);
   }
   buildCounterUpdateTextStyleRequest--;
 }
@@ -4730,7 +4799,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoText();
       var od = api.AutoText.fromJson(o.toJson());
-      checkAutoText(od);
+      checkAutoText(od as api.AutoText);
     });
   });
 
@@ -4738,7 +4807,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackground();
       var od = api.Background.fromJson(o.toJson());
-      checkBackground(od);
+      checkBackground(od as api.Background);
     });
   });
 
@@ -4746,7 +4815,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackgroundSuggestionState();
       var od = api.BackgroundSuggestionState.fromJson(o.toJson());
-      checkBackgroundSuggestionState(od);
+      checkBackgroundSuggestionState(od as api.BackgroundSuggestionState);
     });
   });
 
@@ -4754,7 +4823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateDocumentRequest();
       var od = api.BatchUpdateDocumentRequest.fromJson(o.toJson());
-      checkBatchUpdateDocumentRequest(od);
+      checkBatchUpdateDocumentRequest(od as api.BatchUpdateDocumentRequest);
     });
   });
 
@@ -4762,7 +4831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateDocumentResponse();
       var od = api.BatchUpdateDocumentResponse.fromJson(o.toJson());
-      checkBatchUpdateDocumentResponse(od);
+      checkBatchUpdateDocumentResponse(od as api.BatchUpdateDocumentResponse);
     });
   });
 
@@ -4770,7 +4839,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBody();
       var od = api.Body.fromJson(o.toJson());
-      checkBody(od);
+      checkBody(od as api.Body);
     });
   });
 
@@ -4778,7 +4847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBullet();
       var od = api.Bullet.fromJson(o.toJson());
-      checkBullet(od);
+      checkBullet(od as api.Bullet);
     });
   });
 
@@ -4786,7 +4855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBulletSuggestionState();
       var od = api.BulletSuggestionState.fromJson(o.toJson());
-      checkBulletSuggestionState(od);
+      checkBulletSuggestionState(od as api.BulletSuggestionState);
     });
   });
 
@@ -4794,7 +4863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColor();
       var od = api.Color.fromJson(o.toJson());
-      checkColor(od);
+      checkColor(od as api.Color);
     });
   });
 
@@ -4802,7 +4871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColumnBreak();
       var od = api.ColumnBreak.fromJson(o.toJson());
-      checkColumnBreak(od);
+      checkColumnBreak(od as api.ColumnBreak);
     });
   });
 
@@ -4810,7 +4879,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateFooterRequest();
       var od = api.CreateFooterRequest.fromJson(o.toJson());
-      checkCreateFooterRequest(od);
+      checkCreateFooterRequest(od as api.CreateFooterRequest);
     });
   });
 
@@ -4818,7 +4887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateFooterResponse();
       var od = api.CreateFooterResponse.fromJson(o.toJson());
-      checkCreateFooterResponse(od);
+      checkCreateFooterResponse(od as api.CreateFooterResponse);
     });
   });
 
@@ -4826,7 +4895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateFootnoteRequest();
       var od = api.CreateFootnoteRequest.fromJson(o.toJson());
-      checkCreateFootnoteRequest(od);
+      checkCreateFootnoteRequest(od as api.CreateFootnoteRequest);
     });
   });
 
@@ -4834,7 +4903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateFootnoteResponse();
       var od = api.CreateFootnoteResponse.fromJson(o.toJson());
-      checkCreateFootnoteResponse(od);
+      checkCreateFootnoteResponse(od as api.CreateFootnoteResponse);
     });
   });
 
@@ -4842,7 +4911,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateHeaderRequest();
       var od = api.CreateHeaderRequest.fromJson(o.toJson());
-      checkCreateHeaderRequest(od);
+      checkCreateHeaderRequest(od as api.CreateHeaderRequest);
     });
   });
 
@@ -4850,7 +4919,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateHeaderResponse();
       var od = api.CreateHeaderResponse.fromJson(o.toJson());
-      checkCreateHeaderResponse(od);
+      checkCreateHeaderResponse(od as api.CreateHeaderResponse);
     });
   });
 
@@ -4858,7 +4927,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateNamedRangeRequest();
       var od = api.CreateNamedRangeRequest.fromJson(o.toJson());
-      checkCreateNamedRangeRequest(od);
+      checkCreateNamedRangeRequest(od as api.CreateNamedRangeRequest);
     });
   });
 
@@ -4866,7 +4935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateNamedRangeResponse();
       var od = api.CreateNamedRangeResponse.fromJson(o.toJson());
-      checkCreateNamedRangeResponse(od);
+      checkCreateNamedRangeResponse(od as api.CreateNamedRangeResponse);
     });
   });
 
@@ -4874,7 +4943,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateParagraphBulletsRequest();
       var od = api.CreateParagraphBulletsRequest.fromJson(o.toJson());
-      checkCreateParagraphBulletsRequest(od);
+      checkCreateParagraphBulletsRequest(
+          od as api.CreateParagraphBulletsRequest);
     });
   });
 
@@ -4882,7 +4952,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCropProperties();
       var od = api.CropProperties.fromJson(o.toJson());
-      checkCropProperties(od);
+      checkCropProperties(od as api.CropProperties);
     });
   });
 
@@ -4890,7 +4960,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCropPropertiesSuggestionState();
       var od = api.CropPropertiesSuggestionState.fromJson(o.toJson());
-      checkCropPropertiesSuggestionState(od);
+      checkCropPropertiesSuggestionState(
+          od as api.CropPropertiesSuggestionState);
     });
   });
 
@@ -4898,7 +4969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteContentRangeRequest();
       var od = api.DeleteContentRangeRequest.fromJson(o.toJson());
-      checkDeleteContentRangeRequest(od);
+      checkDeleteContentRangeRequest(od as api.DeleteContentRangeRequest);
     });
   });
 
@@ -4906,7 +4977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteFooterRequest();
       var od = api.DeleteFooterRequest.fromJson(o.toJson());
-      checkDeleteFooterRequest(od);
+      checkDeleteFooterRequest(od as api.DeleteFooterRequest);
     });
   });
 
@@ -4914,7 +4985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteHeaderRequest();
       var od = api.DeleteHeaderRequest.fromJson(o.toJson());
-      checkDeleteHeaderRequest(od);
+      checkDeleteHeaderRequest(od as api.DeleteHeaderRequest);
     });
   });
 
@@ -4922,7 +4993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteNamedRangeRequest();
       var od = api.DeleteNamedRangeRequest.fromJson(o.toJson());
-      checkDeleteNamedRangeRequest(od);
+      checkDeleteNamedRangeRequest(od as api.DeleteNamedRangeRequest);
     });
   });
 
@@ -4930,7 +5001,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteParagraphBulletsRequest();
       var od = api.DeleteParagraphBulletsRequest.fromJson(o.toJson());
-      checkDeleteParagraphBulletsRequest(od);
+      checkDeleteParagraphBulletsRequest(
+          od as api.DeleteParagraphBulletsRequest);
     });
   });
 
@@ -4938,7 +5010,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeletePositionedObjectRequest();
       var od = api.DeletePositionedObjectRequest.fromJson(o.toJson());
-      checkDeletePositionedObjectRequest(od);
+      checkDeletePositionedObjectRequest(
+          od as api.DeletePositionedObjectRequest);
     });
   });
 
@@ -4946,7 +5019,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteTableColumnRequest();
       var od = api.DeleteTableColumnRequest.fromJson(o.toJson());
-      checkDeleteTableColumnRequest(od);
+      checkDeleteTableColumnRequest(od as api.DeleteTableColumnRequest);
     });
   });
 
@@ -4954,7 +5027,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteTableRowRequest();
       var od = api.DeleteTableRowRequest.fromJson(o.toJson());
-      checkDeleteTableRowRequest(od);
+      checkDeleteTableRowRequest(od as api.DeleteTableRowRequest);
     });
   });
 
@@ -4962,7 +5035,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimension();
       var od = api.Dimension.fromJson(o.toJson());
-      checkDimension(od);
+      checkDimension(od as api.Dimension);
     });
   });
 
@@ -4970,7 +5043,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocument();
       var od = api.Document.fromJson(o.toJson());
-      checkDocument(od);
+      checkDocument(od as api.Document);
     });
   });
 
@@ -4978,7 +5051,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentStyle();
       var od = api.DocumentStyle.fromJson(o.toJson());
-      checkDocumentStyle(od);
+      checkDocumentStyle(od as api.DocumentStyle);
     });
   });
 
@@ -4986,7 +5059,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentStyleSuggestionState();
       var od = api.DocumentStyleSuggestionState.fromJson(o.toJson());
-      checkDocumentStyleSuggestionState(od);
+      checkDocumentStyleSuggestionState(od as api.DocumentStyleSuggestionState);
     });
   });
 
@@ -4994,7 +5067,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmbeddedDrawingProperties();
       var od = api.EmbeddedDrawingProperties.fromJson(o.toJson());
-      checkEmbeddedDrawingProperties(od);
+      checkEmbeddedDrawingProperties(od as api.EmbeddedDrawingProperties);
     });
   });
 
@@ -5003,7 +5076,8 @@
       var o = buildEmbeddedDrawingPropertiesSuggestionState();
       var od =
           api.EmbeddedDrawingPropertiesSuggestionState.fromJson(o.toJson());
-      checkEmbeddedDrawingPropertiesSuggestionState(od);
+      checkEmbeddedDrawingPropertiesSuggestionState(
+          od as api.EmbeddedDrawingPropertiesSuggestionState);
     });
   });
 
@@ -5011,7 +5085,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmbeddedObject();
       var od = api.EmbeddedObject.fromJson(o.toJson());
-      checkEmbeddedObject(od);
+      checkEmbeddedObject(od as api.EmbeddedObject);
     });
   });
 
@@ -5019,7 +5093,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmbeddedObjectBorder();
       var od = api.EmbeddedObjectBorder.fromJson(o.toJson());
-      checkEmbeddedObjectBorder(od);
+      checkEmbeddedObjectBorder(od as api.EmbeddedObjectBorder);
     });
   });
 
@@ -5027,7 +5101,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmbeddedObjectBorderSuggestionState();
       var od = api.EmbeddedObjectBorderSuggestionState.fromJson(o.toJson());
-      checkEmbeddedObjectBorderSuggestionState(od);
+      checkEmbeddedObjectBorderSuggestionState(
+          od as api.EmbeddedObjectBorderSuggestionState);
     });
   });
 
@@ -5035,7 +5110,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmbeddedObjectSuggestionState();
       var od = api.EmbeddedObjectSuggestionState.fromJson(o.toJson());
-      checkEmbeddedObjectSuggestionState(od);
+      checkEmbeddedObjectSuggestionState(
+          od as api.EmbeddedObjectSuggestionState);
     });
   });
 
@@ -5043,7 +5119,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndOfSegmentLocation();
       var od = api.EndOfSegmentLocation.fromJson(o.toJson());
-      checkEndOfSegmentLocation(od);
+      checkEndOfSegmentLocation(od as api.EndOfSegmentLocation);
     });
   });
 
@@ -5051,7 +5127,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEquation();
       var od = api.Equation.fromJson(o.toJson());
-      checkEquation(od);
+      checkEquation(od as api.Equation);
     });
   });
 
@@ -5059,7 +5135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFooter();
       var od = api.Footer.fromJson(o.toJson());
-      checkFooter(od);
+      checkFooter(od as api.Footer);
     });
   });
 
@@ -5067,7 +5143,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFootnote();
       var od = api.Footnote.fromJson(o.toJson());
-      checkFootnote(od);
+      checkFootnote(od as api.Footnote);
     });
   });
 
@@ -5075,7 +5151,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFootnoteReference();
       var od = api.FootnoteReference.fromJson(o.toJson());
-      checkFootnoteReference(od);
+      checkFootnoteReference(od as api.FootnoteReference);
     });
   });
 
@@ -5083,7 +5159,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeader();
       var od = api.Header.fromJson(o.toJson());
-      checkHeader(od);
+      checkHeader(od as api.Header);
     });
   });
 
@@ -5091,7 +5167,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHorizontalRule();
       var od = api.HorizontalRule.fromJson(o.toJson());
-      checkHorizontalRule(od);
+      checkHorizontalRule(od as api.HorizontalRule);
     });
   });
 
@@ -5099,7 +5175,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageProperties();
       var od = api.ImageProperties.fromJson(o.toJson());
-      checkImageProperties(od);
+      checkImageProperties(od as api.ImageProperties);
     });
   });
 
@@ -5107,7 +5183,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildImagePropertiesSuggestionState();
       var od = api.ImagePropertiesSuggestionState.fromJson(o.toJson());
-      checkImagePropertiesSuggestionState(od);
+      checkImagePropertiesSuggestionState(
+          od as api.ImagePropertiesSuggestionState);
     });
   });
 
@@ -5115,7 +5192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInlineObject();
       var od = api.InlineObject.fromJson(o.toJson());
-      checkInlineObject(od);
+      checkInlineObject(od as api.InlineObject);
     });
   });
 
@@ -5123,7 +5200,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInlineObjectElement();
       var od = api.InlineObjectElement.fromJson(o.toJson());
-      checkInlineObjectElement(od);
+      checkInlineObjectElement(od as api.InlineObjectElement);
     });
   });
 
@@ -5131,7 +5208,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInlineObjectProperties();
       var od = api.InlineObjectProperties.fromJson(o.toJson());
-      checkInlineObjectProperties(od);
+      checkInlineObjectProperties(od as api.InlineObjectProperties);
     });
   });
 
@@ -5139,7 +5216,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInlineObjectPropertiesSuggestionState();
       var od = api.InlineObjectPropertiesSuggestionState.fromJson(o.toJson());
-      checkInlineObjectPropertiesSuggestionState(od);
+      checkInlineObjectPropertiesSuggestionState(
+          od as api.InlineObjectPropertiesSuggestionState);
     });
   });
 
@@ -5147,7 +5225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertInlineImageRequest();
       var od = api.InsertInlineImageRequest.fromJson(o.toJson());
-      checkInsertInlineImageRequest(od);
+      checkInsertInlineImageRequest(od as api.InsertInlineImageRequest);
     });
   });
 
@@ -5155,7 +5233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertInlineImageResponse();
       var od = api.InsertInlineImageResponse.fromJson(o.toJson());
-      checkInsertInlineImageResponse(od);
+      checkInsertInlineImageResponse(od as api.InsertInlineImageResponse);
     });
   });
 
@@ -5163,7 +5241,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertInlineSheetsChartResponse();
       var od = api.InsertInlineSheetsChartResponse.fromJson(o.toJson());
-      checkInsertInlineSheetsChartResponse(od);
+      checkInsertInlineSheetsChartResponse(
+          od as api.InsertInlineSheetsChartResponse);
     });
   });
 
@@ -5171,7 +5250,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertPageBreakRequest();
       var od = api.InsertPageBreakRequest.fromJson(o.toJson());
-      checkInsertPageBreakRequest(od);
+      checkInsertPageBreakRequest(od as api.InsertPageBreakRequest);
     });
   });
 
@@ -5179,7 +5258,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertSectionBreakRequest();
       var od = api.InsertSectionBreakRequest.fromJson(o.toJson());
-      checkInsertSectionBreakRequest(od);
+      checkInsertSectionBreakRequest(od as api.InsertSectionBreakRequest);
     });
   });
 
@@ -5187,7 +5266,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertTableColumnRequest();
       var od = api.InsertTableColumnRequest.fromJson(o.toJson());
-      checkInsertTableColumnRequest(od);
+      checkInsertTableColumnRequest(od as api.InsertTableColumnRequest);
     });
   });
 
@@ -5195,7 +5274,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertTableRequest();
       var od = api.InsertTableRequest.fromJson(o.toJson());
-      checkInsertTableRequest(od);
+      checkInsertTableRequest(od as api.InsertTableRequest);
     });
   });
 
@@ -5203,7 +5282,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertTableRowRequest();
       var od = api.InsertTableRowRequest.fromJson(o.toJson());
-      checkInsertTableRowRequest(od);
+      checkInsertTableRowRequest(od as api.InsertTableRowRequest);
     });
   });
 
@@ -5211,7 +5290,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertTextRequest();
       var od = api.InsertTextRequest.fromJson(o.toJson());
-      checkInsertTextRequest(od);
+      checkInsertTextRequest(od as api.InsertTextRequest);
     });
   });
 
@@ -5219,7 +5298,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLink();
       var od = api.Link.fromJson(o.toJson());
-      checkLink(od);
+      checkLink(od as api.Link);
     });
   });
 
@@ -5227,7 +5306,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinkedContentReference();
       var od = api.LinkedContentReference.fromJson(o.toJson());
-      checkLinkedContentReference(od);
+      checkLinkedContentReference(od as api.LinkedContentReference);
     });
   });
 
@@ -5235,7 +5314,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinkedContentReferenceSuggestionState();
       var od = api.LinkedContentReferenceSuggestionState.fromJson(o.toJson());
-      checkLinkedContentReferenceSuggestionState(od);
+      checkLinkedContentReferenceSuggestionState(
+          od as api.LinkedContentReferenceSuggestionState);
     });
   });
 
@@ -5243,7 +5323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildList();
       var od = api.List.fromJson(o.toJson());
-      checkList(od);
+      checkList(od as api.List);
     });
   });
 
@@ -5251,7 +5331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListProperties();
       var od = api.ListProperties.fromJson(o.toJson());
-      checkListProperties(od);
+      checkListProperties(od as api.ListProperties);
     });
   });
 
@@ -5259,7 +5339,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPropertiesSuggestionState();
       var od = api.ListPropertiesSuggestionState.fromJson(o.toJson());
-      checkListPropertiesSuggestionState(od);
+      checkListPropertiesSuggestionState(
+          od as api.ListPropertiesSuggestionState);
     });
   });
 
@@ -5267,7 +5348,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -5275,7 +5356,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMergeTableCellsRequest();
       var od = api.MergeTableCellsRequest.fromJson(o.toJson());
-      checkMergeTableCellsRequest(od);
+      checkMergeTableCellsRequest(od as api.MergeTableCellsRequest);
     });
   });
 
@@ -5283,7 +5364,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedRange();
       var od = api.NamedRange.fromJson(o.toJson());
-      checkNamedRange(od);
+      checkNamedRange(od as api.NamedRange);
     });
   });
 
@@ -5291,7 +5372,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedRanges();
       var od = api.NamedRanges.fromJson(o.toJson());
-      checkNamedRanges(od);
+      checkNamedRanges(od as api.NamedRanges);
     });
   });
 
@@ -5299,7 +5380,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedStyle();
       var od = api.NamedStyle.fromJson(o.toJson());
-      checkNamedStyle(od);
+      checkNamedStyle(od as api.NamedStyle);
     });
   });
 
@@ -5307,7 +5388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedStyleSuggestionState();
       var od = api.NamedStyleSuggestionState.fromJson(o.toJson());
-      checkNamedStyleSuggestionState(od);
+      checkNamedStyleSuggestionState(od as api.NamedStyleSuggestionState);
     });
   });
 
@@ -5315,7 +5396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedStyles();
       var od = api.NamedStyles.fromJson(o.toJson());
-      checkNamedStyles(od);
+      checkNamedStyles(od as api.NamedStyles);
     });
   });
 
@@ -5323,7 +5404,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedStylesSuggestionState();
       var od = api.NamedStylesSuggestionState.fromJson(o.toJson());
-      checkNamedStylesSuggestionState(od);
+      checkNamedStylesSuggestionState(od as api.NamedStylesSuggestionState);
     });
   });
 
@@ -5331,7 +5412,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNestingLevel();
       var od = api.NestingLevel.fromJson(o.toJson());
-      checkNestingLevel(od);
+      checkNestingLevel(od as api.NestingLevel);
     });
   });
 
@@ -5339,7 +5420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNestingLevelSuggestionState();
       var od = api.NestingLevelSuggestionState.fromJson(o.toJson());
-      checkNestingLevelSuggestionState(od);
+      checkNestingLevelSuggestionState(od as api.NestingLevelSuggestionState);
     });
   });
 
@@ -5347,7 +5428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectReferences();
       var od = api.ObjectReferences.fromJson(o.toJson());
-      checkObjectReferences(od);
+      checkObjectReferences(od as api.ObjectReferences);
     });
   });
 
@@ -5355,7 +5436,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOptionalColor();
       var od = api.OptionalColor.fromJson(o.toJson());
-      checkOptionalColor(od);
+      checkOptionalColor(od as api.OptionalColor);
     });
   });
 
@@ -5363,7 +5444,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageBreak();
       var od = api.PageBreak.fromJson(o.toJson());
-      checkPageBreak(od);
+      checkPageBreak(od as api.PageBreak);
     });
   });
 
@@ -5371,7 +5452,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraph();
       var od = api.Paragraph.fromJson(o.toJson());
-      checkParagraph(od);
+      checkParagraph(od as api.Paragraph);
     });
   });
 
@@ -5379,7 +5460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraphBorder();
       var od = api.ParagraphBorder.fromJson(o.toJson());
-      checkParagraphBorder(od);
+      checkParagraphBorder(od as api.ParagraphBorder);
     });
   });
 
@@ -5387,7 +5468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraphElement();
       var od = api.ParagraphElement.fromJson(o.toJson());
-      checkParagraphElement(od);
+      checkParagraphElement(od as api.ParagraphElement);
     });
   });
 
@@ -5395,7 +5476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraphStyle();
       var od = api.ParagraphStyle.fromJson(o.toJson());
-      checkParagraphStyle(od);
+      checkParagraphStyle(od as api.ParagraphStyle);
     });
   });
 
@@ -5403,7 +5484,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraphStyleSuggestionState();
       var od = api.ParagraphStyleSuggestionState.fromJson(o.toJson());
-      checkParagraphStyleSuggestionState(od);
+      checkParagraphStyleSuggestionState(
+          od as api.ParagraphStyleSuggestionState);
     });
   });
 
@@ -5411,7 +5493,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPositionedObject();
       var od = api.PositionedObject.fromJson(o.toJson());
-      checkPositionedObject(od);
+      checkPositionedObject(od as api.PositionedObject);
     });
   });
 
@@ -5419,7 +5501,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPositionedObjectPositioning();
       var od = api.PositionedObjectPositioning.fromJson(o.toJson());
-      checkPositionedObjectPositioning(od);
+      checkPositionedObjectPositioning(od as api.PositionedObjectPositioning);
     });
   });
 
@@ -5428,7 +5510,8 @@
       var o = buildPositionedObjectPositioningSuggestionState();
       var od =
           api.PositionedObjectPositioningSuggestionState.fromJson(o.toJson());
-      checkPositionedObjectPositioningSuggestionState(od);
+      checkPositionedObjectPositioningSuggestionState(
+          od as api.PositionedObjectPositioningSuggestionState);
     });
   });
 
@@ -5436,7 +5519,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPositionedObjectProperties();
       var od = api.PositionedObjectProperties.fromJson(o.toJson());
-      checkPositionedObjectProperties(od);
+      checkPositionedObjectProperties(od as api.PositionedObjectProperties);
     });
   });
 
@@ -5445,7 +5528,8 @@
       var o = buildPositionedObjectPropertiesSuggestionState();
       var od =
           api.PositionedObjectPropertiesSuggestionState.fromJson(o.toJson());
-      checkPositionedObjectPropertiesSuggestionState(od);
+      checkPositionedObjectPropertiesSuggestionState(
+          od as api.PositionedObjectPropertiesSuggestionState);
     });
   });
 
@@ -5453,7 +5537,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRange();
       var od = api.Range.fromJson(o.toJson());
-      checkRange(od);
+      checkRange(od as api.Range);
     });
   });
 
@@ -5461,7 +5545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllTextRequest();
       var od = api.ReplaceAllTextRequest.fromJson(o.toJson());
-      checkReplaceAllTextRequest(od);
+      checkReplaceAllTextRequest(od as api.ReplaceAllTextRequest);
     });
   });
 
@@ -5469,7 +5553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllTextResponse();
       var od = api.ReplaceAllTextResponse.fromJson(o.toJson());
-      checkReplaceAllTextResponse(od);
+      checkReplaceAllTextResponse(od as api.ReplaceAllTextResponse);
     });
   });
 
@@ -5477,7 +5561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceImageRequest();
       var od = api.ReplaceImageRequest.fromJson(o.toJson());
-      checkReplaceImageRequest(od);
+      checkReplaceImageRequest(od as api.ReplaceImageRequest);
     });
   });
 
@@ -5485,7 +5569,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceNamedRangeContentRequest();
       var od = api.ReplaceNamedRangeContentRequest.fromJson(o.toJson());
-      checkReplaceNamedRangeContentRequest(od);
+      checkReplaceNamedRangeContentRequest(
+          od as api.ReplaceNamedRangeContentRequest);
     });
   });
 
@@ -5493,7 +5578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequest();
       var od = api.Request.fromJson(o.toJson());
-      checkRequest(od);
+      checkRequest(od as api.Request);
     });
   });
 
@@ -5501,7 +5586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResponse();
       var od = api.Response.fromJson(o.toJson());
-      checkResponse(od);
+      checkResponse(od as api.Response);
     });
   });
 
@@ -5509,7 +5594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRgbColor();
       var od = api.RgbColor.fromJson(o.toJson());
-      checkRgbColor(od);
+      checkRgbColor(od as api.RgbColor);
     });
   });
 
@@ -5517,7 +5602,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSectionBreak();
       var od = api.SectionBreak.fromJson(o.toJson());
-      checkSectionBreak(od);
+      checkSectionBreak(od as api.SectionBreak);
     });
   });
 
@@ -5525,7 +5610,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSectionColumnProperties();
       var od = api.SectionColumnProperties.fromJson(o.toJson());
-      checkSectionColumnProperties(od);
+      checkSectionColumnProperties(od as api.SectionColumnProperties);
     });
   });
 
@@ -5533,7 +5618,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSectionStyle();
       var od = api.SectionStyle.fromJson(o.toJson());
-      checkSectionStyle(od);
+      checkSectionStyle(od as api.SectionStyle);
     });
   });
 
@@ -5541,7 +5626,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShading();
       var od = api.Shading.fromJson(o.toJson());
-      checkShading(od);
+      checkShading(od as api.Shading);
     });
   });
 
@@ -5549,7 +5634,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShadingSuggestionState();
       var od = api.ShadingSuggestionState.fromJson(o.toJson());
-      checkShadingSuggestionState(od);
+      checkShadingSuggestionState(od as api.ShadingSuggestionState);
     });
   });
 
@@ -5557,7 +5642,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSheetsChartReference();
       var od = api.SheetsChartReference.fromJson(o.toJson());
-      checkSheetsChartReference(od);
+      checkSheetsChartReference(od as api.SheetsChartReference);
     });
   });
 
@@ -5565,7 +5650,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSheetsChartReferenceSuggestionState();
       var od = api.SheetsChartReferenceSuggestionState.fromJson(o.toJson());
-      checkSheetsChartReferenceSuggestionState(od);
+      checkSheetsChartReferenceSuggestionState(
+          od as api.SheetsChartReferenceSuggestionState);
     });
   });
 
@@ -5573,7 +5659,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSize();
       var od = api.Size.fromJson(o.toJson());
-      checkSize(od);
+      checkSize(od as api.Size);
     });
   });
 
@@ -5581,7 +5667,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSizeSuggestionState();
       var od = api.SizeSuggestionState.fromJson(o.toJson());
-      checkSizeSuggestionState(od);
+      checkSizeSuggestionState(od as api.SizeSuggestionState);
     });
   });
 
@@ -5589,7 +5675,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStructuralElement();
       var od = api.StructuralElement.fromJson(o.toJson());
-      checkStructuralElement(od);
+      checkStructuralElement(od as api.StructuralElement);
     });
   });
 
@@ -5597,7 +5683,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubstringMatchCriteria();
       var od = api.SubstringMatchCriteria.fromJson(o.toJson());
-      checkSubstringMatchCriteria(od);
+      checkSubstringMatchCriteria(od as api.SubstringMatchCriteria);
     });
   });
 
@@ -5605,7 +5691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedBullet();
       var od = api.SuggestedBullet.fromJson(o.toJson());
-      checkSuggestedBullet(od);
+      checkSuggestedBullet(od as api.SuggestedBullet);
     });
   });
 
@@ -5613,7 +5699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedDocumentStyle();
       var od = api.SuggestedDocumentStyle.fromJson(o.toJson());
-      checkSuggestedDocumentStyle(od);
+      checkSuggestedDocumentStyle(od as api.SuggestedDocumentStyle);
     });
   });
 
@@ -5621,7 +5707,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedInlineObjectProperties();
       var od = api.SuggestedInlineObjectProperties.fromJson(o.toJson());
-      checkSuggestedInlineObjectProperties(od);
+      checkSuggestedInlineObjectProperties(
+          od as api.SuggestedInlineObjectProperties);
     });
   });
 
@@ -5629,7 +5716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedListProperties();
       var od = api.SuggestedListProperties.fromJson(o.toJson());
-      checkSuggestedListProperties(od);
+      checkSuggestedListProperties(od as api.SuggestedListProperties);
     });
   });
 
@@ -5637,7 +5724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedNamedStyles();
       var od = api.SuggestedNamedStyles.fromJson(o.toJson());
-      checkSuggestedNamedStyles(od);
+      checkSuggestedNamedStyles(od as api.SuggestedNamedStyles);
     });
   });
 
@@ -5645,7 +5732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedParagraphStyle();
       var od = api.SuggestedParagraphStyle.fromJson(o.toJson());
-      checkSuggestedParagraphStyle(od);
+      checkSuggestedParagraphStyle(od as api.SuggestedParagraphStyle);
     });
   });
 
@@ -5653,7 +5740,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedPositionedObjectProperties();
       var od = api.SuggestedPositionedObjectProperties.fromJson(o.toJson());
-      checkSuggestedPositionedObjectProperties(od);
+      checkSuggestedPositionedObjectProperties(
+          od as api.SuggestedPositionedObjectProperties);
     });
   });
 
@@ -5661,7 +5749,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedTableCellStyle();
       var od = api.SuggestedTableCellStyle.fromJson(o.toJson());
-      checkSuggestedTableCellStyle(od);
+      checkSuggestedTableCellStyle(od as api.SuggestedTableCellStyle);
     });
   });
 
@@ -5669,7 +5757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedTableRowStyle();
       var od = api.SuggestedTableRowStyle.fromJson(o.toJson());
-      checkSuggestedTableRowStyle(od);
+      checkSuggestedTableRowStyle(od as api.SuggestedTableRowStyle);
     });
   });
 
@@ -5677,7 +5765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestedTextStyle();
       var od = api.SuggestedTextStyle.fromJson(o.toJson());
-      checkSuggestedTextStyle(od);
+      checkSuggestedTextStyle(od as api.SuggestedTextStyle);
     });
   });
 
@@ -5685,7 +5773,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTabStop();
       var od = api.TabStop.fromJson(o.toJson());
-      checkTabStop(od);
+      checkTabStop(od as api.TabStop);
     });
   });
 
@@ -5693,7 +5781,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTable();
       var od = api.Table.fromJson(o.toJson());
-      checkTable(od);
+      checkTable(od as api.Table);
     });
   });
 
@@ -5701,7 +5789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCell();
       var od = api.TableCell.fromJson(o.toJson());
-      checkTableCell(od);
+      checkTableCell(od as api.TableCell);
     });
   });
 
@@ -5709,7 +5797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCellBorder();
       var od = api.TableCellBorder.fromJson(o.toJson());
-      checkTableCellBorder(od);
+      checkTableCellBorder(od as api.TableCellBorder);
     });
   });
 
@@ -5717,7 +5805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCellLocation();
       var od = api.TableCellLocation.fromJson(o.toJson());
-      checkTableCellLocation(od);
+      checkTableCellLocation(od as api.TableCellLocation);
     });
   });
 
@@ -5725,7 +5813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCellStyle();
       var od = api.TableCellStyle.fromJson(o.toJson());
-      checkTableCellStyle(od);
+      checkTableCellStyle(od as api.TableCellStyle);
     });
   });
 
@@ -5733,7 +5821,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCellStyleSuggestionState();
       var od = api.TableCellStyleSuggestionState.fromJson(o.toJson());
-      checkTableCellStyleSuggestionState(od);
+      checkTableCellStyleSuggestionState(
+          od as api.TableCellStyleSuggestionState);
     });
   });
 
@@ -5741,7 +5830,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableColumnProperties();
       var od = api.TableColumnProperties.fromJson(o.toJson());
-      checkTableColumnProperties(od);
+      checkTableColumnProperties(od as api.TableColumnProperties);
     });
   });
 
@@ -5749,7 +5838,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableOfContents();
       var od = api.TableOfContents.fromJson(o.toJson());
-      checkTableOfContents(od);
+      checkTableOfContents(od as api.TableOfContents);
     });
   });
 
@@ -5757,7 +5846,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRange();
       var od = api.TableRange.fromJson(o.toJson());
-      checkTableRange(od);
+      checkTableRange(od as api.TableRange);
     });
   });
 
@@ -5765,7 +5854,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRow();
       var od = api.TableRow.fromJson(o.toJson());
-      checkTableRow(od);
+      checkTableRow(od as api.TableRow);
     });
   });
 
@@ -5773,7 +5862,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRowStyle();
       var od = api.TableRowStyle.fromJson(o.toJson());
-      checkTableRowStyle(od);
+      checkTableRowStyle(od as api.TableRowStyle);
     });
   });
 
@@ -5781,7 +5870,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRowStyleSuggestionState();
       var od = api.TableRowStyleSuggestionState.fromJson(o.toJson());
-      checkTableRowStyleSuggestionState(od);
+      checkTableRowStyleSuggestionState(od as api.TableRowStyleSuggestionState);
     });
   });
 
@@ -5789,7 +5878,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableStyle();
       var od = api.TableStyle.fromJson(o.toJson());
-      checkTableStyle(od);
+      checkTableStyle(od as api.TableStyle);
     });
   });
 
@@ -5797,7 +5886,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextRun();
       var od = api.TextRun.fromJson(o.toJson());
-      checkTextRun(od);
+      checkTextRun(od as api.TextRun);
     });
   });
 
@@ -5805,7 +5894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextStyle();
       var od = api.TextStyle.fromJson(o.toJson());
-      checkTextStyle(od);
+      checkTextStyle(od as api.TextStyle);
     });
   });
 
@@ -5813,7 +5902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextStyleSuggestionState();
       var od = api.TextStyleSuggestionState.fromJson(o.toJson());
-      checkTextStyleSuggestionState(od);
+      checkTextStyleSuggestionState(od as api.TextStyleSuggestionState);
     });
   });
 
@@ -5821,7 +5910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnmergeTableCellsRequest();
       var od = api.UnmergeTableCellsRequest.fromJson(o.toJson());
-      checkUnmergeTableCellsRequest(od);
+      checkUnmergeTableCellsRequest(od as api.UnmergeTableCellsRequest);
     });
   });
 
@@ -5829,7 +5918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDocumentStyleRequest();
       var od = api.UpdateDocumentStyleRequest.fromJson(o.toJson());
-      checkUpdateDocumentStyleRequest(od);
+      checkUpdateDocumentStyleRequest(od as api.UpdateDocumentStyleRequest);
     });
   });
 
@@ -5837,7 +5926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateParagraphStyleRequest();
       var od = api.UpdateParagraphStyleRequest.fromJson(o.toJson());
-      checkUpdateParagraphStyleRequest(od);
+      checkUpdateParagraphStyleRequest(od as api.UpdateParagraphStyleRequest);
     });
   });
 
@@ -5845,7 +5934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSectionStyleRequest();
       var od = api.UpdateSectionStyleRequest.fromJson(o.toJson());
-      checkUpdateSectionStyleRequest(od);
+      checkUpdateSectionStyleRequest(od as api.UpdateSectionStyleRequest);
     });
   });
 
@@ -5853,7 +5942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTableCellStyleRequest();
       var od = api.UpdateTableCellStyleRequest.fromJson(o.toJson());
-      checkUpdateTableCellStyleRequest(od);
+      checkUpdateTableCellStyleRequest(od as api.UpdateTableCellStyleRequest);
     });
   });
 
@@ -5861,7 +5950,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTableColumnPropertiesRequest();
       var od = api.UpdateTableColumnPropertiesRequest.fromJson(o.toJson());
-      checkUpdateTableColumnPropertiesRequest(od);
+      checkUpdateTableColumnPropertiesRequest(
+          od as api.UpdateTableColumnPropertiesRequest);
     });
   });
 
@@ -5869,7 +5959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTableRowStyleRequest();
       var od = api.UpdateTableRowStyleRequest.fromJson(o.toJson());
-      checkUpdateTableRowStyleRequest(od);
+      checkUpdateTableRowStyleRequest(od as api.UpdateTableRowStyleRequest);
     });
   });
 
@@ -5877,7 +5967,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTextStyleRequest();
       var od = api.UpdateTextStyleRequest.fromJson(o.toJson());
-      checkUpdateTextStyleRequest(od);
+      checkUpdateTextStyleRequest(od as api.UpdateTextStyleRequest);
     });
   });
 
@@ -5885,7 +5975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWeightedFontFamily();
       var od = api.WeightedFontFamily.fromJson(o.toJson());
-      checkWeightedFontFamily(od);
+      checkWeightedFontFamily(od as api.WeightedFontFamily);
     });
   });
 
@@ -5893,7 +5983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWriteControl();
       var od = api.WriteControl.fromJson(o.toJson());
-      checkWriteControl(od);
+      checkWriteControl(od as api.WriteControl);
     });
   });
 
@@ -5905,8 +5995,9 @@
       var arg_documentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchUpdateDocumentRequest.fromJson(json);
-        checkBatchUpdateDocumentRequest(obj);
+        var obj = api.BatchUpdateDocumentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchUpdateDocumentRequest(obj as api.BatchUpdateDocumentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5954,7 +6045,8 @@
       res
           .batchUpdate(arg_request, arg_documentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchUpdateDocumentResponse(response);
+        checkBatchUpdateDocumentResponse(
+            response as api.BatchUpdateDocumentResponse);
       })));
     });
 
@@ -5964,8 +6056,9 @@
       var arg_request = buildDocument();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Document.fromJson(json);
-        checkDocument(obj);
+        var obj =
+            api.Document.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDocument(obj as api.Document);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6004,7 +6097,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDocument(response);
+        checkDocument(response as api.Document);
       })));
     });
 
@@ -6059,7 +6152,7 @@
               suggestionsViewMode: arg_suggestionsViewMode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDocument(response);
+        checkDocument(response as api.Document);
       })));
     });
   });
diff --git a/generated/googleapis/test/domainsrdap/v1_test.dart b/generated/googleapis/test/domainsrdap/v1_test.dart
index 9b9365b..4e6f487 100644
--- a/generated/googleapis/test/domainsrdap/v1_test.dart
+++ b/generated/googleapis/test/domainsrdap/v1_test.dart
@@ -192,8 +192,8 @@
 
 void checkUnnamed1485(core.List<api.Link> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLink(o[0]);
-  checkLink(o[1]);
+  checkLink(o[0] as api.Link);
+  checkLink(o[1] as api.Link);
 }
 
 core.int buildCounterNotice = 0;
@@ -243,8 +243,8 @@
 
 void checkUnnamed1487(core.List<api.Notice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotice(o[0]);
-  checkNotice(o[1]);
+  checkNotice(o[0] as api.Notice);
+  checkNotice(o[1] as api.Notice);
 }
 
 core.List<core.String> buildUnnamed1488() {
@@ -282,7 +282,7 @@
   if (buildCounterRdapResponse < 3) {
     checkUnnamed1486(o.description);
     unittest.expect(o.errorCode, unittest.equals(42));
-    checkHttpBody(o.jsonResponse);
+    checkHttpBody(o.jsonResponse as api.HttpBody);
     unittest.expect(o.lang, unittest.equals('foo'));
     checkUnnamed1487(o.notices);
     checkUnnamed1488(o.rdapConformance);
@@ -296,7 +296,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpBody();
       var od = api.HttpBody.fromJson(o.toJson());
-      checkHttpBody(od);
+      checkHttpBody(od as api.HttpBody);
     });
   });
 
@@ -304,7 +304,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLink();
       var od = api.Link.fromJson(o.toJson());
-      checkLink(od);
+      checkLink(od as api.Link);
     });
   });
 
@@ -312,7 +312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotice();
       var od = api.Notice.fromJson(o.toJson());
-      checkNotice(od);
+      checkNotice(od as api.Notice);
     });
   });
 
@@ -320,7 +320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRdapResponse();
       var od = api.RdapResponse.fromJson(o.toJson());
-      checkRdapResponse(od);
+      checkRdapResponse(od as api.RdapResponse);
     });
   });
 
@@ -371,7 +371,7 @@
       res
           .get(arg_autnumId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRdapResponse(response);
+        checkRdapResponse(response as api.RdapResponse);
       })));
     });
   });
@@ -421,7 +421,7 @@
       res
           .get(arg_domainName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
   });
@@ -473,7 +473,7 @@
       res
           .get(arg_entityId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRdapResponse(response);
+        checkRdapResponse(response as api.RdapResponse);
       })));
     });
   });
@@ -535,7 +535,7 @@
       res
           .get(arg_ipId, arg_ipId1, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRdapResponse(response);
+        checkRdapResponse(response as api.RdapResponse);
       })));
     });
   });
@@ -587,7 +587,7 @@
       res
           .get(arg_nameserverId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRdapResponse(response);
+        checkRdapResponse(response as api.RdapResponse);
       })));
     });
   });
@@ -635,7 +635,7 @@
       res
           .getDomains($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRdapResponse(response);
+        checkRdapResponse(response as api.RdapResponse);
       })));
     });
 
@@ -681,7 +681,7 @@
       res
           .getEntities($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRdapResponse(response);
+        checkRdapResponse(response as api.RdapResponse);
       })));
     });
 
@@ -725,7 +725,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.getHelp($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -769,7 +769,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.getIp($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -815,7 +815,7 @@
       res
           .getNameservers($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRdapResponse(response);
+        checkRdapResponse(response as api.RdapResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart b/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
index de5eb7d..a66a8e3 100644
--- a/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
+++ b/generated/googleapis/test/doubleclickbidmanager/v1_1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed4928(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
+  checkRule(o[0] as api.Rule);
+  checkRule(o[1] as api.Rule);
 }
 
 core.int buildCounterChannelGrouping = 0;
@@ -119,8 +119,8 @@
 
 void checkUnnamed4929(core.List<api.EventFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventFilter(o[0]);
-  checkEventFilter(o[1]);
+  checkEventFilter(o[0] as api.EventFilter);
+  checkEventFilter(o[1] as api.EventFilter);
 }
 
 core.int buildCounterDisjunctiveMatchStatement = 0;
@@ -293,7 +293,8 @@
 void checkEventFilter(api.EventFilter o) {
   buildCounterEventFilter++;
   if (buildCounterEventFilter < 3) {
-    checkPathQueryOptionsFilter(o.dimensionFilter);
+    checkPathQueryOptionsFilter(
+        o.dimensionFilter as api.PathQueryOptionsFilter);
   }
   buildCounterEventFilter--;
 }
@@ -328,8 +329,8 @@
 
 void checkUnnamed4933(core.List<api.Query> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuery(o[0]);
-  checkQuery(o[1]);
+  checkQuery(o[0] as api.Query);
+  checkQuery(o[1] as api.Query);
 }
 
 core.int buildCounterListQueriesResponse = 0;
@@ -364,8 +365,8 @@
 
 void checkUnnamed4934(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReport(o[0]);
-  checkReport(o[1]);
+  checkReport(o[0] as api.Report);
+  checkReport(o[1] as api.Report);
 }
 
 core.int buildCounterListReportsResponse = 0;
@@ -407,7 +408,7 @@
   buildCounterOptions++;
   if (buildCounterOptions < 3) {
     unittest.expect(o.includeOnlyTargetedUserLists, unittest.isTrue);
-    checkPathQueryOptions(o.pathQueryOptions);
+    checkPathQueryOptions(o.pathQueryOptions as api.PathQueryOptions);
   }
   buildCounterOptions--;
 }
@@ -421,8 +422,8 @@
 
 void checkUnnamed4935(core.List<api.FilterPair> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterPair(o[0]);
-  checkFilterPair(o[1]);
+  checkFilterPair(o[0] as api.FilterPair);
+  checkFilterPair(o[1] as api.FilterPair);
 }
 
 core.List<core.String> buildUnnamed4936() {
@@ -474,7 +475,7 @@
     checkUnnamed4936(o.groupBys);
     unittest.expect(o.includeInviteData, unittest.isTrue);
     checkUnnamed4937(o.metrics);
-    checkOptions(o.options);
+    checkOptions(o.options as api.Options);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterParameters--;
@@ -489,8 +490,8 @@
 
 void checkUnnamed4938(core.List<api.EventFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventFilter(o[0]);
-  checkEventFilter(o[1]);
+  checkEventFilter(o[0] as api.EventFilter);
+  checkEventFilter(o[1] as api.EventFilter);
 }
 
 core.int buildCounterPathFilter = 0;
@@ -523,8 +524,8 @@
 
 void checkUnnamed4939(core.List<api.PathFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPathFilter(o[0]);
-  checkPathFilter(o[1]);
+  checkPathFilter(o[0] as api.PathFilter);
+  checkPathFilter(o[1] as api.PathFilter);
 }
 
 core.int buildCounterPathQueryOptions = 0;
@@ -542,7 +543,7 @@
 void checkPathQueryOptions(api.PathQueryOptions o) {
   buildCounterPathQueryOptions++;
   if (buildCounterPathQueryOptions < 3) {
-    checkChannelGrouping(o.channelGrouping);
+    checkChannelGrouping(o.channelGrouping as api.ChannelGrouping);
     checkUnnamed4939(o.pathFilters);
   }
   buildCounterPathQueryOptions--;
@@ -606,12 +607,12 @@
   buildCounterQuery++;
   if (buildCounterQuery < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkQueryMetadata(o.metadata);
-    checkParameters(o.params);
+    checkQueryMetadata(o.metadata as api.QueryMetadata);
+    checkParameters(o.params as api.Parameters);
     unittest.expect(o.queryId, unittest.equals('foo'));
     unittest.expect(o.reportDataEndTimeMs, unittest.equals('foo'));
     unittest.expect(o.reportDataStartTimeMs, unittest.equals('foo'));
-    checkQuerySchedule(o.schedule);
+    checkQuerySchedule(o.schedule as api.QuerySchedule);
     unittest.expect(o.timezoneCode, unittest.equals('foo'));
   }
   buildCounterQuery--;
@@ -713,9 +714,9 @@
 void checkReport(api.Report o) {
   buildCounterReport++;
   if (buildCounterReport < 3) {
-    checkReportKey(o.key);
-    checkReportMetadata(o.metadata);
-    checkParameters(o.params);
+    checkReportKey(o.key as api.ReportKey);
+    checkReportMetadata(o.metadata as api.ReportMetadata);
+    checkParameters(o.params as api.Parameters);
   }
   buildCounterReport--;
 }
@@ -780,7 +781,7 @@
     unittest.expect(o.googleCloudStoragePath, unittest.equals('foo'));
     unittest.expect(o.reportDataEndTimeMs, unittest.equals('foo'));
     unittest.expect(o.reportDataStartTimeMs, unittest.equals('foo'));
-    checkReportStatus(o.status);
+    checkReportStatus(o.status as api.ReportStatus);
   }
   buildCounterReportMetadata--;
 }
@@ -802,7 +803,7 @@
 void checkReportStatus(api.ReportStatus o) {
   buildCounterReportStatus++;
   if (buildCounterReportStatus < 3) {
-    checkReportFailure(o.failure);
+    checkReportFailure(o.failure as api.ReportFailure);
     unittest.expect(o.finishTimeMs, unittest.equals('foo'));
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -861,8 +862,8 @@
 
 void checkUnnamed4943(core.List<api.DisjunctiveMatchStatement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDisjunctiveMatchStatement(o[0]);
-  checkDisjunctiveMatchStatement(o[1]);
+  checkDisjunctiveMatchStatement(o[0] as api.DisjunctiveMatchStatement);
+  checkDisjunctiveMatchStatement(o[1] as api.DisjunctiveMatchStatement);
 }
 
 core.int buildCounterRule = 0;
@@ -948,7 +949,7 @@
 void checkUploadLineItemsResponse(api.UploadLineItemsResponse o) {
   buildCounterUploadLineItemsResponse++;
   if (buildCounterUploadLineItemsResponse < 3) {
-    checkUploadStatus(o.uploadStatus);
+    checkUploadStatus(o.uploadStatus as api.UploadStatus);
   }
   buildCounterUploadLineItemsResponse--;
 }
@@ -975,8 +976,8 @@
 
 void checkUnnamed4945(core.List<api.RowStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRowStatus(o[0]);
-  checkRowStatus(o[1]);
+  checkRowStatus(o[0] as api.RowStatus);
+  checkRowStatus(o[1] as api.RowStatus);
 }
 
 core.int buildCounterUploadStatus = 0;
@@ -1005,7 +1006,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelGrouping();
       var od = api.ChannelGrouping.fromJson(o.toJson());
-      checkChannelGrouping(od);
+      checkChannelGrouping(od as api.ChannelGrouping);
     });
   });
 
@@ -1013,7 +1014,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisjunctiveMatchStatement();
       var od = api.DisjunctiveMatchStatement.fromJson(o.toJson());
-      checkDisjunctiveMatchStatement(od);
+      checkDisjunctiveMatchStatement(od as api.DisjunctiveMatchStatement);
     });
   });
 
@@ -1021,7 +1022,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDownloadLineItemsRequest();
       var od = api.DownloadLineItemsRequest.fromJson(o.toJson());
-      checkDownloadLineItemsRequest(od);
+      checkDownloadLineItemsRequest(od as api.DownloadLineItemsRequest);
     });
   });
 
@@ -1029,7 +1030,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDownloadLineItemsResponse();
       var od = api.DownloadLineItemsResponse.fromJson(o.toJson());
-      checkDownloadLineItemsResponse(od);
+      checkDownloadLineItemsResponse(od as api.DownloadLineItemsResponse);
     });
   });
 
@@ -1037,7 +1038,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDownloadRequest();
       var od = api.DownloadRequest.fromJson(o.toJson());
-      checkDownloadRequest(od);
+      checkDownloadRequest(od as api.DownloadRequest);
     });
   });
 
@@ -1045,7 +1046,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDownloadResponse();
       var od = api.DownloadResponse.fromJson(o.toJson());
-      checkDownloadResponse(od);
+      checkDownloadResponse(od as api.DownloadResponse);
     });
   });
 
@@ -1053,7 +1054,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventFilter();
       var od = api.EventFilter.fromJson(o.toJson());
-      checkEventFilter(od);
+      checkEventFilter(od as api.EventFilter);
     });
   });
 
@@ -1061,7 +1062,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterPair();
       var od = api.FilterPair.fromJson(o.toJson());
-      checkFilterPair(od);
+      checkFilterPair(od as api.FilterPair);
     });
   });
 
@@ -1069,7 +1070,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListQueriesResponse();
       var od = api.ListQueriesResponse.fromJson(o.toJson());
-      checkListQueriesResponse(od);
+      checkListQueriesResponse(od as api.ListQueriesResponse);
     });
   });
 
@@ -1077,7 +1078,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListReportsResponse();
       var od = api.ListReportsResponse.fromJson(o.toJson());
-      checkListReportsResponse(od);
+      checkListReportsResponse(od as api.ListReportsResponse);
     });
   });
 
@@ -1085,7 +1086,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOptions();
       var od = api.Options.fromJson(o.toJson());
-      checkOptions(od);
+      checkOptions(od as api.Options);
     });
   });
 
@@ -1093,7 +1094,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParameters();
       var od = api.Parameters.fromJson(o.toJson());
-      checkParameters(od);
+      checkParameters(od as api.Parameters);
     });
   });
 
@@ -1101,7 +1102,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathFilter();
       var od = api.PathFilter.fromJson(o.toJson());
-      checkPathFilter(od);
+      checkPathFilter(od as api.PathFilter);
     });
   });
 
@@ -1109,7 +1110,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathQueryOptions();
       var od = api.PathQueryOptions.fromJson(o.toJson());
-      checkPathQueryOptions(od);
+      checkPathQueryOptions(od as api.PathQueryOptions);
     });
   });
 
@@ -1117,7 +1118,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPathQueryOptionsFilter();
       var od = api.PathQueryOptionsFilter.fromJson(o.toJson());
-      checkPathQueryOptionsFilter(od);
+      checkPathQueryOptionsFilter(od as api.PathQueryOptionsFilter);
     });
   });
 
@@ -1125,7 +1126,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuery();
       var od = api.Query.fromJson(o.toJson());
-      checkQuery(od);
+      checkQuery(od as api.Query);
     });
   });
 
@@ -1133,7 +1134,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryMetadata();
       var od = api.QueryMetadata.fromJson(o.toJson());
-      checkQueryMetadata(od);
+      checkQueryMetadata(od as api.QueryMetadata);
     });
   });
 
@@ -1141,7 +1142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuerySchedule();
       var od = api.QuerySchedule.fromJson(o.toJson());
-      checkQuerySchedule(od);
+      checkQuerySchedule(od as api.QuerySchedule);
     });
   });
 
@@ -1149,7 +1150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReport();
       var od = api.Report.fromJson(o.toJson());
-      checkReport(od);
+      checkReport(od as api.Report);
     });
   });
 
@@ -1157,7 +1158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportFailure();
       var od = api.ReportFailure.fromJson(o.toJson());
-      checkReportFailure(od);
+      checkReportFailure(od as api.ReportFailure);
     });
   });
 
@@ -1165,7 +1166,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportKey();
       var od = api.ReportKey.fromJson(o.toJson());
-      checkReportKey(od);
+      checkReportKey(od as api.ReportKey);
     });
   });
 
@@ -1173,7 +1174,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportMetadata();
       var od = api.ReportMetadata.fromJson(o.toJson());
-      checkReportMetadata(od);
+      checkReportMetadata(od as api.ReportMetadata);
     });
   });
 
@@ -1181,7 +1182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportStatus();
       var od = api.ReportStatus.fromJson(o.toJson());
-      checkReportStatus(od);
+      checkReportStatus(od as api.ReportStatus);
     });
   });
 
@@ -1189,7 +1190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRowStatus();
       var od = api.RowStatus.fromJson(o.toJson());
-      checkRowStatus(od);
+      checkRowStatus(od as api.RowStatus);
     });
   });
 
@@ -1197,7 +1198,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRule();
       var od = api.Rule.fromJson(o.toJson());
-      checkRule(od);
+      checkRule(od as api.Rule);
     });
   });
 
@@ -1205,7 +1206,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunQueryRequest();
       var od = api.RunQueryRequest.fromJson(o.toJson());
-      checkRunQueryRequest(od);
+      checkRunQueryRequest(od as api.RunQueryRequest);
     });
   });
 
@@ -1213,7 +1214,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadLineItemsRequest();
       var od = api.UploadLineItemsRequest.fromJson(o.toJson());
-      checkUploadLineItemsRequest(od);
+      checkUploadLineItemsRequest(od as api.UploadLineItemsRequest);
     });
   });
 
@@ -1221,7 +1222,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadLineItemsResponse();
       var od = api.UploadLineItemsResponse.fromJson(o.toJson());
-      checkUploadLineItemsResponse(od);
+      checkUploadLineItemsResponse(od as api.UploadLineItemsResponse);
     });
   });
 
@@ -1229,7 +1230,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadStatus();
       var od = api.UploadStatus.fromJson(o.toJson());
-      checkUploadStatus(od);
+      checkUploadStatus(od as api.UploadStatus);
     });
   });
 
@@ -1240,8 +1241,9 @@
       var arg_request = buildDownloadLineItemsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DownloadLineItemsRequest.fromJson(json);
-        checkDownloadLineItemsRequest(obj);
+        var obj = api.DownloadLineItemsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDownloadLineItemsRequest(obj as api.DownloadLineItemsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1283,7 +1285,8 @@
       res
           .downloadlineitems(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDownloadLineItemsResponse(response);
+        checkDownloadLineItemsResponse(
+            response as api.DownloadLineItemsResponse);
       })));
     });
 
@@ -1293,8 +1296,9 @@
       var arg_request = buildUploadLineItemsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UploadLineItemsRequest.fromJson(json);
-        checkUploadLineItemsRequest(obj);
+        var obj = api.UploadLineItemsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUploadLineItemsRequest(obj as api.UploadLineItemsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1336,7 +1340,7 @@
       res
           .uploadlineitems(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUploadLineItemsResponse(response);
+        checkUploadLineItemsResponse(response as api.UploadLineItemsResponse);
       })));
     });
   });
@@ -1349,8 +1353,9 @@
       var arg_asynchronous = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Query.fromJson(json);
-        checkQuery(obj);
+        var obj =
+            api.Query.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkQuery(obj as api.Query);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1395,7 +1400,7 @@
           .createquery(arg_request,
               asynchronous: arg_asynchronous, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQuery(response);
+        checkQuery(response as api.Query);
       })));
     });
 
@@ -1499,7 +1504,7 @@
       res
           .getquery(arg_queryId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQuery(response);
+        checkQuery(response as api.Query);
       })));
     });
 
@@ -1557,7 +1562,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListQueriesResponse(response);
+        checkListQueriesResponse(response as api.ListQueriesResponse);
       })));
     });
 
@@ -1569,8 +1574,9 @@
       var arg_asynchronous = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RunQueryRequest.fromJson(json);
-        checkRunQueryRequest(obj);
+        var obj = api.RunQueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRunQueryRequest(obj as api.RunQueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1686,7 +1692,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListReportsResponse(response);
+        checkListReportsResponse(response as api.ListReportsResponse);
       })));
     });
   });
@@ -1698,8 +1704,9 @@
       var arg_request = buildDownloadRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DownloadRequest.fromJson(json);
-        checkDownloadRequest(obj);
+        var obj = api.DownloadRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDownloadRequest(obj as api.DownloadRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1741,7 +1748,7 @@
       res
           .download(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDownloadResponse(response);
+        checkDownloadResponse(response as api.DownloadResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/doubleclicksearch/v2_test.dart b/generated/googleapis/test/doubleclicksearch/v2_test.dart
index f636c05..5b8ad71 100644
--- a/generated/googleapis/test/doubleclicksearch/v2_test.dart
+++ b/generated/googleapis/test/doubleclicksearch/v2_test.dart
@@ -112,8 +112,8 @@
 
 void checkUnnamed1384(core.List<api.CustomDimension> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomDimension(o[0]);
-  checkCustomDimension(o[1]);
+  checkCustomDimension(o[0] as api.CustomDimension);
+  checkCustomDimension(o[1] as api.CustomDimension);
 }
 
 core.List<api.CustomMetric> buildUnnamed1385() {
@@ -125,8 +125,8 @@
 
 void checkUnnamed1385(core.List<api.CustomMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomMetric(o[0]);
-  checkCustomMetric(o[1]);
+  checkCustomMetric(o[0] as api.CustomMetric);
+  checkCustomMetric(o[1] as api.CustomMetric);
 }
 
 core.int buildCounterConversion = 0;
@@ -221,8 +221,8 @@
 
 void checkUnnamed1386(core.List<api.Conversion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConversion(o[0]);
-  checkConversion(o[1]);
+  checkConversion(o[0] as api.Conversion);
+  checkConversion(o[1] as api.Conversion);
 }
 
 core.int buildCounterConversionList = 0;
@@ -318,8 +318,8 @@
 
 void checkUnnamed1387(core.List<api.ReportFiles> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportFiles(o[0]);
-  checkReportFiles(o[1]);
+  checkReportFiles(o[0] as api.ReportFiles);
+  checkReportFiles(o[1] as api.ReportFiles);
 }
 
 core.List<api.ReportRow> buildUnnamed1388() {
@@ -331,8 +331,8 @@
 
 void checkUnnamed1388(core.List<api.ReportRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportRow(o[0]);
-  checkReportRow(o[1]);
+  checkReportRow(o[0] as api.ReportRow);
+  checkReportRow(o[1] as api.ReportRow);
 }
 
 core.int buildCounterReport = 0;
@@ -361,7 +361,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.isReportReady, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkReportRequest(o.request);
+    checkReportRequest(o.request as api.ReportRequest);
     unittest.expect(o.rowCount, unittest.equals(42));
     checkUnnamed1388(o.rows);
     unittest.expect(o.statisticsCurrencyCode, unittest.equals('foo'));
@@ -416,8 +416,8 @@
 
 void checkUnnamed1389(core.List<api.ReportApiColumnSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportApiColumnSpec(o[0]);
-  checkReportApiColumnSpec(o[1]);
+  checkReportApiColumnSpec(o[0] as api.ReportApiColumnSpec);
+  checkReportApiColumnSpec(o[1] as api.ReportApiColumnSpec);
 }
 
 core.List<core.Object> buildUnnamed1390() {
@@ -465,7 +465,7 @@
 void checkReportRequestFilters(api.ReportRequestFilters o) {
   buildCounterReportRequestFilters++;
   if (buildCounterReportRequestFilters < 3) {
-    checkReportApiColumnSpec(o.column);
+    checkReportApiColumnSpec(o.column as api.ReportApiColumnSpec);
     unittest.expect(o.operator, unittest.equals('foo'));
     checkUnnamed1390(o.values);
   }
@@ -481,8 +481,8 @@
 
 void checkUnnamed1391(core.List<api.ReportRequestFilters> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportRequestFilters(o[0]);
-  checkReportRequestFilters(o[1]);
+  checkReportRequestFilters(o[0] as api.ReportRequestFilters);
+  checkReportRequestFilters(o[1] as api.ReportRequestFilters);
 }
 
 core.int buildCounterReportRequestOrderBy = 0;
@@ -500,7 +500,7 @@
 void checkReportRequestOrderBy(api.ReportRequestOrderBy o) {
   buildCounterReportRequestOrderBy++;
   if (buildCounterReportRequestOrderBy < 3) {
-    checkReportApiColumnSpec(o.column);
+    checkReportApiColumnSpec(o.column as api.ReportApiColumnSpec);
     unittest.expect(o.sortOrder, unittest.equals('foo'));
   }
   buildCounterReportRequestOrderBy--;
@@ -515,8 +515,8 @@
 
 void checkUnnamed1392(core.List<api.ReportRequestOrderBy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportRequestOrderBy(o[0]);
-  checkReportRequestOrderBy(o[1]);
+  checkReportRequestOrderBy(o[0] as api.ReportRequestOrderBy);
+  checkReportRequestOrderBy(o[1] as api.ReportRequestOrderBy);
 }
 
 core.int buildCounterReportRequestReportScope = 0;
@@ -609,12 +609,13 @@
     unittest.expect(o.includeRemovedEntities, unittest.isTrue);
     unittest.expect(o.maxRowsPerFile, unittest.equals(42));
     checkUnnamed1392(o.orderBy);
-    checkReportRequestReportScope(o.reportScope);
+    checkReportRequestReportScope(
+        o.reportScope as api.ReportRequestReportScope);
     unittest.expect(o.reportType, unittest.equals('foo'));
     unittest.expect(o.rowCount, unittest.equals(42));
     unittest.expect(o.startRow, unittest.equals(42));
     unittest.expect(o.statisticsCurrency, unittest.equals('foo'));
-    checkReportRequestTimeRange(o.timeRange);
+    checkReportRequestTimeRange(o.timeRange as api.ReportRequestTimeRange);
     unittest.expect(o.verifySingleTimeZone, unittest.isTrue);
   }
   buildCounterReportRequest--;
@@ -681,8 +682,8 @@
 
 void checkUnnamed1393(core.List<api.SavedColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSavedColumn(o[0]);
-  checkSavedColumn(o[1]);
+  checkSavedColumn(o[0] as api.SavedColumn);
+  checkSavedColumn(o[1] as api.SavedColumn);
 }
 
 core.int buildCounterSavedColumnList = 0;
@@ -715,8 +716,8 @@
 
 void checkUnnamed1394(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAvailability(o[0]);
-  checkAvailability(o[1]);
+  checkAvailability(o[0] as api.Availability);
+  checkAvailability(o[1] as api.Availability);
 }
 
 core.int buildCounterUpdateAvailabilityRequest = 0;
@@ -747,8 +748,8 @@
 
 void checkUnnamed1395(core.List<api.Availability> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAvailability(o[0]);
-  checkAvailability(o[1]);
+  checkAvailability(o[0] as api.Availability);
+  checkAvailability(o[1] as api.Availability);
 }
 
 core.int buildCounterUpdateAvailabilityResponse = 0;
@@ -775,7 +776,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAvailability();
       var od = api.Availability.fromJson(o.toJson());
-      checkAvailability(od);
+      checkAvailability(od as api.Availability);
     });
   });
 
@@ -783,7 +784,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversion();
       var od = api.Conversion.fromJson(o.toJson());
-      checkConversion(od);
+      checkConversion(od as api.Conversion);
     });
   });
 
@@ -791,7 +792,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConversionList();
       var od = api.ConversionList.fromJson(o.toJson());
-      checkConversionList(od);
+      checkConversionList(od as api.ConversionList);
     });
   });
 
@@ -799,7 +800,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomDimension();
       var od = api.CustomDimension.fromJson(o.toJson());
-      checkCustomDimension(od);
+      checkCustomDimension(od as api.CustomDimension);
     });
   });
 
@@ -807,7 +808,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomMetric();
       var od = api.CustomMetric.fromJson(o.toJson());
-      checkCustomMetric(od);
+      checkCustomMetric(od as api.CustomMetric);
     });
   });
 
@@ -815,7 +816,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportFiles();
       var od = api.ReportFiles.fromJson(o.toJson());
-      checkReportFiles(od);
+      checkReportFiles(od as api.ReportFiles);
     });
   });
 
@@ -823,7 +824,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReport();
       var od = api.Report.fromJson(o.toJson());
-      checkReport(od);
+      checkReport(od as api.Report);
     });
   });
 
@@ -831,7 +832,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportApiColumnSpec();
       var od = api.ReportApiColumnSpec.fromJson(o.toJson());
-      checkReportApiColumnSpec(od);
+      checkReportApiColumnSpec(od as api.ReportApiColumnSpec);
     });
   });
 
@@ -839,7 +840,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRequestFilters();
       var od = api.ReportRequestFilters.fromJson(o.toJson());
-      checkReportRequestFilters(od);
+      checkReportRequestFilters(od as api.ReportRequestFilters);
     });
   });
 
@@ -847,7 +848,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRequestOrderBy();
       var od = api.ReportRequestOrderBy.fromJson(o.toJson());
-      checkReportRequestOrderBy(od);
+      checkReportRequestOrderBy(od as api.ReportRequestOrderBy);
     });
   });
 
@@ -855,7 +856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRequestReportScope();
       var od = api.ReportRequestReportScope.fromJson(o.toJson());
-      checkReportRequestReportScope(od);
+      checkReportRequestReportScope(od as api.ReportRequestReportScope);
     });
   });
 
@@ -863,7 +864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRequestTimeRange();
       var od = api.ReportRequestTimeRange.fromJson(o.toJson());
-      checkReportRequestTimeRange(od);
+      checkReportRequestTimeRange(od as api.ReportRequestTimeRange);
     });
   });
 
@@ -871,7 +872,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRequest();
       var od = api.ReportRequest.fromJson(o.toJson());
-      checkReportRequest(od);
+      checkReportRequest(od as api.ReportRequest);
     });
   });
 
@@ -879,7 +880,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRow();
       var od = api.ReportRow.fromJson(o.toJson());
-      checkReportRow(od);
+      checkReportRow(od as api.ReportRow);
     });
   });
 
@@ -887,7 +888,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSavedColumn();
       var od = api.SavedColumn.fromJson(o.toJson());
-      checkSavedColumn(od);
+      checkSavedColumn(od as api.SavedColumn);
     });
   });
 
@@ -895,7 +896,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSavedColumnList();
       var od = api.SavedColumnList.fromJson(o.toJson());
-      checkSavedColumnList(od);
+      checkSavedColumnList(od as api.SavedColumnList);
     });
   });
 
@@ -903,7 +904,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateAvailabilityRequest();
       var od = api.UpdateAvailabilityRequest.fromJson(o.toJson());
-      checkUpdateAvailabilityRequest(od);
+      checkUpdateAvailabilityRequest(od as api.UpdateAvailabilityRequest);
     });
   });
 
@@ -911,7 +912,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateAvailabilityResponse();
       var od = api.UpdateAvailabilityResponse.fromJson(o.toJson());
-      checkUpdateAvailabilityResponse(od);
+      checkUpdateAvailabilityResponse(od as api.UpdateAvailabilityResponse);
     });
   });
 
@@ -1017,7 +1018,7 @@
               criterionId: arg_criterionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConversionList(response);
+        checkConversionList(response as api.ConversionList);
       })));
     });
 
@@ -1027,8 +1028,9 @@
       var arg_request = buildConversionList();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ConversionList.fromJson(json);
-        checkConversionList(obj);
+        var obj = api.ConversionList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConversionList(obj as api.ConversionList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1067,7 +1069,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConversionList(response);
+        checkConversionList(response as api.ConversionList);
       })));
     });
 
@@ -1077,8 +1079,9 @@
       var arg_request = buildConversionList();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ConversionList.fromJson(json);
-        checkConversionList(obj);
+        var obj = api.ConversionList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConversionList(obj as api.ConversionList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1117,7 +1120,7 @@
       res
           .update(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConversionList(response);
+        checkConversionList(response as api.ConversionList);
       })));
     });
 
@@ -1127,8 +1130,9 @@
       var arg_request = buildUpdateAvailabilityRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateAvailabilityRequest.fromJson(json);
-        checkUpdateAvailabilityRequest(obj);
+        var obj = api.UpdateAvailabilityRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateAvailabilityRequest(obj as api.UpdateAvailabilityRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1169,7 +1173,8 @@
       res
           .updateAvailability(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUpdateAvailabilityResponse(response);
+        checkUpdateAvailabilityResponse(
+            response as api.UpdateAvailabilityResponse);
       })));
     });
   });
@@ -1181,8 +1186,9 @@
       var arg_request_1 = buildReportRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReportRequest.fromJson(json);
-        checkReportRequest(obj);
+        var obj = api.ReportRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReportRequest(obj as api.ReportRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1221,7 +1227,7 @@
       res
           .generate(arg_request_1, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
 
@@ -1271,7 +1277,7 @@
       res
           .get(arg_reportId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
 
@@ -1342,8 +1348,9 @@
       var arg_request_1 = buildReportRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReportRequest.fromJson(json);
-        checkReportRequest(obj);
+        var obj = api.ReportRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReportRequest(obj as api.ReportRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1382,7 +1389,7 @@
       res
           .request(arg_request_1, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
   });
@@ -1450,7 +1457,7 @@
       res
           .list(arg_agencyId, arg_advertiserId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedColumnList(response);
+        checkSavedColumnList(response as api.SavedColumnList);
       })));
     });
   });
diff --git a/generated/googleapis/test/drive/v2_test.dart b/generated/googleapis/test/drive/v2_test.dart
index 0580a42..08aa2db 100644
--- a/generated/googleapis/test/drive/v2_test.dart
+++ b/generated/googleapis/test/drive/v2_test.dart
@@ -118,8 +118,10 @@
 
 void checkUnnamed2172(core.List<api.AboutAdditionalRoleInfoRoleSets> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutAdditionalRoleInfoRoleSets(o[0]);
-  checkAboutAdditionalRoleInfoRoleSets(o[1]);
+  checkAboutAdditionalRoleInfoRoleSets(
+      o[0] as api.AboutAdditionalRoleInfoRoleSets);
+  checkAboutAdditionalRoleInfoRoleSets(
+      o[1] as api.AboutAdditionalRoleInfoRoleSets);
 }
 
 core.int buildCounterAboutAdditionalRoleInfo = 0;
@@ -152,8 +154,8 @@
 
 void checkUnnamed2173(core.List<api.AboutAdditionalRoleInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutAdditionalRoleInfo(o[0]);
-  checkAboutAdditionalRoleInfo(o[1]);
+  checkAboutAdditionalRoleInfo(o[0] as api.AboutAdditionalRoleInfo);
+  checkAboutAdditionalRoleInfo(o[1] as api.AboutAdditionalRoleInfo);
 }
 
 core.int buildCounterAboutDriveThemes = 0;
@@ -188,8 +190,8 @@
 
 void checkUnnamed2174(core.List<api.AboutDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutDriveThemes(o[0]);
-  checkAboutDriveThemes(o[1]);
+  checkAboutDriveThemes(o[0] as api.AboutDriveThemes);
+  checkAboutDriveThemes(o[1] as api.AboutDriveThemes);
 }
 
 core.List<core.String> buildUnnamed2175() {
@@ -235,8 +237,8 @@
 
 void checkUnnamed2176(core.List<api.AboutExportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutExportFormats(o[0]);
-  checkAboutExportFormats(o[1]);
+  checkAboutExportFormats(o[0] as api.AboutExportFormats);
+  checkAboutExportFormats(o[1] as api.AboutExportFormats);
 }
 
 core.int buildCounterAboutFeatures = 0;
@@ -269,8 +271,8 @@
 
 void checkUnnamed2177(core.List<api.AboutFeatures> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutFeatures(o[0]);
-  checkAboutFeatures(o[1]);
+  checkAboutFeatures(o[0] as api.AboutFeatures);
+  checkAboutFeatures(o[1] as api.AboutFeatures);
 }
 
 core.List<core.String> buildUnnamed2178() {
@@ -329,8 +331,8 @@
 
 void checkUnnamed2180(core.List<api.AboutImportFormats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutImportFormats(o[0]);
-  checkAboutImportFormats(o[1]);
+  checkAboutImportFormats(o[0] as api.AboutImportFormats);
+  checkAboutImportFormats(o[1] as api.AboutImportFormats);
 }
 
 core.int buildCounterAboutMaxUploadSizes = 0;
@@ -363,8 +365,8 @@
 
 void checkUnnamed2181(core.List<api.AboutMaxUploadSizes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutMaxUploadSizes(o[0]);
-  checkAboutMaxUploadSizes(o[1]);
+  checkAboutMaxUploadSizes(o[0] as api.AboutMaxUploadSizes);
+  checkAboutMaxUploadSizes(o[1] as api.AboutMaxUploadSizes);
 }
 
 core.int buildCounterAboutQuotaBytesByService = 0;
@@ -397,8 +399,8 @@
 
 void checkUnnamed2182(core.List<api.AboutQuotaBytesByService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutQuotaBytesByService(o[0]);
-  checkAboutQuotaBytesByService(o[1]);
+  checkAboutQuotaBytesByService(o[0] as api.AboutQuotaBytesByService);
+  checkAboutQuotaBytesByService(o[1] as api.AboutQuotaBytesByService);
 }
 
 core.int buildCounterAboutTeamDriveThemes = 0;
@@ -433,8 +435,8 @@
 
 void checkUnnamed2183(core.List<api.AboutTeamDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutTeamDriveThemes(o[0]);
-  checkAboutTeamDriveThemes(o[1]);
+  checkAboutTeamDriveThemes(o[0] as api.AboutTeamDriveThemes);
+  checkAboutTeamDriveThemes(o[1] as api.AboutTeamDriveThemes);
 }
 
 core.int buildCounterAbout = 0;
@@ -505,7 +507,7 @@
     unittest.expect(o.rootFolderId, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
     checkUnnamed2183(o.teamDriveThemes);
-    checkUser(o.user);
+    checkUser(o.user as api.User);
   }
   buildCounterAbout--;
 }
@@ -542,8 +544,8 @@
 
 void checkUnnamed2184(core.List<api.AppIcons> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAppIcons(o[0]);
-  checkAppIcons(o[1]);
+  checkAppIcons(o[0] as api.AppIcons);
+  checkAppIcons(o[1] as api.AppIcons);
 }
 
 core.List<core.String> buildUnnamed2185() {
@@ -685,8 +687,8 @@
 
 void checkUnnamed2190(core.List<api.App> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApp(o[0]);
-  checkApp(o[1]);
+  checkApp(o[0] as api.App);
+  checkApp(o[1] as api.App);
 }
 
 core.int buildCounterAppList = 0;
@@ -744,16 +746,16 @@
   if (buildCounterChange < 3) {
     unittest.expect(o.changeType, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
-    checkDrive(o.drive);
+    checkDrive(o.drive as api.Drive);
     unittest.expect(o.driveId, unittest.equals('foo'));
-    checkFile(o.file);
+    checkFile(o.file as api.File);
     unittest.expect(o.fileId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modificationDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.selfLink, unittest.equals('foo'));
-    checkTeamDrive(o.teamDrive);
+    checkTeamDrive(o.teamDrive as api.TeamDrive);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -769,8 +771,8 @@
 
 void checkUnnamed2191(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChange(o[0]);
-  checkChange(o[1]);
+  checkChange(o[0] as api.Change);
+  checkChange(o[1] as api.Change);
 }
 
 core.int buildCounterChangeList = 0;
@@ -865,8 +867,8 @@
 
 void checkUnnamed2193(core.List<api.ChildReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChildReference(o[0]);
-  checkChildReference(o[1]);
+  checkChildReference(o[0] as api.ChildReference);
+  checkChildReference(o[1] as api.ChildReference);
 }
 
 core.int buildCounterChildList = 0;
@@ -953,8 +955,8 @@
 
 void checkUnnamed2194(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommentReply(o[0]);
-  checkCommentReply(o[1]);
+  checkCommentReply(o[0] as api.CommentReply);
+  checkCommentReply(o[1] as api.CommentReply);
 }
 
 core.int buildCounterComment = 0;
@@ -986,10 +988,10 @@
   buildCounterComment++;
   if (buildCounterComment < 3) {
     unittest.expect(o.anchor, unittest.equals('foo'));
-    checkUser(o.author);
+    checkUser(o.author as api.User);
     unittest.expect(o.commentId, unittest.equals('foo'));
     unittest.expect(o.content, unittest.equals('foo'));
-    checkCommentContext(o.context);
+    checkCommentContext(o.context as api.CommentContext);
     unittest.expect(o.createdDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.deleted, unittest.isTrue);
@@ -1015,8 +1017,8 @@
 
 void checkUnnamed2195(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComment(o[0]);
-  checkComment(o[1]);
+  checkComment(o[0] as api.Comment);
+  checkComment(o[1] as api.Comment);
 }
 
 core.int buildCounterCommentList = 0;
@@ -1068,7 +1070,7 @@
 void checkCommentReply(api.CommentReply o) {
   buildCounterCommentReply++;
   if (buildCounterCommentReply < 3) {
-    checkUser(o.author);
+    checkUser(o.author as api.User);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.createdDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1092,8 +1094,8 @@
 
 void checkUnnamed2196(core.List<api.CommentReply> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommentReply(o[0]);
-  checkCommentReply(o[1]);
+  checkCommentReply(o[0] as api.CommentReply);
+  checkCommentReply(o[1] as api.CommentReply);
 }
 
 core.int buildCounterCommentReplyList = 0;
@@ -1143,7 +1145,7 @@
   if (buildCounterContentRestriction < 3) {
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.reason, unittest.equals('foo'));
-    checkUser(o.restrictingUser);
+    checkUser(o.restrictingUser as api.User);
     unittest.expect(o.restrictionDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1279,9 +1281,10 @@
 void checkDrive(api.Drive o) {
   buildCounterDrive++;
   if (buildCounterDrive < 3) {
-    checkDriveBackgroundImageFile(o.backgroundImageFile);
+    checkDriveBackgroundImageFile(
+        o.backgroundImageFile as api.DriveBackgroundImageFile);
     unittest.expect(o.backgroundImageLink, unittest.equals('foo'));
-    checkDriveCapabilities(o.capabilities);
+    checkDriveCapabilities(o.capabilities as api.DriveCapabilities);
     unittest.expect(o.colorRgb, unittest.equals('foo'));
     unittest.expect(o.createdDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1289,7 +1292,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkDriveRestrictions(o.restrictions);
+    checkDriveRestrictions(o.restrictions as api.DriveRestrictions);
     unittest.expect(o.themeId, unittest.equals('foo'));
   }
   buildCounterDrive--;
@@ -1304,8 +1307,8 @@
 
 void checkUnnamed2197(core.List<api.Drive> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDrive(o[0]);
-  checkDrive(o[1]);
+  checkDrive(o[0] as api.Drive);
+  checkDrive(o[1] as api.Drive);
 }
 
 core.int buildCounterDriveList = 0;
@@ -1425,8 +1428,8 @@
 
 void checkUnnamed2198(core.List<api.ContentRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContentRestriction(o[0]);
-  checkContentRestriction(o[1]);
+  checkContentRestriction(o[0] as api.ContentRestriction);
+  checkContentRestriction(o[1] as api.ContentRestriction);
 }
 
 core.Map<core.String, core.String> buildUnnamed2199() {
@@ -1512,7 +1515,8 @@
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.isoSpeed, unittest.equals(42));
     unittest.expect(o.lens, unittest.equals('foo'));
-    checkFileImageMediaMetadataLocation(o.location);
+    checkFileImageMediaMetadataLocation(
+        o.location as api.FileImageMediaMetadataLocation);
     unittest.expect(o.maxApertureValue, unittest.equals(42.0));
     unittest.expect(o.meteringMode, unittest.equals('foo'));
     unittest.expect(o.rotation, unittest.equals(42));
@@ -1607,8 +1611,8 @@
 
 void checkUnnamed2202(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUser(o[0]);
-  checkUser(o[1]);
+  checkUser(o[0] as api.User);
+  checkUser(o[1] as api.User);
 }
 
 core.List<api.ParentReference> buildUnnamed2203() {
@@ -1620,8 +1624,8 @@
 
 void checkUnnamed2203(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParentReference(o[0]);
-  checkParentReference(o[1]);
+  checkParentReference(o[0] as api.ParentReference);
+  checkParentReference(o[1] as api.ParentReference);
 }
 
 core.List<core.String> buildUnnamed2204() {
@@ -1646,8 +1650,8 @@
 
 void checkUnnamed2205(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermission(o[0]);
-  checkPermission(o[1]);
+  checkPermission(o[0] as api.Permission);
+  checkPermission(o[1] as api.Permission);
 }
 
 core.List<api.Property> buildUnnamed2206() {
@@ -1659,8 +1663,8 @@
 
 void checkUnnamed2206(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProperty(o[0]);
-  checkProperty(o[1]);
+  checkProperty(o[0] as api.Property);
+  checkProperty(o[1] as api.Property);
 }
 
 core.int buildCounterFileShortcutDetails = 0;
@@ -1828,7 +1832,7 @@
     unittest.expect(o.appDataContents, unittest.isTrue);
     unittest.expect(o.canComment, unittest.isTrue);
     unittest.expect(o.canReadRevisions, unittest.isTrue);
-    checkFileCapabilities(o.capabilities);
+    checkFileCapabilities(o.capabilities as api.FileCapabilities);
     checkUnnamed2198(o.contentRestrictions);
     unittest.expect(o.copyRequiresWriterPermission, unittest.isTrue);
     unittest.expect(o.copyable, unittest.isTrue);
@@ -1852,12 +1856,13 @@
     unittest.expect(o.headRevisionId, unittest.equals('foo'));
     unittest.expect(o.iconLink, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkFileImageMediaMetadata(o.imageMediaMetadata);
-    checkFileIndexableText(o.indexableText);
+    checkFileImageMediaMetadata(
+        o.imageMediaMetadata as api.FileImageMediaMetadata);
+    checkFileIndexableText(o.indexableText as api.FileIndexableText);
     unittest.expect(o.isAppAuthorized, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkFileLabels(o.labels);
-    checkUser(o.lastModifyingUser);
+    checkFileLabels(o.labels as api.FileLabels);
+    checkUser(o.lastModifyingUser as api.User);
     unittest.expect(o.lastModifyingUserName, unittest.equals('foo'));
     unittest.expect(o.lastViewedByMeDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1884,20 +1889,21 @@
     unittest.expect(o.shared, unittest.isTrue);
     unittest.expect(o.sharedWithMeDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUser(o.sharingUser);
-    checkFileShortcutDetails(o.shortcutDetails);
+    checkUser(o.sharingUser as api.User);
+    checkFileShortcutDetails(o.shortcutDetails as api.FileShortcutDetails);
     checkUnnamed2207(o.spaces);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
-    checkFileThumbnail(o.thumbnail);
+    checkFileThumbnail(o.thumbnail as api.FileThumbnail);
     unittest.expect(o.thumbnailLink, unittest.equals('foo'));
     unittest.expect(o.thumbnailVersion, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.trashedDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUser(o.trashingUser);
-    checkPermission(o.userPermission);
+    checkUser(o.trashingUser as api.User);
+    checkPermission(o.userPermission as api.Permission);
     unittest.expect(o.version, unittest.equals('foo'));
-    checkFileVideoMediaMetadata(o.videoMediaMetadata);
+    checkFileVideoMediaMetadata(
+        o.videoMediaMetadata as api.FileVideoMediaMetadata);
     unittest.expect(o.webContentLink, unittest.equals('foo'));
     unittest.expect(o.webViewLink, unittest.equals('foo'));
     unittest.expect(o.writersCanShare, unittest.isTrue);
@@ -1914,8 +1920,8 @@
 
 void checkUnnamed2208(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFile(o[0]);
-  checkFile(o[1]);
+  checkFile(o[0] as api.File);
+  checkFile(o[1] as api.File);
 }
 
 core.int buildCounterFileList = 0;
@@ -1994,8 +2000,8 @@
 
 void checkUnnamed2210(core.List<api.ParentReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParentReference(o[0]);
-  checkParentReference(o[1]);
+  checkParentReference(o[0] as api.ParentReference);
+  checkParentReference(o[1] as api.ParentReference);
 }
 
 core.int buildCounterParentList = 0;
@@ -2112,8 +2118,8 @@
 
 void checkUnnamed2213(core.List<api.PermissionPermissionDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermissionPermissionDetails(o[0]);
-  checkPermissionPermissionDetails(o[1]);
+  checkPermissionPermissionDetails(o[0] as api.PermissionPermissionDetails);
+  checkPermissionPermissionDetails(o[1] as api.PermissionPermissionDetails);
 }
 
 core.List<core.String> buildUnnamed2214() {
@@ -2167,8 +2173,10 @@
 
 void checkUnnamed2215(core.List<api.PermissionTeamDrivePermissionDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermissionTeamDrivePermissionDetails(o[0]);
-  checkPermissionTeamDrivePermissionDetails(o[1]);
+  checkPermissionTeamDrivePermissionDetails(
+      o[0] as api.PermissionTeamDrivePermissionDetails);
+  checkPermissionTeamDrivePermissionDetails(
+      o[1] as api.PermissionTeamDrivePermissionDetails);
 }
 
 core.int buildCounterPermission = 0;
@@ -2257,8 +2265,8 @@
 
 void checkUnnamed2216(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermission(o[0]);
-  checkPermission(o[1]);
+  checkPermission(o[0] as api.Permission);
+  checkPermission(o[1] as api.Permission);
 }
 
 core.int buildCounterPermissionList = 0;
@@ -2326,8 +2334,8 @@
 
 void checkUnnamed2217(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProperty(o[0]);
-  checkProperty(o[1]);
+  checkProperty(o[0] as api.Property);
+  checkProperty(o[1] as api.Property);
 }
 
 core.int buildCounterPropertyList = 0;
@@ -2405,7 +2413,7 @@
     unittest.expect(o.fileSize, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUser(o.lastModifyingUser);
+    checkUser(o.lastModifyingUser as api.User);
     unittest.expect(o.lastModifyingUserName, unittest.equals('foo'));
     unittest.expect(o.md5Checksum, unittest.equals('foo'));
     unittest.expect(o.mimeType, unittest.equals('foo'));
@@ -2431,8 +2439,8 @@
 
 void checkUnnamed2219(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRevision(o[0]);
-  checkRevision(o[1]);
+  checkRevision(o[0] as api.Revision);
+  checkRevision(o[1] as api.Revision);
 }
 
 core.int buildCounterRevisionList = 0;
@@ -2612,16 +2620,17 @@
 void checkTeamDrive(api.TeamDrive o) {
   buildCounterTeamDrive++;
   if (buildCounterTeamDrive < 3) {
-    checkTeamDriveBackgroundImageFile(o.backgroundImageFile);
+    checkTeamDriveBackgroundImageFile(
+        o.backgroundImageFile as api.TeamDriveBackgroundImageFile);
     unittest.expect(o.backgroundImageLink, unittest.equals('foo'));
-    checkTeamDriveCapabilities(o.capabilities);
+    checkTeamDriveCapabilities(o.capabilities as api.TeamDriveCapabilities);
     unittest.expect(o.colorRgb, unittest.equals('foo'));
     unittest.expect(o.createdDate,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkTeamDriveRestrictions(o.restrictions);
+    checkTeamDriveRestrictions(o.restrictions as api.TeamDriveRestrictions);
     unittest.expect(o.themeId, unittest.equals('foo'));
   }
   buildCounterTeamDrive--;
@@ -2636,8 +2645,8 @@
 
 void checkUnnamed2220(core.List<api.TeamDrive> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTeamDrive(o[0]);
-  checkTeamDrive(o[1]);
+  checkTeamDrive(o[0] as api.TeamDrive);
+  checkTeamDrive(o[1] as api.TeamDrive);
 }
 
 core.int buildCounterTeamDriveList = 0;
@@ -2706,7 +2715,7 @@
     unittest.expect(o.isAuthenticatedUser, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.permissionId, unittest.equals('foo'));
-    checkUserPicture(o.picture);
+    checkUserPicture(o.picture as api.UserPicture);
   }
   buildCounterUser--;
 }
@@ -2716,7 +2725,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutAdditionalRoleInfoRoleSets();
       var od = api.AboutAdditionalRoleInfoRoleSets.fromJson(o.toJson());
-      checkAboutAdditionalRoleInfoRoleSets(od);
+      checkAboutAdditionalRoleInfoRoleSets(
+          od as api.AboutAdditionalRoleInfoRoleSets);
     });
   });
 
@@ -2724,7 +2734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutAdditionalRoleInfo();
       var od = api.AboutAdditionalRoleInfo.fromJson(o.toJson());
-      checkAboutAdditionalRoleInfo(od);
+      checkAboutAdditionalRoleInfo(od as api.AboutAdditionalRoleInfo);
     });
   });
 
@@ -2732,7 +2742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutDriveThemes();
       var od = api.AboutDriveThemes.fromJson(o.toJson());
-      checkAboutDriveThemes(od);
+      checkAboutDriveThemes(od as api.AboutDriveThemes);
     });
   });
 
@@ -2740,7 +2750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutExportFormats();
       var od = api.AboutExportFormats.fromJson(o.toJson());
-      checkAboutExportFormats(od);
+      checkAboutExportFormats(od as api.AboutExportFormats);
     });
   });
 
@@ -2748,7 +2758,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutFeatures();
       var od = api.AboutFeatures.fromJson(o.toJson());
-      checkAboutFeatures(od);
+      checkAboutFeatures(od as api.AboutFeatures);
     });
   });
 
@@ -2756,7 +2766,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutImportFormats();
       var od = api.AboutImportFormats.fromJson(o.toJson());
-      checkAboutImportFormats(od);
+      checkAboutImportFormats(od as api.AboutImportFormats);
     });
   });
 
@@ -2764,7 +2774,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutMaxUploadSizes();
       var od = api.AboutMaxUploadSizes.fromJson(o.toJson());
-      checkAboutMaxUploadSizes(od);
+      checkAboutMaxUploadSizes(od as api.AboutMaxUploadSizes);
     });
   });
 
@@ -2772,7 +2782,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutQuotaBytesByService();
       var od = api.AboutQuotaBytesByService.fromJson(o.toJson());
-      checkAboutQuotaBytesByService(od);
+      checkAboutQuotaBytesByService(od as api.AboutQuotaBytesByService);
     });
   });
 
@@ -2780,7 +2790,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutTeamDriveThemes();
       var od = api.AboutTeamDriveThemes.fromJson(o.toJson());
-      checkAboutTeamDriveThemes(od);
+      checkAboutTeamDriveThemes(od as api.AboutTeamDriveThemes);
     });
   });
 
@@ -2788,7 +2798,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAbout();
       var od = api.About.fromJson(o.toJson());
-      checkAbout(od);
+      checkAbout(od as api.About);
     });
   });
 
@@ -2796,7 +2806,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppIcons();
       var od = api.AppIcons.fromJson(o.toJson());
-      checkAppIcons(od);
+      checkAppIcons(od as api.AppIcons);
     });
   });
 
@@ -2804,7 +2814,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApp();
       var od = api.App.fromJson(o.toJson());
-      checkApp(od);
+      checkApp(od as api.App);
     });
   });
 
@@ -2812,7 +2822,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppList();
       var od = api.AppList.fromJson(o.toJson());
-      checkAppList(od);
+      checkAppList(od as api.AppList);
     });
   });
 
@@ -2820,7 +2830,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChange();
       var od = api.Change.fromJson(o.toJson());
-      checkChange(od);
+      checkChange(od as api.Change);
     });
   });
 
@@ -2828,7 +2838,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChangeList();
       var od = api.ChangeList.fromJson(o.toJson());
-      checkChangeList(od);
+      checkChangeList(od as api.ChangeList);
     });
   });
 
@@ -2836,7 +2846,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -2844,7 +2854,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChildList();
       var od = api.ChildList.fromJson(o.toJson());
-      checkChildList(od);
+      checkChildList(od as api.ChildList);
     });
   });
 
@@ -2852,7 +2862,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChildReference();
       var od = api.ChildReference.fromJson(o.toJson());
-      checkChildReference(od);
+      checkChildReference(od as api.ChildReference);
     });
   });
 
@@ -2860,7 +2870,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentContext();
       var od = api.CommentContext.fromJson(o.toJson());
-      checkCommentContext(od);
+      checkCommentContext(od as api.CommentContext);
     });
   });
 
@@ -2868,7 +2878,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComment();
       var od = api.Comment.fromJson(o.toJson());
-      checkComment(od);
+      checkComment(od as api.Comment);
     });
   });
 
@@ -2876,7 +2886,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentList();
       var od = api.CommentList.fromJson(o.toJson());
-      checkCommentList(od);
+      checkCommentList(od as api.CommentList);
     });
   });
 
@@ -2884,7 +2894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentReply();
       var od = api.CommentReply.fromJson(o.toJson());
-      checkCommentReply(od);
+      checkCommentReply(od as api.CommentReply);
     });
   });
 
@@ -2892,7 +2902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentReplyList();
       var od = api.CommentReplyList.fromJson(o.toJson());
-      checkCommentReplyList(od);
+      checkCommentReplyList(od as api.CommentReplyList);
     });
   });
 
@@ -2900,7 +2910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContentRestriction();
       var od = api.ContentRestriction.fromJson(o.toJson());
-      checkContentRestriction(od);
+      checkContentRestriction(od as api.ContentRestriction);
     });
   });
 
@@ -2908,7 +2918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveBackgroundImageFile();
       var od = api.DriveBackgroundImageFile.fromJson(o.toJson());
-      checkDriveBackgroundImageFile(od);
+      checkDriveBackgroundImageFile(od as api.DriveBackgroundImageFile);
     });
   });
 
@@ -2916,7 +2926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveCapabilities();
       var od = api.DriveCapabilities.fromJson(o.toJson());
-      checkDriveCapabilities(od);
+      checkDriveCapabilities(od as api.DriveCapabilities);
     });
   });
 
@@ -2924,7 +2934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveRestrictions();
       var od = api.DriveRestrictions.fromJson(o.toJson());
-      checkDriveRestrictions(od);
+      checkDriveRestrictions(od as api.DriveRestrictions);
     });
   });
 
@@ -2932,7 +2942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDrive();
       var od = api.Drive.fromJson(o.toJson());
-      checkDrive(od);
+      checkDrive(od as api.Drive);
     });
   });
 
@@ -2940,7 +2950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveList();
       var od = api.DriveList.fromJson(o.toJson());
-      checkDriveList(od);
+      checkDriveList(od as api.DriveList);
     });
   });
 
@@ -2948,7 +2958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileCapabilities();
       var od = api.FileCapabilities.fromJson(o.toJson());
-      checkFileCapabilities(od);
+      checkFileCapabilities(od as api.FileCapabilities);
     });
   });
 
@@ -2956,7 +2966,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileImageMediaMetadataLocation();
       var od = api.FileImageMediaMetadataLocation.fromJson(o.toJson());
-      checkFileImageMediaMetadataLocation(od);
+      checkFileImageMediaMetadataLocation(
+          od as api.FileImageMediaMetadataLocation);
     });
   });
 
@@ -2964,7 +2975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileImageMediaMetadata();
       var od = api.FileImageMediaMetadata.fromJson(o.toJson());
-      checkFileImageMediaMetadata(od);
+      checkFileImageMediaMetadata(od as api.FileImageMediaMetadata);
     });
   });
 
@@ -2972,7 +2983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileIndexableText();
       var od = api.FileIndexableText.fromJson(o.toJson());
-      checkFileIndexableText(od);
+      checkFileIndexableText(od as api.FileIndexableText);
     });
   });
 
@@ -2980,7 +2991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileLabels();
       var od = api.FileLabels.fromJson(o.toJson());
-      checkFileLabels(od);
+      checkFileLabels(od as api.FileLabels);
     });
   });
 
@@ -2988,7 +2999,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileShortcutDetails();
       var od = api.FileShortcutDetails.fromJson(o.toJson());
-      checkFileShortcutDetails(od);
+      checkFileShortcutDetails(od as api.FileShortcutDetails);
     });
   });
 
@@ -2996,7 +3007,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileThumbnail();
       var od = api.FileThumbnail.fromJson(o.toJson());
-      checkFileThumbnail(od);
+      checkFileThumbnail(od as api.FileThumbnail);
     });
   });
 
@@ -3004,7 +3015,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileVideoMediaMetadata();
       var od = api.FileVideoMediaMetadata.fromJson(o.toJson());
-      checkFileVideoMediaMetadata(od);
+      checkFileVideoMediaMetadata(od as api.FileVideoMediaMetadata);
     });
   });
 
@@ -3012,7 +3023,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFile();
       var od = api.File.fromJson(o.toJson());
-      checkFile(od);
+      checkFile(od as api.File);
     });
   });
 
@@ -3020,7 +3031,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileList();
       var od = api.FileList.fromJson(o.toJson());
-      checkFileList(od);
+      checkFileList(od as api.FileList);
     });
   });
 
@@ -3028,7 +3039,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeneratedIds();
       var od = api.GeneratedIds.fromJson(o.toJson());
-      checkGeneratedIds(od);
+      checkGeneratedIds(od as api.GeneratedIds);
     });
   });
 
@@ -3036,7 +3047,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParentList();
       var od = api.ParentList.fromJson(o.toJson());
-      checkParentList(od);
+      checkParentList(od as api.ParentList);
     });
   });
 
@@ -3044,7 +3055,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParentReference();
       var od = api.ParentReference.fromJson(o.toJson());
-      checkParentReference(od);
+      checkParentReference(od as api.ParentReference);
     });
   });
 
@@ -3052,7 +3063,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionPermissionDetails();
       var od = api.PermissionPermissionDetails.fromJson(o.toJson());
-      checkPermissionPermissionDetails(od);
+      checkPermissionPermissionDetails(od as api.PermissionPermissionDetails);
     });
   });
 
@@ -3060,7 +3071,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionTeamDrivePermissionDetails();
       var od = api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
-      checkPermissionTeamDrivePermissionDetails(od);
+      checkPermissionTeamDrivePermissionDetails(
+          od as api.PermissionTeamDrivePermissionDetails);
     });
   });
 
@@ -3068,7 +3080,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermission();
       var od = api.Permission.fromJson(o.toJson());
-      checkPermission(od);
+      checkPermission(od as api.Permission);
     });
   });
 
@@ -3076,7 +3088,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionId();
       var od = api.PermissionId.fromJson(o.toJson());
-      checkPermissionId(od);
+      checkPermissionId(od as api.PermissionId);
     });
   });
 
@@ -3084,7 +3096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionList();
       var od = api.PermissionList.fromJson(o.toJson());
-      checkPermissionList(od);
+      checkPermissionList(od as api.PermissionList);
     });
   });
 
@@ -3092,7 +3104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProperty();
       var od = api.Property.fromJson(o.toJson());
-      checkProperty(od);
+      checkProperty(od as api.Property);
     });
   });
 
@@ -3100,7 +3112,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPropertyList();
       var od = api.PropertyList.fromJson(o.toJson());
-      checkPropertyList(od);
+      checkPropertyList(od as api.PropertyList);
     });
   });
 
@@ -3108,7 +3120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevision();
       var od = api.Revision.fromJson(o.toJson());
-      checkRevision(od);
+      checkRevision(od as api.Revision);
     });
   });
 
@@ -3116,7 +3128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevisionList();
       var od = api.RevisionList.fromJson(o.toJson());
-      checkRevisionList(od);
+      checkRevisionList(od as api.RevisionList);
     });
   });
 
@@ -3124,7 +3136,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartPageToken();
       var od = api.StartPageToken.fromJson(o.toJson());
-      checkStartPageToken(od);
+      checkStartPageToken(od as api.StartPageToken);
     });
   });
 
@@ -3132,7 +3144,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveBackgroundImageFile();
       var od = api.TeamDriveBackgroundImageFile.fromJson(o.toJson());
-      checkTeamDriveBackgroundImageFile(od);
+      checkTeamDriveBackgroundImageFile(od as api.TeamDriveBackgroundImageFile);
     });
   });
 
@@ -3140,7 +3152,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveCapabilities();
       var od = api.TeamDriveCapabilities.fromJson(o.toJson());
-      checkTeamDriveCapabilities(od);
+      checkTeamDriveCapabilities(od as api.TeamDriveCapabilities);
     });
   });
 
@@ -3148,7 +3160,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveRestrictions();
       var od = api.TeamDriveRestrictions.fromJson(o.toJson());
-      checkTeamDriveRestrictions(od);
+      checkTeamDriveRestrictions(od as api.TeamDriveRestrictions);
     });
   });
 
@@ -3156,7 +3168,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDrive();
       var od = api.TeamDrive.fromJson(o.toJson());
-      checkTeamDrive(od);
+      checkTeamDrive(od as api.TeamDrive);
     });
   });
 
@@ -3164,7 +3176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveList();
       var od = api.TeamDriveList.fromJson(o.toJson());
-      checkTeamDriveList(od);
+      checkTeamDriveList(od as api.TeamDriveList);
     });
   });
 
@@ -3172,7 +3184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserPicture();
       var od = api.UserPicture.fromJson(o.toJson());
-      checkUserPicture(od);
+      checkUserPicture(od as api.UserPicture);
     });
   });
 
@@ -3180,7 +3192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -3243,7 +3255,7 @@
               startChangeId: arg_startChangeId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAbout(response);
+        checkAbout(response as api.About);
       })));
     });
   });
@@ -3298,7 +3310,7 @@
       res
           .get(arg_appId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApp(response);
+        checkApp(response as api.App);
       })));
     });
 
@@ -3360,7 +3372,7 @@
               languageCode: arg_languageCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppList(response);
+        checkAppList(response as api.AppList);
       })));
     });
   });
@@ -3432,7 +3444,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChange(response);
+        checkChange(response as api.Change);
       })));
     });
 
@@ -3498,7 +3510,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStartPageToken(response);
+        checkStartPageToken(response as api.StartPageToken);
       })));
     });
 
@@ -3603,7 +3615,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChangeList(response);
+        checkChangeList(response as api.ChangeList);
       })));
     });
 
@@ -3627,8 +3639,9 @@
       var arg_teamDriveId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3712,7 +3725,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -3724,8 +3737,9 @@
       var arg_request = buildChannel();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3896,7 +3910,7 @@
       res
           .get(arg_folderId, arg_childId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChildReference(response);
+        checkChildReference(response as api.ChildReference);
       })));
     });
 
@@ -3910,8 +3924,9 @@
       var arg_supportsTeamDrives = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChildReference.fromJson(json);
-        checkChildReference(obj);
+        var obj = api.ChildReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChildReference(obj as api.ChildReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3972,7 +3987,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChildReference(response);
+        checkChildReference(response as api.ChildReference);
       })));
     });
 
@@ -4047,7 +4062,7 @@
               q: arg_q,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChildList(response);
+        checkChildList(response as api.ChildList);
       })));
     });
   });
@@ -4177,7 +4192,7 @@
           .get(arg_fileId, arg_commentId,
               includeDeleted: arg_includeDeleted, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -4188,8 +4203,9 @@
       var arg_fileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Comment.fromJson(json);
-        checkComment(obj);
+        var obj =
+            api.Comment.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkComment(obj as api.Comment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4240,7 +4256,7 @@
       res
           .insert(arg_request, arg_fileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -4316,7 +4332,7 @@
               updatedMin: arg_updatedMin,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentList(response);
+        checkCommentList(response as api.CommentList);
       })));
     });
 
@@ -4328,8 +4344,9 @@
       var arg_commentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Comment.fromJson(json);
-        checkComment(obj);
+        var obj =
+            api.Comment.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkComment(obj as api.Comment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4383,7 +4400,7 @@
       res
           .patch(arg_request, arg_fileId, arg_commentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -4395,8 +4412,9 @@
       var arg_commentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Comment.fromJson(json);
-        checkComment(obj);
+        var obj =
+            api.Comment.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkComment(obj as api.Comment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4450,7 +4468,7 @@
       res
           .update(arg_request, arg_fileId, arg_commentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
   });
@@ -4561,7 +4579,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -4620,7 +4638,7 @@
       res
           .hide(arg_driveId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -4631,8 +4649,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Drive.fromJson(json);
-        checkDrive(obj);
+        var obj =
+            api.Drive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDrive(obj as api.Drive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4676,7 +4695,7 @@
       res
           .insert(arg_request, arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -4741,7 +4760,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDriveList(response);
+        checkDriveList(response as api.DriveList);
       })));
     });
 
@@ -4800,7 +4819,7 @@
       res
           .unhide(arg_driveId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -4812,8 +4831,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Drive.fromJson(json);
-        checkDrive(obj);
+        var obj =
+            api.Drive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDrive(obj as api.Drive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4862,7 +4882,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
   });
@@ -4886,8 +4906,9 @@
       var arg_visibility = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.File.fromJson(json);
-        checkFile(obj);
+        var obj =
+            api.File.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFile(obj as api.File);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4971,7 +4992,7 @@
               visibility: arg_visibility,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5207,7 +5228,7 @@
               space: arg_space,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGeneratedIds(response);
+        checkGeneratedIds(response as api.GeneratedIds);
       })));
     });
 
@@ -5292,7 +5313,7 @@
               updateViewedDate: arg_updateViewedDate,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5317,8 +5338,9 @@
       var arg_visibility = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.File.fromJson(json);
-        checkFile(obj);
+        var obj =
+            api.File.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFile(obj as api.File);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5396,7 +5418,7 @@
               visibility: arg_visibility,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5503,7 +5525,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFileList(response);
+        checkFileList(response as api.FileList);
       })));
     });
 
@@ -5531,8 +5553,9 @@
       var arg_useContentAsIndexableText = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.File.fromJson(json);
-        checkFile(obj);
+        var obj =
+            api.File.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFile(obj as api.File);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5628,7 +5651,7 @@
               useContentAsIndexableText: arg_useContentAsIndexableText,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5700,7 +5723,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5772,7 +5795,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5844,7 +5867,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5875,8 +5898,9 @@
       var arg_useContentAsIndexableText = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.File.fromJson(json);
-        checkFile(obj);
+        var obj =
+            api.File.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFile(obj as api.File);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5972,7 +5996,7 @@
               useContentAsIndexableText: arg_useContentAsIndexableText,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -5993,8 +6017,9 @@
       var arg_updateViewedDate = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6067,7 +6092,7 @@
               updateViewedDate: arg_updateViewedDate,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -6198,7 +6223,7 @@
       res
           .get(arg_fileId, arg_parentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkParentReference(response);
+        checkParentReference(response as api.ParentReference);
       })));
     });
 
@@ -6212,8 +6237,9 @@
       var arg_supportsTeamDrives = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ParentReference.fromJson(json);
-        checkParentReference(obj);
+        var obj = api.ParentReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkParentReference(obj as api.ParentReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6274,7 +6300,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkParentReference(response);
+        checkParentReference(response as api.ParentReference);
       })));
     });
 
@@ -6333,7 +6359,7 @@
       res
           .list(arg_fileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkParentList(response);
+        checkParentList(response as api.ParentList);
       })));
     });
   });
@@ -6485,7 +6511,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
 
@@ -6538,7 +6564,7 @@
       res
           .getIdForEmail(arg_email, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermissionId(response);
+        checkPermissionId(response as api.PermissionId);
       })));
     });
 
@@ -6556,8 +6582,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Permission.fromJson(json);
-        checkPermission(obj);
+        var obj = api.Permission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPermission(obj as api.Permission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6630,7 +6657,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
 
@@ -6714,7 +6741,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermissionList(response);
+        checkPermissionList(response as api.PermissionList);
       })));
     });
 
@@ -6731,8 +6758,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Permission.fromJson(json);
-        checkPermission(obj);
+        var obj = api.Permission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPermission(obj as api.Permission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6802,7 +6830,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
 
@@ -6819,8 +6847,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Permission.fromJson(json);
-        checkPermission(obj);
+        var obj = api.Permission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPermission(obj as api.Permission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6890,7 +6919,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
   });
@@ -7024,7 +7053,7 @@
           .get(arg_fileId, arg_propertyKey,
               visibility: arg_visibility, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProperty(response);
+        checkProperty(response as api.Property);
       })));
     });
 
@@ -7035,8 +7064,9 @@
       var arg_fileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Property.fromJson(json);
-        checkProperty(obj);
+        var obj =
+            api.Property.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProperty(obj as api.Property);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7087,7 +7117,7 @@
       res
           .insert(arg_request, arg_fileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProperty(response);
+        checkProperty(response as api.Property);
       })));
     });
 
@@ -7146,7 +7176,7 @@
       res
           .list(arg_fileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPropertyList(response);
+        checkPropertyList(response as api.PropertyList);
       })));
     });
 
@@ -7159,8 +7189,9 @@
       var arg_visibility = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Property.fromJson(json);
-        checkProperty(obj);
+        var obj =
+            api.Property.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProperty(obj as api.Property);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7217,7 +7248,7 @@
           .patch(arg_request, arg_fileId, arg_propertyKey,
               visibility: arg_visibility, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProperty(response);
+        checkProperty(response as api.Property);
       })));
     });
 
@@ -7230,8 +7261,9 @@
       var arg_visibility = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Property.fromJson(json);
-        checkProperty(obj);
+        var obj =
+            api.Property.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProperty(obj as api.Property);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7288,7 +7320,7 @@
           .update(arg_request, arg_fileId, arg_propertyKey,
               visibility: arg_visibility, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProperty(response);
+        checkProperty(response as api.Property);
       })));
     });
   });
@@ -7438,7 +7470,7 @@
           .get(arg_fileId, arg_commentId, arg_replyId,
               includeDeleted: arg_includeDeleted, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentReply(response);
+        checkCommentReply(response as api.CommentReply);
       })));
     });
 
@@ -7450,8 +7482,9 @@
       var arg_commentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommentReply.fromJson(json);
-        checkCommentReply(obj);
+        var obj = api.CommentReply.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommentReply(obj as api.CommentReply);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7511,7 +7544,7 @@
       res
           .insert(arg_request, arg_fileId, arg_commentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentReply(response);
+        checkCommentReply(response as api.CommentReply);
       })));
     });
 
@@ -7593,7 +7626,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentReplyList(response);
+        checkCommentReplyList(response as api.CommentReplyList);
       })));
     });
 
@@ -7606,8 +7639,9 @@
       var arg_replyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommentReply.fromJson(json);
-        checkCommentReply(obj);
+        var obj = api.CommentReply.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommentReply(obj as api.CommentReply);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7671,7 +7705,7 @@
           .patch(arg_request, arg_fileId, arg_commentId, arg_replyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentReply(response);
+        checkCommentReply(response as api.CommentReply);
       })));
     });
 
@@ -7684,8 +7718,9 @@
       var arg_replyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommentReply.fromJson(json);
-        checkCommentReply(obj);
+        var obj = api.CommentReply.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommentReply(obj as api.CommentReply);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7749,7 +7784,7 @@
           .update(arg_request, arg_fileId, arg_commentId, arg_replyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentReply(response);
+        checkCommentReply(response as api.CommentReply);
       })));
     });
   });
@@ -7875,7 +7910,7 @@
       res
           .get(arg_fileId, arg_revisionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevision(response);
+        checkRevision(response as api.Revision);
       })));
     });
 
@@ -7943,7 +7978,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevisionList(response);
+        checkRevisionList(response as api.RevisionList);
       })));
     });
 
@@ -7955,8 +7990,9 @@
       var arg_revisionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Revision.fromJson(json);
-        checkRevision(obj);
+        var obj =
+            api.Revision.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRevision(obj as api.Revision);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8010,7 +8046,7 @@
       res
           .patch(arg_request, arg_fileId, arg_revisionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevision(response);
+        checkRevision(response as api.Revision);
       })));
     });
 
@@ -8022,8 +8058,9 @@
       var arg_revisionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Revision.fromJson(json);
-        checkRevision(obj);
+        var obj =
+            api.Revision.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRevision(obj as api.Revision);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8077,7 +8114,7 @@
       res
           .update(arg_request, arg_fileId, arg_revisionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevision(response);
+        checkRevision(response as api.Revision);
       })));
     });
   });
@@ -8188,7 +8225,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDrive(response);
+        checkTeamDrive(response as api.TeamDrive);
       })));
     });
 
@@ -8199,8 +8236,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TeamDrive.fromJson(json);
-        checkTeamDrive(obj);
+        var obj =
+            api.TeamDrive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTeamDrive(obj as api.TeamDrive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8244,7 +8282,7 @@
       res
           .insert(arg_request, arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDrive(response);
+        checkTeamDrive(response as api.TeamDrive);
       })));
     });
 
@@ -8309,7 +8347,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDriveList(response);
+        checkTeamDriveList(response as api.TeamDriveList);
       })));
     });
 
@@ -8321,8 +8359,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TeamDrive.fromJson(json);
-        checkTeamDrive(obj);
+        var obj =
+            api.TeamDrive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTeamDrive(obj as api.TeamDrive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8371,7 +8410,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDrive(response);
+        checkTeamDrive(response as api.TeamDrive);
       })));
     });
   });
diff --git a/generated/googleapis/test/drive/v3_test.dart b/generated/googleapis/test/drive/v3_test.dart
index 6f67777..84f3966 100644
--- a/generated/googleapis/test/drive/v3_test.dart
+++ b/generated/googleapis/test/drive/v3_test.dart
@@ -106,8 +106,8 @@
 
 void checkUnnamed2638(core.List<api.AboutDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutDriveThemes(o[0]);
-  checkAboutDriveThemes(o[1]);
+  checkAboutDriveThemes(o[0] as api.AboutDriveThemes);
+  checkAboutDriveThemes(o[1] as api.AboutDriveThemes);
 }
 
 core.List<core.String> buildUnnamed2639() {
@@ -245,8 +245,8 @@
 
 void checkUnnamed2645(core.List<api.AboutTeamDriveThemes> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAboutTeamDriveThemes(o[0]);
-  checkAboutTeamDriveThemes(o[1]);
+  checkAboutTeamDriveThemes(o[0] as api.AboutTeamDriveThemes);
+  checkAboutTeamDriveThemes(o[1] as api.AboutTeamDriveThemes);
 }
 
 core.int buildCounterAbout = 0;
@@ -285,9 +285,9 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed2644(o.maxImportSizes);
     unittest.expect(o.maxUploadSize, unittest.equals('foo'));
-    checkAboutStorageQuota(o.storageQuota);
+    checkAboutStorageQuota(o.storageQuota as api.AboutStorageQuota);
     checkUnnamed2645(o.teamDriveThemes);
-    checkUser(o.user);
+    checkUser(o.user as api.User);
   }
   buildCounterAbout--;
 }
@@ -317,13 +317,13 @@
   buildCounterChange++;
   if (buildCounterChange < 3) {
     unittest.expect(o.changeType, unittest.equals('foo'));
-    checkDrive(o.drive);
+    checkDrive(o.drive as api.Drive);
     unittest.expect(o.driveId, unittest.equals('foo'));
-    checkFile(o.file);
+    checkFile(o.file as api.File);
     unittest.expect(o.fileId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.removed, unittest.isTrue);
-    checkTeamDrive(o.teamDrive);
+    checkTeamDrive(o.teamDrive as api.TeamDrive);
     unittest.expect(o.teamDriveId, unittest.equals('foo'));
     unittest.expect(
         o.time, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -341,8 +341,8 @@
 
 void checkUnnamed2646(core.List<api.Change> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChange(o[0]);
-  checkChange(o[1]);
+  checkChange(o[0] as api.Change);
+  checkChange(o[1] as api.Change);
 }
 
 core.int buildCounterChangeList = 0;
@@ -450,8 +450,8 @@
 
 void checkUnnamed2648(core.List<api.Reply> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReply(o[0]);
-  checkReply(o[1]);
+  checkReply(o[0] as api.Reply);
+  checkReply(o[1] as api.Reply);
 }
 
 core.int buildCounterComment = 0;
@@ -480,7 +480,7 @@
   buildCounterComment++;
   if (buildCounterComment < 3) {
     unittest.expect(o.anchor, unittest.equals('foo'));
-    checkUser(o.author);
+    checkUser(o.author as api.User);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.createdTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -490,7 +490,8 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.modifiedTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkCommentQuotedFileContent(o.quotedFileContent);
+    checkCommentQuotedFileContent(
+        o.quotedFileContent as api.CommentQuotedFileContent);
     checkUnnamed2648(o.replies);
     unittest.expect(o.resolved, unittest.isTrue);
   }
@@ -506,8 +507,8 @@
 
 void checkUnnamed2649(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComment(o[0]);
-  checkComment(o[1]);
+  checkComment(o[0] as api.Comment);
+  checkComment(o[1] as api.Comment);
 }
 
 core.int buildCounterCommentList = 0;
@@ -553,7 +554,7 @@
   if (buildCounterContentRestriction < 3) {
     unittest.expect(o.readOnly, unittest.isTrue);
     unittest.expect(o.reason, unittest.equals('foo'));
-    checkUser(o.restrictingUser);
+    checkUser(o.restrictingUser as api.User);
     unittest.expect(o.restrictionTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -689,9 +690,10 @@
 void checkDrive(api.Drive o) {
   buildCounterDrive++;
   if (buildCounterDrive < 3) {
-    checkDriveBackgroundImageFile(o.backgroundImageFile);
+    checkDriveBackgroundImageFile(
+        o.backgroundImageFile as api.DriveBackgroundImageFile);
     unittest.expect(o.backgroundImageLink, unittest.equals('foo'));
-    checkDriveCapabilities(o.capabilities);
+    checkDriveCapabilities(o.capabilities as api.DriveCapabilities);
     unittest.expect(o.colorRgb, unittest.equals('foo'));
     unittest.expect(o.createdTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -699,7 +701,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkDriveRestrictions(o.restrictions);
+    checkDriveRestrictions(o.restrictions as api.DriveRestrictions);
     unittest.expect(o.themeId, unittest.equals('foo'));
   }
   buildCounterDrive--;
@@ -714,8 +716,8 @@
 
 void checkUnnamed2650(core.List<api.Drive> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDrive(o[0]);
-  checkDrive(o[1]);
+  checkDrive(o[0] as api.Drive);
+  checkDrive(o[1] as api.Drive);
 }
 
 core.int buildCounterDriveList = 0;
@@ -876,7 +878,8 @@
   buildCounterFileContentHints++;
   if (buildCounterFileContentHints < 3) {
     unittest.expect(o.indexableText, unittest.equals('foo'));
-    checkFileContentHintsThumbnail(o.thumbnail);
+    checkFileContentHintsThumbnail(
+        o.thumbnail as api.FileContentHintsThumbnail);
   }
   buildCounterFileContentHints--;
 }
@@ -890,8 +893,8 @@
 
 void checkUnnamed2652(core.List<api.ContentRestriction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContentRestriction(o[0]);
-  checkContentRestriction(o[1]);
+  checkContentRestriction(o[0] as api.ContentRestriction);
+  checkContentRestriction(o[1] as api.ContentRestriction);
 }
 
 core.Map<core.String, core.String> buildUnnamed2653() {
@@ -976,7 +979,8 @@
     unittest.expect(o.height, unittest.equals(42));
     unittest.expect(o.isoSpeed, unittest.equals(42));
     unittest.expect(o.lens, unittest.equals('foo'));
-    checkFileImageMediaMetadataLocation(o.location);
+    checkFileImageMediaMetadataLocation(
+        o.location as api.FileImageMediaMetadataLocation);
     unittest.expect(o.maxApertureValue, unittest.equals(42.0));
     unittest.expect(o.meteringMode, unittest.equals('foo'));
     unittest.expect(o.rotation, unittest.equals(42));
@@ -998,8 +1002,8 @@
 
 void checkUnnamed2654(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUser(o[0]);
-  checkUser(o[1]);
+  checkUser(o[0] as api.User);
+  checkUser(o[1] as api.User);
 }
 
 core.List<core.String> buildUnnamed2655() {
@@ -1037,8 +1041,8 @@
 
 void checkUnnamed2657(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermission(o[0]);
-  checkPermission(o[1]);
+  checkPermission(o[0] as api.Permission);
+  checkPermission(o[1] as api.Permission);
 }
 
 core.Map<core.String, core.String> buildUnnamed2658() {
@@ -1182,8 +1186,8 @@
   buildCounterFile++;
   if (buildCounterFile < 3) {
     checkUnnamed2651(o.appProperties);
-    checkFileCapabilities(o.capabilities);
-    checkFileContentHints(o.contentHints);
+    checkFileCapabilities(o.capabilities as api.FileCapabilities);
+    checkFileContentHints(o.contentHints as api.FileContentHints);
     checkUnnamed2652(o.contentRestrictions);
     unittest.expect(o.copyRequiresWriterPermission, unittest.isTrue);
     unittest.expect(o.createdTime,
@@ -1200,10 +1204,11 @@
     unittest.expect(o.headRevisionId, unittest.equals('foo'));
     unittest.expect(o.iconLink, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkFileImageMediaMetadata(o.imageMediaMetadata);
+    checkFileImageMediaMetadata(
+        o.imageMediaMetadata as api.FileImageMediaMetadata);
     unittest.expect(o.isAppAuthorized, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUser(o.lastModifyingUser);
+    checkUser(o.lastModifyingUser as api.User);
     unittest.expect(o.md5Checksum, unittest.equals('foo'));
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.modifiedByMe, unittest.isTrue);
@@ -1223,8 +1228,8 @@
     unittest.expect(o.shared, unittest.isTrue);
     unittest.expect(o.sharedWithMeTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUser(o.sharingUser);
-    checkFileShortcutDetails(o.shortcutDetails);
+    checkUser(o.sharingUser as api.User);
+    checkFileShortcutDetails(o.shortcutDetails as api.FileShortcutDetails);
     unittest.expect(o.size, unittest.equals('foo'));
     checkUnnamed2659(o.spaces);
     unittest.expect(o.starred, unittest.isTrue);
@@ -1234,9 +1239,10 @@
     unittest.expect(o.trashed, unittest.isTrue);
     unittest.expect(o.trashedTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkUser(o.trashingUser);
+    checkUser(o.trashingUser as api.User);
     unittest.expect(o.version, unittest.equals('foo'));
-    checkFileVideoMediaMetadata(o.videoMediaMetadata);
+    checkFileVideoMediaMetadata(
+        o.videoMediaMetadata as api.FileVideoMediaMetadata);
     unittest.expect(o.viewedByMe, unittest.isTrue);
     unittest.expect(o.viewedByMeTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1257,8 +1263,8 @@
 
 void checkUnnamed2660(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFile(o[0]);
-  checkFile(o[1]);
+  checkFile(o[0] as api.File);
+  checkFile(o[1] as api.File);
 }
 
 core.int buildCounterFileList = 0;
@@ -1356,8 +1362,8 @@
 
 void checkUnnamed2662(core.List<api.PermissionPermissionDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermissionPermissionDetails(o[0]);
-  checkPermissionPermissionDetails(o[1]);
+  checkPermissionPermissionDetails(o[0] as api.PermissionPermissionDetails);
+  checkPermissionPermissionDetails(o[1] as api.PermissionPermissionDetails);
 }
 
 core.int buildCounterPermissionTeamDrivePermissionDetails = 0;
@@ -1396,8 +1402,10 @@
 
 void checkUnnamed2663(core.List<api.PermissionTeamDrivePermissionDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermissionTeamDrivePermissionDetails(o[0]);
-  checkPermissionTeamDrivePermissionDetails(o[1]);
+  checkPermissionTeamDrivePermissionDetails(
+      o[0] as api.PermissionTeamDrivePermissionDetails);
+  checkPermissionTeamDrivePermissionDetails(
+      o[1] as api.PermissionTeamDrivePermissionDetails);
 }
 
 core.int buildCounterPermission = 0;
@@ -1455,8 +1463,8 @@
 
 void checkUnnamed2664(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermission(o[0]);
-  checkPermission(o[1]);
+  checkPermission(o[0] as api.Permission);
+  checkPermission(o[1] as api.Permission);
 }
 
 core.int buildCounterPermissionList = 0;
@@ -1505,7 +1513,7 @@
   buildCounterReply++;
   if (buildCounterReply < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
-    checkUser(o.author);
+    checkUser(o.author as api.User);
     unittest.expect(o.content, unittest.equals('foo'));
     unittest.expect(o.createdTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
@@ -1528,8 +1536,8 @@
 
 void checkUnnamed2665(core.List<api.Reply> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReply(o[0]);
-  checkReply(o[1]);
+  checkReply(o[0] as api.Reply);
+  checkReply(o[1] as api.Reply);
 }
 
 core.int buildCounterReplyList = 0;
@@ -1599,7 +1607,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.keepForever, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkUser(o.lastModifyingUser);
+    checkUser(o.lastModifyingUser as api.User);
     unittest.expect(o.md5Checksum, unittest.equals('foo'));
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.modifiedTime,
@@ -1623,8 +1631,8 @@
 
 void checkUnnamed2667(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRevision(o[0]);
-  checkRevision(o[1]);
+  checkRevision(o[0] as api.Revision);
+  checkRevision(o[1] as api.Revision);
 }
 
 core.int buildCounterRevisionList = 0;
@@ -1800,16 +1808,17 @@
 void checkTeamDrive(api.TeamDrive o) {
   buildCounterTeamDrive++;
   if (buildCounterTeamDrive < 3) {
-    checkTeamDriveBackgroundImageFile(o.backgroundImageFile);
+    checkTeamDriveBackgroundImageFile(
+        o.backgroundImageFile as api.TeamDriveBackgroundImageFile);
     unittest.expect(o.backgroundImageLink, unittest.equals('foo'));
-    checkTeamDriveCapabilities(o.capabilities);
+    checkTeamDriveCapabilities(o.capabilities as api.TeamDriveCapabilities);
     unittest.expect(o.colorRgb, unittest.equals('foo'));
     unittest.expect(o.createdTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkTeamDriveRestrictions(o.restrictions);
+    checkTeamDriveRestrictions(o.restrictions as api.TeamDriveRestrictions);
     unittest.expect(o.themeId, unittest.equals('foo'));
   }
   buildCounterTeamDrive--;
@@ -1824,8 +1833,8 @@
 
 void checkUnnamed2668(core.List<api.TeamDrive> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTeamDrive(o[0]);
-  checkTeamDrive(o[1]);
+  checkTeamDrive(o[0] as api.TeamDrive);
+  checkTeamDrive(o[1] as api.TeamDrive);
 }
 
 core.int buildCounterTeamDriveList = 0;
@@ -1885,7 +1894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutDriveThemes();
       var od = api.AboutDriveThemes.fromJson(o.toJson());
-      checkAboutDriveThemes(od);
+      checkAboutDriveThemes(od as api.AboutDriveThemes);
     });
   });
 
@@ -1893,7 +1902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutStorageQuota();
       var od = api.AboutStorageQuota.fromJson(o.toJson());
-      checkAboutStorageQuota(od);
+      checkAboutStorageQuota(od as api.AboutStorageQuota);
     });
   });
 
@@ -1901,7 +1910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAboutTeamDriveThemes();
       var od = api.AboutTeamDriveThemes.fromJson(o.toJson());
-      checkAboutTeamDriveThemes(od);
+      checkAboutTeamDriveThemes(od as api.AboutTeamDriveThemes);
     });
   });
 
@@ -1909,7 +1918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAbout();
       var od = api.About.fromJson(o.toJson());
-      checkAbout(od);
+      checkAbout(od as api.About);
     });
   });
 
@@ -1917,7 +1926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChange();
       var od = api.Change.fromJson(o.toJson());
-      checkChange(od);
+      checkChange(od as api.Change);
     });
   });
 
@@ -1925,7 +1934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChangeList();
       var od = api.ChangeList.fromJson(o.toJson());
-      checkChangeList(od);
+      checkChangeList(od as api.ChangeList);
     });
   });
 
@@ -1933,7 +1942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -1941,7 +1950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentQuotedFileContent();
       var od = api.CommentQuotedFileContent.fromJson(o.toJson());
-      checkCommentQuotedFileContent(od);
+      checkCommentQuotedFileContent(od as api.CommentQuotedFileContent);
     });
   });
 
@@ -1949,7 +1958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComment();
       var od = api.Comment.fromJson(o.toJson());
-      checkComment(od);
+      checkComment(od as api.Comment);
     });
   });
 
@@ -1957,7 +1966,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentList();
       var od = api.CommentList.fromJson(o.toJson());
-      checkCommentList(od);
+      checkCommentList(od as api.CommentList);
     });
   });
 
@@ -1965,7 +1974,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContentRestriction();
       var od = api.ContentRestriction.fromJson(o.toJson());
-      checkContentRestriction(od);
+      checkContentRestriction(od as api.ContentRestriction);
     });
   });
 
@@ -1973,7 +1982,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveBackgroundImageFile();
       var od = api.DriveBackgroundImageFile.fromJson(o.toJson());
-      checkDriveBackgroundImageFile(od);
+      checkDriveBackgroundImageFile(od as api.DriveBackgroundImageFile);
     });
   });
 
@@ -1981,7 +1990,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveCapabilities();
       var od = api.DriveCapabilities.fromJson(o.toJson());
-      checkDriveCapabilities(od);
+      checkDriveCapabilities(od as api.DriveCapabilities);
     });
   });
 
@@ -1989,7 +1998,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveRestrictions();
       var od = api.DriveRestrictions.fromJson(o.toJson());
-      checkDriveRestrictions(od);
+      checkDriveRestrictions(od as api.DriveRestrictions);
     });
   });
 
@@ -1997,7 +2006,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDrive();
       var od = api.Drive.fromJson(o.toJson());
-      checkDrive(od);
+      checkDrive(od as api.Drive);
     });
   });
 
@@ -2005,7 +2014,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveList();
       var od = api.DriveList.fromJson(o.toJson());
-      checkDriveList(od);
+      checkDriveList(od as api.DriveList);
     });
   });
 
@@ -2013,7 +2022,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileCapabilities();
       var od = api.FileCapabilities.fromJson(o.toJson());
-      checkFileCapabilities(od);
+      checkFileCapabilities(od as api.FileCapabilities);
     });
   });
 
@@ -2021,7 +2030,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileContentHintsThumbnail();
       var od = api.FileContentHintsThumbnail.fromJson(o.toJson());
-      checkFileContentHintsThumbnail(od);
+      checkFileContentHintsThumbnail(od as api.FileContentHintsThumbnail);
     });
   });
 
@@ -2029,7 +2038,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileContentHints();
       var od = api.FileContentHints.fromJson(o.toJson());
-      checkFileContentHints(od);
+      checkFileContentHints(od as api.FileContentHints);
     });
   });
 
@@ -2037,7 +2046,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileImageMediaMetadataLocation();
       var od = api.FileImageMediaMetadataLocation.fromJson(o.toJson());
-      checkFileImageMediaMetadataLocation(od);
+      checkFileImageMediaMetadataLocation(
+          od as api.FileImageMediaMetadataLocation);
     });
   });
 
@@ -2045,7 +2055,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileImageMediaMetadata();
       var od = api.FileImageMediaMetadata.fromJson(o.toJson());
-      checkFileImageMediaMetadata(od);
+      checkFileImageMediaMetadata(od as api.FileImageMediaMetadata);
     });
   });
 
@@ -2053,7 +2063,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileShortcutDetails();
       var od = api.FileShortcutDetails.fromJson(o.toJson());
-      checkFileShortcutDetails(od);
+      checkFileShortcutDetails(od as api.FileShortcutDetails);
     });
   });
 
@@ -2061,7 +2071,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileVideoMediaMetadata();
       var od = api.FileVideoMediaMetadata.fromJson(o.toJson());
-      checkFileVideoMediaMetadata(od);
+      checkFileVideoMediaMetadata(od as api.FileVideoMediaMetadata);
     });
   });
 
@@ -2069,7 +2079,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFile();
       var od = api.File.fromJson(o.toJson());
-      checkFile(od);
+      checkFile(od as api.File);
     });
   });
 
@@ -2077,7 +2087,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileList();
       var od = api.FileList.fromJson(o.toJson());
-      checkFileList(od);
+      checkFileList(od as api.FileList);
     });
   });
 
@@ -2085,7 +2095,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeneratedIds();
       var od = api.GeneratedIds.fromJson(o.toJson());
-      checkGeneratedIds(od);
+      checkGeneratedIds(od as api.GeneratedIds);
     });
   });
 
@@ -2093,7 +2103,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionPermissionDetails();
       var od = api.PermissionPermissionDetails.fromJson(o.toJson());
-      checkPermissionPermissionDetails(od);
+      checkPermissionPermissionDetails(od as api.PermissionPermissionDetails);
     });
   });
 
@@ -2101,7 +2111,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionTeamDrivePermissionDetails();
       var od = api.PermissionTeamDrivePermissionDetails.fromJson(o.toJson());
-      checkPermissionTeamDrivePermissionDetails(od);
+      checkPermissionTeamDrivePermissionDetails(
+          od as api.PermissionTeamDrivePermissionDetails);
     });
   });
 
@@ -2109,7 +2120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermission();
       var od = api.Permission.fromJson(o.toJson());
-      checkPermission(od);
+      checkPermission(od as api.Permission);
     });
   });
 
@@ -2117,7 +2128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionList();
       var od = api.PermissionList.fromJson(o.toJson());
-      checkPermissionList(od);
+      checkPermissionList(od as api.PermissionList);
     });
   });
 
@@ -2125,7 +2136,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReply();
       var od = api.Reply.fromJson(o.toJson());
-      checkReply(od);
+      checkReply(od as api.Reply);
     });
   });
 
@@ -2133,7 +2144,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplyList();
       var od = api.ReplyList.fromJson(o.toJson());
-      checkReplyList(od);
+      checkReplyList(od as api.ReplyList);
     });
   });
 
@@ -2141,7 +2152,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevision();
       var od = api.Revision.fromJson(o.toJson());
-      checkRevision(od);
+      checkRevision(od as api.Revision);
     });
   });
 
@@ -2149,7 +2160,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevisionList();
       var od = api.RevisionList.fromJson(o.toJson());
-      checkRevisionList(od);
+      checkRevisionList(od as api.RevisionList);
     });
   });
 
@@ -2157,7 +2168,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartPageToken();
       var od = api.StartPageToken.fromJson(o.toJson());
-      checkStartPageToken(od);
+      checkStartPageToken(od as api.StartPageToken);
     });
   });
 
@@ -2165,7 +2176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveBackgroundImageFile();
       var od = api.TeamDriveBackgroundImageFile.fromJson(o.toJson());
-      checkTeamDriveBackgroundImageFile(od);
+      checkTeamDriveBackgroundImageFile(od as api.TeamDriveBackgroundImageFile);
     });
   });
 
@@ -2173,7 +2184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveCapabilities();
       var od = api.TeamDriveCapabilities.fromJson(o.toJson());
-      checkTeamDriveCapabilities(od);
+      checkTeamDriveCapabilities(od as api.TeamDriveCapabilities);
     });
   });
 
@@ -2181,7 +2192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveRestrictions();
       var od = api.TeamDriveRestrictions.fromJson(o.toJson());
-      checkTeamDriveRestrictions(od);
+      checkTeamDriveRestrictions(od as api.TeamDriveRestrictions);
     });
   });
 
@@ -2189,7 +2200,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDrive();
       var od = api.TeamDrive.fromJson(o.toJson());
-      checkTeamDrive(od);
+      checkTeamDrive(od as api.TeamDrive);
     });
   });
 
@@ -2197,7 +2208,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveList();
       var od = api.TeamDriveList.fromJson(o.toJson());
-      checkTeamDriveList(od);
+      checkTeamDriveList(od as api.TeamDriveList);
     });
   });
 
@@ -2205,7 +2216,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -2253,7 +2264,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.get($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkAbout(response);
+        checkAbout(response as api.About);
       })));
     });
   });
@@ -2321,7 +2332,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStartPageToken(response);
+        checkStartPageToken(response as api.StartPageToken);
       })));
     });
 
@@ -2421,7 +2432,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChangeList(response);
+        checkChangeList(response as api.ChangeList);
       })));
     });
 
@@ -2444,8 +2455,9 @@
       var arg_teamDriveId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2525,7 +2537,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -2537,8 +2549,9 @@
       var arg_request = buildChannel();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2591,8 +2604,9 @@
       var arg_fileId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Comment.fromJson(json);
-        checkComment(obj);
+        var obj =
+            api.Comment.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkComment(obj as api.Comment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2643,7 +2657,7 @@
       res
           .create(arg_request, arg_fileId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -2771,7 +2785,7 @@
           .get(arg_fileId, arg_commentId,
               includeDeleted: arg_includeDeleted, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -2847,7 +2861,7 @@
               startModifiedTime: arg_startModifiedTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentList(response);
+        checkCommentList(response as api.CommentList);
       })));
     });
 
@@ -2859,8 +2873,9 @@
       var arg_commentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Comment.fromJson(json);
-        checkComment(obj);
+        var obj =
+            api.Comment.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkComment(obj as api.Comment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2914,7 +2929,7 @@
       res
           .update(arg_request, arg_fileId, arg_commentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
   });
@@ -2927,8 +2942,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Drive.fromJson(json);
-        checkDrive(obj);
+        var obj =
+            api.Drive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDrive(obj as api.Drive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2972,7 +2988,7 @@
       res
           .create(arg_request, arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -3081,7 +3097,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -3140,7 +3156,7 @@
       res
           .hide(arg_driveId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -3205,7 +3221,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDriveList(response);
+        checkDriveList(response as api.DriveList);
       })));
     });
 
@@ -3264,7 +3280,7 @@
       res
           .unhide(arg_driveId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
 
@@ -3276,8 +3292,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Drive.fromJson(json);
-        checkDrive(obj);
+        var obj =
+            api.Drive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDrive(obj as api.Drive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3326,7 +3343,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDrive(response);
+        checkDrive(response as api.Drive);
       })));
     });
   });
@@ -3346,8 +3363,9 @@
       var arg_supportsTeamDrives = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.File.fromJson(json);
-        checkFile(obj);
+        var obj =
+            api.File.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFile(obj as api.File);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3420,7 +3438,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -3441,8 +3459,9 @@
       var arg_useContentAsIndexableText = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.File.fromJson(json);
-        checkFile(obj);
+        var obj =
+            api.File.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFile(obj as api.File);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3509,7 +3528,7 @@
               useContentAsIndexableText: arg_useContentAsIndexableText,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -3742,7 +3761,7 @@
       res
           .generateIds(count: arg_count, space: arg_space, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGeneratedIds(response);
+        checkGeneratedIds(response as api.GeneratedIds);
       })));
     });
 
@@ -3815,7 +3834,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -3918,7 +3937,7 @@
               teamDriveId: arg_teamDriveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFileList(response);
+        checkFileList(response as api.FileList);
       })));
     });
 
@@ -3941,8 +3960,9 @@
       var arg_useContentAsIndexableText = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.File.fromJson(json);
-        checkFile(obj);
+        var obj =
+            api.File.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFile(obj as api.File);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4015,7 +4035,7 @@
               useContentAsIndexableText: arg_useContentAsIndexableText,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFile(response);
+        checkFile(response as api.File);
       })));
     });
 
@@ -4033,8 +4053,9 @@
       var arg_supportsTeamDrives = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4098,7 +4119,7 @@
               supportsTeamDrives: arg_supportsTeamDrives,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -4119,8 +4140,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Permission.fromJson(json);
-        checkPermission(obj);
+        var obj = api.Permission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPermission(obj as api.Permission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4196,7 +4218,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
 
@@ -4346,7 +4368,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
 
@@ -4430,7 +4452,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermissionList(response);
+        checkPermissionList(response as api.PermissionList);
       })));
     });
 
@@ -4447,8 +4469,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Permission.fromJson(json);
-        checkPermission(obj);
+        var obj = api.Permission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPermission(obj as api.Permission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4518,7 +4541,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPermission(response);
+        checkPermission(response as api.Permission);
       })));
     });
   });
@@ -4532,8 +4555,9 @@
       var arg_commentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Reply.fromJson(json);
-        checkReply(obj);
+        var obj =
+            api.Reply.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkReply(obj as api.Reply);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4593,7 +4617,7 @@
       res
           .create(arg_request, arg_fileId, arg_commentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReply(response);
+        checkReply(response as api.Reply);
       })));
     });
 
@@ -4741,7 +4765,7 @@
           .get(arg_fileId, arg_commentId, arg_replyId,
               includeDeleted: arg_includeDeleted, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReply(response);
+        checkReply(response as api.Reply);
       })));
     });
 
@@ -4823,7 +4847,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReplyList(response);
+        checkReplyList(response as api.ReplyList);
       })));
     });
 
@@ -4836,8 +4860,9 @@
       var arg_replyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Reply.fromJson(json);
-        checkReply(obj);
+        var obj =
+            api.Reply.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkReply(obj as api.Reply);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4901,7 +4926,7 @@
           .update(arg_request, arg_fileId, arg_commentId, arg_replyId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReply(response);
+        checkReply(response as api.Reply);
       })));
     });
   });
@@ -5034,7 +5059,7 @@
           .get(arg_fileId, arg_revisionId,
               acknowledgeAbuse: arg_acknowledgeAbuse, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevision(response);
+        checkRevision(response as api.Revision);
       })));
     });
 
@@ -5102,7 +5127,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevisionList(response);
+        checkRevisionList(response as api.RevisionList);
       })));
     });
 
@@ -5114,8 +5139,9 @@
       var arg_revisionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Revision.fromJson(json);
-        checkRevision(obj);
+        var obj =
+            api.Revision.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRevision(obj as api.Revision);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5169,7 +5195,7 @@
       res
           .update(arg_request, arg_fileId, arg_revisionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevision(response);
+        checkRevision(response as api.Revision);
       })));
     });
   });
@@ -5182,8 +5208,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TeamDrive.fromJson(json);
-        checkTeamDrive(obj);
+        var obj =
+            api.TeamDrive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTeamDrive(obj as api.TeamDrive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5227,7 +5254,7 @@
       res
           .create(arg_request, arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDrive(response);
+        checkTeamDrive(response as api.TeamDrive);
       })));
     });
 
@@ -5336,7 +5363,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDrive(response);
+        checkTeamDrive(response as api.TeamDrive);
       })));
     });
 
@@ -5401,7 +5428,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDriveList(response);
+        checkTeamDriveList(response as api.TeamDriveList);
       })));
     });
 
@@ -5413,8 +5440,9 @@
       var arg_useDomainAdminAccess = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TeamDrive.fromJson(json);
-        checkTeamDrive(obj);
+        var obj =
+            api.TeamDrive.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTeamDrive(obj as api.TeamDrive);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5463,7 +5491,7 @@
               useDomainAdminAccess: arg_useDomainAdminAccess,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTeamDrive(response);
+        checkTeamDrive(response as api.TeamDrive);
       })));
     });
   });
diff --git a/generated/googleapis/test/driveactivity/v2_test.dart b/generated/googleapis/test/driveactivity/v2_test.dart
index 17ef24d..8154028 100644
--- a/generated/googleapis/test/driveactivity/v2_test.dart
+++ b/generated/googleapis/test/driveactivity/v2_test.dart
@@ -92,10 +92,10 @@
 void checkAction(api.Action o) {
   buildCounterAction++;
   if (buildCounterAction < 3) {
-    checkActor(o.actor);
-    checkActionDetail(o.detail);
-    checkTarget(o.target);
-    checkTimeRange(o.timeRange);
+    checkActor(o.actor as api.Actor);
+    checkActionDetail(o.detail as api.ActionDetail);
+    checkTarget(o.target as api.Target);
+    checkTimeRange(o.timeRange as api.TimeRange);
     unittest.expect(o.timestamp, unittest.equals('foo'));
   }
   buildCounterAction--;
@@ -125,17 +125,17 @@
 void checkActionDetail(api.ActionDetail o) {
   buildCounterActionDetail++;
   if (buildCounterActionDetail < 3) {
-    checkComment(o.comment);
-    checkCreate(o.create);
-    checkDelete(o.delete);
-    checkDataLeakPreventionChange(o.dlpChange);
-    checkEdit(o.edit);
-    checkMove(o.move);
-    checkPermissionChange(o.permissionChange);
-    checkApplicationReference(o.reference);
-    checkRename(o.rename);
-    checkRestore(o.restore);
-    checkSettingsChange(o.settingsChange);
+    checkComment(o.comment as api.Comment);
+    checkCreate(o.create as api.Create);
+    checkDelete(o.delete as api.Delete);
+    checkDataLeakPreventionChange(o.dlpChange as api.DataLeakPreventionChange);
+    checkEdit(o.edit as api.Edit);
+    checkMove(o.move as api.Move);
+    checkPermissionChange(o.permissionChange as api.PermissionChange);
+    checkApplicationReference(o.reference as api.ApplicationReference);
+    checkRename(o.rename as api.Rename);
+    checkRestore(o.restore as api.Restore);
+    checkSettingsChange(o.settingsChange as api.SettingsChange);
   }
   buildCounterActionDetail--;
 }
@@ -158,11 +158,11 @@
 void checkActor(api.Actor o) {
   buildCounterActor++;
   if (buildCounterActor < 3) {
-    checkAdministrator(o.administrator);
-    checkAnonymousUser(o.anonymous);
-    checkImpersonation(o.impersonation);
-    checkSystemEvent(o.system);
-    checkUser(o.user);
+    checkAdministrator(o.administrator as api.Administrator);
+    checkAnonymousUser(o.anonymous as api.AnonymousUser);
+    checkImpersonation(o.impersonation as api.Impersonation);
+    checkSystemEvent(o.system as api.SystemEvent);
+    checkUser(o.user as api.User);
   }
   buildCounterActor--;
 }
@@ -246,7 +246,7 @@
 void checkAssignment(api.Assignment o) {
   buildCounterAssignment++;
   if (buildCounterAssignment < 3) {
-    checkUser(o.assignedUser);
+    checkUser(o.assignedUser as api.User);
     unittest.expect(o.subtype, unittest.equals('foo'));
   }
   buildCounterAssignment--;
@@ -261,8 +261,8 @@
 
 void checkUnnamed3869(core.List<api.User> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUser(o[0]);
-  checkUser(o[1]);
+  checkUser(o[0] as api.User);
+  checkUser(o[1] as api.User);
 }
 
 core.int buildCounterComment = 0;
@@ -282,10 +282,10 @@
 void checkComment(api.Comment o) {
   buildCounterComment++;
   if (buildCounterComment < 3) {
-    checkAssignment(o.assignment);
+    checkAssignment(o.assignment as api.Assignment);
     checkUnnamed3869(o.mentionedUsers);
-    checkPost(o.post);
-    checkSuggestion(o.suggestion);
+    checkPost(o.post as api.Post);
+    checkSuggestion(o.suggestion as api.Suggestion);
   }
   buildCounterComment--;
 }
@@ -305,8 +305,8 @@
 void checkConsolidationStrategy(api.ConsolidationStrategy o) {
   buildCounterConsolidationStrategy++;
   if (buildCounterConsolidationStrategy < 3) {
-    checkLegacy(o.legacy);
-    checkNoConsolidation(o.none);
+    checkLegacy(o.legacy as api.Legacy);
+    checkNoConsolidation(o.none as api.NoConsolidation);
   }
   buildCounterConsolidationStrategy--;
 }
@@ -325,7 +325,7 @@
 void checkCopy(api.Copy o) {
   buildCounterCopy++;
   if (buildCounterCopy < 3) {
-    checkTargetReference(o.originalObject);
+    checkTargetReference(o.originalObject as api.TargetReference);
   }
   buildCounterCopy--;
 }
@@ -346,9 +346,9 @@
 void checkCreate(api.Create o) {
   buildCounterCreate++;
   if (buildCounterCreate < 3) {
-    checkCopy(o.copy);
-    checkNew(o.new_);
-    checkUpload(o.upload);
+    checkCopy(o.copy as api.Copy);
+    checkNew(o.new_ as api.New);
+    checkUpload(o.upload as api.Upload);
   }
   buildCounterCreate--;
 }
@@ -444,7 +444,7 @@
   buildCounterDrive++;
   if (buildCounterDrive < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkDriveItem(o.root);
+    checkDriveItem(o.root as api.DriveItem);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterDrive--;
@@ -459,8 +459,8 @@
 
 void checkUnnamed3870(core.List<api.Action> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAction(o[0]);
-  checkAction(o[1]);
+  checkAction(o[0] as api.Action);
+  checkAction(o[1] as api.Action);
 }
 
 core.List<api.Actor> buildUnnamed3871() {
@@ -472,8 +472,8 @@
 
 void checkUnnamed3871(core.List<api.Actor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActor(o[0]);
-  checkActor(o[1]);
+  checkActor(o[0] as api.Actor);
+  checkActor(o[1] as api.Actor);
 }
 
 core.List<api.Target> buildUnnamed3872() {
@@ -485,8 +485,8 @@
 
 void checkUnnamed3872(core.List<api.Target> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTarget(o[0]);
-  checkTarget(o[1]);
+  checkTarget(o[0] as api.Target);
+  checkTarget(o[1] as api.Target);
 }
 
 core.int buildCounterDriveActivity = 0;
@@ -510,9 +510,9 @@
   if (buildCounterDriveActivity < 3) {
     checkUnnamed3870(o.actions);
     checkUnnamed3871(o.actors);
-    checkActionDetail(o.primaryActionDetail);
+    checkActionDetail(o.primaryActionDetail as api.ActionDetail);
     checkUnnamed3872(o.targets);
-    checkTimeRange(o.timeRange);
+    checkTimeRange(o.timeRange as api.TimeRange);
     unittest.expect(o.timestamp, unittest.equals('foo'));
   }
   buildCounterDriveActivity--;
@@ -573,13 +573,13 @@
 void checkDriveItem(api.DriveItem o) {
   buildCounterDriveItem++;
   if (buildCounterDriveItem < 3) {
-    checkDriveFile(o.driveFile);
-    checkDriveFolder(o.driveFolder);
-    checkFile(o.file);
-    checkFolder(o.folder);
+    checkDriveFile(o.driveFile as api.DriveFile);
+    checkDriveFolder(o.driveFolder as api.DriveFolder);
+    checkFile(o.file as api.File);
+    checkFolder(o.folder as api.Folder);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOwner(o.owner);
+    checkOwner(o.owner as api.Owner);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterDriveItem--;
@@ -604,10 +604,10 @@
 void checkDriveItemReference(api.DriveItemReference o) {
   buildCounterDriveItemReference++;
   if (buildCounterDriveItemReference < 3) {
-    checkDriveFile(o.driveFile);
-    checkDriveFolder(o.driveFolder);
-    checkFile(o.file);
-    checkFolder(o.folder);
+    checkDriveFile(o.driveFile as api.DriveFile);
+    checkDriveFolder(o.driveFolder as api.DriveFolder);
+    checkFile(o.file as api.File);
+    checkFolder(o.folder as api.Folder);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -685,7 +685,7 @@
     unittest.expect(o.legacyCommentId, unittest.equals('foo'));
     unittest.expect(o.legacyDiscussionId, unittest.equals('foo'));
     unittest.expect(o.linkToDiscussion, unittest.equals('foo'));
-    checkDriveItem(o.parent);
+    checkDriveItem(o.parent as api.DriveItem);
   }
   buildCounterFileComment--;
 }
@@ -744,7 +744,7 @@
 void checkImpersonation(api.Impersonation o) {
   buildCounterImpersonation++;
   if (buildCounterImpersonation < 3) {
-    checkUser(o.impersonatedUser);
+    checkUser(o.impersonatedUser as api.User);
   }
   buildCounterImpersonation--;
 }
@@ -794,8 +794,8 @@
 
 void checkUnnamed3873(core.List<api.TargetReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetReference(o[0]);
-  checkTargetReference(o[1]);
+  checkTargetReference(o[0] as api.TargetReference);
+  checkTargetReference(o[1] as api.TargetReference);
 }
 
 core.List<api.TargetReference> buildUnnamed3874() {
@@ -807,8 +807,8 @@
 
 void checkUnnamed3874(core.List<api.TargetReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTargetReference(o[0]);
-  checkTargetReference(o[1]);
+  checkTargetReference(o[0] as api.TargetReference);
+  checkTargetReference(o[1] as api.TargetReference);
 }
 
 core.int buildCounterMove = 0;
@@ -879,10 +879,10 @@
 void checkOwner(api.Owner o) {
   buildCounterOwner++;
   if (buildCounterOwner < 3) {
-    checkDomain(o.domain);
-    checkDriveReference(o.drive);
-    checkTeamDriveReference(o.teamDrive);
-    checkUser(o.user);
+    checkDomain(o.domain as api.Domain);
+    checkDriveReference(o.drive as api.DriveReference);
+    checkTeamDriveReference(o.teamDrive as api.TeamDriveReference);
+    checkUser(o.user as api.User);
   }
   buildCounterOwner--;
 }
@@ -907,11 +907,11 @@
   buildCounterPermission++;
   if (buildCounterPermission < 3) {
     unittest.expect(o.allowDiscovery, unittest.isTrue);
-    checkAnyone(o.anyone);
-    checkDomain(o.domain);
-    checkGroup(o.group);
+    checkAnyone(o.anyone as api.Anyone);
+    checkDomain(o.domain as api.Domain);
+    checkGroup(o.group as api.Group);
     unittest.expect(o.role, unittest.equals('foo'));
-    checkUser(o.user);
+    checkUser(o.user as api.User);
   }
   buildCounterPermission--;
 }
@@ -925,8 +925,8 @@
 
 void checkUnnamed3875(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermission(o[0]);
-  checkPermission(o[1]);
+  checkPermission(o[0] as api.Permission);
+  checkPermission(o[1] as api.Permission);
 }
 
 core.List<api.Permission> buildUnnamed3876() {
@@ -938,8 +938,8 @@
 
 void checkUnnamed3876(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermission(o[0]);
-  checkPermission(o[1]);
+  checkPermission(o[0] as api.Permission);
+  checkPermission(o[1] as api.Permission);
 }
 
 core.int buildCounterPermissionChange = 0;
@@ -1002,7 +1002,8 @@
   buildCounterQueryDriveActivityRequest++;
   if (buildCounterQueryDriveActivityRequest < 3) {
     unittest.expect(o.ancestorName, unittest.equals('foo'));
-    checkConsolidationStrategy(o.consolidationStrategy);
+    checkConsolidationStrategy(
+        o.consolidationStrategy as api.ConsolidationStrategy);
     unittest.expect(o.filter, unittest.equals('foo'));
     unittest.expect(o.itemName, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
@@ -1020,8 +1021,8 @@
 
 void checkUnnamed3877(core.List<api.DriveActivity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDriveActivity(o[0]);
-  checkDriveActivity(o[1]);
+  checkDriveActivity(o[0] as api.DriveActivity);
+  checkDriveActivity(o[1] as api.DriveActivity);
 }
 
 core.int buildCounterQueryDriveActivityResponse = 0;
@@ -1115,8 +1116,8 @@
 
 void checkUnnamed3878(core.List<api.RestrictionChange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRestrictionChange(o[0]);
-  checkRestrictionChange(o[1]);
+  checkRestrictionChange(o[0] as api.RestrictionChange);
+  checkRestrictionChange(o[1] as api.RestrictionChange);
 }
 
 core.int buildCounterSettingsChange = 0;
@@ -1193,10 +1194,10 @@
 void checkTarget(api.Target o) {
   buildCounterTarget++;
   if (buildCounterTarget < 3) {
-    checkDrive(o.drive);
-    checkDriveItem(o.driveItem);
-    checkFileComment(o.fileComment);
-    checkTeamDrive(o.teamDrive);
+    checkDrive(o.drive as api.Drive);
+    checkDriveItem(o.driveItem as api.DriveItem);
+    checkFileComment(o.fileComment as api.FileComment);
+    checkTeamDrive(o.teamDrive as api.TeamDrive);
   }
   buildCounterTarget--;
 }
@@ -1217,9 +1218,9 @@
 void checkTargetReference(api.TargetReference o) {
   buildCounterTargetReference++;
   if (buildCounterTargetReference < 3) {
-    checkDriveReference(o.drive);
-    checkDriveItemReference(o.driveItem);
-    checkTeamDriveReference(o.teamDrive);
+    checkDriveReference(o.drive as api.DriveReference);
+    checkDriveItemReference(o.driveItem as api.DriveItemReference);
+    checkTeamDriveReference(o.teamDrive as api.TeamDriveReference);
   }
   buildCounterTargetReference--;
 }
@@ -1241,7 +1242,7 @@
   buildCounterTeamDrive++;
   if (buildCounterTeamDrive < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkDriveItem(o.root);
+    checkDriveItem(o.root as api.DriveItem);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterTeamDrive--;
@@ -1335,9 +1336,9 @@
 void checkUser(api.User o) {
   buildCounterUser++;
   if (buildCounterUser < 3) {
-    checkDeletedUser(o.deletedUser);
-    checkKnownUser(o.knownUser);
-    checkUnknownUser(o.unknownUser);
+    checkDeletedUser(o.deletedUser as api.DeletedUser);
+    checkKnownUser(o.knownUser as api.KnownUser);
+    checkUnknownUser(o.unknownUser as api.UnknownUser);
   }
   buildCounterUser--;
 }
@@ -1347,7 +1348,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAction();
       var od = api.Action.fromJson(o.toJson());
-      checkAction(od);
+      checkAction(od as api.Action);
     });
   });
 
@@ -1355,7 +1356,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActionDetail();
       var od = api.ActionDetail.fromJson(o.toJson());
-      checkActionDetail(od);
+      checkActionDetail(od as api.ActionDetail);
     });
   });
 
@@ -1363,7 +1364,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActor();
       var od = api.Actor.fromJson(o.toJson());
-      checkActor(od);
+      checkActor(od as api.Actor);
     });
   });
 
@@ -1371,7 +1372,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdministrator();
       var od = api.Administrator.fromJson(o.toJson());
-      checkAdministrator(od);
+      checkAdministrator(od as api.Administrator);
     });
   });
 
@@ -1379,7 +1380,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnonymousUser();
       var od = api.AnonymousUser.fromJson(o.toJson());
-      checkAnonymousUser(od);
+      checkAnonymousUser(od as api.AnonymousUser);
     });
   });
 
@@ -1387,7 +1388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnyone();
       var od = api.Anyone.fromJson(o.toJson());
-      checkAnyone(od);
+      checkAnyone(od as api.Anyone);
     });
   });
 
@@ -1395,7 +1396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationReference();
       var od = api.ApplicationReference.fromJson(o.toJson());
-      checkApplicationReference(od);
+      checkApplicationReference(od as api.ApplicationReference);
     });
   });
 
@@ -1403,7 +1404,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssignment();
       var od = api.Assignment.fromJson(o.toJson());
-      checkAssignment(od);
+      checkAssignment(od as api.Assignment);
     });
   });
 
@@ -1411,7 +1412,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComment();
       var od = api.Comment.fromJson(o.toJson());
-      checkComment(od);
+      checkComment(od as api.Comment);
     });
   });
 
@@ -1419,7 +1420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConsolidationStrategy();
       var od = api.ConsolidationStrategy.fromJson(o.toJson());
-      checkConsolidationStrategy(od);
+      checkConsolidationStrategy(od as api.ConsolidationStrategy);
     });
   });
 
@@ -1427,7 +1428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCopy();
       var od = api.Copy.fromJson(o.toJson());
-      checkCopy(od);
+      checkCopy(od as api.Copy);
     });
   });
 
@@ -1435,7 +1436,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreate();
       var od = api.Create.fromJson(o.toJson());
-      checkCreate(od);
+      checkCreate(od as api.Create);
     });
   });
 
@@ -1443,7 +1444,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataLeakPreventionChange();
       var od = api.DataLeakPreventionChange.fromJson(o.toJson());
-      checkDataLeakPreventionChange(od);
+      checkDataLeakPreventionChange(od as api.DataLeakPreventionChange);
     });
   });
 
@@ -1451,7 +1452,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDelete();
       var od = api.Delete.fromJson(o.toJson());
-      checkDelete(od);
+      checkDelete(od as api.Delete);
     });
   });
 
@@ -1459,7 +1460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeletedUser();
       var od = api.DeletedUser.fromJson(o.toJson());
-      checkDeletedUser(od);
+      checkDeletedUser(od as api.DeletedUser);
     });
   });
 
@@ -1467,7 +1468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomain();
       var od = api.Domain.fromJson(o.toJson());
-      checkDomain(od);
+      checkDomain(od as api.Domain);
     });
   });
 
@@ -1475,7 +1476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDrive();
       var od = api.Drive.fromJson(o.toJson());
-      checkDrive(od);
+      checkDrive(od as api.Drive);
     });
   });
 
@@ -1483,7 +1484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveActivity();
       var od = api.DriveActivity.fromJson(o.toJson());
-      checkDriveActivity(od);
+      checkDriveActivity(od as api.DriveActivity);
     });
   });
 
@@ -1491,7 +1492,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveFile();
       var od = api.DriveFile.fromJson(o.toJson());
-      checkDriveFile(od);
+      checkDriveFile(od as api.DriveFile);
     });
   });
 
@@ -1499,7 +1500,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveFolder();
       var od = api.DriveFolder.fromJson(o.toJson());
-      checkDriveFolder(od);
+      checkDriveFolder(od as api.DriveFolder);
     });
   });
 
@@ -1507,7 +1508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveItem();
       var od = api.DriveItem.fromJson(o.toJson());
-      checkDriveItem(od);
+      checkDriveItem(od as api.DriveItem);
     });
   });
 
@@ -1515,7 +1516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveItemReference();
       var od = api.DriveItemReference.fromJson(o.toJson());
-      checkDriveItemReference(od);
+      checkDriveItemReference(od as api.DriveItemReference);
     });
   });
 
@@ -1523,7 +1524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveReference();
       var od = api.DriveReference.fromJson(o.toJson());
-      checkDriveReference(od);
+      checkDriveReference(od as api.DriveReference);
     });
   });
 
@@ -1531,7 +1532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEdit();
       var od = api.Edit.fromJson(o.toJson());
-      checkEdit(od);
+      checkEdit(od as api.Edit);
     });
   });
 
@@ -1539,7 +1540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFile();
       var od = api.File.fromJson(o.toJson());
-      checkFile(od);
+      checkFile(od as api.File);
     });
   });
 
@@ -1547,7 +1548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileComment();
       var od = api.FileComment.fromJson(o.toJson());
-      checkFileComment(od);
+      checkFileComment(od as api.FileComment);
     });
   });
 
@@ -1555,7 +1556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolder();
       var od = api.Folder.fromJson(o.toJson());
-      checkFolder(od);
+      checkFolder(od as api.Folder);
     });
   });
 
@@ -1563,7 +1564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroup();
       var od = api.Group.fromJson(o.toJson());
-      checkGroup(od);
+      checkGroup(od as api.Group);
     });
   });
 
@@ -1571,7 +1572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImpersonation();
       var od = api.Impersonation.fromJson(o.toJson());
-      checkImpersonation(od);
+      checkImpersonation(od as api.Impersonation);
     });
   });
 
@@ -1579,7 +1580,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKnownUser();
       var od = api.KnownUser.fromJson(o.toJson());
-      checkKnownUser(od);
+      checkKnownUser(od as api.KnownUser);
     });
   });
 
@@ -1587,7 +1588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLegacy();
       var od = api.Legacy.fromJson(o.toJson());
-      checkLegacy(od);
+      checkLegacy(od as api.Legacy);
     });
   });
 
@@ -1595,7 +1596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMove();
       var od = api.Move.fromJson(o.toJson());
-      checkMove(od);
+      checkMove(od as api.Move);
     });
   });
 
@@ -1603,7 +1604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNew();
       var od = api.New.fromJson(o.toJson());
-      checkNew(od);
+      checkNew(od as api.New);
     });
   });
 
@@ -1611,7 +1612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNoConsolidation();
       var od = api.NoConsolidation.fromJson(o.toJson());
-      checkNoConsolidation(od);
+      checkNoConsolidation(od as api.NoConsolidation);
     });
   });
 
@@ -1619,7 +1620,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOwner();
       var od = api.Owner.fromJson(o.toJson());
-      checkOwner(od);
+      checkOwner(od as api.Owner);
     });
   });
 
@@ -1627,7 +1628,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermission();
       var od = api.Permission.fromJson(o.toJson());
-      checkPermission(od);
+      checkPermission(od as api.Permission);
     });
   });
 
@@ -1635,7 +1636,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionChange();
       var od = api.PermissionChange.fromJson(o.toJson());
-      checkPermissionChange(od);
+      checkPermissionChange(od as api.PermissionChange);
     });
   });
 
@@ -1643,7 +1644,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPost();
       var od = api.Post.fromJson(o.toJson());
-      checkPost(od);
+      checkPost(od as api.Post);
     });
   });
 
@@ -1651,7 +1652,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryDriveActivityRequest();
       var od = api.QueryDriveActivityRequest.fromJson(o.toJson());
-      checkQueryDriveActivityRequest(od);
+      checkQueryDriveActivityRequest(od as api.QueryDriveActivityRequest);
     });
   });
 
@@ -1659,7 +1660,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryDriveActivityResponse();
       var od = api.QueryDriveActivityResponse.fromJson(o.toJson());
-      checkQueryDriveActivityResponse(od);
+      checkQueryDriveActivityResponse(od as api.QueryDriveActivityResponse);
     });
   });
 
@@ -1667,7 +1668,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRename();
       var od = api.Rename.fromJson(o.toJson());
-      checkRename(od);
+      checkRename(od as api.Rename);
     });
   });
 
@@ -1675,7 +1676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestore();
       var od = api.Restore.fromJson(o.toJson());
-      checkRestore(od);
+      checkRestore(od as api.Restore);
     });
   });
 
@@ -1683,7 +1684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestrictionChange();
       var od = api.RestrictionChange.fromJson(o.toJson());
-      checkRestrictionChange(od);
+      checkRestrictionChange(od as api.RestrictionChange);
     });
   });
 
@@ -1691,7 +1692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSettingsChange();
       var od = api.SettingsChange.fromJson(o.toJson());
-      checkSettingsChange(od);
+      checkSettingsChange(od as api.SettingsChange);
     });
   });
 
@@ -1699,7 +1700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuggestion();
       var od = api.Suggestion.fromJson(o.toJson());
-      checkSuggestion(od);
+      checkSuggestion(od as api.Suggestion);
     });
   });
 
@@ -1707,7 +1708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemEvent();
       var od = api.SystemEvent.fromJson(o.toJson());
-      checkSystemEvent(od);
+      checkSystemEvent(od as api.SystemEvent);
     });
   });
 
@@ -1715,7 +1716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTarget();
       var od = api.Target.fromJson(o.toJson());
-      checkTarget(od);
+      checkTarget(od as api.Target);
     });
   });
 
@@ -1723,7 +1724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetReference();
       var od = api.TargetReference.fromJson(o.toJson());
-      checkTargetReference(od);
+      checkTargetReference(od as api.TargetReference);
     });
   });
 
@@ -1731,7 +1732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDrive();
       var od = api.TeamDrive.fromJson(o.toJson());
-      checkTeamDrive(od);
+      checkTeamDrive(od as api.TeamDrive);
     });
   });
 
@@ -1739,7 +1740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveReference();
       var od = api.TeamDriveReference.fromJson(o.toJson());
-      checkTeamDriveReference(od);
+      checkTeamDriveReference(od as api.TeamDriveReference);
     });
   });
 
@@ -1747,7 +1748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeRange();
       var od = api.TimeRange.fromJson(o.toJson());
-      checkTimeRange(od);
+      checkTimeRange(od as api.TimeRange);
     });
   });
 
@@ -1755,7 +1756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnknownUser();
       var od = api.UnknownUser.fromJson(o.toJson());
-      checkUnknownUser(od);
+      checkUnknownUser(od as api.UnknownUser);
     });
   });
 
@@ -1763,7 +1764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpload();
       var od = api.Upload.fromJson(o.toJson());
-      checkUpload(od);
+      checkUpload(od as api.Upload);
     });
   });
 
@@ -1771,7 +1772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUser();
       var od = api.User.fromJson(o.toJson());
-      checkUser(od);
+      checkUser(od as api.User);
     });
   });
 
@@ -1782,8 +1783,9 @@
       var arg_request = buildQueryDriveActivityRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.QueryDriveActivityRequest.fromJson(json);
-        checkQueryDriveActivityRequest(obj);
+        var obj = api.QueryDriveActivityRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkQueryDriveActivityRequest(obj as api.QueryDriveActivityRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1822,7 +1824,8 @@
       res
           .query(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryDriveActivityResponse(response);
+        checkQueryDriveActivityResponse(
+            response as api.QueryDriveActivityResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/fcm/v1_test.dart b/generated/googleapis/test/fcm/v1_test.dart
index c7145e5..67dde06 100644
--- a/generated/googleapis/test/fcm/v1_test.dart
+++ b/generated/googleapis/test/fcm/v1_test.dart
@@ -111,8 +111,8 @@
     unittest.expect(o.collapseKey, unittest.equals('foo'));
     checkUnnamed1328(o.data);
     unittest.expect(o.directBootOk, unittest.isTrue);
-    checkAndroidFcmOptions(o.fcmOptions);
-    checkAndroidNotification(o.notification);
+    checkAndroidFcmOptions(o.fcmOptions as api.AndroidFcmOptions);
+    checkAndroidNotification(o.notification as api.AndroidNotification);
     unittest.expect(o.priority, unittest.equals('foo'));
     unittest.expect(o.restrictedPackageName, unittest.equals('foo'));
     unittest.expect(o.ttl, unittest.equals('foo'));
@@ -228,7 +228,7 @@
     unittest.expect(o.eventTime, unittest.equals('foo'));
     unittest.expect(o.icon, unittest.equals('foo'));
     unittest.expect(o.image, unittest.equals('foo'));
-    checkLightSettings(o.lightSettings);
+    checkLightSettings(o.lightSettings as api.LightSettings);
     unittest.expect(o.localOnly, unittest.isTrue);
     unittest.expect(o.notificationCount, unittest.equals(42));
     unittest.expect(o.notificationPriority, unittest.equals('foo'));
@@ -303,7 +303,7 @@
 void checkApnsConfig(api.ApnsConfig o) {
   buildCounterApnsConfig++;
   if (buildCounterApnsConfig < 3) {
-    checkApnsFcmOptions(o.fcmOptions);
+    checkApnsFcmOptions(o.fcmOptions as api.ApnsFcmOptions);
     checkUnnamed1332(o.headers);
     checkUnnamed1333(o.payload);
   }
@@ -391,7 +391,7 @@
 void checkLightSettings(api.LightSettings o) {
   buildCounterLightSettings++;
   if (buildCounterLightSettings < 3) {
-    checkColor(o.color);
+    checkColor(o.color as api.Color);
     unittest.expect(o.lightOffDuration, unittest.equals('foo'));
     unittest.expect(o.lightOnDuration, unittest.equals('foo'));
   }
@@ -434,16 +434,16 @@
 void checkMessage(api.Message o) {
   buildCounterMessage++;
   if (buildCounterMessage < 3) {
-    checkAndroidConfig(o.android);
-    checkApnsConfig(o.apns);
+    checkAndroidConfig(o.android as api.AndroidConfig);
+    checkApnsConfig(o.apns as api.ApnsConfig);
     unittest.expect(o.condition, unittest.equals('foo'));
     checkUnnamed1334(o.data);
-    checkFcmOptions(o.fcmOptions);
+    checkFcmOptions(o.fcmOptions as api.FcmOptions);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNotification(o.notification);
+    checkNotification(o.notification as api.Notification);
     unittest.expect(o.token, unittest.equals('foo'));
     unittest.expect(o.topic, unittest.equals('foo'));
-    checkWebpushConfig(o.webpush);
+    checkWebpushConfig(o.webpush as api.WebpushConfig);
   }
   buildCounterMessage--;
 }
@@ -486,7 +486,7 @@
 void checkSendMessageRequest(api.SendMessageRequest o) {
   buildCounterSendMessageRequest++;
   if (buildCounterSendMessageRequest < 3) {
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
     unittest.expect(o.validateOnly, unittest.isTrue);
   }
   buildCounterSendMessageRequest--;
@@ -565,7 +565,7 @@
   buildCounterWebpushConfig++;
   if (buildCounterWebpushConfig < 3) {
     checkUnnamed1335(o.data);
-    checkWebpushFcmOptions(o.fcmOptions);
+    checkWebpushFcmOptions(o.fcmOptions as api.WebpushFcmOptions);
     checkUnnamed1336(o.headers);
     checkUnnamed1337(o.notification);
   }
@@ -598,7 +598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidConfig();
       var od = api.AndroidConfig.fromJson(o.toJson());
-      checkAndroidConfig(od);
+      checkAndroidConfig(od as api.AndroidConfig);
     });
   });
 
@@ -606,7 +606,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidFcmOptions();
       var od = api.AndroidFcmOptions.fromJson(o.toJson());
-      checkAndroidFcmOptions(od);
+      checkAndroidFcmOptions(od as api.AndroidFcmOptions);
     });
   });
 
@@ -614,7 +614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidNotification();
       var od = api.AndroidNotification.fromJson(o.toJson());
-      checkAndroidNotification(od);
+      checkAndroidNotification(od as api.AndroidNotification);
     });
   });
 
@@ -622,7 +622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApnsConfig();
       var od = api.ApnsConfig.fromJson(o.toJson());
-      checkApnsConfig(od);
+      checkApnsConfig(od as api.ApnsConfig);
     });
   });
 
@@ -630,7 +630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApnsFcmOptions();
       var od = api.ApnsFcmOptions.fromJson(o.toJson());
-      checkApnsFcmOptions(od);
+      checkApnsFcmOptions(od as api.ApnsFcmOptions);
     });
   });
 
@@ -638,7 +638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColor();
       var od = api.Color.fromJson(o.toJson());
-      checkColor(od);
+      checkColor(od as api.Color);
     });
   });
 
@@ -646,7 +646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFcmOptions();
       var od = api.FcmOptions.fromJson(o.toJson());
-      checkFcmOptions(od);
+      checkFcmOptions(od as api.FcmOptions);
     });
   });
 
@@ -654,7 +654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLightSettings();
       var od = api.LightSettings.fromJson(o.toJson());
-      checkLightSettings(od);
+      checkLightSettings(od as api.LightSettings);
     });
   });
 
@@ -662,7 +662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessage();
       var od = api.Message.fromJson(o.toJson());
-      checkMessage(od);
+      checkMessage(od as api.Message);
     });
   });
 
@@ -670,7 +670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotification();
       var od = api.Notification.fromJson(o.toJson());
-      checkNotification(od);
+      checkNotification(od as api.Notification);
     });
   });
 
@@ -678,7 +678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSendMessageRequest();
       var od = api.SendMessageRequest.fromJson(o.toJson());
-      checkSendMessageRequest(od);
+      checkSendMessageRequest(od as api.SendMessageRequest);
     });
   });
 
@@ -686,7 +686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebpushConfig();
       var od = api.WebpushConfig.fromJson(o.toJson());
-      checkWebpushConfig(od);
+      checkWebpushConfig(od as api.WebpushConfig);
     });
   });
 
@@ -694,7 +694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebpushFcmOptions();
       var od = api.WebpushFcmOptions.fromJson(o.toJson());
-      checkWebpushFcmOptions(od);
+      checkWebpushFcmOptions(od as api.WebpushFcmOptions);
     });
   });
 
@@ -706,8 +706,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SendMessageRequest.fromJson(json);
-        checkSendMessageRequest(obj);
+        var obj = api.SendMessageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSendMessageRequest(obj as api.SendMessageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -747,7 +748,7 @@
       res
           .send(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
   });
diff --git a/generated/googleapis/test/file/v1_test.dart b/generated/googleapis/test/file/v1_test.dart
index bef09f7..4f366b8 100644
--- a/generated/googleapis/test/file/v1_test.dart
+++ b/generated/googleapis/test/file/v1_test.dart
@@ -168,10 +168,12 @@
             api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(
-      o['x']);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(
-      o['y']);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(o['x']
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(o['y']
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
 }
 
 core.Map<core.String, core.String> buildUnnamed5619() {
@@ -204,8 +206,12 @@
             api.GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[0]
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[1]
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
 }
 
 core.Map<core.String, core.String> buildUnnamed5621() {
@@ -260,13 +266,15 @@
     checkUnnamed5617(o.maintenancePolicyNames);
     checkUnnamed5618(o.maintenanceSchedules);
     checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(
-        o.maintenanceSettings);
+        o.maintenanceSettings as api
+            .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5619(o.producerMetadata);
     checkUnnamed5620(o.provisionedResources);
     unittest.expect(o.slmInstanceTemplate, unittest.equals('foo'));
     checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(
-        o.sloMetadata);
+        o.sloMetadata
+            as api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata);
     checkUnnamed5621(o.softwareVersions);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.tenantProjectId, unittest.equals('foo'));
@@ -345,8 +353,10 @@
     core.List<api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[0] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[1] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
 }
 
 core.int
@@ -475,8 +485,10 @@
     core.List<api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[0] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[1] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
 }
 
 core.List<api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata>
@@ -493,8 +505,10 @@
             api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[0]
+      as api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[1]
+      as api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
 }
 
 core.int
@@ -520,8 +534,9 @@
   buildCounterGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata++;
   if (buildCounterGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata <
       3) {
-    checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(
-        o.eligibility);
+    checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(o
+            .eligibility
+        as api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility);
     checkUnnamed5623(o.exclusions);
     checkUnnamed5624(o.nodes);
     unittest.expect(o.tier, unittest.equals('foo'));
@@ -538,8 +553,8 @@
 
 void checkUnnamed5625(core.List<api.FileShareConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileShareConfig(o[0]);
-  checkFileShareConfig(o[1]);
+  checkFileShareConfig(o[0] as api.FileShareConfig);
+  checkFileShareConfig(o[1] as api.FileShareConfig);
 }
 
 core.Map<core.String, core.String> buildUnnamed5626() {
@@ -564,8 +579,8 @@
 
 void checkUnnamed5627(core.List<api.NetworkConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkConfig(o[0]);
-  checkNetworkConfig(o[1]);
+  checkNetworkConfig(o[0] as api.NetworkConfig);
+  checkNetworkConfig(o[1] as api.NetworkConfig);
 }
 
 core.int buildCounterInstance = 0;
@@ -614,8 +629,8 @@
 
 void checkUnnamed5628(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.List<core.String> buildUnnamed5629() {
@@ -663,8 +678,8 @@
 
 void checkUnnamed5630(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -697,8 +712,8 @@
 
 void checkUnnamed5631(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -919,7 +934,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5636(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5637(o.response);
@@ -1028,7 +1043,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -1036,7 +1051,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1044,7 +1059,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileShareConfig();
       var od = api.FileShareConfig.fromJson(o.toJson());
-      checkFileShareConfig(od);
+      checkFileShareConfig(od as api.FileShareConfig);
     });
   });
 
@@ -1055,7 +1070,8 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1Instance.fromJson(
               o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1Instance(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1Instance(
+          od as api.GoogleCloudSaasacceleratorManagementProvidersV1Instance);
     });
   });
 
@@ -1068,8 +1084,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(
-          od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
     });
   });
 
@@ -1082,8 +1099,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(
-          od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings);
     });
   });
 
@@ -1096,7 +1114,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
     });
   });
 
@@ -1109,8 +1129,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(
-          od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
     });
   });
 
@@ -1122,7 +1143,8 @@
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility();
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
           .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(od
+          as api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility);
     });
   });
 
@@ -1134,7 +1156,8 @@
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion();
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
           .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(od
+          as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
     });
   });
 
@@ -1145,7 +1168,8 @@
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata();
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata
           .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(
+          od as api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata);
     });
   });
 
@@ -1153,7 +1177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstance();
       var od = api.Instance.fromJson(o.toJson());
-      checkInstance(od);
+      checkInstance(od as api.Instance);
     });
   });
 
@@ -1161,7 +1185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInstancesResponse();
       var od = api.ListInstancesResponse.fromJson(o.toJson());
-      checkListInstancesResponse(od);
+      checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
 
@@ -1169,7 +1193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1177,7 +1201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1185,7 +1209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1193,7 +1217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkConfig();
       var od = api.NetworkConfig.fromJson(o.toJson());
-      checkNetworkConfig(od);
+      checkNetworkConfig(od as api.NetworkConfig);
     });
   });
 
@@ -1201,7 +1225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1209,7 +1233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -1217,7 +1241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1266,7 +1290,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1330,7 +1354,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1344,8 +1368,9 @@
       var arg_instanceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1388,7 +1413,7 @@
           .create(arg_request, arg_parent,
               instanceId: arg_instanceId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1436,7 +1461,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1484,7 +1509,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstance(response);
+        checkInstance(response as api.Instance);
       })));
     });
 
@@ -1548,7 +1573,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInstancesResponse(response);
+        checkListInstancesResponse(response as api.ListInstancesResponse);
       })));
     });
 
@@ -1560,8 +1585,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1604,7 +1630,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -1617,8 +1643,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1658,7 +1685,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1706,7 +1733,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1754,7 +1781,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1814,7 +1841,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
index f791b11..bc490d2 100644
--- a/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
+++ b/generated/googleapis/test/firebasedynamiclinks/v1_test.dart
@@ -89,8 +89,9 @@
 void checkAnalyticsInfo(api.AnalyticsInfo o) {
   buildCounterAnalyticsInfo++;
   if (buildCounterAnalyticsInfo < 3) {
-    checkGooglePlayAnalytics(o.googlePlayAnalytics);
-    checkITunesConnectAnalytics(o.itunesConnectAnalytics);
+    checkGooglePlayAnalytics(o.googlePlayAnalytics as api.GooglePlayAnalytics);
+    checkITunesConnectAnalytics(
+        o.itunesConnectAnalytics as api.ITunesConnectAnalytics);
   }
   buildCounterAnalyticsInfo--;
 }
@@ -138,11 +139,11 @@
 void checkCreateManagedShortLinkRequest(api.CreateManagedShortLinkRequest o) {
   buildCounterCreateManagedShortLinkRequest++;
   if (buildCounterCreateManagedShortLinkRequest < 3) {
-    checkDynamicLinkInfo(o.dynamicLinkInfo);
+    checkDynamicLinkInfo(o.dynamicLinkInfo as api.DynamicLinkInfo);
     unittest.expect(o.longDynamicLink, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sdkVersion, unittest.equals('foo'));
-    checkSuffix(o.suffix);
+    checkSuffix(o.suffix as api.Suffix);
   }
   buildCounterCreateManagedShortLinkRequest--;
 }
@@ -156,8 +157,8 @@
 
 void checkUnnamed2737(core.List<api.DynamicLinkWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDynamicLinkWarning(o[0]);
-  checkDynamicLinkWarning(o[1]);
+  checkDynamicLinkWarning(o[0] as api.DynamicLinkWarning);
+  checkDynamicLinkWarning(o[1] as api.DynamicLinkWarning);
 }
 
 core.int buildCounterCreateManagedShortLinkResponse = 0;
@@ -176,7 +177,7 @@
 void checkCreateManagedShortLinkResponse(api.CreateManagedShortLinkResponse o) {
   buildCounterCreateManagedShortLinkResponse++;
   if (buildCounterCreateManagedShortLinkResponse < 3) {
-    checkManagedShortLink(o.managedShortLink);
+    checkManagedShortLink(o.managedShortLink as api.ManagedShortLink);
     unittest.expect(o.previewLink, unittest.equals('foo'));
     checkUnnamed2737(o.warning);
   }
@@ -200,10 +201,10 @@
 void checkCreateShortDynamicLinkRequest(api.CreateShortDynamicLinkRequest o) {
   buildCounterCreateShortDynamicLinkRequest++;
   if (buildCounterCreateShortDynamicLinkRequest < 3) {
-    checkDynamicLinkInfo(o.dynamicLinkInfo);
+    checkDynamicLinkInfo(o.dynamicLinkInfo as api.DynamicLinkInfo);
     unittest.expect(o.longDynamicLink, unittest.equals('foo'));
     unittest.expect(o.sdkVersion, unittest.equals('foo'));
-    checkSuffix(o.suffix);
+    checkSuffix(o.suffix as api.Suffix);
   }
   buildCounterCreateShortDynamicLinkRequest--;
 }
@@ -217,8 +218,8 @@
 
 void checkUnnamed2738(core.List<api.DynamicLinkWarning> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDynamicLinkWarning(o[0]);
-  checkDynamicLinkWarning(o[1]);
+  checkDynamicLinkWarning(o[0] as api.DynamicLinkWarning);
+  checkDynamicLinkWarning(o[1] as api.DynamicLinkWarning);
 }
 
 core.int buildCounterCreateShortDynamicLinkResponse = 0;
@@ -339,15 +340,15 @@
 void checkDynamicLinkInfo(api.DynamicLinkInfo o) {
   buildCounterDynamicLinkInfo++;
   if (buildCounterDynamicLinkInfo < 3) {
-    checkAnalyticsInfo(o.analyticsInfo);
-    checkAndroidInfo(o.androidInfo);
-    checkDesktopInfo(o.desktopInfo);
+    checkAnalyticsInfo(o.analyticsInfo as api.AnalyticsInfo);
+    checkAndroidInfo(o.androidInfo as api.AndroidInfo);
+    checkDesktopInfo(o.desktopInfo as api.DesktopInfo);
     unittest.expect(o.domainUriPrefix, unittest.equals('foo'));
     unittest.expect(o.dynamicLinkDomain, unittest.equals('foo'));
-    checkIosInfo(o.iosInfo);
+    checkIosInfo(o.iosInfo as api.IosInfo);
     unittest.expect(o.link, unittest.equals('foo'));
-    checkNavigationInfo(o.navigationInfo);
-    checkSocialMetaTagInfo(o.socialMetaTagInfo);
+    checkNavigationInfo(o.navigationInfo as api.NavigationInfo);
+    checkSocialMetaTagInfo(o.socialMetaTagInfo as api.SocialMetaTagInfo);
   }
   buildCounterDynamicLinkInfo--;
 }
@@ -361,8 +362,8 @@
 
 void checkUnnamed2739(core.List<api.DynamicLinkEventStat> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDynamicLinkEventStat(o[0]);
-  checkDynamicLinkEventStat(o[1]);
+  checkDynamicLinkEventStat(o[0] as api.DynamicLinkEventStat);
+  checkDynamicLinkEventStat(o[1] as api.DynamicLinkEventStat);
 }
 
 core.int buildCounterDynamicLinkStats = 0;
@@ -432,7 +433,7 @@
   if (buildCounterGetIosPostInstallAttributionRequest < 3) {
     unittest.expect(o.appInstallationTime, unittest.equals('foo'));
     unittest.expect(o.bundleId, unittest.equals('foo'));
-    checkDeviceInfo(o.device);
+    checkDeviceInfo(o.device as api.DeviceInfo);
     unittest.expect(o.iosVersion, unittest.equals('foo'));
     unittest.expect(o.retrievalMethod, unittest.equals('foo'));
     unittest.expect(o.sdkVersion, unittest.equals('foo'));
@@ -671,7 +672,7 @@
   if (buildCounterManagedShortLink < 3) {
     unittest.expect(o.creationTime, unittest.equals('foo'));
     checkUnnamed2740(o.flaggedAttribute);
-    checkDynamicLinkInfo(o.info);
+    checkDynamicLinkInfo(o.info as api.DynamicLinkInfo);
     unittest.expect(o.link, unittest.equals('foo'));
     unittest.expect(o.linkName, unittest.equals('foo'));
     unittest.expect(o.visibility, unittest.equals('foo'));
@@ -747,7 +748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyticsInfo();
       var od = api.AnalyticsInfo.fromJson(o.toJson());
-      checkAnalyticsInfo(od);
+      checkAnalyticsInfo(od as api.AnalyticsInfo);
     });
   });
 
@@ -755,7 +756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidInfo();
       var od = api.AndroidInfo.fromJson(o.toJson());
-      checkAndroidInfo(od);
+      checkAndroidInfo(od as api.AndroidInfo);
     });
   });
 
@@ -763,7 +764,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateManagedShortLinkRequest();
       var od = api.CreateManagedShortLinkRequest.fromJson(o.toJson());
-      checkCreateManagedShortLinkRequest(od);
+      checkCreateManagedShortLinkRequest(
+          od as api.CreateManagedShortLinkRequest);
     });
   });
 
@@ -771,7 +773,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateManagedShortLinkResponse();
       var od = api.CreateManagedShortLinkResponse.fromJson(o.toJson());
-      checkCreateManagedShortLinkResponse(od);
+      checkCreateManagedShortLinkResponse(
+          od as api.CreateManagedShortLinkResponse);
     });
   });
 
@@ -779,7 +782,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateShortDynamicLinkRequest();
       var od = api.CreateShortDynamicLinkRequest.fromJson(o.toJson());
-      checkCreateShortDynamicLinkRequest(od);
+      checkCreateShortDynamicLinkRequest(
+          od as api.CreateShortDynamicLinkRequest);
     });
   });
 
@@ -787,7 +791,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateShortDynamicLinkResponse();
       var od = api.CreateShortDynamicLinkResponse.fromJson(o.toJson());
-      checkCreateShortDynamicLinkResponse(od);
+      checkCreateShortDynamicLinkResponse(
+          od as api.CreateShortDynamicLinkResponse);
     });
   });
 
@@ -795,7 +800,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDesktopInfo();
       var od = api.DesktopInfo.fromJson(o.toJson());
-      checkDesktopInfo(od);
+      checkDesktopInfo(od as api.DesktopInfo);
     });
   });
 
@@ -803,7 +808,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceInfo();
       var od = api.DeviceInfo.fromJson(o.toJson());
-      checkDeviceInfo(od);
+      checkDeviceInfo(od as api.DeviceInfo);
     });
   });
 
@@ -811,7 +816,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDynamicLinkEventStat();
       var od = api.DynamicLinkEventStat.fromJson(o.toJson());
-      checkDynamicLinkEventStat(od);
+      checkDynamicLinkEventStat(od as api.DynamicLinkEventStat);
     });
   });
 
@@ -819,7 +824,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDynamicLinkInfo();
       var od = api.DynamicLinkInfo.fromJson(o.toJson());
-      checkDynamicLinkInfo(od);
+      checkDynamicLinkInfo(od as api.DynamicLinkInfo);
     });
   });
 
@@ -827,7 +832,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDynamicLinkStats();
       var od = api.DynamicLinkStats.fromJson(o.toJson());
-      checkDynamicLinkStats(od);
+      checkDynamicLinkStats(od as api.DynamicLinkStats);
     });
   });
 
@@ -835,7 +840,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDynamicLinkWarning();
       var od = api.DynamicLinkWarning.fromJson(o.toJson());
-      checkDynamicLinkWarning(od);
+      checkDynamicLinkWarning(od as api.DynamicLinkWarning);
     });
   });
 
@@ -843,7 +848,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIosPostInstallAttributionRequest();
       var od = api.GetIosPostInstallAttributionRequest.fromJson(o.toJson());
-      checkGetIosPostInstallAttributionRequest(od);
+      checkGetIosPostInstallAttributionRequest(
+          od as api.GetIosPostInstallAttributionRequest);
     });
   });
 
@@ -851,7 +857,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIosPostInstallAttributionResponse();
       var od = api.GetIosPostInstallAttributionResponse.fromJson(o.toJson());
-      checkGetIosPostInstallAttributionResponse(od);
+      checkGetIosPostInstallAttributionResponse(
+          od as api.GetIosPostInstallAttributionResponse);
     });
   });
 
@@ -859,7 +866,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIosReopenAttributionRequest();
       var od = api.GetIosReopenAttributionRequest.fromJson(o.toJson());
-      checkGetIosReopenAttributionRequest(od);
+      checkGetIosReopenAttributionRequest(
+          od as api.GetIosReopenAttributionRequest);
     });
   });
 
@@ -867,7 +875,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIosReopenAttributionResponse();
       var od = api.GetIosReopenAttributionResponse.fromJson(o.toJson());
-      checkGetIosReopenAttributionResponse(od);
+      checkGetIosReopenAttributionResponse(
+          od as api.GetIosReopenAttributionResponse);
     });
   });
 
@@ -875,7 +884,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooglePlayAnalytics();
       var od = api.GooglePlayAnalytics.fromJson(o.toJson());
-      checkGooglePlayAnalytics(od);
+      checkGooglePlayAnalytics(od as api.GooglePlayAnalytics);
     });
   });
 
@@ -883,7 +892,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildITunesConnectAnalytics();
       var od = api.ITunesConnectAnalytics.fromJson(o.toJson());
-      checkITunesConnectAnalytics(od);
+      checkITunesConnectAnalytics(od as api.ITunesConnectAnalytics);
     });
   });
 
@@ -891,7 +900,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosInfo();
       var od = api.IosInfo.fromJson(o.toJson());
-      checkIosInfo(od);
+      checkIosInfo(od as api.IosInfo);
     });
   });
 
@@ -899,7 +908,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedShortLink();
       var od = api.ManagedShortLink.fromJson(o.toJson());
-      checkManagedShortLink(od);
+      checkManagedShortLink(od as api.ManagedShortLink);
     });
   });
 
@@ -907,7 +916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNavigationInfo();
       var od = api.NavigationInfo.fromJson(o.toJson());
-      checkNavigationInfo(od);
+      checkNavigationInfo(od as api.NavigationInfo);
     });
   });
 
@@ -915,7 +924,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSocialMetaTagInfo();
       var od = api.SocialMetaTagInfo.fromJson(o.toJson());
-      checkSocialMetaTagInfo(od);
+      checkSocialMetaTagInfo(od as api.SocialMetaTagInfo);
     });
   });
 
@@ -923,7 +932,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuffix();
       var od = api.Suffix.fromJson(o.toJson());
-      checkSuffix(od);
+      checkSuffix(od as api.Suffix);
     });
   });
 
@@ -934,8 +943,10 @@
       var arg_request = buildCreateManagedShortLinkRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateManagedShortLinkRequest.fromJson(json);
-        checkCreateManagedShortLinkRequest(obj);
+        var obj = api.CreateManagedShortLinkRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateManagedShortLinkRequest(
+            obj as api.CreateManagedShortLinkRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -974,7 +985,8 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateManagedShortLinkResponse(response);
+        checkCreateManagedShortLinkResponse(
+            response as api.CreateManagedShortLinkResponse);
       })));
     });
   });
@@ -986,8 +998,10 @@
       var arg_request = buildCreateShortDynamicLinkRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateShortDynamicLinkRequest.fromJson(json);
-        checkCreateShortDynamicLinkRequest(obj);
+        var obj = api.CreateShortDynamicLinkRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateShortDynamicLinkRequest(
+            obj as api.CreateShortDynamicLinkRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1026,7 +1040,8 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateShortDynamicLinkResponse(response);
+        checkCreateShortDynamicLinkResponse(
+            response as api.CreateShortDynamicLinkResponse);
       })));
     });
   });
@@ -1093,7 +1108,7 @@
               sdkVersion: arg_sdkVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDynamicLinkStats(response);
+        checkDynamicLinkStats(response as api.DynamicLinkStats);
       })));
     });
 
@@ -1103,8 +1118,10 @@
       var arg_request = buildGetIosPostInstallAttributionRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIosPostInstallAttributionRequest.fromJson(json);
-        checkGetIosPostInstallAttributionRequest(obj);
+        var obj = api.GetIosPostInstallAttributionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIosPostInstallAttributionRequest(
+            obj as api.GetIosPostInstallAttributionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1144,7 +1161,8 @@
       res
           .installAttribution(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetIosPostInstallAttributionResponse(response);
+        checkGetIosPostInstallAttributionResponse(
+            response as api.GetIosPostInstallAttributionResponse);
       })));
     });
 
@@ -1154,8 +1172,10 @@
       var arg_request = buildGetIosReopenAttributionRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIosReopenAttributionRequest.fromJson(json);
-        checkGetIosReopenAttributionRequest(obj);
+        var obj = api.GetIosReopenAttributionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIosReopenAttributionRequest(
+            obj as api.GetIosReopenAttributionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1194,7 +1214,8 @@
       res
           .reopenAttribution(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetIosReopenAttributionResponse(response);
+        checkGetIosReopenAttributionResponse(
+            response as api.GetIosReopenAttributionResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/firebaserules/v1_test.dart b/generated/googleapis/test/firebaserules/v1_test.dart
index 5ec64c5..93515ac 100644
--- a/generated/googleapis/test/firebaserules/v1_test.dart
+++ b/generated/googleapis/test/firebaserules/v1_test.dart
@@ -93,7 +93,7 @@
 void checkArg(api.Arg o) {
   buildCounterArg++;
   if (buildCounterArg < 3) {
-    checkEmpty(o.anyValue);
+    checkEmpty(o.anyValue as api.Empty);
     var casted1 = (o.exactValue) as core.Map;
     unittest.expect(casted1, unittest.hasLength(3));
     unittest.expect(casted1['list'], unittest.equals([1, 2, 3]));
@@ -127,8 +127,8 @@
 
 void checkUnnamed5600(core.List<api.ExpressionReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExpressionReport(o[0]);
-  checkExpressionReport(o[1]);
+  checkExpressionReport(o[0] as api.ExpressionReport);
+  checkExpressionReport(o[1] as api.ExpressionReport);
 }
 
 core.List<api.ValueCount> buildUnnamed5601() {
@@ -140,8 +140,8 @@
 
 void checkUnnamed5601(core.List<api.ValueCount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValueCount(o[0]);
-  checkValueCount(o[1]);
+  checkValueCount(o[0] as api.ValueCount);
+  checkValueCount(o[1] as api.ValueCount);
 }
 
 core.int buildCounterExpressionReport = 0;
@@ -161,7 +161,7 @@
   buildCounterExpressionReport++;
   if (buildCounterExpressionReport < 3) {
     checkUnnamed5600(o.children);
-    checkSourcePosition(o.sourcePosition);
+    checkSourcePosition(o.sourcePosition as api.SourcePosition);
     checkUnnamed5601(o.values);
   }
   buildCounterExpressionReport--;
@@ -249,8 +249,8 @@
 
 void checkUnnamed5603(core.List<api.Arg> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkArg(o[0]);
-  checkArg(o[1]);
+  checkArg(o[0] as api.Arg);
+  checkArg(o[1] as api.Arg);
 }
 
 core.int buildCounterFunctionMock = 0;
@@ -271,7 +271,7 @@
   if (buildCounterFunctionMock < 3) {
     checkUnnamed5603(o.args);
     unittest.expect(o.function, unittest.equals('foo'));
-    checkResult(o.result);
+    checkResult(o.result as api.Result);
   }
   buildCounterFunctionMock--;
 }
@@ -323,7 +323,7 @@
   if (buildCounterIssue < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.severity, unittest.equals('foo'));
-    checkSourcePosition(o.sourcePosition);
+    checkSourcePosition(o.sourcePosition as api.SourcePosition);
   }
   buildCounterIssue--;
 }
@@ -337,8 +337,8 @@
 
 void checkUnnamed5604(core.List<api.Release> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRelease(o[0]);
-  checkRelease(o[1]);
+  checkRelease(o[0] as api.Release);
+  checkRelease(o[1] as api.Release);
 }
 
 core.int buildCounterListReleasesResponse = 0;
@@ -371,8 +371,8 @@
 
 void checkUnnamed5605(core.List<api.Ruleset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRuleset(o[0]);
-  checkRuleset(o[1]);
+  checkRuleset(o[0] as api.Ruleset);
+  checkRuleset(o[1] as api.Ruleset);
 }
 
 core.int buildCounterListRulesetsResponse = 0;
@@ -472,7 +472,7 @@
 void checkResult(api.Result o) {
   buildCounterResult++;
   if (buildCounterResult < 3) {
-    checkEmpty(o.undefined);
+    checkEmpty(o.undefined as api.Empty);
     var casted4 = (o.value) as core.Map;
     unittest.expect(casted4, unittest.hasLength(3));
     unittest.expect(casted4['list'], unittest.equals([1, 2, 3]));
@@ -500,9 +500,9 @@
   buildCounterRuleset++;
   if (buildCounterRuleset < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkMetadata(o.metadata);
+    checkMetadata(o.metadata as api.Metadata);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkSource(o.source);
+    checkSource(o.source as api.Source);
   }
   buildCounterRuleset--;
 }
@@ -516,8 +516,8 @@
 
 void checkUnnamed5607(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFile(o[0]);
-  checkFile(o[1]);
+  checkFile(o[0] as api.File);
+  checkFile(o[1] as api.File);
 }
 
 core.int buildCounterSource = 0;
@@ -575,8 +575,8 @@
 
 void checkUnnamed5608(core.List<api.FunctionMock> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFunctionMock(o[0]);
-  checkFunctionMock(o[1]);
+  checkFunctionMock(o[0] as api.FunctionMock);
+  checkFunctionMock(o[1] as api.FunctionMock);
 }
 
 core.int buildCounterTestCase = 0;
@@ -646,8 +646,8 @@
 
 void checkUnnamed5610(core.List<api.ExpressionReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExpressionReport(o[0]);
-  checkExpressionReport(o[1]);
+  checkExpressionReport(o[0] as api.ExpressionReport);
+  checkExpressionReport(o[1] as api.ExpressionReport);
 }
 
 core.List<api.FunctionCall> buildUnnamed5611() {
@@ -659,8 +659,8 @@
 
 void checkUnnamed5611(core.List<api.FunctionCall> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFunctionCall(o[0]);
-  checkFunctionCall(o[1]);
+  checkFunctionCall(o[0] as api.FunctionCall);
+  checkFunctionCall(o[1] as api.FunctionCall);
 }
 
 core.List<api.VisitedExpression> buildUnnamed5612() {
@@ -672,8 +672,8 @@
 
 void checkUnnamed5612(core.List<api.VisitedExpression> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVisitedExpression(o[0]);
-  checkVisitedExpression(o[1]);
+  checkVisitedExpression(o[0] as api.VisitedExpression);
+  checkVisitedExpression(o[1] as api.VisitedExpression);
 }
 
 core.int buildCounterTestResult = 0;
@@ -696,7 +696,7 @@
   buildCounterTestResult++;
   if (buildCounterTestResult < 3) {
     checkUnnamed5609(o.debugMessages);
-    checkSourcePosition(o.errorPosition);
+    checkSourcePosition(o.errorPosition as api.SourcePosition);
     checkUnnamed5610(o.expressionReports);
     checkUnnamed5611(o.functionCalls);
     unittest.expect(o.state, unittest.equals('foo'));
@@ -720,8 +720,8 @@
 void checkTestRulesetRequest(api.TestRulesetRequest o) {
   buildCounterTestRulesetRequest++;
   if (buildCounterTestRulesetRequest < 3) {
-    checkSource(o.source);
-    checkTestSuite(o.testSuite);
+    checkSource(o.source as api.Source);
+    checkTestSuite(o.testSuite as api.TestSuite);
   }
   buildCounterTestRulesetRequest--;
 }
@@ -735,8 +735,8 @@
 
 void checkUnnamed5613(core.List<api.Issue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIssue(o[0]);
-  checkIssue(o[1]);
+  checkIssue(o[0] as api.Issue);
+  checkIssue(o[1] as api.Issue);
 }
 
 core.List<api.TestResult> buildUnnamed5614() {
@@ -748,8 +748,8 @@
 
 void checkUnnamed5614(core.List<api.TestResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTestResult(o[0]);
-  checkTestResult(o[1]);
+  checkTestResult(o[0] as api.TestResult);
+  checkTestResult(o[1] as api.TestResult);
 }
 
 core.int buildCounterTestRulesetResponse = 0;
@@ -782,8 +782,8 @@
 
 void checkUnnamed5615(core.List<api.TestCase> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTestCase(o[0]);
-  checkTestCase(o[1]);
+  checkTestCase(o[0] as api.TestCase);
+  checkTestCase(o[1] as api.TestCase);
 }
 
 core.int buildCounterTestSuite = 0;
@@ -820,7 +820,7 @@
 void checkUpdateReleaseRequest(api.UpdateReleaseRequest o) {
   buildCounterUpdateReleaseRequest++;
   if (buildCounterUpdateReleaseRequest < 3) {
-    checkRelease(o.release);
+    checkRelease(o.release as api.Release);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateReleaseRequest--;
@@ -874,7 +874,7 @@
 void checkVisitedExpression(api.VisitedExpression o) {
   buildCounterVisitedExpression++;
   if (buildCounterVisitedExpression < 3) {
-    checkSourcePosition(o.sourcePosition);
+    checkSourcePosition(o.sourcePosition as api.SourcePosition);
     var casted8 = (o.value) as core.Map;
     unittest.expect(casted8, unittest.hasLength(3));
     unittest.expect(casted8['list'], unittest.equals([1, 2, 3]));
@@ -889,7 +889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArg();
       var od = api.Arg.fromJson(o.toJson());
-      checkArg(od);
+      checkArg(od as api.Arg);
     });
   });
 
@@ -897,7 +897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -905,7 +905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpressionReport();
       var od = api.ExpressionReport.fromJson(o.toJson());
-      checkExpressionReport(od);
+      checkExpressionReport(od as api.ExpressionReport);
     });
   });
 
@@ -913,7 +913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFile();
       var od = api.File.fromJson(o.toJson());
-      checkFile(od);
+      checkFile(od as api.File);
     });
   });
 
@@ -921,7 +921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFunctionCall();
       var od = api.FunctionCall.fromJson(o.toJson());
-      checkFunctionCall(od);
+      checkFunctionCall(od as api.FunctionCall);
     });
   });
 
@@ -929,7 +929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFunctionMock();
       var od = api.FunctionMock.fromJson(o.toJson());
-      checkFunctionMock(od);
+      checkFunctionMock(od as api.FunctionMock);
     });
   });
 
@@ -937,7 +937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetReleaseExecutableResponse();
       var od = api.GetReleaseExecutableResponse.fromJson(o.toJson());
-      checkGetReleaseExecutableResponse(od);
+      checkGetReleaseExecutableResponse(od as api.GetReleaseExecutableResponse);
     });
   });
 
@@ -945,7 +945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIssue();
       var od = api.Issue.fromJson(o.toJson());
-      checkIssue(od);
+      checkIssue(od as api.Issue);
     });
   });
 
@@ -953,7 +953,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListReleasesResponse();
       var od = api.ListReleasesResponse.fromJson(o.toJson());
-      checkListReleasesResponse(od);
+      checkListReleasesResponse(od as api.ListReleasesResponse);
     });
   });
 
@@ -961,7 +961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListRulesetsResponse();
       var od = api.ListRulesetsResponse.fromJson(o.toJson());
-      checkListRulesetsResponse(od);
+      checkListRulesetsResponse(od as api.ListRulesetsResponse);
     });
   });
 
@@ -969,7 +969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadata();
       var od = api.Metadata.fromJson(o.toJson());
-      checkMetadata(od);
+      checkMetadata(od as api.Metadata);
     });
   });
 
@@ -977,7 +977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRelease();
       var od = api.Release.fromJson(o.toJson());
-      checkRelease(od);
+      checkRelease(od as api.Release);
     });
   });
 
@@ -985,7 +985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResult();
       var od = api.Result.fromJson(o.toJson());
-      checkResult(od);
+      checkResult(od as api.Result);
     });
   });
 
@@ -993,7 +993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRuleset();
       var od = api.Ruleset.fromJson(o.toJson());
-      checkRuleset(od);
+      checkRuleset(od as api.Ruleset);
     });
   });
 
@@ -1001,7 +1001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSource();
       var od = api.Source.fromJson(o.toJson());
-      checkSource(od);
+      checkSource(od as api.Source);
     });
   });
 
@@ -1009,7 +1009,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourcePosition();
       var od = api.SourcePosition.fromJson(o.toJson());
-      checkSourcePosition(od);
+      checkSourcePosition(od as api.SourcePosition);
     });
   });
 
@@ -1017,7 +1017,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestCase();
       var od = api.TestCase.fromJson(o.toJson());
-      checkTestCase(od);
+      checkTestCase(od as api.TestCase);
     });
   });
 
@@ -1025,7 +1025,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestResult();
       var od = api.TestResult.fromJson(o.toJson());
-      checkTestResult(od);
+      checkTestResult(od as api.TestResult);
     });
   });
 
@@ -1033,7 +1033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestRulesetRequest();
       var od = api.TestRulesetRequest.fromJson(o.toJson());
-      checkTestRulesetRequest(od);
+      checkTestRulesetRequest(od as api.TestRulesetRequest);
     });
   });
 
@@ -1041,7 +1041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestRulesetResponse();
       var od = api.TestRulesetResponse.fromJson(o.toJson());
-      checkTestRulesetResponse(od);
+      checkTestRulesetResponse(od as api.TestRulesetResponse);
     });
   });
 
@@ -1049,7 +1049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestSuite();
       var od = api.TestSuite.fromJson(o.toJson());
-      checkTestSuite(od);
+      checkTestSuite(od as api.TestSuite);
     });
   });
 
@@ -1057,7 +1057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateReleaseRequest();
       var od = api.UpdateReleaseRequest.fromJson(o.toJson());
-      checkUpdateReleaseRequest(od);
+      checkUpdateReleaseRequest(od as api.UpdateReleaseRequest);
     });
   });
 
@@ -1065,7 +1065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValueCount();
       var od = api.ValueCount.fromJson(o.toJson());
-      checkValueCount(od);
+      checkValueCount(od as api.ValueCount);
     });
   });
 
@@ -1073,7 +1073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVisitedExpression();
       var od = api.VisitedExpression.fromJson(o.toJson());
-      checkVisitedExpression(od);
+      checkVisitedExpression(od as api.VisitedExpression);
     });
   });
 
@@ -1085,8 +1085,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestRulesetRequest.fromJson(json);
-        checkTestRulesetRequest(obj);
+        var obj = api.TestRulesetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestRulesetRequest(obj as api.TestRulesetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1126,7 +1127,7 @@
       res
           .test(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestRulesetResponse(response);
+        checkTestRulesetResponse(response as api.TestRulesetResponse);
       })));
     });
   });
@@ -1139,8 +1140,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Release.fromJson(json);
-        checkRelease(obj);
+        var obj =
+            api.Release.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRelease(obj as api.Release);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1180,7 +1182,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRelease(response);
+        checkRelease(response as api.Release);
       })));
     });
 
@@ -1228,7 +1230,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1276,7 +1278,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRelease(response);
+        checkRelease(response as api.Release);
       })));
     });
 
@@ -1328,7 +1330,8 @@
           .getExecutable(arg_name,
               executableVersion: arg_executableVersion, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetReleaseExecutableResponse(response);
+        checkGetReleaseExecutableResponse(
+            response as api.GetReleaseExecutableResponse);
       })));
     });
 
@@ -1388,7 +1391,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListReleasesResponse(response);
+        checkListReleasesResponse(response as api.ListReleasesResponse);
       })));
     });
 
@@ -1399,8 +1402,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateReleaseRequest.fromJson(json);
-        checkUpdateReleaseRequest(obj);
+        var obj = api.UpdateReleaseRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateReleaseRequest(obj as api.UpdateReleaseRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1440,7 +1444,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRelease(response);
+        checkRelease(response as api.Release);
       })));
     });
   });
@@ -1453,8 +1457,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Ruleset.fromJson(json);
-        checkRuleset(obj);
+        var obj =
+            api.Ruleset.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRuleset(obj as api.Ruleset);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1494,7 +1499,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRuleset(response);
+        checkRuleset(response as api.Ruleset);
       })));
     });
 
@@ -1542,7 +1547,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1590,7 +1595,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRuleset(response);
+        checkRuleset(response as api.Ruleset);
       })));
     });
 
@@ -1650,7 +1655,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRulesetsResponse(response);
+        checkListRulesetsResponse(response as api.ListRulesetsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/firestore/v1_test.dart b/generated/googleapis/test/firestore/v1_test.dart
index 40e291e..2567793 100644
--- a/generated/googleapis/test/firestore/v1_test.dart
+++ b/generated/googleapis/test/firestore/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed3253(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o[0]);
-  checkValue(o[1]);
+  checkValue(o[0] as api.Value);
+  checkValue(o[1] as api.Value);
 }
 
 core.int buildCounterArrayValue = 0;
@@ -138,8 +138,8 @@
   buildCounterBatchGetDocumentsRequest++;
   if (buildCounterBatchGetDocumentsRequest < 3) {
     checkUnnamed3254(o.documents);
-    checkDocumentMask(o.mask);
-    checkTransactionOptions(o.newTransaction);
+    checkDocumentMask(o.mask as api.DocumentMask);
+    checkTransactionOptions(o.newTransaction as api.TransactionOptions);
     unittest.expect(o.readTime, unittest.equals('foo'));
     unittest.expect(o.transaction, unittest.equals('foo'));
   }
@@ -163,7 +163,7 @@
 void checkBatchGetDocumentsResponse(api.BatchGetDocumentsResponse o) {
   buildCounterBatchGetDocumentsResponse++;
   if (buildCounterBatchGetDocumentsResponse < 3) {
-    checkDocument(o.found);
+    checkDocument(o.found as api.Document);
     unittest.expect(o.missing, unittest.equals('foo'));
     unittest.expect(o.readTime, unittest.equals('foo'));
     unittest.expect(o.transaction, unittest.equals('foo'));
@@ -193,8 +193,8 @@
 
 void checkUnnamed3256(core.List<api.Write> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWrite(o[0]);
-  checkWrite(o[1]);
+  checkWrite(o[0] as api.Write);
+  checkWrite(o[1] as api.Write);
 }
 
 core.int buildCounterBatchWriteRequest = 0;
@@ -227,8 +227,8 @@
 
 void checkUnnamed3257(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.List<api.WriteResult> buildUnnamed3258() {
@@ -240,8 +240,8 @@
 
 void checkUnnamed3258(core.List<api.WriteResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWriteResult(o[0]);
-  checkWriteResult(o[1]);
+  checkWriteResult(o[0] as api.WriteResult);
+  checkWriteResult(o[1] as api.WriteResult);
 }
 
 core.int buildCounterBatchWriteResponse = 0;
@@ -279,7 +279,7 @@
 void checkBeginTransactionRequest(api.BeginTransactionRequest o) {
   buildCounterBeginTransactionRequest++;
   if (buildCounterBeginTransactionRequest < 3) {
-    checkTransactionOptions(o.options);
+    checkTransactionOptions(o.options as api.TransactionOptions);
   }
   buildCounterBeginTransactionRequest--;
 }
@@ -333,8 +333,8 @@
 
 void checkUnnamed3259(core.List<api.Write> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWrite(o[0]);
-  checkWrite(o[1]);
+  checkWrite(o[0] as api.Write);
+  checkWrite(o[1] as api.Write);
 }
 
 core.int buildCounterCommitRequest = 0;
@@ -367,8 +367,8 @@
 
 void checkUnnamed3260(core.List<api.WriteResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWriteResult(o[0]);
-  checkWriteResult(o[1]);
+  checkWriteResult(o[0] as api.WriteResult);
+  checkWriteResult(o[1] as api.WriteResult);
 }
 
 core.int buildCounterCommitResponse = 0;
@@ -401,8 +401,8 @@
 
 void checkUnnamed3261(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilter(o[0]);
-  checkFilter(o[1]);
+  checkFilter(o[0] as api.Filter);
+  checkFilter(o[1] as api.Filter);
 }
 
 core.int buildCounterCompositeFilter = 0;
@@ -435,8 +435,8 @@
 
 void checkUnnamed3262(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o[0]);
-  checkValue(o[1]);
+  checkValue(o[0] as api.Value);
+  checkValue(o[1] as api.Value);
 }
 
 core.int buildCounterCursor = 0;
@@ -469,8 +469,8 @@
 
 void checkUnnamed3263(core.Map<core.String, api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o['x']);
-  checkValue(o['y']);
+  checkValue(o['x'] as api.Value);
+  checkValue(o['y'] as api.Value);
 }
 
 core.int buildCounterDocument = 0;
@@ -540,7 +540,7 @@
 void checkDocumentChange(api.DocumentChange o) {
   buildCounterDocumentChange++;
   if (buildCounterDocumentChange < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
     checkUnnamed3264(o.removedTargetIds);
     checkUnnamed3265(o.targetIds);
   }
@@ -660,8 +660,8 @@
 
 void checkUnnamed3269(core.List<api.FieldTransform> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFieldTransform(o[0]);
-  checkFieldTransform(o[1]);
+  checkFieldTransform(o[0] as api.FieldTransform);
+  checkFieldTransform(o[1] as api.FieldTransform);
 }
 
 core.int buildCounterDocumentTransform = 0;
@@ -769,9 +769,9 @@
 void checkFieldFilter(api.FieldFilter o) {
   buildCounterFieldFilter++;
   if (buildCounterFieldFilter < 3) {
-    checkFieldReference(o.field);
+    checkFieldReference(o.field as api.FieldReference);
     unittest.expect(o.op, unittest.equals('foo'));
-    checkValue(o.value);
+    checkValue(o.value as api.Value);
   }
   buildCounterFieldFilter--;
 }
@@ -815,12 +815,12 @@
 void checkFieldTransform(api.FieldTransform o) {
   buildCounterFieldTransform++;
   if (buildCounterFieldTransform < 3) {
-    checkArrayValue(o.appendMissingElements);
+    checkArrayValue(o.appendMissingElements as api.ArrayValue);
     unittest.expect(o.fieldPath, unittest.equals('foo'));
-    checkValue(o.increment);
-    checkValue(o.maximum);
-    checkValue(o.minimum);
-    checkArrayValue(o.removeAllFromArray);
+    checkValue(o.increment as api.Value);
+    checkValue(o.maximum as api.Value);
+    checkValue(o.minimum as api.Value);
+    checkArrayValue(o.removeAllFromArray as api.ArrayValue);
     unittest.expect(o.setToServerValue, unittest.equals('foo'));
   }
   buildCounterFieldTransform--;
@@ -842,9 +842,9 @@
 void checkFilter(api.Filter o) {
   buildCounterFilter++;
   if (buildCounterFilter < 3) {
-    checkCompositeFilter(o.compositeFilter);
-    checkFieldFilter(o.fieldFilter);
-    checkUnaryFilter(o.unaryFilter);
+    checkCompositeFilter(o.compositeFilter as api.CompositeFilter);
+    checkFieldFilter(o.fieldFilter as api.FieldFilter);
+    checkUnaryFilter(o.unaryFilter as api.UnaryFilter);
   }
   buildCounterFilter--;
 }
@@ -888,8 +888,10 @@
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.operationState, unittest.equals('foo'));
     unittest.expect(o.outputUriPrefix, unittest.equals('foo'));
-    checkGoogleFirestoreAdminV1Progress(o.progressBytes);
-    checkGoogleFirestoreAdminV1Progress(o.progressDocuments);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressBytes as api.GoogleFirestoreAdminV1Progress);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressDocuments as api.GoogleFirestoreAdminV1Progress);
     unittest.expect(o.startTime, unittest.equals('foo'));
   }
   buildCounterGoogleFirestoreAdminV1ExportDocumentsMetadata--;
@@ -967,7 +969,8 @@
 void checkGoogleFirestoreAdminV1Field(api.GoogleFirestoreAdminV1Field o) {
   buildCounterGoogleFirestoreAdminV1Field++;
   if (buildCounterGoogleFirestoreAdminV1Field < 3) {
-    checkGoogleFirestoreAdminV1IndexConfig(o.indexConfig);
+    checkGoogleFirestoreAdminV1IndexConfig(
+        o.indexConfig as api.GoogleFirestoreAdminV1IndexConfig);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterGoogleFirestoreAdminV1Field--;
@@ -982,8 +985,10 @@
 
 void checkUnnamed3273(core.List<api.GoogleFirestoreAdminV1IndexConfigDelta> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleFirestoreAdminV1IndexConfigDelta(o[0]);
-  checkGoogleFirestoreAdminV1IndexConfigDelta(o[1]);
+  checkGoogleFirestoreAdminV1IndexConfigDelta(
+      o[0] as api.GoogleFirestoreAdminV1IndexConfigDelta);
+  checkGoogleFirestoreAdminV1IndexConfigDelta(
+      o[1] as api.GoogleFirestoreAdminV1IndexConfigDelta);
 }
 
 core.int buildCounterGoogleFirestoreAdminV1FieldOperationMetadata = 0;
@@ -1011,8 +1016,10 @@
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.field, unittest.equals('foo'));
     checkUnnamed3273(o.indexConfigDeltas);
-    checkGoogleFirestoreAdminV1Progress(o.progressBytes);
-    checkGoogleFirestoreAdminV1Progress(o.progressDocuments);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressBytes as api.GoogleFirestoreAdminV1Progress);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressDocuments as api.GoogleFirestoreAdminV1Progress);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
   }
@@ -1058,8 +1065,10 @@
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.inputUriPrefix, unittest.equals('foo'));
     unittest.expect(o.operationState, unittest.equals('foo'));
-    checkGoogleFirestoreAdminV1Progress(o.progressBytes);
-    checkGoogleFirestoreAdminV1Progress(o.progressDocuments);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressBytes as api.GoogleFirestoreAdminV1Progress);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressDocuments as api.GoogleFirestoreAdminV1Progress);
     unittest.expect(o.startTime, unittest.equals('foo'));
   }
   buildCounterGoogleFirestoreAdminV1ImportDocumentsMetadata--;
@@ -1110,8 +1119,10 @@
 
 void checkUnnamed3276(core.List<api.GoogleFirestoreAdminV1IndexField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleFirestoreAdminV1IndexField(o[0]);
-  checkGoogleFirestoreAdminV1IndexField(o[1]);
+  checkGoogleFirestoreAdminV1IndexField(
+      o[0] as api.GoogleFirestoreAdminV1IndexField);
+  checkGoogleFirestoreAdminV1IndexField(
+      o[1] as api.GoogleFirestoreAdminV1IndexField);
 }
 
 core.int buildCounterGoogleFirestoreAdminV1Index = 0;
@@ -1148,8 +1159,8 @@
 
 void checkUnnamed3277(core.List<api.GoogleFirestoreAdminV1Index> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleFirestoreAdminV1Index(o[0]);
-  checkGoogleFirestoreAdminV1Index(o[1]);
+  checkGoogleFirestoreAdminV1Index(o[0] as api.GoogleFirestoreAdminV1Index);
+  checkGoogleFirestoreAdminV1Index(o[1] as api.GoogleFirestoreAdminV1Index);
 }
 
 core.int buildCounterGoogleFirestoreAdminV1IndexConfig = 0;
@@ -1196,7 +1207,8 @@
   buildCounterGoogleFirestoreAdminV1IndexConfigDelta++;
   if (buildCounterGoogleFirestoreAdminV1IndexConfigDelta < 3) {
     unittest.expect(o.changeType, unittest.equals('foo'));
-    checkGoogleFirestoreAdminV1Index(o.index);
+    checkGoogleFirestoreAdminV1Index(
+        o.index as api.GoogleFirestoreAdminV1Index);
   }
   buildCounterGoogleFirestoreAdminV1IndexConfigDelta--;
 }
@@ -1248,8 +1260,10 @@
   if (buildCounterGoogleFirestoreAdminV1IndexOperationMetadata < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.index, unittest.equals('foo'));
-    checkGoogleFirestoreAdminV1Progress(o.progressBytes);
-    checkGoogleFirestoreAdminV1Progress(o.progressDocuments);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressBytes as api.GoogleFirestoreAdminV1Progress);
+    checkGoogleFirestoreAdminV1Progress(
+        o.progressDocuments as api.GoogleFirestoreAdminV1Progress);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
   }
@@ -1265,8 +1279,8 @@
 
 void checkUnnamed3278(core.List<api.GoogleFirestoreAdminV1Field> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleFirestoreAdminV1Field(o[0]);
-  checkGoogleFirestoreAdminV1Field(o[1]);
+  checkGoogleFirestoreAdminV1Field(o[0] as api.GoogleFirestoreAdminV1Field);
+  checkGoogleFirestoreAdminV1Field(o[1] as api.GoogleFirestoreAdminV1Field);
 }
 
 core.int buildCounterGoogleFirestoreAdminV1ListFieldsResponse = 0;
@@ -1301,8 +1315,8 @@
 
 void checkUnnamed3279(core.List<api.GoogleFirestoreAdminV1Index> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleFirestoreAdminV1Index(o[0]);
-  checkGoogleFirestoreAdminV1Index(o[1]);
+  checkGoogleFirestoreAdminV1Index(o[0] as api.GoogleFirestoreAdminV1Index);
+  checkGoogleFirestoreAdminV1Index(o[1] as api.GoogleFirestoreAdminV1Index);
 }
 
 core.int buildCounterGoogleFirestoreAdminV1ListIndexesResponse = 0;
@@ -1392,8 +1406,8 @@
 
 void checkUnnamed3280(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleLongrunningOperation(o[0]);
-  checkGoogleLongrunningOperation(o[1]);
+  checkGoogleLongrunningOperation(o[0] as api.GoogleLongrunningOperation);
+  checkGoogleLongrunningOperation(o[1] as api.GoogleLongrunningOperation);
 }
 
 core.int buildCounterGoogleLongrunningListOperationsResponse = 0;
@@ -1496,7 +1510,7 @@
   buildCounterGoogleLongrunningOperation++;
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3281(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3282(o.response);
@@ -1589,8 +1603,8 @@
 
 void checkUnnamed3284(core.List<api.Document> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDocument(o[0]);
-  checkDocument(o[1]);
+  checkDocument(o[0] as api.Document);
+  checkDocument(o[1] as api.Document);
 }
 
 core.int buildCounterListDocumentsResponse = 0;
@@ -1623,8 +1637,8 @@
 
 void checkUnnamed3285(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -1677,7 +1691,7 @@
 void checkListenRequest(api.ListenRequest o) {
   buildCounterListenRequest++;
   if (buildCounterListenRequest < 3) {
-    checkTarget(o.addTarget);
+    checkTarget(o.addTarget as api.Target);
     checkUnnamed3286(o.labels);
     unittest.expect(o.removeTarget, unittest.equals(42));
   }
@@ -1702,11 +1716,11 @@
 void checkListenResponse(api.ListenResponse o) {
   buildCounterListenResponse++;
   if (buildCounterListenResponse < 3) {
-    checkDocumentChange(o.documentChange);
-    checkDocumentDelete(o.documentDelete);
-    checkDocumentRemove(o.documentRemove);
-    checkExistenceFilter(o.filter);
-    checkTargetChange(o.targetChange);
+    checkDocumentChange(o.documentChange as api.DocumentChange);
+    checkDocumentDelete(o.documentDelete as api.DocumentDelete);
+    checkDocumentRemove(o.documentRemove as api.DocumentRemove);
+    checkExistenceFilter(o.filter as api.ExistenceFilter);
+    checkTargetChange(o.targetChange as api.TargetChange);
   }
   buildCounterListenResponse--;
 }
@@ -1789,8 +1803,8 @@
 
 void checkUnnamed3289(core.Map<core.String, api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o['x']);
-  checkValue(o['y']);
+  checkValue(o['x'] as api.Value);
+  checkValue(o['y'] as api.Value);
 }
 
 core.int buildCounterMapValue = 0;
@@ -1828,7 +1842,7 @@
   buildCounterOrder++;
   if (buildCounterOrder < 3) {
     unittest.expect(o.direction, unittest.equals('foo'));
-    checkFieldReference(o.field);
+    checkFieldReference(o.field as api.FieldReference);
   }
   buildCounterOrder--;
 }
@@ -1853,7 +1867,7 @@
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
     unittest.expect(o.partitionCount, unittest.equals('foo'));
-    checkStructuredQuery(o.structuredQuery);
+    checkStructuredQuery(o.structuredQuery as api.StructuredQuery);
   }
   buildCounterPartitionQueryRequest--;
 }
@@ -1867,8 +1881,8 @@
 
 void checkUnnamed3290(core.List<api.Cursor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCursor(o[0]);
-  checkCursor(o[1]);
+  checkCursor(o[0] as api.Cursor);
+  checkCursor(o[1] as api.Cursor);
 }
 
 core.int buildCounterPartitionQueryResponse = 0;
@@ -1922,8 +1936,8 @@
 
 void checkUnnamed3291(core.List<api.FieldReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFieldReference(o[0]);
-  checkFieldReference(o[1]);
+  checkFieldReference(o[0] as api.FieldReference);
+  checkFieldReference(o[1] as api.FieldReference);
 }
 
 core.int buildCounterProjection = 0;
@@ -1961,7 +1975,7 @@
   buildCounterQueryTarget++;
   if (buildCounterQueryTarget < 3) {
     unittest.expect(o.parent, unittest.equals('foo'));
-    checkStructuredQuery(o.structuredQuery);
+    checkStructuredQuery(o.structuredQuery as api.StructuredQuery);
   }
   buildCounterQueryTarget--;
 }
@@ -2040,9 +2054,9 @@
 void checkRunQueryRequest(api.RunQueryRequest o) {
   buildCounterRunQueryRequest++;
   if (buildCounterRunQueryRequest < 3) {
-    checkTransactionOptions(o.newTransaction);
+    checkTransactionOptions(o.newTransaction as api.TransactionOptions);
     unittest.expect(o.readTime, unittest.equals('foo'));
-    checkStructuredQuery(o.structuredQuery);
+    checkStructuredQuery(o.structuredQuery as api.StructuredQuery);
     unittest.expect(o.transaction, unittest.equals('foo'));
   }
   buildCounterRunQueryRequest--;
@@ -2065,7 +2079,7 @@
 void checkRunQueryResponse(api.RunQueryResponse o) {
   buildCounterRunQueryResponse++;
   if (buildCounterRunQueryResponse < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
     unittest.expect(o.readTime, unittest.equals('foo'));
     unittest.expect(o.skippedResults, unittest.equals(42));
     unittest.expect(o.transaction, unittest.equals('foo'));
@@ -2147,8 +2161,8 @@
 
 void checkUnnamed3294(core.List<api.CollectionSelector> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCollectionSelector(o[0]);
-  checkCollectionSelector(o[1]);
+  checkCollectionSelector(o[0] as api.CollectionSelector);
+  checkCollectionSelector(o[1] as api.CollectionSelector);
 }
 
 core.List<api.Order> buildUnnamed3295() {
@@ -2160,8 +2174,8 @@
 
 void checkUnnamed3295(core.List<api.Order> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrder(o[0]);
-  checkOrder(o[1]);
+  checkOrder(o[0] as api.Order);
+  checkOrder(o[1] as api.Order);
 }
 
 core.int buildCounterStructuredQuery = 0;
@@ -2185,14 +2199,14 @@
 void checkStructuredQuery(api.StructuredQuery o) {
   buildCounterStructuredQuery++;
   if (buildCounterStructuredQuery < 3) {
-    checkCursor(o.endAt);
+    checkCursor(o.endAt as api.Cursor);
     checkUnnamed3294(o.from);
     unittest.expect(o.limit, unittest.equals(42));
     unittest.expect(o.offset, unittest.equals(42));
     checkUnnamed3295(o.orderBy);
-    checkProjection(o.select);
-    checkCursor(o.startAt);
-    checkFilter(o.where);
+    checkProjection(o.select as api.Projection);
+    checkCursor(o.startAt as api.Cursor);
+    checkFilter(o.where as api.Filter);
   }
   buildCounterStructuredQuery--;
 }
@@ -2216,9 +2230,9 @@
 void checkTarget(api.Target o) {
   buildCounterTarget++;
   if (buildCounterTarget < 3) {
-    checkDocumentsTarget(o.documents);
+    checkDocumentsTarget(o.documents as api.DocumentsTarget);
     unittest.expect(o.once, unittest.isTrue);
-    checkQueryTarget(o.query);
+    checkQueryTarget(o.query as api.QueryTarget);
     unittest.expect(o.readTime, unittest.equals('foo'));
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     unittest.expect(o.targetId, unittest.equals(42));
@@ -2257,7 +2271,7 @@
 void checkTargetChange(api.TargetChange o) {
   buildCounterTargetChange++;
   if (buildCounterTargetChange < 3) {
-    checkStatus(o.cause);
+    checkStatus(o.cause as api.Status);
     unittest.expect(o.readTime, unittest.equals('foo'));
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     unittest.expect(o.targetChangeType, unittest.equals('foo'));
@@ -2281,8 +2295,8 @@
 void checkTransactionOptions(api.TransactionOptions o) {
   buildCounterTransactionOptions++;
   if (buildCounterTransactionOptions < 3) {
-    checkReadOnly(o.readOnly);
-    checkReadWrite(o.readWrite);
+    checkReadOnly(o.readOnly as api.ReadOnly);
+    checkReadWrite(o.readWrite as api.ReadWrite);
   }
   buildCounterTransactionOptions--;
 }
@@ -2302,7 +2316,7 @@
 void checkUnaryFilter(api.UnaryFilter o) {
   buildCounterUnaryFilter++;
   if (buildCounterUnaryFilter < 3) {
-    checkFieldReference(o.field);
+    checkFieldReference(o.field as api.FieldReference);
     unittest.expect(o.op, unittest.equals('foo'));
   }
   buildCounterUnaryFilter--;
@@ -2332,13 +2346,13 @@
 void checkValue(api.Value o) {
   buildCounterValue++;
   if (buildCounterValue < 3) {
-    checkArrayValue(o.arrayValue);
+    checkArrayValue(o.arrayValue as api.ArrayValue);
     unittest.expect(o.booleanValue, unittest.isTrue);
     unittest.expect(o.bytesValue, unittest.equals('foo'));
     unittest.expect(o.doubleValue, unittest.equals(42.0));
-    checkLatLng(o.geoPointValue);
+    checkLatLng(o.geoPointValue as api.LatLng);
     unittest.expect(o.integerValue, unittest.equals('foo'));
-    checkMapValue(o.mapValue);
+    checkMapValue(o.mapValue as api.MapValue);
     unittest.expect(o.nullValue, unittest.equals('foo'));
     unittest.expect(o.referenceValue, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
@@ -2356,8 +2370,8 @@
 
 void checkUnnamed3297(core.List<api.FieldTransform> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFieldTransform(o[0]);
-  checkFieldTransform(o[1]);
+  checkFieldTransform(o[0] as api.FieldTransform);
+  checkFieldTransform(o[1] as api.FieldTransform);
 }
 
 core.int buildCounterWrite = 0;
@@ -2379,11 +2393,11 @@
 void checkWrite(api.Write o) {
   buildCounterWrite++;
   if (buildCounterWrite < 3) {
-    checkPrecondition(o.currentDocument);
+    checkPrecondition(o.currentDocument as api.Precondition);
     unittest.expect(o.delete, unittest.equals('foo'));
-    checkDocumentTransform(o.transform);
-    checkDocument(o.update);
-    checkDocumentMask(o.updateMask);
+    checkDocumentTransform(o.transform as api.DocumentTransform);
+    checkDocument(o.update as api.Document);
+    checkDocumentMask(o.updateMask as api.DocumentMask);
     checkUnnamed3297(o.updateTransforms);
   }
   buildCounterWrite--;
@@ -2411,8 +2425,8 @@
 
 void checkUnnamed3299(core.List<api.Write> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWrite(o[0]);
-  checkWrite(o[1]);
+  checkWrite(o[0] as api.Write);
+  checkWrite(o[1] as api.Write);
 }
 
 core.int buildCounterWriteRequest = 0;
@@ -2449,8 +2463,8 @@
 
 void checkUnnamed3300(core.List<api.WriteResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWriteResult(o[0]);
-  checkWriteResult(o[1]);
+  checkWriteResult(o[0] as api.WriteResult);
+  checkWriteResult(o[1] as api.WriteResult);
 }
 
 core.int buildCounterWriteResponse = 0;
@@ -2487,8 +2501,8 @@
 
 void checkUnnamed3301(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o[0]);
-  checkValue(o[1]);
+  checkValue(o[0] as api.Value);
+  checkValue(o[1] as api.Value);
 }
 
 core.int buildCounterWriteResult = 0;
@@ -2582,7 +2596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildArrayValue();
       var od = api.ArrayValue.fromJson(o.toJson());
-      checkArrayValue(od);
+      checkArrayValue(od as api.ArrayValue);
     });
   });
 
@@ -2590,7 +2604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetDocumentsRequest();
       var od = api.BatchGetDocumentsRequest.fromJson(o.toJson());
-      checkBatchGetDocumentsRequest(od);
+      checkBatchGetDocumentsRequest(od as api.BatchGetDocumentsRequest);
     });
   });
 
@@ -2598,7 +2612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetDocumentsResponse();
       var od = api.BatchGetDocumentsResponse.fromJson(o.toJson());
-      checkBatchGetDocumentsResponse(od);
+      checkBatchGetDocumentsResponse(od as api.BatchGetDocumentsResponse);
     });
   });
 
@@ -2606,7 +2620,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchWriteRequest();
       var od = api.BatchWriteRequest.fromJson(o.toJson());
-      checkBatchWriteRequest(od);
+      checkBatchWriteRequest(od as api.BatchWriteRequest);
     });
   });
 
@@ -2614,7 +2628,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchWriteResponse();
       var od = api.BatchWriteResponse.fromJson(o.toJson());
-      checkBatchWriteResponse(od);
+      checkBatchWriteResponse(od as api.BatchWriteResponse);
     });
   });
 
@@ -2622,7 +2636,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBeginTransactionRequest();
       var od = api.BeginTransactionRequest.fromJson(o.toJson());
-      checkBeginTransactionRequest(od);
+      checkBeginTransactionRequest(od as api.BeginTransactionRequest);
     });
   });
 
@@ -2630,7 +2644,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBeginTransactionResponse();
       var od = api.BeginTransactionResponse.fromJson(o.toJson());
-      checkBeginTransactionResponse(od);
+      checkBeginTransactionResponse(od as api.BeginTransactionResponse);
     });
   });
 
@@ -2638,7 +2652,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCollectionSelector();
       var od = api.CollectionSelector.fromJson(o.toJson());
-      checkCollectionSelector(od);
+      checkCollectionSelector(od as api.CollectionSelector);
     });
   });
 
@@ -2646,7 +2660,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitRequest();
       var od = api.CommitRequest.fromJson(o.toJson());
-      checkCommitRequest(od);
+      checkCommitRequest(od as api.CommitRequest);
     });
   });
 
@@ -2654,7 +2668,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitResponse();
       var od = api.CommitResponse.fromJson(o.toJson());
-      checkCommitResponse(od);
+      checkCommitResponse(od as api.CommitResponse);
     });
   });
 
@@ -2662,7 +2676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompositeFilter();
       var od = api.CompositeFilter.fromJson(o.toJson());
-      checkCompositeFilter(od);
+      checkCompositeFilter(od as api.CompositeFilter);
     });
   });
 
@@ -2670,7 +2684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCursor();
       var od = api.Cursor.fromJson(o.toJson());
-      checkCursor(od);
+      checkCursor(od as api.Cursor);
     });
   });
 
@@ -2678,7 +2692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocument();
       var od = api.Document.fromJson(o.toJson());
-      checkDocument(od);
+      checkDocument(od as api.Document);
     });
   });
 
@@ -2686,7 +2700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentChange();
       var od = api.DocumentChange.fromJson(o.toJson());
-      checkDocumentChange(od);
+      checkDocumentChange(od as api.DocumentChange);
     });
   });
 
@@ -2694,7 +2708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentDelete();
       var od = api.DocumentDelete.fromJson(o.toJson());
-      checkDocumentDelete(od);
+      checkDocumentDelete(od as api.DocumentDelete);
     });
   });
 
@@ -2702,7 +2716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentMask();
       var od = api.DocumentMask.fromJson(o.toJson());
-      checkDocumentMask(od);
+      checkDocumentMask(od as api.DocumentMask);
     });
   });
 
@@ -2710,7 +2724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentRemove();
       var od = api.DocumentRemove.fromJson(o.toJson());
-      checkDocumentRemove(od);
+      checkDocumentRemove(od as api.DocumentRemove);
     });
   });
 
@@ -2718,7 +2732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentTransform();
       var od = api.DocumentTransform.fromJson(o.toJson());
-      checkDocumentTransform(od);
+      checkDocumentTransform(od as api.DocumentTransform);
     });
   });
 
@@ -2726,7 +2740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentsTarget();
       var od = api.DocumentsTarget.fromJson(o.toJson());
-      checkDocumentsTarget(od);
+      checkDocumentsTarget(od as api.DocumentsTarget);
     });
   });
 
@@ -2734,7 +2748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2742,7 +2756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExistenceFilter();
       var od = api.ExistenceFilter.fromJson(o.toJson());
-      checkExistenceFilter(od);
+      checkExistenceFilter(od as api.ExistenceFilter);
     });
   });
 
@@ -2750,7 +2764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFieldFilter();
       var od = api.FieldFilter.fromJson(o.toJson());
-      checkFieldFilter(od);
+      checkFieldFilter(od as api.FieldFilter);
     });
   });
 
@@ -2758,7 +2772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFieldReference();
       var od = api.FieldReference.fromJson(o.toJson());
-      checkFieldReference(od);
+      checkFieldReference(od as api.FieldReference);
     });
   });
 
@@ -2766,7 +2780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFieldTransform();
       var od = api.FieldTransform.fromJson(o.toJson());
-      checkFieldTransform(od);
+      checkFieldTransform(od as api.FieldTransform);
     });
   });
 
@@ -2774,7 +2788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilter();
       var od = api.Filter.fromJson(o.toJson());
-      checkFilter(od);
+      checkFilter(od as api.Filter);
     });
   });
 
@@ -2784,7 +2798,8 @@
       var o = buildGoogleFirestoreAdminV1ExportDocumentsMetadata();
       var od = api.GoogleFirestoreAdminV1ExportDocumentsMetadata.fromJson(
           o.toJson());
-      checkGoogleFirestoreAdminV1ExportDocumentsMetadata(od);
+      checkGoogleFirestoreAdminV1ExportDocumentsMetadata(
+          od as api.GoogleFirestoreAdminV1ExportDocumentsMetadata);
     });
   });
 
@@ -2793,7 +2808,8 @@
       var o = buildGoogleFirestoreAdminV1ExportDocumentsRequest();
       var od =
           api.GoogleFirestoreAdminV1ExportDocumentsRequest.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1ExportDocumentsRequest(od);
+      checkGoogleFirestoreAdminV1ExportDocumentsRequest(
+          od as api.GoogleFirestoreAdminV1ExportDocumentsRequest);
     });
   });
 
@@ -2803,7 +2819,8 @@
       var o = buildGoogleFirestoreAdminV1ExportDocumentsResponse();
       var od = api.GoogleFirestoreAdminV1ExportDocumentsResponse.fromJson(
           o.toJson());
-      checkGoogleFirestoreAdminV1ExportDocumentsResponse(od);
+      checkGoogleFirestoreAdminV1ExportDocumentsResponse(
+          od as api.GoogleFirestoreAdminV1ExportDocumentsResponse);
     });
   });
 
@@ -2811,7 +2828,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleFirestoreAdminV1Field();
       var od = api.GoogleFirestoreAdminV1Field.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1Field(od);
+      checkGoogleFirestoreAdminV1Field(od as api.GoogleFirestoreAdminV1Field);
     });
   });
 
@@ -2820,7 +2837,8 @@
       var o = buildGoogleFirestoreAdminV1FieldOperationMetadata();
       var od =
           api.GoogleFirestoreAdminV1FieldOperationMetadata.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1FieldOperationMetadata(od);
+      checkGoogleFirestoreAdminV1FieldOperationMetadata(
+          od as api.GoogleFirestoreAdminV1FieldOperationMetadata);
     });
   });
 
@@ -2830,7 +2848,8 @@
       var o = buildGoogleFirestoreAdminV1ImportDocumentsMetadata();
       var od = api.GoogleFirestoreAdminV1ImportDocumentsMetadata.fromJson(
           o.toJson());
-      checkGoogleFirestoreAdminV1ImportDocumentsMetadata(od);
+      checkGoogleFirestoreAdminV1ImportDocumentsMetadata(
+          od as api.GoogleFirestoreAdminV1ImportDocumentsMetadata);
     });
   });
 
@@ -2839,7 +2858,8 @@
       var o = buildGoogleFirestoreAdminV1ImportDocumentsRequest();
       var od =
           api.GoogleFirestoreAdminV1ImportDocumentsRequest.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1ImportDocumentsRequest(od);
+      checkGoogleFirestoreAdminV1ImportDocumentsRequest(
+          od as api.GoogleFirestoreAdminV1ImportDocumentsRequest);
     });
   });
 
@@ -2847,7 +2867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleFirestoreAdminV1Index();
       var od = api.GoogleFirestoreAdminV1Index.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1Index(od);
+      checkGoogleFirestoreAdminV1Index(od as api.GoogleFirestoreAdminV1Index);
     });
   });
 
@@ -2855,7 +2875,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleFirestoreAdminV1IndexConfig();
       var od = api.GoogleFirestoreAdminV1IndexConfig.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1IndexConfig(od);
+      checkGoogleFirestoreAdminV1IndexConfig(
+          od as api.GoogleFirestoreAdminV1IndexConfig);
     });
   });
 
@@ -2863,7 +2884,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleFirestoreAdminV1IndexConfigDelta();
       var od = api.GoogleFirestoreAdminV1IndexConfigDelta.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1IndexConfigDelta(od);
+      checkGoogleFirestoreAdminV1IndexConfigDelta(
+          od as api.GoogleFirestoreAdminV1IndexConfigDelta);
     });
   });
 
@@ -2871,7 +2893,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleFirestoreAdminV1IndexField();
       var od = api.GoogleFirestoreAdminV1IndexField.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1IndexField(od);
+      checkGoogleFirestoreAdminV1IndexField(
+          od as api.GoogleFirestoreAdminV1IndexField);
     });
   });
 
@@ -2880,7 +2903,8 @@
       var o = buildGoogleFirestoreAdminV1IndexOperationMetadata();
       var od =
           api.GoogleFirestoreAdminV1IndexOperationMetadata.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1IndexOperationMetadata(od);
+      checkGoogleFirestoreAdminV1IndexOperationMetadata(
+          od as api.GoogleFirestoreAdminV1IndexOperationMetadata);
     });
   });
 
@@ -2889,7 +2913,8 @@
       var o = buildGoogleFirestoreAdminV1ListFieldsResponse();
       var od =
           api.GoogleFirestoreAdminV1ListFieldsResponse.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1ListFieldsResponse(od);
+      checkGoogleFirestoreAdminV1ListFieldsResponse(
+          od as api.GoogleFirestoreAdminV1ListFieldsResponse);
     });
   });
 
@@ -2898,7 +2923,8 @@
       var o = buildGoogleFirestoreAdminV1ListIndexesResponse();
       var od =
           api.GoogleFirestoreAdminV1ListIndexesResponse.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1ListIndexesResponse(od);
+      checkGoogleFirestoreAdminV1ListIndexesResponse(
+          od as api.GoogleFirestoreAdminV1ListIndexesResponse);
     });
   });
 
@@ -2906,7 +2932,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleFirestoreAdminV1LocationMetadata();
       var od = api.GoogleFirestoreAdminV1LocationMetadata.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1LocationMetadata(od);
+      checkGoogleFirestoreAdminV1LocationMetadata(
+          od as api.GoogleFirestoreAdminV1LocationMetadata);
     });
   });
 
@@ -2914,7 +2941,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleFirestoreAdminV1Progress();
       var od = api.GoogleFirestoreAdminV1Progress.fromJson(o.toJson());
-      checkGoogleFirestoreAdminV1Progress(od);
+      checkGoogleFirestoreAdminV1Progress(
+          od as api.GoogleFirestoreAdminV1Progress);
     });
   });
 
@@ -2922,7 +2950,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningCancelOperationRequest();
       var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
-      checkGoogleLongrunningCancelOperationRequest(od);
+      checkGoogleLongrunningCancelOperationRequest(
+          od as api.GoogleLongrunningCancelOperationRequest);
     });
   });
 
@@ -2930,7 +2959,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningListOperationsResponse();
       var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
-      checkGoogleLongrunningListOperationsResponse(od);
+      checkGoogleLongrunningListOperationsResponse(
+          od as api.GoogleLongrunningListOperationsResponse);
     });
   });
 
@@ -2938,7 +2968,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningOperation();
       var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
-      checkGoogleLongrunningOperation(od);
+      checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
 
@@ -2946,7 +2976,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatLng();
       var od = api.LatLng.fromJson(o.toJson());
-      checkLatLng(od);
+      checkLatLng(od as api.LatLng);
     });
   });
 
@@ -2954,7 +2984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCollectionIdsRequest();
       var od = api.ListCollectionIdsRequest.fromJson(o.toJson());
-      checkListCollectionIdsRequest(od);
+      checkListCollectionIdsRequest(od as api.ListCollectionIdsRequest);
     });
   });
 
@@ -2962,7 +2992,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCollectionIdsResponse();
       var od = api.ListCollectionIdsResponse.fromJson(o.toJson());
-      checkListCollectionIdsResponse(od);
+      checkListCollectionIdsResponse(od as api.ListCollectionIdsResponse);
     });
   });
 
@@ -2970,7 +3000,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDocumentsResponse();
       var od = api.ListDocumentsResponse.fromJson(o.toJson());
-      checkListDocumentsResponse(od);
+      checkListDocumentsResponse(od as api.ListDocumentsResponse);
     });
   });
 
@@ -2978,7 +3008,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -2986,7 +3016,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListenRequest();
       var od = api.ListenRequest.fromJson(o.toJson());
-      checkListenRequest(od);
+      checkListenRequest(od as api.ListenRequest);
     });
   });
 
@@ -2994,7 +3024,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListenResponse();
       var od = api.ListenResponse.fromJson(o.toJson());
-      checkListenResponse(od);
+      checkListenResponse(od as api.ListenResponse);
     });
   });
 
@@ -3002,7 +3032,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -3010,7 +3040,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMapValue();
       var od = api.MapValue.fromJson(o.toJson());
-      checkMapValue(od);
+      checkMapValue(od as api.MapValue);
     });
   });
 
@@ -3018,7 +3048,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrder();
       var od = api.Order.fromJson(o.toJson());
-      checkOrder(od);
+      checkOrder(od as api.Order);
     });
   });
 
@@ -3026,7 +3056,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionQueryRequest();
       var od = api.PartitionQueryRequest.fromJson(o.toJson());
-      checkPartitionQueryRequest(od);
+      checkPartitionQueryRequest(od as api.PartitionQueryRequest);
     });
   });
 
@@ -3034,7 +3064,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionQueryResponse();
       var od = api.PartitionQueryResponse.fromJson(o.toJson());
-      checkPartitionQueryResponse(od);
+      checkPartitionQueryResponse(od as api.PartitionQueryResponse);
     });
   });
 
@@ -3042,7 +3072,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrecondition();
       var od = api.Precondition.fromJson(o.toJson());
-      checkPrecondition(od);
+      checkPrecondition(od as api.Precondition);
     });
   });
 
@@ -3050,7 +3080,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjection();
       var od = api.Projection.fromJson(o.toJson());
-      checkProjection(od);
+      checkProjection(od as api.Projection);
     });
   });
 
@@ -3058,7 +3088,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryTarget();
       var od = api.QueryTarget.fromJson(o.toJson());
-      checkQueryTarget(od);
+      checkQueryTarget(od as api.QueryTarget);
     });
   });
 
@@ -3066,7 +3096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadOnly();
       var od = api.ReadOnly.fromJson(o.toJson());
-      checkReadOnly(od);
+      checkReadOnly(od as api.ReadOnly);
     });
   });
 
@@ -3074,7 +3104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadWrite();
       var od = api.ReadWrite.fromJson(o.toJson());
-      checkReadWrite(od);
+      checkReadWrite(od as api.ReadWrite);
     });
   });
 
@@ -3082,7 +3112,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRollbackRequest();
       var od = api.RollbackRequest.fromJson(o.toJson());
-      checkRollbackRequest(od);
+      checkRollbackRequest(od as api.RollbackRequest);
     });
   });
 
@@ -3090,7 +3120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunQueryRequest();
       var od = api.RunQueryRequest.fromJson(o.toJson());
-      checkRunQueryRequest(od);
+      checkRunQueryRequest(od as api.RunQueryRequest);
     });
   });
 
@@ -3098,7 +3128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunQueryResponse();
       var od = api.RunQueryResponse.fromJson(o.toJson());
-      checkRunQueryResponse(od);
+      checkRunQueryResponse(od as api.RunQueryResponse);
     });
   });
 
@@ -3106,7 +3136,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3114,7 +3144,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStructuredQuery();
       var od = api.StructuredQuery.fromJson(o.toJson());
-      checkStructuredQuery(od);
+      checkStructuredQuery(od as api.StructuredQuery);
     });
   });
 
@@ -3122,7 +3152,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTarget();
       var od = api.Target.fromJson(o.toJson());
-      checkTarget(od);
+      checkTarget(od as api.Target);
     });
   });
 
@@ -3130,7 +3160,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTargetChange();
       var od = api.TargetChange.fromJson(o.toJson());
-      checkTargetChange(od);
+      checkTargetChange(od as api.TargetChange);
     });
   });
 
@@ -3138,7 +3168,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransactionOptions();
       var od = api.TransactionOptions.fromJson(o.toJson());
-      checkTransactionOptions(od);
+      checkTransactionOptions(od as api.TransactionOptions);
     });
   });
 
@@ -3146,7 +3176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnaryFilter();
       var od = api.UnaryFilter.fromJson(o.toJson());
-      checkUnaryFilter(od);
+      checkUnaryFilter(od as api.UnaryFilter);
     });
   });
 
@@ -3154,7 +3184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValue();
       var od = api.Value.fromJson(o.toJson());
-      checkValue(od);
+      checkValue(od as api.Value);
     });
   });
 
@@ -3162,7 +3192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWrite();
       var od = api.Write.fromJson(o.toJson());
-      checkWrite(od);
+      checkWrite(od as api.Write);
     });
   });
 
@@ -3170,7 +3200,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWriteRequest();
       var od = api.WriteRequest.fromJson(o.toJson());
-      checkWriteRequest(od);
+      checkWriteRequest(od as api.WriteRequest);
     });
   });
 
@@ -3178,7 +3208,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWriteResponse();
       var od = api.WriteResponse.fromJson(o.toJson());
-      checkWriteResponse(od);
+      checkWriteResponse(od as api.WriteResponse);
     });
   });
 
@@ -3186,7 +3216,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWriteResult();
       var od = api.WriteResult.fromJson(o.toJson());
-      checkWriteResult(od);
+      checkWriteResult(od as api.WriteResult);
     });
   });
 
@@ -3198,9 +3228,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleFirestoreAdminV1ExportDocumentsRequest.fromJson(json);
-        checkGoogleFirestoreAdminV1ExportDocumentsRequest(obj);
+        var obj = api.GoogleFirestoreAdminV1ExportDocumentsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleFirestoreAdminV1ExportDocumentsRequest(
+            obj as api.GoogleFirestoreAdminV1ExportDocumentsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3240,7 +3271,8 @@
       res
           .exportDocuments(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -3251,9 +3283,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GoogleFirestoreAdminV1ImportDocumentsRequest.fromJson(json);
-        checkGoogleFirestoreAdminV1ImportDocumentsRequest(obj);
+        var obj = api.GoogleFirestoreAdminV1ImportDocumentsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleFirestoreAdminV1ImportDocumentsRequest(
+            obj as api.GoogleFirestoreAdminV1ImportDocumentsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3293,7 +3326,8 @@
       res
           .importDocuments(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -3345,7 +3379,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleFirestoreAdminV1Field(response);
+        checkGoogleFirestoreAdminV1Field(
+            response as api.GoogleFirestoreAdminV1Field);
       })));
     });
 
@@ -3407,7 +3442,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleFirestoreAdminV1ListFieldsResponse(response);
+        checkGoogleFirestoreAdminV1ListFieldsResponse(
+            response as api.GoogleFirestoreAdminV1ListFieldsResponse);
       })));
     });
 
@@ -3420,8 +3456,10 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleFirestoreAdminV1Field.fromJson(json);
-        checkGoogleFirestoreAdminV1Field(obj);
+        var obj = api.GoogleFirestoreAdminV1Field.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleFirestoreAdminV1Field(
+            obj as api.GoogleFirestoreAdminV1Field);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3464,7 +3502,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -3479,8 +3518,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleFirestoreAdminV1Index.fromJson(json);
-        checkGoogleFirestoreAdminV1Index(obj);
+        var obj = api.GoogleFirestoreAdminV1Index.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleFirestoreAdminV1Index(
+            obj as api.GoogleFirestoreAdminV1Index);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3520,7 +3561,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -3569,7 +3611,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3618,7 +3660,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleFirestoreAdminV1Index(response);
+        checkGoogleFirestoreAdminV1Index(
+            response as api.GoogleFirestoreAdminV1Index);
       })));
     });
 
@@ -3680,7 +3723,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleFirestoreAdminV1ListIndexesResponse(response);
+        checkGoogleFirestoreAdminV1ListIndexesResponse(
+            response as api.GoogleFirestoreAdminV1ListIndexesResponse);
       })));
     });
   });
@@ -3693,8 +3737,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchGetDocumentsRequest.fromJson(json);
-        checkBatchGetDocumentsRequest(obj);
+        var obj = api.BatchGetDocumentsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchGetDocumentsRequest(obj as api.BatchGetDocumentsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3734,7 +3779,8 @@
       res
           .batchGet(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetDocumentsResponse(response);
+        checkBatchGetDocumentsResponse(
+            response as api.BatchGetDocumentsResponse);
       })));
     });
 
@@ -3745,8 +3791,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchWriteRequest.fromJson(json);
-        checkBatchWriteRequest(obj);
+        var obj = api.BatchWriteRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchWriteRequest(obj as api.BatchWriteRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3786,7 +3833,7 @@
       res
           .batchWrite(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchWriteResponse(response);
+        checkBatchWriteResponse(response as api.BatchWriteResponse);
       })));
     });
 
@@ -3797,8 +3844,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BeginTransactionRequest.fromJson(json);
-        checkBeginTransactionRequest(obj);
+        var obj = api.BeginTransactionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBeginTransactionRequest(obj as api.BeginTransactionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3838,7 +3886,7 @@
       res
           .beginTransaction(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBeginTransactionResponse(response);
+        checkBeginTransactionResponse(response as api.BeginTransactionResponse);
       })));
     });
 
@@ -3849,8 +3897,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommitRequest.fromJson(json);
-        checkCommitRequest(obj);
+        var obj = api.CommitRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommitRequest(obj as api.CommitRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3890,7 +3939,7 @@
       res
           .commit(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommitResponse(response);
+        checkCommitResponse(response as api.CommitResponse);
       })));
     });
 
@@ -3904,8 +3953,9 @@
       var arg_mask_fieldPaths = buildUnnamed3302();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Document.fromJson(json);
-        checkDocument(obj);
+        var obj =
+            api.Document.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDocument(obj as api.Document);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3952,7 +4002,7 @@
               mask_fieldPaths: arg_mask_fieldPaths,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDocument(response);
+        checkDocument(response as api.Document);
       })));
     });
 
@@ -4009,7 +4059,7 @@
               currentDocument_updateTime: arg_currentDocument_updateTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4070,7 +4120,7 @@
               transaction: arg_transaction,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDocument(response);
+        checkDocument(response as api.Document);
       })));
     });
 
@@ -4148,7 +4198,7 @@
               transaction: arg_transaction,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDocumentsResponse(response);
+        checkListDocumentsResponse(response as api.ListDocumentsResponse);
       })));
     });
 
@@ -4159,8 +4209,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListCollectionIdsRequest.fromJson(json);
-        checkListCollectionIdsRequest(obj);
+        var obj = api.ListCollectionIdsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListCollectionIdsRequest(obj as api.ListCollectionIdsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4200,7 +4251,8 @@
       res
           .listCollectionIds(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCollectionIdsResponse(response);
+        checkListCollectionIdsResponse(
+            response as api.ListCollectionIdsResponse);
       })));
     });
 
@@ -4211,8 +4263,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListenRequest.fromJson(json);
-        checkListenRequest(obj);
+        var obj = api.ListenRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListenRequest(obj as api.ListenRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4252,7 +4305,7 @@
       res
           .listen(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListenResponse(response);
+        checkListenResponse(response as api.ListenResponse);
       })));
     });
 
@@ -4263,8 +4316,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PartitionQueryRequest.fromJson(json);
-        checkPartitionQueryRequest(obj);
+        var obj = api.PartitionQueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPartitionQueryRequest(obj as api.PartitionQueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4304,7 +4358,7 @@
       res
           .partitionQuery(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPartitionQueryResponse(response);
+        checkPartitionQueryResponse(response as api.PartitionQueryResponse);
       })));
     });
 
@@ -4319,8 +4373,9 @@
       var arg_updateMask_fieldPaths = buildUnnamed3306();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Document.fromJson(json);
-        checkDocument(obj);
+        var obj =
+            api.Document.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDocument(obj as api.Document);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4373,7 +4428,7 @@
               updateMask_fieldPaths: arg_updateMask_fieldPaths,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDocument(response);
+        checkDocument(response as api.Document);
       })));
     });
 
@@ -4384,8 +4439,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RollbackRequest.fromJson(json);
-        checkRollbackRequest(obj);
+        var obj = api.RollbackRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRollbackRequest(obj as api.RollbackRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4425,7 +4481,7 @@
       res
           .rollback(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4436,8 +4492,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RunQueryRequest.fromJson(json);
-        checkRunQueryRequest(obj);
+        var obj = api.RunQueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRunQueryRequest(obj as api.RunQueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4477,7 +4534,7 @@
       res
           .runQuery(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRunQueryResponse(response);
+        checkRunQueryResponse(response as api.RunQueryResponse);
       })));
     });
 
@@ -4488,8 +4545,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WriteRequest.fromJson(json);
-        checkWriteRequest(obj);
+        var obj = api.WriteRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWriteRequest(obj as api.WriteRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4529,7 +4587,7 @@
       res
           .write(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWriteResponse(response);
+        checkWriteResponse(response as api.WriteResponse);
       })));
     });
   });
@@ -4542,8 +4600,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleLongrunningCancelOperationRequest.fromJson(json);
-        checkGoogleLongrunningCancelOperationRequest(obj);
+        var obj = api.GoogleLongrunningCancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleLongrunningCancelOperationRequest(
+            obj as api.GoogleLongrunningCancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4583,7 +4643,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4631,7 +4691,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4679,7 +4739,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -4740,7 +4801,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningListOperationsResponse(response);
+        checkGoogleLongrunningListOperationsResponse(
+            response as api.GoogleLongrunningListOperationsResponse);
       })));
     });
   });
@@ -4790,7 +4852,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -4850,7 +4912,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/fitness/v1_test.dart b/generated/googleapis/test/fitness/v1_test.dart
index 670287d..8495938 100644
--- a/generated/googleapis/test/fitness/v1_test.dart
+++ b/generated/googleapis/test/fitness/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed1312(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataset(o[0]);
-  checkDataset(o[1]);
+  checkDataset(o[0] as api.Dataset);
+  checkDataset(o[1] as api.Dataset);
 }
 
 core.int buildCounterAggregateBucket = 0;
@@ -109,7 +109,7 @@
     unittest.expect(o.activity, unittest.equals(42));
     checkUnnamed1312(o.dataset);
     unittest.expect(o.endTimeMillis, unittest.equals('foo'));
-    checkSession(o.session);
+    checkSession(o.session as api.Session);
     unittest.expect(o.startTimeMillis, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -146,8 +146,8 @@
 
 void checkUnnamed1313(core.List<api.AggregateBy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAggregateBy(o[0]);
-  checkAggregateBy(o[1]);
+  checkAggregateBy(o[0] as api.AggregateBy);
+  checkAggregateBy(o[1] as api.AggregateBy);
 }
 
 core.List<core.String> buildUnnamed1314() {
@@ -185,10 +185,10 @@
   buildCounterAggregateRequest++;
   if (buildCounterAggregateRequest < 3) {
     checkUnnamed1313(o.aggregateBy);
-    checkBucketByActivity(o.bucketByActivitySegment);
-    checkBucketByActivity(o.bucketByActivityType);
-    checkBucketBySession(o.bucketBySession);
-    checkBucketByTime(o.bucketByTime);
+    checkBucketByActivity(o.bucketByActivitySegment as api.BucketByActivity);
+    checkBucketByActivity(o.bucketByActivityType as api.BucketByActivity);
+    checkBucketBySession(o.bucketBySession as api.BucketBySession);
+    checkBucketByTime(o.bucketByTime as api.BucketByTime);
     unittest.expect(o.endTimeMillis, unittest.equals('foo'));
     checkUnnamed1314(o.filteredDataQualityStandard);
     unittest.expect(o.startTimeMillis, unittest.equals('foo'));
@@ -205,8 +205,8 @@
 
 void checkUnnamed1315(core.List<api.AggregateBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAggregateBucket(o[0]);
-  checkAggregateBucket(o[1]);
+  checkAggregateBucket(o[0] as api.AggregateBucket);
+  checkAggregateBucket(o[1] as api.AggregateBucket);
 }
 
 core.int buildCounterAggregateResponse = 0;
@@ -309,7 +309,7 @@
   buildCounterBucketByTime++;
   if (buildCounterBucketByTime < 3) {
     unittest.expect(o.durationMillis, unittest.equals('foo'));
-    checkBucketByTimePeriod(o.period);
+    checkBucketByTimePeriod(o.period as api.BucketByTimePeriod);
   }
   buildCounterBucketByTime--;
 }
@@ -346,8 +346,8 @@
 
 void checkUnnamed1316(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o[0]);
-  checkValue(o[1]);
+  checkValue(o[0] as api.Value);
+  checkValue(o[1] as api.Value);
 }
 
 core.int buildCounterDataPoint = 0;
@@ -417,12 +417,12 @@
 void checkDataSource(api.DataSource o) {
   buildCounterDataSource++;
   if (buildCounterDataSource < 3) {
-    checkApplication(o.application);
+    checkApplication(o.application as api.Application);
     checkUnnamed1317(o.dataQualityStandard);
     unittest.expect(o.dataStreamId, unittest.equals('foo'));
     unittest.expect(o.dataStreamName, unittest.equals('foo'));
-    checkDataType(o.dataType);
-    checkDevice(o.device);
+    checkDataType(o.dataType as api.DataType);
+    checkDevice(o.device as api.Device);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -438,8 +438,8 @@
 
 void checkUnnamed1318(core.List<api.DataTypeField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataTypeField(o[0]);
-  checkDataTypeField(o[1]);
+  checkDataTypeField(o[0] as api.DataTypeField);
+  checkDataTypeField(o[1] as api.DataTypeField);
 }
 
 core.int buildCounterDataType = 0;
@@ -495,8 +495,8 @@
 
 void checkUnnamed1319(core.List<api.DataPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataPoint(o[0]);
-  checkDataPoint(o[1]);
+  checkDataPoint(o[0] as api.DataPoint);
+  checkDataPoint(o[1] as api.DataPoint);
 }
 
 core.int buildCounterDataset = 0;
@@ -562,8 +562,8 @@
 
 void checkUnnamed1320(core.List<api.DataPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataPoint(o[0]);
-  checkDataPoint(o[1]);
+  checkDataPoint(o[0] as api.DataPoint);
+  checkDataPoint(o[1] as api.DataPoint);
 }
 
 core.List<api.DataPoint> buildUnnamed1321() {
@@ -575,8 +575,8 @@
 
 void checkUnnamed1321(core.List<api.DataPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataPoint(o[0]);
-  checkDataPoint(o[1]);
+  checkDataPoint(o[0] as api.DataPoint);
+  checkDataPoint(o[1] as api.DataPoint);
 }
 
 core.int buildCounterListDataPointChangesResponse = 0;
@@ -613,8 +613,8 @@
 
 void checkUnnamed1322(core.List<api.DataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSource(o[0]);
-  checkDataSource(o[1]);
+  checkDataSource(o[0] as api.DataSource);
+  checkDataSource(o[1] as api.DataSource);
 }
 
 core.int buildCounterListDataSourcesResponse = 0;
@@ -645,8 +645,8 @@
 
 void checkUnnamed1323(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSession(o[0]);
-  checkSession(o[1]);
+  checkSession(o[0] as api.Session);
+  checkSession(o[1] as api.Session);
 }
 
 core.List<api.Session> buildUnnamed1324() {
@@ -658,8 +658,8 @@
 
 void checkUnnamed1324(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSession(o[0]);
-  checkSession(o[1]);
+  checkSession(o[0] as api.Session);
+  checkSession(o[1] as api.Session);
 }
 
 core.int buildCounterListSessionsResponse = 0;
@@ -730,7 +730,7 @@
   if (buildCounterSession < 3) {
     unittest.expect(o.activeTimeMillis, unittest.equals('foo'));
     unittest.expect(o.activityType, unittest.equals(42));
-    checkApplication(o.application);
+    checkApplication(o.application as api.Application);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.endTimeMillis, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -750,8 +750,8 @@
 
 void checkUnnamed1325(core.List<api.ValueMapValEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValueMapValEntry(o[0]);
-  checkValueMapValEntry(o[1]);
+  checkValueMapValEntry(o[0] as api.ValueMapValEntry);
+  checkValueMapValEntry(o[1] as api.ValueMapValEntry);
 }
 
 core.int buildCounterValue = 0;
@@ -795,7 +795,7 @@
   buildCounterValueMapValEntry++;
   if (buildCounterValueMapValEntry < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkMapValue(o.value);
+    checkMapValue(o.value as api.MapValue);
   }
   buildCounterValueMapValEntry--;
 }
@@ -831,7 +831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAggregateBucket();
       var od = api.AggregateBucket.fromJson(o.toJson());
-      checkAggregateBucket(od);
+      checkAggregateBucket(od as api.AggregateBucket);
     });
   });
 
@@ -839,7 +839,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAggregateBy();
       var od = api.AggregateBy.fromJson(o.toJson());
-      checkAggregateBy(od);
+      checkAggregateBy(od as api.AggregateBy);
     });
   });
 
@@ -847,7 +847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAggregateRequest();
       var od = api.AggregateRequest.fromJson(o.toJson());
-      checkAggregateRequest(od);
+      checkAggregateRequest(od as api.AggregateRequest);
     });
   });
 
@@ -855,7 +855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAggregateResponse();
       var od = api.AggregateResponse.fromJson(o.toJson());
-      checkAggregateResponse(od);
+      checkAggregateResponse(od as api.AggregateResponse);
     });
   });
 
@@ -863,7 +863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplication();
       var od = api.Application.fromJson(o.toJson());
-      checkApplication(od);
+      checkApplication(od as api.Application);
     });
   });
 
@@ -871,7 +871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketByActivity();
       var od = api.BucketByActivity.fromJson(o.toJson());
-      checkBucketByActivity(od);
+      checkBucketByActivity(od as api.BucketByActivity);
     });
   });
 
@@ -879,7 +879,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketBySession();
       var od = api.BucketBySession.fromJson(o.toJson());
-      checkBucketBySession(od);
+      checkBucketBySession(od as api.BucketBySession);
     });
   });
 
@@ -887,7 +887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketByTime();
       var od = api.BucketByTime.fromJson(o.toJson());
-      checkBucketByTime(od);
+      checkBucketByTime(od as api.BucketByTime);
     });
   });
 
@@ -895,7 +895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketByTimePeriod();
       var od = api.BucketByTimePeriod.fromJson(o.toJson());
-      checkBucketByTimePeriod(od);
+      checkBucketByTimePeriod(od as api.BucketByTimePeriod);
     });
   });
 
@@ -903,7 +903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataPoint();
       var od = api.DataPoint.fromJson(o.toJson());
-      checkDataPoint(od);
+      checkDataPoint(od as api.DataPoint);
     });
   });
 
@@ -911,7 +911,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSource();
       var od = api.DataSource.fromJson(o.toJson());
-      checkDataSource(od);
+      checkDataSource(od as api.DataSource);
     });
   });
 
@@ -919,7 +919,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataType();
       var od = api.DataType.fromJson(o.toJson());
-      checkDataType(od);
+      checkDataType(od as api.DataType);
     });
   });
 
@@ -927,7 +927,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataTypeField();
       var od = api.DataTypeField.fromJson(o.toJson());
-      checkDataTypeField(od);
+      checkDataTypeField(od as api.DataTypeField);
     });
   });
 
@@ -935,7 +935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataset();
       var od = api.Dataset.fromJson(o.toJson());
-      checkDataset(od);
+      checkDataset(od as api.Dataset);
     });
   });
 
@@ -943,7 +943,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevice();
       var od = api.Device.fromJson(o.toJson());
-      checkDevice(od);
+      checkDevice(od as api.Device);
     });
   });
 
@@ -951,7 +951,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDataPointChangesResponse();
       var od = api.ListDataPointChangesResponse.fromJson(o.toJson());
-      checkListDataPointChangesResponse(od);
+      checkListDataPointChangesResponse(od as api.ListDataPointChangesResponse);
     });
   });
 
@@ -959,7 +959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDataSourcesResponse();
       var od = api.ListDataSourcesResponse.fromJson(o.toJson());
-      checkListDataSourcesResponse(od);
+      checkListDataSourcesResponse(od as api.ListDataSourcesResponse);
     });
   });
 
@@ -967,7 +967,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSessionsResponse();
       var od = api.ListSessionsResponse.fromJson(o.toJson());
-      checkListSessionsResponse(od);
+      checkListSessionsResponse(od as api.ListSessionsResponse);
     });
   });
 
@@ -975,7 +975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMapValue();
       var od = api.MapValue.fromJson(o.toJson());
-      checkMapValue(od);
+      checkMapValue(od as api.MapValue);
     });
   });
 
@@ -983,7 +983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSession();
       var od = api.Session.fromJson(o.toJson());
-      checkSession(od);
+      checkSession(od as api.Session);
     });
   });
 
@@ -991,7 +991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValue();
       var od = api.Value.fromJson(o.toJson());
-      checkValue(od);
+      checkValue(od as api.Value);
     });
   });
 
@@ -999,7 +999,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValueMapValEntry();
       var od = api.ValueMapValEntry.fromJson(o.toJson());
-      checkValueMapValEntry(od);
+      checkValueMapValEntry(od as api.ValueMapValEntry);
     });
   });
 
@@ -1011,8 +1011,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DataSource.fromJson(json);
-        checkDataSource(obj);
+        var obj = api.DataSource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDataSource(obj as api.DataSource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1048,7 +1049,7 @@
       res
           .create(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataSource(response);
+        checkDataSource(response as api.DataSource);
       })));
     });
 
@@ -1093,7 +1094,7 @@
       res
           .delete(arg_userId, arg_dataSourceId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataSource(response);
+        checkDataSource(response as api.DataSource);
       })));
     });
 
@@ -1138,7 +1139,7 @@
       res
           .get(arg_userId, arg_dataSourceId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataSource(response);
+        checkDataSource(response as api.DataSource);
       })));
     });
 
@@ -1186,7 +1187,7 @@
           .list(arg_userId,
               dataTypeName: arg_dataTypeName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDataSourcesResponse(response);
+        checkListDataSourcesResponse(response as api.ListDataSourcesResponse);
       })));
     });
 
@@ -1198,8 +1199,9 @@
       var arg_dataSourceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DataSource.fromJson(json);
-        checkDataSource(obj);
+        var obj = api.DataSource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDataSource(obj as api.DataSource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1236,7 +1238,7 @@
           .update(arg_request, arg_userId, arg_dataSourceId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataSource(response);
+        checkDataSource(response as api.DataSource);
       })));
     });
   });
@@ -1290,7 +1292,8 @@
           .list(arg_userId, arg_dataSourceId,
               limit: arg_limit, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDataPointChangesResponse(response);
+        checkListDataPointChangesResponse(
+            response as api.ListDataPointChangesResponse);
       })));
     });
   });
@@ -1398,7 +1401,7 @@
           .get(arg_userId, arg_dataSourceId, arg_datasetId,
               limit: arg_limit, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
 
@@ -1412,8 +1415,9 @@
       var arg_currentTimeMillis = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Dataset.fromJson(json);
-        checkDataset(obj);
+        var obj =
+            api.Dataset.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDataset(obj as api.Dataset);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1452,7 +1456,7 @@
           .patch(arg_request, arg_userId, arg_dataSourceId, arg_datasetId,
               currentTimeMillis: arg_currentTimeMillis, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
   });
@@ -1465,8 +1469,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AggregateRequest.fromJson(json);
-        checkAggregateRequest(obj);
+        var obj = api.AggregateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAggregateRequest(obj as api.AggregateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1502,7 +1507,7 @@
       res
           .aggregate(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAggregateResponse(response);
+        checkAggregateResponse(response as api.AggregateResponse);
       })));
     });
   });
@@ -1616,7 +1621,7 @@
               startTime: arg_startTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSessionsResponse(response);
+        checkListSessionsResponse(response as api.ListSessionsResponse);
       })));
     });
 
@@ -1629,8 +1634,9 @@
       var arg_currentTimeMillis = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Session.fromJson(json);
-        checkSession(obj);
+        var obj =
+            api.Session.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSession(obj as api.Session);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1669,7 +1675,7 @@
           .update(arg_request, arg_userId, arg_sessionId,
               currentTimeMillis: arg_currentTimeMillis, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSession(response);
+        checkSession(response as api.Session);
       })));
     });
   });
diff --git a/generated/googleapis/test/games/v1_test.dart b/generated/googleapis/test/games/v1_test.dart
index 9f13395..5623d56 100644
--- a/generated/googleapis/test/games/v1_test.dart
+++ b/generated/googleapis/test/games/v1_test.dart
@@ -126,8 +126,8 @@
 
 void checkUnnamed2709(core.List<api.AchievementDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAchievementDefinition(o[0]);
-  checkAchievementDefinition(o[1]);
+  checkAchievementDefinition(o[0] as api.AchievementDefinition);
+  checkAchievementDefinition(o[1] as api.AchievementDefinition);
 }
 
 core.int buildCounterAchievementDefinitionsListResponse = 0;
@@ -254,8 +254,8 @@
 
 void checkUnnamed2710(core.List<api.AchievementUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAchievementUpdateRequest(o[0]);
-  checkAchievementUpdateRequest(o[1]);
+  checkAchievementUpdateRequest(o[0] as api.AchievementUpdateRequest);
+  checkAchievementUpdateRequest(o[1] as api.AchievementUpdateRequest);
 }
 
 core.int buildCounterAchievementUpdateMultipleRequest = 0;
@@ -289,8 +289,8 @@
 
 void checkUnnamed2711(core.List<api.AchievementUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAchievementUpdateResponse(o[0]);
-  checkAchievementUpdateResponse(o[1]);
+  checkAchievementUpdateResponse(o[0] as api.AchievementUpdateResponse);
+  checkAchievementUpdateResponse(o[1] as api.AchievementUpdateResponse);
 }
 
 core.int buildCounterAchievementUpdateMultipleResponse = 0;
@@ -334,9 +334,11 @@
   buildCounterAchievementUpdateRequest++;
   if (buildCounterAchievementUpdateRequest < 3) {
     unittest.expect(o.achievementId, unittest.equals('foo'));
-    checkGamesAchievementIncrement(o.incrementPayload);
+    checkGamesAchievementIncrement(
+        o.incrementPayload as api.GamesAchievementIncrement);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkGamesAchievementSetStepsAtLeast(o.setStepsAtLeastPayload);
+    checkGamesAchievementSetStepsAtLeast(
+        o.setStepsAtLeastPayload as api.GamesAchievementSetStepsAtLeast);
     unittest.expect(o.updateType, unittest.equals('foo'));
   }
   buildCounterAchievementUpdateRequest--;
@@ -380,8 +382,8 @@
 
 void checkUnnamed2712(core.List<api.ImageAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImageAsset(o[0]);
-  checkImageAsset(o[1]);
+  checkImageAsset(o[0] as api.ImageAsset);
+  checkImageAsset(o[1] as api.ImageAsset);
 }
 
 core.List<core.String> buildUnnamed2713() {
@@ -406,8 +408,8 @@
 
 void checkUnnamed2714(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.int buildCounterApplication = 0;
@@ -439,7 +441,7 @@
     unittest.expect(o.achievementCount, unittest.equals(42));
     checkUnnamed2712(o.assets);
     unittest.expect(o.author, unittest.equals('foo'));
-    checkApplicationCategory(o.category);
+    checkApplicationCategory(o.category as api.ApplicationCategory);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed2713(o.enabledFeatures);
     unittest.expect(o.id, unittest.equals('foo'));
@@ -531,8 +533,8 @@
 
 void checkUnnamed2715(core.List<api.Category> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCategory(o[0]);
-  checkCategory(o[1]);
+  checkCategory(o[0] as api.Category);
+  checkCategory(o[1] as api.Category);
 }
 
 core.int buildCounterCategoryListResponse = 0;
@@ -576,7 +578,7 @@
   if (buildCounterEventBatchRecordFailure < 3) {
     unittest.expect(o.failureCause, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkEventPeriodRange(o.range);
+    checkEventPeriodRange(o.range as api.EventPeriodRange);
   }
   buildCounterEventBatchRecordFailure--;
 }
@@ -611,8 +613,8 @@
 
 void checkUnnamed2716(core.List<api.EventChild> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventChild(o[0]);
-  checkEventChild(o[1]);
+  checkEventChild(o[0] as api.EventChild);
+  checkEventChild(o[1] as api.EventChild);
 }
 
 core.int buildCounterEventDefinition = 0;
@@ -657,8 +659,8 @@
 
 void checkUnnamed2717(core.List<api.EventDefinition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventDefinition(o[0]);
-  checkEventDefinition(o[1]);
+  checkEventDefinition(o[0] as api.EventDefinition);
+  checkEventDefinition(o[1] as api.EventDefinition);
 }
 
 core.int buildCounterEventDefinitionListResponse = 0;
@@ -716,8 +718,8 @@
 
 void checkUnnamed2718(core.List<api.EventUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventUpdateRequest(o[0]);
-  checkEventUpdateRequest(o[1]);
+  checkEventUpdateRequest(o[0] as api.EventUpdateRequest);
+  checkEventUpdateRequest(o[1] as api.EventUpdateRequest);
 }
 
 core.int buildCounterEventPeriodUpdate = 0;
@@ -737,7 +739,7 @@
   buildCounterEventPeriodUpdate++;
   if (buildCounterEventPeriodUpdate < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkEventPeriodRange(o.timePeriod);
+    checkEventPeriodRange(o.timePeriod as api.EventPeriodRange);
     checkUnnamed2718(o.updates);
   }
   buildCounterEventPeriodUpdate--;
@@ -775,8 +777,8 @@
 
 void checkUnnamed2719(core.List<api.EventPeriodUpdate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventPeriodUpdate(o[0]);
-  checkEventPeriodUpdate(o[1]);
+  checkEventPeriodUpdate(o[0] as api.EventPeriodUpdate);
+  checkEventPeriodUpdate(o[1] as api.EventPeriodUpdate);
 }
 
 core.int buildCounterEventRecordRequest = 0;
@@ -836,8 +838,8 @@
 
 void checkUnnamed2720(core.List<api.EventBatchRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventBatchRecordFailure(o[0]);
-  checkEventBatchRecordFailure(o[1]);
+  checkEventBatchRecordFailure(o[0] as api.EventBatchRecordFailure);
+  checkEventBatchRecordFailure(o[1] as api.EventBatchRecordFailure);
 }
 
 core.List<api.EventRecordFailure> buildUnnamed2721() {
@@ -849,8 +851,8 @@
 
 void checkUnnamed2721(core.List<api.EventRecordFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEventRecordFailure(o[0]);
-  checkEventRecordFailure(o[1]);
+  checkEventRecordFailure(o[0] as api.EventRecordFailure);
+  checkEventRecordFailure(o[1] as api.EventRecordFailure);
 }
 
 core.List<api.PlayerEvent> buildUnnamed2722() {
@@ -862,8 +864,8 @@
 
 void checkUnnamed2722(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerEvent(o[0]);
-  checkPlayerEvent(o[1]);
+  checkPlayerEvent(o[0] as api.PlayerEvent);
+  checkPlayerEvent(o[1] as api.PlayerEvent);
 }
 
 core.int buildCounterEventUpdateResponse = 0;
@@ -986,14 +988,15 @@
   buildCounterInstance++;
   if (buildCounterInstance < 3) {
     unittest.expect(o.acquisitionUri, unittest.equals('foo'));
-    checkInstanceAndroidDetails(o.androidInstance);
-    checkInstanceIosDetails(o.iosInstance);
+    checkInstanceAndroidDetails(
+        o.androidInstance as api.InstanceAndroidDetails);
+    checkInstanceIosDetails(o.iosInstance as api.InstanceIosDetails);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.platformType, unittest.equals('foo'));
     unittest.expect(o.realtimePlay, unittest.isTrue);
     unittest.expect(o.turnBasedPlay, unittest.isTrue);
-    checkInstanceWebDetails(o.webInstance);
+    checkInstanceWebDetails(o.webInstance as api.InstanceWebDetails);
   }
   buildCounterInstance--;
 }
@@ -1131,7 +1134,7 @@
     unittest.expect(o.formattedScore, unittest.equals('foo'));
     unittest.expect(o.formattedScoreRank, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPlayer(o.player);
+    checkPlayer(o.player as api.Player);
     unittest.expect(o.scoreRank, unittest.equals('foo'));
     unittest.expect(o.scoreTag, unittest.equals('foo'));
     unittest.expect(o.scoreValue, unittest.equals('foo'));
@@ -1150,8 +1153,8 @@
 
 void checkUnnamed2723(core.List<api.Leaderboard> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLeaderboard(o[0]);
-  checkLeaderboard(o[1]);
+  checkLeaderboard(o[0] as api.Leaderboard);
+  checkLeaderboard(o[1] as api.Leaderboard);
 }
 
 core.int buildCounterLeaderboardListResponse = 0;
@@ -1213,8 +1216,8 @@
 
 void checkUnnamed2724(core.List<api.LeaderboardEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLeaderboardEntry(o[0]);
-  checkLeaderboardEntry(o[1]);
+  checkLeaderboardEntry(o[0] as api.LeaderboardEntry);
+  checkLeaderboardEntry(o[1] as api.LeaderboardEntry);
 }
 
 core.int buildCounterLeaderboardScores = 0;
@@ -1240,7 +1243,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.numScores, unittest.equals('foo'));
-    checkLeaderboardEntry(o.playerScore);
+    checkLeaderboardEntry(o.playerScore as api.LeaderboardEntry);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
   }
   buildCounterLeaderboardScores--;
@@ -1255,8 +1258,8 @@
 
 void checkUnnamed2725(core.List<api.PlayerLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerLevel(o[0]);
-  checkPlayerLevel(o[1]);
+  checkPlayerLevel(o[0] as api.PlayerLevel);
+  checkPlayerLevel(o[1] as api.PlayerLevel);
 }
 
 core.int buildCounterMetagameConfig = 0;
@@ -1332,13 +1335,13 @@
     unittest.expect(o.bannerUrlLandscape, unittest.equals('foo'));
     unittest.expect(o.bannerUrlPortrait, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkPlayerExperienceInfo(o.experienceInfo);
+    checkPlayerExperienceInfo(o.experienceInfo as api.PlayerExperienceInfo);
     unittest.expect(o.friendStatus, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPlayerName(o.name);
+    checkPlayerName(o.name as api.PlayerName);
     unittest.expect(o.originalPlayerId, unittest.equals('foo'));
     unittest.expect(o.playerId, unittest.equals('foo'));
-    checkProfileSettings(o.profileSettings);
+    checkProfileSettings(o.profileSettings as api.ProfileSettings);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterPlayer--;
@@ -1384,8 +1387,8 @@
 
 void checkUnnamed2726(core.List<api.PlayerAchievement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerAchievement(o[0]);
-  checkPlayerAchievement(o[1]);
+  checkPlayerAchievement(o[0] as api.PlayerAchievement);
+  checkPlayerAchievement(o[1] as api.PlayerAchievement);
 }
 
 core.int buildCounterPlayerAchievementListResponse = 0;
@@ -1447,8 +1450,8 @@
 
 void checkUnnamed2727(core.List<api.PlayerEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerEvent(o[0]);
-  checkPlayerEvent(o[1]);
+  checkPlayerEvent(o[0] as api.PlayerEvent);
+  checkPlayerEvent(o[1] as api.PlayerEvent);
 }
 
 core.int buildCounterPlayerEventListResponse = 0;
@@ -1493,10 +1496,10 @@
   buildCounterPlayerExperienceInfo++;
   if (buildCounterPlayerExperienceInfo < 3) {
     unittest.expect(o.currentExperiencePoints, unittest.equals('foo'));
-    checkPlayerLevel(o.currentLevel);
+    checkPlayerLevel(o.currentLevel as api.PlayerLevel);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.lastLevelUpTimestampMillis, unittest.equals('foo'));
-    checkPlayerLevel(o.nextLevel);
+    checkPlayerLevel(o.nextLevel as api.PlayerLevel);
   }
   buildCounterPlayerExperienceInfo--;
 }
@@ -1524,14 +1527,14 @@
 void checkPlayerLeaderboardScore(api.PlayerLeaderboardScore o) {
   buildCounterPlayerLeaderboardScore++;
   if (buildCounterPlayerLeaderboardScore < 3) {
-    checkLeaderboardScoreRank(o.friendsRank);
+    checkLeaderboardScoreRank(o.friendsRank as api.LeaderboardScoreRank);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.leaderboardId, unittest.equals('foo'));
-    checkLeaderboardScoreRank(o.publicRank);
+    checkLeaderboardScoreRank(o.publicRank as api.LeaderboardScoreRank);
     unittest.expect(o.scoreString, unittest.equals('foo'));
     unittest.expect(o.scoreTag, unittest.equals('foo'));
     unittest.expect(o.scoreValue, unittest.equals('foo'));
-    checkLeaderboardScoreRank(o.socialRank);
+    checkLeaderboardScoreRank(o.socialRank as api.LeaderboardScoreRank);
     unittest.expect(o.timeSpan, unittest.equals('foo'));
     unittest.expect(o.writeTimestamp, unittest.equals('foo'));
   }
@@ -1547,8 +1550,8 @@
 
 void checkUnnamed2728(core.List<api.PlayerLeaderboardScore> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerLeaderboardScore(o[0]);
-  checkPlayerLeaderboardScore(o[1]);
+  checkPlayerLeaderboardScore(o[0] as api.PlayerLeaderboardScore);
+  checkPlayerLeaderboardScore(o[1] as api.PlayerLeaderboardScore);
 }
 
 core.int buildCounterPlayerLeaderboardScoreListResponse = 0;
@@ -1573,7 +1576,7 @@
     checkUnnamed2728(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPlayer(o.player);
+    checkPlayer(o.player as api.Player);
   }
   buildCounterPlayerLeaderboardScoreListResponse--;
 }
@@ -1612,8 +1615,8 @@
 
 void checkUnnamed2729(core.List<api.Player> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayer(o[0]);
-  checkPlayer(o[1]);
+  checkPlayer(o[0] as api.Player);
+  checkPlayer(o[1] as api.Player);
 }
 
 core.int buildCounterPlayerListResponse = 0;
@@ -1675,8 +1678,8 @@
 
 void checkUnnamed2730(core.List<api.PlayerScoreResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerScoreResponse(o[0]);
-  checkPlayerScoreResponse(o[1]);
+  checkPlayerScoreResponse(o[0] as api.PlayerScoreResponse);
+  checkPlayerScoreResponse(o[1] as api.PlayerScoreResponse);
 }
 
 core.int buildCounterPlayerScoreListResponse = 0;
@@ -1722,8 +1725,8 @@
 
 void checkUnnamed2732(core.List<api.PlayerScore> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerScore(o[0]);
-  checkPlayerScore(o[1]);
+  checkPlayerScore(o[0] as api.PlayerScore);
+  checkPlayerScore(o[1] as api.PlayerScore);
 }
 
 core.int buildCounterPlayerScoreResponse = 0;
@@ -1764,8 +1767,8 @@
 
 void checkUnnamed2733(core.List<api.ScoreSubmission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkScoreSubmission(o[0]);
-  checkScoreSubmission(o[1]);
+  checkScoreSubmission(o[0] as api.ScoreSubmission);
+  checkScoreSubmission(o[1] as api.ScoreSubmission);
 }
 
 core.int buildCounterPlayerScoreSubmissionList = 0;
@@ -1886,7 +1889,7 @@
 void checkSnapshot(api.Snapshot o) {
   buildCounterSnapshot++;
   if (buildCounterSnapshot < 3) {
-    checkSnapshotImage(o.coverImage);
+    checkSnapshotImage(o.coverImage as api.SnapshotImage);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.driveId, unittest.equals('foo'));
     unittest.expect(o.durationMillis, unittest.equals('foo'));
@@ -1937,8 +1940,8 @@
 
 void checkUnnamed2734(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSnapshot(o[0]);
-  checkSnapshot(o[1]);
+  checkSnapshot(o[0] as api.Snapshot);
+  checkSnapshot(o[1] as api.Snapshot);
 }
 
 core.int buildCounterSnapshotListResponse = 0;
@@ -2008,7 +2011,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementDefinition();
       var od = api.AchievementDefinition.fromJson(o.toJson());
-      checkAchievementDefinition(od);
+      checkAchievementDefinition(od as api.AchievementDefinition);
     });
   });
 
@@ -2016,7 +2019,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementDefinitionsListResponse();
       var od = api.AchievementDefinitionsListResponse.fromJson(o.toJson());
-      checkAchievementDefinitionsListResponse(od);
+      checkAchievementDefinitionsListResponse(
+          od as api.AchievementDefinitionsListResponse);
     });
   });
 
@@ -2024,7 +2028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementIncrementResponse();
       var od = api.AchievementIncrementResponse.fromJson(o.toJson());
-      checkAchievementIncrementResponse(od);
+      checkAchievementIncrementResponse(od as api.AchievementIncrementResponse);
     });
   });
 
@@ -2032,7 +2036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementRevealResponse();
       var od = api.AchievementRevealResponse.fromJson(o.toJson());
-      checkAchievementRevealResponse(od);
+      checkAchievementRevealResponse(od as api.AchievementRevealResponse);
     });
   });
 
@@ -2040,7 +2044,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementSetStepsAtLeastResponse();
       var od = api.AchievementSetStepsAtLeastResponse.fromJson(o.toJson());
-      checkAchievementSetStepsAtLeastResponse(od);
+      checkAchievementSetStepsAtLeastResponse(
+          od as api.AchievementSetStepsAtLeastResponse);
     });
   });
 
@@ -2048,7 +2053,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementUnlockResponse();
       var od = api.AchievementUnlockResponse.fromJson(o.toJson());
-      checkAchievementUnlockResponse(od);
+      checkAchievementUnlockResponse(od as api.AchievementUnlockResponse);
     });
   });
 
@@ -2056,7 +2061,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementUpdateMultipleRequest();
       var od = api.AchievementUpdateMultipleRequest.fromJson(o.toJson());
-      checkAchievementUpdateMultipleRequest(od);
+      checkAchievementUpdateMultipleRequest(
+          od as api.AchievementUpdateMultipleRequest);
     });
   });
 
@@ -2064,7 +2070,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementUpdateMultipleResponse();
       var od = api.AchievementUpdateMultipleResponse.fromJson(o.toJson());
-      checkAchievementUpdateMultipleResponse(od);
+      checkAchievementUpdateMultipleResponse(
+          od as api.AchievementUpdateMultipleResponse);
     });
   });
 
@@ -2072,7 +2079,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementUpdateRequest();
       var od = api.AchievementUpdateRequest.fromJson(o.toJson());
-      checkAchievementUpdateRequest(od);
+      checkAchievementUpdateRequest(od as api.AchievementUpdateRequest);
     });
   });
 
@@ -2080,7 +2087,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementUpdateResponse();
       var od = api.AchievementUpdateResponse.fromJson(o.toJson());
-      checkAchievementUpdateResponse(od);
+      checkAchievementUpdateResponse(od as api.AchievementUpdateResponse);
     });
   });
 
@@ -2088,7 +2095,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplication();
       var od = api.Application.fromJson(o.toJson());
-      checkApplication(od);
+      checkApplication(od as api.Application);
     });
   });
 
@@ -2096,7 +2103,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationCategory();
       var od = api.ApplicationCategory.fromJson(o.toJson());
-      checkApplicationCategory(od);
+      checkApplicationCategory(od as api.ApplicationCategory);
     });
   });
 
@@ -2104,7 +2111,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationVerifyResponse();
       var od = api.ApplicationVerifyResponse.fromJson(o.toJson());
-      checkApplicationVerifyResponse(od);
+      checkApplicationVerifyResponse(od as api.ApplicationVerifyResponse);
     });
   });
 
@@ -2112,7 +2119,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategory();
       var od = api.Category.fromJson(o.toJson());
-      checkCategory(od);
+      checkCategory(od as api.Category);
     });
   });
 
@@ -2120,7 +2127,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategoryListResponse();
       var od = api.CategoryListResponse.fromJson(o.toJson());
-      checkCategoryListResponse(od);
+      checkCategoryListResponse(od as api.CategoryListResponse);
     });
   });
 
@@ -2128,7 +2135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventBatchRecordFailure();
       var od = api.EventBatchRecordFailure.fromJson(o.toJson());
-      checkEventBatchRecordFailure(od);
+      checkEventBatchRecordFailure(od as api.EventBatchRecordFailure);
     });
   });
 
@@ -2136,7 +2143,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventChild();
       var od = api.EventChild.fromJson(o.toJson());
-      checkEventChild(od);
+      checkEventChild(od as api.EventChild);
     });
   });
 
@@ -2144,7 +2151,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventDefinition();
       var od = api.EventDefinition.fromJson(o.toJson());
-      checkEventDefinition(od);
+      checkEventDefinition(od as api.EventDefinition);
     });
   });
 
@@ -2152,7 +2159,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventDefinitionListResponse();
       var od = api.EventDefinitionListResponse.fromJson(o.toJson());
-      checkEventDefinitionListResponse(od);
+      checkEventDefinitionListResponse(od as api.EventDefinitionListResponse);
     });
   });
 
@@ -2160,7 +2167,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventPeriodRange();
       var od = api.EventPeriodRange.fromJson(o.toJson());
-      checkEventPeriodRange(od);
+      checkEventPeriodRange(od as api.EventPeriodRange);
     });
   });
 
@@ -2168,7 +2175,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventPeriodUpdate();
       var od = api.EventPeriodUpdate.fromJson(o.toJson());
-      checkEventPeriodUpdate(od);
+      checkEventPeriodUpdate(od as api.EventPeriodUpdate);
     });
   });
 
@@ -2176,7 +2183,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventRecordFailure();
       var od = api.EventRecordFailure.fromJson(o.toJson());
-      checkEventRecordFailure(od);
+      checkEventRecordFailure(od as api.EventRecordFailure);
     });
   });
 
@@ -2184,7 +2191,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventRecordRequest();
       var od = api.EventRecordRequest.fromJson(o.toJson());
-      checkEventRecordRequest(od);
+      checkEventRecordRequest(od as api.EventRecordRequest);
     });
   });
 
@@ -2192,7 +2199,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventUpdateRequest();
       var od = api.EventUpdateRequest.fromJson(o.toJson());
-      checkEventUpdateRequest(od);
+      checkEventUpdateRequest(od as api.EventUpdateRequest);
     });
   });
 
@@ -2200,7 +2207,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventUpdateResponse();
       var od = api.EventUpdateResponse.fromJson(o.toJson());
-      checkEventUpdateResponse(od);
+      checkEventUpdateResponse(od as api.EventUpdateResponse);
     });
   });
 
@@ -2208,7 +2215,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGamesAchievementIncrement();
       var od = api.GamesAchievementIncrement.fromJson(o.toJson());
-      checkGamesAchievementIncrement(od);
+      checkGamesAchievementIncrement(od as api.GamesAchievementIncrement);
     });
   });
 
@@ -2216,7 +2223,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGamesAchievementSetStepsAtLeast();
       var od = api.GamesAchievementSetStepsAtLeast.fromJson(o.toJson());
-      checkGamesAchievementSetStepsAtLeast(od);
+      checkGamesAchievementSetStepsAtLeast(
+          od as api.GamesAchievementSetStepsAtLeast);
     });
   });
 
@@ -2224,7 +2232,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageAsset();
       var od = api.ImageAsset.fromJson(o.toJson());
-      checkImageAsset(od);
+      checkImageAsset(od as api.ImageAsset);
     });
   });
 
@@ -2232,7 +2240,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstance();
       var od = api.Instance.fromJson(o.toJson());
-      checkInstance(od);
+      checkInstance(od as api.Instance);
     });
   });
 
@@ -2240,7 +2248,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceAndroidDetails();
       var od = api.InstanceAndroidDetails.fromJson(o.toJson());
-      checkInstanceAndroidDetails(od);
+      checkInstanceAndroidDetails(od as api.InstanceAndroidDetails);
     });
   });
 
@@ -2248,7 +2256,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceIosDetails();
       var od = api.InstanceIosDetails.fromJson(o.toJson());
-      checkInstanceIosDetails(od);
+      checkInstanceIosDetails(od as api.InstanceIosDetails);
     });
   });
 
@@ -2256,7 +2264,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceWebDetails();
       var od = api.InstanceWebDetails.fromJson(o.toJson());
-      checkInstanceWebDetails(od);
+      checkInstanceWebDetails(od as api.InstanceWebDetails);
     });
   });
 
@@ -2264,7 +2272,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboard();
       var od = api.Leaderboard.fromJson(o.toJson());
-      checkLeaderboard(od);
+      checkLeaderboard(od as api.Leaderboard);
     });
   });
 
@@ -2272,7 +2280,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboardEntry();
       var od = api.LeaderboardEntry.fromJson(o.toJson());
-      checkLeaderboardEntry(od);
+      checkLeaderboardEntry(od as api.LeaderboardEntry);
     });
   });
 
@@ -2280,7 +2288,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboardListResponse();
       var od = api.LeaderboardListResponse.fromJson(o.toJson());
-      checkLeaderboardListResponse(od);
+      checkLeaderboardListResponse(od as api.LeaderboardListResponse);
     });
   });
 
@@ -2288,7 +2296,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboardScoreRank();
       var od = api.LeaderboardScoreRank.fromJson(o.toJson());
-      checkLeaderboardScoreRank(od);
+      checkLeaderboardScoreRank(od as api.LeaderboardScoreRank);
     });
   });
 
@@ -2296,7 +2304,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboardScores();
       var od = api.LeaderboardScores.fromJson(o.toJson());
-      checkLeaderboardScores(od);
+      checkLeaderboardScores(od as api.LeaderboardScores);
     });
   });
 
@@ -2304,7 +2312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetagameConfig();
       var od = api.MetagameConfig.fromJson(o.toJson());
-      checkMetagameConfig(od);
+      checkMetagameConfig(od as api.MetagameConfig);
     });
   });
 
@@ -2312,7 +2320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerName();
       var od = api.PlayerName.fromJson(o.toJson());
-      checkPlayerName(od);
+      checkPlayerName(od as api.PlayerName);
     });
   });
 
@@ -2320,7 +2328,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayer();
       var od = api.Player.fromJson(o.toJson());
-      checkPlayer(od);
+      checkPlayer(od as api.Player);
     });
   });
 
@@ -2328,7 +2336,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerAchievement();
       var od = api.PlayerAchievement.fromJson(o.toJson());
-      checkPlayerAchievement(od);
+      checkPlayerAchievement(od as api.PlayerAchievement);
     });
   });
 
@@ -2336,7 +2344,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerAchievementListResponse();
       var od = api.PlayerAchievementListResponse.fromJson(o.toJson());
-      checkPlayerAchievementListResponse(od);
+      checkPlayerAchievementListResponse(
+          od as api.PlayerAchievementListResponse);
     });
   });
 
@@ -2344,7 +2353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerEvent();
       var od = api.PlayerEvent.fromJson(o.toJson());
-      checkPlayerEvent(od);
+      checkPlayerEvent(od as api.PlayerEvent);
     });
   });
 
@@ -2352,7 +2361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerEventListResponse();
       var od = api.PlayerEventListResponse.fromJson(o.toJson());
-      checkPlayerEventListResponse(od);
+      checkPlayerEventListResponse(od as api.PlayerEventListResponse);
     });
   });
 
@@ -2360,7 +2369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerExperienceInfo();
       var od = api.PlayerExperienceInfo.fromJson(o.toJson());
-      checkPlayerExperienceInfo(od);
+      checkPlayerExperienceInfo(od as api.PlayerExperienceInfo);
     });
   });
 
@@ -2368,7 +2377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerLeaderboardScore();
       var od = api.PlayerLeaderboardScore.fromJson(o.toJson());
-      checkPlayerLeaderboardScore(od);
+      checkPlayerLeaderboardScore(od as api.PlayerLeaderboardScore);
     });
   });
 
@@ -2376,7 +2385,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerLeaderboardScoreListResponse();
       var od = api.PlayerLeaderboardScoreListResponse.fromJson(o.toJson());
-      checkPlayerLeaderboardScoreListResponse(od);
+      checkPlayerLeaderboardScoreListResponse(
+          od as api.PlayerLeaderboardScoreListResponse);
     });
   });
 
@@ -2384,7 +2394,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerLevel();
       var od = api.PlayerLevel.fromJson(o.toJson());
-      checkPlayerLevel(od);
+      checkPlayerLevel(od as api.PlayerLevel);
     });
   });
 
@@ -2392,7 +2402,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerListResponse();
       var od = api.PlayerListResponse.fromJson(o.toJson());
-      checkPlayerListResponse(od);
+      checkPlayerListResponse(od as api.PlayerListResponse);
     });
   });
 
@@ -2400,7 +2410,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerScore();
       var od = api.PlayerScore.fromJson(o.toJson());
-      checkPlayerScore(od);
+      checkPlayerScore(od as api.PlayerScore);
     });
   });
 
@@ -2408,7 +2418,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerScoreListResponse();
       var od = api.PlayerScoreListResponse.fromJson(o.toJson());
-      checkPlayerScoreListResponse(od);
+      checkPlayerScoreListResponse(od as api.PlayerScoreListResponse);
     });
   });
 
@@ -2416,7 +2426,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerScoreResponse();
       var od = api.PlayerScoreResponse.fromJson(o.toJson());
-      checkPlayerScoreResponse(od);
+      checkPlayerScoreResponse(od as api.PlayerScoreResponse);
     });
   });
 
@@ -2424,7 +2434,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerScoreSubmissionList();
       var od = api.PlayerScoreSubmissionList.fromJson(o.toJson());
-      checkPlayerScoreSubmissionList(od);
+      checkPlayerScoreSubmissionList(od as api.PlayerScoreSubmissionList);
     });
   });
 
@@ -2432,7 +2442,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileSettings();
       var od = api.ProfileSettings.fromJson(o.toJson());
-      checkProfileSettings(od);
+      checkProfileSettings(od as api.ProfileSettings);
     });
   });
 
@@ -2440,7 +2450,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevisionCheckResponse();
       var od = api.RevisionCheckResponse.fromJson(o.toJson());
-      checkRevisionCheckResponse(od);
+      checkRevisionCheckResponse(od as api.RevisionCheckResponse);
     });
   });
 
@@ -2448,7 +2458,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScoreSubmission();
       var od = api.ScoreSubmission.fromJson(o.toJson());
-      checkScoreSubmission(od);
+      checkScoreSubmission(od as api.ScoreSubmission);
     });
   });
 
@@ -2456,7 +2466,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshot();
       var od = api.Snapshot.fromJson(o.toJson());
-      checkSnapshot(od);
+      checkSnapshot(od as api.Snapshot);
     });
   });
 
@@ -2464,7 +2474,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshotImage();
       var od = api.SnapshotImage.fromJson(o.toJson());
-      checkSnapshotImage(od);
+      checkSnapshotImage(od as api.SnapshotImage);
     });
   });
 
@@ -2472,7 +2482,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshotListResponse();
       var od = api.SnapshotListResponse.fromJson(o.toJson());
-      checkSnapshotListResponse(od);
+      checkSnapshotListResponse(od as api.SnapshotListResponse);
     });
   });
 
@@ -2480,7 +2490,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatsResponse();
       var od = api.StatsResponse.fromJson(o.toJson());
-      checkStatsResponse(od);
+      checkStatsResponse(od as api.StatsResponse);
     });
   });
 
@@ -2541,7 +2551,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementDefinitionsListResponse(response);
+        checkAchievementDefinitionsListResponse(
+            response as api.AchievementDefinitionsListResponse);
       })));
     });
   });
@@ -2606,7 +2617,8 @@
           .increment(arg_achievementId, arg_stepsToIncrement,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementIncrementResponse(response);
+        checkAchievementIncrementResponse(
+            response as api.AchievementIncrementResponse);
       })));
     });
 
@@ -2678,7 +2690,8 @@
               state: arg_state,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerAchievementListResponse(response);
+        checkPlayerAchievementListResponse(
+            response as api.PlayerAchievementListResponse);
       })));
     });
 
@@ -2734,7 +2747,8 @@
       res
           .reveal(arg_achievementId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementRevealResponse(response);
+        checkAchievementRevealResponse(
+            response as api.AchievementRevealResponse);
       })));
     });
 
@@ -2794,7 +2808,8 @@
       res
           .setStepsAtLeast(arg_achievementId, arg_steps, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementSetStepsAtLeastResponse(response);
+        checkAchievementSetStepsAtLeastResponse(
+            response as api.AchievementSetStepsAtLeastResponse);
       })));
     });
 
@@ -2850,7 +2865,8 @@
       res
           .unlock(arg_achievementId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementUnlockResponse(response);
+        checkAchievementUnlockResponse(
+            response as api.AchievementUnlockResponse);
       })));
     });
 
@@ -2860,8 +2876,10 @@
       var arg_request = buildAchievementUpdateMultipleRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AchievementUpdateMultipleRequest.fromJson(json);
-        checkAchievementUpdateMultipleRequest(obj);
+        var obj = api.AchievementUpdateMultipleRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAchievementUpdateMultipleRequest(
+            obj as api.AchievementUpdateMultipleRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2901,7 +2919,8 @@
       res
           .updateMultiple(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementUpdateMultipleResponse(response);
+        checkAchievementUpdateMultipleResponse(
+            response as api.AchievementUpdateMultipleResponse);
       })));
     });
   });
@@ -2962,7 +2981,7 @@
               platformType: arg_platformType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApplication(response);
+        checkApplication(response as api.Application);
       })));
     });
 
@@ -3060,7 +3079,8 @@
       res
           .verify(arg_applicationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkApplicationVerifyResponse(response);
+        checkApplicationVerifyResponse(
+            response as api.ApplicationVerifyResponse);
       })));
     });
   });
@@ -3121,7 +3141,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerEventListResponse(response);
+        checkPlayerEventListResponse(response as api.PlayerEventListResponse);
       })));
     });
 
@@ -3180,7 +3200,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEventDefinitionListResponse(response);
+        checkEventDefinitionListResponse(
+            response as api.EventDefinitionListResponse);
       })));
     });
 
@@ -3191,8 +3212,9 @@
       var arg_language = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EventRecordRequest.fromJson(json);
-        checkEventRecordRequest(obj);
+        var obj = api.EventRecordRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEventRecordRequest(obj as api.EventRecordRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3233,7 +3255,7 @@
       res
           .record(arg_request, language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEventUpdateResponse(response);
+        checkEventUpdateResponse(response as api.EventUpdateResponse);
       })));
     });
   });
@@ -3288,7 +3310,7 @@
       res
           .get(arg_leaderboardId, language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboard(response);
+        checkLeaderboard(response as api.Leaderboard);
       })));
     });
 
@@ -3347,7 +3369,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboardListResponse(response);
+        checkLeaderboardListResponse(response as api.LeaderboardListResponse);
       })));
     });
   });
@@ -3395,7 +3417,7 @@
       res
           .getMetagameConfig($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMetagameConfig(response);
+        checkMetagameConfig(response as api.MetagameConfig);
       })));
     });
 
@@ -3468,7 +3490,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCategoryListResponse(response);
+        checkCategoryListResponse(response as api.CategoryListResponse);
       })));
     });
   });
@@ -3523,7 +3545,7 @@
       res
           .get(arg_playerId, language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayer(response);
+        checkPlayer(response as api.Player);
       })));
     });
 
@@ -3586,7 +3608,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerListResponse(response);
+        checkPlayerListResponse(response as api.PlayerListResponse);
       })));
     });
   });
@@ -3637,7 +3659,7 @@
       res
           .check(arg_clientRevision, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevisionCheckResponse(response);
+        checkRevisionCheckResponse(response as api.RevisionCheckResponse);
       })));
     });
   });
@@ -3727,7 +3749,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerLeaderboardScoreListResponse(response);
+        checkPlayerLeaderboardScoreListResponse(
+            response as api.PlayerLeaderboardScoreListResponse);
       })));
     });
 
@@ -3803,7 +3826,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboardScores(response);
+        checkLeaderboardScores(response as api.LeaderboardScores);
       })));
     });
 
@@ -3887,7 +3910,7 @@
               returnTopIfAbsent: arg_returnTopIfAbsent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboardScores(response);
+        checkLeaderboardScores(response as api.LeaderboardScores);
       })));
     });
 
@@ -3954,7 +3977,7 @@
               scoreTag: arg_scoreTag,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerScoreResponse(response);
+        checkPlayerScoreResponse(response as api.PlayerScoreResponse);
       })));
     });
 
@@ -3965,8 +3988,9 @@
       var arg_language = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlayerScoreSubmissionList.fromJson(json);
-        checkPlayerScoreSubmissionList(obj);
+        var obj = api.PlayerScoreSubmissionList.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlayerScoreSubmissionList(obj as api.PlayerScoreSubmissionList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4008,7 +4032,7 @@
           .submitMultiple(arg_request,
               language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerScoreListResponse(response);
+        checkPlayerScoreListResponse(response as api.PlayerScoreListResponse);
       })));
     });
   });
@@ -4063,7 +4087,7 @@
       res
           .get(arg_snapshotId, language: arg_language, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSnapshot(response);
+        checkSnapshot(response as api.Snapshot);
       })));
     });
 
@@ -4132,7 +4156,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSnapshotListResponse(response);
+        checkSnapshotListResponse(response as api.SnapshotListResponse);
       })));
     });
   });
@@ -4178,7 +4202,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.get($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkStatsResponse(response);
+        checkStatsResponse(response as api.StatsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
index ca01746..65cd78f 100644
--- a/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
+++ b/generated/googleapis/test/gamesconfiguration/v1configuration_test.dart
@@ -96,11 +96,13 @@
   buildCounterAchievementConfiguration++;
   if (buildCounterAchievementConfiguration < 3) {
     unittest.expect(o.achievementType, unittest.equals('foo'));
-    checkAchievementConfigurationDetail(o.draft);
+    checkAchievementConfigurationDetail(
+        o.draft as api.AchievementConfigurationDetail);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.initialState, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkAchievementConfigurationDetail(o.published);
+    checkAchievementConfigurationDetail(
+        o.published as api.AchievementConfigurationDetail);
     unittest.expect(o.stepsToUnlock, unittest.equals(42));
     unittest.expect(o.token, unittest.equals('foo'));
   }
@@ -126,10 +128,10 @@
 void checkAchievementConfigurationDetail(api.AchievementConfigurationDetail o) {
   buildCounterAchievementConfigurationDetail++;
   if (buildCounterAchievementConfigurationDetail < 3) {
-    checkLocalizedStringBundle(o.description);
+    checkLocalizedStringBundle(o.description as api.LocalizedStringBundle);
     unittest.expect(o.iconUrl, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLocalizedStringBundle(o.name);
+    checkLocalizedStringBundle(o.name as api.LocalizedStringBundle);
     unittest.expect(o.pointValue, unittest.equals(42));
     unittest.expect(o.sortRank, unittest.equals(42));
   }
@@ -145,8 +147,8 @@
 
 void checkUnnamed2775(core.List<api.AchievementConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAchievementConfiguration(o[0]);
-  checkAchievementConfiguration(o[1]);
+  checkAchievementConfiguration(o[0] as api.AchievementConfiguration);
+  checkAchievementConfiguration(o[1] as api.AchievementConfiguration);
 }
 
 core.int buildCounterAchievementConfigurationListResponse = 0;
@@ -193,12 +195,12 @@
 void checkGamesNumberAffixConfiguration(api.GamesNumberAffixConfiguration o) {
   buildCounterGamesNumberAffixConfiguration++;
   if (buildCounterGamesNumberAffixConfiguration < 3) {
-    checkLocalizedStringBundle(o.few);
-    checkLocalizedStringBundle(o.many);
-    checkLocalizedStringBundle(o.one);
-    checkLocalizedStringBundle(o.other);
-    checkLocalizedStringBundle(o.two);
-    checkLocalizedStringBundle(o.zero);
+    checkLocalizedStringBundle(o.few as api.LocalizedStringBundle);
+    checkLocalizedStringBundle(o.many as api.LocalizedStringBundle);
+    checkLocalizedStringBundle(o.one as api.LocalizedStringBundle);
+    checkLocalizedStringBundle(o.other as api.LocalizedStringBundle);
+    checkLocalizedStringBundle(o.two as api.LocalizedStringBundle);
+    checkLocalizedStringBundle(o.zero as api.LocalizedStringBundle);
   }
   buildCounterGamesNumberAffixConfiguration--;
 }
@@ -223,7 +225,8 @@
     unittest.expect(o.currencyCode, unittest.equals('foo'));
     unittest.expect(o.numDecimalPlaces, unittest.equals(42));
     unittest.expect(o.numberFormatType, unittest.equals('foo'));
-    checkGamesNumberAffixConfiguration(o.suffix);
+    checkGamesNumberAffixConfiguration(
+        o.suffix as api.GamesNumberAffixConfiguration);
   }
   buildCounterGamesNumberFormatConfiguration--;
 }
@@ -274,10 +277,12 @@
 void checkLeaderboardConfiguration(api.LeaderboardConfiguration o) {
   buildCounterLeaderboardConfiguration++;
   if (buildCounterLeaderboardConfiguration < 3) {
-    checkLeaderboardConfigurationDetail(o.draft);
+    checkLeaderboardConfigurationDetail(
+        o.draft as api.LeaderboardConfigurationDetail);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLeaderboardConfigurationDetail(o.published);
+    checkLeaderboardConfigurationDetail(
+        o.published as api.LeaderboardConfigurationDetail);
     unittest.expect(o.scoreMax, unittest.equals('foo'));
     unittest.expect(o.scoreMin, unittest.equals('foo'));
     unittest.expect(o.scoreOrder, unittest.equals('foo'));
@@ -306,8 +311,9 @@
   if (buildCounterLeaderboardConfigurationDetail < 3) {
     unittest.expect(o.iconUrl, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLocalizedStringBundle(o.name);
-    checkGamesNumberFormatConfiguration(o.scoreFormat);
+    checkLocalizedStringBundle(o.name as api.LocalizedStringBundle);
+    checkGamesNumberFormatConfiguration(
+        o.scoreFormat as api.GamesNumberFormatConfiguration);
     unittest.expect(o.sortRank, unittest.equals(42));
   }
   buildCounterLeaderboardConfigurationDetail--;
@@ -322,8 +328,8 @@
 
 void checkUnnamed2776(core.List<api.LeaderboardConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLeaderboardConfiguration(o[0]);
-  checkLeaderboardConfiguration(o[1]);
+  checkLeaderboardConfiguration(o[0] as api.LeaderboardConfiguration);
+  checkLeaderboardConfiguration(o[1] as api.LeaderboardConfiguration);
 }
 
 core.int buildCounterLeaderboardConfigurationListResponse = 0;
@@ -383,8 +389,8 @@
 
 void checkUnnamed2777(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalizedString(o[0]);
-  checkLocalizedString(o[1]);
+  checkLocalizedString(o[0] as api.LocalizedString);
+  checkLocalizedString(o[1] as api.LocalizedString);
 }
 
 core.int buildCounterLocalizedStringBundle = 0;
@@ -413,7 +419,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementConfiguration();
       var od = api.AchievementConfiguration.fromJson(o.toJson());
-      checkAchievementConfiguration(od);
+      checkAchievementConfiguration(od as api.AchievementConfiguration);
     });
   });
 
@@ -421,7 +427,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementConfigurationDetail();
       var od = api.AchievementConfigurationDetail.fromJson(o.toJson());
-      checkAchievementConfigurationDetail(od);
+      checkAchievementConfigurationDetail(
+          od as api.AchievementConfigurationDetail);
     });
   });
 
@@ -429,7 +436,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementConfigurationListResponse();
       var od = api.AchievementConfigurationListResponse.fromJson(o.toJson());
-      checkAchievementConfigurationListResponse(od);
+      checkAchievementConfigurationListResponse(
+          od as api.AchievementConfigurationListResponse);
     });
   });
 
@@ -437,7 +445,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGamesNumberAffixConfiguration();
       var od = api.GamesNumberAffixConfiguration.fromJson(o.toJson());
-      checkGamesNumberAffixConfiguration(od);
+      checkGamesNumberAffixConfiguration(
+          od as api.GamesNumberAffixConfiguration);
     });
   });
 
@@ -445,7 +454,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGamesNumberFormatConfiguration();
       var od = api.GamesNumberFormatConfiguration.fromJson(o.toJson());
-      checkGamesNumberFormatConfiguration(od);
+      checkGamesNumberFormatConfiguration(
+          od as api.GamesNumberFormatConfiguration);
     });
   });
 
@@ -453,7 +463,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageConfiguration();
       var od = api.ImageConfiguration.fromJson(o.toJson());
-      checkImageConfiguration(od);
+      checkImageConfiguration(od as api.ImageConfiguration);
     });
   });
 
@@ -461,7 +471,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboardConfiguration();
       var od = api.LeaderboardConfiguration.fromJson(o.toJson());
-      checkLeaderboardConfiguration(od);
+      checkLeaderboardConfiguration(od as api.LeaderboardConfiguration);
     });
   });
 
@@ -469,7 +479,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboardConfigurationDetail();
       var od = api.LeaderboardConfigurationDetail.fromJson(o.toJson());
-      checkLeaderboardConfigurationDetail(od);
+      checkLeaderboardConfigurationDetail(
+          od as api.LeaderboardConfigurationDetail);
     });
   });
 
@@ -477,7 +488,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLeaderboardConfigurationListResponse();
       var od = api.LeaderboardConfigurationListResponse.fromJson(o.toJson());
-      checkLeaderboardConfigurationListResponse(od);
+      checkLeaderboardConfigurationListResponse(
+          od as api.LeaderboardConfigurationListResponse);
     });
   });
 
@@ -485,7 +497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizedString();
       var od = api.LocalizedString.fromJson(o.toJson());
-      checkLocalizedString(od);
+      checkLocalizedString(od as api.LocalizedString);
     });
   });
 
@@ -493,7 +505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizedStringBundle();
       var od = api.LocalizedStringBundle.fromJson(o.toJson());
-      checkLocalizedStringBundle(od);
+      checkLocalizedStringBundle(od as api.LocalizedStringBundle);
     });
   });
 
@@ -592,7 +604,7 @@
       res
           .get(arg_achievementId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementConfiguration(response);
+        checkAchievementConfiguration(response as api.AchievementConfiguration);
       })));
     });
 
@@ -603,8 +615,9 @@
       var arg_applicationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AchievementConfiguration.fromJson(json);
-        checkAchievementConfiguration(obj);
+        var obj = api.AchievementConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAchievementConfiguration(obj as api.AchievementConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -652,7 +665,7 @@
       res
           .insert(arg_request, arg_applicationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementConfiguration(response);
+        checkAchievementConfiguration(response as api.AchievementConfiguration);
       })));
     });
 
@@ -718,7 +731,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementConfigurationListResponse(response);
+        checkAchievementConfigurationListResponse(
+            response as api.AchievementConfigurationListResponse);
       })));
     });
 
@@ -729,8 +743,9 @@
       var arg_achievementId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AchievementConfiguration.fromJson(json);
-        checkAchievementConfiguration(obj);
+        var obj = api.AchievementConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAchievementConfiguration(obj as api.AchievementConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -772,7 +787,7 @@
       res
           .update(arg_request, arg_achievementId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementConfiguration(response);
+        checkAchievementConfiguration(response as api.AchievementConfiguration);
       })));
     });
   });
@@ -837,7 +852,7 @@
       res
           .upload(arg_resourceId, arg_imageType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImageConfiguration(response);
+        checkImageConfiguration(response as api.ImageConfiguration);
       })));
     });
   });
@@ -937,7 +952,7 @@
       res
           .get(arg_leaderboardId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboardConfiguration(response);
+        checkLeaderboardConfiguration(response as api.LeaderboardConfiguration);
       })));
     });
 
@@ -948,8 +963,9 @@
       var arg_applicationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LeaderboardConfiguration.fromJson(json);
-        checkLeaderboardConfiguration(obj);
+        var obj = api.LeaderboardConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLeaderboardConfiguration(obj as api.LeaderboardConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -997,7 +1013,7 @@
       res
           .insert(arg_request, arg_applicationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboardConfiguration(response);
+        checkLeaderboardConfiguration(response as api.LeaderboardConfiguration);
       })));
     });
 
@@ -1063,7 +1079,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboardConfigurationListResponse(response);
+        checkLeaderboardConfigurationListResponse(
+            response as api.LeaderboardConfigurationListResponse);
       })));
     });
 
@@ -1074,8 +1091,9 @@
       var arg_leaderboardId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LeaderboardConfiguration.fromJson(json);
-        checkLeaderboardConfiguration(obj);
+        var obj = api.LeaderboardConfiguration.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLeaderboardConfiguration(obj as api.LeaderboardConfiguration);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1117,7 +1135,7 @@
       res
           .update(arg_request, arg_leaderboardId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLeaderboardConfiguration(response);
+        checkLeaderboardConfiguration(response as api.LeaderboardConfiguration);
       })));
     });
   });
diff --git a/generated/googleapis/test/gamesmanagement/v1management_test.dart b/generated/googleapis/test/gamesmanagement/v1management_test.dart
index aae2228..1a06e3b 100644
--- a/generated/googleapis/test/gamesmanagement/v1management_test.dart
+++ b/generated/googleapis/test/gamesmanagement/v1management_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed72(core.List<api.AchievementResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAchievementResetResponse(o[0]);
-  checkAchievementResetResponse(o[1]);
+  checkAchievementResetResponse(o[0] as api.AchievementResetResponse);
+  checkAchievementResetResponse(o[1] as api.AchievementResetResponse);
 }
 
 core.int buildCounterAchievementResetAllResponse = 0;
@@ -223,9 +223,10 @@
   buildCounterGamesPlayerExperienceInfoResource++;
   if (buildCounterGamesPlayerExperienceInfoResource < 3) {
     unittest.expect(o.currentExperiencePoints, unittest.equals('foo'));
-    checkGamesPlayerLevelResource(o.currentLevel);
+    checkGamesPlayerLevelResource(
+        o.currentLevel as api.GamesPlayerLevelResource);
     unittest.expect(o.lastLevelUpTimestampMillis, unittest.equals('foo'));
-    checkGamesPlayerLevelResource(o.nextLevel);
+    checkGamesPlayerLevelResource(o.nextLevel as api.GamesPlayerLevelResource);
   }
   buildCounterGamesPlayerExperienceInfoResource--;
 }
@@ -271,7 +272,7 @@
   if (buildCounterHiddenPlayer < 3) {
     unittest.expect(o.hiddenTimeMillis, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPlayer(o.player);
+    checkPlayer(o.player as api.Player);
   }
   buildCounterHiddenPlayer--;
 }
@@ -285,8 +286,8 @@
 
 void checkUnnamed75(core.List<api.HiddenPlayer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHiddenPlayer(o[0]);
-  checkHiddenPlayer(o[1]);
+  checkHiddenPlayer(o[0] as api.HiddenPlayer);
+  checkHiddenPlayer(o[1] as api.HiddenPlayer);
 }
 
 core.int buildCounterHiddenPlayerList = 0;
@@ -361,12 +362,13 @@
     unittest.expect(o.bannerUrlLandscape, unittest.equals('foo'));
     unittest.expect(o.bannerUrlPortrait, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkGamesPlayerExperienceInfoResource(o.experienceInfo);
+    checkGamesPlayerExperienceInfoResource(
+        o.experienceInfo as api.GamesPlayerExperienceInfoResource);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPlayerName(o.name);
+    checkPlayerName(o.name as api.PlayerName);
     unittest.expect(o.originalPlayerId, unittest.equals('foo'));
     unittest.expect(o.playerId, unittest.equals('foo'));
-    checkProfileSettings(o.profileSettings);
+    checkProfileSettings(o.profileSettings as api.ProfileSettings);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterPlayer--;
@@ -381,8 +383,8 @@
 
 void checkUnnamed76(core.List<api.PlayerScoreResetResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlayerScoreResetResponse(o[0]);
-  checkPlayerScoreResetResponse(o[1]);
+  checkPlayerScoreResetResponse(o[0] as api.PlayerScoreResetResponse);
+  checkPlayerScoreResetResponse(o[1] as api.PlayerScoreResetResponse);
 }
 
 core.int buildCounterPlayerScoreResetAllResponse = 0;
@@ -503,7 +505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementResetAllResponse();
       var od = api.AchievementResetAllResponse.fromJson(o.toJson());
-      checkAchievementResetAllResponse(od);
+      checkAchievementResetAllResponse(od as api.AchievementResetAllResponse);
     });
   });
 
@@ -511,7 +513,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementResetMultipleForAllRequest();
       var od = api.AchievementResetMultipleForAllRequest.fromJson(o.toJson());
-      checkAchievementResetMultipleForAllRequest(od);
+      checkAchievementResetMultipleForAllRequest(
+          od as api.AchievementResetMultipleForAllRequest);
     });
   });
 
@@ -519,7 +522,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAchievementResetResponse();
       var od = api.AchievementResetResponse.fromJson(o.toJson());
-      checkAchievementResetResponse(od);
+      checkAchievementResetResponse(od as api.AchievementResetResponse);
     });
   });
 
@@ -527,7 +530,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildEventsResetMultipleForAllRequest();
       var od = api.EventsResetMultipleForAllRequest.fromJson(o.toJson());
-      checkEventsResetMultipleForAllRequest(od);
+      checkEventsResetMultipleForAllRequest(
+          od as api.EventsResetMultipleForAllRequest);
     });
   });
 
@@ -535,7 +539,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGamesPlayerExperienceInfoResource();
       var od = api.GamesPlayerExperienceInfoResource.fromJson(o.toJson());
-      checkGamesPlayerExperienceInfoResource(od);
+      checkGamesPlayerExperienceInfoResource(
+          od as api.GamesPlayerExperienceInfoResource);
     });
   });
 
@@ -543,7 +548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGamesPlayerLevelResource();
       var od = api.GamesPlayerLevelResource.fromJson(o.toJson());
-      checkGamesPlayerLevelResource(od);
+      checkGamesPlayerLevelResource(od as api.GamesPlayerLevelResource);
     });
   });
 
@@ -551,7 +556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHiddenPlayer();
       var od = api.HiddenPlayer.fromJson(o.toJson());
-      checkHiddenPlayer(od);
+      checkHiddenPlayer(od as api.HiddenPlayer);
     });
   });
 
@@ -559,7 +564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHiddenPlayerList();
       var od = api.HiddenPlayerList.fromJson(o.toJson());
-      checkHiddenPlayerList(od);
+      checkHiddenPlayerList(od as api.HiddenPlayerList);
     });
   });
 
@@ -567,7 +572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerName();
       var od = api.PlayerName.fromJson(o.toJson());
-      checkPlayerName(od);
+      checkPlayerName(od as api.PlayerName);
     });
   });
 
@@ -575,7 +580,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayer();
       var od = api.Player.fromJson(o.toJson());
-      checkPlayer(od);
+      checkPlayer(od as api.Player);
     });
   });
 
@@ -583,7 +588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerScoreResetAllResponse();
       var od = api.PlayerScoreResetAllResponse.fromJson(o.toJson());
-      checkPlayerScoreResetAllResponse(od);
+      checkPlayerScoreResetAllResponse(od as api.PlayerScoreResetAllResponse);
     });
   });
 
@@ -591,7 +596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlayerScoreResetResponse();
       var od = api.PlayerScoreResetResponse.fromJson(o.toJson());
-      checkPlayerScoreResetResponse(od);
+      checkPlayerScoreResetResponse(od as api.PlayerScoreResetResponse);
     });
   });
 
@@ -599,7 +604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileSettings();
       var od = api.ProfileSettings.fromJson(o.toJson());
-      checkProfileSettings(od);
+      checkProfileSettings(od as api.ProfileSettings);
     });
   });
 
@@ -607,7 +612,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildScoresResetMultipleForAllRequest();
       var od = api.ScoresResetMultipleForAllRequest.fromJson(o.toJson());
-      checkScoresResetMultipleForAllRequest(od);
+      checkScoresResetMultipleForAllRequest(
+          od as api.ScoresResetMultipleForAllRequest);
     });
   });
 
@@ -664,7 +670,7 @@
       res
           .reset(arg_achievementId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementResetResponse(response);
+        checkAchievementResetResponse(response as api.AchievementResetResponse);
       })));
     });
 
@@ -710,7 +716,8 @@
       res
           .resetAll($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAchievementResetAllResponse(response);
+        checkAchievementResetAllResponse(
+            response as api.AchievementResetAllResponse);
       })));
     });
 
@@ -820,8 +827,10 @@
       var arg_request = buildAchievementResetMultipleForAllRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AchievementResetMultipleForAllRequest.fromJson(json);
-        checkAchievementResetMultipleForAllRequest(obj);
+        var obj = api.AchievementResetMultipleForAllRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAchievementResetMultipleForAllRequest(
+            obj as api.AchievementResetMultipleForAllRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -927,7 +936,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHiddenPlayerList(response);
+        checkHiddenPlayerList(response as api.HiddenPlayerList);
       })));
     });
   });
@@ -1133,8 +1142,10 @@
       var arg_request = buildEventsResetMultipleForAllRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EventsResetMultipleForAllRequest.fromJson(json);
-        checkEventsResetMultipleForAllRequest(obj);
+        var obj = api.EventsResetMultipleForAllRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEventsResetMultipleForAllRequest(
+            obj as api.EventsResetMultipleForAllRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1349,7 +1360,7 @@
       res
           .reset(arg_leaderboardId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerScoreResetResponse(response);
+        checkPlayerScoreResetResponse(response as api.PlayerScoreResetResponse);
       })));
     });
 
@@ -1395,7 +1406,8 @@
       res
           .resetAll($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlayerScoreResetAllResponse(response);
+        checkPlayerScoreResetAllResponse(
+            response as api.PlayerScoreResetAllResponse);
       })));
     });
 
@@ -1503,8 +1515,10 @@
       var arg_request = buildScoresResetMultipleForAllRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ScoresResetMultipleForAllRequest.fromJson(json);
-        checkScoresResetMultipleForAllRequest(obj);
+        var obj = api.ScoresResetMultipleForAllRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkScoresResetMultipleForAllRequest(
+            obj as api.ScoresResetMultipleForAllRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/genomics/v1_test.dart b/generated/googleapis/test/genomics/v1_test.dart
index 6167e7d..452b6b8 100644
--- a/generated/googleapis/test/genomics/v1_test.dart
+++ b/generated/googleapis/test/genomics/v1_test.dart
@@ -336,8 +336,8 @@
 
 void checkUnnamed5736(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -438,7 +438,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5737(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5738(o.response);
@@ -478,8 +478,8 @@
 
 void checkUnnamed5739(core.List<api.OperationEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperationEvent(o[0]);
-  checkOperationEvent(o[1]);
+  checkOperationEvent(o[0] as api.OperationEvent);
+  checkOperationEvent(o[1] as api.OperationEvent);
 }
 
 core.Map<core.String, core.String> buildUnnamed5740() {
@@ -655,7 +655,7 @@
 void checkRuntimeMetadata(api.RuntimeMetadata o) {
   buildCounterRuntimeMetadata++;
   if (buildCounterRuntimeMetadata < 3) {
-    checkComputeEngine(o.computeEngine);
+    checkComputeEngine(o.computeEngine as api.ComputeEngine);
   }
   buildCounterRuntimeMetadata--;
 }
@@ -795,7 +795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -803,7 +803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComputeEngine();
       var od = api.ComputeEngine.fromJson(o.toJson());
-      checkComputeEngine(od);
+      checkComputeEngine(od as api.ComputeEngine);
     });
   });
 
@@ -811,7 +811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerKilledEvent();
       var od = api.ContainerKilledEvent.fromJson(o.toJson());
-      checkContainerKilledEvent(od);
+      checkContainerKilledEvent(od as api.ContainerKilledEvent);
     });
   });
 
@@ -819,7 +819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerStartedEvent();
       var od = api.ContainerStartedEvent.fromJson(o.toJson());
-      checkContainerStartedEvent(od);
+      checkContainerStartedEvent(od as api.ContainerStartedEvent);
     });
   });
 
@@ -827,7 +827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerStoppedEvent();
       var od = api.ContainerStoppedEvent.fromJson(o.toJson());
-      checkContainerStoppedEvent(od);
+      checkContainerStoppedEvent(od as api.ContainerStoppedEvent);
     });
   });
 
@@ -835,7 +835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDelayedEvent();
       var od = api.DelayedEvent.fromJson(o.toJson());
-      checkDelayedEvent(od);
+      checkDelayedEvent(od as api.DelayedEvent);
     });
   });
 
@@ -843,7 +843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -851,7 +851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEvent();
       var od = api.Event.fromJson(o.toJson());
-      checkEvent(od);
+      checkEvent(od as api.Event);
     });
   });
 
@@ -859,7 +859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFailedEvent();
       var od = api.FailedEvent.fromJson(o.toJson());
-      checkFailedEvent(od);
+      checkFailedEvent(od as api.FailedEvent);
     });
   });
 
@@ -867,7 +867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -875,7 +875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -883,7 +883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationEvent();
       var od = api.OperationEvent.fromJson(o.toJson());
-      checkOperationEvent(od);
+      checkOperationEvent(od as api.OperationEvent);
     });
   });
 
@@ -891,7 +891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -899,7 +899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPullStartedEvent();
       var od = api.PullStartedEvent.fromJson(o.toJson());
-      checkPullStartedEvent(od);
+      checkPullStartedEvent(od as api.PullStartedEvent);
     });
   });
 
@@ -907,7 +907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPullStoppedEvent();
       var od = api.PullStoppedEvent.fromJson(o.toJson());
-      checkPullStoppedEvent(od);
+      checkPullStoppedEvent(od as api.PullStoppedEvent);
     });
   });
 
@@ -915,7 +915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunPipelineResponse();
       var od = api.RunPipelineResponse.fromJson(o.toJson());
-      checkRunPipelineResponse(od);
+      checkRunPipelineResponse(od as api.RunPipelineResponse);
     });
   });
 
@@ -923,7 +923,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRuntimeMetadata();
       var od = api.RuntimeMetadata.fromJson(o.toJson());
-      checkRuntimeMetadata(od);
+      checkRuntimeMetadata(od as api.RuntimeMetadata);
     });
   });
 
@@ -931,7 +931,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -939,7 +939,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnexpectedExitStatusEvent();
       var od = api.UnexpectedExitStatusEvent.fromJson(o.toJson());
-      checkUnexpectedExitStatusEvent(od);
+      checkUnexpectedExitStatusEvent(od as api.UnexpectedExitStatusEvent);
     });
   });
 
@@ -947,7 +947,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkerAssignedEvent();
       var od = api.WorkerAssignedEvent.fromJson(o.toJson());
-      checkWorkerAssignedEvent(od);
+      checkWorkerAssignedEvent(od as api.WorkerAssignedEvent);
     });
   });
 
@@ -955,7 +955,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkerReleasedEvent();
       var od = api.WorkerReleasedEvent.fromJson(o.toJson());
-      checkWorkerReleasedEvent(od);
+      checkWorkerReleasedEvent(od as api.WorkerReleasedEvent);
     });
   });
 
@@ -967,8 +967,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1008,7 +1009,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1056,7 +1057,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1116,7 +1117,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/gmail/v1_test.dart b/generated/googleapis/test/gmail/v1_test.dart
index 9947736..dbe03ac 100644
--- a/generated/googleapis/test/gmail/v1_test.dart
+++ b/generated/googleapis/test/gmail/v1_test.dart
@@ -228,7 +228,7 @@
   buildCounterDraft++;
   if (buildCounterDraft < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterDraft--;
 }
@@ -249,8 +249,8 @@
 void checkFilter(api.Filter o) {
   buildCounterFilter++;
   if (buildCounterFilter < 3) {
-    checkFilterAction(o.action);
-    checkFilterCriteria(o.criteria);
+    checkFilterAction(o.action as api.FilterAction);
+    checkFilterCriteria(o.criteria as api.FilterCriteria);
     unittest.expect(o.id, unittest.equals('foo'));
   }
   buildCounterFilter--;
@@ -370,8 +370,8 @@
 
 void checkUnnamed3179(core.List<api.HistoryLabelAdded> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistoryLabelAdded(o[0]);
-  checkHistoryLabelAdded(o[1]);
+  checkHistoryLabelAdded(o[0] as api.HistoryLabelAdded);
+  checkHistoryLabelAdded(o[1] as api.HistoryLabelAdded);
 }
 
 core.List<api.HistoryLabelRemoved> buildUnnamed3180() {
@@ -383,8 +383,8 @@
 
 void checkUnnamed3180(core.List<api.HistoryLabelRemoved> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistoryLabelRemoved(o[0]);
-  checkHistoryLabelRemoved(o[1]);
+  checkHistoryLabelRemoved(o[0] as api.HistoryLabelRemoved);
+  checkHistoryLabelRemoved(o[1] as api.HistoryLabelRemoved);
 }
 
 core.List<api.Message> buildUnnamed3181() {
@@ -396,8 +396,8 @@
 
 void checkUnnamed3181(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMessage(o[0]);
-  checkMessage(o[1]);
+  checkMessage(o[0] as api.Message);
+  checkMessage(o[1] as api.Message);
 }
 
 core.List<api.HistoryMessageAdded> buildUnnamed3182() {
@@ -409,8 +409,8 @@
 
 void checkUnnamed3182(core.List<api.HistoryMessageAdded> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistoryMessageAdded(o[0]);
-  checkHistoryMessageAdded(o[1]);
+  checkHistoryMessageAdded(o[0] as api.HistoryMessageAdded);
+  checkHistoryMessageAdded(o[1] as api.HistoryMessageAdded);
 }
 
 core.List<api.HistoryMessageDeleted> buildUnnamed3183() {
@@ -422,8 +422,8 @@
 
 void checkUnnamed3183(core.List<api.HistoryMessageDeleted> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistoryMessageDeleted(o[0]);
-  checkHistoryMessageDeleted(o[1]);
+  checkHistoryMessageDeleted(o[0] as api.HistoryMessageDeleted);
+  checkHistoryMessageDeleted(o[1] as api.HistoryMessageDeleted);
 }
 
 core.int buildCounterHistory = 0;
@@ -484,7 +484,7 @@
   buildCounterHistoryLabelAdded++;
   if (buildCounterHistoryLabelAdded < 3) {
     checkUnnamed3184(o.labelIds);
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterHistoryLabelAdded--;
 }
@@ -518,7 +518,7 @@
   buildCounterHistoryLabelRemoved++;
   if (buildCounterHistoryLabelRemoved < 3) {
     checkUnnamed3185(o.labelIds);
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterHistoryLabelRemoved--;
 }
@@ -537,7 +537,7 @@
 void checkHistoryMessageAdded(api.HistoryMessageAdded o) {
   buildCounterHistoryMessageAdded++;
   if (buildCounterHistoryMessageAdded < 3) {
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterHistoryMessageAdded--;
 }
@@ -556,7 +556,7 @@
 void checkHistoryMessageDeleted(api.HistoryMessageDeleted o) {
   buildCounterHistoryMessageDeleted++;
   if (buildCounterHistoryMessageDeleted < 3) {
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterHistoryMessageDeleted--;
 }
@@ -609,7 +609,7 @@
 void checkLabel(api.Label o) {
   buildCounterLabel++;
   if (buildCounterLabel < 3) {
-    checkLabelColor(o.color);
+    checkLabelColor(o.color as api.LabelColor);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.labelListVisibility, unittest.equals('foo'));
     unittest.expect(o.messageListVisibility, unittest.equals('foo'));
@@ -672,8 +672,8 @@
 
 void checkUnnamed3186(core.List<api.Delegate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDelegate(o[0]);
-  checkDelegate(o[1]);
+  checkDelegate(o[0] as api.Delegate);
+  checkDelegate(o[1] as api.Delegate);
 }
 
 core.int buildCounterListDelegatesResponse = 0;
@@ -704,8 +704,8 @@
 
 void checkUnnamed3187(core.List<api.Draft> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDraft(o[0]);
-  checkDraft(o[1]);
+  checkDraft(o[0] as api.Draft);
+  checkDraft(o[1] as api.Draft);
 }
 
 core.int buildCounterListDraftsResponse = 0;
@@ -740,8 +740,8 @@
 
 void checkUnnamed3188(core.List<api.Filter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilter(o[0]);
-  checkFilter(o[1]);
+  checkFilter(o[0] as api.Filter);
+  checkFilter(o[1] as api.Filter);
 }
 
 core.int buildCounterListFiltersResponse = 0;
@@ -772,8 +772,8 @@
 
 void checkUnnamed3189(core.List<api.ForwardingAddress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkForwardingAddress(o[0]);
-  checkForwardingAddress(o[1]);
+  checkForwardingAddress(o[0] as api.ForwardingAddress);
+  checkForwardingAddress(o[1] as api.ForwardingAddress);
 }
 
 core.int buildCounterListForwardingAddressesResponse = 0;
@@ -805,8 +805,8 @@
 
 void checkUnnamed3190(core.List<api.History> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistory(o[0]);
-  checkHistory(o[1]);
+  checkHistory(o[0] as api.History);
+  checkHistory(o[1] as api.History);
 }
 
 core.int buildCounterListHistoryResponse = 0;
@@ -841,8 +841,8 @@
 
 void checkUnnamed3191(core.List<api.Label> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabel(o[0]);
-  checkLabel(o[1]);
+  checkLabel(o[0] as api.Label);
+  checkLabel(o[1] as api.Label);
 }
 
 core.int buildCounterListLabelsResponse = 0;
@@ -873,8 +873,8 @@
 
 void checkUnnamed3192(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMessage(o[0]);
-  checkMessage(o[1]);
+  checkMessage(o[0] as api.Message);
+  checkMessage(o[1] as api.Message);
 }
 
 core.int buildCounterListMessagesResponse = 0;
@@ -909,8 +909,8 @@
 
 void checkUnnamed3193(core.List<api.SendAs> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSendAs(o[0]);
-  checkSendAs(o[1]);
+  checkSendAs(o[0] as api.SendAs);
+  checkSendAs(o[1] as api.SendAs);
 }
 
 core.int buildCounterListSendAsResponse = 0;
@@ -941,8 +941,8 @@
 
 void checkUnnamed3194(core.List<api.SmimeInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSmimeInfo(o[0]);
-  checkSmimeInfo(o[1]);
+  checkSmimeInfo(o[0] as api.SmimeInfo);
+  checkSmimeInfo(o[1] as api.SmimeInfo);
 }
 
 core.int buildCounterListSmimeInfoResponse = 0;
@@ -973,8 +973,8 @@
 
 void checkUnnamed3195(core.List<api.Thread> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThread(o[0]);
-  checkThread(o[1]);
+  checkThread(o[0] as api.Thread);
+  checkThread(o[1] as api.Thread);
 }
 
 core.int buildCounterListThreadsResponse = 0;
@@ -1039,7 +1039,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.internalDate, unittest.equals('foo'));
     checkUnnamed3196(o.labelIds);
-    checkMessagePart(o.payload);
+    checkMessagePart(o.payload as api.MessagePart);
     unittest.expect(o.raw, unittest.equals('foo'));
     unittest.expect(o.sizeEstimate, unittest.equals(42));
     unittest.expect(o.snippet, unittest.equals('foo'));
@@ -1057,8 +1057,8 @@
 
 void checkUnnamed3197(core.List<api.MessagePartHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMessagePartHeader(o[0]);
-  checkMessagePartHeader(o[1]);
+  checkMessagePartHeader(o[0] as api.MessagePartHeader);
+  checkMessagePartHeader(o[1] as api.MessagePartHeader);
 }
 
 core.List<api.MessagePart> buildUnnamed3198() {
@@ -1070,8 +1070,8 @@
 
 void checkUnnamed3198(core.List<api.MessagePart> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMessagePart(o[0]);
-  checkMessagePart(o[1]);
+  checkMessagePart(o[0] as api.MessagePart);
+  checkMessagePart(o[1] as api.MessagePart);
 }
 
 core.int buildCounterMessagePart = 0;
@@ -1093,7 +1093,7 @@
 void checkMessagePart(api.MessagePart o) {
   buildCounterMessagePart++;
   if (buildCounterMessagePart < 3) {
-    checkMessagePartBody(o.body);
+    checkMessagePartBody(o.body as api.MessagePartBody);
     unittest.expect(o.filename, unittest.equals('foo'));
     checkUnnamed3197(o.headers);
     unittest.expect(o.mimeType, unittest.equals('foo'));
@@ -1315,7 +1315,7 @@
     unittest.expect(o.replyToAddress, unittest.equals('foo'));
     unittest.expect(o.sendAsEmail, unittest.equals('foo'));
     unittest.expect(o.signature, unittest.equals('foo'));
-    checkSmtpMsa(o.smtpMsa);
+    checkSmtpMsa(o.smtpMsa as api.SmtpMsa);
     unittest.expect(o.treatAsAlias, unittest.isTrue);
     unittest.expect(o.verificationStatus, unittest.equals('foo'));
   }
@@ -1389,8 +1389,8 @@
 
 void checkUnnamed3203(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMessage(o[0]);
-  checkMessage(o[1]);
+  checkMessage(o[0] as api.Message);
+  checkMessage(o[1] as api.Message);
 }
 
 core.int buildCounterThread = 0;
@@ -1578,7 +1578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoForwarding();
       var od = api.AutoForwarding.fromJson(o.toJson());
-      checkAutoForwarding(od);
+      checkAutoForwarding(od as api.AutoForwarding);
     });
   });
 
@@ -1586,7 +1586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchDeleteMessagesRequest();
       var od = api.BatchDeleteMessagesRequest.fromJson(o.toJson());
-      checkBatchDeleteMessagesRequest(od);
+      checkBatchDeleteMessagesRequest(od as api.BatchDeleteMessagesRequest);
     });
   });
 
@@ -1594,7 +1594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchModifyMessagesRequest();
       var od = api.BatchModifyMessagesRequest.fromJson(o.toJson());
-      checkBatchModifyMessagesRequest(od);
+      checkBatchModifyMessagesRequest(od as api.BatchModifyMessagesRequest);
     });
   });
 
@@ -1602,7 +1602,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDelegate();
       var od = api.Delegate.fromJson(o.toJson());
-      checkDelegate(od);
+      checkDelegate(od as api.Delegate);
     });
   });
 
@@ -1610,7 +1610,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDraft();
       var od = api.Draft.fromJson(o.toJson());
-      checkDraft(od);
+      checkDraft(od as api.Draft);
     });
   });
 
@@ -1618,7 +1618,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilter();
       var od = api.Filter.fromJson(o.toJson());
-      checkFilter(od);
+      checkFilter(od as api.Filter);
     });
   });
 
@@ -1626,7 +1626,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterAction();
       var od = api.FilterAction.fromJson(o.toJson());
-      checkFilterAction(od);
+      checkFilterAction(od as api.FilterAction);
     });
   });
 
@@ -1634,7 +1634,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterCriteria();
       var od = api.FilterCriteria.fromJson(o.toJson());
-      checkFilterCriteria(od);
+      checkFilterCriteria(od as api.FilterCriteria);
     });
   });
 
@@ -1642,7 +1642,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingAddress();
       var od = api.ForwardingAddress.fromJson(o.toJson());
-      checkForwardingAddress(od);
+      checkForwardingAddress(od as api.ForwardingAddress);
     });
   });
 
@@ -1650,7 +1650,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistory();
       var od = api.History.fromJson(o.toJson());
-      checkHistory(od);
+      checkHistory(od as api.History);
     });
   });
 
@@ -1658,7 +1658,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistoryLabelAdded();
       var od = api.HistoryLabelAdded.fromJson(o.toJson());
-      checkHistoryLabelAdded(od);
+      checkHistoryLabelAdded(od as api.HistoryLabelAdded);
     });
   });
 
@@ -1666,7 +1666,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistoryLabelRemoved();
       var od = api.HistoryLabelRemoved.fromJson(o.toJson());
-      checkHistoryLabelRemoved(od);
+      checkHistoryLabelRemoved(od as api.HistoryLabelRemoved);
     });
   });
 
@@ -1674,7 +1674,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistoryMessageAdded();
       var od = api.HistoryMessageAdded.fromJson(o.toJson());
-      checkHistoryMessageAdded(od);
+      checkHistoryMessageAdded(od as api.HistoryMessageAdded);
     });
   });
 
@@ -1682,7 +1682,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistoryMessageDeleted();
       var od = api.HistoryMessageDeleted.fromJson(o.toJson());
-      checkHistoryMessageDeleted(od);
+      checkHistoryMessageDeleted(od as api.HistoryMessageDeleted);
     });
   });
 
@@ -1690,7 +1690,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImapSettings();
       var od = api.ImapSettings.fromJson(o.toJson());
-      checkImapSettings(od);
+      checkImapSettings(od as api.ImapSettings);
     });
   });
 
@@ -1698,7 +1698,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabel();
       var od = api.Label.fromJson(o.toJson());
-      checkLabel(od);
+      checkLabel(od as api.Label);
     });
   });
 
@@ -1706,7 +1706,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelColor();
       var od = api.LabelColor.fromJson(o.toJson());
-      checkLabelColor(od);
+      checkLabelColor(od as api.LabelColor);
     });
   });
 
@@ -1714,7 +1714,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguageSettings();
       var od = api.LanguageSettings.fromJson(o.toJson());
-      checkLanguageSettings(od);
+      checkLanguageSettings(od as api.LanguageSettings);
     });
   });
 
@@ -1722,7 +1722,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDelegatesResponse();
       var od = api.ListDelegatesResponse.fromJson(o.toJson());
-      checkListDelegatesResponse(od);
+      checkListDelegatesResponse(od as api.ListDelegatesResponse);
     });
   });
 
@@ -1730,7 +1730,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDraftsResponse();
       var od = api.ListDraftsResponse.fromJson(o.toJson());
-      checkListDraftsResponse(od);
+      checkListDraftsResponse(od as api.ListDraftsResponse);
     });
   });
 
@@ -1738,7 +1738,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFiltersResponse();
       var od = api.ListFiltersResponse.fromJson(o.toJson());
-      checkListFiltersResponse(od);
+      checkListFiltersResponse(od as api.ListFiltersResponse);
     });
   });
 
@@ -1746,7 +1746,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListForwardingAddressesResponse();
       var od = api.ListForwardingAddressesResponse.fromJson(o.toJson());
-      checkListForwardingAddressesResponse(od);
+      checkListForwardingAddressesResponse(
+          od as api.ListForwardingAddressesResponse);
     });
   });
 
@@ -1754,7 +1755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListHistoryResponse();
       var od = api.ListHistoryResponse.fromJson(o.toJson());
-      checkListHistoryResponse(od);
+      checkListHistoryResponse(od as api.ListHistoryResponse);
     });
   });
 
@@ -1762,7 +1763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLabelsResponse();
       var od = api.ListLabelsResponse.fromJson(o.toJson());
-      checkListLabelsResponse(od);
+      checkListLabelsResponse(od as api.ListLabelsResponse);
     });
   });
 
@@ -1770,7 +1771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListMessagesResponse();
       var od = api.ListMessagesResponse.fromJson(o.toJson());
-      checkListMessagesResponse(od);
+      checkListMessagesResponse(od as api.ListMessagesResponse);
     });
   });
 
@@ -1778,7 +1779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSendAsResponse();
       var od = api.ListSendAsResponse.fromJson(o.toJson());
-      checkListSendAsResponse(od);
+      checkListSendAsResponse(od as api.ListSendAsResponse);
     });
   });
 
@@ -1786,7 +1787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSmimeInfoResponse();
       var od = api.ListSmimeInfoResponse.fromJson(o.toJson());
-      checkListSmimeInfoResponse(od);
+      checkListSmimeInfoResponse(od as api.ListSmimeInfoResponse);
     });
   });
 
@@ -1794,7 +1795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListThreadsResponse();
       var od = api.ListThreadsResponse.fromJson(o.toJson());
-      checkListThreadsResponse(od);
+      checkListThreadsResponse(od as api.ListThreadsResponse);
     });
   });
 
@@ -1802,7 +1803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessage();
       var od = api.Message.fromJson(o.toJson());
-      checkMessage(od);
+      checkMessage(od as api.Message);
     });
   });
 
@@ -1810,7 +1811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessagePart();
       var od = api.MessagePart.fromJson(o.toJson());
-      checkMessagePart(od);
+      checkMessagePart(od as api.MessagePart);
     });
   });
 
@@ -1818,7 +1819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessagePartBody();
       var od = api.MessagePartBody.fromJson(o.toJson());
-      checkMessagePartBody(od);
+      checkMessagePartBody(od as api.MessagePartBody);
     });
   });
 
@@ -1826,7 +1827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessagePartHeader();
       var od = api.MessagePartHeader.fromJson(o.toJson());
-      checkMessagePartHeader(od);
+      checkMessagePartHeader(od as api.MessagePartHeader);
     });
   });
 
@@ -1834,7 +1835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyMessageRequest();
       var od = api.ModifyMessageRequest.fromJson(o.toJson());
-      checkModifyMessageRequest(od);
+      checkModifyMessageRequest(od as api.ModifyMessageRequest);
     });
   });
 
@@ -1842,7 +1843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyThreadRequest();
       var od = api.ModifyThreadRequest.fromJson(o.toJson());
-      checkModifyThreadRequest(od);
+      checkModifyThreadRequest(od as api.ModifyThreadRequest);
     });
   });
 
@@ -1850,7 +1851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPopSettings();
       var od = api.PopSettings.fromJson(o.toJson());
-      checkPopSettings(od);
+      checkPopSettings(od as api.PopSettings);
     });
   });
 
@@ -1858,7 +1859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfile();
       var od = api.Profile.fromJson(o.toJson());
-      checkProfile(od);
+      checkProfile(od as api.Profile);
     });
   });
 
@@ -1866,7 +1867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSendAs();
       var od = api.SendAs.fromJson(o.toJson());
-      checkSendAs(od);
+      checkSendAs(od as api.SendAs);
     });
   });
 
@@ -1874,7 +1875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSmimeInfo();
       var od = api.SmimeInfo.fromJson(o.toJson());
-      checkSmimeInfo(od);
+      checkSmimeInfo(od as api.SmimeInfo);
     });
   });
 
@@ -1882,7 +1883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSmtpMsa();
       var od = api.SmtpMsa.fromJson(o.toJson());
-      checkSmtpMsa(od);
+      checkSmtpMsa(od as api.SmtpMsa);
     });
   });
 
@@ -1890,7 +1891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThread();
       var od = api.Thread.fromJson(o.toJson());
-      checkThread(od);
+      checkThread(od as api.Thread);
     });
   });
 
@@ -1898,7 +1899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVacationSettings();
       var od = api.VacationSettings.fromJson(o.toJson());
-      checkVacationSettings(od);
+      checkVacationSettings(od as api.VacationSettings);
     });
   });
 
@@ -1906,7 +1907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWatchRequest();
       var od = api.WatchRequest.fromJson(o.toJson());
-      checkWatchRequest(od);
+      checkWatchRequest(od as api.WatchRequest);
     });
   });
 
@@ -1914,7 +1915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWatchResponse();
       var od = api.WatchResponse.fromJson(o.toJson());
-      checkWatchResponse(od);
+      checkWatchResponse(od as api.WatchResponse);
     });
   });
 
@@ -1971,7 +1972,7 @@
       res
           .getProfile(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProfile(response);
+        checkProfile(response as api.Profile);
       })));
     });
 
@@ -2036,8 +2037,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WatchRequest.fromJson(json);
-        checkWatchRequest(obj);
+        var obj = api.WatchRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWatchRequest(obj as api.WatchRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2085,7 +2087,7 @@
       res
           .watch(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWatchResponse(response);
+        checkWatchResponse(response as api.WatchResponse);
       })));
     });
   });
@@ -2101,8 +2103,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Draft.fromJson(json);
-        checkDraft(obj);
+        var obj =
+            api.Draft.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDraft(obj as api.Draft);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2150,7 +2153,7 @@
       res
           .create(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDraft(response);
+        checkDraft(response as api.Draft);
       })));
     });
 
@@ -2270,7 +2273,7 @@
       res
           .get(arg_userId, arg_id, format: arg_format, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDraft(response);
+        checkDraft(response as api.Draft);
       })));
     });
 
@@ -2342,7 +2345,7 @@
               q: arg_q,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDraftsResponse(response);
+        checkListDraftsResponse(response as api.ListDraftsResponse);
       })));
     });
 
@@ -2356,8 +2359,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Draft.fromJson(json);
-        checkDraft(obj);
+        var obj =
+            api.Draft.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDraft(obj as api.Draft);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2405,7 +2409,7 @@
       res
           .send(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -2420,8 +2424,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Draft.fromJson(json);
-        checkDraft(obj);
+        var obj =
+            api.Draft.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDraft(obj as api.Draft);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2472,7 +2477,7 @@
       res
           .update(arg_request, arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDraft(response);
+        checkDraft(response as api.Draft);
       })));
     });
   });
@@ -2551,7 +2556,7 @@
               startHistoryId: arg_startHistoryId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListHistoryResponse(response);
+        checkListHistoryResponse(response as api.ListHistoryResponse);
       })));
     });
   });
@@ -2564,8 +2569,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Label.fromJson(json);
-        checkLabel(obj);
+        var obj =
+            api.Label.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLabel(obj as api.Label);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2613,7 +2619,7 @@
       res
           .create(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLabel(response);
+        checkLabel(response as api.Label);
       })));
     });
 
@@ -2731,7 +2737,7 @@
       res
           .get(arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLabel(response);
+        checkLabel(response as api.Label);
       })));
     });
 
@@ -2787,7 +2793,7 @@
       res
           .list(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLabelsResponse(response);
+        checkListLabelsResponse(response as api.ListLabelsResponse);
       })));
     });
 
@@ -2799,8 +2805,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Label.fromJson(json);
-        checkLabel(obj);
+        var obj =
+            api.Label.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLabel(obj as api.Label);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2851,7 +2858,7 @@
       res
           .patch(arg_request, arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLabel(response);
+        checkLabel(response as api.Label);
       })));
     });
 
@@ -2863,8 +2870,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Label.fromJson(json);
-        checkLabel(obj);
+        var obj =
+            api.Label.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLabel(obj as api.Label);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2915,7 +2923,7 @@
       res
           .update(arg_request, arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLabel(response);
+        checkLabel(response as api.Label);
       })));
     });
   });
@@ -2928,8 +2936,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchDeleteMessagesRequest.fromJson(json);
-        checkBatchDeleteMessagesRequest(obj);
+        var obj = api.BatchDeleteMessagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchDeleteMessagesRequest(obj as api.BatchDeleteMessagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2986,8 +2995,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchModifyMessagesRequest.fromJson(json);
-        checkBatchModifyMessagesRequest(obj);
+        var obj = api.BatchModifyMessagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchModifyMessagesRequest(obj as api.BatchModifyMessagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3159,7 +3169,7 @@
               metadataHeaders: arg_metadataHeaders,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -3177,8 +3187,9 @@
       var arg_processForCalendar = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Message.fromJson(json);
-        checkMessage(obj);
+        var obj =
+            api.Message.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMessage(obj as api.Message);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3239,7 +3250,7 @@
               processForCalendar: arg_processForCalendar,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -3255,8 +3266,9 @@
       var arg_internalDateSource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Message.fromJson(json);
-        checkMessage(obj);
+        var obj =
+            api.Message.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMessage(obj as api.Message);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3311,7 +3323,7 @@
               internalDateSource: arg_internalDateSource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -3386,7 +3398,7 @@
               q: arg_q,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMessagesResponse(response);
+        checkListMessagesResponse(response as api.ListMessagesResponse);
       })));
     });
 
@@ -3398,8 +3410,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyMessageRequest.fromJson(json);
-        checkModifyMessageRequest(obj);
+        var obj = api.ModifyMessageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyMessageRequest(obj as api.ModifyMessageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3456,7 +3469,7 @@
       res
           .modify(arg_request, arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -3470,8 +3483,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Message.fromJson(json);
-        checkMessage(obj);
+        var obj =
+            api.Message.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMessage(obj as api.Message);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3519,7 +3533,7 @@
       res
           .send(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -3585,7 +3599,7 @@
       res
           .trash(arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -3651,7 +3665,7 @@
       res
           .untrash(arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
   });
@@ -3723,7 +3737,7 @@
       res
           .get(arg_userId, arg_messageId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessagePartBody(response);
+        checkMessagePartBody(response as api.MessagePartBody);
       })));
     });
   });
@@ -3781,7 +3795,7 @@
       res
           .getAutoForwarding(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoForwarding(response);
+        checkAutoForwarding(response as api.AutoForwarding);
       })));
     });
 
@@ -3837,7 +3851,7 @@
       res
           .getImap(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImapSettings(response);
+        checkImapSettings(response as api.ImapSettings);
       })));
     });
 
@@ -3893,7 +3907,7 @@
       res
           .getLanguage(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLanguageSettings(response);
+        checkLanguageSettings(response as api.LanguageSettings);
       })));
     });
 
@@ -3949,7 +3963,7 @@
       res
           .getPop(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPopSettings(response);
+        checkPopSettings(response as api.PopSettings);
       })));
     });
 
@@ -4005,7 +4019,7 @@
       res
           .getVacation(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVacationSettings(response);
+        checkVacationSettings(response as api.VacationSettings);
       })));
     });
 
@@ -4016,8 +4030,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AutoForwarding.fromJson(json);
-        checkAutoForwarding(obj);
+        var obj = api.AutoForwarding.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAutoForwarding(obj as api.AutoForwarding);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4065,7 +4080,7 @@
       res
           .updateAutoForwarding(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAutoForwarding(response);
+        checkAutoForwarding(response as api.AutoForwarding);
       })));
     });
 
@@ -4076,8 +4091,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ImapSettings.fromJson(json);
-        checkImapSettings(obj);
+        var obj = api.ImapSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkImapSettings(obj as api.ImapSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4125,7 +4141,7 @@
       res
           .updateImap(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImapSettings(response);
+        checkImapSettings(response as api.ImapSettings);
       })));
     });
 
@@ -4136,8 +4152,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LanguageSettings.fromJson(json);
-        checkLanguageSettings(obj);
+        var obj = api.LanguageSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLanguageSettings(obj as api.LanguageSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4185,7 +4202,7 @@
       res
           .updateLanguage(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLanguageSettings(response);
+        checkLanguageSettings(response as api.LanguageSettings);
       })));
     });
 
@@ -4196,8 +4213,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PopSettings.fromJson(json);
-        checkPopSettings(obj);
+        var obj = api.PopSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPopSettings(obj as api.PopSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4245,7 +4263,7 @@
       res
           .updatePop(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPopSettings(response);
+        checkPopSettings(response as api.PopSettings);
       })));
     });
 
@@ -4256,8 +4274,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.VacationSettings.fromJson(json);
-        checkVacationSettings(obj);
+        var obj = api.VacationSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkVacationSettings(obj as api.VacationSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4305,7 +4324,7 @@
       res
           .updateVacation(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVacationSettings(response);
+        checkVacationSettings(response as api.VacationSettings);
       })));
     });
   });
@@ -4318,8 +4337,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Delegate.fromJson(json);
-        checkDelegate(obj);
+        var obj =
+            api.Delegate.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDelegate(obj as api.Delegate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4367,7 +4387,7 @@
       res
           .create(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDelegate(response);
+        checkDelegate(response as api.Delegate);
       })));
     });
 
@@ -4485,7 +4505,7 @@
       res
           .get(arg_userId, arg_delegateEmail, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDelegate(response);
+        checkDelegate(response as api.Delegate);
       })));
     });
 
@@ -4541,7 +4561,7 @@
       res
           .list(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDelegatesResponse(response);
+        checkListDelegatesResponse(response as api.ListDelegatesResponse);
       })));
     });
   });
@@ -4554,8 +4574,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Filter.fromJson(json);
-        checkFilter(obj);
+        var obj =
+            api.Filter.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFilter(obj as api.Filter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4603,7 +4624,7 @@
       res
           .create(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilter(response);
+        checkFilter(response as api.Filter);
       })));
     });
 
@@ -4721,7 +4742,7 @@
       res
           .get(arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFilter(response);
+        checkFilter(response as api.Filter);
       })));
     });
 
@@ -4777,7 +4798,7 @@
       res
           .list(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFiltersResponse(response);
+        checkListFiltersResponse(response as api.ListFiltersResponse);
       })));
     });
   });
@@ -4790,8 +4811,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ForwardingAddress.fromJson(json);
-        checkForwardingAddress(obj);
+        var obj = api.ForwardingAddress.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkForwardingAddress(obj as api.ForwardingAddress);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4839,7 +4861,7 @@
       res
           .create(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkForwardingAddress(response);
+        checkForwardingAddress(response as api.ForwardingAddress);
       })));
     });
 
@@ -4957,7 +4979,7 @@
       res
           .get(arg_userId, arg_forwardingEmail, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkForwardingAddress(response);
+        checkForwardingAddress(response as api.ForwardingAddress);
       })));
     });
 
@@ -5013,7 +5035,8 @@
       res
           .list(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListForwardingAddressesResponse(response);
+        checkListForwardingAddressesResponse(
+            response as api.ListForwardingAddressesResponse);
       })));
     });
   });
@@ -5026,8 +5049,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SendAs.fromJson(json);
-        checkSendAs(obj);
+        var obj =
+            api.SendAs.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSendAs(obj as api.SendAs);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5075,7 +5099,7 @@
       res
           .create(arg_request, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSendAs(response);
+        checkSendAs(response as api.SendAs);
       })));
     });
 
@@ -5193,7 +5217,7 @@
       res
           .get(arg_userId, arg_sendAsEmail, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSendAs(response);
+        checkSendAs(response as api.SendAs);
       })));
     });
 
@@ -5249,7 +5273,7 @@
       res
           .list(arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSendAsResponse(response);
+        checkListSendAsResponse(response as api.ListSendAsResponse);
       })));
     });
 
@@ -5261,8 +5285,9 @@
       var arg_sendAsEmail = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SendAs.fromJson(json);
-        checkSendAs(obj);
+        var obj =
+            api.SendAs.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSendAs(obj as api.SendAs);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5313,7 +5338,7 @@
       res
           .patch(arg_request, arg_userId, arg_sendAsEmail, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSendAs(response);
+        checkSendAs(response as api.SendAs);
       })));
     });
 
@@ -5325,8 +5350,9 @@
       var arg_sendAsEmail = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SendAs.fromJson(json);
-        checkSendAs(obj);
+        var obj =
+            api.SendAs.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSendAs(obj as api.SendAs);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5378,7 +5404,7 @@
           .update(arg_request, arg_userId, arg_sendAsEmail,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSendAs(response);
+        checkSendAs(response as api.SendAs);
       })));
     });
 
@@ -5582,7 +5608,7 @@
       res
           .get(arg_userId, arg_sendAsEmail, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSmimeInfo(response);
+        checkSmimeInfo(response as api.SmimeInfo);
       })));
     });
 
@@ -5594,8 +5620,9 @@
       var arg_sendAsEmail = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SmimeInfo.fromJson(json);
-        checkSmimeInfo(obj);
+        var obj =
+            api.SmimeInfo.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSmimeInfo(obj as api.SmimeInfo);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5653,7 +5680,7 @@
           .insert(arg_request, arg_userId, arg_sendAsEmail,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSmimeInfo(response);
+        checkSmimeInfo(response as api.SmimeInfo);
       })));
     });
 
@@ -5719,7 +5746,7 @@
       res
           .list(arg_userId, arg_sendAsEmail, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSmimeInfoResponse(response);
+        checkListSmimeInfoResponse(response as api.ListSmimeInfoResponse);
       })));
     });
 
@@ -5921,7 +5948,7 @@
               metadataHeaders: arg_metadataHeaders,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThread(response);
+        checkThread(response as api.Thread);
       })));
     });
 
@@ -5996,7 +6023,7 @@
               q: arg_q,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListThreadsResponse(response);
+        checkListThreadsResponse(response as api.ListThreadsResponse);
       })));
     });
 
@@ -6008,8 +6035,9 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyThreadRequest.fromJson(json);
-        checkModifyThreadRequest(obj);
+        var obj = api.ModifyThreadRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyThreadRequest(obj as api.ModifyThreadRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6066,7 +6094,7 @@
       res
           .modify(arg_request, arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThread(response);
+        checkThread(response as api.Thread);
       })));
     });
 
@@ -6132,7 +6160,7 @@
       res
           .trash(arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThread(response);
+        checkThread(response as api.Thread);
       })));
     });
 
@@ -6198,7 +6226,7 @@
       res
           .untrash(arg_userId, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThread(response);
+        checkThread(response as api.Thread);
       })));
     });
   });
diff --git a/generated/googleapis/test/groupsmigration/v1_test.dart b/generated/googleapis/test/groupsmigration/v1_test.dart
index feb324d..33e1e65 100644
--- a/generated/googleapis/test/groupsmigration/v1_test.dart
+++ b/generated/googleapis/test/groupsmigration/v1_test.dart
@@ -100,7 +100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroups();
       var od = api.Groups.fromJson(o.toJson());
-      checkGroups(od);
+      checkGroups(od as api.Groups);
     });
   });
 
@@ -160,7 +160,7 @@
       res
           .insert(arg_groupId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroups(response);
+        checkGroups(response as api.Groups);
       })));
     });
   });
diff --git a/generated/googleapis/test/groupssettings/v1_test.dart b/generated/googleapis/test/groupssettings/v1_test.dart
index 24a9264..3a7c6c4 100644
--- a/generated/googleapis/test/groupssettings/v1_test.dart
+++ b/generated/googleapis/test/groupssettings/v1_test.dart
@@ -223,7 +223,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroups();
       var od = api.Groups.fromJson(o.toJson());
-      checkGroups(od);
+      checkGroups(od as api.Groups);
     });
   });
 
@@ -268,7 +268,7 @@
       res
           .get(arg_groupUniqueId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroups(response);
+        checkGroups(response as api.Groups);
       })));
     });
 
@@ -279,8 +279,9 @@
       var arg_groupUniqueId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Groups.fromJson(json);
-        checkGroups(obj);
+        var obj =
+            api.Groups.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroups(obj as api.Groups);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -316,7 +317,7 @@
       res
           .patch(arg_request, arg_groupUniqueId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroups(response);
+        checkGroups(response as api.Groups);
       })));
     });
 
@@ -327,8 +328,9 @@
       var arg_groupUniqueId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Groups.fromJson(json);
-        checkGroups(obj);
+        var obj =
+            api.Groups.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroups(obj as api.Groups);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -364,7 +366,7 @@
       res
           .update(arg_request, arg_groupUniqueId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroups(response);
+        checkGroups(response as api.Groups);
       })));
     });
   });
diff --git a/generated/googleapis/test/healthcare/v1_test.dart b/generated/googleapis/test/healthcare/v1_test.dart
index 4a677a1..360f229 100644
--- a/generated/googleapis/test/healthcare/v1_test.dart
+++ b/generated/googleapis/test/healthcare/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed2598(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -171,7 +171,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2600(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -226,7 +226,7 @@
 void checkCreateMessageRequest(api.CreateMessageRequest o) {
   buildCounterCreateMessageRequest++;
   if (buildCounterCreateMessageRequest < 3) {
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterCreateMessageRequest--;
 }
@@ -307,10 +307,10 @@
 void checkDeidentifyConfig(api.DeidentifyConfig o) {
   buildCounterDeidentifyConfig++;
   if (buildCounterDeidentifyConfig < 3) {
-    checkDicomConfig(o.dicom);
-    checkFhirConfig(o.fhir);
-    checkImageConfig(o.image);
-    checkTextConfig(o.text);
+    checkDicomConfig(o.dicom as api.DicomConfig);
+    checkFhirConfig(o.fhir as api.FhirConfig);
+    checkImageConfig(o.image as api.ImageConfig);
+    checkTextConfig(o.text as api.TextConfig);
   }
   buildCounterDeidentifyConfig--;
 }
@@ -330,7 +330,7 @@
 void checkDeidentifyDatasetRequest(api.DeidentifyDatasetRequest o) {
   buildCounterDeidentifyDatasetRequest++;
   if (buildCounterDeidentifyDatasetRequest < 3) {
-    checkDeidentifyConfig(o.config);
+    checkDeidentifyConfig(o.config as api.DeidentifyConfig);
     unittest.expect(o.destinationDataset, unittest.equals('foo'));
   }
   buildCounterDeidentifyDatasetRequest--;
@@ -352,9 +352,9 @@
 void checkDeidentifyDicomStoreRequest(api.DeidentifyDicomStoreRequest o) {
   buildCounterDeidentifyDicomStoreRequest++;
   if (buildCounterDeidentifyDicomStoreRequest < 3) {
-    checkDeidentifyConfig(o.config);
+    checkDeidentifyConfig(o.config as api.DeidentifyConfig);
     unittest.expect(o.destinationStore, unittest.equals('foo'));
-    checkDicomFilterConfig(o.filterConfig);
+    checkDicomFilterConfig(o.filterConfig as api.DicomFilterConfig);
   }
   buildCounterDeidentifyDicomStoreRequest--;
 }
@@ -375,9 +375,9 @@
 void checkDeidentifyFhirStoreRequest(api.DeidentifyFhirStoreRequest o) {
   buildCounterDeidentifyFhirStoreRequest++;
   if (buildCounterDeidentifyFhirStoreRequest < 3) {
-    checkDeidentifyConfig(o.config);
+    checkDeidentifyConfig(o.config as api.DeidentifyConfig);
     unittest.expect(o.destinationStore, unittest.equals('foo'));
-    checkFhirFilter(o.resourceFilter);
+    checkFhirFilter(o.resourceFilter as api.FhirFilter);
   }
   buildCounterDeidentifyFhirStoreRequest--;
 }
@@ -415,8 +415,8 @@
   buildCounterDicomConfig++;
   if (buildCounterDicomConfig < 3) {
     unittest.expect(o.filterProfile, unittest.equals('foo'));
-    checkTagFilterList(o.keepList);
-    checkTagFilterList(o.removeList);
+    checkTagFilterList(o.keepList as api.TagFilterList);
+    checkTagFilterList(o.removeList as api.TagFilterList);
     unittest.expect(o.skipIdRedaction, unittest.isTrue);
   }
   buildCounterDicomConfig--;
@@ -472,7 +472,7 @@
   if (buildCounterDicomStore < 3) {
     checkUnnamed2601(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNotificationConfig(o.notificationConfig);
+    checkNotificationConfig(o.notificationConfig as api.NotificationConfig);
   }
   buildCounterDicomStore--;
 }
@@ -508,8 +508,10 @@
 void checkExportDicomDataRequest(api.ExportDicomDataRequest o) {
   buildCounterExportDicomDataRequest++;
   if (buildCounterExportDicomDataRequest < 3) {
-    checkGoogleCloudHealthcareV1DicomBigQueryDestination(o.bigqueryDestination);
-    checkGoogleCloudHealthcareV1DicomGcsDestination(o.gcsDestination);
+    checkGoogleCloudHealthcareV1DicomBigQueryDestination(o.bigqueryDestination
+        as api.GoogleCloudHealthcareV1DicomBigQueryDestination);
+    checkGoogleCloudHealthcareV1DicomGcsDestination(
+        o.gcsDestination as api.GoogleCloudHealthcareV1DicomGcsDestination);
   }
   buildCounterExportDicomDataRequest--;
 }
@@ -545,8 +547,10 @@
 void checkExportResourcesRequest(api.ExportResourcesRequest o) {
   buildCounterExportResourcesRequest++;
   if (buildCounterExportResourcesRequest < 3) {
-    checkGoogleCloudHealthcareV1FhirBigQueryDestination(o.bigqueryDestination);
-    checkGoogleCloudHealthcareV1FhirGcsDestination(o.gcsDestination);
+    checkGoogleCloudHealthcareV1FhirBigQueryDestination(o.bigqueryDestination
+        as api.GoogleCloudHealthcareV1FhirBigQueryDestination);
+    checkGoogleCloudHealthcareV1FhirGcsDestination(
+        o.gcsDestination as api.GoogleCloudHealthcareV1FhirGcsDestination);
   }
   buildCounterExportResourcesRequest--;
 }
@@ -600,8 +604,8 @@
 
 void checkUnnamed2602(core.List<api.FieldMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFieldMetadata(o[0]);
-  checkFieldMetadata(o[1]);
+  checkFieldMetadata(o[0] as api.FieldMetadata);
+  checkFieldMetadata(o[1] as api.FieldMetadata);
 }
 
 core.int buildCounterFhirConfig = 0;
@@ -637,7 +641,7 @@
 void checkFhirFilter(api.FhirFilter o) {
   buildCounterFhirFilter++;
   if (buildCounterFhirFilter < 3) {
-    checkResources(o.resources);
+    checkResources(o.resources as api.Resources);
   }
   buildCounterFhirFilter--;
 }
@@ -664,8 +668,8 @@
 
 void checkUnnamed2604(core.List<api.StreamConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStreamConfig(o[0]);
-  checkStreamConfig(o[1]);
+  checkStreamConfig(o[0] as api.StreamConfig);
+  checkStreamConfig(o[1] as api.StreamConfig);
 }
 
 core.int buildCounterFhirStore = 0;
@@ -694,7 +698,7 @@
     unittest.expect(o.enableUpdateCreate, unittest.isTrue);
     checkUnnamed2603(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNotificationConfig(o.notificationConfig);
+    checkNotificationConfig(o.notificationConfig as api.NotificationConfig);
     checkUnnamed2604(o.streamConfigs);
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -863,7 +867,7 @@
   if (buildCounterGoogleCloudHealthcareV1FhirBigQueryDestination < 3) {
     unittest.expect(o.datasetUri, unittest.equals('foo'));
     unittest.expect(o.force, unittest.isTrue);
-    checkSchemaConfig(o.schemaConfig);
+    checkSchemaConfig(o.schemaConfig as api.SchemaConfig);
   }
   buildCounterGoogleCloudHealthcareV1FhirBigQueryDestination--;
 }
@@ -953,8 +957,8 @@
 
 void checkUnnamed2607(core.List<api.Hl7V2NotificationConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHl7V2NotificationConfig(o[0]);
-  checkHl7V2NotificationConfig(o[1]);
+  checkHl7V2NotificationConfig(o[0] as api.Hl7V2NotificationConfig);
+  checkHl7V2NotificationConfig(o[1] as api.Hl7V2NotificationConfig);
 }
 
 core.int buildCounterHl7V2Store = 0;
@@ -978,7 +982,7 @@
     checkUnnamed2606(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2607(o.notificationConfigs);
-    checkParserConfig(o.parserConfig);
+    checkParserConfig(o.parserConfig as api.ParserConfig);
     unittest.expect(o.rejectDuplicateMessage, unittest.isTrue);
   }
   buildCounterHl7V2Store--;
@@ -1082,7 +1086,8 @@
 void checkImportDicomDataRequest(api.ImportDicomDataRequest o) {
   buildCounterImportDicomDataRequest++;
   if (buildCounterImportDicomDataRequest < 3) {
-    checkGoogleCloudHealthcareV1DicomGcsSource(o.gcsSource);
+    checkGoogleCloudHealthcareV1DicomGcsSource(
+        o.gcsSource as api.GoogleCloudHealthcareV1DicomGcsSource);
   }
   buildCounterImportDicomDataRequest--;
 }
@@ -1118,7 +1123,8 @@
   buildCounterImportResourcesRequest++;
   if (buildCounterImportResourcesRequest < 3) {
     unittest.expect(o.contentStructure, unittest.equals('foo'));
-    checkGoogleCloudHealthcareV1FhirGcsSource(o.gcsSource);
+    checkGoogleCloudHealthcareV1FhirGcsSource(
+        o.gcsSource as api.GoogleCloudHealthcareV1FhirGcsSource);
   }
   buildCounterImportResourcesRequest--;
 }
@@ -1170,12 +1176,13 @@
 void checkInfoTypeTransformation(api.InfoTypeTransformation o) {
   buildCounterInfoTypeTransformation++;
   if (buildCounterInfoTypeTransformation < 3) {
-    checkCharacterMaskConfig(o.characterMaskConfig);
-    checkCryptoHashConfig(o.cryptoHashConfig);
-    checkDateShiftConfig(o.dateShiftConfig);
+    checkCharacterMaskConfig(o.characterMaskConfig as api.CharacterMaskConfig);
+    checkCryptoHashConfig(o.cryptoHashConfig as api.CryptoHashConfig);
+    checkDateShiftConfig(o.dateShiftConfig as api.DateShiftConfig);
     checkUnnamed2610(o.infoTypes);
-    checkRedactConfig(o.redactConfig);
-    checkReplaceWithInfoTypeConfig(o.replaceWithInfoTypeConfig);
+    checkRedactConfig(o.redactConfig as api.RedactConfig);
+    checkReplaceWithInfoTypeConfig(
+        o.replaceWithInfoTypeConfig as api.ReplaceWithInfoTypeConfig);
   }
   buildCounterInfoTypeTransformation--;
 }
@@ -1194,7 +1201,7 @@
 void checkIngestMessageRequest(api.IngestMessageRequest o) {
   buildCounterIngestMessageRequest++;
   if (buildCounterIngestMessageRequest < 3) {
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterIngestMessageRequest--;
 }
@@ -1215,7 +1222,7 @@
   buildCounterIngestMessageResponse++;
   if (buildCounterIngestMessageResponse < 3) {
     unittest.expect(o.hl7Ack, unittest.equals('foo'));
-    checkMessage(o.message);
+    checkMessage(o.message as api.Message);
   }
   buildCounterIngestMessageResponse--;
 }
@@ -1229,8 +1236,8 @@
 
 void checkUnnamed2611(core.List<api.Dataset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataset(o[0]);
-  checkDataset(o[1]);
+  checkDataset(o[0] as api.Dataset);
+  checkDataset(o[1] as api.Dataset);
 }
 
 core.int buildCounterListDatasetsResponse = 0;
@@ -1263,8 +1270,8 @@
 
 void checkUnnamed2612(core.List<api.DicomStore> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDicomStore(o[0]);
-  checkDicomStore(o[1]);
+  checkDicomStore(o[0] as api.DicomStore);
+  checkDicomStore(o[1] as api.DicomStore);
 }
 
 core.int buildCounterListDicomStoresResponse = 0;
@@ -1297,8 +1304,8 @@
 
 void checkUnnamed2613(core.List<api.FhirStore> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFhirStore(o[0]);
-  checkFhirStore(o[1]);
+  checkFhirStore(o[0] as api.FhirStore);
+  checkFhirStore(o[1] as api.FhirStore);
 }
 
 core.int buildCounterListFhirStoresResponse = 0;
@@ -1331,8 +1338,8 @@
 
 void checkUnnamed2614(core.List<api.Hl7V2Store> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHl7V2Store(o[0]);
-  checkHl7V2Store(o[1]);
+  checkHl7V2Store(o[0] as api.Hl7V2Store);
+  checkHl7V2Store(o[1] as api.Hl7V2Store);
 }
 
 core.int buildCounterListHl7V2StoresResponse = 0;
@@ -1365,8 +1372,8 @@
 
 void checkUnnamed2615(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -1399,8 +1406,8 @@
 
 void checkUnnamed2616(core.List<api.Message> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMessage(o[0]);
-  checkMessage(o[1]);
+  checkMessage(o[0] as api.Message);
+  checkMessage(o[1] as api.Message);
 }
 
 core.int buildCounterListMessagesResponse = 0;
@@ -1433,8 +1440,8 @@
 
 void checkUnnamed2617(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1549,8 +1556,8 @@
 
 void checkUnnamed2621(core.List<api.PatientId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPatientId(o[0]);
-  checkPatientId(o[1]);
+  checkPatientId(o[0] as api.PatientId);
+  checkPatientId(o[1] as api.PatientId);
 }
 
 core.int buildCounterMessage = 0;
@@ -1580,7 +1587,7 @@
     checkUnnamed2620(o.labels);
     unittest.expect(o.messageType, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkParsedData(o.parsedData);
+    checkParsedData(o.parsedData as api.ParsedData);
     checkUnnamed2621(o.patientIds);
     unittest.expect(o.sendFacility, unittest.equals('foo'));
     unittest.expect(o.sendTime, unittest.equals('foo'));
@@ -1684,7 +1691,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed2622(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2623(o.response);
@@ -1713,7 +1720,7 @@
   if (buildCounterOperationMetadata < 3) {
     unittest.expect(o.apiMethodName, unittest.equals('foo'));
     unittest.expect(o.cancelRequested, unittest.isTrue);
-    checkProgressCounter(o.counter);
+    checkProgressCounter(o.counter as api.ProgressCounter);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.logsUrl, unittest.equals('foo'));
@@ -1730,8 +1737,8 @@
 
 void checkUnnamed2624(core.List<api.Segment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSegment(o[0]);
-  checkSegment(o[1]);
+  checkSegment(o[0] as api.Segment);
+  checkSegment(o[1] as api.Segment);
 }
 
 core.int buildCounterParsedData = 0;
@@ -1804,8 +1811,8 @@
 
 void checkUnnamed2625(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed2626() {
@@ -1817,8 +1824,8 @@
 
 void checkUnnamed2626(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -2022,7 +2029,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -2122,7 +2129,8 @@
 void checkStreamConfig(api.StreamConfig o) {
   buildCounterStreamConfig++;
   if (buildCounterStreamConfig < 3) {
-    checkGoogleCloudHealthcareV1FhirBigQueryDestination(o.bigqueryDestination);
+    checkGoogleCloudHealthcareV1FhirBigQueryDestination(o.bigqueryDestination
+        as api.GoogleCloudHealthcareV1FhirBigQueryDestination);
     checkUnnamed2631(o.resourceTypes);
   }
   buildCounterStreamConfig--;
@@ -2233,8 +2241,8 @@
 
 void checkUnnamed2635(core.List<api.InfoTypeTransformation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInfoTypeTransformation(o[0]);
-  checkInfoTypeTransformation(o[1]);
+  checkInfoTypeTransformation(o[0] as api.InfoTypeTransformation);
+  checkInfoTypeTransformation(o[1] as api.InfoTypeTransformation);
 }
 
 core.int buildCounterTextConfig = 0;
@@ -2261,7 +2269,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -2269,7 +2277,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -2277,7 +2285,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -2285,7 +2293,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -2293,7 +2301,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCharacterMaskConfig();
       var od = api.CharacterMaskConfig.fromJson(o.toJson());
-      checkCharacterMaskConfig(od);
+      checkCharacterMaskConfig(od as api.CharacterMaskConfig);
     });
   });
 
@@ -2301,7 +2309,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateMessageRequest();
       var od = api.CreateMessageRequest.fromJson(o.toJson());
-      checkCreateMessageRequest(od);
+      checkCreateMessageRequest(od as api.CreateMessageRequest);
     });
   });
 
@@ -2309,7 +2317,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCryptoHashConfig();
       var od = api.CryptoHashConfig.fromJson(o.toJson());
-      checkCryptoHashConfig(od);
+      checkCryptoHashConfig(od as api.CryptoHashConfig);
     });
   });
 
@@ -2317,7 +2325,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataset();
       var od = api.Dataset.fromJson(o.toJson());
-      checkDataset(od);
+      checkDataset(od as api.Dataset);
     });
   });
 
@@ -2325,7 +2333,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateShiftConfig();
       var od = api.DateShiftConfig.fromJson(o.toJson());
-      checkDateShiftConfig(od);
+      checkDateShiftConfig(od as api.DateShiftConfig);
     });
   });
 
@@ -2333,7 +2341,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeidentifyConfig();
       var od = api.DeidentifyConfig.fromJson(o.toJson());
-      checkDeidentifyConfig(od);
+      checkDeidentifyConfig(od as api.DeidentifyConfig);
     });
   });
 
@@ -2341,7 +2349,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeidentifyDatasetRequest();
       var od = api.DeidentifyDatasetRequest.fromJson(o.toJson());
-      checkDeidentifyDatasetRequest(od);
+      checkDeidentifyDatasetRequest(od as api.DeidentifyDatasetRequest);
     });
   });
 
@@ -2349,7 +2357,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeidentifyDicomStoreRequest();
       var od = api.DeidentifyDicomStoreRequest.fromJson(o.toJson());
-      checkDeidentifyDicomStoreRequest(od);
+      checkDeidentifyDicomStoreRequest(od as api.DeidentifyDicomStoreRequest);
     });
   });
 
@@ -2357,7 +2365,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeidentifyFhirStoreRequest();
       var od = api.DeidentifyFhirStoreRequest.fromJson(o.toJson());
-      checkDeidentifyFhirStoreRequest(od);
+      checkDeidentifyFhirStoreRequest(od as api.DeidentifyFhirStoreRequest);
     });
   });
 
@@ -2365,7 +2373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeidentifySummary();
       var od = api.DeidentifySummary.fromJson(o.toJson());
-      checkDeidentifySummary(od);
+      checkDeidentifySummary(od as api.DeidentifySummary);
     });
   });
 
@@ -2373,7 +2381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDicomConfig();
       var od = api.DicomConfig.fromJson(o.toJson());
-      checkDicomConfig(od);
+      checkDicomConfig(od as api.DicomConfig);
     });
   });
 
@@ -2381,7 +2389,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDicomFilterConfig();
       var od = api.DicomFilterConfig.fromJson(o.toJson());
-      checkDicomFilterConfig(od);
+      checkDicomFilterConfig(od as api.DicomFilterConfig);
     });
   });
 
@@ -2389,7 +2397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDicomStore();
       var od = api.DicomStore.fromJson(o.toJson());
-      checkDicomStore(od);
+      checkDicomStore(od as api.DicomStore);
     });
   });
 
@@ -2397,7 +2405,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2405,7 +2413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportDicomDataRequest();
       var od = api.ExportDicomDataRequest.fromJson(o.toJson());
-      checkExportDicomDataRequest(od);
+      checkExportDicomDataRequest(od as api.ExportDicomDataRequest);
     });
   });
 
@@ -2413,7 +2421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportDicomDataResponse();
       var od = api.ExportDicomDataResponse.fromJson(o.toJson());
-      checkExportDicomDataResponse(od);
+      checkExportDicomDataResponse(od as api.ExportDicomDataResponse);
     });
   });
 
@@ -2421,7 +2429,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportResourcesRequest();
       var od = api.ExportResourcesRequest.fromJson(o.toJson());
-      checkExportResourcesRequest(od);
+      checkExportResourcesRequest(od as api.ExportResourcesRequest);
     });
   });
 
@@ -2429,7 +2437,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportResourcesResponse();
       var od = api.ExportResourcesResponse.fromJson(o.toJson());
-      checkExportResourcesResponse(od);
+      checkExportResourcesResponse(od as api.ExportResourcesResponse);
     });
   });
 
@@ -2437,7 +2445,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -2445,7 +2453,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFhirConfig();
       var od = api.FhirConfig.fromJson(o.toJson());
-      checkFhirConfig(od);
+      checkFhirConfig(od as api.FhirConfig);
     });
   });
 
@@ -2453,7 +2461,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFhirFilter();
       var od = api.FhirFilter.fromJson(o.toJson());
-      checkFhirFilter(od);
+      checkFhirFilter(od as api.FhirFilter);
     });
   });
 
@@ -2461,7 +2469,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFhirStore();
       var od = api.FhirStore.fromJson(o.toJson());
-      checkFhirStore(od);
+      checkFhirStore(od as api.FhirStore);
     });
   });
 
@@ -2469,7 +2477,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFieldMetadata();
       var od = api.FieldMetadata.fromJson(o.toJson());
-      checkFieldMetadata(od);
+      checkFieldMetadata(od as api.FieldMetadata);
     });
   });
 
@@ -2481,7 +2489,8 @@
           buildGoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary();
       var od = api.GoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary
           .fromJson(o.toJson());
-      checkGoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary(od);
+      checkGoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary(od
+          as api.GoogleCloudHealthcareV1DeidentifyDeidentifyDicomStoreSummary);
     });
   });
 
@@ -2493,7 +2502,8 @@
           buildGoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary();
       var od = api.GoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary
           .fromJson(o.toJson());
-      checkGoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary(od);
+      checkGoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary(od
+          as api.GoogleCloudHealthcareV1DeidentifyDeidentifyFhirStoreSummary);
     });
   });
 
@@ -2503,7 +2513,8 @@
       var o = buildGoogleCloudHealthcareV1DicomBigQueryDestination();
       var od = api.GoogleCloudHealthcareV1DicomBigQueryDestination.fromJson(
           o.toJson());
-      checkGoogleCloudHealthcareV1DicomBigQueryDestination(od);
+      checkGoogleCloudHealthcareV1DicomBigQueryDestination(
+          od as api.GoogleCloudHealthcareV1DicomBigQueryDestination);
     });
   });
 
@@ -2512,7 +2523,8 @@
       var o = buildGoogleCloudHealthcareV1DicomGcsDestination();
       var od =
           api.GoogleCloudHealthcareV1DicomGcsDestination.fromJson(o.toJson());
-      checkGoogleCloudHealthcareV1DicomGcsDestination(od);
+      checkGoogleCloudHealthcareV1DicomGcsDestination(
+          od as api.GoogleCloudHealthcareV1DicomGcsDestination);
     });
   });
 
@@ -2520,7 +2532,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudHealthcareV1DicomGcsSource();
       var od = api.GoogleCloudHealthcareV1DicomGcsSource.fromJson(o.toJson());
-      checkGoogleCloudHealthcareV1DicomGcsSource(od);
+      checkGoogleCloudHealthcareV1DicomGcsSource(
+          od as api.GoogleCloudHealthcareV1DicomGcsSource);
     });
   });
 
@@ -2530,7 +2543,8 @@
       var o = buildGoogleCloudHealthcareV1FhirBigQueryDestination();
       var od = api.GoogleCloudHealthcareV1FhirBigQueryDestination.fromJson(
           o.toJson());
-      checkGoogleCloudHealthcareV1FhirBigQueryDestination(od);
+      checkGoogleCloudHealthcareV1FhirBigQueryDestination(
+          od as api.GoogleCloudHealthcareV1FhirBigQueryDestination);
     });
   });
 
@@ -2539,7 +2553,8 @@
       var o = buildGoogleCloudHealthcareV1FhirGcsDestination();
       var od =
           api.GoogleCloudHealthcareV1FhirGcsDestination.fromJson(o.toJson());
-      checkGoogleCloudHealthcareV1FhirGcsDestination(od);
+      checkGoogleCloudHealthcareV1FhirGcsDestination(
+          od as api.GoogleCloudHealthcareV1FhirGcsDestination);
     });
   });
 
@@ -2547,7 +2562,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudHealthcareV1FhirGcsSource();
       var od = api.GoogleCloudHealthcareV1FhirGcsSource.fromJson(o.toJson());
-      checkGoogleCloudHealthcareV1FhirGcsSource(od);
+      checkGoogleCloudHealthcareV1FhirGcsSource(
+          od as api.GoogleCloudHealthcareV1FhirGcsSource);
     });
   });
 
@@ -2555,7 +2571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHl7V2NotificationConfig();
       var od = api.Hl7V2NotificationConfig.fromJson(o.toJson());
-      checkHl7V2NotificationConfig(od);
+      checkHl7V2NotificationConfig(od as api.Hl7V2NotificationConfig);
     });
   });
 
@@ -2563,7 +2579,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHl7V2Store();
       var od = api.Hl7V2Store.fromJson(o.toJson());
-      checkHl7V2Store(od);
+      checkHl7V2Store(od as api.Hl7V2Store);
     });
   });
 
@@ -2571,7 +2587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpBody();
       var od = api.HttpBody.fromJson(o.toJson());
-      checkHttpBody(od);
+      checkHttpBody(od as api.HttpBody);
     });
   });
 
@@ -2579,7 +2595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageConfig();
       var od = api.ImageConfig.fromJson(o.toJson());
-      checkImageConfig(od);
+      checkImageConfig(od as api.ImageConfig);
     });
   });
 
@@ -2587,7 +2603,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportDicomDataRequest();
       var od = api.ImportDicomDataRequest.fromJson(o.toJson());
-      checkImportDicomDataRequest(od);
+      checkImportDicomDataRequest(od as api.ImportDicomDataRequest);
     });
   });
 
@@ -2595,7 +2611,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportDicomDataResponse();
       var od = api.ImportDicomDataResponse.fromJson(o.toJson());
-      checkImportDicomDataResponse(od);
+      checkImportDicomDataResponse(od as api.ImportDicomDataResponse);
     });
   });
 
@@ -2603,7 +2619,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportResourcesRequest();
       var od = api.ImportResourcesRequest.fromJson(o.toJson());
-      checkImportResourcesRequest(od);
+      checkImportResourcesRequest(od as api.ImportResourcesRequest);
     });
   });
 
@@ -2611,7 +2627,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportResourcesResponse();
       var od = api.ImportResourcesResponse.fromJson(o.toJson());
-      checkImportResourcesResponse(od);
+      checkImportResourcesResponse(od as api.ImportResourcesResponse);
     });
   });
 
@@ -2619,7 +2635,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInfoTypeTransformation();
       var od = api.InfoTypeTransformation.fromJson(o.toJson());
-      checkInfoTypeTransformation(od);
+      checkInfoTypeTransformation(od as api.InfoTypeTransformation);
     });
   });
 
@@ -2627,7 +2643,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIngestMessageRequest();
       var od = api.IngestMessageRequest.fromJson(o.toJson());
-      checkIngestMessageRequest(od);
+      checkIngestMessageRequest(od as api.IngestMessageRequest);
     });
   });
 
@@ -2635,7 +2651,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIngestMessageResponse();
       var od = api.IngestMessageResponse.fromJson(o.toJson());
-      checkIngestMessageResponse(od);
+      checkIngestMessageResponse(od as api.IngestMessageResponse);
     });
   });
 
@@ -2643,7 +2659,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDatasetsResponse();
       var od = api.ListDatasetsResponse.fromJson(o.toJson());
-      checkListDatasetsResponse(od);
+      checkListDatasetsResponse(od as api.ListDatasetsResponse);
     });
   });
 
@@ -2651,7 +2667,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDicomStoresResponse();
       var od = api.ListDicomStoresResponse.fromJson(o.toJson());
-      checkListDicomStoresResponse(od);
+      checkListDicomStoresResponse(od as api.ListDicomStoresResponse);
     });
   });
 
@@ -2659,7 +2675,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFhirStoresResponse();
       var od = api.ListFhirStoresResponse.fromJson(o.toJson());
-      checkListFhirStoresResponse(od);
+      checkListFhirStoresResponse(od as api.ListFhirStoresResponse);
     });
   });
 
@@ -2667,7 +2683,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListHl7V2StoresResponse();
       var od = api.ListHl7V2StoresResponse.fromJson(o.toJson());
-      checkListHl7V2StoresResponse(od);
+      checkListHl7V2StoresResponse(od as api.ListHl7V2StoresResponse);
     });
   });
 
@@ -2675,7 +2691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -2683,7 +2699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListMessagesResponse();
       var od = api.ListMessagesResponse.fromJson(o.toJson());
-      checkListMessagesResponse(od);
+      checkListMessagesResponse(od as api.ListMessagesResponse);
     });
   });
 
@@ -2691,7 +2707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -2699,7 +2715,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -2707,7 +2723,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessage();
       var od = api.Message.fromJson(o.toJson());
-      checkMessage(od);
+      checkMessage(od as api.Message);
     });
   });
 
@@ -2715,7 +2731,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationConfig();
       var od = api.NotificationConfig.fromJson(o.toJson());
-      checkNotificationConfig(od);
+      checkNotificationConfig(od as api.NotificationConfig);
     });
   });
 
@@ -2723,7 +2739,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -2731,7 +2747,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -2739,7 +2755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParsedData();
       var od = api.ParsedData.fromJson(o.toJson());
-      checkParsedData(od);
+      checkParsedData(od as api.ParsedData);
     });
   });
 
@@ -2747,7 +2763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParserConfig();
       var od = api.ParserConfig.fromJson(o.toJson());
-      checkParserConfig(od);
+      checkParserConfig(od as api.ParserConfig);
     });
   });
 
@@ -2755,7 +2771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatientId();
       var od = api.PatientId.fromJson(o.toJson());
-      checkPatientId(od);
+      checkPatientId(od as api.PatientId);
     });
   });
 
@@ -2763,7 +2779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -2771,7 +2787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProgressCounter();
       var od = api.ProgressCounter.fromJson(o.toJson());
-      checkProgressCounter(od);
+      checkProgressCounter(od as api.ProgressCounter);
     });
   });
 
@@ -2779,7 +2795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRedactConfig();
       var od = api.RedactConfig.fromJson(o.toJson());
-      checkRedactConfig(od);
+      checkRedactConfig(od as api.RedactConfig);
     });
   });
 
@@ -2787,7 +2803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceWithInfoTypeConfig();
       var od = api.ReplaceWithInfoTypeConfig.fromJson(o.toJson());
-      checkReplaceWithInfoTypeConfig(od);
+      checkReplaceWithInfoTypeConfig(od as api.ReplaceWithInfoTypeConfig);
     });
   });
 
@@ -2795,7 +2811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResources();
       var od = api.Resources.fromJson(o.toJson());
-      checkResources(od);
+      checkResources(od as api.Resources);
     });
   });
 
@@ -2803,7 +2819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchemaConfig();
       var od = api.SchemaConfig.fromJson(o.toJson());
-      checkSchemaConfig(od);
+      checkSchemaConfig(od as api.SchemaConfig);
     });
   });
 
@@ -2811,7 +2827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchResourcesRequest();
       var od = api.SearchResourcesRequest.fromJson(o.toJson());
-      checkSearchResourcesRequest(od);
+      checkSearchResourcesRequest(od as api.SearchResourcesRequest);
     });
   });
 
@@ -2819,7 +2835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSegment();
       var od = api.Segment.fromJson(o.toJson());
-      checkSegment(od);
+      checkSegment(od as api.Segment);
     });
   });
 
@@ -2827,7 +2843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -2835,7 +2851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2843,7 +2859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStreamConfig();
       var od = api.StreamConfig.fromJson(o.toJson());
-      checkStreamConfig(od);
+      checkStreamConfig(od as api.StreamConfig);
     });
   });
 
@@ -2851,7 +2867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTagFilterList();
       var od = api.TagFilterList.fromJson(o.toJson());
-      checkTagFilterList(od);
+      checkTagFilterList(od as api.TagFilterList);
     });
   });
 
@@ -2859,7 +2875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -2867,7 +2883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -2875,7 +2891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextConfig();
       var od = api.TextConfig.fromJson(o.toJson());
-      checkTextConfig(od);
+      checkTextConfig(od as api.TextConfig);
     });
   });
 
@@ -2924,7 +2940,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -2984,7 +3000,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -2998,8 +3014,9 @@
       var arg_datasetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Dataset.fromJson(json);
-        checkDataset(obj);
+        var obj =
+            api.Dataset.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDataset(obj as api.Dataset);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3042,7 +3059,7 @@
           .create(arg_request, arg_parent,
               datasetId: arg_datasetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3053,8 +3070,9 @@
       var arg_sourceDataset = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeidentifyDatasetRequest.fromJson(json);
-        checkDeidentifyDatasetRequest(obj);
+        var obj = api.DeidentifyDatasetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeidentifyDatasetRequest(obj as api.DeidentifyDatasetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3094,7 +3112,7 @@
       res
           .deidentify(arg_request, arg_sourceDataset, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3142,7 +3160,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3190,7 +3208,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
 
@@ -3245,7 +3263,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3302,7 +3320,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDatasetsResponse(response);
+        checkListDatasetsResponse(response as api.ListDatasetsResponse);
       })));
     });
 
@@ -3314,8 +3332,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Dataset.fromJson(json);
-        checkDataset(obj);
+        var obj =
+            api.Dataset.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDataset(obj as api.Dataset);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3358,7 +3377,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDataset(response);
+        checkDataset(response as api.Dataset);
       })));
     });
 
@@ -3369,8 +3388,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3410,7 +3430,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3421,8 +3441,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3462,7 +3483,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -3477,8 +3499,9 @@
       var arg_dicomStoreId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DicomStore.fromJson(json);
-        checkDicomStore(obj);
+        var obj = api.DicomStore.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDicomStore(obj as api.DicomStore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3521,7 +3544,7 @@
           .create(arg_request, arg_parent,
               dicomStoreId: arg_dicomStoreId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDicomStore(response);
+        checkDicomStore(response as api.DicomStore);
       })));
     });
 
@@ -3532,8 +3555,10 @@
       var arg_sourceStore = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeidentifyDicomStoreRequest.fromJson(json);
-        checkDeidentifyDicomStoreRequest(obj);
+        var obj = api.DeidentifyDicomStoreRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeidentifyDicomStoreRequest(
+            obj as api.DeidentifyDicomStoreRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3573,7 +3598,7 @@
       res
           .deidentify(arg_request, arg_sourceStore, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3621,7 +3646,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3632,8 +3657,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExportDicomDataRequest.fromJson(json);
-        checkExportDicomDataRequest(obj);
+        var obj = api.ExportDicomDataRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExportDicomDataRequest(obj as api.ExportDicomDataRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3673,7 +3699,7 @@
       res
           .export(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3721,7 +3747,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDicomStore(response);
+        checkDicomStore(response as api.DicomStore);
       })));
     });
 
@@ -3776,7 +3802,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3787,8 +3813,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ImportDicomDataRequest.fromJson(json);
-        checkImportDicomDataRequest(obj);
+        var obj = api.ImportDicomDataRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkImportDicomDataRequest(obj as api.ImportDicomDataRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3828,7 +3855,7 @@
       res
           .import(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3888,7 +3915,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDicomStoresResponse(response);
+        checkListDicomStoresResponse(response as api.ListDicomStoresResponse);
       })));
     });
 
@@ -3900,8 +3927,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DicomStore.fromJson(json);
-        checkDicomStore(obj);
+        var obj = api.DicomStore.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDicomStore(obj as api.DicomStore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3944,7 +3972,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDicomStore(response);
+        checkDicomStore(response as api.DicomStore);
       })));
     });
 
@@ -3994,7 +4022,7 @@
           .searchForInstances(arg_parent, arg_dicomWebPath,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4043,7 +4071,7 @@
       res
           .searchForSeries(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4092,7 +4120,7 @@
       res
           .searchForStudies(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4103,8 +4131,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4144,7 +4173,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4156,8 +4185,9 @@
       var arg_dicomWebPath = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpBody.fromJson(json);
-        checkHttpBody(obj);
+        var obj =
+            api.HttpBody.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHttpBody(obj as api.HttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4198,7 +4228,7 @@
           .storeInstances(arg_request, arg_parent, arg_dicomWebPath,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4209,8 +4239,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4250,7 +4281,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -4307,7 +4339,7 @@
       res
           .delete(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4361,7 +4393,7 @@
       res
           .retrieveMetadata(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4415,7 +4447,7 @@
       res
           .retrieveStudy(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4470,7 +4502,7 @@
           .searchForInstances(arg_parent, arg_dicomWebPath,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4524,7 +4556,7 @@
       res
           .searchForSeries(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4541,8 +4573,9 @@
       var arg_dicomWebPath = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpBody.fromJson(json);
-        checkHttpBody(obj);
+        var obj =
+            api.HttpBody.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHttpBody(obj as api.HttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4583,7 +4616,7 @@
           .storeInstances(arg_request, arg_parent, arg_dicomWebPath,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
   });
@@ -4642,7 +4675,7 @@
       res
           .delete(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4697,7 +4730,7 @@
       res
           .retrieveMetadata(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4752,7 +4785,7 @@
       res
           .retrieveSeries(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4808,7 +4841,7 @@
           .searchForInstances(arg_parent, arg_dicomWebPath,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
   });
@@ -4868,7 +4901,7 @@
       res
           .delete(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4924,7 +4957,7 @@
       res
           .retrieveInstance(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -4980,7 +5013,7 @@
       res
           .retrieveMetadata(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -5036,7 +5069,7 @@
       res
           .retrieveRendered(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
   });
@@ -5097,7 +5130,7 @@
       res
           .retrieveFrames(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -5154,7 +5187,7 @@
       res
           .retrieveRendered(arg_parent, arg_dicomWebPath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
   });
@@ -5168,8 +5201,9 @@
       var arg_fhirStoreId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FhirStore.fromJson(json);
-        checkFhirStore(obj);
+        var obj =
+            api.FhirStore.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFhirStore(obj as api.FhirStore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5212,7 +5246,7 @@
           .create(arg_request, arg_parent,
               fhirStoreId: arg_fhirStoreId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFhirStore(response);
+        checkFhirStore(response as api.FhirStore);
       })));
     });
 
@@ -5223,8 +5257,9 @@
       var arg_sourceStore = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeidentifyFhirStoreRequest.fromJson(json);
-        checkDeidentifyFhirStoreRequest(obj);
+        var obj = api.DeidentifyFhirStoreRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeidentifyFhirStoreRequest(obj as api.DeidentifyFhirStoreRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5264,7 +5299,7 @@
       res
           .deidentify(arg_request, arg_sourceStore, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5312,7 +5347,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5323,8 +5358,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExportResourcesRequest.fromJson(json);
-        checkExportResourcesRequest(obj);
+        var obj = api.ExportResourcesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExportResourcesRequest(obj as api.ExportResourcesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5364,7 +5400,7 @@
       res
           .export(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5412,7 +5448,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFhirStore(response);
+        checkFhirStore(response as api.FhirStore);
       })));
     });
 
@@ -5467,7 +5503,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5478,8 +5514,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ImportResourcesRequest.fromJson(json);
-        checkImportResourcesRequest(obj);
+        var obj = api.ImportResourcesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkImportResourcesRequest(obj as api.ImportResourcesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5519,7 +5556,7 @@
       res
           .import(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5579,7 +5616,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFhirStoresResponse(response);
+        checkListFhirStoresResponse(response as api.ListFhirStoresResponse);
       })));
     });
 
@@ -5591,8 +5628,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FhirStore.fromJson(json);
-        checkFhirStore(obj);
+        var obj =
+            api.FhirStore.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFhirStore(obj as api.FhirStore);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5635,7 +5673,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFhirStore(response);
+        checkFhirStore(response as api.FhirStore);
       })));
     });
 
@@ -5646,8 +5684,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5687,7 +5726,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5698,8 +5737,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5739,7 +5779,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -5811,7 +5852,7 @@
               start: arg_start,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -5859,7 +5900,7 @@
       }), true);
       res.Resource_purge(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5908,7 +5949,7 @@
       res
           .capabilities(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -5921,8 +5962,9 @@
       var arg_type = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpBody.fromJson(json);
-        checkHttpBody(obj);
+        var obj =
+            api.HttpBody.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHttpBody(obj as api.HttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5962,7 +6004,7 @@
       res
           .create(arg_request, arg_parent, arg_type, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6011,7 +6053,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6023,8 +6065,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpBody.fromJson(json);
-        checkHttpBody(obj);
+        var obj =
+            api.HttpBody.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHttpBody(obj as api.HttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6064,7 +6107,7 @@
       res
           .executeBundle(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6128,7 +6171,7 @@
               P_since: arg_P_since,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6140,8 +6183,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpBody.fromJson(json);
-        checkHttpBody(obj);
+        var obj =
+            api.HttpBody.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHttpBody(obj as api.HttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6181,7 +6225,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6230,7 +6274,7 @@
       res
           .read(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6242,8 +6286,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchResourcesRequest.fromJson(json);
-        checkSearchResourcesRequest(obj);
+        var obj = api.SearchResourcesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchResourcesRequest(obj as api.SearchResourcesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6283,7 +6328,7 @@
       res
           .search(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6295,8 +6340,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HttpBody.fromJson(json);
-        checkHttpBody(obj);
+        var obj =
+            api.HttpBody.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHttpBody(obj as api.HttpBody);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6336,7 +6382,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
 
@@ -6385,7 +6431,7 @@
       res
           .vread(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHttpBody(response);
+        checkHttpBody(response as api.HttpBody);
       })));
     });
   });
@@ -6400,8 +6446,9 @@
       var arg_hl7V2StoreId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Hl7V2Store.fromJson(json);
-        checkHl7V2Store(obj);
+        var obj = api.Hl7V2Store.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHl7V2Store(obj as api.Hl7V2Store);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6444,7 +6491,7 @@
           .create(arg_request, arg_parent,
               hl7V2StoreId: arg_hl7V2StoreId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHl7V2Store(response);
+        checkHl7V2Store(response as api.Hl7V2Store);
       })));
     });
 
@@ -6492,7 +6539,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6540,7 +6587,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHl7V2Store(response);
+        checkHl7V2Store(response as api.Hl7V2Store);
       })));
     });
 
@@ -6595,7 +6642,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -6655,7 +6702,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListHl7V2StoresResponse(response);
+        checkListHl7V2StoresResponse(response as api.ListHl7V2StoresResponse);
       })));
     });
 
@@ -6667,8 +6714,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Hl7V2Store.fromJson(json);
-        checkHl7V2Store(obj);
+        var obj = api.Hl7V2Store.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHl7V2Store(obj as api.Hl7V2Store);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6711,7 +6759,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHl7V2Store(response);
+        checkHl7V2Store(response as api.Hl7V2Store);
       })));
     });
 
@@ -6722,8 +6770,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6763,7 +6812,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -6774,8 +6823,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6815,7 +6865,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -6834,8 +6885,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateMessageRequest.fromJson(json);
-        checkCreateMessageRequest(obj);
+        var obj = api.CreateMessageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateMessageRequest(obj as api.CreateMessageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6875,7 +6927,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -6928,7 +6980,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6983,7 +7035,7 @@
       res
           .get(arg_name, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
 
@@ -6999,8 +7051,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.IngestMessageRequest.fromJson(json);
-        checkIngestMessageRequest(obj);
+        var obj = api.IngestMessageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIngestMessageRequest(obj as api.IngestMessageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7040,7 +7093,7 @@
       res
           .ingest(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIngestMessageResponse(response);
+        checkIngestMessageResponse(response as api.IngestMessageResponse);
       })));
     });
 
@@ -7112,7 +7165,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMessagesResponse(response);
+        checkListMessagesResponse(response as api.ListMessagesResponse);
       })));
     });
 
@@ -7129,8 +7182,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Message.fromJson(json);
-        checkMessage(obj);
+        var obj =
+            api.Message.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMessage(obj as api.Message);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7173,7 +7227,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMessage(response);
+        checkMessage(response as api.Message);
       })));
     });
   });
@@ -7186,8 +7240,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7227,7 +7282,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -7275,7 +7330,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -7335,7 +7390,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/homegraph/v1_test.dart b/generated/googleapis/test/homegraph/v1_test.dart
index 7a48564..70ccec6 100644
--- a/generated/googleapis/test/homegraph/v1_test.dart
+++ b/generated/googleapis/test/homegraph/v1_test.dart
@@ -181,8 +181,8 @@
 
 void checkUnnamed1164(core.List<api.AgentOtherDeviceId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAgentOtherDeviceId(o[0]);
-  checkAgentOtherDeviceId(o[1]);
+  checkAgentOtherDeviceId(o[0] as api.AgentOtherDeviceId);
+  checkAgentOtherDeviceId(o[1] as api.AgentOtherDeviceId);
 }
 
 core.List<core.String> buildUnnamed1165() {
@@ -225,9 +225,9 @@
   if (buildCounterDevice < 3) {
     checkUnnamed1162(o.attributes);
     checkUnnamed1163(o.customData);
-    checkDeviceInfo(o.deviceInfo);
+    checkDeviceInfo(o.deviceInfo as api.DeviceInfo);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDeviceNames(o.name);
+    checkDeviceNames(o.name as api.DeviceNames);
     unittest.expect(o.notificationSupportedByAgent, unittest.isTrue);
     checkUnnamed1164(o.otherDeviceIds);
     unittest.expect(o.roomHint, unittest.equals('foo'));
@@ -337,8 +337,8 @@
 
 void checkUnnamed1168(core.List<api.QueryRequestInput> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQueryRequestInput(o[0]);
-  checkQueryRequestInput(o[1]);
+  checkQueryRequestInput(o[0] as api.QueryRequestInput);
+  checkQueryRequestInput(o[1] as api.QueryRequestInput);
 }
 
 core.int buildCounterQueryRequest = 0;
@@ -378,7 +378,7 @@
 void checkQueryRequestInput(api.QueryRequestInput o) {
   buildCounterQueryRequestInput++;
   if (buildCounterQueryRequestInput < 3) {
-    checkQueryRequestPayload(o.payload);
+    checkQueryRequestPayload(o.payload as api.QueryRequestPayload);
   }
   buildCounterQueryRequestInput--;
 }
@@ -392,8 +392,8 @@
 
 void checkUnnamed1169(core.List<api.AgentDeviceId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAgentDeviceId(o[0]);
-  checkAgentDeviceId(o[1]);
+  checkAgentDeviceId(o[0] as api.AgentDeviceId);
+  checkAgentDeviceId(o[1] as api.AgentDeviceId);
 }
 
 core.int buildCounterQueryRequestPayload = 0;
@@ -430,7 +430,7 @@
 void checkQueryResponse(api.QueryResponse o) {
   buildCounterQueryResponse++;
   if (buildCounterQueryResponse < 3) {
-    checkQueryResponsePayload(o.payload);
+    checkQueryResponsePayload(o.payload as api.QueryResponsePayload);
     unittest.expect(o.requestId, unittest.equals('foo'));
   }
   buildCounterQueryResponse--;
@@ -600,7 +600,8 @@
     unittest.expect(o.agentUserId, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
     unittest.expect(o.followUpToken, unittest.equals('foo'));
-    checkStateAndNotificationPayload(o.payload);
+    checkStateAndNotificationPayload(
+        o.payload as api.StateAndNotificationPayload);
     unittest.expect(o.requestId, unittest.equals('foo'));
   }
   buildCounterReportStateAndNotificationRequest--;
@@ -677,7 +678,8 @@
 void checkStateAndNotificationPayload(api.StateAndNotificationPayload o) {
   buildCounterStateAndNotificationPayload++;
   if (buildCounterStateAndNotificationPayload < 3) {
-    checkReportStateAndNotificationDevice(o.devices);
+    checkReportStateAndNotificationDevice(
+        o.devices as api.ReportStateAndNotificationDevice);
   }
   buildCounterStateAndNotificationPayload--;
 }
@@ -718,7 +720,7 @@
 void checkSyncResponse(api.SyncResponse o) {
   buildCounterSyncResponse++;
   if (buildCounterSyncResponse < 3) {
-    checkSyncResponsePayload(o.payload);
+    checkSyncResponsePayload(o.payload as api.SyncResponsePayload);
     unittest.expect(o.requestId, unittest.equals('foo'));
   }
   buildCounterSyncResponse--;
@@ -733,8 +735,8 @@
 
 void checkUnnamed1174(core.List<api.Device> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDevice(o[0]);
-  checkDevice(o[1]);
+  checkDevice(o[0] as api.Device);
+  checkDevice(o[1] as api.Device);
 }
 
 core.int buildCounterSyncResponsePayload = 0;
@@ -763,7 +765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAgentDeviceId();
       var od = api.AgentDeviceId.fromJson(o.toJson());
-      checkAgentDeviceId(od);
+      checkAgentDeviceId(od as api.AgentDeviceId);
     });
   });
 
@@ -771,7 +773,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAgentOtherDeviceId();
       var od = api.AgentOtherDeviceId.fromJson(o.toJson());
-      checkAgentOtherDeviceId(od);
+      checkAgentOtherDeviceId(od as api.AgentOtherDeviceId);
     });
   });
 
@@ -779,7 +781,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDevice();
       var od = api.Device.fromJson(o.toJson());
-      checkDevice(od);
+      checkDevice(od as api.Device);
     });
   });
 
@@ -787,7 +789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceInfo();
       var od = api.DeviceInfo.fromJson(o.toJson());
-      checkDeviceInfo(od);
+      checkDeviceInfo(od as api.DeviceInfo);
     });
   });
 
@@ -795,7 +797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceNames();
       var od = api.DeviceNames.fromJson(o.toJson());
-      checkDeviceNames(od);
+      checkDeviceNames(od as api.DeviceNames);
     });
   });
 
@@ -803,7 +805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -811,7 +813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryRequest();
       var od = api.QueryRequest.fromJson(o.toJson());
-      checkQueryRequest(od);
+      checkQueryRequest(od as api.QueryRequest);
     });
   });
 
@@ -819,7 +821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryRequestInput();
       var od = api.QueryRequestInput.fromJson(o.toJson());
-      checkQueryRequestInput(od);
+      checkQueryRequestInput(od as api.QueryRequestInput);
     });
   });
 
@@ -827,7 +829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryRequestPayload();
       var od = api.QueryRequestPayload.fromJson(o.toJson());
-      checkQueryRequestPayload(od);
+      checkQueryRequestPayload(od as api.QueryRequestPayload);
     });
   });
 
@@ -835,7 +837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryResponse();
       var od = api.QueryResponse.fromJson(o.toJson());
-      checkQueryResponse(od);
+      checkQueryResponse(od as api.QueryResponse);
     });
   });
 
@@ -843,7 +845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryResponsePayload();
       var od = api.QueryResponsePayload.fromJson(o.toJson());
-      checkQueryResponsePayload(od);
+      checkQueryResponsePayload(od as api.QueryResponsePayload);
     });
   });
 
@@ -851,7 +853,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportStateAndNotificationDevice();
       var od = api.ReportStateAndNotificationDevice.fromJson(o.toJson());
-      checkReportStateAndNotificationDevice(od);
+      checkReportStateAndNotificationDevice(
+          od as api.ReportStateAndNotificationDevice);
     });
   });
 
@@ -859,7 +862,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportStateAndNotificationRequest();
       var od = api.ReportStateAndNotificationRequest.fromJson(o.toJson());
-      checkReportStateAndNotificationRequest(od);
+      checkReportStateAndNotificationRequest(
+          od as api.ReportStateAndNotificationRequest);
     });
   });
 
@@ -867,7 +871,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportStateAndNotificationResponse();
       var od = api.ReportStateAndNotificationResponse.fromJson(o.toJson());
-      checkReportStateAndNotificationResponse(od);
+      checkReportStateAndNotificationResponse(
+          od as api.ReportStateAndNotificationResponse);
     });
   });
 
@@ -875,7 +880,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestSyncDevicesRequest();
       var od = api.RequestSyncDevicesRequest.fromJson(o.toJson());
-      checkRequestSyncDevicesRequest(od);
+      checkRequestSyncDevicesRequest(od as api.RequestSyncDevicesRequest);
     });
   });
 
@@ -883,7 +888,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestSyncDevicesResponse();
       var od = api.RequestSyncDevicesResponse.fromJson(o.toJson());
-      checkRequestSyncDevicesResponse(od);
+      checkRequestSyncDevicesResponse(od as api.RequestSyncDevicesResponse);
     });
   });
 
@@ -891,7 +896,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStateAndNotificationPayload();
       var od = api.StateAndNotificationPayload.fromJson(o.toJson());
-      checkStateAndNotificationPayload(od);
+      checkStateAndNotificationPayload(od as api.StateAndNotificationPayload);
     });
   });
 
@@ -899,7 +904,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSyncRequest();
       var od = api.SyncRequest.fromJson(o.toJson());
-      checkSyncRequest(od);
+      checkSyncRequest(od as api.SyncRequest);
     });
   });
 
@@ -907,7 +912,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSyncResponse();
       var od = api.SyncResponse.fromJson(o.toJson());
-      checkSyncResponse(od);
+      checkSyncResponse(od as api.SyncResponse);
     });
   });
 
@@ -915,7 +920,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSyncResponsePayload();
       var od = api.SyncResponsePayload.fromJson(o.toJson());
-      checkSyncResponsePayload(od);
+      checkSyncResponsePayload(od as api.SyncResponsePayload);
     });
   });
 
@@ -968,7 +973,7 @@
           .delete(arg_agentUserId,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -980,8 +985,9 @@
       var arg_request = buildQueryRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.QueryRequest.fromJson(json);
-        checkQueryRequest(obj);
+        var obj = api.QueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkQueryRequest(obj as api.QueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1020,7 +1026,7 @@
       res
           .query(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryResponse(response);
+        checkQueryResponse(response as api.QueryResponse);
       })));
     });
 
@@ -1030,8 +1036,10 @@
       var arg_request = buildReportStateAndNotificationRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReportStateAndNotificationRequest.fromJson(json);
-        checkReportStateAndNotificationRequest(obj);
+        var obj = api.ReportStateAndNotificationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReportStateAndNotificationRequest(
+            obj as api.ReportStateAndNotificationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1071,7 +1079,8 @@
       res
           .reportStateAndNotification(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReportStateAndNotificationResponse(response);
+        checkReportStateAndNotificationResponse(
+            response as api.ReportStateAndNotificationResponse);
       })));
     });
 
@@ -1081,8 +1090,9 @@
       var arg_request = buildRequestSyncDevicesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RequestSyncDevicesRequest.fromJson(json);
-        checkRequestSyncDevicesRequest(obj);
+        var obj = api.RequestSyncDevicesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRequestSyncDevicesRequest(obj as api.RequestSyncDevicesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1121,7 +1131,8 @@
       res
           .requestSync(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRequestSyncDevicesResponse(response);
+        checkRequestSyncDevicesResponse(
+            response as api.RequestSyncDevicesResponse);
       })));
     });
 
@@ -1131,8 +1142,9 @@
       var arg_request = buildSyncRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SyncRequest.fromJson(json);
-        checkSyncRequest(obj);
+        var obj = api.SyncRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSyncRequest(obj as api.SyncRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1171,7 +1183,7 @@
       res
           .sync(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSyncResponse(response);
+        checkSyncResponse(response as api.SyncResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/iam/v1_test.dart b/generated/googleapis/test/iam/v1_test.dart
index 89dfa30..d317a22 100644
--- a/generated/googleapis/test/iam/v1_test.dart
+++ b/generated/googleapis/test/iam/v1_test.dart
@@ -88,7 +88,7 @@
 void checkAdminAuditData(api.AdminAuditData o) {
   buildCounterAdminAuditData++;
   if (buildCounterAdminAuditData < 3) {
-    checkPermissionDelta(o.permissionDelta);
+    checkPermissionDelta(o.permissionDelta as api.PermissionDelta);
   }
   buildCounterAdminAuditData--;
 }
@@ -102,8 +102,8 @@
 
 void checkUnnamed5687(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -141,7 +141,7 @@
 void checkAuditData(api.AuditData o) {
   buildCounterAuditData++;
   if (buildCounterAuditData < 3) {
-    checkPolicyDelta(o.policyDelta);
+    checkPolicyDelta(o.policyDelta as api.PolicyDelta);
   }
   buildCounterAuditData--;
 }
@@ -230,7 +230,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed5689(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -255,7 +255,7 @@
   buildCounterBindingDelta++;
   if (buildCounterBindingDelta < 3) {
     unittest.expect(o.action, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     unittest.expect(o.member, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -277,7 +277,7 @@
 void checkCreateRoleRequest(api.CreateRoleRequest o) {
   buildCounterCreateRoleRequest++;
   if (buildCounterCreateRoleRequest < 3) {
-    checkRole(o.role);
+    checkRole(o.role as api.Role);
     unittest.expect(o.roleId, unittest.equals('foo'));
   }
   buildCounterCreateRoleRequest--;
@@ -320,7 +320,7 @@
   buildCounterCreateServiceAccountRequest++;
   if (buildCounterCreateServiceAccountRequest < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkServiceAccount(o.serviceAccount);
+    checkServiceAccount(o.serviceAccount as api.ServiceAccount);
   }
   buildCounterCreateServiceAccountRequest--;
 }
@@ -410,7 +410,7 @@
 void checkLintPolicyRequest(api.LintPolicyRequest o) {
   buildCounterLintPolicyRequest++;
   if (buildCounterLintPolicyRequest < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     unittest.expect(o.fullResourceName, unittest.equals('foo'));
   }
   buildCounterLintPolicyRequest--;
@@ -425,8 +425,8 @@
 
 void checkUnnamed5690(core.List<api.LintResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLintResult(o[0]);
-  checkLintResult(o[1]);
+  checkLintResult(o[0] as api.LintResult);
+  checkLintResult(o[1] as api.LintResult);
 }
 
 core.int buildCounterLintPolicyResponse = 0;
@@ -486,8 +486,8 @@
 
 void checkUnnamed5691(core.List<api.Role> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRole(o[0]);
-  checkRole(o[1]);
+  checkRole(o[0] as api.Role);
+  checkRole(o[1] as api.Role);
 }
 
 core.int buildCounterListRolesResponse = 0;
@@ -520,8 +520,8 @@
 
 void checkUnnamed5692(core.List<api.ServiceAccountKey> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServiceAccountKey(o[0]);
-  checkServiceAccountKey(o[1]);
+  checkServiceAccountKey(o[0] as api.ServiceAccountKey);
+  checkServiceAccountKey(o[1] as api.ServiceAccountKey);
 }
 
 core.int buildCounterListServiceAccountKeysResponse = 0;
@@ -552,8 +552,8 @@
 
 void checkUnnamed5693(core.List<api.ServiceAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServiceAccount(o[0]);
-  checkServiceAccount(o[1]);
+  checkServiceAccount(o[0] as api.ServiceAccount);
+  checkServiceAccount(o[1] as api.ServiceAccount);
 }
 
 core.int buildCounterListServiceAccountsResponse = 0;
@@ -592,7 +592,7 @@
 void checkPatchServiceAccountRequest(api.PatchServiceAccountRequest o) {
   buildCounterPatchServiceAccountRequest++;
   if (buildCounterPatchServiceAccountRequest < 3) {
-    checkServiceAccount(o.serviceAccount);
+    checkServiceAccount(o.serviceAccount as api.ServiceAccount);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterPatchServiceAccountRequest--;
@@ -687,8 +687,8 @@
 
 void checkUnnamed5696(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed5697() {
@@ -700,8 +700,8 @@
 
 void checkUnnamed5697(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -738,8 +738,8 @@
 
 void checkUnnamed5698(core.List<api.BindingDelta> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBindingDelta(o[0]);
-  checkBindingDelta(o[1]);
+  checkBindingDelta(o[0] as api.BindingDelta);
+  checkBindingDelta(o[1] as api.BindingDelta);
 }
 
 core.int buildCounterPolicyDelta = 0;
@@ -789,8 +789,8 @@
 
 void checkUnnamed5699(core.List<api.AuditableService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditableService(o[0]);
-  checkAuditableService(o[1]);
+  checkAuditableService(o[0] as api.AuditableService);
+  checkAuditableService(o[1] as api.AuditableService);
 }
 
 core.int buildCounterQueryAuditableServicesResponse = 0;
@@ -846,8 +846,8 @@
 
 void checkUnnamed5700(core.List<api.Role> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRole(o[0]);
-  checkRole(o[1]);
+  checkRole(o[0] as api.Role);
+  checkRole(o[1] as api.Role);
 }
 
 core.int buildCounterQueryGrantableRolesResponse = 0;
@@ -904,8 +904,8 @@
 
 void checkUnnamed5701(core.List<api.Permission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPermission(o[0]);
-  checkPermission(o[1]);
+  checkPermission(o[0] as api.Permission);
+  checkPermission(o[1] as api.Permission);
 }
 
 core.int buildCounterQueryTestablePermissionsResponse = 0;
@@ -1059,7 +1059,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -1257,7 +1257,7 @@
 void checkUndeleteServiceAccountResponse(api.UndeleteServiceAccountResponse o) {
   buildCounterUndeleteServiceAccountResponse++;
   if (buildCounterUndeleteServiceAccountResponse < 3) {
-    checkServiceAccount(o.restoredAccount);
+    checkServiceAccount(o.restoredAccount as api.ServiceAccount);
   }
   buildCounterUndeleteServiceAccountResponse--;
 }
@@ -1299,7 +1299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdminAuditData();
       var od = api.AdminAuditData.fromJson(o.toJson());
-      checkAdminAuditData(od);
+      checkAdminAuditData(od as api.AdminAuditData);
     });
   });
 
@@ -1307,7 +1307,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1315,7 +1315,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditData();
       var od = api.AuditData.fromJson(o.toJson());
-      checkAuditData(od);
+      checkAuditData(od as api.AuditData);
     });
   });
 
@@ -1323,7 +1323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1331,7 +1331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditableService();
       var od = api.AuditableService.fromJson(o.toJson());
-      checkAuditableService(od);
+      checkAuditableService(od as api.AuditableService);
     });
   });
 
@@ -1339,7 +1339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1347,7 +1347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBindingDelta();
       var od = api.BindingDelta.fromJson(o.toJson());
-      checkBindingDelta(od);
+      checkBindingDelta(od as api.BindingDelta);
     });
   });
 
@@ -1355,7 +1355,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateRoleRequest();
       var od = api.CreateRoleRequest.fromJson(o.toJson());
-      checkCreateRoleRequest(od);
+      checkCreateRoleRequest(od as api.CreateRoleRequest);
     });
   });
 
@@ -1363,7 +1363,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateServiceAccountKeyRequest();
       var od = api.CreateServiceAccountKeyRequest.fromJson(o.toJson());
-      checkCreateServiceAccountKeyRequest(od);
+      checkCreateServiceAccountKeyRequest(
+          od as api.CreateServiceAccountKeyRequest);
     });
   });
 
@@ -1371,7 +1372,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateServiceAccountRequest();
       var od = api.CreateServiceAccountRequest.fromJson(o.toJson());
-      checkCreateServiceAccountRequest(od);
+      checkCreateServiceAccountRequest(od as api.CreateServiceAccountRequest);
     });
   });
 
@@ -1379,7 +1380,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisableServiceAccountRequest();
       var od = api.DisableServiceAccountRequest.fromJson(o.toJson());
-      checkDisableServiceAccountRequest(od);
+      checkDisableServiceAccountRequest(od as api.DisableServiceAccountRequest);
     });
   });
 
@@ -1387,7 +1388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1395,7 +1396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableServiceAccountRequest();
       var od = api.EnableServiceAccountRequest.fromJson(o.toJson());
-      checkEnableServiceAccountRequest(od);
+      checkEnableServiceAccountRequest(od as api.EnableServiceAccountRequest);
     });
   });
 
@@ -1403,7 +1404,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1411,7 +1412,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLintPolicyRequest();
       var od = api.LintPolicyRequest.fromJson(o.toJson());
-      checkLintPolicyRequest(od);
+      checkLintPolicyRequest(od as api.LintPolicyRequest);
     });
   });
 
@@ -1419,7 +1420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLintPolicyResponse();
       var od = api.LintPolicyResponse.fromJson(o.toJson());
-      checkLintPolicyResponse(od);
+      checkLintPolicyResponse(od as api.LintPolicyResponse);
     });
   });
 
@@ -1427,7 +1428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLintResult();
       var od = api.LintResult.fromJson(o.toJson());
-      checkLintResult(od);
+      checkLintResult(od as api.LintResult);
     });
   });
 
@@ -1435,7 +1436,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListRolesResponse();
       var od = api.ListRolesResponse.fromJson(o.toJson());
-      checkListRolesResponse(od);
+      checkListRolesResponse(od as api.ListRolesResponse);
     });
   });
 
@@ -1443,7 +1444,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServiceAccountKeysResponse();
       var od = api.ListServiceAccountKeysResponse.fromJson(o.toJson());
-      checkListServiceAccountKeysResponse(od);
+      checkListServiceAccountKeysResponse(
+          od as api.ListServiceAccountKeysResponse);
     });
   });
 
@@ -1451,7 +1453,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServiceAccountsResponse();
       var od = api.ListServiceAccountsResponse.fromJson(o.toJson());
-      checkListServiceAccountsResponse(od);
+      checkListServiceAccountsResponse(od as api.ListServiceAccountsResponse);
     });
   });
 
@@ -1459,7 +1461,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchServiceAccountRequest();
       var od = api.PatchServiceAccountRequest.fromJson(o.toJson());
-      checkPatchServiceAccountRequest(od);
+      checkPatchServiceAccountRequest(od as api.PatchServiceAccountRequest);
     });
   });
 
@@ -1467,7 +1469,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermission();
       var od = api.Permission.fromJson(o.toJson());
-      checkPermission(od);
+      checkPermission(od as api.Permission);
     });
   });
 
@@ -1475,7 +1477,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPermissionDelta();
       var od = api.PermissionDelta.fromJson(o.toJson());
-      checkPermissionDelta(od);
+      checkPermissionDelta(od as api.PermissionDelta);
     });
   });
 
@@ -1483,7 +1485,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1491,7 +1493,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyDelta();
       var od = api.PolicyDelta.fromJson(o.toJson());
-      checkPolicyDelta(od);
+      checkPolicyDelta(od as api.PolicyDelta);
     });
   });
 
@@ -1499,7 +1501,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryAuditableServicesRequest();
       var od = api.QueryAuditableServicesRequest.fromJson(o.toJson());
-      checkQueryAuditableServicesRequest(od);
+      checkQueryAuditableServicesRequest(
+          od as api.QueryAuditableServicesRequest);
     });
   });
 
@@ -1507,7 +1510,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryAuditableServicesResponse();
       var od = api.QueryAuditableServicesResponse.fromJson(o.toJson());
-      checkQueryAuditableServicesResponse(od);
+      checkQueryAuditableServicesResponse(
+          od as api.QueryAuditableServicesResponse);
     });
   });
 
@@ -1515,7 +1519,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryGrantableRolesRequest();
       var od = api.QueryGrantableRolesRequest.fromJson(o.toJson());
-      checkQueryGrantableRolesRequest(od);
+      checkQueryGrantableRolesRequest(od as api.QueryGrantableRolesRequest);
     });
   });
 
@@ -1523,7 +1527,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryGrantableRolesResponse();
       var od = api.QueryGrantableRolesResponse.fromJson(o.toJson());
-      checkQueryGrantableRolesResponse(od);
+      checkQueryGrantableRolesResponse(od as api.QueryGrantableRolesResponse);
     });
   });
 
@@ -1531,7 +1535,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryTestablePermissionsRequest();
       var od = api.QueryTestablePermissionsRequest.fromJson(o.toJson());
-      checkQueryTestablePermissionsRequest(od);
+      checkQueryTestablePermissionsRequest(
+          od as api.QueryTestablePermissionsRequest);
     });
   });
 
@@ -1539,7 +1544,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryTestablePermissionsResponse();
       var od = api.QueryTestablePermissionsResponse.fromJson(o.toJson());
-      checkQueryTestablePermissionsResponse(od);
+      checkQueryTestablePermissionsResponse(
+          od as api.QueryTestablePermissionsResponse);
     });
   });
 
@@ -1547,7 +1553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRole();
       var od = api.Role.fromJson(o.toJson());
-      checkRole(od);
+      checkRole(od as api.Role);
     });
   });
 
@@ -1555,7 +1561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccount();
       var od = api.ServiceAccount.fromJson(o.toJson());
-      checkServiceAccount(od);
+      checkServiceAccount(od as api.ServiceAccount);
     });
   });
 
@@ -1563,7 +1569,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccountKey();
       var od = api.ServiceAccountKey.fromJson(o.toJson());
-      checkServiceAccountKey(od);
+      checkServiceAccountKey(od as api.ServiceAccountKey);
     });
   });
 
@@ -1571,7 +1577,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1579,7 +1585,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignBlobRequest();
       var od = api.SignBlobRequest.fromJson(o.toJson());
-      checkSignBlobRequest(od);
+      checkSignBlobRequest(od as api.SignBlobRequest);
     });
   });
 
@@ -1587,7 +1593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignBlobResponse();
       var od = api.SignBlobResponse.fromJson(o.toJson());
-      checkSignBlobResponse(od);
+      checkSignBlobResponse(od as api.SignBlobResponse);
     });
   });
 
@@ -1595,7 +1601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignJwtRequest();
       var od = api.SignJwtRequest.fromJson(o.toJson());
-      checkSignJwtRequest(od);
+      checkSignJwtRequest(od as api.SignJwtRequest);
     });
   });
 
@@ -1603,7 +1609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignJwtResponse();
       var od = api.SignJwtResponse.fromJson(o.toJson());
-      checkSignJwtResponse(od);
+      checkSignJwtResponse(od as api.SignJwtResponse);
     });
   });
 
@@ -1611,7 +1617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1619,7 +1625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1627,7 +1633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteRoleRequest();
       var od = api.UndeleteRoleRequest.fromJson(o.toJson());
-      checkUndeleteRoleRequest(od);
+      checkUndeleteRoleRequest(od as api.UndeleteRoleRequest);
     });
   });
 
@@ -1635,7 +1641,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteServiceAccountRequest();
       var od = api.UndeleteServiceAccountRequest.fromJson(o.toJson());
-      checkUndeleteServiceAccountRequest(od);
+      checkUndeleteServiceAccountRequest(
+          od as api.UndeleteServiceAccountRequest);
     });
   });
 
@@ -1643,7 +1650,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteServiceAccountResponse();
       var od = api.UndeleteServiceAccountResponse.fromJson(o.toJson());
-      checkUndeleteServiceAccountResponse(od);
+      checkUndeleteServiceAccountResponse(
+          od as api.UndeleteServiceAccountResponse);
     });
   });
 
@@ -1651,7 +1659,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadServiceAccountKeyRequest();
       var od = api.UploadServiceAccountKeyRequest.fromJson(o.toJson());
-      checkUploadServiceAccountKeyRequest(od);
+      checkUploadServiceAccountKeyRequest(
+          od as api.UploadServiceAccountKeyRequest);
     });
   });
 
@@ -1662,8 +1671,9 @@
       var arg_request = buildLintPolicyRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LintPolicyRequest.fromJson(json);
-        checkLintPolicyRequest(obj);
+        var obj = api.LintPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLintPolicyRequest(obj as api.LintPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1702,7 +1712,7 @@
       res
           .lintPolicy(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLintPolicyResponse(response);
+        checkLintPolicyResponse(response as api.LintPolicyResponse);
       })));
     });
 
@@ -1712,8 +1722,10 @@
       var arg_request = buildQueryAuditableServicesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.QueryAuditableServicesRequest.fromJson(json);
-        checkQueryAuditableServicesRequest(obj);
+        var obj = api.QueryAuditableServicesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkQueryAuditableServicesRequest(
+            obj as api.QueryAuditableServicesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1752,7 +1764,8 @@
       res
           .queryAuditableServices(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryAuditableServicesResponse(response);
+        checkQueryAuditableServicesResponse(
+            response as api.QueryAuditableServicesResponse);
       })));
     });
   });
@@ -1765,8 +1778,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateRoleRequest.fromJson(json);
-        checkCreateRoleRequest(obj);
+        var obj = api.CreateRoleRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateRoleRequest(obj as api.CreateRoleRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1806,7 +1820,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -1856,7 +1870,7 @@
       res
           .delete(arg_name, etag: arg_etag, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -1904,7 +1918,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -1968,7 +1982,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRolesResponse(response);
+        checkListRolesResponse(response as api.ListRolesResponse);
       })));
     });
 
@@ -1980,8 +1994,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Role.fromJson(json);
-        checkRole(obj);
+        var obj =
+            api.Role.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRole(obj as api.Role);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2024,7 +2039,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -2035,8 +2050,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteRoleRequest.fromJson(json);
-        checkUndeleteRoleRequest(obj);
+        var obj = api.UndeleteRoleRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteRoleRequest(obj as api.UndeleteRoleRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2076,7 +2092,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
   });
@@ -2088,8 +2104,10 @@
       var arg_request = buildQueryTestablePermissionsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.QueryTestablePermissionsRequest.fromJson(json);
-        checkQueryTestablePermissionsRequest(obj);
+        var obj = api.QueryTestablePermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkQueryTestablePermissionsRequest(
+            obj as api.QueryTestablePermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2128,7 +2146,8 @@
       res
           .queryTestablePermissions(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryTestablePermissionsResponse(response);
+        checkQueryTestablePermissionsResponse(
+            response as api.QueryTestablePermissionsResponse);
       })));
     });
   });
@@ -2141,8 +2160,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateRoleRequest.fromJson(json);
-        checkCreateRoleRequest(obj);
+        var obj = api.CreateRoleRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateRoleRequest(obj as api.CreateRoleRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2182,7 +2202,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -2232,7 +2252,7 @@
       res
           .delete(arg_name, etag: arg_etag, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -2280,7 +2300,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -2344,7 +2364,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRolesResponse(response);
+        checkListRolesResponse(response as api.ListRolesResponse);
       })));
     });
 
@@ -2356,8 +2376,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Role.fromJson(json);
-        checkRole(obj);
+        var obj =
+            api.Role.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRole(obj as api.Role);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2400,7 +2421,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -2411,8 +2432,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteRoleRequest.fromJson(json);
-        checkUndeleteRoleRequest(obj);
+        var obj = api.UndeleteRoleRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteRoleRequest(obj as api.UndeleteRoleRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2452,7 +2474,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
   });
@@ -2465,8 +2487,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateServiceAccountRequest.fromJson(json);
-        checkCreateServiceAccountRequest(obj);
+        var obj = api.CreateServiceAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateServiceAccountRequest(
+            obj as api.CreateServiceAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2506,7 +2530,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccount(response);
+        checkServiceAccount(response as api.ServiceAccount);
       })));
     });
 
@@ -2554,7 +2578,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2565,8 +2589,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisableServiceAccountRequest.fromJson(json);
-        checkDisableServiceAccountRequest(obj);
+        var obj = api.DisableServiceAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisableServiceAccountRequest(
+            obj as api.DisableServiceAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2606,7 +2632,7 @@
       res
           .disable(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2617,8 +2643,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EnableServiceAccountRequest.fromJson(json);
-        checkEnableServiceAccountRequest(obj);
+        var obj = api.EnableServiceAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnableServiceAccountRequest(
+            obj as api.EnableServiceAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2658,7 +2686,7 @@
       res
           .enable(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2706,7 +2734,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccount(response);
+        checkServiceAccount(response as api.ServiceAccount);
       })));
     });
 
@@ -2761,7 +2789,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2818,7 +2846,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServiceAccountsResponse(response);
+        checkListServiceAccountsResponse(
+            response as api.ListServiceAccountsResponse);
       })));
     });
 
@@ -2829,8 +2858,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PatchServiceAccountRequest.fromJson(json);
-        checkPatchServiceAccountRequest(obj);
+        var obj = api.PatchServiceAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPatchServiceAccountRequest(obj as api.PatchServiceAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2870,7 +2900,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccount(response);
+        checkServiceAccount(response as api.ServiceAccount);
       })));
     });
 
@@ -2881,8 +2911,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2922,7 +2953,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2933,8 +2964,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SignBlobRequest.fromJson(json);
-        checkSignBlobRequest(obj);
+        var obj = api.SignBlobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSignBlobRequest(obj as api.SignBlobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2974,7 +3006,7 @@
       res
           .signBlob(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSignBlobResponse(response);
+        checkSignBlobResponse(response as api.SignBlobResponse);
       })));
     });
 
@@ -2985,8 +3017,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SignJwtRequest.fromJson(json);
-        checkSignJwtRequest(obj);
+        var obj = api.SignJwtRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSignJwtRequest(obj as api.SignJwtRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3026,7 +3059,7 @@
       res
           .signJwt(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSignJwtResponse(response);
+        checkSignJwtResponse(response as api.SignJwtResponse);
       })));
     });
 
@@ -3037,8 +3070,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3078,7 +3112,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -3089,8 +3124,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteServiceAccountRequest.fromJson(json);
-        checkUndeleteServiceAccountRequest(obj);
+        var obj = api.UndeleteServiceAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteServiceAccountRequest(
+            obj as api.UndeleteServiceAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3130,7 +3167,8 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUndeleteServiceAccountResponse(response);
+        checkUndeleteServiceAccountResponse(
+            response as api.UndeleteServiceAccountResponse);
       })));
     });
 
@@ -3141,8 +3179,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ServiceAccount.fromJson(json);
-        checkServiceAccount(obj);
+        var obj = api.ServiceAccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkServiceAccount(obj as api.ServiceAccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3182,7 +3221,7 @@
       res
           .update(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccount(response);
+        checkServiceAccount(response as api.ServiceAccount);
       })));
     });
   });
@@ -3195,8 +3234,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateServiceAccountKeyRequest.fromJson(json);
-        checkCreateServiceAccountKeyRequest(obj);
+        var obj = api.CreateServiceAccountKeyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateServiceAccountKeyRequest(
+            obj as api.CreateServiceAccountKeyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3236,7 +3277,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccountKey(response);
+        checkServiceAccountKey(response as api.ServiceAccountKey);
       })));
     });
 
@@ -3284,7 +3325,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3335,7 +3376,7 @@
       res
           .get(arg_name, publicKeyType: arg_publicKeyType, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccountKey(response);
+        checkServiceAccountKey(response as api.ServiceAccountKey);
       })));
     });
 
@@ -3385,7 +3426,8 @@
       res
           .list(arg_name, keyTypes: arg_keyTypes, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServiceAccountKeysResponse(response);
+        checkListServiceAccountKeysResponse(
+            response as api.ListServiceAccountKeysResponse);
       })));
     });
 
@@ -3396,8 +3438,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UploadServiceAccountKeyRequest.fromJson(json);
-        checkUploadServiceAccountKeyRequest(obj);
+        var obj = api.UploadServiceAccountKeyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUploadServiceAccountKeyRequest(
+            obj as api.UploadServiceAccountKeyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3437,7 +3481,7 @@
       res
           .upload(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccountKey(response);
+        checkServiceAccountKey(response as api.ServiceAccountKey);
       })));
     });
   });
@@ -3487,7 +3531,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRole(response);
+        checkRole(response as api.Role);
       })));
     });
 
@@ -3552,7 +3596,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRolesResponse(response);
+        checkListRolesResponse(response as api.ListRolesResponse);
       })));
     });
 
@@ -3562,8 +3606,9 @@
       var arg_request = buildQueryGrantableRolesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.QueryGrantableRolesRequest.fromJson(json);
-        checkQueryGrantableRolesRequest(obj);
+        var obj = api.QueryGrantableRolesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkQueryGrantableRolesRequest(obj as api.QueryGrantableRolesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3602,7 +3647,8 @@
       res
           .queryGrantableRoles(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryGrantableRolesResponse(response);
+        checkQueryGrantableRolesResponse(
+            response as api.QueryGrantableRolesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/iamcredentials/v1_test.dart b/generated/googleapis/test/iamcredentials/v1_test.dart
index a7606c1..187f965 100644
--- a/generated/googleapis/test/iamcredentials/v1_test.dart
+++ b/generated/googleapis/test/iamcredentials/v1_test.dart
@@ -314,7 +314,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateAccessTokenRequest();
       var od = api.GenerateAccessTokenRequest.fromJson(o.toJson());
-      checkGenerateAccessTokenRequest(od);
+      checkGenerateAccessTokenRequest(od as api.GenerateAccessTokenRequest);
     });
   });
 
@@ -322,7 +322,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateAccessTokenResponse();
       var od = api.GenerateAccessTokenResponse.fromJson(o.toJson());
-      checkGenerateAccessTokenResponse(od);
+      checkGenerateAccessTokenResponse(od as api.GenerateAccessTokenResponse);
     });
   });
 
@@ -330,7 +330,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateIdTokenRequest();
       var od = api.GenerateIdTokenRequest.fromJson(o.toJson());
-      checkGenerateIdTokenRequest(od);
+      checkGenerateIdTokenRequest(od as api.GenerateIdTokenRequest);
     });
   });
 
@@ -338,7 +338,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateIdTokenResponse();
       var od = api.GenerateIdTokenResponse.fromJson(o.toJson());
-      checkGenerateIdTokenResponse(od);
+      checkGenerateIdTokenResponse(od as api.GenerateIdTokenResponse);
     });
   });
 
@@ -346,7 +346,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignBlobRequest();
       var od = api.SignBlobRequest.fromJson(o.toJson());
-      checkSignBlobRequest(od);
+      checkSignBlobRequest(od as api.SignBlobRequest);
     });
   });
 
@@ -354,7 +354,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignBlobResponse();
       var od = api.SignBlobResponse.fromJson(o.toJson());
-      checkSignBlobResponse(od);
+      checkSignBlobResponse(od as api.SignBlobResponse);
     });
   });
 
@@ -362,7 +362,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignJwtRequest();
       var od = api.SignJwtRequest.fromJson(o.toJson());
-      checkSignJwtRequest(od);
+      checkSignJwtRequest(od as api.SignJwtRequest);
     });
   });
 
@@ -370,7 +370,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignJwtResponse();
       var od = api.SignJwtResponse.fromJson(o.toJson());
-      checkSignJwtResponse(od);
+      checkSignJwtResponse(od as api.SignJwtResponse);
     });
   });
 
@@ -382,8 +382,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateAccessTokenRequest.fromJson(json);
-        checkGenerateAccessTokenRequest(obj);
+        var obj = api.GenerateAccessTokenRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateAccessTokenRequest(obj as api.GenerateAccessTokenRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -423,7 +424,8 @@
       res
           .generateAccessToken(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateAccessTokenResponse(response);
+        checkGenerateAccessTokenResponse(
+            response as api.GenerateAccessTokenResponse);
       })));
     });
 
@@ -434,8 +436,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateIdTokenRequest.fromJson(json);
-        checkGenerateIdTokenRequest(obj);
+        var obj = api.GenerateIdTokenRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateIdTokenRequest(obj as api.GenerateIdTokenRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -475,7 +478,7 @@
       res
           .generateIdToken(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateIdTokenResponse(response);
+        checkGenerateIdTokenResponse(response as api.GenerateIdTokenResponse);
       })));
     });
 
@@ -486,8 +489,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SignBlobRequest.fromJson(json);
-        checkSignBlobRequest(obj);
+        var obj = api.SignBlobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSignBlobRequest(obj as api.SignBlobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -527,7 +531,7 @@
       res
           .signBlob(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSignBlobResponse(response);
+        checkSignBlobResponse(response as api.SignBlobResponse);
       })));
     });
 
@@ -538,8 +542,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SignJwtRequest.fromJson(json);
-        checkSignJwtRequest(obj);
+        var obj = api.SignJwtRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSignJwtRequest(obj as api.SignJwtRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -579,7 +584,7 @@
       res
           .signJwt(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSignJwtResponse(response);
+        checkSignJwtResponse(response as api.SignJwtResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/iap/v1_test.dart b/generated/googleapis/test/iap/v1_test.dart
index 68c2a5c..f562e13 100644
--- a/generated/googleapis/test/iap/v1_test.dart
+++ b/generated/googleapis/test/iap/v1_test.dart
@@ -110,10 +110,11 @@
 void checkAccessSettings(api.AccessSettings o) {
   buildCounterAccessSettings++;
   if (buildCounterAccessSettings < 3) {
-    checkCorsSettings(o.corsSettings);
-    checkGcipSettings(o.gcipSettings);
-    checkOAuthSettings(o.oauthSettings);
-    checkPolicyDelegationSettings(o.policyDelegationSettings);
+    checkCorsSettings(o.corsSettings as api.CorsSettings);
+    checkGcipSettings(o.gcipSettings as api.GcipSettings);
+    checkOAuthSettings(o.oauthSettings as api.OAuthSettings);
+    checkPolicyDelegationSettings(
+        o.policyDelegationSettings as api.PolicyDelegationSettings);
   }
   buildCounterAccessSettings--;
 }
@@ -134,9 +135,10 @@
 void checkApplicationSettings(api.ApplicationSettings o) {
   buildCounterApplicationSettings++;
   if (buildCounterApplicationSettings < 3) {
-    checkAccessDeniedPageSettings(o.accessDeniedPageSettings);
+    checkAccessDeniedPageSettings(
+        o.accessDeniedPageSettings as api.AccessDeniedPageSettings);
     unittest.expect(o.cookieDomain, unittest.equals('foo'));
-    checkCsmSettings(o.csmSettings);
+    checkCsmSettings(o.csmSettings as api.CsmSettings);
   }
   buildCounterApplicationSettings--;
 }
@@ -172,7 +174,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed2778(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -330,7 +332,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -370,8 +372,8 @@
 void checkIapSettings(api.IapSettings o) {
   buildCounterIapSettings++;
   if (buildCounterIapSettings < 3) {
-    checkAccessSettings(o.accessSettings);
-    checkApplicationSettings(o.applicationSettings);
+    checkAccessSettings(o.accessSettings as api.AccessSettings);
+    checkApplicationSettings(o.applicationSettings as api.ApplicationSettings);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterIapSettings--;
@@ -409,8 +411,8 @@
 
 void checkUnnamed2780(core.List<api.Brand> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBrand(o[0]);
-  checkBrand(o[1]);
+  checkBrand(o[0] as api.Brand);
+  checkBrand(o[1] as api.Brand);
 }
 
 core.int buildCounterListBrandsResponse = 0;
@@ -441,8 +443,8 @@
 
 void checkUnnamed2781(core.List<api.IdentityAwareProxyClient> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIdentityAwareProxyClient(o[0]);
-  checkIdentityAwareProxyClient(o[1]);
+  checkIdentityAwareProxyClient(o[0] as api.IdentityAwareProxyClient);
+  checkIdentityAwareProxyClient(o[1] as api.IdentityAwareProxyClient);
 }
 
 core.int buildCounterListIdentityAwareProxyClientsResponse = 0;
@@ -498,8 +500,8 @@
 
 void checkUnnamed2782(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -544,8 +546,8 @@
   if (buildCounterPolicyDelegationSettings < 3) {
     unittest.expect(o.iamPermission, unittest.equals('foo'));
     unittest.expect(o.iamServiceName, unittest.equals('foo'));
-    checkPolicyName(o.policyName);
-    checkResource(o.resource);
+    checkPolicyName(o.policyName as api.PolicyName);
+    checkResource(o.resource as api.Resource);
   }
   buildCounterPolicyDelegationSettings--;
 }
@@ -642,7 +644,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -716,7 +718,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessDeniedPageSettings();
       var od = api.AccessDeniedPageSettings.fromJson(o.toJson());
-      checkAccessDeniedPageSettings(od);
+      checkAccessDeniedPageSettings(od as api.AccessDeniedPageSettings);
     });
   });
 
@@ -724,7 +726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessSettings();
       var od = api.AccessSettings.fromJson(o.toJson());
-      checkAccessSettings(od);
+      checkAccessSettings(od as api.AccessSettings);
     });
   });
 
@@ -732,7 +734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationSettings();
       var od = api.ApplicationSettings.fromJson(o.toJson());
-      checkApplicationSettings(od);
+      checkApplicationSettings(od as api.ApplicationSettings);
     });
   });
 
@@ -740,7 +742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -748,7 +750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBrand();
       var od = api.Brand.fromJson(o.toJson());
-      checkBrand(od);
+      checkBrand(od as api.Brand);
     });
   });
 
@@ -756,7 +758,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCorsSettings();
       var od = api.CorsSettings.fromJson(o.toJson());
-      checkCorsSettings(od);
+      checkCorsSettings(od as api.CorsSettings);
     });
   });
 
@@ -764,7 +766,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCsmSettings();
       var od = api.CsmSettings.fromJson(o.toJson());
-      checkCsmSettings(od);
+      checkCsmSettings(od as api.CsmSettings);
     });
   });
 
@@ -772,7 +774,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -780,7 +782,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -788,7 +790,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcipSettings();
       var od = api.GcipSettings.fromJson(o.toJson());
-      checkGcipSettings(od);
+      checkGcipSettings(od as api.GcipSettings);
     });
   });
 
@@ -796,7 +798,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -804,7 +806,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -812,7 +814,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIapSettings();
       var od = api.IapSettings.fromJson(o.toJson());
-      checkIapSettings(od);
+      checkIapSettings(od as api.IapSettings);
     });
   });
 
@@ -820,7 +822,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIdentityAwareProxyClient();
       var od = api.IdentityAwareProxyClient.fromJson(o.toJson());
-      checkIdentityAwareProxyClient(od);
+      checkIdentityAwareProxyClient(od as api.IdentityAwareProxyClient);
     });
   });
 
@@ -828,7 +830,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBrandsResponse();
       var od = api.ListBrandsResponse.fromJson(o.toJson());
-      checkListBrandsResponse(od);
+      checkListBrandsResponse(od as api.ListBrandsResponse);
     });
   });
 
@@ -836,7 +838,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListIdentityAwareProxyClientsResponse();
       var od = api.ListIdentityAwareProxyClientsResponse.fromJson(o.toJson());
-      checkListIdentityAwareProxyClientsResponse(od);
+      checkListIdentityAwareProxyClientsResponse(
+          od as api.ListIdentityAwareProxyClientsResponse);
     });
   });
 
@@ -844,7 +847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOAuthSettings();
       var od = api.OAuthSettings.fromJson(o.toJson());
-      checkOAuthSettings(od);
+      checkOAuthSettings(od as api.OAuthSettings);
     });
   });
 
@@ -852,7 +855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -860,7 +863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyDelegationSettings();
       var od = api.PolicyDelegationSettings.fromJson(o.toJson());
-      checkPolicyDelegationSettings(od);
+      checkPolicyDelegationSettings(od as api.PolicyDelegationSettings);
     });
   });
 
@@ -868,7 +871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyName();
       var od = api.PolicyName.fromJson(o.toJson());
-      checkPolicyName(od);
+      checkPolicyName(od as api.PolicyName);
     });
   });
 
@@ -877,7 +880,8 @@
       var o = buildResetIdentityAwareProxyClientSecretRequest();
       var od =
           api.ResetIdentityAwareProxyClientSecretRequest.fromJson(o.toJson());
-      checkResetIdentityAwareProxyClientSecretRequest(od);
+      checkResetIdentityAwareProxyClientSecretRequest(
+          od as api.ResetIdentityAwareProxyClientSecretRequest);
     });
   });
 
@@ -885,7 +889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResource();
       var od = api.Resource.fromJson(o.toJson());
-      checkResource(od);
+      checkResource(od as api.Resource);
     });
   });
 
@@ -893,7 +897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -901,7 +905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -909,7 +913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -921,8 +925,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Brand.fromJson(json);
-        checkBrand(obj);
+        var obj =
+            api.Brand.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBrand(obj as api.Brand);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -962,7 +967,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBrand(response);
+        checkBrand(response as api.Brand);
       })));
     });
 
@@ -1010,7 +1015,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBrand(response);
+        checkBrand(response as api.Brand);
       })));
     });
 
@@ -1058,7 +1063,7 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBrandsResponse(response);
+        checkListBrandsResponse(response as api.ListBrandsResponse);
       })));
     });
   });
@@ -1072,8 +1077,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.IdentityAwareProxyClient.fromJson(json);
-        checkIdentityAwareProxyClient(obj);
+        var obj = api.IdentityAwareProxyClient.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentityAwareProxyClient(obj as api.IdentityAwareProxyClient);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1113,7 +1119,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentityAwareProxyClient(response);
+        checkIdentityAwareProxyClient(response as api.IdentityAwareProxyClient);
       })));
     });
 
@@ -1161,7 +1167,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1209,7 +1215,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentityAwareProxyClient(response);
+        checkIdentityAwareProxyClient(response as api.IdentityAwareProxyClient);
       })));
     });
 
@@ -1267,7 +1273,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListIdentityAwareProxyClientsResponse(response);
+        checkListIdentityAwareProxyClientsResponse(
+            response as api.ListIdentityAwareProxyClientsResponse);
       })));
     });
 
@@ -1278,8 +1285,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResetIdentityAwareProxyClientSecretRequest.fromJson(json);
-        checkResetIdentityAwareProxyClientSecretRequest(obj);
+        var obj = api.ResetIdentityAwareProxyClientSecretRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResetIdentityAwareProxyClientSecretRequest(
+            obj as api.ResetIdentityAwareProxyClientSecretRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1319,7 +1328,7 @@
       res
           .resetSecret(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentityAwareProxyClient(response);
+        checkIdentityAwareProxyClient(response as api.IdentityAwareProxyClient);
       })));
     });
   });
@@ -1332,8 +1341,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1373,7 +1383,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1421,7 +1431,7 @@
       res
           .getIapSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIapSettings(response);
+        checkIapSettings(response as api.IapSettings);
       })));
     });
 
@@ -1432,8 +1442,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1473,7 +1484,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1484,8 +1495,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1525,7 +1537,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -1537,8 +1550,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.IapSettings.fromJson(json);
-        checkIapSettings(obj);
+        var obj = api.IapSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIapSettings(obj as api.IapSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1581,7 +1595,7 @@
           .updateIapSettings(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIapSettings(response);
+        checkIapSettings(response as api.IapSettings);
       })));
     });
   });
diff --git a/generated/googleapis/test/identitytoolkit/v3_test.dart b/generated/googleapis/test/identitytoolkit/v3_test.dart
index 54ad0e2..69d506e 100644
--- a/generated/googleapis/test/identitytoolkit/v3_test.dart
+++ b/generated/googleapis/test/identitytoolkit/v3_test.dart
@@ -163,8 +163,8 @@
 
 void checkUnnamed432(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserInfo(o[0]);
-  checkUserInfo(o[1]);
+  checkUserInfo(o[0] as api.UserInfo);
+  checkUserInfo(o[1] as api.UserInfo);
 }
 
 core.int buildCounterDownloadAccountResponse = 0;
@@ -259,8 +259,8 @@
 
 void checkUnnamed433(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserInfo(o[0]);
-  checkUserInfo(o[1]);
+  checkUserInfo(o[0] as api.UserInfo);
+  checkUserInfo(o[1] as api.UserInfo);
 }
 
 core.int buildCounterGetAccountInfoResponse = 0;
@@ -561,8 +561,8 @@
 
 void checkUnnamed439(core.List<api.IdpConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIdpConfig(o[0]);
-  checkIdpConfig(o[1]);
+  checkIdpConfig(o[0] as api.IdpConfig);
+  checkIdpConfig(o[1] as api.IdpConfig);
 }
 
 core.int buildCounterIdentitytoolkitRelyingpartyGetProjectConfigResponse = 0;
@@ -595,15 +595,15 @@
     unittest.expect(o.allowPasswordUser, unittest.isTrue);
     unittest.expect(o.apiKey, unittest.equals('foo'));
     checkUnnamed438(o.authorizedDomains);
-    checkEmailTemplate(o.changeEmailTemplate);
+    checkEmailTemplate(o.changeEmailTemplate as api.EmailTemplate);
     unittest.expect(o.dynamicLinksDomain, unittest.equals('foo'));
     unittest.expect(o.enableAnonymousUser, unittest.isTrue);
     checkUnnamed439(o.idpConfig);
-    checkEmailTemplate(o.legacyResetPasswordTemplate);
+    checkEmailTemplate(o.legacyResetPasswordTemplate as api.EmailTemplate);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkEmailTemplate(o.resetPasswordTemplate);
+    checkEmailTemplate(o.resetPasswordTemplate as api.EmailTemplate);
     unittest.expect(o.useEmailSending, unittest.isTrue);
-    checkEmailTemplate(o.verifyEmailTemplate);
+    checkEmailTemplate(o.verifyEmailTemplate as api.EmailTemplate);
   }
   buildCounterIdentitytoolkitRelyingpartyGetProjectConfigResponse--;
 }
@@ -825,8 +825,8 @@
 
 void checkUnnamed444(core.List<api.IdpConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIdpConfig(o[0]);
-  checkIdpConfig(o[1]);
+  checkIdpConfig(o[0] as api.IdpConfig);
+  checkIdpConfig(o[1] as api.IdpConfig);
 }
 
 core.int buildCounterIdentitytoolkitRelyingpartySetProjectConfigRequest = 0;
@@ -858,14 +858,14 @@
     unittest.expect(o.allowPasswordUser, unittest.isTrue);
     unittest.expect(o.apiKey, unittest.equals('foo'));
     checkUnnamed443(o.authorizedDomains);
-    checkEmailTemplate(o.changeEmailTemplate);
+    checkEmailTemplate(o.changeEmailTemplate as api.EmailTemplate);
     unittest.expect(o.delegatedProjectNumber, unittest.equals('foo'));
     unittest.expect(o.enableAnonymousUser, unittest.isTrue);
     checkUnnamed444(o.idpConfig);
-    checkEmailTemplate(o.legacyResetPasswordTemplate);
-    checkEmailTemplate(o.resetPasswordTemplate);
+    checkEmailTemplate(o.legacyResetPasswordTemplate as api.EmailTemplate);
+    checkEmailTemplate(o.resetPasswordTemplate as api.EmailTemplate);
     unittest.expect(o.useEmailSending, unittest.isTrue);
-    checkEmailTemplate(o.verifyEmailTemplate);
+    checkEmailTemplate(o.verifyEmailTemplate as api.EmailTemplate);
   }
   buildCounterIdentitytoolkitRelyingpartySetProjectConfigRequest--;
 }
@@ -991,8 +991,8 @@
 
 void checkUnnamed445(core.List<api.UserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserInfo(o[0]);
-  checkUserInfo(o[1]);
+  checkUserInfo(o[0] as api.UserInfo);
+  checkUserInfo(o[1] as api.UserInfo);
 }
 
 core.int buildCounterIdentitytoolkitRelyingpartyUploadAccountRequest = 0;
@@ -1377,8 +1377,10 @@
 
 void checkUnnamed447(core.List<api.SetAccountInfoResponseProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSetAccountInfoResponseProviderUserInfo(o[0]);
-  checkSetAccountInfoResponseProviderUserInfo(o[1]);
+  checkSetAccountInfoResponseProviderUserInfo(
+      o[0] as api.SetAccountInfoResponseProviderUserInfo);
+  checkSetAccountInfoResponseProviderUserInfo(
+      o[1] as api.SetAccountInfoResponseProviderUserInfo);
 }
 
 core.int buildCounterSetAccountInfoResponse = 0;
@@ -1483,8 +1485,8 @@
 
 void checkUnnamed448(core.List<api.UploadAccountResponseError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUploadAccountResponseError(o[0]);
-  checkUploadAccountResponseError(o[1]);
+  checkUploadAccountResponseError(o[0] as api.UploadAccountResponseError);
+  checkUploadAccountResponseError(o[1] as api.UploadAccountResponseError);
 }
 
 core.int buildCounterUploadAccountResponse = 0;
@@ -1550,8 +1552,8 @@
 
 void checkUnnamed449(core.List<api.UserInfoProviderUserInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserInfoProviderUserInfo(o[0]);
-  checkUserInfoProviderUserInfo(o[1]);
+  checkUserInfoProviderUserInfo(o[0] as api.UserInfoProviderUserInfo);
+  checkUserInfoProviderUserInfo(o[1] as api.UserInfoProviderUserInfo);
 }
 
 core.int buildCounterUserInfo = 0;
@@ -1790,7 +1792,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateAuthUriResponse();
       var od = api.CreateAuthUriResponse.fromJson(o.toJson());
-      checkCreateAuthUriResponse(od);
+      checkCreateAuthUriResponse(od as api.CreateAuthUriResponse);
     });
   });
 
@@ -1798,7 +1800,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteAccountResponse();
       var od = api.DeleteAccountResponse.fromJson(o.toJson());
-      checkDeleteAccountResponse(od);
+      checkDeleteAccountResponse(od as api.DeleteAccountResponse);
     });
   });
 
@@ -1806,7 +1808,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDownloadAccountResponse();
       var od = api.DownloadAccountResponse.fromJson(o.toJson());
-      checkDownloadAccountResponse(od);
+      checkDownloadAccountResponse(od as api.DownloadAccountResponse);
     });
   });
 
@@ -1814,7 +1816,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmailLinkSigninResponse();
       var od = api.EmailLinkSigninResponse.fromJson(o.toJson());
-      checkEmailLinkSigninResponse(od);
+      checkEmailLinkSigninResponse(od as api.EmailLinkSigninResponse);
     });
   });
 
@@ -1822,7 +1824,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmailTemplate();
       var od = api.EmailTemplate.fromJson(o.toJson());
-      checkEmailTemplate(od);
+      checkEmailTemplate(od as api.EmailTemplate);
     });
   });
 
@@ -1830,7 +1832,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetAccountInfoResponse();
       var od = api.GetAccountInfoResponse.fromJson(o.toJson());
-      checkGetAccountInfoResponse(od);
+      checkGetAccountInfoResponse(od as api.GetAccountInfoResponse);
     });
   });
 
@@ -1838,7 +1840,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetOobConfirmationCodeResponse();
       var od = api.GetOobConfirmationCodeResponse.fromJson(o.toJson());
-      checkGetOobConfirmationCodeResponse(od);
+      checkGetOobConfirmationCodeResponse(
+          od as api.GetOobConfirmationCodeResponse);
     });
   });
 
@@ -1846,7 +1849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetRecaptchaParamResponse();
       var od = api.GetRecaptchaParamResponse.fromJson(o.toJson());
-      checkGetRecaptchaParamResponse(od);
+      checkGetRecaptchaParamResponse(od as api.GetRecaptchaParamResponse);
     });
   });
 
@@ -1856,7 +1859,8 @@
       var o = buildIdentitytoolkitRelyingpartyCreateAuthUriRequest();
       var od = api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(od);
+      checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(
+          od as api.IdentitytoolkitRelyingpartyCreateAuthUriRequest);
     });
   });
 
@@ -1866,7 +1870,8 @@
       var o = buildIdentitytoolkitRelyingpartyDeleteAccountRequest();
       var od = api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyDeleteAccountRequest(od);
+      checkIdentitytoolkitRelyingpartyDeleteAccountRequest(
+          od as api.IdentitytoolkitRelyingpartyDeleteAccountRequest);
     });
   });
 
@@ -1876,7 +1881,8 @@
       var o = buildIdentitytoolkitRelyingpartyDownloadAccountRequest();
       var od = api.IdentitytoolkitRelyingpartyDownloadAccountRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyDownloadAccountRequest(od);
+      checkIdentitytoolkitRelyingpartyDownloadAccountRequest(
+          od as api.IdentitytoolkitRelyingpartyDownloadAccountRequest);
     });
   });
 
@@ -1886,7 +1892,8 @@
       var o = buildIdentitytoolkitRelyingpartyEmailLinkSigninRequest();
       var od = api.IdentitytoolkitRelyingpartyEmailLinkSigninRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyEmailLinkSigninRequest(od);
+      checkIdentitytoolkitRelyingpartyEmailLinkSigninRequest(
+          od as api.IdentitytoolkitRelyingpartyEmailLinkSigninRequest);
     });
   });
 
@@ -1896,7 +1903,8 @@
       var o = buildIdentitytoolkitRelyingpartyGetAccountInfoRequest();
       var od = api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(od);
+      checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(
+          od as api.IdentitytoolkitRelyingpartyGetAccountInfoRequest);
     });
   });
 
@@ -1906,7 +1914,8 @@
       var o = buildIdentitytoolkitRelyingpartyGetProjectConfigResponse();
       var od = api.IdentitytoolkitRelyingpartyGetProjectConfigResponse.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(od);
+      checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(
+          od as api.IdentitytoolkitRelyingpartyGetProjectConfigResponse);
     });
   });
 
@@ -1916,7 +1925,8 @@
       var o = buildIdentitytoolkitRelyingpartyGetPublicKeysResponse();
       var od = api.IdentitytoolkitRelyingpartyGetPublicKeysResponse.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(od);
+      checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(
+          od as api.IdentitytoolkitRelyingpartyGetPublicKeysResponse);
     });
   });
 
@@ -1926,7 +1936,8 @@
       var o = buildIdentitytoolkitRelyingpartyResetPasswordRequest();
       var od = api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyResetPasswordRequest(od);
+      checkIdentitytoolkitRelyingpartyResetPasswordRequest(
+          od as api.IdentitytoolkitRelyingpartyResetPasswordRequest);
     });
   });
 
@@ -1937,7 +1948,8 @@
       var od =
           api.IdentitytoolkitRelyingpartySendVerificationCodeRequest.fromJson(
               o.toJson());
-      checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(od);
+      checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(
+          od as api.IdentitytoolkitRelyingpartySendVerificationCodeRequest);
     });
   });
 
@@ -1948,7 +1960,8 @@
       var od =
           api.IdentitytoolkitRelyingpartySendVerificationCodeResponse.fromJson(
               o.toJson());
-      checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(od);
+      checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(
+          od as api.IdentitytoolkitRelyingpartySendVerificationCodeResponse);
     });
   });
 
@@ -1958,7 +1971,8 @@
       var o = buildIdentitytoolkitRelyingpartySetAccountInfoRequest();
       var od = api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartySetAccountInfoRequest(od);
+      checkIdentitytoolkitRelyingpartySetAccountInfoRequest(
+          od as api.IdentitytoolkitRelyingpartySetAccountInfoRequest);
     });
   });
 
@@ -1968,7 +1982,8 @@
       var o = buildIdentitytoolkitRelyingpartySetProjectConfigRequest();
       var od = api.IdentitytoolkitRelyingpartySetProjectConfigRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartySetProjectConfigRequest(od);
+      checkIdentitytoolkitRelyingpartySetProjectConfigRequest(
+          od as api.IdentitytoolkitRelyingpartySetProjectConfigRequest);
     });
   });
 
@@ -1978,7 +1993,8 @@
       var o = buildIdentitytoolkitRelyingpartySetProjectConfigResponse();
       var od = api.IdentitytoolkitRelyingpartySetProjectConfigResponse.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartySetProjectConfigResponse(od);
+      checkIdentitytoolkitRelyingpartySetProjectConfigResponse(
+          od as api.IdentitytoolkitRelyingpartySetProjectConfigResponse);
     });
   });
 
@@ -1988,7 +2004,8 @@
       var o = buildIdentitytoolkitRelyingpartySignOutUserRequest();
       var od = api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartySignOutUserRequest(od);
+      checkIdentitytoolkitRelyingpartySignOutUserRequest(
+          od as api.IdentitytoolkitRelyingpartySignOutUserRequest);
     });
   });
 
@@ -1998,7 +2015,8 @@
       var o = buildIdentitytoolkitRelyingpartySignOutUserResponse();
       var od = api.IdentitytoolkitRelyingpartySignOutUserResponse.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartySignOutUserResponse(od);
+      checkIdentitytoolkitRelyingpartySignOutUserResponse(
+          od as api.IdentitytoolkitRelyingpartySignOutUserResponse);
     });
   });
 
@@ -2008,7 +2026,8 @@
       var o = buildIdentitytoolkitRelyingpartySignupNewUserRequest();
       var od = api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartySignupNewUserRequest(od);
+      checkIdentitytoolkitRelyingpartySignupNewUserRequest(
+          od as api.IdentitytoolkitRelyingpartySignupNewUserRequest);
     });
   });
 
@@ -2018,7 +2037,8 @@
       var o = buildIdentitytoolkitRelyingpartyUploadAccountRequest();
       var od = api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyUploadAccountRequest(od);
+      checkIdentitytoolkitRelyingpartyUploadAccountRequest(
+          od as api.IdentitytoolkitRelyingpartyUploadAccountRequest);
     });
   });
 
@@ -2028,7 +2048,8 @@
       var o = buildIdentitytoolkitRelyingpartyVerifyAssertionRequest();
       var od = api.IdentitytoolkitRelyingpartyVerifyAssertionRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(od);
+      checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(
+          od as api.IdentitytoolkitRelyingpartyVerifyAssertionRequest);
     });
   });
 
@@ -2038,7 +2059,8 @@
       var o = buildIdentitytoolkitRelyingpartyVerifyCustomTokenRequest();
       var od = api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(od);
+      checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(
+          od as api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest);
     });
   });
 
@@ -2048,7 +2070,8 @@
       var o = buildIdentitytoolkitRelyingpartyVerifyPasswordRequest();
       var od = api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(od);
+      checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(
+          od as api.IdentitytoolkitRelyingpartyVerifyPasswordRequest);
     });
   });
 
@@ -2058,7 +2081,8 @@
       var o = buildIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest();
       var od = api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest.fromJson(
           o.toJson());
-      checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(od);
+      checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(
+          od as api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest);
     });
   });
 
@@ -2069,7 +2093,8 @@
       var od =
           api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse.fromJson(
               o.toJson());
-      checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(od);
+      checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(
+          od as api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse);
     });
   });
 
@@ -2077,7 +2102,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIdpConfig();
       var od = api.IdpConfig.fromJson(o.toJson());
-      checkIdpConfig(od);
+      checkIdpConfig(od as api.IdpConfig);
     });
   });
 
@@ -2085,7 +2110,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRelyingparty();
       var od = api.Relyingparty.fromJson(o.toJson());
-      checkRelyingparty(od);
+      checkRelyingparty(od as api.Relyingparty);
     });
   });
 
@@ -2093,7 +2118,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResetPasswordResponse();
       var od = api.ResetPasswordResponse.fromJson(o.toJson());
-      checkResetPasswordResponse(od);
+      checkResetPasswordResponse(od as api.ResetPasswordResponse);
     });
   });
 
@@ -2101,7 +2126,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetAccountInfoResponseProviderUserInfo();
       var od = api.SetAccountInfoResponseProviderUserInfo.fromJson(o.toJson());
-      checkSetAccountInfoResponseProviderUserInfo(od);
+      checkSetAccountInfoResponseProviderUserInfo(
+          od as api.SetAccountInfoResponseProviderUserInfo);
     });
   });
 
@@ -2109,7 +2135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetAccountInfoResponse();
       var od = api.SetAccountInfoResponse.fromJson(o.toJson());
-      checkSetAccountInfoResponse(od);
+      checkSetAccountInfoResponse(od as api.SetAccountInfoResponse);
     });
   });
 
@@ -2117,7 +2143,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignupNewUserResponse();
       var od = api.SignupNewUserResponse.fromJson(o.toJson());
-      checkSignupNewUserResponse(od);
+      checkSignupNewUserResponse(od as api.SignupNewUserResponse);
     });
   });
 
@@ -2125,7 +2151,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadAccountResponseError();
       var od = api.UploadAccountResponseError.fromJson(o.toJson());
-      checkUploadAccountResponseError(od);
+      checkUploadAccountResponseError(od as api.UploadAccountResponseError);
     });
   });
 
@@ -2133,7 +2159,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadAccountResponse();
       var od = api.UploadAccountResponse.fromJson(o.toJson());
-      checkUploadAccountResponse(od);
+      checkUploadAccountResponse(od as api.UploadAccountResponse);
     });
   });
 
@@ -2141,7 +2167,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserInfoProviderUserInfo();
       var od = api.UserInfoProviderUserInfo.fromJson(o.toJson());
-      checkUserInfoProviderUserInfo(od);
+      checkUserInfoProviderUserInfo(od as api.UserInfoProviderUserInfo);
     });
   });
 
@@ -2149,7 +2175,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserInfo();
       var od = api.UserInfo.fromJson(o.toJson());
-      checkUserInfo(od);
+      checkUserInfo(od as api.UserInfo);
     });
   });
 
@@ -2157,7 +2183,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerifyAssertionResponse();
       var od = api.VerifyAssertionResponse.fromJson(o.toJson());
-      checkVerifyAssertionResponse(od);
+      checkVerifyAssertionResponse(od as api.VerifyAssertionResponse);
     });
   });
 
@@ -2165,7 +2191,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerifyCustomTokenResponse();
       var od = api.VerifyCustomTokenResponse.fromJson(o.toJson());
-      checkVerifyCustomTokenResponse(od);
+      checkVerifyCustomTokenResponse(od as api.VerifyCustomTokenResponse);
     });
   });
 
@@ -2173,7 +2199,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerifyPasswordResponse();
       var od = api.VerifyPasswordResponse.fromJson(o.toJson());
-      checkVerifyPasswordResponse(od);
+      checkVerifyPasswordResponse(od as api.VerifyPasswordResponse);
     });
   });
 
@@ -2184,9 +2210,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartyCreateAuthUriRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartyCreateAuthUriRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyCreateAuthUriRequest(
+            obj as api.IdentitytoolkitRelyingpartyCreateAuthUriRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2228,7 +2255,7 @@
       res
           .createAuthUri(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateAuthUriResponse(response);
+        checkCreateAuthUriResponse(response as api.CreateAuthUriResponse);
       })));
     });
 
@@ -2238,9 +2265,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartyDeleteAccountRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartyDeleteAccountRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartyDeleteAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyDeleteAccountRequest(
+            obj as api.IdentitytoolkitRelyingpartyDeleteAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2282,7 +2310,7 @@
       res
           .deleteAccount(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeleteAccountResponse(response);
+        checkDeleteAccountResponse(response as api.DeleteAccountResponse);
       })));
     });
 
@@ -2295,8 +2323,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.IdentitytoolkitRelyingpartyDownloadAccountRequest.fromJson(
-                json);
-        checkIdentitytoolkitRelyingpartyDownloadAccountRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyDownloadAccountRequest(
+            obj as api.IdentitytoolkitRelyingpartyDownloadAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2338,7 +2367,7 @@
       res
           .downloadAccount(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDownloadAccountResponse(response);
+        checkDownloadAccountResponse(response as api.DownloadAccountResponse);
       })));
     });
 
@@ -2351,8 +2380,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.IdentitytoolkitRelyingpartyEmailLinkSigninRequest.fromJson(
-                json);
-        checkIdentitytoolkitRelyingpartyEmailLinkSigninRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyEmailLinkSigninRequest(
+            obj as api.IdentitytoolkitRelyingpartyEmailLinkSigninRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2394,7 +2424,7 @@
       res
           .emailLinkSignin(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmailLinkSigninResponse(response);
+        checkEmailLinkSigninResponse(response as api.EmailLinkSigninResponse);
       })));
     });
 
@@ -2404,9 +2434,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartyGetAccountInfoRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartyGetAccountInfoRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyGetAccountInfoRequest(
+            obj as api.IdentitytoolkitRelyingpartyGetAccountInfoRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2448,7 +2479,7 @@
       res
           .getAccountInfo(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetAccountInfoResponse(response);
+        checkGetAccountInfoResponse(response as api.GetAccountInfoResponse);
       })));
     });
 
@@ -2458,8 +2489,9 @@
       var arg_request = buildRelyingparty();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Relyingparty.fromJson(json);
-        checkRelyingparty(obj);
+        var obj = api.Relyingparty.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRelyingparty(obj as api.Relyingparty);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2501,7 +2533,8 @@
       res
           .getOobConfirmationCode(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetOobConfirmationCodeResponse(response);
+        checkGetOobConfirmationCodeResponse(
+            response as api.GetOobConfirmationCodeResponse);
       })));
     });
 
@@ -2560,7 +2593,8 @@
               projectNumber: arg_projectNumber,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(response);
+        checkIdentitytoolkitRelyingpartyGetProjectConfigResponse(response
+            as api.IdentitytoolkitRelyingpartyGetProjectConfigResponse);
       })));
     });
 
@@ -2610,7 +2644,8 @@
       res
           .getPublicKeys($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(response);
+        checkIdentitytoolkitRelyingpartyGetPublicKeysResponse(
+            response as api.IdentitytoolkitRelyingpartyGetPublicKeysResponse);
       })));
     });
 
@@ -2659,7 +2694,8 @@
       res
           .getRecaptchaParam($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetRecaptchaParamResponse(response);
+        checkGetRecaptchaParamResponse(
+            response as api.GetRecaptchaParamResponse);
       })));
     });
 
@@ -2669,9 +2705,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartyResetPasswordRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartyResetPasswordRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartyResetPasswordRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyResetPasswordRequest(
+            obj as api.IdentitytoolkitRelyingpartyResetPasswordRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2713,7 +2750,7 @@
       res
           .resetPassword(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResetPasswordResponse(response);
+        checkResetPasswordResponse(response as api.ResetPasswordResponse);
       })));
     });
 
@@ -2726,8 +2763,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.IdentitytoolkitRelyingpartySendVerificationCodeRequest.fromJson(
-                json);
-        checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartySendVerificationCodeRequest(
+            obj as api.IdentitytoolkitRelyingpartySendVerificationCodeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2770,7 +2808,8 @@
       res
           .sendVerificationCode(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(response);
+        checkIdentitytoolkitRelyingpartySendVerificationCodeResponse(response
+            as api.IdentitytoolkitRelyingpartySendVerificationCodeResponse);
       })));
     });
 
@@ -2780,9 +2819,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartySetAccountInfoRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartySetAccountInfoRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartySetAccountInfoRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartySetAccountInfoRequest(
+            obj as api.IdentitytoolkitRelyingpartySetAccountInfoRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2824,7 +2864,7 @@
       res
           .setAccountInfo(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSetAccountInfoResponse(response);
+        checkSetAccountInfoResponse(response as api.SetAccountInfoResponse);
       })));
     });
 
@@ -2837,8 +2877,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.IdentitytoolkitRelyingpartySetProjectConfigRequest.fromJson(
-                json);
-        checkIdentitytoolkitRelyingpartySetProjectConfigRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartySetProjectConfigRequest(
+            obj as api.IdentitytoolkitRelyingpartySetProjectConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2881,7 +2922,8 @@
       res
           .setProjectConfig(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentitytoolkitRelyingpartySetProjectConfigResponse(response);
+        checkIdentitytoolkitRelyingpartySetProjectConfigResponse(response
+            as api.IdentitytoolkitRelyingpartySetProjectConfigResponse);
       })));
     });
 
@@ -2891,9 +2933,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartySignOutUserRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartySignOutUserRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartySignOutUserRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartySignOutUserRequest(
+            obj as api.IdentitytoolkitRelyingpartySignOutUserRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2936,7 +2979,8 @@
       res
           .signOutUser(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentitytoolkitRelyingpartySignOutUserResponse(response);
+        checkIdentitytoolkitRelyingpartySignOutUserResponse(
+            response as api.IdentitytoolkitRelyingpartySignOutUserResponse);
       })));
     });
 
@@ -2946,9 +2990,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartySignupNewUserRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartySignupNewUserRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartySignupNewUserRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartySignupNewUserRequest(
+            obj as api.IdentitytoolkitRelyingpartySignupNewUserRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2990,7 +3035,7 @@
       res
           .signupNewUser(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSignupNewUserResponse(response);
+        checkSignupNewUserResponse(response as api.SignupNewUserResponse);
       })));
     });
 
@@ -3000,9 +3045,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartyUploadAccountRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartyUploadAccountRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartyUploadAccountRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyUploadAccountRequest(
+            obj as api.IdentitytoolkitRelyingpartyUploadAccountRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3044,7 +3090,7 @@
       res
           .uploadAccount(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUploadAccountResponse(response);
+        checkUploadAccountResponse(response as api.UploadAccountResponse);
       })));
     });
 
@@ -3057,8 +3103,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.IdentitytoolkitRelyingpartyVerifyAssertionRequest.fromJson(
-                json);
-        checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyVerifyAssertionRequest(
+            obj as api.IdentitytoolkitRelyingpartyVerifyAssertionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3100,7 +3147,7 @@
       res
           .verifyAssertion(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVerifyAssertionResponse(response);
+        checkVerifyAssertionResponse(response as api.VerifyAssertionResponse);
       })));
     });
 
@@ -3113,8 +3160,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest.fromJson(
-                json);
-        checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyVerifyCustomTokenRequest(
+            obj as api.IdentitytoolkitRelyingpartyVerifyCustomTokenRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3156,7 +3204,8 @@
       res
           .verifyCustomToken(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVerifyCustomTokenResponse(response);
+        checkVerifyCustomTokenResponse(
+            response as api.VerifyCustomTokenResponse);
       })));
     });
 
@@ -3166,9 +3215,10 @@
       var arg_request = buildIdentitytoolkitRelyingpartyVerifyPasswordRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(json);
-        checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(obj);
+        var obj = api.IdentitytoolkitRelyingpartyVerifyPasswordRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyVerifyPasswordRequest(
+            obj as api.IdentitytoolkitRelyingpartyVerifyPasswordRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3210,7 +3260,7 @@
       res
           .verifyPassword(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVerifyPasswordResponse(response);
+        checkVerifyPasswordResponse(response as api.VerifyPasswordResponse);
       })));
     });
 
@@ -3223,8 +3273,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest.fromJson(
-                json);
-        checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkIdentitytoolkitRelyingpartyVerifyPhoneNumberRequest(
+            obj as api.IdentitytoolkitRelyingpartyVerifyPhoneNumberRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3267,7 +3318,8 @@
       res
           .verifyPhoneNumber(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(response);
+        checkIdentitytoolkitRelyingpartyVerifyPhoneNumberResponse(response
+            as api.IdentitytoolkitRelyingpartyVerifyPhoneNumberResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/indexing/v3_test.dart b/generated/googleapis/test/indexing/v3_test.dart
index 4566370..250b819 100644
--- a/generated/googleapis/test/indexing/v3_test.dart
+++ b/generated/googleapis/test/indexing/v3_test.dart
@@ -88,7 +88,8 @@
 void checkPublishUrlNotificationResponse(api.PublishUrlNotificationResponse o) {
   buildCounterPublishUrlNotificationResponse++;
   if (buildCounterPublishUrlNotificationResponse < 3) {
-    checkUrlNotificationMetadata(o.urlNotificationMetadata);
+    checkUrlNotificationMetadata(
+        o.urlNotificationMetadata as api.UrlNotificationMetadata);
   }
   buildCounterPublishUrlNotificationResponse--;
 }
@@ -132,8 +133,8 @@
 void checkUrlNotificationMetadata(api.UrlNotificationMetadata o) {
   buildCounterUrlNotificationMetadata++;
   if (buildCounterUrlNotificationMetadata < 3) {
-    checkUrlNotification(o.latestRemove);
-    checkUrlNotification(o.latestUpdate);
+    checkUrlNotification(o.latestRemove as api.UrlNotification);
+    checkUrlNotification(o.latestUpdate as api.UrlNotification);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterUrlNotificationMetadata--;
@@ -144,7 +145,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublishUrlNotificationResponse();
       var od = api.PublishUrlNotificationResponse.fromJson(o.toJson());
-      checkPublishUrlNotificationResponse(od);
+      checkPublishUrlNotificationResponse(
+          od as api.PublishUrlNotificationResponse);
     });
   });
 
@@ -152,7 +154,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlNotification();
       var od = api.UrlNotification.fromJson(o.toJson());
-      checkUrlNotification(od);
+      checkUrlNotification(od as api.UrlNotification);
     });
   });
 
@@ -160,7 +162,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrlNotificationMetadata();
       var od = api.UrlNotificationMetadata.fromJson(o.toJson());
-      checkUrlNotificationMetadata(od);
+      checkUrlNotificationMetadata(od as api.UrlNotificationMetadata);
     });
   });
 
@@ -209,7 +211,7 @@
       res
           .getMetadata(url: arg_url, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUrlNotificationMetadata(response);
+        checkUrlNotificationMetadata(response as api.UrlNotificationMetadata);
       })));
     });
 
@@ -219,8 +221,9 @@
       var arg_request = buildUrlNotification();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UrlNotification.fromJson(json);
-        checkUrlNotification(obj);
+        var obj = api.UrlNotification.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUrlNotification(obj as api.UrlNotification);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -259,7 +262,8 @@
       res
           .publish(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPublishUrlNotificationResponse(response);
+        checkPublishUrlNotificationResponse(
+            response as api.PublishUrlNotificationResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/jobs/v2_test.dart b/generated/googleapis/test/jobs/v2_test.dart
index c25c928..04b25cc 100644
--- a/generated/googleapis/test/jobs/v2_test.dart
+++ b/generated/googleapis/test/jobs/v2_test.dart
@@ -130,7 +130,7 @@
   buildCounterBucketizedCount++;
   if (buildCounterBucketizedCount < 3) {
     unittest.expect(o.count, unittest.equals(42));
-    checkBucketRange(o.range);
+    checkBucketRange(o.range as api.BucketRange);
   }
   buildCounterBucketizedCount--;
 }
@@ -150,7 +150,7 @@
 void checkCommuteInfo(api.CommuteInfo o) {
   buildCounterCommuteInfo++;
   if (buildCounterCommuteInfo < 3) {
-    checkJobLocation(o.jobLocation);
+    checkJobLocation(o.jobLocation as api.JobLocation);
     unittest.expect(o.travelDuration, unittest.equals('foo'));
   }
   buildCounterCommuteInfo--;
@@ -179,7 +179,7 @@
     unittest.expect(o.departureHourLocal, unittest.equals(42));
     unittest.expect(o.method, unittest.equals('foo'));
     unittest.expect(o.roadTraffic, unittest.equals('foo'));
-    checkLatLng(o.startLocation);
+    checkLatLng(o.startLocation as api.LatLng);
     unittest.expect(o.travelTime, unittest.equals('foo'));
   }
   buildCounterCommutePreference--;
@@ -194,8 +194,8 @@
 
 void checkUnnamed4341(core.List<api.CompanyInfoSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompanyInfoSource(o[0]);
-  checkCompanyInfoSource(o[1]);
+  checkCompanyInfoSource(o[0] as api.CompanyInfoSource);
+  checkCompanyInfoSource(o[1] as api.CompanyInfoSource);
 }
 
 core.List<core.String> buildUnnamed4342() {
@@ -269,7 +269,7 @@
     checkUnnamed4342(o.keywordSearchableCustomAttributes);
     checkUnnamed4343(o.keywordSearchableCustomFields);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkJobLocation(o.structuredCompanyHqLocation);
+    checkJobLocation(o.structuredCompanyHqLocation as api.JobLocation);
     unittest.expect(o.suspended, unittest.isTrue);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.website, unittest.equals('foo'));
@@ -321,10 +321,10 @@
 void checkCompensationEntry(api.CompensationEntry o) {
   buildCounterCompensationEntry++;
   if (buildCounterCompensationEntry < 3) {
-    checkMoney(o.amount);
+    checkMoney(o.amount as api.Money);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.expectedUnitsPerYear, unittest.equals(42.0));
-    checkCompensationRange(o.range);
+    checkCompensationRange(o.range as api.CompensationRange);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
   }
@@ -363,7 +363,7 @@
   if (buildCounterCompensationFilter < 3) {
     unittest.expect(
         o.includeJobsWithUnspecifiedCompensationRange, unittest.isTrue);
-    checkCompensationRange(o.range);
+    checkCompensationRange(o.range as api.CompensationRange);
     unittest.expect(o.type, unittest.equals('foo'));
     checkUnnamed4344(o.units);
   }
@@ -385,7 +385,8 @@
 void checkCompensationHistogramRequest(api.CompensationHistogramRequest o) {
   buildCounterCompensationHistogramRequest++;
   if (buildCounterCompensationHistogramRequest < 3) {
-    checkNumericBucketingOption(o.bucketingOption);
+    checkNumericBucketingOption(
+        o.bucketingOption as api.NumericBucketingOption);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCompensationHistogramRequest--;
@@ -406,7 +407,7 @@
 void checkCompensationHistogramResult(api.CompensationHistogramResult o) {
   buildCounterCompensationHistogramResult++;
   if (buildCounterCompensationHistogramResult < 3) {
-    checkNumericBucketingResult(o.result);
+    checkNumericBucketingResult(o.result as api.NumericBucketingResult);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCompensationHistogramResult--;
@@ -421,8 +422,8 @@
 
 void checkUnnamed4345(core.List<api.CompensationEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompensationEntry(o[0]);
-  checkCompensationEntry(o[1]);
+  checkCompensationEntry(o[0] as api.CompensationEntry);
+  checkCompensationEntry(o[1] as api.CompensationEntry);
 }
 
 core.int buildCounterCompensationInfo = 0;
@@ -445,12 +446,14 @@
 void checkCompensationInfo(api.CompensationInfo o) {
   buildCounterCompensationInfo++;
   if (buildCounterCompensationInfo < 3) {
-    checkMoney(o.amount);
-    checkCompensationRange(o.annualizedBaseCompensationRange);
-    checkCompensationRange(o.annualizedTotalCompensationRange);
+    checkMoney(o.amount as api.Money);
+    checkCompensationRange(
+        o.annualizedBaseCompensationRange as api.CompensationRange);
+    checkCompensationRange(
+        o.annualizedTotalCompensationRange as api.CompensationRange);
     checkUnnamed4345(o.entries);
-    checkMoney(o.max);
-    checkMoney(o.min);
+    checkMoney(o.max as api.Money);
+    checkMoney(o.min as api.Money);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCompensationInfo--;
@@ -471,8 +474,8 @@
 void checkCompensationRange(api.CompensationRange o) {
   buildCounterCompensationRange++;
   if (buildCounterCompensationRange < 3) {
-    checkMoney(o.max);
-    checkMoney(o.min);
+    checkMoney(o.max as api.Money);
+    checkMoney(o.min as api.Money);
   }
   buildCounterCompensationRange--;
 }
@@ -486,8 +489,8 @@
 
 void checkUnnamed4346(core.List<api.CompletionResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompletionResult(o[0]);
-  checkCompletionResult(o[1]);
+  checkCompletionResult(o[0] as api.CompletionResult);
+  checkCompletionResult(o[1] as api.CompletionResult);
 }
 
 core.int buildCounterCompleteQueryResponse = 0;
@@ -506,7 +509,7 @@
   buildCounterCompleteQueryResponse++;
   if (buildCounterCompleteQueryResponse < 3) {
     checkUnnamed4346(o.completionResults);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
   }
   buildCounterCompleteQueryResponse--;
 }
@@ -551,8 +554,8 @@
   buildCounterCreateJobRequest++;
   if (buildCounterCreateJobRequest < 3) {
     unittest.expect(o.disableStreetAddressResolution, unittest.isTrue);
-    checkJob(o.job);
-    checkJobProcessingOptions(o.processingOptions);
+    checkJob(o.job as api.Job);
+    checkJobProcessingOptions(o.processingOptions as api.JobProcessingOptions);
   }
   buildCounterCreateJobRequest--;
 }
@@ -575,7 +578,7 @@
   if (buildCounterCustomAttribute < 3) {
     unittest.expect(o.filterable, unittest.isTrue);
     unittest.expect(o.longValue, unittest.equals('foo'));
-    checkStringValues(o.stringValues);
+    checkStringValues(o.stringValues as api.StringValues);
   }
   buildCounterCustomAttribute--;
 }
@@ -598,7 +601,8 @@
   buildCounterCustomAttributeHistogramRequest++;
   if (buildCounterCustomAttributeHistogramRequest < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkNumericBucketingOption(o.longValueHistogramBucketingOption);
+    checkNumericBucketingOption(
+        o.longValueHistogramBucketingOption as api.NumericBucketingOption);
     unittest.expect(o.stringValueHistogram, unittest.isTrue);
   }
   buildCounterCustomAttributeHistogramRequest--;
@@ -634,7 +638,8 @@
   buildCounterCustomAttributeHistogramResult++;
   if (buildCounterCustomAttributeHistogramResult < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkNumericBucketingResult(o.longValueHistogramResult);
+    checkNumericBucketingResult(
+        o.longValueHistogramResult as api.NumericBucketingResult);
     checkUnnamed4347(o.stringValueHistogramResult);
   }
   buildCounterCustomAttributeHistogramResult--;
@@ -745,7 +750,7 @@
   buildCounterDeleteJobsByFilterRequest++;
   if (buildCounterDeleteJobsByFilterRequest < 3) {
     unittest.expect(o.disableFastProcess, unittest.isTrue);
-    checkFilter(o.filter);
+    checkFilter(o.filter as api.Filter);
   }
   buildCounterDeleteJobsByFilterRequest--;
 }
@@ -817,7 +822,8 @@
 void checkExtendedCompensationFilter(api.ExtendedCompensationFilter o) {
   buildCounterExtendedCompensationFilter++;
   if (buildCounterExtendedCompensationFilter < 3) {
-    checkExtendedCompensationInfoCompensationRange(o.compensationRange);
+    checkExtendedCompensationInfoCompensationRange(
+        o.compensationRange as api.ExtendedCompensationInfoCompensationRange);
     checkUnnamed4350(o.compensationUnits);
     unittest.expect(o.currency, unittest.equals('foo'));
     unittest.expect(
@@ -837,8 +843,10 @@
 void checkUnnamed4351(
     core.List<api.ExtendedCompensationInfoCompensationEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExtendedCompensationInfoCompensationEntry(o[0]);
-  checkExtendedCompensationInfoCompensationEntry(o[1]);
+  checkExtendedCompensationInfoCompensationEntry(
+      o[0] as api.ExtendedCompensationInfoCompensationEntry);
+  checkExtendedCompensationInfoCompensationEntry(
+      o[1] as api.ExtendedCompensationInfoCompensationEntry);
 }
 
 core.int buildCounterExtendedCompensationInfo = 0;
@@ -863,10 +871,12 @@
   buildCounterExtendedCompensationInfo++;
   if (buildCounterExtendedCompensationInfo < 3) {
     checkExtendedCompensationInfoCompensationRange(
-        o.annualizedBaseCompensationRange);
+        o.annualizedBaseCompensationRange
+            as api.ExtendedCompensationInfoCompensationRange);
     unittest.expect(o.annualizedBaseCompensationUnspecified, unittest.isTrue);
     checkExtendedCompensationInfoCompensationRange(
-        o.annualizedTotalCompensationRange);
+        o.annualizedTotalCompensationRange
+            as api.ExtendedCompensationInfoCompensationRange);
     unittest.expect(o.annualizedTotalCompensationUnspecified, unittest.isTrue);
     unittest.expect(o.currency, unittest.equals('foo'));
     checkUnnamed4351(o.entries);
@@ -896,10 +906,13 @@
     api.ExtendedCompensationInfoCompensationEntry o) {
   buildCounterExtendedCompensationInfoCompensationEntry++;
   if (buildCounterExtendedCompensationInfoCompensationEntry < 3) {
-    checkExtendedCompensationInfoDecimal(o.amount);
+    checkExtendedCompensationInfoDecimal(
+        o.amount as api.ExtendedCompensationInfoDecimal);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkExtendedCompensationInfoDecimal(o.expectedUnitsPerYear);
-    checkExtendedCompensationInfoCompensationRange(o.range);
+    checkExtendedCompensationInfoDecimal(
+        o.expectedUnitsPerYear as api.ExtendedCompensationInfoDecimal);
+    checkExtendedCompensationInfoCompensationRange(
+        o.range as api.ExtendedCompensationInfoCompensationRange);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
     unittest.expect(o.unspecified, unittest.isTrue);
@@ -924,8 +937,10 @@
     api.ExtendedCompensationInfoCompensationRange o) {
   buildCounterExtendedCompensationInfoCompensationRange++;
   if (buildCounterExtendedCompensationInfoCompensationRange < 3) {
-    checkExtendedCompensationInfoDecimal(o.max);
-    checkExtendedCompensationInfoDecimal(o.min);
+    checkExtendedCompensationInfoDecimal(
+        o.max as api.ExtendedCompensationInfoDecimal);
+    checkExtendedCompensationInfoDecimal(
+        o.min as api.ExtendedCompensationInfoDecimal);
   }
   buildCounterExtendedCompensationInfoCompensationRange--;
 }
@@ -1003,9 +1018,9 @@
   buildCounterGetHistogramRequest++;
   if (buildCounterGetHistogramRequest < 3) {
     unittest.expect(o.allowBroadening, unittest.isTrue);
-    checkJobFilters(o.filters);
-    checkJobQuery(o.query);
-    checkRequestMetadata(o.requestMetadata);
+    checkJobFilters(o.filters as api.JobFilters);
+    checkJobQuery(o.query as api.JobQuery);
+    checkRequestMetadata(o.requestMetadata as api.RequestMetadata);
     checkUnnamed4352(o.searchTypes);
   }
   buildCounterGetHistogramRequest--;
@@ -1020,8 +1035,8 @@
 
 void checkUnnamed4353(core.List<api.HistogramResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistogramResult(o[0]);
-  checkHistogramResult(o[1]);
+  checkHistogramResult(o[0] as api.HistogramResult);
+  checkHistogramResult(o[1] as api.HistogramResult);
 }
 
 core.int buildCounterGetHistogramResponse = 0;
@@ -1039,7 +1054,7 @@
 void checkGetHistogramResponse(api.GetHistogramResponse o) {
   buildCounterGetHistogramResponse++;
   if (buildCounterGetHistogramResponse < 3) {
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     checkUnnamed4353(o.results);
   }
   buildCounterGetHistogramResponse--;
@@ -1054,8 +1069,8 @@
 
 void checkUnnamed4354(core.List<api.GoogleCloudTalentV4JobResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4JobResult(o[0]);
-  checkGoogleCloudTalentV4JobResult(o[1]);
+  checkGoogleCloudTalentV4JobResult(o[0] as api.GoogleCloudTalentV4JobResult);
+  checkGoogleCloudTalentV4JobResult(o[1] as api.GoogleCloudTalentV4JobResult);
 }
 
 core.int buildCounterGoogleCloudTalentV4BatchCreateJobsResponse = 0;
@@ -1088,8 +1103,8 @@
 
 void checkUnnamed4355(core.List<api.GoogleCloudTalentV4JobResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4JobResult(o[0]);
-  checkGoogleCloudTalentV4JobResult(o[1]);
+  checkGoogleCloudTalentV4JobResult(o[0] as api.GoogleCloudTalentV4JobResult);
+  checkGoogleCloudTalentV4JobResult(o[1] as api.GoogleCloudTalentV4JobResult);
 }
 
 core.int buildCounterGoogleCloudTalentV4BatchDeleteJobsResponse = 0;
@@ -1157,8 +1172,8 @@
 
 void checkUnnamed4356(core.List<api.GoogleCloudTalentV4JobResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4JobResult(o[0]);
-  checkGoogleCloudTalentV4JobResult(o[1]);
+  checkGoogleCloudTalentV4JobResult(o[0] as api.GoogleCloudTalentV4JobResult);
+  checkGoogleCloudTalentV4JobResult(o[1] as api.GoogleCloudTalentV4JobResult);
 }
 
 core.int buildCounterGoogleCloudTalentV4BatchUpdateJobsResponse = 0;
@@ -1193,8 +1208,10 @@
 void checkUnnamed4357(
     core.List<api.GoogleCloudTalentV4CompensationInfoCompensationEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(o[0]);
-  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(o[1]);
+  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(
+      o[0] as api.GoogleCloudTalentV4CompensationInfoCompensationEntry);
+  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(
+      o[1] as api.GoogleCloudTalentV4CompensationInfoCompensationEntry);
 }
 
 core.int buildCounterGoogleCloudTalentV4CompensationInfo = 0;
@@ -1218,9 +1235,11 @@
   buildCounterGoogleCloudTalentV4CompensationInfo++;
   if (buildCounterGoogleCloudTalentV4CompensationInfo < 3) {
     checkGoogleCloudTalentV4CompensationInfoCompensationRange(
-        o.annualizedBaseCompensationRange);
+        o.annualizedBaseCompensationRange
+            as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     checkGoogleCloudTalentV4CompensationInfoCompensationRange(
-        o.annualizedTotalCompensationRange);
+        o.annualizedTotalCompensationRange
+            as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     checkUnnamed4357(o.entries);
   }
   buildCounterGoogleCloudTalentV4CompensationInfo--;
@@ -1247,10 +1266,11 @@
     api.GoogleCloudTalentV4CompensationInfoCompensationEntry o) {
   buildCounterGoogleCloudTalentV4CompensationInfoCompensationEntry++;
   if (buildCounterGoogleCloudTalentV4CompensationInfoCompensationEntry < 3) {
-    checkMoney(o.amount);
+    checkMoney(o.amount as api.Money);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.expectedUnitsPerYear, unittest.equals(42.0));
-    checkGoogleCloudTalentV4CompensationInfoCompensationRange(o.range);
+    checkGoogleCloudTalentV4CompensationInfoCompensationRange(
+        o.range as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
   }
@@ -1274,8 +1294,8 @@
     api.GoogleCloudTalentV4CompensationInfoCompensationRange o) {
   buildCounterGoogleCloudTalentV4CompensationInfoCompensationRange++;
   if (buildCounterGoogleCloudTalentV4CompensationInfoCompensationRange < 3) {
-    checkMoney(o.maxCompensation);
-    checkMoney(o.minCompensation);
+    checkMoney(o.maxCompensation as api.Money);
+    checkMoney(o.minCompensation as api.Money);
   }
   buildCounterGoogleCloudTalentV4CompensationInfoCompensationRange--;
 }
@@ -1357,8 +1377,10 @@
 void checkUnnamed4361(
     core.Map<core.String, api.GoogleCloudTalentV4CustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4CustomAttribute(o['x']);
-  checkGoogleCloudTalentV4CustomAttribute(o['y']);
+  checkGoogleCloudTalentV4CustomAttribute(
+      o['x'] as api.GoogleCloudTalentV4CustomAttribute);
+  checkGoogleCloudTalentV4CustomAttribute(
+      o['y'] as api.GoogleCloudTalentV4CustomAttribute);
 }
 
 core.List<core.String> buildUnnamed4362() {
@@ -1444,14 +1466,17 @@
   buildCounterGoogleCloudTalentV4Job++;
   if (buildCounterGoogleCloudTalentV4Job < 3) {
     checkUnnamed4360(o.addresses);
-    checkGoogleCloudTalentV4JobApplicationInfo(o.applicationInfo);
+    checkGoogleCloudTalentV4JobApplicationInfo(
+        o.applicationInfo as api.GoogleCloudTalentV4JobApplicationInfo);
     unittest.expect(o.company, unittest.equals('foo'));
     unittest.expect(o.companyDisplayName, unittest.equals('foo'));
-    checkGoogleCloudTalentV4CompensationInfo(o.compensationInfo);
+    checkGoogleCloudTalentV4CompensationInfo(
+        o.compensationInfo as api.GoogleCloudTalentV4CompensationInfo);
     checkUnnamed4361(o.customAttributes);
     checkUnnamed4362(o.degreeTypes);
     unittest.expect(o.department, unittest.equals('foo'));
-    checkGoogleCloudTalentV4JobDerivedInfo(o.derivedInfo);
+    checkGoogleCloudTalentV4JobDerivedInfo(
+        o.derivedInfo as api.GoogleCloudTalentV4JobDerivedInfo);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed4363(o.employmentTypes);
     unittest.expect(o.incentives, unittest.equals('foo'));
@@ -1466,7 +1491,8 @@
     unittest.expect(o.postingPublishTime, unittest.equals('foo'));
     unittest.expect(o.postingRegion, unittest.equals('foo'));
     unittest.expect(o.postingUpdateTime, unittest.equals('foo'));
-    checkGoogleCloudTalentV4JobProcessingOptions(o.processingOptions);
+    checkGoogleCloudTalentV4JobProcessingOptions(
+        o.processingOptions as api.GoogleCloudTalentV4JobProcessingOptions);
     unittest.expect(o.promotionValue, unittest.equals(42));
     unittest.expect(o.qualifications, unittest.equals('foo'));
     unittest.expect(o.requisitionId, unittest.equals('foo'));
@@ -1550,8 +1576,8 @@
 
 void checkUnnamed4368(core.List<api.GoogleCloudTalentV4Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4Location(o[0]);
-  checkGoogleCloudTalentV4Location(o[1]);
+  checkGoogleCloudTalentV4Location(o[0] as api.GoogleCloudTalentV4Location);
+  checkGoogleCloudTalentV4Location(o[1] as api.GoogleCloudTalentV4Location);
 }
 
 core.int buildCounterGoogleCloudTalentV4JobDerivedInfo = 0;
@@ -1614,8 +1640,8 @@
 void checkGoogleCloudTalentV4JobResult(api.GoogleCloudTalentV4JobResult o) {
   buildCounterGoogleCloudTalentV4JobResult++;
   if (buildCounterGoogleCloudTalentV4JobResult < 3) {
-    checkGoogleCloudTalentV4Job(o.job);
-    checkStatus(o.status);
+    checkGoogleCloudTalentV4Job(o.job as api.GoogleCloudTalentV4Job);
+    checkStatus(o.status as api.Status);
   }
   buildCounterGoogleCloudTalentV4JobResult--;
 }
@@ -1637,9 +1663,9 @@
 void checkGoogleCloudTalentV4Location(api.GoogleCloudTalentV4Location o) {
   buildCounterGoogleCloudTalentV4Location++;
   if (buildCounterGoogleCloudTalentV4Location < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
     unittest.expect(o.locationType, unittest.equals('foo'));
-    checkPostalAddress(o.postalAddress);
+    checkPostalAddress(o.postalAddress as api.PostalAddress);
     unittest.expect(o.radiusMiles, unittest.equals(42.0));
   }
   buildCounterGoogleCloudTalentV4Location--;
@@ -1654,8 +1680,8 @@
 
 void checkUnnamed4369(core.List<api.CompensationHistogramRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompensationHistogramRequest(o[0]);
-  checkCompensationHistogramRequest(o[1]);
+  checkCompensationHistogramRequest(o[0] as api.CompensationHistogramRequest);
+  checkCompensationHistogramRequest(o[1] as api.CompensationHistogramRequest);
 }
 
 core.List<api.CustomAttributeHistogramRequest> buildUnnamed4370() {
@@ -1667,8 +1693,10 @@
 
 void checkUnnamed4370(core.List<api.CustomAttributeHistogramRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttributeHistogramRequest(o[0]);
-  checkCustomAttributeHistogramRequest(o[1]);
+  checkCustomAttributeHistogramRequest(
+      o[0] as api.CustomAttributeHistogramRequest);
+  checkCustomAttributeHistogramRequest(
+      o[1] as api.CustomAttributeHistogramRequest);
 }
 
 core.List<core.String> buildUnnamed4371() {
@@ -1750,8 +1778,8 @@
 
 void checkUnnamed4373(core.List<api.CompensationHistogramResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompensationHistogramResult(o[0]);
-  checkCompensationHistogramResult(o[1]);
+  checkCompensationHistogramResult(o[0] as api.CompensationHistogramResult);
+  checkCompensationHistogramResult(o[1] as api.CompensationHistogramResult);
 }
 
 core.List<api.CustomAttributeHistogramResult> buildUnnamed4374() {
@@ -1763,8 +1791,10 @@
 
 void checkUnnamed4374(core.List<api.CustomAttributeHistogramResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttributeHistogramResult(o[0]);
-  checkCustomAttributeHistogramResult(o[1]);
+  checkCustomAttributeHistogramResult(
+      o[0] as api.CustomAttributeHistogramResult);
+  checkCustomAttributeHistogramResult(
+      o[1] as api.CustomAttributeHistogramResult);
 }
 
 core.List<api.HistogramResult> buildUnnamed4375() {
@@ -1776,8 +1806,8 @@
 
 void checkUnnamed4375(core.List<api.HistogramResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistogramResult(o[0]);
-  checkHistogramResult(o[1]);
+  checkHistogramResult(o[0] as api.HistogramResult);
+  checkHistogramResult(o[1] as api.HistogramResult);
 }
 
 core.int buildCounterHistogramResults = 0;
@@ -1851,8 +1881,8 @@
 
 void checkUnnamed4379(core.Map<core.String, api.CustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttribute(o['x']);
-  checkCustomAttribute(o['y']);
+  checkCustomAttribute(o['x'] as api.CustomAttribute);
+  checkCustomAttribute(o['y'] as api.CustomAttribute);
 }
 
 core.List<core.String> buildUnnamed4380() {
@@ -1890,8 +1920,8 @@
 
 void checkUnnamed4382(core.Map<core.String, api.CustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomField(o['x']);
-  checkCustomField(o['y']);
+  checkCustomField(o['x'] as api.CustomField);
+  checkCustomField(o['y'] as api.CustomField);
 }
 
 core.List<api.JobLocation> buildUnnamed4383() {
@@ -1903,8 +1933,8 @@
 
 void checkUnnamed4383(core.List<api.JobLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJobLocation(o[0]);
-  checkJobLocation(o[1]);
+  checkJobLocation(o[0] as api.JobLocation);
+  checkJobLocation(o[1] as api.JobLocation);
 }
 
 core.List<core.String> buildUnnamed4384() {
@@ -1929,8 +1959,8 @@
 
 void checkUnnamed4385(core.Map<core.String, api.CustomField> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomField(o['x']);
-  checkCustomField(o['y']);
+  checkCustomField(o['x'] as api.CustomField);
+  checkCustomField(o['y'] as api.CustomField);
 }
 
 core.int buildCounterJob = 0;
@@ -1991,7 +2021,7 @@
     unittest.expect(o.companyDisplayName, unittest.equals('foo'));
     unittest.expect(o.companyName, unittest.equals('foo'));
     unittest.expect(o.companyTitle, unittest.equals('foo'));
-    checkCompensationInfo(o.compensationInfo);
+    checkCompensationInfo(o.compensationInfo as api.CompensationInfo);
     unittest.expect(o.createTime, unittest.equals('foo'));
     checkUnnamed4379(o.customAttributes);
     unittest.expect(o.department, unittest.equals('foo'));
@@ -1999,10 +2029,11 @@
     unittest.expect(o.distributorCompanyId, unittest.equals('foo'));
     checkUnnamed4380(o.educationLevels);
     checkUnnamed4381(o.employmentTypes);
-    checkDate(o.endDate);
+    checkDate(o.endDate as api.Date);
     unittest.expect(o.expireTime, unittest.equals('foo'));
-    checkDate(o.expiryDate);
-    checkExtendedCompensationInfo(o.extendedCompensationInfo);
+    checkDate(o.expiryDate as api.Date);
+    checkExtendedCompensationInfo(
+        o.extendedCompensationInfo as api.ExtendedCompensationInfo);
     checkUnnamed4382(o.filterableCustomFields);
     unittest.expect(o.incentives, unittest.equals('foo'));
     checkUnnamed4383(o.jobLocations);
@@ -2012,13 +2043,13 @@
     checkUnnamed4384(o.locations);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.promotionValue, unittest.equals(42));
-    checkDate(o.publishDate);
+    checkDate(o.publishDate as api.Date);
     unittest.expect(o.qualifications, unittest.equals('foo'));
     unittest.expect(o.referenceUrl, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.requisitionId, unittest.equals('foo'));
     unittest.expect(o.responsibilities, unittest.equals('foo'));
-    checkDate(o.startDate);
+    checkDate(o.startDate as api.Date);
     checkUnnamed4385(o.unindexedCustomFields);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.visibility, unittest.equals('foo'));
@@ -2074,8 +2105,8 @@
 
 void checkUnnamed4389(core.Map<core.String, api.CustomFieldFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomFieldFilter(o['x']);
-  checkCustomFieldFilter(o['y']);
+  checkCustomFieldFilter(o['x'] as api.CustomFieldFilter);
+  checkCustomFieldFilter(o['y'] as api.CustomFieldFilter);
 }
 
 core.List<core.String> buildUnnamed4390() {
@@ -2113,8 +2144,8 @@
 
 void checkUnnamed4392(core.List<api.LocationFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocationFilter(o[0]);
-  checkLocationFilter(o[1]);
+  checkLocationFilter(o[0] as api.LocationFilter);
+  checkLocationFilter(o[1] as api.LocationFilter);
 }
 
 core.int buildCounterJobFilters = 0;
@@ -2146,15 +2177,16 @@
   buildCounterJobFilters++;
   if (buildCounterJobFilters < 3) {
     checkUnnamed4386(o.categories);
-    checkCommutePreference(o.commuteFilter);
+    checkCommutePreference(o.commuteFilter as api.CommutePreference);
     checkUnnamed4387(o.companyNames);
     checkUnnamed4388(o.companyTitles);
-    checkCompensationFilter(o.compensationFilter);
+    checkCompensationFilter(o.compensationFilter as api.CompensationFilter);
     unittest.expect(o.customAttributeFilter, unittest.equals('foo'));
     checkUnnamed4389(o.customFieldFilters);
     unittest.expect(o.disableSpellCheck, unittest.isTrue);
     checkUnnamed4390(o.employmentTypes);
-    checkExtendedCompensationFilter(o.extendedCompensationFilter);
+    checkExtendedCompensationFilter(
+        o.extendedCompensationFilter as api.ExtendedCompensationFilter);
     checkUnnamed4391(o.languageCodes);
     checkUnnamed4392(o.locationFilters);
     unittest.expect(o.publishDateRange, unittest.equals('foo'));
@@ -2181,9 +2213,9 @@
 void checkJobLocation(api.JobLocation o) {
   buildCounterJobLocation++;
   if (buildCounterJobLocation < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
     unittest.expect(o.locationType, unittest.equals('foo'));
-    checkPostalAddress(o.postalAddress);
+    checkPostalAddress(o.postalAddress as api.PostalAddress);
     unittest.expect(o.radiusMeters, unittest.equals(42.0));
   }
   buildCounterJobLocation--;
@@ -2284,8 +2316,8 @@
 
 void checkUnnamed4398(core.List<api.LocationFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocationFilter(o[0]);
-  checkLocationFilter(o[1]);
+  checkLocationFilter(o[0] as api.LocationFilter);
+  checkLocationFilter(o[1] as api.LocationFilter);
 }
 
 core.int buildCounterJobQuery = 0;
@@ -2314,10 +2346,10 @@
   buildCounterJobQuery++;
   if (buildCounterJobQuery < 3) {
     checkUnnamed4393(o.categories);
-    checkCommutePreference(o.commuteFilter);
+    checkCommutePreference(o.commuteFilter as api.CommutePreference);
     checkUnnamed4394(o.companyDisplayNames);
     checkUnnamed4395(o.companyNames);
-    checkCompensationFilter(o.compensationFilter);
+    checkCompensationFilter(o.compensationFilter as api.CompensationFilter);
     unittest.expect(o.customAttributeFilter, unittest.equals('foo'));
     unittest.expect(o.disableSpellCheck, unittest.isTrue);
     checkUnnamed4396(o.employmentTypes);
@@ -2359,8 +2391,8 @@
 
 void checkUnnamed4399(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompany(o[0]);
-  checkCompany(o[1]);
+  checkCompany(o[0] as api.Company);
+  checkCompany(o[1] as api.Company);
 }
 
 core.int buildCounterListCompaniesResponse = 0;
@@ -2380,7 +2412,7 @@
   buildCounterListCompaniesResponse++;
   if (buildCounterListCompaniesResponse < 3) {
     checkUnnamed4399(o.companies);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCompaniesResponse--;
@@ -2395,8 +2427,8 @@
 
 void checkUnnamed4400(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJob(o[0]);
-  checkJob(o[1]);
+  checkJob(o[0] as api.Job);
+  checkJob(o[1] as api.Job);
 }
 
 core.int buildCounterListCompanyJobsResponse = 0;
@@ -2417,7 +2449,7 @@
   buildCounterListCompanyJobsResponse++;
   if (buildCounterListCompanyJobsResponse < 3) {
     checkUnnamed4400(o.jobs);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.totalSize, unittest.equals('foo'));
   }
@@ -2433,8 +2465,8 @@
 
 void checkUnnamed4401(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJob(o[0]);
-  checkJob(o[1]);
+  checkJob(o[0] as api.Job);
+  checkJob(o[1] as api.Job);
 }
 
 core.int buildCounterListJobsResponse = 0;
@@ -2454,7 +2486,7 @@
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
     checkUnnamed4401(o.jobs);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListJobsResponse--;
@@ -2480,7 +2512,7 @@
   if (buildCounterLocationFilter < 3) {
     unittest.expect(o.distanceInMiles, unittest.equals(42.0));
     unittest.expect(o.isTelecommute, unittest.isTrue);
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.regionCode, unittest.equals('foo'));
   }
@@ -2505,8 +2537,8 @@
 void checkMatchingJob(api.MatchingJob o) {
   buildCounterMatchingJob++;
   if (buildCounterMatchingJob < 3) {
-    checkCommuteInfo(o.commuteInfo);
-    checkJob(o.job);
+    checkCommuteInfo(o.commuteInfo as api.CommuteInfo);
+    checkJob(o.job as api.Job);
     unittest.expect(o.jobSummary, unittest.equals('foo'));
     unittest.expect(o.jobTitleSnippet, unittest.equals('foo'));
     unittest.expect(o.searchTextSnippet, unittest.equals('foo'));
@@ -2523,8 +2555,8 @@
 
 void checkUnnamed4402(core.Map<core.String, api.NamespacedDebugInput> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamespacedDebugInput(o['x']);
-  checkNamespacedDebugInput(o['y']);
+  checkNamespacedDebugInput(o['x'] as api.NamespacedDebugInput);
+  checkNamespacedDebugInput(o['y'] as api.NamespacedDebugInput);
 }
 
 core.int buildCounterMendelDebugInput = 0;
@@ -2800,8 +2832,8 @@
 
 void checkUnnamed4415(core.List<api.BucketizedCount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucketizedCount(o[0]);
-  checkBucketizedCount(o[1]);
+  checkBucketizedCount(o[0] as api.BucketizedCount);
+  checkBucketizedCount(o[1] as api.BucketizedCount);
 }
 
 core.int buildCounterNumericBucketingResult = 0;
@@ -2909,7 +2941,7 @@
 void checkRequestMetadata(api.RequestMetadata o) {
   buildCounterRequestMetadata++;
   if (buildCounterRequestMetadata < 3) {
-    checkDeviceInfo(o.deviceInfo);
+    checkDeviceInfo(o.deviceInfo as api.DeviceInfo);
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.sessionId, unittest.equals('foo'));
     unittest.expect(o.userId, unittest.equals('foo'));
@@ -2983,16 +3015,16 @@
     unittest.expect(o.disableRelevanceThresholding, unittest.isTrue);
     unittest.expect(o.enableBroadening, unittest.isTrue);
     unittest.expect(o.enablePreciseResultSize, unittest.isTrue);
-    checkJobFilters(o.filters);
-    checkHistogramFacets(o.histogramFacets);
+    checkJobFilters(o.filters as api.JobFilters);
+    checkHistogramFacets(o.histogramFacets as api.HistogramFacets);
     unittest.expect(o.jobView, unittest.equals('foo'));
     unittest.expect(o.mode, unittest.equals('foo'));
     unittest.expect(o.offset, unittest.equals(42));
     unittest.expect(o.orderBy, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkJobQuery(o.query);
-    checkRequestMetadata(o.requestMetadata);
+    checkJobQuery(o.query as api.JobQuery);
+    checkRequestMetadata(o.requestMetadata as api.RequestMetadata);
     unittest.expect(o.sortBy, unittest.equals('foo'));
   }
   buildCounterSearchJobsRequest--;
@@ -3007,8 +3039,8 @@
 
 void checkUnnamed4419(core.List<api.JobLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJobLocation(o[0]);
-  checkJobLocation(o[1]);
+  checkJobLocation(o[0] as api.JobLocation);
+  checkJobLocation(o[1] as api.JobLocation);
 }
 
 core.List<api.MatchingJob> buildUnnamed4420() {
@@ -3020,8 +3052,8 @@
 
 void checkUnnamed4420(core.List<api.MatchingJob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMatchingJob(o[0]);
-  checkMatchingJob(o[1]);
+  checkMatchingJob(o[0] as api.MatchingJob);
+  checkMatchingJob(o[1] as api.MatchingJob);
 }
 
 core.int buildCounterSearchJobsResponse = 0;
@@ -3048,16 +3080,16 @@
 void checkSearchJobsResponse(api.SearchJobsResponse o) {
   buildCounterSearchJobsResponse++;
   if (buildCounterSearchJobsResponse < 3) {
-    checkCommutePreference(o.appliedCommuteFilter);
+    checkCommutePreference(o.appliedCommuteFilter as api.CommutePreference);
     checkUnnamed4419(o.appliedJobLocationFilters);
     unittest.expect(o.estimatedTotalSize, unittest.equals('foo'));
-    checkHistogramResults(o.histogramResults);
+    checkHistogramResults(o.histogramResults as api.HistogramResults);
     unittest.expect(o.jobView, unittest.equals('foo'));
     checkUnnamed4420(o.matchingJobs);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.numJobsFromBroadenedQuery, unittest.equals(42));
-    checkSpellingCorrection(o.spellResult);
+    checkSpellingCorrection(o.spellResult as api.SpellingCorrection);
     unittest.expect(o.totalSize, unittest.equals('foo'));
   }
   buildCounterSearchJobsResponse--;
@@ -3199,8 +3231,8 @@
   buildCounterUpdateJobRequest++;
   if (buildCounterUpdateJobRequest < 3) {
     unittest.expect(o.disableStreetAddressResolution, unittest.isTrue);
-    checkJob(o.job);
-    checkJobProcessingOptions(o.processingOptions);
+    checkJob(o.job as api.Job);
+    checkJobProcessingOptions(o.processingOptions as api.JobProcessingOptions);
     unittest.expect(o.updateJobFields, unittest.equals('foo'));
   }
   buildCounterUpdateJobRequest--;
@@ -3211,7 +3243,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchDeleteJobsRequest();
       var od = api.BatchDeleteJobsRequest.fromJson(o.toJson());
-      checkBatchDeleteJobsRequest(od);
+      checkBatchDeleteJobsRequest(od as api.BatchDeleteJobsRequest);
     });
   });
 
@@ -3219,7 +3251,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketRange();
       var od = api.BucketRange.fromJson(o.toJson());
-      checkBucketRange(od);
+      checkBucketRange(od as api.BucketRange);
     });
   });
 
@@ -3227,7 +3259,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketizedCount();
       var od = api.BucketizedCount.fromJson(o.toJson());
-      checkBucketizedCount(od);
+      checkBucketizedCount(od as api.BucketizedCount);
     });
   });
 
@@ -3235,7 +3267,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommuteInfo();
       var od = api.CommuteInfo.fromJson(o.toJson());
-      checkCommuteInfo(od);
+      checkCommuteInfo(od as api.CommuteInfo);
     });
   });
 
@@ -3243,7 +3275,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommutePreference();
       var od = api.CommutePreference.fromJson(o.toJson());
-      checkCommutePreference(od);
+      checkCommutePreference(od as api.CommutePreference);
     });
   });
 
@@ -3251,7 +3283,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompany();
       var od = api.Company.fromJson(o.toJson());
-      checkCompany(od);
+      checkCompany(od as api.Company);
     });
   });
 
@@ -3259,7 +3291,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompanyInfoSource();
       var od = api.CompanyInfoSource.fromJson(o.toJson());
-      checkCompanyInfoSource(od);
+      checkCompanyInfoSource(od as api.CompanyInfoSource);
     });
   });
 
@@ -3267,7 +3299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationEntry();
       var od = api.CompensationEntry.fromJson(o.toJson());
-      checkCompensationEntry(od);
+      checkCompensationEntry(od as api.CompensationEntry);
     });
   });
 
@@ -3275,7 +3307,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationFilter();
       var od = api.CompensationFilter.fromJson(o.toJson());
-      checkCompensationFilter(od);
+      checkCompensationFilter(od as api.CompensationFilter);
     });
   });
 
@@ -3283,7 +3315,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationHistogramRequest();
       var od = api.CompensationHistogramRequest.fromJson(o.toJson());
-      checkCompensationHistogramRequest(od);
+      checkCompensationHistogramRequest(od as api.CompensationHistogramRequest);
     });
   });
 
@@ -3291,7 +3323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationHistogramResult();
       var od = api.CompensationHistogramResult.fromJson(o.toJson());
-      checkCompensationHistogramResult(od);
+      checkCompensationHistogramResult(od as api.CompensationHistogramResult);
     });
   });
 
@@ -3299,7 +3331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationInfo();
       var od = api.CompensationInfo.fromJson(o.toJson());
-      checkCompensationInfo(od);
+      checkCompensationInfo(od as api.CompensationInfo);
     });
   });
 
@@ -3307,7 +3339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationRange();
       var od = api.CompensationRange.fromJson(o.toJson());
-      checkCompensationRange(od);
+      checkCompensationRange(od as api.CompensationRange);
     });
   });
 
@@ -3315,7 +3347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompleteQueryResponse();
       var od = api.CompleteQueryResponse.fromJson(o.toJson());
-      checkCompleteQueryResponse(od);
+      checkCompleteQueryResponse(od as api.CompleteQueryResponse);
     });
   });
 
@@ -3323,7 +3355,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompletionResult();
       var od = api.CompletionResult.fromJson(o.toJson());
-      checkCompletionResult(od);
+      checkCompletionResult(od as api.CompletionResult);
     });
   });
 
@@ -3331,7 +3363,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateJobRequest();
       var od = api.CreateJobRequest.fromJson(o.toJson());
-      checkCreateJobRequest(od);
+      checkCreateJobRequest(od as api.CreateJobRequest);
     });
   });
 
@@ -3339,7 +3371,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAttribute();
       var od = api.CustomAttribute.fromJson(o.toJson());
-      checkCustomAttribute(od);
+      checkCustomAttribute(od as api.CustomAttribute);
     });
   });
 
@@ -3347,7 +3379,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAttributeHistogramRequest();
       var od = api.CustomAttributeHistogramRequest.fromJson(o.toJson());
-      checkCustomAttributeHistogramRequest(od);
+      checkCustomAttributeHistogramRequest(
+          od as api.CustomAttributeHistogramRequest);
     });
   });
 
@@ -3355,7 +3388,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAttributeHistogramResult();
       var od = api.CustomAttributeHistogramResult.fromJson(o.toJson());
-      checkCustomAttributeHistogramResult(od);
+      checkCustomAttributeHistogramResult(
+          od as api.CustomAttributeHistogramResult);
     });
   });
 
@@ -3363,7 +3397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomField();
       var od = api.CustomField.fromJson(o.toJson());
-      checkCustomField(od);
+      checkCustomField(od as api.CustomField);
     });
   });
 
@@ -3371,7 +3405,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomFieldFilter();
       var od = api.CustomFieldFilter.fromJson(o.toJson());
-      checkCustomFieldFilter(od);
+      checkCustomFieldFilter(od as api.CustomFieldFilter);
     });
   });
 
@@ -3379,7 +3413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -3387,7 +3421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteJobsByFilterRequest();
       var od = api.DeleteJobsByFilterRequest.fromJson(o.toJson());
-      checkDeleteJobsByFilterRequest(od);
+      checkDeleteJobsByFilterRequest(od as api.DeleteJobsByFilterRequest);
     });
   });
 
@@ -3395,7 +3429,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceInfo();
       var od = api.DeviceInfo.fromJson(o.toJson());
-      checkDeviceInfo(od);
+      checkDeviceInfo(od as api.DeviceInfo);
     });
   });
 
@@ -3403,7 +3437,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3411,7 +3445,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExtendedCompensationFilter();
       var od = api.ExtendedCompensationFilter.fromJson(o.toJson());
-      checkExtendedCompensationFilter(od);
+      checkExtendedCompensationFilter(od as api.ExtendedCompensationFilter);
     });
   });
 
@@ -3419,7 +3453,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExtendedCompensationInfo();
       var od = api.ExtendedCompensationInfo.fromJson(o.toJson());
-      checkExtendedCompensationInfo(od);
+      checkExtendedCompensationInfo(od as api.ExtendedCompensationInfo);
     });
   });
 
@@ -3428,7 +3462,8 @@
       var o = buildExtendedCompensationInfoCompensationEntry();
       var od =
           api.ExtendedCompensationInfoCompensationEntry.fromJson(o.toJson());
-      checkExtendedCompensationInfoCompensationEntry(od);
+      checkExtendedCompensationInfoCompensationEntry(
+          od as api.ExtendedCompensationInfoCompensationEntry);
     });
   });
 
@@ -3437,7 +3472,8 @@
       var o = buildExtendedCompensationInfoCompensationRange();
       var od =
           api.ExtendedCompensationInfoCompensationRange.fromJson(o.toJson());
-      checkExtendedCompensationInfoCompensationRange(od);
+      checkExtendedCompensationInfoCompensationRange(
+          od as api.ExtendedCompensationInfoCompensationRange);
     });
   });
 
@@ -3445,7 +3481,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildExtendedCompensationInfoDecimal();
       var od = api.ExtendedCompensationInfoDecimal.fromJson(o.toJson());
-      checkExtendedCompensationInfoDecimal(od);
+      checkExtendedCompensationInfoDecimal(
+          od as api.ExtendedCompensationInfoDecimal);
     });
   });
 
@@ -3453,7 +3490,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilter();
       var od = api.Filter.fromJson(o.toJson());
-      checkFilter(od);
+      checkFilter(od as api.Filter);
     });
   });
 
@@ -3461,7 +3498,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetHistogramRequest();
       var od = api.GetHistogramRequest.fromJson(o.toJson());
-      checkGetHistogramRequest(od);
+      checkGetHistogramRequest(od as api.GetHistogramRequest);
     });
   });
 
@@ -3469,7 +3506,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetHistogramResponse();
       var od = api.GetHistogramResponse.fromJson(o.toJson());
-      checkGetHistogramResponse(od);
+      checkGetHistogramResponse(od as api.GetHistogramResponse);
     });
   });
 
@@ -3478,7 +3515,8 @@
       var o = buildGoogleCloudTalentV4BatchCreateJobsResponse();
       var od =
           api.GoogleCloudTalentV4BatchCreateJobsResponse.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchCreateJobsResponse(od);
+      checkGoogleCloudTalentV4BatchCreateJobsResponse(
+          od as api.GoogleCloudTalentV4BatchCreateJobsResponse);
     });
   });
 
@@ -3487,7 +3525,8 @@
       var o = buildGoogleCloudTalentV4BatchDeleteJobsResponse();
       var od =
           api.GoogleCloudTalentV4BatchDeleteJobsResponse.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchDeleteJobsResponse(od);
+      checkGoogleCloudTalentV4BatchDeleteJobsResponse(
+          od as api.GoogleCloudTalentV4BatchDeleteJobsResponse);
     });
   });
 
@@ -3496,7 +3535,8 @@
       var o = buildGoogleCloudTalentV4BatchOperationMetadata();
       var od =
           api.GoogleCloudTalentV4BatchOperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchOperationMetadata(od);
+      checkGoogleCloudTalentV4BatchOperationMetadata(
+          od as api.GoogleCloudTalentV4BatchOperationMetadata);
     });
   });
 
@@ -3505,7 +3545,8 @@
       var o = buildGoogleCloudTalentV4BatchUpdateJobsResponse();
       var od =
           api.GoogleCloudTalentV4BatchUpdateJobsResponse.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchUpdateJobsResponse(od);
+      checkGoogleCloudTalentV4BatchUpdateJobsResponse(
+          od as api.GoogleCloudTalentV4BatchUpdateJobsResponse);
     });
   });
 
@@ -3513,7 +3554,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4CompensationInfo();
       var od = api.GoogleCloudTalentV4CompensationInfo.fromJson(o.toJson());
-      checkGoogleCloudTalentV4CompensationInfo(od);
+      checkGoogleCloudTalentV4CompensationInfo(
+          od as api.GoogleCloudTalentV4CompensationInfo);
     });
   });
 
@@ -3524,7 +3566,8 @@
       var od =
           api.GoogleCloudTalentV4CompensationInfoCompensationEntry.fromJson(
               o.toJson());
-      checkGoogleCloudTalentV4CompensationInfoCompensationEntry(od);
+      checkGoogleCloudTalentV4CompensationInfoCompensationEntry(
+          od as api.GoogleCloudTalentV4CompensationInfoCompensationEntry);
     });
   });
 
@@ -3535,7 +3578,8 @@
       var od =
           api.GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
               o.toJson());
-      checkGoogleCloudTalentV4CompensationInfoCompensationRange(od);
+      checkGoogleCloudTalentV4CompensationInfoCompensationRange(
+          od as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     });
   });
 
@@ -3543,7 +3587,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4CustomAttribute();
       var od = api.GoogleCloudTalentV4CustomAttribute.fromJson(o.toJson());
-      checkGoogleCloudTalentV4CustomAttribute(od);
+      checkGoogleCloudTalentV4CustomAttribute(
+          od as api.GoogleCloudTalentV4CustomAttribute);
     });
   });
 
@@ -3551,7 +3596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4Job();
       var od = api.GoogleCloudTalentV4Job.fromJson(o.toJson());
-      checkGoogleCloudTalentV4Job(od);
+      checkGoogleCloudTalentV4Job(od as api.GoogleCloudTalentV4Job);
     });
   });
 
@@ -3559,7 +3604,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobApplicationInfo();
       var od = api.GoogleCloudTalentV4JobApplicationInfo.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobApplicationInfo(od);
+      checkGoogleCloudTalentV4JobApplicationInfo(
+          od as api.GoogleCloudTalentV4JobApplicationInfo);
     });
   });
 
@@ -3567,7 +3613,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobDerivedInfo();
       var od = api.GoogleCloudTalentV4JobDerivedInfo.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobDerivedInfo(od);
+      checkGoogleCloudTalentV4JobDerivedInfo(
+          od as api.GoogleCloudTalentV4JobDerivedInfo);
     });
   });
 
@@ -3575,7 +3622,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobProcessingOptions();
       var od = api.GoogleCloudTalentV4JobProcessingOptions.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobProcessingOptions(od);
+      checkGoogleCloudTalentV4JobProcessingOptions(
+          od as api.GoogleCloudTalentV4JobProcessingOptions);
     });
   });
 
@@ -3583,7 +3631,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobResult();
       var od = api.GoogleCloudTalentV4JobResult.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobResult(od);
+      checkGoogleCloudTalentV4JobResult(od as api.GoogleCloudTalentV4JobResult);
     });
   });
 
@@ -3591,7 +3639,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4Location();
       var od = api.GoogleCloudTalentV4Location.fromJson(o.toJson());
-      checkGoogleCloudTalentV4Location(od);
+      checkGoogleCloudTalentV4Location(od as api.GoogleCloudTalentV4Location);
     });
   });
 
@@ -3599,7 +3647,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramFacets();
       var od = api.HistogramFacets.fromJson(o.toJson());
-      checkHistogramFacets(od);
+      checkHistogramFacets(od as api.HistogramFacets);
     });
   });
 
@@ -3607,7 +3655,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramResult();
       var od = api.HistogramResult.fromJson(o.toJson());
-      checkHistogramResult(od);
+      checkHistogramResult(od as api.HistogramResult);
     });
   });
 
@@ -3615,7 +3663,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramResults();
       var od = api.HistogramResults.fromJson(o.toJson());
-      checkHistogramResults(od);
+      checkHistogramResults(od as api.HistogramResults);
     });
   });
 
@@ -3623,7 +3671,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJob();
       var od = api.Job.fromJson(o.toJson());
-      checkJob(od);
+      checkJob(od as api.Job);
     });
   });
 
@@ -3631,7 +3679,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobFilters();
       var od = api.JobFilters.fromJson(o.toJson());
-      checkJobFilters(od);
+      checkJobFilters(od as api.JobFilters);
     });
   });
 
@@ -3639,7 +3687,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobLocation();
       var od = api.JobLocation.fromJson(o.toJson());
-      checkJobLocation(od);
+      checkJobLocation(od as api.JobLocation);
     });
   });
 
@@ -3647,7 +3695,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobProcessingOptions();
       var od = api.JobProcessingOptions.fromJson(o.toJson());
-      checkJobProcessingOptions(od);
+      checkJobProcessingOptions(od as api.JobProcessingOptions);
     });
   });
 
@@ -3655,7 +3703,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobQuery();
       var od = api.JobQuery.fromJson(o.toJson());
-      checkJobQuery(od);
+      checkJobQuery(od as api.JobQuery);
     });
   });
 
@@ -3663,7 +3711,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatLng();
       var od = api.LatLng.fromJson(o.toJson());
-      checkLatLng(od);
+      checkLatLng(od as api.LatLng);
     });
   });
 
@@ -3671,7 +3719,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCompaniesResponse();
       var od = api.ListCompaniesResponse.fromJson(o.toJson());
-      checkListCompaniesResponse(od);
+      checkListCompaniesResponse(od as api.ListCompaniesResponse);
     });
   });
 
@@ -3679,7 +3727,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCompanyJobsResponse();
       var od = api.ListCompanyJobsResponse.fromJson(o.toJson());
-      checkListCompanyJobsResponse(od);
+      checkListCompanyJobsResponse(od as api.ListCompanyJobsResponse);
     });
   });
 
@@ -3687,7 +3735,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListJobsResponse();
       var od = api.ListJobsResponse.fromJson(o.toJson());
-      checkListJobsResponse(od);
+      checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
 
@@ -3695,7 +3743,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationFilter();
       var od = api.LocationFilter.fromJson(o.toJson());
-      checkLocationFilter(od);
+      checkLocationFilter(od as api.LocationFilter);
     });
   });
 
@@ -3703,7 +3751,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMatchingJob();
       var od = api.MatchingJob.fromJson(o.toJson());
-      checkMatchingJob(od);
+      checkMatchingJob(od as api.MatchingJob);
     });
   });
 
@@ -3711,7 +3759,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMendelDebugInput();
       var od = api.MendelDebugInput.fromJson(o.toJson());
-      checkMendelDebugInput(od);
+      checkMendelDebugInput(od as api.MendelDebugInput);
     });
   });
 
@@ -3719,7 +3767,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoney();
       var od = api.Money.fromJson(o.toJson());
-      checkMoney(od);
+      checkMoney(od as api.Money);
     });
   });
 
@@ -3727,7 +3775,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamespacedDebugInput();
       var od = api.NamespacedDebugInput.fromJson(o.toJson());
-      checkNamespacedDebugInput(od);
+      checkNamespacedDebugInput(od as api.NamespacedDebugInput);
     });
   });
 
@@ -3735,7 +3783,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNumericBucketingOption();
       var od = api.NumericBucketingOption.fromJson(o.toJson());
-      checkNumericBucketingOption(od);
+      checkNumericBucketingOption(od as api.NumericBucketingOption);
     });
   });
 
@@ -3743,7 +3791,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNumericBucketingResult();
       var od = api.NumericBucketingResult.fromJson(o.toJson());
-      checkNumericBucketingResult(od);
+      checkNumericBucketingResult(od as api.NumericBucketingResult);
     });
   });
 
@@ -3751,7 +3799,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostalAddress();
       var od = api.PostalAddress.fromJson(o.toJson());
-      checkPostalAddress(od);
+      checkPostalAddress(od as api.PostalAddress);
     });
   });
 
@@ -3759,7 +3807,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestMetadata();
       var od = api.RequestMetadata.fromJson(o.toJson());
-      checkRequestMetadata(od);
+      checkRequestMetadata(od as api.RequestMetadata);
     });
   });
 
@@ -3767,7 +3815,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResponseMetadata();
       var od = api.ResponseMetadata.fromJson(o.toJson());
-      checkResponseMetadata(od);
+      checkResponseMetadata(od as api.ResponseMetadata);
     });
   });
 
@@ -3775,7 +3823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchJobsRequest();
       var od = api.SearchJobsRequest.fromJson(o.toJson());
-      checkSearchJobsRequest(od);
+      checkSearchJobsRequest(od as api.SearchJobsRequest);
     });
   });
 
@@ -3783,7 +3831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchJobsResponse();
       var od = api.SearchJobsResponse.fromJson(o.toJson());
-      checkSearchJobsResponse(od);
+      checkSearchJobsResponse(od as api.SearchJobsResponse);
     });
   });
 
@@ -3791,7 +3839,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpellingCorrection();
       var od = api.SpellingCorrection.fromJson(o.toJson());
-      checkSpellingCorrection(od);
+      checkSpellingCorrection(od as api.SpellingCorrection);
     });
   });
 
@@ -3799,7 +3847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3807,7 +3855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStringValues();
       var od = api.StringValues.fromJson(o.toJson());
-      checkStringValues(od);
+      checkStringValues(od as api.StringValues);
     });
   });
 
@@ -3815,7 +3863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateJobRequest();
       var od = api.UpdateJobRequest.fromJson(o.toJson());
-      checkUpdateJobRequest(od);
+      checkUpdateJobRequest(od as api.UpdateJobRequest);
     });
   });
 
@@ -3826,8 +3874,9 @@
       var arg_request = buildCompany();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Company.fromJson(json);
-        checkCompany(obj);
+        var obj =
+            api.Company.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCompany(obj as api.Company);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3866,7 +3915,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompany(response);
+        checkCompany(response as api.Company);
       })));
     });
 
@@ -3914,7 +3963,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3962,7 +4011,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompany(response);
+        checkCompany(response as api.Company);
       })));
     });
 
@@ -4021,7 +4070,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCompaniesResponse(response);
+        checkListCompaniesResponse(response as api.ListCompaniesResponse);
       })));
     });
 
@@ -4033,8 +4082,9 @@
       var arg_updateCompanyFields = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Company.fromJson(json);
-        checkCompany(obj);
+        var obj =
+            api.Company.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCompany(obj as api.Company);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4078,7 +4128,7 @@
               updateCompanyFields: arg_updateCompanyFields,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompany(response);
+        checkCompany(response as api.Company);
       })));
     });
   });
@@ -4149,7 +4199,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCompanyJobsResponse(response);
+        checkListCompanyJobsResponse(response as api.ListCompanyJobsResponse);
       })));
     });
   });
@@ -4161,8 +4211,9 @@
       var arg_request = buildBatchDeleteJobsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchDeleteJobsRequest.fromJson(json);
-        checkBatchDeleteJobsRequest(obj);
+        var obj = api.BatchDeleteJobsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchDeleteJobsRequest(obj as api.BatchDeleteJobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4201,7 +4252,7 @@
       res
           .batchDelete(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4211,8 +4262,9 @@
       var arg_request = buildCreateJobRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateJobRequest.fromJson(json);
-        checkCreateJobRequest(obj);
+        var obj = api.CreateJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateJobRequest(obj as api.CreateJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4251,7 +4303,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -4303,7 +4355,7 @@
           .delete(arg_name,
               disableFastProcess: arg_disableFastProcess, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4313,8 +4365,9 @@
       var arg_request = buildDeleteJobsByFilterRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeleteJobsByFilterRequest.fromJson(json);
-        checkDeleteJobsByFilterRequest(obj);
+        var obj = api.DeleteJobsByFilterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeleteJobsByFilterRequest(obj as api.DeleteJobsByFilterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4353,7 +4406,7 @@
       res
           .deleteByFilter(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4401,7 +4454,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -4411,8 +4464,9 @@
       var arg_request = buildGetHistogramRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetHistogramRequest.fromJson(json);
-        checkGetHistogramRequest(obj);
+        var obj = api.GetHistogramRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetHistogramRequest(obj as api.GetHistogramRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4451,7 +4505,7 @@
       res
           .histogram(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetHistogramResponse(response);
+        checkGetHistogramResponse(response as api.GetHistogramResponse);
       })));
     });
 
@@ -4513,7 +4567,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListJobsResponse(response);
+        checkListJobsResponse(response as api.ListJobsResponse);
       })));
     });
 
@@ -4524,8 +4578,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateJobRequest.fromJson(json);
-        checkUpdateJobRequest(obj);
+        var obj = api.UpdateJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateJobRequest(obj as api.UpdateJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4565,7 +4620,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -4575,8 +4630,9 @@
       var arg_request = buildSearchJobsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchJobsRequest.fromJson(json);
-        checkSearchJobsRequest(obj);
+        var obj = api.SearchJobsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchJobsRequest(obj as api.SearchJobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4615,7 +4671,7 @@
       res
           .search(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchJobsResponse(response);
+        checkSearchJobsResponse(response as api.SearchJobsResponse);
       })));
     });
 
@@ -4625,8 +4681,9 @@
       var arg_request = buildSearchJobsRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchJobsRequest.fromJson(json);
-        checkSearchJobsRequest(obj);
+        var obj = api.SearchJobsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchJobsRequest(obj as api.SearchJobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4665,7 +4722,7 @@
       res
           .searchForAlert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchJobsResponse(response);
+        checkSearchJobsResponse(response as api.SearchJobsResponse);
       })));
     });
   });
@@ -4735,7 +4792,7 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompleteQueryResponse(response);
+        checkCompleteQueryResponse(response as api.CompleteQueryResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/jobs/v3_test.dart b/generated/googleapis/test/jobs/v3_test.dart
index 3b06a77..b6e532c 100644
--- a/generated/googleapis/test/jobs/v3_test.dart
+++ b/generated/googleapis/test/jobs/v3_test.dart
@@ -179,7 +179,7 @@
   buildCounterBucketizedCount++;
   if (buildCounterBucketizedCount < 3) {
     unittest.expect(o.count, unittest.equals(42));
-    checkBucketRange(o.range);
+    checkBucketRange(o.range as api.BucketRange);
   }
   buildCounterBucketizedCount--;
 }
@@ -219,7 +219,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.eventId, unittest.equals('foo'));
     checkUnnamed2788(o.extraInfo);
-    checkJobEvent(o.jobEvent);
+    checkJobEvent(o.jobEvent as api.JobEvent);
     unittest.expect(o.parentEventId, unittest.equals('foo'));
     unittest.expect(o.requestId, unittest.equals('foo'));
   }
@@ -247,9 +247,9 @@
   if (buildCounterCommuteFilter < 3) {
     unittest.expect(o.allowImpreciseAddresses, unittest.isTrue);
     unittest.expect(o.commuteMethod, unittest.equals('foo'));
-    checkTimeOfDay(o.departureTime);
+    checkTimeOfDay(o.departureTime as api.TimeOfDay);
     unittest.expect(o.roadTraffic, unittest.equals('foo'));
-    checkLatLng(o.startCoordinates);
+    checkLatLng(o.startCoordinates as api.LatLng);
     unittest.expect(o.travelDuration, unittest.equals('foo'));
   }
   buildCounterCommuteFilter--;
@@ -270,7 +270,7 @@
 void checkCommuteInfo(api.CommuteInfo o) {
   buildCounterCommuteInfo++;
   if (buildCounterCommuteInfo < 3) {
-    checkLocation(o.jobLocation);
+    checkLocation(o.jobLocation as api.Location);
     unittest.expect(o.travelDuration, unittest.equals('foo'));
   }
   buildCounterCommuteInfo--;
@@ -316,7 +316,7 @@
   buildCounterCompany++;
   if (buildCounterCompany < 3) {
     unittest.expect(o.careerSiteUri, unittest.equals('foo'));
-    checkCompanyDerivedInfo(o.derivedInfo);
+    checkCompanyDerivedInfo(o.derivedInfo as api.CompanyDerivedInfo);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.eeoText, unittest.equals('foo'));
     unittest.expect(o.externalId, unittest.equals('foo'));
@@ -346,7 +346,7 @@
 void checkCompanyDerivedInfo(api.CompanyDerivedInfo o) {
   buildCounterCompanyDerivedInfo++;
   if (buildCounterCompanyDerivedInfo < 3) {
-    checkLocation(o.headquartersLocation);
+    checkLocation(o.headquartersLocation as api.Location);
   }
   buildCounterCompanyDerivedInfo--;
 }
@@ -370,10 +370,10 @@
 void checkCompensationEntry(api.CompensationEntry o) {
   buildCounterCompensationEntry++;
   if (buildCounterCompensationEntry < 3) {
-    checkMoney(o.amount);
+    checkMoney(o.amount as api.Money);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.expectedUnitsPerYear, unittest.equals(42.0));
-    checkCompensationRange(o.range);
+    checkCompensationRange(o.range as api.CompensationRange);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
   }
@@ -412,7 +412,7 @@
   if (buildCounterCompensationFilter < 3) {
     unittest.expect(
         o.includeJobsWithUnspecifiedCompensationRange, unittest.isTrue);
-    checkCompensationRange(o.range);
+    checkCompensationRange(o.range as api.CompensationRange);
     unittest.expect(o.type, unittest.equals('foo'));
     checkUnnamed2790(o.units);
   }
@@ -434,7 +434,8 @@
 void checkCompensationHistogramRequest(api.CompensationHistogramRequest o) {
   buildCounterCompensationHistogramRequest++;
   if (buildCounterCompensationHistogramRequest < 3) {
-    checkNumericBucketingOption(o.bucketingOption);
+    checkNumericBucketingOption(
+        o.bucketingOption as api.NumericBucketingOption);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCompensationHistogramRequest--;
@@ -455,7 +456,7 @@
 void checkCompensationHistogramResult(api.CompensationHistogramResult o) {
   buildCounterCompensationHistogramResult++;
   if (buildCounterCompensationHistogramResult < 3) {
-    checkNumericBucketingResult(o.result);
+    checkNumericBucketingResult(o.result as api.NumericBucketingResult);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterCompensationHistogramResult--;
@@ -470,8 +471,8 @@
 
 void checkUnnamed2791(core.List<api.CompensationEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompensationEntry(o[0]);
-  checkCompensationEntry(o[1]);
+  checkCompensationEntry(o[0] as api.CompensationEntry);
+  checkCompensationEntry(o[1] as api.CompensationEntry);
 }
 
 core.int buildCounterCompensationInfo = 0;
@@ -490,8 +491,10 @@
 void checkCompensationInfo(api.CompensationInfo o) {
   buildCounterCompensationInfo++;
   if (buildCounterCompensationInfo < 3) {
-    checkCompensationRange(o.annualizedBaseCompensationRange);
-    checkCompensationRange(o.annualizedTotalCompensationRange);
+    checkCompensationRange(
+        o.annualizedBaseCompensationRange as api.CompensationRange);
+    checkCompensationRange(
+        o.annualizedTotalCompensationRange as api.CompensationRange);
     checkUnnamed2791(o.entries);
   }
   buildCounterCompensationInfo--;
@@ -512,8 +515,8 @@
 void checkCompensationRange(api.CompensationRange o) {
   buildCounterCompensationRange++;
   if (buildCounterCompensationRange < 3) {
-    checkMoney(o.maxCompensation);
-    checkMoney(o.minCompensation);
+    checkMoney(o.maxCompensation as api.Money);
+    checkMoney(o.minCompensation as api.Money);
   }
   buildCounterCompensationRange--;
 }
@@ -527,8 +530,8 @@
 
 void checkUnnamed2792(core.List<api.CompletionResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompletionResult(o[0]);
-  checkCompletionResult(o[1]);
+  checkCompletionResult(o[0] as api.CompletionResult);
+  checkCompletionResult(o[1] as api.CompletionResult);
 }
 
 core.int buildCounterCompleteQueryResponse = 0;
@@ -547,7 +550,7 @@
   buildCounterCompleteQueryResponse++;
   if (buildCounterCompleteQueryResponse < 3) {
     checkUnnamed2792(o.completionResults);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
   }
   buildCounterCompleteQueryResponse--;
 }
@@ -589,7 +592,7 @@
 void checkCreateClientEventRequest(api.CreateClientEventRequest o) {
   buildCounterCreateClientEventRequest++;
   if (buildCounterCreateClientEventRequest < 3) {
-    checkClientEvent(o.clientEvent);
+    checkClientEvent(o.clientEvent as api.ClientEvent);
   }
   buildCounterCreateClientEventRequest--;
 }
@@ -608,7 +611,7 @@
 void checkCreateCompanyRequest(api.CreateCompanyRequest o) {
   buildCounterCreateCompanyRequest++;
   if (buildCounterCreateCompanyRequest < 3) {
-    checkCompany(o.company);
+    checkCompany(o.company as api.Company);
   }
   buildCounterCreateCompanyRequest--;
 }
@@ -627,7 +630,7 @@
 void checkCreateJobRequest(api.CreateJobRequest o) {
   buildCounterCreateJobRequest++;
   if (buildCounterCreateJobRequest < 3) {
-    checkJob(o.job);
+    checkJob(o.job as api.Job);
   }
   buildCounterCreateJobRequest--;
 }
@@ -699,7 +702,8 @@
   buildCounterCustomAttributeHistogramRequest++;
   if (buildCounterCustomAttributeHistogramRequest < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkNumericBucketingOption(o.longValueHistogramBucketingOption);
+    checkNumericBucketingOption(
+        o.longValueHistogramBucketingOption as api.NumericBucketingOption);
     unittest.expect(o.stringValueHistogram, unittest.isTrue);
   }
   buildCounterCustomAttributeHistogramRequest--;
@@ -735,7 +739,8 @@
   buildCounterCustomAttributeHistogramResult++;
   if (buildCounterCustomAttributeHistogramResult < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkNumericBucketingResult(o.longValueHistogramResult);
+    checkNumericBucketingResult(
+        o.longValueHistogramResult as api.NumericBucketingResult);
     checkUnnamed2795(o.stringValueHistogramResult);
   }
   buildCounterCustomAttributeHistogramResult--;
@@ -786,8 +791,8 @@
 
 void checkUnnamed2796(core.List<api.GoogleCloudTalentV4JobResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4JobResult(o[0]);
-  checkGoogleCloudTalentV4JobResult(o[1]);
+  checkGoogleCloudTalentV4JobResult(o[0] as api.GoogleCloudTalentV4JobResult);
+  checkGoogleCloudTalentV4JobResult(o[1] as api.GoogleCloudTalentV4JobResult);
 }
 
 core.int buildCounterGoogleCloudTalentV4BatchCreateJobsResponse = 0;
@@ -820,8 +825,8 @@
 
 void checkUnnamed2797(core.List<api.GoogleCloudTalentV4JobResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4JobResult(o[0]);
-  checkGoogleCloudTalentV4JobResult(o[1]);
+  checkGoogleCloudTalentV4JobResult(o[0] as api.GoogleCloudTalentV4JobResult);
+  checkGoogleCloudTalentV4JobResult(o[1] as api.GoogleCloudTalentV4JobResult);
 }
 
 core.int buildCounterGoogleCloudTalentV4BatchDeleteJobsResponse = 0;
@@ -889,8 +894,8 @@
 
 void checkUnnamed2798(core.List<api.GoogleCloudTalentV4JobResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4JobResult(o[0]);
-  checkGoogleCloudTalentV4JobResult(o[1]);
+  checkGoogleCloudTalentV4JobResult(o[0] as api.GoogleCloudTalentV4JobResult);
+  checkGoogleCloudTalentV4JobResult(o[1] as api.GoogleCloudTalentV4JobResult);
 }
 
 core.int buildCounterGoogleCloudTalentV4BatchUpdateJobsResponse = 0;
@@ -925,8 +930,10 @@
 void checkUnnamed2799(
     core.List<api.GoogleCloudTalentV4CompensationInfoCompensationEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(o[0]);
-  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(o[1]);
+  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(
+      o[0] as api.GoogleCloudTalentV4CompensationInfoCompensationEntry);
+  checkGoogleCloudTalentV4CompensationInfoCompensationEntry(
+      o[1] as api.GoogleCloudTalentV4CompensationInfoCompensationEntry);
 }
 
 core.int buildCounterGoogleCloudTalentV4CompensationInfo = 0;
@@ -950,9 +957,11 @@
   buildCounterGoogleCloudTalentV4CompensationInfo++;
   if (buildCounterGoogleCloudTalentV4CompensationInfo < 3) {
     checkGoogleCloudTalentV4CompensationInfoCompensationRange(
-        o.annualizedBaseCompensationRange);
+        o.annualizedBaseCompensationRange
+            as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     checkGoogleCloudTalentV4CompensationInfoCompensationRange(
-        o.annualizedTotalCompensationRange);
+        o.annualizedTotalCompensationRange
+            as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     checkUnnamed2799(o.entries);
   }
   buildCounterGoogleCloudTalentV4CompensationInfo--;
@@ -979,10 +988,11 @@
     api.GoogleCloudTalentV4CompensationInfoCompensationEntry o) {
   buildCounterGoogleCloudTalentV4CompensationInfoCompensationEntry++;
   if (buildCounterGoogleCloudTalentV4CompensationInfoCompensationEntry < 3) {
-    checkMoney(o.amount);
+    checkMoney(o.amount as api.Money);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.expectedUnitsPerYear, unittest.equals(42.0));
-    checkGoogleCloudTalentV4CompensationInfoCompensationRange(o.range);
+    checkGoogleCloudTalentV4CompensationInfoCompensationRange(
+        o.range as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.unit, unittest.equals('foo'));
   }
@@ -1006,8 +1016,8 @@
     api.GoogleCloudTalentV4CompensationInfoCompensationRange o) {
   buildCounterGoogleCloudTalentV4CompensationInfoCompensationRange++;
   if (buildCounterGoogleCloudTalentV4CompensationInfoCompensationRange < 3) {
-    checkMoney(o.maxCompensation);
-    checkMoney(o.minCompensation);
+    checkMoney(o.maxCompensation as api.Money);
+    checkMoney(o.minCompensation as api.Money);
   }
   buildCounterGoogleCloudTalentV4CompensationInfoCompensationRange--;
 }
@@ -1089,8 +1099,10 @@
 void checkUnnamed2803(
     core.Map<core.String, api.GoogleCloudTalentV4CustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4CustomAttribute(o['x']);
-  checkGoogleCloudTalentV4CustomAttribute(o['y']);
+  checkGoogleCloudTalentV4CustomAttribute(
+      o['x'] as api.GoogleCloudTalentV4CustomAttribute);
+  checkGoogleCloudTalentV4CustomAttribute(
+      o['y'] as api.GoogleCloudTalentV4CustomAttribute);
 }
 
 core.List<core.String> buildUnnamed2804() {
@@ -1176,14 +1188,17 @@
   buildCounterGoogleCloudTalentV4Job++;
   if (buildCounterGoogleCloudTalentV4Job < 3) {
     checkUnnamed2802(o.addresses);
-    checkGoogleCloudTalentV4JobApplicationInfo(o.applicationInfo);
+    checkGoogleCloudTalentV4JobApplicationInfo(
+        o.applicationInfo as api.GoogleCloudTalentV4JobApplicationInfo);
     unittest.expect(o.company, unittest.equals('foo'));
     unittest.expect(o.companyDisplayName, unittest.equals('foo'));
-    checkGoogleCloudTalentV4CompensationInfo(o.compensationInfo);
+    checkGoogleCloudTalentV4CompensationInfo(
+        o.compensationInfo as api.GoogleCloudTalentV4CompensationInfo);
     checkUnnamed2803(o.customAttributes);
     checkUnnamed2804(o.degreeTypes);
     unittest.expect(o.department, unittest.equals('foo'));
-    checkGoogleCloudTalentV4JobDerivedInfo(o.derivedInfo);
+    checkGoogleCloudTalentV4JobDerivedInfo(
+        o.derivedInfo as api.GoogleCloudTalentV4JobDerivedInfo);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed2805(o.employmentTypes);
     unittest.expect(o.incentives, unittest.equals('foo'));
@@ -1198,7 +1213,8 @@
     unittest.expect(o.postingPublishTime, unittest.equals('foo'));
     unittest.expect(o.postingRegion, unittest.equals('foo'));
     unittest.expect(o.postingUpdateTime, unittest.equals('foo'));
-    checkGoogleCloudTalentV4JobProcessingOptions(o.processingOptions);
+    checkGoogleCloudTalentV4JobProcessingOptions(
+        o.processingOptions as api.GoogleCloudTalentV4JobProcessingOptions);
     unittest.expect(o.promotionValue, unittest.equals(42));
     unittest.expect(o.qualifications, unittest.equals('foo'));
     unittest.expect(o.requisitionId, unittest.equals('foo'));
@@ -1282,8 +1298,8 @@
 
 void checkUnnamed2810(core.List<api.GoogleCloudTalentV4Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudTalentV4Location(o[0]);
-  checkGoogleCloudTalentV4Location(o[1]);
+  checkGoogleCloudTalentV4Location(o[0] as api.GoogleCloudTalentV4Location);
+  checkGoogleCloudTalentV4Location(o[1] as api.GoogleCloudTalentV4Location);
 }
 
 core.int buildCounterGoogleCloudTalentV4JobDerivedInfo = 0;
@@ -1346,8 +1362,8 @@
 void checkGoogleCloudTalentV4JobResult(api.GoogleCloudTalentV4JobResult o) {
   buildCounterGoogleCloudTalentV4JobResult++;
   if (buildCounterGoogleCloudTalentV4JobResult < 3) {
-    checkGoogleCloudTalentV4Job(o.job);
-    checkStatus(o.status);
+    checkGoogleCloudTalentV4Job(o.job as api.GoogleCloudTalentV4Job);
+    checkStatus(o.status as api.Status);
   }
   buildCounterGoogleCloudTalentV4JobResult--;
 }
@@ -1369,9 +1385,9 @@
 void checkGoogleCloudTalentV4Location(api.GoogleCloudTalentV4Location o) {
   buildCounterGoogleCloudTalentV4Location++;
   if (buildCounterGoogleCloudTalentV4Location < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
     unittest.expect(o.locationType, unittest.equals('foo'));
-    checkPostalAddress(o.postalAddress);
+    checkPostalAddress(o.postalAddress as api.PostalAddress);
     unittest.expect(o.radiusMiles, unittest.equals(42.0));
   }
   buildCounterGoogleCloudTalentV4Location--;
@@ -1386,8 +1402,8 @@
 
 void checkUnnamed2811(core.List<api.CompensationHistogramRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompensationHistogramRequest(o[0]);
-  checkCompensationHistogramRequest(o[1]);
+  checkCompensationHistogramRequest(o[0] as api.CompensationHistogramRequest);
+  checkCompensationHistogramRequest(o[1] as api.CompensationHistogramRequest);
 }
 
 core.List<api.CustomAttributeHistogramRequest> buildUnnamed2812() {
@@ -1399,8 +1415,10 @@
 
 void checkUnnamed2812(core.List<api.CustomAttributeHistogramRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttributeHistogramRequest(o[0]);
-  checkCustomAttributeHistogramRequest(o[1]);
+  checkCustomAttributeHistogramRequest(
+      o[0] as api.CustomAttributeHistogramRequest);
+  checkCustomAttributeHistogramRequest(
+      o[1] as api.CustomAttributeHistogramRequest);
 }
 
 core.List<core.String> buildUnnamed2813() {
@@ -1482,8 +1500,8 @@
 
 void checkUnnamed2815(core.List<api.CompensationHistogramResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompensationHistogramResult(o[0]);
-  checkCompensationHistogramResult(o[1]);
+  checkCompensationHistogramResult(o[0] as api.CompensationHistogramResult);
+  checkCompensationHistogramResult(o[1] as api.CompensationHistogramResult);
 }
 
 core.List<api.CustomAttributeHistogramResult> buildUnnamed2816() {
@@ -1495,8 +1513,10 @@
 
 void checkUnnamed2816(core.List<api.CustomAttributeHistogramResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttributeHistogramResult(o[0]);
-  checkCustomAttributeHistogramResult(o[1]);
+  checkCustomAttributeHistogramResult(
+      o[0] as api.CustomAttributeHistogramResult);
+  checkCustomAttributeHistogramResult(
+      o[1] as api.CustomAttributeHistogramResult);
 }
 
 core.List<api.HistogramResult> buildUnnamed2817() {
@@ -1508,8 +1528,8 @@
 
 void checkUnnamed2817(core.List<api.HistogramResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistogramResult(o[0]);
-  checkHistogramResult(o[1]);
+  checkHistogramResult(o[0] as api.HistogramResult);
+  checkHistogramResult(o[1] as api.HistogramResult);
 }
 
 core.int buildCounterHistogramResults = 0;
@@ -1557,8 +1577,8 @@
 
 void checkUnnamed2819(core.Map<core.String, api.CustomAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomAttribute(o['x']);
-  checkCustomAttribute(o['y']);
+  checkCustomAttribute(o['x'] as api.CustomAttribute);
+  checkCustomAttribute(o['y'] as api.CustomAttribute);
 }
 
 core.List<core.String> buildUnnamed2820() {
@@ -1644,14 +1664,14 @@
   buildCounterJob++;
   if (buildCounterJob < 3) {
     checkUnnamed2818(o.addresses);
-    checkApplicationInfo(o.applicationInfo);
+    checkApplicationInfo(o.applicationInfo as api.ApplicationInfo);
     unittest.expect(o.companyDisplayName, unittest.equals('foo'));
     unittest.expect(o.companyName, unittest.equals('foo'));
-    checkCompensationInfo(o.compensationInfo);
+    checkCompensationInfo(o.compensationInfo as api.CompensationInfo);
     checkUnnamed2819(o.customAttributes);
     checkUnnamed2820(o.degreeTypes);
     unittest.expect(o.department, unittest.equals('foo'));
-    checkJobDerivedInfo(o.derivedInfo);
+    checkJobDerivedInfo(o.derivedInfo as api.JobDerivedInfo);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed2821(o.employmentTypes);
     unittest.expect(o.incentives, unittest.equals('foo'));
@@ -1666,7 +1686,7 @@
     unittest.expect(o.postingPublishTime, unittest.equals('foo'));
     unittest.expect(o.postingRegion, unittest.equals('foo'));
     unittest.expect(o.postingUpdateTime, unittest.equals('foo'));
-    checkProcessingOptions(o.processingOptions);
+    checkProcessingOptions(o.processingOptions as api.ProcessingOptions);
     unittest.expect(o.promotionValue, unittest.equals(42));
     unittest.expect(o.qualifications, unittest.equals('foo'));
     unittest.expect(o.requisitionId, unittest.equals('foo'));
@@ -1699,8 +1719,8 @@
 
 void checkUnnamed2824(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterJobDerivedInfo = 0;
@@ -1832,8 +1852,8 @@
 
 void checkUnnamed2831(core.List<api.LocationFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocationFilter(o[0]);
-  checkLocationFilter(o[1]);
+  checkLocationFilter(o[0] as api.LocationFilter);
+  checkLocationFilter(o[1] as api.LocationFilter);
 }
 
 core.int buildCounterJobQuery = 0;
@@ -1862,17 +1882,17 @@
 void checkJobQuery(api.JobQuery o) {
   buildCounterJobQuery++;
   if (buildCounterJobQuery < 3) {
-    checkCommuteFilter(o.commuteFilter);
+    checkCommuteFilter(o.commuteFilter as api.CommuteFilter);
     checkUnnamed2826(o.companyDisplayNames);
     checkUnnamed2827(o.companyNames);
-    checkCompensationFilter(o.compensationFilter);
+    checkCompensationFilter(o.compensationFilter as api.CompensationFilter);
     unittest.expect(o.customAttributeFilter, unittest.equals('foo'));
     unittest.expect(o.disableSpellCheck, unittest.isTrue);
     checkUnnamed2828(o.employmentTypes);
     checkUnnamed2829(o.jobCategories);
     checkUnnamed2830(o.languageCodes);
     checkUnnamed2831(o.locationFilters);
-    checkTimestampRange(o.publishTimeRange);
+    checkTimestampRange(o.publishTimeRange as api.TimestampRange);
     unittest.expect(o.query, unittest.equals('foo'));
     unittest.expect(o.queryLanguageCode, unittest.equals('foo'));
   }
@@ -1909,8 +1929,8 @@
 
 void checkUnnamed2832(core.List<api.Company> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCompany(o[0]);
-  checkCompany(o[1]);
+  checkCompany(o[0] as api.Company);
+  checkCompany(o[1] as api.Company);
 }
 
 core.int buildCounterListCompaniesResponse = 0;
@@ -1930,7 +1950,7 @@
   buildCounterListCompaniesResponse++;
   if (buildCounterListCompaniesResponse < 3) {
     checkUnnamed2832(o.companies);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListCompaniesResponse--;
@@ -1945,8 +1965,8 @@
 
 void checkUnnamed2833(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJob(o[0]);
-  checkJob(o[1]);
+  checkJob(o[0] as api.Job);
+  checkJob(o[1] as api.Job);
 }
 
 core.int buildCounterListJobsResponse = 0;
@@ -1966,7 +1986,7 @@
   buildCounterListJobsResponse++;
   if (buildCounterListJobsResponse < 3) {
     checkUnnamed2833(o.jobs);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
   }
   buildCounterListJobsResponse--;
@@ -1989,9 +2009,9 @@
 void checkLocation(api.Location o) {
   buildCounterLocation++;
   if (buildCounterLocation < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
     unittest.expect(o.locationType, unittest.equals('foo'));
-    checkPostalAddress(o.postalAddress);
+    checkPostalAddress(o.postalAddress as api.PostalAddress);
     unittest.expect(o.radiusInMiles, unittest.equals(42.0));
   }
   buildCounterLocation--;
@@ -2017,7 +2037,7 @@
   if (buildCounterLocationFilter < 3) {
     unittest.expect(o.address, unittest.equals('foo'));
     unittest.expect(o.distanceInMiles, unittest.equals(42.0));
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
     unittest.expect(o.regionCode, unittest.equals('foo'));
     unittest.expect(o.telecommutePreference, unittest.equals('foo'));
   }
@@ -2042,8 +2062,8 @@
 void checkMatchingJob(api.MatchingJob o) {
   buildCounterMatchingJob++;
   if (buildCounterMatchingJob < 3) {
-    checkCommuteInfo(o.commuteInfo);
-    checkJob(o.job);
+    checkCommuteInfo(o.commuteInfo as api.CommuteInfo);
+    checkJob(o.job as api.Job);
     unittest.expect(o.jobSummary, unittest.equals('foo'));
     unittest.expect(o.jobTitleSnippet, unittest.equals('foo'));
     unittest.expect(o.searchTextSnippet, unittest.equals('foo'));
@@ -2060,8 +2080,8 @@
 
 void checkUnnamed2834(core.Map<core.String, api.NamespacedDebugInput> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamespacedDebugInput(o['x']);
-  checkNamespacedDebugInput(o['y']);
+  checkNamespacedDebugInput(o['x'] as api.NamespacedDebugInput);
+  checkNamespacedDebugInput(o['y'] as api.NamespacedDebugInput);
 }
 
 core.int buildCounterMendelDebugInput = 0;
@@ -2337,8 +2357,8 @@
 
 void checkUnnamed2847(core.List<api.BucketizedCount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucketizedCount(o[0]);
-  checkBucketizedCount(o[1]);
+  checkBucketizedCount(o[0] as api.BucketizedCount);
+  checkBucketizedCount(o[1] as api.BucketizedCount);
 }
 
 core.int buildCounterNumericBucketingResult = 0;
@@ -2467,7 +2487,7 @@
 void checkRequestMetadata(api.RequestMetadata o) {
   buildCounterRequestMetadata++;
   if (buildCounterRequestMetadata < 3) {
-    checkDeviceInfo(o.deviceInfo);
+    checkDeviceInfo(o.deviceInfo as api.DeviceInfo);
     unittest.expect(o.domain, unittest.equals('foo'));
     unittest.expect(o.sessionId, unittest.equals('foo'));
     unittest.expect(o.userId, unittest.equals('foo'));
@@ -2523,14 +2543,14 @@
     unittest.expect(o.disableKeywordMatch, unittest.isTrue);
     unittest.expect(o.diversificationLevel, unittest.equals('foo'));
     unittest.expect(o.enableBroadening, unittest.isTrue);
-    checkHistogramFacets(o.histogramFacets);
-    checkJobQuery(o.jobQuery);
+    checkHistogramFacets(o.histogramFacets as api.HistogramFacets);
+    checkJobQuery(o.jobQuery as api.JobQuery);
     unittest.expect(o.jobView, unittest.equals('foo'));
     unittest.expect(o.offset, unittest.equals(42));
     unittest.expect(o.orderBy, unittest.equals('foo'));
     unittest.expect(o.pageSize, unittest.equals(42));
     unittest.expect(o.pageToken, unittest.equals('foo'));
-    checkRequestMetadata(o.requestMetadata);
+    checkRequestMetadata(o.requestMetadata as api.RequestMetadata);
     unittest.expect(o.requirePreciseResultSize, unittest.isTrue);
     unittest.expect(o.searchMode, unittest.equals('foo'));
   }
@@ -2546,8 +2566,8 @@
 
 void checkUnnamed2850(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.List<api.MatchingJob> buildUnnamed2851() {
@@ -2559,8 +2579,8 @@
 
 void checkUnnamed2851(core.List<api.MatchingJob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMatchingJob(o[0]);
-  checkMatchingJob(o[1]);
+  checkMatchingJob(o[0] as api.MatchingJob);
+  checkMatchingJob(o[1] as api.MatchingJob);
 }
 
 core.int buildCounterSearchJobsResponse = 0;
@@ -2587,12 +2607,12 @@
   if (buildCounterSearchJobsResponse < 3) {
     unittest.expect(o.broadenedQueryJobsCount, unittest.equals(42));
     unittest.expect(o.estimatedTotalSize, unittest.equals(42));
-    checkHistogramResults(o.histogramResults);
+    checkHistogramResults(o.histogramResults as api.HistogramResults);
     checkUnnamed2850(o.locationFilters);
     checkUnnamed2851(o.matchingJobs);
-    checkResponseMetadata(o.metadata);
+    checkResponseMetadata(o.metadata as api.ResponseMetadata);
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkSpellingCorrection(o.spellCorrection);
+    checkSpellingCorrection(o.spellCorrection as api.SpellingCorrection);
     unittest.expect(o.totalSize, unittest.equals(42));
   }
   buildCounterSearchJobsResponse--;
@@ -2745,7 +2765,7 @@
 void checkUpdateCompanyRequest(api.UpdateCompanyRequest o) {
   buildCounterUpdateCompanyRequest++;
   if (buildCounterUpdateCompanyRequest < 3) {
-    checkCompany(o.company);
+    checkCompany(o.company as api.Company);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateCompanyRequest--;
@@ -2766,7 +2786,7 @@
 void checkUpdateJobRequest(api.UpdateJobRequest o) {
   buildCounterUpdateJobRequest++;
   if (buildCounterUpdateJobRequest < 3) {
-    checkJob(o.job);
+    checkJob(o.job as api.Job);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateJobRequest--;
@@ -2790,7 +2810,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplicationInfo();
       var od = api.ApplicationInfo.fromJson(o.toJson());
-      checkApplicationInfo(od);
+      checkApplicationInfo(od as api.ApplicationInfo);
     });
   });
 
@@ -2798,7 +2818,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchDeleteJobsRequest();
       var od = api.BatchDeleteJobsRequest.fromJson(o.toJson());
-      checkBatchDeleteJobsRequest(od);
+      checkBatchDeleteJobsRequest(od as api.BatchDeleteJobsRequest);
     });
   });
 
@@ -2806,7 +2826,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketRange();
       var od = api.BucketRange.fromJson(o.toJson());
-      checkBucketRange(od);
+      checkBucketRange(od as api.BucketRange);
     });
   });
 
@@ -2814,7 +2834,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketizedCount();
       var od = api.BucketizedCount.fromJson(o.toJson());
-      checkBucketizedCount(od);
+      checkBucketizedCount(od as api.BucketizedCount);
     });
   });
 
@@ -2822,7 +2842,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClientEvent();
       var od = api.ClientEvent.fromJson(o.toJson());
-      checkClientEvent(od);
+      checkClientEvent(od as api.ClientEvent);
     });
   });
 
@@ -2830,7 +2850,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommuteFilter();
       var od = api.CommuteFilter.fromJson(o.toJson());
-      checkCommuteFilter(od);
+      checkCommuteFilter(od as api.CommuteFilter);
     });
   });
 
@@ -2838,7 +2858,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommuteInfo();
       var od = api.CommuteInfo.fromJson(o.toJson());
-      checkCommuteInfo(od);
+      checkCommuteInfo(od as api.CommuteInfo);
     });
   });
 
@@ -2846,7 +2866,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompany();
       var od = api.Company.fromJson(o.toJson());
-      checkCompany(od);
+      checkCompany(od as api.Company);
     });
   });
 
@@ -2854,7 +2874,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompanyDerivedInfo();
       var od = api.CompanyDerivedInfo.fromJson(o.toJson());
-      checkCompanyDerivedInfo(od);
+      checkCompanyDerivedInfo(od as api.CompanyDerivedInfo);
     });
   });
 
@@ -2862,7 +2882,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationEntry();
       var od = api.CompensationEntry.fromJson(o.toJson());
-      checkCompensationEntry(od);
+      checkCompensationEntry(od as api.CompensationEntry);
     });
   });
 
@@ -2870,7 +2890,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationFilter();
       var od = api.CompensationFilter.fromJson(o.toJson());
-      checkCompensationFilter(od);
+      checkCompensationFilter(od as api.CompensationFilter);
     });
   });
 
@@ -2878,7 +2898,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationHistogramRequest();
       var od = api.CompensationHistogramRequest.fromJson(o.toJson());
-      checkCompensationHistogramRequest(od);
+      checkCompensationHistogramRequest(od as api.CompensationHistogramRequest);
     });
   });
 
@@ -2886,7 +2906,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationHistogramResult();
       var od = api.CompensationHistogramResult.fromJson(o.toJson());
-      checkCompensationHistogramResult(od);
+      checkCompensationHistogramResult(od as api.CompensationHistogramResult);
     });
   });
 
@@ -2894,7 +2914,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationInfo();
       var od = api.CompensationInfo.fromJson(o.toJson());
-      checkCompensationInfo(od);
+      checkCompensationInfo(od as api.CompensationInfo);
     });
   });
 
@@ -2902,7 +2922,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompensationRange();
       var od = api.CompensationRange.fromJson(o.toJson());
-      checkCompensationRange(od);
+      checkCompensationRange(od as api.CompensationRange);
     });
   });
 
@@ -2910,7 +2930,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompleteQueryResponse();
       var od = api.CompleteQueryResponse.fromJson(o.toJson());
-      checkCompleteQueryResponse(od);
+      checkCompleteQueryResponse(od as api.CompleteQueryResponse);
     });
   });
 
@@ -2918,7 +2938,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCompletionResult();
       var od = api.CompletionResult.fromJson(o.toJson());
-      checkCompletionResult(od);
+      checkCompletionResult(od as api.CompletionResult);
     });
   });
 
@@ -2926,7 +2946,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateClientEventRequest();
       var od = api.CreateClientEventRequest.fromJson(o.toJson());
-      checkCreateClientEventRequest(od);
+      checkCreateClientEventRequest(od as api.CreateClientEventRequest);
     });
   });
 
@@ -2934,7 +2954,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateCompanyRequest();
       var od = api.CreateCompanyRequest.fromJson(o.toJson());
-      checkCreateCompanyRequest(od);
+      checkCreateCompanyRequest(od as api.CreateCompanyRequest);
     });
   });
 
@@ -2942,7 +2962,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateJobRequest();
       var od = api.CreateJobRequest.fromJson(o.toJson());
-      checkCreateJobRequest(od);
+      checkCreateJobRequest(od as api.CreateJobRequest);
     });
   });
 
@@ -2950,7 +2970,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAttribute();
       var od = api.CustomAttribute.fromJson(o.toJson());
-      checkCustomAttribute(od);
+      checkCustomAttribute(od as api.CustomAttribute);
     });
   });
 
@@ -2958,7 +2978,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAttributeHistogramRequest();
       var od = api.CustomAttributeHistogramRequest.fromJson(o.toJson());
-      checkCustomAttributeHistogramRequest(od);
+      checkCustomAttributeHistogramRequest(
+          od as api.CustomAttributeHistogramRequest);
     });
   });
 
@@ -2966,7 +2987,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAttributeHistogramResult();
       var od = api.CustomAttributeHistogramResult.fromJson(o.toJson());
-      checkCustomAttributeHistogramResult(od);
+      checkCustomAttributeHistogramResult(
+          od as api.CustomAttributeHistogramResult);
     });
   });
 
@@ -2974,7 +2996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceInfo();
       var od = api.DeviceInfo.fromJson(o.toJson());
-      checkDeviceInfo(od);
+      checkDeviceInfo(od as api.DeviceInfo);
     });
   });
 
@@ -2982,7 +3004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2991,7 +3013,8 @@
       var o = buildGoogleCloudTalentV4BatchCreateJobsResponse();
       var od =
           api.GoogleCloudTalentV4BatchCreateJobsResponse.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchCreateJobsResponse(od);
+      checkGoogleCloudTalentV4BatchCreateJobsResponse(
+          od as api.GoogleCloudTalentV4BatchCreateJobsResponse);
     });
   });
 
@@ -3000,7 +3023,8 @@
       var o = buildGoogleCloudTalentV4BatchDeleteJobsResponse();
       var od =
           api.GoogleCloudTalentV4BatchDeleteJobsResponse.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchDeleteJobsResponse(od);
+      checkGoogleCloudTalentV4BatchDeleteJobsResponse(
+          od as api.GoogleCloudTalentV4BatchDeleteJobsResponse);
     });
   });
 
@@ -3009,7 +3033,8 @@
       var o = buildGoogleCloudTalentV4BatchOperationMetadata();
       var od =
           api.GoogleCloudTalentV4BatchOperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchOperationMetadata(od);
+      checkGoogleCloudTalentV4BatchOperationMetadata(
+          od as api.GoogleCloudTalentV4BatchOperationMetadata);
     });
   });
 
@@ -3018,7 +3043,8 @@
       var o = buildGoogleCloudTalentV4BatchUpdateJobsResponse();
       var od =
           api.GoogleCloudTalentV4BatchUpdateJobsResponse.fromJson(o.toJson());
-      checkGoogleCloudTalentV4BatchUpdateJobsResponse(od);
+      checkGoogleCloudTalentV4BatchUpdateJobsResponse(
+          od as api.GoogleCloudTalentV4BatchUpdateJobsResponse);
     });
   });
 
@@ -3026,7 +3052,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4CompensationInfo();
       var od = api.GoogleCloudTalentV4CompensationInfo.fromJson(o.toJson());
-      checkGoogleCloudTalentV4CompensationInfo(od);
+      checkGoogleCloudTalentV4CompensationInfo(
+          od as api.GoogleCloudTalentV4CompensationInfo);
     });
   });
 
@@ -3037,7 +3064,8 @@
       var od =
           api.GoogleCloudTalentV4CompensationInfoCompensationEntry.fromJson(
               o.toJson());
-      checkGoogleCloudTalentV4CompensationInfoCompensationEntry(od);
+      checkGoogleCloudTalentV4CompensationInfoCompensationEntry(
+          od as api.GoogleCloudTalentV4CompensationInfoCompensationEntry);
     });
   });
 
@@ -3048,7 +3076,8 @@
       var od =
           api.GoogleCloudTalentV4CompensationInfoCompensationRange.fromJson(
               o.toJson());
-      checkGoogleCloudTalentV4CompensationInfoCompensationRange(od);
+      checkGoogleCloudTalentV4CompensationInfoCompensationRange(
+          od as api.GoogleCloudTalentV4CompensationInfoCompensationRange);
     });
   });
 
@@ -3056,7 +3085,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4CustomAttribute();
       var od = api.GoogleCloudTalentV4CustomAttribute.fromJson(o.toJson());
-      checkGoogleCloudTalentV4CustomAttribute(od);
+      checkGoogleCloudTalentV4CustomAttribute(
+          od as api.GoogleCloudTalentV4CustomAttribute);
     });
   });
 
@@ -3064,7 +3094,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4Job();
       var od = api.GoogleCloudTalentV4Job.fromJson(o.toJson());
-      checkGoogleCloudTalentV4Job(od);
+      checkGoogleCloudTalentV4Job(od as api.GoogleCloudTalentV4Job);
     });
   });
 
@@ -3072,7 +3102,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobApplicationInfo();
       var od = api.GoogleCloudTalentV4JobApplicationInfo.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobApplicationInfo(od);
+      checkGoogleCloudTalentV4JobApplicationInfo(
+          od as api.GoogleCloudTalentV4JobApplicationInfo);
     });
   });
 
@@ -3080,7 +3111,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobDerivedInfo();
       var od = api.GoogleCloudTalentV4JobDerivedInfo.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobDerivedInfo(od);
+      checkGoogleCloudTalentV4JobDerivedInfo(
+          od as api.GoogleCloudTalentV4JobDerivedInfo);
     });
   });
 
@@ -3088,7 +3120,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobProcessingOptions();
       var od = api.GoogleCloudTalentV4JobProcessingOptions.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobProcessingOptions(od);
+      checkGoogleCloudTalentV4JobProcessingOptions(
+          od as api.GoogleCloudTalentV4JobProcessingOptions);
     });
   });
 
@@ -3096,7 +3129,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4JobResult();
       var od = api.GoogleCloudTalentV4JobResult.fromJson(o.toJson());
-      checkGoogleCloudTalentV4JobResult(od);
+      checkGoogleCloudTalentV4JobResult(od as api.GoogleCloudTalentV4JobResult);
     });
   });
 
@@ -3104,7 +3137,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudTalentV4Location();
       var od = api.GoogleCloudTalentV4Location.fromJson(o.toJson());
-      checkGoogleCloudTalentV4Location(od);
+      checkGoogleCloudTalentV4Location(od as api.GoogleCloudTalentV4Location);
     });
   });
 
@@ -3112,7 +3145,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramFacets();
       var od = api.HistogramFacets.fromJson(o.toJson());
-      checkHistogramFacets(od);
+      checkHistogramFacets(od as api.HistogramFacets);
     });
   });
 
@@ -3120,7 +3153,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramResult();
       var od = api.HistogramResult.fromJson(o.toJson());
-      checkHistogramResult(od);
+      checkHistogramResult(od as api.HistogramResult);
     });
   });
 
@@ -3128,7 +3161,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramResults();
       var od = api.HistogramResults.fromJson(o.toJson());
-      checkHistogramResults(od);
+      checkHistogramResults(od as api.HistogramResults);
     });
   });
 
@@ -3136,7 +3169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJob();
       var od = api.Job.fromJson(o.toJson());
-      checkJob(od);
+      checkJob(od as api.Job);
     });
   });
 
@@ -3144,7 +3177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobDerivedInfo();
       var od = api.JobDerivedInfo.fromJson(o.toJson());
-      checkJobDerivedInfo(od);
+      checkJobDerivedInfo(od as api.JobDerivedInfo);
     });
   });
 
@@ -3152,7 +3185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobEvent();
       var od = api.JobEvent.fromJson(o.toJson());
-      checkJobEvent(od);
+      checkJobEvent(od as api.JobEvent);
     });
   });
 
@@ -3160,7 +3193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJobQuery();
       var od = api.JobQuery.fromJson(o.toJson());
-      checkJobQuery(od);
+      checkJobQuery(od as api.JobQuery);
     });
   });
 
@@ -3168,7 +3201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatLng();
       var od = api.LatLng.fromJson(o.toJson());
-      checkLatLng(od);
+      checkLatLng(od as api.LatLng);
     });
   });
 
@@ -3176,7 +3209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCompaniesResponse();
       var od = api.ListCompaniesResponse.fromJson(o.toJson());
-      checkListCompaniesResponse(od);
+      checkListCompaniesResponse(od as api.ListCompaniesResponse);
     });
   });
 
@@ -3184,7 +3217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListJobsResponse();
       var od = api.ListJobsResponse.fromJson(o.toJson());
-      checkListJobsResponse(od);
+      checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
 
@@ -3192,7 +3225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -3200,7 +3233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationFilter();
       var od = api.LocationFilter.fromJson(o.toJson());
-      checkLocationFilter(od);
+      checkLocationFilter(od as api.LocationFilter);
     });
   });
 
@@ -3208,7 +3241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMatchingJob();
       var od = api.MatchingJob.fromJson(o.toJson());
-      checkMatchingJob(od);
+      checkMatchingJob(od as api.MatchingJob);
     });
   });
 
@@ -3216,7 +3249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMendelDebugInput();
       var od = api.MendelDebugInput.fromJson(o.toJson());
-      checkMendelDebugInput(od);
+      checkMendelDebugInput(od as api.MendelDebugInput);
     });
   });
 
@@ -3224,7 +3257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoney();
       var od = api.Money.fromJson(o.toJson());
-      checkMoney(od);
+      checkMoney(od as api.Money);
     });
   });
 
@@ -3232,7 +3265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamespacedDebugInput();
       var od = api.NamespacedDebugInput.fromJson(o.toJson());
-      checkNamespacedDebugInput(od);
+      checkNamespacedDebugInput(od as api.NamespacedDebugInput);
     });
   });
 
@@ -3240,7 +3273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNumericBucketingOption();
       var od = api.NumericBucketingOption.fromJson(o.toJson());
-      checkNumericBucketingOption(od);
+      checkNumericBucketingOption(od as api.NumericBucketingOption);
     });
   });
 
@@ -3248,7 +3281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNumericBucketingResult();
       var od = api.NumericBucketingResult.fromJson(o.toJson());
-      checkNumericBucketingResult(od);
+      checkNumericBucketingResult(od as api.NumericBucketingResult);
     });
   });
 
@@ -3256,7 +3289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPostalAddress();
       var od = api.PostalAddress.fromJson(o.toJson());
-      checkPostalAddress(od);
+      checkPostalAddress(od as api.PostalAddress);
     });
   });
 
@@ -3264,7 +3297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProcessingOptions();
       var od = api.ProcessingOptions.fromJson(o.toJson());
-      checkProcessingOptions(od);
+      checkProcessingOptions(od as api.ProcessingOptions);
     });
   });
 
@@ -3272,7 +3305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestMetadata();
       var od = api.RequestMetadata.fromJson(o.toJson());
-      checkRequestMetadata(od);
+      checkRequestMetadata(od as api.RequestMetadata);
     });
   });
 
@@ -3280,7 +3313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResponseMetadata();
       var od = api.ResponseMetadata.fromJson(o.toJson());
-      checkResponseMetadata(od);
+      checkResponseMetadata(od as api.ResponseMetadata);
     });
   });
 
@@ -3288,7 +3321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchJobsRequest();
       var od = api.SearchJobsRequest.fromJson(o.toJson());
-      checkSearchJobsRequest(od);
+      checkSearchJobsRequest(od as api.SearchJobsRequest);
     });
   });
 
@@ -3296,7 +3329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchJobsResponse();
       var od = api.SearchJobsResponse.fromJson(o.toJson());
-      checkSearchJobsResponse(od);
+      checkSearchJobsResponse(od as api.SearchJobsResponse);
     });
   });
 
@@ -3304,7 +3337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpellingCorrection();
       var od = api.SpellingCorrection.fromJson(o.toJson());
-      checkSpellingCorrection(od);
+      checkSpellingCorrection(od as api.SpellingCorrection);
     });
   });
 
@@ -3312,7 +3345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3320,7 +3353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeOfDay();
       var od = api.TimeOfDay.fromJson(o.toJson());
-      checkTimeOfDay(od);
+      checkTimeOfDay(od as api.TimeOfDay);
     });
   });
 
@@ -3328,7 +3361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimestampRange();
       var od = api.TimestampRange.fromJson(o.toJson());
-      checkTimestampRange(od);
+      checkTimestampRange(od as api.TimestampRange);
     });
   });
 
@@ -3336,7 +3369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateCompanyRequest();
       var od = api.UpdateCompanyRequest.fromJson(o.toJson());
-      checkUpdateCompanyRequest(od);
+      checkUpdateCompanyRequest(od as api.UpdateCompanyRequest);
     });
   });
 
@@ -3344,7 +3377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateJobRequest();
       var od = api.UpdateJobRequest.fromJson(o.toJson());
-      checkUpdateJobRequest(od);
+      checkUpdateJobRequest(od as api.UpdateJobRequest);
     });
   });
 
@@ -3419,7 +3452,7 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompleteQueryResponse(response);
+        checkCompleteQueryResponse(response as api.CompleteQueryResponse);
       })));
     });
   });
@@ -3432,8 +3465,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateClientEventRequest.fromJson(json);
-        checkCreateClientEventRequest(obj);
+        var obj = api.CreateClientEventRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateClientEventRequest(obj as api.CreateClientEventRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3473,7 +3507,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkClientEvent(response);
+        checkClientEvent(response as api.ClientEvent);
       })));
     });
   });
@@ -3486,8 +3520,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateCompanyRequest.fromJson(json);
-        checkCreateCompanyRequest(obj);
+        var obj = api.CreateCompanyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateCompanyRequest(obj as api.CreateCompanyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3527,7 +3562,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompany(response);
+        checkCompany(response as api.Company);
       })));
     });
 
@@ -3575,7 +3610,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3623,7 +3658,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompany(response);
+        checkCompany(response as api.Company);
       })));
     });
 
@@ -3684,7 +3719,7 @@
               requireOpenJobs: arg_requireOpenJobs,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCompaniesResponse(response);
+        checkListCompaniesResponse(response as api.ListCompaniesResponse);
       })));
     });
 
@@ -3695,8 +3730,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateCompanyRequest.fromJson(json);
-        checkUpdateCompanyRequest(obj);
+        var obj = api.UpdateCompanyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateCompanyRequest(obj as api.UpdateCompanyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3736,7 +3772,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCompany(response);
+        checkCompany(response as api.Company);
       })));
     });
   });
@@ -3749,8 +3785,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchDeleteJobsRequest.fromJson(json);
-        checkBatchDeleteJobsRequest(obj);
+        var obj = api.BatchDeleteJobsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchDeleteJobsRequest(obj as api.BatchDeleteJobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3790,7 +3827,7 @@
       res
           .batchDelete(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3801,8 +3838,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateJobRequest.fromJson(json);
-        checkCreateJobRequest(obj);
+        var obj = api.CreateJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateJobRequest(obj as api.CreateJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3842,7 +3880,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -3890,7 +3928,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3938,7 +3976,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -4002,7 +4040,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListJobsResponse(response);
+        checkListJobsResponse(response as api.ListJobsResponse);
       })));
     });
 
@@ -4013,8 +4051,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateJobRequest.fromJson(json);
-        checkUpdateJobRequest(obj);
+        var obj = api.UpdateJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateJobRequest(obj as api.UpdateJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4054,7 +4093,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -4065,8 +4104,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchJobsRequest.fromJson(json);
-        checkSearchJobsRequest(obj);
+        var obj = api.SearchJobsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchJobsRequest(obj as api.SearchJobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4106,7 +4146,7 @@
       res
           .search(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchJobsResponse(response);
+        checkSearchJobsResponse(response as api.SearchJobsResponse);
       })));
     });
 
@@ -4117,8 +4157,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchJobsRequest.fromJson(json);
-        checkSearchJobsRequest(obj);
+        var obj = api.SearchJobsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchJobsRequest(obj as api.SearchJobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4158,7 +4199,7 @@
       res
           .searchForAlert(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchJobsResponse(response);
+        checkSearchJobsResponse(response as api.SearchJobsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/kgsearch/v1_test.dart b/generated/googleapis/test/kgsearch/v1_test.dart
index 971011b..d72073f 100644
--- a/generated/googleapis/test/kgsearch/v1_test.dart
+++ b/generated/googleapis/test/kgsearch/v1_test.dart
@@ -186,7 +186,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchResponse();
       var od = api.SearchResponse.fromJson(o.toJson());
-      checkSearchResponse(od);
+      checkSearchResponse(od as api.SearchResponse);
     });
   });
 
@@ -258,7 +258,7 @@
               types: arg_types,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchResponse(response);
+        checkSearchResponse(response as api.SearchResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/language/v1_test.dart b/generated/googleapis/test/language/v1_test.dart
index 75b5934..14e076d 100644
--- a/generated/googleapis/test/language/v1_test.dart
+++ b/generated/googleapis/test/language/v1_test.dart
@@ -89,7 +89,7 @@
 void checkAnalyzeEntitiesRequest(api.AnalyzeEntitiesRequest o) {
   buildCounterAnalyzeEntitiesRequest++;
   if (buildCounterAnalyzeEntitiesRequest < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
     unittest.expect(o.encodingType, unittest.equals('foo'));
   }
   buildCounterAnalyzeEntitiesRequest--;
@@ -104,8 +104,8 @@
 
 void checkUnnamed2301(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntity(o[0]);
-  checkEntity(o[1]);
+  checkEntity(o[0] as api.Entity);
+  checkEntity(o[1] as api.Entity);
 }
 
 core.int buildCounterAnalyzeEntitiesResponse = 0;
@@ -144,7 +144,7 @@
 void checkAnalyzeEntitySentimentRequest(api.AnalyzeEntitySentimentRequest o) {
   buildCounterAnalyzeEntitySentimentRequest++;
   if (buildCounterAnalyzeEntitySentimentRequest < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
     unittest.expect(o.encodingType, unittest.equals('foo'));
   }
   buildCounterAnalyzeEntitySentimentRequest--;
@@ -159,8 +159,8 @@
 
 void checkUnnamed2302(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntity(o[0]);
-  checkEntity(o[1]);
+  checkEntity(o[0] as api.Entity);
+  checkEntity(o[1] as api.Entity);
 }
 
 core.int buildCounterAnalyzeEntitySentimentResponse = 0;
@@ -199,7 +199,7 @@
 void checkAnalyzeSentimentRequest(api.AnalyzeSentimentRequest o) {
   buildCounterAnalyzeSentimentRequest++;
   if (buildCounterAnalyzeSentimentRequest < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
     unittest.expect(o.encodingType, unittest.equals('foo'));
   }
   buildCounterAnalyzeSentimentRequest--;
@@ -214,8 +214,8 @@
 
 void checkUnnamed2303(core.List<api.Sentence> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSentence(o[0]);
-  checkSentence(o[1]);
+  checkSentence(o[0] as api.Sentence);
+  checkSentence(o[1] as api.Sentence);
 }
 
 core.int buildCounterAnalyzeSentimentResponse = 0;
@@ -234,7 +234,7 @@
 void checkAnalyzeSentimentResponse(api.AnalyzeSentimentResponse o) {
   buildCounterAnalyzeSentimentResponse++;
   if (buildCounterAnalyzeSentimentResponse < 3) {
-    checkSentiment(o.documentSentiment);
+    checkSentiment(o.documentSentiment as api.Sentiment);
     unittest.expect(o.language, unittest.equals('foo'));
     checkUnnamed2303(o.sentences);
   }
@@ -256,7 +256,7 @@
 void checkAnalyzeSyntaxRequest(api.AnalyzeSyntaxRequest o) {
   buildCounterAnalyzeSyntaxRequest++;
   if (buildCounterAnalyzeSyntaxRequest < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
     unittest.expect(o.encodingType, unittest.equals('foo'));
   }
   buildCounterAnalyzeSyntaxRequest--;
@@ -271,8 +271,8 @@
 
 void checkUnnamed2304(core.List<api.Sentence> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSentence(o[0]);
-  checkSentence(o[1]);
+  checkSentence(o[0] as api.Sentence);
+  checkSentence(o[1] as api.Sentence);
 }
 
 core.List<api.Token> buildUnnamed2305() {
@@ -284,8 +284,8 @@
 
 void checkUnnamed2305(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkToken(o[0]);
-  checkToken(o[1]);
+  checkToken(o[0] as api.Token);
+  checkToken(o[1] as api.Token);
 }
 
 core.int buildCounterAnalyzeSyntaxResponse = 0;
@@ -327,9 +327,9 @@
 void checkAnnotateTextRequest(api.AnnotateTextRequest o) {
   buildCounterAnnotateTextRequest++;
   if (buildCounterAnnotateTextRequest < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
     unittest.expect(o.encodingType, unittest.equals('foo'));
-    checkFeatures(o.features);
+    checkFeatures(o.features as api.Features);
   }
   buildCounterAnnotateTextRequest--;
 }
@@ -343,8 +343,8 @@
 
 void checkUnnamed2306(core.List<api.ClassificationCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClassificationCategory(o[0]);
-  checkClassificationCategory(o[1]);
+  checkClassificationCategory(o[0] as api.ClassificationCategory);
+  checkClassificationCategory(o[1] as api.ClassificationCategory);
 }
 
 core.List<api.Entity> buildUnnamed2307() {
@@ -356,8 +356,8 @@
 
 void checkUnnamed2307(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntity(o[0]);
-  checkEntity(o[1]);
+  checkEntity(o[0] as api.Entity);
+  checkEntity(o[1] as api.Entity);
 }
 
 core.List<api.Sentence> buildUnnamed2308() {
@@ -369,8 +369,8 @@
 
 void checkUnnamed2308(core.List<api.Sentence> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSentence(o[0]);
-  checkSentence(o[1]);
+  checkSentence(o[0] as api.Sentence);
+  checkSentence(o[1] as api.Sentence);
 }
 
 core.List<api.Token> buildUnnamed2309() {
@@ -382,8 +382,8 @@
 
 void checkUnnamed2309(core.List<api.Token> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkToken(o[0]);
-  checkToken(o[1]);
+  checkToken(o[0] as api.Token);
+  checkToken(o[1] as api.Token);
 }
 
 core.int buildCounterAnnotateTextResponse = 0;
@@ -406,7 +406,7 @@
   buildCounterAnnotateTextResponse++;
   if (buildCounterAnnotateTextResponse < 3) {
     checkUnnamed2306(o.categories);
-    checkSentiment(o.documentSentiment);
+    checkSentiment(o.documentSentiment as api.Sentiment);
     checkUnnamed2307(o.entities);
     unittest.expect(o.language, unittest.equals('foo'));
     checkUnnamed2308(o.sentences);
@@ -450,7 +450,7 @@
 void checkClassifyTextRequest(api.ClassifyTextRequest o) {
   buildCounterClassifyTextRequest++;
   if (buildCounterClassifyTextRequest < 3) {
-    checkDocument(o.document);
+    checkDocument(o.document as api.Document);
   }
   buildCounterClassifyTextRequest--;
 }
@@ -464,8 +464,8 @@
 
 void checkUnnamed2310(core.List<api.ClassificationCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClassificationCategory(o[0]);
-  checkClassificationCategory(o[1]);
+  checkClassificationCategory(o[0] as api.ClassificationCategory);
+  checkClassificationCategory(o[1] as api.ClassificationCategory);
 }
 
 core.int buildCounterClassifyTextResponse = 0;
@@ -542,8 +542,8 @@
 
 void checkUnnamed2311(core.List<api.EntityMention> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityMention(o[0]);
-  checkEntityMention(o[1]);
+  checkEntityMention(o[0] as api.EntityMention);
+  checkEntityMention(o[1] as api.EntityMention);
 }
 
 core.Map<core.String, core.String> buildUnnamed2312() {
@@ -582,7 +582,7 @@
     checkUnnamed2312(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.salience, unittest.equals(42.0));
-    checkSentiment(o.sentiment);
+    checkSentiment(o.sentiment as api.Sentiment);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterEntity--;
@@ -604,8 +604,8 @@
 void checkEntityMention(api.EntityMention o) {
   buildCounterEntityMention++;
   if (buildCounterEntityMention < 3) {
-    checkSentiment(o.sentiment);
-    checkTextSpan(o.text);
+    checkSentiment(o.sentiment as api.Sentiment);
+    checkTextSpan(o.text as api.TextSpan);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterEntityMention--;
@@ -694,8 +694,8 @@
 void checkSentence(api.Sentence o) {
   buildCounterSentence++;
   if (buildCounterSentence < 3) {
-    checkSentiment(o.sentiment);
-    checkTextSpan(o.text);
+    checkSentiment(o.sentiment as api.Sentiment);
+    checkTextSpan(o.text as api.TextSpan);
   }
   buildCounterSentence--;
 }
@@ -824,10 +824,10 @@
 void checkToken(api.Token o) {
   buildCounterToken++;
   if (buildCounterToken < 3) {
-    checkDependencyEdge(o.dependencyEdge);
+    checkDependencyEdge(o.dependencyEdge as api.DependencyEdge);
     unittest.expect(o.lemma, unittest.equals('foo'));
-    checkPartOfSpeech(o.partOfSpeech);
-    checkTextSpan(o.text);
+    checkPartOfSpeech(o.partOfSpeech as api.PartOfSpeech);
+    checkTextSpan(o.text as api.TextSpan);
   }
   buildCounterToken--;
 }
@@ -837,7 +837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeEntitiesRequest();
       var od = api.AnalyzeEntitiesRequest.fromJson(o.toJson());
-      checkAnalyzeEntitiesRequest(od);
+      checkAnalyzeEntitiesRequest(od as api.AnalyzeEntitiesRequest);
     });
   });
 
@@ -845,7 +845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeEntitiesResponse();
       var od = api.AnalyzeEntitiesResponse.fromJson(o.toJson());
-      checkAnalyzeEntitiesResponse(od);
+      checkAnalyzeEntitiesResponse(od as api.AnalyzeEntitiesResponse);
     });
   });
 
@@ -853,7 +853,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeEntitySentimentRequest();
       var od = api.AnalyzeEntitySentimentRequest.fromJson(o.toJson());
-      checkAnalyzeEntitySentimentRequest(od);
+      checkAnalyzeEntitySentimentRequest(
+          od as api.AnalyzeEntitySentimentRequest);
     });
   });
 
@@ -861,7 +862,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeEntitySentimentResponse();
       var od = api.AnalyzeEntitySentimentResponse.fromJson(o.toJson());
-      checkAnalyzeEntitySentimentResponse(od);
+      checkAnalyzeEntitySentimentResponse(
+          od as api.AnalyzeEntitySentimentResponse);
     });
   });
 
@@ -869,7 +871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeSentimentRequest();
       var od = api.AnalyzeSentimentRequest.fromJson(o.toJson());
-      checkAnalyzeSentimentRequest(od);
+      checkAnalyzeSentimentRequest(od as api.AnalyzeSentimentRequest);
     });
   });
 
@@ -877,7 +879,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeSentimentResponse();
       var od = api.AnalyzeSentimentResponse.fromJson(o.toJson());
-      checkAnalyzeSentimentResponse(od);
+      checkAnalyzeSentimentResponse(od as api.AnalyzeSentimentResponse);
     });
   });
 
@@ -885,7 +887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeSyntaxRequest();
       var od = api.AnalyzeSyntaxRequest.fromJson(o.toJson());
-      checkAnalyzeSyntaxRequest(od);
+      checkAnalyzeSyntaxRequest(od as api.AnalyzeSyntaxRequest);
     });
   });
 
@@ -893,7 +895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnalyzeSyntaxResponse();
       var od = api.AnalyzeSyntaxResponse.fromJson(o.toJson());
-      checkAnalyzeSyntaxResponse(od);
+      checkAnalyzeSyntaxResponse(od as api.AnalyzeSyntaxResponse);
     });
   });
 
@@ -901,7 +903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotateTextRequest();
       var od = api.AnnotateTextRequest.fromJson(o.toJson());
-      checkAnnotateTextRequest(od);
+      checkAnnotateTextRequest(od as api.AnnotateTextRequest);
     });
   });
 
@@ -909,7 +911,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotateTextResponse();
       var od = api.AnnotateTextResponse.fromJson(o.toJson());
-      checkAnnotateTextResponse(od);
+      checkAnnotateTextResponse(od as api.AnnotateTextResponse);
     });
   });
 
@@ -917,7 +919,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClassificationCategory();
       var od = api.ClassificationCategory.fromJson(o.toJson());
-      checkClassificationCategory(od);
+      checkClassificationCategory(od as api.ClassificationCategory);
     });
   });
 
@@ -925,7 +927,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClassifyTextRequest();
       var od = api.ClassifyTextRequest.fromJson(o.toJson());
-      checkClassifyTextRequest(od);
+      checkClassifyTextRequest(od as api.ClassifyTextRequest);
     });
   });
 
@@ -933,7 +935,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClassifyTextResponse();
       var od = api.ClassifyTextResponse.fromJson(o.toJson());
-      checkClassifyTextResponse(od);
+      checkClassifyTextResponse(od as api.ClassifyTextResponse);
     });
   });
 
@@ -941,7 +943,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDependencyEdge();
       var od = api.DependencyEdge.fromJson(o.toJson());
-      checkDependencyEdge(od);
+      checkDependencyEdge(od as api.DependencyEdge);
     });
   });
 
@@ -949,7 +951,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocument();
       var od = api.Document.fromJson(o.toJson());
-      checkDocument(od);
+      checkDocument(od as api.Document);
     });
   });
 
@@ -957,7 +959,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntity();
       var od = api.Entity.fromJson(o.toJson());
-      checkEntity(od);
+      checkEntity(od as api.Entity);
     });
   });
 
@@ -965,7 +967,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityMention();
       var od = api.EntityMention.fromJson(o.toJson());
-      checkEntityMention(od);
+      checkEntityMention(od as api.EntityMention);
     });
   });
 
@@ -973,7 +975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeatures();
       var od = api.Features.fromJson(o.toJson());
-      checkFeatures(od);
+      checkFeatures(od as api.Features);
     });
   });
 
@@ -981,7 +983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartOfSpeech();
       var od = api.PartOfSpeech.fromJson(o.toJson());
-      checkPartOfSpeech(od);
+      checkPartOfSpeech(od as api.PartOfSpeech);
     });
   });
 
@@ -989,7 +991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSentence();
       var od = api.Sentence.fromJson(o.toJson());
-      checkSentence(od);
+      checkSentence(od as api.Sentence);
     });
   });
 
@@ -997,7 +999,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSentiment();
       var od = api.Sentiment.fromJson(o.toJson());
-      checkSentiment(od);
+      checkSentiment(od as api.Sentiment);
     });
   });
 
@@ -1005,7 +1007,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1013,7 +1015,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextSpan();
       var od = api.TextSpan.fromJson(o.toJson());
-      checkTextSpan(od);
+      checkTextSpan(od as api.TextSpan);
     });
   });
 
@@ -1021,7 +1023,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildToken();
       var od = api.Token.fromJson(o.toJson());
-      checkToken(od);
+      checkToken(od as api.Token);
     });
   });
 
@@ -1032,8 +1034,9 @@
       var arg_request = buildAnalyzeEntitiesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AnalyzeEntitiesRequest.fromJson(json);
-        checkAnalyzeEntitiesRequest(obj);
+        var obj = api.AnalyzeEntitiesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnalyzeEntitiesRequest(obj as api.AnalyzeEntitiesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1072,7 +1075,7 @@
       res
           .analyzeEntities(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnalyzeEntitiesResponse(response);
+        checkAnalyzeEntitiesResponse(response as api.AnalyzeEntitiesResponse);
       })));
     });
 
@@ -1082,8 +1085,10 @@
       var arg_request = buildAnalyzeEntitySentimentRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AnalyzeEntitySentimentRequest.fromJson(json);
-        checkAnalyzeEntitySentimentRequest(obj);
+        var obj = api.AnalyzeEntitySentimentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnalyzeEntitySentimentRequest(
+            obj as api.AnalyzeEntitySentimentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1122,7 +1127,8 @@
       res
           .analyzeEntitySentiment(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnalyzeEntitySentimentResponse(response);
+        checkAnalyzeEntitySentimentResponse(
+            response as api.AnalyzeEntitySentimentResponse);
       })));
     });
 
@@ -1132,8 +1138,9 @@
       var arg_request = buildAnalyzeSentimentRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AnalyzeSentimentRequest.fromJson(json);
-        checkAnalyzeSentimentRequest(obj);
+        var obj = api.AnalyzeSentimentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnalyzeSentimentRequest(obj as api.AnalyzeSentimentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1172,7 +1179,7 @@
       res
           .analyzeSentiment(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnalyzeSentimentResponse(response);
+        checkAnalyzeSentimentResponse(response as api.AnalyzeSentimentResponse);
       })));
     });
 
@@ -1182,8 +1189,9 @@
       var arg_request = buildAnalyzeSyntaxRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AnalyzeSyntaxRequest.fromJson(json);
-        checkAnalyzeSyntaxRequest(obj);
+        var obj = api.AnalyzeSyntaxRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnalyzeSyntaxRequest(obj as api.AnalyzeSyntaxRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1222,7 +1230,7 @@
       res
           .analyzeSyntax(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnalyzeSyntaxResponse(response);
+        checkAnalyzeSyntaxResponse(response as api.AnalyzeSyntaxResponse);
       })));
     });
 
@@ -1232,8 +1240,9 @@
       var arg_request = buildAnnotateTextRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AnnotateTextRequest.fromJson(json);
-        checkAnnotateTextRequest(obj);
+        var obj = api.AnnotateTextRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAnnotateTextRequest(obj as api.AnnotateTextRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1272,7 +1281,7 @@
       res
           .annotateText(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAnnotateTextResponse(response);
+        checkAnnotateTextResponse(response as api.AnnotateTextResponse);
       })));
     });
 
@@ -1282,8 +1291,9 @@
       var arg_request = buildClassifyTextRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ClassifyTextRequest.fromJson(json);
-        checkClassifyTextRequest(obj);
+        var obj = api.ClassifyTextRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkClassifyTextRequest(obj as api.ClassifyTextRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1322,7 +1332,7 @@
       res
           .classifyText(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkClassifyTextResponse(response);
+        checkClassifyTextResponse(response as api.ClassifyTextResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/libraryagent/v1_test.dart b/generated/googleapis/test/libraryagent/v1_test.dart
index caabadc..c416b7e 100644
--- a/generated/googleapis/test/libraryagent/v1_test.dart
+++ b/generated/googleapis/test/libraryagent/v1_test.dart
@@ -109,8 +109,10 @@
 
 void checkUnnamed3625(core.List<api.GoogleExampleLibraryagentV1Book> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleExampleLibraryagentV1Book(o[0]);
-  checkGoogleExampleLibraryagentV1Book(o[1]);
+  checkGoogleExampleLibraryagentV1Book(
+      o[0] as api.GoogleExampleLibraryagentV1Book);
+  checkGoogleExampleLibraryagentV1Book(
+      o[1] as api.GoogleExampleLibraryagentV1Book);
 }
 
 core.int buildCounterGoogleExampleLibraryagentV1ListBooksResponse = 0;
@@ -145,8 +147,10 @@
 
 void checkUnnamed3626(core.List<api.GoogleExampleLibraryagentV1Shelf> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleExampleLibraryagentV1Shelf(o[0]);
-  checkGoogleExampleLibraryagentV1Shelf(o[1]);
+  checkGoogleExampleLibraryagentV1Shelf(
+      o[0] as api.GoogleExampleLibraryagentV1Shelf);
+  checkGoogleExampleLibraryagentV1Shelf(
+      o[1] as api.GoogleExampleLibraryagentV1Shelf);
 }
 
 core.int buildCounterGoogleExampleLibraryagentV1ListShelvesResponse = 0;
@@ -199,7 +203,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleExampleLibraryagentV1Book();
       var od = api.GoogleExampleLibraryagentV1Book.fromJson(o.toJson());
-      checkGoogleExampleLibraryagentV1Book(od);
+      checkGoogleExampleLibraryagentV1Book(
+          od as api.GoogleExampleLibraryagentV1Book);
     });
   });
 
@@ -208,7 +213,8 @@
       var o = buildGoogleExampleLibraryagentV1ListBooksResponse();
       var od =
           api.GoogleExampleLibraryagentV1ListBooksResponse.fromJson(o.toJson());
-      checkGoogleExampleLibraryagentV1ListBooksResponse(od);
+      checkGoogleExampleLibraryagentV1ListBooksResponse(
+          od as api.GoogleExampleLibraryagentV1ListBooksResponse);
     });
   });
 
@@ -218,7 +224,8 @@
       var o = buildGoogleExampleLibraryagentV1ListShelvesResponse();
       var od = api.GoogleExampleLibraryagentV1ListShelvesResponse.fromJson(
           o.toJson());
-      checkGoogleExampleLibraryagentV1ListShelvesResponse(od);
+      checkGoogleExampleLibraryagentV1ListShelvesResponse(
+          od as api.GoogleExampleLibraryagentV1ListShelvesResponse);
     });
   });
 
@@ -226,7 +233,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleExampleLibraryagentV1Shelf();
       var od = api.GoogleExampleLibraryagentV1Shelf.fromJson(o.toJson());
-      checkGoogleExampleLibraryagentV1Shelf(od);
+      checkGoogleExampleLibraryagentV1Shelf(
+          od as api.GoogleExampleLibraryagentV1Shelf);
     });
   });
 
@@ -275,7 +283,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleExampleLibraryagentV1Shelf(response);
+        checkGoogleExampleLibraryagentV1Shelf(
+            response as api.GoogleExampleLibraryagentV1Shelf);
       })));
     });
 
@@ -331,7 +340,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleExampleLibraryagentV1ListShelvesResponse(response);
+        checkGoogleExampleLibraryagentV1ListShelvesResponse(
+            response as api.GoogleExampleLibraryagentV1ListShelvesResponse);
       })));
     });
   });
@@ -381,7 +391,8 @@
       res
           .borrow(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleExampleLibraryagentV1Book(response);
+        checkGoogleExampleLibraryagentV1Book(
+            response as api.GoogleExampleLibraryagentV1Book);
       })));
     });
 
@@ -429,7 +440,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleExampleLibraryagentV1Book(response);
+        checkGoogleExampleLibraryagentV1Book(
+            response as api.GoogleExampleLibraryagentV1Book);
       })));
     });
 
@@ -487,7 +499,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleExampleLibraryagentV1ListBooksResponse(response);
+        checkGoogleExampleLibraryagentV1ListBooksResponse(
+            response as api.GoogleExampleLibraryagentV1ListBooksResponse);
       })));
     });
 
@@ -535,7 +548,8 @@
       res
           .return_(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleExampleLibraryagentV1Book(response);
+        checkGoogleExampleLibraryagentV1Book(
+            response as api.GoogleExampleLibraryagentV1Book);
       })));
     });
   });
diff --git a/generated/googleapis/test/licensing/v1_test.dart b/generated/googleapis/test/licensing/v1_test.dart
index 21b4e00..2f84749 100644
--- a/generated/googleapis/test/licensing/v1_test.dart
+++ b/generated/googleapis/test/licensing/v1_test.dart
@@ -135,8 +135,8 @@
 
 void checkUnnamed2876(core.List<api.LicenseAssignment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLicenseAssignment(o[0]);
-  checkLicenseAssignment(o[1]);
+  checkLicenseAssignment(o[0] as api.LicenseAssignment);
+  checkLicenseAssignment(o[1] as api.LicenseAssignment);
 }
 
 core.int buildCounterLicenseAssignmentList = 0;
@@ -169,7 +169,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicenseAssignment();
       var od = api.LicenseAssignment.fromJson(o.toJson());
-      checkLicenseAssignment(od);
+      checkLicenseAssignment(od as api.LicenseAssignment);
     });
   });
 
@@ -177,7 +177,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicenseAssignmentInsert();
       var od = api.LicenseAssignmentInsert.fromJson(o.toJson());
-      checkLicenseAssignmentInsert(od);
+      checkLicenseAssignmentInsert(od as api.LicenseAssignmentInsert);
     });
   });
 
@@ -185,7 +185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLicenseAssignmentList();
       var od = api.LicenseAssignmentList.fromJson(o.toJson());
-      checkLicenseAssignmentList(od);
+      checkLicenseAssignmentList(od as api.LicenseAssignmentList);
     });
   });
 
@@ -324,7 +324,7 @@
       res
           .get(arg_productId, arg_skuId, arg_userId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicenseAssignment(response);
+        checkLicenseAssignment(response as api.LicenseAssignment);
       })));
     });
 
@@ -336,8 +336,9 @@
       var arg_skuId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LicenseAssignmentInsert.fromJson(json);
-        checkLicenseAssignmentInsert(obj);
+        var obj = api.LicenseAssignmentInsert.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLicenseAssignmentInsert(obj as api.LicenseAssignmentInsert);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -394,7 +395,7 @@
       res
           .insert(arg_request, arg_productId, arg_skuId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicenseAssignment(response);
+        checkLicenseAssignment(response as api.LicenseAssignment);
       })));
     });
 
@@ -462,7 +463,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicenseAssignmentList(response);
+        checkLicenseAssignmentList(response as api.LicenseAssignmentList);
       })));
     });
 
@@ -540,7 +541,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicenseAssignmentList(response);
+        checkLicenseAssignmentList(response as api.LicenseAssignmentList);
       })));
     });
 
@@ -553,8 +554,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LicenseAssignment.fromJson(json);
-        checkLicenseAssignment(obj);
+        var obj = api.LicenseAssignment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLicenseAssignment(obj as api.LicenseAssignment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -615,7 +617,7 @@
           .patch(arg_request, arg_productId, arg_skuId, arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicenseAssignment(response);
+        checkLicenseAssignment(response as api.LicenseAssignment);
       })));
     });
 
@@ -628,8 +630,9 @@
       var arg_userId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LicenseAssignment.fromJson(json);
-        checkLicenseAssignment(obj);
+        var obj = api.LicenseAssignment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLicenseAssignment(obj as api.LicenseAssignment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -690,7 +693,7 @@
           .update(arg_request, arg_productId, arg_skuId, arg_userId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLicenseAssignment(response);
+        checkLicenseAssignment(response as api.LicenseAssignment);
       })));
     });
   });
diff --git a/generated/googleapis/test/logging/v2_test.dart b/generated/googleapis/test/logging/v2_test.dart
index d590e15..29824ec 100644
--- a/generated/googleapis/test/logging/v2_test.dart
+++ b/generated/googleapis/test/logging/v2_test.dart
@@ -111,9 +111,9 @@
 void checkBucketOptions(api.BucketOptions o) {
   buildCounterBucketOptions++;
   if (buildCounterBucketOptions < 3) {
-    checkExplicit(o.explicitBuckets);
-    checkExponential(o.exponentialBuckets);
-    checkLinear(o.linearBuckets);
+    checkExplicit(o.explicitBuckets as api.Explicit);
+    checkExponential(o.exponentialBuckets as api.Exponential);
+    checkLinear(o.linearBuckets as api.Linear);
   }
   buildCounterBucketOptions--;
 }
@@ -313,8 +313,8 @@
 
 void checkUnnamed1814(core.List<api.LogBucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogBucket(o[0]);
-  checkLogBucket(o[1]);
+  checkLogBucket(o[0] as api.LogBucket);
+  checkLogBucket(o[1] as api.LogBucket);
 }
 
 core.int buildCounterListBucketsResponse = 0;
@@ -347,8 +347,8 @@
 
 void checkUnnamed1815(core.List<api.LogExclusion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogExclusion(o[0]);
-  checkLogExclusion(o[1]);
+  checkLogExclusion(o[0] as api.LogExclusion);
+  checkLogExclusion(o[1] as api.LogExclusion);
 }
 
 core.int buildCounterListExclusionsResponse = 0;
@@ -436,8 +436,8 @@
 
 void checkUnnamed1818(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogEntry(o[0]);
-  checkLogEntry(o[1]);
+  checkLogEntry(o[0] as api.LogEntry);
+  checkLogEntry(o[1] as api.LogEntry);
 }
 
 core.int buildCounterListLogEntriesResponse = 0;
@@ -470,8 +470,8 @@
 
 void checkUnnamed1819(core.List<api.LogMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogMetric(o[0]);
-  checkLogMetric(o[1]);
+  checkLogMetric(o[0] as api.LogMetric);
+  checkLogMetric(o[1] as api.LogMetric);
 }
 
 core.int buildCounterListLogMetricsResponse = 0;
@@ -538,8 +538,8 @@
 
 void checkUnnamed1821(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResourceDescriptor(o[0]);
-  checkMonitoredResourceDescriptor(o[1]);
+  checkMonitoredResourceDescriptor(o[0] as api.MonitoredResourceDescriptor);
+  checkMonitoredResourceDescriptor(o[1] as api.MonitoredResourceDescriptor);
 }
 
 core.int buildCounterListMonitoredResourceDescriptorsResponse = 0;
@@ -574,8 +574,8 @@
 
 void checkUnnamed1822(core.List<api.LogSink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogSink(o[0]);
-  checkLogSink(o[1]);
+  checkLogSink(o[0] as api.LogSink);
+  checkLogSink(o[1] as api.LogSink);
 }
 
 core.int buildCounterListSinksResponse = 0;
@@ -731,18 +731,18 @@
 void checkLogEntry(api.LogEntry o) {
   buildCounterLogEntry++;
   if (buildCounterLogEntry < 3) {
-    checkHttpRequest(o.httpRequest);
+    checkHttpRequest(o.httpRequest as api.HttpRequest);
     unittest.expect(o.insertId, unittest.equals('foo'));
     checkUnnamed1823(o.jsonPayload);
     checkUnnamed1824(o.labels);
     unittest.expect(o.logName, unittest.equals('foo'));
-    checkMonitoredResourceMetadata(o.metadata);
-    checkLogEntryOperation(o.operation);
+    checkMonitoredResourceMetadata(o.metadata as api.MonitoredResourceMetadata);
+    checkLogEntryOperation(o.operation as api.LogEntryOperation);
     checkUnnamed1825(o.protoPayload);
     unittest.expect(o.receiveTimestamp, unittest.equals('foo'));
-    checkMonitoredResource(o.resource);
+    checkMonitoredResource(o.resource as api.MonitoredResource);
     unittest.expect(o.severity, unittest.equals('foo'));
-    checkLogEntrySourceLocation(o.sourceLocation);
+    checkLogEntrySourceLocation(o.sourceLocation as api.LogEntrySourceLocation);
     unittest.expect(o.spanId, unittest.equals('foo'));
     unittest.expect(o.textPayload, unittest.equals('foo'));
     unittest.expect(o.timestamp, unittest.equals('foo'));
@@ -848,7 +848,7 @@
   if (buildCounterLogLine < 3) {
     unittest.expect(o.logMessage, unittest.equals('foo'));
     unittest.expect(o.severity, unittest.equals('foo'));
-    checkSourceLocation(o.sourceLocation);
+    checkSourceLocation(o.sourceLocation as api.SourceLocation);
     unittest.expect(o.time, unittest.equals('foo'));
   }
   buildCounterLogLine--;
@@ -890,12 +890,12 @@
 void checkLogMetric(api.LogMetric o) {
   buildCounterLogMetric++;
   if (buildCounterLogMetric < 3) {
-    checkBucketOptions(o.bucketOptions);
+    checkBucketOptions(o.bucketOptions as api.BucketOptions);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.filter, unittest.equals('foo'));
     checkUnnamed1826(o.labelExtractors);
-    checkMetricDescriptor(o.metricDescriptor);
+    checkMetricDescriptor(o.metricDescriptor as api.MetricDescriptor);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.valueExtractor, unittest.equals('foo'));
@@ -913,8 +913,8 @@
 
 void checkUnnamed1827(core.List<api.LogExclusion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogExclusion(o[0]);
-  checkLogExclusion(o[1]);
+  checkLogExclusion(o[0] as api.LogExclusion);
+  checkLogExclusion(o[1] as api.LogExclusion);
 }
 
 core.int buildCounterLogSink = 0;
@@ -942,7 +942,7 @@
 void checkLogSink(api.LogSink o) {
   buildCounterLogSink++;
   if (buildCounterLogSink < 3) {
-    checkBigQueryOptions(o.bigqueryOptions);
+    checkBigQueryOptions(o.bigqueryOptions as api.BigQueryOptions);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.destination, unittest.equals('foo'));
@@ -967,8 +967,8 @@
 
 void checkUnnamed1828(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.List<core.String> buildUnnamed1829() {
@@ -1012,7 +1012,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed1828(o.labels);
     unittest.expect(o.launchStage, unittest.equals('foo'));
-    checkMetricDescriptorMetadata(o.metadata);
+    checkMetricDescriptorMetadata(o.metadata as api.MetricDescriptorMetadata);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     checkUnnamed1829(o.monitoredResourceTypes);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1089,8 +1089,8 @@
 
 void checkUnnamed1831(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterMonitoredResourceDescriptor = 0;
@@ -1194,8 +1194,8 @@
 
 void checkUnnamed1834(core.List<api.LogLine> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogLine(o[0]);
-  checkLogLine(o[1]);
+  checkLogLine(o[0] as api.LogLine);
+  checkLogLine(o[1] as api.LogLine);
 }
 
 core.List<api.SourceReference> buildUnnamed1835() {
@@ -1207,8 +1207,8 @@
 
 void checkUnnamed1835(core.List<api.SourceReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSourceReference(o[0]);
-  checkSourceReference(o[1]);
+  checkSourceReference(o[0] as api.SourceReference);
+  checkSourceReference(o[1] as api.SourceReference);
 }
 
 core.int buildCounterRequestLog = 0;
@@ -1362,8 +1362,8 @@
 
 void checkUnnamed1836(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogEntry(o[0]);
-  checkLogEntry(o[1]);
+  checkLogEntry(o[0] as api.LogEntry);
+  checkLogEntry(o[1] as api.LogEntry);
 }
 
 core.Map<core.String, core.String> buildUnnamed1837() {
@@ -1403,7 +1403,7 @@
     checkUnnamed1837(o.labels);
     unittest.expect(o.logName, unittest.equals('foo'));
     unittest.expect(o.partialSuccess, unittest.isTrue);
-    checkMonitoredResource(o.resource);
+    checkMonitoredResource(o.resource as api.MonitoredResource);
   }
   buildCounterWriteLogEntriesRequest--;
 }
@@ -1428,7 +1428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigQueryOptions();
       var od = api.BigQueryOptions.fromJson(o.toJson());
-      checkBigQueryOptions(od);
+      checkBigQueryOptions(od as api.BigQueryOptions);
     });
   });
 
@@ -1436,7 +1436,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketOptions();
       var od = api.BucketOptions.fromJson(o.toJson());
-      checkBucketOptions(od);
+      checkBucketOptions(od as api.BucketOptions);
     });
   });
 
@@ -1444,7 +1444,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCmekSettings();
       var od = api.CmekSettings.fromJson(o.toJson());
-      checkCmekSettings(od);
+      checkCmekSettings(od as api.CmekSettings);
     });
   });
 
@@ -1452,7 +1452,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1460,7 +1460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExplicit();
       var od = api.Explicit.fromJson(o.toJson());
-      checkExplicit(od);
+      checkExplicit(od as api.Explicit);
     });
   });
 
@@ -1468,7 +1468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExponential();
       var od = api.Exponential.fromJson(o.toJson());
-      checkExponential(od);
+      checkExponential(od as api.Exponential);
     });
   });
 
@@ -1476,7 +1476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRequest();
       var od = api.HttpRequest.fromJson(o.toJson());
-      checkHttpRequest(od);
+      checkHttpRequest(od as api.HttpRequest);
     });
   });
 
@@ -1484,7 +1484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelDescriptor();
       var od = api.LabelDescriptor.fromJson(o.toJson());
-      checkLabelDescriptor(od);
+      checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
 
@@ -1492,7 +1492,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinear();
       var od = api.Linear.fromJson(o.toJson());
-      checkLinear(od);
+      checkLinear(od as api.Linear);
     });
   });
 
@@ -1500,7 +1500,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBucketsResponse();
       var od = api.ListBucketsResponse.fromJson(o.toJson());
-      checkListBucketsResponse(od);
+      checkListBucketsResponse(od as api.ListBucketsResponse);
     });
   });
 
@@ -1508,7 +1508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListExclusionsResponse();
       var od = api.ListExclusionsResponse.fromJson(o.toJson());
-      checkListExclusionsResponse(od);
+      checkListExclusionsResponse(od as api.ListExclusionsResponse);
     });
   });
 
@@ -1516,7 +1516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLogEntriesRequest();
       var od = api.ListLogEntriesRequest.fromJson(o.toJson());
-      checkListLogEntriesRequest(od);
+      checkListLogEntriesRequest(od as api.ListLogEntriesRequest);
     });
   });
 
@@ -1524,7 +1524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLogEntriesResponse();
       var od = api.ListLogEntriesResponse.fromJson(o.toJson());
-      checkListLogEntriesResponse(od);
+      checkListLogEntriesResponse(od as api.ListLogEntriesResponse);
     });
   });
 
@@ -1532,7 +1532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLogMetricsResponse();
       var od = api.ListLogMetricsResponse.fromJson(o.toJson());
-      checkListLogMetricsResponse(od);
+      checkListLogMetricsResponse(od as api.ListLogMetricsResponse);
     });
   });
 
@@ -1540,7 +1540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLogsResponse();
       var od = api.ListLogsResponse.fromJson(o.toJson());
-      checkListLogsResponse(od);
+      checkListLogsResponse(od as api.ListLogsResponse);
     });
   });
 
@@ -1549,7 +1549,8 @@
       var o = buildListMonitoredResourceDescriptorsResponse();
       var od =
           api.ListMonitoredResourceDescriptorsResponse.fromJson(o.toJson());
-      checkListMonitoredResourceDescriptorsResponse(od);
+      checkListMonitoredResourceDescriptorsResponse(
+          od as api.ListMonitoredResourceDescriptorsResponse);
     });
   });
 
@@ -1557,7 +1558,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSinksResponse();
       var od = api.ListSinksResponse.fromJson(o.toJson());
-      checkListSinksResponse(od);
+      checkListSinksResponse(od as api.ListSinksResponse);
     });
   });
 
@@ -1565,7 +1566,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogBucket();
       var od = api.LogBucket.fromJson(o.toJson());
-      checkLogBucket(od);
+      checkLogBucket(od as api.LogBucket);
     });
   });
 
@@ -1573,7 +1574,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogEntry();
       var od = api.LogEntry.fromJson(o.toJson());
-      checkLogEntry(od);
+      checkLogEntry(od as api.LogEntry);
     });
   });
 
@@ -1581,7 +1582,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogEntryOperation();
       var od = api.LogEntryOperation.fromJson(o.toJson());
-      checkLogEntryOperation(od);
+      checkLogEntryOperation(od as api.LogEntryOperation);
     });
   });
 
@@ -1589,7 +1590,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogEntrySourceLocation();
       var od = api.LogEntrySourceLocation.fromJson(o.toJson());
-      checkLogEntrySourceLocation(od);
+      checkLogEntrySourceLocation(od as api.LogEntrySourceLocation);
     });
   });
 
@@ -1597,7 +1598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogExclusion();
       var od = api.LogExclusion.fromJson(o.toJson());
-      checkLogExclusion(od);
+      checkLogExclusion(od as api.LogExclusion);
     });
   });
 
@@ -1605,7 +1606,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogLine();
       var od = api.LogLine.fromJson(o.toJson());
-      checkLogLine(od);
+      checkLogLine(od as api.LogLine);
     });
   });
 
@@ -1613,7 +1614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogMetric();
       var od = api.LogMetric.fromJson(o.toJson());
-      checkLogMetric(od);
+      checkLogMetric(od as api.LogMetric);
     });
   });
 
@@ -1621,7 +1622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogSink();
       var od = api.LogSink.fromJson(o.toJson());
-      checkLogSink(od);
+      checkLogSink(od as api.LogSink);
     });
   });
 
@@ -1629,7 +1630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptor();
       var od = api.MetricDescriptor.fromJson(o.toJson());
-      checkMetricDescriptor(od);
+      checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
 
@@ -1637,7 +1638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptorMetadata();
       var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
-      checkMetricDescriptorMetadata(od);
+      checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
 
@@ -1645,7 +1646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResource();
       var od = api.MonitoredResource.fromJson(o.toJson());
-      checkMonitoredResource(od);
+      checkMonitoredResource(od as api.MonitoredResource);
     });
   });
 
@@ -1653,7 +1654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceDescriptor();
       var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
-      checkMonitoredResourceDescriptor(od);
+      checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
 
@@ -1661,7 +1662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceMetadata();
       var od = api.MonitoredResourceMetadata.fromJson(o.toJson());
-      checkMonitoredResourceMetadata(od);
+      checkMonitoredResourceMetadata(od as api.MonitoredResourceMetadata);
     });
   });
 
@@ -1669,7 +1670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestLog();
       var od = api.RequestLog.fromJson(o.toJson());
-      checkRequestLog(od);
+      checkRequestLog(od as api.RequestLog);
     });
   });
 
@@ -1677,7 +1678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceLocation();
       var od = api.SourceLocation.fromJson(o.toJson());
-      checkSourceLocation(od);
+      checkSourceLocation(od as api.SourceLocation);
     });
   });
 
@@ -1685,7 +1686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceReference();
       var od = api.SourceReference.fromJson(o.toJson());
-      checkSourceReference(od);
+      checkSourceReference(od as api.SourceReference);
     });
   });
 
@@ -1693,7 +1694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteBucketRequest();
       var od = api.UndeleteBucketRequest.fromJson(o.toJson());
-      checkUndeleteBucketRequest(od);
+      checkUndeleteBucketRequest(od as api.UndeleteBucketRequest);
     });
   });
 
@@ -1701,7 +1702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWriteLogEntriesRequest();
       var od = api.WriteLogEntriesRequest.fromJson(o.toJson());
-      checkWriteLogEntriesRequest(od);
+      checkWriteLogEntriesRequest(od as api.WriteLogEntriesRequest);
     });
   });
 
@@ -1709,7 +1710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWriteLogEntriesResponse();
       var od = api.WriteLogEntriesResponse.fromJson(o.toJson());
-      checkWriteLogEntriesResponse(od);
+      checkWriteLogEntriesResponse(od as api.WriteLogEntriesResponse);
     });
   });
 
@@ -1758,7 +1759,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
   });
@@ -1771,8 +1772,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1812,7 +1814,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -1860,7 +1862,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1908,7 +1910,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -1965,7 +1967,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListExclusionsResponse(response);
+        checkListExclusionsResponse(response as api.ListExclusionsResponse);
       })));
     });
 
@@ -1977,8 +1979,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2021,7 +2024,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
   });
@@ -2035,8 +2038,9 @@
       var arg_bucketId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2079,7 +2083,7 @@
           .create(arg_request, arg_parent,
               bucketId: arg_bucketId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -2127,7 +2131,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2184,7 +2188,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBucketsResponse(response);
+        checkListBucketsResponse(response as api.ListBucketsResponse);
       })));
     });
 
@@ -2196,8 +2200,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2240,7 +2245,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -2251,8 +2256,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteBucketRequest.fromJson(json);
-        checkUndeleteBucketRequest(obj);
+        var obj = api.UndeleteBucketRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteBucketRequest(obj as api.UndeleteBucketRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2292,7 +2298,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -2342,7 +2348,7 @@
       res
           .delete(arg_logName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2399,7 +2405,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLogsResponse(response);
+        checkListLogsResponse(response as api.ListLogsResponse);
       })));
     });
   });
@@ -2413,8 +2419,9 @@
       var arg_uniqueWriterIdentity = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2458,7 +2465,7 @@
               uniqueWriterIdentity: arg_uniqueWriterIdentity,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -2506,7 +2513,7 @@
       res
           .delete(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2554,7 +2561,7 @@
       res
           .get(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -2611,7 +2618,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSinksResponse(response);
+        checkListSinksResponse(response as api.ListSinksResponse);
       })));
     });
 
@@ -2624,8 +2631,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2672,7 +2680,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -2685,8 +2693,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2733,7 +2742,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
   });
@@ -2745,8 +2754,9 @@
       var arg_request = buildListLogEntriesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ListLogEntriesRequest.fromJson(json);
-        checkListLogEntriesRequest(obj);
+        var obj = api.ListLogEntriesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkListLogEntriesRequest(obj as api.ListLogEntriesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2785,7 +2795,7 @@
       res
           .list(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLogEntriesResponse(response);
+        checkListLogEntriesResponse(response as api.ListLogEntriesResponse);
       })));
     });
 
@@ -2795,8 +2805,9 @@
       var arg_request = buildWriteLogEntriesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WriteLogEntriesRequest.fromJson(json);
-        checkWriteLogEntriesRequest(obj);
+        var obj = api.WriteLogEntriesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWriteLogEntriesRequest(obj as api.WriteLogEntriesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2835,7 +2846,7 @@
       res
           .write(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWriteLogEntriesResponse(response);
+        checkWriteLogEntriesResponse(response as api.WriteLogEntriesResponse);
       })));
     });
   });
@@ -2848,8 +2859,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2889,7 +2901,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -2937,7 +2949,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2985,7 +2997,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -3042,7 +3054,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListExclusionsResponse(response);
+        checkListExclusionsResponse(response as api.ListExclusionsResponse);
       })));
     });
 
@@ -3054,8 +3066,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3098,7 +3111,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
   });
@@ -3111,8 +3124,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3152,7 +3166,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -3200,7 +3214,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3248,7 +3262,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -3305,7 +3319,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListExclusionsResponse(response);
+        checkListExclusionsResponse(response as api.ListExclusionsResponse);
       })));
     });
 
@@ -3317,8 +3331,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3361,7 +3376,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
   });
@@ -3375,8 +3390,9 @@
       var arg_bucketId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3419,7 +3435,7 @@
           .create(arg_request, arg_parent,
               bucketId: arg_bucketId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -3467,7 +3483,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3515,7 +3531,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -3572,7 +3588,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBucketsResponse(response);
+        checkListBucketsResponse(response as api.ListBucketsResponse);
       })));
     });
 
@@ -3584,8 +3600,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3628,7 +3645,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -3639,8 +3656,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteBucketRequest.fromJson(json);
-        checkUndeleteBucketRequest(obj);
+        var obj = api.UndeleteBucketRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteBucketRequest(obj as api.UndeleteBucketRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3680,7 +3698,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -3730,7 +3748,7 @@
       res
           .delete(arg_logName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3787,7 +3805,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLogsResponse(response);
+        checkListLogsResponse(response as api.ListLogsResponse);
       })));
     });
   });
@@ -3801,8 +3819,9 @@
       var arg_uniqueWriterIdentity = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3846,7 +3865,7 @@
               uniqueWriterIdentity: arg_uniqueWriterIdentity,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -3894,7 +3913,7 @@
       res
           .delete(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3942,7 +3961,7 @@
       res
           .get(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -3999,7 +4018,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSinksResponse(response);
+        checkListSinksResponse(response as api.ListSinksResponse);
       })));
     });
 
@@ -4012,8 +4031,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4060,7 +4080,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -4073,8 +4093,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4121,7 +4142,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
   });
@@ -4135,8 +4156,9 @@
       var arg_bucketId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4179,7 +4201,7 @@
           .create(arg_request, arg_parent,
               bucketId: arg_bucketId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -4227,7 +4249,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4275,7 +4297,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -4332,7 +4354,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBucketsResponse(response);
+        checkListBucketsResponse(response as api.ListBucketsResponse);
       })));
     });
 
@@ -4344,8 +4366,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4388,7 +4411,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -4399,8 +4422,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteBucketRequest.fromJson(json);
-        checkUndeleteBucketRequest(obj);
+        var obj = api.UndeleteBucketRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteBucketRequest(obj as api.UndeleteBucketRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4440,7 +4464,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -4490,7 +4514,7 @@
       res
           .delete(arg_logName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4547,7 +4571,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLogsResponse(response);
+        checkListLogsResponse(response as api.ListLogsResponse);
       })));
     });
   });
@@ -4605,7 +4629,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMonitoredResourceDescriptorsResponse(response);
+        checkListMonitoredResourceDescriptorsResponse(
+            response as api.ListMonitoredResourceDescriptorsResponse);
       })));
     });
   });
@@ -4655,7 +4680,7 @@
       res
           .getCmekSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCmekSettings(response);
+        checkCmekSettings(response as api.CmekSettings);
       })));
     });
 
@@ -4667,8 +4692,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CmekSettings.fromJson(json);
-        checkCmekSettings(obj);
+        var obj = api.CmekSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCmekSettings(obj as api.CmekSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4711,7 +4737,7 @@
           .updateCmekSettings(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCmekSettings(response);
+        checkCmekSettings(response as api.CmekSettings);
       })));
     });
   });
@@ -4724,8 +4750,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4765,7 +4792,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -4813,7 +4840,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4861,7 +4888,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -4918,7 +4945,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListExclusionsResponse(response);
+        checkListExclusionsResponse(response as api.ListExclusionsResponse);
       })));
     });
 
@@ -4930,8 +4957,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4974,7 +5002,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
   });
@@ -4988,8 +5016,9 @@
       var arg_bucketId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5032,7 +5061,7 @@
           .create(arg_request, arg_parent,
               bucketId: arg_bucketId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -5080,7 +5109,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5128,7 +5157,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -5185,7 +5214,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBucketsResponse(response);
+        checkListBucketsResponse(response as api.ListBucketsResponse);
       })));
     });
 
@@ -5197,8 +5226,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5241,7 +5271,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -5252,8 +5282,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteBucketRequest.fromJson(json);
-        checkUndeleteBucketRequest(obj);
+        var obj = api.UndeleteBucketRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteBucketRequest(obj as api.UndeleteBucketRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5293,7 +5324,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -5343,7 +5374,7 @@
       res
           .delete(arg_logName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5400,7 +5431,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLogsResponse(response);
+        checkListLogsResponse(response as api.ListLogsResponse);
       })));
     });
   });
@@ -5414,8 +5445,9 @@
       var arg_uniqueWriterIdentity = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5459,7 +5491,7 @@
               uniqueWriterIdentity: arg_uniqueWriterIdentity,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -5507,7 +5539,7 @@
       res
           .delete(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5555,7 +5587,7 @@
       res
           .get(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -5612,7 +5644,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSinksResponse(response);
+        checkListSinksResponse(response as api.ListSinksResponse);
       })));
     });
 
@@ -5625,8 +5657,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5673,7 +5706,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -5686,8 +5719,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5734,7 +5768,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
   });
@@ -5747,8 +5781,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5788,7 +5823,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -5836,7 +5871,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5884,7 +5919,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
 
@@ -5941,7 +5976,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListExclusionsResponse(response);
+        checkListExclusionsResponse(response as api.ListExclusionsResponse);
       })));
     });
 
@@ -5953,8 +5988,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogExclusion.fromJson(json);
-        checkLogExclusion(obj);
+        var obj = api.LogExclusion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLogExclusion(obj as api.LogExclusion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5997,7 +6033,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogExclusion(response);
+        checkLogExclusion(response as api.LogExclusion);
       })));
     });
   });
@@ -6011,8 +6047,9 @@
       var arg_bucketId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6055,7 +6092,7 @@
           .create(arg_request, arg_parent,
               bucketId: arg_bucketId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -6103,7 +6140,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6151,7 +6188,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -6208,7 +6245,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBucketsResponse(response);
+        checkListBucketsResponse(response as api.ListBucketsResponse);
       })));
     });
 
@@ -6220,8 +6257,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogBucket.fromJson(json);
-        checkLogBucket(obj);
+        var obj =
+            api.LogBucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogBucket(obj as api.LogBucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6264,7 +6302,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogBucket(response);
+        checkLogBucket(response as api.LogBucket);
       })));
     });
 
@@ -6275,8 +6313,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteBucketRequest.fromJson(json);
-        checkUndeleteBucketRequest(obj);
+        var obj = api.UndeleteBucketRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteBucketRequest(obj as api.UndeleteBucketRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6316,7 +6355,7 @@
       res
           .undelete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -6366,7 +6405,7 @@
       res
           .delete(arg_logName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6423,7 +6462,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLogsResponse(response);
+        checkListLogsResponse(response as api.ListLogsResponse);
       })));
     });
   });
@@ -6436,8 +6475,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogMetric.fromJson(json);
-        checkLogMetric(obj);
+        var obj =
+            api.LogMetric.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogMetric(obj as api.LogMetric);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6477,7 +6517,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogMetric(response);
+        checkLogMetric(response as api.LogMetric);
       })));
     });
 
@@ -6525,7 +6565,7 @@
       res
           .delete(arg_metricName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6573,7 +6613,7 @@
       res
           .get(arg_metricName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogMetric(response);
+        checkLogMetric(response as api.LogMetric);
       })));
     });
 
@@ -6630,7 +6670,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLogMetricsResponse(response);
+        checkListLogMetricsResponse(response as api.ListLogMetricsResponse);
       })));
     });
 
@@ -6641,8 +6681,9 @@
       var arg_metricName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogMetric.fromJson(json);
-        checkLogMetric(obj);
+        var obj =
+            api.LogMetric.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogMetric(obj as api.LogMetric);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6682,7 +6723,7 @@
       res
           .update(arg_request, arg_metricName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogMetric(response);
+        checkLogMetric(response as api.LogMetric);
       })));
     });
   });
@@ -6696,8 +6737,9 @@
       var arg_uniqueWriterIdentity = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6741,7 +6783,7 @@
               uniqueWriterIdentity: arg_uniqueWriterIdentity,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -6789,7 +6831,7 @@
       res
           .delete(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6837,7 +6879,7 @@
       res
           .get(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -6894,7 +6936,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSinksResponse(response);
+        checkListSinksResponse(response as api.ListSinksResponse);
       })));
     });
 
@@ -6907,8 +6949,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6955,7 +6998,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -6968,8 +7011,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7016,7 +7060,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
   });
@@ -7030,8 +7074,9 @@
       var arg_uniqueWriterIdentity = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7075,7 +7120,7 @@
               uniqueWriterIdentity: arg_uniqueWriterIdentity,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -7123,7 +7168,7 @@
       res
           .delete(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -7171,7 +7216,7 @@
       res
           .get(arg_sinkName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
 
@@ -7228,7 +7273,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSinksResponse(response);
+        checkListSinksResponse(response as api.ListSinksResponse);
       })));
     });
 
@@ -7241,8 +7286,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LogSink.fromJson(json);
-        checkLogSink(obj);
+        var obj =
+            api.LogSink.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkLogSink(obj as api.LogSink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7289,7 +7335,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLogSink(response);
+        checkLogSink(response as api.LogSink);
       })));
     });
   });
@@ -7339,7 +7385,7 @@
       res
           .getCmekSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCmekSettings(response);
+        checkCmekSettings(response as api.CmekSettings);
       })));
     });
 
@@ -7351,8 +7397,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CmekSettings.fromJson(json);
-        checkCmekSettings(obj);
+        var obj = api.CmekSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCmekSettings(obj as api.CmekSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -7395,7 +7442,7 @@
           .updateCmekSettings(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCmekSettings(response);
+        checkCmekSettings(response as api.CmekSettings);
       })));
     });
   });
diff --git a/generated/googleapis/test/managedidentities/v1_test.dart b/generated/googleapis/test/managedidentities/v1_test.dart
index f194835..8fedbff 100644
--- a/generated/googleapis/test/managedidentities/v1_test.dart
+++ b/generated/googleapis/test/managedidentities/v1_test.dart
@@ -88,7 +88,7 @@
 void checkAttachTrustRequest(api.AttachTrustRequest o) {
   buildCounterAttachTrustRequest++;
   if (buildCounterAttachTrustRequest < 3) {
-    checkTrust(o.trust);
+    checkTrust(o.trust as api.Trust);
   }
   buildCounterAttachTrustRequest--;
 }
@@ -124,7 +124,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed5745(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -160,7 +160,7 @@
 void checkDetachTrustRequest(api.DetachTrustRequest o) {
   buildCounterDetachTrustRequest++;
   if (buildCounterDetachTrustRequest < 3) {
-    checkTrust(o.trust);
+    checkTrust(o.trust as api.Trust);
   }
   buildCounterDetachTrustRequest--;
 }
@@ -213,8 +213,8 @@
 
 void checkUnnamed5749(core.List<api.Trust> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrust(o[0]);
-  checkTrust(o[1]);
+  checkTrust(o[0] as api.Trust);
+  checkTrust(o[1] as api.Trust);
 }
 
 core.int buildCounterDomain = 0;
@@ -434,10 +434,12 @@
             api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(
-      o['x']);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(
-      o['y']);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(o['x']
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(o['y']
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
 }
 
 core.Map<core.String, core.String> buildUnnamed5753() {
@@ -470,8 +472,12 @@
             api.GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[0]
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(o[1]
+      as api
+          .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
 }
 
 core.Map<core.String, core.String> buildUnnamed5755() {
@@ -526,13 +532,15 @@
     checkUnnamed5751(o.maintenancePolicyNames);
     checkUnnamed5752(o.maintenanceSchedules);
     checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(
-        o.maintenanceSettings);
+        o.maintenanceSettings as api
+            .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5753(o.producerMetadata);
     checkUnnamed5754(o.provisionedResources);
     unittest.expect(o.slmInstanceTemplate, unittest.equals('foo'));
     checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(
-        o.sloMetadata);
+        o.sloMetadata
+            as api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata);
     checkUnnamed5755(o.softwareVersions);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.tenantProjectId, unittest.equals('foo'));
@@ -611,8 +619,10 @@
     core.List<api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[0] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[1] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
 }
 
 core.int
@@ -741,8 +751,10 @@
     core.List<api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[0] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(
+      o[1] as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
 }
 
 core.List<api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata>
@@ -759,8 +771,10 @@
             api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[0]);
-  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[1]);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[0]
+      as api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
+  checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(o[1]
+      as api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
 }
 
 core.int
@@ -786,8 +800,9 @@
   buildCounterGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata++;
   if (buildCounterGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata <
       3) {
-    checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(
-        o.eligibility);
+    checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(o
+            .eligibility
+        as api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility);
     checkUnnamed5757(o.exclusions);
     checkUnnamed5758(o.nodes);
     unittest.expect(o.tier, unittest.equals('foo'));
@@ -804,8 +819,8 @@
 
 void checkUnnamed5759(core.List<api.Domain> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDomain(o[0]);
-  checkDomain(o[1]);
+  checkDomain(o[0] as api.Domain);
+  checkDomain(o[1] as api.Domain);
 }
 
 core.List<core.String> buildUnnamed5760() {
@@ -853,8 +868,8 @@
 
 void checkUnnamed5761(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -887,8 +902,8 @@
 
 void checkUnnamed5762(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1058,7 +1073,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5765(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5766(o.response);
@@ -1106,8 +1121,8 @@
 
 void checkUnnamed5767(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1215,7 +1230,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -1415,7 +1430,7 @@
 void checkValidateTrustRequest(api.ValidateTrustRequest o) {
   buildCounterValidateTrustRequest++;
   if (buildCounterValidateTrustRequest < 3) {
-    checkTrust(o.trust);
+    checkTrust(o.trust as api.Trust);
   }
   buildCounterValidateTrustRequest--;
 }
@@ -1425,7 +1440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttachTrustRequest();
       var od = api.AttachTrustRequest.fromJson(o.toJson());
-      checkAttachTrustRequest(od);
+      checkAttachTrustRequest(od as api.AttachTrustRequest);
     });
   });
 
@@ -1433,7 +1448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1441,7 +1456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -1449,7 +1464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDetachTrustRequest();
       var od = api.DetachTrustRequest.fromJson(o.toJson());
-      checkDetachTrustRequest(od);
+      checkDetachTrustRequest(od as api.DetachTrustRequest);
     });
   });
 
@@ -1457,7 +1472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomain();
       var od = api.Domain.fromJson(o.toJson());
-      checkDomain(od);
+      checkDomain(od as api.Domain);
     });
   });
 
@@ -1465,7 +1480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1473,7 +1488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1482,7 +1497,8 @@
       var o = buildGoogleCloudManagedidentitiesV1OpMetadata();
       var od =
           api.GoogleCloudManagedidentitiesV1OpMetadata.fromJson(o.toJson());
-      checkGoogleCloudManagedidentitiesV1OpMetadata(od);
+      checkGoogleCloudManagedidentitiesV1OpMetadata(
+          od as api.GoogleCloudManagedidentitiesV1OpMetadata);
     });
   });
 
@@ -1492,7 +1508,8 @@
       var o = buildGoogleCloudManagedidentitiesV1alpha1OpMetadata();
       var od = api.GoogleCloudManagedidentitiesV1alpha1OpMetadata.fromJson(
           o.toJson());
-      checkGoogleCloudManagedidentitiesV1alpha1OpMetadata(od);
+      checkGoogleCloudManagedidentitiesV1alpha1OpMetadata(
+          od as api.GoogleCloudManagedidentitiesV1alpha1OpMetadata);
     });
   });
 
@@ -1502,7 +1519,8 @@
       var o = buildGoogleCloudManagedidentitiesV1beta1OpMetadata();
       var od = api.GoogleCloudManagedidentitiesV1beta1OpMetadata.fromJson(
           o.toJson());
-      checkGoogleCloudManagedidentitiesV1beta1OpMetadata(od);
+      checkGoogleCloudManagedidentitiesV1beta1OpMetadata(
+          od as api.GoogleCloudManagedidentitiesV1beta1OpMetadata);
     });
   });
 
@@ -1513,7 +1531,8 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1Instance.fromJson(
               o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1Instance(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1Instance(
+          od as api.GoogleCloudSaasacceleratorManagementProvidersV1Instance);
     });
   });
 
@@ -1526,8 +1545,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(
-          od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSchedule);
     });
   });
 
@@ -1540,8 +1560,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(
-          od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1MaintenanceSettings);
     });
   });
 
@@ -1554,7 +1575,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1NodeSloMetadata);
     });
   });
 
@@ -1567,8 +1590,9 @@
       var od =
           api.GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource
               .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(
-          od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource(od
+          as api
+              .GoogleCloudSaasacceleratorManagementProvidersV1ProvisionedResource);
     });
   });
 
@@ -1580,7 +1604,8 @@
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility();
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility
           .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1SloEligibility(od
+          as api.GoogleCloudSaasacceleratorManagementProvidersV1SloEligibility);
     });
   });
 
@@ -1592,7 +1617,8 @@
           buildGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion();
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion
           .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1SloExclusion(od
+          as api.GoogleCloudSaasacceleratorManagementProvidersV1SloExclusion);
     });
   });
 
@@ -1603,7 +1629,8 @@
       var o = buildGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata();
       var od = api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata
           .fromJson(o.toJson());
-      checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(od);
+      checkGoogleCloudSaasacceleratorManagementProvidersV1SloMetadata(
+          od as api.GoogleCloudSaasacceleratorManagementProvidersV1SloMetadata);
     });
   });
 
@@ -1611,7 +1638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDomainsResponse();
       var od = api.ListDomainsResponse.fromJson(o.toJson());
-      checkListDomainsResponse(od);
+      checkListDomainsResponse(od as api.ListDomainsResponse);
     });
   });
 
@@ -1619,7 +1646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1627,7 +1654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1635,7 +1662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1643,7 +1670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1651,7 +1678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -1659,7 +1686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1667,7 +1694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReconfigureTrustRequest();
       var od = api.ReconfigureTrustRequest.fromJson(o.toJson());
-      checkReconfigureTrustRequest(od);
+      checkReconfigureTrustRequest(od as api.ReconfigureTrustRequest);
     });
   });
 
@@ -1675,7 +1702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResetAdminPasswordRequest();
       var od = api.ResetAdminPasswordRequest.fromJson(o.toJson());
-      checkResetAdminPasswordRequest(od);
+      checkResetAdminPasswordRequest(od as api.ResetAdminPasswordRequest);
     });
   });
 
@@ -1683,7 +1710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResetAdminPasswordResponse();
       var od = api.ResetAdminPasswordResponse.fromJson(o.toJson());
-      checkResetAdminPasswordResponse(od);
+      checkResetAdminPasswordResponse(od as api.ResetAdminPasswordResponse);
     });
   });
 
@@ -1691,7 +1718,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1699,7 +1726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1707,7 +1734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1715,7 +1742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1723,7 +1750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrust();
       var od = api.Trust.fromJson(o.toJson());
-      checkTrust(od);
+      checkTrust(od as api.Trust);
     });
   });
 
@@ -1731,7 +1758,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValidateTrustRequest();
       var od = api.ValidateTrustRequest.fromJson(o.toJson());
-      checkValidateTrustRequest(od);
+      checkValidateTrustRequest(od as api.ValidateTrustRequest);
     });
   });
 
@@ -1780,7 +1807,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1844,7 +1871,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1858,8 +1885,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AttachTrustRequest.fromJson(json);
-        checkAttachTrustRequest(obj);
+        var obj = api.AttachTrustRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAttachTrustRequest(obj as api.AttachTrustRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1899,7 +1927,7 @@
       res
           .attachTrust(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1912,8 +1940,9 @@
       var arg_domainName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Domain.fromJson(json);
-        checkDomain(obj);
+        var obj =
+            api.Domain.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDomain(obj as api.Domain);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1956,7 +1985,7 @@
           .create(arg_request, arg_parent,
               domainName: arg_domainName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2005,7 +2034,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2017,8 +2046,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DetachTrustRequest.fromJson(json);
-        checkDetachTrustRequest(obj);
+        var obj = api.DetachTrustRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDetachTrustRequest(obj as api.DetachTrustRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2058,7 +2088,7 @@
       res
           .detachTrust(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2107,7 +2137,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomain(response);
+        checkDomain(response as api.Domain);
       })));
     });
 
@@ -2163,7 +2193,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2228,7 +2258,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDomainsResponse(response);
+        checkListDomainsResponse(response as api.ListDomainsResponse);
       })));
     });
 
@@ -2241,8 +2271,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Domain.fromJson(json);
-        checkDomain(obj);
+        var obj =
+            api.Domain.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkDomain(obj as api.Domain);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2285,7 +2316,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2297,8 +2328,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReconfigureTrustRequest.fromJson(json);
-        checkReconfigureTrustRequest(obj);
+        var obj = api.ReconfigureTrustRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReconfigureTrustRequest(obj as api.ReconfigureTrustRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2338,7 +2370,7 @@
       res
           .reconfigureTrust(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2350,8 +2382,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResetAdminPasswordRequest.fromJson(json);
-        checkResetAdminPasswordRequest(obj);
+        var obj = api.ResetAdminPasswordRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResetAdminPasswordRequest(obj as api.ResetAdminPasswordRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2391,7 +2424,8 @@
       res
           .resetAdminPassword(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResetAdminPasswordResponse(response);
+        checkResetAdminPasswordResponse(
+            response as api.ResetAdminPasswordResponse);
       })));
     });
 
@@ -2403,8 +2437,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2444,7 +2479,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2456,8 +2491,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2497,7 +2533,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -2509,8 +2546,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ValidateTrustRequest.fromJson(json);
-        checkValidateTrustRequest(obj);
+        var obj = api.ValidateTrustRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkValidateTrustRequest(obj as api.ValidateTrustRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2550,7 +2588,7 @@
       res
           .validateTrust(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -2564,8 +2602,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2605,7 +2644,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2654,7 +2693,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2703,7 +2742,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2764,7 +2803,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/manufacturers/v1_test.dart b/generated/googleapis/test/manufacturers/v1_test.dart
index a5023f4..a5e89bc 100644
--- a/generated/googleapis/test/manufacturers/v1_test.dart
+++ b/generated/googleapis/test/manufacturers/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed1727(core.List<api.Image> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImage(o[0]);
-  checkImage(o[1]);
+  checkImage(o[0] as api.Image);
+  checkImage(o[1] as api.Image);
 }
 
 core.List<core.String> buildUnnamed1728() {
@@ -109,8 +109,8 @@
 
 void checkUnnamed1729(core.List<api.FeatureDescription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFeatureDescription(o[0]);
-  checkFeatureDescription(o[1]);
+  checkFeatureDescription(o[0] as api.FeatureDescription);
+  checkFeatureDescription(o[1] as api.FeatureDescription);
 }
 
 core.List<core.String> buildUnnamed1730() {
@@ -148,8 +148,8 @@
 
 void checkUnnamed1732(core.List<api.ProductDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductDetail(o[0]);
-  checkProductDetail(o[1]);
+  checkProductDetail(o[0] as api.ProductDetail);
+  checkProductDetail(o[1] as api.ProductDetail);
 }
 
 core.List<core.String> buildUnnamed1733() {
@@ -243,9 +243,9 @@
     checkUnnamed1727(o.additionalImageLink);
     unittest.expect(o.ageGroup, unittest.equals('foo'));
     unittest.expect(o.brand, unittest.equals('foo'));
-    checkCapacity(o.capacity);
+    checkCapacity(o.capacity as api.Capacity);
     unittest.expect(o.color, unittest.equals('foo'));
-    checkCount(o.count);
+    checkCount(o.count as api.Count);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.disclosureDate, unittest.equals('foo'));
     checkUnnamed1728(o.excludedDestination);
@@ -254,7 +254,7 @@
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.gender, unittest.equals('foo'));
     checkUnnamed1730(o.gtin);
-    checkImage(o.imageLink);
+    checkImage(o.imageLink as api.Image);
     checkUnnamed1731(o.includedDestination);
     unittest.expect(o.itemGroupId, unittest.equals('foo'));
     unittest.expect(o.material, unittest.equals('foo'));
@@ -271,7 +271,7 @@
     unittest.expect(o.size, unittest.equals('foo'));
     unittest.expect(o.sizeSystem, unittest.equals('foo'));
     unittest.expect(o.sizeType, unittest.equals('foo'));
-    checkPrice(o.suggestedRetailPrice);
+    checkPrice(o.suggestedRetailPrice as api.Price);
     unittest.expect(o.targetClientId, unittest.equals('foo'));
     unittest.expect(o.theme, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -375,7 +375,7 @@
   buildCounterFeatureDescription++;
   if (buildCounterFeatureDescription < 3) {
     unittest.expect(o.headline, unittest.equals('foo'));
-    checkImage(o.image);
+    checkImage(o.image as api.Image);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterFeatureDescription--;
@@ -446,8 +446,8 @@
 
 void checkUnnamed1736(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProduct(o[0]);
-  checkProduct(o[1]);
+  checkProduct(o[0] as api.Product);
+  checkProduct(o[1] as api.Product);
 }
 
 core.int buildCounterListProductsResponse = 0;
@@ -501,8 +501,8 @@
 
 void checkUnnamed1737(core.List<api.DestinationStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDestinationStatus(o[0]);
-  checkDestinationStatus(o[1]);
+  checkDestinationStatus(o[0] as api.DestinationStatus);
+  checkDestinationStatus(o[1] as api.DestinationStatus);
 }
 
 core.List<api.Issue> buildUnnamed1738() {
@@ -514,8 +514,8 @@
 
 void checkUnnamed1738(core.List<api.Issue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIssue(o[0]);
-  checkIssue(o[1]);
+  checkIssue(o[0] as api.Issue);
+  checkIssue(o[1] as api.Issue);
 }
 
 core.int buildCounterProduct = 0;
@@ -539,7 +539,7 @@
 void checkProduct(api.Product o) {
   buildCounterProduct++;
   if (buildCounterProduct < 3) {
-    checkAttributes(o.attributes);
+    checkAttributes(o.attributes as api.Attributes);
     unittest.expect(o.contentLanguage, unittest.equals('foo'));
     checkUnnamed1737(o.destinationStatuses);
     checkUnnamed1738(o.issues);
@@ -605,7 +605,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttributes();
       var od = api.Attributes.fromJson(o.toJson());
-      checkAttributes(od);
+      checkAttributes(od as api.Attributes);
     });
   });
 
@@ -613,7 +613,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCapacity();
       var od = api.Capacity.fromJson(o.toJson());
-      checkCapacity(od);
+      checkCapacity(od as api.Capacity);
     });
   });
 
@@ -621,7 +621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCount();
       var od = api.Count.fromJson(o.toJson());
-      checkCount(od);
+      checkCount(od as api.Count);
     });
   });
 
@@ -629,7 +629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDestinationStatus();
       var od = api.DestinationStatus.fromJson(o.toJson());
-      checkDestinationStatus(od);
+      checkDestinationStatus(od as api.DestinationStatus);
     });
   });
 
@@ -637,7 +637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -645,7 +645,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeatureDescription();
       var od = api.FeatureDescription.fromJson(o.toJson());
-      checkFeatureDescription(od);
+      checkFeatureDescription(od as api.FeatureDescription);
     });
   });
 
@@ -653,7 +653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImage();
       var od = api.Image.fromJson(o.toJson());
-      checkImage(od);
+      checkImage(od as api.Image);
     });
   });
 
@@ -661,7 +661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIssue();
       var od = api.Issue.fromJson(o.toJson());
-      checkIssue(od);
+      checkIssue(od as api.Issue);
     });
   });
 
@@ -669,7 +669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListProductsResponse();
       var od = api.ListProductsResponse.fromJson(o.toJson());
-      checkListProductsResponse(od);
+      checkListProductsResponse(od as api.ListProductsResponse);
     });
   });
 
@@ -677,7 +677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPrice();
       var od = api.Price.fromJson(o.toJson());
-      checkPrice(od);
+      checkPrice(od as api.Price);
     });
   });
 
@@ -685,7 +685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProduct();
       var od = api.Product.fromJson(o.toJson());
-      checkProduct(od);
+      checkProduct(od as api.Product);
     });
   });
 
@@ -693,7 +693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductDetail();
       var od = api.ProductDetail.fromJson(o.toJson());
-      checkProductDetail(od);
+      checkProductDetail(od as api.ProductDetail);
     });
   });
 
@@ -743,7 +743,7 @@
       res
           .delete(arg_parent, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -794,7 +794,7 @@
       res
           .get(arg_parent, arg_name, include: arg_include, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -854,7 +854,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListProductsResponse(response);
+        checkListProductsResponse(response as api.ListProductsResponse);
       })));
     });
 
@@ -866,8 +866,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Attributes.fromJson(json);
-        checkAttributes(obj);
+        var obj = api.Attributes.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAttributes(obj as api.Attributes);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -907,7 +908,7 @@
       res
           .update(arg_request, arg_parent, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
diff --git a/generated/googleapis/test/ml/v1_test.dart b/generated/googleapis/test/ml/v1_test.dart
index 6e044d4..b94b304 100644
--- a/generated/googleapis/test/ml/v1_test.dart
+++ b/generated/googleapis/test/ml/v1_test.dart
@@ -511,8 +511,10 @@
 void checkUnnamed5552(
     core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1StudyConfigParameterSpec(o[0]);
-  checkGoogleCloudMlV1StudyConfigParameterSpec(o[1]);
+  checkGoogleCloudMlV1StudyConfigParameterSpec(
+      o[0] as api.GoogleCloudMlV1StudyConfigParameterSpec);
+  checkGoogleCloudMlV1StudyConfigParameterSpec(
+      o[1] as api.GoogleCloudMlV1StudyConfigParameterSpec);
 }
 
 core.int buildCounterGoogleCloudMlV1StudyConfigParameterSpec = 0;
@@ -549,21 +551,28 @@
   buildCounterGoogleCloudMlV1StudyConfigParameterSpec++;
   if (buildCounterGoogleCloudMlV1StudyConfigParameterSpec < 3) {
     checkGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec(
-        o.categoricalValueSpec);
+        o.categoricalValueSpec
+            as api.GoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec);
     checkUnnamed5552(o.childParameterSpecs);
     checkGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec(
-        o.discreteValueSpec);
+        o.discreteValueSpec
+            as api.GoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec);
     checkGoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec(
-        o.doubleValueSpec);
+        o.doubleValueSpec
+            as api.GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec);
     checkGoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec(
-        o.integerValueSpec);
+        o.integerValueSpec
+            as api.GoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec);
     unittest.expect(o.parameter, unittest.equals('foo'));
     checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec(
-        o.parentCategoricalValues);
+        o.parentCategoricalValues as api
+            .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec);
     checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec(
-        o.parentDiscreteValues);
+        o.parentDiscreteValues as api
+            .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec);
     checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec(
-        o.parentIntValues);
+        o.parentIntValues as api
+            .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec);
     unittest.expect(o.scaleType, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -633,7 +642,8 @@
     api.GoogleCloudMlV1AddTrialMeasurementRequest o) {
   buildCounterGoogleCloudMlV1AddTrialMeasurementRequest++;
   if (buildCounterGoogleCloudMlV1AddTrialMeasurementRequest < 3) {
-    checkGoogleCloudMlV1Measurement(o.measurement);
+    checkGoogleCloudMlV1Measurement(
+        o.measurement as api.GoogleCloudMlV1Measurement);
   }
   buildCounterGoogleCloudMlV1AddTrialMeasurementRequest--;
 }
@@ -677,9 +687,11 @@
   buildCounterGoogleCloudMlV1AutomatedStoppingConfig++;
   if (buildCounterGoogleCloudMlV1AutomatedStoppingConfig < 3) {
     checkGoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig(
-        o.decayCurveStoppingConfig);
+        o.decayCurveStoppingConfig as api
+            .GoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig);
     checkGoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig(
-        o.medianAutomatedStoppingConfig);
+        o.medianAutomatedStoppingConfig as api
+            .GoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig);
   }
   buildCounterGoogleCloudMlV1AutomatedStoppingConfig--;
 }
@@ -846,7 +858,8 @@
     api.GoogleCloudMlV1CompleteTrialRequest o) {
   buildCounterGoogleCloudMlV1CompleteTrialRequest++;
   if (buildCounterGoogleCloudMlV1CompleteTrialRequest < 3) {
-    checkGoogleCloudMlV1Measurement(o.finalMeasurement);
+    checkGoogleCloudMlV1Measurement(
+        o.finalMeasurement as api.GoogleCloudMlV1Measurement);
     unittest.expect(o.infeasibleReason, unittest.equals('foo'));
     unittest.expect(o.trialInfeasible, unittest.isTrue);
   }
@@ -926,8 +939,8 @@
 
 void checkUnnamed5556(core.List<api.GoogleCloudMlV1EnvVar> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1EnvVar(o[0]);
-  checkGoogleCloudMlV1EnvVar(o[1]);
+  checkGoogleCloudMlV1EnvVar(o[0] as api.GoogleCloudMlV1EnvVar);
+  checkGoogleCloudMlV1EnvVar(o[1] as api.GoogleCloudMlV1EnvVar);
 }
 
 core.List<api.GoogleCloudMlV1ContainerPort> buildUnnamed5557() {
@@ -939,8 +952,8 @@
 
 void checkUnnamed5557(core.List<api.GoogleCloudMlV1ContainerPort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1ContainerPort(o[0]);
-  checkGoogleCloudMlV1ContainerPort(o[1]);
+  checkGoogleCloudMlV1ContainerPort(o[0] as api.GoogleCloudMlV1ContainerPort);
+  checkGoogleCloudMlV1ContainerPort(o[1] as api.GoogleCloudMlV1ContainerPort);
 }
 
 core.int buildCounterGoogleCloudMlV1ContainerSpec = 0;
@@ -1025,7 +1038,7 @@
 void checkGoogleCloudMlV1ExplainRequest(api.GoogleCloudMlV1ExplainRequest o) {
   buildCounterGoogleCloudMlV1ExplainRequest++;
   if (buildCounterGoogleCloudMlV1ExplainRequest < 3) {
-    checkGoogleApiHttpBody(o.httpBody);
+    checkGoogleApiHttpBody(o.httpBody as api.GoogleApiHttpBody);
   }
   buildCounterGoogleCloudMlV1ExplainRequest--;
 }
@@ -1050,9 +1063,12 @@
   buildCounterGoogleCloudMlV1ExplanationConfig++;
   if (buildCounterGoogleCloudMlV1ExplanationConfig < 3) {
     checkGoogleCloudMlV1IntegratedGradientsAttribution(
-        o.integratedGradientsAttribution);
-    checkGoogleCloudMlV1SampledShapleyAttribution(o.sampledShapleyAttribution);
-    checkGoogleCloudMlV1XraiAttribution(o.xraiAttribution);
+        o.integratedGradientsAttribution
+            as api.GoogleCloudMlV1IntegratedGradientsAttribution);
+    checkGoogleCloudMlV1SampledShapleyAttribution(o.sampledShapleyAttribution
+        as api.GoogleCloudMlV1SampledShapleyAttribution);
+    checkGoogleCloudMlV1XraiAttribution(
+        o.xraiAttribution as api.GoogleCloudMlV1XraiAttribution);
   }
   buildCounterGoogleCloudMlV1ExplanationConfig--;
 }
@@ -1074,7 +1090,7 @@
     api.GoogleCloudMlV1GetConfigResponse o) {
   buildCounterGoogleCloudMlV1GetConfigResponse++;
   if (buildCounterGoogleCloudMlV1GetConfigResponse < 3) {
-    checkGoogleCloudMlV1Config(o.config);
+    checkGoogleCloudMlV1Config(o.config as api.GoogleCloudMlV1Config);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
     unittest.expect(o.serviceAccountProject, unittest.equals('foo'));
   }
@@ -1092,8 +1108,10 @@
 void checkUnnamed5558(
     core.List<api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o[0]);
-  checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o[1]);
+  checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(
+      o[0] as api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric);
+  checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(
+      o[1] as api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric);
 }
 
 core.Map<core.String, core.String> buildUnnamed5559() {
@@ -1135,9 +1153,11 @@
   buildCounterGoogleCloudMlV1HyperparameterOutput++;
   if (buildCounterGoogleCloudMlV1HyperparameterOutput < 3) {
     checkUnnamed5558(o.allMetrics);
-    checkGoogleCloudMlV1BuiltInAlgorithmOutput(o.builtInAlgorithmOutput);
+    checkGoogleCloudMlV1BuiltInAlgorithmOutput(
+        o.builtInAlgorithmOutput as api.GoogleCloudMlV1BuiltInAlgorithmOutput);
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o.finalMetric);
+    checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(o.finalMetric
+        as api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric);
     checkUnnamed5559(o.hyperparameters);
     unittest.expect(o.isTrialStoppedEarly, unittest.isTrue);
     unittest.expect(o.startTime, unittest.equals('foo'));
@@ -1156,8 +1176,8 @@
 
 void checkUnnamed5560(core.List<api.GoogleCloudMlV1ParameterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1ParameterSpec(o[0]);
-  checkGoogleCloudMlV1ParameterSpec(o[1]);
+  checkGoogleCloudMlV1ParameterSpec(o[0] as api.GoogleCloudMlV1ParameterSpec);
+  checkGoogleCloudMlV1ParameterSpec(o[1] as api.GoogleCloudMlV1ParameterSpec);
 }
 
 core.int buildCounterGoogleCloudMlV1HyperparameterSpec = 0;
@@ -1261,12 +1281,16 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.jobId, unittest.equals('foo'));
     checkUnnamed5561(o.labels);
-    checkGoogleCloudMlV1PredictionInput(o.predictionInput);
-    checkGoogleCloudMlV1PredictionOutput(o.predictionOutput);
+    checkGoogleCloudMlV1PredictionInput(
+        o.predictionInput as api.GoogleCloudMlV1PredictionInput);
+    checkGoogleCloudMlV1PredictionOutput(
+        o.predictionOutput as api.GoogleCloudMlV1PredictionOutput);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
-    checkGoogleCloudMlV1TrainingInput(o.trainingInput);
-    checkGoogleCloudMlV1TrainingOutput(o.trainingOutput);
+    checkGoogleCloudMlV1TrainingInput(
+        o.trainingInput as api.GoogleCloudMlV1TrainingInput);
+    checkGoogleCloudMlV1TrainingOutput(
+        o.trainingOutput as api.GoogleCloudMlV1TrainingOutput);
   }
   buildCounterGoogleCloudMlV1Job--;
 }
@@ -1280,8 +1304,8 @@
 
 void checkUnnamed5562(core.List<api.GoogleCloudMlV1Job> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Job(o[0]);
-  checkGoogleCloudMlV1Job(o[1]);
+  checkGoogleCloudMlV1Job(o[0] as api.GoogleCloudMlV1Job);
+  checkGoogleCloudMlV1Job(o[1] as api.GoogleCloudMlV1Job);
 }
 
 core.int buildCounterGoogleCloudMlV1ListJobsResponse = 0;
@@ -1315,8 +1339,8 @@
 
 void checkUnnamed5563(core.List<api.GoogleCloudMlV1Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Location(o[0]);
-  checkGoogleCloudMlV1Location(o[1]);
+  checkGoogleCloudMlV1Location(o[0] as api.GoogleCloudMlV1Location);
+  checkGoogleCloudMlV1Location(o[1] as api.GoogleCloudMlV1Location);
 }
 
 core.int buildCounterGoogleCloudMlV1ListLocationsResponse = 0;
@@ -1351,8 +1375,8 @@
 
 void checkUnnamed5564(core.List<api.GoogleCloudMlV1Model> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Model(o[0]);
-  checkGoogleCloudMlV1Model(o[1]);
+  checkGoogleCloudMlV1Model(o[0] as api.GoogleCloudMlV1Model);
+  checkGoogleCloudMlV1Model(o[1] as api.GoogleCloudMlV1Model);
 }
 
 core.int buildCounterGoogleCloudMlV1ListModelsResponse = 0;
@@ -1386,8 +1410,8 @@
 
 void checkUnnamed5565(core.List<api.GoogleCloudMlV1Study> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Study(o[0]);
-  checkGoogleCloudMlV1Study(o[1]);
+  checkGoogleCloudMlV1Study(o[0] as api.GoogleCloudMlV1Study);
+  checkGoogleCloudMlV1Study(o[1] as api.GoogleCloudMlV1Study);
 }
 
 core.int buildCounterGoogleCloudMlV1ListStudiesResponse = 0;
@@ -1420,8 +1444,8 @@
 
 void checkUnnamed5566(core.List<api.GoogleCloudMlV1Trial> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Trial(o[0]);
-  checkGoogleCloudMlV1Trial(o[1]);
+  checkGoogleCloudMlV1Trial(o[0] as api.GoogleCloudMlV1Trial);
+  checkGoogleCloudMlV1Trial(o[1] as api.GoogleCloudMlV1Trial);
 }
 
 core.int buildCounterGoogleCloudMlV1ListTrialsResponse = 0;
@@ -1453,8 +1477,8 @@
 
 void checkUnnamed5567(core.List<api.GoogleCloudMlV1Version> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Version(o[0]);
-  checkGoogleCloudMlV1Version(o[1]);
+  checkGoogleCloudMlV1Version(o[0] as api.GoogleCloudMlV1Version);
+  checkGoogleCloudMlV1Version(o[1] as api.GoogleCloudMlV1Version);
 }
 
 core.int buildCounterGoogleCloudMlV1ListVersionsResponse = 0;
@@ -1489,8 +1513,8 @@
 
 void checkUnnamed5568(core.List<api.GoogleCloudMlV1Capability> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Capability(o[0]);
-  checkGoogleCloudMlV1Capability(o[1]);
+  checkGoogleCloudMlV1Capability(o[0] as api.GoogleCloudMlV1Capability);
+  checkGoogleCloudMlV1Capability(o[1] as api.GoogleCloudMlV1Capability);
 }
 
 core.int buildCounterGoogleCloudMlV1Location = 0;
@@ -1542,8 +1566,10 @@
 
 void checkUnnamed5569(core.List<api.GoogleCloudMlV1MeasurementMetric> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1MeasurementMetric(o[0]);
-  checkGoogleCloudMlV1MeasurementMetric(o[1]);
+  checkGoogleCloudMlV1MeasurementMetric(
+      o[0] as api.GoogleCloudMlV1MeasurementMetric);
+  checkGoogleCloudMlV1MeasurementMetric(
+      o[1] as api.GoogleCloudMlV1MeasurementMetric);
 }
 
 core.int buildCounterGoogleCloudMlV1Measurement = 0;
@@ -1616,7 +1642,7 @@
 void checkGoogleCloudMlV1Model(api.GoogleCloudMlV1Model o) {
   buildCounterGoogleCloudMlV1Model++;
   if (buildCounterGoogleCloudMlV1Model < 3) {
-    checkGoogleCloudMlV1Version(o.defaultVersion);
+    checkGoogleCloudMlV1Version(o.defaultVersion as api.GoogleCloudMlV1Version);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     checkUnnamed5570(o.labels);
@@ -1672,7 +1698,7 @@
     unittest.expect(o.operationType, unittest.equals('foo'));
     unittest.expect(o.projectNumber, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkGoogleCloudMlV1Version(o.version);
+    checkGoogleCloudMlV1Version(o.version as api.GoogleCloudMlV1Version);
   }
   buildCounterGoogleCloudMlV1OperationMetadata--;
 }
@@ -1748,7 +1774,7 @@
 void checkGoogleCloudMlV1PredictRequest(api.GoogleCloudMlV1PredictRequest o) {
   buildCounterGoogleCloudMlV1PredictRequest++;
   if (buildCounterGoogleCloudMlV1PredictRequest < 3) {
-    checkGoogleApiHttpBody(o.httpBody);
+    checkGoogleApiHttpBody(o.httpBody as api.GoogleApiHttpBody);
   }
   buildCounterGoogleCloudMlV1PredictRequest--;
 }
@@ -1877,7 +1903,8 @@
 void checkGoogleCloudMlV1ReplicaConfig(api.GoogleCloudMlV1ReplicaConfig o) {
   buildCounterGoogleCloudMlV1ReplicaConfig++;
   if (buildCounterGoogleCloudMlV1ReplicaConfig < 3) {
-    checkGoogleCloudMlV1AcceleratorConfig(o.acceleratorConfig);
+    checkGoogleCloudMlV1AcceleratorConfig(
+        o.acceleratorConfig as api.GoogleCloudMlV1AcceleratorConfig);
     checkUnnamed5576(o.containerArgs);
     checkUnnamed5577(o.containerCommand);
     unittest.expect(o.imageUri, unittest.equals('foo'));
@@ -2027,7 +2054,8 @@
     unittest.expect(o.inactiveReason, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
-    checkGoogleCloudMlV1StudyConfig(o.studyConfig);
+    checkGoogleCloudMlV1StudyConfig(
+        o.studyConfig as api.GoogleCloudMlV1StudyConfig);
   }
   buildCounterGoogleCloudMlV1Study--;
 }
@@ -2041,8 +2069,10 @@
 
 void checkUnnamed5578(core.List<api.GoogleCloudMlV1StudyConfigMetricSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1StudyConfigMetricSpec(o[0]);
-  checkGoogleCloudMlV1StudyConfigMetricSpec(o[1]);
+  checkGoogleCloudMlV1StudyConfigMetricSpec(
+      o[0] as api.GoogleCloudMlV1StudyConfigMetricSpec);
+  checkGoogleCloudMlV1StudyConfigMetricSpec(
+      o[1] as api.GoogleCloudMlV1StudyConfigMetricSpec);
 }
 
 core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> buildUnnamed5579() {
@@ -2055,8 +2085,10 @@
 void checkUnnamed5579(
     core.List<api.GoogleCloudMlV1StudyConfigParameterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1StudyConfigParameterSpec(o[0]);
-  checkGoogleCloudMlV1StudyConfigParameterSpec(o[1]);
+  checkGoogleCloudMlV1StudyConfigParameterSpec(
+      o[0] as api.GoogleCloudMlV1StudyConfigParameterSpec);
+  checkGoogleCloudMlV1StudyConfigParameterSpec(
+      o[1] as api.GoogleCloudMlV1StudyConfigParameterSpec);
 }
 
 core.int buildCounterGoogleCloudMlV1StudyConfig = 0;
@@ -2077,7 +2109,8 @@
   buildCounterGoogleCloudMlV1StudyConfig++;
   if (buildCounterGoogleCloudMlV1StudyConfig < 3) {
     unittest.expect(o.algorithm, unittest.equals('foo'));
-    checkGoogleCloudMlV1AutomatedStoppingConfig(o.automatedStoppingConfig);
+    checkGoogleCloudMlV1AutomatedStoppingConfig(o.automatedStoppingConfig
+        as api.GoogleCloudMlV1AutomatedStoppingConfig);
     checkUnnamed5578(o.metrics);
     checkUnnamed5579(o.parameters);
   }
@@ -2143,8 +2176,8 @@
 
 void checkUnnamed5580(core.List<api.GoogleCloudMlV1Trial> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Trial(o[0]);
-  checkGoogleCloudMlV1Trial(o[1]);
+  checkGoogleCloudMlV1Trial(o[0] as api.GoogleCloudMlV1Trial);
+  checkGoogleCloudMlV1Trial(o[1] as api.GoogleCloudMlV1Trial);
 }
 
 core.int buildCounterGoogleCloudMlV1SuggestTrialsResponse = 0;
@@ -2239,17 +2272,22 @@
   buildCounterGoogleCloudMlV1TrainingInput++;
   if (buildCounterGoogleCloudMlV1TrainingInput < 3) {
     checkUnnamed5581(o.args);
-    checkGoogleCloudMlV1EncryptionConfig(o.encryptionConfig);
-    checkGoogleCloudMlV1ReplicaConfig(o.evaluatorConfig);
+    checkGoogleCloudMlV1EncryptionConfig(
+        o.encryptionConfig as api.GoogleCloudMlV1EncryptionConfig);
+    checkGoogleCloudMlV1ReplicaConfig(
+        o.evaluatorConfig as api.GoogleCloudMlV1ReplicaConfig);
     unittest.expect(o.evaluatorCount, unittest.equals('foo'));
     unittest.expect(o.evaluatorType, unittest.equals('foo'));
-    checkGoogleCloudMlV1HyperparameterSpec(o.hyperparameters);
+    checkGoogleCloudMlV1HyperparameterSpec(
+        o.hyperparameters as api.GoogleCloudMlV1HyperparameterSpec);
     unittest.expect(o.jobDir, unittest.equals('foo'));
-    checkGoogleCloudMlV1ReplicaConfig(o.masterConfig);
+    checkGoogleCloudMlV1ReplicaConfig(
+        o.masterConfig as api.GoogleCloudMlV1ReplicaConfig);
     unittest.expect(o.masterType, unittest.equals('foo'));
     unittest.expect(o.network, unittest.equals('foo'));
     checkUnnamed5582(o.packageUris);
-    checkGoogleCloudMlV1ReplicaConfig(o.parameterServerConfig);
+    checkGoogleCloudMlV1ReplicaConfig(
+        o.parameterServerConfig as api.GoogleCloudMlV1ReplicaConfig);
     unittest.expect(o.parameterServerCount, unittest.equals('foo'));
     unittest.expect(o.parameterServerType, unittest.equals('foo'));
     unittest.expect(o.pythonModule, unittest.equals('foo'));
@@ -2257,10 +2295,12 @@
     unittest.expect(o.region, unittest.equals('foo'));
     unittest.expect(o.runtimeVersion, unittest.equals('foo'));
     unittest.expect(o.scaleTier, unittest.equals('foo'));
-    checkGoogleCloudMlV1Scheduling(o.scheduling);
+    checkGoogleCloudMlV1Scheduling(
+        o.scheduling as api.GoogleCloudMlV1Scheduling);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
     unittest.expect(o.useChiefInTfConfig, unittest.isTrue);
-    checkGoogleCloudMlV1ReplicaConfig(o.workerConfig);
+    checkGoogleCloudMlV1ReplicaConfig(
+        o.workerConfig as api.GoogleCloudMlV1ReplicaConfig);
     unittest.expect(o.workerCount, unittest.equals('foo'));
     unittest.expect(o.workerType, unittest.equals('foo'));
   }
@@ -2276,8 +2316,10 @@
 
 void checkUnnamed5583(core.List<api.GoogleCloudMlV1HyperparameterOutput> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1HyperparameterOutput(o[0]);
-  checkGoogleCloudMlV1HyperparameterOutput(o[1]);
+  checkGoogleCloudMlV1HyperparameterOutput(
+      o[0] as api.GoogleCloudMlV1HyperparameterOutput);
+  checkGoogleCloudMlV1HyperparameterOutput(
+      o[1] as api.GoogleCloudMlV1HyperparameterOutput);
 }
 
 core.int buildCounterGoogleCloudMlV1TrainingOutput = 0;
@@ -2300,7 +2342,8 @@
 void checkGoogleCloudMlV1TrainingOutput(api.GoogleCloudMlV1TrainingOutput o) {
   buildCounterGoogleCloudMlV1TrainingOutput++;
   if (buildCounterGoogleCloudMlV1TrainingOutput < 3) {
-    checkGoogleCloudMlV1BuiltInAlgorithmOutput(o.builtInAlgorithmOutput);
+    checkGoogleCloudMlV1BuiltInAlgorithmOutput(
+        o.builtInAlgorithmOutput as api.GoogleCloudMlV1BuiltInAlgorithmOutput);
     unittest.expect(o.completedTrialCount, unittest.equals('foo'));
     unittest.expect(o.consumedMLUnits, unittest.equals(42.0));
     unittest.expect(o.hyperparameterMetricTag, unittest.equals('foo'));
@@ -2320,8 +2363,8 @@
 
 void checkUnnamed5584(core.List<api.GoogleCloudMlV1Measurement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1Measurement(o[0]);
-  checkGoogleCloudMlV1Measurement(o[1]);
+  checkGoogleCloudMlV1Measurement(o[0] as api.GoogleCloudMlV1Measurement);
+  checkGoogleCloudMlV1Measurement(o[1] as api.GoogleCloudMlV1Measurement);
 }
 
 core.List<api.GoogleCloudMlV1TrialParameter> buildUnnamed5585() {
@@ -2333,8 +2376,8 @@
 
 void checkUnnamed5585(core.List<api.GoogleCloudMlV1TrialParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudMlV1TrialParameter(o[0]);
-  checkGoogleCloudMlV1TrialParameter(o[1]);
+  checkGoogleCloudMlV1TrialParameter(o[0] as api.GoogleCloudMlV1TrialParameter);
+  checkGoogleCloudMlV1TrialParameter(o[1] as api.GoogleCloudMlV1TrialParameter);
 }
 
 core.int buildCounterGoogleCloudMlV1Trial = 0;
@@ -2362,7 +2405,8 @@
   if (buildCounterGoogleCloudMlV1Trial < 3) {
     unittest.expect(o.clientId, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkGoogleCloudMlV1Measurement(o.finalMeasurement);
+    checkGoogleCloudMlV1Measurement(
+        o.finalMeasurement as api.GoogleCloudMlV1Measurement);
     unittest.expect(o.infeasibleReason, unittest.equals('foo'));
     checkUnnamed5584(o.measurements);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -2437,27 +2481,33 @@
 void checkGoogleCloudMlV1Version(api.GoogleCloudMlV1Version o) {
   buildCounterGoogleCloudMlV1Version++;
   if (buildCounterGoogleCloudMlV1Version < 3) {
-    checkGoogleCloudMlV1AcceleratorConfig(o.acceleratorConfig);
-    checkGoogleCloudMlV1AutoScaling(o.autoScaling);
-    checkGoogleCloudMlV1ContainerSpec(o.container);
+    checkGoogleCloudMlV1AcceleratorConfig(
+        o.acceleratorConfig as api.GoogleCloudMlV1AcceleratorConfig);
+    checkGoogleCloudMlV1AutoScaling(
+        o.autoScaling as api.GoogleCloudMlV1AutoScaling);
+    checkGoogleCloudMlV1ContainerSpec(
+        o.container as api.GoogleCloudMlV1ContainerSpec);
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.deploymentUri, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.errorMessage, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkGoogleCloudMlV1ExplanationConfig(o.explanationConfig);
+    checkGoogleCloudMlV1ExplanationConfig(
+        o.explanationConfig as api.GoogleCloudMlV1ExplanationConfig);
     unittest.expect(o.framework, unittest.equals('foo'));
     unittest.expect(o.isDefault, unittest.isTrue);
     checkUnnamed5586(o.labels);
     unittest.expect(o.lastUseTime, unittest.equals('foo'));
     unittest.expect(o.machineType, unittest.equals('foo'));
-    checkGoogleCloudMlV1ManualScaling(o.manualScaling);
+    checkGoogleCloudMlV1ManualScaling(
+        o.manualScaling as api.GoogleCloudMlV1ManualScaling);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5587(o.packageUris);
     unittest.expect(o.predictionClass, unittest.equals('foo'));
     unittest.expect(o.pythonVersion, unittest.equals('foo'));
-    checkGoogleCloudMlV1RequestLoggingConfig(o.requestLoggingConfig);
-    checkGoogleCloudMlV1RouteMap(o.routes);
+    checkGoogleCloudMlV1RequestLoggingConfig(
+        o.requestLoggingConfig as api.GoogleCloudMlV1RequestLoggingConfig);
+    checkGoogleCloudMlV1RouteMap(o.routes as api.GoogleCloudMlV1RouteMap);
     unittest.expect(o.runtimeVersion, unittest.equals('foo'));
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -2493,8 +2543,8 @@
 
 void checkUnnamed5588(core.List<api.GoogleIamV1AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1AuditLogConfig(o[0]);
-  checkGoogleIamV1AuditLogConfig(o[1]);
+  checkGoogleIamV1AuditLogConfig(o[0] as api.GoogleIamV1AuditLogConfig);
+  checkGoogleIamV1AuditLogConfig(o[1] as api.GoogleIamV1AuditLogConfig);
 }
 
 core.int buildCounterGoogleIamV1AuditConfig = 0;
@@ -2583,7 +2633,7 @@
   buildCounterGoogleIamV1Binding++;
   if (buildCounterGoogleIamV1Binding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkGoogleTypeExpr(o.condition);
+    checkGoogleTypeExpr(o.condition as api.GoogleTypeExpr);
     checkUnnamed5590(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -2599,8 +2649,8 @@
 
 void checkUnnamed5591(core.List<api.GoogleIamV1AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1AuditConfig(o[0]);
-  checkGoogleIamV1AuditConfig(o[1]);
+  checkGoogleIamV1AuditConfig(o[0] as api.GoogleIamV1AuditConfig);
+  checkGoogleIamV1AuditConfig(o[1] as api.GoogleIamV1AuditConfig);
 }
 
 core.List<api.GoogleIamV1Binding> buildUnnamed5592() {
@@ -2612,8 +2662,8 @@
 
 void checkUnnamed5592(core.List<api.GoogleIamV1Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1Binding(o[0]);
-  checkGoogleIamV1Binding(o[1]);
+  checkGoogleIamV1Binding(o[0] as api.GoogleIamV1Binding);
+  checkGoogleIamV1Binding(o[1] as api.GoogleIamV1Binding);
 }
 
 core.int buildCounterGoogleIamV1Policy = 0;
@@ -2656,7 +2706,7 @@
 void checkGoogleIamV1SetIamPolicyRequest(api.GoogleIamV1SetIamPolicyRequest o) {
   buildCounterGoogleIamV1SetIamPolicyRequest++;
   if (buildCounterGoogleIamV1SetIamPolicyRequest < 3) {
-    checkGoogleIamV1Policy(o.policy);
+    checkGoogleIamV1Policy(o.policy as api.GoogleIamV1Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterGoogleIamV1SetIamPolicyRequest--;
@@ -2739,8 +2789,8 @@
 
 void checkUnnamed5595(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleLongrunningOperation(o[0]);
-  checkGoogleLongrunningOperation(o[1]);
+  checkGoogleLongrunningOperation(o[0] as api.GoogleLongrunningOperation);
+  checkGoogleLongrunningOperation(o[1] as api.GoogleLongrunningOperation);
 }
 
 core.int buildCounterGoogleLongrunningListOperationsResponse = 0;
@@ -2843,7 +2893,7 @@
   buildCounterGoogleLongrunningOperation++;
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkGoogleRpcStatus(o.error);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
     checkUnnamed5596(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5597(o.response);
@@ -2961,7 +3011,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleApiHttpBody();
       var od = api.GoogleApiHttpBody.fromJson(o.toJson());
-      checkGoogleApiHttpBody(od);
+      checkGoogleApiHttpBody(od as api.GoogleApiHttpBody);
     });
   });
 
@@ -2975,7 +3025,8 @@
           api.GoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig
               .fromJson(o.toJson());
       checkGoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig(
-          od);
+          od as api
+              .GoogleCloudMlV1AutomatedStoppingConfigDecayCurveAutomatedStoppingConfig);
     });
   });
 
@@ -2989,7 +3040,8 @@
           api.GoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig
               .fromJson(o.toJson());
       checkGoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig(
-          od);
+          od as api
+              .GoogleCloudMlV1AutomatedStoppingConfigMedianAutomatedStoppingConfig);
     });
   });
 
@@ -3000,7 +3052,8 @@
       var od =
           api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric.fromJson(
               o.toJson());
-      checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(od);
+      checkGoogleCloudMlV1HyperparameterOutputHyperparameterMetric(
+          od as api.GoogleCloudMlV1HyperparameterOutputHyperparameterMetric);
     });
   });
 
@@ -3008,7 +3061,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1MeasurementMetric();
       var od = api.GoogleCloudMlV1MeasurementMetric.fromJson(o.toJson());
-      checkGoogleCloudMlV1MeasurementMetric(od);
+      checkGoogleCloudMlV1MeasurementMetric(
+          od as api.GoogleCloudMlV1MeasurementMetric);
     });
   });
 
@@ -3020,7 +3074,8 @@
           buildGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec();
       var od = api.GoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec
           .fromJson(o.toJson());
-      checkGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec(od);
+      checkGoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec(od
+          as api.GoogleCloudMlV1StudyConfigParameterSpecCategoricalValueSpec);
     });
   });
 
@@ -3032,7 +3087,8 @@
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec.fromJson(
               o.toJson());
-      checkGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec(od);
+      checkGoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec(
+          od as api.GoogleCloudMlV1StudyConfigParameterSpecDiscreteValueSpec);
     });
   });
 
@@ -3043,7 +3099,8 @@
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec.fromJson(
               o.toJson());
-      checkGoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec(od);
+      checkGoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec(
+          od as api.GoogleCloudMlV1StudyConfigParameterSpecDoubleValueSpec);
     });
   });
 
@@ -3054,7 +3111,8 @@
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec.fromJson(
               o.toJson());
-      checkGoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec(od);
+      checkGoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec(
+          od as api.GoogleCloudMlV1StudyConfigParameterSpecIntegerValueSpec);
     });
   });
 
@@ -3068,7 +3126,8 @@
           api.GoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec
               .fromJson(o.toJson());
       checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec(
-          od);
+          od as api
+              .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentCategoricalValueSpec);
     });
   });
 
@@ -3082,7 +3141,8 @@
           api.GoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec
               .fromJson(o.toJson());
       checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec(
-          od);
+          od as api
+              .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentDiscreteValueSpec);
     });
   });
 
@@ -3095,8 +3155,9 @@
       var od =
           api.GoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec
               .fromJson(o.toJson());
-      checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec(
-          od);
+      checkGoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec(od
+          as api
+              .GoogleCloudMlV1StudyConfigParameterSpecMatchingParentIntValueSpec);
     });
   });
 
@@ -3104,7 +3165,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1StudyConfigMetricSpec();
       var od = api.GoogleCloudMlV1StudyConfigMetricSpec.fromJson(o.toJson());
-      checkGoogleCloudMlV1StudyConfigMetricSpec(od);
+      checkGoogleCloudMlV1StudyConfigMetricSpec(
+          od as api.GoogleCloudMlV1StudyConfigMetricSpec);
     });
   });
 
@@ -3112,7 +3174,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1StudyConfigParameterSpec();
       var od = api.GoogleCloudMlV1StudyConfigParameterSpec.fromJson(o.toJson());
-      checkGoogleCloudMlV1StudyConfigParameterSpec(od);
+      checkGoogleCloudMlV1StudyConfigParameterSpec(
+          od as api.GoogleCloudMlV1StudyConfigParameterSpec);
     });
   });
 
@@ -3120,7 +3183,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1TrialParameter();
       var od = api.GoogleCloudMlV1TrialParameter.fromJson(o.toJson());
-      checkGoogleCloudMlV1TrialParameter(od);
+      checkGoogleCloudMlV1TrialParameter(
+          od as api.GoogleCloudMlV1TrialParameter);
     });
   });
 
@@ -3128,7 +3192,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1AcceleratorConfig();
       var od = api.GoogleCloudMlV1AcceleratorConfig.fromJson(o.toJson());
-      checkGoogleCloudMlV1AcceleratorConfig(od);
+      checkGoogleCloudMlV1AcceleratorConfig(
+          od as api.GoogleCloudMlV1AcceleratorConfig);
     });
   });
 
@@ -3137,7 +3202,8 @@
       var o = buildGoogleCloudMlV1AddTrialMeasurementRequest();
       var od =
           api.GoogleCloudMlV1AddTrialMeasurementRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1AddTrialMeasurementRequest(od);
+      checkGoogleCloudMlV1AddTrialMeasurementRequest(
+          od as api.GoogleCloudMlV1AddTrialMeasurementRequest);
     });
   });
 
@@ -3145,7 +3211,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1AutoScaling();
       var od = api.GoogleCloudMlV1AutoScaling.fromJson(o.toJson());
-      checkGoogleCloudMlV1AutoScaling(od);
+      checkGoogleCloudMlV1AutoScaling(od as api.GoogleCloudMlV1AutoScaling);
     });
   });
 
@@ -3153,7 +3219,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1AutomatedStoppingConfig();
       var od = api.GoogleCloudMlV1AutomatedStoppingConfig.fromJson(o.toJson());
-      checkGoogleCloudMlV1AutomatedStoppingConfig(od);
+      checkGoogleCloudMlV1AutomatedStoppingConfig(
+          od as api.GoogleCloudMlV1AutomatedStoppingConfig);
     });
   });
 
@@ -3161,7 +3228,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1BuiltInAlgorithmOutput();
       var od = api.GoogleCloudMlV1BuiltInAlgorithmOutput.fromJson(o.toJson());
-      checkGoogleCloudMlV1BuiltInAlgorithmOutput(od);
+      checkGoogleCloudMlV1BuiltInAlgorithmOutput(
+          od as api.GoogleCloudMlV1BuiltInAlgorithmOutput);
     });
   });
 
@@ -3169,7 +3237,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1CancelJobRequest();
       var od = api.GoogleCloudMlV1CancelJobRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1CancelJobRequest(od);
+      checkGoogleCloudMlV1CancelJobRequest(
+          od as api.GoogleCloudMlV1CancelJobRequest);
     });
   });
 
@@ -3177,7 +3246,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Capability();
       var od = api.GoogleCloudMlV1Capability.fromJson(o.toJson());
-      checkGoogleCloudMlV1Capability(od);
+      checkGoogleCloudMlV1Capability(od as api.GoogleCloudMlV1Capability);
     });
   });
 
@@ -3188,7 +3257,8 @@
       var od =
           api.GoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata.fromJson(
               o.toJson());
-      checkGoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata(od);
+      checkGoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata(
+          od as api.GoogleCloudMlV1CheckTrialEarlyStoppingStateMetatdata);
     });
   });
 
@@ -3198,7 +3268,8 @@
       var o = buildGoogleCloudMlV1CheckTrialEarlyStoppingStateRequest();
       var od = api.GoogleCloudMlV1CheckTrialEarlyStoppingStateRequest.fromJson(
           o.toJson());
-      checkGoogleCloudMlV1CheckTrialEarlyStoppingStateRequest(od);
+      checkGoogleCloudMlV1CheckTrialEarlyStoppingStateRequest(
+          od as api.GoogleCloudMlV1CheckTrialEarlyStoppingStateRequest);
     });
   });
 
@@ -3208,7 +3279,8 @@
       var o = buildGoogleCloudMlV1CheckTrialEarlyStoppingStateResponse();
       var od = api.GoogleCloudMlV1CheckTrialEarlyStoppingStateResponse.fromJson(
           o.toJson());
-      checkGoogleCloudMlV1CheckTrialEarlyStoppingStateResponse(od);
+      checkGoogleCloudMlV1CheckTrialEarlyStoppingStateResponse(
+          od as api.GoogleCloudMlV1CheckTrialEarlyStoppingStateResponse);
     });
   });
 
@@ -3216,7 +3288,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1CompleteTrialRequest();
       var od = api.GoogleCloudMlV1CompleteTrialRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1CompleteTrialRequest(od);
+      checkGoogleCloudMlV1CompleteTrialRequest(
+          od as api.GoogleCloudMlV1CompleteTrialRequest);
     });
   });
 
@@ -3224,7 +3297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Config();
       var od = api.GoogleCloudMlV1Config.fromJson(o.toJson());
-      checkGoogleCloudMlV1Config(od);
+      checkGoogleCloudMlV1Config(od as api.GoogleCloudMlV1Config);
     });
   });
 
@@ -3232,7 +3305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ContainerPort();
       var od = api.GoogleCloudMlV1ContainerPort.fromJson(o.toJson());
-      checkGoogleCloudMlV1ContainerPort(od);
+      checkGoogleCloudMlV1ContainerPort(od as api.GoogleCloudMlV1ContainerPort);
     });
   });
 
@@ -3240,7 +3313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ContainerSpec();
       var od = api.GoogleCloudMlV1ContainerSpec.fromJson(o.toJson());
-      checkGoogleCloudMlV1ContainerSpec(od);
+      checkGoogleCloudMlV1ContainerSpec(od as api.GoogleCloudMlV1ContainerSpec);
     });
   });
 
@@ -3248,7 +3321,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1EncryptionConfig();
       var od = api.GoogleCloudMlV1EncryptionConfig.fromJson(o.toJson());
-      checkGoogleCloudMlV1EncryptionConfig(od);
+      checkGoogleCloudMlV1EncryptionConfig(
+          od as api.GoogleCloudMlV1EncryptionConfig);
     });
   });
 
@@ -3256,7 +3330,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1EnvVar();
       var od = api.GoogleCloudMlV1EnvVar.fromJson(o.toJson());
-      checkGoogleCloudMlV1EnvVar(od);
+      checkGoogleCloudMlV1EnvVar(od as api.GoogleCloudMlV1EnvVar);
     });
   });
 
@@ -3264,7 +3338,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ExplainRequest();
       var od = api.GoogleCloudMlV1ExplainRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1ExplainRequest(od);
+      checkGoogleCloudMlV1ExplainRequest(
+          od as api.GoogleCloudMlV1ExplainRequest);
     });
   });
 
@@ -3272,7 +3347,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ExplanationConfig();
       var od = api.GoogleCloudMlV1ExplanationConfig.fromJson(o.toJson());
-      checkGoogleCloudMlV1ExplanationConfig(od);
+      checkGoogleCloudMlV1ExplanationConfig(
+          od as api.GoogleCloudMlV1ExplanationConfig);
     });
   });
 
@@ -3280,7 +3356,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1GetConfigResponse();
       var od = api.GoogleCloudMlV1GetConfigResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1GetConfigResponse(od);
+      checkGoogleCloudMlV1GetConfigResponse(
+          od as api.GoogleCloudMlV1GetConfigResponse);
     });
   });
 
@@ -3288,7 +3365,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1HyperparameterOutput();
       var od = api.GoogleCloudMlV1HyperparameterOutput.fromJson(o.toJson());
-      checkGoogleCloudMlV1HyperparameterOutput(od);
+      checkGoogleCloudMlV1HyperparameterOutput(
+          od as api.GoogleCloudMlV1HyperparameterOutput);
     });
   });
 
@@ -3296,7 +3374,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1HyperparameterSpec();
       var od = api.GoogleCloudMlV1HyperparameterSpec.fromJson(o.toJson());
-      checkGoogleCloudMlV1HyperparameterSpec(od);
+      checkGoogleCloudMlV1HyperparameterSpec(
+          od as api.GoogleCloudMlV1HyperparameterSpec);
     });
   });
 
@@ -3306,7 +3385,8 @@
       var o = buildGoogleCloudMlV1IntegratedGradientsAttribution();
       var od = api.GoogleCloudMlV1IntegratedGradientsAttribution.fromJson(
           o.toJson());
-      checkGoogleCloudMlV1IntegratedGradientsAttribution(od);
+      checkGoogleCloudMlV1IntegratedGradientsAttribution(
+          od as api.GoogleCloudMlV1IntegratedGradientsAttribution);
     });
   });
 
@@ -3314,7 +3394,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Job();
       var od = api.GoogleCloudMlV1Job.fromJson(o.toJson());
-      checkGoogleCloudMlV1Job(od);
+      checkGoogleCloudMlV1Job(od as api.GoogleCloudMlV1Job);
     });
   });
 
@@ -3322,7 +3402,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ListJobsResponse();
       var od = api.GoogleCloudMlV1ListJobsResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1ListJobsResponse(od);
+      checkGoogleCloudMlV1ListJobsResponse(
+          od as api.GoogleCloudMlV1ListJobsResponse);
     });
   });
 
@@ -3330,7 +3411,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ListLocationsResponse();
       var od = api.GoogleCloudMlV1ListLocationsResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1ListLocationsResponse(od);
+      checkGoogleCloudMlV1ListLocationsResponse(
+          od as api.GoogleCloudMlV1ListLocationsResponse);
     });
   });
 
@@ -3338,7 +3420,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ListModelsResponse();
       var od = api.GoogleCloudMlV1ListModelsResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1ListModelsResponse(od);
+      checkGoogleCloudMlV1ListModelsResponse(
+          od as api.GoogleCloudMlV1ListModelsResponse);
     });
   });
 
@@ -3346,7 +3429,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ListStudiesResponse();
       var od = api.GoogleCloudMlV1ListStudiesResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1ListStudiesResponse(od);
+      checkGoogleCloudMlV1ListStudiesResponse(
+          od as api.GoogleCloudMlV1ListStudiesResponse);
     });
   });
 
@@ -3354,7 +3438,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ListTrialsResponse();
       var od = api.GoogleCloudMlV1ListTrialsResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1ListTrialsResponse(od);
+      checkGoogleCloudMlV1ListTrialsResponse(
+          od as api.GoogleCloudMlV1ListTrialsResponse);
     });
   });
 
@@ -3362,7 +3447,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ListVersionsResponse();
       var od = api.GoogleCloudMlV1ListVersionsResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1ListVersionsResponse(od);
+      checkGoogleCloudMlV1ListVersionsResponse(
+          od as api.GoogleCloudMlV1ListVersionsResponse);
     });
   });
 
@@ -3370,7 +3456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Location();
       var od = api.GoogleCloudMlV1Location.fromJson(o.toJson());
-      checkGoogleCloudMlV1Location(od);
+      checkGoogleCloudMlV1Location(od as api.GoogleCloudMlV1Location);
     });
   });
 
@@ -3378,7 +3464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ManualScaling();
       var od = api.GoogleCloudMlV1ManualScaling.fromJson(o.toJson());
-      checkGoogleCloudMlV1ManualScaling(od);
+      checkGoogleCloudMlV1ManualScaling(od as api.GoogleCloudMlV1ManualScaling);
     });
   });
 
@@ -3386,7 +3472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Measurement();
       var od = api.GoogleCloudMlV1Measurement.fromJson(o.toJson());
-      checkGoogleCloudMlV1Measurement(od);
+      checkGoogleCloudMlV1Measurement(od as api.GoogleCloudMlV1Measurement);
     });
   });
 
@@ -3394,7 +3480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Model();
       var od = api.GoogleCloudMlV1Model.fromJson(o.toJson());
-      checkGoogleCloudMlV1Model(od);
+      checkGoogleCloudMlV1Model(od as api.GoogleCloudMlV1Model);
     });
   });
 
@@ -3402,7 +3488,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1OperationMetadata();
       var od = api.GoogleCloudMlV1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudMlV1OperationMetadata(od);
+      checkGoogleCloudMlV1OperationMetadata(
+          od as api.GoogleCloudMlV1OperationMetadata);
     });
   });
 
@@ -3410,7 +3497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ParameterSpec();
       var od = api.GoogleCloudMlV1ParameterSpec.fromJson(o.toJson());
-      checkGoogleCloudMlV1ParameterSpec(od);
+      checkGoogleCloudMlV1ParameterSpec(od as api.GoogleCloudMlV1ParameterSpec);
     });
   });
 
@@ -3418,7 +3505,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1PredictRequest();
       var od = api.GoogleCloudMlV1PredictRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1PredictRequest(od);
+      checkGoogleCloudMlV1PredictRequest(
+          od as api.GoogleCloudMlV1PredictRequest);
     });
   });
 
@@ -3426,7 +3514,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1PredictionInput();
       var od = api.GoogleCloudMlV1PredictionInput.fromJson(o.toJson());
-      checkGoogleCloudMlV1PredictionInput(od);
+      checkGoogleCloudMlV1PredictionInput(
+          od as api.GoogleCloudMlV1PredictionInput);
     });
   });
 
@@ -3434,7 +3523,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1PredictionOutput();
       var od = api.GoogleCloudMlV1PredictionOutput.fromJson(o.toJson());
-      checkGoogleCloudMlV1PredictionOutput(od);
+      checkGoogleCloudMlV1PredictionOutput(
+          od as api.GoogleCloudMlV1PredictionOutput);
     });
   });
 
@@ -3442,7 +3532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1ReplicaConfig();
       var od = api.GoogleCloudMlV1ReplicaConfig.fromJson(o.toJson());
-      checkGoogleCloudMlV1ReplicaConfig(od);
+      checkGoogleCloudMlV1ReplicaConfig(od as api.GoogleCloudMlV1ReplicaConfig);
     });
   });
 
@@ -3450,7 +3540,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1RequestLoggingConfig();
       var od = api.GoogleCloudMlV1RequestLoggingConfig.fromJson(o.toJson());
-      checkGoogleCloudMlV1RequestLoggingConfig(od);
+      checkGoogleCloudMlV1RequestLoggingConfig(
+          od as api.GoogleCloudMlV1RequestLoggingConfig);
     });
   });
 
@@ -3458,7 +3549,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1RouteMap();
       var od = api.GoogleCloudMlV1RouteMap.fromJson(o.toJson());
-      checkGoogleCloudMlV1RouteMap(od);
+      checkGoogleCloudMlV1RouteMap(od as api.GoogleCloudMlV1RouteMap);
     });
   });
 
@@ -3467,7 +3558,8 @@
       var o = buildGoogleCloudMlV1SampledShapleyAttribution();
       var od =
           api.GoogleCloudMlV1SampledShapleyAttribution.fromJson(o.toJson());
-      checkGoogleCloudMlV1SampledShapleyAttribution(od);
+      checkGoogleCloudMlV1SampledShapleyAttribution(
+          od as api.GoogleCloudMlV1SampledShapleyAttribution);
     });
   });
 
@@ -3475,7 +3567,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Scheduling();
       var od = api.GoogleCloudMlV1Scheduling.fromJson(o.toJson());
-      checkGoogleCloudMlV1Scheduling(od);
+      checkGoogleCloudMlV1Scheduling(od as api.GoogleCloudMlV1Scheduling);
     });
   });
 
@@ -3483,7 +3575,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1SetDefaultVersionRequest();
       var od = api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1SetDefaultVersionRequest(od);
+      checkGoogleCloudMlV1SetDefaultVersionRequest(
+          od as api.GoogleCloudMlV1SetDefaultVersionRequest);
     });
   });
 
@@ -3491,7 +3584,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1StopTrialRequest();
       var od = api.GoogleCloudMlV1StopTrialRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1StopTrialRequest(od);
+      checkGoogleCloudMlV1StopTrialRequest(
+          od as api.GoogleCloudMlV1StopTrialRequest);
     });
   });
 
@@ -3499,7 +3593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Study();
       var od = api.GoogleCloudMlV1Study.fromJson(o.toJson());
-      checkGoogleCloudMlV1Study(od);
+      checkGoogleCloudMlV1Study(od as api.GoogleCloudMlV1Study);
     });
   });
 
@@ -3507,7 +3601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1StudyConfig();
       var od = api.GoogleCloudMlV1StudyConfig.fromJson(o.toJson());
-      checkGoogleCloudMlV1StudyConfig(od);
+      checkGoogleCloudMlV1StudyConfig(od as api.GoogleCloudMlV1StudyConfig);
     });
   });
 
@@ -3515,7 +3609,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1SuggestTrialsMetadata();
       var od = api.GoogleCloudMlV1SuggestTrialsMetadata.fromJson(o.toJson());
-      checkGoogleCloudMlV1SuggestTrialsMetadata(od);
+      checkGoogleCloudMlV1SuggestTrialsMetadata(
+          od as api.GoogleCloudMlV1SuggestTrialsMetadata);
     });
   });
 
@@ -3523,7 +3618,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1SuggestTrialsRequest();
       var od = api.GoogleCloudMlV1SuggestTrialsRequest.fromJson(o.toJson());
-      checkGoogleCloudMlV1SuggestTrialsRequest(od);
+      checkGoogleCloudMlV1SuggestTrialsRequest(
+          od as api.GoogleCloudMlV1SuggestTrialsRequest);
     });
   });
 
@@ -3531,7 +3627,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1SuggestTrialsResponse();
       var od = api.GoogleCloudMlV1SuggestTrialsResponse.fromJson(o.toJson());
-      checkGoogleCloudMlV1SuggestTrialsResponse(od);
+      checkGoogleCloudMlV1SuggestTrialsResponse(
+          od as api.GoogleCloudMlV1SuggestTrialsResponse);
     });
   });
 
@@ -3539,7 +3636,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1TrainingInput();
       var od = api.GoogleCloudMlV1TrainingInput.fromJson(o.toJson());
-      checkGoogleCloudMlV1TrainingInput(od);
+      checkGoogleCloudMlV1TrainingInput(od as api.GoogleCloudMlV1TrainingInput);
     });
   });
 
@@ -3547,7 +3644,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1TrainingOutput();
       var od = api.GoogleCloudMlV1TrainingOutput.fromJson(o.toJson());
-      checkGoogleCloudMlV1TrainingOutput(od);
+      checkGoogleCloudMlV1TrainingOutput(
+          od as api.GoogleCloudMlV1TrainingOutput);
     });
   });
 
@@ -3555,7 +3653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Trial();
       var od = api.GoogleCloudMlV1Trial.fromJson(o.toJson());
-      checkGoogleCloudMlV1Trial(od);
+      checkGoogleCloudMlV1Trial(od as api.GoogleCloudMlV1Trial);
     });
   });
 
@@ -3563,7 +3661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1Version();
       var od = api.GoogleCloudMlV1Version.fromJson(o.toJson());
-      checkGoogleCloudMlV1Version(od);
+      checkGoogleCloudMlV1Version(od as api.GoogleCloudMlV1Version);
     });
   });
 
@@ -3571,7 +3669,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudMlV1XraiAttribution();
       var od = api.GoogleCloudMlV1XraiAttribution.fromJson(o.toJson());
-      checkGoogleCloudMlV1XraiAttribution(od);
+      checkGoogleCloudMlV1XraiAttribution(
+          od as api.GoogleCloudMlV1XraiAttribution);
     });
   });
 
@@ -3579,7 +3678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1AuditConfig();
       var od = api.GoogleIamV1AuditConfig.fromJson(o.toJson());
-      checkGoogleIamV1AuditConfig(od);
+      checkGoogleIamV1AuditConfig(od as api.GoogleIamV1AuditConfig);
     });
   });
 
@@ -3587,7 +3686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1AuditLogConfig();
       var od = api.GoogleIamV1AuditLogConfig.fromJson(o.toJson());
-      checkGoogleIamV1AuditLogConfig(od);
+      checkGoogleIamV1AuditLogConfig(od as api.GoogleIamV1AuditLogConfig);
     });
   });
 
@@ -3595,7 +3694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1Binding();
       var od = api.GoogleIamV1Binding.fromJson(o.toJson());
-      checkGoogleIamV1Binding(od);
+      checkGoogleIamV1Binding(od as api.GoogleIamV1Binding);
     });
   });
 
@@ -3603,7 +3702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1Policy();
       var od = api.GoogleIamV1Policy.fromJson(o.toJson());
-      checkGoogleIamV1Policy(od);
+      checkGoogleIamV1Policy(od as api.GoogleIamV1Policy);
     });
   });
 
@@ -3611,7 +3710,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1SetIamPolicyRequest();
       var od = api.GoogleIamV1SetIamPolicyRequest.fromJson(o.toJson());
-      checkGoogleIamV1SetIamPolicyRequest(od);
+      checkGoogleIamV1SetIamPolicyRequest(
+          od as api.GoogleIamV1SetIamPolicyRequest);
     });
   });
 
@@ -3619,7 +3719,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1TestIamPermissionsRequest();
       var od = api.GoogleIamV1TestIamPermissionsRequest.fromJson(o.toJson());
-      checkGoogleIamV1TestIamPermissionsRequest(od);
+      checkGoogleIamV1TestIamPermissionsRequest(
+          od as api.GoogleIamV1TestIamPermissionsRequest);
     });
   });
 
@@ -3627,7 +3728,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1TestIamPermissionsResponse();
       var od = api.GoogleIamV1TestIamPermissionsResponse.fromJson(o.toJson());
-      checkGoogleIamV1TestIamPermissionsResponse(od);
+      checkGoogleIamV1TestIamPermissionsResponse(
+          od as api.GoogleIamV1TestIamPermissionsResponse);
     });
   });
 
@@ -3635,7 +3737,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningListOperationsResponse();
       var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
-      checkGoogleLongrunningListOperationsResponse(od);
+      checkGoogleLongrunningListOperationsResponse(
+          od as api.GoogleLongrunningListOperationsResponse);
     });
   });
 
@@ -3643,7 +3746,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningOperation();
       var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
-      checkGoogleLongrunningOperation(od);
+      checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
 
@@ -3651,7 +3754,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleProtobufEmpty();
       var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
-      checkGoogleProtobufEmpty(od);
+      checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
 
@@ -3659,7 +3762,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcStatus();
       var od = api.GoogleRpcStatus.fromJson(o.toJson());
-      checkGoogleRpcStatus(od);
+      checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
 
@@ -3667,7 +3770,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleTypeExpr();
       var od = api.GoogleTypeExpr.fromJson(o.toJson());
-      checkGoogleTypeExpr(od);
+      checkGoogleTypeExpr(od as api.GoogleTypeExpr);
     });
   });
 
@@ -3679,8 +3782,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1ExplainRequest.fromJson(json);
-        checkGoogleCloudMlV1ExplainRequest(obj);
+        var obj = api.GoogleCloudMlV1ExplainRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1ExplainRequest(
+            obj as api.GoogleCloudMlV1ExplainRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3720,7 +3825,7 @@
       res
           .explain(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
 
@@ -3768,7 +3873,8 @@
       res
           .getConfig(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1GetConfigResponse(response);
+        checkGoogleCloudMlV1GetConfigResponse(
+            response as api.GoogleCloudMlV1GetConfigResponse);
       })));
     });
 
@@ -3779,8 +3885,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1PredictRequest.fromJson(json);
-        checkGoogleCloudMlV1PredictRequest(obj);
+        var obj = api.GoogleCloudMlV1PredictRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1PredictRequest(
+            obj as api.GoogleCloudMlV1PredictRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3820,7 +3928,7 @@
       res
           .predict(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiHttpBody(response);
+        checkGoogleApiHttpBody(response as api.GoogleApiHttpBody);
       })));
     });
   });
@@ -3833,8 +3941,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1CancelJobRequest.fromJson(json);
-        checkGoogleCloudMlV1CancelJobRequest(obj);
+        var obj = api.GoogleCloudMlV1CancelJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1CancelJobRequest(
+            obj as api.GoogleCloudMlV1CancelJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3874,7 +3984,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -3885,8 +3995,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Job.fromJson(json);
-        checkGoogleCloudMlV1Job(obj);
+        var obj = api.GoogleCloudMlV1Job.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Job(obj as api.GoogleCloudMlV1Job);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3926,7 +4037,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Job(response);
+        checkGoogleCloudMlV1Job(response as api.GoogleCloudMlV1Job);
       })));
     });
 
@@ -3974,7 +4085,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Job(response);
+        checkGoogleCloudMlV1Job(response as api.GoogleCloudMlV1Job);
       })));
     });
 
@@ -4029,7 +4140,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1Policy(response);
+        checkGoogleIamV1Policy(response as api.GoogleIamV1Policy);
       })));
     });
 
@@ -4089,7 +4200,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1ListJobsResponse(response);
+        checkGoogleCloudMlV1ListJobsResponse(
+            response as api.GoogleCloudMlV1ListJobsResponse);
       })));
     });
 
@@ -4101,8 +4213,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Job.fromJson(json);
-        checkGoogleCloudMlV1Job(obj);
+        var obj = api.GoogleCloudMlV1Job.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Job(obj as api.GoogleCloudMlV1Job);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4145,7 +4258,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Job(response);
+        checkGoogleCloudMlV1Job(response as api.GoogleCloudMlV1Job);
       })));
     });
 
@@ -4156,8 +4269,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleIamV1SetIamPolicyRequest.fromJson(json);
-        checkGoogleIamV1SetIamPolicyRequest(obj);
+        var obj = api.GoogleIamV1SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleIamV1SetIamPolicyRequest(
+            obj as api.GoogleIamV1SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4197,7 +4312,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1Policy(response);
+        checkGoogleIamV1Policy(response as api.GoogleIamV1Policy);
       })));
     });
 
@@ -4208,8 +4323,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleIamV1TestIamPermissionsRequest.fromJson(json);
-        checkGoogleIamV1TestIamPermissionsRequest(obj);
+        var obj = api.GoogleIamV1TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleIamV1TestIamPermissionsRequest(
+            obj as api.GoogleIamV1TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4250,7 +4367,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1TestIamPermissionsResponse(response);
+        checkGoogleIamV1TestIamPermissionsResponse(
+            response as api.GoogleIamV1TestIamPermissionsResponse);
       })));
     });
   });
@@ -4300,7 +4418,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Location(response);
+        checkGoogleCloudMlV1Location(response as api.GoogleCloudMlV1Location);
       })));
     });
 
@@ -4358,7 +4476,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1ListLocationsResponse(response);
+        checkGoogleCloudMlV1ListLocationsResponse(
+            response as api.GoogleCloudMlV1ListLocationsResponse);
       })));
     });
   });
@@ -4408,7 +4527,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -4456,7 +4575,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -4470,8 +4590,9 @@
       var arg_studyId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Study.fromJson(json);
-        checkGoogleCloudMlV1Study(obj);
+        var obj = api.GoogleCloudMlV1Study.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Study(obj as api.GoogleCloudMlV1Study);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4514,7 +4635,7 @@
           .create(arg_request, arg_parent,
               studyId: arg_studyId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Study(response);
+        checkGoogleCloudMlV1Study(response as api.GoogleCloudMlV1Study);
       })));
     });
 
@@ -4562,7 +4683,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -4610,7 +4731,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Study(response);
+        checkGoogleCloudMlV1Study(response as api.GoogleCloudMlV1Study);
       })));
     });
 
@@ -4659,7 +4780,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1ListStudiesResponse(response);
+        checkGoogleCloudMlV1ListStudiesResponse(
+            response as api.GoogleCloudMlV1ListStudiesResponse);
       })));
     });
   });
@@ -4672,8 +4794,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1AddTrialMeasurementRequest.fromJson(json);
-        checkGoogleCloudMlV1AddTrialMeasurementRequest(obj);
+        var obj = api.GoogleCloudMlV1AddTrialMeasurementRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1AddTrialMeasurementRequest(
+            obj as api.GoogleCloudMlV1AddTrialMeasurementRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4713,7 +4837,7 @@
       res
           .addMeasurement(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Trial(response);
+        checkGoogleCloudMlV1Trial(response as api.GoogleCloudMlV1Trial);
       })));
     });
 
@@ -4727,8 +4851,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudMlV1CheckTrialEarlyStoppingStateRequest.fromJson(
-                json);
-        checkGoogleCloudMlV1CheckTrialEarlyStoppingStateRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1CheckTrialEarlyStoppingStateRequest(
+            obj as api.GoogleCloudMlV1CheckTrialEarlyStoppingStateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4768,7 +4893,8 @@
       res
           .checkEarlyStoppingState(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -4779,8 +4905,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1CompleteTrialRequest.fromJson(json);
-        checkGoogleCloudMlV1CompleteTrialRequest(obj);
+        var obj = api.GoogleCloudMlV1CompleteTrialRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1CompleteTrialRequest(
+            obj as api.GoogleCloudMlV1CompleteTrialRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4820,7 +4948,7 @@
       res
           .complete(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Trial(response);
+        checkGoogleCloudMlV1Trial(response as api.GoogleCloudMlV1Trial);
       })));
     });
 
@@ -4831,8 +4959,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Trial.fromJson(json);
-        checkGoogleCloudMlV1Trial(obj);
+        var obj = api.GoogleCloudMlV1Trial.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Trial(obj as api.GoogleCloudMlV1Trial);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4872,7 +5001,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Trial(response);
+        checkGoogleCloudMlV1Trial(response as api.GoogleCloudMlV1Trial);
       })));
     });
 
@@ -4920,7 +5049,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -4968,7 +5097,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Trial(response);
+        checkGoogleCloudMlV1Trial(response as api.GoogleCloudMlV1Trial);
       })));
     });
 
@@ -5017,7 +5146,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1ListTrialsResponse(response);
+        checkGoogleCloudMlV1ListTrialsResponse(
+            response as api.GoogleCloudMlV1ListTrialsResponse);
       })));
     });
 
@@ -5028,8 +5158,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1StopTrialRequest.fromJson(json);
-        checkGoogleCloudMlV1StopTrialRequest(obj);
+        var obj = api.GoogleCloudMlV1StopTrialRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1StopTrialRequest(
+            obj as api.GoogleCloudMlV1StopTrialRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5069,7 +5201,7 @@
       res
           .stop(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Trial(response);
+        checkGoogleCloudMlV1Trial(response as api.GoogleCloudMlV1Trial);
       })));
     });
 
@@ -5080,8 +5212,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1SuggestTrialsRequest.fromJson(json);
-        checkGoogleCloudMlV1SuggestTrialsRequest(obj);
+        var obj = api.GoogleCloudMlV1SuggestTrialsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1SuggestTrialsRequest(
+            obj as api.GoogleCloudMlV1SuggestTrialsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5121,7 +5255,8 @@
       res
           .suggest(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -5134,8 +5269,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Model.fromJson(json);
-        checkGoogleCloudMlV1Model(obj);
+        var obj = api.GoogleCloudMlV1Model.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Model(obj as api.GoogleCloudMlV1Model);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5175,7 +5311,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Model(response);
+        checkGoogleCloudMlV1Model(response as api.GoogleCloudMlV1Model);
       })));
     });
 
@@ -5223,7 +5359,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -5271,7 +5408,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Model(response);
+        checkGoogleCloudMlV1Model(response as api.GoogleCloudMlV1Model);
       })));
     });
 
@@ -5326,7 +5463,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1Policy(response);
+        checkGoogleIamV1Policy(response as api.GoogleIamV1Policy);
       })));
     });
 
@@ -5387,7 +5524,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1ListModelsResponse(response);
+        checkGoogleCloudMlV1ListModelsResponse(
+            response as api.GoogleCloudMlV1ListModelsResponse);
       })));
     });
 
@@ -5399,8 +5537,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Model.fromJson(json);
-        checkGoogleCloudMlV1Model(obj);
+        var obj = api.GoogleCloudMlV1Model.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Model(obj as api.GoogleCloudMlV1Model);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5443,7 +5582,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -5454,8 +5594,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleIamV1SetIamPolicyRequest.fromJson(json);
-        checkGoogleIamV1SetIamPolicyRequest(obj);
+        var obj = api.GoogleIamV1SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleIamV1SetIamPolicyRequest(
+            obj as api.GoogleIamV1SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5495,7 +5637,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1Policy(response);
+        checkGoogleIamV1Policy(response as api.GoogleIamV1Policy);
       })));
     });
 
@@ -5506,8 +5648,10 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleIamV1TestIamPermissionsRequest.fromJson(json);
-        checkGoogleIamV1TestIamPermissionsRequest(obj);
+        var obj = api.GoogleIamV1TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleIamV1TestIamPermissionsRequest(
+            obj as api.GoogleIamV1TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5548,7 +5692,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleIamV1TestIamPermissionsResponse(response);
+        checkGoogleIamV1TestIamPermissionsResponse(
+            response as api.GoogleIamV1TestIamPermissionsResponse);
       })));
     });
   });
@@ -5561,8 +5706,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Version.fromJson(json);
-        checkGoogleCloudMlV1Version(obj);
+        var obj = api.GoogleCloudMlV1Version.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Version(obj as api.GoogleCloudMlV1Version);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5602,7 +5748,8 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -5650,7 +5797,8 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -5698,7 +5846,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Version(response);
+        checkGoogleCloudMlV1Version(response as api.GoogleCloudMlV1Version);
       })));
     });
 
@@ -5759,7 +5907,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1ListVersionsResponse(response);
+        checkGoogleCloudMlV1ListVersionsResponse(
+            response as api.GoogleCloudMlV1ListVersionsResponse);
       })));
     });
 
@@ -5771,8 +5920,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1Version.fromJson(json);
-        checkGoogleCloudMlV1Version(obj);
+        var obj = api.GoogleCloudMlV1Version.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1Version(obj as api.GoogleCloudMlV1Version);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5815,7 +5965,8 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -5826,8 +5977,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(json);
-        checkGoogleCloudMlV1SetDefaultVersionRequest(obj);
+        var obj = api.GoogleCloudMlV1SetDefaultVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudMlV1SetDefaultVersionRequest(
+            obj as api.GoogleCloudMlV1SetDefaultVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5867,7 +6020,7 @@
       res
           .setDefault(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudMlV1Version(response);
+        checkGoogleCloudMlV1Version(response as api.GoogleCloudMlV1Version);
       })));
     });
   });
@@ -5917,7 +6070,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -5965,7 +6118,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -6026,7 +6180,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningListOperationsResponse(response);
+        checkGoogleLongrunningListOperationsResponse(
+            response as api.GoogleLongrunningListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/monitoring/v3_test.dart b/generated/googleapis/test/monitoring/v3_test.dart
index 2db7270..882cd64 100644
--- a/generated/googleapis/test/monitoring/v3_test.dart
+++ b/generated/googleapis/test/monitoring/v3_test.dart
@@ -121,8 +121,8 @@
 
 void checkUnnamed2054(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<core.String> buildUnnamed2055() {
@@ -177,15 +177,15 @@
   if (buildCounterAlertPolicy < 3) {
     unittest.expect(o.combiner, unittest.equals('foo'));
     checkUnnamed2054(o.conditions);
-    checkMutationRecord(o.creationRecord);
+    checkMutationRecord(o.creationRecord as api.MutationRecord);
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkDocumentation(o.documentation);
+    checkDocumentation(o.documentation as api.Documentation);
     unittest.expect(o.enabled, unittest.isTrue);
-    checkMutationRecord(o.mutationRecord);
+    checkMutationRecord(o.mutationRecord as api.MutationRecord);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2055(o.notificationChannels);
     checkUnnamed2056(o.userLabels);
-    checkStatus(o.validity);
+    checkStatus(o.validity as api.Status);
   }
   buildCounterAlertPolicy--;
 }
@@ -302,8 +302,8 @@
 void checkBasicSli(api.BasicSli o) {
   buildCounterBasicSli++;
   if (buildCounterBasicSli < 3) {
-    checkAvailabilityCriteria(o.availability);
-    checkLatencyCriteria(o.latency);
+    checkAvailabilityCriteria(o.availability as api.AvailabilityCriteria);
+    checkLatencyCriteria(o.latency as api.LatencyCriteria);
     checkUnnamed2057(o.location);
     checkUnnamed2058(o.method);
     checkUnnamed2059(o.version);
@@ -327,9 +327,9 @@
 void checkBucketOptions(api.BucketOptions o) {
   buildCounterBucketOptions++;
   if (buildCounterBucketOptions < 3) {
-    checkExplicit(o.explicitBuckets);
-    checkExponential(o.exponentialBuckets);
-    checkLinear(o.linearBuckets);
+    checkExplicit(o.explicitBuckets as api.Explicit);
+    checkExponential(o.exponentialBuckets as api.Exponential);
+    checkLinear(o.linearBuckets as api.Linear);
   }
   buildCounterBucketOptions--;
 }
@@ -387,8 +387,8 @@
 
 void checkUnnamed2060(core.Map<core.String, api.TypedValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTypedValue(o['x']);
-  checkTypedValue(o['y']);
+  checkTypedValue(o['x'] as api.TypedValue);
+  checkTypedValue(o['y'] as api.TypedValue);
 }
 
 core.List<api.CollectdValue> buildUnnamed2061() {
@@ -400,8 +400,8 @@
 
 void checkUnnamed2061(core.List<api.CollectdValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCollectdValue(o[0]);
-  checkCollectdValue(o[1]);
+  checkCollectdValue(o[0] as api.CollectdValue);
+  checkCollectdValue(o[1] as api.CollectdValue);
 }
 
 core.int buildCounterCollectdPayload = 0;
@@ -446,8 +446,8 @@
 
 void checkUnnamed2062(core.List<api.CollectdValueError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCollectdValueError(o[0]);
-  checkCollectdValueError(o[1]);
+  checkCollectdValueError(o[0] as api.CollectdValueError);
+  checkCollectdValueError(o[1] as api.CollectdValueError);
 }
 
 core.int buildCounterCollectdPayloadError = 0;
@@ -466,7 +466,7 @@
 void checkCollectdPayloadError(api.CollectdPayloadError o) {
   buildCounterCollectdPayloadError++;
   if (buildCounterCollectdPayloadError < 3) {
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     unittest.expect(o.index, unittest.equals(42));
     checkUnnamed2062(o.valueErrors);
   }
@@ -491,7 +491,7 @@
   if (buildCounterCollectdValue < 3) {
     unittest.expect(o.dataSourceName, unittest.equals('foo'));
     unittest.expect(o.dataSourceType, unittest.equals('foo'));
-    checkTypedValue(o.value);
+    checkTypedValue(o.value as api.TypedValue);
   }
   buildCounterCollectdValue--;
 }
@@ -511,7 +511,7 @@
 void checkCollectdValueError(api.CollectdValueError o) {
   buildCounterCollectdValueError++;
   if (buildCounterCollectdValueError < 3) {
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     unittest.expect(o.index, unittest.equals(42));
   }
   buildCounterCollectdValueError--;
@@ -536,9 +536,10 @@
 void checkCondition(api.Condition o) {
   buildCounterCondition++;
   if (buildCounterCondition < 3) {
-    checkMetricAbsence(o.conditionAbsent);
-    checkMonitoringQueryLanguageCondition(o.conditionMonitoringQueryLanguage);
-    checkMetricThreshold(o.conditionThreshold);
+    checkMetricAbsence(o.conditionAbsent as api.MetricAbsence);
+    checkMonitoringQueryLanguageCondition(o.conditionMonitoringQueryLanguage
+        as api.MonitoringQueryLanguageCondition);
+    checkMetricThreshold(o.conditionThreshold as api.MetricThreshold);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -575,8 +576,8 @@
 
 void checkUnnamed2063(core.List<api.CollectdPayload> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCollectdPayload(o[0]);
-  checkCollectdPayload(o[1]);
+  checkCollectdPayload(o[0] as api.CollectdPayload);
+  checkCollectdPayload(o[1] as api.CollectdPayload);
 }
 
 core.int buildCounterCreateCollectdTimeSeriesRequest = 0;
@@ -598,7 +599,7 @@
   if (buildCounterCreateCollectdTimeSeriesRequest < 3) {
     checkUnnamed2063(o.collectdPayloads);
     unittest.expect(o.collectdVersion, unittest.equals('foo'));
-    checkMonitoredResource(o.resource);
+    checkMonitoredResource(o.resource as api.MonitoredResource);
   }
   buildCounterCreateCollectdTimeSeriesRequest--;
 }
@@ -612,8 +613,8 @@
 
 void checkUnnamed2064(core.List<api.CollectdPayloadError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCollectdPayloadError(o[0]);
-  checkCollectdPayloadError(o[1]);
+  checkCollectdPayloadError(o[0] as api.CollectdPayloadError);
+  checkCollectdPayloadError(o[1] as api.CollectdPayloadError);
 }
 
 core.int buildCounterCreateCollectdTimeSeriesResponse = 0;
@@ -633,7 +634,7 @@
   buildCounterCreateCollectdTimeSeriesResponse++;
   if (buildCounterCreateCollectdTimeSeriesResponse < 3) {
     checkUnnamed2064(o.payloadErrors);
-    checkCreateTimeSeriesSummary(o.summary);
+    checkCreateTimeSeriesSummary(o.summary as api.CreateTimeSeriesSummary);
   }
   buildCounterCreateCollectdTimeSeriesResponse--;
 }
@@ -647,8 +648,8 @@
 
 void checkUnnamed2065(core.List<api.TimeSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimeSeries(o[0]);
-  checkTimeSeries(o[1]);
+  checkTimeSeries(o[0] as api.TimeSeries);
+  checkTimeSeries(o[1] as api.TimeSeries);
 }
 
 core.int buildCounterCreateTimeSeriesRequest = 0;
@@ -679,8 +680,8 @@
 
 void checkUnnamed2066(core.List<api.Error> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkError(o[0]);
-  checkError(o[1]);
+  checkError(o[0] as api.Error);
+  checkError(o[1] as api.Error);
 }
 
 core.int buildCounterCreateTimeSeriesSummary = 0;
@@ -743,8 +744,8 @@
 
 void checkUnnamed2068(core.List<api.Exemplar> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExemplar(o[0]);
-  checkExemplar(o[1]);
+  checkExemplar(o[0] as api.Exemplar);
+  checkExemplar(o[1] as api.Exemplar);
 }
 
 core.int buildCounterDistribution = 0;
@@ -768,11 +769,11 @@
   buildCounterDistribution++;
   if (buildCounterDistribution < 3) {
     checkUnnamed2067(o.bucketCounts);
-    checkBucketOptions(o.bucketOptions);
+    checkBucketOptions(o.bucketOptions as api.BucketOptions);
     unittest.expect(o.count, unittest.equals('foo'));
     checkUnnamed2068(o.exemplars);
     unittest.expect(o.mean, unittest.equals(42.0));
-    checkRange(o.range);
+    checkRange(o.range as api.Range);
     unittest.expect(o.sumOfSquaredDeviation, unittest.equals(42.0));
   }
   buildCounterDistribution--;
@@ -794,7 +795,7 @@
   buildCounterDistributionCut++;
   if (buildCounterDistributionCut < 3) {
     unittest.expect(o.distributionFilter, unittest.equals('foo'));
-    checkGoogleMonitoringV3Range(o.range);
+    checkGoogleMonitoringV3Range(o.range as api.GoogleMonitoringV3Range);
   }
   buildCounterDistributionCut--;
 }
@@ -883,7 +884,7 @@
   buildCounterError++;
   if (buildCounterError < 3) {
     unittest.expect(o.pointCount, unittest.equals(42));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
   }
   buildCounterError--;
 }
@@ -1017,8 +1018,8 @@
 
 void checkUnnamed2073(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterField = 0;
@@ -1186,7 +1187,7 @@
 void checkHttpCheck(api.HttpCheck o) {
   buildCounterHttpCheck++;
   if (buildCounterHttpCheck < 3) {
-    checkBasicAuthentication(o.authInfo);
+    checkBasicAuthentication(o.authInfo as api.BasicAuthentication);
     unittest.expect(o.body, unittest.equals('foo'));
     unittest.expect(o.contentType, unittest.equals('foo'));
     checkUnnamed2074(o.headers);
@@ -1326,8 +1327,8 @@
 
 void checkUnnamed2075(core.List<api.AlertPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAlertPolicy(o[0]);
-  checkAlertPolicy(o[1]);
+  checkAlertPolicy(o[0] as api.AlertPolicy);
+  checkAlertPolicy(o[1] as api.AlertPolicy);
 }
 
 core.int buildCounterListAlertPoliciesResponse = 0;
@@ -1362,8 +1363,8 @@
 
 void checkUnnamed2076(core.List<api.MonitoredResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResource(o[0]);
-  checkMonitoredResource(o[1]);
+  checkMonitoredResource(o[0] as api.MonitoredResource);
+  checkMonitoredResource(o[1] as api.MonitoredResource);
 }
 
 core.int buildCounterListGroupMembersResponse = 0;
@@ -1398,8 +1399,8 @@
 
 void checkUnnamed2077(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroup(o[0]);
-  checkGroup(o[1]);
+  checkGroup(o[0] as api.Group);
+  checkGroup(o[1] as api.Group);
 }
 
 core.int buildCounterListGroupsResponse = 0;
@@ -1432,8 +1433,8 @@
 
 void checkUnnamed2078(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricDescriptor(o[0]);
-  checkMetricDescriptor(o[1]);
+  checkMetricDescriptor(o[0] as api.MetricDescriptor);
+  checkMetricDescriptor(o[1] as api.MetricDescriptor);
 }
 
 core.int buildCounterListMetricDescriptorsResponse = 0;
@@ -1466,8 +1467,8 @@
 
 void checkUnnamed2079(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResourceDescriptor(o[0]);
-  checkMonitoredResourceDescriptor(o[1]);
+  checkMonitoredResourceDescriptor(o[0] as api.MonitoredResourceDescriptor);
+  checkMonitoredResourceDescriptor(o[1] as api.MonitoredResourceDescriptor);
 }
 
 core.int buildCounterListMonitoredResourceDescriptorsResponse = 0;
@@ -1502,8 +1503,8 @@
 
 void checkUnnamed2080(core.List<api.NotificationChannelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotificationChannelDescriptor(o[0]);
-  checkNotificationChannelDescriptor(o[1]);
+  checkNotificationChannelDescriptor(o[0] as api.NotificationChannelDescriptor);
+  checkNotificationChannelDescriptor(o[1] as api.NotificationChannelDescriptor);
 }
 
 core.int buildCounterListNotificationChannelDescriptorsResponse = 0;
@@ -1538,8 +1539,8 @@
 
 void checkUnnamed2081(core.List<api.NotificationChannel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotificationChannel(o[0]);
-  checkNotificationChannel(o[1]);
+  checkNotificationChannel(o[0] as api.NotificationChannel);
+  checkNotificationChannel(o[1] as api.NotificationChannel);
 }
 
 core.int buildCounterListNotificationChannelsResponse = 0;
@@ -1575,8 +1576,8 @@
 
 void checkUnnamed2082(core.List<api.ServiceLevelObjective> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServiceLevelObjective(o[0]);
-  checkServiceLevelObjective(o[1]);
+  checkServiceLevelObjective(o[0] as api.ServiceLevelObjective);
+  checkServiceLevelObjective(o[1] as api.ServiceLevelObjective);
 }
 
 core.int buildCounterListServiceLevelObjectivesResponse = 0;
@@ -1611,8 +1612,8 @@
 
 void checkUnnamed2083(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkService(o[0]);
-  checkService(o[1]);
+  checkService(o[0] as api.Service);
+  checkService(o[1] as api.Service);
 }
 
 core.int buildCounterListServicesResponse = 0;
@@ -1645,8 +1646,8 @@
 
 void checkUnnamed2084(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.List<api.TimeSeries> buildUnnamed2085() {
@@ -1658,8 +1659,8 @@
 
 void checkUnnamed2085(core.List<api.TimeSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimeSeries(o[0]);
-  checkTimeSeries(o[1]);
+  checkTimeSeries(o[0] as api.TimeSeries);
+  checkTimeSeries(o[1] as api.TimeSeries);
 }
 
 core.int buildCounterListTimeSeriesResponse = 0;
@@ -1696,8 +1697,8 @@
 
 void checkUnnamed2086(core.List<api.UptimeCheckConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUptimeCheckConfig(o[0]);
-  checkUptimeCheckConfig(o[1]);
+  checkUptimeCheckConfig(o[0] as api.UptimeCheckConfig);
+  checkUptimeCheckConfig(o[1] as api.UptimeCheckConfig);
 }
 
 core.int buildCounterListUptimeCheckConfigsResponse = 0;
@@ -1732,8 +1733,8 @@
 
 void checkUnnamed2087(core.List<api.UptimeCheckIp> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUptimeCheckIp(o[0]);
-  checkUptimeCheckIp(o[1]);
+  checkUptimeCheckIp(o[0] as api.UptimeCheckIp);
+  checkUptimeCheckIp(o[1] as api.UptimeCheckIp);
 }
 
 core.int buildCounterListUptimeCheckIpsResponse = 0;
@@ -1823,8 +1824,8 @@
 
 void checkUnnamed2089(core.List<api.Aggregation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAggregation(o[0]);
-  checkAggregation(o[1]);
+  checkAggregation(o[0] as api.Aggregation);
+  checkAggregation(o[1] as api.Aggregation);
 }
 
 core.int buildCounterMetricAbsence = 0;
@@ -1847,7 +1848,7 @@
     checkUnnamed2089(o.aggregations);
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.filter, unittest.equals('foo'));
-    checkTrigger(o.trigger);
+    checkTrigger(o.trigger as api.Trigger);
   }
   buildCounterMetricAbsence--;
 }
@@ -1861,8 +1862,8 @@
 
 void checkUnnamed2090(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.List<core.String> buildUnnamed2091() {
@@ -1906,7 +1907,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed2090(o.labels);
     unittest.expect(o.launchStage, unittest.equals('foo'));
-    checkMetricDescriptorMetadata(o.metadata);
+    checkMetricDescriptorMetadata(o.metadata as api.MetricDescriptorMetadata);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     checkUnnamed2091(o.monitoredResourceTypes);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1955,7 +1956,7 @@
 void checkMetricRange(api.MetricRange o) {
   buildCounterMetricRange++;
   if (buildCounterMetricRange < 3) {
-    checkGoogleMonitoringV3Range(o.range);
+    checkGoogleMonitoringV3Range(o.range as api.GoogleMonitoringV3Range);
     unittest.expect(o.timeSeries, unittest.equals('foo'));
   }
   buildCounterMetricRange--;
@@ -1970,8 +1971,8 @@
 
 void checkUnnamed2092(core.List<api.Aggregation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAggregation(o[0]);
-  checkAggregation(o[1]);
+  checkAggregation(o[0] as api.Aggregation);
+  checkAggregation(o[1] as api.Aggregation);
 }
 
 core.List<api.Aggregation> buildUnnamed2093() {
@@ -1983,8 +1984,8 @@
 
 void checkUnnamed2093(core.List<api.Aggregation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAggregation(o[0]);
-  checkAggregation(o[1]);
+  checkAggregation(o[0] as api.Aggregation);
+  checkAggregation(o[1] as api.Aggregation);
 }
 
 core.int buildCounterMetricThreshold = 0;
@@ -2015,7 +2016,7 @@
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.filter, unittest.equals('foo'));
     unittest.expect(o.thresholdValue, unittest.equals(42.0));
-    checkTrigger(o.trigger);
+    checkTrigger(o.trigger as api.Trigger);
   }
   buildCounterMetricThreshold--;
 }
@@ -2063,8 +2064,8 @@
 
 void checkUnnamed2095(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterMonitoredResourceDescriptor = 0;
@@ -2178,7 +2179,7 @@
   if (buildCounterMonitoringQueryLanguageCondition < 3) {
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.query, unittest.equals('foo'));
-    checkTrigger(o.trigger);
+    checkTrigger(o.trigger as api.Trigger);
   }
   buildCounterMonitoringQueryLanguageCondition--;
 }
@@ -2272,8 +2273,8 @@
 
 void checkUnnamed2100(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterNotificationChannelDescriptor = 0;
@@ -2371,8 +2372,8 @@
 void checkPerformanceThreshold(api.PerformanceThreshold o) {
   buildCounterPerformanceThreshold++;
   if (buildCounterPerformanceThreshold < 3) {
-    checkBasicSli(o.basicSliPerformance);
-    checkRequestBasedSli(o.performance);
+    checkBasicSli(o.basicSliPerformance as api.BasicSli);
+    checkRequestBasedSli(o.performance as api.RequestBasedSli);
     unittest.expect(o.threshold, unittest.equals(42.0));
   }
   buildCounterPerformanceThreshold--;
@@ -2393,8 +2394,8 @@
 void checkPoint(api.Point o) {
   buildCounterPoint++;
   if (buildCounterPoint < 3) {
-    checkTimeInterval(o.interval);
-    checkTypedValue(o.value);
+    checkTimeInterval(o.interval as api.TimeInterval);
+    checkTypedValue(o.value as api.TypedValue);
   }
   buildCounterPoint--;
 }
@@ -2408,8 +2409,8 @@
 
 void checkUnnamed2102(core.List<api.TypedValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTypedValue(o[0]);
-  checkTypedValue(o[1]);
+  checkTypedValue(o[0] as api.TypedValue);
+  checkTypedValue(o[1] as api.TypedValue);
 }
 
 core.int buildCounterPointData = 0;
@@ -2427,7 +2428,7 @@
 void checkPointData(api.PointData o) {
   buildCounterPointData++;
   if (buildCounterPointData < 3) {
-    checkTimeInterval(o.timeInterval);
+    checkTimeInterval(o.timeInterval as api.TimeInterval);
     checkUnnamed2102(o.values);
   }
   buildCounterPointData--;
@@ -2465,8 +2466,8 @@
 
 void checkUnnamed2103(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.List<api.TimeSeriesData> buildUnnamed2104() {
@@ -2478,8 +2479,8 @@
 
 void checkUnnamed2104(core.List<api.TimeSeriesData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTimeSeriesData(o[0]);
-  checkTimeSeriesData(o[1]);
+  checkTimeSeriesData(o[0] as api.TimeSeriesData);
+  checkTimeSeriesData(o[1] as api.TimeSeriesData);
 }
 
 core.int buildCounterQueryTimeSeriesResponse = 0;
@@ -2502,7 +2503,8 @@
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     checkUnnamed2103(o.partialErrors);
     checkUnnamed2104(o.timeSeriesData);
-    checkTimeSeriesDescriptor(o.timeSeriesDescriptor);
+    checkTimeSeriesDescriptor(
+        o.timeSeriesDescriptor as api.TimeSeriesDescriptor);
   }
   buildCounterQueryTimeSeriesResponse--;
 }
@@ -2543,8 +2545,8 @@
 void checkRequestBasedSli(api.RequestBasedSli o) {
   buildCounterRequestBasedSli++;
   if (buildCounterRequestBasedSli < 3) {
-    checkDistributionCut(o.distributionCut);
-    checkTimeSeriesRatio(o.goodTotalRatio);
+    checkDistributionCut(o.distributionCut as api.DistributionCut);
+    checkTimeSeriesRatio(o.goodTotalRatio as api.TimeSeriesRatio);
   }
   buildCounterRequestBasedSli--;
 }
@@ -2608,14 +2610,14 @@
 void checkService(api.Service o) {
   buildCounterService++;
   if (buildCounterService < 3) {
-    checkAppEngine(o.appEngine);
-    checkCloudEndpoints(o.cloudEndpoints);
-    checkClusterIstio(o.clusterIstio);
-    checkCustom(o.custom);
+    checkAppEngine(o.appEngine as api.AppEngine);
+    checkCloudEndpoints(o.cloudEndpoints as api.CloudEndpoints);
+    checkClusterIstio(o.clusterIstio as api.ClusterIstio);
+    checkCustom(o.custom as api.Custom);
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkMeshIstio(o.meshIstio);
+    checkMeshIstio(o.meshIstio as api.MeshIstio);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkTelemetry(o.telemetry);
+    checkTelemetry(o.telemetry as api.Telemetry);
   }
   buildCounterService--;
 }
@@ -2636,9 +2638,9 @@
 void checkServiceLevelIndicator(api.ServiceLevelIndicator o) {
   buildCounterServiceLevelIndicator++;
   if (buildCounterServiceLevelIndicator < 3) {
-    checkBasicSli(o.basicSli);
-    checkRequestBasedSli(o.requestBased);
-    checkWindowsBasedSli(o.windowsBased);
+    checkBasicSli(o.basicSli as api.BasicSli);
+    checkRequestBasedSli(o.requestBased as api.RequestBasedSli);
+    checkWindowsBasedSli(o.windowsBased as api.WindowsBasedSli);
   }
   buildCounterServiceLevelIndicator--;
 }
@@ -2667,7 +2669,8 @@
     unittest.expect(o.goal, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.rollingPeriod, unittest.equals('foo'));
-    checkServiceLevelIndicator(o.serviceLevelIndicator);
+    checkServiceLevelIndicator(
+        o.serviceLevelIndicator as api.ServiceLevelIndicator);
   }
   buildCounterServiceLevelObjective--;
 }
@@ -2843,8 +2846,8 @@
 
 void checkUnnamed2107(core.List<api.Point> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPoint(o[0]);
-  checkPoint(o[1]);
+  checkPoint(o[0] as api.Point);
+  checkPoint(o[1] as api.Point);
 }
 
 core.int buildCounterTimeSeries = 0;
@@ -2867,11 +2870,11 @@
 void checkTimeSeries(api.TimeSeries o) {
   buildCounterTimeSeries++;
   if (buildCounterTimeSeries < 3) {
-    checkMonitoredResourceMetadata(o.metadata);
-    checkMetric(o.metric);
+    checkMonitoredResourceMetadata(o.metadata as api.MonitoredResourceMetadata);
+    checkMetric(o.metric as api.Metric);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     checkUnnamed2107(o.points);
-    checkMonitoredResource(o.resource);
+    checkMonitoredResource(o.resource as api.MonitoredResource);
     unittest.expect(o.unit, unittest.equals('foo'));
     unittest.expect(o.valueType, unittest.equals('foo'));
   }
@@ -2887,8 +2890,8 @@
 
 void checkUnnamed2108(core.List<api.LabelValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelValue(o[0]);
-  checkLabelValue(o[1]);
+  checkLabelValue(o[0] as api.LabelValue);
+  checkLabelValue(o[1] as api.LabelValue);
 }
 
 core.List<api.PointData> buildUnnamed2109() {
@@ -2900,8 +2903,8 @@
 
 void checkUnnamed2109(core.List<api.PointData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPointData(o[0]);
-  checkPointData(o[1]);
+  checkPointData(o[0] as api.PointData);
+  checkPointData(o[1] as api.PointData);
 }
 
 core.int buildCounterTimeSeriesData = 0;
@@ -2934,8 +2937,8 @@
 
 void checkUnnamed2110(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.List<api.ValueDescriptor> buildUnnamed2111() {
@@ -2947,8 +2950,8 @@
 
 void checkUnnamed2111(core.List<api.ValueDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValueDescriptor(o[0]);
-  checkValueDescriptor(o[1]);
+  checkValueDescriptor(o[0] as api.ValueDescriptor);
+  checkValueDescriptor(o[1] as api.ValueDescriptor);
 }
 
 core.int buildCounterTimeSeriesDescriptor = 0;
@@ -3025,8 +3028,8 @@
 
 void checkUnnamed2112(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkField(o[0]);
-  checkField(o[1]);
+  checkField(o[0] as api.Field);
+  checkField(o[1] as api.Field);
 }
 
 core.List<core.String> buildUnnamed2113() {
@@ -3051,8 +3054,8 @@
 
 void checkUnnamed2114(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterType = 0;
@@ -3078,7 +3081,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2113(o.oneofs);
     checkUnnamed2114(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterType--;
@@ -3103,7 +3106,7 @@
   buildCounterTypedValue++;
   if (buildCounterTypedValue < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
-    checkDistribution(o.distributionValue);
+    checkDistribution(o.distributionValue as api.Distribution);
     unittest.expect(o.doubleValue, unittest.equals(42.0));
     unittest.expect(o.int64Value, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
@@ -3120,8 +3123,8 @@
 
 void checkUnnamed2115(core.List<api.ContentMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContentMatcher(o[0]);
-  checkContentMatcher(o[1]);
+  checkContentMatcher(o[0] as api.ContentMatcher);
+  checkContentMatcher(o[1] as api.ContentMatcher);
 }
 
 core.List<api.InternalChecker> buildUnnamed2116() {
@@ -3133,8 +3136,8 @@
 
 void checkUnnamed2116(core.List<api.InternalChecker> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInternalChecker(o[0]);
-  checkInternalChecker(o[1]);
+  checkInternalChecker(o[0] as api.InternalChecker);
+  checkInternalChecker(o[1] as api.InternalChecker);
 }
 
 core.List<core.String> buildUnnamed2117() {
@@ -3177,15 +3180,15 @@
   if (buildCounterUptimeCheckConfig < 3) {
     checkUnnamed2115(o.contentMatchers);
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkHttpCheck(o.httpCheck);
+    checkHttpCheck(o.httpCheck as api.HttpCheck);
     checkUnnamed2116(o.internalCheckers);
     unittest.expect(o.isInternal, unittest.isTrue);
-    checkMonitoredResource(o.monitoredResource);
+    checkMonitoredResource(o.monitoredResource as api.MonitoredResource);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.period, unittest.equals('foo'));
-    checkResourceGroup(o.resourceGroup);
+    checkResourceGroup(o.resourceGroup as api.ResourceGroup);
     checkUnnamed2117(o.selectedRegions);
-    checkTcpCheck(o.tcpCheck);
+    checkTcpCheck(o.tcpCheck as api.TcpCheck);
     unittest.expect(o.timeout, unittest.equals('foo'));
   }
   buildCounterUptimeCheckConfig--;
@@ -3278,9 +3281,10 @@
   buildCounterWindowsBasedSli++;
   if (buildCounterWindowsBasedSli < 3) {
     unittest.expect(o.goodBadMetricFilter, unittest.equals('foo'));
-    checkPerformanceThreshold(o.goodTotalRatioThreshold);
-    checkMetricRange(o.metricMeanInRange);
-    checkMetricRange(o.metricSumInRange);
+    checkPerformanceThreshold(
+        o.goodTotalRatioThreshold as api.PerformanceThreshold);
+    checkMetricRange(o.metricMeanInRange as api.MetricRange);
+    checkMetricRange(o.metricSumInRange as api.MetricRange);
     unittest.expect(o.windowPeriod, unittest.equals('foo'));
   }
   buildCounterWindowsBasedSli--;
@@ -3304,7 +3308,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAggregation();
       var od = api.Aggregation.fromJson(o.toJson());
-      checkAggregation(od);
+      checkAggregation(od as api.Aggregation);
     });
   });
 
@@ -3312,7 +3316,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAlertPolicy();
       var od = api.AlertPolicy.fromJson(o.toJson());
-      checkAlertPolicy(od);
+      checkAlertPolicy(od as api.AlertPolicy);
     });
   });
 
@@ -3320,7 +3324,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppEngine();
       var od = api.AppEngine.fromJson(o.toJson());
-      checkAppEngine(od);
+      checkAppEngine(od as api.AppEngine);
     });
   });
 
@@ -3328,7 +3332,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAvailabilityCriteria();
       var od = api.AvailabilityCriteria.fromJson(o.toJson());
-      checkAvailabilityCriteria(od);
+      checkAvailabilityCriteria(od as api.AvailabilityCriteria);
     });
   });
 
@@ -3336,7 +3340,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicAuthentication();
       var od = api.BasicAuthentication.fromJson(o.toJson());
-      checkBasicAuthentication(od);
+      checkBasicAuthentication(od as api.BasicAuthentication);
     });
   });
 
@@ -3344,7 +3348,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicSli();
       var od = api.BasicSli.fromJson(o.toJson());
-      checkBasicSli(od);
+      checkBasicSli(od as api.BasicSli);
     });
   });
 
@@ -3352,7 +3356,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketOptions();
       var od = api.BucketOptions.fromJson(o.toJson());
-      checkBucketOptions(od);
+      checkBucketOptions(od as api.BucketOptions);
     });
   });
 
@@ -3360,7 +3364,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudEndpoints();
       var od = api.CloudEndpoints.fromJson(o.toJson());
-      checkCloudEndpoints(od);
+      checkCloudEndpoints(od as api.CloudEndpoints);
     });
   });
 
@@ -3368,7 +3372,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClusterIstio();
       var od = api.ClusterIstio.fromJson(o.toJson());
-      checkClusterIstio(od);
+      checkClusterIstio(od as api.ClusterIstio);
     });
   });
 
@@ -3376,7 +3380,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCollectdPayload();
       var od = api.CollectdPayload.fromJson(o.toJson());
-      checkCollectdPayload(od);
+      checkCollectdPayload(od as api.CollectdPayload);
     });
   });
 
@@ -3384,7 +3388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCollectdPayloadError();
       var od = api.CollectdPayloadError.fromJson(o.toJson());
-      checkCollectdPayloadError(od);
+      checkCollectdPayloadError(od as api.CollectdPayloadError);
     });
   });
 
@@ -3392,7 +3396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCollectdValue();
       var od = api.CollectdValue.fromJson(o.toJson());
-      checkCollectdValue(od);
+      checkCollectdValue(od as api.CollectdValue);
     });
   });
 
@@ -3400,7 +3404,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCollectdValueError();
       var od = api.CollectdValueError.fromJson(o.toJson());
-      checkCollectdValueError(od);
+      checkCollectdValueError(od as api.CollectdValueError);
     });
   });
 
@@ -3408,7 +3412,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCondition();
       var od = api.Condition.fromJson(o.toJson());
-      checkCondition(od);
+      checkCondition(od as api.Condition);
     });
   });
 
@@ -3416,7 +3420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContentMatcher();
       var od = api.ContentMatcher.fromJson(o.toJson());
-      checkContentMatcher(od);
+      checkContentMatcher(od as api.ContentMatcher);
     });
   });
 
@@ -3424,7 +3428,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateCollectdTimeSeriesRequest();
       var od = api.CreateCollectdTimeSeriesRequest.fromJson(o.toJson());
-      checkCreateCollectdTimeSeriesRequest(od);
+      checkCreateCollectdTimeSeriesRequest(
+          od as api.CreateCollectdTimeSeriesRequest);
     });
   });
 
@@ -3432,7 +3437,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateCollectdTimeSeriesResponse();
       var od = api.CreateCollectdTimeSeriesResponse.fromJson(o.toJson());
-      checkCreateCollectdTimeSeriesResponse(od);
+      checkCreateCollectdTimeSeriesResponse(
+          od as api.CreateCollectdTimeSeriesResponse);
     });
   });
 
@@ -3440,7 +3446,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateTimeSeriesRequest();
       var od = api.CreateTimeSeriesRequest.fromJson(o.toJson());
-      checkCreateTimeSeriesRequest(od);
+      checkCreateTimeSeriesRequest(od as api.CreateTimeSeriesRequest);
     });
   });
 
@@ -3448,7 +3454,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateTimeSeriesSummary();
       var od = api.CreateTimeSeriesSummary.fromJson(o.toJson());
-      checkCreateTimeSeriesSummary(od);
+      checkCreateTimeSeriesSummary(od as api.CreateTimeSeriesSummary);
     });
   });
 
@@ -3456,7 +3462,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustom();
       var od = api.Custom.fromJson(o.toJson());
-      checkCustom(od);
+      checkCustom(od as api.Custom);
     });
   });
 
@@ -3464,7 +3470,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDistribution();
       var od = api.Distribution.fromJson(o.toJson());
-      checkDistribution(od);
+      checkDistribution(od as api.Distribution);
     });
   });
 
@@ -3472,7 +3478,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDistributionCut();
       var od = api.DistributionCut.fromJson(o.toJson());
-      checkDistributionCut(od);
+      checkDistributionCut(od as api.DistributionCut);
     });
   });
 
@@ -3480,7 +3486,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentation();
       var od = api.Documentation.fromJson(o.toJson());
-      checkDocumentation(od);
+      checkDocumentation(od as api.Documentation);
     });
   });
 
@@ -3488,7 +3494,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDroppedLabels();
       var od = api.DroppedLabels.fromJson(o.toJson());
-      checkDroppedLabels(od);
+      checkDroppedLabels(od as api.DroppedLabels);
     });
   });
 
@@ -3496,7 +3502,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3504,7 +3510,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildError();
       var od = api.Error.fromJson(o.toJson());
-      checkError(od);
+      checkError(od as api.Error);
     });
   });
 
@@ -3512,7 +3518,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExemplar();
       var od = api.Exemplar.fromJson(o.toJson());
-      checkExemplar(od);
+      checkExemplar(od as api.Exemplar);
     });
   });
 
@@ -3520,7 +3526,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExplicit();
       var od = api.Explicit.fromJson(o.toJson());
-      checkExplicit(od);
+      checkExplicit(od as api.Explicit);
     });
   });
 
@@ -3528,7 +3534,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExponential();
       var od = api.Exponential.fromJson(o.toJson());
-      checkExponential(od);
+      checkExponential(od as api.Exponential);
     });
   });
 
@@ -3536,7 +3542,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildField();
       var od = api.Field.fromJson(o.toJson());
-      checkField(od);
+      checkField(od as api.Field);
     });
   });
 
@@ -3546,7 +3552,8 @@
       var o = buildGetNotificationChannelVerificationCodeRequest();
       var od = api.GetNotificationChannelVerificationCodeRequest.fromJson(
           o.toJson());
-      checkGetNotificationChannelVerificationCodeRequest(od);
+      checkGetNotificationChannelVerificationCodeRequest(
+          od as api.GetNotificationChannelVerificationCodeRequest);
     });
   });
 
@@ -3556,7 +3563,8 @@
       var o = buildGetNotificationChannelVerificationCodeResponse();
       var od = api.GetNotificationChannelVerificationCodeResponse.fromJson(
           o.toJson());
-      checkGetNotificationChannelVerificationCodeResponse(od);
+      checkGetNotificationChannelVerificationCodeResponse(
+          od as api.GetNotificationChannelVerificationCodeResponse);
     });
   });
 
@@ -3564,7 +3572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleMonitoringV3Range();
       var od = api.GoogleMonitoringV3Range.fromJson(o.toJson());
-      checkGoogleMonitoringV3Range(od);
+      checkGoogleMonitoringV3Range(od as api.GoogleMonitoringV3Range);
     });
   });
 
@@ -3572,7 +3580,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroup();
       var od = api.Group.fromJson(o.toJson());
-      checkGroup(od);
+      checkGroup(od as api.Group);
     });
   });
 
@@ -3580,7 +3588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpCheck();
       var od = api.HttpCheck.fromJson(o.toJson());
-      checkHttpCheck(od);
+      checkHttpCheck(od as api.HttpCheck);
     });
   });
 
@@ -3588,7 +3596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInternalChecker();
       var od = api.InternalChecker.fromJson(o.toJson());
-      checkInternalChecker(od);
+      checkInternalChecker(od as api.InternalChecker);
     });
   });
 
@@ -3596,7 +3604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelDescriptor();
       var od = api.LabelDescriptor.fromJson(o.toJson());
-      checkLabelDescriptor(od);
+      checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
 
@@ -3604,7 +3612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelValue();
       var od = api.LabelValue.fromJson(o.toJson());
-      checkLabelValue(od);
+      checkLabelValue(od as api.LabelValue);
     });
   });
 
@@ -3612,7 +3620,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatencyCriteria();
       var od = api.LatencyCriteria.fromJson(o.toJson());
-      checkLatencyCriteria(od);
+      checkLatencyCriteria(od as api.LatencyCriteria);
     });
   });
 
@@ -3620,7 +3628,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinear();
       var od = api.Linear.fromJson(o.toJson());
-      checkLinear(od);
+      checkLinear(od as api.Linear);
     });
   });
 
@@ -3628,7 +3636,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAlertPoliciesResponse();
       var od = api.ListAlertPoliciesResponse.fromJson(o.toJson());
-      checkListAlertPoliciesResponse(od);
+      checkListAlertPoliciesResponse(od as api.ListAlertPoliciesResponse);
     });
   });
 
@@ -3636,7 +3644,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGroupMembersResponse();
       var od = api.ListGroupMembersResponse.fromJson(o.toJson());
-      checkListGroupMembersResponse(od);
+      checkListGroupMembersResponse(od as api.ListGroupMembersResponse);
     });
   });
 
@@ -3644,7 +3652,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGroupsResponse();
       var od = api.ListGroupsResponse.fromJson(o.toJson());
-      checkListGroupsResponse(od);
+      checkListGroupsResponse(od as api.ListGroupsResponse);
     });
   });
 
@@ -3652,7 +3660,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListMetricDescriptorsResponse();
       var od = api.ListMetricDescriptorsResponse.fromJson(o.toJson());
-      checkListMetricDescriptorsResponse(od);
+      checkListMetricDescriptorsResponse(
+          od as api.ListMetricDescriptorsResponse);
     });
   });
 
@@ -3661,7 +3670,8 @@
       var o = buildListMonitoredResourceDescriptorsResponse();
       var od =
           api.ListMonitoredResourceDescriptorsResponse.fromJson(o.toJson());
-      checkListMonitoredResourceDescriptorsResponse(od);
+      checkListMonitoredResourceDescriptorsResponse(
+          od as api.ListMonitoredResourceDescriptorsResponse);
     });
   });
 
@@ -3670,7 +3680,8 @@
       var o = buildListNotificationChannelDescriptorsResponse();
       var od =
           api.ListNotificationChannelDescriptorsResponse.fromJson(o.toJson());
-      checkListNotificationChannelDescriptorsResponse(od);
+      checkListNotificationChannelDescriptorsResponse(
+          od as api.ListNotificationChannelDescriptorsResponse);
     });
   });
 
@@ -3678,7 +3689,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListNotificationChannelsResponse();
       var od = api.ListNotificationChannelsResponse.fromJson(o.toJson());
-      checkListNotificationChannelsResponse(od);
+      checkListNotificationChannelsResponse(
+          od as api.ListNotificationChannelsResponse);
     });
   });
 
@@ -3686,7 +3698,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServiceLevelObjectivesResponse();
       var od = api.ListServiceLevelObjectivesResponse.fromJson(o.toJson());
-      checkListServiceLevelObjectivesResponse(od);
+      checkListServiceLevelObjectivesResponse(
+          od as api.ListServiceLevelObjectivesResponse);
     });
   });
 
@@ -3694,7 +3707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServicesResponse();
       var od = api.ListServicesResponse.fromJson(o.toJson());
-      checkListServicesResponse(od);
+      checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
 
@@ -3702,7 +3715,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTimeSeriesResponse();
       var od = api.ListTimeSeriesResponse.fromJson(o.toJson());
-      checkListTimeSeriesResponse(od);
+      checkListTimeSeriesResponse(od as api.ListTimeSeriesResponse);
     });
   });
 
@@ -3710,7 +3723,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUptimeCheckConfigsResponse();
       var od = api.ListUptimeCheckConfigsResponse.fromJson(o.toJson());
-      checkListUptimeCheckConfigsResponse(od);
+      checkListUptimeCheckConfigsResponse(
+          od as api.ListUptimeCheckConfigsResponse);
     });
   });
 
@@ -3718,7 +3732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUptimeCheckIpsResponse();
       var od = api.ListUptimeCheckIpsResponse.fromJson(o.toJson());
-      checkListUptimeCheckIpsResponse(od);
+      checkListUptimeCheckIpsResponse(od as api.ListUptimeCheckIpsResponse);
     });
   });
 
@@ -3726,7 +3740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMeshIstio();
       var od = api.MeshIstio.fromJson(o.toJson());
-      checkMeshIstio(od);
+      checkMeshIstio(od as api.MeshIstio);
     });
   });
 
@@ -3734,7 +3748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetric();
       var od = api.Metric.fromJson(o.toJson());
-      checkMetric(od);
+      checkMetric(od as api.Metric);
     });
   });
 
@@ -3742,7 +3756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricAbsence();
       var od = api.MetricAbsence.fromJson(o.toJson());
-      checkMetricAbsence(od);
+      checkMetricAbsence(od as api.MetricAbsence);
     });
   });
 
@@ -3750,7 +3764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptor();
       var od = api.MetricDescriptor.fromJson(o.toJson());
-      checkMetricDescriptor(od);
+      checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
 
@@ -3758,7 +3772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptorMetadata();
       var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
-      checkMetricDescriptorMetadata(od);
+      checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
 
@@ -3766,7 +3780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricRange();
       var od = api.MetricRange.fromJson(o.toJson());
-      checkMetricRange(od);
+      checkMetricRange(od as api.MetricRange);
     });
   });
 
@@ -3774,7 +3788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricThreshold();
       var od = api.MetricThreshold.fromJson(o.toJson());
-      checkMetricThreshold(od);
+      checkMetricThreshold(od as api.MetricThreshold);
     });
   });
 
@@ -3782,7 +3796,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResource();
       var od = api.MonitoredResource.fromJson(o.toJson());
-      checkMonitoredResource(od);
+      checkMonitoredResource(od as api.MonitoredResource);
     });
   });
 
@@ -3790,7 +3804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceDescriptor();
       var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
-      checkMonitoredResourceDescriptor(od);
+      checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
 
@@ -3798,7 +3812,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceMetadata();
       var od = api.MonitoredResourceMetadata.fromJson(o.toJson());
-      checkMonitoredResourceMetadata(od);
+      checkMonitoredResourceMetadata(od as api.MonitoredResourceMetadata);
     });
   });
 
@@ -3806,7 +3820,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoringQueryLanguageCondition();
       var od = api.MonitoringQueryLanguageCondition.fromJson(o.toJson());
-      checkMonitoringQueryLanguageCondition(od);
+      checkMonitoringQueryLanguageCondition(
+          od as api.MonitoringQueryLanguageCondition);
     });
   });
 
@@ -3814,7 +3829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMutationRecord();
       var od = api.MutationRecord.fromJson(o.toJson());
-      checkMutationRecord(od);
+      checkMutationRecord(od as api.MutationRecord);
     });
   });
 
@@ -3822,7 +3837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationChannel();
       var od = api.NotificationChannel.fromJson(o.toJson());
-      checkNotificationChannel(od);
+      checkNotificationChannel(od as api.NotificationChannel);
     });
   });
 
@@ -3830,7 +3845,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationChannelDescriptor();
       var od = api.NotificationChannelDescriptor.fromJson(o.toJson());
-      checkNotificationChannelDescriptor(od);
+      checkNotificationChannelDescriptor(
+          od as api.NotificationChannelDescriptor);
     });
   });
 
@@ -3838,7 +3854,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOption();
       var od = api.Option.fromJson(o.toJson());
-      checkOption(od);
+      checkOption(od as api.Option);
     });
   });
 
@@ -3846,7 +3862,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerformanceThreshold();
       var od = api.PerformanceThreshold.fromJson(o.toJson());
-      checkPerformanceThreshold(od);
+      checkPerformanceThreshold(od as api.PerformanceThreshold);
     });
   });
 
@@ -3854,7 +3870,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPoint();
       var od = api.Point.fromJson(o.toJson());
-      checkPoint(od);
+      checkPoint(od as api.Point);
     });
   });
 
@@ -3862,7 +3878,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPointData();
       var od = api.PointData.fromJson(o.toJson());
-      checkPointData(od);
+      checkPointData(od as api.PointData);
     });
   });
 
@@ -3870,7 +3886,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryTimeSeriesRequest();
       var od = api.QueryTimeSeriesRequest.fromJson(o.toJson());
-      checkQueryTimeSeriesRequest(od);
+      checkQueryTimeSeriesRequest(od as api.QueryTimeSeriesRequest);
     });
   });
 
@@ -3878,7 +3894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryTimeSeriesResponse();
       var od = api.QueryTimeSeriesResponse.fromJson(o.toJson());
-      checkQueryTimeSeriesResponse(od);
+      checkQueryTimeSeriesResponse(od as api.QueryTimeSeriesResponse);
     });
   });
 
@@ -3886,7 +3902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRange();
       var od = api.Range.fromJson(o.toJson());
-      checkRange(od);
+      checkRange(od as api.Range);
     });
   });
 
@@ -3894,7 +3910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestBasedSli();
       var od = api.RequestBasedSli.fromJson(o.toJson());
-      checkRequestBasedSli(od);
+      checkRequestBasedSli(od as api.RequestBasedSli);
     });
   });
 
@@ -3902,7 +3918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceGroup();
       var od = api.ResourceGroup.fromJson(o.toJson());
-      checkResourceGroup(od);
+      checkResourceGroup(od as api.ResourceGroup);
     });
   });
 
@@ -3912,7 +3928,8 @@
       var o = buildSendNotificationChannelVerificationCodeRequest();
       var od = api.SendNotificationChannelVerificationCodeRequest.fromJson(
           o.toJson());
-      checkSendNotificationChannelVerificationCodeRequest(od);
+      checkSendNotificationChannelVerificationCodeRequest(
+          od as api.SendNotificationChannelVerificationCodeRequest);
     });
   });
 
@@ -3920,7 +3937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -3928,7 +3945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceLevelIndicator();
       var od = api.ServiceLevelIndicator.fromJson(o.toJson());
-      checkServiceLevelIndicator(od);
+      checkServiceLevelIndicator(od as api.ServiceLevelIndicator);
     });
   });
 
@@ -3936,7 +3953,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceLevelObjective();
       var od = api.ServiceLevelObjective.fromJson(o.toJson());
-      checkServiceLevelObjective(od);
+      checkServiceLevelObjective(od as api.ServiceLevelObjective);
     });
   });
 
@@ -3944,7 +3961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceContext();
       var od = api.SourceContext.fromJson(o.toJson());
-      checkSourceContext(od);
+      checkSourceContext(od as api.SourceContext);
     });
   });
 
@@ -3952,7 +3969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpanContext();
       var od = api.SpanContext.fromJson(o.toJson());
-      checkSpanContext(od);
+      checkSpanContext(od as api.SpanContext);
     });
   });
 
@@ -3960,7 +3977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3968,7 +3985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTcpCheck();
       var od = api.TcpCheck.fromJson(o.toJson());
-      checkTcpCheck(od);
+      checkTcpCheck(od as api.TcpCheck);
     });
   });
 
@@ -3976,7 +3993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTelemetry();
       var od = api.Telemetry.fromJson(o.toJson());
-      checkTelemetry(od);
+      checkTelemetry(od as api.Telemetry);
     });
   });
 
@@ -3984,7 +4001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeInterval();
       var od = api.TimeInterval.fromJson(o.toJson());
-      checkTimeInterval(od);
+      checkTimeInterval(od as api.TimeInterval);
     });
   });
 
@@ -3992,7 +4009,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeSeries();
       var od = api.TimeSeries.fromJson(o.toJson());
-      checkTimeSeries(od);
+      checkTimeSeries(od as api.TimeSeries);
     });
   });
 
@@ -4000,7 +4017,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeSeriesData();
       var od = api.TimeSeriesData.fromJson(o.toJson());
-      checkTimeSeriesData(od);
+      checkTimeSeriesData(od as api.TimeSeriesData);
     });
   });
 
@@ -4008,7 +4025,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeSeriesDescriptor();
       var od = api.TimeSeriesDescriptor.fromJson(o.toJson());
-      checkTimeSeriesDescriptor(od);
+      checkTimeSeriesDescriptor(od as api.TimeSeriesDescriptor);
     });
   });
 
@@ -4016,7 +4033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeSeriesRatio();
       var od = api.TimeSeriesRatio.fromJson(o.toJson());
-      checkTimeSeriesRatio(od);
+      checkTimeSeriesRatio(od as api.TimeSeriesRatio);
     });
   });
 
@@ -4024,7 +4041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrigger();
       var od = api.Trigger.fromJson(o.toJson());
-      checkTrigger(od);
+      checkTrigger(od as api.Trigger);
     });
   });
 
@@ -4032,7 +4049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildType();
       var od = api.Type.fromJson(o.toJson());
-      checkType(od);
+      checkType(od as api.Type);
     });
   });
 
@@ -4040,7 +4057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTypedValue();
       var od = api.TypedValue.fromJson(o.toJson());
-      checkTypedValue(od);
+      checkTypedValue(od as api.TypedValue);
     });
   });
 
@@ -4048,7 +4065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUptimeCheckConfig();
       var od = api.UptimeCheckConfig.fromJson(o.toJson());
-      checkUptimeCheckConfig(od);
+      checkUptimeCheckConfig(od as api.UptimeCheckConfig);
     });
   });
 
@@ -4056,7 +4073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUptimeCheckIp();
       var od = api.UptimeCheckIp.fromJson(o.toJson());
-      checkUptimeCheckIp(od);
+      checkUptimeCheckIp(od as api.UptimeCheckIp);
     });
   });
 
@@ -4064,7 +4081,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValueDescriptor();
       var od = api.ValueDescriptor.fromJson(o.toJson());
-      checkValueDescriptor(od);
+      checkValueDescriptor(od as api.ValueDescriptor);
     });
   });
 
@@ -4072,7 +4089,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerifyNotificationChannelRequest();
       var od = api.VerifyNotificationChannelRequest.fromJson(o.toJson());
-      checkVerifyNotificationChannelRequest(od);
+      checkVerifyNotificationChannelRequest(
+          od as api.VerifyNotificationChannelRequest);
     });
   });
 
@@ -4080,7 +4098,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWindowsBasedSli();
       var od = api.WindowsBasedSli.fromJson(o.toJson());
-      checkWindowsBasedSli(od);
+      checkWindowsBasedSli(od as api.WindowsBasedSli);
     });
   });
 
@@ -4092,8 +4110,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AlertPolicy.fromJson(json);
-        checkAlertPolicy(obj);
+        var obj = api.AlertPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAlertPolicy(obj as api.AlertPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4133,7 +4152,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAlertPolicy(response);
+        checkAlertPolicy(response as api.AlertPolicy);
       })));
     });
 
@@ -4181,7 +4200,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4229,7 +4248,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAlertPolicy(response);
+        checkAlertPolicy(response as api.AlertPolicy);
       })));
     });
 
@@ -4293,7 +4312,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAlertPoliciesResponse(response);
+        checkListAlertPoliciesResponse(
+            response as api.ListAlertPoliciesResponse);
       })));
     });
 
@@ -4305,8 +4325,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AlertPolicy.fromJson(json);
-        checkAlertPolicy(obj);
+        var obj = api.AlertPolicy.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAlertPolicy(obj as api.AlertPolicy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4349,7 +4370,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAlertPolicy(response);
+        checkAlertPolicy(response as api.AlertPolicy);
       })));
     });
   });
@@ -4362,8 +4383,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateCollectdTimeSeriesRequest.fromJson(json);
-        checkCreateCollectdTimeSeriesRequest(obj);
+        var obj = api.CreateCollectdTimeSeriesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateCollectdTimeSeriesRequest(
+            obj as api.CreateCollectdTimeSeriesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4403,7 +4426,8 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateCollectdTimeSeriesResponse(response);
+        checkCreateCollectdTimeSeriesResponse(
+            response as api.CreateCollectdTimeSeriesResponse);
       })));
     });
   });
@@ -4417,8 +4441,9 @@
       var arg_validateOnly = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4461,7 +4486,7 @@
           .create(arg_request, arg_name,
               validateOnly: arg_validateOnly, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
 
@@ -4512,7 +4537,7 @@
       res
           .delete(arg_name, recursive: arg_recursive, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4560,7 +4585,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
 
@@ -4629,7 +4654,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGroupsResponse(response);
+        checkListGroupsResponse(response as api.ListGroupsResponse);
       })));
     });
 
@@ -4641,8 +4666,9 @@
       var arg_validateOnly = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4685,7 +4711,7 @@
           .update(arg_request, arg_name,
               validateOnly: arg_validateOnly, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
   });
@@ -4755,7 +4781,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGroupMembersResponse(response);
+        checkListGroupMembersResponse(response as api.ListGroupMembersResponse);
       })));
     });
   });
@@ -4768,8 +4794,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.MetricDescriptor.fromJson(json);
-        checkMetricDescriptor(obj);
+        var obj = api.MetricDescriptor.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkMetricDescriptor(obj as api.MetricDescriptor);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4809,7 +4836,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMetricDescriptor(response);
+        checkMetricDescriptor(response as api.MetricDescriptor);
       })));
     });
 
@@ -4857,7 +4884,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4905,7 +4932,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMetricDescriptor(response);
+        checkMetricDescriptor(response as api.MetricDescriptor);
       })));
     });
 
@@ -4965,7 +4992,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMetricDescriptorsResponse(response);
+        checkListMetricDescriptorsResponse(
+            response as api.ListMetricDescriptorsResponse);
       })));
     });
   });
@@ -5016,7 +5044,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMonitoredResourceDescriptor(response);
+        checkMonitoredResourceDescriptor(
+            response as api.MonitoredResourceDescriptor);
       })));
     });
 
@@ -5077,7 +5106,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMonitoredResourceDescriptorsResponse(response);
+        checkListMonitoredResourceDescriptorsResponse(
+            response as api.ListMonitoredResourceDescriptorsResponse);
       })));
     });
   });
@@ -5128,7 +5158,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationChannelDescriptor(response);
+        checkNotificationChannelDescriptor(
+            response as api.NotificationChannelDescriptor);
       })));
     });
 
@@ -5186,7 +5217,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNotificationChannelDescriptorsResponse(response);
+        checkListNotificationChannelDescriptorsResponse(
+            response as api.ListNotificationChannelDescriptorsResponse);
       })));
     });
   });
@@ -5199,8 +5231,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NotificationChannel.fromJson(json);
-        checkNotificationChannel(obj);
+        var obj = api.NotificationChannel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNotificationChannel(obj as api.NotificationChannel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5240,7 +5273,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationChannel(response);
+        checkNotificationChannel(response as api.NotificationChannel);
       })));
     });
 
@@ -5290,7 +5323,7 @@
       res
           .delete(arg_name, force: arg_force, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5338,7 +5371,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationChannel(response);
+        checkNotificationChannel(response as api.NotificationChannel);
       })));
     });
 
@@ -5349,9 +5382,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.GetNotificationChannelVerificationCodeRequest.fromJson(json);
-        checkGetNotificationChannelVerificationCodeRequest(obj);
+        var obj = api.GetNotificationChannelVerificationCodeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetNotificationChannelVerificationCodeRequest(
+            obj as api.GetNotificationChannelVerificationCodeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5392,7 +5426,8 @@
       res
           .getVerificationCode(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetNotificationChannelVerificationCodeResponse(response);
+        checkGetNotificationChannelVerificationCodeResponse(
+            response as api.GetNotificationChannelVerificationCodeResponse);
       })));
     });
 
@@ -5456,7 +5491,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNotificationChannelsResponse(response);
+        checkListNotificationChannelsResponse(
+            response as api.ListNotificationChannelsResponse);
       })));
     });
 
@@ -5468,8 +5504,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NotificationChannel.fromJson(json);
-        checkNotificationChannel(obj);
+        var obj = api.NotificationChannel.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNotificationChannel(obj as api.NotificationChannel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5512,7 +5549,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationChannel(response);
+        checkNotificationChannel(response as api.NotificationChannel);
       })));
     });
 
@@ -5523,9 +5560,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.SendNotificationChannelVerificationCodeRequest.fromJson(json);
-        checkSendNotificationChannelVerificationCodeRequest(obj);
+        var obj = api.SendNotificationChannelVerificationCodeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSendNotificationChannelVerificationCodeRequest(
+            obj as api.SendNotificationChannelVerificationCodeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5565,7 +5603,7 @@
       res
           .sendVerificationCode(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5576,8 +5614,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.VerifyNotificationChannelRequest.fromJson(json);
-        checkVerifyNotificationChannelRequest(obj);
+        var obj = api.VerifyNotificationChannelRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkVerifyNotificationChannelRequest(
+            obj as api.VerifyNotificationChannelRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5617,7 +5657,7 @@
       res
           .verify(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationChannel(response);
+        checkNotificationChannel(response as api.NotificationChannel);
       })));
     });
   });
@@ -5630,8 +5670,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateTimeSeriesRequest.fromJson(json);
-        checkCreateTimeSeriesRequest(obj);
+        var obj = api.CreateTimeSeriesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateTimeSeriesRequest(obj as api.CreateTimeSeriesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5671,7 +5712,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5763,7 +5804,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTimeSeriesResponse(response);
+        checkListTimeSeriesResponse(response as api.ListTimeSeriesResponse);
       })));
     });
 
@@ -5774,8 +5815,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.QueryTimeSeriesRequest.fromJson(json);
-        checkQueryTimeSeriesRequest(obj);
+        var obj = api.QueryTimeSeriesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkQueryTimeSeriesRequest(obj as api.QueryTimeSeriesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5815,7 +5857,7 @@
       res
           .query(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryTimeSeriesResponse(response);
+        checkQueryTimeSeriesResponse(response as api.QueryTimeSeriesResponse);
       })));
     });
   });
@@ -5828,8 +5870,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UptimeCheckConfig.fromJson(json);
-        checkUptimeCheckConfig(obj);
+        var obj = api.UptimeCheckConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUptimeCheckConfig(obj as api.UptimeCheckConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5869,7 +5912,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUptimeCheckConfig(response);
+        checkUptimeCheckConfig(response as api.UptimeCheckConfig);
       })));
     });
 
@@ -5917,7 +5960,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5965,7 +6008,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUptimeCheckConfig(response);
+        checkUptimeCheckConfig(response as api.UptimeCheckConfig);
       })));
     });
 
@@ -6022,7 +6065,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUptimeCheckConfigsResponse(response);
+        checkListUptimeCheckConfigsResponse(
+            response as api.ListUptimeCheckConfigsResponse);
       })));
     });
 
@@ -6034,8 +6078,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UptimeCheckConfig.fromJson(json);
-        checkUptimeCheckConfig(obj);
+        var obj = api.UptimeCheckConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUptimeCheckConfig(obj as api.UptimeCheckConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6078,7 +6123,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUptimeCheckConfig(response);
+        checkUptimeCheckConfig(response as api.UptimeCheckConfig);
       })));
     });
   });
@@ -6092,8 +6137,9 @@
       var arg_serviceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6136,7 +6182,7 @@
           .create(arg_request, arg_parent,
               serviceId: arg_serviceId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -6184,7 +6230,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6232,7 +6278,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -6292,7 +6338,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicesResponse(response);
+        checkListServicesResponse(response as api.ListServicesResponse);
       })));
     });
 
@@ -6304,8 +6350,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6348,7 +6395,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
   });
@@ -6362,8 +6409,9 @@
       var arg_serviceLevelObjectiveId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ServiceLevelObjective.fromJson(json);
-        checkServiceLevelObjective(obj);
+        var obj = api.ServiceLevelObjective.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkServiceLevelObjective(obj as api.ServiceLevelObjective);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6407,7 +6455,7 @@
               serviceLevelObjectiveId: arg_serviceLevelObjectiveId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceLevelObjective(response);
+        checkServiceLevelObjective(response as api.ServiceLevelObjective);
       })));
     });
 
@@ -6455,7 +6503,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6505,7 +6553,7 @@
       res
           .get(arg_name, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceLevelObjective(response);
+        checkServiceLevelObjective(response as api.ServiceLevelObjective);
       })));
     });
 
@@ -6569,7 +6617,8 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServiceLevelObjectivesResponse(response);
+        checkListServiceLevelObjectivesResponse(
+            response as api.ListServiceLevelObjectivesResponse);
       })));
     });
 
@@ -6581,8 +6630,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ServiceLevelObjective.fromJson(json);
-        checkServiceLevelObjective(obj);
+        var obj = api.ServiceLevelObjective.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkServiceLevelObjective(obj as api.ServiceLevelObjective);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6625,7 +6675,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceLevelObjective(response);
+        checkServiceLevelObjective(response as api.ServiceLevelObjective);
       })));
     });
   });
@@ -6682,7 +6732,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUptimeCheckIpsResponse(response);
+        checkListUptimeCheckIpsResponse(
+            response as api.ListUptimeCheckIpsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/networkmanagement/v1_test.dart b/generated/googleapis/test/networkmanagement/v1_test.dart
index 0d3b969..1981664 100644
--- a/generated/googleapis/test/networkmanagement/v1_test.dart
+++ b/generated/googleapis/test/networkmanagement/v1_test.dart
@@ -104,8 +104,8 @@
 
 void checkUnnamed3597(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -192,7 +192,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed3599(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -266,14 +266,14 @@
   if (buildCounterConnectivityTest < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkEndpoint(o.destination);
+    checkEndpoint(o.destination as api.Endpoint);
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed3600(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.protocol, unittest.equals('foo'));
-    checkReachabilityDetails(o.reachabilityDetails);
+    checkReachabilityDetails(o.reachabilityDetails as api.ReachabilityDetails);
     checkUnnamed3601(o.relatedProjects);
-    checkEndpoint(o.source);
+    checkEndpoint(o.source as api.Endpoint);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterConnectivityTest--;
@@ -587,8 +587,8 @@
 
 void checkUnnamed3605(core.List<api.ConnectivityTest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConnectivityTest(o[0]);
-  checkConnectivityTest(o[1]);
+  checkConnectivityTest(o[0] as api.ConnectivityTest);
+  checkConnectivityTest(o[1] as api.ConnectivityTest);
 }
 
 core.List<core.String> buildUnnamed3606() {
@@ -636,8 +636,8 @@
 
 void checkUnnamed3607(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -670,8 +670,8 @@
 
 void checkUnnamed3608(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -757,8 +757,8 @@
 
 void checkUnnamed3611(core.List<api.LoadBalancerBackend> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoadBalancerBackend(o[0]);
-  checkLoadBalancerBackend(o[1]);
+  checkLoadBalancerBackend(o[0] as api.LoadBalancerBackend);
+  checkLoadBalancerBackend(o[1] as api.LoadBalancerBackend);
 }
 
 core.int buildCounterLoadBalancerInfo = 0;
@@ -957,7 +957,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3614(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3615(o.response);
@@ -1005,8 +1005,8 @@
 
 void checkUnnamed3616(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed3617() {
@@ -1018,8 +1018,8 @@
 
 void checkUnnamed3617(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1056,8 +1056,8 @@
 
 void checkUnnamed3618(core.List<api.Trace> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrace(o[0]);
-  checkTrace(o[1]);
+  checkTrace(o[0] as api.Trace);
+  checkTrace(o[1] as api.Trace);
 }
 
 core.int buildCounterReachabilityDetails = 0;
@@ -1077,7 +1077,7 @@
 void checkReachabilityDetails(api.ReachabilityDetails o) {
   buildCounterReachabilityDetails++;
   if (buildCounterReachabilityDetails < 3) {
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     unittest.expect(o.result, unittest.equals('foo'));
     checkUnnamed3618(o.traces);
     unittest.expect(o.verifyTime, unittest.equals('foo'));
@@ -1163,7 +1163,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -1264,23 +1264,23 @@
 void checkStep(api.Step o) {
   buildCounterStep++;
   if (buildCounterStep < 3) {
-    checkAbortInfo(o.abort);
+    checkAbortInfo(o.abort as api.AbortInfo);
     unittest.expect(o.causesDrop, unittest.isTrue);
-    checkDeliverInfo(o.deliver);
+    checkDeliverInfo(o.deliver as api.DeliverInfo);
     unittest.expect(o.description, unittest.equals('foo'));
-    checkDropInfo(o.drop);
-    checkEndpointInfo(o.endpoint);
-    checkFirewallInfo(o.firewall);
-    checkForwardInfo(o.forward);
-    checkForwardingRuleInfo(o.forwardingRule);
-    checkInstanceInfo(o.instance);
-    checkLoadBalancerInfo(o.loadBalancer);
-    checkNetworkInfo(o.network);
+    checkDropInfo(o.drop as api.DropInfo);
+    checkEndpointInfo(o.endpoint as api.EndpointInfo);
+    checkFirewallInfo(o.firewall as api.FirewallInfo);
+    checkForwardInfo(o.forward as api.ForwardInfo);
+    checkForwardingRuleInfo(o.forwardingRule as api.ForwardingRuleInfo);
+    checkInstanceInfo(o.instance as api.InstanceInfo);
+    checkLoadBalancerInfo(o.loadBalancer as api.LoadBalancerInfo);
+    checkNetworkInfo(o.network as api.NetworkInfo);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkRouteInfo(o.route);
+    checkRouteInfo(o.route as api.RouteInfo);
     unittest.expect(o.state, unittest.equals('foo'));
-    checkVpnGatewayInfo(o.vpnGateway);
-    checkVpnTunnelInfo(o.vpnTunnel);
+    checkVpnGatewayInfo(o.vpnGateway as api.VpnGatewayInfo);
+    checkVpnTunnelInfo(o.vpnTunnel as api.VpnTunnelInfo);
   }
   buildCounterStep--;
 }
@@ -1358,8 +1358,8 @@
 
 void checkUnnamed3624(core.List<api.Step> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStep(o[0]);
-  checkStep(o[1]);
+  checkStep(o[0] as api.Step);
+  checkStep(o[1] as api.Step);
 }
 
 core.int buildCounterTrace = 0;
@@ -1377,7 +1377,7 @@
 void checkTrace(api.Trace o) {
   buildCounterTrace++;
   if (buildCounterTrace < 3) {
-    checkEndpointInfo(o.endpointInfo);
+    checkEndpointInfo(o.endpointInfo as api.EndpointInfo);
     checkUnnamed3624(o.steps);
   }
   buildCounterTrace--;
@@ -1452,7 +1452,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAbortInfo();
       var od = api.AbortInfo.fromJson(o.toJson());
-      checkAbortInfo(od);
+      checkAbortInfo(od as api.AbortInfo);
     });
   });
 
@@ -1460,7 +1460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1468,7 +1468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1476,7 +1476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1484,7 +1484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -1492,7 +1492,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConnectivityTest();
       var od = api.ConnectivityTest.fromJson(o.toJson());
-      checkConnectivityTest(od);
+      checkConnectivityTest(od as api.ConnectivityTest);
     });
   });
 
@@ -1500,7 +1500,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeliverInfo();
       var od = api.DeliverInfo.fromJson(o.toJson());
-      checkDeliverInfo(od);
+      checkDeliverInfo(od as api.DeliverInfo);
     });
   });
 
@@ -1508,7 +1508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDropInfo();
       var od = api.DropInfo.fromJson(o.toJson());
-      checkDropInfo(od);
+      checkDropInfo(od as api.DropInfo);
     });
   });
 
@@ -1516,7 +1516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1524,7 +1524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpoint();
       var od = api.Endpoint.fromJson(o.toJson());
-      checkEndpoint(od);
+      checkEndpoint(od as api.Endpoint);
     });
   });
 
@@ -1532,7 +1532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpointInfo();
       var od = api.EndpointInfo.fromJson(o.toJson());
-      checkEndpointInfo(od);
+      checkEndpointInfo(od as api.EndpointInfo);
     });
   });
 
@@ -1540,7 +1540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1548,7 +1548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirewallInfo();
       var od = api.FirewallInfo.fromJson(o.toJson());
-      checkFirewallInfo(od);
+      checkFirewallInfo(od as api.FirewallInfo);
     });
   });
 
@@ -1556,7 +1556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardInfo();
       var od = api.ForwardInfo.fromJson(o.toJson());
-      checkForwardInfo(od);
+      checkForwardInfo(od as api.ForwardInfo);
     });
   });
 
@@ -1564,7 +1564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForwardingRuleInfo();
       var od = api.ForwardingRuleInfo.fromJson(o.toJson());
-      checkForwardingRuleInfo(od);
+      checkForwardingRuleInfo(od as api.ForwardingRuleInfo);
     });
   });
 
@@ -1572,7 +1572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceInfo();
       var od = api.InstanceInfo.fromJson(o.toJson());
-      checkInstanceInfo(od);
+      checkInstanceInfo(od as api.InstanceInfo);
     });
   });
 
@@ -1580,7 +1580,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListConnectivityTestsResponse();
       var od = api.ListConnectivityTestsResponse.fromJson(o.toJson());
-      checkListConnectivityTestsResponse(od);
+      checkListConnectivityTestsResponse(
+          od as api.ListConnectivityTestsResponse);
     });
   });
 
@@ -1588,7 +1589,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1596,7 +1597,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1604,7 +1605,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoadBalancerBackend();
       var od = api.LoadBalancerBackend.fromJson(o.toJson());
-      checkLoadBalancerBackend(od);
+      checkLoadBalancerBackend(od as api.LoadBalancerBackend);
     });
   });
 
@@ -1612,7 +1613,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoadBalancerInfo();
       var od = api.LoadBalancerInfo.fromJson(o.toJson());
-      checkLoadBalancerInfo(od);
+      checkLoadBalancerInfo(od as api.LoadBalancerInfo);
     });
   });
 
@@ -1620,7 +1621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1628,7 +1629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkInfo();
       var od = api.NetworkInfo.fromJson(o.toJson());
-      checkNetworkInfo(od);
+      checkNetworkInfo(od as api.NetworkInfo);
     });
   });
 
@@ -1636,7 +1637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1644,7 +1645,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -1652,7 +1653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1660,7 +1661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReachabilityDetails();
       var od = api.ReachabilityDetails.fromJson(o.toJson());
-      checkReachabilityDetails(od);
+      checkReachabilityDetails(od as api.ReachabilityDetails);
     });
   });
 
@@ -1668,7 +1669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRerunConnectivityTestRequest();
       var od = api.RerunConnectivityTestRequest.fromJson(o.toJson());
-      checkRerunConnectivityTestRequest(od);
+      checkRerunConnectivityTestRequest(od as api.RerunConnectivityTestRequest);
     });
   });
 
@@ -1676,7 +1677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteInfo();
       var od = api.RouteInfo.fromJson(o.toJson());
-      checkRouteInfo(od);
+      checkRouteInfo(od as api.RouteInfo);
     });
   });
 
@@ -1684,7 +1685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1692,7 +1693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1700,7 +1701,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStep();
       var od = api.Step.fromJson(o.toJson());
-      checkStep(od);
+      checkStep(od as api.Step);
     });
   });
 
@@ -1708,7 +1709,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1716,7 +1717,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1724,7 +1725,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrace();
       var od = api.Trace.fromJson(o.toJson());
-      checkTrace(od);
+      checkTrace(od as api.Trace);
     });
   });
 
@@ -1732,7 +1733,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnGatewayInfo();
       var od = api.VpnGatewayInfo.fromJson(o.toJson());
-      checkVpnGatewayInfo(od);
+      checkVpnGatewayInfo(od as api.VpnGatewayInfo);
     });
   });
 
@@ -1740,7 +1741,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVpnTunnelInfo();
       var od = api.VpnTunnelInfo.fromJson(o.toJson());
-      checkVpnTunnelInfo(od);
+      checkVpnTunnelInfo(od as api.VpnTunnelInfo);
     });
   });
 
@@ -1789,7 +1790,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1849,7 +1850,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1868,8 +1869,9 @@
       var arg_testId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ConnectivityTest.fromJson(json);
-        checkConnectivityTest(obj);
+        var obj = api.ConnectivityTest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConnectivityTest(obj as api.ConnectivityTest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1911,7 +1913,7 @@
           .create(arg_request, arg_parent,
               testId: arg_testId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1963,7 +1965,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2015,7 +2017,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConnectivityTest(response);
+        checkConnectivityTest(response as api.ConnectivityTest);
       })));
     });
 
@@ -2074,7 +2076,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2142,7 +2144,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListConnectivityTestsResponse(response);
+        checkListConnectivityTestsResponse(
+            response as api.ListConnectivityTestsResponse);
       })));
     });
 
@@ -2158,8 +2161,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ConnectivityTest.fromJson(json);
-        checkConnectivityTest(obj);
+        var obj = api.ConnectivityTest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConnectivityTest(obj as api.ConnectivityTest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2202,7 +2206,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2217,8 +2221,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RerunConnectivityTestRequest.fromJson(json);
-        checkRerunConnectivityTestRequest(obj);
+        var obj = api.RerunConnectivityTestRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRerunConnectivityTestRequest(
+            obj as api.RerunConnectivityTestRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2258,7 +2264,7 @@
       res
           .rerun(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2273,8 +2279,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2314,7 +2321,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2329,8 +2336,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2370,7 +2378,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -2384,8 +2393,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2425,7 +2435,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2474,7 +2484,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2523,7 +2533,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2584,7 +2594,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/oauth2/v2_test.dart b/generated/googleapis/test/oauth2/v2_test.dart
index b3e71a4..7f441ba 100644
--- a/generated/googleapis/test/oauth2/v2_test.dart
+++ b/generated/googleapis/test/oauth2/v2_test.dart
@@ -149,7 +149,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTokeninfo();
       var od = api.Tokeninfo.fromJson(o.toJson());
-      checkTokeninfo(od);
+      checkTokeninfo(od as api.Tokeninfo);
     });
   });
 
@@ -157,7 +157,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserinfo();
       var od = api.Userinfo.fromJson(o.toJson());
-      checkUserinfo(od);
+      checkUserinfo(od as api.Userinfo);
     });
   });
 
@@ -213,7 +213,7 @@
               idToken: arg_idToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTokeninfo(response);
+        checkTokeninfo(response as api.Tokeninfo);
       })));
     });
   });
@@ -259,7 +259,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.get($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkUserinfo(response);
+        checkUserinfo(response as api.Userinfo);
       })));
     });
   });
@@ -305,7 +305,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.get($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkUserinfo(response);
+        checkUserinfo(response as api.Userinfo);
       })));
     });
   });
diff --git a/generated/googleapis/test/osconfig/v1_test.dart b/generated/googleapis/test/osconfig/v1_test.dart
index c47dd79..0bac019 100644
--- a/generated/googleapis/test/osconfig/v1_test.dart
+++ b/generated/googleapis/test/osconfig/v1_test.dart
@@ -168,8 +168,8 @@
 void checkExecStep(api.ExecStep o) {
   buildCounterExecStep++;
   if (buildCounterExecStep < 3) {
-    checkExecStepConfig(o.linuxExecStepConfig);
-    checkExecStepConfig(o.windowsExecStepConfig);
+    checkExecStepConfig(o.linuxExecStepConfig as api.ExecStepConfig);
+    checkExecStepConfig(o.windowsExecStepConfig as api.ExecStepConfig);
   }
   buildCounterExecStep--;
 }
@@ -205,7 +205,7 @@
   buildCounterExecStepConfig++;
   if (buildCounterExecStepConfig < 3) {
     checkUnnamed2471(o.allowedSuccessCodes);
-    checkGcsObject(o.gcsObject);
+    checkGcsObject(o.gcsObject as api.GcsObject);
     unittest.expect(o.interpreter, unittest.equals('foo'));
     unittest.expect(o.localPath, unittest.equals('foo'));
   }
@@ -236,9 +236,9 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.dryRun, unittest.isTrue);
     unittest.expect(o.duration, unittest.equals('foo'));
-    checkPatchInstanceFilter(o.instanceFilter);
-    checkPatchConfig(o.patchConfig);
-    checkPatchRollout(o.rollout);
+    checkPatchInstanceFilter(o.instanceFilter as api.PatchInstanceFilter);
+    checkPatchConfig(o.patchConfig as api.PatchConfig);
+    checkPatchRollout(o.rollout as api.PatchRollout);
   }
   buildCounterExecutePatchJobRequest--;
 }
@@ -311,8 +311,8 @@
 
 void checkUnnamed2472(core.List<api.PatchDeployment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPatchDeployment(o[0]);
-  checkPatchDeployment(o[1]);
+  checkPatchDeployment(o[0] as api.PatchDeployment);
+  checkPatchDeployment(o[1] as api.PatchDeployment);
 }
 
 core.int buildCounterListPatchDeploymentsResponse = 0;
@@ -345,8 +345,8 @@
 
 void checkUnnamed2473(core.List<api.PatchJobInstanceDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPatchJobInstanceDetails(o[0]);
-  checkPatchJobInstanceDetails(o[1]);
+  checkPatchJobInstanceDetails(o[0] as api.PatchJobInstanceDetails);
+  checkPatchJobInstanceDetails(o[1] as api.PatchJobInstanceDetails);
 }
 
 core.int buildCounterListPatchJobInstanceDetailsResponse = 0;
@@ -381,8 +381,8 @@
 
 void checkUnnamed2474(core.List<api.PatchJob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPatchJob(o[0]);
-  checkPatchJob(o[1]);
+  checkPatchJob(o[0] as api.PatchJob);
+  checkPatchJob(o[1] as api.PatchJob);
 }
 
 core.int buildCounterListPatchJobsResponse = 0;
@@ -422,7 +422,7 @@
   buildCounterMonthlySchedule++;
   if (buildCounterMonthlySchedule < 3) {
     unittest.expect(o.monthDay, unittest.equals(42));
-    checkWeekDayOfMonth(o.weekDayOfMonth);
+    checkWeekDayOfMonth(o.weekDayOfMonth as api.WeekDayOfMonth);
   }
   buildCounterMonthlySchedule--;
 }
@@ -467,14 +467,14 @@
 void checkPatchConfig(api.PatchConfig o) {
   buildCounterPatchConfig++;
   if (buildCounterPatchConfig < 3) {
-    checkAptSettings(o.apt);
-    checkGooSettings(o.goo);
-    checkExecStep(o.postStep);
-    checkExecStep(o.preStep);
+    checkAptSettings(o.apt as api.AptSettings);
+    checkGooSettings(o.goo as api.GooSettings);
+    checkExecStep(o.postStep as api.ExecStep);
+    checkExecStep(o.preStep as api.ExecStep);
     unittest.expect(o.rebootConfig, unittest.equals('foo'));
-    checkWindowsUpdateSettings(o.windowsUpdate);
-    checkYumSettings(o.yum);
-    checkZypperSettings(o.zypper);
+    checkWindowsUpdateSettings(o.windowsUpdate as api.WindowsUpdateSettings);
+    checkYumSettings(o.yum as api.YumSettings);
+    checkZypperSettings(o.zypper as api.ZypperSettings);
   }
   buildCounterPatchConfig--;
 }
@@ -506,13 +506,13 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.duration, unittest.equals('foo'));
-    checkPatchInstanceFilter(o.instanceFilter);
+    checkPatchInstanceFilter(o.instanceFilter as api.PatchInstanceFilter);
     unittest.expect(o.lastExecuteTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOneTimeSchedule(o.oneTimeSchedule);
-    checkPatchConfig(o.patchConfig);
-    checkRecurringSchedule(o.recurringSchedule);
-    checkPatchRollout(o.rollout);
+    checkOneTimeSchedule(o.oneTimeSchedule as api.OneTimeSchedule);
+    checkPatchConfig(o.patchConfig as api.PatchConfig);
+    checkRecurringSchedule(o.recurringSchedule as api.RecurringSchedule);
+    checkPatchRollout(o.rollout as api.PatchRollout);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterPatchDeployment--;
@@ -527,8 +527,8 @@
 
 void checkUnnamed2475(core.List<api.PatchInstanceFilterGroupLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPatchInstanceFilterGroupLabel(o[0]);
-  checkPatchInstanceFilterGroupLabel(o[1]);
+  checkPatchInstanceFilterGroupLabel(o[0] as api.PatchInstanceFilterGroupLabel);
+  checkPatchInstanceFilterGroupLabel(o[1] as api.PatchInstanceFilterGroupLabel);
 }
 
 core.List<core.String> buildUnnamed2476() {
@@ -663,13 +663,14 @@
     unittest.expect(o.dryRun, unittest.isTrue);
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.errorMessage, unittest.equals('foo'));
-    checkPatchJobInstanceDetailsSummary(o.instanceDetailsSummary);
-    checkPatchInstanceFilter(o.instanceFilter);
+    checkPatchJobInstanceDetailsSummary(
+        o.instanceDetailsSummary as api.PatchJobInstanceDetailsSummary);
+    checkPatchInstanceFilter(o.instanceFilter as api.PatchInstanceFilter);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPatchConfig(o.patchConfig);
+    checkPatchConfig(o.patchConfig as api.PatchConfig);
     unittest.expect(o.patchDeployment, unittest.equals('foo'));
     unittest.expect(o.percentComplete, unittest.equals(42.0));
-    checkPatchRollout(o.rollout);
+    checkPatchRollout(o.rollout as api.PatchRollout);
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -766,7 +767,7 @@
 void checkPatchRollout(api.PatchRollout o) {
   buildCounterPatchRollout++;
   if (buildCounterPatchRollout < 3) {
-    checkFixedOrPercent(o.disruptionBudget);
+    checkFixedOrPercent(o.disruptionBudget as api.FixedOrPercent);
     unittest.expect(o.mode, unittest.equals('foo'));
   }
   buildCounterPatchRollout--;
@@ -797,12 +798,12 @@
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.frequency, unittest.equals('foo'));
     unittest.expect(o.lastExecuteTime, unittest.equals('foo'));
-    checkMonthlySchedule(o.monthly);
+    checkMonthlySchedule(o.monthly as api.MonthlySchedule);
     unittest.expect(o.nextExecuteTime, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkTimeOfDay(o.timeOfDay);
-    checkTimeZone(o.timeZone);
-    checkWeeklySchedule(o.weekly);
+    checkTimeOfDay(o.timeOfDay as api.TimeOfDay);
+    checkTimeZone(o.timeZone as api.TimeZone);
+    checkWeeklySchedule(o.weekly as api.WeeklySchedule);
   }
   buildCounterRecurringSchedule--;
 }
@@ -1092,7 +1093,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAptSettings();
       var od = api.AptSettings.fromJson(o.toJson());
-      checkAptSettings(od);
+      checkAptSettings(od as api.AptSettings);
     });
   });
 
@@ -1100,7 +1101,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelPatchJobRequest();
       var od = api.CancelPatchJobRequest.fromJson(o.toJson());
-      checkCancelPatchJobRequest(od);
+      checkCancelPatchJobRequest(od as api.CancelPatchJobRequest);
     });
   });
 
@@ -1108,7 +1109,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1116,7 +1117,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecStep();
       var od = api.ExecStep.fromJson(o.toJson());
-      checkExecStep(od);
+      checkExecStep(od as api.ExecStep);
     });
   });
 
@@ -1124,7 +1125,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecStepConfig();
       var od = api.ExecStepConfig.fromJson(o.toJson());
-      checkExecStepConfig(od);
+      checkExecStepConfig(od as api.ExecStepConfig);
     });
   });
 
@@ -1132,7 +1133,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecutePatchJobRequest();
       var od = api.ExecutePatchJobRequest.fromJson(o.toJson());
-      checkExecutePatchJobRequest(od);
+      checkExecutePatchJobRequest(od as api.ExecutePatchJobRequest);
     });
   });
 
@@ -1140,7 +1141,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFixedOrPercent();
       var od = api.FixedOrPercent.fromJson(o.toJson());
-      checkFixedOrPercent(od);
+      checkFixedOrPercent(od as api.FixedOrPercent);
     });
   });
 
@@ -1148,7 +1149,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsObject();
       var od = api.GcsObject.fromJson(o.toJson());
-      checkGcsObject(od);
+      checkGcsObject(od as api.GcsObject);
     });
   });
 
@@ -1156,7 +1157,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGooSettings();
       var od = api.GooSettings.fromJson(o.toJson());
-      checkGooSettings(od);
+      checkGooSettings(od as api.GooSettings);
     });
   });
 
@@ -1164,7 +1165,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPatchDeploymentsResponse();
       var od = api.ListPatchDeploymentsResponse.fromJson(o.toJson());
-      checkListPatchDeploymentsResponse(od);
+      checkListPatchDeploymentsResponse(od as api.ListPatchDeploymentsResponse);
     });
   });
 
@@ -1172,7 +1173,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPatchJobInstanceDetailsResponse();
       var od = api.ListPatchJobInstanceDetailsResponse.fromJson(o.toJson());
-      checkListPatchJobInstanceDetailsResponse(od);
+      checkListPatchJobInstanceDetailsResponse(
+          od as api.ListPatchJobInstanceDetailsResponse);
     });
   });
 
@@ -1180,7 +1182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPatchJobsResponse();
       var od = api.ListPatchJobsResponse.fromJson(o.toJson());
-      checkListPatchJobsResponse(od);
+      checkListPatchJobsResponse(od as api.ListPatchJobsResponse);
     });
   });
 
@@ -1188,7 +1190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonthlySchedule();
       var od = api.MonthlySchedule.fromJson(o.toJson());
-      checkMonthlySchedule(od);
+      checkMonthlySchedule(od as api.MonthlySchedule);
     });
   });
 
@@ -1196,7 +1198,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOneTimeSchedule();
       var od = api.OneTimeSchedule.fromJson(o.toJson());
-      checkOneTimeSchedule(od);
+      checkOneTimeSchedule(od as api.OneTimeSchedule);
     });
   });
 
@@ -1204,7 +1206,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchConfig();
       var od = api.PatchConfig.fromJson(o.toJson());
-      checkPatchConfig(od);
+      checkPatchConfig(od as api.PatchConfig);
     });
   });
 
@@ -1212,7 +1214,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchDeployment();
       var od = api.PatchDeployment.fromJson(o.toJson());
-      checkPatchDeployment(od);
+      checkPatchDeployment(od as api.PatchDeployment);
     });
   });
 
@@ -1220,7 +1222,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchInstanceFilter();
       var od = api.PatchInstanceFilter.fromJson(o.toJson());
-      checkPatchInstanceFilter(od);
+      checkPatchInstanceFilter(od as api.PatchInstanceFilter);
     });
   });
 
@@ -1228,7 +1230,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchInstanceFilterGroupLabel();
       var od = api.PatchInstanceFilterGroupLabel.fromJson(o.toJson());
-      checkPatchInstanceFilterGroupLabel(od);
+      checkPatchInstanceFilterGroupLabel(
+          od as api.PatchInstanceFilterGroupLabel);
     });
   });
 
@@ -1236,7 +1239,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchJob();
       var od = api.PatchJob.fromJson(o.toJson());
-      checkPatchJob(od);
+      checkPatchJob(od as api.PatchJob);
     });
   });
 
@@ -1244,7 +1247,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchJobInstanceDetails();
       var od = api.PatchJobInstanceDetails.fromJson(o.toJson());
-      checkPatchJobInstanceDetails(od);
+      checkPatchJobInstanceDetails(od as api.PatchJobInstanceDetails);
     });
   });
 
@@ -1252,7 +1255,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchJobInstanceDetailsSummary();
       var od = api.PatchJobInstanceDetailsSummary.fromJson(o.toJson());
-      checkPatchJobInstanceDetailsSummary(od);
+      checkPatchJobInstanceDetailsSummary(
+          od as api.PatchJobInstanceDetailsSummary);
     });
   });
 
@@ -1260,7 +1264,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPatchRollout();
       var od = api.PatchRollout.fromJson(o.toJson());
-      checkPatchRollout(od);
+      checkPatchRollout(od as api.PatchRollout);
     });
   });
 
@@ -1268,7 +1272,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecurringSchedule();
       var od = api.RecurringSchedule.fromJson(o.toJson());
-      checkRecurringSchedule(od);
+      checkRecurringSchedule(od as api.RecurringSchedule);
     });
   });
 
@@ -1276,7 +1280,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeOfDay();
       var od = api.TimeOfDay.fromJson(o.toJson());
-      checkTimeOfDay(od);
+      checkTimeOfDay(od as api.TimeOfDay);
     });
   });
 
@@ -1284,7 +1288,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeZone();
       var od = api.TimeZone.fromJson(o.toJson());
-      checkTimeZone(od);
+      checkTimeZone(od as api.TimeZone);
     });
   });
 
@@ -1292,7 +1296,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWeekDayOfMonth();
       var od = api.WeekDayOfMonth.fromJson(o.toJson());
-      checkWeekDayOfMonth(od);
+      checkWeekDayOfMonth(od as api.WeekDayOfMonth);
     });
   });
 
@@ -1300,7 +1304,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWeeklySchedule();
       var od = api.WeeklySchedule.fromJson(o.toJson());
-      checkWeeklySchedule(od);
+      checkWeeklySchedule(od as api.WeeklySchedule);
     });
   });
 
@@ -1308,7 +1312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWindowsUpdateSettings();
       var od = api.WindowsUpdateSettings.fromJson(o.toJson());
-      checkWindowsUpdateSettings(od);
+      checkWindowsUpdateSettings(od as api.WindowsUpdateSettings);
     });
   });
 
@@ -1316,7 +1320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildYumSettings();
       var od = api.YumSettings.fromJson(o.toJson());
-      checkYumSettings(od);
+      checkYumSettings(od as api.YumSettings);
     });
   });
 
@@ -1324,7 +1328,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZypperSettings();
       var od = api.ZypperSettings.fromJson(o.toJson());
-      checkZypperSettings(od);
+      checkZypperSettings(od as api.ZypperSettings);
     });
   });
 
@@ -1337,8 +1341,9 @@
       var arg_patchDeploymentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PatchDeployment.fromJson(json);
-        checkPatchDeployment(obj);
+        var obj = api.PatchDeployment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPatchDeployment(obj as api.PatchDeployment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1381,7 +1386,7 @@
           .create(arg_request, arg_parent,
               patchDeploymentId: arg_patchDeploymentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPatchDeployment(response);
+        checkPatchDeployment(response as api.PatchDeployment);
       })));
     });
 
@@ -1429,7 +1434,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1477,7 +1482,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPatchDeployment(response);
+        checkPatchDeployment(response as api.PatchDeployment);
       })));
     });
 
@@ -1534,7 +1539,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPatchDeploymentsResponse(response);
+        checkListPatchDeploymentsResponse(
+            response as api.ListPatchDeploymentsResponse);
       })));
     });
   });
@@ -1547,8 +1553,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelPatchJobRequest.fromJson(json);
-        checkCancelPatchJobRequest(obj);
+        var obj = api.CancelPatchJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelPatchJobRequest(obj as api.CancelPatchJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1588,7 +1595,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPatchJob(response);
+        checkPatchJob(response as api.PatchJob);
       })));
     });
 
@@ -1599,8 +1606,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExecutePatchJobRequest.fromJson(json);
-        checkExecutePatchJobRequest(obj);
+        var obj = api.ExecutePatchJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExecutePatchJobRequest(obj as api.ExecutePatchJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1640,7 +1648,7 @@
       res
           .execute(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPatchJob(response);
+        checkPatchJob(response as api.PatchJob);
       })));
     });
 
@@ -1688,7 +1696,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPatchJob(response);
+        checkPatchJob(response as api.PatchJob);
       })));
     });
 
@@ -1748,7 +1756,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPatchJobsResponse(response);
+        checkListPatchJobsResponse(response as api.ListPatchJobsResponse);
       })));
     });
   });
@@ -1811,7 +1819,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPatchJobInstanceDetailsResponse(response);
+        checkListPatchJobInstanceDetailsResponse(
+            response as api.ListPatchJobInstanceDetailsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/oslogin/v1_test.dart b/generated/googleapis/test/oslogin/v1_test.dart
index bc419b1..859a536 100644
--- a/generated/googleapis/test/oslogin/v1_test.dart
+++ b/generated/googleapis/test/oslogin/v1_test.dart
@@ -105,7 +105,7 @@
   buildCounterImportSshPublicKeyResponse++;
   if (buildCounterImportSshPublicKeyResponse < 3) {
     unittest.expect(o.details, unittest.equals('foo'));
-    checkLoginProfile(o.loginProfile);
+    checkLoginProfile(o.loginProfile as api.LoginProfile);
   }
   buildCounterImportSshPublicKeyResponse--;
 }
@@ -119,8 +119,8 @@
 
 void checkUnnamed2735(core.List<api.PosixAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPosixAccount(o[0]);
-  checkPosixAccount(o[1]);
+  checkPosixAccount(o[0] as api.PosixAccount);
+  checkPosixAccount(o[1] as api.PosixAccount);
 }
 
 core.Map<core.String, api.SshPublicKey> buildUnnamed2736() {
@@ -132,8 +132,8 @@
 
 void checkUnnamed2736(core.Map<core.String, api.SshPublicKey> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSshPublicKey(o['x']);
-  checkSshPublicKey(o['y']);
+  checkSshPublicKey(o['x'] as api.SshPublicKey);
+  checkSshPublicKey(o['y'] as api.SshPublicKey);
 }
 
 core.int buildCounterLoginProfile = 0;
@@ -228,7 +228,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -236,7 +236,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportSshPublicKeyResponse();
       var od = api.ImportSshPublicKeyResponse.fromJson(o.toJson());
-      checkImportSshPublicKeyResponse(od);
+      checkImportSshPublicKeyResponse(od as api.ImportSshPublicKeyResponse);
     });
   });
 
@@ -244,7 +244,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoginProfile();
       var od = api.LoginProfile.fromJson(o.toJson());
-      checkLoginProfile(od);
+      checkLoginProfile(od as api.LoginProfile);
     });
   });
 
@@ -252,7 +252,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosixAccount();
       var od = api.PosixAccount.fromJson(o.toJson());
-      checkPosixAccount(od);
+      checkPosixAccount(od as api.PosixAccount);
     });
   });
 
@@ -260,7 +260,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSshPublicKey();
       var od = api.SshPublicKey.fromJson(o.toJson());
-      checkSshPublicKey(od);
+      checkSshPublicKey(od as api.SshPublicKey);
     });
   });
 
@@ -318,7 +318,7 @@
               systemId: arg_systemId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLoginProfile(response);
+        checkLoginProfile(response as api.LoginProfile);
       })));
     });
 
@@ -330,8 +330,9 @@
       var arg_projectId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SshPublicKey.fromJson(json);
-        checkSshPublicKey(obj);
+        var obj = api.SshPublicKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSshPublicKey(obj as api.SshPublicKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -374,7 +375,8 @@
           .importSshPublicKey(arg_request, arg_parent,
               projectId: arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkImportSshPublicKeyResponse(response);
+        checkImportSshPublicKeyResponse(
+            response as api.ImportSshPublicKeyResponse);
       })));
     });
   });
@@ -424,7 +426,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -474,7 +476,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -522,7 +524,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSshPublicKey(response);
+        checkSshPublicKey(response as api.SshPublicKey);
       })));
     });
 
@@ -534,8 +536,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SshPublicKey.fromJson(json);
-        checkSshPublicKey(obj);
+        var obj = api.SshPublicKey.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSshPublicKey(obj as api.SshPublicKey);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -578,7 +581,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSshPublicKey(response);
+        checkSshPublicKey(response as api.SshPublicKey);
       })));
     });
   });
diff --git a/generated/googleapis/test/pagespeedonline/v5_test.dart b/generated/googleapis/test/pagespeedonline/v5_test.dart
index 1db6036..c2773ff 100644
--- a/generated/googleapis/test/pagespeedonline/v5_test.dart
+++ b/generated/googleapis/test/pagespeedonline/v5_test.dart
@@ -138,11 +138,11 @@
 void checkCategories(api.Categories o) {
   buildCounterCategories++;
   if (buildCounterCategories < 3) {
-    checkLighthouseCategoryV5(o.accessibility);
-    checkLighthouseCategoryV5(o.best_practices);
-    checkLighthouseCategoryV5(o.performance);
-    checkLighthouseCategoryV5(o.pwa);
-    checkLighthouseCategoryV5(o.seo);
+    checkLighthouseCategoryV5(o.accessibility as api.LighthouseCategoryV5);
+    checkLighthouseCategoryV5(o.best_practices as api.LighthouseCategoryV5);
+    checkLighthouseCategoryV5(o.performance as api.LighthouseCategoryV5);
+    checkLighthouseCategoryV5(o.pwa as api.LighthouseCategoryV5);
+    checkLighthouseCategoryV5(o.seo as api.LighthouseCategoryV5);
   }
   buildCounterCategories--;
 }
@@ -238,7 +238,8 @@
 void checkI18n(api.I18n o) {
   buildCounterI18n++;
   if (buildCounterI18n < 3) {
-    checkRendererFormattedStrings(o.rendererFormattedStrings);
+    checkRendererFormattedStrings(
+        o.rendererFormattedStrings as api.RendererFormattedStrings);
   }
   buildCounterI18n--;
 }
@@ -336,8 +337,8 @@
 
 void checkUnnamed2490(core.List<api.AuditRefs> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditRefs(o[0]);
-  checkAuditRefs(o[1]);
+  checkAuditRefs(o[0] as api.AuditRefs);
+  checkAuditRefs(o[1] as api.AuditRefs);
 }
 
 core.int buildCounterLighthouseCategoryV5 = 0;
@@ -386,8 +387,8 @@
 
 void checkUnnamed2491(core.Map<core.String, api.LighthouseAuditResultV5> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLighthouseAuditResultV5(o['x']);
-  checkLighthouseAuditResultV5(o['y']);
+  checkLighthouseAuditResultV5(o['x'] as api.LighthouseAuditResultV5);
+  checkLighthouseAuditResultV5(o['y'] as api.LighthouseAuditResultV5);
 }
 
 core.Map<core.String, api.CategoryGroupV5> buildUnnamed2492() {
@@ -399,8 +400,8 @@
 
 void checkUnnamed2492(core.Map<core.String, api.CategoryGroupV5> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCategoryGroupV5(o['x']);
-  checkCategoryGroupV5(o['y']);
+  checkCategoryGroupV5(o['x'] as api.CategoryGroupV5);
+  checkCategoryGroupV5(o['y'] as api.CategoryGroupV5);
 }
 
 core.List<core.Object> buildUnnamed2493() {
@@ -441,8 +442,8 @@
 
 void checkUnnamed2494(core.List<api.StackPack> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStackPack(o[0]);
-  checkStackPack(o[1]);
+  checkStackPack(o[0] as api.StackPack);
+  checkStackPack(o[1] as api.StackPack);
 }
 
 core.int buildCounterLighthouseResultV5 = 0;
@@ -474,19 +475,19 @@
   buildCounterLighthouseResultV5++;
   if (buildCounterLighthouseResultV5 < 3) {
     checkUnnamed2491(o.audits);
-    checkCategories(o.categories);
+    checkCategories(o.categories as api.Categories);
     checkUnnamed2492(o.categoryGroups);
-    checkConfigSettings(o.configSettings);
-    checkEnvironment(o.environment);
+    checkConfigSettings(o.configSettings as api.ConfigSettings);
+    checkEnvironment(o.environment as api.Environment);
     unittest.expect(o.fetchTime, unittest.equals('foo'));
     unittest.expect(o.finalUrl, unittest.equals('foo'));
-    checkI18n(o.i18n);
+    checkI18n(o.i18n as api.I18n);
     unittest.expect(o.lighthouseVersion, unittest.equals('foo'));
     unittest.expect(o.requestedUrl, unittest.equals('foo'));
     checkUnnamed2493(o.runWarnings);
-    checkRuntimeError(o.runtimeError);
+    checkRuntimeError(o.runtimeError as api.RuntimeError);
     checkUnnamed2494(o.stackPacks);
-    checkTiming(o.timing);
+    checkTiming(o.timing as api.Timing);
     unittest.expect(o.userAgent, unittest.equals('foo'));
   }
   buildCounterLighthouseResultV5--;
@@ -501,8 +502,8 @@
 
 void checkUnnamed2495(core.Map<core.String, api.UserPageLoadMetricV5> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserPageLoadMetricV5(o['x']);
-  checkUserPageLoadMetricV5(o['y']);
+  checkUserPageLoadMetricV5(o['x'] as api.UserPageLoadMetricV5);
+  checkUserPageLoadMetricV5(o['y'] as api.UserPageLoadMetricV5);
 }
 
 core.int buildCounterPagespeedApiLoadingExperienceV5 = 0;
@@ -559,10 +560,12 @@
     unittest.expect(o.captchaResult, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLighthouseResultV5(o.lighthouseResult);
-    checkPagespeedApiLoadingExperienceV5(o.loadingExperience);
-    checkPagespeedApiLoadingExperienceV5(o.originLoadingExperience);
-    checkPagespeedVersion(o.version);
+    checkLighthouseResultV5(o.lighthouseResult as api.LighthouseResultV5);
+    checkPagespeedApiLoadingExperienceV5(
+        o.loadingExperience as api.PagespeedApiLoadingExperienceV5);
+    checkPagespeedApiLoadingExperienceV5(
+        o.originLoadingExperience as api.PagespeedApiLoadingExperienceV5);
+    checkPagespeedVersion(o.version as api.PagespeedVersion);
   }
   buildCounterPagespeedApiPagespeedResponseV5--;
 }
@@ -724,8 +727,8 @@
 
 void checkUnnamed2497(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucket(o[0]);
-  checkBucket(o[1]);
+  checkBucket(o[0] as api.Bucket);
+  checkBucket(o[1] as api.Bucket);
 }
 
 core.int buildCounterUserPageLoadMetricV5 = 0;
@@ -775,7 +778,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditRefs();
       var od = api.AuditRefs.fromJson(o.toJson());
-      checkAuditRefs(od);
+      checkAuditRefs(od as api.AuditRefs);
     });
   });
 
@@ -783,7 +786,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucket();
       var od = api.Bucket.fromJson(o.toJson());
-      checkBucket(od);
+      checkBucket(od as api.Bucket);
     });
   });
 
@@ -791,7 +794,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategories();
       var od = api.Categories.fromJson(o.toJson());
-      checkCategories(od);
+      checkCategories(od as api.Categories);
     });
   });
 
@@ -799,7 +802,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCategoryGroupV5();
       var od = api.CategoryGroupV5.fromJson(o.toJson());
-      checkCategoryGroupV5(od);
+      checkCategoryGroupV5(od as api.CategoryGroupV5);
     });
   });
 
@@ -807,7 +810,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigSettings();
       var od = api.ConfigSettings.fromJson(o.toJson());
-      checkConfigSettings(od);
+      checkConfigSettings(od as api.ConfigSettings);
     });
   });
 
@@ -815,7 +818,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironment();
       var od = api.Environment.fromJson(o.toJson());
-      checkEnvironment(od);
+      checkEnvironment(od as api.Environment);
     });
   });
 
@@ -823,7 +826,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildI18n();
       var od = api.I18n.fromJson(o.toJson());
-      checkI18n(od);
+      checkI18n(od as api.I18n);
     });
   });
 
@@ -831,7 +834,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLighthouseAuditResultV5();
       var od = api.LighthouseAuditResultV5.fromJson(o.toJson());
-      checkLighthouseAuditResultV5(od);
+      checkLighthouseAuditResultV5(od as api.LighthouseAuditResultV5);
     });
   });
 
@@ -839,7 +842,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLighthouseCategoryV5();
       var od = api.LighthouseCategoryV5.fromJson(o.toJson());
-      checkLighthouseCategoryV5(od);
+      checkLighthouseCategoryV5(od as api.LighthouseCategoryV5);
     });
   });
 
@@ -847,7 +850,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLighthouseResultV5();
       var od = api.LighthouseResultV5.fromJson(o.toJson());
-      checkLighthouseResultV5(od);
+      checkLighthouseResultV5(od as api.LighthouseResultV5);
     });
   });
 
@@ -855,7 +858,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPagespeedApiLoadingExperienceV5();
       var od = api.PagespeedApiLoadingExperienceV5.fromJson(o.toJson());
-      checkPagespeedApiLoadingExperienceV5(od);
+      checkPagespeedApiLoadingExperienceV5(
+          od as api.PagespeedApiLoadingExperienceV5);
     });
   });
 
@@ -863,7 +867,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPagespeedApiPagespeedResponseV5();
       var od = api.PagespeedApiPagespeedResponseV5.fromJson(o.toJson());
-      checkPagespeedApiPagespeedResponseV5(od);
+      checkPagespeedApiPagespeedResponseV5(
+          od as api.PagespeedApiPagespeedResponseV5);
     });
   });
 
@@ -871,7 +876,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPagespeedVersion();
       var od = api.PagespeedVersion.fromJson(o.toJson());
-      checkPagespeedVersion(od);
+      checkPagespeedVersion(od as api.PagespeedVersion);
     });
   });
 
@@ -879,7 +884,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRendererFormattedStrings();
       var od = api.RendererFormattedStrings.fromJson(o.toJson());
-      checkRendererFormattedStrings(od);
+      checkRendererFormattedStrings(od as api.RendererFormattedStrings);
     });
   });
 
@@ -887,7 +892,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRuntimeError();
       var od = api.RuntimeError.fromJson(o.toJson());
-      checkRuntimeError(od);
+      checkRuntimeError(od as api.RuntimeError);
     });
   });
 
@@ -895,7 +900,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStackPack();
       var od = api.StackPack.fromJson(o.toJson());
-      checkStackPack(od);
+      checkStackPack(od as api.StackPack);
     });
   });
 
@@ -903,7 +908,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTiming();
       var od = api.Timing.fromJson(o.toJson());
-      checkTiming(od);
+      checkTiming(od as api.Timing);
     });
   });
 
@@ -911,7 +916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserPageLoadMetricV5();
       var od = api.UserPageLoadMetricV5.fromJson(o.toJson());
-      checkUserPageLoadMetricV5(od);
+      checkUserPageLoadMetricV5(od as api.UserPageLoadMetricV5);
     });
   });
 
@@ -984,7 +989,8 @@
               utmSource: arg_utmSource,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPagespeedApiPagespeedResponseV5(response);
+        checkPagespeedApiPagespeedResponseV5(
+            response as api.PagespeedApiPagespeedResponseV5);
       })));
     });
   });
diff --git a/generated/googleapis/test/people/v1_test.dart b/generated/googleapis/test/people/v1_test.dart
index 55907de..55eb148 100644
--- a/generated/googleapis/test/people/v1_test.dart
+++ b/generated/googleapis/test/people/v1_test.dart
@@ -105,7 +105,7 @@
     unittest.expect(o.extendedAddress, unittest.equals('foo'));
     unittest.expect(o.formattedType, unittest.equals('foo'));
     unittest.expect(o.formattedValue, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.poBox, unittest.equals('foo'));
     unittest.expect(o.postalCode, unittest.equals('foo'));
     unittest.expect(o.region, unittest.equals('foo'));
@@ -131,7 +131,7 @@
   buildCounterAgeRangeType++;
   if (buildCounterAgeRangeType < 3) {
     unittest.expect(o.ageRange, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
   }
   buildCounterAgeRangeType--;
 }
@@ -145,8 +145,8 @@
 
 void checkUnnamed4862(core.List<api.ContactGroupResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContactGroupResponse(o[0]);
-  checkContactGroupResponse(o[1]);
+  checkContactGroupResponse(o[0] as api.ContactGroupResponse);
+  checkContactGroupResponse(o[1] as api.ContactGroupResponse);
 }
 
 core.int buildCounterBatchGetContactGroupsResponse = 0;
@@ -185,7 +185,7 @@
   buildCounterBiography++;
   if (buildCounterBiography < 3) {
     unittest.expect(o.contentType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterBiography--;
@@ -207,8 +207,8 @@
 void checkBirthday(api.Birthday o) {
   buildCounterBirthday++;
   if (buildCounterBirthday < 3) {
-    checkDate(o.date);
-    checkFieldMetadata(o.metadata);
+    checkDate(o.date as api.Date);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterBirthday--;
@@ -229,7 +229,7 @@
 void checkBraggingRights(api.BraggingRights o) {
   buildCounterBraggingRights++;
   if (buildCounterBraggingRights < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterBraggingRights--;
@@ -253,7 +253,7 @@
   buildCounterCalendarUrl++;
   if (buildCounterCalendarUrl < 3) {
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
   }
@@ -277,7 +277,7 @@
   buildCounterClientData++;
   if (buildCounterClientData < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterClientData--;
@@ -322,7 +322,7 @@
     unittest.expect(o.groupType, unittest.equals('foo'));
     unittest.expect(o.memberCount, unittest.equals(42));
     checkUnnamed4863(o.memberResourceNames);
-    checkContactGroupMetadata(o.metadata);
+    checkContactGroupMetadata(o.metadata as api.ContactGroupMetadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
   }
@@ -387,9 +387,9 @@
 void checkContactGroupResponse(api.ContactGroupResponse o) {
   buildCounterContactGroupResponse++;
   if (buildCounterContactGroupResponse < 3) {
-    checkContactGroup(o.contactGroup);
+    checkContactGroup(o.contactGroup as api.ContactGroup);
     unittest.expect(o.requestedResourceName, unittest.equals('foo'));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
   }
   buildCounterContactGroupResponse--;
 }
@@ -449,7 +449,7 @@
   buildCounterCoverPhoto++;
   if (buildCounterCoverPhoto < 3) {
     unittest.expect(o.default_, unittest.isTrue);
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterCoverPhoto--;
@@ -469,7 +469,7 @@
 void checkCreateContactGroupRequest(api.CreateContactGroupRequest o) {
   buildCounterCreateContactGroupRequest++;
   if (buildCounterCreateContactGroupRequest < 3) {
-    checkContactGroup(o.contactGroup);
+    checkContactGroup(o.contactGroup as api.ContactGroup);
   }
   buildCounterCreateContactGroupRequest--;
 }
@@ -511,7 +511,7 @@
 void checkDeleteContactPhotoResponse(api.DeleteContactPhotoResponse o) {
   buildCounterDeleteContactPhotoResponse++;
   if (buildCounterDeleteContactPhotoResponse < 3) {
-    checkPerson(o.person);
+    checkPerson(o.person as api.Person);
   }
   buildCounterDeleteContactPhotoResponse--;
 }
@@ -555,7 +555,7 @@
   if (buildCounterEmailAddress < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -594,9 +594,9 @@
 void checkEvent(api.Event o) {
   buildCounterEvent++;
   if (buildCounterEvent < 3) {
-    checkDate(o.date);
+    checkDate(o.date as api.Date);
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterEvent--;
@@ -620,7 +620,7 @@
   buildCounterExternalId++;
   if (buildCounterExternalId < 3) {
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -644,7 +644,7 @@
   buildCounterFieldMetadata++;
   if (buildCounterFieldMetadata < 3) {
     unittest.expect(o.primary, unittest.isTrue);
-    checkSource(o.source);
+    checkSource(o.source as api.Source);
     unittest.expect(o.verified, unittest.isTrue);
   }
   buildCounterFieldMetadata--;
@@ -665,7 +665,7 @@
 void checkFileAs(api.FileAs o) {
   buildCounterFileAs++;
   if (buildCounterFileAs < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterFileAs--;
@@ -690,7 +690,7 @@
   if (buildCounterGender < 3) {
     unittest.expect(o.addressMeAs, unittest.equals('foo'));
     unittest.expect(o.formattedValue, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterGender--;
@@ -705,8 +705,8 @@
 
 void checkUnnamed4865(core.List<api.PersonResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPersonResponse(o[0]);
-  checkPersonResponse(o[1]);
+  checkPersonResponse(o[0] as api.PersonResponse);
+  checkPersonResponse(o[1] as api.PersonResponse);
 }
 
 core.int buildCounterGetPeopleResponse = 0;
@@ -749,7 +749,7 @@
   if (buildCounterImClient < 3) {
     unittest.expect(o.formattedProtocol, unittest.equals('foo'));
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.protocol, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.username, unittest.equals('foo'));
@@ -772,7 +772,7 @@
 void checkInterest(api.Interest o) {
   buildCounterInterest++;
   if (buildCounterInterest < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterInterest--;
@@ -787,8 +787,8 @@
 
 void checkUnnamed4866(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerson(o[0]);
-  checkPerson(o[1]);
+  checkPerson(o[0] as api.Person);
+  checkPerson(o[1] as api.Person);
 }
 
 core.int buildCounterListConnectionsResponse = 0;
@@ -827,8 +827,8 @@
 
 void checkUnnamed4867(core.List<api.ContactGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContactGroup(o[0]);
-  checkContactGroup(o[1]);
+  checkContactGroup(o[0] as api.ContactGroup);
+  checkContactGroup(o[1] as api.ContactGroup);
 }
 
 core.int buildCounterListContactGroupsResponse = 0;
@@ -865,8 +865,8 @@
 
 void checkUnnamed4868(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerson(o[0]);
-  checkPerson(o[1]);
+  checkPerson(o[0] as api.Person);
+  checkPerson(o[1] as api.Person);
 }
 
 core.int buildCounterListDirectoryPeopleResponse = 0;
@@ -901,8 +901,8 @@
 
 void checkUnnamed4869(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerson(o[0]);
-  checkPerson(o[1]);
+  checkPerson(o[0] as api.Person);
+  checkPerson(o[1] as api.Person);
 }
 
 core.int buildCounterListOtherContactsResponse = 0;
@@ -943,7 +943,7 @@
 void checkLocale(api.Locale o) {
   buildCounterLocale++;
   if (buildCounterLocale < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterLocale--;
@@ -975,7 +975,7 @@
     unittest.expect(o.deskCode, unittest.equals('foo'));
     unittest.expect(o.floor, unittest.equals('foo'));
     unittest.expect(o.floorSection, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -998,9 +998,10 @@
 void checkMembership(api.Membership o) {
   buildCounterMembership++;
   if (buildCounterMembership < 3) {
-    checkContactGroupMembership(o.contactGroupMembership);
-    checkDomainMembership(o.domainMembership);
-    checkFieldMetadata(o.metadata);
+    checkContactGroupMembership(
+        o.contactGroupMembership as api.ContactGroupMembership);
+    checkDomainMembership(o.domainMembership as api.DomainMembership);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
   }
   buildCounterMembership--;
 }
@@ -1023,7 +1024,7 @@
   buildCounterMiscKeyword++;
   if (buildCounterMiscKeyword < 3) {
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -1160,7 +1161,7 @@
     unittest.expect(o.givenName, unittest.equals('foo'));
     unittest.expect(o.honorificPrefix, unittest.equals('foo'));
     unittest.expect(o.honorificSuffix, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.middleName, unittest.equals('foo'));
     unittest.expect(o.phoneticFamilyName, unittest.equals('foo'));
     unittest.expect(o.phoneticFullName, unittest.equals('foo'));
@@ -1189,7 +1190,7 @@
 void checkNickname(api.Nickname o) {
   buildCounterNickname++;
   if (buildCounterNickname < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -1211,7 +1212,7 @@
 void checkOccupation(api.Occupation o) {
   buildCounterOccupation++;
   if (buildCounterOccupation < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterOccupation--;
@@ -1247,14 +1248,14 @@
     unittest.expect(o.current, unittest.isTrue);
     unittest.expect(o.department, unittest.equals('foo'));
     unittest.expect(o.domain, unittest.equals('foo'));
-    checkDate(o.endDate);
+    checkDate(o.endDate as api.Date);
     unittest.expect(o.formattedType, unittest.equals('foo'));
     unittest.expect(o.jobDescription, unittest.equals('foo'));
     unittest.expect(o.location, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.phoneticName, unittest.equals('foo'));
-    checkDate(o.startDate);
+    checkDate(o.startDate as api.Date);
     unittest.expect(o.symbol, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -1271,8 +1272,8 @@
 
 void checkUnnamed4874(core.List<api.Address> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddress(o[0]);
-  checkAddress(o[1]);
+  checkAddress(o[0] as api.Address);
+  checkAddress(o[1] as api.Address);
 }
 
 core.List<api.AgeRangeType> buildUnnamed4875() {
@@ -1284,8 +1285,8 @@
 
 void checkUnnamed4875(core.List<api.AgeRangeType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAgeRangeType(o[0]);
-  checkAgeRangeType(o[1]);
+  checkAgeRangeType(o[0] as api.AgeRangeType);
+  checkAgeRangeType(o[1] as api.AgeRangeType);
 }
 
 core.List<api.Biography> buildUnnamed4876() {
@@ -1297,8 +1298,8 @@
 
 void checkUnnamed4876(core.List<api.Biography> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBiography(o[0]);
-  checkBiography(o[1]);
+  checkBiography(o[0] as api.Biography);
+  checkBiography(o[1] as api.Biography);
 }
 
 core.List<api.Birthday> buildUnnamed4877() {
@@ -1310,8 +1311,8 @@
 
 void checkUnnamed4877(core.List<api.Birthday> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBirthday(o[0]);
-  checkBirthday(o[1]);
+  checkBirthday(o[0] as api.Birthday);
+  checkBirthday(o[1] as api.Birthday);
 }
 
 core.List<api.BraggingRights> buildUnnamed4878() {
@@ -1323,8 +1324,8 @@
 
 void checkUnnamed4878(core.List<api.BraggingRights> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBraggingRights(o[0]);
-  checkBraggingRights(o[1]);
+  checkBraggingRights(o[0] as api.BraggingRights);
+  checkBraggingRights(o[1] as api.BraggingRights);
 }
 
 core.List<api.CalendarUrl> buildUnnamed4879() {
@@ -1336,8 +1337,8 @@
 
 void checkUnnamed4879(core.List<api.CalendarUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCalendarUrl(o[0]);
-  checkCalendarUrl(o[1]);
+  checkCalendarUrl(o[0] as api.CalendarUrl);
+  checkCalendarUrl(o[1] as api.CalendarUrl);
 }
 
 core.List<api.ClientData> buildUnnamed4880() {
@@ -1349,8 +1350,8 @@
 
 void checkUnnamed4880(core.List<api.ClientData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClientData(o[0]);
-  checkClientData(o[1]);
+  checkClientData(o[0] as api.ClientData);
+  checkClientData(o[1] as api.ClientData);
 }
 
 core.List<api.CoverPhoto> buildUnnamed4881() {
@@ -1362,8 +1363,8 @@
 
 void checkUnnamed4881(core.List<api.CoverPhoto> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCoverPhoto(o[0]);
-  checkCoverPhoto(o[1]);
+  checkCoverPhoto(o[0] as api.CoverPhoto);
+  checkCoverPhoto(o[1] as api.CoverPhoto);
 }
 
 core.List<api.EmailAddress> buildUnnamed4882() {
@@ -1375,8 +1376,8 @@
 
 void checkUnnamed4882(core.List<api.EmailAddress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEmailAddress(o[0]);
-  checkEmailAddress(o[1]);
+  checkEmailAddress(o[0] as api.EmailAddress);
+  checkEmailAddress(o[1] as api.EmailAddress);
 }
 
 core.List<api.Event> buildUnnamed4883() {
@@ -1388,8 +1389,8 @@
 
 void checkUnnamed4883(core.List<api.Event> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEvent(o[0]);
-  checkEvent(o[1]);
+  checkEvent(o[0] as api.Event);
+  checkEvent(o[1] as api.Event);
 }
 
 core.List<api.ExternalId> buildUnnamed4884() {
@@ -1401,8 +1402,8 @@
 
 void checkUnnamed4884(core.List<api.ExternalId> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExternalId(o[0]);
-  checkExternalId(o[1]);
+  checkExternalId(o[0] as api.ExternalId);
+  checkExternalId(o[1] as api.ExternalId);
 }
 
 core.List<api.FileAs> buildUnnamed4885() {
@@ -1414,8 +1415,8 @@
 
 void checkUnnamed4885(core.List<api.FileAs> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileAs(o[0]);
-  checkFileAs(o[1]);
+  checkFileAs(o[0] as api.FileAs);
+  checkFileAs(o[1] as api.FileAs);
 }
 
 core.List<api.Gender> buildUnnamed4886() {
@@ -1427,8 +1428,8 @@
 
 void checkUnnamed4886(core.List<api.Gender> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGender(o[0]);
-  checkGender(o[1]);
+  checkGender(o[0] as api.Gender);
+  checkGender(o[1] as api.Gender);
 }
 
 core.List<api.ImClient> buildUnnamed4887() {
@@ -1440,8 +1441,8 @@
 
 void checkUnnamed4887(core.List<api.ImClient> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkImClient(o[0]);
-  checkImClient(o[1]);
+  checkImClient(o[0] as api.ImClient);
+  checkImClient(o[1] as api.ImClient);
 }
 
 core.List<api.Interest> buildUnnamed4888() {
@@ -1453,8 +1454,8 @@
 
 void checkUnnamed4888(core.List<api.Interest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInterest(o[0]);
-  checkInterest(o[1]);
+  checkInterest(o[0] as api.Interest);
+  checkInterest(o[1] as api.Interest);
 }
 
 core.List<api.Locale> buildUnnamed4889() {
@@ -1466,8 +1467,8 @@
 
 void checkUnnamed4889(core.List<api.Locale> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocale(o[0]);
-  checkLocale(o[1]);
+  checkLocale(o[0] as api.Locale);
+  checkLocale(o[1] as api.Locale);
 }
 
 core.List<api.Location> buildUnnamed4890() {
@@ -1479,8 +1480,8 @@
 
 void checkUnnamed4890(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.List<api.Membership> buildUnnamed4891() {
@@ -1492,8 +1493,8 @@
 
 void checkUnnamed4891(core.List<api.Membership> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMembership(o[0]);
-  checkMembership(o[1]);
+  checkMembership(o[0] as api.Membership);
+  checkMembership(o[1] as api.Membership);
 }
 
 core.List<api.MiscKeyword> buildUnnamed4892() {
@@ -1505,8 +1506,8 @@
 
 void checkUnnamed4892(core.List<api.MiscKeyword> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMiscKeyword(o[0]);
-  checkMiscKeyword(o[1]);
+  checkMiscKeyword(o[0] as api.MiscKeyword);
+  checkMiscKeyword(o[1] as api.MiscKeyword);
 }
 
 core.List<api.Name> buildUnnamed4893() {
@@ -1518,8 +1519,8 @@
 
 void checkUnnamed4893(core.List<api.Name> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkName(o[0]);
-  checkName(o[1]);
+  checkName(o[0] as api.Name);
+  checkName(o[1] as api.Name);
 }
 
 core.List<api.Nickname> buildUnnamed4894() {
@@ -1531,8 +1532,8 @@
 
 void checkUnnamed4894(core.List<api.Nickname> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNickname(o[0]);
-  checkNickname(o[1]);
+  checkNickname(o[0] as api.Nickname);
+  checkNickname(o[1] as api.Nickname);
 }
 
 core.List<api.Occupation> buildUnnamed4895() {
@@ -1544,8 +1545,8 @@
 
 void checkUnnamed4895(core.List<api.Occupation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOccupation(o[0]);
-  checkOccupation(o[1]);
+  checkOccupation(o[0] as api.Occupation);
+  checkOccupation(o[1] as api.Occupation);
 }
 
 core.List<api.Organization> buildUnnamed4896() {
@@ -1557,8 +1558,8 @@
 
 void checkUnnamed4896(core.List<api.Organization> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrganization(o[0]);
-  checkOrganization(o[1]);
+  checkOrganization(o[0] as api.Organization);
+  checkOrganization(o[1] as api.Organization);
 }
 
 core.List<api.PhoneNumber> buildUnnamed4897() {
@@ -1570,8 +1571,8 @@
 
 void checkUnnamed4897(core.List<api.PhoneNumber> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPhoneNumber(o[0]);
-  checkPhoneNumber(o[1]);
+  checkPhoneNumber(o[0] as api.PhoneNumber);
+  checkPhoneNumber(o[1] as api.PhoneNumber);
 }
 
 core.List<api.Photo> buildUnnamed4898() {
@@ -1583,8 +1584,8 @@
 
 void checkUnnamed4898(core.List<api.Photo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPhoto(o[0]);
-  checkPhoto(o[1]);
+  checkPhoto(o[0] as api.Photo);
+  checkPhoto(o[1] as api.Photo);
 }
 
 core.List<api.Relation> buildUnnamed4899() {
@@ -1596,8 +1597,8 @@
 
 void checkUnnamed4899(core.List<api.Relation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRelation(o[0]);
-  checkRelation(o[1]);
+  checkRelation(o[0] as api.Relation);
+  checkRelation(o[1] as api.Relation);
 }
 
 core.List<api.RelationshipInterest> buildUnnamed4900() {
@@ -1609,8 +1610,8 @@
 
 void checkUnnamed4900(core.List<api.RelationshipInterest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRelationshipInterest(o[0]);
-  checkRelationshipInterest(o[1]);
+  checkRelationshipInterest(o[0] as api.RelationshipInterest);
+  checkRelationshipInterest(o[1] as api.RelationshipInterest);
 }
 
 core.List<api.RelationshipStatus> buildUnnamed4901() {
@@ -1622,8 +1623,8 @@
 
 void checkUnnamed4901(core.List<api.RelationshipStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRelationshipStatus(o[0]);
-  checkRelationshipStatus(o[1]);
+  checkRelationshipStatus(o[0] as api.RelationshipStatus);
+  checkRelationshipStatus(o[1] as api.RelationshipStatus);
 }
 
 core.List<api.Residence> buildUnnamed4902() {
@@ -1635,8 +1636,8 @@
 
 void checkUnnamed4902(core.List<api.Residence> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResidence(o[0]);
-  checkResidence(o[1]);
+  checkResidence(o[0] as api.Residence);
+  checkResidence(o[1] as api.Residence);
 }
 
 core.List<api.SipAddress> buildUnnamed4903() {
@@ -1648,8 +1649,8 @@
 
 void checkUnnamed4903(core.List<api.SipAddress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSipAddress(o[0]);
-  checkSipAddress(o[1]);
+  checkSipAddress(o[0] as api.SipAddress);
+  checkSipAddress(o[1] as api.SipAddress);
 }
 
 core.List<api.Skill> buildUnnamed4904() {
@@ -1661,8 +1662,8 @@
 
 void checkUnnamed4904(core.List<api.Skill> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSkill(o[0]);
-  checkSkill(o[1]);
+  checkSkill(o[0] as api.Skill);
+  checkSkill(o[1] as api.Skill);
 }
 
 core.List<api.Tagline> buildUnnamed4905() {
@@ -1674,8 +1675,8 @@
 
 void checkUnnamed4905(core.List<api.Tagline> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTagline(o[0]);
-  checkTagline(o[1]);
+  checkTagline(o[0] as api.Tagline);
+  checkTagline(o[1] as api.Tagline);
 }
 
 core.List<api.Url> buildUnnamed4906() {
@@ -1687,8 +1688,8 @@
 
 void checkUnnamed4906(core.List<api.Url> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUrl(o[0]);
-  checkUrl(o[1]);
+  checkUrl(o[0] as api.Url);
+  checkUrl(o[1] as api.Url);
 }
 
 core.List<api.UserDefined> buildUnnamed4907() {
@@ -1700,8 +1701,8 @@
 
 void checkUnnamed4907(core.List<api.UserDefined> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserDefined(o[0]);
-  checkUserDefined(o[1]);
+  checkUserDefined(o[0] as api.UserDefined);
+  checkUserDefined(o[1] as api.UserDefined);
 }
 
 core.int buildCounterPerson = 0;
@@ -1775,7 +1776,7 @@
     checkUnnamed4889(o.locales);
     checkUnnamed4890(o.locations);
     checkUnnamed4891(o.memberships);
-    checkPersonMetadata(o.metadata);
+    checkPersonMetadata(o.metadata as api.PersonMetadata);
     checkUnnamed4892(o.miscKeywords);
     checkUnnamed4893(o.names);
     checkUnnamed4894(o.nicknames);
@@ -1832,8 +1833,8 @@
 
 void checkUnnamed4910(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSource(o[0]);
-  checkSource(o[1]);
+  checkSource(o[0] as api.Source);
+  checkSource(o[1] as api.Source);
 }
 
 core.int buildCounterPersonMetadata = 0;
@@ -1881,9 +1882,9 @@
   buildCounterPersonResponse++;
   if (buildCounterPersonResponse < 3) {
     unittest.expect(o.httpStatusCode, unittest.equals(42));
-    checkPerson(o.person);
+    checkPerson(o.person as api.Person);
     unittest.expect(o.requestedResourceName, unittest.equals('foo'));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
   }
   buildCounterPersonResponse--;
 }
@@ -1908,7 +1909,7 @@
   if (buildCounterPhoneNumber < 3) {
     unittest.expect(o.canonicalForm, unittest.equals('foo'));
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -1932,7 +1933,7 @@
   buildCounterPhoto++;
   if (buildCounterPhoto < 3) {
     unittest.expect(o.default_, unittest.isTrue);
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterPhoto--;
@@ -1990,7 +1991,7 @@
   buildCounterRelation++;
   if (buildCounterRelation < 3) {
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.person, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -2014,7 +2015,7 @@
   buildCounterRelationshipInterest++;
   if (buildCounterRelationshipInterest < 3) {
     unittest.expect(o.formattedValue, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterRelationshipInterest--;
@@ -2037,7 +2038,7 @@
   buildCounterRelationshipStatus++;
   if (buildCounterRelationshipStatus < 3) {
     unittest.expect(o.formattedValue, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterRelationshipStatus--;
@@ -2060,7 +2061,7 @@
   buildCounterResidence++;
   if (buildCounterResidence < 3) {
     unittest.expect(o.current, unittest.isTrue);
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterResidence--;
@@ -2075,8 +2076,8 @@
 
 void checkUnnamed4912(core.List<api.Person> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPerson(o[0]);
-  checkPerson(o[1]);
+  checkPerson(o[0] as api.Person);
+  checkPerson(o[1] as api.Person);
 }
 
 core.int buildCounterSearchDirectoryPeopleResponse = 0;
@@ -2120,7 +2121,7 @@
   buildCounterSipAddress++;
   if (buildCounterSipAddress < 3) {
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -2142,7 +2143,7 @@
 void checkSkill(api.Skill o) {
   buildCounterSkill++;
   if (buildCounterSkill < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterSkill--;
@@ -2168,7 +2169,7 @@
   if (buildCounterSource < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkProfileMetadata(o.profileMetadata);
+    checkProfileMetadata(o.profileMetadata as api.ProfileMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -2255,7 +2256,7 @@
 void checkTagline(api.Tagline o) {
   buildCounterTagline++;
   if (buildCounterTagline < 3) {
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterTagline--;
@@ -2275,7 +2276,7 @@
 void checkUpdateContactGroupRequest(api.UpdateContactGroupRequest o) {
   buildCounterUpdateContactGroupRequest++;
   if (buildCounterUpdateContactGroupRequest < 3) {
-    checkContactGroup(o.contactGroup);
+    checkContactGroup(o.contactGroup as api.ContactGroup);
   }
   buildCounterUpdateContactGroupRequest--;
 }
@@ -2330,7 +2331,7 @@
 void checkUpdateContactPhotoResponse(api.UpdateContactPhotoResponse o) {
   buildCounterUpdateContactPhotoResponse++;
   if (buildCounterUpdateContactPhotoResponse < 3) {
-    checkPerson(o.person);
+    checkPerson(o.person as api.Person);
   }
   buildCounterUpdateContactPhotoResponse--;
 }
@@ -2353,7 +2354,7 @@
   buildCounterUrl++;
   if (buildCounterUrl < 3) {
     unittest.expect(o.formattedType, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -2377,7 +2378,7 @@
   buildCounterUserDefined++;
   if (buildCounterUserDefined < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkFieldMetadata(o.metadata);
+    checkFieldMetadata(o.metadata as api.FieldMetadata);
     unittest.expect(o.value, unittest.equals('foo'));
   }
   buildCounterUserDefined--;
@@ -2544,7 +2545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddress();
       var od = api.Address.fromJson(o.toJson());
-      checkAddress(od);
+      checkAddress(od as api.Address);
     });
   });
 
@@ -2552,7 +2553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAgeRangeType();
       var od = api.AgeRangeType.fromJson(o.toJson());
-      checkAgeRangeType(od);
+      checkAgeRangeType(od as api.AgeRangeType);
     });
   });
 
@@ -2560,7 +2561,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetContactGroupsResponse();
       var od = api.BatchGetContactGroupsResponse.fromJson(o.toJson());
-      checkBatchGetContactGroupsResponse(od);
+      checkBatchGetContactGroupsResponse(
+          od as api.BatchGetContactGroupsResponse);
     });
   });
 
@@ -2568,7 +2570,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBiography();
       var od = api.Biography.fromJson(o.toJson());
-      checkBiography(od);
+      checkBiography(od as api.Biography);
     });
   });
 
@@ -2576,7 +2578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBirthday();
       var od = api.Birthday.fromJson(o.toJson());
-      checkBirthday(od);
+      checkBirthday(od as api.Birthday);
     });
   });
 
@@ -2584,7 +2586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBraggingRights();
       var od = api.BraggingRights.fromJson(o.toJson());
-      checkBraggingRights(od);
+      checkBraggingRights(od as api.BraggingRights);
     });
   });
 
@@ -2592,7 +2594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCalendarUrl();
       var od = api.CalendarUrl.fromJson(o.toJson());
-      checkCalendarUrl(od);
+      checkCalendarUrl(od as api.CalendarUrl);
     });
   });
 
@@ -2600,7 +2602,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClientData();
       var od = api.ClientData.fromJson(o.toJson());
-      checkClientData(od);
+      checkClientData(od as api.ClientData);
     });
   });
 
@@ -2608,7 +2610,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContactGroup();
       var od = api.ContactGroup.fromJson(o.toJson());
-      checkContactGroup(od);
+      checkContactGroup(od as api.ContactGroup);
     });
   });
 
@@ -2616,7 +2618,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContactGroupMembership();
       var od = api.ContactGroupMembership.fromJson(o.toJson());
-      checkContactGroupMembership(od);
+      checkContactGroupMembership(od as api.ContactGroupMembership);
     });
   });
 
@@ -2624,7 +2626,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContactGroupMetadata();
       var od = api.ContactGroupMetadata.fromJson(o.toJson());
-      checkContactGroupMetadata(od);
+      checkContactGroupMetadata(od as api.ContactGroupMetadata);
     });
   });
 
@@ -2632,7 +2634,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContactGroupResponse();
       var od = api.ContactGroupResponse.fromJson(o.toJson());
-      checkContactGroupResponse(od);
+      checkContactGroupResponse(od as api.ContactGroupResponse);
     });
   });
 
@@ -2641,7 +2643,8 @@
       var o = buildCopyOtherContactToMyContactsGroupRequest();
       var od =
           api.CopyOtherContactToMyContactsGroupRequest.fromJson(o.toJson());
-      checkCopyOtherContactToMyContactsGroupRequest(od);
+      checkCopyOtherContactToMyContactsGroupRequest(
+          od as api.CopyOtherContactToMyContactsGroupRequest);
     });
   });
 
@@ -2649,7 +2652,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCoverPhoto();
       var od = api.CoverPhoto.fromJson(o.toJson());
-      checkCoverPhoto(od);
+      checkCoverPhoto(od as api.CoverPhoto);
     });
   });
 
@@ -2657,7 +2660,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateContactGroupRequest();
       var od = api.CreateContactGroupRequest.fromJson(o.toJson());
-      checkCreateContactGroupRequest(od);
+      checkCreateContactGroupRequest(od as api.CreateContactGroupRequest);
     });
   });
 
@@ -2665,7 +2668,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -2673,7 +2676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteContactPhotoResponse();
       var od = api.DeleteContactPhotoResponse.fromJson(o.toJson());
-      checkDeleteContactPhotoResponse(od);
+      checkDeleteContactPhotoResponse(od as api.DeleteContactPhotoResponse);
     });
   });
 
@@ -2681,7 +2684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomainMembership();
       var od = api.DomainMembership.fromJson(o.toJson());
-      checkDomainMembership(od);
+      checkDomainMembership(od as api.DomainMembership);
     });
   });
 
@@ -2689,7 +2692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmailAddress();
       var od = api.EmailAddress.fromJson(o.toJson());
-      checkEmailAddress(od);
+      checkEmailAddress(od as api.EmailAddress);
     });
   });
 
@@ -2697,7 +2700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -2705,7 +2708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEvent();
       var od = api.Event.fromJson(o.toJson());
-      checkEvent(od);
+      checkEvent(od as api.Event);
     });
   });
 
@@ -2713,7 +2716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExternalId();
       var od = api.ExternalId.fromJson(o.toJson());
-      checkExternalId(od);
+      checkExternalId(od as api.ExternalId);
     });
   });
 
@@ -2721,7 +2724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFieldMetadata();
       var od = api.FieldMetadata.fromJson(o.toJson());
-      checkFieldMetadata(od);
+      checkFieldMetadata(od as api.FieldMetadata);
     });
   });
 
@@ -2729,7 +2732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileAs();
       var od = api.FileAs.fromJson(o.toJson());
-      checkFileAs(od);
+      checkFileAs(od as api.FileAs);
     });
   });
 
@@ -2737,7 +2740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGender();
       var od = api.Gender.fromJson(o.toJson());
-      checkGender(od);
+      checkGender(od as api.Gender);
     });
   });
 
@@ -2745,7 +2748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPeopleResponse();
       var od = api.GetPeopleResponse.fromJson(o.toJson());
-      checkGetPeopleResponse(od);
+      checkGetPeopleResponse(od as api.GetPeopleResponse);
     });
   });
 
@@ -2753,7 +2756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImClient();
       var od = api.ImClient.fromJson(o.toJson());
-      checkImClient(od);
+      checkImClient(od as api.ImClient);
     });
   });
 
@@ -2761,7 +2764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterest();
       var od = api.Interest.fromJson(o.toJson());
-      checkInterest(od);
+      checkInterest(od as api.Interest);
     });
   });
 
@@ -2769,7 +2772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListConnectionsResponse();
       var od = api.ListConnectionsResponse.fromJson(o.toJson());
-      checkListConnectionsResponse(od);
+      checkListConnectionsResponse(od as api.ListConnectionsResponse);
     });
   });
 
@@ -2777,7 +2780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListContactGroupsResponse();
       var od = api.ListContactGroupsResponse.fromJson(o.toJson());
-      checkListContactGroupsResponse(od);
+      checkListContactGroupsResponse(od as api.ListContactGroupsResponse);
     });
   });
 
@@ -2785,7 +2788,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDirectoryPeopleResponse();
       var od = api.ListDirectoryPeopleResponse.fromJson(o.toJson());
-      checkListDirectoryPeopleResponse(od);
+      checkListDirectoryPeopleResponse(od as api.ListDirectoryPeopleResponse);
     });
   });
 
@@ -2793,7 +2796,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOtherContactsResponse();
       var od = api.ListOtherContactsResponse.fromJson(o.toJson());
-      checkListOtherContactsResponse(od);
+      checkListOtherContactsResponse(od as api.ListOtherContactsResponse);
     });
   });
 
@@ -2801,7 +2804,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocale();
       var od = api.Locale.fromJson(o.toJson());
-      checkLocale(od);
+      checkLocale(od as api.Locale);
     });
   });
 
@@ -2809,7 +2812,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -2817,7 +2820,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembership();
       var od = api.Membership.fromJson(o.toJson());
-      checkMembership(od);
+      checkMembership(od as api.Membership);
     });
   });
 
@@ -2825,7 +2828,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMiscKeyword();
       var od = api.MiscKeyword.fromJson(o.toJson());
-      checkMiscKeyword(od);
+      checkMiscKeyword(od as api.MiscKeyword);
     });
   });
 
@@ -2833,7 +2836,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyContactGroupMembersRequest();
       var od = api.ModifyContactGroupMembersRequest.fromJson(o.toJson());
-      checkModifyContactGroupMembersRequest(od);
+      checkModifyContactGroupMembersRequest(
+          od as api.ModifyContactGroupMembersRequest);
     });
   });
 
@@ -2841,7 +2845,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyContactGroupMembersResponse();
       var od = api.ModifyContactGroupMembersResponse.fromJson(o.toJson());
-      checkModifyContactGroupMembersResponse(od);
+      checkModifyContactGroupMembersResponse(
+          od as api.ModifyContactGroupMembersResponse);
     });
   });
 
@@ -2849,7 +2854,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildName();
       var od = api.Name.fromJson(o.toJson());
-      checkName(od);
+      checkName(od as api.Name);
     });
   });
 
@@ -2857,7 +2862,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNickname();
       var od = api.Nickname.fromJson(o.toJson());
-      checkNickname(od);
+      checkNickname(od as api.Nickname);
     });
   });
 
@@ -2865,7 +2870,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOccupation();
       var od = api.Occupation.fromJson(o.toJson());
-      checkOccupation(od);
+      checkOccupation(od as api.Occupation);
     });
   });
 
@@ -2873,7 +2878,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrganization();
       var od = api.Organization.fromJson(o.toJson());
-      checkOrganization(od);
+      checkOrganization(od as api.Organization);
     });
   });
 
@@ -2881,7 +2886,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPerson();
       var od = api.Person.fromJson(o.toJson());
-      checkPerson(od);
+      checkPerson(od as api.Person);
     });
   });
 
@@ -2889,7 +2894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPersonMetadata();
       var od = api.PersonMetadata.fromJson(o.toJson());
-      checkPersonMetadata(od);
+      checkPersonMetadata(od as api.PersonMetadata);
     });
   });
 
@@ -2897,7 +2902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPersonResponse();
       var od = api.PersonResponse.fromJson(o.toJson());
-      checkPersonResponse(od);
+      checkPersonResponse(od as api.PersonResponse);
     });
   });
 
@@ -2905,7 +2910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPhoneNumber();
       var od = api.PhoneNumber.fromJson(o.toJson());
-      checkPhoneNumber(od);
+      checkPhoneNumber(od as api.PhoneNumber);
     });
   });
 
@@ -2913,7 +2918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPhoto();
       var od = api.Photo.fromJson(o.toJson());
-      checkPhoto(od);
+      checkPhoto(od as api.Photo);
     });
   });
 
@@ -2921,7 +2926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProfileMetadata();
       var od = api.ProfileMetadata.fromJson(o.toJson());
-      checkProfileMetadata(od);
+      checkProfileMetadata(od as api.ProfileMetadata);
     });
   });
 
@@ -2929,7 +2934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRelation();
       var od = api.Relation.fromJson(o.toJson());
-      checkRelation(od);
+      checkRelation(od as api.Relation);
     });
   });
 
@@ -2937,7 +2942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRelationshipInterest();
       var od = api.RelationshipInterest.fromJson(o.toJson());
-      checkRelationshipInterest(od);
+      checkRelationshipInterest(od as api.RelationshipInterest);
     });
   });
 
@@ -2945,7 +2950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRelationshipStatus();
       var od = api.RelationshipStatus.fromJson(o.toJson());
-      checkRelationshipStatus(od);
+      checkRelationshipStatus(od as api.RelationshipStatus);
     });
   });
 
@@ -2953,7 +2958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResidence();
       var od = api.Residence.fromJson(o.toJson());
-      checkResidence(od);
+      checkResidence(od as api.Residence);
     });
   });
 
@@ -2961,7 +2966,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchDirectoryPeopleResponse();
       var od = api.SearchDirectoryPeopleResponse.fromJson(o.toJson());
-      checkSearchDirectoryPeopleResponse(od);
+      checkSearchDirectoryPeopleResponse(
+          od as api.SearchDirectoryPeopleResponse);
     });
   });
 
@@ -2969,7 +2975,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSipAddress();
       var od = api.SipAddress.fromJson(o.toJson());
-      checkSipAddress(od);
+      checkSipAddress(od as api.SipAddress);
     });
   });
 
@@ -2977,7 +2983,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSkill();
       var od = api.Skill.fromJson(o.toJson());
-      checkSkill(od);
+      checkSkill(od as api.Skill);
     });
   });
 
@@ -2985,7 +2991,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSource();
       var od = api.Source.fromJson(o.toJson());
-      checkSource(od);
+      checkSource(od as api.Source);
     });
   });
 
@@ -2993,7 +2999,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3001,7 +3007,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTagline();
       var od = api.Tagline.fromJson(o.toJson());
-      checkTagline(od);
+      checkTagline(od as api.Tagline);
     });
   });
 
@@ -3009,7 +3015,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateContactGroupRequest();
       var od = api.UpdateContactGroupRequest.fromJson(o.toJson());
-      checkUpdateContactGroupRequest(od);
+      checkUpdateContactGroupRequest(od as api.UpdateContactGroupRequest);
     });
   });
 
@@ -3017,7 +3023,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateContactPhotoRequest();
       var od = api.UpdateContactPhotoRequest.fromJson(o.toJson());
-      checkUpdateContactPhotoRequest(od);
+      checkUpdateContactPhotoRequest(od as api.UpdateContactPhotoRequest);
     });
   });
 
@@ -3025,7 +3031,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateContactPhotoResponse();
       var od = api.UpdateContactPhotoResponse.fromJson(o.toJson());
-      checkUpdateContactPhotoResponse(od);
+      checkUpdateContactPhotoResponse(od as api.UpdateContactPhotoResponse);
     });
   });
 
@@ -3033,7 +3039,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUrl();
       var od = api.Url.fromJson(o.toJson());
-      checkUrl(od);
+      checkUrl(od as api.Url);
     });
   });
 
@@ -3041,7 +3047,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserDefined();
       var od = api.UserDefined.fromJson(o.toJson());
-      checkUserDefined(od);
+      checkUserDefined(od as api.UserDefined);
     });
   });
 
@@ -3097,7 +3103,8 @@
               resourceNames: arg_resourceNames,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetContactGroupsResponse(response);
+        checkBatchGetContactGroupsResponse(
+            response as api.BatchGetContactGroupsResponse);
       })));
     });
 
@@ -3107,8 +3114,9 @@
       var arg_request = buildCreateContactGroupRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateContactGroupRequest.fromJson(json);
-        checkCreateContactGroupRequest(obj);
+        var obj = api.CreateContactGroupRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateContactGroupRequest(obj as api.CreateContactGroupRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3147,7 +3155,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContactGroup(response);
+        checkContactGroup(response as api.ContactGroup);
       })));
     });
 
@@ -3199,7 +3207,7 @@
           .delete(arg_resourceName,
               deleteContacts: arg_deleteContacts, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3251,7 +3259,7 @@
           .get(arg_resourceName,
               maxMembers: arg_maxMembers, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContactGroup(response);
+        checkContactGroup(response as api.ContactGroup);
       })));
     });
 
@@ -3310,7 +3318,8 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListContactGroupsResponse(response);
+        checkListContactGroupsResponse(
+            response as api.ListContactGroupsResponse);
       })));
     });
 
@@ -3321,8 +3330,9 @@
       var arg_resourceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateContactGroupRequest.fromJson(json);
-        checkUpdateContactGroupRequest(obj);
+        var obj = api.UpdateContactGroupRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateContactGroupRequest(obj as api.UpdateContactGroupRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3362,7 +3372,7 @@
       res
           .update(arg_request, arg_resourceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContactGroup(response);
+        checkContactGroup(response as api.ContactGroup);
       })));
     });
   });
@@ -3375,8 +3385,10 @@
       var arg_resourceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyContactGroupMembersRequest.fromJson(json);
-        checkModifyContactGroupMembersRequest(obj);
+        var obj = api.ModifyContactGroupMembersRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyContactGroupMembersRequest(
+            obj as api.ModifyContactGroupMembersRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3417,7 +3429,8 @@
       res
           .modify(arg_request, arg_resourceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkModifyContactGroupMembersResponse(response);
+        checkModifyContactGroupMembersResponse(
+            response as api.ModifyContactGroupMembersResponse);
       })));
     });
   });
@@ -3430,8 +3443,10 @@
       var arg_resourceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CopyOtherContactToMyContactsGroupRequest.fromJson(json);
-        checkCopyOtherContactToMyContactsGroupRequest(obj);
+        var obj = api.CopyOtherContactToMyContactsGroupRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCopyOtherContactToMyContactsGroupRequest(
+            obj as api.CopyOtherContactToMyContactsGroupRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3472,7 +3487,7 @@
           .copyOtherContactToMyContactsGroup(arg_request, arg_resourceName,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPerson(response);
+        checkPerson(response as api.Person);
       })));
     });
 
@@ -3539,7 +3554,8 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOtherContactsResponse(response);
+        checkListOtherContactsResponse(
+            response as api.ListOtherContactsResponse);
       })));
     });
   });
@@ -3553,8 +3569,9 @@
       var arg_sources = buildUnnamed4917();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Person.fromJson(json);
-        checkPerson(obj);
+        var obj =
+            api.Person.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPerson(obj as api.Person);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3599,7 +3616,7 @@
               sources: arg_sources,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPerson(response);
+        checkPerson(response as api.Person);
       })));
     });
 
@@ -3647,7 +3664,7 @@
       res
           .deleteContact(arg_resourceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3703,7 +3720,8 @@
               sources: arg_sources,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeleteContactPhotoResponse(response);
+        checkDeleteContactPhotoResponse(
+            response as api.DeleteContactPhotoResponse);
       })));
     });
 
@@ -3763,7 +3781,7 @@
               sources: arg_sources,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPerson(response);
+        checkPerson(response as api.Person);
       })));
     });
 
@@ -3825,7 +3843,7 @@
               sources: arg_sources,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetPeopleResponse(response);
+        checkGetPeopleResponse(response as api.GetPeopleResponse);
       })));
     });
 
@@ -3899,7 +3917,8 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDirectoryPeopleResponse(response);
+        checkListDirectoryPeopleResponse(
+            response as api.ListDirectoryPeopleResponse);
       })));
     });
 
@@ -3968,7 +3987,8 @@
               sources: arg_sources,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchDirectoryPeopleResponse(response);
+        checkSearchDirectoryPeopleResponse(
+            response as api.SearchDirectoryPeopleResponse);
       })));
     });
 
@@ -3982,8 +4002,9 @@
       var arg_updatePersonFields = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Person.fromJson(json);
-        checkPerson(obj);
+        var obj =
+            api.Person.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPerson(obj as api.Person);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4032,7 +4053,7 @@
               updatePersonFields: arg_updatePersonFields,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPerson(response);
+        checkPerson(response as api.Person);
       })));
     });
 
@@ -4043,8 +4064,9 @@
       var arg_resourceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateContactPhotoRequest.fromJson(json);
-        checkUpdateContactPhotoRequest(obj);
+        var obj = api.UpdateContactPhotoRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateContactPhotoRequest(obj as api.UpdateContactPhotoRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4085,7 +4107,8 @@
           .updateContactPhoto(arg_request, arg_resourceName,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUpdateContactPhotoResponse(response);
+        checkUpdateContactPhotoResponse(
+            response as api.UpdateContactPhotoResponse);
       })));
     });
   });
@@ -4167,7 +4190,7 @@
               syncToken: arg_syncToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListConnectionsResponse(response);
+        checkListConnectionsResponse(response as api.ListConnectionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/playcustomapp/v1_test.dart b/generated/googleapis/test/playcustomapp/v1_test.dart
index 525188b..6c7923d 100644
--- a/generated/googleapis/test/playcustomapp/v1_test.dart
+++ b/generated/googleapis/test/playcustomapp/v1_test.dart
@@ -102,7 +102,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomApp();
       var od = api.CustomApp.fromJson(o.toJson());
-      checkCustomApp(od);
+      checkCustomApp(od as api.CustomApp);
     });
   });
 
@@ -117,8 +117,9 @@
       var arg_account = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomApp.fromJson(json);
-        checkCustomApp(obj);
+        var obj =
+            api.CustomApp.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCustomApp(obj as api.CustomApp);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -166,7 +167,7 @@
       res
           .create(arg_request, arg_account, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomApp(response);
+        checkCustomApp(response as api.CustomApp);
       })));
     });
   });
diff --git a/generated/googleapis/test/policytroubleshooter/v1_test.dart b/generated/googleapis/test/policytroubleshooter/v1_test.dart
index 6fb61dc..112ab11 100644
--- a/generated/googleapis/test/policytroubleshooter/v1_test.dart
+++ b/generated/googleapis/test/policytroubleshooter/v1_test.dart
@@ -117,9 +117,11 @@
         o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership(
-      o['x']);
+      o['x'] as api
+          .GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership);
   checkGoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership(
-      o['y']);
+      o['y'] as api
+          .GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership);
 }
 
 core.int buildCounterGoogleCloudPolicytroubleshooterV1BindingExplanation = 0;
@@ -145,7 +147,7 @@
   buildCounterGoogleCloudPolicytroubleshooterV1BindingExplanation++;
   if (buildCounterGoogleCloudPolicytroubleshooterV1BindingExplanation < 3) {
     unittest.expect(o.access, unittest.equals('foo'));
-    checkGoogleTypeExpr(o.condition);
+    checkGoogleTypeExpr(o.condition as api.GoogleTypeExpr);
     checkUnnamed571(o.memberships);
     unittest.expect(o.relevance, unittest.equals('foo'));
     unittest.expect(o.role, unittest.equals('foo'));
@@ -195,8 +197,10 @@
 void checkUnnamed572(
     core.List<api.GoogleCloudPolicytroubleshooterV1BindingExplanation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudPolicytroubleshooterV1BindingExplanation(o[0]);
-  checkGoogleCloudPolicytroubleshooterV1BindingExplanation(o[1]);
+  checkGoogleCloudPolicytroubleshooterV1BindingExplanation(
+      o[0] as api.GoogleCloudPolicytroubleshooterV1BindingExplanation);
+  checkGoogleCloudPolicytroubleshooterV1BindingExplanation(
+      o[1] as api.GoogleCloudPolicytroubleshooterV1BindingExplanation);
 }
 
 core.int buildCounterGoogleCloudPolicytroubleshooterV1ExplainedPolicy = 0;
@@ -222,7 +226,7 @@
     unittest.expect(o.access, unittest.equals('foo'));
     checkUnnamed572(o.bindingExplanations);
     unittest.expect(o.fullResourceName, unittest.equals('foo'));
-    checkGoogleIamV1Policy(o.policy);
+    checkGoogleIamV1Policy(o.policy as api.GoogleIamV1Policy);
     unittest.expect(o.relevance, unittest.equals('foo'));
   }
   buildCounterGoogleCloudPolicytroubleshooterV1ExplainedPolicy--;
@@ -248,7 +252,8 @@
   buildCounterGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest++;
   if (buildCounterGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest <
       3) {
-    checkGoogleCloudPolicytroubleshooterV1AccessTuple(o.accessTuple);
+    checkGoogleCloudPolicytroubleshooterV1AccessTuple(
+        o.accessTuple as api.GoogleCloudPolicytroubleshooterV1AccessTuple);
   }
   buildCounterGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest--;
 }
@@ -264,8 +269,10 @@
 void checkUnnamed573(
     core.List<api.GoogleCloudPolicytroubleshooterV1ExplainedPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudPolicytroubleshooterV1ExplainedPolicy(o[0]);
-  checkGoogleCloudPolicytroubleshooterV1ExplainedPolicy(o[1]);
+  checkGoogleCloudPolicytroubleshooterV1ExplainedPolicy(
+      o[0] as api.GoogleCloudPolicytroubleshooterV1ExplainedPolicy);
+  checkGoogleCloudPolicytroubleshooterV1ExplainedPolicy(
+      o[1] as api.GoogleCloudPolicytroubleshooterV1ExplainedPolicy);
 }
 
 core.int
@@ -304,8 +311,8 @@
 
 void checkUnnamed574(core.List<api.GoogleIamV1AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1AuditLogConfig(o[0]);
-  checkGoogleIamV1AuditLogConfig(o[1]);
+  checkGoogleIamV1AuditLogConfig(o[0] as api.GoogleIamV1AuditLogConfig);
+  checkGoogleIamV1AuditLogConfig(o[1] as api.GoogleIamV1AuditLogConfig);
 }
 
 core.int buildCounterGoogleIamV1AuditConfig = 0;
@@ -392,7 +399,7 @@
 void checkGoogleIamV1Binding(api.GoogleIamV1Binding o) {
   buildCounterGoogleIamV1Binding++;
   if (buildCounterGoogleIamV1Binding < 3) {
-    checkGoogleTypeExpr(o.condition);
+    checkGoogleTypeExpr(o.condition as api.GoogleTypeExpr);
     checkUnnamed576(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -408,8 +415,8 @@
 
 void checkUnnamed577(core.List<api.GoogleIamV1AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1AuditConfig(o[0]);
-  checkGoogleIamV1AuditConfig(o[1]);
+  checkGoogleIamV1AuditConfig(o[0] as api.GoogleIamV1AuditConfig);
+  checkGoogleIamV1AuditConfig(o[1] as api.GoogleIamV1AuditConfig);
 }
 
 core.List<api.GoogleIamV1Binding> buildUnnamed578() {
@@ -421,8 +428,8 @@
 
 void checkUnnamed578(core.List<api.GoogleIamV1Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleIamV1Binding(o[0]);
-  checkGoogleIamV1Binding(o[1]);
+  checkGoogleIamV1Binding(o[0] as api.GoogleIamV1Binding);
+  checkGoogleIamV1Binding(o[1] as api.GoogleIamV1Binding);
 }
 
 core.int buildCounterGoogleIamV1Policy = 0;
@@ -481,7 +488,8 @@
       var o = buildGoogleCloudPolicytroubleshooterV1AccessTuple();
       var od =
           api.GoogleCloudPolicytroubleshooterV1AccessTuple.fromJson(o.toJson());
-      checkGoogleCloudPolicytroubleshooterV1AccessTuple(od);
+      checkGoogleCloudPolicytroubleshooterV1AccessTuple(
+          od as api.GoogleCloudPolicytroubleshooterV1AccessTuple);
     });
   });
 
@@ -491,7 +499,8 @@
       var o = buildGoogleCloudPolicytroubleshooterV1BindingExplanation();
       var od = api.GoogleCloudPolicytroubleshooterV1BindingExplanation.fromJson(
           o.toJson());
-      checkGoogleCloudPolicytroubleshooterV1BindingExplanation(od);
+      checkGoogleCloudPolicytroubleshooterV1BindingExplanation(
+          od as api.GoogleCloudPolicytroubleshooterV1BindingExplanation);
     });
   });
 
@@ -505,7 +514,8 @@
           api.GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership
               .fromJson(o.toJson());
       checkGoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership(
-          od);
+          od as api
+              .GoogleCloudPolicytroubleshooterV1BindingExplanationAnnotatedMembership);
     });
   });
 
@@ -515,7 +525,8 @@
       var o = buildGoogleCloudPolicytroubleshooterV1ExplainedPolicy();
       var od = api.GoogleCloudPolicytroubleshooterV1ExplainedPolicy.fromJson(
           o.toJson());
-      checkGoogleCloudPolicytroubleshooterV1ExplainedPolicy(od);
+      checkGoogleCloudPolicytroubleshooterV1ExplainedPolicy(
+          od as api.GoogleCloudPolicytroubleshooterV1ExplainedPolicy);
     });
   });
 
@@ -527,7 +538,8 @@
           buildGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest();
       var od = api.GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest
           .fromJson(o.toJson());
-      checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest(od);
+      checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest(od
+          as api.GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest);
     });
   });
 
@@ -540,7 +552,9 @@
       var od =
           api.GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse
               .fromJson(o.toJson());
-      checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse(od);
+      checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse(od
+          as api
+              .GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse);
     });
   });
 
@@ -548,7 +562,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1AuditConfig();
       var od = api.GoogleIamV1AuditConfig.fromJson(o.toJson());
-      checkGoogleIamV1AuditConfig(od);
+      checkGoogleIamV1AuditConfig(od as api.GoogleIamV1AuditConfig);
     });
   });
 
@@ -556,7 +570,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1AuditLogConfig();
       var od = api.GoogleIamV1AuditLogConfig.fromJson(o.toJson());
-      checkGoogleIamV1AuditLogConfig(od);
+      checkGoogleIamV1AuditLogConfig(od as api.GoogleIamV1AuditLogConfig);
     });
   });
 
@@ -564,7 +578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1Binding();
       var od = api.GoogleIamV1Binding.fromJson(o.toJson());
-      checkGoogleIamV1Binding(od);
+      checkGoogleIamV1Binding(od as api.GoogleIamV1Binding);
     });
   });
 
@@ -572,7 +586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleIamV1Policy();
       var od = api.GoogleIamV1Policy.fromJson(o.toJson());
-      checkGoogleIamV1Policy(od);
+      checkGoogleIamV1Policy(od as api.GoogleIamV1Policy);
     });
   });
 
@@ -580,7 +594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleTypeExpr();
       var od = api.GoogleTypeExpr.fromJson(o.toJson());
-      checkGoogleTypeExpr(od);
+      checkGoogleTypeExpr(od as api.GoogleTypeExpr);
     });
   });
 
@@ -594,8 +608,10 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest
-                .fromJson(json);
-        checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest(obj);
+                .fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest(obj
+            as api
+                .GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -636,7 +652,8 @@
           .troubleshoot(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
         checkGoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse(
-            response);
+            response as api
+                .GoogleCloudPolicytroubleshooterV1TroubleshootIamPolicyResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/poly/v1_test.dart b/generated/googleapis/test/poly/v1_test.dart
index 21671e3..18d4ff1 100644
--- a/generated/googleapis/test/poly/v1_test.dart
+++ b/generated/googleapis/test/poly/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed4329(core.List<api.Format> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFormat(o[0]);
-  checkFormat(o[1]);
+  checkFormat(o[0] as api.Format);
+  checkFormat(o[1] as api.Format);
 }
 
 core.int buildCounterAsset = 0;
@@ -123,9 +123,9 @@
     unittest.expect(o.license, unittest.equals('foo'));
     unittest.expect(o.metadata, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPresentationParams(o.presentationParams);
-    checkRemixInfo(o.remixInfo);
-    checkFile(o.thumbnail);
+    checkPresentationParams(o.presentationParams as api.PresentationParams);
+    checkRemixInfo(o.remixInfo as api.RemixInfo);
+    checkFile(o.thumbnail as api.File);
     unittest.expect(o.updateTime, unittest.equals('foo'));
     unittest.expect(o.visibility, unittest.equals('foo'));
   }
@@ -151,8 +151,8 @@
   if (buildCounterAssetImportMessage < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.filePath, unittest.equals('foo'));
-    checkImageError(o.imageError);
-    checkObjParseError(o.objParseError);
+    checkImageError(o.imageError as api.ImageError);
+    checkObjParseError(o.objParseError as api.ObjParseError);
   }
   buildCounterAssetImportMessage--;
 }
@@ -189,8 +189,8 @@
 
 void checkUnnamed4330(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFile(o[0]);
-  checkFile(o[1]);
+  checkFile(o[0] as api.File);
+  checkFile(o[1] as api.File);
 }
 
 core.int buildCounterFormat = 0;
@@ -210,10 +210,10 @@
 void checkFormat(api.Format o) {
   buildCounterFormat++;
   if (buildCounterFormat < 3) {
-    checkFormatComplexity(o.formatComplexity);
+    checkFormatComplexity(o.formatComplexity as api.FormatComplexity);
     unittest.expect(o.formatType, unittest.equals('foo'));
     checkUnnamed4330(o.resources);
-    checkFile(o.root);
+    checkFile(o.root as api.File);
   }
   buildCounterFormat--;
 }
@@ -269,8 +269,8 @@
 
 void checkUnnamed4331(core.List<api.Asset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAsset(o[0]);
-  checkAsset(o[1]);
+  checkAsset(o[0] as api.Asset);
+  checkAsset(o[1] as api.Asset);
 }
 
 core.int buildCounterListAssetsResponse = 0;
@@ -305,8 +305,8 @@
 
 void checkUnnamed4332(core.List<api.Asset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAsset(o[0]);
-  checkAsset(o[1]);
+  checkAsset(o[0] as api.Asset);
+  checkAsset(o[1] as api.Asset);
 }
 
 core.int buildCounterListLikedAssetsResponse = 0;
@@ -341,8 +341,8 @@
 
 void checkUnnamed4333(core.List<api.UserAsset> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserAsset(o[0]);
-  checkUserAsset(o[1]);
+  checkUserAsset(o[0] as api.UserAsset);
+  checkUserAsset(o[1] as api.UserAsset);
 }
 
 core.int buildCounterListUserAssetsResponse = 0;
@@ -415,7 +415,7 @@
   if (buildCounterPresentationParams < 3) {
     unittest.expect(o.backgroundColor, unittest.equals('foo'));
     unittest.expect(o.colorSpace, unittest.equals('foo'));
-    checkQuaternion(o.orientingRotation);
+    checkQuaternion(o.orientingRotation as api.Quaternion);
   }
   buildCounterPresentationParams--;
 }
@@ -486,8 +486,8 @@
 
 void checkUnnamed4335(core.List<api.AssetImportMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAssetImportMessage(o[0]);
-  checkAssetImportMessage(o[1]);
+  checkAssetImportMessage(o[0] as api.AssetImportMessage);
+  checkAssetImportMessage(o[1] as api.AssetImportMessage);
 }
 
 core.int buildCounterStartAssetImportResponse = 0;
@@ -529,7 +529,7 @@
 void checkUserAsset(api.UserAsset o) {
   buildCounterUserAsset++;
   if (buildCounterUserAsset < 3) {
-    checkAsset(o.asset);
+    checkAsset(o.asset as api.Asset);
   }
   buildCounterUserAsset--;
 }
@@ -539,7 +539,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsset();
       var od = api.Asset.fromJson(o.toJson());
-      checkAsset(od);
+      checkAsset(od as api.Asset);
     });
   });
 
@@ -547,7 +547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssetImportMessage();
       var od = api.AssetImportMessage.fromJson(o.toJson());
-      checkAssetImportMessage(od);
+      checkAssetImportMessage(od as api.AssetImportMessage);
     });
   });
 
@@ -555,7 +555,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFile();
       var od = api.File.fromJson(o.toJson());
-      checkFile(od);
+      checkFile(od as api.File);
     });
   });
 
@@ -563,7 +563,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFormat();
       var od = api.Format.fromJson(o.toJson());
-      checkFormat(od);
+      checkFormat(od as api.Format);
     });
   });
 
@@ -571,7 +571,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFormatComplexity();
       var od = api.FormatComplexity.fromJson(o.toJson());
-      checkFormatComplexity(od);
+      checkFormatComplexity(od as api.FormatComplexity);
     });
   });
 
@@ -579,7 +579,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageError();
       var od = api.ImageError.fromJson(o.toJson());
-      checkImageError(od);
+      checkImageError(od as api.ImageError);
     });
   });
 
@@ -587,7 +587,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAssetsResponse();
       var od = api.ListAssetsResponse.fromJson(o.toJson());
-      checkListAssetsResponse(od);
+      checkListAssetsResponse(od as api.ListAssetsResponse);
     });
   });
 
@@ -595,7 +595,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLikedAssetsResponse();
       var od = api.ListLikedAssetsResponse.fromJson(o.toJson());
-      checkListLikedAssetsResponse(od);
+      checkListLikedAssetsResponse(od as api.ListLikedAssetsResponse);
     });
   });
 
@@ -603,7 +603,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUserAssetsResponse();
       var od = api.ListUserAssetsResponse.fromJson(o.toJson());
-      checkListUserAssetsResponse(od);
+      checkListUserAssetsResponse(od as api.ListUserAssetsResponse);
     });
   });
 
@@ -611,7 +611,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjParseError();
       var od = api.ObjParseError.fromJson(o.toJson());
-      checkObjParseError(od);
+      checkObjParseError(od as api.ObjParseError);
     });
   });
 
@@ -619,7 +619,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPresentationParams();
       var od = api.PresentationParams.fromJson(o.toJson());
-      checkPresentationParams(od);
+      checkPresentationParams(od as api.PresentationParams);
     });
   });
 
@@ -627,7 +627,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuaternion();
       var od = api.Quaternion.fromJson(o.toJson());
-      checkQuaternion(od);
+      checkQuaternion(od as api.Quaternion);
     });
   });
 
@@ -635,7 +635,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemixInfo();
       var od = api.RemixInfo.fromJson(o.toJson());
-      checkRemixInfo(od);
+      checkRemixInfo(od as api.RemixInfo);
     });
   });
 
@@ -643,7 +643,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartAssetImportResponse();
       var od = api.StartAssetImportResponse.fromJson(o.toJson());
-      checkStartAssetImportResponse(od);
+      checkStartAssetImportResponse(od as api.StartAssetImportResponse);
     });
   });
 
@@ -651,7 +651,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserAsset();
       var od = api.UserAsset.fromJson(o.toJson());
-      checkUserAsset(od);
+      checkUserAsset(od as api.UserAsset);
     });
   });
 
@@ -700,7 +700,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAsset(response);
+        checkAsset(response as api.Asset);
       })));
     });
 
@@ -778,7 +778,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAssetsResponse(response);
+        checkListAssetsResponse(response as api.ListAssetsResponse);
       })));
     });
   });
@@ -848,7 +848,7 @@
               visibility: arg_visibility,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUserAssetsResponse(response);
+        checkListUserAssetsResponse(response as api.ListUserAssetsResponse);
       })));
     });
   });
@@ -914,7 +914,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLikedAssetsResponse(response);
+        checkListLikedAssetsResponse(response as api.ListLikedAssetsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/pubsub/v1_test.dart b/generated/googleapis/test/pubsub/v1_test.dart
index 6a43699..d3869a7 100644
--- a/generated/googleapis/test/pubsub/v1_test.dart
+++ b/generated/googleapis/test/pubsub/v1_test.dart
@@ -137,7 +137,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed410(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -282,8 +282,8 @@
 
 void checkUnnamed412(core.List<api.Snapshot> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSnapshot(o[0]);
-  checkSnapshot(o[1]);
+  checkSnapshot(o[0] as api.Snapshot);
+  checkSnapshot(o[1] as api.Snapshot);
 }
 
 core.int buildCounterListSnapshotsResponse = 0;
@@ -316,8 +316,8 @@
 
 void checkUnnamed413(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubscription(o[0]);
-  checkSubscription(o[1]);
+  checkSubscription(o[0] as api.Subscription);
+  checkSubscription(o[1] as api.Subscription);
 }
 
 core.int buildCounterListSubscriptionsResponse = 0;
@@ -418,8 +418,8 @@
 
 void checkUnnamed416(core.List<api.Topic> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTopic(o[0]);
-  checkTopic(o[1]);
+  checkTopic(o[0] as api.Topic);
+  checkTopic(o[1] as api.Topic);
 }
 
 core.int buildCounterListTopicsResponse = 0;
@@ -523,7 +523,7 @@
 void checkModifyPushConfigRequest(api.ModifyPushConfigRequest o) {
   buildCounterModifyPushConfigRequest++;
   if (buildCounterModifyPushConfigRequest < 3) {
-    checkPushConfig(o.pushConfig);
+    checkPushConfig(o.pushConfig as api.PushConfig);
   }
   buildCounterModifyPushConfigRequest--;
 }
@@ -558,8 +558,8 @@
 
 void checkUnnamed419(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -594,8 +594,8 @@
 
 void checkUnnamed420(core.List<api.PubsubMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPubsubMessage(o[0]);
-  checkPubsubMessage(o[1]);
+  checkPubsubMessage(o[0] as api.PubsubMessage);
+  checkPubsubMessage(o[1] as api.PubsubMessage);
 }
 
 core.int buildCounterPublishRequest = 0;
@@ -719,8 +719,8 @@
 
 void checkUnnamed423(core.List<api.ReceivedMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReceivedMessage(o[0]);
-  checkReceivedMessage(o[1]);
+  checkReceivedMessage(o[0] as api.ReceivedMessage);
+  checkReceivedMessage(o[1] as api.ReceivedMessage);
 }
 
 core.int buildCounterPullResponse = 0;
@@ -772,7 +772,7 @@
   buildCounterPushConfig++;
   if (buildCounterPushConfig < 3) {
     checkUnnamed424(o.attributes);
-    checkOidcToken(o.oidcToken);
+    checkOidcToken(o.oidcToken as api.OidcToken);
     unittest.expect(o.pushEndpoint, unittest.equals('foo'));
   }
   buildCounterPushConfig--;
@@ -796,7 +796,7 @@
   if (buildCounterReceivedMessage < 3) {
     unittest.expect(o.ackId, unittest.equals('foo'));
     unittest.expect(o.deliveryAttempt, unittest.equals(42));
-    checkPubsubMessage(o.message);
+    checkPubsubMessage(o.message as api.PubsubMessage);
   }
   buildCounterReceivedMessage--;
 }
@@ -872,7 +872,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -955,17 +955,17 @@
   buildCounterSubscription++;
   if (buildCounterSubscription < 3) {
     unittest.expect(o.ackDeadlineSeconds, unittest.equals(42));
-    checkDeadLetterPolicy(o.deadLetterPolicy);
+    checkDeadLetterPolicy(o.deadLetterPolicy as api.DeadLetterPolicy);
     unittest.expect(o.detached, unittest.isTrue);
     unittest.expect(o.enableMessageOrdering, unittest.isTrue);
-    checkExpirationPolicy(o.expirationPolicy);
+    checkExpirationPolicy(o.expirationPolicy as api.ExpirationPolicy);
     unittest.expect(o.filter, unittest.equals('foo'));
     checkUnnamed426(o.labels);
     unittest.expect(o.messageRetentionDuration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkPushConfig(o.pushConfig);
+    checkPushConfig(o.pushConfig as api.PushConfig);
     unittest.expect(o.retainAckedMessages, unittest.isTrue);
-    checkRetryPolicy(o.retryPolicy);
+    checkRetryPolicy(o.retryPolicy as api.RetryPolicy);
     unittest.expect(o.topic, unittest.equals('foo'));
   }
   buildCounterSubscription--;
@@ -1067,7 +1067,8 @@
   if (buildCounterTopic < 3) {
     unittest.expect(o.kmsKeyName, unittest.equals('foo'));
     checkUnnamed429(o.labels);
-    checkMessageStoragePolicy(o.messageStoragePolicy);
+    checkMessageStoragePolicy(
+        o.messageStoragePolicy as api.MessageStoragePolicy);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterTopic--;
@@ -1088,7 +1089,7 @@
 void checkUpdateSnapshotRequest(api.UpdateSnapshotRequest o) {
   buildCounterUpdateSnapshotRequest++;
   if (buildCounterUpdateSnapshotRequest < 3) {
-    checkSnapshot(o.snapshot);
+    checkSnapshot(o.snapshot as api.Snapshot);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateSnapshotRequest--;
@@ -1109,7 +1110,7 @@
 void checkUpdateSubscriptionRequest(api.UpdateSubscriptionRequest o) {
   buildCounterUpdateSubscriptionRequest++;
   if (buildCounterUpdateSubscriptionRequest < 3) {
-    checkSubscription(o.subscription);
+    checkSubscription(o.subscription as api.Subscription);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateSubscriptionRequest--;
@@ -1130,7 +1131,7 @@
 void checkUpdateTopicRequest(api.UpdateTopicRequest o) {
   buildCounterUpdateTopicRequest++;
   if (buildCounterUpdateTopicRequest < 3) {
-    checkTopic(o.topic);
+    checkTopic(o.topic as api.Topic);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateTopicRequest--;
@@ -1141,7 +1142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcknowledgeRequest();
       var od = api.AcknowledgeRequest.fromJson(o.toJson());
-      checkAcknowledgeRequest(od);
+      checkAcknowledgeRequest(od as api.AcknowledgeRequest);
     });
   });
 
@@ -1149,7 +1150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1157,7 +1158,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSnapshotRequest();
       var od = api.CreateSnapshotRequest.fromJson(o.toJson());
-      checkCreateSnapshotRequest(od);
+      checkCreateSnapshotRequest(od as api.CreateSnapshotRequest);
     });
   });
 
@@ -1165,7 +1166,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeadLetterPolicy();
       var od = api.DeadLetterPolicy.fromJson(o.toJson());
-      checkDeadLetterPolicy(od);
+      checkDeadLetterPolicy(od as api.DeadLetterPolicy);
     });
   });
 
@@ -1173,7 +1174,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDetachSubscriptionResponse();
       var od = api.DetachSubscriptionResponse.fromJson(o.toJson());
-      checkDetachSubscriptionResponse(od);
+      checkDetachSubscriptionResponse(od as api.DetachSubscriptionResponse);
     });
   });
 
@@ -1181,7 +1182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1189,7 +1190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpirationPolicy();
       var od = api.ExpirationPolicy.fromJson(o.toJson());
-      checkExpirationPolicy(od);
+      checkExpirationPolicy(od as api.ExpirationPolicy);
     });
   });
 
@@ -1197,7 +1198,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1205,7 +1206,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSnapshotsResponse();
       var od = api.ListSnapshotsResponse.fromJson(o.toJson());
-      checkListSnapshotsResponse(od);
+      checkListSnapshotsResponse(od as api.ListSnapshotsResponse);
     });
   });
 
@@ -1213,7 +1214,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSubscriptionsResponse();
       var od = api.ListSubscriptionsResponse.fromJson(o.toJson());
-      checkListSubscriptionsResponse(od);
+      checkListSubscriptionsResponse(od as api.ListSubscriptionsResponse);
     });
   });
 
@@ -1221,7 +1222,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTopicSnapshotsResponse();
       var od = api.ListTopicSnapshotsResponse.fromJson(o.toJson());
-      checkListTopicSnapshotsResponse(od);
+      checkListTopicSnapshotsResponse(od as api.ListTopicSnapshotsResponse);
     });
   });
 
@@ -1229,7 +1230,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTopicSubscriptionsResponse();
       var od = api.ListTopicSubscriptionsResponse.fromJson(o.toJson());
-      checkListTopicSubscriptionsResponse(od);
+      checkListTopicSubscriptionsResponse(
+          od as api.ListTopicSubscriptionsResponse);
     });
   });
 
@@ -1237,7 +1239,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTopicsResponse();
       var od = api.ListTopicsResponse.fromJson(o.toJson());
-      checkListTopicsResponse(od);
+      checkListTopicsResponse(od as api.ListTopicsResponse);
     });
   });
 
@@ -1245,7 +1247,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMessageStoragePolicy();
       var od = api.MessageStoragePolicy.fromJson(o.toJson());
-      checkMessageStoragePolicy(od);
+      checkMessageStoragePolicy(od as api.MessageStoragePolicy);
     });
   });
 
@@ -1253,7 +1255,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyAckDeadlineRequest();
       var od = api.ModifyAckDeadlineRequest.fromJson(o.toJson());
-      checkModifyAckDeadlineRequest(od);
+      checkModifyAckDeadlineRequest(od as api.ModifyAckDeadlineRequest);
     });
   });
 
@@ -1261,7 +1263,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildModifyPushConfigRequest();
       var od = api.ModifyPushConfigRequest.fromJson(o.toJson());
-      checkModifyPushConfigRequest(od);
+      checkModifyPushConfigRequest(od as api.ModifyPushConfigRequest);
     });
   });
 
@@ -1269,7 +1271,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOidcToken();
       var od = api.OidcToken.fromJson(o.toJson());
-      checkOidcToken(od);
+      checkOidcToken(od as api.OidcToken);
     });
   });
 
@@ -1277,7 +1279,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1285,7 +1287,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublishRequest();
       var od = api.PublishRequest.fromJson(o.toJson());
-      checkPublishRequest(od);
+      checkPublishRequest(od as api.PublishRequest);
     });
   });
 
@@ -1293,7 +1295,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublishResponse();
       var od = api.PublishResponse.fromJson(o.toJson());
-      checkPublishResponse(od);
+      checkPublishResponse(od as api.PublishResponse);
     });
   });
 
@@ -1301,7 +1303,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPubsubMessage();
       var od = api.PubsubMessage.fromJson(o.toJson());
-      checkPubsubMessage(od);
+      checkPubsubMessage(od as api.PubsubMessage);
     });
   });
 
@@ -1309,7 +1311,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPullRequest();
       var od = api.PullRequest.fromJson(o.toJson());
-      checkPullRequest(od);
+      checkPullRequest(od as api.PullRequest);
     });
   });
 
@@ -1317,7 +1319,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPullResponse();
       var od = api.PullResponse.fromJson(o.toJson());
-      checkPullResponse(od);
+      checkPullResponse(od as api.PullResponse);
     });
   });
 
@@ -1325,7 +1327,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPushConfig();
       var od = api.PushConfig.fromJson(o.toJson());
-      checkPushConfig(od);
+      checkPushConfig(od as api.PushConfig);
     });
   });
 
@@ -1333,7 +1335,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReceivedMessage();
       var od = api.ReceivedMessage.fromJson(o.toJson());
-      checkReceivedMessage(od);
+      checkReceivedMessage(od as api.ReceivedMessage);
     });
   });
 
@@ -1341,7 +1343,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRetryPolicy();
       var od = api.RetryPolicy.fromJson(o.toJson());
-      checkRetryPolicy(od);
+      checkRetryPolicy(od as api.RetryPolicy);
     });
   });
 
@@ -1349,7 +1351,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSeekRequest();
       var od = api.SeekRequest.fromJson(o.toJson());
-      checkSeekRequest(od);
+      checkSeekRequest(od as api.SeekRequest);
     });
   });
 
@@ -1357,7 +1359,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSeekResponse();
       var od = api.SeekResponse.fromJson(o.toJson());
-      checkSeekResponse(od);
+      checkSeekResponse(od as api.SeekResponse);
     });
   });
 
@@ -1365,7 +1367,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1373,7 +1375,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSnapshot();
       var od = api.Snapshot.fromJson(o.toJson());
-      checkSnapshot(od);
+      checkSnapshot(od as api.Snapshot);
     });
   });
 
@@ -1381,7 +1383,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscription();
       var od = api.Subscription.fromJson(o.toJson());
-      checkSubscription(od);
+      checkSubscription(od as api.Subscription);
     });
   });
 
@@ -1389,7 +1391,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1397,7 +1399,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1405,7 +1407,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTopic();
       var od = api.Topic.fromJson(o.toJson());
-      checkTopic(od);
+      checkTopic(od as api.Topic);
     });
   });
 
@@ -1413,7 +1415,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSnapshotRequest();
       var od = api.UpdateSnapshotRequest.fromJson(o.toJson());
-      checkUpdateSnapshotRequest(od);
+      checkUpdateSnapshotRequest(od as api.UpdateSnapshotRequest);
     });
   });
 
@@ -1421,7 +1423,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSubscriptionRequest();
       var od = api.UpdateSubscriptionRequest.fromJson(o.toJson());
-      checkUpdateSubscriptionRequest(od);
+      checkUpdateSubscriptionRequest(od as api.UpdateSubscriptionRequest);
     });
   });
 
@@ -1429,7 +1431,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTopicRequest();
       var od = api.UpdateTopicRequest.fromJson(o.toJson());
-      checkUpdateTopicRequest(od);
+      checkUpdateTopicRequest(od as api.UpdateTopicRequest);
     });
   });
 
@@ -1441,8 +1443,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateSnapshotRequest.fromJson(json);
-        checkCreateSnapshotRequest(obj);
+        var obj = api.CreateSnapshotRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateSnapshotRequest(obj as api.CreateSnapshotRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1482,7 +1485,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSnapshot(response);
+        checkSnapshot(response as api.Snapshot);
       })));
     });
 
@@ -1530,7 +1533,7 @@
       res
           .delete(arg_snapshot, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1578,7 +1581,7 @@
       res
           .get(arg_snapshot, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSnapshot(response);
+        checkSnapshot(response as api.Snapshot);
       })));
     });
 
@@ -1633,7 +1636,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1690,7 +1693,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSnapshotsResponse(response);
+        checkListSnapshotsResponse(response as api.ListSnapshotsResponse);
       })));
     });
 
@@ -1701,8 +1704,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateSnapshotRequest.fromJson(json);
-        checkUpdateSnapshotRequest(obj);
+        var obj = api.UpdateSnapshotRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateSnapshotRequest(obj as api.UpdateSnapshotRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1742,7 +1746,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSnapshot(response);
+        checkSnapshot(response as api.Snapshot);
       })));
     });
 
@@ -1753,8 +1757,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1794,7 +1799,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1805,8 +1810,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1846,7 +1852,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -1859,8 +1866,9 @@
       var arg_subscription = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AcknowledgeRequest.fromJson(json);
-        checkAcknowledgeRequest(obj);
+        var obj = api.AcknowledgeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAcknowledgeRequest(obj as api.AcknowledgeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1900,7 +1908,7 @@
       res
           .acknowledge(arg_request, arg_subscription, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1911,8 +1919,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subscription.fromJson(json);
-        checkSubscription(obj);
+        var obj = api.Subscription.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubscription(obj as api.Subscription);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1952,7 +1961,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -2000,7 +2009,7 @@
       res
           .delete(arg_subscription, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2048,7 +2057,8 @@
       res
           .detach(arg_subscription, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDetachSubscriptionResponse(response);
+        checkDetachSubscriptionResponse(
+            response as api.DetachSubscriptionResponse);
       })));
     });
 
@@ -2096,7 +2106,7 @@
       res
           .get(arg_subscription, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -2151,7 +2161,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2208,7 +2218,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSubscriptionsResponse(response);
+        checkListSubscriptionsResponse(
+            response as api.ListSubscriptionsResponse);
       })));
     });
 
@@ -2219,8 +2230,9 @@
       var arg_subscription = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyAckDeadlineRequest.fromJson(json);
-        checkModifyAckDeadlineRequest(obj);
+        var obj = api.ModifyAckDeadlineRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyAckDeadlineRequest(obj as api.ModifyAckDeadlineRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2261,7 +2273,7 @@
           .modifyAckDeadline(arg_request, arg_subscription,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2272,8 +2284,9 @@
       var arg_subscription = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ModifyPushConfigRequest.fromJson(json);
-        checkModifyPushConfigRequest(obj);
+        var obj = api.ModifyPushConfigRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkModifyPushConfigRequest(obj as api.ModifyPushConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2313,7 +2326,7 @@
       res
           .modifyPushConfig(arg_request, arg_subscription, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2324,8 +2337,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateSubscriptionRequest.fromJson(json);
-        checkUpdateSubscriptionRequest(obj);
+        var obj = api.UpdateSubscriptionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateSubscriptionRequest(obj as api.UpdateSubscriptionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2365,7 +2379,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -2376,8 +2390,9 @@
       var arg_subscription = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PullRequest.fromJson(json);
-        checkPullRequest(obj);
+        var obj = api.PullRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPullRequest(obj as api.PullRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2417,7 +2432,7 @@
       res
           .pull(arg_request, arg_subscription, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPullResponse(response);
+        checkPullResponse(response as api.PullResponse);
       })));
     });
 
@@ -2428,8 +2443,9 @@
       var arg_subscription = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SeekRequest.fromJson(json);
-        checkSeekRequest(obj);
+        var obj = api.SeekRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSeekRequest(obj as api.SeekRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2469,7 +2485,7 @@
       res
           .seek(arg_request, arg_subscription, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSeekResponse(response);
+        checkSeekResponse(response as api.SeekResponse);
       })));
     });
 
@@ -2480,8 +2496,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2521,7 +2538,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2532,8 +2549,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2573,7 +2591,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -2586,8 +2605,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Topic.fromJson(json);
-        checkTopic(obj);
+        var obj =
+            api.Topic.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTopic(obj as api.Topic);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2627,7 +2647,7 @@
       res
           .create(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTopic(response);
+        checkTopic(response as api.Topic);
       })));
     });
 
@@ -2675,7 +2695,7 @@
       res
           .delete(arg_topic, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2723,7 +2743,7 @@
       res
           .get(arg_topic, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTopic(response);
+        checkTopic(response as api.Topic);
       })));
     });
 
@@ -2778,7 +2798,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2835,7 +2855,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTopicsResponse(response);
+        checkListTopicsResponse(response as api.ListTopicsResponse);
       })));
     });
 
@@ -2846,8 +2866,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateTopicRequest.fromJson(json);
-        checkUpdateTopicRequest(obj);
+        var obj = api.UpdateTopicRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateTopicRequest(obj as api.UpdateTopicRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2887,7 +2908,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTopic(response);
+        checkTopic(response as api.Topic);
       })));
     });
 
@@ -2898,8 +2919,9 @@
       var arg_topic = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PublishRequest.fromJson(json);
-        checkPublishRequest(obj);
+        var obj = api.PublishRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPublishRequest(obj as api.PublishRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2939,7 +2961,7 @@
       res
           .publish(arg_request, arg_topic, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPublishResponse(response);
+        checkPublishResponse(response as api.PublishResponse);
       })));
     });
 
@@ -2950,8 +2972,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2991,7 +3014,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3002,8 +3025,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3043,7 +3067,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -3102,7 +3127,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTopicSnapshotsResponse(response);
+        checkListTopicSnapshotsResponse(
+            response as api.ListTopicSnapshotsResponse);
       })));
     });
   });
@@ -3161,7 +3187,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTopicSubscriptionsResponse(response);
+        checkListTopicSubscriptionsResponse(
+            response as api.ListTopicSubscriptionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/recommender/v1_test.dart b/generated/googleapis/test/recommender/v1_test.dart
index 59d5027..56c3156 100644
--- a/generated/googleapis/test/recommender/v1_test.dart
+++ b/generated/googleapis/test/recommender/v1_test.dart
@@ -91,7 +91,7 @@
     api.GoogleCloudRecommenderV1CostProjection o) {
   buildCounterGoogleCloudRecommenderV1CostProjection++;
   if (buildCounterGoogleCloudRecommenderV1CostProjection < 3) {
-    checkGoogleTypeMoney(o.cost);
+    checkGoogleTypeMoney(o.cost as api.GoogleTypeMoney);
     unittest.expect(o.duration, unittest.equals('foo'));
   }
   buildCounterGoogleCloudRecommenderV1CostProjection--;
@@ -113,7 +113,8 @@
   buildCounterGoogleCloudRecommenderV1Impact++;
   if (buildCounterGoogleCloudRecommenderV1Impact < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkGoogleCloudRecommenderV1CostProjection(o.costProjection);
+    checkGoogleCloudRecommenderV1CostProjection(
+        o.costProjection as api.GoogleCloudRecommenderV1CostProjection);
   }
   buildCounterGoogleCloudRecommenderV1Impact--;
 }
@@ -129,8 +130,10 @@
 void checkUnnamed5774(
     core.List<api.GoogleCloudRecommenderV1InsightRecommendationReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1InsightRecommendationReference(o[0]);
-  checkGoogleCloudRecommenderV1InsightRecommendationReference(o[1]);
+  checkGoogleCloudRecommenderV1InsightRecommendationReference(
+      o[0] as api.GoogleCloudRecommenderV1InsightRecommendationReference);
+  checkGoogleCloudRecommenderV1InsightRecommendationReference(
+      o[1] as api.GoogleCloudRecommenderV1InsightRecommendationReference);
 }
 
 core.Map<core.String, core.Object> buildUnnamed5775() {
@@ -209,7 +212,8 @@
     unittest.expect(o.lastRefreshTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.observationPeriod, unittest.equals('foo'));
-    checkGoogleCloudRecommenderV1InsightStateInfo(o.stateInfo);
+    checkGoogleCloudRecommenderV1InsightStateInfo(
+        o.stateInfo as api.GoogleCloudRecommenderV1InsightStateInfo);
     checkUnnamed5776(o.targetResources);
   }
   buildCounterGoogleCloudRecommenderV1Insight--;
@@ -281,8 +285,10 @@
 
 void checkUnnamed5778(core.List<api.GoogleCloudRecommenderV1Insight> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1Insight(o[0]);
-  checkGoogleCloudRecommenderV1Insight(o[1]);
+  checkGoogleCloudRecommenderV1Insight(
+      o[0] as api.GoogleCloudRecommenderV1Insight);
+  checkGoogleCloudRecommenderV1Insight(
+      o[1] as api.GoogleCloudRecommenderV1Insight);
 }
 
 core.int buildCounterGoogleCloudRecommenderV1ListInsightsResponse = 0;
@@ -317,8 +323,10 @@
 
 void checkUnnamed5779(core.List<api.GoogleCloudRecommenderV1Recommendation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1Recommendation(o[0]);
-  checkGoogleCloudRecommenderV1Recommendation(o[1]);
+  checkGoogleCloudRecommenderV1Recommendation(
+      o[0] as api.GoogleCloudRecommenderV1Recommendation);
+  checkGoogleCloudRecommenderV1Recommendation(
+      o[1] as api.GoogleCloudRecommenderV1Recommendation);
 }
 
 core.int buildCounterGoogleCloudRecommenderV1ListRecommendationsResponse = 0;
@@ -535,8 +543,10 @@
 void checkUnnamed5785(
     core.Map<core.String, api.GoogleCloudRecommenderV1ValueMatcher> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1ValueMatcher(o['x']);
-  checkGoogleCloudRecommenderV1ValueMatcher(o['y']);
+  checkGoogleCloudRecommenderV1ValueMatcher(
+      o['x'] as api.GoogleCloudRecommenderV1ValueMatcher);
+  checkGoogleCloudRecommenderV1ValueMatcher(
+      o['y'] as api.GoogleCloudRecommenderV1ValueMatcher);
 }
 
 core.int buildCounterGoogleCloudRecommenderV1Operation = 0;
@@ -580,7 +590,8 @@
     unittest.expect(casted5['list'], unittest.equals([1, 2, 3]));
     unittest.expect(casted5['bool'], unittest.equals(true));
     unittest.expect(casted5['string'], unittest.equals('foo'));
-    checkGoogleCloudRecommenderV1ValueMatcher(o.valueMatcher);
+    checkGoogleCloudRecommenderV1ValueMatcher(
+        o.valueMatcher as api.GoogleCloudRecommenderV1ValueMatcher);
   }
   buildCounterGoogleCloudRecommenderV1Operation--;
 }
@@ -594,8 +605,10 @@
 
 void checkUnnamed5786(core.List<api.GoogleCloudRecommenderV1Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1Operation(o[0]);
-  checkGoogleCloudRecommenderV1Operation(o[1]);
+  checkGoogleCloudRecommenderV1Operation(
+      o[0] as api.GoogleCloudRecommenderV1Operation);
+  checkGoogleCloudRecommenderV1Operation(
+      o[1] as api.GoogleCloudRecommenderV1Operation);
 }
 
 core.int buildCounterGoogleCloudRecommenderV1OperationGroup = 0;
@@ -628,8 +641,10 @@
 
 void checkUnnamed5787(core.List<api.GoogleCloudRecommenderV1Impact> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1Impact(o[0]);
-  checkGoogleCloudRecommenderV1Impact(o[1]);
+  checkGoogleCloudRecommenderV1Impact(
+      o[0] as api.GoogleCloudRecommenderV1Impact);
+  checkGoogleCloudRecommenderV1Impact(
+      o[1] as api.GoogleCloudRecommenderV1Impact);
 }
 
 core.List<api.GoogleCloudRecommenderV1RecommendationInsightReference>
@@ -643,8 +658,10 @@
 void checkUnnamed5788(
     core.List<api.GoogleCloudRecommenderV1RecommendationInsightReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1RecommendationInsightReference(o[0]);
-  checkGoogleCloudRecommenderV1RecommendationInsightReference(o[1]);
+  checkGoogleCloudRecommenderV1RecommendationInsightReference(
+      o[0] as api.GoogleCloudRecommenderV1RecommendationInsightReference);
+  checkGoogleCloudRecommenderV1RecommendationInsightReference(
+      o[1] as api.GoogleCloudRecommenderV1RecommendationInsightReference);
 }
 
 core.int buildCounterGoogleCloudRecommenderV1Recommendation = 0;
@@ -674,14 +691,17 @@
   if (buildCounterGoogleCloudRecommenderV1Recommendation < 3) {
     checkUnnamed5787(o.additionalImpact);
     checkUnnamed5788(o.associatedInsights);
-    checkGoogleCloudRecommenderV1RecommendationContent(o.content);
+    checkGoogleCloudRecommenderV1RecommendationContent(
+        o.content as api.GoogleCloudRecommenderV1RecommendationContent);
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.lastRefreshTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudRecommenderV1Impact(o.primaryImpact);
+    checkGoogleCloudRecommenderV1Impact(
+        o.primaryImpact as api.GoogleCloudRecommenderV1Impact);
     unittest.expect(o.recommenderSubtype, unittest.equals('foo'));
-    checkGoogleCloudRecommenderV1RecommendationStateInfo(o.stateInfo);
+    checkGoogleCloudRecommenderV1RecommendationStateInfo(
+        o.stateInfo as api.GoogleCloudRecommenderV1RecommendationStateInfo);
   }
   buildCounterGoogleCloudRecommenderV1Recommendation--;
 }
@@ -695,8 +715,10 @@
 
 void checkUnnamed5789(core.List<api.GoogleCloudRecommenderV1OperationGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRecommenderV1OperationGroup(o[0]);
-  checkGoogleCloudRecommenderV1OperationGroup(o[1]);
+  checkGoogleCloudRecommenderV1OperationGroup(
+      o[0] as api.GoogleCloudRecommenderV1OperationGroup);
+  checkGoogleCloudRecommenderV1OperationGroup(
+      o[1] as api.GoogleCloudRecommenderV1OperationGroup);
 }
 
 core.int buildCounterGoogleCloudRecommenderV1RecommendationContent = 0;
@@ -826,7 +848,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRecommenderV1CostProjection();
       var od = api.GoogleCloudRecommenderV1CostProjection.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1CostProjection(od);
+      checkGoogleCloudRecommenderV1CostProjection(
+          od as api.GoogleCloudRecommenderV1CostProjection);
     });
   });
 
@@ -834,7 +857,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRecommenderV1Impact();
       var od = api.GoogleCloudRecommenderV1Impact.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1Impact(od);
+      checkGoogleCloudRecommenderV1Impact(
+          od as api.GoogleCloudRecommenderV1Impact);
     });
   });
 
@@ -842,7 +866,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRecommenderV1Insight();
       var od = api.GoogleCloudRecommenderV1Insight.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1Insight(od);
+      checkGoogleCloudRecommenderV1Insight(
+          od as api.GoogleCloudRecommenderV1Insight);
     });
   });
 
@@ -853,7 +878,8 @@
       var od =
           api.GoogleCloudRecommenderV1InsightRecommendationReference.fromJson(
               o.toJson());
-      checkGoogleCloudRecommenderV1InsightRecommendationReference(od);
+      checkGoogleCloudRecommenderV1InsightRecommendationReference(
+          od as api.GoogleCloudRecommenderV1InsightRecommendationReference);
     });
   });
 
@@ -862,7 +888,8 @@
       var o = buildGoogleCloudRecommenderV1InsightStateInfo();
       var od =
           api.GoogleCloudRecommenderV1InsightStateInfo.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1InsightStateInfo(od);
+      checkGoogleCloudRecommenderV1InsightStateInfo(
+          od as api.GoogleCloudRecommenderV1InsightStateInfo);
     });
   });
 
@@ -871,7 +898,8 @@
       var o = buildGoogleCloudRecommenderV1ListInsightsResponse();
       var od =
           api.GoogleCloudRecommenderV1ListInsightsResponse.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1ListInsightsResponse(od);
+      checkGoogleCloudRecommenderV1ListInsightsResponse(
+          od as api.GoogleCloudRecommenderV1ListInsightsResponse);
     });
   });
 
@@ -881,7 +909,8 @@
       var o = buildGoogleCloudRecommenderV1ListRecommendationsResponse();
       var od = api.GoogleCloudRecommenderV1ListRecommendationsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudRecommenderV1ListRecommendationsResponse(od);
+      checkGoogleCloudRecommenderV1ListRecommendationsResponse(
+          od as api.GoogleCloudRecommenderV1ListRecommendationsResponse);
     });
   });
 
@@ -891,7 +920,8 @@
       var o = buildGoogleCloudRecommenderV1MarkInsightAcceptedRequest();
       var od = api.GoogleCloudRecommenderV1MarkInsightAcceptedRequest.fromJson(
           o.toJson());
-      checkGoogleCloudRecommenderV1MarkInsightAcceptedRequest(od);
+      checkGoogleCloudRecommenderV1MarkInsightAcceptedRequest(
+          od as api.GoogleCloudRecommenderV1MarkInsightAcceptedRequest);
     });
   });
 
@@ -903,7 +933,8 @@
       var od =
           api.GoogleCloudRecommenderV1MarkRecommendationClaimedRequest.fromJson(
               o.toJson());
-      checkGoogleCloudRecommenderV1MarkRecommendationClaimedRequest(od);
+      checkGoogleCloudRecommenderV1MarkRecommendationClaimedRequest(
+          od as api.GoogleCloudRecommenderV1MarkRecommendationClaimedRequest);
     });
   });
 
@@ -914,7 +945,8 @@
       var od =
           api.GoogleCloudRecommenderV1MarkRecommendationFailedRequest.fromJson(
               o.toJson());
-      checkGoogleCloudRecommenderV1MarkRecommendationFailedRequest(od);
+      checkGoogleCloudRecommenderV1MarkRecommendationFailedRequest(
+          od as api.GoogleCloudRecommenderV1MarkRecommendationFailedRequest);
     });
   });
 
@@ -925,7 +957,8 @@
       var o = buildGoogleCloudRecommenderV1MarkRecommendationSucceededRequest();
       var od = api.GoogleCloudRecommenderV1MarkRecommendationSucceededRequest
           .fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1MarkRecommendationSucceededRequest(od);
+      checkGoogleCloudRecommenderV1MarkRecommendationSucceededRequest(
+          od as api.GoogleCloudRecommenderV1MarkRecommendationSucceededRequest);
     });
   });
 
@@ -933,7 +966,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRecommenderV1Operation();
       var od = api.GoogleCloudRecommenderV1Operation.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1Operation(od);
+      checkGoogleCloudRecommenderV1Operation(
+          od as api.GoogleCloudRecommenderV1Operation);
     });
   });
 
@@ -941,7 +975,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRecommenderV1OperationGroup();
       var od = api.GoogleCloudRecommenderV1OperationGroup.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1OperationGroup(od);
+      checkGoogleCloudRecommenderV1OperationGroup(
+          od as api.GoogleCloudRecommenderV1OperationGroup);
     });
   });
 
@@ -949,7 +984,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRecommenderV1Recommendation();
       var od = api.GoogleCloudRecommenderV1Recommendation.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1Recommendation(od);
+      checkGoogleCloudRecommenderV1Recommendation(
+          od as api.GoogleCloudRecommenderV1Recommendation);
     });
   });
 
@@ -959,7 +995,8 @@
       var o = buildGoogleCloudRecommenderV1RecommendationContent();
       var od = api.GoogleCloudRecommenderV1RecommendationContent.fromJson(
           o.toJson());
-      checkGoogleCloudRecommenderV1RecommendationContent(od);
+      checkGoogleCloudRecommenderV1RecommendationContent(
+          od as api.GoogleCloudRecommenderV1RecommendationContent);
     });
   });
 
@@ -970,7 +1007,8 @@
       var od =
           api.GoogleCloudRecommenderV1RecommendationInsightReference.fromJson(
               o.toJson());
-      checkGoogleCloudRecommenderV1RecommendationInsightReference(od);
+      checkGoogleCloudRecommenderV1RecommendationInsightReference(
+          od as api.GoogleCloudRecommenderV1RecommendationInsightReference);
     });
   });
 
@@ -980,7 +1018,8 @@
       var o = buildGoogleCloudRecommenderV1RecommendationStateInfo();
       var od = api.GoogleCloudRecommenderV1RecommendationStateInfo.fromJson(
           o.toJson());
-      checkGoogleCloudRecommenderV1RecommendationStateInfo(od);
+      checkGoogleCloudRecommenderV1RecommendationStateInfo(
+          od as api.GoogleCloudRecommenderV1RecommendationStateInfo);
     });
   });
 
@@ -988,7 +1027,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRecommenderV1ValueMatcher();
       var od = api.GoogleCloudRecommenderV1ValueMatcher.fromJson(o.toJson());
-      checkGoogleCloudRecommenderV1ValueMatcher(od);
+      checkGoogleCloudRecommenderV1ValueMatcher(
+          od as api.GoogleCloudRecommenderV1ValueMatcher);
     });
   });
 
@@ -996,7 +1036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleTypeMoney();
       var od = api.GoogleTypeMoney.fromJson(o.toJson());
-      checkGoogleTypeMoney(od);
+      checkGoogleTypeMoney(od as api.GoogleTypeMoney);
     });
   });
 
@@ -1047,7 +1087,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1Insight(response);
+        checkGoogleCloudRecommenderV1Insight(
+            response as api.GoogleCloudRecommenderV1Insight);
       })));
     });
 
@@ -1109,7 +1150,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1ListInsightsResponse(response);
+        checkGoogleCloudRecommenderV1ListInsightsResponse(
+            response as api.GoogleCloudRecommenderV1ListInsightsResponse);
       })));
     });
 
@@ -1124,8 +1166,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudRecommenderV1MarkInsightAcceptedRequest.fromJson(
-                json);
-        checkGoogleCloudRecommenderV1MarkInsightAcceptedRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudRecommenderV1MarkInsightAcceptedRequest(
+            obj as api.GoogleCloudRecommenderV1MarkInsightAcceptedRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1165,7 +1208,8 @@
       res
           .markAccepted(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1Insight(response);
+        checkGoogleCloudRecommenderV1Insight(
+            response as api.GoogleCloudRecommenderV1Insight);
       })));
     });
   });
@@ -1221,7 +1265,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1Recommendation(response);
+        checkGoogleCloudRecommenderV1Recommendation(
+            response as api.GoogleCloudRecommenderV1Recommendation);
       })));
     });
 
@@ -1286,7 +1331,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1ListRecommendationsResponse(response);
+        checkGoogleCloudRecommenderV1ListRecommendationsResponse(response
+            as api.GoogleCloudRecommenderV1ListRecommendationsResponse);
       })));
     });
 
@@ -1303,8 +1349,9 @@
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = api.GoogleCloudRecommenderV1MarkRecommendationClaimedRequest
-            .fromJson(json);
-        checkGoogleCloudRecommenderV1MarkRecommendationClaimedRequest(obj);
+            .fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudRecommenderV1MarkRecommendationClaimedRequest(obj
+            as api.GoogleCloudRecommenderV1MarkRecommendationClaimedRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1345,7 +1392,8 @@
       res
           .markClaimed(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1Recommendation(response);
+        checkGoogleCloudRecommenderV1Recommendation(
+            response as api.GoogleCloudRecommenderV1Recommendation);
       })));
     });
 
@@ -1362,8 +1410,9 @@
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = api.GoogleCloudRecommenderV1MarkRecommendationFailedRequest
-            .fromJson(json);
-        checkGoogleCloudRecommenderV1MarkRecommendationFailedRequest(obj);
+            .fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudRecommenderV1MarkRecommendationFailedRequest(
+            obj as api.GoogleCloudRecommenderV1MarkRecommendationFailedRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1404,7 +1453,8 @@
       res
           .markFailed(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1Recommendation(response);
+        checkGoogleCloudRecommenderV1Recommendation(
+            response as api.GoogleCloudRecommenderV1Recommendation);
       })));
     });
 
@@ -1421,8 +1471,9 @@
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj = api.GoogleCloudRecommenderV1MarkRecommendationSucceededRequest
-            .fromJson(json);
-        checkGoogleCloudRecommenderV1MarkRecommendationSucceededRequest(obj);
+            .fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudRecommenderV1MarkRecommendationSucceededRequest(obj
+            as api.GoogleCloudRecommenderV1MarkRecommendationSucceededRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1463,7 +1514,8 @@
       res
           .markSucceeded(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleCloudRecommenderV1Recommendation(response);
+        checkGoogleCloudRecommenderV1Recommendation(
+            response as api.GoogleCloudRecommenderV1Recommendation);
       })));
     });
   });
diff --git a/generated/googleapis/test/redis/v1_test.dart b/generated/googleapis/test/redis/v1_test.dart
index 84e9591..398012d 100644
--- a/generated/googleapis/test/redis/v1_test.dart
+++ b/generated/googleapis/test/redis/v1_test.dart
@@ -103,7 +103,7 @@
 void checkExportInstanceRequest(api.ExportInstanceRequest o) {
   buildCounterExportInstanceRequest++;
   if (buildCounterExportInstanceRequest < 3) {
-    checkOutputConfig(o.outputConfig);
+    checkOutputConfig(o.outputConfig as api.OutputConfig);
   }
   buildCounterExportInstanceRequest--;
 }
@@ -175,8 +175,10 @@
 void checkUnnamed2288(
     core.Map<core.String, api.GoogleCloudRedisV1ZoneMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRedisV1ZoneMetadata(o['x']);
-  checkGoogleCloudRedisV1ZoneMetadata(o['y']);
+  checkGoogleCloudRedisV1ZoneMetadata(
+      o['x'] as api.GoogleCloudRedisV1ZoneMetadata);
+  checkGoogleCloudRedisV1ZoneMetadata(
+      o['y'] as api.GoogleCloudRedisV1ZoneMetadata);
 }
 
 core.int buildCounterGoogleCloudRedisV1LocationMetadata = 0;
@@ -262,7 +264,7 @@
 void checkImportInstanceRequest(api.ImportInstanceRequest o) {
   buildCounterImportInstanceRequest++;
   if (buildCounterImportInstanceRequest < 3) {
-    checkInputConfig(o.inputConfig);
+    checkInputConfig(o.inputConfig as api.InputConfig);
   }
   buildCounterImportInstanceRequest--;
 }
@@ -281,7 +283,7 @@
 void checkInputConfig(api.InputConfig o) {
   buildCounterInputConfig++;
   if (buildCounterInputConfig < 3) {
-    checkGcsSource(o.gcsSource);
+    checkGcsSource(o.gcsSource as api.GcsSource);
   }
   buildCounterInputConfig--;
 }
@@ -376,8 +378,8 @@
 
 void checkUnnamed2291(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.List<core.String> buildUnnamed2292() {
@@ -425,8 +427,8 @@
 
 void checkUnnamed2293(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -459,8 +461,8 @@
 
 void checkUnnamed2294(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -630,7 +632,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed2297(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed2298(o.response);
@@ -652,7 +654,7 @@
 void checkOutputConfig(api.OutputConfig o) {
   buildCounterOutputConfig++;
   if (buildCounterOutputConfig < 3) {
-    checkGcsDestination(o.gcsDestination);
+    checkGcsDestination(o.gcsDestination as api.GcsDestination);
   }
   buildCounterOutputConfig--;
 }
@@ -746,7 +748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -754,7 +756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportInstanceRequest();
       var od = api.ExportInstanceRequest.fromJson(o.toJson());
-      checkExportInstanceRequest(od);
+      checkExportInstanceRequest(od as api.ExportInstanceRequest);
     });
   });
 
@@ -762,7 +764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFailoverInstanceRequest();
       var od = api.FailoverInstanceRequest.fromJson(o.toJson());
-      checkFailoverInstanceRequest(od);
+      checkFailoverInstanceRequest(od as api.FailoverInstanceRequest);
     });
   });
 
@@ -770,7 +772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsDestination();
       var od = api.GcsDestination.fromJson(o.toJson());
-      checkGcsDestination(od);
+      checkGcsDestination(od as api.GcsDestination);
     });
   });
 
@@ -778,7 +780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsSource();
       var od = api.GcsSource.fromJson(o.toJson());
-      checkGcsSource(od);
+      checkGcsSource(od as api.GcsSource);
     });
   });
 
@@ -786,7 +788,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRedisV1LocationMetadata();
       var od = api.GoogleCloudRedisV1LocationMetadata.fromJson(o.toJson());
-      checkGoogleCloudRedisV1LocationMetadata(od);
+      checkGoogleCloudRedisV1LocationMetadata(
+          od as api.GoogleCloudRedisV1LocationMetadata);
     });
   });
 
@@ -794,7 +797,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRedisV1OperationMetadata();
       var od = api.GoogleCloudRedisV1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudRedisV1OperationMetadata(od);
+      checkGoogleCloudRedisV1OperationMetadata(
+          od as api.GoogleCloudRedisV1OperationMetadata);
     });
   });
 
@@ -802,7 +806,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRedisV1ZoneMetadata();
       var od = api.GoogleCloudRedisV1ZoneMetadata.fromJson(o.toJson());
-      checkGoogleCloudRedisV1ZoneMetadata(od);
+      checkGoogleCloudRedisV1ZoneMetadata(
+          od as api.GoogleCloudRedisV1ZoneMetadata);
     });
   });
 
@@ -810,7 +815,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportInstanceRequest();
       var od = api.ImportInstanceRequest.fromJson(o.toJson());
-      checkImportInstanceRequest(od);
+      checkImportInstanceRequest(od as api.ImportInstanceRequest);
     });
   });
 
@@ -818,7 +823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInputConfig();
       var od = api.InputConfig.fromJson(o.toJson());
-      checkInputConfig(od);
+      checkInputConfig(od as api.InputConfig);
     });
   });
 
@@ -826,7 +831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstance();
       var od = api.Instance.fromJson(o.toJson());
-      checkInstance(od);
+      checkInstance(od as api.Instance);
     });
   });
 
@@ -834,7 +839,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInstancesResponse();
       var od = api.ListInstancesResponse.fromJson(o.toJson());
-      checkListInstancesResponse(od);
+      checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
 
@@ -842,7 +847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -850,7 +855,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -858,7 +863,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -866,7 +871,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -874,7 +879,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutputConfig();
       var od = api.OutputConfig.fromJson(o.toJson());
-      checkOutputConfig(od);
+      checkOutputConfig(od as api.OutputConfig);
     });
   });
 
@@ -882,7 +887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -890,7 +895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpgradeInstanceRequest();
       var od = api.UpgradeInstanceRequest.fromJson(o.toJson());
-      checkUpgradeInstanceRequest(od);
+      checkUpgradeInstanceRequest(od as api.UpgradeInstanceRequest);
     });
   });
 
@@ -939,7 +944,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -999,7 +1004,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1013,8 +1018,9 @@
       var arg_instanceId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1057,7 +1063,7 @@
           .create(arg_request, arg_parent,
               instanceId: arg_instanceId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1105,7 +1111,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1116,8 +1122,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExportInstanceRequest.fromJson(json);
-        checkExportInstanceRequest(obj);
+        var obj = api.ExportInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExportInstanceRequest(obj as api.ExportInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1157,7 +1164,7 @@
       res
           .export(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1168,8 +1175,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FailoverInstanceRequest.fromJson(json);
-        checkFailoverInstanceRequest(obj);
+        var obj = api.FailoverInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFailoverInstanceRequest(obj as api.FailoverInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1209,7 +1217,7 @@
       res
           .failover(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1257,7 +1265,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstance(response);
+        checkInstance(response as api.Instance);
       })));
     });
 
@@ -1268,8 +1276,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ImportInstanceRequest.fromJson(json);
-        checkImportInstanceRequest(obj);
+        var obj = api.ImportInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkImportInstanceRequest(obj as api.ImportInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1309,7 +1318,7 @@
       res
           .import(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1366,7 +1375,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInstancesResponse(response);
+        checkListInstancesResponse(response as api.ListInstancesResponse);
       })));
     });
 
@@ -1378,8 +1387,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Instance.fromJson(json);
-        checkInstance(obj);
+        var obj =
+            api.Instance.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkInstance(obj as api.Instance);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1422,7 +1432,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1433,8 +1443,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpgradeInstanceRequest.fromJson(json);
-        checkUpgradeInstanceRequest(obj);
+        var obj = api.UpgradeInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpgradeInstanceRequest(obj as api.UpgradeInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1474,7 +1485,7 @@
       res
           .upgrade(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -1524,7 +1535,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1572,7 +1583,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1620,7 +1631,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1680,7 +1691,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/remotebuildexecution/v2_test.dart b/generated/googleapis/test/remotebuildexecution/v2_test.dart
index 966da60..4e97bfd 100644
--- a/generated/googleapis/test/remotebuildexecution/v2_test.dart
+++ b/generated/googleapis/test/remotebuildexecution/v2_test.dart
@@ -106,9 +106,11 @@
     api.BuildBazelRemoteExecutionV2Action o) {
   buildCounterBuildBazelRemoteExecutionV2Action++;
   if (buildCounterBuildBazelRemoteExecutionV2Action < 3) {
-    checkBuildBazelRemoteExecutionV2Digest(o.commandDigest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.commandDigest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.doNotCache, unittest.isTrue);
-    checkBuildBazelRemoteExecutionV2Digest(o.inputRootDigest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.inputRootDigest as api.BuildBazelRemoteExecutionV2Digest);
     checkUnnamed5140(o.outputNodeProperties);
     unittest.expect(o.timeout, unittest.equals('foo'));
   }
@@ -149,8 +151,10 @@
 void checkUnnamed5141(
     core.List<api.BuildBazelRemoteExecutionV2OutputDirectory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2OutputDirectory(o[0]);
-  checkBuildBazelRemoteExecutionV2OutputDirectory(o[1]);
+  checkBuildBazelRemoteExecutionV2OutputDirectory(
+      o[0] as api.BuildBazelRemoteExecutionV2OutputDirectory);
+  checkBuildBazelRemoteExecutionV2OutputDirectory(
+      o[1] as api.BuildBazelRemoteExecutionV2OutputDirectory);
 }
 
 core.List<api.BuildBazelRemoteExecutionV2OutputSymlink> buildUnnamed5142() {
@@ -163,8 +167,10 @@
 void checkUnnamed5142(
     core.List<api.BuildBazelRemoteExecutionV2OutputSymlink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2OutputSymlink(o[0]);
-  checkBuildBazelRemoteExecutionV2OutputSymlink(o[1]);
+  checkBuildBazelRemoteExecutionV2OutputSymlink(
+      o[0] as api.BuildBazelRemoteExecutionV2OutputSymlink);
+  checkBuildBazelRemoteExecutionV2OutputSymlink(
+      o[1] as api.BuildBazelRemoteExecutionV2OutputSymlink);
 }
 
 core.List<api.BuildBazelRemoteExecutionV2OutputSymlink> buildUnnamed5143() {
@@ -177,8 +183,10 @@
 void checkUnnamed5143(
     core.List<api.BuildBazelRemoteExecutionV2OutputSymlink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2OutputSymlink(o[0]);
-  checkBuildBazelRemoteExecutionV2OutputSymlink(o[1]);
+  checkBuildBazelRemoteExecutionV2OutputSymlink(
+      o[0] as api.BuildBazelRemoteExecutionV2OutputSymlink);
+  checkBuildBazelRemoteExecutionV2OutputSymlink(
+      o[1] as api.BuildBazelRemoteExecutionV2OutputSymlink);
 }
 
 core.List<api.BuildBazelRemoteExecutionV2OutputFile> buildUnnamed5144() {
@@ -190,8 +198,10 @@
 
 void checkUnnamed5144(core.List<api.BuildBazelRemoteExecutionV2OutputFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2OutputFile(o[0]);
-  checkBuildBazelRemoteExecutionV2OutputFile(o[1]);
+  checkBuildBazelRemoteExecutionV2OutputFile(
+      o[0] as api.BuildBazelRemoteExecutionV2OutputFile);
+  checkBuildBazelRemoteExecutionV2OutputFile(
+      o[1] as api.BuildBazelRemoteExecutionV2OutputFile);
 }
 
 core.List<api.BuildBazelRemoteExecutionV2OutputSymlink> buildUnnamed5145() {
@@ -204,8 +214,10 @@
 void checkUnnamed5145(
     core.List<api.BuildBazelRemoteExecutionV2OutputSymlink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2OutputSymlink(o[0]);
-  checkBuildBazelRemoteExecutionV2OutputSymlink(o[1]);
+  checkBuildBazelRemoteExecutionV2OutputSymlink(
+      o[0] as api.BuildBazelRemoteExecutionV2OutputSymlink);
+  checkBuildBazelRemoteExecutionV2OutputSymlink(
+      o[1] as api.BuildBazelRemoteExecutionV2OutputSymlink);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2ActionResult = 0;
@@ -235,16 +247,19 @@
     api.BuildBazelRemoteExecutionV2ActionResult o) {
   buildCounterBuildBazelRemoteExecutionV2ActionResult++;
   if (buildCounterBuildBazelRemoteExecutionV2ActionResult < 3) {
-    checkBuildBazelRemoteExecutionV2ExecutedActionMetadata(o.executionMetadata);
+    checkBuildBazelRemoteExecutionV2ExecutedActionMetadata(o.executionMetadata
+        as api.BuildBazelRemoteExecutionV2ExecutedActionMetadata);
     unittest.expect(o.exitCode, unittest.equals(42));
     checkUnnamed5141(o.outputDirectories);
     checkUnnamed5142(o.outputDirectorySymlinks);
     checkUnnamed5143(o.outputFileSymlinks);
     checkUnnamed5144(o.outputFiles);
     checkUnnamed5145(o.outputSymlinks);
-    checkBuildBazelRemoteExecutionV2Digest(o.stderrDigest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.stderrDigest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.stderrRaw, unittest.equals('foo'));
-    checkBuildBazelRemoteExecutionV2Digest(o.stdoutDigest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.stdoutDigest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.stdoutRaw, unittest.equals('foo'));
   }
   buildCounterBuildBazelRemoteExecutionV2ActionResult--;
@@ -259,8 +274,10 @@
 
 void checkUnnamed5146(core.List<api.BuildBazelRemoteExecutionV2Digest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2Digest(o[0]);
-  checkBuildBazelRemoteExecutionV2Digest(o[1]);
+  checkBuildBazelRemoteExecutionV2Digest(
+      o[0] as api.BuildBazelRemoteExecutionV2Digest);
+  checkBuildBazelRemoteExecutionV2Digest(
+      o[1] as api.BuildBazelRemoteExecutionV2Digest);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2BatchReadBlobsRequest = 0;
@@ -296,8 +313,10 @@
     core.List<api.BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse(o[0]);
-  checkBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse(o[1]);
+  checkBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse(
+      o[0] as api.BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse);
+  checkBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse(
+      o[1] as api.BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2BatchReadBlobsResponse = 0;
@@ -343,8 +362,9 @@
   if (buildCounterBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse <
       3) {
     unittest.expect(o.data, unittest.equals('foo'));
-    checkBuildBazelRemoteExecutionV2Digest(o.digest);
-    checkGoogleRpcStatus(o.status);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.digest as api.BuildBazelRemoteExecutionV2Digest);
+    checkGoogleRpcStatus(o.status as api.GoogleRpcStatus);
   }
   buildCounterBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse--;
 }
@@ -361,8 +381,10 @@
     core.List<api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest(o[0]);
-  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest(o[1]);
+  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest(
+      o[0] as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest);
+  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest(
+      o[1] as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest = 0;
@@ -407,7 +429,8 @@
   if (buildCounterBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest <
       3) {
     unittest.expect(o.data, unittest.equals('foo'));
-    checkBuildBazelRemoteExecutionV2Digest(o.digest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.digest as api.BuildBazelRemoteExecutionV2Digest);
   }
   buildCounterBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest--;
 }
@@ -424,8 +447,10 @@
     core.List<api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse(o[0]);
-  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse(o[1]);
+  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse(
+      o[0] as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse);
+  checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse(
+      o[1] as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse = 0;
@@ -469,8 +494,9 @@
   buildCounterBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse++;
   if (buildCounterBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse <
       3) {
-    checkBuildBazelRemoteExecutionV2Digest(o.digest);
-    checkGoogleRpcStatus(o.status);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.digest as api.BuildBazelRemoteExecutionV2Digest);
+    checkGoogleRpcStatus(o.status as api.GoogleRpcStatus);
   }
   buildCounterBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse--;
 }
@@ -511,9 +537,11 @@
   buildCounterBuildBazelRemoteExecutionV2CacheCapabilities++;
   if (buildCounterBuildBazelRemoteExecutionV2CacheCapabilities < 3) {
     checkBuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities(
-        o.actionCacheUpdateCapabilities);
+        o.actionCacheUpdateCapabilities
+            as api.BuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities);
     checkBuildBazelRemoteExecutionV2PriorityCapabilities(
-        o.cachePriorityCapabilities);
+        o.cachePriorityCapabilities
+            as api.BuildBazelRemoteExecutionV2PriorityCapabilities);
     checkUnnamed5150(o.digestFunction);
     unittest.expect(o.maxBatchTotalSizeBytes, unittest.equals('foo'));
     unittest.expect(o.symlinkAbsolutePathStrategy, unittest.equals('foo'));
@@ -545,8 +573,10 @@
 void checkUnnamed5152(
     core.List<api.BuildBazelRemoteExecutionV2CommandEnvironmentVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2CommandEnvironmentVariable(o[0]);
-  checkBuildBazelRemoteExecutionV2CommandEnvironmentVariable(o[1]);
+  checkBuildBazelRemoteExecutionV2CommandEnvironmentVariable(
+      o[0] as api.BuildBazelRemoteExecutionV2CommandEnvironmentVariable);
+  checkBuildBazelRemoteExecutionV2CommandEnvironmentVariable(
+      o[1] as api.BuildBazelRemoteExecutionV2CommandEnvironmentVariable);
 }
 
 core.List<core.String> buildUnnamed5153() {
@@ -615,7 +645,8 @@
     checkUnnamed5153(o.outputDirectories);
     checkUnnamed5154(o.outputFiles);
     checkUnnamed5155(o.outputPaths);
-    checkBuildBazelRemoteExecutionV2Platform(o.platform);
+    checkBuildBazelRemoteExecutionV2Platform(
+        o.platform as api.BuildBazelRemoteExecutionV2Platform);
     unittest.expect(o.workingDirectory, unittest.equals('foo'));
   }
   buildCounterBuildBazelRemoteExecutionV2Command--;
@@ -676,8 +707,10 @@
 void checkUnnamed5156(
     core.List<api.BuildBazelRemoteExecutionV2DirectoryNode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2DirectoryNode(o[0]);
-  checkBuildBazelRemoteExecutionV2DirectoryNode(o[1]);
+  checkBuildBazelRemoteExecutionV2DirectoryNode(
+      o[0] as api.BuildBazelRemoteExecutionV2DirectoryNode);
+  checkBuildBazelRemoteExecutionV2DirectoryNode(
+      o[1] as api.BuildBazelRemoteExecutionV2DirectoryNode);
 }
 
 core.List<api.BuildBazelRemoteExecutionV2FileNode> buildUnnamed5157() {
@@ -689,8 +722,10 @@
 
 void checkUnnamed5157(core.List<api.BuildBazelRemoteExecutionV2FileNode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2FileNode(o[0]);
-  checkBuildBazelRemoteExecutionV2FileNode(o[1]);
+  checkBuildBazelRemoteExecutionV2FileNode(
+      o[0] as api.BuildBazelRemoteExecutionV2FileNode);
+  checkBuildBazelRemoteExecutionV2FileNode(
+      o[1] as api.BuildBazelRemoteExecutionV2FileNode);
 }
 
 core.List<api.BuildBazelRemoteExecutionV2NodeProperty> buildUnnamed5158() {
@@ -703,8 +738,10 @@
 void checkUnnamed5158(
     core.List<api.BuildBazelRemoteExecutionV2NodeProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[0]);
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[1]);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[0] as api.BuildBazelRemoteExecutionV2NodeProperty);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[1] as api.BuildBazelRemoteExecutionV2NodeProperty);
 }
 
 core.List<api.BuildBazelRemoteExecutionV2SymlinkNode> buildUnnamed5159() {
@@ -716,8 +753,10 @@
 
 void checkUnnamed5159(core.List<api.BuildBazelRemoteExecutionV2SymlinkNode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2SymlinkNode(o[0]);
-  checkBuildBazelRemoteExecutionV2SymlinkNode(o[1]);
+  checkBuildBazelRemoteExecutionV2SymlinkNode(
+      o[0] as api.BuildBazelRemoteExecutionV2SymlinkNode);
+  checkBuildBazelRemoteExecutionV2SymlinkNode(
+      o[1] as api.BuildBazelRemoteExecutionV2SymlinkNode);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2Directory = 0;
@@ -764,7 +803,8 @@
     api.BuildBazelRemoteExecutionV2DirectoryNode o) {
   buildCounterBuildBazelRemoteExecutionV2DirectoryNode++;
   if (buildCounterBuildBazelRemoteExecutionV2DirectoryNode < 3) {
-    checkBuildBazelRemoteExecutionV2Digest(o.digest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.digest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.name, unittest.equals('foo'));
   }
   buildCounterBuildBazelRemoteExecutionV2DirectoryNode--;
@@ -789,7 +829,8 @@
     api.BuildBazelRemoteExecutionV2ExecuteOperationMetadata o) {
   buildCounterBuildBazelRemoteExecutionV2ExecuteOperationMetadata++;
   if (buildCounterBuildBazelRemoteExecutionV2ExecuteOperationMetadata < 3) {
-    checkBuildBazelRemoteExecutionV2Digest(o.actionDigest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.actionDigest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.stage, unittest.equals('foo'));
     unittest.expect(o.stderrStreamName, unittest.equals('foo'));
     unittest.expect(o.stdoutStreamName, unittest.equals('foo'));
@@ -816,9 +857,12 @@
     api.BuildBazelRemoteExecutionV2ExecuteRequest o) {
   buildCounterBuildBazelRemoteExecutionV2ExecuteRequest++;
   if (buildCounterBuildBazelRemoteExecutionV2ExecuteRequest < 3) {
-    checkBuildBazelRemoteExecutionV2Digest(o.actionDigest);
-    checkBuildBazelRemoteExecutionV2ExecutionPolicy(o.executionPolicy);
-    checkBuildBazelRemoteExecutionV2ResultsCachePolicy(o.resultsCachePolicy);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.actionDigest as api.BuildBazelRemoteExecutionV2Digest);
+    checkBuildBazelRemoteExecutionV2ExecutionPolicy(
+        o.executionPolicy as api.BuildBazelRemoteExecutionV2ExecutionPolicy);
+    checkBuildBazelRemoteExecutionV2ResultsCachePolicy(o.resultsCachePolicy
+        as api.BuildBazelRemoteExecutionV2ResultsCachePolicy);
     unittest.expect(o.skipCacheLookup, unittest.isTrue);
   }
   buildCounterBuildBazelRemoteExecutionV2ExecuteRequest--;
@@ -835,8 +879,10 @@
 void checkUnnamed5160(
     core.Map<core.String, api.BuildBazelRemoteExecutionV2LogFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2LogFile(o['x']);
-  checkBuildBazelRemoteExecutionV2LogFile(o['y']);
+  checkBuildBazelRemoteExecutionV2LogFile(
+      o['x'] as api.BuildBazelRemoteExecutionV2LogFile);
+  checkBuildBazelRemoteExecutionV2LogFile(
+      o['y'] as api.BuildBazelRemoteExecutionV2LogFile);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2ExecuteResponse = 0;
@@ -861,9 +907,10 @@
   if (buildCounterBuildBazelRemoteExecutionV2ExecuteResponse < 3) {
     unittest.expect(o.cachedResult, unittest.isTrue);
     unittest.expect(o.message, unittest.equals('foo'));
-    checkBuildBazelRemoteExecutionV2ActionResult(o.result);
+    checkBuildBazelRemoteExecutionV2ActionResult(
+        o.result as api.BuildBazelRemoteExecutionV2ActionResult);
     checkUnnamed5160(o.serverLogs);
-    checkGoogleRpcStatus(o.status);
+    checkGoogleRpcStatus(o.status as api.GoogleRpcStatus);
   }
   buildCounterBuildBazelRemoteExecutionV2ExecuteResponse--;
 }
@@ -943,7 +990,8 @@
     unittest.expect(o.digestFunction, unittest.equals('foo'));
     unittest.expect(o.execEnabled, unittest.isTrue);
     checkBuildBazelRemoteExecutionV2PriorityCapabilities(
-        o.executionPriorityCapabilities);
+        o.executionPriorityCapabilities
+            as api.BuildBazelRemoteExecutionV2PriorityCapabilities);
     checkUnnamed5161(o.supportedNodeProperties);
   }
   buildCounterBuildBazelRemoteExecutionV2ExecutionCapabilities--;
@@ -980,8 +1028,10 @@
 void checkUnnamed5162(
     core.List<api.BuildBazelRemoteExecutionV2NodeProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[0]);
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[1]);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[0] as api.BuildBazelRemoteExecutionV2NodeProperty);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[1] as api.BuildBazelRemoteExecutionV2NodeProperty);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2FileNode = 0;
@@ -1003,7 +1053,8 @@
     api.BuildBazelRemoteExecutionV2FileNode o) {
   buildCounterBuildBazelRemoteExecutionV2FileNode++;
   if (buildCounterBuildBazelRemoteExecutionV2FileNode < 3) {
-    checkBuildBazelRemoteExecutionV2Digest(o.digest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.digest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.isExecutable, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5162(o.nodeProperties);
@@ -1020,8 +1071,10 @@
 
 void checkUnnamed5163(core.List<api.BuildBazelRemoteExecutionV2Digest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2Digest(o[0]);
-  checkBuildBazelRemoteExecutionV2Digest(o[1]);
+  checkBuildBazelRemoteExecutionV2Digest(
+      o[0] as api.BuildBazelRemoteExecutionV2Digest);
+  checkBuildBazelRemoteExecutionV2Digest(
+      o[1] as api.BuildBazelRemoteExecutionV2Digest);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2FindMissingBlobsRequest = 0;
@@ -1054,8 +1107,10 @@
 
 void checkUnnamed5164(core.List<api.BuildBazelRemoteExecutionV2Digest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2Digest(o[0]);
-  checkBuildBazelRemoteExecutionV2Digest(o[1]);
+  checkBuildBazelRemoteExecutionV2Digest(
+      o[0] as api.BuildBazelRemoteExecutionV2Digest);
+  checkBuildBazelRemoteExecutionV2Digest(
+      o[1] as api.BuildBazelRemoteExecutionV2Digest);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2FindMissingBlobsResponse = 0;
@@ -1088,8 +1143,10 @@
 
 void checkUnnamed5165(core.List<api.BuildBazelRemoteExecutionV2Directory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2Directory(o[0]);
-  checkBuildBazelRemoteExecutionV2Directory(o[1]);
+  checkBuildBazelRemoteExecutionV2Directory(
+      o[0] as api.BuildBazelRemoteExecutionV2Directory);
+  checkBuildBazelRemoteExecutionV2Directory(
+      o[1] as api.BuildBazelRemoteExecutionV2Directory);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2GetTreeResponse = 0;
@@ -1132,7 +1189,8 @@
     api.BuildBazelRemoteExecutionV2LogFile o) {
   buildCounterBuildBazelRemoteExecutionV2LogFile++;
   if (buildCounterBuildBazelRemoteExecutionV2LogFile < 3) {
-    checkBuildBazelRemoteExecutionV2Digest(o.digest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.digest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.humanReadable, unittest.isTrue);
   }
   buildCounterBuildBazelRemoteExecutionV2LogFile--;
@@ -1179,7 +1237,8 @@
   buildCounterBuildBazelRemoteExecutionV2OutputDirectory++;
   if (buildCounterBuildBazelRemoteExecutionV2OutputDirectory < 3) {
     unittest.expect(o.path, unittest.equals('foo'));
-    checkBuildBazelRemoteExecutionV2Digest(o.treeDigest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.treeDigest as api.BuildBazelRemoteExecutionV2Digest);
   }
   buildCounterBuildBazelRemoteExecutionV2OutputDirectory--;
 }
@@ -1194,8 +1253,10 @@
 void checkUnnamed5166(
     core.List<api.BuildBazelRemoteExecutionV2NodeProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[0]);
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[1]);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[0] as api.BuildBazelRemoteExecutionV2NodeProperty);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[1] as api.BuildBazelRemoteExecutionV2NodeProperty);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2OutputFile = 0;
@@ -1219,7 +1280,8 @@
   buildCounterBuildBazelRemoteExecutionV2OutputFile++;
   if (buildCounterBuildBazelRemoteExecutionV2OutputFile < 3) {
     unittest.expect(o.contents, unittest.equals('foo'));
-    checkBuildBazelRemoteExecutionV2Digest(o.digest);
+    checkBuildBazelRemoteExecutionV2Digest(
+        o.digest as api.BuildBazelRemoteExecutionV2Digest);
     unittest.expect(o.isExecutable, unittest.isTrue);
     checkUnnamed5166(o.nodeProperties);
     unittest.expect(o.path, unittest.equals('foo'));
@@ -1237,8 +1299,10 @@
 void checkUnnamed5167(
     core.List<api.BuildBazelRemoteExecutionV2NodeProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[0]);
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[1]);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[0] as api.BuildBazelRemoteExecutionV2NodeProperty);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[1] as api.BuildBazelRemoteExecutionV2NodeProperty);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2OutputSymlink = 0;
@@ -1276,8 +1340,10 @@
 void checkUnnamed5168(
     core.List<api.BuildBazelRemoteExecutionV2PlatformProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2PlatformProperty(o[0]);
-  checkBuildBazelRemoteExecutionV2PlatformProperty(o[1]);
+  checkBuildBazelRemoteExecutionV2PlatformProperty(
+      o[0] as api.BuildBazelRemoteExecutionV2PlatformProperty);
+  checkBuildBazelRemoteExecutionV2PlatformProperty(
+      o[1] as api.BuildBazelRemoteExecutionV2PlatformProperty);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2Platform = 0;
@@ -1336,8 +1402,10 @@
     core.List<api.BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange(o[0]);
-  checkBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange(o[1]);
+  checkBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange(
+      o[0] as api.BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange);
+  checkBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange(
+      o[1] as api.BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2PriorityCapabilities = 0;
@@ -1409,7 +1477,8 @@
   if (buildCounterBuildBazelRemoteExecutionV2RequestMetadata < 3) {
     unittest.expect(o.actionId, unittest.equals('foo'));
     unittest.expect(o.correlatedInvocationsId, unittest.equals('foo'));
-    checkBuildBazelRemoteExecutionV2ToolDetails(o.toolDetails);
+    checkBuildBazelRemoteExecutionV2ToolDetails(
+        o.toolDetails as api.BuildBazelRemoteExecutionV2ToolDetails);
     unittest.expect(o.toolInvocationId, unittest.equals('foo'));
   }
   buildCounterBuildBazelRemoteExecutionV2RequestMetadata--;
@@ -1457,12 +1526,15 @@
     api.BuildBazelRemoteExecutionV2ServerCapabilities o) {
   buildCounterBuildBazelRemoteExecutionV2ServerCapabilities++;
   if (buildCounterBuildBazelRemoteExecutionV2ServerCapabilities < 3) {
-    checkBuildBazelRemoteExecutionV2CacheCapabilities(o.cacheCapabilities);
-    checkBuildBazelSemverSemVer(o.deprecatedApiVersion);
+    checkBuildBazelRemoteExecutionV2CacheCapabilities(o.cacheCapabilities
+        as api.BuildBazelRemoteExecutionV2CacheCapabilities);
+    checkBuildBazelSemverSemVer(
+        o.deprecatedApiVersion as api.BuildBazelSemverSemVer);
     checkBuildBazelRemoteExecutionV2ExecutionCapabilities(
-        o.executionCapabilities);
-    checkBuildBazelSemverSemVer(o.highApiVersion);
-    checkBuildBazelSemverSemVer(o.lowApiVersion);
+        o.executionCapabilities
+            as api.BuildBazelRemoteExecutionV2ExecutionCapabilities);
+    checkBuildBazelSemverSemVer(o.highApiVersion as api.BuildBazelSemverSemVer);
+    checkBuildBazelSemverSemVer(o.lowApiVersion as api.BuildBazelSemverSemVer);
   }
   buildCounterBuildBazelRemoteExecutionV2ServerCapabilities--;
 }
@@ -1477,8 +1549,10 @@
 void checkUnnamed5170(
     core.List<api.BuildBazelRemoteExecutionV2NodeProperty> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[0]);
-  checkBuildBazelRemoteExecutionV2NodeProperty(o[1]);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[0] as api.BuildBazelRemoteExecutionV2NodeProperty);
+  checkBuildBazelRemoteExecutionV2NodeProperty(
+      o[1] as api.BuildBazelRemoteExecutionV2NodeProperty);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2SymlinkNode = 0;
@@ -1538,8 +1612,10 @@
 
 void checkUnnamed5171(core.List<api.BuildBazelRemoteExecutionV2Directory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuildBazelRemoteExecutionV2Directory(o[0]);
-  checkBuildBazelRemoteExecutionV2Directory(o[1]);
+  checkBuildBazelRemoteExecutionV2Directory(
+      o[0] as api.BuildBazelRemoteExecutionV2Directory);
+  checkBuildBazelRemoteExecutionV2Directory(
+      o[1] as api.BuildBazelRemoteExecutionV2Directory);
 }
 
 core.int buildCounterBuildBazelRemoteExecutionV2Tree = 0;
@@ -1559,7 +1635,8 @@
   buildCounterBuildBazelRemoteExecutionV2Tree++;
   if (buildCounterBuildBazelRemoteExecutionV2Tree < 3) {
     checkUnnamed5171(o.children);
-    checkBuildBazelRemoteExecutionV2Directory(o.root);
+    checkBuildBazelRemoteExecutionV2Directory(
+        o.root as api.BuildBazelRemoteExecutionV2Directory);
   }
   buildCounterBuildBazelRemoteExecutionV2Tree--;
 }
@@ -1718,8 +1795,10 @@
   buildCounterGoogleDevtoolsRemotebuildbotResourceUsage++;
   if (buildCounterGoogleDevtoolsRemotebuildbotResourceUsage < 3) {
     unittest.expect(o.cpuUsedPercent, unittest.equals(42.0));
-    checkGoogleDevtoolsRemotebuildbotResourceUsageStat(o.diskUsage);
-    checkGoogleDevtoolsRemotebuildbotResourceUsageStat(o.memoryUsage);
+    checkGoogleDevtoolsRemotebuildbotResourceUsageStat(
+        o.diskUsage as api.GoogleDevtoolsRemotebuildbotResourceUsageStat);
+    checkGoogleDevtoolsRemotebuildbotResourceUsageStat(
+        o.memoryUsage as api.GoogleDevtoolsRemotebuildbotResourceUsageStat);
   }
   buildCounterGoogleDevtoolsRemotebuildbotResourceUsage--;
 }
@@ -1821,7 +1900,8 @@
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest++;
   if (buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest <
       3) {
-    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(o.instance);
+    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(o.instance
+        as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance);
     unittest.expect(o.instanceId, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
   }
@@ -1855,7 +1935,8 @@
       3) {
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.poolId, unittest.equals('foo'));
-    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(o.workerPool);
+    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(o.workerPool
+        as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool);
   }
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest--;
 }
@@ -1949,21 +2030,29 @@
   if (buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy <
       3) {
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.containerImageSources);
+        o.containerImageSources as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.dockerAddCapabilities);
+        o.dockerAddCapabilities as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.dockerChrootPath);
+        o.dockerChrootPath as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.dockerNetwork);
+        o.dockerNetwork as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.dockerPrivileged);
+        o.dockerPrivileged as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.dockerRunAsRoot);
+        o.dockerRunAsRoot as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.dockerRuntime);
+        o.dockerRuntime as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-        o.dockerSiblingContainers);
+        o.dockerSiblingContainers as api
+            .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     unittest.expect(o.linuxIsolation, unittest.equals('foo'));
   }
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy--;
@@ -2084,7 +2173,8 @@
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance++;
   if (buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance < 3) {
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy(
-        o.featurePolicy);
+        o.featurePolicy
+            as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy);
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.loggingEnabled, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -2130,8 +2220,10 @@
 void checkUnnamed5173(
     core.List<api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(o[0]);
-  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(o[1]);
+  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(
+      o[0] as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance);
+  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(
+      o[1] as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance);
 }
 
 core.int
@@ -2200,8 +2292,10 @@
 void checkUnnamed5174(
     core.List<api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(o[0]);
-  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(o[1]);
+  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(
+      o[0] as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool);
+  checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(
+      o[1] as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool);
 }
 
 core.int
@@ -2282,7 +2376,8 @@
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest++;
   if (buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest <
       3) {
-    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(o.instance);
+    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(o.instance
+        as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance);
     unittest.expect(o.loggingEnabled, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.updateMask, unittest.equals('foo'));
@@ -2315,7 +2410,8 @@
   if (buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest <
       3) {
     unittest.expect(o.updateMask, unittest.equals('foo'));
-    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(o.workerPool);
+    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(o.workerPool
+        as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool);
   }
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest--;
 }
@@ -2364,8 +2460,9 @@
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig++;
   if (buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig <
       3) {
-    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig(
-        o.accelerator);
+    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig(o
+            .accelerator
+        as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig);
     unittest.expect(o.diskSizeGb, unittest.equals('foo'));
     unittest.expect(o.diskType, unittest.equals('foo'));
     checkUnnamed5175(o.labels);
@@ -2374,8 +2471,9 @@
     unittest.expect(o.minCpuPlatform, unittest.equals('foo'));
     unittest.expect(o.networkAccess, unittest.equals('foo'));
     unittest.expect(o.reserved, unittest.isTrue);
-    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig(
-        o.soleTenancy);
+    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig(o
+            .soleTenancy
+        as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig);
     unittest.expect(o.vmImage, unittest.equals('foo'));
   }
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig--;
@@ -2407,12 +2505,14 @@
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool++;
   if (buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool <
       3) {
-    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale(o.autoscale);
+    checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale(o.autoscale
+        as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale);
     unittest.expect(o.channel, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig(
-        o.workerConfig);
+        o.workerConfig
+            as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig);
     unittest.expect(o.workerCount, unittest.equals('foo'));
   }
   buildCounterGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool--;
@@ -2459,7 +2559,8 @@
   buildCounterGoogleDevtoolsRemoteworkersV1test2Blob++;
   if (buildCounterGoogleDevtoolsRemoteworkersV1test2Blob < 3) {
     unittest.expect(o.contents, unittest.equals('foo'));
-    checkGoogleDevtoolsRemoteworkersV1test2Digest(o.digest);
+    checkGoogleDevtoolsRemoteworkersV1test2Digest(
+        o.digest as api.GoogleDevtoolsRemoteworkersV1test2Digest);
   }
   buildCounterGoogleDevtoolsRemoteworkersV1test2Blob--;
 }
@@ -2482,7 +2583,8 @@
   buildCounterGoogleDevtoolsRemoteworkersV1test2CommandOutputs++;
   if (buildCounterGoogleDevtoolsRemoteworkersV1test2CommandOutputs < 3) {
     unittest.expect(o.exitCode, unittest.equals(42));
-    checkGoogleDevtoolsRemoteworkersV1test2Digest(o.outputs);
+    checkGoogleDevtoolsRemoteworkersV1test2Digest(
+        o.outputs as api.GoogleDevtoolsRemoteworkersV1test2Digest);
   }
   buildCounterGoogleDevtoolsRemoteworkersV1test2CommandOutputs--;
 }
@@ -2576,9 +2678,10 @@
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.exitCode, unittest.equals(42));
     checkUnnamed5177(o.metadata);
-    checkGoogleDevtoolsRemoteworkersV1test2Digest(o.outputs);
+    checkGoogleDevtoolsRemoteworkersV1test2Digest(
+        o.outputs as api.GoogleDevtoolsRemoteworkersV1test2Digest);
     unittest.expect(o.overhead, unittest.equals('foo'));
-    checkGoogleRpcStatus(o.status);
+    checkGoogleRpcStatus(o.status as api.GoogleRpcStatus);
   }
   buildCounterGoogleDevtoolsRemoteworkersV1test2CommandResult--;
 }
@@ -2602,10 +2705,12 @@
     api.GoogleDevtoolsRemoteworkersV1test2CommandTask o) {
   buildCounterGoogleDevtoolsRemoteworkersV1test2CommandTask++;
   if (buildCounterGoogleDevtoolsRemoteworkersV1test2CommandTask < 3) {
-    checkGoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs(
-        o.expectedOutputs);
-    checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs(o.inputs);
-    checkGoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts(o.timeouts);
+    checkGoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs(o.expectedOutputs
+        as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs);
+    checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs(
+        o.inputs as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskInputs);
+    checkGoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts(o.timeouts
+        as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts);
   }
   buildCounterGoogleDevtoolsRemoteworkersV1test2CommandTask--;
 }
@@ -2641,9 +2746,11 @@
         o) {
   unittest.expect(o, unittest.hasLength(2));
   checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable(
-      o[0]);
+      o[0] as api
+          .GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable);
   checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable(
-      o[1]);
+      o[1] as api
+          .GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable);
 }
 
 core.List<api.GoogleDevtoolsRemoteworkersV1test2Digest> buildUnnamed5180() {
@@ -2656,8 +2763,10 @@
 void checkUnnamed5180(
     core.List<api.GoogleDevtoolsRemoteworkersV1test2Digest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDevtoolsRemoteworkersV1test2Digest(o[0]);
-  checkGoogleDevtoolsRemoteworkersV1test2Digest(o[1]);
+  checkGoogleDevtoolsRemoteworkersV1test2Digest(
+      o[0] as api.GoogleDevtoolsRemoteworkersV1test2Digest);
+  checkGoogleDevtoolsRemoteworkersV1test2Digest(
+      o[1] as api.GoogleDevtoolsRemoteworkersV1test2Digest);
 }
 
 core.List<api.GoogleDevtoolsRemoteworkersV1test2Blob> buildUnnamed5181() {
@@ -2669,8 +2778,10 @@
 
 void checkUnnamed5181(core.List<api.GoogleDevtoolsRemoteworkersV1test2Blob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDevtoolsRemoteworkersV1test2Blob(o[0]);
-  checkGoogleDevtoolsRemoteworkersV1test2Blob(o[1]);
+  checkGoogleDevtoolsRemoteworkersV1test2Blob(
+      o[0] as api.GoogleDevtoolsRemoteworkersV1test2Blob);
+  checkGoogleDevtoolsRemoteworkersV1test2Blob(
+      o[1] as api.GoogleDevtoolsRemoteworkersV1test2Blob);
 }
 
 core.int buildCounterGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs = 0;
@@ -2843,8 +2954,10 @@
 void checkUnnamed5184(
     core.List<api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata(o[0]);
-  checkGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata(o[1]);
+  checkGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata(
+      o[0] as api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata);
+  checkGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata(
+      o[1] as api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata);
 }
 
 core.List<api.GoogleDevtoolsRemoteworkersV1test2FileMetadata>
@@ -2858,8 +2971,10 @@
 void checkUnnamed5185(
     core.List<api.GoogleDevtoolsRemoteworkersV1test2FileMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleDevtoolsRemoteworkersV1test2FileMetadata(o[0]);
-  checkGoogleDevtoolsRemoteworkersV1test2FileMetadata(o[1]);
+  checkGoogleDevtoolsRemoteworkersV1test2FileMetadata(
+      o[0] as api.GoogleDevtoolsRemoteworkersV1test2FileMetadata);
+  checkGoogleDevtoolsRemoteworkersV1test2FileMetadata(
+      o[1] as api.GoogleDevtoolsRemoteworkersV1test2FileMetadata);
 }
 
 core.int buildCounterGoogleDevtoolsRemoteworkersV1test2Directory = 0;
@@ -2902,7 +3017,8 @@
     api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata o) {
   buildCounterGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata++;
   if (buildCounterGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata < 3) {
-    checkGoogleDevtoolsRemoteworkersV1test2Digest(o.digest);
+    checkGoogleDevtoolsRemoteworkersV1test2Digest(
+        o.digest as api.GoogleDevtoolsRemoteworkersV1test2Digest);
     unittest.expect(o.path, unittest.equals('foo'));
   }
   buildCounterGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata--;
@@ -2928,7 +3044,8 @@
   buildCounterGoogleDevtoolsRemoteworkersV1test2FileMetadata++;
   if (buildCounterGoogleDevtoolsRemoteworkersV1test2FileMetadata < 3) {
     unittest.expect(o.contents, unittest.equals('foo'));
-    checkGoogleDevtoolsRemoteworkersV1test2Digest(o.digest);
+    checkGoogleDevtoolsRemoteworkersV1test2Digest(
+        o.digest as api.GoogleDevtoolsRemoteworkersV1test2Digest);
     unittest.expect(o.isExecutable, unittest.isTrue);
     unittest.expect(o.path, unittest.equals('foo'));
   }
@@ -3012,7 +3129,7 @@
   buildCounterGoogleLongrunningOperation++;
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkGoogleRpcStatus(o.error);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
     checkUnnamed5186(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5187(o.response);
@@ -3103,7 +3220,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2Action();
       var od = api.BuildBazelRemoteExecutionV2Action.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2Action(od);
+      checkBuildBazelRemoteExecutionV2Action(
+          od as api.BuildBazelRemoteExecutionV2Action);
     });
   });
 
@@ -3115,7 +3233,8 @@
       var od =
           api.BuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities.fromJson(
               o.toJson());
-      checkBuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities(od);
+      checkBuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities(
+          od as api.BuildBazelRemoteExecutionV2ActionCacheUpdateCapabilities);
     });
   });
 
@@ -3123,7 +3242,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2ActionResult();
       var od = api.BuildBazelRemoteExecutionV2ActionResult.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2ActionResult(od);
+      checkBuildBazelRemoteExecutionV2ActionResult(
+          od as api.BuildBazelRemoteExecutionV2ActionResult);
     });
   });
 
@@ -3133,7 +3253,8 @@
       var o = buildBuildBazelRemoteExecutionV2BatchReadBlobsRequest();
       var od = api.BuildBazelRemoteExecutionV2BatchReadBlobsRequest.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2BatchReadBlobsRequest(od);
+      checkBuildBazelRemoteExecutionV2BatchReadBlobsRequest(
+          od as api.BuildBazelRemoteExecutionV2BatchReadBlobsRequest);
     });
   });
 
@@ -3143,7 +3264,8 @@
       var o = buildBuildBazelRemoteExecutionV2BatchReadBlobsResponse();
       var od = api.BuildBazelRemoteExecutionV2BatchReadBlobsResponse.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2BatchReadBlobsResponse(od);
+      checkBuildBazelRemoteExecutionV2BatchReadBlobsResponse(
+          od as api.BuildBazelRemoteExecutionV2BatchReadBlobsResponse);
     });
   });
 
@@ -3154,7 +3276,8 @@
       var o = buildBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse();
       var od = api.BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse
           .fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse(od);
+      checkBuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse(
+          od as api.BuildBazelRemoteExecutionV2BatchReadBlobsResponseResponse);
     });
   });
 
@@ -3164,7 +3287,8 @@
       var o = buildBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest();
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequest.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest(od);
+      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest(
+          od as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequest);
     });
   });
 
@@ -3175,7 +3299,8 @@
       var o = buildBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest();
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest
           .fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest(od);
+      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest(
+          od as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequestRequest);
     });
   });
 
@@ -3185,7 +3310,8 @@
       var o = buildBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse();
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse(od);
+      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse(
+          od as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse);
     });
   });
 
@@ -3197,7 +3323,8 @@
           buildBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse();
       var od = api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse
           .fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse(od);
+      checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse(od
+          as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponseResponse);
     });
   });
 
@@ -3206,7 +3333,8 @@
       var o = buildBuildBazelRemoteExecutionV2CacheCapabilities();
       var od =
           api.BuildBazelRemoteExecutionV2CacheCapabilities.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2CacheCapabilities(od);
+      checkBuildBazelRemoteExecutionV2CacheCapabilities(
+          od as api.BuildBazelRemoteExecutionV2CacheCapabilities);
     });
   });
 
@@ -3214,7 +3342,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2Command();
       var od = api.BuildBazelRemoteExecutionV2Command.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2Command(od);
+      checkBuildBazelRemoteExecutionV2Command(
+          od as api.BuildBazelRemoteExecutionV2Command);
     });
   });
 
@@ -3225,7 +3354,8 @@
       var od =
           api.BuildBazelRemoteExecutionV2CommandEnvironmentVariable.fromJson(
               o.toJson());
-      checkBuildBazelRemoteExecutionV2CommandEnvironmentVariable(od);
+      checkBuildBazelRemoteExecutionV2CommandEnvironmentVariable(
+          od as api.BuildBazelRemoteExecutionV2CommandEnvironmentVariable);
     });
   });
 
@@ -3233,7 +3363,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2Digest();
       var od = api.BuildBazelRemoteExecutionV2Digest.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2Digest(od);
+      checkBuildBazelRemoteExecutionV2Digest(
+          od as api.BuildBazelRemoteExecutionV2Digest);
     });
   });
 
@@ -3241,7 +3372,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2Directory();
       var od = api.BuildBazelRemoteExecutionV2Directory.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2Directory(od);
+      checkBuildBazelRemoteExecutionV2Directory(
+          od as api.BuildBazelRemoteExecutionV2Directory);
     });
   });
 
@@ -3250,7 +3382,8 @@
       var o = buildBuildBazelRemoteExecutionV2DirectoryNode();
       var od =
           api.BuildBazelRemoteExecutionV2DirectoryNode.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2DirectoryNode(od);
+      checkBuildBazelRemoteExecutionV2DirectoryNode(
+          od as api.BuildBazelRemoteExecutionV2DirectoryNode);
     });
   });
 
@@ -3260,7 +3393,8 @@
       var o = buildBuildBazelRemoteExecutionV2ExecuteOperationMetadata();
       var od = api.BuildBazelRemoteExecutionV2ExecuteOperationMetadata.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2ExecuteOperationMetadata(od);
+      checkBuildBazelRemoteExecutionV2ExecuteOperationMetadata(
+          od as api.BuildBazelRemoteExecutionV2ExecuteOperationMetadata);
     });
   });
 
@@ -3269,7 +3403,8 @@
       var o = buildBuildBazelRemoteExecutionV2ExecuteRequest();
       var od =
           api.BuildBazelRemoteExecutionV2ExecuteRequest.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2ExecuteRequest(od);
+      checkBuildBazelRemoteExecutionV2ExecuteRequest(
+          od as api.BuildBazelRemoteExecutionV2ExecuteRequest);
     });
   });
 
@@ -3278,7 +3413,8 @@
       var o = buildBuildBazelRemoteExecutionV2ExecuteResponse();
       var od =
           api.BuildBazelRemoteExecutionV2ExecuteResponse.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2ExecuteResponse(od);
+      checkBuildBazelRemoteExecutionV2ExecuteResponse(
+          od as api.BuildBazelRemoteExecutionV2ExecuteResponse);
     });
   });
 
@@ -3288,7 +3424,8 @@
       var o = buildBuildBazelRemoteExecutionV2ExecutedActionMetadata();
       var od = api.BuildBazelRemoteExecutionV2ExecutedActionMetadata.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2ExecutedActionMetadata(od);
+      checkBuildBazelRemoteExecutionV2ExecutedActionMetadata(
+          od as api.BuildBazelRemoteExecutionV2ExecutedActionMetadata);
     });
   });
 
@@ -3298,7 +3435,8 @@
       var o = buildBuildBazelRemoteExecutionV2ExecutionCapabilities();
       var od = api.BuildBazelRemoteExecutionV2ExecutionCapabilities.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2ExecutionCapabilities(od);
+      checkBuildBazelRemoteExecutionV2ExecutionCapabilities(
+          od as api.BuildBazelRemoteExecutionV2ExecutionCapabilities);
     });
   });
 
@@ -3307,7 +3445,8 @@
       var o = buildBuildBazelRemoteExecutionV2ExecutionPolicy();
       var od =
           api.BuildBazelRemoteExecutionV2ExecutionPolicy.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2ExecutionPolicy(od);
+      checkBuildBazelRemoteExecutionV2ExecutionPolicy(
+          od as api.BuildBazelRemoteExecutionV2ExecutionPolicy);
     });
   });
 
@@ -3315,7 +3454,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2FileNode();
       var od = api.BuildBazelRemoteExecutionV2FileNode.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2FileNode(od);
+      checkBuildBazelRemoteExecutionV2FileNode(
+          od as api.BuildBazelRemoteExecutionV2FileNode);
     });
   });
 
@@ -3325,7 +3465,8 @@
       var o = buildBuildBazelRemoteExecutionV2FindMissingBlobsRequest();
       var od = api.BuildBazelRemoteExecutionV2FindMissingBlobsRequest.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2FindMissingBlobsRequest(od);
+      checkBuildBazelRemoteExecutionV2FindMissingBlobsRequest(
+          od as api.BuildBazelRemoteExecutionV2FindMissingBlobsRequest);
     });
   });
 
@@ -3335,7 +3476,8 @@
       var o = buildBuildBazelRemoteExecutionV2FindMissingBlobsResponse();
       var od = api.BuildBazelRemoteExecutionV2FindMissingBlobsResponse.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2FindMissingBlobsResponse(od);
+      checkBuildBazelRemoteExecutionV2FindMissingBlobsResponse(
+          od as api.BuildBazelRemoteExecutionV2FindMissingBlobsResponse);
     });
   });
 
@@ -3344,7 +3486,8 @@
       var o = buildBuildBazelRemoteExecutionV2GetTreeResponse();
       var od =
           api.BuildBazelRemoteExecutionV2GetTreeResponse.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2GetTreeResponse(od);
+      checkBuildBazelRemoteExecutionV2GetTreeResponse(
+          od as api.BuildBazelRemoteExecutionV2GetTreeResponse);
     });
   });
 
@@ -3352,7 +3495,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2LogFile();
       var od = api.BuildBazelRemoteExecutionV2LogFile.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2LogFile(od);
+      checkBuildBazelRemoteExecutionV2LogFile(
+          od as api.BuildBazelRemoteExecutionV2LogFile);
     });
   });
 
@@ -3360,7 +3504,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2NodeProperty();
       var od = api.BuildBazelRemoteExecutionV2NodeProperty.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2NodeProperty(od);
+      checkBuildBazelRemoteExecutionV2NodeProperty(
+          od as api.BuildBazelRemoteExecutionV2NodeProperty);
     });
   });
 
@@ -3369,7 +3514,8 @@
       var o = buildBuildBazelRemoteExecutionV2OutputDirectory();
       var od =
           api.BuildBazelRemoteExecutionV2OutputDirectory.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2OutputDirectory(od);
+      checkBuildBazelRemoteExecutionV2OutputDirectory(
+          od as api.BuildBazelRemoteExecutionV2OutputDirectory);
     });
   });
 
@@ -3377,7 +3523,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2OutputFile();
       var od = api.BuildBazelRemoteExecutionV2OutputFile.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2OutputFile(od);
+      checkBuildBazelRemoteExecutionV2OutputFile(
+          od as api.BuildBazelRemoteExecutionV2OutputFile);
     });
   });
 
@@ -3386,7 +3533,8 @@
       var o = buildBuildBazelRemoteExecutionV2OutputSymlink();
       var od =
           api.BuildBazelRemoteExecutionV2OutputSymlink.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2OutputSymlink(od);
+      checkBuildBazelRemoteExecutionV2OutputSymlink(
+          od as api.BuildBazelRemoteExecutionV2OutputSymlink);
     });
   });
 
@@ -3394,7 +3542,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2Platform();
       var od = api.BuildBazelRemoteExecutionV2Platform.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2Platform(od);
+      checkBuildBazelRemoteExecutionV2Platform(
+          od as api.BuildBazelRemoteExecutionV2Platform);
     });
   });
 
@@ -3403,7 +3552,8 @@
       var o = buildBuildBazelRemoteExecutionV2PlatformProperty();
       var od =
           api.BuildBazelRemoteExecutionV2PlatformProperty.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2PlatformProperty(od);
+      checkBuildBazelRemoteExecutionV2PlatformProperty(
+          od as api.BuildBazelRemoteExecutionV2PlatformProperty);
     });
   });
 
@@ -3413,7 +3563,8 @@
       var o = buildBuildBazelRemoteExecutionV2PriorityCapabilities();
       var od = api.BuildBazelRemoteExecutionV2PriorityCapabilities.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2PriorityCapabilities(od);
+      checkBuildBazelRemoteExecutionV2PriorityCapabilities(
+          od as api.BuildBazelRemoteExecutionV2PriorityCapabilities);
     });
   });
 
@@ -3425,7 +3576,8 @@
           buildBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange();
       var od = api.BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange
           .fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange(od);
+      checkBuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange(od
+          as api.BuildBazelRemoteExecutionV2PriorityCapabilitiesPriorityRange);
     });
   });
 
@@ -3434,7 +3586,8 @@
       var o = buildBuildBazelRemoteExecutionV2RequestMetadata();
       var od =
           api.BuildBazelRemoteExecutionV2RequestMetadata.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2RequestMetadata(od);
+      checkBuildBazelRemoteExecutionV2RequestMetadata(
+          od as api.BuildBazelRemoteExecutionV2RequestMetadata);
     });
   });
 
@@ -3444,7 +3597,8 @@
       var o = buildBuildBazelRemoteExecutionV2ResultsCachePolicy();
       var od = api.BuildBazelRemoteExecutionV2ResultsCachePolicy.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2ResultsCachePolicy(od);
+      checkBuildBazelRemoteExecutionV2ResultsCachePolicy(
+          od as api.BuildBazelRemoteExecutionV2ResultsCachePolicy);
     });
   });
 
@@ -3454,7 +3608,8 @@
       var o = buildBuildBazelRemoteExecutionV2ServerCapabilities();
       var od = api.BuildBazelRemoteExecutionV2ServerCapabilities.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2ServerCapabilities(od);
+      checkBuildBazelRemoteExecutionV2ServerCapabilities(
+          od as api.BuildBazelRemoteExecutionV2ServerCapabilities);
     });
   });
 
@@ -3462,7 +3617,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2SymlinkNode();
       var od = api.BuildBazelRemoteExecutionV2SymlinkNode.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2SymlinkNode(od);
+      checkBuildBazelRemoteExecutionV2SymlinkNode(
+          od as api.BuildBazelRemoteExecutionV2SymlinkNode);
     });
   });
 
@@ -3470,7 +3626,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2ToolDetails();
       var od = api.BuildBazelRemoteExecutionV2ToolDetails.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2ToolDetails(od);
+      checkBuildBazelRemoteExecutionV2ToolDetails(
+          od as api.BuildBazelRemoteExecutionV2ToolDetails);
     });
   });
 
@@ -3478,7 +3635,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelRemoteExecutionV2Tree();
       var od = api.BuildBazelRemoteExecutionV2Tree.fromJson(o.toJson());
-      checkBuildBazelRemoteExecutionV2Tree(od);
+      checkBuildBazelRemoteExecutionV2Tree(
+          od as api.BuildBazelRemoteExecutionV2Tree);
     });
   });
 
@@ -3488,7 +3646,8 @@
       var o = buildBuildBazelRemoteExecutionV2WaitExecutionRequest();
       var od = api.BuildBazelRemoteExecutionV2WaitExecutionRequest.fromJson(
           o.toJson());
-      checkBuildBazelRemoteExecutionV2WaitExecutionRequest(od);
+      checkBuildBazelRemoteExecutionV2WaitExecutionRequest(
+          od as api.BuildBazelRemoteExecutionV2WaitExecutionRequest);
     });
   });
 
@@ -3496,7 +3655,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuildBazelSemverSemVer();
       var od = api.BuildBazelSemverSemVer.fromJson(o.toJson());
-      checkBuildBazelSemverSemVer(od);
+      checkBuildBazelSemverSemVer(od as api.BuildBazelSemverSemVer);
     });
   });
 
@@ -3505,7 +3664,8 @@
       var o = buildGoogleDevtoolsRemotebuildbotCommandDurations();
       var od =
           api.GoogleDevtoolsRemotebuildbotCommandDurations.fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildbotCommandDurations(od);
+      checkGoogleDevtoolsRemotebuildbotCommandDurations(
+          od as api.GoogleDevtoolsRemotebuildbotCommandDurations);
     });
   });
 
@@ -3514,7 +3674,8 @@
       var o = buildGoogleDevtoolsRemotebuildbotCommandEvents();
       var od =
           api.GoogleDevtoolsRemotebuildbotCommandEvents.fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildbotCommandEvents(od);
+      checkGoogleDevtoolsRemotebuildbotCommandEvents(
+          od as api.GoogleDevtoolsRemotebuildbotCommandEvents);
     });
   });
 
@@ -3523,7 +3684,8 @@
       var o = buildGoogleDevtoolsRemotebuildbotCommandStatus();
       var od =
           api.GoogleDevtoolsRemotebuildbotCommandStatus.fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildbotCommandStatus(od);
+      checkGoogleDevtoolsRemotebuildbotCommandStatus(
+          od as api.GoogleDevtoolsRemotebuildbotCommandStatus);
     });
   });
 
@@ -3532,7 +3694,8 @@
       var o = buildGoogleDevtoolsRemotebuildbotResourceUsage();
       var od =
           api.GoogleDevtoolsRemotebuildbotResourceUsage.fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildbotResourceUsage(od);
+      checkGoogleDevtoolsRemotebuildbotResourceUsage(
+          od as api.GoogleDevtoolsRemotebuildbotResourceUsage);
     });
   });
 
@@ -3542,7 +3705,8 @@
       var o = buildGoogleDevtoolsRemotebuildbotResourceUsageStat();
       var od = api.GoogleDevtoolsRemotebuildbotResourceUsageStat.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemotebuildbotResourceUsageStat(od);
+      checkGoogleDevtoolsRemotebuildbotResourceUsageStat(
+          od as api.GoogleDevtoolsRemotebuildbotResourceUsageStat);
     });
   });
 
@@ -3555,7 +3719,9 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig
               .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig(od
+          as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaAcceleratorConfig);
     });
   });
 
@@ -3566,7 +3732,8 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale.fromJson(
               o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale(
+          od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaAutoscale);
     });
   });
 
@@ -3580,7 +3747,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateInstanceRequest);
     });
   });
 
@@ -3594,7 +3762,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaCreateWorkerPoolRequest);
     });
   });
 
@@ -3608,7 +3777,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteInstanceRequest
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteInstanceRequest(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteInstanceRequest);
     });
   });
 
@@ -3622,7 +3792,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteWorkerPoolRequest
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteWorkerPoolRequest(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaDeleteWorkerPoolRequest);
     });
   });
 
@@ -3634,7 +3805,8 @@
           buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy();
       var od = api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy
           .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy(od
+          as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicy);
     });
   });
 
@@ -3647,8 +3819,9 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature
               .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(
-          od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature(od
+          as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaFeaturePolicyFeature);
     });
   });
 
@@ -3661,7 +3834,9 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest
               .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest(od
+          as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetInstanceRequest);
     });
   });
 
@@ -3674,8 +3849,9 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest
               .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest(
-          od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest(od
+          as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaGetWorkerPoolRequest);
     });
   });
 
@@ -3686,7 +3862,8 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance.fromJson(
               o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance(
+          od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaInstance);
     });
   });
 
@@ -3699,8 +3876,9 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest
               .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest(
-          od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest(od
+          as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesRequest);
     });
   });
 
@@ -3714,7 +3892,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesResponse
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesResponse(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListInstancesResponse);
     });
   });
 
@@ -3728,7 +3907,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsRequest
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsRequest(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsRequest);
     });
   });
 
@@ -3742,7 +3922,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsResponse
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsResponse(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaListWorkerPoolsResponse);
     });
   });
 
@@ -3755,7 +3936,9 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig
               .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig(od
+          as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaSoleTenancyConfig);
     });
   });
 
@@ -3769,7 +3952,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateInstanceRequest);
     });
   });
 
@@ -3783,7 +3967,8 @@
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest(
-          od);
+          od as api
+              .GoogleDevtoolsRemotebuildexecutionAdminV1alphaUpdateWorkerPoolRequest);
     });
   });
 
@@ -3794,7 +3979,8 @@
       var o = buildGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig();
       var od = api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig
           .fromJson(o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig(
+          od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerConfig);
     });
   });
 
@@ -3806,7 +3992,8 @@
       var od =
           api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool.fromJson(
               o.toJson());
-      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(od);
+      checkGoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool(
+          od as api.GoogleDevtoolsRemotebuildexecutionAdminV1alphaWorkerPool);
     });
   });
 
@@ -3815,7 +4002,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2AdminTemp();
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2AdminTemp.fromJson(o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2AdminTemp(od);
+      checkGoogleDevtoolsRemoteworkersV1test2AdminTemp(
+          od as api.GoogleDevtoolsRemoteworkersV1test2AdminTemp);
     });
   });
 
@@ -3823,7 +4011,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleDevtoolsRemoteworkersV1test2Blob();
       var od = api.GoogleDevtoolsRemoteworkersV1test2Blob.fromJson(o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2Blob(od);
+      checkGoogleDevtoolsRemoteworkersV1test2Blob(
+          od as api.GoogleDevtoolsRemoteworkersV1test2Blob);
     });
   });
 
@@ -3833,7 +4022,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandOutputs();
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandOutputs.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2CommandOutputs(od);
+      checkGoogleDevtoolsRemoteworkersV1test2CommandOutputs(
+          od as api.GoogleDevtoolsRemoteworkersV1test2CommandOutputs);
     });
   });
 
@@ -3843,7 +4033,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandOverhead();
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandOverhead.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2CommandOverhead(od);
+      checkGoogleDevtoolsRemoteworkersV1test2CommandOverhead(
+          od as api.GoogleDevtoolsRemoteworkersV1test2CommandOverhead);
     });
   });
 
@@ -3853,7 +4044,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandResult();
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandResult.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2CommandResult(od);
+      checkGoogleDevtoolsRemoteworkersV1test2CommandResult(
+          od as api.GoogleDevtoolsRemoteworkersV1test2CommandResult);
     });
   });
 
@@ -3863,7 +4055,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandTask();
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandTask.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2CommandTask(od);
+      checkGoogleDevtoolsRemoteworkersV1test2CommandTask(
+          od as api.GoogleDevtoolsRemoteworkersV1test2CommandTask);
     });
   });
 
@@ -3873,7 +4066,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs();
       var od = api.GoogleDevtoolsRemoteworkersV1test2CommandTaskInputs.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs(od);
+      checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputs(
+          od as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskInputs);
     });
   });
 
@@ -3887,7 +4081,8 @@
           api.GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable
               .fromJson(o.toJson());
       checkGoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable(
-          od);
+          od as api
+              .GoogleDevtoolsRemoteworkersV1test2CommandTaskInputsEnvironmentVariable);
     });
   });
 
@@ -3898,7 +4093,8 @@
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs.fromJson(
               o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs(od);
+      checkGoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs(
+          od as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskOutputs);
     });
   });
 
@@ -3909,7 +4105,8 @@
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts.fromJson(
               o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts(od);
+      checkGoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts(
+          od as api.GoogleDevtoolsRemoteworkersV1test2CommandTaskTimeouts);
     });
   });
 
@@ -3918,7 +4115,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2Digest();
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2Digest.fromJson(o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2Digest(od);
+      checkGoogleDevtoolsRemoteworkersV1test2Digest(
+          od as api.GoogleDevtoolsRemoteworkersV1test2Digest);
     });
   });
 
@@ -3927,7 +4125,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2Directory();
       var od =
           api.GoogleDevtoolsRemoteworkersV1test2Directory.fromJson(o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2Directory(od);
+      checkGoogleDevtoolsRemoteworkersV1test2Directory(
+          od as api.GoogleDevtoolsRemoteworkersV1test2Directory);
     });
   });
 
@@ -3937,7 +4136,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata();
       var od = api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata(od);
+      checkGoogleDevtoolsRemoteworkersV1test2DirectoryMetadata(
+          od as api.GoogleDevtoolsRemoteworkersV1test2DirectoryMetadata);
     });
   });
 
@@ -3947,7 +4147,8 @@
       var o = buildGoogleDevtoolsRemoteworkersV1test2FileMetadata();
       var od = api.GoogleDevtoolsRemoteworkersV1test2FileMetadata.fromJson(
           o.toJson());
-      checkGoogleDevtoolsRemoteworkersV1test2FileMetadata(od);
+      checkGoogleDevtoolsRemoteworkersV1test2FileMetadata(
+          od as api.GoogleDevtoolsRemoteworkersV1test2FileMetadata);
     });
   });
 
@@ -3955,7 +4156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningOperation();
       var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
-      checkGoogleLongrunningOperation(od);
+      checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
 
@@ -3963,7 +4164,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcStatus();
       var od = api.GoogleRpcStatus.fromJson(o.toJson());
-      checkGoogleRpcStatus(od);
+      checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
 
@@ -4028,7 +4229,8 @@
               inlineStdout: arg_inlineStdout,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildBazelRemoteExecutionV2ActionResult(response);
+        checkBuildBazelRemoteExecutionV2ActionResult(
+            response as api.BuildBazelRemoteExecutionV2ActionResult);
       })));
     });
 
@@ -4042,8 +4244,10 @@
       var arg_resultsCachePolicy_priority = 42;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BuildBazelRemoteExecutionV2ActionResult.fromJson(json);
-        checkBuildBazelRemoteExecutionV2ActionResult(obj);
+        var obj = api.BuildBazelRemoteExecutionV2ActionResult.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBuildBazelRemoteExecutionV2ActionResult(
+            obj as api.BuildBazelRemoteExecutionV2ActionResult);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4089,7 +4293,8 @@
               resultsCachePolicy_priority: arg_resultsCachePolicy_priority,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildBazelRemoteExecutionV2ActionResult(response);
+        checkBuildBazelRemoteExecutionV2ActionResult(
+            response as api.BuildBazelRemoteExecutionV2ActionResult);
       })));
     });
   });
@@ -4102,8 +4307,10 @@
       var arg_instanceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BuildBazelRemoteExecutionV2ExecuteRequest.fromJson(json);
-        checkBuildBazelRemoteExecutionV2ExecuteRequest(obj);
+        var obj = api.BuildBazelRemoteExecutionV2ExecuteRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBuildBazelRemoteExecutionV2ExecuteRequest(
+            obj as api.BuildBazelRemoteExecutionV2ExecuteRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4143,7 +4350,8 @@
       res
           .execute(arg_request, arg_instanceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -4156,9 +4364,10 @@
       var arg_instanceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.BuildBazelRemoteExecutionV2BatchReadBlobsRequest.fromJson(json);
-        checkBuildBazelRemoteExecutionV2BatchReadBlobsRequest(obj);
+        var obj = api.BuildBazelRemoteExecutionV2BatchReadBlobsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBuildBazelRemoteExecutionV2BatchReadBlobsRequest(
+            obj as api.BuildBazelRemoteExecutionV2BatchReadBlobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4199,7 +4408,8 @@
       res
           .batchRead(arg_request, arg_instanceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildBazelRemoteExecutionV2BatchReadBlobsResponse(response);
+        checkBuildBazelRemoteExecutionV2BatchReadBlobsResponse(
+            response as api.BuildBazelRemoteExecutionV2BatchReadBlobsResponse);
       })));
     });
 
@@ -4213,8 +4423,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequest.fromJson(
-                json);
-        checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkBuildBazelRemoteExecutionV2BatchUpdateBlobsRequest(
+            obj as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4255,7 +4466,8 @@
       res
           .batchUpdate(arg_request, arg_instanceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse(response);
+        checkBuildBazelRemoteExecutionV2BatchUpdateBlobsResponse(response
+            as api.BuildBazelRemoteExecutionV2BatchUpdateBlobsResponse);
       })));
     });
 
@@ -4269,8 +4481,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.BuildBazelRemoteExecutionV2FindMissingBlobsRequest.fromJson(
-                json);
-        checkBuildBazelRemoteExecutionV2FindMissingBlobsRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkBuildBazelRemoteExecutionV2FindMissingBlobsRequest(
+            obj as api.BuildBazelRemoteExecutionV2FindMissingBlobsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4311,7 +4524,8 @@
       res
           .findMissing(arg_request, arg_instanceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildBazelRemoteExecutionV2FindMissingBlobsResponse(response);
+        checkBuildBazelRemoteExecutionV2FindMissingBlobsResponse(response
+            as api.BuildBazelRemoteExecutionV2FindMissingBlobsResponse);
       })));
     });
 
@@ -4371,7 +4585,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildBazelRemoteExecutionV2GetTreeResponse(response);
+        checkBuildBazelRemoteExecutionV2GetTreeResponse(
+            response as api.BuildBazelRemoteExecutionV2GetTreeResponse);
       })));
     });
   });
@@ -4384,9 +4599,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.BuildBazelRemoteExecutionV2WaitExecutionRequest.fromJson(json);
-        checkBuildBazelRemoteExecutionV2WaitExecutionRequest(obj);
+        var obj = api.BuildBazelRemoteExecutionV2WaitExecutionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBuildBazelRemoteExecutionV2WaitExecutionRequest(
+            obj as api.BuildBazelRemoteExecutionV2WaitExecutionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4426,7 +4642,8 @@
       res
           .waitExecution(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -4477,7 +4694,8 @@
       res
           .getCapabilities(arg_instanceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuildBazelRemoteExecutionV2ServerCapabilities(response);
+        checkBuildBazelRemoteExecutionV2ServerCapabilities(
+            response as api.BuildBazelRemoteExecutionV2ServerCapabilities);
       })));
     });
   });
diff --git a/generated/googleapis/test/reseller/v1_test.dart b/generated/googleapis/test/reseller/v1_test.dart
index 9e612f9..a4f98e5 100644
--- a/generated/googleapis/test/reseller/v1_test.dart
+++ b/generated/googleapis/test/reseller/v1_test.dart
@@ -133,7 +133,7 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.planName, unittest.equals('foo'));
     unittest.expect(o.purchaseOrderId, unittest.equals('foo'));
-    checkSeats(o.seats);
+    checkSeats(o.seats as api.Seats);
   }
   buildCounterChangePlanRequest--;
 }
@@ -165,7 +165,7 @@
     unittest.expect(o.customerId, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.phoneNumber, unittest.equals('foo'));
-    checkAddress(o.postalAddress);
+    checkAddress(o.postalAddress as api.Address);
     unittest.expect(o.resourceUiUrl, unittest.equals('foo'));
   }
   buildCounterCustomer--;
@@ -311,7 +311,8 @@
 void checkSubscriptionPlan(api.SubscriptionPlan o) {
   buildCounterSubscriptionPlan++;
   if (buildCounterSubscriptionPlan < 3) {
-    checkSubscriptionPlanCommitmentInterval(o.commitmentInterval);
+    checkSubscriptionPlanCommitmentInterval(
+        o.commitmentInterval as api.SubscriptionPlanCommitmentInterval);
     unittest.expect(o.isCommitmentPlan, unittest.isTrue);
     unittest.expect(o.planName, unittest.equals('foo'));
   }
@@ -410,18 +411,20 @@
     unittest.expect(o.customerId, unittest.equals('foo'));
     unittest.expect(o.dealCode, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSubscriptionPlan(o.plan);
+    checkSubscriptionPlan(o.plan as api.SubscriptionPlan);
     unittest.expect(o.purchaseOrderId, unittest.equals('foo'));
-    checkRenewalSettings(o.renewalSettings);
+    checkRenewalSettings(o.renewalSettings as api.RenewalSettings);
     unittest.expect(o.resourceUiUrl, unittest.equals('foo'));
-    checkSeats(o.seats);
+    checkSeats(o.seats as api.Seats);
     unittest.expect(o.skuId, unittest.equals('foo'));
     unittest.expect(o.skuName, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.subscriptionId, unittest.equals('foo'));
     checkUnnamed3388(o.suspensionReasons);
-    checkSubscriptionTransferInfo(o.transferInfo);
-    checkSubscriptionTrialSettings(o.trialSettings);
+    checkSubscriptionTransferInfo(
+        o.transferInfo as api.SubscriptionTransferInfo);
+    checkSubscriptionTrialSettings(
+        o.trialSettings as api.SubscriptionTrialSettings);
   }
   buildCounterSubscription--;
 }
@@ -435,8 +438,8 @@
 
 void checkUnnamed3389(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubscription(o[0]);
-  checkSubscription(o[1]);
+  checkSubscription(o[0] as api.Subscription);
+  checkSubscription(o[1] as api.Subscription);
 }
 
 core.int buildCounterSubscriptions = 0;
@@ -467,7 +470,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddress();
       var od = api.Address.fromJson(o.toJson());
-      checkAddress(od);
+      checkAddress(od as api.Address);
     });
   });
 
@@ -475,7 +478,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChangePlanRequest();
       var od = api.ChangePlanRequest.fromJson(o.toJson());
-      checkChangePlanRequest(od);
+      checkChangePlanRequest(od as api.ChangePlanRequest);
     });
   });
 
@@ -483,7 +486,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomer();
       var od = api.Customer.fromJson(o.toJson());
-      checkCustomer(od);
+      checkCustomer(od as api.Customer);
     });
   });
 
@@ -491,7 +494,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRenewalSettings();
       var od = api.RenewalSettings.fromJson(o.toJson());
-      checkRenewalSettings(od);
+      checkRenewalSettings(od as api.RenewalSettings);
     });
   });
 
@@ -499,7 +502,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResellernotifyGetwatchdetailsResponse();
       var od = api.ResellernotifyGetwatchdetailsResponse.fromJson(o.toJson());
-      checkResellernotifyGetwatchdetailsResponse(od);
+      checkResellernotifyGetwatchdetailsResponse(
+          od as api.ResellernotifyGetwatchdetailsResponse);
     });
   });
 
@@ -507,7 +511,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResellernotifyResource();
       var od = api.ResellernotifyResource.fromJson(o.toJson());
-      checkResellernotifyResource(od);
+      checkResellernotifyResource(od as api.ResellernotifyResource);
     });
   });
 
@@ -515,7 +519,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSeats();
       var od = api.Seats.fromJson(o.toJson());
-      checkSeats(od);
+      checkSeats(od as api.Seats);
     });
   });
 
@@ -523,7 +527,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionPlanCommitmentInterval();
       var od = api.SubscriptionPlanCommitmentInterval.fromJson(o.toJson());
-      checkSubscriptionPlanCommitmentInterval(od);
+      checkSubscriptionPlanCommitmentInterval(
+          od as api.SubscriptionPlanCommitmentInterval);
     });
   });
 
@@ -531,7 +536,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionPlan();
       var od = api.SubscriptionPlan.fromJson(o.toJson());
-      checkSubscriptionPlan(od);
+      checkSubscriptionPlan(od as api.SubscriptionPlan);
     });
   });
 
@@ -539,7 +544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionTransferInfo();
       var od = api.SubscriptionTransferInfo.fromJson(o.toJson());
-      checkSubscriptionTransferInfo(od);
+      checkSubscriptionTransferInfo(od as api.SubscriptionTransferInfo);
     });
   });
 
@@ -547,7 +552,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionTrialSettings();
       var od = api.SubscriptionTrialSettings.fromJson(o.toJson());
-      checkSubscriptionTrialSettings(od);
+      checkSubscriptionTrialSettings(od as api.SubscriptionTrialSettings);
     });
   });
 
@@ -555,7 +560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscription();
       var od = api.Subscription.fromJson(o.toJson());
-      checkSubscription(od);
+      checkSubscription(od as api.Subscription);
     });
   });
 
@@ -563,7 +568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptions();
       var od = api.Subscriptions.fromJson(o.toJson());
-      checkSubscriptions(od);
+      checkSubscriptions(od as api.Subscriptions);
     });
   });
 
@@ -617,7 +622,7 @@
       res
           .get(arg_customerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomer(response);
+        checkCustomer(response as api.Customer);
       })));
     });
 
@@ -628,8 +633,9 @@
       var arg_customerAuthToken = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Customer.fromJson(json);
-        checkCustomer(obj);
+        var obj =
+            api.Customer.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCustomer(obj as api.Customer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -674,7 +680,7 @@
           .insert(arg_request,
               customerAuthToken: arg_customerAuthToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomer(response);
+        checkCustomer(response as api.Customer);
       })));
     });
 
@@ -685,8 +691,9 @@
       var arg_customerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Customer.fromJson(json);
-        checkCustomer(obj);
+        var obj =
+            api.Customer.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCustomer(obj as api.Customer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -731,7 +738,7 @@
       res
           .patch(arg_request, arg_customerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomer(response);
+        checkCustomer(response as api.Customer);
       })));
     });
 
@@ -742,8 +749,9 @@
       var arg_customerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Customer.fromJson(json);
-        checkCustomer(obj);
+        var obj =
+            api.Customer.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCustomer(obj as api.Customer);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -788,7 +796,7 @@
       res
           .update(arg_request, arg_customerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomer(response);
+        checkCustomer(response as api.Customer);
       })));
     });
   });
@@ -840,7 +848,8 @@
       res
           .getwatchdetails($fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResellernotifyGetwatchdetailsResponse(response);
+        checkResellernotifyGetwatchdetailsResponse(
+            response as api.ResellernotifyGetwatchdetailsResponse);
       })));
     });
 
@@ -894,7 +903,7 @@
               serviceAccountEmailAddress: arg_serviceAccountEmailAddress,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResellernotifyResource(response);
+        checkResellernotifyResource(response as api.ResellernotifyResource);
       })));
     });
 
@@ -948,7 +957,7 @@
               serviceAccountEmailAddress: arg_serviceAccountEmailAddress,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResellernotifyResource(response);
+        checkResellernotifyResource(response as api.ResellernotifyResource);
       })));
     });
   });
@@ -1019,7 +1028,7 @@
       res
           .activate(arg_customerId, arg_subscriptionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -1031,8 +1040,9 @@
       var arg_subscriptionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChangePlanRequest.fromJson(json);
-        checkChangePlanRequest(obj);
+        var obj = api.ChangePlanRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChangePlanRequest(obj as api.ChangePlanRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1093,7 +1103,7 @@
           .changePlan(arg_request, arg_customerId, arg_subscriptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -1105,8 +1115,9 @@
       var arg_subscriptionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RenewalSettings.fromJson(json);
-        checkRenewalSettings(obj);
+        var obj = api.RenewalSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRenewalSettings(obj as api.RenewalSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1168,7 +1179,7 @@
               arg_request, arg_customerId, arg_subscriptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -1180,8 +1191,9 @@
       var arg_subscriptionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Seats.fromJson(json);
-        checkSeats(obj);
+        var obj =
+            api.Seats.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSeats(obj as api.Seats);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1242,7 +1254,7 @@
           .changeSeats(arg_request, arg_customerId, arg_subscriptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -1370,7 +1382,7 @@
       res
           .get(arg_customerId, arg_subscriptionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -1382,8 +1394,9 @@
       var arg_customerAuthToken = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subscription.fromJson(json);
-        checkSubscription(obj);
+        var obj = api.Subscription.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubscription(obj as api.Subscription);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1437,7 +1450,7 @@
           .insert(arg_request, arg_customerId,
               customerAuthToken: arg_customerAuthToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -1507,7 +1520,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscriptions(response);
+        checkSubscriptions(response as api.Subscriptions);
       })));
     });
 
@@ -1577,7 +1590,7 @@
           .startPaidService(arg_customerId, arg_subscriptionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -1646,7 +1659,7 @@
       res
           .suspend(arg_customerId, arg_subscriptionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
   });
diff --git a/generated/googleapis/test/run/v1_test.dart b/generated/googleapis/test/run/v1_test.dart
index 42ed079..5bc9639 100644
--- a/generated/googleapis/test/run/v1_test.dart
+++ b/generated/googleapis/test/run/v1_test.dart
@@ -102,8 +102,8 @@
 
 void checkUnnamed1408(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -211,7 +211,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed1410(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -234,7 +234,8 @@
 void checkConfigMapEnvSource(api.ConfigMapEnvSource o) {
   buildCounterConfigMapEnvSource++;
   if (buildCounterConfigMapEnvSource < 3) {
-    checkLocalObjectReference(o.localObjectReference);
+    checkLocalObjectReference(
+        o.localObjectReference as api.LocalObjectReference);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.optional, unittest.isTrue);
   }
@@ -259,7 +260,8 @@
   buildCounterConfigMapKeySelector++;
   if (buildCounterConfigMapKeySelector < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkLocalObjectReference(o.localObjectReference);
+    checkLocalObjectReference(
+        o.localObjectReference as api.LocalObjectReference);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.optional, unittest.isTrue);
   }
@@ -275,8 +277,8 @@
 
 void checkUnnamed1411(core.List<api.KeyToPath> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKeyToPath(o[0]);
-  checkKeyToPath(o[1]);
+  checkKeyToPath(o[0] as api.KeyToPath);
+  checkKeyToPath(o[1] as api.KeyToPath);
 }
 
 core.int buildCounterConfigMapVolumeSource = 0;
@@ -324,9 +326,9 @@
   if (buildCounterConfiguration < 3) {
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkObjectMeta(o.metadata);
-    checkConfigurationSpec(o.spec);
-    checkConfigurationStatus(o.status);
+    checkObjectMeta(o.metadata as api.ObjectMeta);
+    checkConfigurationSpec(o.spec as api.ConfigurationSpec);
+    checkConfigurationStatus(o.status as api.ConfigurationStatus);
   }
   buildCounterConfiguration--;
 }
@@ -345,7 +347,7 @@
 void checkConfigurationSpec(api.ConfigurationSpec o) {
   buildCounterConfigurationSpec++;
   if (buildCounterConfigurationSpec < 3) {
-    checkRevisionTemplate(o.template);
+    checkRevisionTemplate(o.template as api.RevisionTemplate);
   }
   buildCounterConfigurationSpec--;
 }
@@ -359,8 +361,8 @@
 
 void checkUnnamed1412(core.List<api.GoogleCloudRunV1Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRunV1Condition(o[0]);
-  checkGoogleCloudRunV1Condition(o[1]);
+  checkGoogleCloudRunV1Condition(o[0] as api.GoogleCloudRunV1Condition);
+  checkGoogleCloudRunV1Condition(o[1] as api.GoogleCloudRunV1Condition);
 }
 
 core.int buildCounterConfigurationStatus = 0;
@@ -423,8 +425,8 @@
 
 void checkUnnamed1415(core.List<api.EnvVar> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnvVar(o[0]);
-  checkEnvVar(o[1]);
+  checkEnvVar(o[0] as api.EnvVar);
+  checkEnvVar(o[1] as api.EnvVar);
 }
 
 core.List<api.EnvFromSource> buildUnnamed1416() {
@@ -436,8 +438,8 @@
 
 void checkUnnamed1416(core.List<api.EnvFromSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnvFromSource(o[0]);
-  checkEnvFromSource(o[1]);
+  checkEnvFromSource(o[0] as api.EnvFromSource);
+  checkEnvFromSource(o[1] as api.EnvFromSource);
 }
 
 core.List<api.ContainerPort> buildUnnamed1417() {
@@ -449,8 +451,8 @@
 
 void checkUnnamed1417(core.List<api.ContainerPort> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainerPort(o[0]);
-  checkContainerPort(o[1]);
+  checkContainerPort(o[0] as api.ContainerPort);
+  checkContainerPort(o[1] as api.ContainerPort);
 }
 
 core.List<api.VolumeMount> buildUnnamed1418() {
@@ -462,8 +464,8 @@
 
 void checkUnnamed1418(core.List<api.VolumeMount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolumeMount(o[0]);
-  checkVolumeMount(o[1]);
+  checkVolumeMount(o[0] as api.VolumeMount);
+  checkVolumeMount(o[1] as api.VolumeMount);
 }
 
 core.int buildCounterContainer = 0;
@@ -501,12 +503,12 @@
     checkUnnamed1416(o.envFrom);
     unittest.expect(o.image, unittest.equals('foo'));
     unittest.expect(o.imagePullPolicy, unittest.equals('foo'));
-    checkProbe(o.livenessProbe);
+    checkProbe(o.livenessProbe as api.Probe);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1417(o.ports);
-    checkProbe(o.readinessProbe);
-    checkResourceRequirements(o.resources);
-    checkSecurityContext(o.securityContext);
+    checkProbe(o.readinessProbe as api.Probe);
+    checkResourceRequirements(o.resources as api.ResourceRequirements);
+    checkSecurityContext(o.securityContext as api.SecurityContext);
     unittest.expect(o.terminationMessagePath, unittest.equals('foo'));
     unittest.expect(o.terminationMessagePolicy, unittest.equals('foo'));
     checkUnnamed1418(o.volumeMounts);
@@ -558,9 +560,9 @@
   if (buildCounterDomainMapping < 3) {
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkObjectMeta(o.metadata);
-    checkDomainMappingSpec(o.spec);
-    checkDomainMappingStatus(o.status);
+    checkObjectMeta(o.metadata as api.ObjectMeta);
+    checkDomainMappingSpec(o.spec as api.DomainMappingSpec);
+    checkDomainMappingStatus(o.status as api.DomainMappingStatus);
   }
   buildCounterDomainMapping--;
 }
@@ -597,8 +599,8 @@
 
 void checkUnnamed1419(core.List<api.GoogleCloudRunV1Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRunV1Condition(o[0]);
-  checkGoogleCloudRunV1Condition(o[1]);
+  checkGoogleCloudRunV1Condition(o[0] as api.GoogleCloudRunV1Condition);
+  checkGoogleCloudRunV1Condition(o[1] as api.GoogleCloudRunV1Condition);
 }
 
 core.List<api.ResourceRecord> buildUnnamed1420() {
@@ -610,8 +612,8 @@
 
 void checkUnnamed1420(core.List<api.ResourceRecord> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceRecord(o[0]);
-  checkResourceRecord(o[1]);
+  checkResourceRecord(o[0] as api.ResourceRecord);
+  checkResourceRecord(o[1] as api.ResourceRecord);
 }
 
 core.int buildCounterDomainMappingStatus = 0;
@@ -657,9 +659,9 @@
 void checkEnvFromSource(api.EnvFromSource o) {
   buildCounterEnvFromSource++;
   if (buildCounterEnvFromSource < 3) {
-    checkConfigMapEnvSource(o.configMapRef);
+    checkConfigMapEnvSource(o.configMapRef as api.ConfigMapEnvSource);
     unittest.expect(o.prefix, unittest.equals('foo'));
-    checkSecretEnvSource(o.secretRef);
+    checkSecretEnvSource(o.secretRef as api.SecretEnvSource);
   }
   buildCounterEnvFromSource--;
 }
@@ -682,7 +684,7 @@
   if (buildCounterEnvVar < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
-    checkEnvVarSource(o.valueFrom);
+    checkEnvVarSource(o.valueFrom as api.EnvVarSource);
   }
   buildCounterEnvVar--;
 }
@@ -702,8 +704,8 @@
 void checkEnvVarSource(api.EnvVarSource o) {
   buildCounterEnvVarSource++;
   if (buildCounterEnvVarSource < 3) {
-    checkConfigMapKeySelector(o.configMapKeyRef);
-    checkSecretKeySelector(o.secretKeyRef);
+    checkConfigMapKeySelector(o.configMapKeyRef as api.ConfigMapKeySelector);
+    checkSecretKeySelector(o.secretKeyRef as api.SecretKeySelector);
   }
   buildCounterEnvVarSource--;
 }
@@ -803,8 +805,8 @@
 
 void checkUnnamed1422(core.List<api.HTTPHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHTTPHeader(o[0]);
-  checkHTTPHeader(o[1]);
+  checkHTTPHeader(o[0] as api.HTTPHeader);
+  checkHTTPHeader(o[1] as api.HTTPHeader);
 }
 
 core.int buildCounterHTTPGetAction = 0;
@@ -885,8 +887,8 @@
 
 void checkUnnamed1423(core.List<api.AuthorizedDomain> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthorizedDomain(o[0]);
-  checkAuthorizedDomain(o[1]);
+  checkAuthorizedDomain(o[0] as api.AuthorizedDomain);
+  checkAuthorizedDomain(o[1] as api.AuthorizedDomain);
 }
 
 core.int buildCounterListAuthorizedDomainsResponse = 0;
@@ -919,8 +921,8 @@
 
 void checkUnnamed1424(core.List<api.Configuration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConfiguration(o[0]);
-  checkConfiguration(o[1]);
+  checkConfiguration(o[0] as api.Configuration);
+  checkConfiguration(o[1] as api.Configuration);
 }
 
 core.List<core.String> buildUnnamed1425() {
@@ -957,7 +959,7 @@
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     checkUnnamed1424(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkListMeta(o.metadata);
+    checkListMeta(o.metadata as api.ListMeta);
     checkUnnamed1425(o.unreachable);
   }
   buildCounterListConfigurationsResponse--;
@@ -972,8 +974,8 @@
 
 void checkUnnamed1426(core.List<api.DomainMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDomainMapping(o[0]);
-  checkDomainMapping(o[1]);
+  checkDomainMapping(o[0] as api.DomainMapping);
+  checkDomainMapping(o[1] as api.DomainMapping);
 }
 
 core.List<core.String> buildUnnamed1427() {
@@ -1010,7 +1012,7 @@
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     checkUnnamed1426(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkListMeta(o.metadata);
+    checkListMeta(o.metadata as api.ListMeta);
     checkUnnamed1427(o.unreachable);
   }
   buildCounterListDomainMappingsResponse--;
@@ -1025,8 +1027,8 @@
 
 void checkUnnamed1428(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -1082,8 +1084,8 @@
 
 void checkUnnamed1429(core.List<api.Revision> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRevision(o[0]);
-  checkRevision(o[1]);
+  checkRevision(o[0] as api.Revision);
+  checkRevision(o[1] as api.Revision);
 }
 
 core.List<core.String> buildUnnamed1430() {
@@ -1120,7 +1122,7 @@
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     checkUnnamed1429(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkListMeta(o.metadata);
+    checkListMeta(o.metadata as api.ListMeta);
     checkUnnamed1430(o.unreachable);
   }
   buildCounterListRevisionsResponse--;
@@ -1135,8 +1137,8 @@
 
 void checkUnnamed1431(core.List<api.Route> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoute(o[0]);
-  checkRoute(o[1]);
+  checkRoute(o[0] as api.Route);
+  checkRoute(o[1] as api.Route);
 }
 
 core.List<core.String> buildUnnamed1432() {
@@ -1173,7 +1175,7 @@
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     checkUnnamed1431(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkListMeta(o.metadata);
+    checkListMeta(o.metadata as api.ListMeta);
     checkUnnamed1432(o.unreachable);
   }
   buildCounterListRoutesResponse--;
@@ -1188,8 +1190,8 @@
 
 void checkUnnamed1433(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkService(o[0]);
-  checkService(o[1]);
+  checkService(o[0] as api.Service);
+  checkService(o[1] as api.Service);
 }
 
 core.List<core.String> buildUnnamed1434() {
@@ -1226,7 +1228,7 @@
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     checkUnnamed1433(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkListMeta(o.metadata);
+    checkListMeta(o.metadata as api.ListMeta);
     checkUnnamed1434(o.unreachable);
   }
   buildCounterListServicesResponse--;
@@ -1368,8 +1370,8 @@
 
 void checkUnnamed1440(core.List<api.OwnerReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOwnerReference(o[0]);
-  checkOwnerReference(o[1]);
+  checkOwnerReference(o[0] as api.OwnerReference);
+  checkOwnerReference(o[1] as api.OwnerReference);
 }
 
 core.int buildCounterObjectMeta = 0;
@@ -1457,8 +1459,8 @@
 
 void checkUnnamed1441(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed1442() {
@@ -1470,8 +1472,8 @@
 
 void checkUnnamed1442(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1520,13 +1522,13 @@
 void checkProbe(api.Probe o) {
   buildCounterProbe++;
   if (buildCounterProbe < 3) {
-    checkExecAction(o.exec);
+    checkExecAction(o.exec as api.ExecAction);
     unittest.expect(o.failureThreshold, unittest.equals(42));
-    checkHTTPGetAction(o.httpGet);
+    checkHTTPGetAction(o.httpGet as api.HTTPGetAction);
     unittest.expect(o.initialDelaySeconds, unittest.equals(42));
     unittest.expect(o.periodSeconds, unittest.equals(42));
     unittest.expect(o.successThreshold, unittest.equals(42));
-    checkTCPSocketAction(o.tcpSocket);
+    checkTCPSocketAction(o.tcpSocket as api.TCPSocketAction);
     unittest.expect(o.timeoutSeconds, unittest.equals(42));
   }
   buildCounterProbe--;
@@ -1622,9 +1624,9 @@
   if (buildCounterRevision < 3) {
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkObjectMeta(o.metadata);
-    checkRevisionSpec(o.spec);
-    checkRevisionStatus(o.status);
+    checkObjectMeta(o.metadata as api.ObjectMeta);
+    checkRevisionSpec(o.spec as api.RevisionSpec);
+    checkRevisionStatus(o.status as api.RevisionStatus);
   }
   buildCounterRevision--;
 }
@@ -1638,8 +1640,8 @@
 
 void checkUnnamed1445(core.List<api.Container> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainer(o[0]);
-  checkContainer(o[1]);
+  checkContainer(o[0] as api.Container);
+  checkContainer(o[1] as api.Container);
 }
 
 core.List<api.Volume> buildUnnamed1446() {
@@ -1651,8 +1653,8 @@
 
 void checkUnnamed1446(core.List<api.Volume> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVolume(o[0]);
-  checkVolume(o[1]);
+  checkVolume(o[0] as api.Volume);
+  checkVolume(o[1] as api.Volume);
 }
 
 core.int buildCounterRevisionSpec = 0;
@@ -1691,8 +1693,8 @@
 
 void checkUnnamed1447(core.List<api.GoogleCloudRunV1Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRunV1Condition(o[0]);
-  checkGoogleCloudRunV1Condition(o[1]);
+  checkGoogleCloudRunV1Condition(o[0] as api.GoogleCloudRunV1Condition);
+  checkGoogleCloudRunV1Condition(o[1] as api.GoogleCloudRunV1Condition);
 }
 
 core.int buildCounterRevisionStatus = 0;
@@ -1737,8 +1739,8 @@
 void checkRevisionTemplate(api.RevisionTemplate o) {
   buildCounterRevisionTemplate++;
   if (buildCounterRevisionTemplate < 3) {
-    checkObjectMeta(o.metadata);
-    checkRevisionSpec(o.spec);
+    checkObjectMeta(o.metadata as api.ObjectMeta);
+    checkRevisionSpec(o.spec as api.RevisionSpec);
   }
   buildCounterRevisionTemplate--;
 }
@@ -1763,9 +1765,9 @@
   if (buildCounterRoute < 3) {
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkObjectMeta(o.metadata);
-    checkRouteSpec(o.spec);
-    checkRouteStatus(o.status);
+    checkObjectMeta(o.metadata as api.ObjectMeta);
+    checkRouteSpec(o.spec as api.RouteSpec);
+    checkRouteStatus(o.status as api.RouteStatus);
   }
   buildCounterRoute--;
 }
@@ -1779,8 +1781,8 @@
 
 void checkUnnamed1448(core.List<api.TrafficTarget> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrafficTarget(o[0]);
-  checkTrafficTarget(o[1]);
+  checkTrafficTarget(o[0] as api.TrafficTarget);
+  checkTrafficTarget(o[1] as api.TrafficTarget);
 }
 
 core.int buildCounterRouteSpec = 0;
@@ -1811,8 +1813,8 @@
 
 void checkUnnamed1449(core.List<api.GoogleCloudRunV1Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRunV1Condition(o[0]);
-  checkGoogleCloudRunV1Condition(o[1]);
+  checkGoogleCloudRunV1Condition(o[0] as api.GoogleCloudRunV1Condition);
+  checkGoogleCloudRunV1Condition(o[1] as api.GoogleCloudRunV1Condition);
 }
 
 core.List<api.TrafficTarget> buildUnnamed1450() {
@@ -1824,8 +1826,8 @@
 
 void checkUnnamed1450(core.List<api.TrafficTarget> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrafficTarget(o[0]);
-  checkTrafficTarget(o[1]);
+  checkTrafficTarget(o[0] as api.TrafficTarget);
+  checkTrafficTarget(o[1] as api.TrafficTarget);
 }
 
 core.int buildCounterRouteStatus = 0;
@@ -1846,7 +1848,7 @@
 void checkRouteStatus(api.RouteStatus o) {
   buildCounterRouteStatus++;
   if (buildCounterRouteStatus < 3) {
-    checkAddressable(o.address);
+    checkAddressable(o.address as api.Addressable);
     checkUnnamed1449(o.conditions);
     unittest.expect(o.observedGeneration, unittest.equals(42));
     checkUnnamed1450(o.traffic);
@@ -1871,7 +1873,8 @@
 void checkSecretEnvSource(api.SecretEnvSource o) {
   buildCounterSecretEnvSource++;
   if (buildCounterSecretEnvSource < 3) {
-    checkLocalObjectReference(o.localObjectReference);
+    checkLocalObjectReference(
+        o.localObjectReference as api.LocalObjectReference);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.optional, unittest.isTrue);
   }
@@ -1896,7 +1899,8 @@
   buildCounterSecretKeySelector++;
   if (buildCounterSecretKeySelector < 3) {
     unittest.expect(o.key, unittest.equals('foo'));
-    checkLocalObjectReference(o.localObjectReference);
+    checkLocalObjectReference(
+        o.localObjectReference as api.LocalObjectReference);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.optional, unittest.isTrue);
   }
@@ -1912,8 +1916,8 @@
 
 void checkUnnamed1451(core.List<api.KeyToPath> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKeyToPath(o[0]);
-  checkKeyToPath(o[1]);
+  checkKeyToPath(o[0] as api.KeyToPath);
+  checkKeyToPath(o[1] as api.KeyToPath);
 }
 
 core.int buildCounterSecretVolumeSource = 0;
@@ -1980,9 +1984,9 @@
   if (buildCounterService < 3) {
     unittest.expect(o.apiVersion, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkObjectMeta(o.metadata);
-    checkServiceSpec(o.spec);
-    checkServiceStatus(o.status);
+    checkObjectMeta(o.metadata as api.ObjectMeta);
+    checkServiceSpec(o.spec as api.ServiceSpec);
+    checkServiceStatus(o.status as api.ServiceStatus);
   }
   buildCounterService--;
 }
@@ -1996,8 +2000,8 @@
 
 void checkUnnamed1452(core.List<api.TrafficTarget> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrafficTarget(o[0]);
-  checkTrafficTarget(o[1]);
+  checkTrafficTarget(o[0] as api.TrafficTarget);
+  checkTrafficTarget(o[1] as api.TrafficTarget);
 }
 
 core.int buildCounterServiceSpec = 0;
@@ -2015,7 +2019,7 @@
 void checkServiceSpec(api.ServiceSpec o) {
   buildCounterServiceSpec++;
   if (buildCounterServiceSpec < 3) {
-    checkRevisionTemplate(o.template);
+    checkRevisionTemplate(o.template as api.RevisionTemplate);
     checkUnnamed1452(o.traffic);
   }
   buildCounterServiceSpec--;
@@ -2030,8 +2034,8 @@
 
 void checkUnnamed1453(core.List<api.GoogleCloudRunV1Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudRunV1Condition(o[0]);
-  checkGoogleCloudRunV1Condition(o[1]);
+  checkGoogleCloudRunV1Condition(o[0] as api.GoogleCloudRunV1Condition);
+  checkGoogleCloudRunV1Condition(o[1] as api.GoogleCloudRunV1Condition);
 }
 
 core.List<api.TrafficTarget> buildUnnamed1454() {
@@ -2043,8 +2047,8 @@
 
 void checkUnnamed1454(core.List<api.TrafficTarget> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrafficTarget(o[0]);
-  checkTrafficTarget(o[1]);
+  checkTrafficTarget(o[0] as api.TrafficTarget);
+  checkTrafficTarget(o[1] as api.TrafficTarget);
 }
 
 core.int buildCounterServiceStatus = 0;
@@ -2067,7 +2071,7 @@
 void checkServiceStatus(api.ServiceStatus o) {
   buildCounterServiceStatus++;
   if (buildCounterServiceStatus < 3) {
-    checkAddressable(o.address);
+    checkAddressable(o.address as api.Addressable);
     checkUnnamed1453(o.conditions);
     unittest.expect(o.latestCreatedRevisionName, unittest.equals('foo'));
     unittest.expect(o.latestReadyRevisionName, unittest.equals('foo'));
@@ -2093,7 +2097,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -2119,9 +2123,9 @@
   buildCounterStatus++;
   if (buildCounterStatus < 3) {
     unittest.expect(o.code, unittest.equals(42));
-    checkStatusDetails(o.details);
+    checkStatusDetails(o.details as api.StatusDetails);
     unittest.expect(o.message, unittest.equals('foo'));
-    checkListMeta(o.metadata);
+    checkListMeta(o.metadata as api.ListMeta);
     unittest.expect(o.reason, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
   }
@@ -2160,8 +2164,8 @@
 
 void checkUnnamed1455(core.List<api.StatusCause> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatusCause(o[0]);
-  checkStatusCause(o[1]);
+  checkStatusCause(o[0] as api.StatusCause);
+  checkStatusCause(o[1] as api.StatusCause);
 }
 
 core.int buildCounterStatusDetails = 0;
@@ -2323,9 +2327,9 @@
 void checkVolume(api.Volume o) {
   buildCounterVolume++;
   if (buildCounterVolume < 3) {
-    checkConfigMapVolumeSource(o.configMap);
+    checkConfigMapVolumeSource(o.configMap as api.ConfigMapVolumeSource);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkSecretVolumeSource(o.secret);
+    checkSecretVolumeSource(o.secret as api.SecretVolumeSource);
   }
   buildCounterVolume--;
 }
@@ -2360,7 +2364,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddressable();
       var od = api.Addressable.fromJson(o.toJson());
-      checkAddressable(od);
+      checkAddressable(od as api.Addressable);
     });
   });
 
@@ -2368,7 +2372,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -2376,7 +2380,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -2384,7 +2388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizedDomain();
       var od = api.AuthorizedDomain.fromJson(o.toJson());
-      checkAuthorizedDomain(od);
+      checkAuthorizedDomain(od as api.AuthorizedDomain);
     });
   });
 
@@ -2392,7 +2396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -2400,7 +2404,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigMapEnvSource();
       var od = api.ConfigMapEnvSource.fromJson(o.toJson());
-      checkConfigMapEnvSource(od);
+      checkConfigMapEnvSource(od as api.ConfigMapEnvSource);
     });
   });
 
@@ -2408,7 +2412,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigMapKeySelector();
       var od = api.ConfigMapKeySelector.fromJson(o.toJson());
-      checkConfigMapKeySelector(od);
+      checkConfigMapKeySelector(od as api.ConfigMapKeySelector);
     });
   });
 
@@ -2416,7 +2420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigMapVolumeSource();
       var od = api.ConfigMapVolumeSource.fromJson(o.toJson());
-      checkConfigMapVolumeSource(od);
+      checkConfigMapVolumeSource(od as api.ConfigMapVolumeSource);
     });
   });
 
@@ -2424,7 +2428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfiguration();
       var od = api.Configuration.fromJson(o.toJson());
-      checkConfiguration(od);
+      checkConfiguration(od as api.Configuration);
     });
   });
 
@@ -2432,7 +2436,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigurationSpec();
       var od = api.ConfigurationSpec.fromJson(o.toJson());
-      checkConfigurationSpec(od);
+      checkConfigurationSpec(od as api.ConfigurationSpec);
     });
   });
 
@@ -2440,7 +2444,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigurationStatus();
       var od = api.ConfigurationStatus.fromJson(o.toJson());
-      checkConfigurationStatus(od);
+      checkConfigurationStatus(od as api.ConfigurationStatus);
     });
   });
 
@@ -2448,7 +2452,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainer();
       var od = api.Container.fromJson(o.toJson());
-      checkContainer(od);
+      checkContainer(od as api.Container);
     });
   });
 
@@ -2456,7 +2460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerPort();
       var od = api.ContainerPort.fromJson(o.toJson());
-      checkContainerPort(od);
+      checkContainerPort(od as api.ContainerPort);
     });
   });
 
@@ -2464,7 +2468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomainMapping();
       var od = api.DomainMapping.fromJson(o.toJson());
-      checkDomainMapping(od);
+      checkDomainMapping(od as api.DomainMapping);
     });
   });
 
@@ -2472,7 +2476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomainMappingSpec();
       var od = api.DomainMappingSpec.fromJson(o.toJson());
-      checkDomainMappingSpec(od);
+      checkDomainMappingSpec(od as api.DomainMappingSpec);
     });
   });
 
@@ -2480,7 +2484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDomainMappingStatus();
       var od = api.DomainMappingStatus.fromJson(o.toJson());
-      checkDomainMappingStatus(od);
+      checkDomainMappingStatus(od as api.DomainMappingStatus);
     });
   });
 
@@ -2488,7 +2492,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvFromSource();
       var od = api.EnvFromSource.fromJson(o.toJson());
-      checkEnvFromSource(od);
+      checkEnvFromSource(od as api.EnvFromSource);
     });
   });
 
@@ -2496,7 +2500,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvVar();
       var od = api.EnvVar.fromJson(o.toJson());
-      checkEnvVar(od);
+      checkEnvVar(od as api.EnvVar);
     });
   });
 
@@ -2504,7 +2508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvVarSource();
       var od = api.EnvVarSource.fromJson(o.toJson());
-      checkEnvVarSource(od);
+      checkEnvVarSource(od as api.EnvVarSource);
     });
   });
 
@@ -2512,7 +2516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecAction();
       var od = api.ExecAction.fromJson(o.toJson());
-      checkExecAction(od);
+      checkExecAction(od as api.ExecAction);
     });
   });
 
@@ -2520,7 +2524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -2528,7 +2532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudRunV1Condition();
       var od = api.GoogleCloudRunV1Condition.fromJson(o.toJson());
-      checkGoogleCloudRunV1Condition(od);
+      checkGoogleCloudRunV1Condition(od as api.GoogleCloudRunV1Condition);
     });
   });
 
@@ -2536,7 +2540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHTTPGetAction();
       var od = api.HTTPGetAction.fromJson(o.toJson());
-      checkHTTPGetAction(od);
+      checkHTTPGetAction(od as api.HTTPGetAction);
     });
   });
 
@@ -2544,7 +2548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHTTPHeader();
       var od = api.HTTPHeader.fromJson(o.toJson());
-      checkHTTPHeader(od);
+      checkHTTPHeader(od as api.HTTPHeader);
     });
   });
 
@@ -2552,7 +2556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyToPath();
       var od = api.KeyToPath.fromJson(o.toJson());
-      checkKeyToPath(od);
+      checkKeyToPath(od as api.KeyToPath);
     });
   });
 
@@ -2560,7 +2564,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAuthorizedDomainsResponse();
       var od = api.ListAuthorizedDomainsResponse.fromJson(o.toJson());
-      checkListAuthorizedDomainsResponse(od);
+      checkListAuthorizedDomainsResponse(
+          od as api.ListAuthorizedDomainsResponse);
     });
   });
 
@@ -2568,7 +2573,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListConfigurationsResponse();
       var od = api.ListConfigurationsResponse.fromJson(o.toJson());
-      checkListConfigurationsResponse(od);
+      checkListConfigurationsResponse(od as api.ListConfigurationsResponse);
     });
   });
 
@@ -2576,7 +2581,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDomainMappingsResponse();
       var od = api.ListDomainMappingsResponse.fromJson(o.toJson());
-      checkListDomainMappingsResponse(od);
+      checkListDomainMappingsResponse(od as api.ListDomainMappingsResponse);
     });
   });
 
@@ -2584,7 +2589,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -2592,7 +2597,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListMeta();
       var od = api.ListMeta.fromJson(o.toJson());
-      checkListMeta(od);
+      checkListMeta(od as api.ListMeta);
     });
   });
 
@@ -2600,7 +2605,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListRevisionsResponse();
       var od = api.ListRevisionsResponse.fromJson(o.toJson());
-      checkListRevisionsResponse(od);
+      checkListRevisionsResponse(od as api.ListRevisionsResponse);
     });
   });
 
@@ -2608,7 +2613,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListRoutesResponse();
       var od = api.ListRoutesResponse.fromJson(o.toJson());
-      checkListRoutesResponse(od);
+      checkListRoutesResponse(od as api.ListRoutesResponse);
     });
   });
 
@@ -2616,7 +2621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServicesResponse();
       var od = api.ListServicesResponse.fromJson(o.toJson());
-      checkListServicesResponse(od);
+      checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
 
@@ -2624,7 +2629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalObjectReference();
       var od = api.LocalObjectReference.fromJson(o.toJson());
-      checkLocalObjectReference(od);
+      checkLocalObjectReference(od as api.LocalObjectReference);
     });
   });
 
@@ -2632,7 +2637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -2640,7 +2645,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectMeta();
       var od = api.ObjectMeta.fromJson(o.toJson());
-      checkObjectMeta(od);
+      checkObjectMeta(od as api.ObjectMeta);
     });
   });
 
@@ -2648,7 +2653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOwnerReference();
       var od = api.OwnerReference.fromJson(o.toJson());
-      checkOwnerReference(od);
+      checkOwnerReference(od as api.OwnerReference);
     });
   });
 
@@ -2656,7 +2661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -2664,7 +2669,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProbe();
       var od = api.Probe.fromJson(o.toJson());
-      checkProbe(od);
+      checkProbe(od as api.Probe);
     });
   });
 
@@ -2672,7 +2677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceRecord();
       var od = api.ResourceRecord.fromJson(o.toJson());
-      checkResourceRecord(od);
+      checkResourceRecord(od as api.ResourceRecord);
     });
   });
 
@@ -2680,7 +2685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceRequirements();
       var od = api.ResourceRequirements.fromJson(o.toJson());
-      checkResourceRequirements(od);
+      checkResourceRequirements(od as api.ResourceRequirements);
     });
   });
 
@@ -2688,7 +2693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevision();
       var od = api.Revision.fromJson(o.toJson());
-      checkRevision(od);
+      checkRevision(od as api.Revision);
     });
   });
 
@@ -2696,7 +2701,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevisionSpec();
       var od = api.RevisionSpec.fromJson(o.toJson());
-      checkRevisionSpec(od);
+      checkRevisionSpec(od as api.RevisionSpec);
     });
   });
 
@@ -2704,7 +2709,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevisionStatus();
       var od = api.RevisionStatus.fromJson(o.toJson());
-      checkRevisionStatus(od);
+      checkRevisionStatus(od as api.RevisionStatus);
     });
   });
 
@@ -2712,7 +2717,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevisionTemplate();
       var od = api.RevisionTemplate.fromJson(o.toJson());
-      checkRevisionTemplate(od);
+      checkRevisionTemplate(od as api.RevisionTemplate);
     });
   });
 
@@ -2720,7 +2725,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoute();
       var od = api.Route.fromJson(o.toJson());
-      checkRoute(od);
+      checkRoute(od as api.Route);
     });
   });
 
@@ -2728,7 +2733,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteSpec();
       var od = api.RouteSpec.fromJson(o.toJson());
-      checkRouteSpec(od);
+      checkRouteSpec(od as api.RouteSpec);
     });
   });
 
@@ -2736,7 +2741,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRouteStatus();
       var od = api.RouteStatus.fromJson(o.toJson());
-      checkRouteStatus(od);
+      checkRouteStatus(od as api.RouteStatus);
     });
   });
 
@@ -2744,7 +2749,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecretEnvSource();
       var od = api.SecretEnvSource.fromJson(o.toJson());
-      checkSecretEnvSource(od);
+      checkSecretEnvSource(od as api.SecretEnvSource);
     });
   });
 
@@ -2752,7 +2757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecretKeySelector();
       var od = api.SecretKeySelector.fromJson(o.toJson());
-      checkSecretKeySelector(od);
+      checkSecretKeySelector(od as api.SecretKeySelector);
     });
   });
 
@@ -2760,7 +2765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecretVolumeSource();
       var od = api.SecretVolumeSource.fromJson(o.toJson());
-      checkSecretVolumeSource(od);
+      checkSecretVolumeSource(od as api.SecretVolumeSource);
     });
   });
 
@@ -2768,7 +2773,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityContext();
       var od = api.SecurityContext.fromJson(o.toJson());
-      checkSecurityContext(od);
+      checkSecurityContext(od as api.SecurityContext);
     });
   });
 
@@ -2776,7 +2781,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -2784,7 +2789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceSpec();
       var od = api.ServiceSpec.fromJson(o.toJson());
-      checkServiceSpec(od);
+      checkServiceSpec(od as api.ServiceSpec);
     });
   });
 
@@ -2792,7 +2797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceStatus();
       var od = api.ServiceStatus.fromJson(o.toJson());
-      checkServiceStatus(od);
+      checkServiceStatus(od as api.ServiceStatus);
     });
   });
 
@@ -2800,7 +2805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -2808,7 +2813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2816,7 +2821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatusCause();
       var od = api.StatusCause.fromJson(o.toJson());
-      checkStatusCause(od);
+      checkStatusCause(od as api.StatusCause);
     });
   });
 
@@ -2824,7 +2829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatusDetails();
       var od = api.StatusDetails.fromJson(o.toJson());
-      checkStatusDetails(od);
+      checkStatusDetails(od as api.StatusDetails);
     });
   });
 
@@ -2832,7 +2837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTCPSocketAction();
       var od = api.TCPSocketAction.fromJson(o.toJson());
-      checkTCPSocketAction(od);
+      checkTCPSocketAction(od as api.TCPSocketAction);
     });
   });
 
@@ -2840,7 +2845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -2848,7 +2853,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -2856,7 +2861,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrafficTarget();
       var od = api.TrafficTarget.fromJson(o.toJson());
-      checkTrafficTarget(od);
+      checkTrafficTarget(od as api.TrafficTarget);
     });
   });
 
@@ -2864,7 +2869,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolume();
       var od = api.Volume.fromJson(o.toJson());
-      checkVolume(od);
+      checkVolume(od as api.Volume);
     });
   });
 
@@ -2872,7 +2877,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVolumeMount();
       var od = api.VolumeMount.fromJson(o.toJson());
-      checkVolumeMount(od);
+      checkVolumeMount(od as api.VolumeMount);
     });
   });
 
@@ -2930,7 +2935,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAuthorizedDomainsResponse(response);
+        checkListAuthorizedDomainsResponse(
+            response as api.ListAuthorizedDomainsResponse);
       })));
     });
   });
@@ -2980,7 +2986,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConfiguration(response);
+        checkConfiguration(response as api.Configuration);
       })));
     });
 
@@ -3056,7 +3062,8 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListConfigurationsResponse(response);
+        checkListConfigurationsResponse(
+            response as api.ListConfigurationsResponse);
       })));
     });
   });
@@ -3069,8 +3076,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DomainMapping.fromJson(json);
-        checkDomainMapping(obj);
+        var obj = api.DomainMapping.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDomainMapping(obj as api.DomainMapping);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3110,7 +3118,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainMapping(response);
+        checkDomainMapping(response as api.DomainMapping);
       })));
     });
 
@@ -3170,7 +3178,7 @@
               propagationPolicy: arg_propagationPolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStatus(response);
+        checkStatus(response as api.Status);
       })));
     });
 
@@ -3218,7 +3226,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainMapping(response);
+        checkDomainMapping(response as api.DomainMapping);
       })));
     });
 
@@ -3294,7 +3302,8 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDomainMappingsResponse(response);
+        checkListDomainMappingsResponse(
+            response as api.ListDomainMappingsResponse);
       })));
     });
   });
@@ -3356,7 +3365,7 @@
               propagationPolicy: arg_propagationPolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStatus(response);
+        checkStatus(response as api.Status);
       })));
     });
 
@@ -3404,7 +3413,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevision(response);
+        checkRevision(response as api.Revision);
       })));
     });
 
@@ -3480,7 +3489,7 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRevisionsResponse(response);
+        checkListRevisionsResponse(response as api.ListRevisionsResponse);
       })));
     });
   });
@@ -3530,7 +3539,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoute(response);
+        checkRoute(response as api.Route);
       })));
     });
 
@@ -3606,7 +3615,7 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRoutesResponse(response);
+        checkListRoutesResponse(response as api.ListRoutesResponse);
       })));
     });
   });
@@ -3619,8 +3628,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3660,7 +3670,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -3720,7 +3730,7 @@
               propagationPolicy: arg_propagationPolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStatus(response);
+        checkStatus(response as api.Status);
       })));
     });
 
@@ -3768,7 +3778,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -3844,7 +3854,7 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicesResponse(response);
+        checkListServicesResponse(response as api.ListServicesResponse);
       })));
     });
 
@@ -3855,8 +3865,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3896,7 +3907,7 @@
       res
           .replaceService(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
   });
@@ -3955,7 +3966,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAuthorizedDomainsResponse(response);
+        checkListAuthorizedDomainsResponse(
+            response as api.ListAuthorizedDomainsResponse);
       })));
     });
   });
@@ -4017,7 +4029,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -4076,7 +4088,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAuthorizedDomainsResponse(response);
+        checkListAuthorizedDomainsResponse(
+            response as api.ListAuthorizedDomainsResponse);
       })));
     });
   });
@@ -4126,7 +4139,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkConfiguration(response);
+        checkConfiguration(response as api.Configuration);
       })));
     });
 
@@ -4202,7 +4215,8 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListConfigurationsResponse(response);
+        checkListConfigurationsResponse(
+            response as api.ListConfigurationsResponse);
       })));
     });
   });
@@ -4215,8 +4229,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DomainMapping.fromJson(json);
-        checkDomainMapping(obj);
+        var obj = api.DomainMapping.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDomainMapping(obj as api.DomainMapping);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4256,7 +4271,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainMapping(response);
+        checkDomainMapping(response as api.DomainMapping);
       })));
     });
 
@@ -4316,7 +4331,7 @@
               propagationPolicy: arg_propagationPolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStatus(response);
+        checkStatus(response as api.Status);
       })));
     });
 
@@ -4364,7 +4379,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDomainMapping(response);
+        checkDomainMapping(response as api.DomainMapping);
       })));
     });
 
@@ -4440,7 +4455,8 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDomainMappingsResponse(response);
+        checkListDomainMappingsResponse(
+            response as api.ListDomainMappingsResponse);
       })));
     });
   });
@@ -4502,7 +4518,7 @@
               propagationPolicy: arg_propagationPolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStatus(response);
+        checkStatus(response as api.Status);
       })));
     });
 
@@ -4550,7 +4566,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevision(response);
+        checkRevision(response as api.Revision);
       })));
     });
 
@@ -4626,7 +4642,7 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRevisionsResponse(response);
+        checkListRevisionsResponse(response as api.ListRevisionsResponse);
       })));
     });
   });
@@ -4676,7 +4692,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRoute(response);
+        checkRoute(response as api.Route);
       })));
     });
 
@@ -4752,7 +4768,7 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListRoutesResponse(response);
+        checkListRoutesResponse(response as api.ListRoutesResponse);
       })));
     });
   });
@@ -4765,8 +4781,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4806,7 +4823,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -4866,7 +4883,7 @@
               propagationPolicy: arg_propagationPolicy,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkStatus(response);
+        checkStatus(response as api.Status);
       })));
     });
 
@@ -4914,7 +4931,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -4969,7 +4986,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5045,7 +5062,7 @@
               watch: arg_watch,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicesResponse(response);
+        checkListServicesResponse(response as api.ListServicesResponse);
       })));
     });
 
@@ -5056,8 +5073,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5097,7 +5115,7 @@
       res
           .replaceService(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -5108,8 +5126,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5149,7 +5168,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5160,8 +5179,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5201,7 +5221,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/runtimeconfig/v1_test.dart b/generated/googleapis/test/runtimeconfig/v1_test.dart
index 4ee6df4..22d9688 100644
--- a/generated/googleapis/test/runtimeconfig/v1_test.dart
+++ b/generated/googleapis/test/runtimeconfig/v1_test.dart
@@ -113,8 +113,8 @@
 
 void checkUnnamed4545(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -215,7 +215,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed4546(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4547(o.response);
@@ -293,7 +293,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -301,7 +301,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -309,7 +309,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -317,7 +317,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -325,7 +325,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -337,8 +337,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -378,7 +379,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -426,7 +427,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -486,7 +487,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/safebrowsing/v4_test.dart b/generated/googleapis/test/safebrowsing/v4_test.dart
index 6f26b4d..2839684 100644
--- a/generated/googleapis/test/safebrowsing/v4_test.dart
+++ b/generated/googleapis/test/safebrowsing/v4_test.dart
@@ -180,8 +180,8 @@
 
 void checkUnnamed4551(core.List<api.ListUpdateRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkListUpdateRequest(o[0]);
-  checkListUpdateRequest(o[1]);
+  checkListUpdateRequest(o[0] as api.ListUpdateRequest);
+  checkListUpdateRequest(o[1] as api.ListUpdateRequest);
 }
 
 core.int buildCounterFetchThreatListUpdatesRequest = 0;
@@ -199,7 +199,7 @@
 void checkFetchThreatListUpdatesRequest(api.FetchThreatListUpdatesRequest o) {
   buildCounterFetchThreatListUpdatesRequest++;
   if (buildCounterFetchThreatListUpdatesRequest < 3) {
-    checkClientInfo(o.client);
+    checkClientInfo(o.client as api.ClientInfo);
     checkUnnamed4551(o.listUpdateRequests);
   }
   buildCounterFetchThreatListUpdatesRequest--;
@@ -214,8 +214,8 @@
 
 void checkUnnamed4552(core.List<api.ListUpdateResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkListUpdateResponse(o[0]);
-  checkListUpdateResponse(o[1]);
+  checkListUpdateResponse(o[0] as api.ListUpdateResponse);
+  checkListUpdateResponse(o[1] as api.ListUpdateResponse);
 }
 
 core.int buildCounterFetchThreatListUpdatesResponse = 0;
@@ -269,10 +269,10 @@
 void checkFindFullHashesRequest(api.FindFullHashesRequest o) {
   buildCounterFindFullHashesRequest++;
   if (buildCounterFindFullHashesRequest < 3) {
-    checkClientInfo(o.apiClient);
-    checkClientInfo(o.client);
+    checkClientInfo(o.apiClient as api.ClientInfo);
+    checkClientInfo(o.client as api.ClientInfo);
     checkUnnamed4553(o.clientStates);
-    checkThreatInfo(o.threatInfo);
+    checkThreatInfo(o.threatInfo as api.ThreatInfo);
   }
   buildCounterFindFullHashesRequest--;
 }
@@ -286,8 +286,8 @@
 
 void checkUnnamed4554(core.List<api.ThreatMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThreatMatch(o[0]);
-  checkThreatMatch(o[1]);
+  checkThreatMatch(o[0] as api.ThreatMatch);
+  checkThreatMatch(o[1] as api.ThreatMatch);
 }
 
 core.int buildCounterFindFullHashesResponse = 0;
@@ -328,8 +328,8 @@
 void checkFindThreatMatchesRequest(api.FindThreatMatchesRequest o) {
   buildCounterFindThreatMatchesRequest++;
   if (buildCounterFindThreatMatchesRequest < 3) {
-    checkClientInfo(o.client);
-    checkThreatInfo(o.threatInfo);
+    checkClientInfo(o.client as api.ClientInfo);
+    checkThreatInfo(o.threatInfo as api.ThreatInfo);
   }
   buildCounterFindThreatMatchesRequest--;
 }
@@ -343,8 +343,8 @@
 
 void checkUnnamed4555(core.List<api.ThreatMatch> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThreatMatch(o[0]);
-  checkThreatMatch(o[1]);
+  checkThreatMatch(o[0] as api.ThreatMatch);
+  checkThreatMatch(o[1] as api.ThreatMatch);
 }
 
 core.int buildCounterFindThreatMatchesResponse = 0;
@@ -375,8 +375,8 @@
 
 void checkUnnamed4556(core.List<api.ThreatListDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThreatListDescriptor(o[0]);
-  checkThreatListDescriptor(o[1]);
+  checkThreatListDescriptor(o[0] as api.ThreatListDescriptor);
+  checkThreatListDescriptor(o[1] as api.ThreatListDescriptor);
 }
 
 core.int buildCounterListThreatListsResponse = 0;
@@ -416,7 +416,7 @@
 void checkListUpdateRequest(api.ListUpdateRequest o) {
   buildCounterListUpdateRequest++;
   if (buildCounterListUpdateRequest < 3) {
-    checkConstraints(o.constraints);
+    checkConstraints(o.constraints as api.Constraints);
     unittest.expect(o.platformType, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     unittest.expect(o.threatEntryType, unittest.equals('foo'));
@@ -434,8 +434,8 @@
 
 void checkUnnamed4557(core.List<api.ThreatEntrySet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThreatEntrySet(o[0]);
-  checkThreatEntrySet(o[1]);
+  checkThreatEntrySet(o[0] as api.ThreatEntrySet);
+  checkThreatEntrySet(o[1] as api.ThreatEntrySet);
 }
 
 core.List<api.ThreatEntrySet> buildUnnamed4558() {
@@ -447,8 +447,8 @@
 
 void checkUnnamed4558(core.List<api.ThreatEntrySet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThreatEntrySet(o[0]);
-  checkThreatEntrySet(o[1]);
+  checkThreatEntrySet(o[0] as api.ThreatEntrySet);
+  checkThreatEntrySet(o[1] as api.ThreatEntrySet);
 }
 
 core.int buildCounterListUpdateResponse = 0;
@@ -473,7 +473,7 @@
   buildCounterListUpdateResponse++;
   if (buildCounterListUpdateResponse < 3) {
     checkUnnamed4557(o.additions);
-    checkChecksum(o.checksum);
+    checkChecksum(o.checksum as api.Checksum);
     unittest.expect(o.newClientState, unittest.equals('foo'));
     unittest.expect(o.platformType, unittest.equals('foo'));
     checkUnnamed4558(o.removals);
@@ -615,8 +615,8 @@
 
 void checkUnnamed4560(core.List<api.MetadataEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetadataEntry(o[0]);
-  checkMetadataEntry(o[1]);
+  checkMetadataEntry(o[0] as api.MetadataEntry);
+  checkMetadataEntry(o[1] as api.MetadataEntry);
 }
 
 core.int buildCounterThreatEntryMetadata = 0;
@@ -657,10 +657,10 @@
   buildCounterThreatEntrySet++;
   if (buildCounterThreatEntrySet < 3) {
     unittest.expect(o.compressionType, unittest.equals('foo'));
-    checkRawHashes(o.rawHashes);
-    checkRawIndices(o.rawIndices);
-    checkRiceDeltaEncoding(o.riceHashes);
-    checkRiceDeltaEncoding(o.riceIndices);
+    checkRawHashes(o.rawHashes as api.RawHashes);
+    checkRawIndices(o.rawIndices as api.RawIndices);
+    checkRiceDeltaEncoding(o.riceHashes as api.RiceDeltaEncoding);
+    checkRiceDeltaEncoding(o.riceIndices as api.RiceDeltaEncoding);
   }
   buildCounterThreatEntrySet--;
 }
@@ -674,8 +674,8 @@
 
 void checkUnnamed4561(core.List<api.ThreatSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThreatSource(o[0]);
-  checkThreatSource(o[1]);
+  checkThreatSource(o[0] as api.ThreatSource);
+  checkThreatSource(o[1] as api.ThreatSource);
 }
 
 core.int buildCounterThreatHit = 0;
@@ -697,12 +697,12 @@
 void checkThreatHit(api.ThreatHit o) {
   buildCounterThreatHit++;
   if (buildCounterThreatHit < 3) {
-    checkClientInfo(o.clientInfo);
-    checkThreatEntry(o.entry);
+    checkClientInfo(o.clientInfo as api.ClientInfo);
+    checkThreatEntry(o.entry as api.ThreatEntry);
     unittest.expect(o.platformType, unittest.equals('foo'));
     checkUnnamed4561(o.resources);
     unittest.expect(o.threatType, unittest.equals('foo'));
-    checkUserInfo(o.userInfo);
+    checkUserInfo(o.userInfo as api.UserInfo);
   }
   buildCounterThreatHit--;
 }
@@ -729,8 +729,8 @@
 
 void checkUnnamed4563(core.List<api.ThreatEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThreatEntry(o[0]);
-  checkThreatEntry(o[1]);
+  checkThreatEntry(o[0] as api.ThreatEntry);
+  checkThreatEntry(o[1] as api.ThreatEntry);
 }
 
 core.List<core.String> buildUnnamed4564() {
@@ -828,8 +828,8 @@
   if (buildCounterThreatMatch < 3) {
     unittest.expect(o.cacheDuration, unittest.equals('foo'));
     unittest.expect(o.platformType, unittest.equals('foo'));
-    checkThreatEntry(o.threat);
-    checkThreatEntryMetadata(o.threatEntryMetadata);
+    checkThreatEntry(o.threat as api.ThreatEntry);
+    checkThreatEntryMetadata(o.threatEntryMetadata as api.ThreatEntryMetadata);
     unittest.expect(o.threatEntryType, unittest.equals('foo'));
     unittest.expect(o.threatType, unittest.equals('foo'));
   }
@@ -887,7 +887,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChecksum();
       var od = api.Checksum.fromJson(o.toJson());
-      checkChecksum(od);
+      checkChecksum(od as api.Checksum);
     });
   });
 
@@ -895,7 +895,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClientInfo();
       var od = api.ClientInfo.fromJson(o.toJson());
-      checkClientInfo(od);
+      checkClientInfo(od as api.ClientInfo);
     });
   });
 
@@ -903,7 +903,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConstraints();
       var od = api.Constraints.fromJson(o.toJson());
-      checkConstraints(od);
+      checkConstraints(od as api.Constraints);
     });
   });
 
@@ -911,7 +911,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -919,7 +919,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFetchThreatListUpdatesRequest();
       var od = api.FetchThreatListUpdatesRequest.fromJson(o.toJson());
-      checkFetchThreatListUpdatesRequest(od);
+      checkFetchThreatListUpdatesRequest(
+          od as api.FetchThreatListUpdatesRequest);
     });
   });
 
@@ -927,7 +928,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildFetchThreatListUpdatesResponse();
       var od = api.FetchThreatListUpdatesResponse.fromJson(o.toJson());
-      checkFetchThreatListUpdatesResponse(od);
+      checkFetchThreatListUpdatesResponse(
+          od as api.FetchThreatListUpdatesResponse);
     });
   });
 
@@ -935,7 +937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindFullHashesRequest();
       var od = api.FindFullHashesRequest.fromJson(o.toJson());
-      checkFindFullHashesRequest(od);
+      checkFindFullHashesRequest(od as api.FindFullHashesRequest);
     });
   });
 
@@ -943,7 +945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindFullHashesResponse();
       var od = api.FindFullHashesResponse.fromJson(o.toJson());
-      checkFindFullHashesResponse(od);
+      checkFindFullHashesResponse(od as api.FindFullHashesResponse);
     });
   });
 
@@ -951,7 +953,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindThreatMatchesRequest();
       var od = api.FindThreatMatchesRequest.fromJson(o.toJson());
-      checkFindThreatMatchesRequest(od);
+      checkFindThreatMatchesRequest(od as api.FindThreatMatchesRequest);
     });
   });
 
@@ -959,7 +961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindThreatMatchesResponse();
       var od = api.FindThreatMatchesResponse.fromJson(o.toJson());
-      checkFindThreatMatchesResponse(od);
+      checkFindThreatMatchesResponse(od as api.FindThreatMatchesResponse);
     });
   });
 
@@ -967,7 +969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListThreatListsResponse();
       var od = api.ListThreatListsResponse.fromJson(o.toJson());
-      checkListThreatListsResponse(od);
+      checkListThreatListsResponse(od as api.ListThreatListsResponse);
     });
   });
 
@@ -975,7 +977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUpdateRequest();
       var od = api.ListUpdateRequest.fromJson(o.toJson());
-      checkListUpdateRequest(od);
+      checkListUpdateRequest(od as api.ListUpdateRequest);
     });
   });
 
@@ -983,7 +985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUpdateResponse();
       var od = api.ListUpdateResponse.fromJson(o.toJson());
-      checkListUpdateResponse(od);
+      checkListUpdateResponse(od as api.ListUpdateResponse);
     });
   });
 
@@ -991,7 +993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetadataEntry();
       var od = api.MetadataEntry.fromJson(o.toJson());
-      checkMetadataEntry(od);
+      checkMetadataEntry(od as api.MetadataEntry);
     });
   });
 
@@ -999,7 +1001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRawHashes();
       var od = api.RawHashes.fromJson(o.toJson());
-      checkRawHashes(od);
+      checkRawHashes(od as api.RawHashes);
     });
   });
 
@@ -1007,7 +1009,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRawIndices();
       var od = api.RawIndices.fromJson(o.toJson());
-      checkRawIndices(od);
+      checkRawIndices(od as api.RawIndices);
     });
   });
 
@@ -1015,7 +1017,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRiceDeltaEncoding();
       var od = api.RiceDeltaEncoding.fromJson(o.toJson());
-      checkRiceDeltaEncoding(od);
+      checkRiceDeltaEncoding(od as api.RiceDeltaEncoding);
     });
   });
 
@@ -1023,7 +1025,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatEntry();
       var od = api.ThreatEntry.fromJson(o.toJson());
-      checkThreatEntry(od);
+      checkThreatEntry(od as api.ThreatEntry);
     });
   });
 
@@ -1031,7 +1033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatEntryMetadata();
       var od = api.ThreatEntryMetadata.fromJson(o.toJson());
-      checkThreatEntryMetadata(od);
+      checkThreatEntryMetadata(od as api.ThreatEntryMetadata);
     });
   });
 
@@ -1039,7 +1041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatEntrySet();
       var od = api.ThreatEntrySet.fromJson(o.toJson());
-      checkThreatEntrySet(od);
+      checkThreatEntrySet(od as api.ThreatEntrySet);
     });
   });
 
@@ -1047,7 +1049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatHit();
       var od = api.ThreatHit.fromJson(o.toJson());
-      checkThreatHit(od);
+      checkThreatHit(od as api.ThreatHit);
     });
   });
 
@@ -1055,7 +1057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatInfo();
       var od = api.ThreatInfo.fromJson(o.toJson());
-      checkThreatInfo(od);
+      checkThreatInfo(od as api.ThreatInfo);
     });
   });
 
@@ -1063,7 +1065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatListDescriptor();
       var od = api.ThreatListDescriptor.fromJson(o.toJson());
-      checkThreatListDescriptor(od);
+      checkThreatListDescriptor(od as api.ThreatListDescriptor);
     });
   });
 
@@ -1071,7 +1073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatMatch();
       var od = api.ThreatMatch.fromJson(o.toJson());
-      checkThreatMatch(od);
+      checkThreatMatch(od as api.ThreatMatch);
     });
   });
 
@@ -1079,7 +1081,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThreatSource();
       var od = api.ThreatSource.fromJson(o.toJson());
-      checkThreatSource(od);
+      checkThreatSource(od as api.ThreatSource);
     });
   });
 
@@ -1087,7 +1089,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserInfo();
       var od = api.UserInfo.fromJson(o.toJson());
-      checkUserInfo(od);
+      checkUserInfo(od as api.UserInfo);
     });
   });
 
@@ -1147,7 +1149,7 @@
               clientVersion: arg_clientVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFindFullHashesResponse(response);
+        checkFindFullHashesResponse(response as api.FindFullHashesResponse);
       })));
     });
   });
@@ -1208,7 +1210,8 @@
               clientVersion: arg_clientVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFetchThreatListUpdatesResponse(response);
+        checkFetchThreatListUpdatesResponse(
+            response as api.FetchThreatListUpdatesResponse);
       })));
     });
   });
@@ -1220,8 +1223,9 @@
       var arg_request = buildFindFullHashesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FindFullHashesRequest.fromJson(json);
-        checkFindFullHashesRequest(obj);
+        var obj = api.FindFullHashesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFindFullHashesRequest(obj as api.FindFullHashesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1260,7 +1264,7 @@
       res
           .find(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFindFullHashesResponse(response);
+        checkFindFullHashesResponse(response as api.FindFullHashesResponse);
       })));
     });
   });
@@ -1272,8 +1276,9 @@
       var arg_request = buildThreatHit();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ThreatHit.fromJson(json);
-        checkThreatHit(obj);
+        var obj =
+            api.ThreatHit.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkThreatHit(obj as api.ThreatHit);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1312,7 +1317,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -1324,8 +1329,10 @@
       var arg_request = buildFetchThreatListUpdatesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FetchThreatListUpdatesRequest.fromJson(json);
-        checkFetchThreatListUpdatesRequest(obj);
+        var obj = api.FetchThreatListUpdatesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFetchThreatListUpdatesRequest(
+            obj as api.FetchThreatListUpdatesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1364,7 +1371,8 @@
       res
           .fetch(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFetchThreatListUpdatesResponse(response);
+        checkFetchThreatListUpdatesResponse(
+            response as api.FetchThreatListUpdatesResponse);
       })));
     });
   });
@@ -1410,7 +1418,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkListThreatListsResponse(response);
+        checkListThreatListsResponse(response as api.ListThreatListsResponse);
       })));
     });
   });
@@ -1422,8 +1430,9 @@
       var arg_request = buildFindThreatMatchesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FindThreatMatchesRequest.fromJson(json);
-        checkFindThreatMatchesRequest(obj);
+        var obj = api.FindThreatMatchesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFindThreatMatchesRequest(obj as api.FindThreatMatchesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1462,7 +1471,8 @@
       res
           .find(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFindThreatMatchesResponse(response);
+        checkFindThreatMatchesResponse(
+            response as api.FindThreatMatchesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/script/v1_test.dart b/generated/googleapis/test/script/v1_test.dart
index 8937229..8181b75 100644
--- a/generated/googleapis/test/script/v1_test.dart
+++ b/generated/googleapis/test/script/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed1458(core.List<api.File> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFile(o[0]);
-  checkFile(o[1]);
+  checkFile(o[0] as api.File);
+  checkFile(o[1] as api.File);
 }
 
 core.int buildCounterContent = 0;
@@ -138,8 +138,8 @@
 
 void checkUnnamed1459(core.List<api.EntryPoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntryPoint(o[0]);
-  checkEntryPoint(o[1]);
+  checkEntryPoint(o[0] as api.EntryPoint);
+  checkEntryPoint(o[1] as api.EntryPoint);
 }
 
 core.int buildCounterDeployment = 0;
@@ -159,7 +159,7 @@
 void checkDeployment(api.Deployment o) {
   buildCounterDeployment++;
   if (buildCounterDeployment < 3) {
-    checkDeploymentConfig(o.deploymentConfig);
+    checkDeploymentConfig(o.deploymentConfig as api.DeploymentConfig);
     unittest.expect(o.deploymentId, unittest.equals('foo'));
     checkUnnamed1459(o.entryPoints);
     unittest.expect(o.updateTime, unittest.equals('foo'));
@@ -224,10 +224,13 @@
 void checkEntryPoint(api.EntryPoint o) {
   buildCounterEntryPoint++;
   if (buildCounterEntryPoint < 3) {
-    checkGoogleAppsScriptTypeAddOnEntryPoint(o.addOn);
+    checkGoogleAppsScriptTypeAddOnEntryPoint(
+        o.addOn as api.GoogleAppsScriptTypeAddOnEntryPoint);
     unittest.expect(o.entryPointType, unittest.equals('foo'));
-    checkGoogleAppsScriptTypeExecutionApiEntryPoint(o.executionApi);
-    checkGoogleAppsScriptTypeWebAppEntryPoint(o.webApp);
+    checkGoogleAppsScriptTypeExecutionApiEntryPoint(
+        o.executionApi as api.GoogleAppsScriptTypeExecutionApiEntryPoint);
+    checkGoogleAppsScriptTypeWebAppEntryPoint(
+        o.webApp as api.GoogleAppsScriptTypeWebAppEntryPoint);
   }
   buildCounterEntryPoint--;
 }
@@ -246,7 +249,7 @@
 void checkExecuteStreamResponse(api.ExecuteStreamResponse o) {
   buildCounterExecuteStreamResponse++;
   if (buildCounterExecuteStreamResponse < 3) {
-    checkScriptExecutionResult(o.result);
+    checkScriptExecutionResult(o.result as api.ScriptExecutionResult);
   }
   buildCounterExecuteStreamResponse--;
 }
@@ -260,8 +263,8 @@
 
 void checkUnnamed1460(core.List<api.ScriptStackTraceElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkScriptStackTraceElement(o[0]);
-  checkScriptStackTraceElement(o[1]);
+  checkScriptStackTraceElement(o[0] as api.ScriptStackTraceElement);
+  checkScriptStackTraceElement(o[1] as api.ScriptStackTraceElement);
 }
 
 core.int buildCounterExecutionError = 0;
@@ -389,8 +392,10 @@
   buildCounterFile++;
   if (buildCounterFile < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkGoogleAppsScriptTypeFunctionSet(o.functionSet);
-    checkGoogleAppsScriptTypeUser(o.lastModifyUser);
+    checkGoogleAppsScriptTypeFunctionSet(
+        o.functionSet as api.GoogleAppsScriptTypeFunctionSet);
+    checkGoogleAppsScriptTypeUser(
+        o.lastModifyUser as api.GoogleAppsScriptTypeUser);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
@@ -467,7 +472,8 @@
     api.GoogleAppsScriptTypeExecutionApiEntryPoint o) {
   buildCounterGoogleAppsScriptTypeExecutionApiEntryPoint++;
   if (buildCounterGoogleAppsScriptTypeExecutionApiEntryPoint < 3) {
-    checkGoogleAppsScriptTypeExecutionApiConfig(o.entryPointConfig);
+    checkGoogleAppsScriptTypeExecutionApiConfig(
+        o.entryPointConfig as api.GoogleAppsScriptTypeExecutionApiConfig);
   }
   buildCounterGoogleAppsScriptTypeExecutionApiEntryPoint--;
 }
@@ -500,8 +506,8 @@
 
 void checkUnnamed1462(core.List<api.GoogleAppsScriptTypeFunction> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAppsScriptTypeFunction(o[0]);
-  checkGoogleAppsScriptTypeFunction(o[1]);
+  checkGoogleAppsScriptTypeFunction(o[0] as api.GoogleAppsScriptTypeFunction);
+  checkGoogleAppsScriptTypeFunction(o[1] as api.GoogleAppsScriptTypeFunction);
 }
 
 core.int buildCounterGoogleAppsScriptTypeFunctionSet = 0;
@@ -619,7 +625,8 @@
     api.GoogleAppsScriptTypeWebAppEntryPoint o) {
   buildCounterGoogleAppsScriptTypeWebAppEntryPoint++;
   if (buildCounterGoogleAppsScriptTypeWebAppEntryPoint < 3) {
-    checkGoogleAppsScriptTypeWebAppConfig(o.entryPointConfig);
+    checkGoogleAppsScriptTypeWebAppConfig(
+        o.entryPointConfig as api.GoogleAppsScriptTypeWebAppConfig);
     unittest.expect(o.url, unittest.equals('foo'));
   }
   buildCounterGoogleAppsScriptTypeWebAppEntryPoint--;
@@ -634,8 +641,8 @@
 
 void checkUnnamed1463(core.List<api.Deployment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeployment(o[0]);
-  checkDeployment(o[1]);
+  checkDeployment(o[0] as api.Deployment);
+  checkDeployment(o[1] as api.Deployment);
 }
 
 core.int buildCounterListDeploymentsResponse = 0;
@@ -668,8 +675,8 @@
 
 void checkUnnamed1464(core.List<api.GoogleAppsScriptTypeProcess> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAppsScriptTypeProcess(o[0]);
-  checkGoogleAppsScriptTypeProcess(o[1]);
+  checkGoogleAppsScriptTypeProcess(o[0] as api.GoogleAppsScriptTypeProcess);
+  checkGoogleAppsScriptTypeProcess(o[1] as api.GoogleAppsScriptTypeProcess);
 }
 
 core.int buildCounterListScriptProcessesResponse = 0;
@@ -702,8 +709,8 @@
 
 void checkUnnamed1465(core.List<api.GoogleAppsScriptTypeProcess> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleAppsScriptTypeProcess(o[0]);
-  checkGoogleAppsScriptTypeProcess(o[1]);
+  checkGoogleAppsScriptTypeProcess(o[0] as api.GoogleAppsScriptTypeProcess);
+  checkGoogleAppsScriptTypeProcess(o[1] as api.GoogleAppsScriptTypeProcess);
 }
 
 core.int buildCounterListUserProcessesResponse = 0;
@@ -736,8 +743,8 @@
 
 void checkUnnamed1466(core.List<api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o[0]);
-  checkValue(o[1]);
+  checkValue(o[0] as api.Value);
+  checkValue(o[1] as api.Value);
 }
 
 core.int buildCounterListValue = 0;
@@ -768,8 +775,8 @@
 
 void checkUnnamed1467(core.List<api.Version> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVersion(o[0]);
-  checkVersion(o[1]);
+  checkVersion(o[0] as api.Version);
+  checkVersion(o[1] as api.Version);
 }
 
 core.int buildCounterListVersionsResponse = 0;
@@ -802,8 +809,8 @@
 
 void checkUnnamed1468(core.List<api.MetricsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricsValue(o[0]);
-  checkMetricsValue(o[1]);
+  checkMetricsValue(o[0] as api.MetricsValue);
+  checkMetricsValue(o[1] as api.MetricsValue);
 }
 
 core.List<api.MetricsValue> buildUnnamed1469() {
@@ -815,8 +822,8 @@
 
 void checkUnnamed1469(core.List<api.MetricsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricsValue(o[0]);
-  checkMetricsValue(o[1]);
+  checkMetricsValue(o[0] as api.MetricsValue);
+  checkMetricsValue(o[1] as api.MetricsValue);
 }
 
 core.List<api.MetricsValue> buildUnnamed1470() {
@@ -828,8 +835,8 @@
 
 void checkUnnamed1470(core.List<api.MetricsValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricsValue(o[0]);
-  checkMetricsValue(o[1]);
+  checkMetricsValue(o[0] as api.MetricsValue);
+  checkMetricsValue(o[1] as api.MetricsValue);
 }
 
 core.int buildCounterMetrics = 0;
@@ -924,7 +931,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1471(o.response);
   }
   buildCounterOperation--;
@@ -951,8 +958,9 @@
   buildCounterProject++;
   if (buildCounterProject < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkGoogleAppsScriptTypeUser(o.creator);
-    checkGoogleAppsScriptTypeUser(o.lastModifyUser);
+    checkGoogleAppsScriptTypeUser(o.creator as api.GoogleAppsScriptTypeUser);
+    checkGoogleAppsScriptTypeUser(
+        o.lastModifyUser as api.GoogleAppsScriptTypeUser);
     unittest.expect(o.parentId, unittest.equals('foo'));
     unittest.expect(o.scriptId, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -975,7 +983,7 @@
 void checkScriptExecutionResult(api.ScriptExecutionResult o) {
   buildCounterScriptExecutionResult++;
   if (buildCounterScriptExecutionResult < 3) {
-    checkValue(o.returnValue);
+    checkValue(o.returnValue as api.Value);
   }
   buildCounterScriptExecutionResult--;
 }
@@ -1075,8 +1083,8 @@
 
 void checkUnnamed1474(core.Map<core.String, api.Value> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValue(o['x']);
-  checkValue(o['y']);
+  checkValue(o['x'] as api.Value);
+  checkValue(o['y'] as api.Value);
 }
 
 core.int buildCounterStruct = 0;
@@ -1112,7 +1120,7 @@
 void checkUpdateDeploymentRequest(api.UpdateDeploymentRequest o) {
   buildCounterUpdateDeploymentRequest++;
   if (buildCounterUpdateDeploymentRequest < 3) {
-    checkDeploymentConfig(o.deploymentConfig);
+    checkDeploymentConfig(o.deploymentConfig as api.DeploymentConfig);
   }
   buildCounterUpdateDeploymentRequest--;
 }
@@ -1171,12 +1179,12 @@
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.bytesValue, unittest.equals('foo'));
     unittest.expect(o.dateValue, unittest.equals('foo'));
-    checkListValue(o.listValue);
+    checkListValue(o.listValue as api.ListValue);
     unittest.expect(o.nullValue, unittest.equals('foo'));
     unittest.expect(o.numberValue, unittest.equals(42.0));
     checkUnnamed1475(o.protoValue);
     unittest.expect(o.stringValue, unittest.equals('foo'));
-    checkStruct(o.structValue);
+    checkStruct(o.structValue as api.Struct);
   }
   buildCounterValue--;
 }
@@ -1289,7 +1297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContent();
       var od = api.Content.fromJson(o.toJson());
-      checkContent(od);
+      checkContent(od as api.Content);
     });
   });
 
@@ -1297,7 +1305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateProjectRequest();
       var od = api.CreateProjectRequest.fromJson(o.toJson());
-      checkCreateProjectRequest(od);
+      checkCreateProjectRequest(od as api.CreateProjectRequest);
     });
   });
 
@@ -1305,7 +1313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeployment();
       var od = api.Deployment.fromJson(o.toJson());
-      checkDeployment(od);
+      checkDeployment(od as api.Deployment);
     });
   });
 
@@ -1313,7 +1321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeploymentConfig();
       var od = api.DeploymentConfig.fromJson(o.toJson());
-      checkDeploymentConfig(od);
+      checkDeploymentConfig(od as api.DeploymentConfig);
     });
   });
 
@@ -1321,7 +1329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1329,7 +1337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntryPoint();
       var od = api.EntryPoint.fromJson(o.toJson());
-      checkEntryPoint(od);
+      checkEntryPoint(od as api.EntryPoint);
     });
   });
 
@@ -1337,7 +1345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecuteStreamResponse();
       var od = api.ExecuteStreamResponse.fromJson(o.toJson());
-      checkExecuteStreamResponse(od);
+      checkExecuteStreamResponse(od as api.ExecuteStreamResponse);
     });
   });
 
@@ -1345,7 +1353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecutionError();
       var od = api.ExecutionError.fromJson(o.toJson());
-      checkExecutionError(od);
+      checkExecutionError(od as api.ExecutionError);
     });
   });
 
@@ -1353,7 +1361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecutionRequest();
       var od = api.ExecutionRequest.fromJson(o.toJson());
-      checkExecutionRequest(od);
+      checkExecutionRequest(od as api.ExecutionRequest);
     });
   });
 
@@ -1361,7 +1369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecutionResponse();
       var od = api.ExecutionResponse.fromJson(o.toJson());
-      checkExecutionResponse(od);
+      checkExecutionResponse(od as api.ExecutionResponse);
     });
   });
 
@@ -1369,7 +1377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFile();
       var od = api.File.fromJson(o.toJson());
-      checkFile(od);
+      checkFile(od as api.File);
     });
   });
 
@@ -1377,7 +1385,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeAddOnEntryPoint();
       var od = api.GoogleAppsScriptTypeAddOnEntryPoint.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeAddOnEntryPoint(od);
+      checkGoogleAppsScriptTypeAddOnEntryPoint(
+          od as api.GoogleAppsScriptTypeAddOnEntryPoint);
     });
   });
 
@@ -1385,7 +1394,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeExecutionApiConfig();
       var od = api.GoogleAppsScriptTypeExecutionApiConfig.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeExecutionApiConfig(od);
+      checkGoogleAppsScriptTypeExecutionApiConfig(
+          od as api.GoogleAppsScriptTypeExecutionApiConfig);
     });
   });
 
@@ -1394,7 +1404,8 @@
       var o = buildGoogleAppsScriptTypeExecutionApiEntryPoint();
       var od =
           api.GoogleAppsScriptTypeExecutionApiEntryPoint.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeExecutionApiEntryPoint(od);
+      checkGoogleAppsScriptTypeExecutionApiEntryPoint(
+          od as api.GoogleAppsScriptTypeExecutionApiEntryPoint);
     });
   });
 
@@ -1402,7 +1413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeFunction();
       var od = api.GoogleAppsScriptTypeFunction.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeFunction(od);
+      checkGoogleAppsScriptTypeFunction(od as api.GoogleAppsScriptTypeFunction);
     });
   });
 
@@ -1410,7 +1421,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeFunctionSet();
       var od = api.GoogleAppsScriptTypeFunctionSet.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeFunctionSet(od);
+      checkGoogleAppsScriptTypeFunctionSet(
+          od as api.GoogleAppsScriptTypeFunctionSet);
     });
   });
 
@@ -1418,7 +1430,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeProcess();
       var od = api.GoogleAppsScriptTypeProcess.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeProcess(od);
+      checkGoogleAppsScriptTypeProcess(od as api.GoogleAppsScriptTypeProcess);
     });
   });
 
@@ -1426,7 +1438,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeUser();
       var od = api.GoogleAppsScriptTypeUser.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeUser(od);
+      checkGoogleAppsScriptTypeUser(od as api.GoogleAppsScriptTypeUser);
     });
   });
 
@@ -1434,7 +1446,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeWebAppConfig();
       var od = api.GoogleAppsScriptTypeWebAppConfig.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeWebAppConfig(od);
+      checkGoogleAppsScriptTypeWebAppConfig(
+          od as api.GoogleAppsScriptTypeWebAppConfig);
     });
   });
 
@@ -1442,7 +1455,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAppsScriptTypeWebAppEntryPoint();
       var od = api.GoogleAppsScriptTypeWebAppEntryPoint.fromJson(o.toJson());
-      checkGoogleAppsScriptTypeWebAppEntryPoint(od);
+      checkGoogleAppsScriptTypeWebAppEntryPoint(
+          od as api.GoogleAppsScriptTypeWebAppEntryPoint);
     });
   });
 
@@ -1450,7 +1464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDeploymentsResponse();
       var od = api.ListDeploymentsResponse.fromJson(o.toJson());
-      checkListDeploymentsResponse(od);
+      checkListDeploymentsResponse(od as api.ListDeploymentsResponse);
     });
   });
 
@@ -1458,7 +1472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListScriptProcessesResponse();
       var od = api.ListScriptProcessesResponse.fromJson(o.toJson());
-      checkListScriptProcessesResponse(od);
+      checkListScriptProcessesResponse(od as api.ListScriptProcessesResponse);
     });
   });
 
@@ -1466,7 +1480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUserProcessesResponse();
       var od = api.ListUserProcessesResponse.fromJson(o.toJson());
-      checkListUserProcessesResponse(od);
+      checkListUserProcessesResponse(od as api.ListUserProcessesResponse);
     });
   });
 
@@ -1474,7 +1488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListValue();
       var od = api.ListValue.fromJson(o.toJson());
-      checkListValue(od);
+      checkListValue(od as api.ListValue);
     });
   });
 
@@ -1482,7 +1496,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListVersionsResponse();
       var od = api.ListVersionsResponse.fromJson(o.toJson());
-      checkListVersionsResponse(od);
+      checkListVersionsResponse(od as api.ListVersionsResponse);
     });
   });
 
@@ -1490,7 +1504,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetrics();
       var od = api.Metrics.fromJson(o.toJson());
-      checkMetrics(od);
+      checkMetrics(od as api.Metrics);
     });
   });
 
@@ -1498,7 +1512,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricsValue();
       var od = api.MetricsValue.fromJson(o.toJson());
-      checkMetricsValue(od);
+      checkMetricsValue(od as api.MetricsValue);
     });
   });
 
@@ -1506,7 +1520,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1514,7 +1528,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProject();
       var od = api.Project.fromJson(o.toJson());
-      checkProject(od);
+      checkProject(od as api.Project);
     });
   });
 
@@ -1522,7 +1536,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScriptExecutionResult();
       var od = api.ScriptExecutionResult.fromJson(o.toJson());
-      checkScriptExecutionResult(od);
+      checkScriptExecutionResult(od as api.ScriptExecutionResult);
     });
   });
 
@@ -1530,7 +1544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScriptStackTraceElement();
       var od = api.ScriptStackTraceElement.fromJson(o.toJson());
-      checkScriptStackTraceElement(od);
+      checkScriptStackTraceElement(od as api.ScriptStackTraceElement);
     });
   });
 
@@ -1538,7 +1552,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1546,7 +1560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStruct();
       var od = api.Struct.fromJson(o.toJson());
-      checkStruct(od);
+      checkStruct(od as api.Struct);
     });
   });
 
@@ -1554,7 +1568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDeploymentRequest();
       var od = api.UpdateDeploymentRequest.fromJson(o.toJson());
-      checkUpdateDeploymentRequest(od);
+      checkUpdateDeploymentRequest(od as api.UpdateDeploymentRequest);
     });
   });
 
@@ -1562,7 +1576,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValue();
       var od = api.Value.fromJson(o.toJson());
-      checkValue(od);
+      checkValue(od as api.Value);
     });
   });
 
@@ -1570,7 +1584,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVersion();
       var od = api.Version.fromJson(o.toJson());
-      checkVersion(od);
+      checkVersion(od as api.Version);
     });
   });
 
@@ -1665,7 +1679,8 @@
                   arg_userProcessFilter_userAccessLevels,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUserProcessesResponse(response);
+        checkListUserProcessesResponse(
+            response as api.ListUserProcessesResponse);
       })));
     });
 
@@ -1755,7 +1770,8 @@
                   arg_scriptProcessFilter_userAccessLevels,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListScriptProcessesResponse(response);
+        checkListScriptProcessesResponse(
+            response as api.ListScriptProcessesResponse);
       })));
     });
   });
@@ -1767,8 +1783,9 @@
       var arg_request = buildCreateProjectRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateProjectRequest.fromJson(json);
-        checkCreateProjectRequest(obj);
+        var obj = api.CreateProjectRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateProjectRequest(obj as api.CreateProjectRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1807,7 +1824,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
 
@@ -1857,7 +1874,7 @@
       res
           .get(arg_scriptId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProject(response);
+        checkProject(response as api.Project);
       })));
     });
 
@@ -1917,7 +1934,7 @@
           .getContent(arg_scriptId,
               versionNumber: arg_versionNumber, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContent(response);
+        checkContent(response as api.Content);
       })));
     });
 
@@ -1982,7 +1999,7 @@
               metricsGranularity: arg_metricsGranularity,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMetrics(response);
+        checkMetrics(response as api.Metrics);
       })));
     });
 
@@ -1993,8 +2010,9 @@
       var arg_scriptId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Content.fromJson(json);
-        checkContent(obj);
+        var obj =
+            api.Content.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkContent(obj as api.Content);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2042,7 +2060,7 @@
       res
           .updateContent(arg_request, arg_scriptId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContent(response);
+        checkContent(response as api.Content);
       })));
     });
   });
@@ -2055,8 +2073,9 @@
       var arg_scriptId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeploymentConfig.fromJson(json);
-        checkDeploymentConfig(obj);
+        var obj = api.DeploymentConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeploymentConfig(obj as api.DeploymentConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2104,7 +2123,7 @@
       res
           .create(arg_request, arg_scriptId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeployment(response);
+        checkDeployment(response as api.Deployment);
       })));
     });
 
@@ -2164,7 +2183,7 @@
       res
           .delete(arg_scriptId, arg_deploymentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2224,7 +2243,7 @@
       res
           .get(arg_scriptId, arg_deploymentId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeployment(response);
+        checkDeployment(response as api.Deployment);
       })));
     });
 
@@ -2289,7 +2308,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDeploymentsResponse(response);
+        checkListDeploymentsResponse(response as api.ListDeploymentsResponse);
       })));
     });
 
@@ -2301,8 +2320,9 @@
       var arg_deploymentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateDeploymentRequest.fromJson(json);
-        checkUpdateDeploymentRequest(obj);
+        var obj = api.UpdateDeploymentRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateDeploymentRequest(obj as api.UpdateDeploymentRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2354,7 +2374,7 @@
           .update(arg_request, arg_scriptId, arg_deploymentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeployment(response);
+        checkDeployment(response as api.Deployment);
       })));
     });
   });
@@ -2367,8 +2387,9 @@
       var arg_scriptId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Version.fromJson(json);
-        checkVersion(obj);
+        var obj =
+            api.Version.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVersion(obj as api.Version);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2416,7 +2437,7 @@
       res
           .create(arg_request, arg_scriptId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVersion(response);
+        checkVersion(response as api.Version);
       })));
     });
 
@@ -2476,7 +2497,7 @@
       res
           .get(arg_scriptId, arg_versionNumber, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVersion(response);
+        checkVersion(response as api.Version);
       })));
     });
 
@@ -2541,7 +2562,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListVersionsResponse(response);
+        checkListVersionsResponse(response as api.ListVersionsResponse);
       })));
     });
   });
@@ -2554,8 +2575,9 @@
       var arg_scriptId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExecutionRequest.fromJson(json);
-        checkExecutionRequest(obj);
+        var obj = api.ExecutionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExecutionRequest(obj as api.ExecutionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2603,7 +2625,7 @@
       res
           .run(arg_request, arg_scriptId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/searchconsole/v1_test.dart b/generated/googleapis/test/searchconsole/v1_test.dart
index 00bca6f..4f39a83 100644
--- a/generated/googleapis/test/searchconsole/v1_test.dart
+++ b/generated/googleapis/test/searchconsole/v1_test.dart
@@ -146,8 +146,8 @@
 
 void checkUnnamed1375(core.List<api.ApiDimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApiDimensionFilter(o[0]);
-  checkApiDimensionFilter(o[1]);
+  checkApiDimensionFilter(o[0] as api.ApiDimensionFilter);
+  checkApiDimensionFilter(o[1] as api.ApiDimensionFilter);
 }
 
 core.int buildCounterApiDimensionFilterGroup = 0;
@@ -244,7 +244,7 @@
 void checkResourceIssue(api.ResourceIssue o) {
   buildCounterResourceIssue++;
   if (buildCounterResourceIssue < 3) {
-    checkBlockedResource(o.blockedResource);
+    checkBlockedResource(o.blockedResource as api.BlockedResource);
   }
   buildCounterResourceIssue--;
 }
@@ -279,8 +279,8 @@
 
 void checkUnnamed1376(core.List<api.MobileFriendlyIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMobileFriendlyIssue(o[0]);
-  checkMobileFriendlyIssue(o[1]);
+  checkMobileFriendlyIssue(o[0] as api.MobileFriendlyIssue);
+  checkMobileFriendlyIssue(o[1] as api.MobileFriendlyIssue);
 }
 
 core.List<api.ResourceIssue> buildUnnamed1377() {
@@ -292,8 +292,8 @@
 
 void checkUnnamed1377(core.List<api.ResourceIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceIssue(o[0]);
-  checkResourceIssue(o[1]);
+  checkResourceIssue(o[0] as api.ResourceIssue);
+  checkResourceIssue(o[1] as api.ResourceIssue);
 }
 
 core.int buildCounterRunMobileFriendlyTestResponse = 0;
@@ -317,8 +317,8 @@
     unittest.expect(o.mobileFriendliness, unittest.equals('foo'));
     checkUnnamed1376(o.mobileFriendlyIssues);
     checkUnnamed1377(o.resourceIssues);
-    checkImage(o.screenshot);
-    checkTestStatus(o.testStatus);
+    checkImage(o.screenshot as api.Image);
+    checkTestStatus(o.testStatus as api.TestStatus);
   }
   buildCounterRunMobileFriendlyTestResponse--;
 }
@@ -332,8 +332,8 @@
 
 void checkUnnamed1378(core.List<api.ApiDimensionFilterGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApiDimensionFilterGroup(o[0]);
-  checkApiDimensionFilterGroup(o[1]);
+  checkApiDimensionFilterGroup(o[0] as api.ApiDimensionFilterGroup);
+  checkApiDimensionFilterGroup(o[1] as api.ApiDimensionFilterGroup);
 }
 
 core.List<core.String> buildUnnamed1379() {
@@ -391,8 +391,8 @@
 
 void checkUnnamed1380(core.List<api.ApiDataRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApiDataRow(o[0]);
-  checkApiDataRow(o[1]);
+  checkApiDataRow(o[0] as api.ApiDataRow);
+  checkApiDataRow(o[1] as api.ApiDataRow);
 }
 
 core.int buildCounterSearchAnalyticsQueryResponse = 0;
@@ -425,8 +425,8 @@
 
 void checkUnnamed1381(core.List<api.WmxSitemap> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWmxSitemap(o[0]);
-  checkWmxSitemap(o[1]);
+  checkWmxSitemap(o[0] as api.WmxSitemap);
+  checkWmxSitemap(o[1] as api.WmxSitemap);
 }
 
 core.int buildCounterSitemapsListResponse = 0;
@@ -457,8 +457,8 @@
 
 void checkUnnamed1382(core.List<api.WmxSite> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWmxSite(o[0]);
-  checkWmxSite(o[1]);
+  checkWmxSite(o[0] as api.WmxSite);
+  checkWmxSite(o[1] as api.WmxSite);
 }
 
 core.int buildCounterSitesListResponse = 0;
@@ -531,8 +531,8 @@
 
 void checkUnnamed1383(core.List<api.WmxSitemapContent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWmxSitemapContent(o[0]);
-  checkWmxSitemapContent(o[1]);
+  checkWmxSitemapContent(o[0] as api.WmxSitemapContent);
+  checkWmxSitemapContent(o[1] as api.WmxSitemapContent);
 }
 
 core.int buildCounterWmxSitemap = 0;
@@ -598,7 +598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiDataRow();
       var od = api.ApiDataRow.fromJson(o.toJson());
-      checkApiDataRow(od);
+      checkApiDataRow(od as api.ApiDataRow);
     });
   });
 
@@ -606,7 +606,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiDimensionFilter();
       var od = api.ApiDimensionFilter.fromJson(o.toJson());
-      checkApiDimensionFilter(od);
+      checkApiDimensionFilter(od as api.ApiDimensionFilter);
     });
   });
 
@@ -614,7 +614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiDimensionFilterGroup();
       var od = api.ApiDimensionFilterGroup.fromJson(o.toJson());
-      checkApiDimensionFilterGroup(od);
+      checkApiDimensionFilterGroup(od as api.ApiDimensionFilterGroup);
     });
   });
 
@@ -622,7 +622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlockedResource();
       var od = api.BlockedResource.fromJson(o.toJson());
-      checkBlockedResource(od);
+      checkBlockedResource(od as api.BlockedResource);
     });
   });
 
@@ -630,7 +630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImage();
       var od = api.Image.fromJson(o.toJson());
-      checkImage(od);
+      checkImage(od as api.Image);
     });
   });
 
@@ -638,7 +638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMobileFriendlyIssue();
       var od = api.MobileFriendlyIssue.fromJson(o.toJson());
-      checkMobileFriendlyIssue(od);
+      checkMobileFriendlyIssue(od as api.MobileFriendlyIssue);
     });
   });
 
@@ -646,7 +646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceIssue();
       var od = api.ResourceIssue.fromJson(o.toJson());
-      checkResourceIssue(od);
+      checkResourceIssue(od as api.ResourceIssue);
     });
   });
 
@@ -654,7 +654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunMobileFriendlyTestRequest();
       var od = api.RunMobileFriendlyTestRequest.fromJson(o.toJson());
-      checkRunMobileFriendlyTestRequest(od);
+      checkRunMobileFriendlyTestRequest(od as api.RunMobileFriendlyTestRequest);
     });
   });
 
@@ -662,7 +662,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunMobileFriendlyTestResponse();
       var od = api.RunMobileFriendlyTestResponse.fromJson(o.toJson());
-      checkRunMobileFriendlyTestResponse(od);
+      checkRunMobileFriendlyTestResponse(
+          od as api.RunMobileFriendlyTestResponse);
     });
   });
 
@@ -670,7 +671,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAnalyticsQueryRequest();
       var od = api.SearchAnalyticsQueryRequest.fromJson(o.toJson());
-      checkSearchAnalyticsQueryRequest(od);
+      checkSearchAnalyticsQueryRequest(od as api.SearchAnalyticsQueryRequest);
     });
   });
 
@@ -678,7 +679,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAnalyticsQueryResponse();
       var od = api.SearchAnalyticsQueryResponse.fromJson(o.toJson());
-      checkSearchAnalyticsQueryResponse(od);
+      checkSearchAnalyticsQueryResponse(od as api.SearchAnalyticsQueryResponse);
     });
   });
 
@@ -686,7 +687,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSitemapsListResponse();
       var od = api.SitemapsListResponse.fromJson(o.toJson());
-      checkSitemapsListResponse(od);
+      checkSitemapsListResponse(od as api.SitemapsListResponse);
     });
   });
 
@@ -694,7 +695,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSitesListResponse();
       var od = api.SitesListResponse.fromJson(o.toJson());
-      checkSitesListResponse(od);
+      checkSitesListResponse(od as api.SitesListResponse);
     });
   });
 
@@ -702,7 +703,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestStatus();
       var od = api.TestStatus.fromJson(o.toJson());
-      checkTestStatus(od);
+      checkTestStatus(od as api.TestStatus);
     });
   });
 
@@ -710,7 +711,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWmxSite();
       var od = api.WmxSite.fromJson(o.toJson());
-      checkWmxSite(od);
+      checkWmxSite(od as api.WmxSite);
     });
   });
 
@@ -718,7 +719,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWmxSitemap();
       var od = api.WmxSitemap.fromJson(o.toJson());
-      checkWmxSitemap(od);
+      checkWmxSitemap(od as api.WmxSitemap);
     });
   });
 
@@ -726,7 +727,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWmxSitemapContent();
       var od = api.WmxSitemapContent.fromJson(o.toJson());
-      checkWmxSitemapContent(od);
+      checkWmxSitemapContent(od as api.WmxSitemapContent);
     });
   });
 
@@ -738,8 +739,10 @@
       var arg_siteUrl = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchAnalyticsQueryRequest.fromJson(json);
-        checkSearchAnalyticsQueryRequest(obj);
+        var obj = api.SearchAnalyticsQueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchAnalyticsQueryRequest(
+            obj as api.SearchAnalyticsQueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -787,7 +790,8 @@
       res
           .query(arg_request, arg_siteUrl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchAnalyticsQueryResponse(response);
+        checkSearchAnalyticsQueryResponse(
+            response as api.SearchAnalyticsQueryResponse);
       })));
     });
   });
@@ -907,7 +911,7 @@
       res
           .get(arg_siteUrl, arg_feedpath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWmxSitemap(response);
+        checkWmxSitemap(response as api.WmxSitemap);
       })));
     });
 
@@ -967,7 +971,7 @@
           .list(arg_siteUrl,
               sitemapIndex: arg_sitemapIndex, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSitemapsListResponse(response);
+        checkSitemapsListResponse(response as api.SitemapsListResponse);
       })));
     });
 
@@ -1173,7 +1177,7 @@
       res
           .get(arg_siteUrl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWmxSite(response);
+        checkWmxSite(response as api.WmxSite);
       })));
     });
 
@@ -1217,7 +1221,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkSitesListResponse(response);
+        checkSitesListResponse(response as api.SitesListResponse);
       })));
     });
   });
@@ -1229,8 +1233,10 @@
       var arg_request = buildRunMobileFriendlyTestRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RunMobileFriendlyTestRequest.fromJson(json);
-        checkRunMobileFriendlyTestRequest(obj);
+        var obj = api.RunMobileFriendlyTestRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRunMobileFriendlyTestRequest(
+            obj as api.RunMobileFriendlyTestRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1269,7 +1275,8 @@
       res
           .run(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRunMobileFriendlyTestResponse(response);
+        checkRunMobileFriendlyTestResponse(
+            response as api.RunMobileFriendlyTestResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/secretmanager/v1_test.dart b/generated/googleapis/test/secretmanager/v1_test.dart
index f140aa1..5dea273 100644
--- a/generated/googleapis/test/secretmanager/v1_test.dart
+++ b/generated/googleapis/test/secretmanager/v1_test.dart
@@ -90,7 +90,7 @@
   buildCounterAccessSecretVersionResponse++;
   if (buildCounterAccessSecretVersionResponse < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkSecretPayload(o.payload);
+    checkSecretPayload(o.payload as api.SecretPayload);
   }
   buildCounterAccessSecretVersionResponse--;
 }
@@ -109,7 +109,7 @@
 void checkAddSecretVersionRequest(api.AddSecretVersionRequest o) {
   buildCounterAddSecretVersionRequest++;
   if (buildCounterAddSecretVersionRequest < 3) {
-    checkSecretPayload(o.payload);
+    checkSecretPayload(o.payload as api.SecretPayload);
   }
   buildCounterAddSecretVersionRequest--;
 }
@@ -123,8 +123,8 @@
 
 void checkUnnamed5125(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -196,7 +196,8 @@
 void checkAutomatic(api.Automatic o) {
   buildCounterAutomatic++;
   if (buildCounterAutomatic < 3) {
-    checkCustomerManagedEncryption(o.customerManagedEncryption);
+    checkCustomerManagedEncryption(
+        o.customerManagedEncryption as api.CustomerManagedEncryption);
   }
   buildCounterAutomatic--;
 }
@@ -215,7 +216,8 @@
 void checkAutomaticStatus(api.AutomaticStatus o) {
   buildCounterAutomaticStatus++;
   if (buildCounterAutomaticStatus < 3) {
-    checkCustomerManagedEncryptionStatus(o.customerManagedEncryption);
+    checkCustomerManagedEncryptionStatus(
+        o.customerManagedEncryption as api.CustomerManagedEncryptionStatus);
   }
   buildCounterAutomaticStatus--;
 }
@@ -251,7 +253,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed5127(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -391,8 +393,8 @@
 
 void checkUnnamed5128(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -425,8 +427,8 @@
 
 void checkUnnamed5129(core.List<api.SecretVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSecretVersion(o[0]);
-  checkSecretVersion(o[1]);
+  checkSecretVersion(o[0] as api.SecretVersion);
+  checkSecretVersion(o[1] as api.SecretVersion);
 }
 
 core.int buildCounterListSecretVersionsResponse = 0;
@@ -461,8 +463,8 @@
 
 void checkUnnamed5130(core.List<api.Secret> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSecret(o[0]);
-  checkSecret(o[1]);
+  checkSecret(o[0] as api.Secret);
+  checkSecret(o[1] as api.Secret);
 }
 
 core.int buildCounterListSecretsResponse = 0;
@@ -566,8 +568,8 @@
 
 void checkUnnamed5133(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed5134() {
@@ -579,8 +581,8 @@
 
 void checkUnnamed5134(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -623,7 +625,8 @@
 void checkReplica(api.Replica o) {
   buildCounterReplica++;
   if (buildCounterReplica < 3) {
-    checkCustomerManagedEncryption(o.customerManagedEncryption);
+    checkCustomerManagedEncryption(
+        o.customerManagedEncryption as api.CustomerManagedEncryption);
     unittest.expect(o.location, unittest.equals('foo'));
   }
   buildCounterReplica--;
@@ -644,7 +647,8 @@
 void checkReplicaStatus(api.ReplicaStatus o) {
   buildCounterReplicaStatus++;
   if (buildCounterReplicaStatus < 3) {
-    checkCustomerManagedEncryptionStatus(o.customerManagedEncryption);
+    checkCustomerManagedEncryptionStatus(
+        o.customerManagedEncryption as api.CustomerManagedEncryptionStatus);
     unittest.expect(o.location, unittest.equals('foo'));
   }
   buildCounterReplicaStatus--;
@@ -665,8 +669,8 @@
 void checkReplication(api.Replication o) {
   buildCounterReplication++;
   if (buildCounterReplication < 3) {
-    checkAutomatic(o.automatic);
-    checkUserManaged(o.userManaged);
+    checkAutomatic(o.automatic as api.Automatic);
+    checkUserManaged(o.userManaged as api.UserManaged);
   }
   buildCounterReplication--;
 }
@@ -686,8 +690,8 @@
 void checkReplicationStatus(api.ReplicationStatus o) {
   buildCounterReplicationStatus++;
   if (buildCounterReplicationStatus < 3) {
-    checkAutomaticStatus(o.automatic);
-    checkUserManagedStatus(o.userManaged);
+    checkAutomaticStatus(o.automatic as api.AutomaticStatus);
+    checkUserManagedStatus(o.userManaged as api.UserManagedStatus);
   }
   buildCounterReplicationStatus--;
 }
@@ -725,7 +729,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     checkUnnamed5135(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkReplication(o.replication);
+    checkReplication(o.replication as api.Replication);
   }
   buildCounterSecret--;
 }
@@ -770,7 +774,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.destroyTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkReplicationStatus(o.replicationStatus);
+    checkReplicationStatus(o.replicationStatus as api.ReplicationStatus);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterSecretVersion--;
@@ -791,7 +795,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -870,8 +874,8 @@
 
 void checkUnnamed5138(core.List<api.Replica> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReplica(o[0]);
-  checkReplica(o[1]);
+  checkReplica(o[0] as api.Replica);
+  checkReplica(o[1] as api.Replica);
 }
 
 core.int buildCounterUserManaged = 0;
@@ -902,8 +906,8 @@
 
 void checkUnnamed5139(core.List<api.ReplicaStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReplicaStatus(o[0]);
-  checkReplicaStatus(o[1]);
+  checkReplicaStatus(o[0] as api.ReplicaStatus);
+  checkReplicaStatus(o[1] as api.ReplicaStatus);
 }
 
 core.int buildCounterUserManagedStatus = 0;
@@ -930,7 +934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessSecretVersionResponse();
       var od = api.AccessSecretVersionResponse.fromJson(o.toJson());
-      checkAccessSecretVersionResponse(od);
+      checkAccessSecretVersionResponse(od as api.AccessSecretVersionResponse);
     });
   });
 
@@ -938,7 +942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddSecretVersionRequest();
       var od = api.AddSecretVersionRequest.fromJson(o.toJson());
-      checkAddSecretVersionRequest(od);
+      checkAddSecretVersionRequest(od as api.AddSecretVersionRequest);
     });
   });
 
@@ -946,7 +950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -954,7 +958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -962,7 +966,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutomatic();
       var od = api.Automatic.fromJson(o.toJson());
-      checkAutomatic(od);
+      checkAutomatic(od as api.Automatic);
     });
   });
 
@@ -970,7 +974,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutomaticStatus();
       var od = api.AutomaticStatus.fromJson(o.toJson());
-      checkAutomaticStatus(od);
+      checkAutomaticStatus(od as api.AutomaticStatus);
     });
   });
 
@@ -978,7 +982,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -986,7 +990,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerManagedEncryption();
       var od = api.CustomerManagedEncryption.fromJson(o.toJson());
-      checkCustomerManagedEncryption(od);
+      checkCustomerManagedEncryption(od as api.CustomerManagedEncryption);
     });
   });
 
@@ -994,7 +998,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomerManagedEncryptionStatus();
       var od = api.CustomerManagedEncryptionStatus.fromJson(o.toJson());
-      checkCustomerManagedEncryptionStatus(od);
+      checkCustomerManagedEncryptionStatus(
+          od as api.CustomerManagedEncryptionStatus);
     });
   });
 
@@ -1002,7 +1007,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDestroySecretVersionRequest();
       var od = api.DestroySecretVersionRequest.fromJson(o.toJson());
-      checkDestroySecretVersionRequest(od);
+      checkDestroySecretVersionRequest(od as api.DestroySecretVersionRequest);
     });
   });
 
@@ -1010,7 +1015,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisableSecretVersionRequest();
       var od = api.DisableSecretVersionRequest.fromJson(o.toJson());
-      checkDisableSecretVersionRequest(od);
+      checkDisableSecretVersionRequest(od as api.DisableSecretVersionRequest);
     });
   });
 
@@ -1018,7 +1023,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1026,7 +1031,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableSecretVersionRequest();
       var od = api.EnableSecretVersionRequest.fromJson(o.toJson());
-      checkEnableSecretVersionRequest(od);
+      checkEnableSecretVersionRequest(od as api.EnableSecretVersionRequest);
     });
   });
 
@@ -1034,7 +1039,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1042,7 +1047,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1050,7 +1055,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSecretVersionsResponse();
       var od = api.ListSecretVersionsResponse.fromJson(o.toJson());
-      checkListSecretVersionsResponse(od);
+      checkListSecretVersionsResponse(od as api.ListSecretVersionsResponse);
     });
   });
 
@@ -1058,7 +1063,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSecretsResponse();
       var od = api.ListSecretsResponse.fromJson(o.toJson());
-      checkListSecretsResponse(od);
+      checkListSecretsResponse(od as api.ListSecretsResponse);
     });
   });
 
@@ -1066,7 +1071,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1074,7 +1079,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1082,7 +1087,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplica();
       var od = api.Replica.fromJson(o.toJson());
-      checkReplica(od);
+      checkReplica(od as api.Replica);
     });
   });
 
@@ -1090,7 +1095,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplicaStatus();
       var od = api.ReplicaStatus.fromJson(o.toJson());
-      checkReplicaStatus(od);
+      checkReplicaStatus(od as api.ReplicaStatus);
     });
   });
 
@@ -1098,7 +1103,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplication();
       var od = api.Replication.fromJson(o.toJson());
-      checkReplication(od);
+      checkReplication(od as api.Replication);
     });
   });
 
@@ -1106,7 +1111,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplicationStatus();
       var od = api.ReplicationStatus.fromJson(o.toJson());
-      checkReplicationStatus(od);
+      checkReplicationStatus(od as api.ReplicationStatus);
     });
   });
 
@@ -1114,7 +1119,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecret();
       var od = api.Secret.fromJson(o.toJson());
-      checkSecret(od);
+      checkSecret(od as api.Secret);
     });
   });
 
@@ -1122,7 +1127,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecretPayload();
       var od = api.SecretPayload.fromJson(o.toJson());
-      checkSecretPayload(od);
+      checkSecretPayload(od as api.SecretPayload);
     });
   });
 
@@ -1130,7 +1135,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecretVersion();
       var od = api.SecretVersion.fromJson(o.toJson());
-      checkSecretVersion(od);
+      checkSecretVersion(od as api.SecretVersion);
     });
   });
 
@@ -1138,7 +1143,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -1146,7 +1151,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -1154,7 +1159,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -1162,7 +1167,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserManaged();
       var od = api.UserManaged.fromJson(o.toJson());
-      checkUserManaged(od);
+      checkUserManaged(od as api.UserManaged);
     });
   });
 
@@ -1170,7 +1175,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserManagedStatus();
       var od = api.UserManagedStatus.fromJson(o.toJson());
-      checkUserManagedStatus(od);
+      checkUserManagedStatus(od as api.UserManagedStatus);
     });
   });
 
@@ -1219,7 +1224,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1279,7 +1284,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1292,8 +1297,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddSecretVersionRequest.fromJson(json);
-        checkAddSecretVersionRequest(obj);
+        var obj = api.AddSecretVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddSecretVersionRequest(obj as api.AddSecretVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1333,7 +1339,7 @@
       res
           .addVersion(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecretVersion(response);
+        checkSecretVersion(response as api.SecretVersion);
       })));
     });
 
@@ -1345,8 +1351,9 @@
       var arg_secretId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Secret.fromJson(json);
-        checkSecret(obj);
+        var obj =
+            api.Secret.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSecret(obj as api.Secret);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1389,7 +1396,7 @@
           .create(arg_request, arg_parent,
               secretId: arg_secretId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecret(response);
+        checkSecret(response as api.Secret);
       })));
     });
 
@@ -1437,7 +1444,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1485,7 +1492,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecret(response);
+        checkSecret(response as api.Secret);
       })));
     });
 
@@ -1540,7 +1547,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1597,7 +1604,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSecretsResponse(response);
+        checkListSecretsResponse(response as api.ListSecretsResponse);
       })));
     });
 
@@ -1609,8 +1616,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Secret.fromJson(json);
-        checkSecret(obj);
+        var obj =
+            api.Secret.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSecret(obj as api.Secret);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1653,7 +1661,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecret(response);
+        checkSecret(response as api.Secret);
       })));
     });
 
@@ -1664,8 +1672,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1705,7 +1714,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1716,8 +1725,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1757,7 +1767,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -1807,7 +1818,8 @@
       res
           .access(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccessSecretVersionResponse(response);
+        checkAccessSecretVersionResponse(
+            response as api.AccessSecretVersionResponse);
       })));
     });
 
@@ -1818,8 +1830,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DestroySecretVersionRequest.fromJson(json);
-        checkDestroySecretVersionRequest(obj);
+        var obj = api.DestroySecretVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDestroySecretVersionRequest(
+            obj as api.DestroySecretVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1859,7 +1873,7 @@
       res
           .destroy(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecretVersion(response);
+        checkSecretVersion(response as api.SecretVersion);
       })));
     });
 
@@ -1870,8 +1884,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisableSecretVersionRequest.fromJson(json);
-        checkDisableSecretVersionRequest(obj);
+        var obj = api.DisableSecretVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisableSecretVersionRequest(
+            obj as api.DisableSecretVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1911,7 +1927,7 @@
       res
           .disable(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecretVersion(response);
+        checkSecretVersion(response as api.SecretVersion);
       })));
     });
 
@@ -1922,8 +1938,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EnableSecretVersionRequest.fromJson(json);
-        checkEnableSecretVersionRequest(obj);
+        var obj = api.EnableSecretVersionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnableSecretVersionRequest(obj as api.EnableSecretVersionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1963,7 +1980,7 @@
       res
           .enable(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecretVersion(response);
+        checkSecretVersion(response as api.SecretVersion);
       })));
     });
 
@@ -2011,7 +2028,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecretVersion(response);
+        checkSecretVersion(response as api.SecretVersion);
       })));
     });
 
@@ -2068,7 +2085,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSecretVersionsResponse(response);
+        checkListSecretVersionsResponse(
+            response as api.ListSecretVersionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/securitycenter/v1_test.dart b/generated/googleapis/test/securitycenter/v1_test.dart
index af407fd..52f7f4e 100644
--- a/generated/googleapis/test/securitycenter/v1_test.dart
+++ b/generated/googleapis/test/securitycenter/v1_test.dart
@@ -124,11 +124,12 @@
   buildCounterAsset++;
   if (buildCounterAsset < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkIamPolicy(o.iamPolicy);
+    checkIamPolicy(o.iamPolicy as api.IamPolicy);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1489(o.resourceProperties);
-    checkSecurityCenterProperties(o.securityCenterProperties);
-    checkSecurityMarks(o.securityMarks);
+    checkSecurityCenterProperties(
+        o.securityCenterProperties as api.SecurityCenterProperties);
+    checkSecurityMarks(o.securityMarks as api.SecurityMarks);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterAsset--;
@@ -177,8 +178,8 @@
 
 void checkUnnamed1491(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -265,7 +266,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed1493(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -371,7 +372,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
-    checkSecurityMarks(o.securityMarks);
+    checkSecurityMarks(o.securityMarks as api.SecurityMarks);
     checkUnnamed1494(o.sourceProperties);
     unittest.expect(o.state, unittest.equals('foo'));
   }
@@ -392,7 +393,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -434,9 +435,10 @@
     api.GoogleCloudSecuritycenterV1NotificationMessage o) {
   buildCounterGoogleCloudSecuritycenterV1NotificationMessage++;
   if (buildCounterGoogleCloudSecuritycenterV1NotificationMessage < 3) {
-    checkFinding(o.finding);
+    checkFinding(o.finding as api.Finding);
     unittest.expect(o.notificationConfigName, unittest.equals('foo'));
-    checkGoogleCloudSecuritycenterV1Resource(o.resource);
+    checkGoogleCloudSecuritycenterV1Resource(
+        o.resource as api.GoogleCloudSecuritycenterV1Resource);
   }
   buildCounterGoogleCloudSecuritycenterV1NotificationMessage--;
 }
@@ -581,7 +583,8 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.resourceName, unittest.equals('foo'));
-    checkGoogleCloudSecuritycenterV1p1beta1SecurityMarks(o.securityMarks);
+    checkGoogleCloudSecuritycenterV1p1beta1SecurityMarks(
+        o.securityMarks as api.GoogleCloudSecuritycenterV1p1beta1SecurityMarks);
     unittest.expect(o.severity, unittest.equals('foo'));
     checkUnnamed1495(o.sourceProperties);
     unittest.expect(o.state, unittest.equals('foo'));
@@ -607,9 +610,11 @@
     api.GoogleCloudSecuritycenterV1p1beta1NotificationMessage o) {
   buildCounterGoogleCloudSecuritycenterV1p1beta1NotificationMessage++;
   if (buildCounterGoogleCloudSecuritycenterV1p1beta1NotificationMessage < 3) {
-    checkGoogleCloudSecuritycenterV1p1beta1Finding(o.finding);
+    checkGoogleCloudSecuritycenterV1p1beta1Finding(
+        o.finding as api.GoogleCloudSecuritycenterV1p1beta1Finding);
     unittest.expect(o.notificationConfigName, unittest.equals('foo'));
-    checkGoogleCloudSecuritycenterV1p1beta1Resource(o.resource);
+    checkGoogleCloudSecuritycenterV1p1beta1Resource(
+        o.resource as api.GoogleCloudSecuritycenterV1p1beta1Resource);
   }
   buildCounterGoogleCloudSecuritycenterV1p1beta1NotificationMessage--;
 }
@@ -743,8 +748,8 @@
 
 void checkUnnamed1497(core.List<api.GroupResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroupResult(o[0]);
-  checkGroupResult(o[1]);
+  checkGroupResult(o[0] as api.GroupResult);
+  checkGroupResult(o[1] as api.GroupResult);
 }
 
 core.int buildCounterGroupAssetsResponse = 0;
@@ -810,8 +815,8 @@
 
 void checkUnnamed1498(core.List<api.GroupResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroupResult(o[0]);
-  checkGroupResult(o[1]);
+  checkGroupResult(o[0] as api.GroupResult);
+  checkGroupResult(o[1] as api.GroupResult);
 }
 
 core.int buildCounterGroupFindingsResponse = 0;
@@ -917,8 +922,8 @@
 
 void checkUnnamed1500(core.List<api.ListAssetsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkListAssetsResult(o[0]);
-  checkListAssetsResult(o[1]);
+  checkListAssetsResult(o[0] as api.ListAssetsResult);
+  checkListAssetsResult(o[1] as api.ListAssetsResult);
 }
 
 core.int buildCounterListAssetsResponse = 0;
@@ -961,7 +966,7 @@
 void checkListAssetsResult(api.ListAssetsResult o) {
   buildCounterListAssetsResult++;
   if (buildCounterListAssetsResult < 3) {
-    checkAsset(o.asset);
+    checkAsset(o.asset as api.Asset);
     unittest.expect(o.stateChange, unittest.equals('foo'));
   }
   buildCounterListAssetsResult--;
@@ -976,8 +981,8 @@
 
 void checkUnnamed1501(core.List<api.ListFindingsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkListFindingsResult(o[0]);
-  checkListFindingsResult(o[1]);
+  checkListFindingsResult(o[0] as api.ListFindingsResult);
+  checkListFindingsResult(o[1] as api.ListFindingsResult);
 }
 
 core.int buildCounterListFindingsResponse = 0;
@@ -1021,8 +1026,8 @@
 void checkListFindingsResult(api.ListFindingsResult o) {
   buildCounterListFindingsResult++;
   if (buildCounterListFindingsResult < 3) {
-    checkFinding(o.finding);
-    checkResource(o.resource);
+    checkFinding(o.finding as api.Finding);
+    checkResource(o.resource as api.Resource);
     unittest.expect(o.stateChange, unittest.equals('foo'));
   }
   buildCounterListFindingsResult--;
@@ -1037,8 +1042,8 @@
 
 void checkUnnamed1502(core.List<api.NotificationConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotificationConfig(o[0]);
-  checkNotificationConfig(o[1]);
+  checkNotificationConfig(o[0] as api.NotificationConfig);
+  checkNotificationConfig(o[1] as api.NotificationConfig);
 }
 
 core.int buildCounterListNotificationConfigsResponse = 0;
@@ -1072,8 +1077,8 @@
 
 void checkUnnamed1503(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1106,8 +1111,8 @@
 
 void checkUnnamed1504(core.List<api.Source> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSource(o[0]);
-  checkSource(o[1]);
+  checkSource(o[0] as api.Source);
+  checkSource(o[1] as api.Source);
 }
 
 core.int buildCounterListSourcesResponse = 0;
@@ -1153,7 +1158,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.pubsubTopic, unittest.equals('foo'));
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
-    checkStreamingConfig(o.streamingConfig);
+    checkStreamingConfig(o.streamingConfig as api.StreamingConfig);
   }
   buildCounterNotificationConfig--;
 }
@@ -1235,7 +1240,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1505(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1506(o.response);
@@ -1259,7 +1264,8 @@
 void checkOrganizationSettings(api.OrganizationSettings o) {
   buildCounterOrganizationSettings++;
   if (buildCounterOrganizationSettings < 3) {
-    checkAssetDiscoveryConfig(o.assetDiscoveryConfig);
+    checkAssetDiscoveryConfig(
+        o.assetDiscoveryConfig as api.AssetDiscoveryConfig);
     unittest.expect(o.enableAssetDiscovery, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -1275,8 +1281,8 @@
 
 void checkUnnamed1507(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed1508() {
@@ -1288,8 +1294,8 @@
 
 void checkUnnamed1508(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1475,7 +1481,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -1657,7 +1663,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsset();
       var od = api.Asset.fromJson(o.toJson());
-      checkAsset(od);
+      checkAsset(od as api.Asset);
     });
   });
 
@@ -1665,7 +1671,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAssetDiscoveryConfig();
       var od = api.AssetDiscoveryConfig.fromJson(o.toJson());
-      checkAssetDiscoveryConfig(od);
+      checkAssetDiscoveryConfig(od as api.AssetDiscoveryConfig);
     });
   });
 
@@ -1673,7 +1679,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -1681,7 +1687,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -1689,7 +1695,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -1697,7 +1703,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1705,7 +1711,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1713,7 +1719,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFinding();
       var od = api.Finding.fromJson(o.toJson());
-      checkFinding(od);
+      checkFinding(od as api.Finding);
     });
   });
 
@@ -1721,7 +1727,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -1729,7 +1735,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -1739,7 +1745,8 @@
       var o = buildGoogleCloudSecuritycenterV1NotificationMessage();
       var od = api.GoogleCloudSecuritycenterV1NotificationMessage.fromJson(
           o.toJson());
-      checkGoogleCloudSecuritycenterV1NotificationMessage(od);
+      checkGoogleCloudSecuritycenterV1NotificationMessage(
+          od as api.GoogleCloudSecuritycenterV1NotificationMessage);
     });
   });
 
@@ -1747,7 +1754,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudSecuritycenterV1Resource();
       var od = api.GoogleCloudSecuritycenterV1Resource.fromJson(o.toJson());
-      checkGoogleCloudSecuritycenterV1Resource(od);
+      checkGoogleCloudSecuritycenterV1Resource(
+          od as api.GoogleCloudSecuritycenterV1Resource);
     });
   });
 
@@ -1758,7 +1766,8 @@
       var od =
           api.GoogleCloudSecuritycenterV1RunAssetDiscoveryResponse.fromJson(
               o.toJson());
-      checkGoogleCloudSecuritycenterV1RunAssetDiscoveryResponse(od);
+      checkGoogleCloudSecuritycenterV1RunAssetDiscoveryResponse(
+          od as api.GoogleCloudSecuritycenterV1RunAssetDiscoveryResponse);
     });
   });
 
@@ -1769,7 +1778,8 @@
       var o = buildGoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse();
       var od = api.GoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse
           .fromJson(o.toJson());
-      checkGoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse(od);
+      checkGoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse(
+          od as api.GoogleCloudSecuritycenterV1beta1RunAssetDiscoveryResponse);
     });
   });
 
@@ -1778,7 +1788,8 @@
       var o = buildGoogleCloudSecuritycenterV1p1beta1Finding();
       var od =
           api.GoogleCloudSecuritycenterV1p1beta1Finding.fromJson(o.toJson());
-      checkGoogleCloudSecuritycenterV1p1beta1Finding(od);
+      checkGoogleCloudSecuritycenterV1p1beta1Finding(
+          od as api.GoogleCloudSecuritycenterV1p1beta1Finding);
     });
   });
 
@@ -1789,7 +1800,8 @@
       var od =
           api.GoogleCloudSecuritycenterV1p1beta1NotificationMessage.fromJson(
               o.toJson());
-      checkGoogleCloudSecuritycenterV1p1beta1NotificationMessage(od);
+      checkGoogleCloudSecuritycenterV1p1beta1NotificationMessage(
+          od as api.GoogleCloudSecuritycenterV1p1beta1NotificationMessage);
     });
   });
 
@@ -1798,7 +1810,8 @@
       var o = buildGoogleCloudSecuritycenterV1p1beta1Resource();
       var od =
           api.GoogleCloudSecuritycenterV1p1beta1Resource.fromJson(o.toJson());
-      checkGoogleCloudSecuritycenterV1p1beta1Resource(od);
+      checkGoogleCloudSecuritycenterV1p1beta1Resource(
+          od as api.GoogleCloudSecuritycenterV1p1beta1Resource);
     });
   });
 
@@ -1810,7 +1823,8 @@
           buildGoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse();
       var od = api.GoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse
           .fromJson(o.toJson());
-      checkGoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse(od);
+      checkGoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse(od
+          as api.GoogleCloudSecuritycenterV1p1beta1RunAssetDiscoveryResponse);
     });
   });
 
@@ -1820,7 +1834,8 @@
       var o = buildGoogleCloudSecuritycenterV1p1beta1SecurityMarks();
       var od = api.GoogleCloudSecuritycenterV1p1beta1SecurityMarks.fromJson(
           o.toJson());
-      checkGoogleCloudSecuritycenterV1p1beta1SecurityMarks(od);
+      checkGoogleCloudSecuritycenterV1p1beta1SecurityMarks(
+          od as api.GoogleCloudSecuritycenterV1p1beta1SecurityMarks);
     });
   });
 
@@ -1828,7 +1843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupAssetsRequest();
       var od = api.GroupAssetsRequest.fromJson(o.toJson());
-      checkGroupAssetsRequest(od);
+      checkGroupAssetsRequest(od as api.GroupAssetsRequest);
     });
   });
 
@@ -1836,7 +1851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupAssetsResponse();
       var od = api.GroupAssetsResponse.fromJson(o.toJson());
-      checkGroupAssetsResponse(od);
+      checkGroupAssetsResponse(od as api.GroupAssetsResponse);
     });
   });
 
@@ -1844,7 +1859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupFindingsRequest();
       var od = api.GroupFindingsRequest.fromJson(o.toJson());
-      checkGroupFindingsRequest(od);
+      checkGroupFindingsRequest(od as api.GroupFindingsRequest);
     });
   });
 
@@ -1852,7 +1867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupFindingsResponse();
       var od = api.GroupFindingsResponse.fromJson(o.toJson());
-      checkGroupFindingsResponse(od);
+      checkGroupFindingsResponse(od as api.GroupFindingsResponse);
     });
   });
 
@@ -1860,7 +1875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupResult();
       var od = api.GroupResult.fromJson(o.toJson());
-      checkGroupResult(od);
+      checkGroupResult(od as api.GroupResult);
     });
   });
 
@@ -1868,7 +1883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIamPolicy();
       var od = api.IamPolicy.fromJson(o.toJson());
-      checkIamPolicy(od);
+      checkIamPolicy(od as api.IamPolicy);
     });
   });
 
@@ -1876,7 +1891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAssetsResponse();
       var od = api.ListAssetsResponse.fromJson(o.toJson());
-      checkListAssetsResponse(od);
+      checkListAssetsResponse(od as api.ListAssetsResponse);
     });
   });
 
@@ -1884,7 +1899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAssetsResult();
       var od = api.ListAssetsResult.fromJson(o.toJson());
-      checkListAssetsResult(od);
+      checkListAssetsResult(od as api.ListAssetsResult);
     });
   });
 
@@ -1892,7 +1907,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFindingsResponse();
       var od = api.ListFindingsResponse.fromJson(o.toJson());
-      checkListFindingsResponse(od);
+      checkListFindingsResponse(od as api.ListFindingsResponse);
     });
   });
 
@@ -1900,7 +1915,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFindingsResult();
       var od = api.ListFindingsResult.fromJson(o.toJson());
-      checkListFindingsResult(od);
+      checkListFindingsResult(od as api.ListFindingsResult);
     });
   });
 
@@ -1908,7 +1923,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListNotificationConfigsResponse();
       var od = api.ListNotificationConfigsResponse.fromJson(o.toJson());
-      checkListNotificationConfigsResponse(od);
+      checkListNotificationConfigsResponse(
+          od as api.ListNotificationConfigsResponse);
     });
   });
 
@@ -1916,7 +1932,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1924,7 +1940,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSourcesResponse();
       var od = api.ListSourcesResponse.fromJson(o.toJson());
-      checkListSourcesResponse(od);
+      checkListSourcesResponse(od as api.ListSourcesResponse);
     });
   });
 
@@ -1932,7 +1948,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationConfig();
       var od = api.NotificationConfig.fromJson(o.toJson());
-      checkNotificationConfig(od);
+      checkNotificationConfig(od as api.NotificationConfig);
     });
   });
 
@@ -1940,7 +1956,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1948,7 +1964,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrganizationSettings();
       var od = api.OrganizationSettings.fromJson(o.toJson());
-      checkOrganizationSettings(od);
+      checkOrganizationSettings(od as api.OrganizationSettings);
     });
   });
 
@@ -1956,7 +1972,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1964,7 +1980,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResource();
       var od = api.Resource.fromJson(o.toJson());
-      checkResource(od);
+      checkResource(od as api.Resource);
     });
   });
 
@@ -1972,7 +1988,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRunAssetDiscoveryRequest();
       var od = api.RunAssetDiscoveryRequest.fromJson(o.toJson());
-      checkRunAssetDiscoveryRequest(od);
+      checkRunAssetDiscoveryRequest(od as api.RunAssetDiscoveryRequest);
     });
   });
 
@@ -1980,7 +1996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityCenterProperties();
       var od = api.SecurityCenterProperties.fromJson(o.toJson());
-      checkSecurityCenterProperties(od);
+      checkSecurityCenterProperties(od as api.SecurityCenterProperties);
     });
   });
 
@@ -1988,7 +2004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSecurityMarks();
       var od = api.SecurityMarks.fromJson(o.toJson());
-      checkSecurityMarks(od);
+      checkSecurityMarks(od as api.SecurityMarks);
     });
   });
 
@@ -1996,7 +2012,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetFindingStateRequest();
       var od = api.SetFindingStateRequest.fromJson(o.toJson());
-      checkSetFindingStateRequest(od);
+      checkSetFindingStateRequest(od as api.SetFindingStateRequest);
     });
   });
 
@@ -2004,7 +2020,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -2012,7 +2028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSource();
       var od = api.Source.fromJson(o.toJson());
-      checkSource(od);
+      checkSource(od as api.Source);
     });
   });
 
@@ -2020,7 +2036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2028,7 +2044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStreamingConfig();
       var od = api.StreamingConfig.fromJson(o.toJson());
-      checkStreamingConfig(od);
+      checkStreamingConfig(od as api.StreamingConfig);
     });
   });
 
@@ -2036,7 +2052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -2044,7 +2060,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -2093,7 +2109,7 @@
       res
           .getOrganizationSettings(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrganizationSettings(response);
+        checkOrganizationSettings(response as api.OrganizationSettings);
       })));
     });
 
@@ -2105,8 +2121,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.OrganizationSettings.fromJson(json);
-        checkOrganizationSettings(obj);
+        var obj = api.OrganizationSettings.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkOrganizationSettings(obj as api.OrganizationSettings);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2149,7 +2166,7 @@
           .updateOrganizationSettings(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOrganizationSettings(response);
+        checkOrganizationSettings(response as api.OrganizationSettings);
       })));
     });
   });
@@ -2162,8 +2179,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GroupAssetsRequest.fromJson(json);
-        checkGroupAssetsRequest(obj);
+        var obj = api.GroupAssetsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGroupAssetsRequest(obj as api.GroupAssetsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2203,7 +2221,7 @@
       res
           .group(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroupAssetsResponse(response);
+        checkGroupAssetsResponse(response as api.GroupAssetsResponse);
       })));
     });
 
@@ -2279,7 +2297,7 @@
               readTime: arg_readTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAssetsResponse(response);
+        checkListAssetsResponse(response as api.ListAssetsResponse);
       })));
     });
 
@@ -2290,8 +2308,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RunAssetDiscoveryRequest.fromJson(json);
-        checkRunAssetDiscoveryRequest(obj);
+        var obj = api.RunAssetDiscoveryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRunAssetDiscoveryRequest(obj as api.RunAssetDiscoveryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2331,7 +2350,7 @@
       res
           .runDiscovery(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2344,8 +2363,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SecurityMarks.fromJson(json);
-        checkSecurityMarks(obj);
+        var obj = api.SecurityMarks.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSecurityMarks(obj as api.SecurityMarks);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2392,7 +2412,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecurityMarks(response);
+        checkSecurityMarks(response as api.SecurityMarks);
       })));
     });
   });
@@ -2406,8 +2426,9 @@
       var arg_configId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NotificationConfig.fromJson(json);
-        checkNotificationConfig(obj);
+        var obj = api.NotificationConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNotificationConfig(obj as api.NotificationConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2450,7 +2471,7 @@
           .create(arg_request, arg_parent,
               configId: arg_configId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationConfig(response);
+        checkNotificationConfig(response as api.NotificationConfig);
       })));
     });
 
@@ -2498,7 +2519,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2546,7 +2567,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationConfig(response);
+        checkNotificationConfig(response as api.NotificationConfig);
       })));
     });
 
@@ -2603,7 +2624,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNotificationConfigsResponse(response);
+        checkListNotificationConfigsResponse(
+            response as api.ListNotificationConfigsResponse);
       })));
     });
 
@@ -2615,8 +2637,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.NotificationConfig.fromJson(json);
-        checkNotificationConfig(obj);
+        var obj = api.NotificationConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNotificationConfig(obj as api.NotificationConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2659,7 +2682,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotificationConfig(response);
+        checkNotificationConfig(response as api.NotificationConfig);
       })));
     });
   });
@@ -2709,7 +2732,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2757,7 +2780,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2805,7 +2828,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2865,7 +2888,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -2878,8 +2901,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Source.fromJson(json);
-        checkSource(obj);
+        var obj =
+            api.Source.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSource(obj as api.Source);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2919,7 +2943,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSource(response);
+        checkSource(response as api.Source);
       })));
     });
 
@@ -2967,7 +2991,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSource(response);
+        checkSource(response as api.Source);
       })));
     });
 
@@ -2978,8 +3002,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3019,7 +3044,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3076,7 +3101,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSourcesResponse(response);
+        checkListSourcesResponse(response as api.ListSourcesResponse);
       })));
     });
 
@@ -3088,8 +3113,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Source.fromJson(json);
-        checkSource(obj);
+        var obj =
+            api.Source.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkSource(obj as api.Source);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3132,7 +3158,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSource(response);
+        checkSource(response as api.Source);
       })));
     });
 
@@ -3143,8 +3169,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3184,7 +3211,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3195,8 +3222,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3236,7 +3264,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -3250,8 +3279,9 @@
       var arg_findingId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Finding.fromJson(json);
-        checkFinding(obj);
+        var obj =
+            api.Finding.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFinding(obj as api.Finding);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3294,7 +3324,7 @@
           .create(arg_request, arg_parent,
               findingId: arg_findingId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFinding(response);
+        checkFinding(response as api.Finding);
       })));
     });
 
@@ -3305,8 +3335,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GroupFindingsRequest.fromJson(json);
-        checkGroupFindingsRequest(obj);
+        var obj = api.GroupFindingsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGroupFindingsRequest(obj as api.GroupFindingsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3346,7 +3377,7 @@
       res
           .group(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroupFindingsResponse(response);
+        checkGroupFindingsResponse(response as api.GroupFindingsResponse);
       })));
     });
 
@@ -3422,7 +3453,7 @@
               readTime: arg_readTime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFindingsResponse(response);
+        checkListFindingsResponse(response as api.ListFindingsResponse);
       })));
     });
 
@@ -3434,8 +3465,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Finding.fromJson(json);
-        checkFinding(obj);
+        var obj =
+            api.Finding.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFinding(obj as api.Finding);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3478,7 +3510,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFinding(response);
+        checkFinding(response as api.Finding);
       })));
     });
 
@@ -3489,8 +3521,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetFindingStateRequest.fromJson(json);
-        checkSetFindingStateRequest(obj);
+        var obj = api.SetFindingStateRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetFindingStateRequest(obj as api.SetFindingStateRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3530,7 +3563,7 @@
       res
           .setState(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFinding(response);
+        checkFinding(response as api.Finding);
       })));
     });
 
@@ -3543,8 +3576,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SecurityMarks.fromJson(json);
-        checkSecurityMarks(obj);
+        var obj = api.SecurityMarks.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSecurityMarks(obj as api.SecurityMarks);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3591,7 +3625,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSecurityMarks(response);
+        checkSecurityMarks(response as api.SecurityMarks);
       })));
     });
   });
diff --git a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
index d139a97..054e13b 100644
--- a/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
+++ b/generated/googleapis/test/serviceconsumermanagement/v1_test.dart
@@ -89,7 +89,7 @@
 void checkAddTenantProjectRequest(api.AddTenantProjectRequest o) {
   buildCounterAddTenantProjectRequest++;
   if (buildCounterAddTenantProjectRequest < 3) {
-    checkTenantProjectConfig(o.projectConfig);
+    checkTenantProjectConfig(o.projectConfig as api.TenantProjectConfig);
     unittest.expect(o.tag, unittest.equals('foo'));
   }
   buildCounterAddTenantProjectRequest--;
@@ -104,8 +104,8 @@
 
 void checkUnnamed3463(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMethod(o[0]);
-  checkMethod(o[1]);
+  checkMethod(o[0] as api.Method);
+  checkMethod(o[1] as api.Method);
 }
 
 core.List<api.Mixin> buildUnnamed3464() {
@@ -117,8 +117,8 @@
 
 void checkUnnamed3464(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMixin(o[0]);
-  checkMixin(o[1]);
+  checkMixin(o[0] as api.Mixin);
+  checkMixin(o[1] as api.Mixin);
 }
 
 core.List<api.Option> buildUnnamed3465() {
@@ -130,8 +130,8 @@
 
 void checkUnnamed3465(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterApi = 0;
@@ -158,7 +158,7 @@
     checkUnnamed3464(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3465(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -181,7 +181,7 @@
     api.ApplyTenantProjectConfigRequest o) {
   buildCounterApplyTenantProjectConfigRequest++;
   if (buildCounterApplyTenantProjectConfigRequest < 3) {
-    checkTenantProjectConfig(o.projectConfig);
+    checkTenantProjectConfig(o.projectConfig as api.TenantProjectConfig);
     unittest.expect(o.tag, unittest.equals('foo'));
   }
   buildCounterApplyTenantProjectConfigRequest--;
@@ -219,8 +219,8 @@
 
 void checkUnnamed3466(core.List<api.JwtLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJwtLocation(o[0]);
-  checkJwtLocation(o[1]);
+  checkJwtLocation(o[0] as api.JwtLocation);
+  checkJwtLocation(o[1] as api.JwtLocation);
 }
 
 core.int buildCounterAuthProvider = 0;
@@ -282,8 +282,8 @@
 
 void checkUnnamed3467(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthProvider(o[0]);
-  checkAuthProvider(o[1]);
+  checkAuthProvider(o[0] as api.AuthProvider);
+  checkAuthProvider(o[1] as api.AuthProvider);
 }
 
 core.List<api.AuthenticationRule> buildUnnamed3468() {
@@ -295,8 +295,8 @@
 
 void checkUnnamed3468(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthenticationRule(o[0]);
-  checkAuthenticationRule(o[1]);
+  checkAuthenticationRule(o[0] as api.AuthenticationRule);
+  checkAuthenticationRule(o[1] as api.AuthenticationRule);
 }
 
 core.int buildCounterAuthentication = 0;
@@ -329,8 +329,8 @@
 
 void checkUnnamed3469(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthRequirement(o[0]);
-  checkAuthRequirement(o[1]);
+  checkAuthRequirement(o[0] as api.AuthRequirement);
+  checkAuthRequirement(o[1] as api.AuthRequirement);
 }
 
 core.int buildCounterAuthenticationRule = 0;
@@ -351,7 +351,7 @@
   buildCounterAuthenticationRule++;
   if (buildCounterAuthenticationRule < 3) {
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
-    checkOAuthRequirements(o.oauth);
+    checkOAuthRequirements(o.oauth as api.OAuthRequirements);
     checkUnnamed3469(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
@@ -367,8 +367,8 @@
 
 void checkUnnamed3470(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendRule(o[0]);
-  checkBackendRule(o[1]);
+  checkBackendRule(o[0] as api.BackendRule);
+  checkBackendRule(o[1] as api.BackendRule);
 }
 
 core.int buildCounterBackend = 0;
@@ -434,8 +434,8 @@
 
 void checkUnnamed3471(core.List<api.BillingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBillingDestination(o[0]);
-  checkBillingDestination(o[1]);
+  checkBillingDestination(o[0] as api.BillingDestination);
+  checkBillingDestination(o[1] as api.BillingDestination);
 }
 
 core.int buildCounterBilling = 0;
@@ -534,8 +534,8 @@
 
 void checkUnnamed3473(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContextRule(o[0]);
-  checkContextRule(o[1]);
+  checkContextRule(o[0] as api.ContextRule);
+  checkContextRule(o[1] as api.ContextRule);
 }
 
 core.int buildCounterContext = 0;
@@ -683,8 +683,8 @@
 
 void checkUnnamed3478(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomErrorRule(o[0]);
-  checkCustomErrorRule(o[1]);
+  checkCustomErrorRule(o[0] as api.CustomErrorRule);
+  checkCustomErrorRule(o[1] as api.CustomErrorRule);
 }
 
 core.List<core.String> buildUnnamed3479() {
@@ -791,8 +791,8 @@
 
 void checkUnnamed3480(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.List<api.DocumentationRule> buildUnnamed3481() {
@@ -804,8 +804,8 @@
 
 void checkUnnamed3481(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDocumentationRule(o[0]);
-  checkDocumentationRule(o[1]);
+  checkDocumentationRule(o[0] as api.DocumentationRule);
+  checkDocumentationRule(o[1] as api.DocumentationRule);
 }
 
 core.int buildCounterDocumentation = 0;
@@ -922,8 +922,8 @@
 
 void checkUnnamed3483(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnumValue(o[0]);
-  checkEnumValue(o[1]);
+  checkEnumValue(o[0] as api.EnumValue);
+  checkEnumValue(o[1] as api.EnumValue);
 }
 
 core.List<api.Option> buildUnnamed3484() {
@@ -935,8 +935,8 @@
 
 void checkUnnamed3484(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnum = 0;
@@ -960,7 +960,7 @@
     checkUnnamed3483(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3484(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
@@ -975,8 +975,8 @@
 
 void checkUnnamed3485(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnumValue = 0;
@@ -1011,8 +1011,8 @@
 
 void checkUnnamed3486(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterField = 0;
@@ -1061,8 +1061,8 @@
 
 void checkUnnamed3487(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttp = 0;
@@ -1095,8 +1095,8 @@
 
 void checkUnnamed3488(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttpRule = 0;
@@ -1126,7 +1126,7 @@
     checkUnnamed3488(o.additionalBindings);
     unittest.expect(o.allowHalfDuplex, unittest.isTrue);
     unittest.expect(o.body, unittest.equals('foo'));
-    checkCustomHttpPattern(o.custom);
+    checkCustomHttpPattern(o.custom as api.CustomHttpPattern);
     unittest.expect(o.delete, unittest.equals('foo'));
     unittest.expect(o.get, unittest.equals('foo'));
     unittest.expect(o.patch, unittest.equals('foo'));
@@ -1193,8 +1193,8 @@
 
 void checkUnnamed3489(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1227,8 +1227,8 @@
 
 void checkUnnamed3490(core.List<api.TenancyUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTenancyUnit(o[0]);
-  checkTenancyUnit(o[1]);
+  checkTenancyUnit(o[0] as api.TenancyUnit);
+  checkTenancyUnit(o[1] as api.TenancyUnit);
 }
 
 core.int buildCounterListTenancyUnitsResponse = 0;
@@ -1261,8 +1261,8 @@
 
 void checkUnnamed3491(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterLogDescriptor = 0;
@@ -1299,8 +1299,8 @@
 
 void checkUnnamed3492(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.List<api.LoggingDestination> buildUnnamed3493() {
@@ -1312,8 +1312,8 @@
 
 void checkUnnamed3493(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.int buildCounterLogging = 0;
@@ -1380,8 +1380,8 @@
 
 void checkUnnamed3495(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterMethod = 0;
@@ -1424,8 +1424,8 @@
 
 void checkUnnamed3496(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.List<core.String> buildUnnamed3497() {
@@ -1469,7 +1469,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed3496(o.labels);
     unittest.expect(o.launchStage, unittest.equals('foo'));
-    checkMetricDescriptorMetadata(o.metadata);
+    checkMetricDescriptorMetadata(o.metadata as api.MetricDescriptorMetadata);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     checkUnnamed3497(o.monitoredResourceTypes);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1567,8 +1567,8 @@
 
 void checkUnnamed3499(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterMonitoredResourceDescriptor = 0;
@@ -1609,8 +1609,8 @@
 
 void checkUnnamed3500(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.List<api.MonitoringDestination> buildUnnamed3501() {
@@ -1622,8 +1622,8 @@
 
 void checkUnnamed3501(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.int buildCounterMonitoring = 0;
@@ -1777,7 +1777,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3503(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3504(o.response);
@@ -1844,8 +1844,8 @@
 
 void checkUnnamed3506(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.int buildCounterPage = 0;
@@ -1914,8 +1914,8 @@
 
 void checkUnnamed3508(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaLimit(o[0]);
-  checkQuotaLimit(o[1]);
+  checkQuotaLimit(o[0] as api.QuotaLimit);
+  checkQuotaLimit(o[1] as api.QuotaLimit);
 }
 
 core.List<api.MetricRule> buildUnnamed3509() {
@@ -1927,8 +1927,8 @@
 
 void checkUnnamed3509(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricRule(o[0]);
-  checkMetricRule(o[1]);
+  checkMetricRule(o[0] as api.MetricRule);
+  checkMetricRule(o[1] as api.MetricRule);
 }
 
 core.int buildCounterQuota = 0;
@@ -2030,8 +2030,8 @@
 
 void checkUnnamed3511(core.List<api.TenancyUnit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTenancyUnit(o[0]);
-  checkTenancyUnit(o[1]);
+  checkTenancyUnit(o[0] as api.TenancyUnit);
+  checkTenancyUnit(o[1] as api.TenancyUnit);
 }
 
 core.int buildCounterSearchTenancyUnitsResponse = 0;
@@ -2064,8 +2064,8 @@
 
 void checkUnnamed3512(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApi(o[0]);
-  checkApi(o[1]);
+  checkApi(o[0] as api.Api);
+  checkApi(o[1] as api.Api);
 }
 
 core.List<api.Endpoint> buildUnnamed3513() {
@@ -2077,8 +2077,8 @@
 
 void checkUnnamed3513(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEndpoint(o[0]);
-  checkEndpoint(o[1]);
+  checkEndpoint(o[0] as api.Endpoint);
+  checkEndpoint(o[1] as api.Endpoint);
 }
 
 core.List<api.Enum> buildUnnamed3514() {
@@ -2090,8 +2090,8 @@
 
 void checkUnnamed3514(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnum(o[0]);
-  checkEnum(o[1]);
+  checkEnum(o[0] as api.Enum);
+  checkEnum(o[1] as api.Enum);
 }
 
 core.List<api.LogDescriptor> buildUnnamed3515() {
@@ -2103,8 +2103,8 @@
 
 void checkUnnamed3515(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogDescriptor(o[0]);
-  checkLogDescriptor(o[1]);
+  checkLogDescriptor(o[0] as api.LogDescriptor);
+  checkLogDescriptor(o[1] as api.LogDescriptor);
 }
 
 core.List<api.MetricDescriptor> buildUnnamed3516() {
@@ -2116,8 +2116,8 @@
 
 void checkUnnamed3516(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricDescriptor(o[0]);
-  checkMetricDescriptor(o[1]);
+  checkMetricDescriptor(o[0] as api.MetricDescriptor);
+  checkMetricDescriptor(o[1] as api.MetricDescriptor);
 }
 
 core.List<api.MonitoredResourceDescriptor> buildUnnamed3517() {
@@ -2129,8 +2129,8 @@
 
 void checkUnnamed3517(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResourceDescriptor(o[0]);
-  checkMonitoredResourceDescriptor(o[1]);
+  checkMonitoredResourceDescriptor(o[0] as api.MonitoredResourceDescriptor);
+  checkMonitoredResourceDescriptor(o[1] as api.MonitoredResourceDescriptor);
 }
 
 core.List<api.Type> buildUnnamed3518() {
@@ -2142,8 +2142,8 @@
 
 void checkUnnamed3518(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.List<api.Type> buildUnnamed3519() {
@@ -2155,8 +2155,8 @@
 
 void checkUnnamed3519(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.int buildCounterService = 0;
@@ -2200,32 +2200,32 @@
   buildCounterService++;
   if (buildCounterService < 3) {
     checkUnnamed3512(o.apis);
-    checkAuthentication(o.authentication);
-    checkBackend(o.backend);
-    checkBilling(o.billing);
+    checkAuthentication(o.authentication as api.Authentication);
+    checkBackend(o.backend as api.Backend);
+    checkBilling(o.billing as api.Billing);
     unittest.expect(o.configVersion, unittest.equals(42));
-    checkContext(o.context);
-    checkControl(o.control);
-    checkCustomError(o.customError);
-    checkDocumentation(o.documentation);
+    checkContext(o.context as api.Context);
+    checkControl(o.control as api.Control);
+    checkCustomError(o.customError as api.CustomError);
+    checkDocumentation(o.documentation as api.Documentation);
     checkUnnamed3513(o.endpoints);
     checkUnnamed3514(o.enums);
-    checkHttp(o.http);
+    checkHttp(o.http as api.Http);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkLogging(o.logging);
+    checkLogging(o.logging as api.Logging);
     checkUnnamed3515(o.logs);
     checkUnnamed3516(o.metrics);
     checkUnnamed3517(o.monitoredResources);
-    checkMonitoring(o.monitoring);
+    checkMonitoring(o.monitoring as api.Monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
-    checkQuota(o.quota);
-    checkSourceInfo(o.sourceInfo);
-    checkSystemParameters(o.systemParameters);
+    checkQuota(o.quota as api.Quota);
+    checkSourceInfo(o.sourceInfo as api.SourceInfo);
+    checkSystemParameters(o.systemParameters as api.SystemParameters);
     checkUnnamed3518(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkUnnamed3519(o.types);
-    checkUsage(o.usage);
+    checkUsage(o.usage as api.Usage);
   }
   buildCounterService--;
 }
@@ -2464,8 +2464,8 @@
 
 void checkUnnamed3525(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameter(o[0]);
-  checkSystemParameter(o[1]);
+  checkSystemParameter(o[0] as api.SystemParameter);
+  checkSystemParameter(o[1] as api.SystemParameter);
 }
 
 core.int buildCounterSystemParameterRule = 0;
@@ -2498,8 +2498,8 @@
 
 void checkUnnamed3526(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameterRule(o[0]);
-  checkSystemParameterRule(o[1]);
+  checkSystemParameterRule(o[0] as api.SystemParameterRule);
+  checkSystemParameterRule(o[1] as api.SystemParameterRule);
 }
 
 core.int buildCounterSystemParameters = 0;
@@ -2530,8 +2530,8 @@
 
 void checkUnnamed3527(core.List<api.TenantResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTenantResource(o[0]);
-  checkTenantResource(o[1]);
+  checkTenantResource(o[0] as api.TenantResource);
+  checkTenantResource(o[1] as api.TenantResource);
 }
 
 core.int buildCounterTenancyUnit = 0;
@@ -2606,12 +2606,13 @@
 void checkTenantProjectConfig(api.TenantProjectConfig o) {
   buildCounterTenantProjectConfig++;
   if (buildCounterTenantProjectConfig < 3) {
-    checkBillingConfig(o.billingConfig);
+    checkBillingConfig(o.billingConfig as api.BillingConfig);
     unittest.expect(o.folder, unittest.equals('foo'));
     checkUnnamed3528(o.labels);
-    checkServiceAccountConfig(o.serviceAccountConfig);
+    checkServiceAccountConfig(
+        o.serviceAccountConfig as api.ServiceAccountConfig);
     checkUnnamed3529(o.services);
-    checkTenantProjectPolicy(o.tenantProjectPolicy);
+    checkTenantProjectPolicy(o.tenantProjectPolicy as api.TenantProjectPolicy);
   }
   buildCounterTenantProjectConfig--;
 }
@@ -2625,8 +2626,8 @@
 
 void checkUnnamed3530(core.List<api.PolicyBinding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicyBinding(o[0]);
-  checkPolicyBinding(o[1]);
+  checkPolicyBinding(o[0] as api.PolicyBinding);
+  checkPolicyBinding(o[1] as api.PolicyBinding);
 }
 
 core.int buildCounterTenantProjectPolicy = 0;
@@ -2680,8 +2681,8 @@
 
 void checkUnnamed3531(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkField(o[0]);
-  checkField(o[1]);
+  checkField(o[0] as api.Field);
+  checkField(o[1] as api.Field);
 }
 
 core.List<core.String> buildUnnamed3532() {
@@ -2706,8 +2707,8 @@
 
 void checkUnnamed3533(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterType = 0;
@@ -2733,7 +2734,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3532(o.oneofs);
     checkUnnamed3533(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterType--;
@@ -2780,8 +2781,8 @@
 
 void checkUnnamed3535(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageRule(o[0]);
-  checkUsageRule(o[1]);
+  checkUsageRule(o[0] as api.UsageRule);
+  checkUsageRule(o[1] as api.UsageRule);
 }
 
 core.int buildCounterUsage = 0;
@@ -2804,7 +2805,7 @@
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
     checkUnnamed3534(o.requirements);
     checkUnnamed3535(o.rules);
-    checkServiceIdentity(o.serviceIdentity);
+    checkServiceIdentity(o.serviceIdentity as api.ServiceIdentity);
   }
   buildCounterUsage--;
 }
@@ -2873,8 +2874,8 @@
 
 void checkUnnamed3537(core.List<api.V1Beta1QuotaOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkV1Beta1QuotaOverride(o[0]);
-  checkV1Beta1QuotaOverride(o[1]);
+  checkV1Beta1QuotaOverride(o[0] as api.V1Beta1QuotaOverride);
+  checkV1Beta1QuotaOverride(o[1] as api.V1Beta1QuotaOverride);
 }
 
 core.int buildCounterV1Beta1BatchCreateProducerOverridesResponse = 0;
@@ -2944,7 +2945,7 @@
     api.V1Beta1GenerateServiceIdentityResponse o) {
   buildCounterV1Beta1GenerateServiceIdentityResponse++;
   if (buildCounterV1Beta1GenerateServiceIdentityResponse < 3) {
-    checkV1Beta1ServiceIdentity(o.identity);
+    checkV1Beta1ServiceIdentity(o.identity as api.V1Beta1ServiceIdentity);
   }
   buildCounterV1Beta1GenerateServiceIdentityResponse--;
 }
@@ -2958,8 +2959,8 @@
 
 void checkUnnamed3538(core.List<api.V1Beta1QuotaOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkV1Beta1QuotaOverride(o[0]);
-  checkV1Beta1QuotaOverride(o[1]);
+  checkV1Beta1QuotaOverride(o[0] as api.V1Beta1QuotaOverride);
+  checkV1Beta1QuotaOverride(o[1] as api.V1Beta1QuotaOverride);
 }
 
 core.int buildCounterV1Beta1ImportProducerOverridesResponse = 0;
@@ -2992,8 +2993,8 @@
 
 void checkUnnamed3539(core.List<api.V1Beta1ProducerQuotaPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkV1Beta1ProducerQuotaPolicy(o[0]);
-  checkV1Beta1ProducerQuotaPolicy(o[1]);
+  checkV1Beta1ProducerQuotaPolicy(o[0] as api.V1Beta1ProducerQuotaPolicy);
+  checkV1Beta1ProducerQuotaPolicy(o[1] as api.V1Beta1ProducerQuotaPolicy);
 }
 
 core.int buildCounterV1Beta1ImportProducerQuotaPoliciesResponse = 0;
@@ -3212,7 +3213,7 @@
   buildCounterV1GenerateDefaultIdentityResponse++;
   if (buildCounterV1GenerateDefaultIdentityResponse < 3) {
     unittest.expect(o.attachStatus, unittest.equals('foo'));
-    checkV1DefaultIdentity(o.identity);
+    checkV1DefaultIdentity(o.identity as api.V1DefaultIdentity);
     unittest.expect(o.role, unittest.equals('foo'));
   }
   buildCounterV1GenerateDefaultIdentityResponse--;
@@ -3233,7 +3234,7 @@
     api.V1GenerateServiceAccountResponse o) {
   buildCounterV1GenerateServiceAccountResponse++;
   if (buildCounterV1GenerateServiceAccountResponse < 3) {
-    checkV1ServiceAccount(o.account);
+    checkV1ServiceAccount(o.account as api.V1ServiceAccount);
   }
   buildCounterV1GenerateServiceAccountResponse--;
 }
@@ -3318,7 +3319,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddTenantProjectRequest();
       var od = api.AddTenantProjectRequest.fromJson(o.toJson());
-      checkAddTenantProjectRequest(od);
+      checkAddTenantProjectRequest(od as api.AddTenantProjectRequest);
     });
   });
 
@@ -3326,7 +3327,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApi();
       var od = api.Api.fromJson(o.toJson());
-      checkApi(od);
+      checkApi(od as api.Api);
     });
   });
 
@@ -3334,7 +3335,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildApplyTenantProjectConfigRequest();
       var od = api.ApplyTenantProjectConfigRequest.fromJson(o.toJson());
-      checkApplyTenantProjectConfigRequest(od);
+      checkApplyTenantProjectConfigRequest(
+          od as api.ApplyTenantProjectConfigRequest);
     });
   });
 
@@ -3342,7 +3344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttachTenantProjectRequest();
       var od = api.AttachTenantProjectRequest.fromJson(o.toJson());
-      checkAttachTenantProjectRequest(od);
+      checkAttachTenantProjectRequest(od as api.AttachTenantProjectRequest);
     });
   });
 
@@ -3350,7 +3352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthProvider();
       var od = api.AuthProvider.fromJson(o.toJson());
-      checkAuthProvider(od);
+      checkAuthProvider(od as api.AuthProvider);
     });
   });
 
@@ -3358,7 +3360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthRequirement();
       var od = api.AuthRequirement.fromJson(o.toJson());
-      checkAuthRequirement(od);
+      checkAuthRequirement(od as api.AuthRequirement);
     });
   });
 
@@ -3366,7 +3368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthentication();
       var od = api.Authentication.fromJson(o.toJson());
-      checkAuthentication(od);
+      checkAuthentication(od as api.Authentication);
     });
   });
 
@@ -3374,7 +3376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthenticationRule();
       var od = api.AuthenticationRule.fromJson(o.toJson());
-      checkAuthenticationRule(od);
+      checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
 
@@ -3382,7 +3384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackend();
       var od = api.Backend.fromJson(o.toJson());
-      checkBackend(od);
+      checkBackend(od as api.Backend);
     });
   });
 
@@ -3390,7 +3392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendRule();
       var od = api.BackendRule.fromJson(o.toJson());
-      checkBackendRule(od);
+      checkBackendRule(od as api.BackendRule);
     });
   });
 
@@ -3398,7 +3400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBilling();
       var od = api.Billing.fromJson(o.toJson());
-      checkBilling(od);
+      checkBilling(od as api.Billing);
     });
   });
 
@@ -3406,7 +3408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingConfig();
       var od = api.BillingConfig.fromJson(o.toJson());
-      checkBillingConfig(od);
+      checkBillingConfig(od as api.BillingConfig);
     });
   });
 
@@ -3414,7 +3416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingDestination();
       var od = api.BillingDestination.fromJson(o.toJson());
-      checkBillingDestination(od);
+      checkBillingDestination(od as api.BillingDestination);
     });
   });
 
@@ -3422,7 +3424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -3430,7 +3432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContext();
       var od = api.Context.fromJson(o.toJson());
-      checkContext(od);
+      checkContext(od as api.Context);
     });
   });
 
@@ -3438,7 +3440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContextRule();
       var od = api.ContextRule.fromJson(o.toJson());
-      checkContextRule(od);
+      checkContextRule(od as api.ContextRule);
     });
   });
 
@@ -3446,7 +3448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildControl();
       var od = api.Control.fromJson(o.toJson());
-      checkControl(od);
+      checkControl(od as api.Control);
     });
   });
 
@@ -3454,7 +3456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateTenancyUnitRequest();
       var od = api.CreateTenancyUnitRequest.fromJson(o.toJson());
-      checkCreateTenancyUnitRequest(od);
+      checkCreateTenancyUnitRequest(od as api.CreateTenancyUnitRequest);
     });
   });
 
@@ -3462,7 +3464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomError();
       var od = api.CustomError.fromJson(o.toJson());
-      checkCustomError(od);
+      checkCustomError(od as api.CustomError);
     });
   });
 
@@ -3470,7 +3472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomErrorRule();
       var od = api.CustomErrorRule.fromJson(o.toJson());
-      checkCustomErrorRule(od);
+      checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
 
@@ -3478,7 +3480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomHttpPattern();
       var od = api.CustomHttpPattern.fromJson(o.toJson());
-      checkCustomHttpPattern(od);
+      checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
 
@@ -3486,7 +3488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteTenantProjectRequest();
       var od = api.DeleteTenantProjectRequest.fromJson(o.toJson());
-      checkDeleteTenantProjectRequest(od);
+      checkDeleteTenantProjectRequest(od as api.DeleteTenantProjectRequest);
     });
   });
 
@@ -3494,7 +3496,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentation();
       var od = api.Documentation.fromJson(o.toJson());
-      checkDocumentation(od);
+      checkDocumentation(od as api.Documentation);
     });
   });
 
@@ -3502,7 +3504,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentationRule();
       var od = api.DocumentationRule.fromJson(o.toJson());
-      checkDocumentationRule(od);
+      checkDocumentationRule(od as api.DocumentationRule);
     });
   });
 
@@ -3510,7 +3512,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3518,7 +3520,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpoint();
       var od = api.Endpoint.fromJson(o.toJson());
-      checkEndpoint(od);
+      checkEndpoint(od as api.Endpoint);
     });
   });
 
@@ -3526,7 +3528,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnum();
       var od = api.Enum.fromJson(o.toJson());
-      checkEnum(od);
+      checkEnum(od as api.Enum);
     });
   });
 
@@ -3534,7 +3536,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumValue();
       var od = api.EnumValue.fromJson(o.toJson());
-      checkEnumValue(od);
+      checkEnumValue(od as api.EnumValue);
     });
   });
 
@@ -3542,7 +3544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildField();
       var od = api.Field.fromJson(o.toJson());
-      checkField(od);
+      checkField(od as api.Field);
     });
   });
 
@@ -3550,7 +3552,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttp();
       var od = api.Http.fromJson(o.toJson());
-      checkHttp(od);
+      checkHttp(od as api.Http);
     });
   });
 
@@ -3558,7 +3560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRule();
       var od = api.HttpRule.fromJson(o.toJson());
-      checkHttpRule(od);
+      checkHttpRule(od as api.HttpRule);
     });
   });
 
@@ -3566,7 +3568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJwtLocation();
       var od = api.JwtLocation.fromJson(o.toJson());
-      checkJwtLocation(od);
+      checkJwtLocation(od as api.JwtLocation);
     });
   });
 
@@ -3574,7 +3576,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelDescriptor();
       var od = api.LabelDescriptor.fromJson(o.toJson());
-      checkLabelDescriptor(od);
+      checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
 
@@ -3582,7 +3584,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3590,7 +3592,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTenancyUnitsResponse();
       var od = api.ListTenancyUnitsResponse.fromJson(o.toJson());
-      checkListTenancyUnitsResponse(od);
+      checkListTenancyUnitsResponse(od as api.ListTenancyUnitsResponse);
     });
   });
 
@@ -3598,7 +3600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogDescriptor();
       var od = api.LogDescriptor.fromJson(o.toJson());
-      checkLogDescriptor(od);
+      checkLogDescriptor(od as api.LogDescriptor);
     });
   });
 
@@ -3606,7 +3608,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogging();
       var od = api.Logging.fromJson(o.toJson());
-      checkLogging(od);
+      checkLogging(od as api.Logging);
     });
   });
 
@@ -3614,7 +3616,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoggingDestination();
       var od = api.LoggingDestination.fromJson(o.toJson());
-      checkLoggingDestination(od);
+      checkLoggingDestination(od as api.LoggingDestination);
     });
   });
 
@@ -3622,7 +3624,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMethod();
       var od = api.Method.fromJson(o.toJson());
-      checkMethod(od);
+      checkMethod(od as api.Method);
     });
   });
 
@@ -3630,7 +3632,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptor();
       var od = api.MetricDescriptor.fromJson(o.toJson());
-      checkMetricDescriptor(od);
+      checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
 
@@ -3638,7 +3640,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptorMetadata();
       var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
-      checkMetricDescriptorMetadata(od);
+      checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
 
@@ -3646,7 +3648,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricRule();
       var od = api.MetricRule.fromJson(o.toJson());
-      checkMetricRule(od);
+      checkMetricRule(od as api.MetricRule);
     });
   });
 
@@ -3654,7 +3656,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMixin();
       var od = api.Mixin.fromJson(o.toJson());
-      checkMixin(od);
+      checkMixin(od as api.Mixin);
     });
   });
 
@@ -3662,7 +3664,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceDescriptor();
       var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
-      checkMonitoredResourceDescriptor(od);
+      checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
 
@@ -3670,7 +3672,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoring();
       var od = api.Monitoring.fromJson(o.toJson());
-      checkMonitoring(od);
+      checkMonitoring(od as api.Monitoring);
     });
   });
 
@@ -3678,7 +3680,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoringDestination();
       var od = api.MonitoringDestination.fromJson(o.toJson());
-      checkMonitoringDestination(od);
+      checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
 
@@ -3686,7 +3688,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOAuthRequirements();
       var od = api.OAuthRequirements.fromJson(o.toJson());
-      checkOAuthRequirements(od);
+      checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
 
@@ -3694,7 +3696,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3702,7 +3704,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOption();
       var od = api.Option.fromJson(o.toJson());
-      checkOption(od);
+      checkOption(od as api.Option);
     });
   });
 
@@ -3710,7 +3712,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPage();
       var od = api.Page.fromJson(o.toJson());
-      checkPage(od);
+      checkPage(od as api.Page);
     });
   });
 
@@ -3718,7 +3720,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyBinding();
       var od = api.PolicyBinding.fromJson(o.toJson());
-      checkPolicyBinding(od);
+      checkPolicyBinding(od as api.PolicyBinding);
     });
   });
 
@@ -3726,7 +3728,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuota();
       var od = api.Quota.fromJson(o.toJson());
-      checkQuota(od);
+      checkQuota(od as api.Quota);
     });
   });
 
@@ -3734,7 +3736,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaLimit();
       var od = api.QuotaLimit.fromJson(o.toJson());
-      checkQuotaLimit(od);
+      checkQuotaLimit(od as api.QuotaLimit);
     });
   });
 
@@ -3742,7 +3744,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveTenantProjectRequest();
       var od = api.RemoveTenantProjectRequest.fromJson(o.toJson());
-      checkRemoveTenantProjectRequest(od);
+      checkRemoveTenantProjectRequest(od as api.RemoveTenantProjectRequest);
     });
   });
 
@@ -3750,7 +3752,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchTenancyUnitsResponse();
       var od = api.SearchTenancyUnitsResponse.fromJson(o.toJson());
-      checkSearchTenancyUnitsResponse(od);
+      checkSearchTenancyUnitsResponse(od as api.SearchTenancyUnitsResponse);
     });
   });
 
@@ -3758,7 +3760,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -3766,7 +3768,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccountConfig();
       var od = api.ServiceAccountConfig.fromJson(o.toJson());
-      checkServiceAccountConfig(od);
+      checkServiceAccountConfig(od as api.ServiceAccountConfig);
     });
   });
 
@@ -3774,7 +3776,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceIdentity();
       var od = api.ServiceIdentity.fromJson(o.toJson());
-      checkServiceIdentity(od);
+      checkServiceIdentity(od as api.ServiceIdentity);
     });
   });
 
@@ -3782,7 +3784,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceContext();
       var od = api.SourceContext.fromJson(o.toJson());
-      checkSourceContext(od);
+      checkSourceContext(od as api.SourceContext);
     });
   });
 
@@ -3790,7 +3792,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceInfo();
       var od = api.SourceInfo.fromJson(o.toJson());
-      checkSourceInfo(od);
+      checkSourceInfo(od as api.SourceInfo);
     });
   });
 
@@ -3798,7 +3800,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3806,7 +3808,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameter();
       var od = api.SystemParameter.fromJson(o.toJson());
-      checkSystemParameter(od);
+      checkSystemParameter(od as api.SystemParameter);
     });
   });
 
@@ -3814,7 +3816,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameterRule();
       var od = api.SystemParameterRule.fromJson(o.toJson());
-      checkSystemParameterRule(od);
+      checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
 
@@ -3822,7 +3824,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameters();
       var od = api.SystemParameters.fromJson(o.toJson());
-      checkSystemParameters(od);
+      checkSystemParameters(od as api.SystemParameters);
     });
   });
 
@@ -3830,7 +3832,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTenancyUnit();
       var od = api.TenancyUnit.fromJson(o.toJson());
-      checkTenancyUnit(od);
+      checkTenancyUnit(od as api.TenancyUnit);
     });
   });
 
@@ -3838,7 +3840,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTenantProjectConfig();
       var od = api.TenantProjectConfig.fromJson(o.toJson());
-      checkTenantProjectConfig(od);
+      checkTenantProjectConfig(od as api.TenantProjectConfig);
     });
   });
 
@@ -3846,7 +3848,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTenantProjectPolicy();
       var od = api.TenantProjectPolicy.fromJson(o.toJson());
-      checkTenantProjectPolicy(od);
+      checkTenantProjectPolicy(od as api.TenantProjectPolicy);
     });
   });
 
@@ -3854,7 +3856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTenantResource();
       var od = api.TenantResource.fromJson(o.toJson());
-      checkTenantResource(od);
+      checkTenantResource(od as api.TenantResource);
     });
   });
 
@@ -3862,7 +3864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildType();
       var od = api.Type.fromJson(o.toJson());
-      checkType(od);
+      checkType(od as api.Type);
     });
   });
 
@@ -3870,7 +3872,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteTenantProjectRequest();
       var od = api.UndeleteTenantProjectRequest.fromJson(o.toJson());
-      checkUndeleteTenantProjectRequest(od);
+      checkUndeleteTenantProjectRequest(od as api.UndeleteTenantProjectRequest);
     });
   });
 
@@ -3878,7 +3880,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsage();
       var od = api.Usage.fromJson(o.toJson());
-      checkUsage(od);
+      checkUsage(od as api.Usage);
     });
   });
 
@@ -3886,7 +3888,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageRule();
       var od = api.UsageRule.fromJson(o.toJson());
-      checkUsageRule(od);
+      checkUsageRule(od as api.UsageRule);
     });
   });
 
@@ -3894,7 +3896,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1AddVisibilityLabelsResponse();
       var od = api.V1AddVisibilityLabelsResponse.fromJson(o.toJson());
-      checkV1AddVisibilityLabelsResponse(od);
+      checkV1AddVisibilityLabelsResponse(
+          od as api.V1AddVisibilityLabelsResponse);
     });
   });
 
@@ -3903,7 +3906,8 @@
       var o = buildV1Beta1BatchCreateProducerOverridesResponse();
       var od =
           api.V1Beta1BatchCreateProducerOverridesResponse.fromJson(o.toJson());
-      checkV1Beta1BatchCreateProducerOverridesResponse(od);
+      checkV1Beta1BatchCreateProducerOverridesResponse(
+          od as api.V1Beta1BatchCreateProducerOverridesResponse);
     });
   });
 
@@ -3911,7 +3915,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1DisableConsumerResponse();
       var od = api.V1Beta1DisableConsumerResponse.fromJson(o.toJson());
-      checkV1Beta1DisableConsumerResponse(od);
+      checkV1Beta1DisableConsumerResponse(
+          od as api.V1Beta1DisableConsumerResponse);
     });
   });
 
@@ -3919,7 +3924,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1EnableConsumerResponse();
       var od = api.V1Beta1EnableConsumerResponse.fromJson(o.toJson());
-      checkV1Beta1EnableConsumerResponse(od);
+      checkV1Beta1EnableConsumerResponse(
+          od as api.V1Beta1EnableConsumerResponse);
     });
   });
 
@@ -3927,7 +3933,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1GenerateServiceIdentityResponse();
       var od = api.V1Beta1GenerateServiceIdentityResponse.fromJson(o.toJson());
-      checkV1Beta1GenerateServiceIdentityResponse(od);
+      checkV1Beta1GenerateServiceIdentityResponse(
+          od as api.V1Beta1GenerateServiceIdentityResponse);
     });
   });
 
@@ -3935,7 +3942,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1ImportProducerOverridesResponse();
       var od = api.V1Beta1ImportProducerOverridesResponse.fromJson(o.toJson());
-      checkV1Beta1ImportProducerOverridesResponse(od);
+      checkV1Beta1ImportProducerOverridesResponse(
+          od as api.V1Beta1ImportProducerOverridesResponse);
     });
   });
 
@@ -3944,7 +3952,8 @@
       var o = buildV1Beta1ImportProducerQuotaPoliciesResponse();
       var od =
           api.V1Beta1ImportProducerQuotaPoliciesResponse.fromJson(o.toJson());
-      checkV1Beta1ImportProducerQuotaPoliciesResponse(od);
+      checkV1Beta1ImportProducerQuotaPoliciesResponse(
+          od as api.V1Beta1ImportProducerQuotaPoliciesResponse);
     });
   });
 
@@ -3952,7 +3961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1ProducerQuotaPolicy();
       var od = api.V1Beta1ProducerQuotaPolicy.fromJson(o.toJson());
-      checkV1Beta1ProducerQuotaPolicy(od);
+      checkV1Beta1ProducerQuotaPolicy(od as api.V1Beta1ProducerQuotaPolicy);
     });
   });
 
@@ -3960,7 +3969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1QuotaOverride();
       var od = api.V1Beta1QuotaOverride.fromJson(o.toJson());
-      checkV1Beta1QuotaOverride(od);
+      checkV1Beta1QuotaOverride(od as api.V1Beta1QuotaOverride);
     });
   });
 
@@ -3968,7 +3977,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1RefreshConsumerResponse();
       var od = api.V1Beta1RefreshConsumerResponse.fromJson(o.toJson());
-      checkV1Beta1RefreshConsumerResponse(od);
+      checkV1Beta1RefreshConsumerResponse(
+          od as api.V1Beta1RefreshConsumerResponse);
     });
   });
 
@@ -3976,7 +3986,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1Beta1ServiceIdentity();
       var od = api.V1Beta1ServiceIdentity.fromJson(o.toJson());
-      checkV1Beta1ServiceIdentity(od);
+      checkV1Beta1ServiceIdentity(od as api.V1Beta1ServiceIdentity);
     });
   });
 
@@ -3984,7 +3994,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1DefaultIdentity();
       var od = api.V1DefaultIdentity.fromJson(o.toJson());
-      checkV1DefaultIdentity(od);
+      checkV1DefaultIdentity(od as api.V1DefaultIdentity);
     });
   });
 
@@ -3992,7 +4002,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1DisableConsumerResponse();
       var od = api.V1DisableConsumerResponse.fromJson(o.toJson());
-      checkV1DisableConsumerResponse(od);
+      checkV1DisableConsumerResponse(od as api.V1DisableConsumerResponse);
     });
   });
 
@@ -4000,7 +4010,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1EnableConsumerResponse();
       var od = api.V1EnableConsumerResponse.fromJson(o.toJson());
-      checkV1EnableConsumerResponse(od);
+      checkV1EnableConsumerResponse(od as api.V1EnableConsumerResponse);
     });
   });
 
@@ -4008,7 +4018,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1GenerateDefaultIdentityResponse();
       var od = api.V1GenerateDefaultIdentityResponse.fromJson(o.toJson());
-      checkV1GenerateDefaultIdentityResponse(od);
+      checkV1GenerateDefaultIdentityResponse(
+          od as api.V1GenerateDefaultIdentityResponse);
     });
   });
 
@@ -4016,7 +4027,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1GenerateServiceAccountResponse();
       var od = api.V1GenerateServiceAccountResponse.fromJson(o.toJson());
-      checkV1GenerateServiceAccountResponse(od);
+      checkV1GenerateServiceAccountResponse(
+          od as api.V1GenerateServiceAccountResponse);
     });
   });
 
@@ -4024,7 +4036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1RefreshConsumerResponse();
       var od = api.V1RefreshConsumerResponse.fromJson(o.toJson());
-      checkV1RefreshConsumerResponse(od);
+      checkV1RefreshConsumerResponse(od as api.V1RefreshConsumerResponse);
     });
   });
 
@@ -4032,7 +4044,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1RemoveVisibilityLabelsResponse();
       var od = api.V1RemoveVisibilityLabelsResponse.fromJson(o.toJson());
-      checkV1RemoveVisibilityLabelsResponse(od);
+      checkV1RemoveVisibilityLabelsResponse(
+          od as api.V1RemoveVisibilityLabelsResponse);
     });
   });
 
@@ -4040,7 +4053,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildV1ServiceAccount();
       var od = api.V1ServiceAccount.fromJson(o.toJson());
-      checkV1ServiceAccount(od);
+      checkV1ServiceAccount(od as api.V1ServiceAccount);
     });
   });
 
@@ -4052,8 +4065,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4093,7 +4107,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4141,7 +4155,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4189,7 +4203,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4249,7 +4263,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -4311,7 +4325,8 @@
               query: arg_query,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchTenancyUnitsResponse(response);
+        checkSearchTenancyUnitsResponse(
+            response as api.SearchTenancyUnitsResponse);
       })));
     });
   });
@@ -4324,8 +4339,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddTenantProjectRequest.fromJson(json);
-        checkAddTenantProjectRequest(obj);
+        var obj = api.AddTenantProjectRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddTenantProjectRequest(obj as api.AddTenantProjectRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4365,7 +4381,7 @@
       res
           .addProject(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4376,8 +4392,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ApplyTenantProjectConfigRequest.fromJson(json);
-        checkApplyTenantProjectConfigRequest(obj);
+        var obj = api.ApplyTenantProjectConfigRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkApplyTenantProjectConfigRequest(
+            obj as api.ApplyTenantProjectConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4417,7 +4435,7 @@
       res
           .applyProjectConfig(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4428,8 +4446,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AttachTenantProjectRequest.fromJson(json);
-        checkAttachTenantProjectRequest(obj);
+        var obj = api.AttachTenantProjectRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAttachTenantProjectRequest(obj as api.AttachTenantProjectRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4469,7 +4488,7 @@
       res
           .attachProject(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4480,8 +4499,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateTenancyUnitRequest.fromJson(json);
-        checkCreateTenancyUnitRequest(obj);
+        var obj = api.CreateTenancyUnitRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateTenancyUnitRequest(obj as api.CreateTenancyUnitRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4521,7 +4541,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTenancyUnit(response);
+        checkTenancyUnit(response as api.TenancyUnit);
       })));
     });
 
@@ -4569,7 +4589,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4580,8 +4600,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DeleteTenantProjectRequest.fromJson(json);
-        checkDeleteTenantProjectRequest(obj);
+        var obj = api.DeleteTenantProjectRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDeleteTenantProjectRequest(obj as api.DeleteTenantProjectRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4621,7 +4642,7 @@
       res
           .deleteProject(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4681,7 +4702,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTenancyUnitsResponse(response);
+        checkListTenancyUnitsResponse(response as api.ListTenancyUnitsResponse);
       })));
     });
 
@@ -4692,8 +4713,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemoveTenantProjectRequest.fromJson(json);
-        checkRemoveTenantProjectRequest(obj);
+        var obj = api.RemoveTenantProjectRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemoveTenantProjectRequest(obj as api.RemoveTenantProjectRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4733,7 +4755,7 @@
       res
           .removeProject(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4744,8 +4766,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteTenantProjectRequest.fromJson(json);
-        checkUndeleteTenantProjectRequest(obj);
+        var obj = api.UndeleteTenantProjectRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteTenantProjectRequest(
+            obj as api.UndeleteTenantProjectRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4785,7 +4809,7 @@
       res
           .undeleteProject(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/servicecontrol/v1_test.dart b/generated/googleapis/test/servicecontrol/v1_test.dart
index 3c1bcbb..e80d77d 100644
--- a/generated/googleapis/test/servicecontrol/v1_test.dart
+++ b/generated/googleapis/test/servicecontrol/v1_test.dart
@@ -121,7 +121,7 @@
 void checkAllocateQuotaRequest(api.AllocateQuotaRequest o) {
   buildCounterAllocateQuotaRequest++;
   if (buildCounterAllocateQuotaRequest < 3) {
-    checkQuotaOperation(o.allocateOperation);
+    checkQuotaOperation(o.allocateOperation as api.QuotaOperation);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
   }
   buildCounterAllocateQuotaRequest--;
@@ -136,8 +136,8 @@
 
 void checkUnnamed2120(core.List<api.QuotaError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaError(o[0]);
-  checkQuotaError(o[1]);
+  checkQuotaError(o[0] as api.QuotaError);
+  checkQuotaError(o[1] as api.QuotaError);
 }
 
 core.List<api.MetricValueSet> buildUnnamed2121() {
@@ -149,8 +149,8 @@
 
 void checkUnnamed2121(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricValueSet(o[0]);
-  checkMetricValueSet(o[1]);
+  checkMetricValueSet(o[0] as api.MetricValueSet);
+  checkMetricValueSet(o[1] as api.MetricValueSet);
 }
 
 core.int buildCounterAllocateQuotaResponse = 0;
@@ -172,7 +172,7 @@
   buildCounterAllocateQuotaResponse++;
   if (buildCounterAllocateQuotaResponse < 3) {
     checkUnnamed2120(o.allocateErrors);
-    checkAllocateInfo(o.allocateInfo);
+    checkAllocateInfo(o.allocateInfo as api.AllocateInfo);
     unittest.expect(o.operationId, unittest.equals('foo'));
     checkUnnamed2121(o.quotaMetrics);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
@@ -198,7 +198,7 @@
   if (buildCounterAttributeValue < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
     unittest.expect(o.intValue, unittest.equals('foo'));
-    checkTruncatableString(o.stringValue);
+    checkTruncatableString(o.stringValue as api.TruncatableString);
   }
   buildCounterAttributeValue--;
 }
@@ -212,8 +212,8 @@
 
 void checkUnnamed2122(core.Map<core.String, api.AttributeValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAttributeValue(o['x']);
-  checkAttributeValue(o['y']);
+  checkAttributeValue(o['x'] as api.AttributeValue);
+  checkAttributeValue(o['y'] as api.AttributeValue);
 }
 
 core.int buildCounterAttributes = 0;
@@ -246,8 +246,8 @@
 
 void checkUnnamed2123(core.List<api.AuthorizationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthorizationInfo(o[0]);
-  checkAuthorizationInfo(o[1]);
+  checkAuthorizationInfo(o[0] as api.AuthorizationInfo);
+  checkAuthorizationInfo(o[1] as api.AuthorizationInfo);
 }
 
 core.Map<core.String, core.Object> buildUnnamed2124() {
@@ -422,20 +422,20 @@
 void checkAuditLog(api.AuditLog o) {
   buildCounterAuditLog++;
   if (buildCounterAuditLog < 3) {
-    checkAuthenticationInfo(o.authenticationInfo);
+    checkAuthenticationInfo(o.authenticationInfo as api.AuthenticationInfo);
     checkUnnamed2123(o.authorizationInfo);
     checkUnnamed2124(o.metadata);
     unittest.expect(o.methodName, unittest.equals('foo'));
     unittest.expect(o.numResponseItems, unittest.equals('foo'));
     checkUnnamed2125(o.request);
-    checkRequestMetadata(o.requestMetadata);
-    checkResourceLocation(o.resourceLocation);
+    checkRequestMetadata(o.requestMetadata as api.RequestMetadata);
+    checkResourceLocation(o.resourceLocation as api.ResourceLocation);
     unittest.expect(o.resourceName, unittest.equals('foo'));
     checkUnnamed2126(o.resourceOriginalState);
     checkUnnamed2127(o.response);
     checkUnnamed2128(o.serviceData);
     unittest.expect(o.serviceName, unittest.equals('foo'));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
   }
   buildCounterAuditLog--;
 }
@@ -531,8 +531,8 @@
 
 void checkUnnamed2132(core.List<api.ServiceAccountDelegationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkServiceAccountDelegationInfo(o[0]);
-  checkServiceAccountDelegationInfo(o[1]);
+  checkServiceAccountDelegationInfo(o[0] as api.ServiceAccountDelegationInfo);
+  checkServiceAccountDelegationInfo(o[1] as api.ServiceAccountDelegationInfo);
 }
 
 core.Map<core.String, core.Object> buildUnnamed2133() {
@@ -613,7 +613,7 @@
     unittest.expect(o.granted, unittest.isTrue);
     unittest.expect(o.permission, unittest.equals('foo'));
     unittest.expect(o.resource, unittest.equals('foo'));
-    checkResource(o.resourceAttributes);
+    checkResource(o.resourceAttributes as api.Resource);
   }
   buildCounterAuthorizationInfo--;
 }
@@ -637,7 +637,7 @@
   if (buildCounterCheckError < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.detail, unittest.equals('foo'));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
     unittest.expect(o.subject, unittest.equals('foo'));
   }
   buildCounterCheckError--;
@@ -671,7 +671,7 @@
 void checkCheckInfo(api.CheckInfo o) {
   buildCounterCheckInfo++;
   if (buildCounterCheckInfo < 3) {
-    checkConsumerInfo(o.consumerInfo);
+    checkConsumerInfo(o.consumerInfo as api.ConsumerInfo);
     checkUnnamed2134(o.unusedArguments);
   }
   buildCounterCheckInfo--;
@@ -694,7 +694,7 @@
 void checkCheckRequest(api.CheckRequest o) {
   buildCounterCheckRequest++;
   if (buildCounterCheckRequest < 3) {
-    checkOperation(o.operation);
+    checkOperation(o.operation as api.Operation);
     unittest.expect(o.requestProjectSettings, unittest.isTrue);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
     unittest.expect(o.skipActivationCheck, unittest.isTrue);
@@ -711,8 +711,8 @@
 
 void checkUnnamed2135(core.List<api.CheckError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCheckError(o[0]);
-  checkCheckError(o[1]);
+  checkCheckError(o[0] as api.CheckError);
+  checkCheckError(o[1] as api.CheckError);
 }
 
 core.int buildCounterCheckResponse = 0;
@@ -735,9 +735,9 @@
   buildCounterCheckResponse++;
   if (buildCounterCheckResponse < 3) {
     checkUnnamed2135(o.checkErrors);
-    checkCheckInfo(o.checkInfo);
+    checkCheckInfo(o.checkInfo as api.CheckInfo);
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkQuotaInfo(o.quotaInfo);
+    checkQuotaInfo(o.quotaInfo as api.QuotaInfo);
     unittest.expect(o.serviceConfigId, unittest.equals('foo'));
     unittest.expect(o.serviceRolloutId, unittest.equals('foo'));
   }
@@ -789,8 +789,8 @@
 
 void checkUnnamed2137(core.List<api.Exemplar> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExemplar(o[0]);
-  checkExemplar(o[1]);
+  checkExemplar(o[0] as api.Exemplar);
+  checkExemplar(o[1] as api.Exemplar);
 }
 
 core.int buildCounterDistribution = 0;
@@ -819,9 +819,9 @@
     checkUnnamed2136(o.bucketCounts);
     unittest.expect(o.count, unittest.equals('foo'));
     checkUnnamed2137(o.exemplars);
-    checkExplicitBuckets(o.explicitBuckets);
-    checkExponentialBuckets(o.exponentialBuckets);
-    checkLinearBuckets(o.linearBuckets);
+    checkExplicitBuckets(o.explicitBuckets as api.ExplicitBuckets);
+    checkExponentialBuckets(o.exponentialBuckets as api.ExponentialBuckets);
+    checkLinearBuckets(o.linearBuckets as api.LinearBuckets);
     unittest.expect(o.maximum, unittest.equals(42.0));
     unittest.expect(o.mean, unittest.equals(42.0));
     unittest.expect(o.minimum, unittest.equals(42.0));
@@ -1166,14 +1166,14 @@
 void checkLogEntry(api.LogEntry o) {
   buildCounterLogEntry++;
   if (buildCounterLogEntry < 3) {
-    checkHttpRequest(o.httpRequest);
+    checkHttpRequest(o.httpRequest as api.HttpRequest);
     unittest.expect(o.insertId, unittest.equals('foo'));
     checkUnnamed2142(o.labels);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkLogEntryOperation(o.operation);
+    checkLogEntryOperation(o.operation as api.LogEntryOperation);
     checkUnnamed2143(o.protoPayload);
     unittest.expect(o.severity, unittest.equals('foo'));
-    checkLogEntrySourceLocation(o.sourceLocation);
+    checkLogEntrySourceLocation(o.sourceLocation as api.LogEntrySourceLocation);
     checkUnnamed2144(o.structPayload);
     unittest.expect(o.textPayload, unittest.equals('foo'));
     unittest.expect(o.timestamp, unittest.equals('foo'));
@@ -1266,12 +1266,12 @@
   buildCounterMetricValue++;
   if (buildCounterMetricValue < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
-    checkDistribution(o.distributionValue);
+    checkDistribution(o.distributionValue as api.Distribution);
     unittest.expect(o.doubleValue, unittest.equals(42.0));
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.int64Value, unittest.equals('foo'));
     checkUnnamed2145(o.labels);
-    checkMoney(o.moneyValue);
+    checkMoney(o.moneyValue as api.Money);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.stringValue, unittest.equals('foo'));
   }
@@ -1287,8 +1287,8 @@
 
 void checkUnnamed2146(core.List<api.MetricValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricValue(o[0]);
-  checkMetricValue(o[1]);
+  checkMetricValue(o[0] as api.MetricValue);
+  checkMetricValue(o[1] as api.MetricValue);
 }
 
 core.int buildCounterMetricValueSet = 0;
@@ -1399,8 +1399,8 @@
 
 void checkUnnamed2150(core.List<api.LogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogEntry(o[0]);
-  checkLogEntry(o[1]);
+  checkLogEntry(o[0] as api.LogEntry);
+  checkLogEntry(o[1] as api.LogEntry);
 }
 
 core.List<api.MetricValueSet> buildUnnamed2151() {
@@ -1412,8 +1412,8 @@
 
 void checkUnnamed2151(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricValueSet(o[0]);
-  checkMetricValueSet(o[1]);
+  checkMetricValueSet(o[0] as api.MetricValueSet);
+  checkMetricValueSet(o[1] as api.MetricValueSet);
 }
 
 core.List<api.ResourceInfo> buildUnnamed2152() {
@@ -1425,8 +1425,8 @@
 
 void checkUnnamed2152(core.List<api.ResourceInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResourceInfo(o[0]);
-  checkResourceInfo(o[1]);
+  checkResourceInfo(o[0] as api.ResourceInfo);
+  checkResourceInfo(o[1] as api.ResourceInfo);
 }
 
 core.List<api.TraceSpan> buildUnnamed2153() {
@@ -1438,8 +1438,8 @@
 
 void checkUnnamed2153(core.List<api.TraceSpan> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTraceSpan(o[0]);
-  checkTraceSpan(o[1]);
+  checkTraceSpan(o[0] as api.TraceSpan);
+  checkTraceSpan(o[1] as api.TraceSpan);
 }
 
 core.Map<core.String, core.String> buildUnnamed2154() {
@@ -1491,7 +1491,7 @@
     checkUnnamed2151(o.metricValueSets);
     unittest.expect(o.operationId, unittest.equals('foo'));
     unittest.expect(o.operationName, unittest.equals('foo'));
-    checkQuotaProperties(o.quotaProperties);
+    checkQuotaProperties(o.quotaProperties as api.QuotaProperties);
     checkUnnamed2152(o.resources);
     unittest.expect(o.startTime, unittest.equals('foo'));
     checkUnnamed2153(o.traceSpans);
@@ -1598,8 +1598,8 @@
 
 void checkUnnamed2158(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricValueSet(o[0]);
-  checkMetricValueSet(o[1]);
+  checkMetricValueSet(o[0] as api.MetricValueSet);
+  checkMetricValueSet(o[1] as api.MetricValueSet);
 }
 
 core.int buildCounterQuotaInfo = 0;
@@ -1647,8 +1647,8 @@
 
 void checkUnnamed2160(core.List<api.MetricValueSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricValueSet(o[0]);
-  checkMetricValueSet(o[1]);
+  checkMetricValueSet(o[0] as api.MetricValueSet);
+  checkMetricValueSet(o[1] as api.MetricValueSet);
 }
 
 core.int buildCounterQuotaOperation = 0;
@@ -1715,7 +1715,7 @@
   buildCounterReportError++;
   if (buildCounterReportError < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
   }
   buildCounterReportError--;
 }
@@ -1736,7 +1736,7 @@
   buildCounterReportInfo++;
   if (buildCounterReportInfo < 3) {
     unittest.expect(o.operationId, unittest.equals('foo'));
-    checkQuotaInfo(o.quotaInfo);
+    checkQuotaInfo(o.quotaInfo as api.QuotaInfo);
   }
   buildCounterReportInfo--;
 }
@@ -1750,8 +1750,8 @@
 
 void checkUnnamed2161(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterReportRequest = 0;
@@ -1784,8 +1784,8 @@
 
 void checkUnnamed2162(core.List<api.ReportError> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportError(o[0]);
-  checkReportError(o[1]);
+  checkReportError(o[0] as api.ReportError);
+  checkReportError(o[1] as api.ReportError);
 }
 
 core.List<api.ReportInfo> buildUnnamed2163() {
@@ -1797,8 +1797,8 @@
 
 void checkUnnamed2163(core.List<api.ReportInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportInfo(o[0]);
-  checkReportInfo(o[1]);
+  checkReportInfo(o[0] as api.ReportInfo);
+  checkReportInfo(o[1] as api.ReportInfo);
 }
 
 core.int buildCounterReportResponse = 0;
@@ -1864,7 +1864,7 @@
 void checkRequest(api.Request o) {
   buildCounterRequest++;
   if (buildCounterRequest < 3) {
-    checkAuth(o.auth);
+    checkAuth(o.auth as api.Auth);
     checkUnnamed2164(o.headers);
     unittest.expect(o.host, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
@@ -1901,8 +1901,8 @@
     unittest.expect(o.callerIp, unittest.equals('foo'));
     unittest.expect(o.callerNetwork, unittest.equals('foo'));
     unittest.expect(o.callerSuppliedUserAgent, unittest.equals('foo'));
-    checkPeer(o.destinationAttributes);
-    checkRequest(o.requestAttributes);
+    checkPeer(o.destinationAttributes as api.Peer);
+    checkRequest(o.requestAttributes as api.Request);
   }
   buildCounterRequestMetadata--;
 }
@@ -2030,8 +2030,8 @@
 void checkServiceAccountDelegationInfo(api.ServiceAccountDelegationInfo o) {
   buildCounterServiceAccountDelegationInfo++;
   if (buildCounterServiceAccountDelegationInfo < 3) {
-    checkFirstPartyPrincipal(o.firstPartyPrincipal);
-    checkThirdPartyPrincipal(o.thirdPartyPrincipal);
+    checkFirstPartyPrincipal(o.firstPartyPrincipal as api.FirstPartyPrincipal);
+    checkThirdPartyPrincipal(o.thirdPartyPrincipal as api.ThirdPartyPrincipal);
   }
   buildCounterServiceAccountDelegationInfo--;
 }
@@ -2192,9 +2192,9 @@
 void checkTraceSpan(api.TraceSpan o) {
   buildCounterTraceSpan++;
   if (buildCounterTraceSpan < 3) {
-    checkAttributes(o.attributes);
+    checkAttributes(o.attributes as api.Attributes);
     unittest.expect(o.childSpanCount, unittest.equals(42));
-    checkTruncatableString(o.displayName);
+    checkTruncatableString(o.displayName as api.TruncatableString);
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parentSpanId, unittest.equals('foo'));
@@ -2202,7 +2202,7 @@
     unittest.expect(o.spanId, unittest.equals('foo'));
     unittest.expect(o.spanKind, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
   }
   buildCounterTraceSpan--;
 }
@@ -2233,7 +2233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAllocateInfo();
       var od = api.AllocateInfo.fromJson(o.toJson());
-      checkAllocateInfo(od);
+      checkAllocateInfo(od as api.AllocateInfo);
     });
   });
 
@@ -2241,7 +2241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAllocateQuotaRequest();
       var od = api.AllocateQuotaRequest.fromJson(o.toJson());
-      checkAllocateQuotaRequest(od);
+      checkAllocateQuotaRequest(od as api.AllocateQuotaRequest);
     });
   });
 
@@ -2249,7 +2249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAllocateQuotaResponse();
       var od = api.AllocateQuotaResponse.fromJson(o.toJson());
-      checkAllocateQuotaResponse(od);
+      checkAllocateQuotaResponse(od as api.AllocateQuotaResponse);
     });
   });
 
@@ -2257,7 +2257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttributeValue();
       var od = api.AttributeValue.fromJson(o.toJson());
-      checkAttributeValue(od);
+      checkAttributeValue(od as api.AttributeValue);
     });
   });
 
@@ -2265,7 +2265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAttributes();
       var od = api.Attributes.fromJson(o.toJson());
-      checkAttributes(od);
+      checkAttributes(od as api.Attributes);
     });
   });
 
@@ -2273,7 +2273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLog();
       var od = api.AuditLog.fromJson(o.toJson());
-      checkAuditLog(od);
+      checkAuditLog(od as api.AuditLog);
     });
   });
 
@@ -2281,7 +2281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuth();
       var od = api.Auth.fromJson(o.toJson());
-      checkAuth(od);
+      checkAuth(od as api.Auth);
     });
   });
 
@@ -2289,7 +2289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthenticationInfo();
       var od = api.AuthenticationInfo.fromJson(o.toJson());
-      checkAuthenticationInfo(od);
+      checkAuthenticationInfo(od as api.AuthenticationInfo);
     });
   });
 
@@ -2297,7 +2297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthorizationInfo();
       var od = api.AuthorizationInfo.fromJson(o.toJson());
-      checkAuthorizationInfo(od);
+      checkAuthorizationInfo(od as api.AuthorizationInfo);
     });
   });
 
@@ -2305,7 +2305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckError();
       var od = api.CheckError.fromJson(o.toJson());
-      checkCheckError(od);
+      checkCheckError(od as api.CheckError);
     });
   });
 
@@ -2313,7 +2313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckInfo();
       var od = api.CheckInfo.fromJson(o.toJson());
-      checkCheckInfo(od);
+      checkCheckInfo(od as api.CheckInfo);
     });
   });
 
@@ -2321,7 +2321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckRequest();
       var od = api.CheckRequest.fromJson(o.toJson());
-      checkCheckRequest(od);
+      checkCheckRequest(od as api.CheckRequest);
     });
   });
 
@@ -2329,7 +2329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCheckResponse();
       var od = api.CheckResponse.fromJson(o.toJson());
-      checkCheckResponse(od);
+      checkCheckResponse(od as api.CheckResponse);
     });
   });
 
@@ -2337,7 +2337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConsumerInfo();
       var od = api.ConsumerInfo.fromJson(o.toJson());
-      checkConsumerInfo(od);
+      checkConsumerInfo(od as api.ConsumerInfo);
     });
   });
 
@@ -2345,7 +2345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDistribution();
       var od = api.Distribution.fromJson(o.toJson());
-      checkDistribution(od);
+      checkDistribution(od as api.Distribution);
     });
   });
 
@@ -2353,7 +2353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExemplar();
       var od = api.Exemplar.fromJson(o.toJson());
-      checkExemplar(od);
+      checkExemplar(od as api.Exemplar);
     });
   });
 
@@ -2361,7 +2361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExplicitBuckets();
       var od = api.ExplicitBuckets.fromJson(o.toJson());
-      checkExplicitBuckets(od);
+      checkExplicitBuckets(od as api.ExplicitBuckets);
     });
   });
 
@@ -2369,7 +2369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExponentialBuckets();
       var od = api.ExponentialBuckets.fromJson(o.toJson());
-      checkExponentialBuckets(od);
+      checkExponentialBuckets(od as api.ExponentialBuckets);
     });
   });
 
@@ -2377,7 +2377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFirstPartyPrincipal();
       var od = api.FirstPartyPrincipal.fromJson(o.toJson());
-      checkFirstPartyPrincipal(od);
+      checkFirstPartyPrincipal(od as api.FirstPartyPrincipal);
     });
   });
 
@@ -2385,7 +2385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRequest();
       var od = api.HttpRequest.fromJson(o.toJson());
-      checkHttpRequest(od);
+      checkHttpRequest(od as api.HttpRequest);
     });
   });
 
@@ -2393,7 +2393,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLinearBuckets();
       var od = api.LinearBuckets.fromJson(o.toJson());
-      checkLinearBuckets(od);
+      checkLinearBuckets(od as api.LinearBuckets);
     });
   });
 
@@ -2401,7 +2401,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogEntry();
       var od = api.LogEntry.fromJson(o.toJson());
-      checkLogEntry(od);
+      checkLogEntry(od as api.LogEntry);
     });
   });
 
@@ -2409,7 +2409,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogEntryOperation();
       var od = api.LogEntryOperation.fromJson(o.toJson());
-      checkLogEntryOperation(od);
+      checkLogEntryOperation(od as api.LogEntryOperation);
     });
   });
 
@@ -2417,7 +2417,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogEntrySourceLocation();
       var od = api.LogEntrySourceLocation.fromJson(o.toJson());
-      checkLogEntrySourceLocation(od);
+      checkLogEntrySourceLocation(od as api.LogEntrySourceLocation);
     });
   });
 
@@ -2425,7 +2425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricValue();
       var od = api.MetricValue.fromJson(o.toJson());
-      checkMetricValue(od);
+      checkMetricValue(od as api.MetricValue);
     });
   });
 
@@ -2433,7 +2433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricValueSet();
       var od = api.MetricValueSet.fromJson(o.toJson());
-      checkMetricValueSet(od);
+      checkMetricValueSet(od as api.MetricValueSet);
     });
   });
 
@@ -2441,7 +2441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoney();
       var od = api.Money.fromJson(o.toJson());
-      checkMoney(od);
+      checkMoney(od as api.Money);
     });
   });
 
@@ -2449,7 +2449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -2457,7 +2457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPeer();
       var od = api.Peer.fromJson(o.toJson());
-      checkPeer(od);
+      checkPeer(od as api.Peer);
     });
   });
 
@@ -2465,7 +2465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaError();
       var od = api.QuotaError.fromJson(o.toJson());
-      checkQuotaError(od);
+      checkQuotaError(od as api.QuotaError);
     });
   });
 
@@ -2473,7 +2473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaInfo();
       var od = api.QuotaInfo.fromJson(o.toJson());
-      checkQuotaInfo(od);
+      checkQuotaInfo(od as api.QuotaInfo);
     });
   });
 
@@ -2481,7 +2481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaOperation();
       var od = api.QuotaOperation.fromJson(o.toJson());
-      checkQuotaOperation(od);
+      checkQuotaOperation(od as api.QuotaOperation);
     });
   });
 
@@ -2489,7 +2489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaProperties();
       var od = api.QuotaProperties.fromJson(o.toJson());
-      checkQuotaProperties(od);
+      checkQuotaProperties(od as api.QuotaProperties);
     });
   });
 
@@ -2497,7 +2497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportError();
       var od = api.ReportError.fromJson(o.toJson());
-      checkReportError(od);
+      checkReportError(od as api.ReportError);
     });
   });
 
@@ -2505,7 +2505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportInfo();
       var od = api.ReportInfo.fromJson(o.toJson());
-      checkReportInfo(od);
+      checkReportInfo(od as api.ReportInfo);
     });
   });
 
@@ -2513,7 +2513,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportRequest();
       var od = api.ReportRequest.fromJson(o.toJson());
-      checkReportRequest(od);
+      checkReportRequest(od as api.ReportRequest);
     });
   });
 
@@ -2521,7 +2521,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportResponse();
       var od = api.ReportResponse.fromJson(o.toJson());
-      checkReportResponse(od);
+      checkReportResponse(od as api.ReportResponse);
     });
   });
 
@@ -2529,7 +2529,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequest();
       var od = api.Request.fromJson(o.toJson());
-      checkRequest(od);
+      checkRequest(od as api.Request);
     });
   });
 
@@ -2537,7 +2537,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequestMetadata();
       var od = api.RequestMetadata.fromJson(o.toJson());
-      checkRequestMetadata(od);
+      checkRequestMetadata(od as api.RequestMetadata);
     });
   });
 
@@ -2545,7 +2545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResource();
       var od = api.Resource.fromJson(o.toJson());
-      checkResource(od);
+      checkResource(od as api.Resource);
     });
   });
 
@@ -2553,7 +2553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceInfo();
       var od = api.ResourceInfo.fromJson(o.toJson());
-      checkResourceInfo(od);
+      checkResourceInfo(od as api.ResourceInfo);
     });
   });
 
@@ -2561,7 +2561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceLocation();
       var od = api.ResourceLocation.fromJson(o.toJson());
-      checkResourceLocation(od);
+      checkResourceLocation(od as api.ResourceLocation);
     });
   });
 
@@ -2569,7 +2569,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccountDelegationInfo();
       var od = api.ServiceAccountDelegationInfo.fromJson(o.toJson());
-      checkServiceAccountDelegationInfo(od);
+      checkServiceAccountDelegationInfo(od as api.ServiceAccountDelegationInfo);
     });
   });
 
@@ -2577,7 +2577,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpanContext();
       var od = api.SpanContext.fromJson(o.toJson());
-      checkSpanContext(od);
+      checkSpanContext(od as api.SpanContext);
     });
   });
 
@@ -2585,7 +2585,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -2593,7 +2593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyPrincipal();
       var od = api.ThirdPartyPrincipal.fromJson(o.toJson());
-      checkThirdPartyPrincipal(od);
+      checkThirdPartyPrincipal(od as api.ThirdPartyPrincipal);
     });
   });
 
@@ -2601,7 +2601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTraceSpan();
       var od = api.TraceSpan.fromJson(o.toJson());
-      checkTraceSpan(od);
+      checkTraceSpan(od as api.TraceSpan);
     });
   });
 
@@ -2609,7 +2609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTruncatableString();
       var od = api.TruncatableString.fromJson(o.toJson());
-      checkTruncatableString(od);
+      checkTruncatableString(od as api.TruncatableString);
     });
   });
 
@@ -2621,8 +2621,9 @@
       var arg_serviceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AllocateQuotaRequest.fromJson(json);
-        checkAllocateQuotaRequest(obj);
+        var obj = api.AllocateQuotaRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAllocateQuotaRequest(obj as api.AllocateQuotaRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2670,7 +2671,7 @@
       res
           .allocateQuota(arg_request, arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAllocateQuotaResponse(response);
+        checkAllocateQuotaResponse(response as api.AllocateQuotaResponse);
       })));
     });
 
@@ -2681,8 +2682,9 @@
       var arg_serviceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CheckRequest.fromJson(json);
-        checkCheckRequest(obj);
+        var obj = api.CheckRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCheckRequest(obj as api.CheckRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2730,7 +2732,7 @@
       res
           .check(arg_request, arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCheckResponse(response);
+        checkCheckResponse(response as api.CheckResponse);
       })));
     });
 
@@ -2741,8 +2743,9 @@
       var arg_serviceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReportRequest.fromJson(json);
-        checkReportRequest(obj);
+        var obj = api.ReportRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReportRequest(obj as api.ReportRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2790,7 +2793,7 @@
       res
           .report(arg_request, arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReportResponse(response);
+        checkReportResponse(response as api.ReportResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/servicemanagement/v1_test.dart b/generated/googleapis/test/servicemanagement/v1_test.dart
index c409381..6252a45 100644
--- a/generated/googleapis/test/servicemanagement/v1_test.dart
+++ b/generated/googleapis/test/servicemanagement/v1_test.dart
@@ -102,8 +102,8 @@
 
 void checkUnnamed4726(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMethod(o[0]);
-  checkMethod(o[1]);
+  checkMethod(o[0] as api.Method);
+  checkMethod(o[1] as api.Method);
 }
 
 core.List<api.Mixin> buildUnnamed4727() {
@@ -115,8 +115,8 @@
 
 void checkUnnamed4727(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMixin(o[0]);
-  checkMixin(o[1]);
+  checkMixin(o[0] as api.Mixin);
+  checkMixin(o[1] as api.Mixin);
 }
 
 core.List<api.Option> buildUnnamed4728() {
@@ -128,8 +128,8 @@
 
 void checkUnnamed4728(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterApi = 0;
@@ -156,7 +156,7 @@
     checkUnnamed4727(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4728(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -172,8 +172,8 @@
 
 void checkUnnamed4729(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -240,8 +240,8 @@
 
 void checkUnnamed4731(core.List<api.JwtLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJwtLocation(o[0]);
-  checkJwtLocation(o[1]);
+  checkJwtLocation(o[0] as api.JwtLocation);
+  checkJwtLocation(o[1] as api.JwtLocation);
 }
 
 core.int buildCounterAuthProvider = 0;
@@ -303,8 +303,8 @@
 
 void checkUnnamed4732(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthProvider(o[0]);
-  checkAuthProvider(o[1]);
+  checkAuthProvider(o[0] as api.AuthProvider);
+  checkAuthProvider(o[1] as api.AuthProvider);
 }
 
 core.List<api.AuthenticationRule> buildUnnamed4733() {
@@ -316,8 +316,8 @@
 
 void checkUnnamed4733(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthenticationRule(o[0]);
-  checkAuthenticationRule(o[1]);
+  checkAuthenticationRule(o[0] as api.AuthenticationRule);
+  checkAuthenticationRule(o[1] as api.AuthenticationRule);
 }
 
 core.int buildCounterAuthentication = 0;
@@ -350,8 +350,8 @@
 
 void checkUnnamed4734(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthRequirement(o[0]);
-  checkAuthRequirement(o[1]);
+  checkAuthRequirement(o[0] as api.AuthRequirement);
+  checkAuthRequirement(o[1] as api.AuthRequirement);
 }
 
 core.int buildCounterAuthenticationRule = 0;
@@ -372,7 +372,7 @@
   buildCounterAuthenticationRule++;
   if (buildCounterAuthenticationRule < 3) {
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
-    checkOAuthRequirements(o.oauth);
+    checkOAuthRequirements(o.oauth as api.OAuthRequirements);
     checkUnnamed4734(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
@@ -388,8 +388,8 @@
 
 void checkUnnamed4735(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendRule(o[0]);
-  checkBackendRule(o[1]);
+  checkBackendRule(o[0] as api.BackendRule);
+  checkBackendRule(o[1] as api.BackendRule);
 }
 
 core.int buildCounterBackend = 0;
@@ -455,8 +455,8 @@
 
 void checkUnnamed4736(core.List<api.BillingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBillingDestination(o[0]);
-  checkBillingDestination(o[1]);
+  checkBillingDestination(o[0] as api.BillingDestination);
+  checkBillingDestination(o[1] as api.BillingDestination);
 }
 
 core.int buildCounterBilling = 0;
@@ -541,7 +541,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed4738(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -557,8 +557,8 @@
 
 void checkUnnamed4739(core.List<api.ConfigChange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConfigChange(o[0]);
-  checkConfigChange(o[1]);
+  checkConfigChange(o[0] as api.ConfigChange);
+  checkConfigChange(o[1] as api.ConfigChange);
 }
 
 core.int buildCounterChangeReport = 0;
@@ -589,8 +589,8 @@
 
 void checkUnnamed4740(core.List<api.Advice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdvice(o[0]);
-  checkAdvice(o[1]);
+  checkAdvice(o[0] as api.Advice);
+  checkAdvice(o[1] as api.Advice);
 }
 
 core.int buildCounterConfigChange = 0;
@@ -671,8 +671,8 @@
 
 void checkUnnamed4741(core.List<api.ConfigFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConfigFile(o[0]);
-  checkConfigFile(o[1]);
+  checkConfigFile(o[0] as api.ConfigFile);
+  checkConfigFile(o[1] as api.ConfigFile);
 }
 
 core.int buildCounterConfigSource = 0;
@@ -705,8 +705,8 @@
 
 void checkUnnamed4742(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContextRule(o[0]);
-  checkContextRule(o[1]);
+  checkContextRule(o[0] as api.ContextRule);
+  checkContextRule(o[1] as api.ContextRule);
 }
 
 core.int buildCounterContext = 0;
@@ -835,8 +835,8 @@
 
 void checkUnnamed4747(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomErrorRule(o[0]);
-  checkCustomErrorRule(o[1]);
+  checkCustomErrorRule(o[0] as api.CustomErrorRule);
+  checkCustomErrorRule(o[1] as api.CustomErrorRule);
 }
 
 core.List<core.String> buildUnnamed4748() {
@@ -977,8 +977,8 @@
 
 void checkUnnamed4749(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.List<api.DocumentationRule> buildUnnamed4750() {
@@ -990,8 +990,8 @@
 
 void checkUnnamed4750(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDocumentationRule(o[0]);
-  checkDocumentationRule(o[1]);
+  checkDocumentationRule(o[0] as api.DocumentationRule);
+  checkDocumentationRule(o[1] as api.DocumentationRule);
 }
 
 core.int buildCounterDocumentation = 0;
@@ -1127,8 +1127,8 @@
 
 void checkUnnamed4752(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnumValue(o[0]);
-  checkEnumValue(o[1]);
+  checkEnumValue(o[0] as api.EnumValue);
+  checkEnumValue(o[1] as api.EnumValue);
 }
 
 core.List<api.Option> buildUnnamed4753() {
@@ -1140,8 +1140,8 @@
 
 void checkUnnamed4753(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnum = 0;
@@ -1165,7 +1165,7 @@
     checkUnnamed4752(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4753(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
@@ -1180,8 +1180,8 @@
 
 void checkUnnamed4754(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnumValue = 0;
@@ -1241,8 +1241,8 @@
 
 void checkUnnamed4755(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterField = 0;
@@ -1391,8 +1391,8 @@
 
 void checkUnnamed4758(core.List<api.ChangeReport> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChangeReport(o[0]);
-  checkChangeReport(o[1]);
+  checkChangeReport(o[0] as api.ChangeReport);
+  checkChangeReport(o[1] as api.ChangeReport);
 }
 
 core.List<api.Diagnostic> buildUnnamed4759() {
@@ -1404,8 +1404,8 @@
 
 void checkUnnamed4759(core.List<api.Diagnostic> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDiagnostic(o[0]);
-  checkDiagnostic(o[1]);
+  checkDiagnostic(o[0] as api.Diagnostic);
+  checkDiagnostic(o[1] as api.Diagnostic);
 }
 
 core.int buildCounterGenerateConfigReportResponse = 0;
@@ -1447,7 +1447,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -1480,8 +1480,8 @@
 
 void checkUnnamed4760(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttp = 0;
@@ -1514,8 +1514,8 @@
 
 void checkUnnamed4761(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttpRule = 0;
@@ -1545,7 +1545,7 @@
     checkUnnamed4761(o.additionalBindings);
     unittest.expect(o.allowHalfDuplex, unittest.isTrue);
     unittest.expect(o.body, unittest.equals('foo'));
-    checkCustomHttpPattern(o.custom);
+    checkCustomHttpPattern(o.custom as api.CustomHttpPattern);
     unittest.expect(o.delete, unittest.equals('foo'));
     unittest.expect(o.get, unittest.equals('foo'));
     unittest.expect(o.patch, unittest.equals('foo'));
@@ -1612,8 +1612,8 @@
 
 void checkUnnamed4762(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1646,8 +1646,8 @@
 
 void checkUnnamed4763(core.List<api.Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkService(o[0]);
-  checkService(o[1]);
+  checkService(o[0] as api.Service);
+  checkService(o[1] as api.Service);
 }
 
 core.int buildCounterListServiceConfigsResponse = 0;
@@ -1680,8 +1680,8 @@
 
 void checkUnnamed4764(core.List<api.Rollout> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRollout(o[0]);
-  checkRollout(o[1]);
+  checkRollout(o[0] as api.Rollout);
+  checkRollout(o[1] as api.Rollout);
 }
 
 core.int buildCounterListServiceRolloutsResponse = 0;
@@ -1714,8 +1714,8 @@
 
 void checkUnnamed4765(core.List<api.ManagedService> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManagedService(o[0]);
-  checkManagedService(o[1]);
+  checkManagedService(o[0] as api.ManagedService);
+  checkManagedService(o[1] as api.ManagedService);
 }
 
 core.int buildCounterListServicesResponse = 0;
@@ -1748,8 +1748,8 @@
 
 void checkUnnamed4766(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterLogDescriptor = 0;
@@ -1786,8 +1786,8 @@
 
 void checkUnnamed4767(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.List<api.LoggingDestination> buildUnnamed4768() {
@@ -1799,8 +1799,8 @@
 
 void checkUnnamed4768(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.int buildCounterLogging = 0;
@@ -1888,8 +1888,8 @@
 
 void checkUnnamed4770(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterMethod = 0;
@@ -1932,8 +1932,8 @@
 
 void checkUnnamed4771(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.List<core.String> buildUnnamed4772() {
@@ -1977,7 +1977,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed4771(o.labels);
     unittest.expect(o.launchStage, unittest.equals('foo'));
-    checkMetricDescriptorMetadata(o.metadata);
+    checkMetricDescriptorMetadata(o.metadata as api.MetricDescriptorMetadata);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     checkUnnamed4772(o.monitoredResourceTypes);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -2075,8 +2075,8 @@
 
 void checkUnnamed4774(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterMonitoredResourceDescriptor = 0;
@@ -2117,8 +2117,8 @@
 
 void checkUnnamed4775(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.List<api.MonitoringDestination> buildUnnamed4776() {
@@ -2130,8 +2130,8 @@
 
 void checkUnnamed4776(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.int buildCounterMonitoring = 0;
@@ -2285,7 +2285,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed4778(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4779(o.response);
@@ -2315,8 +2315,8 @@
 
 void checkUnnamed4781(core.List<api.Step> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStep(o[0]);
-  checkStep(o[1]);
+  checkStep(o[0] as api.Step);
+  checkStep(o[1] as api.Step);
 }
 
 core.int buildCounterOperationMetadata = 0;
@@ -2403,8 +2403,8 @@
 
 void checkUnnamed4783(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.int buildCounterPage = 0;
@@ -2439,8 +2439,8 @@
 
 void checkUnnamed4784(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed4785() {
@@ -2452,8 +2452,8 @@
 
 void checkUnnamed4785(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -2490,8 +2490,8 @@
 
 void checkUnnamed4786(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaLimit(o[0]);
-  checkQuotaLimit(o[1]);
+  checkQuotaLimit(o[0] as api.QuotaLimit);
+  checkQuotaLimit(o[1] as api.QuotaLimit);
 }
 
 core.List<api.MetricRule> buildUnnamed4787() {
@@ -2503,8 +2503,8 @@
 
 void checkUnnamed4787(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricRule(o[0]);
-  checkMetricRule(o[1]);
+  checkMetricRule(o[0] as api.MetricRule);
+  checkMetricRule(o[1] as api.MetricRule);
 }
 
 core.int buildCounterQuota = 0;
@@ -2621,11 +2621,13 @@
   if (buildCounterRollout < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.createdBy, unittest.equals('foo'));
-    checkDeleteServiceStrategy(o.deleteServiceStrategy);
+    checkDeleteServiceStrategy(
+        o.deleteServiceStrategy as api.DeleteServiceStrategy);
     unittest.expect(o.rolloutId, unittest.equals('foo'));
     unittest.expect(o.serviceName, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
-    checkTrafficPercentStrategy(o.trafficPercentStrategy);
+    checkTrafficPercentStrategy(
+        o.trafficPercentStrategy as api.TrafficPercentStrategy);
   }
   buildCounterRollout--;
 }
@@ -2639,8 +2641,8 @@
 
 void checkUnnamed4789(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApi(o[0]);
-  checkApi(o[1]);
+  checkApi(o[0] as api.Api);
+  checkApi(o[1] as api.Api);
 }
 
 core.List<api.Endpoint> buildUnnamed4790() {
@@ -2652,8 +2654,8 @@
 
 void checkUnnamed4790(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEndpoint(o[0]);
-  checkEndpoint(o[1]);
+  checkEndpoint(o[0] as api.Endpoint);
+  checkEndpoint(o[1] as api.Endpoint);
 }
 
 core.List<api.Enum> buildUnnamed4791() {
@@ -2665,8 +2667,8 @@
 
 void checkUnnamed4791(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnum(o[0]);
-  checkEnum(o[1]);
+  checkEnum(o[0] as api.Enum);
+  checkEnum(o[1] as api.Enum);
 }
 
 core.List<api.LogDescriptor> buildUnnamed4792() {
@@ -2678,8 +2680,8 @@
 
 void checkUnnamed4792(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogDescriptor(o[0]);
-  checkLogDescriptor(o[1]);
+  checkLogDescriptor(o[0] as api.LogDescriptor);
+  checkLogDescriptor(o[1] as api.LogDescriptor);
 }
 
 core.List<api.MetricDescriptor> buildUnnamed4793() {
@@ -2691,8 +2693,8 @@
 
 void checkUnnamed4793(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricDescriptor(o[0]);
-  checkMetricDescriptor(o[1]);
+  checkMetricDescriptor(o[0] as api.MetricDescriptor);
+  checkMetricDescriptor(o[1] as api.MetricDescriptor);
 }
 
 core.List<api.MonitoredResourceDescriptor> buildUnnamed4794() {
@@ -2704,8 +2706,8 @@
 
 void checkUnnamed4794(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResourceDescriptor(o[0]);
-  checkMonitoredResourceDescriptor(o[1]);
+  checkMonitoredResourceDescriptor(o[0] as api.MonitoredResourceDescriptor);
+  checkMonitoredResourceDescriptor(o[1] as api.MonitoredResourceDescriptor);
 }
 
 core.List<api.Type> buildUnnamed4795() {
@@ -2717,8 +2719,8 @@
 
 void checkUnnamed4795(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.List<api.Type> buildUnnamed4796() {
@@ -2730,8 +2732,8 @@
 
 void checkUnnamed4796(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.int buildCounterService = 0;
@@ -2775,32 +2777,32 @@
   buildCounterService++;
   if (buildCounterService < 3) {
     checkUnnamed4789(o.apis);
-    checkAuthentication(o.authentication);
-    checkBackend(o.backend);
-    checkBilling(o.billing);
+    checkAuthentication(o.authentication as api.Authentication);
+    checkBackend(o.backend as api.Backend);
+    checkBilling(o.billing as api.Billing);
     unittest.expect(o.configVersion, unittest.equals(42));
-    checkContext(o.context);
-    checkControl(o.control);
-    checkCustomError(o.customError);
-    checkDocumentation(o.documentation);
+    checkContext(o.context as api.Context);
+    checkControl(o.control as api.Control);
+    checkCustomError(o.customError as api.CustomError);
+    checkDocumentation(o.documentation as api.Documentation);
     checkUnnamed4790(o.endpoints);
     checkUnnamed4791(o.enums);
-    checkHttp(o.http);
+    checkHttp(o.http as api.Http);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkLogging(o.logging);
+    checkLogging(o.logging as api.Logging);
     checkUnnamed4792(o.logs);
     checkUnnamed4793(o.metrics);
     checkUnnamed4794(o.monitoredResources);
-    checkMonitoring(o.monitoring);
+    checkMonitoring(o.monitoring as api.Monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
-    checkQuota(o.quota);
-    checkSourceInfo(o.sourceInfo);
-    checkSystemParameters(o.systemParameters);
+    checkQuota(o.quota as api.Quota);
+    checkSourceInfo(o.sourceInfo as api.SourceInfo);
+    checkSystemParameters(o.systemParameters as api.SystemParameters);
     checkUnnamed4795(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkUnnamed4796(o.types);
-    checkUsage(o.usage);
+    checkUsage(o.usage as api.Usage);
   }
   buildCounterService--;
 }
@@ -2843,7 +2845,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -3030,7 +3032,7 @@
 void checkSubmitConfigSourceRequest(api.SubmitConfigSourceRequest o) {
   buildCounterSubmitConfigSourceRequest++;
   if (buildCounterSubmitConfigSourceRequest < 3) {
-    checkConfigSource(o.configSource);
+    checkConfigSource(o.configSource as api.ConfigSource);
     unittest.expect(o.validateOnly, unittest.isTrue);
   }
   buildCounterSubmitConfigSourceRequest--;
@@ -3050,7 +3052,7 @@
 void checkSubmitConfigSourceResponse(api.SubmitConfigSourceResponse o) {
   buildCounterSubmitConfigSourceResponse++;
   if (buildCounterSubmitConfigSourceResponse < 3) {
-    checkService(o.serviceConfig);
+    checkService(o.serviceConfig as api.Service);
   }
   buildCounterSubmitConfigSourceResponse--;
 }
@@ -3087,8 +3089,8 @@
 
 void checkUnnamed4801(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameter(o[0]);
-  checkSystemParameter(o[1]);
+  checkSystemParameter(o[0] as api.SystemParameter);
+  checkSystemParameter(o[1] as api.SystemParameter);
 }
 
 core.int buildCounterSystemParameterRule = 0;
@@ -3121,8 +3123,8 @@
 
 void checkUnnamed4802(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameterRule(o[0]);
-  checkSystemParameterRule(o[1]);
+  checkSystemParameterRule(o[0] as api.SystemParameterRule);
+  checkSystemParameterRule(o[1] as api.SystemParameterRule);
 }
 
 core.int buildCounterSystemParameters = 0;
@@ -3249,8 +3251,8 @@
 
 void checkUnnamed4806(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkField(o[0]);
-  checkField(o[1]);
+  checkField(o[0] as api.Field);
+  checkField(o[1] as api.Field);
 }
 
 core.List<core.String> buildUnnamed4807() {
@@ -3275,8 +3277,8 @@
 
 void checkUnnamed4808(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterType = 0;
@@ -3302,7 +3304,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4807(o.oneofs);
     checkUnnamed4808(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterType--;
@@ -3322,7 +3324,7 @@
 void checkUndeleteServiceResponse(api.UndeleteServiceResponse o) {
   buildCounterUndeleteServiceResponse++;
   if (buildCounterUndeleteServiceResponse < 3) {
-    checkManagedService(o.service);
+    checkManagedService(o.service as api.ManagedService);
   }
   buildCounterUndeleteServiceResponse--;
 }
@@ -3349,8 +3351,8 @@
 
 void checkUnnamed4810(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageRule(o[0]);
-  checkUsageRule(o[1]);
+  checkUsageRule(o[0] as api.UsageRule);
+  checkUsageRule(o[1] as api.UsageRule);
 }
 
 core.int buildCounterUsage = 0;
@@ -3373,7 +3375,7 @@
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
     checkUnnamed4809(o.requirements);
     checkUnnamed4810(o.rules);
-    checkServiceIdentity(o.serviceIdentity);
+    checkServiceIdentity(o.serviceIdentity as api.ServiceIdentity);
   }
   buildCounterUsage--;
 }
@@ -3406,7 +3408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdvice();
       var od = api.Advice.fromJson(o.toJson());
-      checkAdvice(od);
+      checkAdvice(od as api.Advice);
     });
   });
 
@@ -3414,7 +3416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApi();
       var od = api.Api.fromJson(o.toJson());
-      checkApi(od);
+      checkApi(od as api.Api);
     });
   });
 
@@ -3422,7 +3424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -3430,7 +3432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -3438,7 +3440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthProvider();
       var od = api.AuthProvider.fromJson(o.toJson());
-      checkAuthProvider(od);
+      checkAuthProvider(od as api.AuthProvider);
     });
   });
 
@@ -3446,7 +3448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthRequirement();
       var od = api.AuthRequirement.fromJson(o.toJson());
-      checkAuthRequirement(od);
+      checkAuthRequirement(od as api.AuthRequirement);
     });
   });
 
@@ -3454,7 +3456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthentication();
       var od = api.Authentication.fromJson(o.toJson());
-      checkAuthentication(od);
+      checkAuthentication(od as api.Authentication);
     });
   });
 
@@ -3462,7 +3464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthenticationRule();
       var od = api.AuthenticationRule.fromJson(o.toJson());
-      checkAuthenticationRule(od);
+      checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
 
@@ -3470,7 +3472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackend();
       var od = api.Backend.fromJson(o.toJson());
-      checkBackend(od);
+      checkBackend(od as api.Backend);
     });
   });
 
@@ -3478,7 +3480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendRule();
       var od = api.BackendRule.fromJson(o.toJson());
-      checkBackendRule(od);
+      checkBackendRule(od as api.BackendRule);
     });
   });
 
@@ -3486,7 +3488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBilling();
       var od = api.Billing.fromJson(o.toJson());
-      checkBilling(od);
+      checkBilling(od as api.Billing);
     });
   });
 
@@ -3494,7 +3496,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingDestination();
       var od = api.BillingDestination.fromJson(o.toJson());
-      checkBillingDestination(od);
+      checkBillingDestination(od as api.BillingDestination);
     });
   });
 
@@ -3502,7 +3504,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -3510,7 +3512,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChangeReport();
       var od = api.ChangeReport.fromJson(o.toJson());
-      checkChangeReport(od);
+      checkChangeReport(od as api.ChangeReport);
     });
   });
 
@@ -3518,7 +3520,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigChange();
       var od = api.ConfigChange.fromJson(o.toJson());
-      checkConfigChange(od);
+      checkConfigChange(od as api.ConfigChange);
     });
   });
 
@@ -3526,7 +3528,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigFile();
       var od = api.ConfigFile.fromJson(o.toJson());
-      checkConfigFile(od);
+      checkConfigFile(od as api.ConfigFile);
     });
   });
 
@@ -3534,7 +3536,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigRef();
       var od = api.ConfigRef.fromJson(o.toJson());
-      checkConfigRef(od);
+      checkConfigRef(od as api.ConfigRef);
     });
   });
 
@@ -3542,7 +3544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConfigSource();
       var od = api.ConfigSource.fromJson(o.toJson());
-      checkConfigSource(od);
+      checkConfigSource(od as api.ConfigSource);
     });
   });
 
@@ -3550,7 +3552,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContext();
       var od = api.Context.fromJson(o.toJson());
-      checkContext(od);
+      checkContext(od as api.Context);
     });
   });
 
@@ -3558,7 +3560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContextRule();
       var od = api.ContextRule.fromJson(o.toJson());
-      checkContextRule(od);
+      checkContextRule(od as api.ContextRule);
     });
   });
 
@@ -3566,7 +3568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildControl();
       var od = api.Control.fromJson(o.toJson());
-      checkControl(od);
+      checkControl(od as api.Control);
     });
   });
 
@@ -3574,7 +3576,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomError();
       var od = api.CustomError.fromJson(o.toJson());
-      checkCustomError(od);
+      checkCustomError(od as api.CustomError);
     });
   });
 
@@ -3582,7 +3584,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomErrorRule();
       var od = api.CustomErrorRule.fromJson(o.toJson());
-      checkCustomErrorRule(od);
+      checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
 
@@ -3590,7 +3592,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomHttpPattern();
       var od = api.CustomHttpPattern.fromJson(o.toJson());
-      checkCustomHttpPattern(od);
+      checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
 
@@ -3598,7 +3600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteServiceStrategy();
       var od = api.DeleteServiceStrategy.fromJson(o.toJson());
-      checkDeleteServiceStrategy(od);
+      checkDeleteServiceStrategy(od as api.DeleteServiceStrategy);
     });
   });
 
@@ -3606,7 +3608,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDiagnostic();
       var od = api.Diagnostic.fromJson(o.toJson());
-      checkDiagnostic(od);
+      checkDiagnostic(od as api.Diagnostic);
     });
   });
 
@@ -3614,7 +3616,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisableServiceResponse();
       var od = api.DisableServiceResponse.fromJson(o.toJson());
-      checkDisableServiceResponse(od);
+      checkDisableServiceResponse(od as api.DisableServiceResponse);
     });
   });
 
@@ -3622,7 +3624,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentation();
       var od = api.Documentation.fromJson(o.toJson());
-      checkDocumentation(od);
+      checkDocumentation(od as api.Documentation);
     });
   });
 
@@ -3630,7 +3632,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentationRule();
       var od = api.DocumentationRule.fromJson(o.toJson());
-      checkDocumentationRule(od);
+      checkDocumentationRule(od as api.DocumentationRule);
     });
   });
 
@@ -3638,7 +3640,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableServiceRequest();
       var od = api.EnableServiceRequest.fromJson(o.toJson());
-      checkEnableServiceRequest(od);
+      checkEnableServiceRequest(od as api.EnableServiceRequest);
     });
   });
 
@@ -3646,7 +3648,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableServiceResponse();
       var od = api.EnableServiceResponse.fromJson(o.toJson());
-      checkEnableServiceResponse(od);
+      checkEnableServiceResponse(od as api.EnableServiceResponse);
     });
   });
 
@@ -3654,7 +3656,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpoint();
       var od = api.Endpoint.fromJson(o.toJson());
-      checkEndpoint(od);
+      checkEndpoint(od as api.Endpoint);
     });
   });
 
@@ -3662,7 +3664,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnum();
       var od = api.Enum.fromJson(o.toJson());
-      checkEnum(od);
+      checkEnum(od as api.Enum);
     });
   });
 
@@ -3670,7 +3672,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumValue();
       var od = api.EnumValue.fromJson(o.toJson());
-      checkEnumValue(od);
+      checkEnumValue(od as api.EnumValue);
     });
   });
 
@@ -3678,7 +3680,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -3686,7 +3688,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildField();
       var od = api.Field.fromJson(o.toJson());
-      checkField(od);
+      checkField(od as api.Field);
     });
   });
 
@@ -3694,7 +3696,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFlowErrorDetails();
       var od = api.FlowErrorDetails.fromJson(o.toJson());
-      checkFlowErrorDetails(od);
+      checkFlowErrorDetails(od as api.FlowErrorDetails);
     });
   });
 
@@ -3702,7 +3704,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateConfigReportRequest();
       var od = api.GenerateConfigReportRequest.fromJson(o.toJson());
-      checkGenerateConfigReportRequest(od);
+      checkGenerateConfigReportRequest(od as api.GenerateConfigReportRequest);
     });
   });
 
@@ -3710,7 +3712,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGenerateConfigReportResponse();
       var od = api.GenerateConfigReportResponse.fromJson(o.toJson());
-      checkGenerateConfigReportResponse(od);
+      checkGenerateConfigReportResponse(od as api.GenerateConfigReportResponse);
     });
   });
 
@@ -3718,7 +3720,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -3726,7 +3728,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -3734,7 +3736,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttp();
       var od = api.Http.fromJson(o.toJson());
-      checkHttp(od);
+      checkHttp(od as api.Http);
     });
   });
 
@@ -3742,7 +3744,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRule();
       var od = api.HttpRule.fromJson(o.toJson());
-      checkHttpRule(od);
+      checkHttpRule(od as api.HttpRule);
     });
   });
 
@@ -3750,7 +3752,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJwtLocation();
       var od = api.JwtLocation.fromJson(o.toJson());
-      checkJwtLocation(od);
+      checkJwtLocation(od as api.JwtLocation);
     });
   });
 
@@ -3758,7 +3760,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelDescriptor();
       var od = api.LabelDescriptor.fromJson(o.toJson());
-      checkLabelDescriptor(od);
+      checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
 
@@ -3766,7 +3768,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3774,7 +3776,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServiceConfigsResponse();
       var od = api.ListServiceConfigsResponse.fromJson(o.toJson());
-      checkListServiceConfigsResponse(od);
+      checkListServiceConfigsResponse(od as api.ListServiceConfigsResponse);
     });
   });
 
@@ -3782,7 +3784,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServiceRolloutsResponse();
       var od = api.ListServiceRolloutsResponse.fromJson(o.toJson());
-      checkListServiceRolloutsResponse(od);
+      checkListServiceRolloutsResponse(od as api.ListServiceRolloutsResponse);
     });
   });
 
@@ -3790,7 +3792,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServicesResponse();
       var od = api.ListServicesResponse.fromJson(o.toJson());
-      checkListServicesResponse(od);
+      checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
 
@@ -3798,7 +3800,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogDescriptor();
       var od = api.LogDescriptor.fromJson(o.toJson());
-      checkLogDescriptor(od);
+      checkLogDescriptor(od as api.LogDescriptor);
     });
   });
 
@@ -3806,7 +3808,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogging();
       var od = api.Logging.fromJson(o.toJson());
-      checkLogging(od);
+      checkLogging(od as api.Logging);
     });
   });
 
@@ -3814,7 +3816,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoggingDestination();
       var od = api.LoggingDestination.fromJson(o.toJson());
-      checkLoggingDestination(od);
+      checkLoggingDestination(od as api.LoggingDestination);
     });
   });
 
@@ -3822,7 +3824,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManagedService();
       var od = api.ManagedService.fromJson(o.toJson());
-      checkManagedService(od);
+      checkManagedService(od as api.ManagedService);
     });
   });
 
@@ -3830,7 +3832,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMethod();
       var od = api.Method.fromJson(o.toJson());
-      checkMethod(od);
+      checkMethod(od as api.Method);
     });
   });
 
@@ -3838,7 +3840,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptor();
       var od = api.MetricDescriptor.fromJson(o.toJson());
-      checkMetricDescriptor(od);
+      checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
 
@@ -3846,7 +3848,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptorMetadata();
       var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
-      checkMetricDescriptorMetadata(od);
+      checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
 
@@ -3854,7 +3856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricRule();
       var od = api.MetricRule.fromJson(o.toJson());
-      checkMetricRule(od);
+      checkMetricRule(od as api.MetricRule);
     });
   });
 
@@ -3862,7 +3864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMixin();
       var od = api.Mixin.fromJson(o.toJson());
-      checkMixin(od);
+      checkMixin(od as api.Mixin);
     });
   });
 
@@ -3870,7 +3872,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceDescriptor();
       var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
-      checkMonitoredResourceDescriptor(od);
+      checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
 
@@ -3878,7 +3880,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoring();
       var od = api.Monitoring.fromJson(o.toJson());
-      checkMonitoring(od);
+      checkMonitoring(od as api.Monitoring);
     });
   });
 
@@ -3886,7 +3888,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoringDestination();
       var od = api.MonitoringDestination.fromJson(o.toJson());
-      checkMonitoringDestination(od);
+      checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
 
@@ -3894,7 +3896,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOAuthRequirements();
       var od = api.OAuthRequirements.fromJson(o.toJson());
-      checkOAuthRequirements(od);
+      checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
 
@@ -3902,7 +3904,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3910,7 +3912,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -3918,7 +3920,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOption();
       var od = api.Option.fromJson(o.toJson());
-      checkOption(od);
+      checkOption(od as api.Option);
     });
   });
 
@@ -3926,7 +3928,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPage();
       var od = api.Page.fromJson(o.toJson());
-      checkPage(od);
+      checkPage(od as api.Page);
     });
   });
 
@@ -3934,7 +3936,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -3942,7 +3944,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuota();
       var od = api.Quota.fromJson(o.toJson());
-      checkQuota(od);
+      checkQuota(od as api.Quota);
     });
   });
 
@@ -3950,7 +3952,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaLimit();
       var od = api.QuotaLimit.fromJson(o.toJson());
-      checkQuotaLimit(od);
+      checkQuotaLimit(od as api.QuotaLimit);
     });
   });
 
@@ -3958,7 +3960,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceReference();
       var od = api.ResourceReference.fromJson(o.toJson());
-      checkResourceReference(od);
+      checkResourceReference(od as api.ResourceReference);
     });
   });
 
@@ -3966,7 +3968,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRollout();
       var od = api.Rollout.fromJson(o.toJson());
-      checkRollout(od);
+      checkRollout(od as api.Rollout);
     });
   });
 
@@ -3974,7 +3976,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -3982,7 +3984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceIdentity();
       var od = api.ServiceIdentity.fromJson(o.toJson());
-      checkServiceIdentity(od);
+      checkServiceIdentity(od as api.ServiceIdentity);
     });
   });
 
@@ -3990,7 +3992,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -3998,7 +4000,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceContext();
       var od = api.SourceContext.fromJson(o.toJson());
-      checkSourceContext(od);
+      checkSourceContext(od as api.SourceContext);
     });
   });
 
@@ -4006,7 +4008,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceInfo();
       var od = api.SourceInfo.fromJson(o.toJson());
-      checkSourceInfo(od);
+      checkSourceInfo(od as api.SourceInfo);
     });
   });
 
@@ -4014,7 +4016,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -4022,7 +4024,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStep();
       var od = api.Step.fromJson(o.toJson());
-      checkStep(od);
+      checkStep(od as api.Step);
     });
   });
 
@@ -4030,7 +4032,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubmitConfigSourceRequest();
       var od = api.SubmitConfigSourceRequest.fromJson(o.toJson());
-      checkSubmitConfigSourceRequest(od);
+      checkSubmitConfigSourceRequest(od as api.SubmitConfigSourceRequest);
     });
   });
 
@@ -4038,7 +4040,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubmitConfigSourceResponse();
       var od = api.SubmitConfigSourceResponse.fromJson(o.toJson());
-      checkSubmitConfigSourceResponse(od);
+      checkSubmitConfigSourceResponse(od as api.SubmitConfigSourceResponse);
     });
   });
 
@@ -4046,7 +4048,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameter();
       var od = api.SystemParameter.fromJson(o.toJson());
-      checkSystemParameter(od);
+      checkSystemParameter(od as api.SystemParameter);
     });
   });
 
@@ -4054,7 +4056,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameterRule();
       var od = api.SystemParameterRule.fromJson(o.toJson());
-      checkSystemParameterRule(od);
+      checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
 
@@ -4062,7 +4064,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameters();
       var od = api.SystemParameters.fromJson(o.toJson());
-      checkSystemParameters(od);
+      checkSystemParameters(od as api.SystemParameters);
     });
   });
 
@@ -4070,7 +4072,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -4078,7 +4080,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -4086,7 +4088,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrafficPercentStrategy();
       var od = api.TrafficPercentStrategy.fromJson(o.toJson());
-      checkTrafficPercentStrategy(od);
+      checkTrafficPercentStrategy(od as api.TrafficPercentStrategy);
     });
   });
 
@@ -4094,7 +4096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildType();
       var od = api.Type.fromJson(o.toJson());
-      checkType(od);
+      checkType(od as api.Type);
     });
   });
 
@@ -4102,7 +4104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteServiceResponse();
       var od = api.UndeleteServiceResponse.fromJson(o.toJson());
-      checkUndeleteServiceResponse(od);
+      checkUndeleteServiceResponse(od as api.UndeleteServiceResponse);
     });
   });
 
@@ -4110,7 +4112,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsage();
       var od = api.Usage.fromJson(o.toJson());
-      checkUsage(od);
+      checkUsage(od as api.Usage);
     });
   });
 
@@ -4118,7 +4120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageRule();
       var od = api.UsageRule.fromJson(o.toJson());
-      checkUsageRule(od);
+      checkUsageRule(od as api.UsageRule);
     });
   });
 
@@ -4167,7 +4169,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4228,7 +4230,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -4240,8 +4242,9 @@
       var arg_request = buildManagedService();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ManagedService.fromJson(json);
-        checkManagedService(obj);
+        var obj = api.ManagedService.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkManagedService(obj as api.ManagedService);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4280,7 +4283,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4330,7 +4333,7 @@
       res
           .delete(arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4341,8 +4344,9 @@
       var arg_serviceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EnableServiceRequest.fromJson(json);
-        checkEnableServiceRequest(obj);
+        var obj = api.EnableServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnableServiceRequest(obj as api.EnableServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4390,7 +4394,7 @@
       res
           .enable(arg_request, arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4400,8 +4404,10 @@
       var arg_request = buildGenerateConfigReportRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GenerateConfigReportRequest.fromJson(json);
-        checkGenerateConfigReportRequest(obj);
+        var obj = api.GenerateConfigReportRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGenerateConfigReportRequest(
+            obj as api.GenerateConfigReportRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4440,7 +4446,8 @@
       res
           .generateConfigReport(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGenerateConfigReportResponse(response);
+        checkGenerateConfigReportResponse(
+            response as api.GenerateConfigReportResponse);
       })));
     });
 
@@ -4490,7 +4497,7 @@
       res
           .get(arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkManagedService(response);
+        checkManagedService(response as api.ManagedService);
       })));
     });
 
@@ -4552,7 +4559,7 @@
           .getConfig(arg_serviceName,
               configId: arg_configId, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -4563,8 +4570,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4604,7 +4612,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4667,7 +4675,7 @@
               producerProjectId: arg_producerProjectId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicesResponse(response);
+        checkListServicesResponse(response as api.ListServicesResponse);
       })));
     });
 
@@ -4678,8 +4686,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4719,7 +4728,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4730,8 +4739,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4771,7 +4781,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -4827,7 +4838,7 @@
       res
           .undelete(arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -4840,8 +4851,9 @@
       var arg_serviceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Service.fromJson(json);
-        checkService(obj);
+        var obj =
+            api.Service.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkService(obj as api.Service);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4889,7 +4901,7 @@
       res
           .create(arg_request, arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -4952,7 +4964,7 @@
           .get(arg_serviceName, arg_configId,
               view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkService(response);
+        checkService(response as api.Service);
       })));
     });
 
@@ -5017,7 +5029,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServiceConfigsResponse(response);
+        checkListServiceConfigsResponse(
+            response as api.ListServiceConfigsResponse);
       })));
     });
 
@@ -5028,8 +5041,9 @@
       var arg_serviceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SubmitConfigSourceRequest.fromJson(json);
-        checkSubmitConfigSourceRequest(obj);
+        var obj = api.SubmitConfigSourceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubmitConfigSourceRequest(obj as api.SubmitConfigSourceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5077,7 +5091,7 @@
       res
           .submit(arg_request, arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -5090,8 +5104,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5131,7 +5146,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5142,8 +5157,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5183,7 +5199,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5194,8 +5210,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5235,7 +5252,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -5248,8 +5266,9 @@
       var arg_serviceName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Rollout.fromJson(json);
-        checkRollout(obj);
+        var obj =
+            api.Rollout.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRollout(obj as api.Rollout);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5297,7 +5316,7 @@
       res
           .create(arg_request, arg_serviceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5357,7 +5376,7 @@
       res
           .get(arg_serviceName, arg_rolloutId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRollout(response);
+        checkRollout(response as api.Rollout);
       })));
     });
 
@@ -5425,7 +5444,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServiceRolloutsResponse(response);
+        checkListServiceRolloutsResponse(
+            response as api.ListServiceRolloutsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/servicenetworking/v1_test.dart b/generated/googleapis/test/servicenetworking/v1_test.dart
index ca7633b..899cd66 100644
--- a/generated/googleapis/test/servicenetworking/v1_test.dart
+++ b/generated/googleapis/test/servicenetworking/v1_test.dart
@@ -106,7 +106,7 @@
   buildCounterAddDnsRecordSetRequest++;
   if (buildCounterAddDnsRecordSetRequest < 3) {
     unittest.expect(o.consumerNetwork, unittest.equals('foo'));
-    checkDnsRecordSet(o.dnsRecordSet);
+    checkDnsRecordSet(o.dnsRecordSet as api.DnsRecordSet);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterAddDnsRecordSetRequest--;
@@ -165,8 +165,8 @@
 void checkAddDnsZoneResponse(api.AddDnsZoneResponse o) {
   buildCounterAddDnsZoneResponse++;
   if (buildCounterAddDnsZoneResponse < 3) {
-    checkDnsZone(o.consumerPeeringZone);
-    checkDnsZone(o.producerPrivateZone);
+    checkDnsZone(o.consumerPeeringZone as api.DnsZone);
+    checkDnsZone(o.producerPrivateZone as api.DnsZone);
   }
   buildCounterAddDnsZoneResponse--;
 }
@@ -195,8 +195,8 @@
 
 void checkUnnamed3390(core.List<api.PolicyBinding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicyBinding(o[0]);
-  checkPolicyBinding(o[1]);
+  checkPolicyBinding(o[0] as api.PolicyBinding);
+  checkPolicyBinding(o[1] as api.PolicyBinding);
 }
 
 core.int buildCounterAddRolesRequest = 0;
@@ -229,8 +229,8 @@
 
 void checkUnnamed3391(core.List<api.PolicyBinding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicyBinding(o[0]);
-  checkPolicyBinding(o[1]);
+  checkPolicyBinding(o[0] as api.PolicyBinding);
+  checkPolicyBinding(o[1] as api.PolicyBinding);
 }
 
 core.int buildCounterAddRolesResponse = 0;
@@ -307,8 +307,8 @@
 
 void checkUnnamed3393(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMethod(o[0]);
-  checkMethod(o[1]);
+  checkMethod(o[0] as api.Method);
+  checkMethod(o[1] as api.Method);
 }
 
 core.List<api.Mixin> buildUnnamed3394() {
@@ -320,8 +320,8 @@
 
 void checkUnnamed3394(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMixin(o[0]);
-  checkMixin(o[1]);
+  checkMixin(o[0] as api.Mixin);
+  checkMixin(o[1] as api.Mixin);
 }
 
 core.List<api.Option> buildUnnamed3395() {
@@ -333,8 +333,8 @@
 
 void checkUnnamed3395(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterApi = 0;
@@ -361,7 +361,7 @@
     checkUnnamed3394(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3395(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -377,8 +377,8 @@
 
 void checkUnnamed3396(core.List<api.JwtLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJwtLocation(o[0]);
-  checkJwtLocation(o[1]);
+  checkJwtLocation(o[0] as api.JwtLocation);
+  checkJwtLocation(o[1] as api.JwtLocation);
 }
 
 core.int buildCounterAuthProvider = 0;
@@ -440,8 +440,8 @@
 
 void checkUnnamed3397(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthProvider(o[0]);
-  checkAuthProvider(o[1]);
+  checkAuthProvider(o[0] as api.AuthProvider);
+  checkAuthProvider(o[1] as api.AuthProvider);
 }
 
 core.List<api.AuthenticationRule> buildUnnamed3398() {
@@ -453,8 +453,8 @@
 
 void checkUnnamed3398(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthenticationRule(o[0]);
-  checkAuthenticationRule(o[1]);
+  checkAuthenticationRule(o[0] as api.AuthenticationRule);
+  checkAuthenticationRule(o[1] as api.AuthenticationRule);
 }
 
 core.int buildCounterAuthentication = 0;
@@ -487,8 +487,8 @@
 
 void checkUnnamed3399(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthRequirement(o[0]);
-  checkAuthRequirement(o[1]);
+  checkAuthRequirement(o[0] as api.AuthRequirement);
+  checkAuthRequirement(o[1] as api.AuthRequirement);
 }
 
 core.int buildCounterAuthenticationRule = 0;
@@ -509,7 +509,7 @@
   buildCounterAuthenticationRule++;
   if (buildCounterAuthenticationRule < 3) {
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
-    checkOAuthRequirements(o.oauth);
+    checkOAuthRequirements(o.oauth as api.OAuthRequirements);
     checkUnnamed3399(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
@@ -525,8 +525,8 @@
 
 void checkUnnamed3400(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendRule(o[0]);
-  checkBackendRule(o[1]);
+  checkBackendRule(o[0] as api.BackendRule);
+  checkBackendRule(o[1] as api.BackendRule);
 }
 
 core.int buildCounterBackend = 0;
@@ -592,8 +592,8 @@
 
 void checkUnnamed3401(core.List<api.BillingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBillingDestination(o[0]);
-  checkBillingDestination(o[1]);
+  checkBillingDestination(o[0] as api.BillingDestination);
+  checkBillingDestination(o[1] as api.BillingDestination);
 }
 
 core.int buildCounterBilling = 0;
@@ -730,8 +730,8 @@
 
 void checkUnnamed3404(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContextRule(o[0]);
-  checkContextRule(o[1]);
+  checkContextRule(o[0] as api.ContextRule);
+  checkContextRule(o[1] as api.ContextRule);
 }
 
 core.int buildCounterContext = 0;
@@ -860,8 +860,8 @@
 
 void checkUnnamed3409(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomErrorRule(o[0]);
-  checkCustomErrorRule(o[1]);
+  checkCustomErrorRule(o[0] as api.CustomErrorRule);
+  checkCustomErrorRule(o[1] as api.CustomErrorRule);
 }
 
 core.List<core.String> buildUnnamed3410() {
@@ -1043,8 +1043,8 @@
 
 void checkUnnamed3412(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.List<api.DocumentationRule> buildUnnamed3413() {
@@ -1056,8 +1056,8 @@
 
 void checkUnnamed3413(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDocumentationRule(o[0]);
-  checkDocumentationRule(o[1]);
+  checkDocumentationRule(o[0] as api.DocumentationRule);
+  checkDocumentationRule(o[1] as api.DocumentationRule);
 }
 
 core.int buildCounterDocumentation = 0;
@@ -1194,8 +1194,8 @@
 
 void checkUnnamed3415(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnumValue(o[0]);
-  checkEnumValue(o[1]);
+  checkEnumValue(o[0] as api.EnumValue);
+  checkEnumValue(o[1] as api.EnumValue);
 }
 
 core.List<api.Option> buildUnnamed3416() {
@@ -1207,8 +1207,8 @@
 
 void checkUnnamed3416(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnum = 0;
@@ -1232,7 +1232,7 @@
     checkUnnamed3415(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3416(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
@@ -1247,8 +1247,8 @@
 
 void checkUnnamed3417(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnumValue = 0;
@@ -1283,8 +1283,8 @@
 
 void checkUnnamed3418(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterField = 0;
@@ -1360,8 +1360,8 @@
 
 void checkUnnamed3419(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttp = 0;
@@ -1394,8 +1394,8 @@
 
 void checkUnnamed3420(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttpRule = 0;
@@ -1425,7 +1425,7 @@
     checkUnnamed3420(o.additionalBindings);
     unittest.expect(o.allowHalfDuplex, unittest.isTrue);
     unittest.expect(o.body, unittest.equals('foo'));
-    checkCustomHttpPattern(o.custom);
+    checkCustomHttpPattern(o.custom as api.CustomHttpPattern);
     unittest.expect(o.delete, unittest.equals('foo'));
     unittest.expect(o.get, unittest.equals('foo'));
     unittest.expect(o.patch, unittest.equals('foo'));
@@ -1492,8 +1492,8 @@
 
 void checkUnnamed3421(core.List<api.Connection> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConnection(o[0]);
-  checkConnection(o[1]);
+  checkConnection(o[0] as api.Connection);
+  checkConnection(o[1] as api.Connection);
 }
 
 core.int buildCounterListConnectionsResponse = 0;
@@ -1524,8 +1524,8 @@
 
 void checkUnnamed3422(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1558,8 +1558,8 @@
 
 void checkUnnamed3423(core.List<api.PeeredDnsDomain> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPeeredDnsDomain(o[0]);
-  checkPeeredDnsDomain(o[1]);
+  checkPeeredDnsDomain(o[0] as api.PeeredDnsDomain);
+  checkPeeredDnsDomain(o[1] as api.PeeredDnsDomain);
 }
 
 core.int buildCounterListPeeredDnsDomainsResponse = 0;
@@ -1590,8 +1590,8 @@
 
 void checkUnnamed3424(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterLogDescriptor = 0;
@@ -1628,8 +1628,8 @@
 
 void checkUnnamed3425(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.List<api.LoggingDestination> buildUnnamed3426() {
@@ -1641,8 +1641,8 @@
 
 void checkUnnamed3426(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.int buildCounterLogging = 0;
@@ -1709,8 +1709,8 @@
 
 void checkUnnamed3428(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterMethod = 0;
@@ -1753,8 +1753,8 @@
 
 void checkUnnamed3429(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.List<core.String> buildUnnamed3430() {
@@ -1798,7 +1798,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed3429(o.labels);
     unittest.expect(o.launchStage, unittest.equals('foo'));
-    checkMetricDescriptorMetadata(o.metadata);
+    checkMetricDescriptorMetadata(o.metadata as api.MetricDescriptorMetadata);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     checkUnnamed3430(o.monitoredResourceTypes);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1896,8 +1896,8 @@
 
 void checkUnnamed3432(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterMonitoredResourceDescriptor = 0;
@@ -1938,8 +1938,8 @@
 
 void checkUnnamed3433(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.List<api.MonitoringDestination> buildUnnamed3434() {
@@ -1951,8 +1951,8 @@
 
 void checkUnnamed3434(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.int buildCounterMonitoring = 0;
@@ -2106,7 +2106,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3436(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3437(o.response);
@@ -2173,8 +2173,8 @@
 
 void checkUnnamed3439(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.int buildCounterPage = 0;
@@ -2266,8 +2266,8 @@
 
 void checkUnnamed3440(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaLimit(o[0]);
-  checkQuotaLimit(o[1]);
+  checkQuotaLimit(o[0] as api.QuotaLimit);
+  checkQuotaLimit(o[1] as api.QuotaLimit);
 }
 
 core.List<api.MetricRule> buildUnnamed3441() {
@@ -2279,8 +2279,8 @@
 
 void checkUnnamed3441(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricRule(o[0]);
-  checkMetricRule(o[1]);
+  checkMetricRule(o[0] as api.MetricRule);
+  checkMetricRule(o[1] as api.MetricRule);
 }
 
 core.int buildCounterQuota = 0;
@@ -2441,7 +2441,7 @@
   buildCounterRemoveDnsRecordSetRequest++;
   if (buildCounterRemoveDnsRecordSetRequest < 3) {
     unittest.expect(o.consumerNetwork, unittest.equals('foo'));
-    checkDnsRecordSet(o.dnsRecordSet);
+    checkDnsRecordSet(o.dnsRecordSet as api.DnsRecordSet);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterRemoveDnsRecordSetRequest--;
@@ -2568,8 +2568,8 @@
 
 void checkUnnamed3444(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApi(o[0]);
-  checkApi(o[1]);
+  checkApi(o[0] as api.Api);
+  checkApi(o[1] as api.Api);
 }
 
 core.List<api.Endpoint> buildUnnamed3445() {
@@ -2581,8 +2581,8 @@
 
 void checkUnnamed3445(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEndpoint(o[0]);
-  checkEndpoint(o[1]);
+  checkEndpoint(o[0] as api.Endpoint);
+  checkEndpoint(o[1] as api.Endpoint);
 }
 
 core.List<api.Enum> buildUnnamed3446() {
@@ -2594,8 +2594,8 @@
 
 void checkUnnamed3446(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnum(o[0]);
-  checkEnum(o[1]);
+  checkEnum(o[0] as api.Enum);
+  checkEnum(o[1] as api.Enum);
 }
 
 core.List<api.LogDescriptor> buildUnnamed3447() {
@@ -2607,8 +2607,8 @@
 
 void checkUnnamed3447(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogDescriptor(o[0]);
-  checkLogDescriptor(o[1]);
+  checkLogDescriptor(o[0] as api.LogDescriptor);
+  checkLogDescriptor(o[1] as api.LogDescriptor);
 }
 
 core.List<api.MetricDescriptor> buildUnnamed3448() {
@@ -2620,8 +2620,8 @@
 
 void checkUnnamed3448(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricDescriptor(o[0]);
-  checkMetricDescriptor(o[1]);
+  checkMetricDescriptor(o[0] as api.MetricDescriptor);
+  checkMetricDescriptor(o[1] as api.MetricDescriptor);
 }
 
 core.List<api.MonitoredResourceDescriptor> buildUnnamed3449() {
@@ -2633,8 +2633,8 @@
 
 void checkUnnamed3449(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResourceDescriptor(o[0]);
-  checkMonitoredResourceDescriptor(o[1]);
+  checkMonitoredResourceDescriptor(o[0] as api.MonitoredResourceDescriptor);
+  checkMonitoredResourceDescriptor(o[1] as api.MonitoredResourceDescriptor);
 }
 
 core.List<api.Type> buildUnnamed3450() {
@@ -2646,8 +2646,8 @@
 
 void checkUnnamed3450(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.List<api.Type> buildUnnamed3451() {
@@ -2659,8 +2659,8 @@
 
 void checkUnnamed3451(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.int buildCounterService = 0;
@@ -2704,32 +2704,32 @@
   buildCounterService++;
   if (buildCounterService < 3) {
     checkUnnamed3444(o.apis);
-    checkAuthentication(o.authentication);
-    checkBackend(o.backend);
-    checkBilling(o.billing);
+    checkAuthentication(o.authentication as api.Authentication);
+    checkBackend(o.backend as api.Backend);
+    checkBilling(o.billing as api.Billing);
     unittest.expect(o.configVersion, unittest.equals(42));
-    checkContext(o.context);
-    checkControl(o.control);
-    checkCustomError(o.customError);
-    checkDocumentation(o.documentation);
+    checkContext(o.context as api.Context);
+    checkControl(o.control as api.Control);
+    checkCustomError(o.customError as api.CustomError);
+    checkDocumentation(o.documentation as api.Documentation);
     checkUnnamed3445(o.endpoints);
     checkUnnamed3446(o.enums);
-    checkHttp(o.http);
+    checkHttp(o.http as api.Http);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkLogging(o.logging);
+    checkLogging(o.logging as api.Logging);
     checkUnnamed3447(o.logs);
     checkUnnamed3448(o.metrics);
     checkUnnamed3449(o.monitoredResources);
-    checkMonitoring(o.monitoring);
+    checkMonitoring(o.monitoring as api.Monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
-    checkQuota(o.quota);
-    checkSourceInfo(o.sourceInfo);
-    checkSystemParameters(o.systemParameters);
+    checkQuota(o.quota as api.Quota);
+    checkSourceInfo(o.sourceInfo as api.SourceInfo);
+    checkSystemParameters(o.systemParameters as api.SystemParameters);
     checkUnnamed3450(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkUnnamed3451(o.types);
-    checkUsage(o.usage);
+    checkUsage(o.usage as api.Usage);
   }
   buildCounterService--;
 }
@@ -2959,8 +2959,8 @@
 
 void checkUnnamed3456(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameter(o[0]);
-  checkSystemParameter(o[1]);
+  checkSystemParameter(o[0] as api.SystemParameter);
+  checkSystemParameter(o[1] as api.SystemParameter);
 }
 
 core.int buildCounterSystemParameterRule = 0;
@@ -2993,8 +2993,8 @@
 
 void checkUnnamed3457(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameterRule(o[0]);
-  checkSystemParameterRule(o[1]);
+  checkSystemParameterRule(o[0] as api.SystemParameterRule);
+  checkSystemParameterRule(o[1] as api.SystemParameterRule);
 }
 
 core.int buildCounterSystemParameters = 0;
@@ -3025,8 +3025,8 @@
 
 void checkUnnamed3458(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkField(o[0]);
-  checkField(o[1]);
+  checkField(o[0] as api.Field);
+  checkField(o[1] as api.Field);
 }
 
 core.List<core.String> buildUnnamed3459() {
@@ -3051,8 +3051,8 @@
 
 void checkUnnamed3460(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterType = 0;
@@ -3078,7 +3078,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3459(o.oneofs);
     checkUnnamed3460(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterType--;
@@ -3117,8 +3117,8 @@
   buildCounterUpdateDnsRecordSetRequest++;
   if (buildCounterUpdateDnsRecordSetRequest < 3) {
     unittest.expect(o.consumerNetwork, unittest.equals('foo'));
-    checkDnsRecordSet(o.existingDnsRecordSet);
-    checkDnsRecordSet(o.newDnsRecordSet);
+    checkDnsRecordSet(o.existingDnsRecordSet as api.DnsRecordSet);
+    checkDnsRecordSet(o.newDnsRecordSet as api.DnsRecordSet);
     unittest.expect(o.zone, unittest.equals('foo'));
   }
   buildCounterUpdateDnsRecordSetRequest--;
@@ -3146,8 +3146,8 @@
 
 void checkUnnamed3462(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageRule(o[0]);
-  checkUsageRule(o[1]);
+  checkUsageRule(o[0] as api.UsageRule);
+  checkUsageRule(o[1] as api.UsageRule);
 }
 
 core.int buildCounterUsage = 0;
@@ -3170,7 +3170,7 @@
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
     checkUnnamed3461(o.requirements);
     checkUnnamed3462(o.rules);
-    checkServiceIdentity(o.serviceIdentity);
+    checkServiceIdentity(o.serviceIdentity as api.ServiceIdentity);
   }
   buildCounterUsage--;
 }
@@ -3216,8 +3216,8 @@
   buildCounterValidateConsumerConfigRequest++;
   if (buildCounterValidateConsumerConfigRequest < 3) {
     unittest.expect(o.consumerNetwork, unittest.equals('foo'));
-    checkConsumerProject(o.consumerProject);
-    checkRangeReservation(o.rangeReservation);
+    checkConsumerProject(o.consumerProject as api.ConsumerProject);
+    checkRangeReservation(o.rangeReservation as api.RangeReservation);
     unittest.expect(o.validateNetwork, unittest.isTrue);
   }
   buildCounterValidateConsumerConfigRequest--;
@@ -3249,7 +3249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDnsRecordSetMetadata();
       var od = api.AddDnsRecordSetMetadata.fromJson(o.toJson());
-      checkAddDnsRecordSetMetadata(od);
+      checkAddDnsRecordSetMetadata(od as api.AddDnsRecordSetMetadata);
     });
   });
 
@@ -3257,7 +3257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDnsRecordSetRequest();
       var od = api.AddDnsRecordSetRequest.fromJson(o.toJson());
-      checkAddDnsRecordSetRequest(od);
+      checkAddDnsRecordSetRequest(od as api.AddDnsRecordSetRequest);
     });
   });
 
@@ -3265,7 +3265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDnsZoneMetadata();
       var od = api.AddDnsZoneMetadata.fromJson(o.toJson());
-      checkAddDnsZoneMetadata(od);
+      checkAddDnsZoneMetadata(od as api.AddDnsZoneMetadata);
     });
   });
 
@@ -3273,7 +3273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDnsZoneRequest();
       var od = api.AddDnsZoneRequest.fromJson(o.toJson());
-      checkAddDnsZoneRequest(od);
+      checkAddDnsZoneRequest(od as api.AddDnsZoneRequest);
     });
   });
 
@@ -3281,7 +3281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDnsZoneResponse();
       var od = api.AddDnsZoneResponse.fromJson(o.toJson());
-      checkAddDnsZoneResponse(od);
+      checkAddDnsZoneResponse(od as api.AddDnsZoneResponse);
     });
   });
 
@@ -3289,7 +3289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddRolesMetadata();
       var od = api.AddRolesMetadata.fromJson(o.toJson());
-      checkAddRolesMetadata(od);
+      checkAddRolesMetadata(od as api.AddRolesMetadata);
     });
   });
 
@@ -3297,7 +3297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddRolesRequest();
       var od = api.AddRolesRequest.fromJson(o.toJson());
-      checkAddRolesRequest(od);
+      checkAddRolesRequest(od as api.AddRolesRequest);
     });
   });
 
@@ -3305,7 +3305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddRolesResponse();
       var od = api.AddRolesResponse.fromJson(o.toJson());
-      checkAddRolesResponse(od);
+      checkAddRolesResponse(od as api.AddRolesResponse);
     });
   });
 
@@ -3313,7 +3313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddSubnetworkRequest();
       var od = api.AddSubnetworkRequest.fromJson(o.toJson());
-      checkAddSubnetworkRequest(od);
+      checkAddSubnetworkRequest(od as api.AddSubnetworkRequest);
     });
   });
 
@@ -3321,7 +3321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApi();
       var od = api.Api.fromJson(o.toJson());
-      checkApi(od);
+      checkApi(od as api.Api);
     });
   });
 
@@ -3329,7 +3329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthProvider();
       var od = api.AuthProvider.fromJson(o.toJson());
-      checkAuthProvider(od);
+      checkAuthProvider(od as api.AuthProvider);
     });
   });
 
@@ -3337,7 +3337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthRequirement();
       var od = api.AuthRequirement.fromJson(o.toJson());
-      checkAuthRequirement(od);
+      checkAuthRequirement(od as api.AuthRequirement);
     });
   });
 
@@ -3345,7 +3345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthentication();
       var od = api.Authentication.fromJson(o.toJson());
-      checkAuthentication(od);
+      checkAuthentication(od as api.Authentication);
     });
   });
 
@@ -3353,7 +3353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthenticationRule();
       var od = api.AuthenticationRule.fromJson(o.toJson());
-      checkAuthenticationRule(od);
+      checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
 
@@ -3361,7 +3361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackend();
       var od = api.Backend.fromJson(o.toJson());
-      checkBackend(od);
+      checkBackend(od as api.Backend);
     });
   });
 
@@ -3369,7 +3369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendRule();
       var od = api.BackendRule.fromJson(o.toJson());
-      checkBackendRule(od);
+      checkBackendRule(od as api.BackendRule);
     });
   });
 
@@ -3377,7 +3377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBilling();
       var od = api.Billing.fromJson(o.toJson());
-      checkBilling(od);
+      checkBilling(od as api.Billing);
     });
   });
 
@@ -3385,7 +3385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingDestination();
       var od = api.BillingDestination.fromJson(o.toJson());
-      checkBillingDestination(od);
+      checkBillingDestination(od as api.BillingDestination);
     });
   });
 
@@ -3393,7 +3393,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -3401,7 +3401,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConnection();
       var od = api.Connection.fromJson(o.toJson());
-      checkConnection(od);
+      checkConnection(od as api.Connection);
     });
   });
 
@@ -3409,7 +3409,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConsumerProject();
       var od = api.ConsumerProject.fromJson(o.toJson());
-      checkConsumerProject(od);
+      checkConsumerProject(od as api.ConsumerProject);
     });
   });
 
@@ -3417,7 +3417,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContext();
       var od = api.Context.fromJson(o.toJson());
-      checkContext(od);
+      checkContext(od as api.Context);
     });
   });
 
@@ -3425,7 +3425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContextRule();
       var od = api.ContextRule.fromJson(o.toJson());
-      checkContextRule(od);
+      checkContextRule(od as api.ContextRule);
     });
   });
 
@@ -3433,7 +3433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildControl();
       var od = api.Control.fromJson(o.toJson());
-      checkControl(od);
+      checkControl(od as api.Control);
     });
   });
 
@@ -3441,7 +3441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomError();
       var od = api.CustomError.fromJson(o.toJson());
-      checkCustomError(od);
+      checkCustomError(od as api.CustomError);
     });
   });
 
@@ -3449,7 +3449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomErrorRule();
       var od = api.CustomErrorRule.fromJson(o.toJson());
-      checkCustomErrorRule(od);
+      checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
 
@@ -3457,7 +3457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomHttpPattern();
       var od = api.CustomHttpPattern.fromJson(o.toJson());
-      checkCustomHttpPattern(od);
+      checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
 
@@ -3465,7 +3465,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeletePeeredDnsDomainMetadata();
       var od = api.DeletePeeredDnsDomainMetadata.fromJson(o.toJson());
-      checkDeletePeeredDnsDomainMetadata(od);
+      checkDeletePeeredDnsDomainMetadata(
+          od as api.DeletePeeredDnsDomainMetadata);
     });
   });
 
@@ -3473,7 +3474,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisableVpcServiceControlsRequest();
       var od = api.DisableVpcServiceControlsRequest.fromJson(o.toJson());
-      checkDisableVpcServiceControlsRequest(od);
+      checkDisableVpcServiceControlsRequest(
+          od as api.DisableVpcServiceControlsRequest);
     });
   });
 
@@ -3481,7 +3483,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDnsRecordSet();
       var od = api.DnsRecordSet.fromJson(o.toJson());
-      checkDnsRecordSet(od);
+      checkDnsRecordSet(od as api.DnsRecordSet);
     });
   });
 
@@ -3489,7 +3491,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDnsZone();
       var od = api.DnsZone.fromJson(o.toJson());
-      checkDnsZone(od);
+      checkDnsZone(od as api.DnsZone);
     });
   });
 
@@ -3497,7 +3499,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentation();
       var od = api.Documentation.fromJson(o.toJson());
-      checkDocumentation(od);
+      checkDocumentation(od as api.Documentation);
     });
   });
 
@@ -3505,7 +3507,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentationRule();
       var od = api.DocumentationRule.fromJson(o.toJson());
-      checkDocumentationRule(od);
+      checkDocumentationRule(od as api.DocumentationRule);
     });
   });
 
@@ -3513,7 +3515,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3521,7 +3523,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableVpcServiceControlsRequest();
       var od = api.EnableVpcServiceControlsRequest.fromJson(o.toJson());
-      checkEnableVpcServiceControlsRequest(od);
+      checkEnableVpcServiceControlsRequest(
+          od as api.EnableVpcServiceControlsRequest);
     });
   });
 
@@ -3529,7 +3532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpoint();
       var od = api.Endpoint.fromJson(o.toJson());
-      checkEndpoint(od);
+      checkEndpoint(od as api.Endpoint);
     });
   });
 
@@ -3537,7 +3540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnum();
       var od = api.Enum.fromJson(o.toJson());
-      checkEnum(od);
+      checkEnum(od as api.Enum);
     });
   });
 
@@ -3545,7 +3548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumValue();
       var od = api.EnumValue.fromJson(o.toJson());
-      checkEnumValue(od);
+      checkEnumValue(od as api.EnumValue);
     });
   });
 
@@ -3553,7 +3556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildField();
       var od = api.Field.fromJson(o.toJson());
-      checkField(od);
+      checkField(od as api.Field);
     });
   });
 
@@ -3562,7 +3565,8 @@
       var o = buildGoogleCloudServicenetworkingV1betaSubnetwork();
       var od =
           api.GoogleCloudServicenetworkingV1betaSubnetwork.fromJson(o.toJson());
-      checkGoogleCloudServicenetworkingV1betaSubnetwork(od);
+      checkGoogleCloudServicenetworkingV1betaSubnetwork(
+          od as api.GoogleCloudServicenetworkingV1betaSubnetwork);
     });
   });
 
@@ -3570,7 +3574,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttp();
       var od = api.Http.fromJson(o.toJson());
-      checkHttp(od);
+      checkHttp(od as api.Http);
     });
   });
 
@@ -3578,7 +3582,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRule();
       var od = api.HttpRule.fromJson(o.toJson());
-      checkHttpRule(od);
+      checkHttpRule(od as api.HttpRule);
     });
   });
 
@@ -3586,7 +3590,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJwtLocation();
       var od = api.JwtLocation.fromJson(o.toJson());
-      checkJwtLocation(od);
+      checkJwtLocation(od as api.JwtLocation);
     });
   });
 
@@ -3594,7 +3598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelDescriptor();
       var od = api.LabelDescriptor.fromJson(o.toJson());
-      checkLabelDescriptor(od);
+      checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
 
@@ -3602,7 +3606,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListConnectionsResponse();
       var od = api.ListConnectionsResponse.fromJson(o.toJson());
-      checkListConnectionsResponse(od);
+      checkListConnectionsResponse(od as api.ListConnectionsResponse);
     });
   });
 
@@ -3610,7 +3614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3618,7 +3622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPeeredDnsDomainsResponse();
       var od = api.ListPeeredDnsDomainsResponse.fromJson(o.toJson());
-      checkListPeeredDnsDomainsResponse(od);
+      checkListPeeredDnsDomainsResponse(od as api.ListPeeredDnsDomainsResponse);
     });
   });
 
@@ -3626,7 +3630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogDescriptor();
       var od = api.LogDescriptor.fromJson(o.toJson());
-      checkLogDescriptor(od);
+      checkLogDescriptor(od as api.LogDescriptor);
     });
   });
 
@@ -3634,7 +3638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogging();
       var od = api.Logging.fromJson(o.toJson());
-      checkLogging(od);
+      checkLogging(od as api.Logging);
     });
   });
 
@@ -3642,7 +3646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoggingDestination();
       var od = api.LoggingDestination.fromJson(o.toJson());
-      checkLoggingDestination(od);
+      checkLoggingDestination(od as api.LoggingDestination);
     });
   });
 
@@ -3650,7 +3654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMethod();
       var od = api.Method.fromJson(o.toJson());
-      checkMethod(od);
+      checkMethod(od as api.Method);
     });
   });
 
@@ -3658,7 +3662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptor();
       var od = api.MetricDescriptor.fromJson(o.toJson());
-      checkMetricDescriptor(od);
+      checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
 
@@ -3666,7 +3670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptorMetadata();
       var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
-      checkMetricDescriptorMetadata(od);
+      checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
 
@@ -3674,7 +3678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricRule();
       var od = api.MetricRule.fromJson(o.toJson());
-      checkMetricRule(od);
+      checkMetricRule(od as api.MetricRule);
     });
   });
 
@@ -3682,7 +3686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMixin();
       var od = api.Mixin.fromJson(o.toJson());
-      checkMixin(od);
+      checkMixin(od as api.Mixin);
     });
   });
 
@@ -3690,7 +3694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceDescriptor();
       var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
-      checkMonitoredResourceDescriptor(od);
+      checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
 
@@ -3698,7 +3702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoring();
       var od = api.Monitoring.fromJson(o.toJson());
-      checkMonitoring(od);
+      checkMonitoring(od as api.Monitoring);
     });
   });
 
@@ -3706,7 +3710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoringDestination();
       var od = api.MonitoringDestination.fromJson(o.toJson());
-      checkMonitoringDestination(od);
+      checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
 
@@ -3714,7 +3718,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOAuthRequirements();
       var od = api.OAuthRequirements.fromJson(o.toJson());
-      checkOAuthRequirements(od);
+      checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
 
@@ -3722,7 +3726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3730,7 +3734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOption();
       var od = api.Option.fromJson(o.toJson());
-      checkOption(od);
+      checkOption(od as api.Option);
     });
   });
 
@@ -3738,7 +3742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPage();
       var od = api.Page.fromJson(o.toJson());
-      checkPage(od);
+      checkPage(od as api.Page);
     });
   });
 
@@ -3746,7 +3750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPeeredDnsDomain();
       var od = api.PeeredDnsDomain.fromJson(o.toJson());
-      checkPeeredDnsDomain(od);
+      checkPeeredDnsDomain(od as api.PeeredDnsDomain);
     });
   });
 
@@ -3754,7 +3758,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPeeredDnsDomainMetadata();
       var od = api.PeeredDnsDomainMetadata.fromJson(o.toJson());
-      checkPeeredDnsDomainMetadata(od);
+      checkPeeredDnsDomainMetadata(od as api.PeeredDnsDomainMetadata);
     });
   });
 
@@ -3762,7 +3766,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyBinding();
       var od = api.PolicyBinding.fromJson(o.toJson());
-      checkPolicyBinding(od);
+      checkPolicyBinding(od as api.PolicyBinding);
     });
   });
 
@@ -3770,7 +3774,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuota();
       var od = api.Quota.fromJson(o.toJson());
-      checkQuota(od);
+      checkQuota(od as api.Quota);
     });
   });
 
@@ -3778,7 +3782,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaLimit();
       var od = api.QuotaLimit.fromJson(o.toJson());
-      checkQuotaLimit(od);
+      checkQuotaLimit(od as api.QuotaLimit);
     });
   });
 
@@ -3786,7 +3790,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRange();
       var od = api.Range.fromJson(o.toJson());
-      checkRange(od);
+      checkRange(od as api.Range);
     });
   });
 
@@ -3794,7 +3798,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRangeReservation();
       var od = api.RangeReservation.fromJson(o.toJson());
-      checkRangeReservation(od);
+      checkRangeReservation(od as api.RangeReservation);
     });
   });
 
@@ -3802,7 +3806,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveDnsRecordSetMetadata();
       var od = api.RemoveDnsRecordSetMetadata.fromJson(o.toJson());
-      checkRemoveDnsRecordSetMetadata(od);
+      checkRemoveDnsRecordSetMetadata(od as api.RemoveDnsRecordSetMetadata);
     });
   });
 
@@ -3810,7 +3814,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveDnsRecordSetRequest();
       var od = api.RemoveDnsRecordSetRequest.fromJson(o.toJson());
-      checkRemoveDnsRecordSetRequest(od);
+      checkRemoveDnsRecordSetRequest(od as api.RemoveDnsRecordSetRequest);
     });
   });
 
@@ -3818,7 +3822,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveDnsRecordSetResponse();
       var od = api.RemoveDnsRecordSetResponse.fromJson(o.toJson());
-      checkRemoveDnsRecordSetResponse(od);
+      checkRemoveDnsRecordSetResponse(od as api.RemoveDnsRecordSetResponse);
     });
   });
 
@@ -3826,7 +3830,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveDnsZoneMetadata();
       var od = api.RemoveDnsZoneMetadata.fromJson(o.toJson());
-      checkRemoveDnsZoneMetadata(od);
+      checkRemoveDnsZoneMetadata(od as api.RemoveDnsZoneMetadata);
     });
   });
 
@@ -3834,7 +3838,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveDnsZoneRequest();
       var od = api.RemoveDnsZoneRequest.fromJson(o.toJson());
-      checkRemoveDnsZoneRequest(od);
+      checkRemoveDnsZoneRequest(od as api.RemoveDnsZoneRequest);
     });
   });
 
@@ -3842,7 +3846,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveDnsZoneResponse();
       var od = api.RemoveDnsZoneResponse.fromJson(o.toJson());
-      checkRemoveDnsZoneResponse(od);
+      checkRemoveDnsZoneResponse(od as api.RemoveDnsZoneResponse);
     });
   });
 
@@ -3850,7 +3854,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoute();
       var od = api.Route.fromJson(o.toJson());
-      checkRoute(od);
+      checkRoute(od as api.Route);
     });
   });
 
@@ -3858,7 +3862,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchRangeRequest();
       var od = api.SearchRangeRequest.fromJson(o.toJson());
-      checkSearchRangeRequest(od);
+      checkSearchRangeRequest(od as api.SearchRangeRequest);
     });
   });
 
@@ -3866,7 +3870,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildService();
       var od = api.Service.fromJson(o.toJson());
-      checkService(od);
+      checkService(od as api.Service);
     });
   });
 
@@ -3874,7 +3878,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceIdentity();
       var od = api.ServiceIdentity.fromJson(o.toJson());
-      checkServiceIdentity(od);
+      checkServiceIdentity(od as api.ServiceIdentity);
     });
   });
 
@@ -3882,7 +3886,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceContext();
       var od = api.SourceContext.fromJson(o.toJson());
-      checkSourceContext(od);
+      checkSourceContext(od as api.SourceContext);
     });
   });
 
@@ -3890,7 +3894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceInfo();
       var od = api.SourceInfo.fromJson(o.toJson());
-      checkSourceInfo(od);
+      checkSourceInfo(od as api.SourceInfo);
     });
   });
 
@@ -3898,7 +3902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3906,7 +3910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubnetwork();
       var od = api.Subnetwork.fromJson(o.toJson());
-      checkSubnetwork(od);
+      checkSubnetwork(od as api.Subnetwork);
     });
   });
 
@@ -3914,7 +3918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameter();
       var od = api.SystemParameter.fromJson(o.toJson());
-      checkSystemParameter(od);
+      checkSystemParameter(od as api.SystemParameter);
     });
   });
 
@@ -3922,7 +3926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameterRule();
       var od = api.SystemParameterRule.fromJson(o.toJson());
-      checkSystemParameterRule(od);
+      checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
 
@@ -3930,7 +3934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameters();
       var od = api.SystemParameters.fromJson(o.toJson());
-      checkSystemParameters(od);
+      checkSystemParameters(od as api.SystemParameters);
     });
   });
 
@@ -3938,7 +3942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildType();
       var od = api.Type.fromJson(o.toJson());
-      checkType(od);
+      checkType(od as api.Type);
     });
   });
 
@@ -3946,7 +3950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDnsRecordSetMetadata();
       var od = api.UpdateDnsRecordSetMetadata.fromJson(o.toJson());
-      checkUpdateDnsRecordSetMetadata(od);
+      checkUpdateDnsRecordSetMetadata(od as api.UpdateDnsRecordSetMetadata);
     });
   });
 
@@ -3954,7 +3958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDnsRecordSetRequest();
       var od = api.UpdateDnsRecordSetRequest.fromJson(o.toJson());
-      checkUpdateDnsRecordSetRequest(od);
+      checkUpdateDnsRecordSetRequest(od as api.UpdateDnsRecordSetRequest);
     });
   });
 
@@ -3962,7 +3966,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsage();
       var od = api.Usage.fromJson(o.toJson());
-      checkUsage(od);
+      checkUsage(od as api.Usage);
     });
   });
 
@@ -3970,7 +3974,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageRule();
       var od = api.UsageRule.fromJson(o.toJson());
-      checkUsageRule(od);
+      checkUsageRule(od as api.UsageRule);
     });
   });
 
@@ -3978,7 +3982,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildValidateConsumerConfigRequest();
       var od = api.ValidateConsumerConfigRequest.fromJson(o.toJson());
-      checkValidateConsumerConfigRequest(od);
+      checkValidateConsumerConfigRequest(
+          od as api.ValidateConsumerConfigRequest);
     });
   });
 
@@ -3986,7 +3991,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildValidateConsumerConfigResponse();
       var od = api.ValidateConsumerConfigResponse.fromJson(o.toJson());
-      checkValidateConsumerConfigResponse(od);
+      checkValidateConsumerConfigResponse(
+          od as api.ValidateConsumerConfigResponse);
     });
   });
 
@@ -3998,8 +4004,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4039,7 +4046,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4087,7 +4094,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4135,7 +4142,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4195,7 +4202,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -4208,8 +4215,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddSubnetworkRequest.fromJson(json);
-        checkAddSubnetworkRequest(obj);
+        var obj = api.AddSubnetworkRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddSubnetworkRequest(obj as api.AddSubnetworkRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4249,7 +4257,7 @@
       res
           .addSubnetwork(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4260,8 +4268,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisableVpcServiceControlsRequest.fromJson(json);
-        checkDisableVpcServiceControlsRequest(obj);
+        var obj = api.DisableVpcServiceControlsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisableVpcServiceControlsRequest(
+            obj as api.DisableVpcServiceControlsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4302,7 +4312,7 @@
           .disableVpcServiceControls(arg_request, arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4313,8 +4323,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EnableVpcServiceControlsRequest.fromJson(json);
-        checkEnableVpcServiceControlsRequest(obj);
+        var obj = api.EnableVpcServiceControlsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnableVpcServiceControlsRequest(
+            obj as api.EnableVpcServiceControlsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4355,7 +4367,7 @@
           .enableVpcServiceControls(arg_request, arg_parent,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4366,8 +4378,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchRangeRequest.fromJson(json);
-        checkSearchRangeRequest(obj);
+        var obj = api.SearchRangeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchRangeRequest(obj as api.SearchRangeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4407,7 +4420,7 @@
       res
           .searchRange(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4418,8 +4431,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ValidateConsumerConfigRequest.fromJson(json);
-        checkValidateConsumerConfigRequest(obj);
+        var obj = api.ValidateConsumerConfigRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkValidateConsumerConfigRequest(
+            obj as api.ValidateConsumerConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4459,7 +4474,8 @@
       res
           .validate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkValidateConsumerConfigResponse(response);
+        checkValidateConsumerConfigResponse(
+            response as api.ValidateConsumerConfigResponse);
       })));
     });
   });
@@ -4472,8 +4488,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Connection.fromJson(json);
-        checkConnection(obj);
+        var obj = api.Connection.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConnection(obj as api.Connection);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4513,7 +4530,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4564,7 +4581,7 @@
       res
           .list(arg_parent, network: arg_network, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListConnectionsResponse(response);
+        checkListConnectionsResponse(response as api.ListConnectionsResponse);
       })));
     });
 
@@ -4577,8 +4594,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Connection.fromJson(json);
-        checkConnection(obj);
+        var obj = api.Connection.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkConnection(obj as api.Connection);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4624,7 +4642,7 @@
               updateMask: arg_updateMask,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -4637,8 +4655,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddDnsRecordSetRequest.fromJson(json);
-        checkAddDnsRecordSetRequest(obj);
+        var obj = api.AddDnsRecordSetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddDnsRecordSetRequest(obj as api.AddDnsRecordSetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4678,7 +4697,7 @@
       res
           .add(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4689,8 +4708,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemoveDnsRecordSetRequest.fromJson(json);
-        checkRemoveDnsRecordSetRequest(obj);
+        var obj = api.RemoveDnsRecordSetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemoveDnsRecordSetRequest(obj as api.RemoveDnsRecordSetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4730,7 +4750,7 @@
       res
           .remove(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4741,8 +4761,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateDnsRecordSetRequest.fromJson(json);
-        checkUpdateDnsRecordSetRequest(obj);
+        var obj = api.UpdateDnsRecordSetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateDnsRecordSetRequest(obj as api.UpdateDnsRecordSetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4782,7 +4803,7 @@
       res
           .update(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -4795,8 +4816,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddDnsZoneRequest.fromJson(json);
-        checkAddDnsZoneRequest(obj);
+        var obj = api.AddDnsZoneRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddDnsZoneRequest(obj as api.AddDnsZoneRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4836,7 +4858,7 @@
       res
           .add(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4847,8 +4869,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemoveDnsZoneRequest.fromJson(json);
-        checkRemoveDnsZoneRequest(obj);
+        var obj = api.RemoveDnsZoneRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemoveDnsZoneRequest(obj as api.RemoveDnsZoneRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4888,7 +4911,7 @@
       res
           .remove(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -4907,8 +4930,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PeeredDnsDomain.fromJson(json);
-        checkPeeredDnsDomain(obj);
+        var obj = api.PeeredDnsDomain.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPeeredDnsDomain(obj as api.PeeredDnsDomain);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4948,7 +4972,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5001,7 +5025,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5054,7 +5078,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPeeredDnsDomainsResponse(response);
+        checkListPeeredDnsDomainsResponse(
+            response as api.ListPeeredDnsDomainsResponse);
       })));
     });
   });
@@ -5067,8 +5092,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddRolesRequest.fromJson(json);
-        checkAddRolesRequest(obj);
+        var obj = api.AddRolesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddRolesRequest(obj as api.AddRolesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5108,7 +5134,7 @@
       res
           .add(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/serviceusage/v1_test.dart b/generated/googleapis/test/serviceusage/v1_test.dart
index ab99ee2..32f49f0 100644
--- a/generated/googleapis/test/serviceusage/v1_test.dart
+++ b/generated/googleapis/test/serviceusage/v1_test.dart
@@ -125,8 +125,8 @@
 
 void checkUnnamed167(core.List<api.Method> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMethod(o[0]);
-  checkMethod(o[1]);
+  checkMethod(o[0] as api.Method);
+  checkMethod(o[1] as api.Method);
 }
 
 core.List<api.Mixin> buildUnnamed168() {
@@ -138,8 +138,8 @@
 
 void checkUnnamed168(core.List<api.Mixin> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMixin(o[0]);
-  checkMixin(o[1]);
+  checkMixin(o[0] as api.Mixin);
+  checkMixin(o[1] as api.Mixin);
 }
 
 core.List<api.Option> buildUnnamed169() {
@@ -151,8 +151,8 @@
 
 void checkUnnamed169(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterApi = 0;
@@ -179,7 +179,7 @@
     checkUnnamed168(o.mixins);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed169(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -195,8 +195,8 @@
 
 void checkUnnamed170(core.List<api.JwtLocation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJwtLocation(o[0]);
-  checkJwtLocation(o[1]);
+  checkJwtLocation(o[0] as api.JwtLocation);
+  checkJwtLocation(o[1] as api.JwtLocation);
 }
 
 core.int buildCounterAuthProvider = 0;
@@ -258,8 +258,8 @@
 
 void checkUnnamed171(core.List<api.AuthProvider> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthProvider(o[0]);
-  checkAuthProvider(o[1]);
+  checkAuthProvider(o[0] as api.AuthProvider);
+  checkAuthProvider(o[1] as api.AuthProvider);
 }
 
 core.List<api.AuthenticationRule> buildUnnamed172() {
@@ -271,8 +271,8 @@
 
 void checkUnnamed172(core.List<api.AuthenticationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthenticationRule(o[0]);
-  checkAuthenticationRule(o[1]);
+  checkAuthenticationRule(o[0] as api.AuthenticationRule);
+  checkAuthenticationRule(o[1] as api.AuthenticationRule);
 }
 
 core.int buildCounterAuthentication = 0;
@@ -305,8 +305,8 @@
 
 void checkUnnamed173(core.List<api.AuthRequirement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuthRequirement(o[0]);
-  checkAuthRequirement(o[1]);
+  checkAuthRequirement(o[0] as api.AuthRequirement);
+  checkAuthRequirement(o[1] as api.AuthRequirement);
 }
 
 core.int buildCounterAuthenticationRule = 0;
@@ -327,7 +327,7 @@
   buildCounterAuthenticationRule++;
   if (buildCounterAuthenticationRule < 3) {
     unittest.expect(o.allowWithoutCredential, unittest.isTrue);
-    checkOAuthRequirements(o.oauth);
+    checkOAuthRequirements(o.oauth as api.OAuthRequirements);
     checkUnnamed173(o.requirements);
     unittest.expect(o.selector, unittest.equals('foo'));
   }
@@ -343,8 +343,8 @@
 
 void checkUnnamed174(core.List<api.BackendRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackendRule(o[0]);
-  checkBackendRule(o[1]);
+  checkBackendRule(o[0] as api.BackendRule);
+  checkBackendRule(o[1] as api.BackendRule);
 }
 
 core.int buildCounterBackend = 0;
@@ -410,8 +410,8 @@
 
 void checkUnnamed175(core.List<api.QuotaOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaOverride(o[0]);
-  checkQuotaOverride(o[1]);
+  checkQuotaOverride(o[0] as api.QuotaOverride);
+  checkQuotaOverride(o[1] as api.QuotaOverride);
 }
 
 core.int buildCounterBatchCreateAdminOverridesResponse = 0;
@@ -443,8 +443,8 @@
 
 void checkUnnamed176(core.List<api.QuotaOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaOverride(o[0]);
-  checkQuotaOverride(o[1]);
+  checkQuotaOverride(o[0] as api.QuotaOverride);
+  checkQuotaOverride(o[1] as api.QuotaOverride);
 }
 
 core.int buildCounterBatchCreateConsumerOverridesResponse = 0;
@@ -509,8 +509,8 @@
 
 void checkUnnamed178(core.List<api.EnableFailure> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnableFailure(o[0]);
-  checkEnableFailure(o[1]);
+  checkEnableFailure(o[0] as api.EnableFailure);
+  checkEnableFailure(o[1] as api.EnableFailure);
 }
 
 core.List<api.GoogleApiServiceusageV1Service> buildUnnamed179() {
@@ -522,8 +522,10 @@
 
 void checkUnnamed179(core.List<api.GoogleApiServiceusageV1Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleApiServiceusageV1Service(o[0]);
-  checkGoogleApiServiceusageV1Service(o[1]);
+  checkGoogleApiServiceusageV1Service(
+      o[0] as api.GoogleApiServiceusageV1Service);
+  checkGoogleApiServiceusageV1Service(
+      o[1] as api.GoogleApiServiceusageV1Service);
 }
 
 core.int buildCounterBatchEnableServicesResponse = 0;
@@ -556,8 +558,10 @@
 
 void checkUnnamed180(core.List<api.GoogleApiServiceusageV1Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleApiServiceusageV1Service(o[0]);
-  checkGoogleApiServiceusageV1Service(o[1]);
+  checkGoogleApiServiceusageV1Service(
+      o[0] as api.GoogleApiServiceusageV1Service);
+  checkGoogleApiServiceusageV1Service(
+      o[1] as api.GoogleApiServiceusageV1Service);
 }
 
 core.int buildCounterBatchGetServicesResponse = 0;
@@ -588,8 +592,8 @@
 
 void checkUnnamed181(core.List<api.BillingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBillingDestination(o[0]);
-  checkBillingDestination(o[1]);
+  checkBillingDestination(o[0] as api.BillingDestination);
+  checkBillingDestination(o[1] as api.BillingDestination);
 }
 
 core.int buildCounterBilling = 0;
@@ -669,8 +673,8 @@
 
 void checkUnnamed183(core.List<api.ContextRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContextRule(o[0]);
-  checkContextRule(o[1]);
+  checkContextRule(o[0] as api.ContextRule);
+  checkContextRule(o[1] as api.ContextRule);
 }
 
 core.int buildCounterContext = 0;
@@ -799,8 +803,8 @@
 
 void checkUnnamed188(core.List<api.CustomErrorRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomErrorRule(o[0]);
-  checkCustomErrorRule(o[1]);
+  checkCustomErrorRule(o[0] as api.CustomErrorRule);
+  checkCustomErrorRule(o[1] as api.CustomErrorRule);
 }
 
 core.List<core.String> buildUnnamed189() {
@@ -914,7 +918,8 @@
 void checkDisableServiceResponse(api.DisableServiceResponse o) {
   buildCounterDisableServiceResponse++;
   if (buildCounterDisableServiceResponse < 3) {
-    checkGoogleApiServiceusageV1Service(o.service);
+    checkGoogleApiServiceusageV1Service(
+        o.service as api.GoogleApiServiceusageV1Service);
   }
   buildCounterDisableServiceResponse--;
 }
@@ -928,8 +933,8 @@
 
 void checkUnnamed190(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.List<api.DocumentationRule> buildUnnamed191() {
@@ -941,8 +946,8 @@
 
 void checkUnnamed191(core.List<api.DocumentationRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDocumentationRule(o[0]);
-  checkDocumentationRule(o[1]);
+  checkDocumentationRule(o[0] as api.DocumentationRule);
+  checkDocumentationRule(o[1] as api.DocumentationRule);
 }
 
 core.int buildCounterDocumentation = 0;
@@ -1062,7 +1067,8 @@
 void checkEnableServiceResponse(api.EnableServiceResponse o) {
   buildCounterEnableServiceResponse++;
   if (buildCounterEnableServiceResponse < 3) {
-    checkGoogleApiServiceusageV1Service(o.service);
+    checkGoogleApiServiceusageV1Service(
+        o.service as api.GoogleApiServiceusageV1Service);
   }
   buildCounterEnableServiceResponse--;
 }
@@ -1114,8 +1120,8 @@
 
 void checkUnnamed193(core.List<api.EnumValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnumValue(o[0]);
-  checkEnumValue(o[1]);
+  checkEnumValue(o[0] as api.EnumValue);
+  checkEnumValue(o[1] as api.EnumValue);
 }
 
 core.List<api.Option> buildUnnamed194() {
@@ -1127,8 +1133,8 @@
 
 void checkUnnamed194(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnum = 0;
@@ -1152,7 +1158,7 @@
     checkUnnamed193(o.enumvalue);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed194(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterEnum--;
@@ -1167,8 +1173,8 @@
 
 void checkUnnamed195(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterEnumValue = 0;
@@ -1203,8 +1209,8 @@
 
 void checkUnnamed196(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterField = 0;
@@ -1259,7 +1265,7 @@
 void checkGetServiceIdentityResponse(api.GetServiceIdentityResponse o) {
   buildCounterGetServiceIdentityResponse++;
   if (buildCounterGetServiceIdentityResponse < 3) {
-    checkServiceIdentity(o.identity);
+    checkServiceIdentity(o.identity as api.ServiceIdentity);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterGetServiceIdentityResponse--;
@@ -1274,8 +1280,8 @@
 
 void checkUnnamed197(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApi(o[0]);
-  checkApi(o[1]);
+  checkApi(o[0] as api.Api);
+  checkApi(o[1] as api.Api);
 }
 
 core.List<api.Endpoint> buildUnnamed198() {
@@ -1287,8 +1293,8 @@
 
 void checkUnnamed198(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEndpoint(o[0]);
-  checkEndpoint(o[1]);
+  checkEndpoint(o[0] as api.Endpoint);
+  checkEndpoint(o[1] as api.Endpoint);
 }
 
 core.List<api.Enum> buildUnnamed199() {
@@ -1300,8 +1306,8 @@
 
 void checkUnnamed199(core.List<api.Enum> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnum(o[0]);
-  checkEnum(o[1]);
+  checkEnum(o[0] as api.Enum);
+  checkEnum(o[1] as api.Enum);
 }
 
 core.List<api.LogDescriptor> buildUnnamed200() {
@@ -1313,8 +1319,8 @@
 
 void checkUnnamed200(core.List<api.LogDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLogDescriptor(o[0]);
-  checkLogDescriptor(o[1]);
+  checkLogDescriptor(o[0] as api.LogDescriptor);
+  checkLogDescriptor(o[1] as api.LogDescriptor);
 }
 
 core.List<api.MetricDescriptor> buildUnnamed201() {
@@ -1326,8 +1332,8 @@
 
 void checkUnnamed201(core.List<api.MetricDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricDescriptor(o[0]);
-  checkMetricDescriptor(o[1]);
+  checkMetricDescriptor(o[0] as api.MetricDescriptor);
+  checkMetricDescriptor(o[1] as api.MetricDescriptor);
 }
 
 core.List<api.MonitoredResourceDescriptor> buildUnnamed202() {
@@ -1339,8 +1345,8 @@
 
 void checkUnnamed202(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResourceDescriptor(o[0]);
-  checkMonitoredResourceDescriptor(o[1]);
+  checkMonitoredResourceDescriptor(o[0] as api.MonitoredResourceDescriptor);
+  checkMonitoredResourceDescriptor(o[1] as api.MonitoredResourceDescriptor);
 }
 
 core.List<api.Type> buildUnnamed203() {
@@ -1352,8 +1358,8 @@
 
 void checkUnnamed203(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.List<api.Type> buildUnnamed204() {
@@ -1365,8 +1371,8 @@
 
 void checkUnnamed204(core.List<api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o[0]);
-  checkType(o[1]);
+  checkType(o[0] as api.Type);
+  checkType(o[1] as api.Type);
 }
 
 core.int buildCounterGoogleApiService = 0;
@@ -1410,32 +1416,32 @@
   buildCounterGoogleApiService++;
   if (buildCounterGoogleApiService < 3) {
     checkUnnamed197(o.apis);
-    checkAuthentication(o.authentication);
-    checkBackend(o.backend);
-    checkBilling(o.billing);
+    checkAuthentication(o.authentication as api.Authentication);
+    checkBackend(o.backend as api.Backend);
+    checkBilling(o.billing as api.Billing);
     unittest.expect(o.configVersion, unittest.equals(42));
-    checkContext(o.context);
-    checkControl(o.control);
-    checkCustomError(o.customError);
-    checkDocumentation(o.documentation);
+    checkContext(o.context as api.Context);
+    checkControl(o.control as api.Control);
+    checkCustomError(o.customError as api.CustomError);
+    checkDocumentation(o.documentation as api.Documentation);
     checkUnnamed198(o.endpoints);
     checkUnnamed199(o.enums);
-    checkHttp(o.http);
+    checkHttp(o.http as api.Http);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkLogging(o.logging);
+    checkLogging(o.logging as api.Logging);
     checkUnnamed200(o.logs);
     checkUnnamed201(o.metrics);
     checkUnnamed202(o.monitoredResources);
-    checkMonitoring(o.monitoring);
+    checkMonitoring(o.monitoring as api.Monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.producerProjectId, unittest.equals('foo'));
-    checkQuota(o.quota);
-    checkSourceInfo(o.sourceInfo);
-    checkSystemParameters(o.systemParameters);
+    checkQuota(o.quota as api.Quota);
+    checkSourceInfo(o.sourceInfo as api.SourceInfo);
+    checkSystemParameters(o.systemParameters as api.SystemParameters);
     checkUnnamed203(o.systemTypes);
     unittest.expect(o.title, unittest.equals('foo'));
     checkUnnamed204(o.types);
-    checkUsage(o.usage);
+    checkUsage(o.usage as api.Usage);
   }
   buildCounterGoogleApiService--;
 }
@@ -1514,7 +1520,8 @@
 void checkGoogleApiServiceusageV1Service(api.GoogleApiServiceusageV1Service o) {
   buildCounterGoogleApiServiceusageV1Service++;
   if (buildCounterGoogleApiServiceusageV1Service < 3) {
-    checkGoogleApiServiceusageV1ServiceConfig(o.config);
+    checkGoogleApiServiceusageV1ServiceConfig(
+        o.config as api.GoogleApiServiceusageV1ServiceConfig);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.parent, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
@@ -1531,8 +1538,8 @@
 
 void checkUnnamed206(core.List<api.Api> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApi(o[0]);
-  checkApi(o[1]);
+  checkApi(o[0] as api.Api);
+  checkApi(o[1] as api.Api);
 }
 
 core.List<api.Endpoint> buildUnnamed207() {
@@ -1544,8 +1551,8 @@
 
 void checkUnnamed207(core.List<api.Endpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEndpoint(o[0]);
-  checkEndpoint(o[1]);
+  checkEndpoint(o[0] as api.Endpoint);
+  checkEndpoint(o[1] as api.Endpoint);
 }
 
 core.List<api.MonitoredResourceDescriptor> buildUnnamed208() {
@@ -1557,8 +1564,8 @@
 
 void checkUnnamed208(core.List<api.MonitoredResourceDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoredResourceDescriptor(o[0]);
-  checkMonitoredResourceDescriptor(o[1]);
+  checkMonitoredResourceDescriptor(o[0] as api.MonitoredResourceDescriptor);
+  checkMonitoredResourceDescriptor(o[1] as api.MonitoredResourceDescriptor);
 }
 
 core.int buildCounterGoogleApiServiceusageV1ServiceConfig = 0;
@@ -1587,15 +1594,15 @@
   buildCounterGoogleApiServiceusageV1ServiceConfig++;
   if (buildCounterGoogleApiServiceusageV1ServiceConfig < 3) {
     checkUnnamed206(o.apis);
-    checkAuthentication(o.authentication);
-    checkDocumentation(o.documentation);
+    checkAuthentication(o.authentication as api.Authentication);
+    checkDocumentation(o.documentation as api.Documentation);
     checkUnnamed207(o.endpoints);
     checkUnnamed208(o.monitoredResources);
-    checkMonitoring(o.monitoring);
+    checkMonitoring(o.monitoring as api.Monitoring);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkQuota(o.quota);
+    checkQuota(o.quota as api.Quota);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkUsage(o.usage);
+    checkUsage(o.usage as api.Usage);
   }
   buildCounterGoogleApiServiceusageV1ServiceConfig--;
 }
@@ -1617,7 +1624,8 @@
     api.GoogleApiServiceusageV1beta1GetServiceIdentityResponse o) {
   buildCounterGoogleApiServiceusageV1beta1GetServiceIdentityResponse++;
   if (buildCounterGoogleApiServiceusageV1beta1GetServiceIdentityResponse < 3) {
-    checkGoogleApiServiceusageV1beta1ServiceIdentity(o.identity);
+    checkGoogleApiServiceusageV1beta1ServiceIdentity(
+        o.identity as api.GoogleApiServiceusageV1beta1ServiceIdentity);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterGoogleApiServiceusageV1beta1GetServiceIdentityResponse--;
@@ -1655,8 +1663,8 @@
 
 void checkUnnamed209(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttp = 0;
@@ -1689,8 +1697,8 @@
 
 void checkUnnamed210(core.List<api.HttpRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHttpRule(o[0]);
-  checkHttpRule(o[1]);
+  checkHttpRule(o[0] as api.HttpRule);
+  checkHttpRule(o[1] as api.HttpRule);
 }
 
 core.int buildCounterHttpRule = 0;
@@ -1720,7 +1728,7 @@
     checkUnnamed210(o.additionalBindings);
     unittest.expect(o.allowHalfDuplex, unittest.isTrue);
     unittest.expect(o.body, unittest.equals('foo'));
-    checkCustomHttpPattern(o.custom);
+    checkCustomHttpPattern(o.custom as api.CustomHttpPattern);
     unittest.expect(o.delete, unittest.equals('foo'));
     unittest.expect(o.get, unittest.equals('foo'));
     unittest.expect(o.patch, unittest.equals('foo'));
@@ -1741,8 +1749,8 @@
 
 void checkUnnamed211(core.List<api.QuotaOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaOverride(o[0]);
-  checkQuotaOverride(o[1]);
+  checkQuotaOverride(o[0] as api.QuotaOverride);
+  checkQuotaOverride(o[1] as api.QuotaOverride);
 }
 
 core.int buildCounterImportAdminOverridesResponse = 0;
@@ -1773,8 +1781,8 @@
 
 void checkUnnamed212(core.List<api.AdminQuotaPolicy> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAdminQuotaPolicy(o[0]);
-  checkAdminQuotaPolicy(o[1]);
+  checkAdminQuotaPolicy(o[0] as api.AdminQuotaPolicy);
+  checkAdminQuotaPolicy(o[1] as api.AdminQuotaPolicy);
 }
 
 core.int buildCounterImportAdminQuotaPoliciesResponse = 0;
@@ -1806,8 +1814,8 @@
 
 void checkUnnamed213(core.List<api.QuotaOverride> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaOverride(o[0]);
-  checkQuotaOverride(o[1]);
+  checkQuotaOverride(o[0] as api.QuotaOverride);
+  checkQuotaOverride(o[1] as api.QuotaOverride);
 }
 
 core.int buildCounterImportConsumerOverridesResponse = 0;
@@ -1885,8 +1893,8 @@
 
 void checkUnnamed214(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1919,8 +1927,10 @@
 
 void checkUnnamed215(core.List<api.GoogleApiServiceusageV1Service> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleApiServiceusageV1Service(o[0]);
-  checkGoogleApiServiceusageV1Service(o[1]);
+  checkGoogleApiServiceusageV1Service(
+      o[0] as api.GoogleApiServiceusageV1Service);
+  checkGoogleApiServiceusageV1Service(
+      o[1] as api.GoogleApiServiceusageV1Service);
 }
 
 core.int buildCounterListServicesResponse = 0;
@@ -1953,8 +1963,8 @@
 
 void checkUnnamed216(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterLogDescriptor = 0;
@@ -1991,8 +2001,8 @@
 
 void checkUnnamed217(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.List<api.LoggingDestination> buildUnnamed218() {
@@ -2004,8 +2014,8 @@
 
 void checkUnnamed218(core.List<api.LoggingDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLoggingDestination(o[0]);
-  checkLoggingDestination(o[1]);
+  checkLoggingDestination(o[0] as api.LoggingDestination);
+  checkLoggingDestination(o[1] as api.LoggingDestination);
 }
 
 core.int buildCounterLogging = 0;
@@ -2072,8 +2082,8 @@
 
 void checkUnnamed220(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterMethod = 0;
@@ -2116,8 +2126,8 @@
 
 void checkUnnamed221(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.List<core.String> buildUnnamed222() {
@@ -2161,7 +2171,7 @@
     unittest.expect(o.displayName, unittest.equals('foo'));
     checkUnnamed221(o.labels);
     unittest.expect(o.launchStage, unittest.equals('foo'));
-    checkMetricDescriptorMetadata(o.metadata);
+    checkMetricDescriptorMetadata(o.metadata as api.MetricDescriptorMetadata);
     unittest.expect(o.metricKind, unittest.equals('foo'));
     checkUnnamed222(o.monitoredResourceTypes);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -2259,8 +2269,8 @@
 
 void checkUnnamed224(core.List<api.LabelDescriptor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLabelDescriptor(o[0]);
-  checkLabelDescriptor(o[1]);
+  checkLabelDescriptor(o[0] as api.LabelDescriptor);
+  checkLabelDescriptor(o[1] as api.LabelDescriptor);
 }
 
 core.int buildCounterMonitoredResourceDescriptor = 0;
@@ -2301,8 +2311,8 @@
 
 void checkUnnamed225(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.List<api.MonitoringDestination> buildUnnamed226() {
@@ -2314,8 +2324,8 @@
 
 void checkUnnamed226(core.List<api.MonitoringDestination> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMonitoringDestination(o[0]);
-  checkMonitoringDestination(o[1]);
+  checkMonitoringDestination(o[0] as api.MonitoringDestination);
+  checkMonitoringDestination(o[1] as api.MonitoringDestination);
 }
 
 core.int buildCounterMonitoring = 0;
@@ -2469,7 +2479,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed228(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed229(o.response);
@@ -2568,8 +2578,8 @@
 
 void checkUnnamed232(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.int buildCounterPage = 0;
@@ -2604,8 +2614,8 @@
 
 void checkUnnamed233(core.List<api.QuotaLimit> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkQuotaLimit(o[0]);
-  checkQuotaLimit(o[1]);
+  checkQuotaLimit(o[0] as api.QuotaLimit);
+  checkQuotaLimit(o[1] as api.QuotaLimit);
 }
 
 core.List<api.MetricRule> buildUnnamed234() {
@@ -2617,8 +2627,8 @@
 
 void checkUnnamed234(core.List<api.MetricRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMetricRule(o[0]);
-  checkMetricRule(o[1]);
+  checkMetricRule(o[0] as api.MetricRule);
+  checkMetricRule(o[1] as api.MetricRule);
 }
 
 core.int buildCounterQuota = 0;
@@ -2932,8 +2942,8 @@
 
 void checkUnnamed241(core.List<api.SystemParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameter(o[0]);
-  checkSystemParameter(o[1]);
+  checkSystemParameter(o[0] as api.SystemParameter);
+  checkSystemParameter(o[1] as api.SystemParameter);
 }
 
 core.int buildCounterSystemParameterRule = 0;
@@ -2966,8 +2976,8 @@
 
 void checkUnnamed242(core.List<api.SystemParameterRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSystemParameterRule(o[0]);
-  checkSystemParameterRule(o[1]);
+  checkSystemParameterRule(o[0] as api.SystemParameterRule);
+  checkSystemParameterRule(o[1] as api.SystemParameterRule);
 }
 
 core.int buildCounterSystemParameters = 0;
@@ -2998,8 +3008,8 @@
 
 void checkUnnamed243(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkField(o[0]);
-  checkField(o[1]);
+  checkField(o[0] as api.Field);
+  checkField(o[1] as api.Field);
 }
 
 core.List<core.String> buildUnnamed244() {
@@ -3024,8 +3034,8 @@
 
 void checkUnnamed245(core.List<api.Option> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOption(o[0]);
-  checkOption(o[1]);
+  checkOption(o[0] as api.Option);
+  checkOption(o[1] as api.Option);
 }
 
 core.int buildCounterType = 0;
@@ -3051,7 +3061,7 @@
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed244(o.oneofs);
     checkUnnamed245(o.options);
-    checkSourceContext(o.sourceContext);
+    checkSourceContext(o.sourceContext as api.SourceContext);
     unittest.expect(o.syntax, unittest.equals('foo'));
   }
   buildCounterType--;
@@ -3079,8 +3089,8 @@
 
 void checkUnnamed247(core.List<api.UsageRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUsageRule(o[0]);
-  checkUsageRule(o[1]);
+  checkUsageRule(o[0] as api.UsageRule);
+  checkUsageRule(o[1] as api.UsageRule);
 }
 
 core.int buildCounterUsage = 0;
@@ -3103,7 +3113,8 @@
     unittest.expect(o.producerNotificationChannel, unittest.equals('foo'));
     checkUnnamed246(o.requirements);
     checkUnnamed247(o.rules);
-    checkGoogleApiServiceIdentity(o.serviceIdentity);
+    checkGoogleApiServiceIdentity(
+        o.serviceIdentity as api.GoogleApiServiceIdentity);
   }
   buildCounterUsage--;
 }
@@ -3149,7 +3160,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAdminQuotaPolicy();
       var od = api.AdminQuotaPolicy.fromJson(o.toJson());
-      checkAdminQuotaPolicy(od);
+      checkAdminQuotaPolicy(od as api.AdminQuotaPolicy);
     });
   });
 
@@ -3157,7 +3168,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApi();
       var od = api.Api.fromJson(o.toJson());
-      checkApi(od);
+      checkApi(od as api.Api);
     });
   });
 
@@ -3165,7 +3176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthProvider();
       var od = api.AuthProvider.fromJson(o.toJson());
-      checkAuthProvider(od);
+      checkAuthProvider(od as api.AuthProvider);
     });
   });
 
@@ -3173,7 +3184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthRequirement();
       var od = api.AuthRequirement.fromJson(o.toJson());
-      checkAuthRequirement(od);
+      checkAuthRequirement(od as api.AuthRequirement);
     });
   });
 
@@ -3181,7 +3192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthentication();
       var od = api.Authentication.fromJson(o.toJson());
-      checkAuthentication(od);
+      checkAuthentication(od as api.Authentication);
     });
   });
 
@@ -3189,7 +3200,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthenticationRule();
       var od = api.AuthenticationRule.fromJson(o.toJson());
-      checkAuthenticationRule(od);
+      checkAuthenticationRule(od as api.AuthenticationRule);
     });
   });
 
@@ -3197,7 +3208,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackend();
       var od = api.Backend.fromJson(o.toJson());
-      checkBackend(od);
+      checkBackend(od as api.Backend);
     });
   });
 
@@ -3205,7 +3216,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackendRule();
       var od = api.BackendRule.fromJson(o.toJson());
-      checkBackendRule(od);
+      checkBackendRule(od as api.BackendRule);
     });
   });
 
@@ -3213,7 +3224,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchCreateAdminOverridesResponse();
       var od = api.BatchCreateAdminOverridesResponse.fromJson(o.toJson());
-      checkBatchCreateAdminOverridesResponse(od);
+      checkBatchCreateAdminOverridesResponse(
+          od as api.BatchCreateAdminOverridesResponse);
     });
   });
 
@@ -3221,7 +3233,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchCreateConsumerOverridesResponse();
       var od = api.BatchCreateConsumerOverridesResponse.fromJson(o.toJson());
-      checkBatchCreateConsumerOverridesResponse(od);
+      checkBatchCreateConsumerOverridesResponse(
+          od as api.BatchCreateConsumerOverridesResponse);
     });
   });
 
@@ -3229,7 +3242,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchEnableServicesRequest();
       var od = api.BatchEnableServicesRequest.fromJson(o.toJson());
-      checkBatchEnableServicesRequest(od);
+      checkBatchEnableServicesRequest(od as api.BatchEnableServicesRequest);
     });
   });
 
@@ -3237,7 +3250,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchEnableServicesResponse();
       var od = api.BatchEnableServicesResponse.fromJson(o.toJson());
-      checkBatchEnableServicesResponse(od);
+      checkBatchEnableServicesResponse(od as api.BatchEnableServicesResponse);
     });
   });
 
@@ -3245,7 +3258,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetServicesResponse();
       var od = api.BatchGetServicesResponse.fromJson(o.toJson());
-      checkBatchGetServicesResponse(od);
+      checkBatchGetServicesResponse(od as api.BatchGetServicesResponse);
     });
   });
 
@@ -3253,7 +3266,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBilling();
       var od = api.Billing.fromJson(o.toJson());
-      checkBilling(od);
+      checkBilling(od as api.Billing);
     });
   });
 
@@ -3261,7 +3274,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBillingDestination();
       var od = api.BillingDestination.fromJson(o.toJson());
-      checkBillingDestination(od);
+      checkBillingDestination(od as api.BillingDestination);
     });
   });
 
@@ -3269,7 +3282,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -3277,7 +3290,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContext();
       var od = api.Context.fromJson(o.toJson());
-      checkContext(od);
+      checkContext(od as api.Context);
     });
   });
 
@@ -3285,7 +3298,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContextRule();
       var od = api.ContextRule.fromJson(o.toJson());
-      checkContextRule(od);
+      checkContextRule(od as api.ContextRule);
     });
   });
 
@@ -3293,7 +3306,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildControl();
       var od = api.Control.fromJson(o.toJson());
-      checkControl(od);
+      checkControl(od as api.Control);
     });
   });
 
@@ -3301,7 +3314,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomError();
       var od = api.CustomError.fromJson(o.toJson());
-      checkCustomError(od);
+      checkCustomError(od as api.CustomError);
     });
   });
 
@@ -3309,7 +3322,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomErrorRule();
       var od = api.CustomErrorRule.fromJson(o.toJson());
-      checkCustomErrorRule(od);
+      checkCustomErrorRule(od as api.CustomErrorRule);
     });
   });
 
@@ -3317,7 +3330,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomHttpPattern();
       var od = api.CustomHttpPattern.fromJson(o.toJson());
-      checkCustomHttpPattern(od);
+      checkCustomHttpPattern(od as api.CustomHttpPattern);
     });
   });
 
@@ -3325,7 +3338,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisableServiceRequest();
       var od = api.DisableServiceRequest.fromJson(o.toJson());
-      checkDisableServiceRequest(od);
+      checkDisableServiceRequest(od as api.DisableServiceRequest);
     });
   });
 
@@ -3333,7 +3346,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDisableServiceResponse();
       var od = api.DisableServiceResponse.fromJson(o.toJson());
-      checkDisableServiceResponse(od);
+      checkDisableServiceResponse(od as api.DisableServiceResponse);
     });
   });
 
@@ -3341,7 +3354,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentation();
       var od = api.Documentation.fromJson(o.toJson());
-      checkDocumentation(od);
+      checkDocumentation(od as api.Documentation);
     });
   });
 
@@ -3349,7 +3362,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDocumentationRule();
       var od = api.DocumentationRule.fromJson(o.toJson());
-      checkDocumentationRule(od);
+      checkDocumentationRule(od as api.DocumentationRule);
     });
   });
 
@@ -3357,7 +3370,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3365,7 +3378,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableFailure();
       var od = api.EnableFailure.fromJson(o.toJson());
-      checkEnableFailure(od);
+      checkEnableFailure(od as api.EnableFailure);
     });
   });
 
@@ -3373,7 +3386,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableServiceRequest();
       var od = api.EnableServiceRequest.fromJson(o.toJson());
-      checkEnableServiceRequest(od);
+      checkEnableServiceRequest(od as api.EnableServiceRequest);
     });
   });
 
@@ -3381,7 +3394,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnableServiceResponse();
       var od = api.EnableServiceResponse.fromJson(o.toJson());
-      checkEnableServiceResponse(od);
+      checkEnableServiceResponse(od as api.EnableServiceResponse);
     });
   });
 
@@ -3389,7 +3402,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEndpoint();
       var od = api.Endpoint.fromJson(o.toJson());
-      checkEndpoint(od);
+      checkEndpoint(od as api.Endpoint);
     });
   });
 
@@ -3397,7 +3410,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnum();
       var od = api.Enum.fromJson(o.toJson());
-      checkEnum(od);
+      checkEnum(od as api.Enum);
     });
   });
 
@@ -3405,7 +3418,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnumValue();
       var od = api.EnumValue.fromJson(o.toJson());
-      checkEnumValue(od);
+      checkEnumValue(od as api.EnumValue);
     });
   });
 
@@ -3413,7 +3426,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildField();
       var od = api.Field.fromJson(o.toJson());
-      checkField(od);
+      checkField(od as api.Field);
     });
   });
 
@@ -3421,7 +3434,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetServiceIdentityResponse();
       var od = api.GetServiceIdentityResponse.fromJson(o.toJson());
-      checkGetServiceIdentityResponse(od);
+      checkGetServiceIdentityResponse(od as api.GetServiceIdentityResponse);
     });
   });
 
@@ -3429,7 +3442,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleApiService();
       var od = api.GoogleApiService.fromJson(o.toJson());
-      checkGoogleApiService(od);
+      checkGoogleApiService(od as api.GoogleApiService);
     });
   });
 
@@ -3437,7 +3450,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleApiServiceIdentity();
       var od = api.GoogleApiServiceIdentity.fromJson(o.toJson());
-      checkGoogleApiServiceIdentity(od);
+      checkGoogleApiServiceIdentity(od as api.GoogleApiServiceIdentity);
     });
   });
 
@@ -3446,7 +3459,8 @@
       var o = buildGoogleApiServiceusageV1OperationMetadata();
       var od =
           api.GoogleApiServiceusageV1OperationMetadata.fromJson(o.toJson());
-      checkGoogleApiServiceusageV1OperationMetadata(od);
+      checkGoogleApiServiceusageV1OperationMetadata(
+          od as api.GoogleApiServiceusageV1OperationMetadata);
     });
   });
 
@@ -3454,7 +3468,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleApiServiceusageV1Service();
       var od = api.GoogleApiServiceusageV1Service.fromJson(o.toJson());
-      checkGoogleApiServiceusageV1Service(od);
+      checkGoogleApiServiceusageV1Service(
+          od as api.GoogleApiServiceusageV1Service);
     });
   });
 
@@ -3462,7 +3477,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleApiServiceusageV1ServiceConfig();
       var od = api.GoogleApiServiceusageV1ServiceConfig.fromJson(o.toJson());
-      checkGoogleApiServiceusageV1ServiceConfig(od);
+      checkGoogleApiServiceusageV1ServiceConfig(
+          od as api.GoogleApiServiceusageV1ServiceConfig);
     });
   });
 
@@ -3473,7 +3489,8 @@
       var od =
           api.GoogleApiServiceusageV1beta1GetServiceIdentityResponse.fromJson(
               o.toJson());
-      checkGoogleApiServiceusageV1beta1GetServiceIdentityResponse(od);
+      checkGoogleApiServiceusageV1beta1GetServiceIdentityResponse(
+          od as api.GoogleApiServiceusageV1beta1GetServiceIdentityResponse);
     });
   });
 
@@ -3482,7 +3499,8 @@
       var o = buildGoogleApiServiceusageV1beta1ServiceIdentity();
       var od =
           api.GoogleApiServiceusageV1beta1ServiceIdentity.fromJson(o.toJson());
-      checkGoogleApiServiceusageV1beta1ServiceIdentity(od);
+      checkGoogleApiServiceusageV1beta1ServiceIdentity(
+          od as api.GoogleApiServiceusageV1beta1ServiceIdentity);
     });
   });
 
@@ -3490,7 +3508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttp();
       var od = api.Http.fromJson(o.toJson());
-      checkHttp(od);
+      checkHttp(od as api.Http);
     });
   });
 
@@ -3498,7 +3516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpRule();
       var od = api.HttpRule.fromJson(o.toJson());
-      checkHttpRule(od);
+      checkHttpRule(od as api.HttpRule);
     });
   });
 
@@ -3506,7 +3524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportAdminOverridesResponse();
       var od = api.ImportAdminOverridesResponse.fromJson(o.toJson());
-      checkImportAdminOverridesResponse(od);
+      checkImportAdminOverridesResponse(od as api.ImportAdminOverridesResponse);
     });
   });
 
@@ -3514,7 +3532,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportAdminQuotaPoliciesResponse();
       var od = api.ImportAdminQuotaPoliciesResponse.fromJson(o.toJson());
-      checkImportAdminQuotaPoliciesResponse(od);
+      checkImportAdminQuotaPoliciesResponse(
+          od as api.ImportAdminQuotaPoliciesResponse);
     });
   });
 
@@ -3522,7 +3541,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportConsumerOverridesResponse();
       var od = api.ImportConsumerOverridesResponse.fromJson(o.toJson());
-      checkImportConsumerOverridesResponse(od);
+      checkImportConsumerOverridesResponse(
+          od as api.ImportConsumerOverridesResponse);
     });
   });
 
@@ -3530,7 +3550,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJwtLocation();
       var od = api.JwtLocation.fromJson(o.toJson());
-      checkJwtLocation(od);
+      checkJwtLocation(od as api.JwtLocation);
     });
   });
 
@@ -3538,7 +3558,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLabelDescriptor();
       var od = api.LabelDescriptor.fromJson(o.toJson());
-      checkLabelDescriptor(od);
+      checkLabelDescriptor(od as api.LabelDescriptor);
     });
   });
 
@@ -3546,7 +3566,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3554,7 +3574,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListServicesResponse();
       var od = api.ListServicesResponse.fromJson(o.toJson());
-      checkListServicesResponse(od);
+      checkListServicesResponse(od as api.ListServicesResponse);
     });
   });
 
@@ -3562,7 +3582,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogDescriptor();
       var od = api.LogDescriptor.fromJson(o.toJson());
-      checkLogDescriptor(od);
+      checkLogDescriptor(od as api.LogDescriptor);
     });
   });
 
@@ -3570,7 +3590,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLogging();
       var od = api.Logging.fromJson(o.toJson());
-      checkLogging(od);
+      checkLogging(od as api.Logging);
     });
   });
 
@@ -3578,7 +3598,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLoggingDestination();
       var od = api.LoggingDestination.fromJson(o.toJson());
-      checkLoggingDestination(od);
+      checkLoggingDestination(od as api.LoggingDestination);
     });
   });
 
@@ -3586,7 +3606,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMethod();
       var od = api.Method.fromJson(o.toJson());
-      checkMethod(od);
+      checkMethod(od as api.Method);
     });
   });
 
@@ -3594,7 +3614,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptor();
       var od = api.MetricDescriptor.fromJson(o.toJson());
-      checkMetricDescriptor(od);
+      checkMetricDescriptor(od as api.MetricDescriptor);
     });
   });
 
@@ -3602,7 +3622,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricDescriptorMetadata();
       var od = api.MetricDescriptorMetadata.fromJson(o.toJson());
-      checkMetricDescriptorMetadata(od);
+      checkMetricDescriptorMetadata(od as api.MetricDescriptorMetadata);
     });
   });
 
@@ -3610,7 +3630,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMetricRule();
       var od = api.MetricRule.fromJson(o.toJson());
-      checkMetricRule(od);
+      checkMetricRule(od as api.MetricRule);
     });
   });
 
@@ -3618,7 +3638,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMixin();
       var od = api.Mixin.fromJson(o.toJson());
-      checkMixin(od);
+      checkMixin(od as api.Mixin);
     });
   });
 
@@ -3626,7 +3646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoredResourceDescriptor();
       var od = api.MonitoredResourceDescriptor.fromJson(o.toJson());
-      checkMonitoredResourceDescriptor(od);
+      checkMonitoredResourceDescriptor(od as api.MonitoredResourceDescriptor);
     });
   });
 
@@ -3634,7 +3654,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoring();
       var od = api.Monitoring.fromJson(o.toJson());
-      checkMonitoring(od);
+      checkMonitoring(od as api.Monitoring);
     });
   });
 
@@ -3642,7 +3662,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitoringDestination();
       var od = api.MonitoringDestination.fromJson(o.toJson());
-      checkMonitoringDestination(od);
+      checkMonitoringDestination(od as api.MonitoringDestination);
     });
   });
 
@@ -3650,7 +3670,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOAuthRequirements();
       var od = api.OAuthRequirements.fromJson(o.toJson());
-      checkOAuthRequirements(od);
+      checkOAuthRequirements(od as api.OAuthRequirements);
     });
   });
 
@@ -3658,7 +3678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3666,7 +3686,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -3674,7 +3694,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOption();
       var od = api.Option.fromJson(o.toJson());
-      checkOption(od);
+      checkOption(od as api.Option);
     });
   });
 
@@ -3682,7 +3702,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPage();
       var od = api.Page.fromJson(o.toJson());
-      checkPage(od);
+      checkPage(od as api.Page);
     });
   });
 
@@ -3690,7 +3710,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuota();
       var od = api.Quota.fromJson(o.toJson());
-      checkQuota(od);
+      checkQuota(od as api.Quota);
     });
   });
 
@@ -3698,7 +3718,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaLimit();
       var od = api.QuotaLimit.fromJson(o.toJson());
-      checkQuotaLimit(od);
+      checkQuotaLimit(od as api.QuotaLimit);
     });
   });
 
@@ -3706,7 +3726,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuotaOverride();
       var od = api.QuotaOverride.fromJson(o.toJson());
-      checkQuotaOverride(od);
+      checkQuotaOverride(od as api.QuotaOverride);
     });
   });
 
@@ -3714,7 +3734,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceIdentity();
       var od = api.ServiceIdentity.fromJson(o.toJson());
-      checkServiceIdentity(od);
+      checkServiceIdentity(od as api.ServiceIdentity);
     });
   });
 
@@ -3722,7 +3742,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceContext();
       var od = api.SourceContext.fromJson(o.toJson());
-      checkSourceContext(od);
+      checkSourceContext(od as api.SourceContext);
     });
   });
 
@@ -3730,7 +3750,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceInfo();
       var od = api.SourceInfo.fromJson(o.toJson());
-      checkSourceInfo(od);
+      checkSourceInfo(od as api.SourceInfo);
     });
   });
 
@@ -3738,7 +3758,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3746,7 +3766,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameter();
       var od = api.SystemParameter.fromJson(o.toJson());
-      checkSystemParameter(od);
+      checkSystemParameter(od as api.SystemParameter);
     });
   });
 
@@ -3754,7 +3774,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameterRule();
       var od = api.SystemParameterRule.fromJson(o.toJson());
-      checkSystemParameterRule(od);
+      checkSystemParameterRule(od as api.SystemParameterRule);
     });
   });
 
@@ -3762,7 +3782,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystemParameters();
       var od = api.SystemParameters.fromJson(o.toJson());
-      checkSystemParameters(od);
+      checkSystemParameters(od as api.SystemParameters);
     });
   });
 
@@ -3770,7 +3790,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildType();
       var od = api.Type.fromJson(o.toJson());
-      checkType(od);
+      checkType(od as api.Type);
     });
   });
 
@@ -3778,7 +3798,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsage();
       var od = api.Usage.fromJson(o.toJson());
-      checkUsage(od);
+      checkUsage(od as api.Usage);
     });
   });
 
@@ -3786,7 +3806,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUsageRule();
       var od = api.UsageRule.fromJson(o.toJson());
-      checkUsageRule(od);
+      checkUsageRule(od as api.UsageRule);
     });
   });
 
@@ -3798,8 +3818,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3839,7 +3860,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3887,7 +3908,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3935,7 +3956,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3996,7 +4017,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -4009,8 +4030,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchEnableServicesRequest.fromJson(json);
-        checkBatchEnableServicesRequest(obj);
+        var obj = api.BatchEnableServicesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchEnableServicesRequest(obj as api.BatchEnableServicesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4050,7 +4072,7 @@
       res
           .batchEnable(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4100,7 +4122,7 @@
       res
           .batchGet(arg_parent, names: arg_names, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetServicesResponse(response);
+        checkBatchGetServicesResponse(response as api.BatchGetServicesResponse);
       })));
     });
 
@@ -4111,8 +4133,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DisableServiceRequest.fromJson(json);
-        checkDisableServiceRequest(obj);
+        var obj = api.DisableServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDisableServiceRequest(obj as api.DisableServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4152,7 +4175,7 @@
       res
           .disable(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4163,8 +4186,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.EnableServiceRequest.fromJson(json);
-        checkEnableServiceRequest(obj);
+        var obj = api.EnableServiceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnableServiceRequest(obj as api.EnableServiceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4204,7 +4228,7 @@
       res
           .enable(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4252,7 +4276,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleApiServiceusageV1Service(response);
+        checkGoogleApiServiceusageV1Service(
+            response as api.GoogleApiServiceusageV1Service);
       })));
     });
 
@@ -4312,7 +4337,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListServicesResponse(response);
+        checkListServicesResponse(response as api.ListServicesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/sheets/v4_test.dart b/generated/googleapis/test/sheets/v4_test.dart
index eb54bc0..801570a 100644
--- a/generated/googleapis/test/sheets/v4_test.dart
+++ b/generated/googleapis/test/sheets/v4_test.dart
@@ -88,7 +88,7 @@
 void checkAddBandingRequest(api.AddBandingRequest o) {
   buildCounterAddBandingRequest++;
   if (buildCounterAddBandingRequest < 3) {
-    checkBandedRange(o.bandedRange);
+    checkBandedRange(o.bandedRange as api.BandedRange);
   }
   buildCounterAddBandingRequest--;
 }
@@ -107,7 +107,7 @@
 void checkAddBandingResponse(api.AddBandingResponse o) {
   buildCounterAddBandingResponse++;
   if (buildCounterAddBandingResponse < 3) {
-    checkBandedRange(o.bandedRange);
+    checkBandedRange(o.bandedRange as api.BandedRange);
   }
   buildCounterAddBandingResponse--;
 }
@@ -126,7 +126,7 @@
 void checkAddChartRequest(api.AddChartRequest o) {
   buildCounterAddChartRequest++;
   if (buildCounterAddChartRequest < 3) {
-    checkEmbeddedChart(o.chart);
+    checkEmbeddedChart(o.chart as api.EmbeddedChart);
   }
   buildCounterAddChartRequest--;
 }
@@ -145,7 +145,7 @@
 void checkAddChartResponse(api.AddChartResponse o) {
   buildCounterAddChartResponse++;
   if (buildCounterAddChartResponse < 3) {
-    checkEmbeddedChart(o.chart);
+    checkEmbeddedChart(o.chart as api.EmbeddedChart);
   }
   buildCounterAddChartResponse--;
 }
@@ -167,7 +167,7 @@
   buildCounterAddConditionalFormatRuleRequest++;
   if (buildCounterAddConditionalFormatRuleRequest < 3) {
     unittest.expect(o.index, unittest.equals(42));
-    checkConditionalFormatRule(o.rule);
+    checkConditionalFormatRule(o.rule as api.ConditionalFormatRule);
   }
   buildCounterAddConditionalFormatRuleRequest--;
 }
@@ -186,7 +186,7 @@
 void checkAddDataSourceRequest(api.AddDataSourceRequest o) {
   buildCounterAddDataSourceRequest++;
   if (buildCounterAddDataSourceRequest < 3) {
-    checkDataSource(o.dataSource);
+    checkDataSource(o.dataSource as api.DataSource);
   }
   buildCounterAddDataSourceRequest--;
 }
@@ -206,8 +206,8 @@
 void checkAddDataSourceResponse(api.AddDataSourceResponse o) {
   buildCounterAddDataSourceResponse++;
   if (buildCounterAddDataSourceResponse < 3) {
-    checkDataExecutionStatus(o.dataExecutionStatus);
-    checkDataSource(o.dataSource);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
+    checkDataSource(o.dataSource as api.DataSource);
   }
   buildCounterAddDataSourceResponse--;
 }
@@ -226,7 +226,7 @@
 void checkAddDimensionGroupRequest(api.AddDimensionGroupRequest o) {
   buildCounterAddDimensionGroupRequest++;
   if (buildCounterAddDimensionGroupRequest < 3) {
-    checkDimensionRange(o.range);
+    checkDimensionRange(o.range as api.DimensionRange);
   }
   buildCounterAddDimensionGroupRequest--;
 }
@@ -240,8 +240,8 @@
 
 void checkUnnamed451(core.List<api.DimensionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionGroup(o[0]);
-  checkDimensionGroup(o[1]);
+  checkDimensionGroup(o[0] as api.DimensionGroup);
+  checkDimensionGroup(o[1] as api.DimensionGroup);
 }
 
 core.int buildCounterAddDimensionGroupResponse = 0;
@@ -277,7 +277,7 @@
 void checkAddFilterViewRequest(api.AddFilterViewRequest o) {
   buildCounterAddFilterViewRequest++;
   if (buildCounterAddFilterViewRequest < 3) {
-    checkFilterView(o.filter);
+    checkFilterView(o.filter as api.FilterView);
   }
   buildCounterAddFilterViewRequest--;
 }
@@ -296,7 +296,7 @@
 void checkAddFilterViewResponse(api.AddFilterViewResponse o) {
   buildCounterAddFilterViewResponse++;
   if (buildCounterAddFilterViewResponse < 3) {
-    checkFilterView(o.filter);
+    checkFilterView(o.filter as api.FilterView);
   }
   buildCounterAddFilterViewResponse--;
 }
@@ -315,7 +315,7 @@
 void checkAddNamedRangeRequest(api.AddNamedRangeRequest o) {
   buildCounterAddNamedRangeRequest++;
   if (buildCounterAddNamedRangeRequest < 3) {
-    checkNamedRange(o.namedRange);
+    checkNamedRange(o.namedRange as api.NamedRange);
   }
   buildCounterAddNamedRangeRequest--;
 }
@@ -334,7 +334,7 @@
 void checkAddNamedRangeResponse(api.AddNamedRangeResponse o) {
   buildCounterAddNamedRangeResponse++;
   if (buildCounterAddNamedRangeResponse < 3) {
-    checkNamedRange(o.namedRange);
+    checkNamedRange(o.namedRange as api.NamedRange);
   }
   buildCounterAddNamedRangeResponse--;
 }
@@ -353,7 +353,7 @@
 void checkAddProtectedRangeRequest(api.AddProtectedRangeRequest o) {
   buildCounterAddProtectedRangeRequest++;
   if (buildCounterAddProtectedRangeRequest < 3) {
-    checkProtectedRange(o.protectedRange);
+    checkProtectedRange(o.protectedRange as api.ProtectedRange);
   }
   buildCounterAddProtectedRangeRequest--;
 }
@@ -372,7 +372,7 @@
 void checkAddProtectedRangeResponse(api.AddProtectedRangeResponse o) {
   buildCounterAddProtectedRangeResponse++;
   if (buildCounterAddProtectedRangeResponse < 3) {
-    checkProtectedRange(o.protectedRange);
+    checkProtectedRange(o.protectedRange as api.ProtectedRange);
   }
   buildCounterAddProtectedRangeResponse--;
 }
@@ -391,7 +391,7 @@
 void checkAddSheetRequest(api.AddSheetRequest o) {
   buildCounterAddSheetRequest++;
   if (buildCounterAddSheetRequest < 3) {
-    checkSheetProperties(o.properties);
+    checkSheetProperties(o.properties as api.SheetProperties);
   }
   buildCounterAddSheetRequest--;
 }
@@ -410,7 +410,7 @@
 void checkAddSheetResponse(api.AddSheetResponse o) {
   buildCounterAddSheetResponse++;
   if (buildCounterAddSheetResponse < 3) {
-    checkSheetProperties(o.properties);
+    checkSheetProperties(o.properties as api.SheetProperties);
   }
   buildCounterAddSheetResponse--;
 }
@@ -429,7 +429,7 @@
 void checkAddSlicerRequest(api.AddSlicerRequest o) {
   buildCounterAddSlicerRequest++;
   if (buildCounterAddSlicerRequest < 3) {
-    checkSlicer(o.slicer);
+    checkSlicer(o.slicer as api.Slicer);
   }
   buildCounterAddSlicerRequest--;
 }
@@ -448,7 +448,7 @@
 void checkAddSlicerResponse(api.AddSlicerResponse o) {
   buildCounterAddSlicerResponse++;
   if (buildCounterAddSlicerResponse < 3) {
-    checkSlicer(o.slicer);
+    checkSlicer(o.slicer as api.Slicer);
   }
   buildCounterAddSlicerResponse--;
 }
@@ -462,8 +462,8 @@
 
 void checkUnnamed452(core.List<api.RowData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRowData(o[0]);
-  checkRowData(o[1]);
+  checkRowData(o[0] as api.RowData);
+  checkRowData(o[1] as api.RowData);
 }
 
 core.int buildCounterAppendCellsRequest = 0;
@@ -530,7 +530,7 @@
   if (buildCounterAppendValuesResponse < 3) {
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
     unittest.expect(o.tableRange, unittest.equals('foo'));
-    checkUpdateValuesResponse(o.updates);
+    checkUpdateValuesResponse(o.updates as api.UpdateValuesResponse);
   }
   buildCounterAppendValuesResponse--;
 }
@@ -551,8 +551,9 @@
 void checkAutoFillRequest(api.AutoFillRequest o) {
   buildCounterAutoFillRequest++;
   if (buildCounterAutoFillRequest < 3) {
-    checkGridRange(o.range);
-    checkSourceAndDestination(o.sourceAndDestination);
+    checkGridRange(o.range as api.GridRange);
+    checkSourceAndDestination(
+        o.sourceAndDestination as api.SourceAndDestination);
     unittest.expect(o.useAlternateSeries, unittest.isTrue);
   }
   buildCounterAutoFillRequest--;
@@ -573,8 +574,9 @@
 void checkAutoResizeDimensionsRequest(api.AutoResizeDimensionsRequest o) {
   buildCounterAutoResizeDimensionsRequest++;
   if (buildCounterAutoResizeDimensionsRequest < 3) {
-    checkDataSourceSheetDimensionRange(o.dataSourceSheetDimensions);
-    checkDimensionRange(o.dimensions);
+    checkDataSourceSheetDimensionRange(
+        o.dataSourceSheetDimensions as api.DataSourceSheetDimensionRange);
+    checkDimensionRange(o.dimensions as api.DimensionRange);
   }
   buildCounterAutoResizeDimensionsRequest--;
 }
@@ -597,9 +599,9 @@
   buildCounterBandedRange++;
   if (buildCounterBandedRange < 3) {
     unittest.expect(o.bandedRangeId, unittest.equals(42));
-    checkBandingProperties(o.columnProperties);
-    checkGridRange(o.range);
-    checkBandingProperties(o.rowProperties);
+    checkBandingProperties(o.columnProperties as api.BandingProperties);
+    checkGridRange(o.range as api.GridRange);
+    checkBandingProperties(o.rowProperties as api.BandingProperties);
   }
   buildCounterBandedRange--;
 }
@@ -625,14 +627,14 @@
 void checkBandingProperties(api.BandingProperties o) {
   buildCounterBandingProperties++;
   if (buildCounterBandingProperties < 3) {
-    checkColor(o.firstBandColor);
-    checkColorStyle(o.firstBandColorStyle);
-    checkColor(o.footerColor);
-    checkColorStyle(o.footerColorStyle);
-    checkColor(o.headerColor);
-    checkColorStyle(o.headerColorStyle);
-    checkColor(o.secondBandColor);
-    checkColorStyle(o.secondBandColorStyle);
+    checkColor(o.firstBandColor as api.Color);
+    checkColorStyle(o.firstBandColorStyle as api.ColorStyle);
+    checkColor(o.footerColor as api.Color);
+    checkColorStyle(o.footerColorStyle as api.ColorStyle);
+    checkColor(o.headerColor as api.Color);
+    checkColorStyle(o.headerColorStyle as api.ColorStyle);
+    checkColor(o.secondBandColor as api.Color);
+    checkColorStyle(o.secondBandColorStyle as api.ColorStyle);
   }
   buildCounterBandingProperties--;
 }
@@ -660,12 +662,12 @@
   if (buildCounterBaselineValueFormat < 3) {
     unittest.expect(o.comparisonType, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkColor(o.negativeColor);
-    checkColorStyle(o.negativeColorStyle);
-    checkTextPosition(o.position);
-    checkColor(o.positiveColor);
-    checkColorStyle(o.positiveColorStyle);
-    checkTextFormat(o.textFormat);
+    checkColor(o.negativeColor as api.Color);
+    checkColorStyle(o.negativeColorStyle as api.ColorStyle);
+    checkTextPosition(o.position as api.TextPosition);
+    checkColor(o.positiveColor as api.Color);
+    checkColorStyle(o.positiveColorStyle as api.ColorStyle);
+    checkTextFormat(o.textFormat as api.TextFormat);
   }
   buildCounterBaselineValueFormat--;
 }
@@ -688,11 +690,12 @@
 void checkBasicChartAxis(api.BasicChartAxis o) {
   buildCounterBasicChartAxis++;
   if (buildCounterBasicChartAxis < 3) {
-    checkTextFormat(o.format);
+    checkTextFormat(o.format as api.TextFormat);
     unittest.expect(o.position, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
-    checkTextPosition(o.titleTextPosition);
-    checkChartAxisViewWindowOptions(o.viewWindowOptions);
+    checkTextPosition(o.titleTextPosition as api.TextPosition);
+    checkChartAxisViewWindowOptions(
+        o.viewWindowOptions as api.ChartAxisViewWindowOptions);
   }
   buildCounterBasicChartAxis--;
 }
@@ -712,7 +715,7 @@
 void checkBasicChartDomain(api.BasicChartDomain o) {
   buildCounterBasicChartDomain++;
   if (buildCounterBasicChartDomain < 3) {
-    checkChartData(o.domain);
+    checkChartData(o.domain as api.ChartData);
     unittest.expect(o.reversed, unittest.isTrue);
   }
   buildCounterBasicChartDomain--;
@@ -737,10 +740,10 @@
 void checkBasicChartSeries(api.BasicChartSeries o) {
   buildCounterBasicChartSeries++;
   if (buildCounterBasicChartSeries < 3) {
-    checkColor(o.color);
-    checkColorStyle(o.colorStyle);
-    checkLineStyle(o.lineStyle);
-    checkChartData(o.series);
+    checkColor(o.color as api.Color);
+    checkColorStyle(o.colorStyle as api.ColorStyle);
+    checkLineStyle(o.lineStyle as api.LineStyle);
+    checkChartData(o.series as api.ChartData);
     unittest.expect(o.targetAxis, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -756,8 +759,8 @@
 
 void checkUnnamed453(core.List<api.BasicChartAxis> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBasicChartAxis(o[0]);
-  checkBasicChartAxis(o[1]);
+  checkBasicChartAxis(o[0] as api.BasicChartAxis);
+  checkBasicChartAxis(o[1] as api.BasicChartAxis);
 }
 
 core.List<api.BasicChartDomain> buildUnnamed454() {
@@ -769,8 +772,8 @@
 
 void checkUnnamed454(core.List<api.BasicChartDomain> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBasicChartDomain(o[0]);
-  checkBasicChartDomain(o[1]);
+  checkBasicChartDomain(o[0] as api.BasicChartDomain);
+  checkBasicChartDomain(o[1] as api.BasicChartDomain);
 }
 
 core.List<api.BasicChartSeries> buildUnnamed455() {
@@ -782,8 +785,8 @@
 
 void checkUnnamed455(core.List<api.BasicChartSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBasicChartSeries(o[0]);
-  checkBasicChartSeries(o[1]);
+  checkBasicChartSeries(o[0] as api.BasicChartSeries);
+  checkBasicChartSeries(o[1] as api.BasicChartSeries);
 }
 
 core.int buildCounterBasicChartSpec = 0;
@@ -834,8 +837,8 @@
 
 void checkUnnamed456(core.Map<core.String, api.FilterCriteria> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterCriteria(o['x']);
-  checkFilterCriteria(o['y']);
+  checkFilterCriteria(o['x'] as api.FilterCriteria);
+  checkFilterCriteria(o['y'] as api.FilterCriteria);
 }
 
 core.List<api.FilterSpec> buildUnnamed457() {
@@ -847,8 +850,8 @@
 
 void checkUnnamed457(core.List<api.FilterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterSpec(o[0]);
-  checkFilterSpec(o[1]);
+  checkFilterSpec(o[0] as api.FilterSpec);
+  checkFilterSpec(o[1] as api.FilterSpec);
 }
 
 core.List<api.SortSpec> buildUnnamed458() {
@@ -860,8 +863,8 @@
 
 void checkUnnamed458(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortSpec(o[0]);
-  checkSortSpec(o[1]);
+  checkSortSpec(o[0] as api.SortSpec);
+  checkSortSpec(o[1] as api.SortSpec);
 }
 
 core.int buildCounterBasicFilter = 0;
@@ -883,7 +886,7 @@
   if (buildCounterBasicFilter < 3) {
     checkUnnamed456(o.criteria);
     checkUnnamed457(o.filterSpecs);
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     checkUnnamed458(o.sortSpecs);
   }
   buildCounterBasicFilter--;
@@ -898,8 +901,8 @@
 
 void checkUnnamed459(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilter(o[0]);
-  checkDataFilter(o[1]);
+  checkDataFilter(o[0] as api.DataFilter);
+  checkDataFilter(o[1] as api.DataFilter);
 }
 
 core.int buildCounterBatchClearValuesByDataFilterRequest = 0;
@@ -1034,8 +1037,8 @@
 
 void checkUnnamed463(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilter(o[0]);
-  checkDataFilter(o[1]);
+  checkDataFilter(o[0] as api.DataFilter);
+  checkDataFilter(o[1] as api.DataFilter);
 }
 
 core.int buildCounterBatchGetValuesByDataFilterRequest = 0;
@@ -1073,8 +1076,8 @@
 
 void checkUnnamed464(core.List<api.MatchedValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMatchedValueRange(o[0]);
-  checkMatchedValueRange(o[1]);
+  checkMatchedValueRange(o[0] as api.MatchedValueRange);
+  checkMatchedValueRange(o[1] as api.MatchedValueRange);
 }
 
 core.int buildCounterBatchGetValuesByDataFilterResponse = 0;
@@ -1109,8 +1112,8 @@
 
 void checkUnnamed465(core.List<api.ValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValueRange(o[0]);
-  checkValueRange(o[1]);
+  checkValueRange(o[0] as api.ValueRange);
+  checkValueRange(o[1] as api.ValueRange);
 }
 
 core.int buildCounterBatchGetValuesResponse = 0;
@@ -1143,8 +1146,8 @@
 
 void checkUnnamed466(core.List<api.Request> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRequest(o[0]);
-  checkRequest(o[1]);
+  checkRequest(o[0] as api.Request);
+  checkRequest(o[1] as api.Request);
 }
 
 core.List<core.String> buildUnnamed467() {
@@ -1194,8 +1197,8 @@
 
 void checkUnnamed468(core.List<api.Response> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResponse(o[0]);
-  checkResponse(o[1]);
+  checkResponse(o[0] as api.Response);
+  checkResponse(o[1] as api.Response);
 }
 
 core.int buildCounterBatchUpdateSpreadsheetResponse = 0;
@@ -1216,7 +1219,7 @@
   if (buildCounterBatchUpdateSpreadsheetResponse < 3) {
     checkUnnamed468(o.replies);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
-    checkSpreadsheet(o.updatedSpreadsheet);
+    checkSpreadsheet(o.updatedSpreadsheet as api.Spreadsheet);
   }
   buildCounterBatchUpdateSpreadsheetResponse--;
 }
@@ -1230,8 +1233,8 @@
 
 void checkUnnamed469(core.List<api.DataFilterValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilterValueRange(o[0]);
-  checkDataFilterValueRange(o[1]);
+  checkDataFilterValueRange(o[0] as api.DataFilterValueRange);
+  checkDataFilterValueRange(o[1] as api.DataFilterValueRange);
 }
 
 core.int buildCounterBatchUpdateValuesByDataFilterRequest = 0;
@@ -1272,8 +1275,10 @@
 
 void checkUnnamed470(core.List<api.UpdateValuesByDataFilterResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUpdateValuesByDataFilterResponse(o[0]);
-  checkUpdateValuesByDataFilterResponse(o[1]);
+  checkUpdateValuesByDataFilterResponse(
+      o[0] as api.UpdateValuesByDataFilterResponse);
+  checkUpdateValuesByDataFilterResponse(
+      o[1] as api.UpdateValuesByDataFilterResponse);
 }
 
 core.int buildCounterBatchUpdateValuesByDataFilterResponse = 0;
@@ -1316,8 +1321,8 @@
 
 void checkUnnamed471(core.List<api.ValueRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkValueRange(o[0]);
-  checkValueRange(o[1]);
+  checkValueRange(o[0] as api.ValueRange);
+  checkValueRange(o[1] as api.ValueRange);
 }
 
 core.int buildCounterBatchUpdateValuesRequest = 0;
@@ -1356,8 +1361,8 @@
 
 void checkUnnamed472(core.List<api.UpdateValuesResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUpdateValuesResponse(o[0]);
-  checkUpdateValuesResponse(o[1]);
+  checkUpdateValuesResponse(o[0] as api.UpdateValuesResponse);
+  checkUpdateValuesResponse(o[1] as api.UpdateValuesResponse);
 }
 
 core.int buildCounterBatchUpdateValuesResponse = 0;
@@ -1406,8 +1411,8 @@
   buildCounterBigQueryDataSourceSpec++;
   if (buildCounterBigQueryDataSourceSpec < 3) {
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkBigQueryQuerySpec(o.querySpec);
-    checkBigQueryTableSpec(o.tableSpec);
+    checkBigQueryQuerySpec(o.querySpec as api.BigQueryQuerySpec);
+    checkBigQueryTableSpec(o.tableSpec as api.BigQueryTableSpec);
   }
   buildCounterBigQueryDataSourceSpec--;
 }
@@ -1463,8 +1468,8 @@
 
 void checkUnnamed473(core.List<api.ConditionValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConditionValue(o[0]);
-  checkConditionValue(o[1]);
+  checkConditionValue(o[0] as api.ConditionValue);
+  checkConditionValue(o[1] as api.ConditionValue);
 }
 
 core.int buildCounterBooleanCondition = 0;
@@ -1503,8 +1508,8 @@
 void checkBooleanRule(api.BooleanRule o) {
   buildCounterBooleanRule++;
   if (buildCounterBooleanRule < 3) {
-    checkBooleanCondition(o.condition);
-    checkCellFormat(o.format);
+    checkBooleanCondition(o.condition as api.BooleanCondition);
+    checkCellFormat(o.format as api.CellFormat);
   }
   buildCounterBooleanRule--;
 }
@@ -1526,8 +1531,8 @@
 void checkBorder(api.Border o) {
   buildCounterBorder++;
   if (buildCounterBorder < 3) {
-    checkColor(o.color);
-    checkColorStyle(o.colorStyle);
+    checkColor(o.color as api.Color);
+    checkColorStyle(o.colorStyle as api.ColorStyle);
     unittest.expect(o.style, unittest.equals('foo'));
     unittest.expect(o.width, unittest.equals(42));
   }
@@ -1551,10 +1556,10 @@
 void checkBorders(api.Borders o) {
   buildCounterBorders++;
   if (buildCounterBorders < 3) {
-    checkBorder(o.bottom);
-    checkBorder(o.left);
-    checkBorder(o.right);
-    checkBorder(o.top);
+    checkBorder(o.bottom as api.Border);
+    checkBorder(o.left as api.Border);
+    checkBorder(o.right as api.Border);
+    checkBorder(o.top as api.Border);
   }
   buildCounterBorders--;
 }
@@ -1584,18 +1589,18 @@
 void checkBubbleChartSpec(api.BubbleChartSpec o) {
   buildCounterBubbleChartSpec++;
   if (buildCounterBubbleChartSpec < 3) {
-    checkColor(o.bubbleBorderColor);
-    checkColorStyle(o.bubbleBorderColorStyle);
-    checkChartData(o.bubbleLabels);
+    checkColor(o.bubbleBorderColor as api.Color);
+    checkColorStyle(o.bubbleBorderColorStyle as api.ColorStyle);
+    checkChartData(o.bubbleLabels as api.ChartData);
     unittest.expect(o.bubbleMaxRadiusSize, unittest.equals(42));
     unittest.expect(o.bubbleMinRadiusSize, unittest.equals(42));
     unittest.expect(o.bubbleOpacity, unittest.equals(42.0));
-    checkChartData(o.bubbleSizes);
-    checkTextFormat(o.bubbleTextStyle);
-    checkChartData(o.domain);
-    checkChartData(o.groupIds);
+    checkChartData(o.bubbleSizes as api.ChartData);
+    checkTextFormat(o.bubbleTextStyle as api.TextFormat);
+    checkChartData(o.domain as api.ChartData);
+    checkChartData(o.groupIds as api.ChartData);
     unittest.expect(o.legendPosition, unittest.equals('foo'));
-    checkChartData(o.series);
+    checkChartData(o.series as api.ChartData);
   }
   buildCounterBubbleChartSpec--;
 }
@@ -1609,8 +1614,8 @@
 
 void checkUnnamed474(core.List<api.CandlestickData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCandlestickData(o[0]);
-  checkCandlestickData(o[1]);
+  checkCandlestickData(o[0] as api.CandlestickData);
+  checkCandlestickData(o[1] as api.CandlestickData);
 }
 
 core.int buildCounterCandlestickChartSpec = 0;
@@ -1629,7 +1634,7 @@
   buildCounterCandlestickChartSpec++;
   if (buildCounterCandlestickChartSpec < 3) {
     checkUnnamed474(o.data);
-    checkCandlestickDomain(o.domain);
+    checkCandlestickDomain(o.domain as api.CandlestickDomain);
   }
   buildCounterCandlestickChartSpec--;
 }
@@ -1651,10 +1656,10 @@
 void checkCandlestickData(api.CandlestickData o) {
   buildCounterCandlestickData++;
   if (buildCounterCandlestickData < 3) {
-    checkCandlestickSeries(o.closeSeries);
-    checkCandlestickSeries(o.highSeries);
-    checkCandlestickSeries(o.lowSeries);
-    checkCandlestickSeries(o.openSeries);
+    checkCandlestickSeries(o.closeSeries as api.CandlestickSeries);
+    checkCandlestickSeries(o.highSeries as api.CandlestickSeries);
+    checkCandlestickSeries(o.lowSeries as api.CandlestickSeries);
+    checkCandlestickSeries(o.openSeries as api.CandlestickSeries);
   }
   buildCounterCandlestickData--;
 }
@@ -1674,7 +1679,7 @@
 void checkCandlestickDomain(api.CandlestickDomain o) {
   buildCounterCandlestickDomain++;
   if (buildCounterCandlestickDomain < 3) {
-    checkChartData(o.data);
+    checkChartData(o.data as api.ChartData);
     unittest.expect(o.reversed, unittest.isTrue);
   }
   buildCounterCandlestickDomain--;
@@ -1694,7 +1699,7 @@
 void checkCandlestickSeries(api.CandlestickSeries o) {
   buildCounterCandlestickSeries++;
   if (buildCounterCandlestickSeries < 3) {
-    checkChartData(o.data);
+    checkChartData(o.data as api.ChartData);
   }
   buildCounterCandlestickSeries--;
 }
@@ -1708,8 +1713,8 @@
 
 void checkUnnamed475(core.List<api.TextFormatRun> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTextFormatRun(o[0]);
-  checkTextFormatRun(o[1]);
+  checkTextFormatRun(o[0] as api.TextFormatRun);
+  checkTextFormatRun(o[1] as api.TextFormatRun);
 }
 
 core.int buildCounterCellData = 0;
@@ -1737,18 +1742,18 @@
 void checkCellData(api.CellData o) {
   buildCounterCellData++;
   if (buildCounterCellData < 3) {
-    checkDataSourceFormula(o.dataSourceFormula);
-    checkDataSourceTable(o.dataSourceTable);
-    checkDataValidationRule(o.dataValidation);
-    checkCellFormat(o.effectiveFormat);
-    checkExtendedValue(o.effectiveValue);
+    checkDataSourceFormula(o.dataSourceFormula as api.DataSourceFormula);
+    checkDataSourceTable(o.dataSourceTable as api.DataSourceTable);
+    checkDataValidationRule(o.dataValidation as api.DataValidationRule);
+    checkCellFormat(o.effectiveFormat as api.CellFormat);
+    checkExtendedValue(o.effectiveValue as api.ExtendedValue);
     unittest.expect(o.formattedValue, unittest.equals('foo'));
     unittest.expect(o.hyperlink, unittest.equals('foo'));
     unittest.expect(o.note, unittest.equals('foo'));
-    checkPivotTable(o.pivotTable);
+    checkPivotTable(o.pivotTable as api.PivotTable);
     checkUnnamed475(o.textFormatRuns);
-    checkCellFormat(o.userEnteredFormat);
-    checkExtendedValue(o.userEnteredValue);
+    checkCellFormat(o.userEnteredFormat as api.CellFormat);
+    checkExtendedValue(o.userEnteredValue as api.ExtendedValue);
   }
   buildCounterCellData--;
 }
@@ -1778,16 +1783,16 @@
 void checkCellFormat(api.CellFormat o) {
   buildCounterCellFormat++;
   if (buildCounterCellFormat < 3) {
-    checkColor(o.backgroundColor);
-    checkColorStyle(o.backgroundColorStyle);
-    checkBorders(o.borders);
+    checkColor(o.backgroundColor as api.Color);
+    checkColorStyle(o.backgroundColorStyle as api.ColorStyle);
+    checkBorders(o.borders as api.Borders);
     unittest.expect(o.horizontalAlignment, unittest.equals('foo'));
     unittest.expect(o.hyperlinkDisplayType, unittest.equals('foo'));
-    checkNumberFormat(o.numberFormat);
-    checkPadding(o.padding);
+    checkNumberFormat(o.numberFormat as api.NumberFormat);
+    checkPadding(o.padding as api.Padding);
     unittest.expect(o.textDirection, unittest.equals('foo'));
-    checkTextFormat(o.textFormat);
-    checkTextRotation(o.textRotation);
+    checkTextFormat(o.textFormat as api.TextFormat);
+    checkTextRotation(o.textRotation as api.TextRotation);
     unittest.expect(o.verticalAlignment, unittest.equals('foo'));
     unittest.expect(o.wrapStrategy, unittest.equals('foo'));
   }
@@ -1856,9 +1861,10 @@
   buildCounterChartData++;
   if (buildCounterChartData < 3) {
     unittest.expect(o.aggregateType, unittest.equals('foo'));
-    checkDataSourceColumnReference(o.columnReference);
-    checkChartGroupRule(o.groupRule);
-    checkChartSourceRange(o.sourceRange);
+    checkDataSourceColumnReference(
+        o.columnReference as api.DataSourceColumnReference);
+    checkChartGroupRule(o.groupRule as api.ChartGroupRule);
+    checkChartSourceRange(o.sourceRange as api.ChartSourceRange);
   }
   buildCounterChartData--;
 }
@@ -1897,8 +1903,8 @@
 void checkChartGroupRule(api.ChartGroupRule o) {
   buildCounterChartGroupRule++;
   if (buildCounterChartGroupRule < 3) {
-    checkChartDateTimeRule(o.dateTimeRule);
-    checkChartHistogramRule(o.histogramRule);
+    checkChartDateTimeRule(o.dateTimeRule as api.ChartDateTimeRule);
+    checkChartHistogramRule(o.histogramRule as api.ChartHistogramRule);
   }
   buildCounterChartGroupRule--;
 }
@@ -1935,8 +1941,8 @@
 
 void checkUnnamed476(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGridRange(o[0]);
-  checkGridRange(o[1]);
+  checkGridRange(o[0] as api.GridRange);
+  checkGridRange(o[1] as api.GridRange);
 }
 
 core.int buildCounterChartSourceRange = 0;
@@ -1967,8 +1973,8 @@
 
 void checkUnnamed477(core.List<api.FilterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterSpec(o[0]);
-  checkFilterSpec(o[1]);
+  checkFilterSpec(o[0] as api.FilterSpec);
+  checkFilterSpec(o[1] as api.FilterSpec);
 }
 
 core.List<api.SortSpec> buildUnnamed478() {
@@ -1980,8 +1986,8 @@
 
 void checkUnnamed478(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortSpec(o[0]);
-  checkSortSpec(o[1]);
+  checkSortSpec(o[0] as api.SortSpec);
+  checkSortSpec(o[1] as api.SortSpec);
 }
 
 core.int buildCounterChartSpec = 0;
@@ -2022,29 +2028,30 @@
   buildCounterChartSpec++;
   if (buildCounterChartSpec < 3) {
     unittest.expect(o.altText, unittest.equals('foo'));
-    checkColor(o.backgroundColor);
-    checkColorStyle(o.backgroundColorStyle);
-    checkBasicChartSpec(o.basicChart);
-    checkBubbleChartSpec(o.bubbleChart);
-    checkCandlestickChartSpec(o.candlestickChart);
-    checkDataSourceChartProperties(o.dataSourceChartProperties);
+    checkColor(o.backgroundColor as api.Color);
+    checkColorStyle(o.backgroundColorStyle as api.ColorStyle);
+    checkBasicChartSpec(o.basicChart as api.BasicChartSpec);
+    checkBubbleChartSpec(o.bubbleChart as api.BubbleChartSpec);
+    checkCandlestickChartSpec(o.candlestickChart as api.CandlestickChartSpec);
+    checkDataSourceChartProperties(
+        o.dataSourceChartProperties as api.DataSourceChartProperties);
     checkUnnamed477(o.filterSpecs);
     unittest.expect(o.fontName, unittest.equals('foo'));
     unittest.expect(o.hiddenDimensionStrategy, unittest.equals('foo'));
-    checkHistogramChartSpec(o.histogramChart);
+    checkHistogramChartSpec(o.histogramChart as api.HistogramChartSpec);
     unittest.expect(o.maximized, unittest.isTrue);
-    checkOrgChartSpec(o.orgChart);
-    checkPieChartSpec(o.pieChart);
-    checkScorecardChartSpec(o.scorecardChart);
+    checkOrgChartSpec(o.orgChart as api.OrgChartSpec);
+    checkPieChartSpec(o.pieChart as api.PieChartSpec);
+    checkScorecardChartSpec(o.scorecardChart as api.ScorecardChartSpec);
     checkUnnamed478(o.sortSpecs);
     unittest.expect(o.subtitle, unittest.equals('foo'));
-    checkTextFormat(o.subtitleTextFormat);
-    checkTextPosition(o.subtitleTextPosition);
+    checkTextFormat(o.subtitleTextFormat as api.TextFormat);
+    checkTextPosition(o.subtitleTextPosition as api.TextPosition);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkTextFormat(o.titleTextFormat);
-    checkTextPosition(o.titleTextPosition);
-    checkTreemapChartSpec(o.treemapChart);
-    checkWaterfallChartSpec(o.waterfallChart);
+    checkTextFormat(o.titleTextFormat as api.TextFormat);
+    checkTextPosition(o.titleTextPosition as api.TextPosition);
+    checkTreemapChartSpec(o.treemapChart as api.TreemapChartSpec);
+    checkWaterfallChartSpec(o.waterfallChart as api.WaterfallChartSpec);
   }
   buildCounterChartSpec--;
 }
@@ -2144,7 +2151,7 @@
 void checkColorStyle(api.ColorStyle o) {
   buildCounterColorStyle++;
   if (buildCounterColorStyle < 3) {
-    checkColor(o.rgbColor);
+    checkColor(o.rgbColor as api.Color);
     unittest.expect(o.themeColor, unittest.equals('foo'));
   }
   buildCounterColorStyle--;
@@ -2180,8 +2187,8 @@
 
 void checkUnnamed479(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGridRange(o[0]);
-  checkGridRange(o[1]);
+  checkGridRange(o[0] as api.GridRange);
+  checkGridRange(o[1] as api.GridRange);
 }
 
 core.int buildCounterConditionalFormatRule = 0;
@@ -2200,8 +2207,8 @@
 void checkConditionalFormatRule(api.ConditionalFormatRule o) {
   buildCounterConditionalFormatRule++;
   if (buildCounterConditionalFormatRule < 3) {
-    checkBooleanRule(o.booleanRule);
-    checkGradientRule(o.gradientRule);
+    checkBooleanRule(o.booleanRule as api.BooleanRule);
+    checkGradientRule(o.gradientRule as api.GradientRule);
     checkUnnamed479(o.ranges);
   }
   buildCounterConditionalFormatRule--;
@@ -2224,10 +2231,10 @@
 void checkCopyPasteRequest(api.CopyPasteRequest o) {
   buildCounterCopyPasteRequest++;
   if (buildCounterCopyPasteRequest < 3) {
-    checkGridRange(o.destination);
+    checkGridRange(o.destination as api.GridRange);
     unittest.expect(o.pasteOrientation, unittest.equals('foo'));
     unittest.expect(o.pasteType, unittest.equals('foo'));
-    checkGridRange(o.source);
+    checkGridRange(o.source as api.GridRange);
   }
   buildCounterCopyPasteRequest--;
 }
@@ -2267,7 +2274,7 @@
 void checkCreateDeveloperMetadataRequest(api.CreateDeveloperMetadataRequest o) {
   buildCounterCreateDeveloperMetadataRequest++;
   if (buildCounterCreateDeveloperMetadataRequest < 3) {
-    checkDeveloperMetadata(o.developerMetadata);
+    checkDeveloperMetadata(o.developerMetadata as api.DeveloperMetadata);
   }
   buildCounterCreateDeveloperMetadataRequest--;
 }
@@ -2287,7 +2294,7 @@
     api.CreateDeveloperMetadataResponse o) {
   buildCounterCreateDeveloperMetadataResponse++;
   if (buildCounterCreateDeveloperMetadataResponse < 3) {
-    checkDeveloperMetadata(o.developerMetadata);
+    checkDeveloperMetadata(o.developerMetadata as api.DeveloperMetadata);
   }
   buildCounterCreateDeveloperMetadataResponse--;
 }
@@ -2308,9 +2315,9 @@
 void checkCutPasteRequest(api.CutPasteRequest o) {
   buildCounterCutPasteRequest++;
   if (buildCounterCutPasteRequest < 3) {
-    checkGridCoordinate(o.destination);
+    checkGridCoordinate(o.destination as api.GridCoordinate);
     unittest.expect(o.pasteType, unittest.equals('foo'));
-    checkGridRange(o.source);
+    checkGridRange(o.source as api.GridRange);
   }
   buildCounterCutPasteRequest--;
 }
@@ -2357,8 +2364,9 @@
   buildCounterDataFilter++;
   if (buildCounterDataFilter < 3) {
     unittest.expect(o.a1Range, unittest.equals('foo'));
-    checkDeveloperMetadataLookup(o.developerMetadataLookup);
-    checkGridRange(o.gridRange);
+    checkDeveloperMetadataLookup(
+        o.developerMetadataLookup as api.DeveloperMetadataLookup);
+    checkGridRange(o.gridRange as api.GridRange);
   }
   buildCounterDataFilter--;
 }
@@ -2421,7 +2429,7 @@
 void checkDataFilterValueRange(api.DataFilterValueRange o) {
   buildCounterDataFilterValueRange++;
   if (buildCounterDataFilterValueRange < 3) {
-    checkDataFilter(o.dataFilter);
+    checkDataFilter(o.dataFilter as api.DataFilter);
     unittest.expect(o.majorDimension, unittest.equals('foo'));
     checkUnnamed481(o.values);
   }
@@ -2437,8 +2445,8 @@
 
 void checkUnnamed482(core.List<api.DataSourceColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceColumn(o[0]);
-  checkDataSourceColumn(o[1]);
+  checkDataSourceColumn(o[0] as api.DataSourceColumn);
+  checkDataSourceColumn(o[1] as api.DataSourceColumn);
 }
 
 core.int buildCounterDataSource = 0;
@@ -2461,7 +2469,7 @@
     checkUnnamed482(o.calculatedColumns);
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
     unittest.expect(o.sheetId, unittest.equals(42));
-    checkDataSourceSpec(o.spec);
+    checkDataSourceSpec(o.spec as api.DataSourceSpec);
   }
   buildCounterDataSource--;
 }
@@ -2481,7 +2489,7 @@
 void checkDataSourceChartProperties(api.DataSourceChartProperties o) {
   buildCounterDataSourceChartProperties++;
   if (buildCounterDataSourceChartProperties < 3) {
-    checkDataExecutionStatus(o.dataExecutionStatus);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
   }
   buildCounterDataSourceChartProperties--;
@@ -2503,7 +2511,8 @@
   buildCounterDataSourceColumn++;
   if (buildCounterDataSourceColumn < 3) {
     unittest.expect(o.formula, unittest.equals('foo'));
-    checkDataSourceColumnReference(o.reference);
+    checkDataSourceColumnReference(
+        o.reference as api.DataSourceColumnReference);
   }
   buildCounterDataSourceColumn--;
 }
@@ -2542,7 +2551,7 @@
 void checkDataSourceFormula(api.DataSourceFormula o) {
   buildCounterDataSourceFormula++;
   if (buildCounterDataSourceFormula < 3) {
-    checkDataExecutionStatus(o.dataExecutionStatus);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
   }
   buildCounterDataSourceFormula--;
@@ -2567,9 +2576,9 @@
   buildCounterDataSourceObjectReference++;
   if (buildCounterDataSourceObjectReference < 3) {
     unittest.expect(o.chartId, unittest.equals(42));
-    checkGridCoordinate(o.dataSourceFormulaCell);
-    checkGridCoordinate(o.dataSourcePivotTableAnchorCell);
-    checkGridCoordinate(o.dataSourceTableAnchorCell);
+    checkGridCoordinate(o.dataSourceFormulaCell as api.GridCoordinate);
+    checkGridCoordinate(o.dataSourcePivotTableAnchorCell as api.GridCoordinate);
+    checkGridCoordinate(o.dataSourceTableAnchorCell as api.GridCoordinate);
     unittest.expect(o.sheetId, unittest.equals('foo'));
   }
   buildCounterDataSourceObjectReference--;
@@ -2584,8 +2593,8 @@
 
 void checkUnnamed483(core.List<api.DataSourceObjectReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceObjectReference(o[0]);
-  checkDataSourceObjectReference(o[1]);
+  checkDataSourceObjectReference(o[0] as api.DataSourceObjectReference);
+  checkDataSourceObjectReference(o[1] as api.DataSourceObjectReference);
 }
 
 core.int buildCounterDataSourceObjectReferences = 0;
@@ -2625,7 +2634,7 @@
   if (buildCounterDataSourceParameter < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.namedRangeId, unittest.equals('foo'));
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterDataSourceParameter--;
 }
@@ -2644,7 +2653,7 @@
 void checkDataSourceRefreshDailySchedule(api.DataSourceRefreshDailySchedule o) {
   buildCounterDataSourceRefreshDailySchedule++;
   if (buildCounterDataSourceRefreshDailySchedule < 3) {
-    checkTimeOfDay(o.startTime);
+    checkTimeOfDay(o.startTime as api.TimeOfDay);
   }
   buildCounterDataSourceRefreshDailySchedule--;
 }
@@ -2679,7 +2688,7 @@
   buildCounterDataSourceRefreshMonthlySchedule++;
   if (buildCounterDataSourceRefreshMonthlySchedule < 3) {
     checkUnnamed484(o.daysOfMonth);
-    checkTimeOfDay(o.startTime);
+    checkTimeOfDay(o.startTime as api.TimeOfDay);
   }
   buildCounterDataSourceRefreshMonthlySchedule--;
 }
@@ -2703,12 +2712,15 @@
 void checkDataSourceRefreshSchedule(api.DataSourceRefreshSchedule o) {
   buildCounterDataSourceRefreshSchedule++;
   if (buildCounterDataSourceRefreshSchedule < 3) {
-    checkDataSourceRefreshDailySchedule(o.dailySchedule);
+    checkDataSourceRefreshDailySchedule(
+        o.dailySchedule as api.DataSourceRefreshDailySchedule);
     unittest.expect(o.enabled, unittest.isTrue);
-    checkDataSourceRefreshMonthlySchedule(o.monthlySchedule);
-    checkInterval(o.nextRun);
+    checkDataSourceRefreshMonthlySchedule(
+        o.monthlySchedule as api.DataSourceRefreshMonthlySchedule);
+    checkInterval(o.nextRun as api.Interval);
     unittest.expect(o.refreshScope, unittest.equals('foo'));
-    checkDataSourceRefreshWeeklySchedule(o.weeklySchedule);
+    checkDataSourceRefreshWeeklySchedule(
+        o.weeklySchedule as api.DataSourceRefreshWeeklySchedule);
   }
   buildCounterDataSourceRefreshSchedule--;
 }
@@ -2743,7 +2755,7 @@
   buildCounterDataSourceRefreshWeeklySchedule++;
   if (buildCounterDataSourceRefreshWeeklySchedule < 3) {
     checkUnnamed485(o.daysOfWeek);
-    checkTimeOfDay(o.startTime);
+    checkTimeOfDay(o.startTime as api.TimeOfDay);
   }
   buildCounterDataSourceRefreshWeeklySchedule--;
 }
@@ -2757,8 +2769,8 @@
 
 void checkUnnamed486(core.List<api.DataSourceColumnReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceColumnReference(o[0]);
-  checkDataSourceColumnReference(o[1]);
+  checkDataSourceColumnReference(o[0] as api.DataSourceColumnReference);
+  checkDataSourceColumnReference(o[1] as api.DataSourceColumnReference);
 }
 
 core.int buildCounterDataSourceSheetDimensionRange = 0;
@@ -2791,8 +2803,8 @@
 
 void checkUnnamed487(core.List<api.DataSourceColumn> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceColumn(o[0]);
-  checkDataSourceColumn(o[1]);
+  checkDataSourceColumn(o[0] as api.DataSourceColumn);
+  checkDataSourceColumn(o[1] as api.DataSourceColumn);
 }
 
 core.int buildCounterDataSourceSheetProperties = 0;
@@ -2812,7 +2824,7 @@
   buildCounterDataSourceSheetProperties++;
   if (buildCounterDataSourceSheetProperties < 3) {
     checkUnnamed487(o.columns);
-    checkDataExecutionStatus(o.dataExecutionStatus);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
   }
   buildCounterDataSourceSheetProperties--;
@@ -2827,8 +2839,8 @@
 
 void checkUnnamed488(core.List<api.DataSourceParameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceParameter(o[0]);
-  checkDataSourceParameter(o[1]);
+  checkDataSourceParameter(o[0] as api.DataSourceParameter);
+  checkDataSourceParameter(o[1] as api.DataSourceParameter);
 }
 
 core.int buildCounterDataSourceSpec = 0;
@@ -2846,7 +2858,7 @@
 void checkDataSourceSpec(api.DataSourceSpec o) {
   buildCounterDataSourceSpec++;
   if (buildCounterDataSourceSpec < 3) {
-    checkBigQueryDataSourceSpec(o.bigQuery);
+    checkBigQueryDataSourceSpec(o.bigQuery as api.BigQueryDataSourceSpec);
     checkUnnamed488(o.parameters);
   }
   buildCounterDataSourceSpec--;
@@ -2861,8 +2873,8 @@
 
 void checkUnnamed489(core.List<api.DataSourceColumnReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceColumnReference(o[0]);
-  checkDataSourceColumnReference(o[1]);
+  checkDataSourceColumnReference(o[0] as api.DataSourceColumnReference);
+  checkDataSourceColumnReference(o[1] as api.DataSourceColumnReference);
 }
 
 core.List<api.FilterSpec> buildUnnamed490() {
@@ -2874,8 +2886,8 @@
 
 void checkUnnamed490(core.List<api.FilterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterSpec(o[0]);
-  checkFilterSpec(o[1]);
+  checkFilterSpec(o[0] as api.FilterSpec);
+  checkFilterSpec(o[1] as api.FilterSpec);
 }
 
 core.List<api.SortSpec> buildUnnamed491() {
@@ -2887,8 +2899,8 @@
 
 void checkUnnamed491(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortSpec(o[0]);
-  checkSortSpec(o[1]);
+  checkSortSpec(o[0] as api.SortSpec);
+  checkSortSpec(o[1] as api.SortSpec);
 }
 
 core.int buildCounterDataSourceTable = 0;
@@ -2913,7 +2925,7 @@
   if (buildCounterDataSourceTable < 3) {
     unittest.expect(o.columnSelectionType, unittest.equals('foo'));
     checkUnnamed489(o.columns);
-    checkDataExecutionStatus(o.dataExecutionStatus);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
     checkUnnamed490(o.filterSpecs);
     unittest.expect(o.rowLimit, unittest.equals(42));
@@ -2939,7 +2951,7 @@
 void checkDataValidationRule(api.DataValidationRule o) {
   buildCounterDataValidationRule++;
   if (buildCounterDataValidationRule < 3) {
-    checkBooleanCondition(o.condition);
+    checkBooleanCondition(o.condition as api.BooleanCondition);
     unittest.expect(o.inputMessage, unittest.equals('foo'));
     unittest.expect(o.showCustomUi, unittest.isTrue);
     unittest.expect(o.strict, unittest.isTrue);
@@ -3024,7 +3036,7 @@
     api.DeleteConditionalFormatRuleResponse o) {
   buildCounterDeleteConditionalFormatRuleResponse++;
   if (buildCounterDeleteConditionalFormatRuleResponse < 3) {
-    checkConditionalFormatRule(o.rule);
+    checkConditionalFormatRule(o.rule as api.ConditionalFormatRule);
   }
   buildCounterDeleteConditionalFormatRuleResponse--;
 }
@@ -3062,7 +3074,7 @@
 void checkDeleteDeveloperMetadataRequest(api.DeleteDeveloperMetadataRequest o) {
   buildCounterDeleteDeveloperMetadataRequest++;
   if (buildCounterDeleteDeveloperMetadataRequest < 3) {
-    checkDataFilter(o.dataFilter);
+    checkDataFilter(o.dataFilter as api.DataFilter);
   }
   buildCounterDeleteDeveloperMetadataRequest--;
 }
@@ -3076,8 +3088,8 @@
 
 void checkUnnamed492(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeveloperMetadata(o[0]);
-  checkDeveloperMetadata(o[1]);
+  checkDeveloperMetadata(o[0] as api.DeveloperMetadata);
+  checkDeveloperMetadata(o[1] as api.DeveloperMetadata);
 }
 
 core.int buildCounterDeleteDeveloperMetadataResponse = 0;
@@ -3114,7 +3126,7 @@
 void checkDeleteDimensionGroupRequest(api.DeleteDimensionGroupRequest o) {
   buildCounterDeleteDimensionGroupRequest++;
   if (buildCounterDeleteDimensionGroupRequest < 3) {
-    checkDimensionRange(o.range);
+    checkDimensionRange(o.range as api.DimensionRange);
   }
   buildCounterDeleteDimensionGroupRequest--;
 }
@@ -3128,8 +3140,8 @@
 
 void checkUnnamed493(core.List<api.DimensionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionGroup(o[0]);
-  checkDimensionGroup(o[1]);
+  checkDimensionGroup(o[0] as api.DimensionGroup);
+  checkDimensionGroup(o[1] as api.DimensionGroup);
 }
 
 core.int buildCounterDeleteDimensionGroupResponse = 0;
@@ -3165,7 +3177,7 @@
 void checkDeleteDimensionRequest(api.DeleteDimensionRequest o) {
   buildCounterDeleteDimensionRequest++;
   if (buildCounterDeleteDimensionRequest < 3) {
-    checkDimensionRange(o.range);
+    checkDimensionRange(o.range as api.DimensionRange);
   }
   buildCounterDeleteDimensionRequest--;
 }
@@ -3179,8 +3191,8 @@
 
 void checkUnnamed494(core.List<api.DimensionRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionRange(o[0]);
-  checkDimensionRange(o[1]);
+  checkDimensionRange(o[0] as api.DimensionRange);
+  checkDimensionRange(o[1] as api.DimensionRange);
 }
 
 core.int buildCounterDeleteDuplicatesRequest = 0;
@@ -3199,7 +3211,7 @@
   buildCounterDeleteDuplicatesRequest++;
   if (buildCounterDeleteDuplicatesRequest < 3) {
     checkUnnamed494(o.comparisonColumns);
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterDeleteDuplicatesRequest--;
 }
@@ -3314,7 +3326,7 @@
 void checkDeleteRangeRequest(api.DeleteRangeRequest o) {
   buildCounterDeleteRangeRequest++;
   if (buildCounterDeleteRangeRequest < 3) {
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     unittest.expect(o.shiftDimension, unittest.equals('foo'));
   }
   buildCounterDeleteRangeRequest--;
@@ -3357,7 +3369,7 @@
 void checkDeveloperMetadata(api.DeveloperMetadata o) {
   buildCounterDeveloperMetadata++;
   if (buildCounterDeveloperMetadata < 3) {
-    checkDeveloperMetadataLocation(o.location);
+    checkDeveloperMetadataLocation(o.location as api.DeveloperMetadataLocation);
     unittest.expect(o.metadataId, unittest.equals(42));
     unittest.expect(o.metadataKey, unittest.equals('foo'));
     unittest.expect(o.metadataValue, unittest.equals('foo'));
@@ -3383,7 +3395,7 @@
 void checkDeveloperMetadataLocation(api.DeveloperMetadataLocation o) {
   buildCounterDeveloperMetadataLocation++;
   if (buildCounterDeveloperMetadataLocation < 3) {
-    checkDimensionRange(o.dimensionRange);
+    checkDimensionRange(o.dimensionRange as api.DimensionRange);
     unittest.expect(o.locationType, unittest.equals('foo'));
     unittest.expect(o.sheetId, unittest.equals(42));
     unittest.expect(o.spreadsheet, unittest.isTrue);
@@ -3415,7 +3427,8 @@
     unittest.expect(o.locationType, unittest.equals('foo'));
     unittest.expect(o.metadataId, unittest.equals(42));
     unittest.expect(o.metadataKey, unittest.equals('foo'));
-    checkDeveloperMetadataLocation(o.metadataLocation);
+    checkDeveloperMetadataLocation(
+        o.metadataLocation as api.DeveloperMetadataLocation);
     unittest.expect(o.metadataValue, unittest.equals('foo'));
     unittest.expect(o.visibility, unittest.equals('foo'));
   }
@@ -3440,7 +3453,7 @@
   if (buildCounterDimensionGroup < 3) {
     unittest.expect(o.collapsed, unittest.isTrue);
     unittest.expect(o.depth, unittest.equals(42));
-    checkDimensionRange(o.range);
+    checkDimensionRange(o.range as api.DimensionRange);
   }
   buildCounterDimensionGroup--;
 }
@@ -3454,8 +3467,8 @@
 
 void checkUnnamed495(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeveloperMetadata(o[0]);
-  checkDeveloperMetadata(o[1]);
+  checkDeveloperMetadata(o[0] as api.DeveloperMetadata);
+  checkDeveloperMetadata(o[1] as api.DeveloperMetadata);
 }
 
 core.int buildCounterDimensionProperties = 0;
@@ -3476,7 +3489,8 @@
 void checkDimensionProperties(api.DimensionProperties o) {
   buildCounterDimensionProperties++;
   if (buildCounterDimensionProperties < 3) {
-    checkDataSourceColumnReference(o.dataSourceColumnReference);
+    checkDataSourceColumnReference(
+        o.dataSourceColumnReference as api.DataSourceColumnReference);
     checkUnnamed495(o.developerMetadata);
     unittest.expect(o.hiddenByFilter, unittest.isTrue);
     unittest.expect(o.hiddenByUser, unittest.isTrue);
@@ -3543,7 +3557,7 @@
 void checkDuplicateFilterViewResponse(api.DuplicateFilterViewResponse o) {
   buildCounterDuplicateFilterViewResponse++;
   if (buildCounterDuplicateFilterViewResponse < 3) {
-    checkFilterView(o.filter);
+    checkFilterView(o.filter as api.FilterView);
   }
   buildCounterDuplicateFilterViewResponse--;
 }
@@ -3587,7 +3601,7 @@
 void checkDuplicateSheetResponse(api.DuplicateSheetResponse o) {
   buildCounterDuplicateSheetResponse++;
   if (buildCounterDuplicateSheetResponse < 3) {
-    checkSheetProperties(o.properties);
+    checkSheetProperties(o.properties as api.SheetProperties);
   }
   buildCounterDuplicateSheetResponse--;
 }
@@ -3658,8 +3672,8 @@
   buildCounterEmbeddedChart++;
   if (buildCounterEmbeddedChart < 3) {
     unittest.expect(o.chartId, unittest.equals(42));
-    checkEmbeddedObjectPosition(o.position);
-    checkChartSpec(o.spec);
+    checkEmbeddedObjectPosition(o.position as api.EmbeddedObjectPosition);
+    checkChartSpec(o.spec as api.ChartSpec);
   }
   buildCounterEmbeddedChart--;
 }
@@ -3681,7 +3695,7 @@
   buildCounterEmbeddedObjectPosition++;
   if (buildCounterEmbeddedObjectPosition < 3) {
     unittest.expect(o.newSheet, unittest.isTrue);
-    checkOverlayPosition(o.overlayPosition);
+    checkOverlayPosition(o.overlayPosition as api.OverlayPosition);
     unittest.expect(o.sheetId, unittest.equals(42));
   }
   buildCounterEmbeddedObjectPosition--;
@@ -3727,7 +3741,7 @@
   buildCounterExtendedValue++;
   if (buildCounterExtendedValue < 3) {
     unittest.expect(o.boolValue, unittest.isTrue);
-    checkErrorValue(o.errorValue);
+    checkErrorValue(o.errorValue as api.ErrorValue);
     unittest.expect(o.formulaValue, unittest.equals('foo'));
     unittest.expect(o.numberValue, unittest.equals(42.0));
     unittest.expect(o.stringValue, unittest.equals('foo'));
@@ -3767,12 +3781,12 @@
 void checkFilterCriteria(api.FilterCriteria o) {
   buildCounterFilterCriteria++;
   if (buildCounterFilterCriteria < 3) {
-    checkBooleanCondition(o.condition);
+    checkBooleanCondition(o.condition as api.BooleanCondition);
     checkUnnamed498(o.hiddenValues);
-    checkColor(o.visibleBackgroundColor);
-    checkColorStyle(o.visibleBackgroundColorStyle);
-    checkColor(o.visibleForegroundColor);
-    checkColorStyle(o.visibleForegroundColorStyle);
+    checkColor(o.visibleBackgroundColor as api.Color);
+    checkColorStyle(o.visibleBackgroundColorStyle as api.ColorStyle);
+    checkColor(o.visibleForegroundColor as api.Color);
+    checkColorStyle(o.visibleForegroundColorStyle as api.ColorStyle);
   }
   buildCounterFilterCriteria--;
 }
@@ -3794,8 +3808,9 @@
   buildCounterFilterSpec++;
   if (buildCounterFilterSpec < 3) {
     unittest.expect(o.columnIndex, unittest.equals(42));
-    checkDataSourceColumnReference(o.dataSourceColumnReference);
-    checkFilterCriteria(o.filterCriteria);
+    checkDataSourceColumnReference(
+        o.dataSourceColumnReference as api.DataSourceColumnReference);
+    checkFilterCriteria(o.filterCriteria as api.FilterCriteria);
   }
   buildCounterFilterSpec--;
 }
@@ -3809,8 +3824,8 @@
 
 void checkUnnamed499(core.Map<core.String, api.FilterCriteria> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterCriteria(o['x']);
-  checkFilterCriteria(o['y']);
+  checkFilterCriteria(o['x'] as api.FilterCriteria);
+  checkFilterCriteria(o['y'] as api.FilterCriteria);
 }
 
 core.List<api.FilterSpec> buildUnnamed500() {
@@ -3822,8 +3837,8 @@
 
 void checkUnnamed500(core.List<api.FilterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterSpec(o[0]);
-  checkFilterSpec(o[1]);
+  checkFilterSpec(o[0] as api.FilterSpec);
+  checkFilterSpec(o[1] as api.FilterSpec);
 }
 
 core.List<api.SortSpec> buildUnnamed501() {
@@ -3835,8 +3850,8 @@
 
 void checkUnnamed501(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortSpec(o[0]);
-  checkSortSpec(o[1]);
+  checkSortSpec(o[0] as api.SortSpec);
+  checkSortSpec(o[1] as api.SortSpec);
 }
 
 core.int buildCounterFilterView = 0;
@@ -3863,7 +3878,7 @@
     checkUnnamed500(o.filterSpecs);
     unittest.expect(o.filterViewId, unittest.equals(42));
     unittest.expect(o.namedRangeId, unittest.equals('foo'));
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     checkUnnamed501(o.sortSpecs);
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -3897,7 +3912,7 @@
     unittest.expect(o.includeFormulas, unittest.isTrue);
     unittest.expect(o.matchCase, unittest.isTrue);
     unittest.expect(o.matchEntireCell, unittest.isTrue);
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     unittest.expect(o.replacement, unittest.equals('foo'));
     unittest.expect(o.searchByRegex, unittest.isTrue);
     unittest.expect(o.sheetId, unittest.equals(42));
@@ -3941,8 +3956,8 @@
 
 void checkUnnamed502(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilter(o[0]);
-  checkDataFilter(o[1]);
+  checkDataFilter(o[0] as api.DataFilter);
+  checkDataFilter(o[1] as api.DataFilter);
 }
 
 core.int buildCounterGetSpreadsheetByDataFilterRequest = 0;
@@ -3983,9 +3998,9 @@
 void checkGradientRule(api.GradientRule o) {
   buildCounterGradientRule++;
   if (buildCounterGradientRule < 3) {
-    checkInterpolationPoint(o.maxpoint);
-    checkInterpolationPoint(o.midpoint);
-    checkInterpolationPoint(o.minpoint);
+    checkInterpolationPoint(o.maxpoint as api.InterpolationPoint);
+    checkInterpolationPoint(o.midpoint as api.InterpolationPoint);
+    checkInterpolationPoint(o.minpoint as api.InterpolationPoint);
   }
   buildCounterGradientRule--;
 }
@@ -4022,8 +4037,8 @@
 
 void checkUnnamed503(core.List<api.DimensionProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionProperties(o[0]);
-  checkDimensionProperties(o[1]);
+  checkDimensionProperties(o[0] as api.DimensionProperties);
+  checkDimensionProperties(o[1] as api.DimensionProperties);
 }
 
 core.List<api.RowData> buildUnnamed504() {
@@ -4035,8 +4050,8 @@
 
 void checkUnnamed504(core.List<api.RowData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRowData(o[0]);
-  checkRowData(o[1]);
+  checkRowData(o[0] as api.RowData);
+  checkRowData(o[1] as api.RowData);
 }
 
 core.List<api.DimensionProperties> buildUnnamed505() {
@@ -4048,8 +4063,8 @@
 
 void checkUnnamed505(core.List<api.DimensionProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionProperties(o[0]);
-  checkDimensionProperties(o[1]);
+  checkDimensionProperties(o[0] as api.DimensionProperties);
+  checkDimensionProperties(o[1] as api.DimensionProperties);
 }
 
 core.int buildCounterGridData = 0;
@@ -4146,8 +4161,8 @@
 
 void checkUnnamed506(core.List<api.HistogramSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHistogramSeries(o[0]);
-  checkHistogramSeries(o[1]);
+  checkHistogramSeries(o[0] as api.HistogramSeries);
+  checkHistogramSeries(o[1] as api.HistogramSeries);
 }
 
 core.int buildCounterHistogramChartSpec = 0;
@@ -4216,9 +4231,9 @@
 void checkHistogramSeries(api.HistogramSeries o) {
   buildCounterHistogramSeries++;
   if (buildCounterHistogramSeries < 3) {
-    checkColor(o.barColor);
-    checkColorStyle(o.barColorStyle);
-    checkChartData(o.data);
+    checkColor(o.barColor as api.Color);
+    checkColorStyle(o.barColorStyle as api.ColorStyle);
+    checkChartData(o.data as api.ChartData);
   }
   buildCounterHistogramSeries--;
 }
@@ -4239,7 +4254,7 @@
   buildCounterInsertDimensionRequest++;
   if (buildCounterInsertDimensionRequest < 3) {
     unittest.expect(o.inheritFromBefore, unittest.isTrue);
-    checkDimensionRange(o.range);
+    checkDimensionRange(o.range as api.DimensionRange);
   }
   buildCounterInsertDimensionRequest--;
 }
@@ -4259,7 +4274,7 @@
 void checkInsertRangeRequest(api.InsertRangeRequest o) {
   buildCounterInsertRangeRequest++;
   if (buildCounterInsertRangeRequest < 3) {
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     unittest.expect(o.shiftDimension, unittest.equals('foo'));
   }
   buildCounterInsertRangeRequest--;
@@ -4282,8 +4297,8 @@
 void checkInterpolationPoint(api.InterpolationPoint o) {
   buildCounterInterpolationPoint++;
   if (buildCounterInterpolationPoint < 3) {
-    checkColor(o.color);
-    checkColorStyle(o.colorStyle);
+    checkColor(o.color as api.Color);
+    checkColorStyle(o.colorStyle as api.ColorStyle);
     unittest.expect(o.type, unittest.equals('foo'));
     unittest.expect(o.value, unittest.equals('foo'));
   }
@@ -4347,8 +4362,8 @@
 void checkKeyValueFormat(api.KeyValueFormat o) {
   buildCounterKeyValueFormat++;
   if (buildCounterKeyValueFormat < 3) {
-    checkTextPosition(o.position);
-    checkTextFormat(o.textFormat);
+    checkTextPosition(o.position as api.TextPosition);
+    checkTextFormat(o.textFormat as api.TextFormat);
   }
   buildCounterKeyValueFormat--;
 }
@@ -4383,8 +4398,8 @@
 
 void checkUnnamed507(core.List<api.ManualRuleGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkManualRuleGroup(o[0]);
-  checkManualRuleGroup(o[1]);
+  checkManualRuleGroup(o[0] as api.ManualRuleGroup);
+  checkManualRuleGroup(o[1] as api.ManualRuleGroup);
 }
 
 core.int buildCounterManualRule = 0;
@@ -4415,8 +4430,8 @@
 
 void checkUnnamed508(core.List<api.ExtendedValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExtendedValue(o[0]);
-  checkExtendedValue(o[1]);
+  checkExtendedValue(o[0] as api.ExtendedValue);
+  checkExtendedValue(o[1] as api.ExtendedValue);
 }
 
 core.int buildCounterManualRuleGroup = 0;
@@ -4434,7 +4449,7 @@
 void checkManualRuleGroup(api.ManualRuleGroup o) {
   buildCounterManualRuleGroup++;
   if (buildCounterManualRuleGroup < 3) {
-    checkExtendedValue(o.groupName);
+    checkExtendedValue(o.groupName as api.ExtendedValue);
     checkUnnamed508(o.items);
   }
   buildCounterManualRuleGroup--;
@@ -4449,8 +4464,8 @@
 
 void checkUnnamed509(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilter(o[0]);
-  checkDataFilter(o[1]);
+  checkDataFilter(o[0] as api.DataFilter);
+  checkDataFilter(o[1] as api.DataFilter);
 }
 
 core.int buildCounterMatchedDeveloperMetadata = 0;
@@ -4469,7 +4484,7 @@
   buildCounterMatchedDeveloperMetadata++;
   if (buildCounterMatchedDeveloperMetadata < 3) {
     checkUnnamed509(o.dataFilters);
-    checkDeveloperMetadata(o.developerMetadata);
+    checkDeveloperMetadata(o.developerMetadata as api.DeveloperMetadata);
   }
   buildCounterMatchedDeveloperMetadata--;
 }
@@ -4483,8 +4498,8 @@
 
 void checkUnnamed510(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilter(o[0]);
-  checkDataFilter(o[1]);
+  checkDataFilter(o[0] as api.DataFilter);
+  checkDataFilter(o[1] as api.DataFilter);
 }
 
 core.int buildCounterMatchedValueRange = 0;
@@ -4503,7 +4518,7 @@
   buildCounterMatchedValueRange++;
   if (buildCounterMatchedValueRange < 3) {
     checkUnnamed510(o.dataFilters);
-    checkValueRange(o.valueRange);
+    checkValueRange(o.valueRange as api.ValueRange);
   }
   buildCounterMatchedValueRange--;
 }
@@ -4524,7 +4539,7 @@
   buildCounterMergeCellsRequest++;
   if (buildCounterMergeCellsRequest < 3) {
     unittest.expect(o.mergeType, unittest.equals('foo'));
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterMergeCellsRequest--;
 }
@@ -4545,7 +4560,7 @@
   buildCounterMoveDimensionRequest++;
   if (buildCounterMoveDimensionRequest < 3) {
     unittest.expect(o.destinationIndex, unittest.equals(42));
-    checkDimensionRange(o.source);
+    checkDimensionRange(o.source as api.DimensionRange);
   }
   buildCounterMoveDimensionRequest--;
 }
@@ -4568,7 +4583,7 @@
   if (buildCounterNamedRange < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.namedRangeId, unittest.equals('foo'));
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterNamedRange--;
 }
@@ -4615,14 +4630,14 @@
 void checkOrgChartSpec(api.OrgChartSpec o) {
   buildCounterOrgChartSpec++;
   if (buildCounterOrgChartSpec < 3) {
-    checkChartData(o.labels);
-    checkColor(o.nodeColor);
-    checkColorStyle(o.nodeColorStyle);
+    checkChartData(o.labels as api.ChartData);
+    checkColor(o.nodeColor as api.Color);
+    checkColorStyle(o.nodeColorStyle as api.ColorStyle);
     unittest.expect(o.nodeSize, unittest.equals('foo'));
-    checkChartData(o.parentLabels);
-    checkColor(o.selectedNodeColor);
-    checkColorStyle(o.selectedNodeColorStyle);
-    checkChartData(o.tooltips);
+    checkChartData(o.parentLabels as api.ChartData);
+    checkColor(o.selectedNodeColor as api.Color);
+    checkColorStyle(o.selectedNodeColorStyle as api.ColorStyle);
+    checkChartData(o.tooltips as api.ChartData);
   }
   buildCounterOrgChartSpec--;
 }
@@ -4645,7 +4660,7 @@
 void checkOverlayPosition(api.OverlayPosition o) {
   buildCounterOverlayPosition++;
   if (buildCounterOverlayPosition < 3) {
-    checkGridCoordinate(o.anchorCell);
+    checkGridCoordinate(o.anchorCell as api.GridCoordinate);
     unittest.expect(o.heightPixels, unittest.equals(42));
     unittest.expect(o.offsetXPixels, unittest.equals(42));
     unittest.expect(o.offsetYPixels, unittest.equals(42));
@@ -4697,7 +4712,7 @@
 void checkPasteDataRequest(api.PasteDataRequest o) {
   buildCounterPasteDataRequest++;
   if (buildCounterPasteDataRequest < 3) {
-    checkGridCoordinate(o.coordinate);
+    checkGridCoordinate(o.coordinate as api.GridCoordinate);
     unittest.expect(o.data, unittest.equals('foo'));
     unittest.expect(o.delimiter, unittest.equals('foo'));
     unittest.expect(o.html, unittest.isTrue);
@@ -4724,10 +4739,10 @@
 void checkPieChartSpec(api.PieChartSpec o) {
   buildCounterPieChartSpec++;
   if (buildCounterPieChartSpec < 3) {
-    checkChartData(o.domain);
+    checkChartData(o.domain as api.ChartData);
     unittest.expect(o.legendPosition, unittest.equals('foo'));
     unittest.expect(o.pieHole, unittest.equals(42.0));
-    checkChartData(o.series);
+    checkChartData(o.series as api.ChartData);
     unittest.expect(o.threeDimensional, unittest.isTrue);
   }
   buildCounterPieChartSpec--;
@@ -4782,8 +4797,9 @@
   buildCounterPivotFilterSpec++;
   if (buildCounterPivotFilterSpec < 3) {
     unittest.expect(o.columnOffsetIndex, unittest.equals(42));
-    checkDataSourceColumnReference(o.dataSourceColumnReference);
-    checkPivotFilterCriteria(o.filterCriteria);
+    checkDataSourceColumnReference(
+        o.dataSourceColumnReference as api.DataSourceColumnReference);
+    checkPivotFilterCriteria(o.filterCriteria as api.PivotFilterCriteria);
   }
   buildCounterPivotFilterSpec--;
 }
@@ -4797,8 +4813,8 @@
 
 void checkUnnamed512(core.List<api.PivotGroupValueMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotGroupValueMetadata(o[0]);
-  checkPivotGroupValueMetadata(o[1]);
+  checkPivotGroupValueMetadata(o[0] as api.PivotGroupValueMetadata);
+  checkPivotGroupValueMetadata(o[1] as api.PivotGroupValueMetadata);
 }
 
 core.int buildCounterPivotGroup = 0;
@@ -4824,15 +4840,17 @@
 void checkPivotGroup(api.PivotGroup o) {
   buildCounterPivotGroup++;
   if (buildCounterPivotGroup < 3) {
-    checkDataSourceColumnReference(o.dataSourceColumnReference);
-    checkPivotGroupLimit(o.groupLimit);
-    checkPivotGroupRule(o.groupRule);
+    checkDataSourceColumnReference(
+        o.dataSourceColumnReference as api.DataSourceColumnReference);
+    checkPivotGroupLimit(o.groupLimit as api.PivotGroupLimit);
+    checkPivotGroupRule(o.groupRule as api.PivotGroupRule);
     unittest.expect(o.label, unittest.equals('foo'));
     unittest.expect(o.repeatHeadings, unittest.isTrue);
     unittest.expect(o.showTotals, unittest.isTrue);
     unittest.expect(o.sortOrder, unittest.equals('foo'));
     unittest.expect(o.sourceColumnOffset, unittest.equals(42));
-    checkPivotGroupSortValueBucket(o.valueBucket);
+    checkPivotGroupSortValueBucket(
+        o.valueBucket as api.PivotGroupSortValueBucket);
     checkUnnamed512(o.valueMetadata);
   }
   buildCounterPivotGroup--;
@@ -4875,9 +4893,9 @@
 void checkPivotGroupRule(api.PivotGroupRule o) {
   buildCounterPivotGroupRule++;
   if (buildCounterPivotGroupRule < 3) {
-    checkDateTimeRule(o.dateTimeRule);
-    checkHistogramRule(o.histogramRule);
-    checkManualRule(o.manualRule);
+    checkDateTimeRule(o.dateTimeRule as api.DateTimeRule);
+    checkHistogramRule(o.histogramRule as api.HistogramRule);
+    checkManualRule(o.manualRule as api.ManualRule);
   }
   buildCounterPivotGroupRule--;
 }
@@ -4891,8 +4909,8 @@
 
 void checkUnnamed513(core.List<api.ExtendedValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExtendedValue(o[0]);
-  checkExtendedValue(o[1]);
+  checkExtendedValue(o[0] as api.ExtendedValue);
+  checkExtendedValue(o[1] as api.ExtendedValue);
 }
 
 core.int buildCounterPivotGroupSortValueBucket = 0;
@@ -4932,7 +4950,7 @@
   buildCounterPivotGroupValueMetadata++;
   if (buildCounterPivotGroupValueMetadata < 3) {
     unittest.expect(o.collapsed, unittest.isTrue);
-    checkExtendedValue(o.value);
+    checkExtendedValue(o.value as api.ExtendedValue);
   }
   buildCounterPivotGroupValueMetadata--;
 }
@@ -4946,8 +4964,8 @@
 
 void checkUnnamed514(core.List<api.PivotGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotGroup(o[0]);
-  checkPivotGroup(o[1]);
+  checkPivotGroup(o[0] as api.PivotGroup);
+  checkPivotGroup(o[1] as api.PivotGroup);
 }
 
 core.Map<core.String, api.PivotFilterCriteria> buildUnnamed515() {
@@ -4959,8 +4977,8 @@
 
 void checkUnnamed515(core.Map<core.String, api.PivotFilterCriteria> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotFilterCriteria(o['x']);
-  checkPivotFilterCriteria(o['y']);
+  checkPivotFilterCriteria(o['x'] as api.PivotFilterCriteria);
+  checkPivotFilterCriteria(o['y'] as api.PivotFilterCriteria);
 }
 
 core.List<api.PivotFilterSpec> buildUnnamed516() {
@@ -4972,8 +4990,8 @@
 
 void checkUnnamed516(core.List<api.PivotFilterSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotFilterSpec(o[0]);
-  checkPivotFilterSpec(o[1]);
+  checkPivotFilterSpec(o[0] as api.PivotFilterSpec);
+  checkPivotFilterSpec(o[1] as api.PivotFilterSpec);
 }
 
 core.List<api.PivotGroup> buildUnnamed517() {
@@ -4985,8 +5003,8 @@
 
 void checkUnnamed517(core.List<api.PivotGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotGroup(o[0]);
-  checkPivotGroup(o[1]);
+  checkPivotGroup(o[0] as api.PivotGroup);
+  checkPivotGroup(o[1] as api.PivotGroup);
 }
 
 core.List<api.PivotValue> buildUnnamed518() {
@@ -4998,8 +5016,8 @@
 
 void checkUnnamed518(core.List<api.PivotValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPivotValue(o[0]);
-  checkPivotValue(o[1]);
+  checkPivotValue(o[0] as api.PivotValue);
+  checkPivotValue(o[1] as api.PivotValue);
 }
 
 core.int buildCounterPivotTable = 0;
@@ -5026,11 +5044,11 @@
   if (buildCounterPivotTable < 3) {
     checkUnnamed514(o.columns);
     checkUnnamed515(o.criteria);
-    checkDataExecutionStatus(o.dataExecutionStatus);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
     checkUnnamed516(o.filterSpecs);
     checkUnnamed517(o.rows);
-    checkGridRange(o.source);
+    checkGridRange(o.source as api.GridRange);
     unittest.expect(o.valueLayout, unittest.equals('foo'));
     checkUnnamed518(o.values);
   }
@@ -5057,7 +5075,8 @@
   buildCounterPivotValue++;
   if (buildCounterPivotValue < 3) {
     unittest.expect(o.calculatedDisplayType, unittest.equals('foo'));
-    checkDataSourceColumnReference(o.dataSourceColumnReference);
+    checkDataSourceColumnReference(
+        o.dataSourceColumnReference as api.DataSourceColumnReference);
     unittest.expect(o.formula, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.sourceColumnOffset, unittest.equals(42));
@@ -5075,8 +5094,8 @@
 
 void checkUnnamed519(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGridRange(o[0]);
-  checkGridRange(o[1]);
+  checkGridRange(o[0] as api.GridRange);
+  checkGridRange(o[1] as api.GridRange);
 }
 
 core.int buildCounterProtectedRange = 0;
@@ -5101,10 +5120,10 @@
   buildCounterProtectedRange++;
   if (buildCounterProtectedRange < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkEditors(o.editors);
+    checkEditors(o.editors as api.Editors);
     unittest.expect(o.namedRangeId, unittest.equals('foo'));
     unittest.expect(o.protectedRangeId, unittest.equals(42));
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     unittest.expect(o.requestingUserCanEdit, unittest.isTrue);
     checkUnnamed519(o.unprotectedRanges);
     unittest.expect(o.warningOnly, unittest.isTrue);
@@ -5126,7 +5145,7 @@
 void checkRandomizeRangeRequest(api.RandomizeRangeRequest o) {
   buildCounterRandomizeRangeRequest++;
   if (buildCounterRandomizeRangeRequest < 3) {
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterRandomizeRangeRequest--;
 }
@@ -5148,8 +5167,9 @@
     api.RefreshDataSourceObjectExecutionStatus o) {
   buildCounterRefreshDataSourceObjectExecutionStatus++;
   if (buildCounterRefreshDataSourceObjectExecutionStatus < 3) {
-    checkDataExecutionStatus(o.dataExecutionStatus);
-    checkDataSourceObjectReference(o.reference);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
+    checkDataSourceObjectReference(
+        o.reference as api.DataSourceObjectReference);
   }
   buildCounterRefreshDataSourceObjectExecutionStatus--;
 }
@@ -5174,7 +5194,8 @@
     unittest.expect(o.dataSourceId, unittest.equals('foo'));
     unittest.expect(o.force, unittest.isTrue);
     unittest.expect(o.isAll, unittest.isTrue);
-    checkDataSourceObjectReferences(o.references);
+    checkDataSourceObjectReferences(
+        o.references as api.DataSourceObjectReferences);
   }
   buildCounterRefreshDataSourceRequest--;
 }
@@ -5188,8 +5209,10 @@
 
 void checkUnnamed520(core.List<api.RefreshDataSourceObjectExecutionStatus> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRefreshDataSourceObjectExecutionStatus(o[0]);
-  checkRefreshDataSourceObjectExecutionStatus(o[1]);
+  checkRefreshDataSourceObjectExecutionStatus(
+      o[0] as api.RefreshDataSourceObjectExecutionStatus);
+  checkRefreshDataSourceObjectExecutionStatus(
+      o[1] as api.RefreshDataSourceObjectExecutionStatus);
 }
 
 core.int buildCounterRefreshDataSourceResponse = 0;
@@ -5227,9 +5250,9 @@
 void checkRepeatCellRequest(api.RepeatCellRequest o) {
   buildCounterRepeatCellRequest++;
   if (buildCounterRepeatCellRequest < 3) {
-    checkCellData(o.cell);
+    checkCellData(o.cell as api.CellData);
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterRepeatCellRequest--;
 }
@@ -5311,70 +5334,104 @@
 void checkRequest(api.Request o) {
   buildCounterRequest++;
   if (buildCounterRequest < 3) {
-    checkAddBandingRequest(o.addBanding);
-    checkAddChartRequest(o.addChart);
-    checkAddConditionalFormatRuleRequest(o.addConditionalFormatRule);
-    checkAddDataSourceRequest(o.addDataSource);
-    checkAddDimensionGroupRequest(o.addDimensionGroup);
-    checkAddFilterViewRequest(o.addFilterView);
-    checkAddNamedRangeRequest(o.addNamedRange);
-    checkAddProtectedRangeRequest(o.addProtectedRange);
-    checkAddSheetRequest(o.addSheet);
-    checkAddSlicerRequest(o.addSlicer);
-    checkAppendCellsRequest(o.appendCells);
-    checkAppendDimensionRequest(o.appendDimension);
-    checkAutoFillRequest(o.autoFill);
-    checkAutoResizeDimensionsRequest(o.autoResizeDimensions);
-    checkClearBasicFilterRequest(o.clearBasicFilter);
-    checkCopyPasteRequest(o.copyPaste);
-    checkCreateDeveloperMetadataRequest(o.createDeveloperMetadata);
-    checkCutPasteRequest(o.cutPaste);
-    checkDeleteBandingRequest(o.deleteBanding);
-    checkDeleteConditionalFormatRuleRequest(o.deleteConditionalFormatRule);
-    checkDeleteDataSourceRequest(o.deleteDataSource);
-    checkDeleteDeveloperMetadataRequest(o.deleteDeveloperMetadata);
-    checkDeleteDimensionRequest(o.deleteDimension);
-    checkDeleteDimensionGroupRequest(o.deleteDimensionGroup);
-    checkDeleteDuplicatesRequest(o.deleteDuplicates);
-    checkDeleteEmbeddedObjectRequest(o.deleteEmbeddedObject);
-    checkDeleteFilterViewRequest(o.deleteFilterView);
-    checkDeleteNamedRangeRequest(o.deleteNamedRange);
-    checkDeleteProtectedRangeRequest(o.deleteProtectedRange);
-    checkDeleteRangeRequest(o.deleteRange);
-    checkDeleteSheetRequest(o.deleteSheet);
-    checkDuplicateFilterViewRequest(o.duplicateFilterView);
-    checkDuplicateSheetRequest(o.duplicateSheet);
-    checkFindReplaceRequest(o.findReplace);
-    checkInsertDimensionRequest(o.insertDimension);
-    checkInsertRangeRequest(o.insertRange);
-    checkMergeCellsRequest(o.mergeCells);
-    checkMoveDimensionRequest(o.moveDimension);
-    checkPasteDataRequest(o.pasteData);
-    checkRandomizeRangeRequest(o.randomizeRange);
-    checkRefreshDataSourceRequest(o.refreshDataSource);
-    checkRepeatCellRequest(o.repeatCell);
-    checkSetBasicFilterRequest(o.setBasicFilter);
-    checkSetDataValidationRequest(o.setDataValidation);
-    checkSortRangeRequest(o.sortRange);
-    checkTextToColumnsRequest(o.textToColumns);
-    checkTrimWhitespaceRequest(o.trimWhitespace);
-    checkUnmergeCellsRequest(o.unmergeCells);
-    checkUpdateBandingRequest(o.updateBanding);
-    checkUpdateBordersRequest(o.updateBorders);
-    checkUpdateCellsRequest(o.updateCells);
-    checkUpdateChartSpecRequest(o.updateChartSpec);
-    checkUpdateConditionalFormatRuleRequest(o.updateConditionalFormatRule);
-    checkUpdateDataSourceRequest(o.updateDataSource);
-    checkUpdateDeveloperMetadataRequest(o.updateDeveloperMetadata);
-    checkUpdateDimensionGroupRequest(o.updateDimensionGroup);
-    checkUpdateDimensionPropertiesRequest(o.updateDimensionProperties);
-    checkUpdateEmbeddedObjectPositionRequest(o.updateEmbeddedObjectPosition);
-    checkUpdateFilterViewRequest(o.updateFilterView);
-    checkUpdateNamedRangeRequest(o.updateNamedRange);
-    checkUpdateProtectedRangeRequest(o.updateProtectedRange);
-    checkUpdateSheetPropertiesRequest(o.updateSheetProperties);
-    checkUpdateSlicerSpecRequest(o.updateSlicerSpec);
-    checkUpdateSpreadsheetPropertiesRequest(o.updateSpreadsheetProperties);
+    checkAddBandingRequest(o.addBanding as api.AddBandingRequest);
+    checkAddChartRequest(o.addChart as api.AddChartRequest);
+    checkAddConditionalFormatRuleRequest(
+        o.addConditionalFormatRule as api.AddConditionalFormatRuleRequest);
+    checkAddDataSourceRequest(o.addDataSource as api.AddDataSourceRequest);
+    checkAddDimensionGroupRequest(
+        o.addDimensionGroup as api.AddDimensionGroupRequest);
+    checkAddFilterViewRequest(o.addFilterView as api.AddFilterViewRequest);
+    checkAddNamedRangeRequest(o.addNamedRange as api.AddNamedRangeRequest);
+    checkAddProtectedRangeRequest(
+        o.addProtectedRange as api.AddProtectedRangeRequest);
+    checkAddSheetRequest(o.addSheet as api.AddSheetRequest);
+    checkAddSlicerRequest(o.addSlicer as api.AddSlicerRequest);
+    checkAppendCellsRequest(o.appendCells as api.AppendCellsRequest);
+    checkAppendDimensionRequest(
+        o.appendDimension as api.AppendDimensionRequest);
+    checkAutoFillRequest(o.autoFill as api.AutoFillRequest);
+    checkAutoResizeDimensionsRequest(
+        o.autoResizeDimensions as api.AutoResizeDimensionsRequest);
+    checkClearBasicFilterRequest(
+        o.clearBasicFilter as api.ClearBasicFilterRequest);
+    checkCopyPasteRequest(o.copyPaste as api.CopyPasteRequest);
+    checkCreateDeveloperMetadataRequest(
+        o.createDeveloperMetadata as api.CreateDeveloperMetadataRequest);
+    checkCutPasteRequest(o.cutPaste as api.CutPasteRequest);
+    checkDeleteBandingRequest(o.deleteBanding as api.DeleteBandingRequest);
+    checkDeleteConditionalFormatRuleRequest(o.deleteConditionalFormatRule
+        as api.DeleteConditionalFormatRuleRequest);
+    checkDeleteDataSourceRequest(
+        o.deleteDataSource as api.DeleteDataSourceRequest);
+    checkDeleteDeveloperMetadataRequest(
+        o.deleteDeveloperMetadata as api.DeleteDeveloperMetadataRequest);
+    checkDeleteDimensionRequest(
+        o.deleteDimension as api.DeleteDimensionRequest);
+    checkDeleteDimensionGroupRequest(
+        o.deleteDimensionGroup as api.DeleteDimensionGroupRequest);
+    checkDeleteDuplicatesRequest(
+        o.deleteDuplicates as api.DeleteDuplicatesRequest);
+    checkDeleteEmbeddedObjectRequest(
+        o.deleteEmbeddedObject as api.DeleteEmbeddedObjectRequest);
+    checkDeleteFilterViewRequest(
+        o.deleteFilterView as api.DeleteFilterViewRequest);
+    checkDeleteNamedRangeRequest(
+        o.deleteNamedRange as api.DeleteNamedRangeRequest);
+    checkDeleteProtectedRangeRequest(
+        o.deleteProtectedRange as api.DeleteProtectedRangeRequest);
+    checkDeleteRangeRequest(o.deleteRange as api.DeleteRangeRequest);
+    checkDeleteSheetRequest(o.deleteSheet as api.DeleteSheetRequest);
+    checkDuplicateFilterViewRequest(
+        o.duplicateFilterView as api.DuplicateFilterViewRequest);
+    checkDuplicateSheetRequest(o.duplicateSheet as api.DuplicateSheetRequest);
+    checkFindReplaceRequest(o.findReplace as api.FindReplaceRequest);
+    checkInsertDimensionRequest(
+        o.insertDimension as api.InsertDimensionRequest);
+    checkInsertRangeRequest(o.insertRange as api.InsertRangeRequest);
+    checkMergeCellsRequest(o.mergeCells as api.MergeCellsRequest);
+    checkMoveDimensionRequest(o.moveDimension as api.MoveDimensionRequest);
+    checkPasteDataRequest(o.pasteData as api.PasteDataRequest);
+    checkRandomizeRangeRequest(o.randomizeRange as api.RandomizeRangeRequest);
+    checkRefreshDataSourceRequest(
+        o.refreshDataSource as api.RefreshDataSourceRequest);
+    checkRepeatCellRequest(o.repeatCell as api.RepeatCellRequest);
+    checkSetBasicFilterRequest(o.setBasicFilter as api.SetBasicFilterRequest);
+    checkSetDataValidationRequest(
+        o.setDataValidation as api.SetDataValidationRequest);
+    checkSortRangeRequest(o.sortRange as api.SortRangeRequest);
+    checkTextToColumnsRequest(o.textToColumns as api.TextToColumnsRequest);
+    checkTrimWhitespaceRequest(o.trimWhitespace as api.TrimWhitespaceRequest);
+    checkUnmergeCellsRequest(o.unmergeCells as api.UnmergeCellsRequest);
+    checkUpdateBandingRequest(o.updateBanding as api.UpdateBandingRequest);
+    checkUpdateBordersRequest(o.updateBorders as api.UpdateBordersRequest);
+    checkUpdateCellsRequest(o.updateCells as api.UpdateCellsRequest);
+    checkUpdateChartSpecRequest(
+        o.updateChartSpec as api.UpdateChartSpecRequest);
+    checkUpdateConditionalFormatRuleRequest(o.updateConditionalFormatRule
+        as api.UpdateConditionalFormatRuleRequest);
+    checkUpdateDataSourceRequest(
+        o.updateDataSource as api.UpdateDataSourceRequest);
+    checkUpdateDeveloperMetadataRequest(
+        o.updateDeveloperMetadata as api.UpdateDeveloperMetadataRequest);
+    checkUpdateDimensionGroupRequest(
+        o.updateDimensionGroup as api.UpdateDimensionGroupRequest);
+    checkUpdateDimensionPropertiesRequest(
+        o.updateDimensionProperties as api.UpdateDimensionPropertiesRequest);
+    checkUpdateEmbeddedObjectPositionRequest(o.updateEmbeddedObjectPosition
+        as api.UpdateEmbeddedObjectPositionRequest);
+    checkUpdateFilterViewRequest(
+        o.updateFilterView as api.UpdateFilterViewRequest);
+    checkUpdateNamedRangeRequest(
+        o.updateNamedRange as api.UpdateNamedRangeRequest);
+    checkUpdateProtectedRangeRequest(
+        o.updateProtectedRange as api.UpdateProtectedRangeRequest);
+    checkUpdateSheetPropertiesRequest(
+        o.updateSheetProperties as api.UpdateSheetPropertiesRequest);
+    checkUpdateSlicerSpecRequest(
+        o.updateSlicerSpec as api.UpdateSlicerSpecRequest);
+    checkUpdateSpreadsheetPropertiesRequest(o.updateSpreadsheetProperties
+        as api.UpdateSpreadsheetPropertiesRequest);
   }
   buildCounterRequest--;
 }
@@ -5416,29 +5473,42 @@
 void checkResponse(api.Response o) {
   buildCounterResponse++;
   if (buildCounterResponse < 3) {
-    checkAddBandingResponse(o.addBanding);
-    checkAddChartResponse(o.addChart);
-    checkAddDataSourceResponse(o.addDataSource);
-    checkAddDimensionGroupResponse(o.addDimensionGroup);
-    checkAddFilterViewResponse(o.addFilterView);
-    checkAddNamedRangeResponse(o.addNamedRange);
-    checkAddProtectedRangeResponse(o.addProtectedRange);
-    checkAddSheetResponse(o.addSheet);
-    checkAddSlicerResponse(o.addSlicer);
-    checkCreateDeveloperMetadataResponse(o.createDeveloperMetadata);
-    checkDeleteConditionalFormatRuleResponse(o.deleteConditionalFormatRule);
-    checkDeleteDeveloperMetadataResponse(o.deleteDeveloperMetadata);
-    checkDeleteDimensionGroupResponse(o.deleteDimensionGroup);
-    checkDeleteDuplicatesResponse(o.deleteDuplicates);
-    checkDuplicateFilterViewResponse(o.duplicateFilterView);
-    checkDuplicateSheetResponse(o.duplicateSheet);
-    checkFindReplaceResponse(o.findReplace);
-    checkRefreshDataSourceResponse(o.refreshDataSource);
-    checkTrimWhitespaceResponse(o.trimWhitespace);
-    checkUpdateConditionalFormatRuleResponse(o.updateConditionalFormatRule);
-    checkUpdateDataSourceResponse(o.updateDataSource);
-    checkUpdateDeveloperMetadataResponse(o.updateDeveloperMetadata);
-    checkUpdateEmbeddedObjectPositionResponse(o.updateEmbeddedObjectPosition);
+    checkAddBandingResponse(o.addBanding as api.AddBandingResponse);
+    checkAddChartResponse(o.addChart as api.AddChartResponse);
+    checkAddDataSourceResponse(o.addDataSource as api.AddDataSourceResponse);
+    checkAddDimensionGroupResponse(
+        o.addDimensionGroup as api.AddDimensionGroupResponse);
+    checkAddFilterViewResponse(o.addFilterView as api.AddFilterViewResponse);
+    checkAddNamedRangeResponse(o.addNamedRange as api.AddNamedRangeResponse);
+    checkAddProtectedRangeResponse(
+        o.addProtectedRange as api.AddProtectedRangeResponse);
+    checkAddSheetResponse(o.addSheet as api.AddSheetResponse);
+    checkAddSlicerResponse(o.addSlicer as api.AddSlicerResponse);
+    checkCreateDeveloperMetadataResponse(
+        o.createDeveloperMetadata as api.CreateDeveloperMetadataResponse);
+    checkDeleteConditionalFormatRuleResponse(o.deleteConditionalFormatRule
+        as api.DeleteConditionalFormatRuleResponse);
+    checkDeleteDeveloperMetadataResponse(
+        o.deleteDeveloperMetadata as api.DeleteDeveloperMetadataResponse);
+    checkDeleteDimensionGroupResponse(
+        o.deleteDimensionGroup as api.DeleteDimensionGroupResponse);
+    checkDeleteDuplicatesResponse(
+        o.deleteDuplicates as api.DeleteDuplicatesResponse);
+    checkDuplicateFilterViewResponse(
+        o.duplicateFilterView as api.DuplicateFilterViewResponse);
+    checkDuplicateSheetResponse(o.duplicateSheet as api.DuplicateSheetResponse);
+    checkFindReplaceResponse(o.findReplace as api.FindReplaceResponse);
+    checkRefreshDataSourceResponse(
+        o.refreshDataSource as api.RefreshDataSourceResponse);
+    checkTrimWhitespaceResponse(o.trimWhitespace as api.TrimWhitespaceResponse);
+    checkUpdateConditionalFormatRuleResponse(o.updateConditionalFormatRule
+        as api.UpdateConditionalFormatRuleResponse);
+    checkUpdateDataSourceResponse(
+        o.updateDataSource as api.UpdateDataSourceResponse);
+    checkUpdateDeveloperMetadataResponse(
+        o.updateDeveloperMetadata as api.UpdateDeveloperMetadataResponse);
+    checkUpdateEmbeddedObjectPositionResponse(o.updateEmbeddedObjectPosition
+        as api.UpdateEmbeddedObjectPositionResponse);
   }
   buildCounterResponse--;
 }
@@ -5452,8 +5522,8 @@
 
 void checkUnnamed521(core.List<api.CellData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCellData(o[0]);
-  checkCellData(o[1]);
+  checkCellData(o[0] as api.CellData);
+  checkCellData(o[1] as api.CellData);
 }
 
 core.int buildCounterRowData = 0;
@@ -5497,11 +5567,12 @@
   buildCounterScorecardChartSpec++;
   if (buildCounterScorecardChartSpec < 3) {
     unittest.expect(o.aggregateType, unittest.equals('foo'));
-    checkChartData(o.baselineValueData);
-    checkBaselineValueFormat(o.baselineValueFormat);
-    checkChartCustomNumberFormatOptions(o.customFormatOptions);
-    checkChartData(o.keyValueData);
-    checkKeyValueFormat(o.keyValueFormat);
+    checkChartData(o.baselineValueData as api.ChartData);
+    checkBaselineValueFormat(o.baselineValueFormat as api.BaselineValueFormat);
+    checkChartCustomNumberFormatOptions(
+        o.customFormatOptions as api.ChartCustomNumberFormatOptions);
+    checkChartData(o.keyValueData as api.ChartData);
+    checkKeyValueFormat(o.keyValueFormat as api.KeyValueFormat);
     unittest.expect(o.numberFormatSource, unittest.equals('foo'));
     unittest.expect(o.scaleFactor, unittest.equals(42.0));
   }
@@ -5517,8 +5588,8 @@
 
 void checkUnnamed522(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilter(o[0]);
-  checkDataFilter(o[1]);
+  checkDataFilter(o[0] as api.DataFilter);
+  checkDataFilter(o[1] as api.DataFilter);
 }
 
 core.int buildCounterSearchDeveloperMetadataRequest = 0;
@@ -5549,8 +5620,8 @@
 
 void checkUnnamed523(core.List<api.MatchedDeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMatchedDeveloperMetadata(o[0]);
-  checkMatchedDeveloperMetadata(o[1]);
+  checkMatchedDeveloperMetadata(o[0] as api.MatchedDeveloperMetadata);
+  checkMatchedDeveloperMetadata(o[1] as api.MatchedDeveloperMetadata);
 }
 
 core.int buildCounterSearchDeveloperMetadataResponse = 0;
@@ -5587,7 +5658,7 @@
 void checkSetBasicFilterRequest(api.SetBasicFilterRequest o) {
   buildCounterSetBasicFilterRequest++;
   if (buildCounterSetBasicFilterRequest < 3) {
-    checkBasicFilter(o.filter);
+    checkBasicFilter(o.filter as api.BasicFilter);
   }
   buildCounterSetBasicFilterRequest--;
 }
@@ -5607,8 +5678,8 @@
 void checkSetDataValidationRequest(api.SetDataValidationRequest o) {
   buildCounterSetDataValidationRequest++;
   if (buildCounterSetDataValidationRequest < 3) {
-    checkGridRange(o.range);
-    checkDataValidationRule(o.rule);
+    checkGridRange(o.range as api.GridRange);
+    checkDataValidationRule(o.rule as api.DataValidationRule);
   }
   buildCounterSetDataValidationRequest--;
 }
@@ -5622,8 +5693,8 @@
 
 void checkUnnamed524(core.List<api.BandedRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBandedRange(o[0]);
-  checkBandedRange(o[1]);
+  checkBandedRange(o[0] as api.BandedRange);
+  checkBandedRange(o[1] as api.BandedRange);
 }
 
 core.List<api.EmbeddedChart> buildUnnamed525() {
@@ -5635,8 +5706,8 @@
 
 void checkUnnamed525(core.List<api.EmbeddedChart> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEmbeddedChart(o[0]);
-  checkEmbeddedChart(o[1]);
+  checkEmbeddedChart(o[0] as api.EmbeddedChart);
+  checkEmbeddedChart(o[1] as api.EmbeddedChart);
 }
 
 core.List<api.DimensionGroup> buildUnnamed526() {
@@ -5648,8 +5719,8 @@
 
 void checkUnnamed526(core.List<api.DimensionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionGroup(o[0]);
-  checkDimensionGroup(o[1]);
+  checkDimensionGroup(o[0] as api.DimensionGroup);
+  checkDimensionGroup(o[1] as api.DimensionGroup);
 }
 
 core.List<api.ConditionalFormatRule> buildUnnamed527() {
@@ -5661,8 +5732,8 @@
 
 void checkUnnamed527(core.List<api.ConditionalFormatRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConditionalFormatRule(o[0]);
-  checkConditionalFormatRule(o[1]);
+  checkConditionalFormatRule(o[0] as api.ConditionalFormatRule);
+  checkConditionalFormatRule(o[1] as api.ConditionalFormatRule);
 }
 
 core.List<api.GridData> buildUnnamed528() {
@@ -5674,8 +5745,8 @@
 
 void checkUnnamed528(core.List<api.GridData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGridData(o[0]);
-  checkGridData(o[1]);
+  checkGridData(o[0] as api.GridData);
+  checkGridData(o[1] as api.GridData);
 }
 
 core.List<api.DeveloperMetadata> buildUnnamed529() {
@@ -5687,8 +5758,8 @@
 
 void checkUnnamed529(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeveloperMetadata(o[0]);
-  checkDeveloperMetadata(o[1]);
+  checkDeveloperMetadata(o[0] as api.DeveloperMetadata);
+  checkDeveloperMetadata(o[1] as api.DeveloperMetadata);
 }
 
 core.List<api.FilterView> buildUnnamed530() {
@@ -5700,8 +5771,8 @@
 
 void checkUnnamed530(core.List<api.FilterView> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFilterView(o[0]);
-  checkFilterView(o[1]);
+  checkFilterView(o[0] as api.FilterView);
+  checkFilterView(o[1] as api.FilterView);
 }
 
 core.List<api.GridRange> buildUnnamed531() {
@@ -5713,8 +5784,8 @@
 
 void checkUnnamed531(core.List<api.GridRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGridRange(o[0]);
-  checkGridRange(o[1]);
+  checkGridRange(o[0] as api.GridRange);
+  checkGridRange(o[1] as api.GridRange);
 }
 
 core.List<api.ProtectedRange> buildUnnamed532() {
@@ -5726,8 +5797,8 @@
 
 void checkUnnamed532(core.List<api.ProtectedRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProtectedRange(o[0]);
-  checkProtectedRange(o[1]);
+  checkProtectedRange(o[0] as api.ProtectedRange);
+  checkProtectedRange(o[1] as api.ProtectedRange);
 }
 
 core.List<api.DimensionGroup> buildUnnamed533() {
@@ -5739,8 +5810,8 @@
 
 void checkUnnamed533(core.List<api.DimensionGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDimensionGroup(o[0]);
-  checkDimensionGroup(o[1]);
+  checkDimensionGroup(o[0] as api.DimensionGroup);
+  checkDimensionGroup(o[1] as api.DimensionGroup);
 }
 
 core.List<api.Slicer> buildUnnamed534() {
@@ -5752,8 +5823,8 @@
 
 void checkUnnamed534(core.List<api.Slicer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSlicer(o[0]);
-  checkSlicer(o[1]);
+  checkSlicer(o[0] as api.Slicer);
+  checkSlicer(o[1] as api.Slicer);
 }
 
 core.int buildCounterSheet = 0;
@@ -5783,7 +5854,7 @@
   buildCounterSheet++;
   if (buildCounterSheet < 3) {
     checkUnnamed524(o.bandedRanges);
-    checkBasicFilter(o.basicFilter);
+    checkBasicFilter(o.basicFilter as api.BasicFilter);
     checkUnnamed525(o.charts);
     checkUnnamed526(o.columnGroups);
     checkUnnamed527(o.conditionalFormats);
@@ -5791,7 +5862,7 @@
     checkUnnamed529(o.developerMetadata);
     checkUnnamed530(o.filterViews);
     checkUnnamed531(o.merges);
-    checkSheetProperties(o.properties);
+    checkSheetProperties(o.properties as api.SheetProperties);
     checkUnnamed532(o.protectedRanges);
     checkUnnamed533(o.rowGroups);
     checkUnnamed534(o.slicers);
@@ -5822,15 +5893,16 @@
 void checkSheetProperties(api.SheetProperties o) {
   buildCounterSheetProperties++;
   if (buildCounterSheetProperties < 3) {
-    checkDataSourceSheetProperties(o.dataSourceSheetProperties);
-    checkGridProperties(o.gridProperties);
+    checkDataSourceSheetProperties(
+        o.dataSourceSheetProperties as api.DataSourceSheetProperties);
+    checkGridProperties(o.gridProperties as api.GridProperties);
     unittest.expect(o.hidden, unittest.isTrue);
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.rightToLeft, unittest.isTrue);
     unittest.expect(o.sheetId, unittest.equals(42));
     unittest.expect(o.sheetType, unittest.equals('foo'));
-    checkColor(o.tabColor);
-    checkColorStyle(o.tabColorStyle);
+    checkColor(o.tabColor as api.Color);
+    checkColorStyle(o.tabColorStyle as api.ColorStyle);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterSheetProperties--;
@@ -5852,9 +5924,9 @@
 void checkSlicer(api.Slicer o) {
   buildCounterSlicer++;
   if (buildCounterSlicer < 3) {
-    checkEmbeddedObjectPosition(o.position);
+    checkEmbeddedObjectPosition(o.position as api.EmbeddedObjectPosition);
     unittest.expect(o.slicerId, unittest.equals(42));
-    checkSlicerSpec(o.spec);
+    checkSlicerSpec(o.spec as api.SlicerSpec);
   }
   buildCounterSlicer--;
 }
@@ -5882,13 +5954,13 @@
   buildCounterSlicerSpec++;
   if (buildCounterSlicerSpec < 3) {
     unittest.expect(o.applyToPivotTables, unittest.isTrue);
-    checkColor(o.backgroundColor);
-    checkColorStyle(o.backgroundColorStyle);
+    checkColor(o.backgroundColor as api.Color);
+    checkColorStyle(o.backgroundColorStyle as api.ColorStyle);
     unittest.expect(o.columnIndex, unittest.equals(42));
-    checkGridRange(o.dataRange);
-    checkFilterCriteria(o.filterCriteria);
+    checkGridRange(o.dataRange as api.GridRange);
+    checkFilterCriteria(o.filterCriteria as api.FilterCriteria);
     unittest.expect(o.horizontalAlignment, unittest.equals('foo'));
-    checkTextFormat(o.textFormat);
+    checkTextFormat(o.textFormat as api.TextFormat);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterSlicerSpec--;
@@ -5903,8 +5975,8 @@
 
 void checkUnnamed535(core.List<api.SortSpec> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSortSpec(o[0]);
-  checkSortSpec(o[1]);
+  checkSortSpec(o[0] as api.SortSpec);
+  checkSortSpec(o[1] as api.SortSpec);
 }
 
 core.int buildCounterSortRangeRequest = 0;
@@ -5922,7 +5994,7 @@
 void checkSortRangeRequest(api.SortRangeRequest o) {
   buildCounterSortRangeRequest++;
   if (buildCounterSortRangeRequest < 3) {
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     checkUnnamed535(o.sortSpecs);
   }
   buildCounterSortRangeRequest--;
@@ -5948,12 +6020,13 @@
 void checkSortSpec(api.SortSpec o) {
   buildCounterSortSpec++;
   if (buildCounterSortSpec < 3) {
-    checkColor(o.backgroundColor);
-    checkColorStyle(o.backgroundColorStyle);
-    checkDataSourceColumnReference(o.dataSourceColumnReference);
+    checkColor(o.backgroundColor as api.Color);
+    checkColorStyle(o.backgroundColorStyle as api.ColorStyle);
+    checkDataSourceColumnReference(
+        o.dataSourceColumnReference as api.DataSourceColumnReference);
     unittest.expect(o.dimensionIndex, unittest.equals(42));
-    checkColor(o.foregroundColor);
-    checkColorStyle(o.foregroundColorStyle);
+    checkColor(o.foregroundColor as api.Color);
+    checkColorStyle(o.foregroundColorStyle as api.ColorStyle);
     unittest.expect(o.sortOrder, unittest.equals('foo'));
   }
   buildCounterSortSpec--;
@@ -5977,7 +6050,7 @@
   if (buildCounterSourceAndDestination < 3) {
     unittest.expect(o.dimension, unittest.equals('foo'));
     unittest.expect(o.fillLength, unittest.equals(42));
-    checkGridRange(o.source);
+    checkGridRange(o.source as api.GridRange);
   }
   buildCounterSourceAndDestination--;
 }
@@ -5991,8 +6064,8 @@
 
 void checkUnnamed536(core.List<api.DataSourceRefreshSchedule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSourceRefreshSchedule(o[0]);
-  checkDataSourceRefreshSchedule(o[1]);
+  checkDataSourceRefreshSchedule(o[0] as api.DataSourceRefreshSchedule);
+  checkDataSourceRefreshSchedule(o[1] as api.DataSourceRefreshSchedule);
 }
 
 core.List<api.DataSource> buildUnnamed537() {
@@ -6004,8 +6077,8 @@
 
 void checkUnnamed537(core.List<api.DataSource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataSource(o[0]);
-  checkDataSource(o[1]);
+  checkDataSource(o[0] as api.DataSource);
+  checkDataSource(o[1] as api.DataSource);
 }
 
 core.List<api.DeveloperMetadata> buildUnnamed538() {
@@ -6017,8 +6090,8 @@
 
 void checkUnnamed538(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeveloperMetadata(o[0]);
-  checkDeveloperMetadata(o[1]);
+  checkDeveloperMetadata(o[0] as api.DeveloperMetadata);
+  checkDeveloperMetadata(o[1] as api.DeveloperMetadata);
 }
 
 core.List<api.NamedRange> buildUnnamed539() {
@@ -6030,8 +6103,8 @@
 
 void checkUnnamed539(core.List<api.NamedRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNamedRange(o[0]);
-  checkNamedRange(o[1]);
+  checkNamedRange(o[0] as api.NamedRange);
+  checkNamedRange(o[1] as api.NamedRange);
 }
 
 core.List<api.Sheet> buildUnnamed540() {
@@ -6043,8 +6116,8 @@
 
 void checkUnnamed540(core.List<api.Sheet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSheet(o[0]);
-  checkSheet(o[1]);
+  checkSheet(o[0] as api.Sheet);
+  checkSheet(o[1] as api.Sheet);
 }
 
 core.int buildCounterSpreadsheet = 0;
@@ -6072,7 +6145,7 @@
     checkUnnamed537(o.dataSources);
     checkUnnamed538(o.developerMetadata);
     checkUnnamed539(o.namedRanges);
-    checkSpreadsheetProperties(o.properties);
+    checkSpreadsheetProperties(o.properties as api.SpreadsheetProperties);
     checkUnnamed540(o.sheets);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
     unittest.expect(o.spreadsheetUrl, unittest.equals('foo'));
@@ -6101,10 +6174,11 @@
   buildCounterSpreadsheetProperties++;
   if (buildCounterSpreadsheetProperties < 3) {
     unittest.expect(o.autoRecalc, unittest.equals('foo'));
-    checkCellFormat(o.defaultFormat);
-    checkIterativeCalculationSettings(o.iterativeCalculationSettings);
+    checkCellFormat(o.defaultFormat as api.CellFormat);
+    checkIterativeCalculationSettings(
+        o.iterativeCalculationSettings as api.IterativeCalculationSettings);
     unittest.expect(o.locale, unittest.equals('foo'));
-    checkSpreadsheetTheme(o.spreadsheetTheme);
+    checkSpreadsheetTheme(o.spreadsheetTheme as api.SpreadsheetTheme);
     unittest.expect(o.timeZone, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
   }
@@ -6120,8 +6194,8 @@
 
 void checkUnnamed541(core.List<api.ThemeColorPair> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThemeColorPair(o[0]);
-  checkThemeColorPair(o[1]);
+  checkThemeColorPair(o[0] as api.ThemeColorPair);
+  checkThemeColorPair(o[1] as api.ThemeColorPair);
 }
 
 core.int buildCounterSpreadsheetTheme = 0;
@@ -6169,8 +6243,8 @@
     unittest.expect(o.bold, unittest.isTrue);
     unittest.expect(o.fontFamily, unittest.equals('foo'));
     unittest.expect(o.fontSize, unittest.equals(42));
-    checkColor(o.foregroundColor);
-    checkColorStyle(o.foregroundColorStyle);
+    checkColor(o.foregroundColor as api.Color);
+    checkColorStyle(o.foregroundColorStyle as api.ColorStyle);
     unittest.expect(o.italic, unittest.isTrue);
     unittest.expect(o.strikethrough, unittest.isTrue);
     unittest.expect(o.underline, unittest.isTrue);
@@ -6193,7 +6267,7 @@
 void checkTextFormatRun(api.TextFormatRun o) {
   buildCounterTextFormatRun++;
   if (buildCounterTextFormatRun < 3) {
-    checkTextFormat(o.format);
+    checkTextFormat(o.format as api.TextFormat);
     unittest.expect(o.startIndex, unittest.equals(42));
   }
   buildCounterTextFormatRun--;
@@ -6257,7 +6331,7 @@
   if (buildCounterTextToColumnsRequest < 3) {
     unittest.expect(o.delimiter, unittest.equals('foo'));
     unittest.expect(o.delimiterType, unittest.equals('foo'));
-    checkGridRange(o.source);
+    checkGridRange(o.source as api.GridRange);
   }
   buildCounterTextToColumnsRequest--;
 }
@@ -6277,7 +6351,7 @@
 void checkThemeColorPair(api.ThemeColorPair o) {
   buildCounterThemeColorPair++;
   if (buildCounterThemeColorPair < 3) {
-    checkColorStyle(o.color);
+    checkColorStyle(o.color as api.ColorStyle);
     unittest.expect(o.colorType, unittest.equals('foo'));
   }
   buildCounterThemeColorPair--;
@@ -6329,14 +6403,14 @@
 void checkTreemapChartColorScale(api.TreemapChartColorScale o) {
   buildCounterTreemapChartColorScale++;
   if (buildCounterTreemapChartColorScale < 3) {
-    checkColor(o.maxValueColor);
-    checkColorStyle(o.maxValueColorStyle);
-    checkColor(o.midValueColor);
-    checkColorStyle(o.midValueColorStyle);
-    checkColor(o.minValueColor);
-    checkColorStyle(o.minValueColorStyle);
-    checkColor(o.noDataColor);
-    checkColorStyle(o.noDataColorStyle);
+    checkColor(o.maxValueColor as api.Color);
+    checkColorStyle(o.maxValueColorStyle as api.ColorStyle);
+    checkColor(o.midValueColor as api.Color);
+    checkColorStyle(o.midValueColorStyle as api.ColorStyle);
+    checkColor(o.minValueColor as api.Color);
+    checkColorStyle(o.minValueColorStyle as api.ColorStyle);
+    checkColor(o.noDataColor as api.Color);
+    checkColorStyle(o.noDataColorStyle as api.ColorStyle);
   }
   buildCounterTreemapChartColorScale--;
 }
@@ -6367,19 +6441,19 @@
 void checkTreemapChartSpec(api.TreemapChartSpec o) {
   buildCounterTreemapChartSpec++;
   if (buildCounterTreemapChartSpec < 3) {
-    checkChartData(o.colorData);
-    checkTreemapChartColorScale(o.colorScale);
-    checkColor(o.headerColor);
-    checkColorStyle(o.headerColorStyle);
+    checkChartData(o.colorData as api.ChartData);
+    checkTreemapChartColorScale(o.colorScale as api.TreemapChartColorScale);
+    checkColor(o.headerColor as api.Color);
+    checkColorStyle(o.headerColorStyle as api.ColorStyle);
     unittest.expect(o.hideTooltips, unittest.isTrue);
     unittest.expect(o.hintedLevels, unittest.equals(42));
-    checkChartData(o.labels);
+    checkChartData(o.labels as api.ChartData);
     unittest.expect(o.levels, unittest.equals(42));
     unittest.expect(o.maxValue, unittest.equals(42.0));
     unittest.expect(o.minValue, unittest.equals(42.0));
-    checkChartData(o.parentLabels);
-    checkChartData(o.sizeData);
-    checkTextFormat(o.textFormat);
+    checkChartData(o.parentLabels as api.ChartData);
+    checkChartData(o.sizeData as api.ChartData);
+    checkTextFormat(o.textFormat as api.TextFormat);
   }
   buildCounterTreemapChartSpec--;
 }
@@ -6398,7 +6472,7 @@
 void checkTrimWhitespaceRequest(api.TrimWhitespaceRequest o) {
   buildCounterTrimWhitespaceRequest++;
   if (buildCounterTrimWhitespaceRequest < 3) {
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterTrimWhitespaceRequest--;
 }
@@ -6436,7 +6510,7 @@
 void checkUnmergeCellsRequest(api.UnmergeCellsRequest o) {
   buildCounterUnmergeCellsRequest++;
   if (buildCounterUnmergeCellsRequest < 3) {
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
   }
   buildCounterUnmergeCellsRequest--;
 }
@@ -6456,7 +6530,7 @@
 void checkUpdateBandingRequest(api.UpdateBandingRequest o) {
   buildCounterUpdateBandingRequest++;
   if (buildCounterUpdateBandingRequest < 3) {
-    checkBandedRange(o.bandedRange);
+    checkBandedRange(o.bandedRange as api.BandedRange);
     unittest.expect(o.fields, unittest.equals('foo'));
   }
   buildCounterUpdateBandingRequest--;
@@ -6482,13 +6556,13 @@
 void checkUpdateBordersRequest(api.UpdateBordersRequest o) {
   buildCounterUpdateBordersRequest++;
   if (buildCounterUpdateBordersRequest < 3) {
-    checkBorder(o.bottom);
-    checkBorder(o.innerHorizontal);
-    checkBorder(o.innerVertical);
-    checkBorder(o.left);
-    checkGridRange(o.range);
-    checkBorder(o.right);
-    checkBorder(o.top);
+    checkBorder(o.bottom as api.Border);
+    checkBorder(o.innerHorizontal as api.Border);
+    checkBorder(o.innerVertical as api.Border);
+    checkBorder(o.left as api.Border);
+    checkGridRange(o.range as api.GridRange);
+    checkBorder(o.right as api.Border);
+    checkBorder(o.top as api.Border);
   }
   buildCounterUpdateBordersRequest--;
 }
@@ -6502,8 +6576,8 @@
 
 void checkUnnamed542(core.List<api.RowData> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRowData(o[0]);
-  checkRowData(o[1]);
+  checkRowData(o[0] as api.RowData);
+  checkRowData(o[1] as api.RowData);
 }
 
 core.int buildCounterUpdateCellsRequest = 0;
@@ -6524,9 +6598,9 @@
   buildCounterUpdateCellsRequest++;
   if (buildCounterUpdateCellsRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkGridRange(o.range);
+    checkGridRange(o.range as api.GridRange);
     checkUnnamed542(o.rows);
-    checkGridCoordinate(o.start);
+    checkGridCoordinate(o.start as api.GridCoordinate);
   }
   buildCounterUpdateCellsRequest--;
 }
@@ -6547,7 +6621,7 @@
   buildCounterUpdateChartSpecRequest++;
   if (buildCounterUpdateChartSpecRequest < 3) {
     unittest.expect(o.chartId, unittest.equals(42));
-    checkChartSpec(o.spec);
+    checkChartSpec(o.spec as api.ChartSpec);
   }
   buildCounterUpdateChartSpecRequest--;
 }
@@ -6573,7 +6647,7 @@
   if (buildCounterUpdateConditionalFormatRuleRequest < 3) {
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.newIndex, unittest.equals(42));
-    checkConditionalFormatRule(o.rule);
+    checkConditionalFormatRule(o.rule as api.ConditionalFormatRule);
     unittest.expect(o.sheetId, unittest.equals(42));
   }
   buildCounterUpdateConditionalFormatRuleRequest--;
@@ -6599,9 +6673,9 @@
   buildCounterUpdateConditionalFormatRuleResponse++;
   if (buildCounterUpdateConditionalFormatRuleResponse < 3) {
     unittest.expect(o.newIndex, unittest.equals(42));
-    checkConditionalFormatRule(o.newRule);
+    checkConditionalFormatRule(o.newRule as api.ConditionalFormatRule);
     unittest.expect(o.oldIndex, unittest.equals(42));
-    checkConditionalFormatRule(o.oldRule);
+    checkConditionalFormatRule(o.oldRule as api.ConditionalFormatRule);
   }
   buildCounterUpdateConditionalFormatRuleResponse--;
 }
@@ -6621,7 +6695,7 @@
 void checkUpdateDataSourceRequest(api.UpdateDataSourceRequest o) {
   buildCounterUpdateDataSourceRequest++;
   if (buildCounterUpdateDataSourceRequest < 3) {
-    checkDataSource(o.dataSource);
+    checkDataSource(o.dataSource as api.DataSource);
     unittest.expect(o.fields, unittest.equals('foo'));
   }
   buildCounterUpdateDataSourceRequest--;
@@ -6642,8 +6716,8 @@
 void checkUpdateDataSourceResponse(api.UpdateDataSourceResponse o) {
   buildCounterUpdateDataSourceResponse++;
   if (buildCounterUpdateDataSourceResponse < 3) {
-    checkDataExecutionStatus(o.dataExecutionStatus);
-    checkDataSource(o.dataSource);
+    checkDataExecutionStatus(o.dataExecutionStatus as api.DataExecutionStatus);
+    checkDataSource(o.dataSource as api.DataSource);
   }
   buildCounterUpdateDataSourceResponse--;
 }
@@ -6657,8 +6731,8 @@
 
 void checkUnnamed543(core.List<api.DataFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDataFilter(o[0]);
-  checkDataFilter(o[1]);
+  checkDataFilter(o[0] as api.DataFilter);
+  checkDataFilter(o[1] as api.DataFilter);
 }
 
 core.int buildCounterUpdateDeveloperMetadataRequest = 0;
@@ -6678,7 +6752,7 @@
   buildCounterUpdateDeveloperMetadataRequest++;
   if (buildCounterUpdateDeveloperMetadataRequest < 3) {
     checkUnnamed543(o.dataFilters);
-    checkDeveloperMetadata(o.developerMetadata);
+    checkDeveloperMetadata(o.developerMetadata as api.DeveloperMetadata);
     unittest.expect(o.fields, unittest.equals('foo'));
   }
   buildCounterUpdateDeveloperMetadataRequest--;
@@ -6693,8 +6767,8 @@
 
 void checkUnnamed544(core.List<api.DeveloperMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeveloperMetadata(o[0]);
-  checkDeveloperMetadata(o[1]);
+  checkDeveloperMetadata(o[0] as api.DeveloperMetadata);
+  checkDeveloperMetadata(o[1] as api.DeveloperMetadata);
 }
 
 core.int buildCounterUpdateDeveloperMetadataResponse = 0;
@@ -6732,7 +6806,7 @@
 void checkUpdateDimensionGroupRequest(api.UpdateDimensionGroupRequest o) {
   buildCounterUpdateDimensionGroupRequest++;
   if (buildCounterUpdateDimensionGroupRequest < 3) {
-    checkDimensionGroup(o.dimensionGroup);
+    checkDimensionGroup(o.dimensionGroup as api.DimensionGroup);
     unittest.expect(o.fields, unittest.equals('foo'));
   }
   buildCounterUpdateDimensionGroupRequest--;
@@ -6756,10 +6830,11 @@
     api.UpdateDimensionPropertiesRequest o) {
   buildCounterUpdateDimensionPropertiesRequest++;
   if (buildCounterUpdateDimensionPropertiesRequest < 3) {
-    checkDataSourceSheetDimensionRange(o.dataSourceSheetRange);
+    checkDataSourceSheetDimensionRange(
+        o.dataSourceSheetRange as api.DataSourceSheetDimensionRange);
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkDimensionProperties(o.properties);
-    checkDimensionRange(o.range);
+    checkDimensionProperties(o.properties as api.DimensionProperties);
+    checkDimensionRange(o.range as api.DimensionRange);
   }
   buildCounterUpdateDimensionPropertiesRequest--;
 }
@@ -6783,7 +6858,7 @@
   buildCounterUpdateEmbeddedObjectPositionRequest++;
   if (buildCounterUpdateEmbeddedObjectPositionRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkEmbeddedObjectPosition(o.newPosition);
+    checkEmbeddedObjectPosition(o.newPosition as api.EmbeddedObjectPosition);
     unittest.expect(o.objectId, unittest.equals(42));
   }
   buildCounterUpdateEmbeddedObjectPositionRequest--;
@@ -6805,7 +6880,7 @@
     api.UpdateEmbeddedObjectPositionResponse o) {
   buildCounterUpdateEmbeddedObjectPositionResponse++;
   if (buildCounterUpdateEmbeddedObjectPositionResponse < 3) {
-    checkEmbeddedObjectPosition(o.position);
+    checkEmbeddedObjectPosition(o.position as api.EmbeddedObjectPosition);
   }
   buildCounterUpdateEmbeddedObjectPositionResponse--;
 }
@@ -6826,7 +6901,7 @@
   buildCounterUpdateFilterViewRequest++;
   if (buildCounterUpdateFilterViewRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkFilterView(o.filter);
+    checkFilterView(o.filter as api.FilterView);
   }
   buildCounterUpdateFilterViewRequest--;
 }
@@ -6847,7 +6922,7 @@
   buildCounterUpdateNamedRangeRequest++;
   if (buildCounterUpdateNamedRangeRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkNamedRange(o.namedRange);
+    checkNamedRange(o.namedRange as api.NamedRange);
   }
   buildCounterUpdateNamedRangeRequest--;
 }
@@ -6868,7 +6943,7 @@
   buildCounterUpdateProtectedRangeRequest++;
   if (buildCounterUpdateProtectedRangeRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkProtectedRange(o.protectedRange);
+    checkProtectedRange(o.protectedRange as api.ProtectedRange);
   }
   buildCounterUpdateProtectedRangeRequest--;
 }
@@ -6889,7 +6964,7 @@
   buildCounterUpdateSheetPropertiesRequest++;
   if (buildCounterUpdateSheetPropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkSheetProperties(o.properties);
+    checkSheetProperties(o.properties as api.SheetProperties);
   }
   buildCounterUpdateSheetPropertiesRequest--;
 }
@@ -6912,7 +6987,7 @@
   if (buildCounterUpdateSlicerSpecRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.slicerId, unittest.equals(42));
-    checkSlicerSpec(o.spec);
+    checkSlicerSpec(o.spec as api.SlicerSpec);
   }
   buildCounterUpdateSlicerSpecRequest--;
 }
@@ -6935,7 +7010,7 @@
   buildCounterUpdateSpreadsheetPropertiesRequest++;
   if (buildCounterUpdateSpreadsheetPropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkSpreadsheetProperties(o.properties);
+    checkSpreadsheetProperties(o.properties as api.SpreadsheetProperties);
   }
   buildCounterUpdateSpreadsheetPropertiesRequest--;
 }
@@ -6960,10 +7035,10 @@
     api.UpdateValuesByDataFilterResponse o) {
   buildCounterUpdateValuesByDataFilterResponse++;
   if (buildCounterUpdateValuesByDataFilterResponse < 3) {
-    checkDataFilter(o.dataFilter);
+    checkDataFilter(o.dataFilter as api.DataFilter);
     unittest.expect(o.updatedCells, unittest.equals(42));
     unittest.expect(o.updatedColumns, unittest.equals(42));
-    checkValueRange(o.updatedData);
+    checkValueRange(o.updatedData as api.ValueRange);
     unittest.expect(o.updatedRange, unittest.equals('foo'));
     unittest.expect(o.updatedRows, unittest.equals(42));
   }
@@ -6992,7 +7067,7 @@
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
     unittest.expect(o.updatedCells, unittest.equals(42));
     unittest.expect(o.updatedColumns, unittest.equals(42));
-    checkValueRange(o.updatedData);
+    checkValueRange(o.updatedData as api.ValueRange);
     unittest.expect(o.updatedRange, unittest.equals('foo'));
     unittest.expect(o.updatedRows, unittest.equals(42));
   }
@@ -7080,8 +7155,8 @@
 void checkWaterfallChartColumnStyle(api.WaterfallChartColumnStyle o) {
   buildCounterWaterfallChartColumnStyle++;
   if (buildCounterWaterfallChartColumnStyle < 3) {
-    checkColor(o.color);
-    checkColorStyle(o.colorStyle);
+    checkColor(o.color as api.Color);
+    checkColorStyle(o.colorStyle as api.ColorStyle);
     unittest.expect(o.label, unittest.equals('foo'));
   }
   buildCounterWaterfallChartColumnStyle--;
@@ -7125,7 +7200,7 @@
 void checkWaterfallChartDomain(api.WaterfallChartDomain o) {
   buildCounterWaterfallChartDomain++;
   if (buildCounterWaterfallChartDomain < 3) {
-    checkChartData(o.data);
+    checkChartData(o.data as api.ChartData);
     unittest.expect(o.reversed, unittest.isTrue);
   }
   buildCounterWaterfallChartDomain--;
@@ -7140,8 +7215,8 @@
 
 void checkUnnamed547(core.List<api.WaterfallChartCustomSubtotal> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWaterfallChartCustomSubtotal(o[0]);
-  checkWaterfallChartCustomSubtotal(o[1]);
+  checkWaterfallChartCustomSubtotal(o[0] as api.WaterfallChartCustomSubtotal);
+  checkWaterfallChartCustomSubtotal(o[1] as api.WaterfallChartCustomSubtotal);
 }
 
 core.int buildCounterWaterfallChartSeries = 0;
@@ -7164,11 +7239,14 @@
   buildCounterWaterfallChartSeries++;
   if (buildCounterWaterfallChartSeries < 3) {
     checkUnnamed547(o.customSubtotals);
-    checkChartData(o.data);
+    checkChartData(o.data as api.ChartData);
     unittest.expect(o.hideTrailingSubtotal, unittest.isTrue);
-    checkWaterfallChartColumnStyle(o.negativeColumnsStyle);
-    checkWaterfallChartColumnStyle(o.positiveColumnsStyle);
-    checkWaterfallChartColumnStyle(o.subtotalColumnsStyle);
+    checkWaterfallChartColumnStyle(
+        o.negativeColumnsStyle as api.WaterfallChartColumnStyle);
+    checkWaterfallChartColumnStyle(
+        o.positiveColumnsStyle as api.WaterfallChartColumnStyle);
+    checkWaterfallChartColumnStyle(
+        o.subtotalColumnsStyle as api.WaterfallChartColumnStyle);
   }
   buildCounterWaterfallChartSeries--;
 }
@@ -7182,8 +7260,8 @@
 
 void checkUnnamed548(core.List<api.WaterfallChartSeries> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWaterfallChartSeries(o[0]);
-  checkWaterfallChartSeries(o[1]);
+  checkWaterfallChartSeries(o[0] as api.WaterfallChartSeries);
+  checkWaterfallChartSeries(o[1] as api.WaterfallChartSeries);
 }
 
 core.int buildCounterWaterfallChartSpec = 0;
@@ -7205,8 +7283,8 @@
 void checkWaterfallChartSpec(api.WaterfallChartSpec o) {
   buildCounterWaterfallChartSpec++;
   if (buildCounterWaterfallChartSpec < 3) {
-    checkLineStyle(o.connectorLineStyle);
-    checkWaterfallChartDomain(o.domain);
+    checkLineStyle(o.connectorLineStyle as api.LineStyle);
+    checkWaterfallChartDomain(o.domain as api.WaterfallChartDomain);
     unittest.expect(o.firstValueIsTotal, unittest.isTrue);
     unittest.expect(o.hideConnectorLines, unittest.isTrue);
     checkUnnamed548(o.series);
@@ -7246,7 +7324,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddBandingRequest();
       var od = api.AddBandingRequest.fromJson(o.toJson());
-      checkAddBandingRequest(od);
+      checkAddBandingRequest(od as api.AddBandingRequest);
     });
   });
 
@@ -7254,7 +7332,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddBandingResponse();
       var od = api.AddBandingResponse.fromJson(o.toJson());
-      checkAddBandingResponse(od);
+      checkAddBandingResponse(od as api.AddBandingResponse);
     });
   });
 
@@ -7262,7 +7340,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddChartRequest();
       var od = api.AddChartRequest.fromJson(o.toJson());
-      checkAddChartRequest(od);
+      checkAddChartRequest(od as api.AddChartRequest);
     });
   });
 
@@ -7270,7 +7348,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddChartResponse();
       var od = api.AddChartResponse.fromJson(o.toJson());
-      checkAddChartResponse(od);
+      checkAddChartResponse(od as api.AddChartResponse);
     });
   });
 
@@ -7278,7 +7356,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddConditionalFormatRuleRequest();
       var od = api.AddConditionalFormatRuleRequest.fromJson(o.toJson());
-      checkAddConditionalFormatRuleRequest(od);
+      checkAddConditionalFormatRuleRequest(
+          od as api.AddConditionalFormatRuleRequest);
     });
   });
 
@@ -7286,7 +7365,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDataSourceRequest();
       var od = api.AddDataSourceRequest.fromJson(o.toJson());
-      checkAddDataSourceRequest(od);
+      checkAddDataSourceRequest(od as api.AddDataSourceRequest);
     });
   });
 
@@ -7294,7 +7373,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDataSourceResponse();
       var od = api.AddDataSourceResponse.fromJson(o.toJson());
-      checkAddDataSourceResponse(od);
+      checkAddDataSourceResponse(od as api.AddDataSourceResponse);
     });
   });
 
@@ -7302,7 +7381,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDimensionGroupRequest();
       var od = api.AddDimensionGroupRequest.fromJson(o.toJson());
-      checkAddDimensionGroupRequest(od);
+      checkAddDimensionGroupRequest(od as api.AddDimensionGroupRequest);
     });
   });
 
@@ -7310,7 +7389,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddDimensionGroupResponse();
       var od = api.AddDimensionGroupResponse.fromJson(o.toJson());
-      checkAddDimensionGroupResponse(od);
+      checkAddDimensionGroupResponse(od as api.AddDimensionGroupResponse);
     });
   });
 
@@ -7318,7 +7397,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddFilterViewRequest();
       var od = api.AddFilterViewRequest.fromJson(o.toJson());
-      checkAddFilterViewRequest(od);
+      checkAddFilterViewRequest(od as api.AddFilterViewRequest);
     });
   });
 
@@ -7326,7 +7405,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddFilterViewResponse();
       var od = api.AddFilterViewResponse.fromJson(o.toJson());
-      checkAddFilterViewResponse(od);
+      checkAddFilterViewResponse(od as api.AddFilterViewResponse);
     });
   });
 
@@ -7334,7 +7413,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddNamedRangeRequest();
       var od = api.AddNamedRangeRequest.fromJson(o.toJson());
-      checkAddNamedRangeRequest(od);
+      checkAddNamedRangeRequest(od as api.AddNamedRangeRequest);
     });
   });
 
@@ -7342,7 +7421,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddNamedRangeResponse();
       var od = api.AddNamedRangeResponse.fromJson(o.toJson());
-      checkAddNamedRangeResponse(od);
+      checkAddNamedRangeResponse(od as api.AddNamedRangeResponse);
     });
   });
 
@@ -7350,7 +7429,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddProtectedRangeRequest();
       var od = api.AddProtectedRangeRequest.fromJson(o.toJson());
-      checkAddProtectedRangeRequest(od);
+      checkAddProtectedRangeRequest(od as api.AddProtectedRangeRequest);
     });
   });
 
@@ -7358,7 +7437,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddProtectedRangeResponse();
       var od = api.AddProtectedRangeResponse.fromJson(o.toJson());
-      checkAddProtectedRangeResponse(od);
+      checkAddProtectedRangeResponse(od as api.AddProtectedRangeResponse);
     });
   });
 
@@ -7366,7 +7445,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddSheetRequest();
       var od = api.AddSheetRequest.fromJson(o.toJson());
-      checkAddSheetRequest(od);
+      checkAddSheetRequest(od as api.AddSheetRequest);
     });
   });
 
@@ -7374,7 +7453,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddSheetResponse();
       var od = api.AddSheetResponse.fromJson(o.toJson());
-      checkAddSheetResponse(od);
+      checkAddSheetResponse(od as api.AddSheetResponse);
     });
   });
 
@@ -7382,7 +7461,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddSlicerRequest();
       var od = api.AddSlicerRequest.fromJson(o.toJson());
-      checkAddSlicerRequest(od);
+      checkAddSlicerRequest(od as api.AddSlicerRequest);
     });
   });
 
@@ -7390,7 +7469,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddSlicerResponse();
       var od = api.AddSlicerResponse.fromJson(o.toJson());
-      checkAddSlicerResponse(od);
+      checkAddSlicerResponse(od as api.AddSlicerResponse);
     });
   });
 
@@ -7398,7 +7477,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppendCellsRequest();
       var od = api.AppendCellsRequest.fromJson(o.toJson());
-      checkAppendCellsRequest(od);
+      checkAppendCellsRequest(od as api.AppendCellsRequest);
     });
   });
 
@@ -7406,7 +7485,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppendDimensionRequest();
       var od = api.AppendDimensionRequest.fromJson(o.toJson());
-      checkAppendDimensionRequest(od);
+      checkAppendDimensionRequest(od as api.AppendDimensionRequest);
     });
   });
 
@@ -7414,7 +7493,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppendValuesResponse();
       var od = api.AppendValuesResponse.fromJson(o.toJson());
-      checkAppendValuesResponse(od);
+      checkAppendValuesResponse(od as api.AppendValuesResponse);
     });
   });
 
@@ -7422,7 +7501,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoFillRequest();
       var od = api.AutoFillRequest.fromJson(o.toJson());
-      checkAutoFillRequest(od);
+      checkAutoFillRequest(od as api.AutoFillRequest);
     });
   });
 
@@ -7430,7 +7509,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoResizeDimensionsRequest();
       var od = api.AutoResizeDimensionsRequest.fromJson(o.toJson());
-      checkAutoResizeDimensionsRequest(od);
+      checkAutoResizeDimensionsRequest(od as api.AutoResizeDimensionsRequest);
     });
   });
 
@@ -7438,7 +7517,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBandedRange();
       var od = api.BandedRange.fromJson(o.toJson());
-      checkBandedRange(od);
+      checkBandedRange(od as api.BandedRange);
     });
   });
 
@@ -7446,7 +7525,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBandingProperties();
       var od = api.BandingProperties.fromJson(o.toJson());
-      checkBandingProperties(od);
+      checkBandingProperties(od as api.BandingProperties);
     });
   });
 
@@ -7454,7 +7533,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBaselineValueFormat();
       var od = api.BaselineValueFormat.fromJson(o.toJson());
-      checkBaselineValueFormat(od);
+      checkBaselineValueFormat(od as api.BaselineValueFormat);
     });
   });
 
@@ -7462,7 +7541,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicChartAxis();
       var od = api.BasicChartAxis.fromJson(o.toJson());
-      checkBasicChartAxis(od);
+      checkBasicChartAxis(od as api.BasicChartAxis);
     });
   });
 
@@ -7470,7 +7549,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicChartDomain();
       var od = api.BasicChartDomain.fromJson(o.toJson());
-      checkBasicChartDomain(od);
+      checkBasicChartDomain(od as api.BasicChartDomain);
     });
   });
 
@@ -7478,7 +7557,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicChartSeries();
       var od = api.BasicChartSeries.fromJson(o.toJson());
-      checkBasicChartSeries(od);
+      checkBasicChartSeries(od as api.BasicChartSeries);
     });
   });
 
@@ -7486,7 +7565,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicChartSpec();
       var od = api.BasicChartSpec.fromJson(o.toJson());
-      checkBasicChartSpec(od);
+      checkBasicChartSpec(od as api.BasicChartSpec);
     });
   });
 
@@ -7494,7 +7573,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBasicFilter();
       var od = api.BasicFilter.fromJson(o.toJson());
-      checkBasicFilter(od);
+      checkBasicFilter(od as api.BasicFilter);
     });
   });
 
@@ -7502,7 +7581,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchClearValuesByDataFilterRequest();
       var od = api.BatchClearValuesByDataFilterRequest.fromJson(o.toJson());
-      checkBatchClearValuesByDataFilterRequest(od);
+      checkBatchClearValuesByDataFilterRequest(
+          od as api.BatchClearValuesByDataFilterRequest);
     });
   });
 
@@ -7510,7 +7590,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchClearValuesByDataFilterResponse();
       var od = api.BatchClearValuesByDataFilterResponse.fromJson(o.toJson());
-      checkBatchClearValuesByDataFilterResponse(od);
+      checkBatchClearValuesByDataFilterResponse(
+          od as api.BatchClearValuesByDataFilterResponse);
     });
   });
 
@@ -7518,7 +7599,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchClearValuesRequest();
       var od = api.BatchClearValuesRequest.fromJson(o.toJson());
-      checkBatchClearValuesRequest(od);
+      checkBatchClearValuesRequest(od as api.BatchClearValuesRequest);
     });
   });
 
@@ -7526,7 +7607,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchClearValuesResponse();
       var od = api.BatchClearValuesResponse.fromJson(o.toJson());
-      checkBatchClearValuesResponse(od);
+      checkBatchClearValuesResponse(od as api.BatchClearValuesResponse);
     });
   });
 
@@ -7534,7 +7615,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetValuesByDataFilterRequest();
       var od = api.BatchGetValuesByDataFilterRequest.fromJson(o.toJson());
-      checkBatchGetValuesByDataFilterRequest(od);
+      checkBatchGetValuesByDataFilterRequest(
+          od as api.BatchGetValuesByDataFilterRequest);
     });
   });
 
@@ -7542,7 +7624,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetValuesByDataFilterResponse();
       var od = api.BatchGetValuesByDataFilterResponse.fromJson(o.toJson());
-      checkBatchGetValuesByDataFilterResponse(od);
+      checkBatchGetValuesByDataFilterResponse(
+          od as api.BatchGetValuesByDataFilterResponse);
     });
   });
 
@@ -7550,7 +7633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetValuesResponse();
       var od = api.BatchGetValuesResponse.fromJson(o.toJson());
-      checkBatchGetValuesResponse(od);
+      checkBatchGetValuesResponse(od as api.BatchGetValuesResponse);
     });
   });
 
@@ -7558,7 +7641,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateSpreadsheetRequest();
       var od = api.BatchUpdateSpreadsheetRequest.fromJson(o.toJson());
-      checkBatchUpdateSpreadsheetRequest(od);
+      checkBatchUpdateSpreadsheetRequest(
+          od as api.BatchUpdateSpreadsheetRequest);
     });
   });
 
@@ -7566,7 +7650,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateSpreadsheetResponse();
       var od = api.BatchUpdateSpreadsheetResponse.fromJson(o.toJson());
-      checkBatchUpdateSpreadsheetResponse(od);
+      checkBatchUpdateSpreadsheetResponse(
+          od as api.BatchUpdateSpreadsheetResponse);
     });
   });
 
@@ -7574,7 +7659,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateValuesByDataFilterRequest();
       var od = api.BatchUpdateValuesByDataFilterRequest.fromJson(o.toJson());
-      checkBatchUpdateValuesByDataFilterRequest(od);
+      checkBatchUpdateValuesByDataFilterRequest(
+          od as api.BatchUpdateValuesByDataFilterRequest);
     });
   });
 
@@ -7582,7 +7668,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateValuesByDataFilterResponse();
       var od = api.BatchUpdateValuesByDataFilterResponse.fromJson(o.toJson());
-      checkBatchUpdateValuesByDataFilterResponse(od);
+      checkBatchUpdateValuesByDataFilterResponse(
+          od as api.BatchUpdateValuesByDataFilterResponse);
     });
   });
 
@@ -7590,7 +7677,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateValuesRequest();
       var od = api.BatchUpdateValuesRequest.fromJson(o.toJson());
-      checkBatchUpdateValuesRequest(od);
+      checkBatchUpdateValuesRequest(od as api.BatchUpdateValuesRequest);
     });
   });
 
@@ -7598,7 +7685,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdateValuesResponse();
       var od = api.BatchUpdateValuesResponse.fromJson(o.toJson());
-      checkBatchUpdateValuesResponse(od);
+      checkBatchUpdateValuesResponse(od as api.BatchUpdateValuesResponse);
     });
   });
 
@@ -7606,7 +7693,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigQueryDataSourceSpec();
       var od = api.BigQueryDataSourceSpec.fromJson(o.toJson());
-      checkBigQueryDataSourceSpec(od);
+      checkBigQueryDataSourceSpec(od as api.BigQueryDataSourceSpec);
     });
   });
 
@@ -7614,7 +7701,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigQueryQuerySpec();
       var od = api.BigQueryQuerySpec.fromJson(o.toJson());
-      checkBigQueryQuerySpec(od);
+      checkBigQueryQuerySpec(od as api.BigQueryQuerySpec);
     });
   });
 
@@ -7622,7 +7709,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBigQueryTableSpec();
       var od = api.BigQueryTableSpec.fromJson(o.toJson());
-      checkBigQueryTableSpec(od);
+      checkBigQueryTableSpec(od as api.BigQueryTableSpec);
     });
   });
 
@@ -7630,7 +7717,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooleanCondition();
       var od = api.BooleanCondition.fromJson(o.toJson());
-      checkBooleanCondition(od);
+      checkBooleanCondition(od as api.BooleanCondition);
     });
   });
 
@@ -7638,7 +7725,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBooleanRule();
       var od = api.BooleanRule.fromJson(o.toJson());
-      checkBooleanRule(od);
+      checkBooleanRule(od as api.BooleanRule);
     });
   });
 
@@ -7646,7 +7733,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBorder();
       var od = api.Border.fromJson(o.toJson());
-      checkBorder(od);
+      checkBorder(od as api.Border);
     });
   });
 
@@ -7654,7 +7741,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBorders();
       var od = api.Borders.fromJson(o.toJson());
-      checkBorders(od);
+      checkBorders(od as api.Borders);
     });
   });
 
@@ -7662,7 +7749,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBubbleChartSpec();
       var od = api.BubbleChartSpec.fromJson(o.toJson());
-      checkBubbleChartSpec(od);
+      checkBubbleChartSpec(od as api.BubbleChartSpec);
     });
   });
 
@@ -7670,7 +7757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCandlestickChartSpec();
       var od = api.CandlestickChartSpec.fromJson(o.toJson());
-      checkCandlestickChartSpec(od);
+      checkCandlestickChartSpec(od as api.CandlestickChartSpec);
     });
   });
 
@@ -7678,7 +7765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCandlestickData();
       var od = api.CandlestickData.fromJson(o.toJson());
-      checkCandlestickData(od);
+      checkCandlestickData(od as api.CandlestickData);
     });
   });
 
@@ -7686,7 +7773,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCandlestickDomain();
       var od = api.CandlestickDomain.fromJson(o.toJson());
-      checkCandlestickDomain(od);
+      checkCandlestickDomain(od as api.CandlestickDomain);
     });
   });
 
@@ -7694,7 +7781,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCandlestickSeries();
       var od = api.CandlestickSeries.fromJson(o.toJson());
-      checkCandlestickSeries(od);
+      checkCandlestickSeries(od as api.CandlestickSeries);
     });
   });
 
@@ -7702,7 +7789,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCellData();
       var od = api.CellData.fromJson(o.toJson());
-      checkCellData(od);
+      checkCellData(od as api.CellData);
     });
   });
 
@@ -7710,7 +7797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCellFormat();
       var od = api.CellFormat.fromJson(o.toJson());
-      checkCellFormat(od);
+      checkCellFormat(od as api.CellFormat);
     });
   });
 
@@ -7718,7 +7805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartAxisViewWindowOptions();
       var od = api.ChartAxisViewWindowOptions.fromJson(o.toJson());
-      checkChartAxisViewWindowOptions(od);
+      checkChartAxisViewWindowOptions(od as api.ChartAxisViewWindowOptions);
     });
   });
 
@@ -7726,7 +7813,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartCustomNumberFormatOptions();
       var od = api.ChartCustomNumberFormatOptions.fromJson(o.toJson());
-      checkChartCustomNumberFormatOptions(od);
+      checkChartCustomNumberFormatOptions(
+          od as api.ChartCustomNumberFormatOptions);
     });
   });
 
@@ -7734,7 +7822,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartData();
       var od = api.ChartData.fromJson(o.toJson());
-      checkChartData(od);
+      checkChartData(od as api.ChartData);
     });
   });
 
@@ -7742,7 +7830,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartDateTimeRule();
       var od = api.ChartDateTimeRule.fromJson(o.toJson());
-      checkChartDateTimeRule(od);
+      checkChartDateTimeRule(od as api.ChartDateTimeRule);
     });
   });
 
@@ -7750,7 +7838,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartGroupRule();
       var od = api.ChartGroupRule.fromJson(o.toJson());
-      checkChartGroupRule(od);
+      checkChartGroupRule(od as api.ChartGroupRule);
     });
   });
 
@@ -7758,7 +7846,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartHistogramRule();
       var od = api.ChartHistogramRule.fromJson(o.toJson());
-      checkChartHistogramRule(od);
+      checkChartHistogramRule(od as api.ChartHistogramRule);
     });
   });
 
@@ -7766,7 +7854,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartSourceRange();
       var od = api.ChartSourceRange.fromJson(o.toJson());
-      checkChartSourceRange(od);
+      checkChartSourceRange(od as api.ChartSourceRange);
     });
   });
 
@@ -7774,7 +7862,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChartSpec();
       var od = api.ChartSpec.fromJson(o.toJson());
-      checkChartSpec(od);
+      checkChartSpec(od as api.ChartSpec);
     });
   });
 
@@ -7782,7 +7870,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClearBasicFilterRequest();
       var od = api.ClearBasicFilterRequest.fromJson(o.toJson());
-      checkClearBasicFilterRequest(od);
+      checkClearBasicFilterRequest(od as api.ClearBasicFilterRequest);
     });
   });
 
@@ -7790,7 +7878,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClearValuesRequest();
       var od = api.ClearValuesRequest.fromJson(o.toJson());
-      checkClearValuesRequest(od);
+      checkClearValuesRequest(od as api.ClearValuesRequest);
     });
   });
 
@@ -7798,7 +7886,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClearValuesResponse();
       var od = api.ClearValuesResponse.fromJson(o.toJson());
-      checkClearValuesResponse(od);
+      checkClearValuesResponse(od as api.ClearValuesResponse);
     });
   });
 
@@ -7806,7 +7894,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColor();
       var od = api.Color.fromJson(o.toJson());
-      checkColor(od);
+      checkColor(od as api.Color);
     });
   });
 
@@ -7814,7 +7902,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColorStyle();
       var od = api.ColorStyle.fromJson(o.toJson());
-      checkColorStyle(od);
+      checkColorStyle(od as api.ColorStyle);
     });
   });
 
@@ -7822,7 +7910,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConditionValue();
       var od = api.ConditionValue.fromJson(o.toJson());
-      checkConditionValue(od);
+      checkConditionValue(od as api.ConditionValue);
     });
   });
 
@@ -7830,7 +7918,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConditionalFormatRule();
       var od = api.ConditionalFormatRule.fromJson(o.toJson());
-      checkConditionalFormatRule(od);
+      checkConditionalFormatRule(od as api.ConditionalFormatRule);
     });
   });
 
@@ -7838,7 +7926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCopyPasteRequest();
       var od = api.CopyPasteRequest.fromJson(o.toJson());
-      checkCopyPasteRequest(od);
+      checkCopyPasteRequest(od as api.CopyPasteRequest);
     });
   });
 
@@ -7846,7 +7934,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCopySheetToAnotherSpreadsheetRequest();
       var od = api.CopySheetToAnotherSpreadsheetRequest.fromJson(o.toJson());
-      checkCopySheetToAnotherSpreadsheetRequest(od);
+      checkCopySheetToAnotherSpreadsheetRequest(
+          od as api.CopySheetToAnotherSpreadsheetRequest);
     });
   });
 
@@ -7854,7 +7943,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateDeveloperMetadataRequest();
       var od = api.CreateDeveloperMetadataRequest.fromJson(o.toJson());
-      checkCreateDeveloperMetadataRequest(od);
+      checkCreateDeveloperMetadataRequest(
+          od as api.CreateDeveloperMetadataRequest);
     });
   });
 
@@ -7862,7 +7952,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateDeveloperMetadataResponse();
       var od = api.CreateDeveloperMetadataResponse.fromJson(o.toJson());
-      checkCreateDeveloperMetadataResponse(od);
+      checkCreateDeveloperMetadataResponse(
+          od as api.CreateDeveloperMetadataResponse);
     });
   });
 
@@ -7870,7 +7961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCutPasteRequest();
       var od = api.CutPasteRequest.fromJson(o.toJson());
-      checkCutPasteRequest(od);
+      checkCutPasteRequest(od as api.CutPasteRequest);
     });
   });
 
@@ -7878,7 +7969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataExecutionStatus();
       var od = api.DataExecutionStatus.fromJson(o.toJson());
-      checkDataExecutionStatus(od);
+      checkDataExecutionStatus(od as api.DataExecutionStatus);
     });
   });
 
@@ -7886,7 +7977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataFilter();
       var od = api.DataFilter.fromJson(o.toJson());
-      checkDataFilter(od);
+      checkDataFilter(od as api.DataFilter);
     });
   });
 
@@ -7894,7 +7985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataFilterValueRange();
       var od = api.DataFilterValueRange.fromJson(o.toJson());
-      checkDataFilterValueRange(od);
+      checkDataFilterValueRange(od as api.DataFilterValueRange);
     });
   });
 
@@ -7902,7 +7993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSource();
       var od = api.DataSource.fromJson(o.toJson());
-      checkDataSource(od);
+      checkDataSource(od as api.DataSource);
     });
   });
 
@@ -7910,7 +8001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceChartProperties();
       var od = api.DataSourceChartProperties.fromJson(o.toJson());
-      checkDataSourceChartProperties(od);
+      checkDataSourceChartProperties(od as api.DataSourceChartProperties);
     });
   });
 
@@ -7918,7 +8009,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceColumn();
       var od = api.DataSourceColumn.fromJson(o.toJson());
-      checkDataSourceColumn(od);
+      checkDataSourceColumn(od as api.DataSourceColumn);
     });
   });
 
@@ -7926,7 +8017,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceColumnReference();
       var od = api.DataSourceColumnReference.fromJson(o.toJson());
-      checkDataSourceColumnReference(od);
+      checkDataSourceColumnReference(od as api.DataSourceColumnReference);
     });
   });
 
@@ -7934,7 +8025,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceFormula();
       var od = api.DataSourceFormula.fromJson(o.toJson());
-      checkDataSourceFormula(od);
+      checkDataSourceFormula(od as api.DataSourceFormula);
     });
   });
 
@@ -7942,7 +8033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceObjectReference();
       var od = api.DataSourceObjectReference.fromJson(o.toJson());
-      checkDataSourceObjectReference(od);
+      checkDataSourceObjectReference(od as api.DataSourceObjectReference);
     });
   });
 
@@ -7950,7 +8041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceObjectReferences();
       var od = api.DataSourceObjectReferences.fromJson(o.toJson());
-      checkDataSourceObjectReferences(od);
+      checkDataSourceObjectReferences(od as api.DataSourceObjectReferences);
     });
   });
 
@@ -7958,7 +8049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceParameter();
       var od = api.DataSourceParameter.fromJson(o.toJson());
-      checkDataSourceParameter(od);
+      checkDataSourceParameter(od as api.DataSourceParameter);
     });
   });
 
@@ -7966,7 +8057,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceRefreshDailySchedule();
       var od = api.DataSourceRefreshDailySchedule.fromJson(o.toJson());
-      checkDataSourceRefreshDailySchedule(od);
+      checkDataSourceRefreshDailySchedule(
+          od as api.DataSourceRefreshDailySchedule);
     });
   });
 
@@ -7974,7 +8066,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceRefreshMonthlySchedule();
       var od = api.DataSourceRefreshMonthlySchedule.fromJson(o.toJson());
-      checkDataSourceRefreshMonthlySchedule(od);
+      checkDataSourceRefreshMonthlySchedule(
+          od as api.DataSourceRefreshMonthlySchedule);
     });
   });
 
@@ -7982,7 +8075,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceRefreshSchedule();
       var od = api.DataSourceRefreshSchedule.fromJson(o.toJson());
-      checkDataSourceRefreshSchedule(od);
+      checkDataSourceRefreshSchedule(od as api.DataSourceRefreshSchedule);
     });
   });
 
@@ -7990,7 +8083,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceRefreshWeeklySchedule();
       var od = api.DataSourceRefreshWeeklySchedule.fromJson(o.toJson());
-      checkDataSourceRefreshWeeklySchedule(od);
+      checkDataSourceRefreshWeeklySchedule(
+          od as api.DataSourceRefreshWeeklySchedule);
     });
   });
 
@@ -7998,7 +8092,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceSheetDimensionRange();
       var od = api.DataSourceSheetDimensionRange.fromJson(o.toJson());
-      checkDataSourceSheetDimensionRange(od);
+      checkDataSourceSheetDimensionRange(
+          od as api.DataSourceSheetDimensionRange);
     });
   });
 
@@ -8006,7 +8101,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceSheetProperties();
       var od = api.DataSourceSheetProperties.fromJson(o.toJson());
-      checkDataSourceSheetProperties(od);
+      checkDataSourceSheetProperties(od as api.DataSourceSheetProperties);
     });
   });
 
@@ -8014,7 +8109,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceSpec();
       var od = api.DataSourceSpec.fromJson(o.toJson());
-      checkDataSourceSpec(od);
+      checkDataSourceSpec(od as api.DataSourceSpec);
     });
   });
 
@@ -8022,7 +8117,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataSourceTable();
       var od = api.DataSourceTable.fromJson(o.toJson());
-      checkDataSourceTable(od);
+      checkDataSourceTable(od as api.DataSourceTable);
     });
   });
 
@@ -8030,7 +8125,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDataValidationRule();
       var od = api.DataValidationRule.fromJson(o.toJson());
-      checkDataValidationRule(od);
+      checkDataValidationRule(od as api.DataValidationRule);
     });
   });
 
@@ -8038,7 +8133,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDateTimeRule();
       var od = api.DateTimeRule.fromJson(o.toJson());
-      checkDateTimeRule(od);
+      checkDateTimeRule(od as api.DateTimeRule);
     });
   });
 
@@ -8046,7 +8141,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteBandingRequest();
       var od = api.DeleteBandingRequest.fromJson(o.toJson());
-      checkDeleteBandingRequest(od);
+      checkDeleteBandingRequest(od as api.DeleteBandingRequest);
     });
   });
 
@@ -8054,7 +8149,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteConditionalFormatRuleRequest();
       var od = api.DeleteConditionalFormatRuleRequest.fromJson(o.toJson());
-      checkDeleteConditionalFormatRuleRequest(od);
+      checkDeleteConditionalFormatRuleRequest(
+          od as api.DeleteConditionalFormatRuleRequest);
     });
   });
 
@@ -8062,7 +8158,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteConditionalFormatRuleResponse();
       var od = api.DeleteConditionalFormatRuleResponse.fromJson(o.toJson());
-      checkDeleteConditionalFormatRuleResponse(od);
+      checkDeleteConditionalFormatRuleResponse(
+          od as api.DeleteConditionalFormatRuleResponse);
     });
   });
 
@@ -8070,7 +8167,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDataSourceRequest();
       var od = api.DeleteDataSourceRequest.fromJson(o.toJson());
-      checkDeleteDataSourceRequest(od);
+      checkDeleteDataSourceRequest(od as api.DeleteDataSourceRequest);
     });
   });
 
@@ -8078,7 +8175,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDeveloperMetadataRequest();
       var od = api.DeleteDeveloperMetadataRequest.fromJson(o.toJson());
-      checkDeleteDeveloperMetadataRequest(od);
+      checkDeleteDeveloperMetadataRequest(
+          od as api.DeleteDeveloperMetadataRequest);
     });
   });
 
@@ -8086,7 +8184,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDeveloperMetadataResponse();
       var od = api.DeleteDeveloperMetadataResponse.fromJson(o.toJson());
-      checkDeleteDeveloperMetadataResponse(od);
+      checkDeleteDeveloperMetadataResponse(
+          od as api.DeleteDeveloperMetadataResponse);
     });
   });
 
@@ -8094,7 +8193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDimensionGroupRequest();
       var od = api.DeleteDimensionGroupRequest.fromJson(o.toJson());
-      checkDeleteDimensionGroupRequest(od);
+      checkDeleteDimensionGroupRequest(od as api.DeleteDimensionGroupRequest);
     });
   });
 
@@ -8102,7 +8201,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDimensionGroupResponse();
       var od = api.DeleteDimensionGroupResponse.fromJson(o.toJson());
-      checkDeleteDimensionGroupResponse(od);
+      checkDeleteDimensionGroupResponse(od as api.DeleteDimensionGroupResponse);
     });
   });
 
@@ -8110,7 +8209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDimensionRequest();
       var od = api.DeleteDimensionRequest.fromJson(o.toJson());
-      checkDeleteDimensionRequest(od);
+      checkDeleteDimensionRequest(od as api.DeleteDimensionRequest);
     });
   });
 
@@ -8118,7 +8217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDuplicatesRequest();
       var od = api.DeleteDuplicatesRequest.fromJson(o.toJson());
-      checkDeleteDuplicatesRequest(od);
+      checkDeleteDuplicatesRequest(od as api.DeleteDuplicatesRequest);
     });
   });
 
@@ -8126,7 +8225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteDuplicatesResponse();
       var od = api.DeleteDuplicatesResponse.fromJson(o.toJson());
-      checkDeleteDuplicatesResponse(od);
+      checkDeleteDuplicatesResponse(od as api.DeleteDuplicatesResponse);
     });
   });
 
@@ -8134,7 +8233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteEmbeddedObjectRequest();
       var od = api.DeleteEmbeddedObjectRequest.fromJson(o.toJson());
-      checkDeleteEmbeddedObjectRequest(od);
+      checkDeleteEmbeddedObjectRequest(od as api.DeleteEmbeddedObjectRequest);
     });
   });
 
@@ -8142,7 +8241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteFilterViewRequest();
       var od = api.DeleteFilterViewRequest.fromJson(o.toJson());
-      checkDeleteFilterViewRequest(od);
+      checkDeleteFilterViewRequest(od as api.DeleteFilterViewRequest);
     });
   });
 
@@ -8150,7 +8249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteNamedRangeRequest();
       var od = api.DeleteNamedRangeRequest.fromJson(o.toJson());
-      checkDeleteNamedRangeRequest(od);
+      checkDeleteNamedRangeRequest(od as api.DeleteNamedRangeRequest);
     });
   });
 
@@ -8158,7 +8257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteProtectedRangeRequest();
       var od = api.DeleteProtectedRangeRequest.fromJson(o.toJson());
-      checkDeleteProtectedRangeRequest(od);
+      checkDeleteProtectedRangeRequest(od as api.DeleteProtectedRangeRequest);
     });
   });
 
@@ -8166,7 +8265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteRangeRequest();
       var od = api.DeleteRangeRequest.fromJson(o.toJson());
-      checkDeleteRangeRequest(od);
+      checkDeleteRangeRequest(od as api.DeleteRangeRequest);
     });
   });
 
@@ -8174,7 +8273,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteSheetRequest();
       var od = api.DeleteSheetRequest.fromJson(o.toJson());
-      checkDeleteSheetRequest(od);
+      checkDeleteSheetRequest(od as api.DeleteSheetRequest);
     });
   });
 
@@ -8182,7 +8281,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeveloperMetadata();
       var od = api.DeveloperMetadata.fromJson(o.toJson());
-      checkDeveloperMetadata(od);
+      checkDeveloperMetadata(od as api.DeveloperMetadata);
     });
   });
 
@@ -8190,7 +8289,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeveloperMetadataLocation();
       var od = api.DeveloperMetadataLocation.fromJson(o.toJson());
-      checkDeveloperMetadataLocation(od);
+      checkDeveloperMetadataLocation(od as api.DeveloperMetadataLocation);
     });
   });
 
@@ -8198,7 +8297,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeveloperMetadataLookup();
       var od = api.DeveloperMetadataLookup.fromJson(o.toJson());
-      checkDeveloperMetadataLookup(od);
+      checkDeveloperMetadataLookup(od as api.DeveloperMetadataLookup);
     });
   });
 
@@ -8206,7 +8305,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionGroup();
       var od = api.DimensionGroup.fromJson(o.toJson());
-      checkDimensionGroup(od);
+      checkDimensionGroup(od as api.DimensionGroup);
     });
   });
 
@@ -8214,7 +8313,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionProperties();
       var od = api.DimensionProperties.fromJson(o.toJson());
-      checkDimensionProperties(od);
+      checkDimensionProperties(od as api.DimensionProperties);
     });
   });
 
@@ -8222,7 +8321,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimensionRange();
       var od = api.DimensionRange.fromJson(o.toJson());
-      checkDimensionRange(od);
+      checkDimensionRange(od as api.DimensionRange);
     });
   });
 
@@ -8230,7 +8329,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDuplicateFilterViewRequest();
       var od = api.DuplicateFilterViewRequest.fromJson(o.toJson());
-      checkDuplicateFilterViewRequest(od);
+      checkDuplicateFilterViewRequest(od as api.DuplicateFilterViewRequest);
     });
   });
 
@@ -8238,7 +8337,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDuplicateFilterViewResponse();
       var od = api.DuplicateFilterViewResponse.fromJson(o.toJson());
-      checkDuplicateFilterViewResponse(od);
+      checkDuplicateFilterViewResponse(od as api.DuplicateFilterViewResponse);
     });
   });
 
@@ -8246,7 +8345,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDuplicateSheetRequest();
       var od = api.DuplicateSheetRequest.fromJson(o.toJson());
-      checkDuplicateSheetRequest(od);
+      checkDuplicateSheetRequest(od as api.DuplicateSheetRequest);
     });
   });
 
@@ -8254,7 +8353,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDuplicateSheetResponse();
       var od = api.DuplicateSheetResponse.fromJson(o.toJson());
-      checkDuplicateSheetResponse(od);
+      checkDuplicateSheetResponse(od as api.DuplicateSheetResponse);
     });
   });
 
@@ -8262,7 +8361,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEditors();
       var od = api.Editors.fromJson(o.toJson());
-      checkEditors(od);
+      checkEditors(od as api.Editors);
     });
   });
 
@@ -8270,7 +8369,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmbeddedChart();
       var od = api.EmbeddedChart.fromJson(o.toJson());
-      checkEmbeddedChart(od);
+      checkEmbeddedChart(od as api.EmbeddedChart);
     });
   });
 
@@ -8278,7 +8377,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmbeddedObjectPosition();
       var od = api.EmbeddedObjectPosition.fromJson(o.toJson());
-      checkEmbeddedObjectPosition(od);
+      checkEmbeddedObjectPosition(od as api.EmbeddedObjectPosition);
     });
   });
 
@@ -8286,7 +8385,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorValue();
       var od = api.ErrorValue.fromJson(o.toJson());
-      checkErrorValue(od);
+      checkErrorValue(od as api.ErrorValue);
     });
   });
 
@@ -8294,7 +8393,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExtendedValue();
       var od = api.ExtendedValue.fromJson(o.toJson());
-      checkExtendedValue(od);
+      checkExtendedValue(od as api.ExtendedValue);
     });
   });
 
@@ -8302,7 +8401,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterCriteria();
       var od = api.FilterCriteria.fromJson(o.toJson());
-      checkFilterCriteria(od);
+      checkFilterCriteria(od as api.FilterCriteria);
     });
   });
 
@@ -8310,7 +8409,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterSpec();
       var od = api.FilterSpec.fromJson(o.toJson());
-      checkFilterSpec(od);
+      checkFilterSpec(od as api.FilterSpec);
     });
   });
 
@@ -8318,7 +8417,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFilterView();
       var od = api.FilterView.fromJson(o.toJson());
-      checkFilterView(od);
+      checkFilterView(od as api.FilterView);
     });
   });
 
@@ -8326,7 +8425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindReplaceRequest();
       var od = api.FindReplaceRequest.fromJson(o.toJson());
-      checkFindReplaceRequest(od);
+      checkFindReplaceRequest(od as api.FindReplaceRequest);
     });
   });
 
@@ -8334,7 +8433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindReplaceResponse();
       var od = api.FindReplaceResponse.fromJson(o.toJson());
-      checkFindReplaceResponse(od);
+      checkFindReplaceResponse(od as api.FindReplaceResponse);
     });
   });
 
@@ -8342,7 +8441,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetSpreadsheetByDataFilterRequest();
       var od = api.GetSpreadsheetByDataFilterRequest.fromJson(o.toJson());
-      checkGetSpreadsheetByDataFilterRequest(od);
+      checkGetSpreadsheetByDataFilterRequest(
+          od as api.GetSpreadsheetByDataFilterRequest);
     });
   });
 
@@ -8350,7 +8450,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGradientRule();
       var od = api.GradientRule.fromJson(o.toJson());
-      checkGradientRule(od);
+      checkGradientRule(od as api.GradientRule);
     });
   });
 
@@ -8358,7 +8458,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGridCoordinate();
       var od = api.GridCoordinate.fromJson(o.toJson());
-      checkGridCoordinate(od);
+      checkGridCoordinate(od as api.GridCoordinate);
     });
   });
 
@@ -8366,7 +8466,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGridData();
       var od = api.GridData.fromJson(o.toJson());
-      checkGridData(od);
+      checkGridData(od as api.GridData);
     });
   });
 
@@ -8374,7 +8474,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGridProperties();
       var od = api.GridProperties.fromJson(o.toJson());
-      checkGridProperties(od);
+      checkGridProperties(od as api.GridProperties);
     });
   });
 
@@ -8382,7 +8482,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGridRange();
       var od = api.GridRange.fromJson(o.toJson());
-      checkGridRange(od);
+      checkGridRange(od as api.GridRange);
     });
   });
 
@@ -8390,7 +8490,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramChartSpec();
       var od = api.HistogramChartSpec.fromJson(o.toJson());
-      checkHistogramChartSpec(od);
+      checkHistogramChartSpec(od as api.HistogramChartSpec);
     });
   });
 
@@ -8398,7 +8498,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramRule();
       var od = api.HistogramRule.fromJson(o.toJson());
-      checkHistogramRule(od);
+      checkHistogramRule(od as api.HistogramRule);
     });
   });
 
@@ -8406,7 +8506,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHistogramSeries();
       var od = api.HistogramSeries.fromJson(o.toJson());
-      checkHistogramSeries(od);
+      checkHistogramSeries(od as api.HistogramSeries);
     });
   });
 
@@ -8414,7 +8514,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertDimensionRequest();
       var od = api.InsertDimensionRequest.fromJson(o.toJson());
-      checkInsertDimensionRequest(od);
+      checkInsertDimensionRequest(od as api.InsertDimensionRequest);
     });
   });
 
@@ -8422,7 +8522,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertRangeRequest();
       var od = api.InsertRangeRequest.fromJson(o.toJson());
-      checkInsertRangeRequest(od);
+      checkInsertRangeRequest(od as api.InsertRangeRequest);
     });
   });
 
@@ -8430,7 +8530,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterpolationPoint();
       var od = api.InterpolationPoint.fromJson(o.toJson());
-      checkInterpolationPoint(od);
+      checkInterpolationPoint(od as api.InterpolationPoint);
     });
   });
 
@@ -8438,7 +8538,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInterval();
       var od = api.Interval.fromJson(o.toJson());
-      checkInterval(od);
+      checkInterval(od as api.Interval);
     });
   });
 
@@ -8446,7 +8546,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIterativeCalculationSettings();
       var od = api.IterativeCalculationSettings.fromJson(o.toJson());
-      checkIterativeCalculationSettings(od);
+      checkIterativeCalculationSettings(od as api.IterativeCalculationSettings);
     });
   });
 
@@ -8454,7 +8554,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyValueFormat();
       var od = api.KeyValueFormat.fromJson(o.toJson());
-      checkKeyValueFormat(od);
+      checkKeyValueFormat(od as api.KeyValueFormat);
     });
   });
 
@@ -8462,7 +8562,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLineStyle();
       var od = api.LineStyle.fromJson(o.toJson());
-      checkLineStyle(od);
+      checkLineStyle(od as api.LineStyle);
     });
   });
 
@@ -8470,7 +8570,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManualRule();
       var od = api.ManualRule.fromJson(o.toJson());
-      checkManualRule(od);
+      checkManualRule(od as api.ManualRule);
     });
   });
 
@@ -8478,7 +8578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManualRuleGroup();
       var od = api.ManualRuleGroup.fromJson(o.toJson());
-      checkManualRuleGroup(od);
+      checkManualRuleGroup(od as api.ManualRuleGroup);
     });
   });
 
@@ -8486,7 +8586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMatchedDeveloperMetadata();
       var od = api.MatchedDeveloperMetadata.fromJson(o.toJson());
-      checkMatchedDeveloperMetadata(od);
+      checkMatchedDeveloperMetadata(od as api.MatchedDeveloperMetadata);
     });
   });
 
@@ -8494,7 +8594,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMatchedValueRange();
       var od = api.MatchedValueRange.fromJson(o.toJson());
-      checkMatchedValueRange(od);
+      checkMatchedValueRange(od as api.MatchedValueRange);
     });
   });
 
@@ -8502,7 +8602,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMergeCellsRequest();
       var od = api.MergeCellsRequest.fromJson(o.toJson());
-      checkMergeCellsRequest(od);
+      checkMergeCellsRequest(od as api.MergeCellsRequest);
     });
   });
 
@@ -8510,7 +8610,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMoveDimensionRequest();
       var od = api.MoveDimensionRequest.fromJson(o.toJson());
-      checkMoveDimensionRequest(od);
+      checkMoveDimensionRequest(od as api.MoveDimensionRequest);
     });
   });
 
@@ -8518,7 +8618,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNamedRange();
       var od = api.NamedRange.fromJson(o.toJson());
-      checkNamedRange(od);
+      checkNamedRange(od as api.NamedRange);
     });
   });
 
@@ -8526,7 +8626,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNumberFormat();
       var od = api.NumberFormat.fromJson(o.toJson());
-      checkNumberFormat(od);
+      checkNumberFormat(od as api.NumberFormat);
     });
   });
 
@@ -8534,7 +8634,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrgChartSpec();
       var od = api.OrgChartSpec.fromJson(o.toJson());
-      checkOrgChartSpec(od);
+      checkOrgChartSpec(od as api.OrgChartSpec);
     });
   });
 
@@ -8542,7 +8642,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOverlayPosition();
       var od = api.OverlayPosition.fromJson(o.toJson());
-      checkOverlayPosition(od);
+      checkOverlayPosition(od as api.OverlayPosition);
     });
   });
 
@@ -8550,7 +8650,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPadding();
       var od = api.Padding.fromJson(o.toJson());
-      checkPadding(od);
+      checkPadding(od as api.Padding);
     });
   });
 
@@ -8558,7 +8658,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPasteDataRequest();
       var od = api.PasteDataRequest.fromJson(o.toJson());
-      checkPasteDataRequest(od);
+      checkPasteDataRequest(od as api.PasteDataRequest);
     });
   });
 
@@ -8566,7 +8666,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPieChartSpec();
       var od = api.PieChartSpec.fromJson(o.toJson());
-      checkPieChartSpec(od);
+      checkPieChartSpec(od as api.PieChartSpec);
     });
   });
 
@@ -8574,7 +8674,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotFilterCriteria();
       var od = api.PivotFilterCriteria.fromJson(o.toJson());
-      checkPivotFilterCriteria(od);
+      checkPivotFilterCriteria(od as api.PivotFilterCriteria);
     });
   });
 
@@ -8582,7 +8682,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotFilterSpec();
       var od = api.PivotFilterSpec.fromJson(o.toJson());
-      checkPivotFilterSpec(od);
+      checkPivotFilterSpec(od as api.PivotFilterSpec);
     });
   });
 
@@ -8590,7 +8690,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotGroup();
       var od = api.PivotGroup.fromJson(o.toJson());
-      checkPivotGroup(od);
+      checkPivotGroup(od as api.PivotGroup);
     });
   });
 
@@ -8598,7 +8698,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotGroupLimit();
       var od = api.PivotGroupLimit.fromJson(o.toJson());
-      checkPivotGroupLimit(od);
+      checkPivotGroupLimit(od as api.PivotGroupLimit);
     });
   });
 
@@ -8606,7 +8706,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotGroupRule();
       var od = api.PivotGroupRule.fromJson(o.toJson());
-      checkPivotGroupRule(od);
+      checkPivotGroupRule(od as api.PivotGroupRule);
     });
   });
 
@@ -8614,7 +8714,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotGroupSortValueBucket();
       var od = api.PivotGroupSortValueBucket.fromJson(o.toJson());
-      checkPivotGroupSortValueBucket(od);
+      checkPivotGroupSortValueBucket(od as api.PivotGroupSortValueBucket);
     });
   });
 
@@ -8622,7 +8722,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotGroupValueMetadata();
       var od = api.PivotGroupValueMetadata.fromJson(o.toJson());
-      checkPivotGroupValueMetadata(od);
+      checkPivotGroupValueMetadata(od as api.PivotGroupValueMetadata);
     });
   });
 
@@ -8630,7 +8730,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotTable();
       var od = api.PivotTable.fromJson(o.toJson());
-      checkPivotTable(od);
+      checkPivotTable(od as api.PivotTable);
     });
   });
 
@@ -8638,7 +8738,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPivotValue();
       var od = api.PivotValue.fromJson(o.toJson());
-      checkPivotValue(od);
+      checkPivotValue(od as api.PivotValue);
     });
   });
 
@@ -8646,7 +8746,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProtectedRange();
       var od = api.ProtectedRange.fromJson(o.toJson());
-      checkProtectedRange(od);
+      checkProtectedRange(od as api.ProtectedRange);
     });
   });
 
@@ -8654,7 +8754,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRandomizeRangeRequest();
       var od = api.RandomizeRangeRequest.fromJson(o.toJson());
-      checkRandomizeRangeRequest(od);
+      checkRandomizeRangeRequest(od as api.RandomizeRangeRequest);
     });
   });
 
@@ -8662,7 +8762,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRefreshDataSourceObjectExecutionStatus();
       var od = api.RefreshDataSourceObjectExecutionStatus.fromJson(o.toJson());
-      checkRefreshDataSourceObjectExecutionStatus(od);
+      checkRefreshDataSourceObjectExecutionStatus(
+          od as api.RefreshDataSourceObjectExecutionStatus);
     });
   });
 
@@ -8670,7 +8771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRefreshDataSourceRequest();
       var od = api.RefreshDataSourceRequest.fromJson(o.toJson());
-      checkRefreshDataSourceRequest(od);
+      checkRefreshDataSourceRequest(od as api.RefreshDataSourceRequest);
     });
   });
 
@@ -8678,7 +8779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRefreshDataSourceResponse();
       var od = api.RefreshDataSourceResponse.fromJson(o.toJson());
-      checkRefreshDataSourceResponse(od);
+      checkRefreshDataSourceResponse(od as api.RefreshDataSourceResponse);
     });
   });
 
@@ -8686,7 +8787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepeatCellRequest();
       var od = api.RepeatCellRequest.fromJson(o.toJson());
-      checkRepeatCellRequest(od);
+      checkRepeatCellRequest(od as api.RepeatCellRequest);
     });
   });
 
@@ -8694,7 +8795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequest();
       var od = api.Request.fromJson(o.toJson());
-      checkRequest(od);
+      checkRequest(od as api.Request);
     });
   });
 
@@ -8702,7 +8803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResponse();
       var od = api.Response.fromJson(o.toJson());
-      checkResponse(od);
+      checkResponse(od as api.Response);
     });
   });
 
@@ -8710,7 +8811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRowData();
       var od = api.RowData.fromJson(o.toJson());
-      checkRowData(od);
+      checkRowData(od as api.RowData);
     });
   });
 
@@ -8718,7 +8819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScorecardChartSpec();
       var od = api.ScorecardChartSpec.fromJson(o.toJson());
-      checkScorecardChartSpec(od);
+      checkScorecardChartSpec(od as api.ScorecardChartSpec);
     });
   });
 
@@ -8726,7 +8827,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchDeveloperMetadataRequest();
       var od = api.SearchDeveloperMetadataRequest.fromJson(o.toJson());
-      checkSearchDeveloperMetadataRequest(od);
+      checkSearchDeveloperMetadataRequest(
+          od as api.SearchDeveloperMetadataRequest);
     });
   });
 
@@ -8734,7 +8836,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchDeveloperMetadataResponse();
       var od = api.SearchDeveloperMetadataResponse.fromJson(o.toJson());
-      checkSearchDeveloperMetadataResponse(od);
+      checkSearchDeveloperMetadataResponse(
+          od as api.SearchDeveloperMetadataResponse);
     });
   });
 
@@ -8742,7 +8845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetBasicFilterRequest();
       var od = api.SetBasicFilterRequest.fromJson(o.toJson());
-      checkSetBasicFilterRequest(od);
+      checkSetBasicFilterRequest(od as api.SetBasicFilterRequest);
     });
   });
 
@@ -8750,7 +8853,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetDataValidationRequest();
       var od = api.SetDataValidationRequest.fromJson(o.toJson());
-      checkSetDataValidationRequest(od);
+      checkSetDataValidationRequest(od as api.SetDataValidationRequest);
     });
   });
 
@@ -8758,7 +8861,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSheet();
       var od = api.Sheet.fromJson(o.toJson());
-      checkSheet(od);
+      checkSheet(od as api.Sheet);
     });
   });
 
@@ -8766,7 +8869,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSheetProperties();
       var od = api.SheetProperties.fromJson(o.toJson());
-      checkSheetProperties(od);
+      checkSheetProperties(od as api.SheetProperties);
     });
   });
 
@@ -8774,7 +8877,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSlicer();
       var od = api.Slicer.fromJson(o.toJson());
-      checkSlicer(od);
+      checkSlicer(od as api.Slicer);
     });
   });
 
@@ -8782,7 +8885,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSlicerSpec();
       var od = api.SlicerSpec.fromJson(o.toJson());
-      checkSlicerSpec(od);
+      checkSlicerSpec(od as api.SlicerSpec);
     });
   });
 
@@ -8790,7 +8893,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSortRangeRequest();
       var od = api.SortRangeRequest.fromJson(o.toJson());
-      checkSortRangeRequest(od);
+      checkSortRangeRequest(od as api.SortRangeRequest);
     });
   });
 
@@ -8798,7 +8901,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSortSpec();
       var od = api.SortSpec.fromJson(o.toJson());
-      checkSortSpec(od);
+      checkSortSpec(od as api.SortSpec);
     });
   });
 
@@ -8806,7 +8909,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSourceAndDestination();
       var od = api.SourceAndDestination.fromJson(o.toJson());
-      checkSourceAndDestination(od);
+      checkSourceAndDestination(od as api.SourceAndDestination);
     });
   });
 
@@ -8814,7 +8917,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpreadsheet();
       var od = api.Spreadsheet.fromJson(o.toJson());
-      checkSpreadsheet(od);
+      checkSpreadsheet(od as api.Spreadsheet);
     });
   });
 
@@ -8822,7 +8925,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpreadsheetProperties();
       var od = api.SpreadsheetProperties.fromJson(o.toJson());
-      checkSpreadsheetProperties(od);
+      checkSpreadsheetProperties(od as api.SpreadsheetProperties);
     });
   });
 
@@ -8830,7 +8933,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpreadsheetTheme();
       var od = api.SpreadsheetTheme.fromJson(o.toJson());
-      checkSpreadsheetTheme(od);
+      checkSpreadsheetTheme(od as api.SpreadsheetTheme);
     });
   });
 
@@ -8838,7 +8941,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextFormat();
       var od = api.TextFormat.fromJson(o.toJson());
-      checkTextFormat(od);
+      checkTextFormat(od as api.TextFormat);
     });
   });
 
@@ -8846,7 +8949,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextFormatRun();
       var od = api.TextFormatRun.fromJson(o.toJson());
-      checkTextFormatRun(od);
+      checkTextFormatRun(od as api.TextFormatRun);
     });
   });
 
@@ -8854,7 +8957,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextPosition();
       var od = api.TextPosition.fromJson(o.toJson());
-      checkTextPosition(od);
+      checkTextPosition(od as api.TextPosition);
     });
   });
 
@@ -8862,7 +8965,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextRotation();
       var od = api.TextRotation.fromJson(o.toJson());
-      checkTextRotation(od);
+      checkTextRotation(od as api.TextRotation);
     });
   });
 
@@ -8870,7 +8973,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextToColumnsRequest();
       var od = api.TextToColumnsRequest.fromJson(o.toJson());
-      checkTextToColumnsRequest(od);
+      checkTextToColumnsRequest(od as api.TextToColumnsRequest);
     });
   });
 
@@ -8878,7 +8981,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThemeColorPair();
       var od = api.ThemeColorPair.fromJson(o.toJson());
-      checkThemeColorPair(od);
+      checkThemeColorPair(od as api.ThemeColorPair);
     });
   });
 
@@ -8886,7 +8989,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeOfDay();
       var od = api.TimeOfDay.fromJson(o.toJson());
-      checkTimeOfDay(od);
+      checkTimeOfDay(od as api.TimeOfDay);
     });
   });
 
@@ -8894,7 +8997,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTreemapChartColorScale();
       var od = api.TreemapChartColorScale.fromJson(o.toJson());
-      checkTreemapChartColorScale(od);
+      checkTreemapChartColorScale(od as api.TreemapChartColorScale);
     });
   });
 
@@ -8902,7 +9005,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTreemapChartSpec();
       var od = api.TreemapChartSpec.fromJson(o.toJson());
-      checkTreemapChartSpec(od);
+      checkTreemapChartSpec(od as api.TreemapChartSpec);
     });
   });
 
@@ -8910,7 +9013,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrimWhitespaceRequest();
       var od = api.TrimWhitespaceRequest.fromJson(o.toJson());
-      checkTrimWhitespaceRequest(od);
+      checkTrimWhitespaceRequest(od as api.TrimWhitespaceRequest);
     });
   });
 
@@ -8918,7 +9021,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrimWhitespaceResponse();
       var od = api.TrimWhitespaceResponse.fromJson(o.toJson());
-      checkTrimWhitespaceResponse(od);
+      checkTrimWhitespaceResponse(od as api.TrimWhitespaceResponse);
     });
   });
 
@@ -8926,7 +9029,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnmergeCellsRequest();
       var od = api.UnmergeCellsRequest.fromJson(o.toJson());
-      checkUnmergeCellsRequest(od);
+      checkUnmergeCellsRequest(od as api.UnmergeCellsRequest);
     });
   });
 
@@ -8934,7 +9037,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateBandingRequest();
       var od = api.UpdateBandingRequest.fromJson(o.toJson());
-      checkUpdateBandingRequest(od);
+      checkUpdateBandingRequest(od as api.UpdateBandingRequest);
     });
   });
 
@@ -8942,7 +9045,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateBordersRequest();
       var od = api.UpdateBordersRequest.fromJson(o.toJson());
-      checkUpdateBordersRequest(od);
+      checkUpdateBordersRequest(od as api.UpdateBordersRequest);
     });
   });
 
@@ -8950,7 +9053,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateCellsRequest();
       var od = api.UpdateCellsRequest.fromJson(o.toJson());
-      checkUpdateCellsRequest(od);
+      checkUpdateCellsRequest(od as api.UpdateCellsRequest);
     });
   });
 
@@ -8958,7 +9061,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateChartSpecRequest();
       var od = api.UpdateChartSpecRequest.fromJson(o.toJson());
-      checkUpdateChartSpecRequest(od);
+      checkUpdateChartSpecRequest(od as api.UpdateChartSpecRequest);
     });
   });
 
@@ -8966,7 +9069,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateConditionalFormatRuleRequest();
       var od = api.UpdateConditionalFormatRuleRequest.fromJson(o.toJson());
-      checkUpdateConditionalFormatRuleRequest(od);
+      checkUpdateConditionalFormatRuleRequest(
+          od as api.UpdateConditionalFormatRuleRequest);
     });
   });
 
@@ -8974,7 +9078,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateConditionalFormatRuleResponse();
       var od = api.UpdateConditionalFormatRuleResponse.fromJson(o.toJson());
-      checkUpdateConditionalFormatRuleResponse(od);
+      checkUpdateConditionalFormatRuleResponse(
+          od as api.UpdateConditionalFormatRuleResponse);
     });
   });
 
@@ -8982,7 +9087,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDataSourceRequest();
       var od = api.UpdateDataSourceRequest.fromJson(o.toJson());
-      checkUpdateDataSourceRequest(od);
+      checkUpdateDataSourceRequest(od as api.UpdateDataSourceRequest);
     });
   });
 
@@ -8990,7 +9095,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDataSourceResponse();
       var od = api.UpdateDataSourceResponse.fromJson(o.toJson());
-      checkUpdateDataSourceResponse(od);
+      checkUpdateDataSourceResponse(od as api.UpdateDataSourceResponse);
     });
   });
 
@@ -8998,7 +9103,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDeveloperMetadataRequest();
       var od = api.UpdateDeveloperMetadataRequest.fromJson(o.toJson());
-      checkUpdateDeveloperMetadataRequest(od);
+      checkUpdateDeveloperMetadataRequest(
+          od as api.UpdateDeveloperMetadataRequest);
     });
   });
 
@@ -9006,7 +9112,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDeveloperMetadataResponse();
       var od = api.UpdateDeveloperMetadataResponse.fromJson(o.toJson());
-      checkUpdateDeveloperMetadataResponse(od);
+      checkUpdateDeveloperMetadataResponse(
+          od as api.UpdateDeveloperMetadataResponse);
     });
   });
 
@@ -9014,7 +9121,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDimensionGroupRequest();
       var od = api.UpdateDimensionGroupRequest.fromJson(o.toJson());
-      checkUpdateDimensionGroupRequest(od);
+      checkUpdateDimensionGroupRequest(od as api.UpdateDimensionGroupRequest);
     });
   });
 
@@ -9022,7 +9129,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDimensionPropertiesRequest();
       var od = api.UpdateDimensionPropertiesRequest.fromJson(o.toJson());
-      checkUpdateDimensionPropertiesRequest(od);
+      checkUpdateDimensionPropertiesRequest(
+          od as api.UpdateDimensionPropertiesRequest);
     });
   });
 
@@ -9030,7 +9138,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateEmbeddedObjectPositionRequest();
       var od = api.UpdateEmbeddedObjectPositionRequest.fromJson(o.toJson());
-      checkUpdateEmbeddedObjectPositionRequest(od);
+      checkUpdateEmbeddedObjectPositionRequest(
+          od as api.UpdateEmbeddedObjectPositionRequest);
     });
   });
 
@@ -9038,7 +9147,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateEmbeddedObjectPositionResponse();
       var od = api.UpdateEmbeddedObjectPositionResponse.fromJson(o.toJson());
-      checkUpdateEmbeddedObjectPositionResponse(od);
+      checkUpdateEmbeddedObjectPositionResponse(
+          od as api.UpdateEmbeddedObjectPositionResponse);
     });
   });
 
@@ -9046,7 +9156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateFilterViewRequest();
       var od = api.UpdateFilterViewRequest.fromJson(o.toJson());
-      checkUpdateFilterViewRequest(od);
+      checkUpdateFilterViewRequest(od as api.UpdateFilterViewRequest);
     });
   });
 
@@ -9054,7 +9164,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateNamedRangeRequest();
       var od = api.UpdateNamedRangeRequest.fromJson(o.toJson());
-      checkUpdateNamedRangeRequest(od);
+      checkUpdateNamedRangeRequest(od as api.UpdateNamedRangeRequest);
     });
   });
 
@@ -9062,7 +9172,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateProtectedRangeRequest();
       var od = api.UpdateProtectedRangeRequest.fromJson(o.toJson());
-      checkUpdateProtectedRangeRequest(od);
+      checkUpdateProtectedRangeRequest(od as api.UpdateProtectedRangeRequest);
     });
   });
 
@@ -9070,7 +9180,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSheetPropertiesRequest();
       var od = api.UpdateSheetPropertiesRequest.fromJson(o.toJson());
-      checkUpdateSheetPropertiesRequest(od);
+      checkUpdateSheetPropertiesRequest(od as api.UpdateSheetPropertiesRequest);
     });
   });
 
@@ -9078,7 +9188,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSlicerSpecRequest();
       var od = api.UpdateSlicerSpecRequest.fromJson(o.toJson());
-      checkUpdateSlicerSpecRequest(od);
+      checkUpdateSlicerSpecRequest(od as api.UpdateSlicerSpecRequest);
     });
   });
 
@@ -9086,7 +9196,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSpreadsheetPropertiesRequest();
       var od = api.UpdateSpreadsheetPropertiesRequest.fromJson(o.toJson());
-      checkUpdateSpreadsheetPropertiesRequest(od);
+      checkUpdateSpreadsheetPropertiesRequest(
+          od as api.UpdateSpreadsheetPropertiesRequest);
     });
   });
 
@@ -9094,7 +9205,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateValuesByDataFilterResponse();
       var od = api.UpdateValuesByDataFilterResponse.fromJson(o.toJson());
-      checkUpdateValuesByDataFilterResponse(od);
+      checkUpdateValuesByDataFilterResponse(
+          od as api.UpdateValuesByDataFilterResponse);
     });
   });
 
@@ -9102,7 +9214,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateValuesResponse();
       var od = api.UpdateValuesResponse.fromJson(o.toJson());
-      checkUpdateValuesResponse(od);
+      checkUpdateValuesResponse(od as api.UpdateValuesResponse);
     });
   });
 
@@ -9110,7 +9222,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildValueRange();
       var od = api.ValueRange.fromJson(o.toJson());
-      checkValueRange(od);
+      checkValueRange(od as api.ValueRange);
     });
   });
 
@@ -9118,7 +9230,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWaterfallChartColumnStyle();
       var od = api.WaterfallChartColumnStyle.fromJson(o.toJson());
-      checkWaterfallChartColumnStyle(od);
+      checkWaterfallChartColumnStyle(od as api.WaterfallChartColumnStyle);
     });
   });
 
@@ -9126,7 +9238,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWaterfallChartCustomSubtotal();
       var od = api.WaterfallChartCustomSubtotal.fromJson(o.toJson());
-      checkWaterfallChartCustomSubtotal(od);
+      checkWaterfallChartCustomSubtotal(od as api.WaterfallChartCustomSubtotal);
     });
   });
 
@@ -9134,7 +9246,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWaterfallChartDomain();
       var od = api.WaterfallChartDomain.fromJson(o.toJson());
-      checkWaterfallChartDomain(od);
+      checkWaterfallChartDomain(od as api.WaterfallChartDomain);
     });
   });
 
@@ -9142,7 +9254,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWaterfallChartSeries();
       var od = api.WaterfallChartSeries.fromJson(o.toJson());
-      checkWaterfallChartSeries(od);
+      checkWaterfallChartSeries(od as api.WaterfallChartSeries);
     });
   });
 
@@ -9150,7 +9262,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWaterfallChartSpec();
       var od = api.WaterfallChartSpec.fromJson(o.toJson());
-      checkWaterfallChartSpec(od);
+      checkWaterfallChartSpec(od as api.WaterfallChartSpec);
     });
   });
 
@@ -9162,8 +9274,10 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchUpdateSpreadsheetRequest.fromJson(json);
-        checkBatchUpdateSpreadsheetRequest(obj);
+        var obj = api.BatchUpdateSpreadsheetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchUpdateSpreadsheetRequest(
+            obj as api.BatchUpdateSpreadsheetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9211,7 +9325,8 @@
       res
           .batchUpdate(arg_request, arg_spreadsheetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchUpdateSpreadsheetResponse(response);
+        checkBatchUpdateSpreadsheetResponse(
+            response as api.BatchUpdateSpreadsheetResponse);
       })));
     });
 
@@ -9221,8 +9336,9 @@
       var arg_request = buildSpreadsheet();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Spreadsheet.fromJson(json);
-        checkSpreadsheet(obj);
+        var obj = api.Spreadsheet.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSpreadsheet(obj as api.Spreadsheet);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9261,7 +9377,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSpreadsheet(response);
+        checkSpreadsheet(response as api.Spreadsheet);
       })));
     });
 
@@ -9319,7 +9435,7 @@
               ranges: arg_ranges,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSpreadsheet(response);
+        checkSpreadsheet(response as api.Spreadsheet);
       })));
     });
 
@@ -9330,8 +9446,10 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetSpreadsheetByDataFilterRequest.fromJson(json);
-        checkGetSpreadsheetByDataFilterRequest(obj);
+        var obj = api.GetSpreadsheetByDataFilterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetSpreadsheetByDataFilterRequest(
+            obj as api.GetSpreadsheetByDataFilterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9379,7 +9497,7 @@
       res
           .getByDataFilter(arg_request, arg_spreadsheetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSpreadsheet(response);
+        checkSpreadsheet(response as api.Spreadsheet);
       })));
     });
   });
@@ -9441,7 +9559,7 @@
       res
           .get(arg_spreadsheetId, arg_metadataId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDeveloperMetadata(response);
+        checkDeveloperMetadata(response as api.DeveloperMetadata);
       })));
     });
 
@@ -9452,8 +9570,10 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchDeveloperMetadataRequest.fromJson(json);
-        checkSearchDeveloperMetadataRequest(obj);
+        var obj = api.SearchDeveloperMetadataRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchDeveloperMetadataRequest(
+            obj as api.SearchDeveloperMetadataRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9501,7 +9621,8 @@
       res
           .search(arg_request, arg_spreadsheetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchDeveloperMetadataResponse(response);
+        checkSearchDeveloperMetadataResponse(
+            response as api.SearchDeveloperMetadataResponse);
       })));
     });
   });
@@ -9515,8 +9636,10 @@
       var arg_sheetId = 42;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CopySheetToAnotherSpreadsheetRequest.fromJson(json);
-        checkCopySheetToAnotherSpreadsheetRequest(obj);
+        var obj = api.CopySheetToAnotherSpreadsheetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCopySheetToAnotherSpreadsheetRequest(
+            obj as api.CopySheetToAnotherSpreadsheetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9574,7 +9697,7 @@
           .copyTo(arg_request, arg_spreadsheetId, arg_sheetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSheetProperties(response);
+        checkSheetProperties(response as api.SheetProperties);
       })));
     });
   });
@@ -9593,8 +9716,9 @@
       var arg_valueInputOption = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ValueRange.fromJson(json);
-        checkValueRange(obj);
+        var obj = api.ValueRange.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkValueRange(obj as api.ValueRange);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9667,7 +9791,7 @@
               valueInputOption: arg_valueInputOption,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAppendValuesResponse(response);
+        checkAppendValuesResponse(response as api.AppendValuesResponse);
       })));
     });
 
@@ -9678,8 +9802,9 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchClearValuesRequest.fromJson(json);
-        checkBatchClearValuesRequest(obj);
+        var obj = api.BatchClearValuesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchClearValuesRequest(obj as api.BatchClearValuesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9727,7 +9852,7 @@
       res
           .batchClear(arg_request, arg_spreadsheetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchClearValuesResponse(response);
+        checkBatchClearValuesResponse(response as api.BatchClearValuesResponse);
       })));
     });
 
@@ -9738,8 +9863,10 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchClearValuesByDataFilterRequest.fromJson(json);
-        checkBatchClearValuesByDataFilterRequest(obj);
+        var obj = api.BatchClearValuesByDataFilterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchClearValuesByDataFilterRequest(
+            obj as api.BatchClearValuesByDataFilterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9789,7 +9916,8 @@
           .batchClearByDataFilter(arg_request, arg_spreadsheetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchClearValuesByDataFilterResponse(response);
+        checkBatchClearValuesByDataFilterResponse(
+            response as api.BatchClearValuesByDataFilterResponse);
       })));
     });
 
@@ -9861,7 +9989,7 @@
               valueRenderOption: arg_valueRenderOption,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetValuesResponse(response);
+        checkBatchGetValuesResponse(response as api.BatchGetValuesResponse);
       })));
     });
 
@@ -9872,8 +10000,10 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchGetValuesByDataFilterRequest.fromJson(json);
-        checkBatchGetValuesByDataFilterRequest(obj);
+        var obj = api.BatchGetValuesByDataFilterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchGetValuesByDataFilterRequest(
+            obj as api.BatchGetValuesByDataFilterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9923,7 +10053,8 @@
           .batchGetByDataFilter(arg_request, arg_spreadsheetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetValuesByDataFilterResponse(response);
+        checkBatchGetValuesByDataFilterResponse(
+            response as api.BatchGetValuesByDataFilterResponse);
       })));
     });
 
@@ -9934,8 +10065,9 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchUpdateValuesRequest.fromJson(json);
-        checkBatchUpdateValuesRequest(obj);
+        var obj = api.BatchUpdateValuesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchUpdateValuesRequest(obj as api.BatchUpdateValuesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9983,7 +10115,8 @@
       res
           .batchUpdate(arg_request, arg_spreadsheetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchUpdateValuesResponse(response);
+        checkBatchUpdateValuesResponse(
+            response as api.BatchUpdateValuesResponse);
       })));
     });
 
@@ -9994,8 +10127,10 @@
       var arg_spreadsheetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchUpdateValuesByDataFilterRequest.fromJson(json);
-        checkBatchUpdateValuesByDataFilterRequest(obj);
+        var obj = api.BatchUpdateValuesByDataFilterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchUpdateValuesByDataFilterRequest(
+            obj as api.BatchUpdateValuesByDataFilterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10045,7 +10180,8 @@
           .batchUpdateByDataFilter(arg_request, arg_spreadsheetId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchUpdateValuesByDataFilterResponse(response);
+        checkBatchUpdateValuesByDataFilterResponse(
+            response as api.BatchUpdateValuesByDataFilterResponse);
       })));
     });
 
@@ -10057,8 +10193,9 @@
       var arg_range = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ClearValuesRequest.fromJson(json);
-        checkClearValuesRequest(obj);
+        var obj = api.ClearValuesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkClearValuesRequest(obj as api.ClearValuesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10116,7 +10253,7 @@
           .clear(arg_request, arg_spreadsheetId, arg_range,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkClearValuesResponse(response);
+        checkClearValuesResponse(response as api.ClearValuesResponse);
       })));
     });
 
@@ -10189,7 +10326,7 @@
               valueRenderOption: arg_valueRenderOption,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkValueRange(response);
+        checkValueRange(response as api.ValueRange);
       })));
     });
 
@@ -10205,8 +10342,9 @@
       var arg_valueInputOption = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ValueRange.fromJson(json);
-        checkValueRange(obj);
+        var obj = api.ValueRange.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkValueRange(obj as api.ValueRange);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10270,7 +10408,7 @@
               valueInputOption: arg_valueInputOption,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUpdateValuesResponse(response);
+        checkUpdateValuesResponse(response as api.UpdateValuesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/siteverification/v1_test.dart b/generated/googleapis/test/siteverification/v1_test.dart
index 2942a85..a099d43 100644
--- a/generated/googleapis/test/siteverification/v1_test.dart
+++ b/generated/googleapis/test/siteverification/v1_test.dart
@@ -114,7 +114,8 @@
     api.SiteVerificationWebResourceGettokenRequest o) {
   buildCounterSiteVerificationWebResourceGettokenRequest++;
   if (buildCounterSiteVerificationWebResourceGettokenRequest < 3) {
-    checkSiteVerificationWebResourceGettokenRequestSite(o.site);
+    checkSiteVerificationWebResourceGettokenRequestSite(
+        o.site as api.SiteVerificationWebResourceGettokenRequestSite);
     unittest.expect(o.verificationMethod, unittest.equals('foo'));
   }
   buildCounterSiteVerificationWebResourceGettokenRequest--;
@@ -152,8 +153,10 @@
 
 void checkUnnamed4336(core.List<api.SiteVerificationWebResourceResource> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSiteVerificationWebResourceResource(o[0]);
-  checkSiteVerificationWebResourceResource(o[1]);
+  checkSiteVerificationWebResourceResource(
+      o[0] as api.SiteVerificationWebResourceResource);
+  checkSiteVerificationWebResourceResource(
+      o[1] as api.SiteVerificationWebResourceResource);
 }
 
 core.int buildCounterSiteVerificationWebResourceListResponse = 0;
@@ -233,7 +236,8 @@
   if (buildCounterSiteVerificationWebResourceResource < 3) {
     unittest.expect(o.id, unittest.equals('foo'));
     checkUnnamed4337(o.owners);
-    checkSiteVerificationWebResourceResourceSite(o.site);
+    checkSiteVerificationWebResourceResourceSite(
+        o.site as api.SiteVerificationWebResourceResourceSite);
   }
   buildCounterSiteVerificationWebResourceResource--;
 }
@@ -245,7 +249,8 @@
       var o = buildSiteVerificationWebResourceGettokenRequestSite();
       var od = api.SiteVerificationWebResourceGettokenRequestSite.fromJson(
           o.toJson());
-      checkSiteVerificationWebResourceGettokenRequestSite(od);
+      checkSiteVerificationWebResourceGettokenRequestSite(
+          od as api.SiteVerificationWebResourceGettokenRequestSite);
     });
   });
 
@@ -254,7 +259,8 @@
       var o = buildSiteVerificationWebResourceGettokenRequest();
       var od =
           api.SiteVerificationWebResourceGettokenRequest.fromJson(o.toJson());
-      checkSiteVerificationWebResourceGettokenRequest(od);
+      checkSiteVerificationWebResourceGettokenRequest(
+          od as api.SiteVerificationWebResourceGettokenRequest);
     });
   });
 
@@ -263,7 +269,8 @@
       var o = buildSiteVerificationWebResourceGettokenResponse();
       var od =
           api.SiteVerificationWebResourceGettokenResponse.fromJson(o.toJson());
-      checkSiteVerificationWebResourceGettokenResponse(od);
+      checkSiteVerificationWebResourceGettokenResponse(
+          od as api.SiteVerificationWebResourceGettokenResponse);
     });
   });
 
@@ -271,7 +278,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteVerificationWebResourceListResponse();
       var od = api.SiteVerificationWebResourceListResponse.fromJson(o.toJson());
-      checkSiteVerificationWebResourceListResponse(od);
+      checkSiteVerificationWebResourceListResponse(
+          od as api.SiteVerificationWebResourceListResponse);
     });
   });
 
@@ -279,7 +287,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteVerificationWebResourceResourceSite();
       var od = api.SiteVerificationWebResourceResourceSite.fromJson(o.toJson());
-      checkSiteVerificationWebResourceResourceSite(od);
+      checkSiteVerificationWebResourceResourceSite(
+          od as api.SiteVerificationWebResourceResourceSite);
     });
   });
 
@@ -287,7 +296,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSiteVerificationWebResourceResource();
       var od = api.SiteVerificationWebResourceResource.fromJson(o.toJson());
-      checkSiteVerificationWebResourceResource(od);
+      checkSiteVerificationWebResourceResource(
+          od as api.SiteVerificationWebResourceResource);
     });
   });
 
@@ -393,7 +403,8 @@
       res
           .get(arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSiteVerificationWebResourceResource(response);
+        checkSiteVerificationWebResourceResource(
+            response as api.SiteVerificationWebResourceResource);
       })));
     });
 
@@ -403,8 +414,10 @@
       var arg_request = buildSiteVerificationWebResourceGettokenRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SiteVerificationWebResourceGettokenRequest.fromJson(json);
-        checkSiteVerificationWebResourceGettokenRequest(obj);
+        var obj = api.SiteVerificationWebResourceGettokenRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSiteVerificationWebResourceGettokenRequest(
+            obj as api.SiteVerificationWebResourceGettokenRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -447,7 +460,8 @@
       res
           .getToken(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSiteVerificationWebResourceGettokenResponse(response);
+        checkSiteVerificationWebResourceGettokenResponse(
+            response as api.SiteVerificationWebResourceGettokenResponse);
       })));
     });
 
@@ -458,8 +472,10 @@
       var arg_verificationMethod = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SiteVerificationWebResourceResource.fromJson(json);
-        checkSiteVerificationWebResourceResource(obj);
+        var obj = api.SiteVerificationWebResourceResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSiteVerificationWebResourceResource(
+            obj as api.SiteVerificationWebResourceResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -504,7 +520,8 @@
       res
           .insert(arg_request, arg_verificationMethod, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSiteVerificationWebResourceResource(response);
+        checkSiteVerificationWebResourceResource(
+            response as api.SiteVerificationWebResourceResource);
       })));
     });
 
@@ -552,7 +569,8 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkSiteVerificationWebResourceListResponse(response);
+        checkSiteVerificationWebResourceListResponse(
+            response as api.SiteVerificationWebResourceListResponse);
       })));
     });
 
@@ -563,8 +581,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SiteVerificationWebResourceResource.fromJson(json);
-        checkSiteVerificationWebResourceResource(obj);
+        var obj = api.SiteVerificationWebResourceResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSiteVerificationWebResourceResource(
+            obj as api.SiteVerificationWebResourceResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -610,7 +630,8 @@
       res
           .patch(arg_request, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSiteVerificationWebResourceResource(response);
+        checkSiteVerificationWebResourceResource(
+            response as api.SiteVerificationWebResourceResource);
       })));
     });
 
@@ -621,8 +642,10 @@
       var arg_id = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SiteVerificationWebResourceResource.fromJson(json);
-        checkSiteVerificationWebResourceResource(obj);
+        var obj = api.SiteVerificationWebResourceResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSiteVerificationWebResourceResource(
+            obj as api.SiteVerificationWebResourceResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -668,7 +691,8 @@
       res
           .update(arg_request, arg_id, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSiteVerificationWebResourceResource(response);
+        checkSiteVerificationWebResourceResource(
+            response as api.SiteVerificationWebResourceResource);
       })));
     });
   });
diff --git a/generated/googleapis/test/slides/v1_test.dart b/generated/googleapis/test/slides/v1_test.dart
index 095e902..21a1fe0 100644
--- a/generated/googleapis/test/slides/v1_test.dart
+++ b/generated/googleapis/test/slides/v1_test.dart
@@ -122,7 +122,7 @@
   buildCounterAutoText++;
   if (buildCounterAutoText < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkTextStyle(o.style);
+    checkTextStyle(o.style as api.TextStyle);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterAutoText--;
@@ -137,8 +137,8 @@
 
 void checkUnnamed1922(core.List<api.Request> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRequest(o[0]);
-  checkRequest(o[1]);
+  checkRequest(o[0] as api.Request);
+  checkRequest(o[1] as api.Request);
 }
 
 core.int buildCounterBatchUpdatePresentationRequest = 0;
@@ -157,7 +157,7 @@
   buildCounterBatchUpdatePresentationRequest++;
   if (buildCounterBatchUpdatePresentationRequest < 3) {
     checkUnnamed1922(o.requests);
-    checkWriteControl(o.writeControl);
+    checkWriteControl(o.writeControl as api.WriteControl);
   }
   buildCounterBatchUpdatePresentationRequest--;
 }
@@ -171,8 +171,8 @@
 
 void checkUnnamed1923(core.List<api.Response> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResponse(o[0]);
-  checkResponse(o[1]);
+  checkResponse(o[0] as api.Response);
+  checkResponse(o[1] as api.Response);
 }
 
 core.int buildCounterBatchUpdatePresentationResponse = 0;
@@ -194,7 +194,7 @@
   if (buildCounterBatchUpdatePresentationResponse < 3) {
     unittest.expect(o.presentationId, unittest.equals('foo'));
     checkUnnamed1923(o.replies);
-    checkWriteControl(o.writeControl);
+    checkWriteControl(o.writeControl as api.WriteControl);
   }
   buildCounterBatchUpdatePresentationResponse--;
 }
@@ -216,7 +216,7 @@
 void checkBullet(api.Bullet o) {
   buildCounterBullet++;
   if (buildCounterBullet < 3) {
-    checkTextStyle(o.bulletStyle);
+    checkTextStyle(o.bulletStyle as api.TextStyle);
     unittest.expect(o.glyph, unittest.equals('foo'));
     unittest.expect(o.listId, unittest.equals('foo'));
     unittest.expect(o.nestingLevel, unittest.equals(42));
@@ -233,8 +233,8 @@
 
 void checkUnnamed1924(core.List<api.ThemeColorPair> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThemeColorPair(o[0]);
-  checkThemeColorPair(o[1]);
+  checkThemeColorPair(o[0] as api.ThemeColorPair);
+  checkThemeColorPair(o[1] as api.ThemeColorPair);
 }
 
 core.int buildCounterColorScheme = 0;
@@ -273,7 +273,7 @@
   buildCounterColorStop++;
   if (buildCounterColorStop < 3) {
     unittest.expect(o.alpha, unittest.equals(42.0));
-    checkOpaqueColor(o.color);
+    checkOpaqueColor(o.color as api.OpaqueColor);
     unittest.expect(o.position, unittest.equals(42.0));
   }
   buildCounterColorStop--;
@@ -295,7 +295,8 @@
 void checkCreateImageRequest(api.CreateImageRequest o) {
   buildCounterCreateImageRequest++;
   if (buildCounterCreateImageRequest < 3) {
-    checkPageElementProperties(o.elementProperties);
+    checkPageElementProperties(
+        o.elementProperties as api.PageElementProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
   }
@@ -339,7 +340,8 @@
   buildCounterCreateLineRequest++;
   if (buildCounterCreateLineRequest < 3) {
     unittest.expect(o.category, unittest.equals('foo'));
-    checkPageElementProperties(o.elementProperties);
+    checkPageElementProperties(
+        o.elementProperties as api.PageElementProperties);
     unittest.expect(o.lineCategory, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
   }
@@ -383,9 +385,9 @@
   buildCounterCreateParagraphBulletsRequest++;
   if (buildCounterCreateParagraphBulletsRequest < 3) {
     unittest.expect(o.bulletPreset, unittest.equals('foo'));
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkRange(o.textRange);
+    checkRange(o.textRange as api.Range);
   }
   buildCounterCreateParagraphBulletsRequest--;
 }
@@ -406,7 +408,8 @@
 void checkCreateShapeRequest(api.CreateShapeRequest o) {
   buildCounterCreateShapeRequest++;
   if (buildCounterCreateShapeRequest < 3) {
-    checkPageElementProperties(o.elementProperties);
+    checkPageElementProperties(
+        o.elementProperties as api.PageElementProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
     unittest.expect(o.shapeType, unittest.equals('foo'));
   }
@@ -451,7 +454,8 @@
   buildCounterCreateSheetsChartRequest++;
   if (buildCounterCreateSheetsChartRequest < 3) {
     unittest.expect(o.chartId, unittest.equals(42));
-    checkPageElementProperties(o.elementProperties);
+    checkPageElementProperties(
+        o.elementProperties as api.PageElementProperties);
     unittest.expect(o.linkingMode, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
@@ -487,8 +491,8 @@
 
 void checkUnnamed1925(core.List<api.LayoutPlaceholderIdMapping> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLayoutPlaceholderIdMapping(o[0]);
-  checkLayoutPlaceholderIdMapping(o[1]);
+  checkLayoutPlaceholderIdMapping(o[0] as api.LayoutPlaceholderIdMapping);
+  checkLayoutPlaceholderIdMapping(o[1] as api.LayoutPlaceholderIdMapping);
 }
 
 core.int buildCounterCreateSlideRequest = 0;
@@ -511,7 +515,7 @@
     unittest.expect(o.insertionIndex, unittest.equals(42));
     unittest.expect(o.objectId, unittest.equals('foo'));
     checkUnnamed1925(o.placeholderIdMappings);
-    checkLayoutReference(o.slideLayoutReference);
+    checkLayoutReference(o.slideLayoutReference as api.LayoutReference);
   }
   buildCounterCreateSlideRequest--;
 }
@@ -553,7 +557,8 @@
   buildCounterCreateTableRequest++;
   if (buildCounterCreateTableRequest < 3) {
     unittest.expect(o.columns, unittest.equals(42));
-    checkPageElementProperties(o.elementProperties);
+    checkPageElementProperties(
+        o.elementProperties as api.PageElementProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
     unittest.expect(o.rows, unittest.equals(42));
   }
@@ -596,7 +601,8 @@
 void checkCreateVideoRequest(api.CreateVideoRequest o) {
   buildCounterCreateVideoRequest++;
   if (buildCounterCreateVideoRequest < 3) {
-    checkPageElementProperties(o.elementProperties);
+    checkPageElementProperties(
+        o.elementProperties as api.PageElementProperties);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
@@ -685,9 +691,9 @@
 void checkDeleteParagraphBulletsRequest(api.DeleteParagraphBulletsRequest o) {
   buildCounterDeleteParagraphBulletsRequest++;
   if (buildCounterDeleteParagraphBulletsRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkRange(o.textRange);
+    checkRange(o.textRange as api.Range);
   }
   buildCounterDeleteParagraphBulletsRequest--;
 }
@@ -707,7 +713,7 @@
 void checkDeleteTableColumnRequest(api.DeleteTableColumnRequest o) {
   buildCounterDeleteTableColumnRequest++;
   if (buildCounterDeleteTableColumnRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.tableObjectId, unittest.equals('foo'));
   }
   buildCounterDeleteTableColumnRequest--;
@@ -728,7 +734,7 @@
 void checkDeleteTableRowRequest(api.DeleteTableRowRequest o) {
   buildCounterDeleteTableRowRequest++;
   if (buildCounterDeleteTableRowRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.tableObjectId, unittest.equals('foo'));
   }
   buildCounterDeleteTableRowRequest--;
@@ -750,9 +756,9 @@
 void checkDeleteTextRequest(api.DeleteTextRequest o) {
   buildCounterDeleteTextRequest++;
   if (buildCounterDeleteTextRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkRange(o.textRange);
+    checkRange(o.textRange as api.Range);
   }
   buildCounterDeleteTextRequest--;
 }
@@ -840,8 +846,8 @@
 
 void checkUnnamed1927(core.List<api.PageElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPageElement(o[0]);
-  checkPageElement(o[1]);
+  checkPageElement(o[0] as api.PageElement);
+  checkPageElement(o[1] as api.PageElement);
 }
 
 core.int buildCounterGroup = 0;
@@ -933,7 +939,7 @@
   buildCounterImage++;
   if (buildCounterImage < 3) {
     unittest.expect(o.contentUrl, unittest.equals('foo'));
-    checkImageProperties(o.imageProperties);
+    checkImageProperties(o.imageProperties as api.ImageProperties);
     unittest.expect(o.sourceUrl, unittest.equals('foo'));
   }
   buildCounterImage--;
@@ -962,11 +968,11 @@
   if (buildCounterImageProperties < 3) {
     unittest.expect(o.brightness, unittest.equals(42.0));
     unittest.expect(o.contrast, unittest.equals(42.0));
-    checkCropProperties(o.cropProperties);
-    checkLink(o.link);
-    checkOutline(o.outline);
-    checkRecolor(o.recolor);
-    checkShadow(o.shadow);
+    checkCropProperties(o.cropProperties as api.CropProperties);
+    checkLink(o.link as api.Link);
+    checkOutline(o.outline as api.Outline);
+    checkRecolor(o.recolor as api.Recolor);
+    checkShadow(o.shadow as api.Shadow);
     unittest.expect(o.transparency, unittest.equals(42.0));
   }
   buildCounterImageProperties--;
@@ -989,7 +995,7 @@
 void checkInsertTableColumnsRequest(api.InsertTableColumnsRequest o) {
   buildCounterInsertTableColumnsRequest++;
   if (buildCounterInsertTableColumnsRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.insertRight, unittest.isTrue);
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.tableObjectId, unittest.equals('foo'));
@@ -1014,7 +1020,7 @@
 void checkInsertTableRowsRequest(api.InsertTableRowsRequest o) {
   buildCounterInsertTableRowsRequest++;
   if (buildCounterInsertTableRowsRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.insertBelow, unittest.isTrue);
     unittest.expect(o.number, unittest.equals(42));
     unittest.expect(o.tableObjectId, unittest.equals('foo'));
@@ -1039,7 +1045,7 @@
 void checkInsertTextRequest(api.InsertTextRequest o) {
   buildCounterInsertTextRequest++;
   if (buildCounterInsertTextRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.insertionIndex, unittest.equals(42));
     unittest.expect(o.objectId, unittest.equals('foo'));
     unittest.expect(o.text, unittest.equals('foo'));
@@ -1063,7 +1069,7 @@
 void checkLayoutPlaceholderIdMapping(api.LayoutPlaceholderIdMapping o) {
   buildCounterLayoutPlaceholderIdMapping++;
   if (buildCounterLayoutPlaceholderIdMapping < 3) {
-    checkPlaceholder(o.layoutPlaceholder);
+    checkPlaceholder(o.layoutPlaceholder as api.Placeholder);
     unittest.expect(o.layoutPlaceholderObjectId, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
   }
@@ -1131,7 +1137,7 @@
   buildCounterLine++;
   if (buildCounterLine < 3) {
     unittest.expect(o.lineCategory, unittest.equals('foo'));
-    checkLineProperties(o.lineProperties);
+    checkLineProperties(o.lineProperties as api.LineProperties);
     unittest.expect(o.lineType, unittest.equals('foo'));
   }
   buildCounterLine--;
@@ -1172,7 +1178,7 @@
 void checkLineFill(api.LineFill o) {
   buildCounterLineFill++;
   if (buildCounterLineFill < 3) {
-    checkSolidFill(o.solidFill);
+    checkSolidFill(o.solidFill as api.SolidFill);
   }
   buildCounterLineFill--;
 }
@@ -1200,12 +1206,12 @@
   if (buildCounterLineProperties < 3) {
     unittest.expect(o.dashStyle, unittest.equals('foo'));
     unittest.expect(o.endArrow, unittest.equals('foo'));
-    checkLineConnection(o.endConnection);
-    checkLineFill(o.lineFill);
-    checkLink(o.link);
+    checkLineConnection(o.endConnection as api.LineConnection);
+    checkLineFill(o.lineFill as api.LineFill);
+    checkLink(o.link as api.Link);
     unittest.expect(o.startArrow, unittest.equals('foo'));
-    checkLineConnection(o.startConnection);
-    checkDimension(o.weight);
+    checkLineConnection(o.startConnection as api.LineConnection);
+    checkDimension(o.weight as api.Dimension);
   }
   buildCounterLineProperties--;
 }
@@ -1244,8 +1250,8 @@
 
 void checkUnnamed1929(core.Map<core.String, api.NestingLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNestingLevel(o['x']);
-  checkNestingLevel(o['y']);
+  checkNestingLevel(o['x'] as api.NestingLevel);
+  checkNestingLevel(o['y'] as api.NestingLevel);
 }
 
 core.int buildCounterList = 0;
@@ -1304,7 +1310,7 @@
   buildCounterMergeTableCellsRequest++;
   if (buildCounterMergeTableCellsRequest < 3) {
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkTableRange(o.tableRange);
+    checkTableRange(o.tableRange as api.TableRange);
   }
   buildCounterMergeTableCellsRequest--;
 }
@@ -1323,7 +1329,7 @@
 void checkNestingLevel(api.NestingLevel o) {
   buildCounterNestingLevel++;
   if (buildCounterNestingLevel < 3) {
-    checkTextStyle(o.bulletStyle);
+    checkTextStyle(o.bulletStyle as api.TextStyle);
   }
   buildCounterNestingLevel--;
 }
@@ -1362,7 +1368,7 @@
 void checkOpaqueColor(api.OpaqueColor o) {
   buildCounterOpaqueColor++;
   if (buildCounterOpaqueColor < 3) {
-    checkRgbColor(o.rgbColor);
+    checkRgbColor(o.rgbColor as api.RgbColor);
     unittest.expect(o.themeColor, unittest.equals('foo'));
   }
   buildCounterOpaqueColor--;
@@ -1382,7 +1388,7 @@
 void checkOptionalColor(api.OptionalColor o) {
   buildCounterOptionalColor++;
   if (buildCounterOptionalColor < 3) {
-    checkOpaqueColor(o.opaqueColor);
+    checkOpaqueColor(o.opaqueColor as api.OpaqueColor);
   }
   buildCounterOptionalColor--;
 }
@@ -1405,9 +1411,9 @@
   buildCounterOutline++;
   if (buildCounterOutline < 3) {
     unittest.expect(o.dashStyle, unittest.equals('foo'));
-    checkOutlineFill(o.outlineFill);
+    checkOutlineFill(o.outlineFill as api.OutlineFill);
     unittest.expect(o.propertyState, unittest.equals('foo'));
-    checkDimension(o.weight);
+    checkDimension(o.weight as api.Dimension);
   }
   buildCounterOutline--;
 }
@@ -1426,7 +1432,7 @@
 void checkOutlineFill(api.OutlineFill o) {
   buildCounterOutlineFill++;
   if (buildCounterOutlineFill < 3) {
-    checkSolidFill(o.solidFill);
+    checkSolidFill(o.solidFill as api.SolidFill);
   }
   buildCounterOutlineFill--;
 }
@@ -1440,8 +1446,8 @@
 
 void checkUnnamed1930(core.List<api.PageElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPageElement(o[0]);
-  checkPageElement(o[1]);
+  checkPageElement(o[0] as api.PageElement);
+  checkPageElement(o[1] as api.PageElement);
 }
 
 core.int buildCounterPage = 0;
@@ -1466,15 +1472,15 @@
 void checkPage(api.Page o) {
   buildCounterPage++;
   if (buildCounterPage < 3) {
-    checkLayoutProperties(o.layoutProperties);
-    checkMasterProperties(o.masterProperties);
-    checkNotesProperties(o.notesProperties);
+    checkLayoutProperties(o.layoutProperties as api.LayoutProperties);
+    checkMasterProperties(o.masterProperties as api.MasterProperties);
+    checkNotesProperties(o.notesProperties as api.NotesProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
     checkUnnamed1930(o.pageElements);
-    checkPageProperties(o.pageProperties);
+    checkPageProperties(o.pageProperties as api.PageProperties);
     unittest.expect(o.pageType, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
-    checkSlideProperties(o.slideProperties);
+    checkSlideProperties(o.slideProperties as api.SlideProperties);
   }
   buildCounterPage--;
 }
@@ -1496,8 +1502,9 @@
   buildCounterPageBackgroundFill++;
   if (buildCounterPageBackgroundFill < 3) {
     unittest.expect(o.propertyState, unittest.equals('foo'));
-    checkSolidFill(o.solidFill);
-    checkStretchedPictureFill(o.stretchedPictureFill);
+    checkSolidFill(o.solidFill as api.SolidFill);
+    checkStretchedPictureFill(
+        o.stretchedPictureFill as api.StretchedPictureFill);
   }
   buildCounterPageBackgroundFill--;
 }
@@ -1529,18 +1536,18 @@
   buildCounterPageElement++;
   if (buildCounterPageElement < 3) {
     unittest.expect(o.description, unittest.equals('foo'));
-    checkGroup(o.elementGroup);
-    checkImage(o.image);
-    checkLine(o.line);
+    checkGroup(o.elementGroup as api.Group);
+    checkImage(o.image as api.Image);
+    checkLine(o.line as api.Line);
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkShape(o.shape);
-    checkSheetsChart(o.sheetsChart);
-    checkSize(o.size);
-    checkTable(o.table);
+    checkShape(o.shape as api.Shape);
+    checkSheetsChart(o.sheetsChart as api.SheetsChart);
+    checkSize(o.size as api.Size);
+    checkTable(o.table as api.Table);
     unittest.expect(o.title, unittest.equals('foo'));
-    checkAffineTransform(o.transform);
-    checkVideo(o.video);
-    checkWordArt(o.wordArt);
+    checkAffineTransform(o.transform as api.AffineTransform);
+    checkVideo(o.video as api.Video);
+    checkWordArt(o.wordArt as api.WordArt);
   }
   buildCounterPageElement--;
 }
@@ -1562,8 +1569,8 @@
   buildCounterPageElementProperties++;
   if (buildCounterPageElementProperties < 3) {
     unittest.expect(o.pageObjectId, unittest.equals('foo'));
-    checkSize(o.size);
-    checkAffineTransform(o.transform);
+    checkSize(o.size as api.Size);
+    checkAffineTransform(o.transform as api.AffineTransform);
   }
   buildCounterPageElementProperties--;
 }
@@ -1583,8 +1590,8 @@
 void checkPageProperties(api.PageProperties o) {
   buildCounterPageProperties++;
   if (buildCounterPageProperties < 3) {
-    checkColorScheme(o.colorScheme);
-    checkPageBackgroundFill(o.pageBackgroundFill);
+    checkColorScheme(o.colorScheme as api.ColorScheme);
+    checkPageBackgroundFill(o.pageBackgroundFill as api.PageBackgroundFill);
   }
   buildCounterPageProperties--;
 }
@@ -1604,8 +1611,8 @@
 void checkParagraphMarker(api.ParagraphMarker o) {
   buildCounterParagraphMarker++;
   if (buildCounterParagraphMarker < 3) {
-    checkBullet(o.bullet);
-    checkParagraphStyle(o.style);
+    checkBullet(o.bullet as api.Bullet);
+    checkParagraphStyle(o.style as api.ParagraphStyle);
   }
   buildCounterParagraphMarker--;
 }
@@ -1634,12 +1641,12 @@
   if (buildCounterParagraphStyle < 3) {
     unittest.expect(o.alignment, unittest.equals('foo'));
     unittest.expect(o.direction, unittest.equals('foo'));
-    checkDimension(o.indentEnd);
-    checkDimension(o.indentFirstLine);
-    checkDimension(o.indentStart);
+    checkDimension(o.indentEnd as api.Dimension);
+    checkDimension(o.indentFirstLine as api.Dimension);
+    checkDimension(o.indentStart as api.Dimension);
     unittest.expect(o.lineSpacing, unittest.equals(42.0));
-    checkDimension(o.spaceAbove);
-    checkDimension(o.spaceBelow);
+    checkDimension(o.spaceAbove as api.Dimension);
+    checkDimension(o.spaceBelow as api.Dimension);
     unittest.expect(o.spacingMode, unittest.equals('foo'));
   }
   buildCounterParagraphStyle--;
@@ -1677,8 +1684,8 @@
 
 void checkUnnamed1931(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.List<api.Page> buildUnnamed1932() {
@@ -1690,8 +1697,8 @@
 
 void checkUnnamed1932(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.List<api.Page> buildUnnamed1933() {
@@ -1703,8 +1710,8 @@
 
 void checkUnnamed1933(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.int buildCounterPresentation = 0;
@@ -1732,8 +1739,8 @@
     checkUnnamed1931(o.layouts);
     unittest.expect(o.locale, unittest.equals('foo'));
     checkUnnamed1932(o.masters);
-    checkPage(o.notesMaster);
-    checkSize(o.pageSize);
+    checkPage(o.notesMaster as api.Page);
+    checkSize(o.pageSize as api.Size);
     unittest.expect(o.presentationId, unittest.equals('foo'));
     unittest.expect(o.revisionId, unittest.equals('foo'));
     checkUnnamed1933(o.slides);
@@ -1774,8 +1781,8 @@
 
 void checkUnnamed1934(core.List<api.ColorStop> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkColorStop(o[0]);
-  checkColorStop(o[1]);
+  checkColorStop(o[0] as api.ColorStop);
+  checkColorStop(o[1] as api.ColorStop);
 }
 
 core.int buildCounterRecolor = 0;
@@ -1850,7 +1857,7 @@
     api.ReplaceAllShapesWithImageRequest o) {
   buildCounterReplaceAllShapesWithImageRequest++;
   if (buildCounterReplaceAllShapesWithImageRequest < 3) {
-    checkSubstringMatchCriteria(o.containsText);
+    checkSubstringMatchCriteria(o.containsText as api.SubstringMatchCriteria);
     unittest.expect(o.imageReplaceMethod, unittest.equals('foo'));
     unittest.expect(o.imageUrl, unittest.equals('foo'));
     checkUnnamed1935(o.pageObjectIds);
@@ -1913,7 +1920,7 @@
   buildCounterReplaceAllShapesWithSheetsChartRequest++;
   if (buildCounterReplaceAllShapesWithSheetsChartRequest < 3) {
     unittest.expect(o.chartId, unittest.equals(42));
-    checkSubstringMatchCriteria(o.containsText);
+    checkSubstringMatchCriteria(o.containsText as api.SubstringMatchCriteria);
     unittest.expect(o.linkingMode, unittest.equals('foo'));
     checkUnnamed1936(o.pageObjectIds);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
@@ -1971,7 +1978,7 @@
 void checkReplaceAllTextRequest(api.ReplaceAllTextRequest o) {
   buildCounterReplaceAllTextRequest++;
   if (buildCounterReplaceAllTextRequest < 3) {
-    checkSubstringMatchCriteria(o.containsText);
+    checkSubstringMatchCriteria(o.containsText as api.SubstringMatchCriteria);
     checkUnnamed1937(o.pageObjectIds);
     unittest.expect(o.replaceText, unittest.equals('foo'));
   }
@@ -2077,50 +2084,78 @@
 void checkRequest(api.Request o) {
   buildCounterRequest++;
   if (buildCounterRequest < 3) {
-    checkCreateImageRequest(o.createImage);
-    checkCreateLineRequest(o.createLine);
-    checkCreateParagraphBulletsRequest(o.createParagraphBullets);
-    checkCreateShapeRequest(o.createShape);
-    checkCreateSheetsChartRequest(o.createSheetsChart);
-    checkCreateSlideRequest(o.createSlide);
-    checkCreateTableRequest(o.createTable);
-    checkCreateVideoRequest(o.createVideo);
-    checkDeleteObjectRequest(o.deleteObject);
-    checkDeleteParagraphBulletsRequest(o.deleteParagraphBullets);
-    checkDeleteTableColumnRequest(o.deleteTableColumn);
-    checkDeleteTableRowRequest(o.deleteTableRow);
-    checkDeleteTextRequest(o.deleteText);
-    checkDuplicateObjectRequest(o.duplicateObject);
-    checkGroupObjectsRequest(o.groupObjects);
-    checkInsertTableColumnsRequest(o.insertTableColumns);
-    checkInsertTableRowsRequest(o.insertTableRows);
-    checkInsertTextRequest(o.insertText);
-    checkMergeTableCellsRequest(o.mergeTableCells);
-    checkRefreshSheetsChartRequest(o.refreshSheetsChart);
-    checkReplaceAllShapesWithImageRequest(o.replaceAllShapesWithImage);
+    checkCreateImageRequest(o.createImage as api.CreateImageRequest);
+    checkCreateLineRequest(o.createLine as api.CreateLineRequest);
+    checkCreateParagraphBulletsRequest(
+        o.createParagraphBullets as api.CreateParagraphBulletsRequest);
+    checkCreateShapeRequest(o.createShape as api.CreateShapeRequest);
+    checkCreateSheetsChartRequest(
+        o.createSheetsChart as api.CreateSheetsChartRequest);
+    checkCreateSlideRequest(o.createSlide as api.CreateSlideRequest);
+    checkCreateTableRequest(o.createTable as api.CreateTableRequest);
+    checkCreateVideoRequest(o.createVideo as api.CreateVideoRequest);
+    checkDeleteObjectRequest(o.deleteObject as api.DeleteObjectRequest);
+    checkDeleteParagraphBulletsRequest(
+        o.deleteParagraphBullets as api.DeleteParagraphBulletsRequest);
+    checkDeleteTableColumnRequest(
+        o.deleteTableColumn as api.DeleteTableColumnRequest);
+    checkDeleteTableRowRequest(o.deleteTableRow as api.DeleteTableRowRequest);
+    checkDeleteTextRequest(o.deleteText as api.DeleteTextRequest);
+    checkDuplicateObjectRequest(
+        o.duplicateObject as api.DuplicateObjectRequest);
+    checkGroupObjectsRequest(o.groupObjects as api.GroupObjectsRequest);
+    checkInsertTableColumnsRequest(
+        o.insertTableColumns as api.InsertTableColumnsRequest);
+    checkInsertTableRowsRequest(
+        o.insertTableRows as api.InsertTableRowsRequest);
+    checkInsertTextRequest(o.insertText as api.InsertTextRequest);
+    checkMergeTableCellsRequest(
+        o.mergeTableCells as api.MergeTableCellsRequest);
+    checkRefreshSheetsChartRequest(
+        o.refreshSheetsChart as api.RefreshSheetsChartRequest);
+    checkReplaceAllShapesWithImageRequest(
+        o.replaceAllShapesWithImage as api.ReplaceAllShapesWithImageRequest);
     checkReplaceAllShapesWithSheetsChartRequest(
-        o.replaceAllShapesWithSheetsChart);
-    checkReplaceAllTextRequest(o.replaceAllText);
-    checkReplaceImageRequest(o.replaceImage);
-    checkRerouteLineRequest(o.rerouteLine);
-    checkUngroupObjectsRequest(o.ungroupObjects);
-    checkUnmergeTableCellsRequest(o.unmergeTableCells);
-    checkUpdateImagePropertiesRequest(o.updateImageProperties);
-    checkUpdateLineCategoryRequest(o.updateLineCategory);
-    checkUpdateLinePropertiesRequest(o.updateLineProperties);
-    checkUpdatePageElementAltTextRequest(o.updatePageElementAltText);
-    checkUpdatePageElementTransformRequest(o.updatePageElementTransform);
-    checkUpdatePageElementsZOrderRequest(o.updatePageElementsZOrder);
-    checkUpdatePagePropertiesRequest(o.updatePageProperties);
-    checkUpdateParagraphStyleRequest(o.updateParagraphStyle);
-    checkUpdateShapePropertiesRequest(o.updateShapeProperties);
-    checkUpdateSlidesPositionRequest(o.updateSlidesPosition);
-    checkUpdateTableBorderPropertiesRequest(o.updateTableBorderProperties);
-    checkUpdateTableCellPropertiesRequest(o.updateTableCellProperties);
-    checkUpdateTableColumnPropertiesRequest(o.updateTableColumnProperties);
-    checkUpdateTableRowPropertiesRequest(o.updateTableRowProperties);
-    checkUpdateTextStyleRequest(o.updateTextStyle);
-    checkUpdateVideoPropertiesRequest(o.updateVideoProperties);
+        o.replaceAllShapesWithSheetsChart
+            as api.ReplaceAllShapesWithSheetsChartRequest);
+    checkReplaceAllTextRequest(o.replaceAllText as api.ReplaceAllTextRequest);
+    checkReplaceImageRequest(o.replaceImage as api.ReplaceImageRequest);
+    checkRerouteLineRequest(o.rerouteLine as api.RerouteLineRequest);
+    checkUngroupObjectsRequest(o.ungroupObjects as api.UngroupObjectsRequest);
+    checkUnmergeTableCellsRequest(
+        o.unmergeTableCells as api.UnmergeTableCellsRequest);
+    checkUpdateImagePropertiesRequest(
+        o.updateImageProperties as api.UpdateImagePropertiesRequest);
+    checkUpdateLineCategoryRequest(
+        o.updateLineCategory as api.UpdateLineCategoryRequest);
+    checkUpdateLinePropertiesRequest(
+        o.updateLineProperties as api.UpdateLinePropertiesRequest);
+    checkUpdatePageElementAltTextRequest(
+        o.updatePageElementAltText as api.UpdatePageElementAltTextRequest);
+    checkUpdatePageElementTransformRequest(
+        o.updatePageElementTransform as api.UpdatePageElementTransformRequest);
+    checkUpdatePageElementsZOrderRequest(
+        o.updatePageElementsZOrder as api.UpdatePageElementsZOrderRequest);
+    checkUpdatePagePropertiesRequest(
+        o.updatePageProperties as api.UpdatePagePropertiesRequest);
+    checkUpdateParagraphStyleRequest(
+        o.updateParagraphStyle as api.UpdateParagraphStyleRequest);
+    checkUpdateShapePropertiesRequest(
+        o.updateShapeProperties as api.UpdateShapePropertiesRequest);
+    checkUpdateSlidesPositionRequest(
+        o.updateSlidesPosition as api.UpdateSlidesPositionRequest);
+    checkUpdateTableBorderPropertiesRequest(o.updateTableBorderProperties
+        as api.UpdateTableBorderPropertiesRequest);
+    checkUpdateTableCellPropertiesRequest(
+        o.updateTableCellProperties as api.UpdateTableCellPropertiesRequest);
+    checkUpdateTableColumnPropertiesRequest(o.updateTableColumnProperties
+        as api.UpdateTableColumnPropertiesRequest);
+    checkUpdateTableRowPropertiesRequest(
+        o.updateTableRowProperties as api.UpdateTableRowPropertiesRequest);
+    checkUpdateTextStyleRequest(
+        o.updateTextStyle as api.UpdateTextStyleRequest);
+    checkUpdateVideoPropertiesRequest(
+        o.updateVideoProperties as api.UpdateVideoPropertiesRequest);
   }
   buildCounterRequest--;
 }
@@ -2170,19 +2205,23 @@
 void checkResponse(api.Response o) {
   buildCounterResponse++;
   if (buildCounterResponse < 3) {
-    checkCreateImageResponse(o.createImage);
-    checkCreateLineResponse(o.createLine);
-    checkCreateShapeResponse(o.createShape);
-    checkCreateSheetsChartResponse(o.createSheetsChart);
-    checkCreateSlideResponse(o.createSlide);
-    checkCreateTableResponse(o.createTable);
-    checkCreateVideoResponse(o.createVideo);
-    checkDuplicateObjectResponse(o.duplicateObject);
-    checkGroupObjectsResponse(o.groupObjects);
-    checkReplaceAllShapesWithImageResponse(o.replaceAllShapesWithImage);
+    checkCreateImageResponse(o.createImage as api.CreateImageResponse);
+    checkCreateLineResponse(o.createLine as api.CreateLineResponse);
+    checkCreateShapeResponse(o.createShape as api.CreateShapeResponse);
+    checkCreateSheetsChartResponse(
+        o.createSheetsChart as api.CreateSheetsChartResponse);
+    checkCreateSlideResponse(o.createSlide as api.CreateSlideResponse);
+    checkCreateTableResponse(o.createTable as api.CreateTableResponse);
+    checkCreateVideoResponse(o.createVideo as api.CreateVideoResponse);
+    checkDuplicateObjectResponse(
+        o.duplicateObject as api.DuplicateObjectResponse);
+    checkGroupObjectsResponse(o.groupObjects as api.GroupObjectsResponse);
+    checkReplaceAllShapesWithImageResponse(
+        o.replaceAllShapesWithImage as api.ReplaceAllShapesWithImageResponse);
     checkReplaceAllShapesWithSheetsChartResponse(
-        o.replaceAllShapesWithSheetsChart);
-    checkReplaceAllTextResponse(o.replaceAllText);
+        o.replaceAllShapesWithSheetsChart
+            as api.ReplaceAllShapesWithSheetsChartResponse);
+    checkReplaceAllTextResponse(o.replaceAllText as api.ReplaceAllTextResponse);
   }
   buildCounterResponse--;
 }
@@ -2233,11 +2272,11 @@
   if (buildCounterShadow < 3) {
     unittest.expect(o.alignment, unittest.equals('foo'));
     unittest.expect(o.alpha, unittest.equals(42.0));
-    checkDimension(o.blurRadius);
-    checkOpaqueColor(o.color);
+    checkDimension(o.blurRadius as api.Dimension);
+    checkOpaqueColor(o.color as api.OpaqueColor);
     unittest.expect(o.propertyState, unittest.equals('foo'));
     unittest.expect(o.rotateWithShape, unittest.isTrue);
-    checkAffineTransform(o.transform);
+    checkAffineTransform(o.transform as api.AffineTransform);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterShadow--;
@@ -2260,10 +2299,10 @@
 void checkShape(api.Shape o) {
   buildCounterShape++;
   if (buildCounterShape < 3) {
-    checkPlaceholder(o.placeholder);
-    checkShapeProperties(o.shapeProperties);
+    checkPlaceholder(o.placeholder as api.Placeholder);
+    checkShapeProperties(o.shapeProperties as api.ShapeProperties);
     unittest.expect(o.shapeType, unittest.equals('foo'));
-    checkTextContent(o.text);
+    checkTextContent(o.text as api.TextContent);
   }
   buildCounterShape--;
 }
@@ -2284,7 +2323,7 @@
   buildCounterShapeBackgroundFill++;
   if (buildCounterShapeBackgroundFill < 3) {
     unittest.expect(o.propertyState, unittest.equals('foo'));
-    checkSolidFill(o.solidFill);
+    checkSolidFill(o.solidFill as api.SolidFill);
   }
   buildCounterShapeBackgroundFill--;
 }
@@ -2308,10 +2347,10 @@
   buildCounterShapeProperties++;
   if (buildCounterShapeProperties < 3) {
     unittest.expect(o.contentAlignment, unittest.equals('foo'));
-    checkLink(o.link);
-    checkOutline(o.outline);
-    checkShadow(o.shadow);
-    checkShapeBackgroundFill(o.shapeBackgroundFill);
+    checkLink(o.link as api.Link);
+    checkOutline(o.outline as api.Outline);
+    checkShadow(o.shadow as api.Shadow);
+    checkShapeBackgroundFill(o.shapeBackgroundFill as api.ShapeBackgroundFill);
   }
   buildCounterShapeProperties--;
 }
@@ -2335,7 +2374,8 @@
   if (buildCounterSheetsChart < 3) {
     unittest.expect(o.chartId, unittest.equals(42));
     unittest.expect(o.contentUrl, unittest.equals('foo'));
-    checkSheetsChartProperties(o.sheetsChartProperties);
+    checkSheetsChartProperties(
+        o.sheetsChartProperties as api.SheetsChartProperties);
     unittest.expect(o.spreadsheetId, unittest.equals('foo'));
   }
   buildCounterSheetsChart--;
@@ -2355,7 +2395,7 @@
 void checkSheetsChartProperties(api.SheetsChartProperties o) {
   buildCounterSheetsChartProperties++;
   if (buildCounterSheetsChartProperties < 3) {
-    checkImageProperties(o.chartImageProperties);
+    checkImageProperties(o.chartImageProperties as api.ImageProperties);
   }
   buildCounterSheetsChartProperties--;
 }
@@ -2375,8 +2415,8 @@
 void checkSize(api.Size o) {
   buildCounterSize++;
   if (buildCounterSize < 3) {
-    checkDimension(o.height);
-    checkDimension(o.width);
+    checkDimension(o.height as api.Dimension);
+    checkDimension(o.width as api.Dimension);
   }
   buildCounterSize--;
 }
@@ -2399,7 +2439,7 @@
   if (buildCounterSlideProperties < 3) {
     unittest.expect(o.layoutObjectId, unittest.equals('foo'));
     unittest.expect(o.masterObjectId, unittest.equals('foo'));
-    checkPage(o.notesPage);
+    checkPage(o.notesPage as api.Page);
   }
   buildCounterSlideProperties--;
 }
@@ -2420,7 +2460,7 @@
   buildCounterSolidFill++;
   if (buildCounterSolidFill < 3) {
     unittest.expect(o.alpha, unittest.equals(42.0));
-    checkOpaqueColor(o.color);
+    checkOpaqueColor(o.color as api.OpaqueColor);
   }
   buildCounterSolidFill--;
 }
@@ -2441,7 +2481,7 @@
   buildCounterStretchedPictureFill++;
   if (buildCounterStretchedPictureFill < 3) {
     unittest.expect(o.contentUrl, unittest.equals('foo'));
-    checkSize(o.size);
+    checkSize(o.size as api.Size);
   }
   buildCounterStretchedPictureFill--;
 }
@@ -2476,8 +2516,8 @@
 
 void checkUnnamed1938(core.List<api.TableBorderRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableBorderRow(o[0]);
-  checkTableBorderRow(o[1]);
+  checkTableBorderRow(o[0] as api.TableBorderRow);
+  checkTableBorderRow(o[1] as api.TableBorderRow);
 }
 
 core.List<api.TableColumnProperties> buildUnnamed1939() {
@@ -2489,8 +2529,8 @@
 
 void checkUnnamed1939(core.List<api.TableColumnProperties> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableColumnProperties(o[0]);
-  checkTableColumnProperties(o[1]);
+  checkTableColumnProperties(o[0] as api.TableColumnProperties);
+  checkTableColumnProperties(o[1] as api.TableColumnProperties);
 }
 
 core.List<api.TableRow> buildUnnamed1940() {
@@ -2502,8 +2542,8 @@
 
 void checkUnnamed1940(core.List<api.TableRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableRow(o[0]);
-  checkTableRow(o[1]);
+  checkTableRow(o[0] as api.TableRow);
+  checkTableRow(o[1] as api.TableRow);
 }
 
 core.List<api.TableBorderRow> buildUnnamed1941() {
@@ -2515,8 +2555,8 @@
 
 void checkUnnamed1941(core.List<api.TableBorderRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableBorderRow(o[0]);
-  checkTableBorderRow(o[1]);
+  checkTableBorderRow(o[0] as api.TableBorderRow);
+  checkTableBorderRow(o[1] as api.TableBorderRow);
 }
 
 core.int buildCounterTable = 0;
@@ -2563,8 +2603,9 @@
 void checkTableBorderCell(api.TableBorderCell o) {
   buildCounterTableBorderCell++;
   if (buildCounterTableBorderCell < 3) {
-    checkTableCellLocation(o.location);
-    checkTableBorderProperties(o.tableBorderProperties);
+    checkTableCellLocation(o.location as api.TableCellLocation);
+    checkTableBorderProperties(
+        o.tableBorderProperties as api.TableBorderProperties);
   }
   buildCounterTableBorderCell--;
 }
@@ -2583,7 +2624,7 @@
 void checkTableBorderFill(api.TableBorderFill o) {
   buildCounterTableBorderFill++;
   if (buildCounterTableBorderFill < 3) {
-    checkSolidFill(o.solidFill);
+    checkSolidFill(o.solidFill as api.SolidFill);
   }
   buildCounterTableBorderFill--;
 }
@@ -2605,8 +2646,8 @@
   buildCounterTableBorderProperties++;
   if (buildCounterTableBorderProperties < 3) {
     unittest.expect(o.dashStyle, unittest.equals('foo'));
-    checkTableBorderFill(o.tableBorderFill);
-    checkDimension(o.weight);
+    checkTableBorderFill(o.tableBorderFill as api.TableBorderFill);
+    checkDimension(o.weight as api.Dimension);
   }
   buildCounterTableBorderProperties--;
 }
@@ -2620,8 +2661,8 @@
 
 void checkUnnamed1942(core.List<api.TableBorderCell> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableBorderCell(o[0]);
-  checkTableBorderCell(o[1]);
+  checkTableBorderCell(o[0] as api.TableBorderCell);
+  checkTableBorderCell(o[1] as api.TableBorderCell);
 }
 
 core.int buildCounterTableBorderRow = 0;
@@ -2662,10 +2703,10 @@
   buildCounterTableCell++;
   if (buildCounterTableCell < 3) {
     unittest.expect(o.columnSpan, unittest.equals(42));
-    checkTableCellLocation(o.location);
+    checkTableCellLocation(o.location as api.TableCellLocation);
     unittest.expect(o.rowSpan, unittest.equals(42));
-    checkTableCellProperties(o.tableCellProperties);
-    checkTextContent(o.text);
+    checkTableCellProperties(o.tableCellProperties as api.TableCellProperties);
+    checkTextContent(o.text as api.TextContent);
   }
   buildCounterTableCell--;
 }
@@ -2686,7 +2727,7 @@
   buildCounterTableCellBackgroundFill++;
   if (buildCounterTableCellBackgroundFill < 3) {
     unittest.expect(o.propertyState, unittest.equals('foo'));
-    checkSolidFill(o.solidFill);
+    checkSolidFill(o.solidFill as api.SolidFill);
   }
   buildCounterTableCellBackgroundFill--;
 }
@@ -2728,7 +2769,8 @@
   buildCounterTableCellProperties++;
   if (buildCounterTableCellProperties < 3) {
     unittest.expect(o.contentAlignment, unittest.equals('foo'));
-    checkTableCellBackgroundFill(o.tableCellBackgroundFill);
+    checkTableCellBackgroundFill(
+        o.tableCellBackgroundFill as api.TableCellBackgroundFill);
   }
   buildCounterTableCellProperties--;
 }
@@ -2747,7 +2789,7 @@
 void checkTableColumnProperties(api.TableColumnProperties o) {
   buildCounterTableColumnProperties++;
   if (buildCounterTableColumnProperties < 3) {
-    checkDimension(o.columnWidth);
+    checkDimension(o.columnWidth as api.Dimension);
   }
   buildCounterTableColumnProperties--;
 }
@@ -2769,7 +2811,7 @@
   buildCounterTableRange++;
   if (buildCounterTableRange < 3) {
     unittest.expect(o.columnSpan, unittest.equals(42));
-    checkTableCellLocation(o.location);
+    checkTableCellLocation(o.location as api.TableCellLocation);
     unittest.expect(o.rowSpan, unittest.equals(42));
   }
   buildCounterTableRange--;
@@ -2784,8 +2826,8 @@
 
 void checkUnnamed1943(core.List<api.TableCell> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTableCell(o[0]);
-  checkTableCell(o[1]);
+  checkTableCell(o[0] as api.TableCell);
+  checkTableCell(o[1] as api.TableCell);
 }
 
 core.int buildCounterTableRow = 0;
@@ -2804,9 +2846,9 @@
 void checkTableRow(api.TableRow o) {
   buildCounterTableRow++;
   if (buildCounterTableRow < 3) {
-    checkDimension(o.rowHeight);
+    checkDimension(o.rowHeight as api.Dimension);
     checkUnnamed1943(o.tableCells);
-    checkTableRowProperties(o.tableRowProperties);
+    checkTableRowProperties(o.tableRowProperties as api.TableRowProperties);
   }
   buildCounterTableRow--;
 }
@@ -2825,7 +2867,7 @@
 void checkTableRowProperties(api.TableRowProperties o) {
   buildCounterTableRowProperties++;
   if (buildCounterTableRowProperties < 3) {
-    checkDimension(o.minRowHeight);
+    checkDimension(o.minRowHeight as api.Dimension);
   }
   buildCounterTableRowProperties--;
 }
@@ -2839,8 +2881,8 @@
 
 void checkUnnamed1944(core.Map<core.String, api.List> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkList(o['x']);
-  checkList(o['y']);
+  checkList(o['x'] as api.List);
+  checkList(o['y'] as api.List);
 }
 
 core.List<api.TextElement> buildUnnamed1945() {
@@ -2852,8 +2894,8 @@
 
 void checkUnnamed1945(core.List<api.TextElement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTextElement(o[0]);
-  checkTextElement(o[1]);
+  checkTextElement(o[0] as api.TextElement);
+  checkTextElement(o[1] as api.TextElement);
 }
 
 core.int buildCounterTextContent = 0;
@@ -2895,11 +2937,11 @@
 void checkTextElement(api.TextElement o) {
   buildCounterTextElement++;
   if (buildCounterTextElement < 3) {
-    checkAutoText(o.autoText);
+    checkAutoText(o.autoText as api.AutoText);
     unittest.expect(o.endIndex, unittest.equals(42));
-    checkParagraphMarker(o.paragraphMarker);
+    checkParagraphMarker(o.paragraphMarker as api.ParagraphMarker);
     unittest.expect(o.startIndex, unittest.equals(42));
-    checkTextRun(o.textRun);
+    checkTextRun(o.textRun as api.TextRun);
   }
   buildCounterTextElement--;
 }
@@ -2920,7 +2962,7 @@
   buildCounterTextRun++;
   if (buildCounterTextRun < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkTextStyle(o.style);
+    checkTextStyle(o.style as api.TextStyle);
   }
   buildCounterTextRun--;
 }
@@ -2950,18 +2992,18 @@
 void checkTextStyle(api.TextStyle o) {
   buildCounterTextStyle++;
   if (buildCounterTextStyle < 3) {
-    checkOptionalColor(o.backgroundColor);
+    checkOptionalColor(o.backgroundColor as api.OptionalColor);
     unittest.expect(o.baselineOffset, unittest.equals('foo'));
     unittest.expect(o.bold, unittest.isTrue);
     unittest.expect(o.fontFamily, unittest.equals('foo'));
-    checkDimension(o.fontSize);
-    checkOptionalColor(o.foregroundColor);
+    checkDimension(o.fontSize as api.Dimension);
+    checkOptionalColor(o.foregroundColor as api.OptionalColor);
     unittest.expect(o.italic, unittest.isTrue);
-    checkLink(o.link);
+    checkLink(o.link as api.Link);
     unittest.expect(o.smallCaps, unittest.isTrue);
     unittest.expect(o.strikethrough, unittest.isTrue);
     unittest.expect(o.underline, unittest.isTrue);
-    checkWeightedFontFamily(o.weightedFontFamily);
+    checkWeightedFontFamily(o.weightedFontFamily as api.WeightedFontFamily);
   }
   buildCounterTextStyle--;
 }
@@ -2981,7 +3023,7 @@
 void checkThemeColorPair(api.ThemeColorPair o) {
   buildCounterThemeColorPair++;
   if (buildCounterThemeColorPair < 3) {
-    checkRgbColor(o.color);
+    checkRgbColor(o.color as api.RgbColor);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterThemeColorPair--;
@@ -3058,7 +3100,7 @@
   buildCounterUnmergeTableCellsRequest++;
   if (buildCounterUnmergeTableCellsRequest < 3) {
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkTableRange(o.tableRange);
+    checkTableRange(o.tableRange as api.TableRange);
   }
   buildCounterUnmergeTableCellsRequest--;
 }
@@ -3080,7 +3122,7 @@
   buildCounterUpdateImagePropertiesRequest++;
   if (buildCounterUpdateImagePropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkImageProperties(o.imageProperties);
+    checkImageProperties(o.imageProperties as api.ImageProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
   }
   buildCounterUpdateImagePropertiesRequest--;
@@ -3124,7 +3166,7 @@
   buildCounterUpdateLinePropertiesRequest++;
   if (buildCounterUpdateLinePropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
-    checkLineProperties(o.lineProperties);
+    checkLineProperties(o.lineProperties as api.LineProperties);
     unittest.expect(o.objectId, unittest.equals('foo'));
   }
   buildCounterUpdateLinePropertiesRequest--;
@@ -3173,7 +3215,7 @@
   if (buildCounterUpdatePageElementTransformRequest < 3) {
     unittest.expect(o.applyMode, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkAffineTransform(o.transform);
+    checkAffineTransform(o.transform as api.AffineTransform);
   }
   buildCounterUpdatePageElementTransformRequest--;
 }
@@ -3231,7 +3273,7 @@
   if (buildCounterUpdatePagePropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkPageProperties(o.pageProperties);
+    checkPageProperties(o.pageProperties as api.PageProperties);
   }
   buildCounterUpdatePagePropertiesRequest--;
 }
@@ -3254,11 +3296,11 @@
 void checkUpdateParagraphStyleRequest(api.UpdateParagraphStyleRequest o) {
   buildCounterUpdateParagraphStyleRequest++;
   if (buildCounterUpdateParagraphStyleRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkParagraphStyle(o.style);
-    checkRange(o.textRange);
+    checkParagraphStyle(o.style as api.ParagraphStyle);
+    checkRange(o.textRange as api.Range);
   }
   buildCounterUpdateParagraphStyleRequest--;
 }
@@ -3281,7 +3323,7 @@
   if (buildCounterUpdateShapePropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkShapeProperties(o.shapeProperties);
+    checkShapeProperties(o.shapeProperties as api.ShapeProperties);
   }
   buildCounterUpdateShapePropertiesRequest--;
 }
@@ -3343,8 +3385,9 @@
     unittest.expect(o.borderPosition, unittest.equals('foo'));
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkTableBorderProperties(o.tableBorderProperties);
-    checkTableRange(o.tableRange);
+    checkTableBorderProperties(
+        o.tableBorderProperties as api.TableBorderProperties);
+    checkTableRange(o.tableRange as api.TableRange);
   }
   buildCounterUpdateTableBorderPropertiesRequest--;
 }
@@ -3369,8 +3412,8 @@
   if (buildCounterUpdateTableCellPropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkTableCellProperties(o.tableCellProperties);
-    checkTableRange(o.tableRange);
+    checkTableCellProperties(o.tableCellProperties as api.TableCellProperties);
+    checkTableRange(o.tableRange as api.TableRange);
   }
   buildCounterUpdateTableCellPropertiesRequest--;
 }
@@ -3410,7 +3453,8 @@
     checkUnnamed1949(o.columnIndices);
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkTableColumnProperties(o.tableColumnProperties);
+    checkTableColumnProperties(
+        o.tableColumnProperties as api.TableColumnProperties);
   }
   buildCounterUpdateTableColumnPropertiesRequest--;
 }
@@ -3449,7 +3493,7 @@
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
     checkUnnamed1950(o.rowIndices);
-    checkTableRowProperties(o.tableRowProperties);
+    checkTableRowProperties(o.tableRowProperties as api.TableRowProperties);
   }
   buildCounterUpdateTableRowPropertiesRequest--;
 }
@@ -3472,11 +3516,11 @@
 void checkUpdateTextStyleRequest(api.UpdateTextStyleRequest o) {
   buildCounterUpdateTextStyleRequest++;
   if (buildCounterUpdateTextStyleRequest < 3) {
-    checkTableCellLocation(o.cellLocation);
+    checkTableCellLocation(o.cellLocation as api.TableCellLocation);
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkTextStyle(o.style);
-    checkRange(o.textRange);
+    checkTextStyle(o.style as api.TextStyle);
+    checkRange(o.textRange as api.Range);
   }
   buildCounterUpdateTextStyleRequest--;
 }
@@ -3499,7 +3543,7 @@
   if (buildCounterUpdateVideoPropertiesRequest < 3) {
     unittest.expect(o.fields, unittest.equals('foo'));
     unittest.expect(o.objectId, unittest.equals('foo'));
-    checkVideoProperties(o.videoProperties);
+    checkVideoProperties(o.videoProperties as api.VideoProperties);
   }
   buildCounterUpdateVideoPropertiesRequest--;
 }
@@ -3524,7 +3568,7 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.source, unittest.equals('foo'));
     unittest.expect(o.url, unittest.equals('foo'));
-    checkVideoProperties(o.videoProperties);
+    checkVideoProperties(o.videoProperties as api.VideoProperties);
   }
   buildCounterVideo--;
 }
@@ -3550,7 +3594,7 @@
     unittest.expect(o.autoPlay, unittest.isTrue);
     unittest.expect(o.end, unittest.equals(42));
     unittest.expect(o.mute, unittest.isTrue);
-    checkOutline(o.outline);
+    checkOutline(o.outline as api.Outline);
     unittest.expect(o.start, unittest.equals(42));
   }
   buildCounterVideoProperties--;
@@ -3620,7 +3664,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAffineTransform();
       var od = api.AffineTransform.fromJson(o.toJson());
-      checkAffineTransform(od);
+      checkAffineTransform(od as api.AffineTransform);
     });
   });
 
@@ -3628,7 +3672,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAutoText();
       var od = api.AutoText.fromJson(o.toJson());
-      checkAutoText(od);
+      checkAutoText(od as api.AutoText);
     });
   });
 
@@ -3636,7 +3680,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdatePresentationRequest();
       var od = api.BatchUpdatePresentationRequest.fromJson(o.toJson());
-      checkBatchUpdatePresentationRequest(od);
+      checkBatchUpdatePresentationRequest(
+          od as api.BatchUpdatePresentationRequest);
     });
   });
 
@@ -3644,7 +3689,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdatePresentationResponse();
       var od = api.BatchUpdatePresentationResponse.fromJson(o.toJson());
-      checkBatchUpdatePresentationResponse(od);
+      checkBatchUpdatePresentationResponse(
+          od as api.BatchUpdatePresentationResponse);
     });
   });
 
@@ -3652,7 +3698,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBullet();
       var od = api.Bullet.fromJson(o.toJson());
-      checkBullet(od);
+      checkBullet(od as api.Bullet);
     });
   });
 
@@ -3660,7 +3706,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColorScheme();
       var od = api.ColorScheme.fromJson(o.toJson());
-      checkColorScheme(od);
+      checkColorScheme(od as api.ColorScheme);
     });
   });
 
@@ -3668,7 +3714,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColorStop();
       var od = api.ColorStop.fromJson(o.toJson());
-      checkColorStop(od);
+      checkColorStop(od as api.ColorStop);
     });
   });
 
@@ -3676,7 +3722,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateImageRequest();
       var od = api.CreateImageRequest.fromJson(o.toJson());
-      checkCreateImageRequest(od);
+      checkCreateImageRequest(od as api.CreateImageRequest);
     });
   });
 
@@ -3684,7 +3730,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateImageResponse();
       var od = api.CreateImageResponse.fromJson(o.toJson());
-      checkCreateImageResponse(od);
+      checkCreateImageResponse(od as api.CreateImageResponse);
     });
   });
 
@@ -3692,7 +3738,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateLineRequest();
       var od = api.CreateLineRequest.fromJson(o.toJson());
-      checkCreateLineRequest(od);
+      checkCreateLineRequest(od as api.CreateLineRequest);
     });
   });
 
@@ -3700,7 +3746,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateLineResponse();
       var od = api.CreateLineResponse.fromJson(o.toJson());
-      checkCreateLineResponse(od);
+      checkCreateLineResponse(od as api.CreateLineResponse);
     });
   });
 
@@ -3708,7 +3754,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateParagraphBulletsRequest();
       var od = api.CreateParagraphBulletsRequest.fromJson(o.toJson());
-      checkCreateParagraphBulletsRequest(od);
+      checkCreateParagraphBulletsRequest(
+          od as api.CreateParagraphBulletsRequest);
     });
   });
 
@@ -3716,7 +3763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateShapeRequest();
       var od = api.CreateShapeRequest.fromJson(o.toJson());
-      checkCreateShapeRequest(od);
+      checkCreateShapeRequest(od as api.CreateShapeRequest);
     });
   });
 
@@ -3724,7 +3771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateShapeResponse();
       var od = api.CreateShapeResponse.fromJson(o.toJson());
-      checkCreateShapeResponse(od);
+      checkCreateShapeResponse(od as api.CreateShapeResponse);
     });
   });
 
@@ -3732,7 +3779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSheetsChartRequest();
       var od = api.CreateSheetsChartRequest.fromJson(o.toJson());
-      checkCreateSheetsChartRequest(od);
+      checkCreateSheetsChartRequest(od as api.CreateSheetsChartRequest);
     });
   });
 
@@ -3740,7 +3787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSheetsChartResponse();
       var od = api.CreateSheetsChartResponse.fromJson(o.toJson());
-      checkCreateSheetsChartResponse(od);
+      checkCreateSheetsChartResponse(od as api.CreateSheetsChartResponse);
     });
   });
 
@@ -3748,7 +3795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSlideRequest();
       var od = api.CreateSlideRequest.fromJson(o.toJson());
-      checkCreateSlideRequest(od);
+      checkCreateSlideRequest(od as api.CreateSlideRequest);
     });
   });
 
@@ -3756,7 +3803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSlideResponse();
       var od = api.CreateSlideResponse.fromJson(o.toJson());
-      checkCreateSlideResponse(od);
+      checkCreateSlideResponse(od as api.CreateSlideResponse);
     });
   });
 
@@ -3764,7 +3811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateTableRequest();
       var od = api.CreateTableRequest.fromJson(o.toJson());
-      checkCreateTableRequest(od);
+      checkCreateTableRequest(od as api.CreateTableRequest);
     });
   });
 
@@ -3772,7 +3819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateTableResponse();
       var od = api.CreateTableResponse.fromJson(o.toJson());
-      checkCreateTableResponse(od);
+      checkCreateTableResponse(od as api.CreateTableResponse);
     });
   });
 
@@ -3780,7 +3827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateVideoRequest();
       var od = api.CreateVideoRequest.fromJson(o.toJson());
-      checkCreateVideoRequest(od);
+      checkCreateVideoRequest(od as api.CreateVideoRequest);
     });
   });
 
@@ -3788,7 +3835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateVideoResponse();
       var od = api.CreateVideoResponse.fromJson(o.toJson());
-      checkCreateVideoResponse(od);
+      checkCreateVideoResponse(od as api.CreateVideoResponse);
     });
   });
 
@@ -3796,7 +3843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCropProperties();
       var od = api.CropProperties.fromJson(o.toJson());
-      checkCropProperties(od);
+      checkCropProperties(od as api.CropProperties);
     });
   });
 
@@ -3804,7 +3851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteObjectRequest();
       var od = api.DeleteObjectRequest.fromJson(o.toJson());
-      checkDeleteObjectRequest(od);
+      checkDeleteObjectRequest(od as api.DeleteObjectRequest);
     });
   });
 
@@ -3812,7 +3859,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteParagraphBulletsRequest();
       var od = api.DeleteParagraphBulletsRequest.fromJson(o.toJson());
-      checkDeleteParagraphBulletsRequest(od);
+      checkDeleteParagraphBulletsRequest(
+          od as api.DeleteParagraphBulletsRequest);
     });
   });
 
@@ -3820,7 +3868,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteTableColumnRequest();
       var od = api.DeleteTableColumnRequest.fromJson(o.toJson());
-      checkDeleteTableColumnRequest(od);
+      checkDeleteTableColumnRequest(od as api.DeleteTableColumnRequest);
     });
   });
 
@@ -3828,7 +3876,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteTableRowRequest();
       var od = api.DeleteTableRowRequest.fromJson(o.toJson());
-      checkDeleteTableRowRequest(od);
+      checkDeleteTableRowRequest(od as api.DeleteTableRowRequest);
     });
   });
 
@@ -3836,7 +3884,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeleteTextRequest();
       var od = api.DeleteTextRequest.fromJson(o.toJson());
-      checkDeleteTextRequest(od);
+      checkDeleteTextRequest(od as api.DeleteTextRequest);
     });
   });
 
@@ -3844,7 +3892,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDimension();
       var od = api.Dimension.fromJson(o.toJson());
-      checkDimension(od);
+      checkDimension(od as api.Dimension);
     });
   });
 
@@ -3852,7 +3900,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDuplicateObjectRequest();
       var od = api.DuplicateObjectRequest.fromJson(o.toJson());
-      checkDuplicateObjectRequest(od);
+      checkDuplicateObjectRequest(od as api.DuplicateObjectRequest);
     });
   });
 
@@ -3860,7 +3908,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDuplicateObjectResponse();
       var od = api.DuplicateObjectResponse.fromJson(o.toJson());
-      checkDuplicateObjectResponse(od);
+      checkDuplicateObjectResponse(od as api.DuplicateObjectResponse);
     });
   });
 
@@ -3868,7 +3916,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroup();
       var od = api.Group.fromJson(o.toJson());
-      checkGroup(od);
+      checkGroup(od as api.Group);
     });
   });
 
@@ -3876,7 +3924,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupObjectsRequest();
       var od = api.GroupObjectsRequest.fromJson(o.toJson());
-      checkGroupObjectsRequest(od);
+      checkGroupObjectsRequest(od as api.GroupObjectsRequest);
     });
   });
 
@@ -3884,7 +3932,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupObjectsResponse();
       var od = api.GroupObjectsResponse.fromJson(o.toJson());
-      checkGroupObjectsResponse(od);
+      checkGroupObjectsResponse(od as api.GroupObjectsResponse);
     });
   });
 
@@ -3892,7 +3940,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImage();
       var od = api.Image.fromJson(o.toJson());
-      checkImage(od);
+      checkImage(od as api.Image);
     });
   });
 
@@ -3900,7 +3948,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageProperties();
       var od = api.ImageProperties.fromJson(o.toJson());
-      checkImageProperties(od);
+      checkImageProperties(od as api.ImageProperties);
     });
   });
 
@@ -3908,7 +3956,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertTableColumnsRequest();
       var od = api.InsertTableColumnsRequest.fromJson(o.toJson());
-      checkInsertTableColumnsRequest(od);
+      checkInsertTableColumnsRequest(od as api.InsertTableColumnsRequest);
     });
   });
 
@@ -3916,7 +3964,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertTableRowsRequest();
       var od = api.InsertTableRowsRequest.fromJson(o.toJson());
-      checkInsertTableRowsRequest(od);
+      checkInsertTableRowsRequest(od as api.InsertTableRowsRequest);
     });
   });
 
@@ -3924,7 +3972,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInsertTextRequest();
       var od = api.InsertTextRequest.fromJson(o.toJson());
-      checkInsertTextRequest(od);
+      checkInsertTextRequest(od as api.InsertTextRequest);
     });
   });
 
@@ -3932,7 +3980,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLayoutPlaceholderIdMapping();
       var od = api.LayoutPlaceholderIdMapping.fromJson(o.toJson());
-      checkLayoutPlaceholderIdMapping(od);
+      checkLayoutPlaceholderIdMapping(od as api.LayoutPlaceholderIdMapping);
     });
   });
 
@@ -3940,7 +3988,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLayoutProperties();
       var od = api.LayoutProperties.fromJson(o.toJson());
-      checkLayoutProperties(od);
+      checkLayoutProperties(od as api.LayoutProperties);
     });
   });
 
@@ -3948,7 +3996,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLayoutReference();
       var od = api.LayoutReference.fromJson(o.toJson());
-      checkLayoutReference(od);
+      checkLayoutReference(od as api.LayoutReference);
     });
   });
 
@@ -3956,7 +4004,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLine();
       var od = api.Line.fromJson(o.toJson());
-      checkLine(od);
+      checkLine(od as api.Line);
     });
   });
 
@@ -3964,7 +4012,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLineConnection();
       var od = api.LineConnection.fromJson(o.toJson());
-      checkLineConnection(od);
+      checkLineConnection(od as api.LineConnection);
     });
   });
 
@@ -3972,7 +4020,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLineFill();
       var od = api.LineFill.fromJson(o.toJson());
-      checkLineFill(od);
+      checkLineFill(od as api.LineFill);
     });
   });
 
@@ -3980,7 +4028,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLineProperties();
       var od = api.LineProperties.fromJson(o.toJson());
-      checkLineProperties(od);
+      checkLineProperties(od as api.LineProperties);
     });
   });
 
@@ -3988,7 +4036,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLink();
       var od = api.Link.fromJson(o.toJson());
-      checkLink(od);
+      checkLink(od as api.Link);
     });
   });
 
@@ -3996,7 +4044,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildList();
       var od = api.List.fromJson(o.toJson());
-      checkList(od);
+      checkList(od as api.List);
     });
   });
 
@@ -4004,7 +4052,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMasterProperties();
       var od = api.MasterProperties.fromJson(o.toJson());
-      checkMasterProperties(od);
+      checkMasterProperties(od as api.MasterProperties);
     });
   });
 
@@ -4012,7 +4060,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMergeTableCellsRequest();
       var od = api.MergeTableCellsRequest.fromJson(o.toJson());
-      checkMergeTableCellsRequest(od);
+      checkMergeTableCellsRequest(od as api.MergeTableCellsRequest);
     });
   });
 
@@ -4020,7 +4068,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNestingLevel();
       var od = api.NestingLevel.fromJson(o.toJson());
-      checkNestingLevel(od);
+      checkNestingLevel(od as api.NestingLevel);
     });
   });
 
@@ -4028,7 +4076,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotesProperties();
       var od = api.NotesProperties.fromJson(o.toJson());
-      checkNotesProperties(od);
+      checkNotesProperties(od as api.NotesProperties);
     });
   });
 
@@ -4036,7 +4084,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOpaqueColor();
       var od = api.OpaqueColor.fromJson(o.toJson());
-      checkOpaqueColor(od);
+      checkOpaqueColor(od as api.OpaqueColor);
     });
   });
 
@@ -4044,7 +4092,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOptionalColor();
       var od = api.OptionalColor.fromJson(o.toJson());
-      checkOptionalColor(od);
+      checkOptionalColor(od as api.OptionalColor);
     });
   });
 
@@ -4052,7 +4100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutline();
       var od = api.Outline.fromJson(o.toJson());
-      checkOutline(od);
+      checkOutline(od as api.Outline);
     });
   });
 
@@ -4060,7 +4108,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutlineFill();
       var od = api.OutlineFill.fromJson(o.toJson());
-      checkOutlineFill(od);
+      checkOutlineFill(od as api.OutlineFill);
     });
   });
 
@@ -4068,7 +4116,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPage();
       var od = api.Page.fromJson(o.toJson());
-      checkPage(od);
+      checkPage(od as api.Page);
     });
   });
 
@@ -4076,7 +4124,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageBackgroundFill();
       var od = api.PageBackgroundFill.fromJson(o.toJson());
-      checkPageBackgroundFill(od);
+      checkPageBackgroundFill(od as api.PageBackgroundFill);
     });
   });
 
@@ -4084,7 +4132,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageElement();
       var od = api.PageElement.fromJson(o.toJson());
-      checkPageElement(od);
+      checkPageElement(od as api.PageElement);
     });
   });
 
@@ -4092,7 +4140,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageElementProperties();
       var od = api.PageElementProperties.fromJson(o.toJson());
-      checkPageElementProperties(od);
+      checkPageElementProperties(od as api.PageElementProperties);
     });
   });
 
@@ -4100,7 +4148,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageProperties();
       var od = api.PageProperties.fromJson(o.toJson());
-      checkPageProperties(od);
+      checkPageProperties(od as api.PageProperties);
     });
   });
 
@@ -4108,7 +4156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraphMarker();
       var od = api.ParagraphMarker.fromJson(o.toJson());
-      checkParagraphMarker(od);
+      checkParagraphMarker(od as api.ParagraphMarker);
     });
   });
 
@@ -4116,7 +4164,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraphStyle();
       var od = api.ParagraphStyle.fromJson(o.toJson());
-      checkParagraphStyle(od);
+      checkParagraphStyle(od as api.ParagraphStyle);
     });
   });
 
@@ -4124,7 +4172,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaceholder();
       var od = api.Placeholder.fromJson(o.toJson());
-      checkPlaceholder(od);
+      checkPlaceholder(od as api.Placeholder);
     });
   });
 
@@ -4132,7 +4180,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPresentation();
       var od = api.Presentation.fromJson(o.toJson());
-      checkPresentation(od);
+      checkPresentation(od as api.Presentation);
     });
   });
 
@@ -4140,7 +4188,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRange();
       var od = api.Range.fromJson(o.toJson());
-      checkRange(od);
+      checkRange(od as api.Range);
     });
   });
 
@@ -4148,7 +4196,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecolor();
       var od = api.Recolor.fromJson(o.toJson());
-      checkRecolor(od);
+      checkRecolor(od as api.Recolor);
     });
   });
 
@@ -4156,7 +4204,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRefreshSheetsChartRequest();
       var od = api.RefreshSheetsChartRequest.fromJson(o.toJson());
-      checkRefreshSheetsChartRequest(od);
+      checkRefreshSheetsChartRequest(od as api.RefreshSheetsChartRequest);
     });
   });
 
@@ -4164,7 +4212,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllShapesWithImageRequest();
       var od = api.ReplaceAllShapesWithImageRequest.fromJson(o.toJson());
-      checkReplaceAllShapesWithImageRequest(od);
+      checkReplaceAllShapesWithImageRequest(
+          od as api.ReplaceAllShapesWithImageRequest);
     });
   });
 
@@ -4172,7 +4221,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllShapesWithImageResponse();
       var od = api.ReplaceAllShapesWithImageResponse.fromJson(o.toJson());
-      checkReplaceAllShapesWithImageResponse(od);
+      checkReplaceAllShapesWithImageResponse(
+          od as api.ReplaceAllShapesWithImageResponse);
     });
   });
 
@@ -4180,7 +4230,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllShapesWithSheetsChartRequest();
       var od = api.ReplaceAllShapesWithSheetsChartRequest.fromJson(o.toJson());
-      checkReplaceAllShapesWithSheetsChartRequest(od);
+      checkReplaceAllShapesWithSheetsChartRequest(
+          od as api.ReplaceAllShapesWithSheetsChartRequest);
     });
   });
 
@@ -4188,7 +4239,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllShapesWithSheetsChartResponse();
       var od = api.ReplaceAllShapesWithSheetsChartResponse.fromJson(o.toJson());
-      checkReplaceAllShapesWithSheetsChartResponse(od);
+      checkReplaceAllShapesWithSheetsChartResponse(
+          od as api.ReplaceAllShapesWithSheetsChartResponse);
     });
   });
 
@@ -4196,7 +4248,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllTextRequest();
       var od = api.ReplaceAllTextRequest.fromJson(o.toJson());
-      checkReplaceAllTextRequest(od);
+      checkReplaceAllTextRequest(od as api.ReplaceAllTextRequest);
     });
   });
 
@@ -4204,7 +4256,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceAllTextResponse();
       var od = api.ReplaceAllTextResponse.fromJson(o.toJson());
-      checkReplaceAllTextResponse(od);
+      checkReplaceAllTextResponse(od as api.ReplaceAllTextResponse);
     });
   });
 
@@ -4212,7 +4264,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplaceImageRequest();
       var od = api.ReplaceImageRequest.fromJson(o.toJson());
-      checkReplaceImageRequest(od);
+      checkReplaceImageRequest(od as api.ReplaceImageRequest);
     });
   });
 
@@ -4220,7 +4272,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRequest();
       var od = api.Request.fromJson(o.toJson());
-      checkRequest(od);
+      checkRequest(od as api.Request);
     });
   });
 
@@ -4228,7 +4280,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRerouteLineRequest();
       var od = api.RerouteLineRequest.fromJson(o.toJson());
-      checkRerouteLineRequest(od);
+      checkRerouteLineRequest(od as api.RerouteLineRequest);
     });
   });
 
@@ -4236,7 +4288,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResponse();
       var od = api.Response.fromJson(o.toJson());
-      checkResponse(od);
+      checkResponse(od as api.Response);
     });
   });
 
@@ -4244,7 +4296,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRgbColor();
       var od = api.RgbColor.fromJson(o.toJson());
-      checkRgbColor(od);
+      checkRgbColor(od as api.RgbColor);
     });
   });
 
@@ -4252,7 +4304,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShadow();
       var od = api.Shadow.fromJson(o.toJson());
-      checkShadow(od);
+      checkShadow(od as api.Shadow);
     });
   });
 
@@ -4260,7 +4312,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShape();
       var od = api.Shape.fromJson(o.toJson());
-      checkShape(od);
+      checkShape(od as api.Shape);
     });
   });
 
@@ -4268,7 +4320,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShapeBackgroundFill();
       var od = api.ShapeBackgroundFill.fromJson(o.toJson());
-      checkShapeBackgroundFill(od);
+      checkShapeBackgroundFill(od as api.ShapeBackgroundFill);
     });
   });
 
@@ -4276,7 +4328,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShapeProperties();
       var od = api.ShapeProperties.fromJson(o.toJson());
-      checkShapeProperties(od);
+      checkShapeProperties(od as api.ShapeProperties);
     });
   });
 
@@ -4284,7 +4336,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSheetsChart();
       var od = api.SheetsChart.fromJson(o.toJson());
-      checkSheetsChart(od);
+      checkSheetsChart(od as api.SheetsChart);
     });
   });
 
@@ -4292,7 +4344,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSheetsChartProperties();
       var od = api.SheetsChartProperties.fromJson(o.toJson());
-      checkSheetsChartProperties(od);
+      checkSheetsChartProperties(od as api.SheetsChartProperties);
     });
   });
 
@@ -4300,7 +4352,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSize();
       var od = api.Size.fromJson(o.toJson());
-      checkSize(od);
+      checkSize(od as api.Size);
     });
   });
 
@@ -4308,7 +4360,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSlideProperties();
       var od = api.SlideProperties.fromJson(o.toJson());
-      checkSlideProperties(od);
+      checkSlideProperties(od as api.SlideProperties);
     });
   });
 
@@ -4316,7 +4368,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSolidFill();
       var od = api.SolidFill.fromJson(o.toJson());
-      checkSolidFill(od);
+      checkSolidFill(od as api.SolidFill);
     });
   });
 
@@ -4324,7 +4376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStretchedPictureFill();
       var od = api.StretchedPictureFill.fromJson(o.toJson());
-      checkStretchedPictureFill(od);
+      checkStretchedPictureFill(od as api.StretchedPictureFill);
     });
   });
 
@@ -4332,7 +4384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubstringMatchCriteria();
       var od = api.SubstringMatchCriteria.fromJson(o.toJson());
-      checkSubstringMatchCriteria(od);
+      checkSubstringMatchCriteria(od as api.SubstringMatchCriteria);
     });
   });
 
@@ -4340,7 +4392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTable();
       var od = api.Table.fromJson(o.toJson());
-      checkTable(od);
+      checkTable(od as api.Table);
     });
   });
 
@@ -4348,7 +4400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableBorderCell();
       var od = api.TableBorderCell.fromJson(o.toJson());
-      checkTableBorderCell(od);
+      checkTableBorderCell(od as api.TableBorderCell);
     });
   });
 
@@ -4356,7 +4408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableBorderFill();
       var od = api.TableBorderFill.fromJson(o.toJson());
-      checkTableBorderFill(od);
+      checkTableBorderFill(od as api.TableBorderFill);
     });
   });
 
@@ -4364,7 +4416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableBorderProperties();
       var od = api.TableBorderProperties.fromJson(o.toJson());
-      checkTableBorderProperties(od);
+      checkTableBorderProperties(od as api.TableBorderProperties);
     });
   });
 
@@ -4372,7 +4424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableBorderRow();
       var od = api.TableBorderRow.fromJson(o.toJson());
-      checkTableBorderRow(od);
+      checkTableBorderRow(od as api.TableBorderRow);
     });
   });
 
@@ -4380,7 +4432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCell();
       var od = api.TableCell.fromJson(o.toJson());
-      checkTableCell(od);
+      checkTableCell(od as api.TableCell);
     });
   });
 
@@ -4388,7 +4440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCellBackgroundFill();
       var od = api.TableCellBackgroundFill.fromJson(o.toJson());
-      checkTableCellBackgroundFill(od);
+      checkTableCellBackgroundFill(od as api.TableCellBackgroundFill);
     });
   });
 
@@ -4396,7 +4448,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCellLocation();
       var od = api.TableCellLocation.fromJson(o.toJson());
-      checkTableCellLocation(od);
+      checkTableCellLocation(od as api.TableCellLocation);
     });
   });
 
@@ -4404,7 +4456,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableCellProperties();
       var od = api.TableCellProperties.fromJson(o.toJson());
-      checkTableCellProperties(od);
+      checkTableCellProperties(od as api.TableCellProperties);
     });
   });
 
@@ -4412,7 +4464,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableColumnProperties();
       var od = api.TableColumnProperties.fromJson(o.toJson());
-      checkTableColumnProperties(od);
+      checkTableColumnProperties(od as api.TableColumnProperties);
     });
   });
 
@@ -4420,7 +4472,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRange();
       var od = api.TableRange.fromJson(o.toJson());
-      checkTableRange(od);
+      checkTableRange(od as api.TableRange);
     });
   });
 
@@ -4428,7 +4480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRow();
       var od = api.TableRow.fromJson(o.toJson());
-      checkTableRow(od);
+      checkTableRow(od as api.TableRow);
     });
   });
 
@@ -4436,7 +4488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTableRowProperties();
       var od = api.TableRowProperties.fromJson(o.toJson());
-      checkTableRowProperties(od);
+      checkTableRowProperties(od as api.TableRowProperties);
     });
   });
 
@@ -4444,7 +4496,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextContent();
       var od = api.TextContent.fromJson(o.toJson());
-      checkTextContent(od);
+      checkTextContent(od as api.TextContent);
     });
   });
 
@@ -4452,7 +4504,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextElement();
       var od = api.TextElement.fromJson(o.toJson());
-      checkTextElement(od);
+      checkTextElement(od as api.TextElement);
     });
   });
 
@@ -4460,7 +4512,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextRun();
       var od = api.TextRun.fromJson(o.toJson());
-      checkTextRun(od);
+      checkTextRun(od as api.TextRun);
     });
   });
 
@@ -4468,7 +4520,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextStyle();
       var od = api.TextStyle.fromJson(o.toJson());
-      checkTextStyle(od);
+      checkTextStyle(od as api.TextStyle);
     });
   });
 
@@ -4476,7 +4528,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThemeColorPair();
       var od = api.ThemeColorPair.fromJson(o.toJson());
-      checkThemeColorPair(od);
+      checkThemeColorPair(od as api.ThemeColorPair);
     });
   });
 
@@ -4484,7 +4536,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThumbnail();
       var od = api.Thumbnail.fromJson(o.toJson());
-      checkThumbnail(od);
+      checkThumbnail(od as api.Thumbnail);
     });
   });
 
@@ -4492,7 +4544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUngroupObjectsRequest();
       var od = api.UngroupObjectsRequest.fromJson(o.toJson());
-      checkUngroupObjectsRequest(od);
+      checkUngroupObjectsRequest(od as api.UngroupObjectsRequest);
     });
   });
 
@@ -4500,7 +4552,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUnmergeTableCellsRequest();
       var od = api.UnmergeTableCellsRequest.fromJson(o.toJson());
-      checkUnmergeTableCellsRequest(od);
+      checkUnmergeTableCellsRequest(od as api.UnmergeTableCellsRequest);
     });
   });
 
@@ -4508,7 +4560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateImagePropertiesRequest();
       var od = api.UpdateImagePropertiesRequest.fromJson(o.toJson());
-      checkUpdateImagePropertiesRequest(od);
+      checkUpdateImagePropertiesRequest(od as api.UpdateImagePropertiesRequest);
     });
   });
 
@@ -4516,7 +4568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateLineCategoryRequest();
       var od = api.UpdateLineCategoryRequest.fromJson(o.toJson());
-      checkUpdateLineCategoryRequest(od);
+      checkUpdateLineCategoryRequest(od as api.UpdateLineCategoryRequest);
     });
   });
 
@@ -4524,7 +4576,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateLinePropertiesRequest();
       var od = api.UpdateLinePropertiesRequest.fromJson(o.toJson());
-      checkUpdateLinePropertiesRequest(od);
+      checkUpdateLinePropertiesRequest(od as api.UpdateLinePropertiesRequest);
     });
   });
 
@@ -4532,7 +4584,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdatePageElementAltTextRequest();
       var od = api.UpdatePageElementAltTextRequest.fromJson(o.toJson());
-      checkUpdatePageElementAltTextRequest(od);
+      checkUpdatePageElementAltTextRequest(
+          od as api.UpdatePageElementAltTextRequest);
     });
   });
 
@@ -4540,7 +4593,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdatePageElementTransformRequest();
       var od = api.UpdatePageElementTransformRequest.fromJson(o.toJson());
-      checkUpdatePageElementTransformRequest(od);
+      checkUpdatePageElementTransformRequest(
+          od as api.UpdatePageElementTransformRequest);
     });
   });
 
@@ -4548,7 +4602,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdatePageElementsZOrderRequest();
       var od = api.UpdatePageElementsZOrderRequest.fromJson(o.toJson());
-      checkUpdatePageElementsZOrderRequest(od);
+      checkUpdatePageElementsZOrderRequest(
+          od as api.UpdatePageElementsZOrderRequest);
     });
   });
 
@@ -4556,7 +4611,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdatePagePropertiesRequest();
       var od = api.UpdatePagePropertiesRequest.fromJson(o.toJson());
-      checkUpdatePagePropertiesRequest(od);
+      checkUpdatePagePropertiesRequest(od as api.UpdatePagePropertiesRequest);
     });
   });
 
@@ -4564,7 +4619,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateParagraphStyleRequest();
       var od = api.UpdateParagraphStyleRequest.fromJson(o.toJson());
-      checkUpdateParagraphStyleRequest(od);
+      checkUpdateParagraphStyleRequest(od as api.UpdateParagraphStyleRequest);
     });
   });
 
@@ -4572,7 +4627,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateShapePropertiesRequest();
       var od = api.UpdateShapePropertiesRequest.fromJson(o.toJson());
-      checkUpdateShapePropertiesRequest(od);
+      checkUpdateShapePropertiesRequest(od as api.UpdateShapePropertiesRequest);
     });
   });
 
@@ -4580,7 +4635,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateSlidesPositionRequest();
       var od = api.UpdateSlidesPositionRequest.fromJson(o.toJson());
-      checkUpdateSlidesPositionRequest(od);
+      checkUpdateSlidesPositionRequest(od as api.UpdateSlidesPositionRequest);
     });
   });
 
@@ -4588,7 +4643,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTableBorderPropertiesRequest();
       var od = api.UpdateTableBorderPropertiesRequest.fromJson(o.toJson());
-      checkUpdateTableBorderPropertiesRequest(od);
+      checkUpdateTableBorderPropertiesRequest(
+          od as api.UpdateTableBorderPropertiesRequest);
     });
   });
 
@@ -4596,7 +4652,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTableCellPropertiesRequest();
       var od = api.UpdateTableCellPropertiesRequest.fromJson(o.toJson());
-      checkUpdateTableCellPropertiesRequest(od);
+      checkUpdateTableCellPropertiesRequest(
+          od as api.UpdateTableCellPropertiesRequest);
     });
   });
 
@@ -4604,7 +4661,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTableColumnPropertiesRequest();
       var od = api.UpdateTableColumnPropertiesRequest.fromJson(o.toJson());
-      checkUpdateTableColumnPropertiesRequest(od);
+      checkUpdateTableColumnPropertiesRequest(
+          od as api.UpdateTableColumnPropertiesRequest);
     });
   });
 
@@ -4612,7 +4670,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTableRowPropertiesRequest();
       var od = api.UpdateTableRowPropertiesRequest.fromJson(o.toJson());
-      checkUpdateTableRowPropertiesRequest(od);
+      checkUpdateTableRowPropertiesRequest(
+          od as api.UpdateTableRowPropertiesRequest);
     });
   });
 
@@ -4620,7 +4679,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTextStyleRequest();
       var od = api.UpdateTextStyleRequest.fromJson(o.toJson());
-      checkUpdateTextStyleRequest(od);
+      checkUpdateTextStyleRequest(od as api.UpdateTextStyleRequest);
     });
   });
 
@@ -4628,7 +4687,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateVideoPropertiesRequest();
       var od = api.UpdateVideoPropertiesRequest.fromJson(o.toJson());
-      checkUpdateVideoPropertiesRequest(od);
+      checkUpdateVideoPropertiesRequest(od as api.UpdateVideoPropertiesRequest);
     });
   });
 
@@ -4636,7 +4695,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideo();
       var od = api.Video.fromJson(o.toJson());
-      checkVideo(od);
+      checkVideo(od as api.Video);
     });
   });
 
@@ -4644,7 +4703,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoProperties();
       var od = api.VideoProperties.fromJson(o.toJson());
-      checkVideoProperties(od);
+      checkVideoProperties(od as api.VideoProperties);
     });
   });
 
@@ -4652,7 +4711,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWeightedFontFamily();
       var od = api.WeightedFontFamily.fromJson(o.toJson());
-      checkWeightedFontFamily(od);
+      checkWeightedFontFamily(od as api.WeightedFontFamily);
     });
   });
 
@@ -4660,7 +4719,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWordArt();
       var od = api.WordArt.fromJson(o.toJson());
-      checkWordArt(od);
+      checkWordArt(od as api.WordArt);
     });
   });
 
@@ -4668,7 +4727,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWriteControl();
       var od = api.WriteControl.fromJson(o.toJson());
-      checkWriteControl(od);
+      checkWriteControl(od as api.WriteControl);
     });
   });
 
@@ -4680,8 +4739,10 @@
       var arg_presentationId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchUpdatePresentationRequest.fromJson(json);
-        checkBatchUpdatePresentationRequest(obj);
+        var obj = api.BatchUpdatePresentationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchUpdatePresentationRequest(
+            obj as api.BatchUpdatePresentationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4729,7 +4790,8 @@
       res
           .batchUpdate(arg_request, arg_presentationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchUpdatePresentationResponse(response);
+        checkBatchUpdatePresentationResponse(
+            response as api.BatchUpdatePresentationResponse);
       })));
     });
 
@@ -4739,8 +4801,9 @@
       var arg_request = buildPresentation();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Presentation.fromJson(json);
-        checkPresentation(obj);
+        var obj = api.Presentation.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPresentation(obj as api.Presentation);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4779,7 +4842,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPresentation(response);
+        checkPresentation(response as api.Presentation);
       })));
     });
 
@@ -4827,7 +4890,7 @@
       res
           .get(arg_presentationId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPresentation(response);
+        checkPresentation(response as api.Presentation);
       })));
     });
   });
@@ -4889,7 +4952,7 @@
       res
           .get(arg_presentationId, arg_pageObjectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPage(response);
+        checkPage(response as api.Page);
       })));
     });
 
@@ -4965,7 +5028,7 @@
                   arg_thumbnailProperties_thumbnailSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThumbnail(response);
+        checkThumbnail(response as api.Thumbnail);
       })));
     });
   });
diff --git a/generated/googleapis/test/sourcerepo/v1_test.dart b/generated/googleapis/test/sourcerepo/v1_test.dart
index 7162a2d..a508874 100644
--- a/generated/googleapis/test/sourcerepo/v1_test.dart
+++ b/generated/googleapis/test/sourcerepo/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed3239(core.List<api.AuditLogConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditLogConfig(o[0]);
-  checkAuditLogConfig(o[1]);
+  checkAuditLogConfig(o[0] as api.AuditLogConfig);
+  checkAuditLogConfig(o[1] as api.AuditLogConfig);
 }
 
 core.int buildCounterAuditConfig = 0;
@@ -171,7 +171,7 @@
 void checkBinding(api.Binding o) {
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed3241(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -227,8 +227,8 @@
 
 void checkUnnamed3242(core.List<api.Repo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRepo(o[0]);
-  checkRepo(o[1]);
+  checkRepo(o[0] as api.Repo);
+  checkRepo(o[1] as api.Repo);
 }
 
 core.int buildCounterListReposResponse = 0;
@@ -352,7 +352,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3243(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3244(o.response);
@@ -369,8 +369,8 @@
 
 void checkUnnamed3245(core.List<api.AuditConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAuditConfig(o[0]);
-  checkAuditConfig(o[1]);
+  checkAuditConfig(o[0] as api.AuditConfig);
+  checkAuditConfig(o[1] as api.AuditConfig);
 }
 
 core.List<api.Binding> buildUnnamed3246() {
@@ -382,8 +382,8 @@
 
 void checkUnnamed3246(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -420,8 +420,8 @@
 
 void checkUnnamed3247(core.Map<core.String, api.PubsubConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPubsubConfig(o['x']);
-  checkPubsubConfig(o['y']);
+  checkPubsubConfig(o['x'] as api.PubsubConfig);
+  checkPubsubConfig(o['y'] as api.PubsubConfig);
 }
 
 core.int buildCounterProjectConfig = 0;
@@ -479,8 +479,8 @@
 
 void checkUnnamed3248(core.Map<core.String, api.PubsubConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPubsubConfig(o['x']);
-  checkPubsubConfig(o['y']);
+  checkPubsubConfig(o['x'] as api.PubsubConfig);
+  checkPubsubConfig(o['y'] as api.PubsubConfig);
 }
 
 core.int buildCounterRepo = 0;
@@ -501,7 +501,7 @@
 void checkRepo(api.Repo o) {
   buildCounterRepo++;
   if (buildCounterRepo < 3) {
-    checkMirrorConfig(o.mirrorConfig);
+    checkMirrorConfig(o.mirrorConfig as api.MirrorConfig);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3248(o.pubsubConfigs);
     unittest.expect(o.size, unittest.equals('foo'));
@@ -525,7 +525,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterSetIamPolicyRequest--;
@@ -715,7 +715,7 @@
 void checkUpdateProjectConfigRequest(api.UpdateProjectConfigRequest o) {
   buildCounterUpdateProjectConfigRequest++;
   if (buildCounterUpdateProjectConfigRequest < 3) {
-    checkProjectConfig(o.projectConfig);
+    checkProjectConfig(o.projectConfig as api.ProjectConfig);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateProjectConfigRequest--;
@@ -736,7 +736,7 @@
 void checkUpdateRepoRequest(api.UpdateRepoRequest o) {
   buildCounterUpdateRepoRequest++;
   if (buildCounterUpdateRepoRequest < 3) {
-    checkRepo(o.repo);
+    checkRepo(o.repo as api.Repo);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdateRepoRequest--;
@@ -747,7 +747,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditConfig();
       var od = api.AuditConfig.fromJson(o.toJson());
-      checkAuditConfig(od);
+      checkAuditConfig(od as api.AuditConfig);
     });
   });
 
@@ -755,7 +755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuditLogConfig();
       var od = api.AuditLogConfig.fromJson(o.toJson());
-      checkAuditLogConfig(od);
+      checkAuditLogConfig(od as api.AuditLogConfig);
     });
   });
 
@@ -763,7 +763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -771,7 +771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -779,7 +779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -787,7 +787,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListReposResponse();
       var od = api.ListReposResponse.fromJson(o.toJson());
-      checkListReposResponse(od);
+      checkListReposResponse(od as api.ListReposResponse);
     });
   });
 
@@ -795,7 +795,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMirrorConfig();
       var od = api.MirrorConfig.fromJson(o.toJson());
-      checkMirrorConfig(od);
+      checkMirrorConfig(od as api.MirrorConfig);
     });
   });
 
@@ -803,7 +803,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -811,7 +811,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -819,7 +819,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProjectConfig();
       var od = api.ProjectConfig.fromJson(o.toJson());
-      checkProjectConfig(od);
+      checkProjectConfig(od as api.ProjectConfig);
     });
   });
 
@@ -827,7 +827,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPubsubConfig();
       var od = api.PubsubConfig.fromJson(o.toJson());
-      checkPubsubConfig(od);
+      checkPubsubConfig(od as api.PubsubConfig);
     });
   });
 
@@ -835,7 +835,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRepo();
       var od = api.Repo.fromJson(o.toJson());
-      checkRepo(od);
+      checkRepo(od as api.Repo);
     });
   });
 
@@ -843,7 +843,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -851,7 +851,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -859,7 +859,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSyncRepoMetadata();
       var od = api.SyncRepoMetadata.fromJson(o.toJson());
-      checkSyncRepoMetadata(od);
+      checkSyncRepoMetadata(od as api.SyncRepoMetadata);
     });
   });
 
@@ -867,7 +867,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSyncRepoRequest();
       var od = api.SyncRepoRequest.fromJson(o.toJson());
-      checkSyncRepoRequest(od);
+      checkSyncRepoRequest(od as api.SyncRepoRequest);
     });
   });
 
@@ -875,7 +875,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -883,7 +883,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -891,7 +891,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateProjectConfigRequest();
       var od = api.UpdateProjectConfigRequest.fromJson(o.toJson());
-      checkUpdateProjectConfigRequest(od);
+      checkUpdateProjectConfigRequest(od as api.UpdateProjectConfigRequest);
     });
   });
 
@@ -899,7 +899,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateRepoRequest();
       var od = api.UpdateRepoRequest.fromJson(o.toJson());
-      checkUpdateRepoRequest(od);
+      checkUpdateRepoRequest(od as api.UpdateRepoRequest);
     });
   });
 
@@ -948,7 +948,7 @@
       res
           .getConfig(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProjectConfig(response);
+        checkProjectConfig(response as api.ProjectConfig);
       })));
     });
 
@@ -959,8 +959,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateProjectConfigRequest.fromJson(json);
-        checkUpdateProjectConfigRequest(obj);
+        var obj = api.UpdateProjectConfigRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateProjectConfigRequest(obj as api.UpdateProjectConfigRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1000,7 +1001,7 @@
       res
           .updateConfig(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProjectConfig(response);
+        checkProjectConfig(response as api.ProjectConfig);
       })));
     });
   });
@@ -1013,8 +1014,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Repo.fromJson(json);
-        checkRepo(obj);
+        var obj =
+            api.Repo.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkRepo(obj as api.Repo);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1054,7 +1056,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRepo(response);
+        checkRepo(response as api.Repo);
       })));
     });
 
@@ -1102,7 +1104,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1150,7 +1152,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRepo(response);
+        checkRepo(response as api.Repo);
       })));
     });
 
@@ -1205,7 +1207,7 @@
                   arg_options_requestedPolicyVersion,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1262,7 +1264,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListReposResponse(response);
+        checkListReposResponse(response as api.ListReposResponse);
       })));
     });
 
@@ -1273,8 +1275,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateRepoRequest.fromJson(json);
-        checkUpdateRepoRequest(obj);
+        var obj = api.UpdateRepoRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateRepoRequest(obj as api.UpdateRepoRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1314,7 +1317,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRepo(response);
+        checkRepo(response as api.Repo);
       })));
     });
 
@@ -1325,8 +1328,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1366,7 +1370,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -1377,8 +1381,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SyncRepoRequest.fromJson(json);
-        checkSyncRepoRequest(obj);
+        var obj = api.SyncRepoRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSyncRepoRequest(obj as api.SyncRepoRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1418,7 +1423,7 @@
       res
           .sync(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1429,8 +1434,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1470,7 +1476,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/spanner/v1_test.dart b/generated/googleapis/test/spanner/v1_test.dart
index c5a79cb..74bfd9c 100644
--- a/generated/googleapis/test/spanner/v1_test.dart
+++ b/generated/googleapis/test/spanner/v1_test.dart
@@ -157,7 +157,7 @@
   buildCounterBatchCreateSessionsRequest++;
   if (buildCounterBatchCreateSessionsRequest < 3) {
     unittest.expect(o.sessionCount, unittest.equals(42));
-    checkSession(o.sessionTemplate);
+    checkSession(o.sessionTemplate as api.Session);
   }
   buildCounterBatchCreateSessionsRequest--;
 }
@@ -171,8 +171,8 @@
 
 void checkUnnamed1535(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSession(o[0]);
-  checkSession(o[1]);
+  checkSession(o[0] as api.Session);
+  checkSession(o[1] as api.Session);
 }
 
 core.int buildCounterBatchCreateSessionsResponse = 0;
@@ -208,7 +208,7 @@
 void checkBeginTransactionRequest(api.BeginTransactionRequest o) {
   buildCounterBeginTransactionRequest++;
   if (buildCounterBeginTransactionRequest < 3) {
-    checkTransactionOptions(o.options);
+    checkTransactionOptions(o.options as api.TransactionOptions);
   }
   buildCounterBeginTransactionRequest--;
 }
@@ -244,7 +244,7 @@
   buildCounterBinding++;
   if (buildCounterBinding < 3) {
     unittest.expect(o.bindingId, unittest.equals('foo'));
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed1536(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -283,8 +283,8 @@
 
 void checkUnnamed1537(core.List<api.Mutation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMutation(o[0]);
-  checkMutation(o[1]);
+  checkMutation(o[0] as api.Mutation);
+  checkMutation(o[1] as api.Mutation);
 }
 
 core.int buildCounterCommitRequest = 0;
@@ -304,7 +304,7 @@
   buildCounterCommitRequest++;
   if (buildCounterCommitRequest < 3) {
     checkUnnamed1537(o.mutations);
-    checkTransactionOptions(o.singleUseTransaction);
+    checkTransactionOptions(o.singleUseTransaction as api.TransactionOptions);
     unittest.expect(o.transactionId, unittest.equals('foo'));
   }
   buildCounterCommitRequest--;
@@ -349,7 +349,7 @@
     unittest.expect(o.cancelTime, unittest.equals('foo'));
     unittest.expect(o.database, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOperationProgress(o.progress);
+    checkOperationProgress(o.progress as api.OperationProgress);
   }
   buildCounterCreateBackupMetadata--;
 }
@@ -426,7 +426,7 @@
   if (buildCounterCreateInstanceMetadata < 3) {
     unittest.expect(o.cancelTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkInstance(o.instance);
+    checkInstance(o.instance as api.Instance);
     unittest.expect(o.startTime, unittest.equals('foo'));
   }
   buildCounterCreateInstanceMetadata--;
@@ -447,7 +447,7 @@
 void checkCreateInstanceRequest(api.CreateInstanceRequest o) {
   buildCounterCreateInstanceRequest++;
   if (buildCounterCreateInstanceRequest < 3) {
-    checkInstance(o.instance);
+    checkInstance(o.instance as api.Instance);
     unittest.expect(o.instanceId, unittest.equals('foo'));
   }
   buildCounterCreateInstanceRequest--;
@@ -467,7 +467,7 @@
 void checkCreateSessionRequest(api.CreateSessionRequest o) {
   buildCounterCreateSessionRequest++;
   if (buildCounterCreateSessionRequest < 3) {
-    checkSession(o.session);
+    checkSession(o.session as api.Session);
   }
   buildCounterCreateSessionRequest--;
 }
@@ -491,7 +491,7 @@
   if (buildCounterDatabase < 3) {
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkRestoreInfo(o.restoreInfo);
+    checkRestoreInfo(o.restoreInfo as api.RestoreInfo);
     unittest.expect(o.state, unittest.equals('foo'));
   }
   buildCounterDatabase--;
@@ -512,7 +512,7 @@
 void checkDelete(api.Delete o) {
   buildCounterDelete++;
   if (buildCounterDelete < 3) {
-    checkKeySet(o.keySet);
+    checkKeySet(o.keySet as api.KeySet);
     unittest.expect(o.table, unittest.equals('foo'));
   }
   buildCounterDelete--;
@@ -542,8 +542,8 @@
 
 void checkUnnamed1539(core.List<api.Statement> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatement(o[0]);
-  checkStatement(o[1]);
+  checkStatement(o[0] as api.Statement);
+  checkStatement(o[1] as api.Statement);
 }
 
 core.int buildCounterExecuteBatchDmlRequest = 0;
@@ -564,7 +564,7 @@
   if (buildCounterExecuteBatchDmlRequest < 3) {
     unittest.expect(o.seqno, unittest.equals('foo'));
     checkUnnamed1539(o.statements);
-    checkTransactionSelector(o.transaction);
+    checkTransactionSelector(o.transaction as api.TransactionSelector);
   }
   buildCounterExecuteBatchDmlRequest--;
 }
@@ -578,8 +578,8 @@
 
 void checkUnnamed1540(core.List<api.ResultSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResultSet(o[0]);
-  checkResultSet(o[1]);
+  checkResultSet(o[0] as api.ResultSet);
+  checkResultSet(o[1] as api.ResultSet);
 }
 
 core.int buildCounterExecuteBatchDmlResponse = 0;
@@ -598,7 +598,7 @@
   buildCounterExecuteBatchDmlResponse++;
   if (buildCounterExecuteBatchDmlResponse < 3) {
     checkUnnamed1540(o.resultSets);
-    checkStatus(o.status);
+    checkStatus(o.status as api.Status);
   }
   buildCounterExecuteBatchDmlResponse--;
 }
@@ -612,8 +612,8 @@
 
 void checkUnnamed1541(core.Map<core.String, api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o['x']);
-  checkType(o['y']);
+  checkType(o['x'] as api.Type);
+  checkType(o['y'] as api.Type);
 }
 
 core.Map<core.String, core.Object> buildUnnamed1542() {
@@ -671,11 +671,11 @@
     checkUnnamed1542(o.params);
     unittest.expect(o.partitionToken, unittest.equals('foo'));
     unittest.expect(o.queryMode, unittest.equals('foo'));
-    checkQueryOptions(o.queryOptions);
+    checkQueryOptions(o.queryOptions as api.QueryOptions);
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     unittest.expect(o.seqno, unittest.equals('foo'));
     unittest.expect(o.sql, unittest.equals('foo'));
-    checkTransactionSelector(o.transaction);
+    checkTransactionSelector(o.transaction as api.TransactionSelector);
   }
   buildCounterExecuteSqlRequest--;
 }
@@ -721,7 +721,7 @@
   buildCounterField++;
   if (buildCounterField < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkType(o.type);
+    checkType(o.type as api.Type);
   }
   buildCounterField--;
 }
@@ -772,7 +772,7 @@
 void checkGetIamPolicyRequest(api.GetIamPolicyRequest o) {
   buildCounterGetIamPolicyRequest++;
   if (buildCounterGetIamPolicyRequest < 3) {
-    checkGetPolicyOptions(o.options);
+    checkGetPolicyOptions(o.options as api.GetPolicyOptions);
   }
   buildCounterGetIamPolicyRequest--;
 }
@@ -862,8 +862,8 @@
 
 void checkUnnamed1546(core.List<api.ReplicaInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReplicaInfo(o[0]);
-  checkReplicaInfo(o[1]);
+  checkReplicaInfo(o[0] as api.ReplicaInfo);
+  checkReplicaInfo(o[1] as api.ReplicaInfo);
 }
 
 core.int buildCounterInstanceConfig = 0;
@@ -1081,8 +1081,8 @@
 
 void checkUnnamed1553(core.List<api.KeyRange> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKeyRange(o[0]);
-  checkKeyRange(o[1]);
+  checkKeyRange(o[0] as api.KeyRange);
+  checkKeyRange(o[1] as api.KeyRange);
 }
 
 core.int buildCounterKeySet = 0;
@@ -1117,8 +1117,8 @@
 
 void checkUnnamed1554(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListBackupOperationsResponse = 0;
@@ -1151,8 +1151,8 @@
 
 void checkUnnamed1555(core.List<api.Backup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBackup(o[0]);
-  checkBackup(o[1]);
+  checkBackup(o[0] as api.Backup);
+  checkBackup(o[1] as api.Backup);
 }
 
 core.int buildCounterListBackupsResponse = 0;
@@ -1185,8 +1185,8 @@
 
 void checkUnnamed1556(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListDatabaseOperationsResponse = 0;
@@ -1219,8 +1219,8 @@
 
 void checkUnnamed1557(core.List<api.Database> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDatabase(o[0]);
-  checkDatabase(o[1]);
+  checkDatabase(o[0] as api.Database);
+  checkDatabase(o[1] as api.Database);
 }
 
 core.int buildCounterListDatabasesResponse = 0;
@@ -1253,8 +1253,8 @@
 
 void checkUnnamed1558(core.List<api.InstanceConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstanceConfig(o[0]);
-  checkInstanceConfig(o[1]);
+  checkInstanceConfig(o[0] as api.InstanceConfig);
+  checkInstanceConfig(o[1] as api.InstanceConfig);
 }
 
 core.int buildCounterListInstanceConfigsResponse = 0;
@@ -1287,8 +1287,8 @@
 
 void checkUnnamed1559(core.List<api.Instance> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInstance(o[0]);
-  checkInstance(o[1]);
+  checkInstance(o[0] as api.Instance);
+  checkInstance(o[1] as api.Instance);
 }
 
 core.int buildCounterListInstancesResponse = 0;
@@ -1321,8 +1321,8 @@
 
 void checkUnnamed1560(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -1355,8 +1355,8 @@
 
 void checkUnnamed1561(core.List<api.Session> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSession(o[0]);
-  checkSession(o[1]);
+  checkSession(o[0] as api.Session);
+  checkSession(o[1] as api.Session);
 }
 
 core.int buildCounterListSessionsResponse = 0;
@@ -1398,11 +1398,11 @@
 void checkMutation(api.Mutation o) {
   buildCounterMutation++;
   if (buildCounterMutation < 3) {
-    checkDelete(o.delete);
-    checkWrite(o.insert);
-    checkWrite(o.insertOrUpdate);
-    checkWrite(o.replace);
-    checkWrite(o.update);
+    checkDelete(o.delete as api.Delete);
+    checkWrite(o.insert as api.Write);
+    checkWrite(o.insertOrUpdate as api.Write);
+    checkWrite(o.replace as api.Write);
+    checkWrite(o.update as api.Write);
   }
   buildCounterMutation--;
 }
@@ -1484,7 +1484,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1562(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1563(o.response);
@@ -1532,7 +1532,7 @@
   buildCounterOptimizeRestoredDatabaseMetadata++;
   if (buildCounterOptimizeRestoredDatabaseMetadata < 3) {
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOperationProgress(o.progress);
+    checkOperationProgress(o.progress as api.OperationProgress);
   }
   buildCounterOptimizeRestoredDatabaseMetadata--;
 }
@@ -1585,9 +1585,9 @@
   buildCounterPartialResultSet++;
   if (buildCounterPartialResultSet < 3) {
     unittest.expect(o.chunkedValue, unittest.isTrue);
-    checkResultSetMetadata(o.metadata);
+    checkResultSetMetadata(o.metadata as api.ResultSetMetadata);
     unittest.expect(o.resumeToken, unittest.equals('foo'));
-    checkResultSetStats(o.stats);
+    checkResultSetStats(o.stats as api.ResultSetStats);
     checkUnnamed1564(o.values);
   }
   buildCounterPartialResultSet--;
@@ -1642,8 +1642,8 @@
 
 void checkUnnamed1565(core.Map<core.String, api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o['x']);
-  checkType(o['y']);
+  checkType(o['x'] as api.Type);
+  checkType(o['y'] as api.Type);
 }
 
 core.Map<core.String, core.Object> buildUnnamed1566() {
@@ -1695,9 +1695,9 @@
   if (buildCounterPartitionQueryRequest < 3) {
     checkUnnamed1565(o.paramTypes);
     checkUnnamed1566(o.params);
-    checkPartitionOptions(o.partitionOptions);
+    checkPartitionOptions(o.partitionOptions as api.PartitionOptions);
     unittest.expect(o.sql, unittest.equals('foo'));
-    checkTransactionSelector(o.transaction);
+    checkTransactionSelector(o.transaction as api.TransactionSelector);
   }
   buildCounterPartitionQueryRequest--;
 }
@@ -1736,10 +1736,10 @@
   if (buildCounterPartitionReadRequest < 3) {
     checkUnnamed1567(o.columns);
     unittest.expect(o.index, unittest.equals('foo'));
-    checkKeySet(o.keySet);
-    checkPartitionOptions(o.partitionOptions);
+    checkKeySet(o.keySet as api.KeySet);
+    checkPartitionOptions(o.partitionOptions as api.PartitionOptions);
     unittest.expect(o.table, unittest.equals('foo'));
-    checkTransactionSelector(o.transaction);
+    checkTransactionSelector(o.transaction as api.TransactionSelector);
   }
   buildCounterPartitionReadRequest--;
 }
@@ -1753,8 +1753,8 @@
 
 void checkUnnamed1568(core.List<api.Partition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPartition(o[0]);
-  checkPartition(o[1]);
+  checkPartition(o[0] as api.Partition);
+  checkPartition(o[1] as api.Partition);
 }
 
 core.int buildCounterPartitionResponse = 0;
@@ -1773,7 +1773,7 @@
   buildCounterPartitionResponse++;
   if (buildCounterPartitionResponse < 3) {
     checkUnnamed1568(o.partitions);
-    checkTransaction(o.transaction);
+    checkTransaction(o.transaction as api.Transaction);
   }
   buildCounterPartitionResponse--;
 }
@@ -1802,8 +1802,8 @@
 
 void checkUnnamed1569(core.List<api.ChildLink> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChildLink(o[0]);
-  checkChildLink(o[1]);
+  checkChildLink(o[0] as api.ChildLink);
+  checkChildLink(o[1] as api.ChildLink);
 }
 
 core.Map<core.String, core.Object> buildUnnamed1570() {
@@ -1890,7 +1890,7 @@
     unittest.expect(o.index, unittest.equals(42));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed1571(o.metadata);
-    checkShortRepresentation(o.shortRepresentation);
+    checkShortRepresentation(o.shortRepresentation as api.ShortRepresentation);
   }
   buildCounterPlanNode--;
 }
@@ -1904,8 +1904,8 @@
 
 void checkUnnamed1572(core.List<api.Binding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBinding(o[0]);
-  checkBinding(o[1]);
+  checkBinding(o[0] as api.Binding);
+  checkBinding(o[1] as api.Binding);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1959,8 +1959,8 @@
 
 void checkUnnamed1573(core.List<api.PlanNode> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlanNode(o[0]);
-  checkPlanNode(o[1]);
+  checkPlanNode(o[0] as api.PlanNode);
+  checkPlanNode(o[1] as api.PlanNode);
 }
 
 core.int buildCounterQueryPlan = 0;
@@ -2047,12 +2047,12 @@
   if (buildCounterReadRequest < 3) {
     checkUnnamed1574(o.columns);
     unittest.expect(o.index, unittest.equals('foo'));
-    checkKeySet(o.keySet);
+    checkKeySet(o.keySet as api.KeySet);
     unittest.expect(o.limit, unittest.equals('foo'));
     unittest.expect(o.partitionToken, unittest.equals('foo'));
     unittest.expect(o.resumeToken, unittest.equals('foo'));
     unittest.expect(o.table, unittest.equals('foo'));
-    checkTransactionSelector(o.transaction);
+    checkTransactionSelector(o.transaction as api.TransactionSelector);
   }
   buildCounterReadRequest--;
 }
@@ -2114,11 +2114,11 @@
 void checkRestoreDatabaseMetadata(api.RestoreDatabaseMetadata o) {
   buildCounterRestoreDatabaseMetadata++;
   if (buildCounterRestoreDatabaseMetadata < 3) {
-    checkBackupInfo(o.backupInfo);
+    checkBackupInfo(o.backupInfo as api.BackupInfo);
     unittest.expect(o.cancelTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.optimizeDatabaseOperationName, unittest.equals('foo'));
-    checkOperationProgress(o.progress);
+    checkOperationProgress(o.progress as api.OperationProgress);
     unittest.expect(o.sourceType, unittest.equals('foo'));
   }
   buildCounterRestoreDatabaseMetadata--;
@@ -2160,7 +2160,7 @@
 void checkRestoreInfo(api.RestoreInfo o) {
   buildCounterRestoreInfo++;
   if (buildCounterRestoreInfo < 3) {
-    checkBackupInfo(o.backupInfo);
+    checkBackupInfo(o.backupInfo as api.BackupInfo);
     unittest.expect(o.sourceType, unittest.equals('foo'));
   }
   buildCounterRestoreInfo--;
@@ -2224,9 +2224,9 @@
 void checkResultSet(api.ResultSet o) {
   buildCounterResultSet++;
   if (buildCounterResultSet < 3) {
-    checkResultSetMetadata(o.metadata);
+    checkResultSetMetadata(o.metadata as api.ResultSetMetadata);
     checkUnnamed1576(o.rows);
-    checkResultSetStats(o.stats);
+    checkResultSetStats(o.stats as api.ResultSetStats);
   }
   buildCounterResultSet--;
 }
@@ -2246,8 +2246,8 @@
 void checkResultSetMetadata(api.ResultSetMetadata o) {
   buildCounterResultSetMetadata++;
   if (buildCounterResultSetMetadata < 3) {
-    checkStructType(o.rowType);
-    checkTransaction(o.transaction);
+    checkStructType(o.rowType as api.StructType);
+    checkTransaction(o.transaction as api.Transaction);
   }
   buildCounterResultSetMetadata--;
 }
@@ -2298,7 +2298,7 @@
 void checkResultSetStats(api.ResultSetStats o) {
   buildCounterResultSetStats++;
   if (buildCounterResultSetStats < 3) {
-    checkQueryPlan(o.queryPlan);
+    checkQueryPlan(o.queryPlan as api.QueryPlan);
     checkUnnamed1577(o.queryStats);
     unittest.expect(o.rowCountExact, unittest.equals('foo'));
     unittest.expect(o.rowCountLowerBound, unittest.equals('foo'));
@@ -2377,7 +2377,7 @@
 void checkSetIamPolicyRequest(api.SetIamPolicyRequest o) {
   buildCounterSetIamPolicyRequest++;
   if (buildCounterSetIamPolicyRequest < 3) {
-    checkPolicy(o.policy);
+    checkPolicy(o.policy as api.Policy);
   }
   buildCounterSetIamPolicyRequest--;
 }
@@ -2425,8 +2425,8 @@
 
 void checkUnnamed1580(core.Map<core.String, api.Type> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkType(o['x']);
-  checkType(o['y']);
+  checkType(o['x'] as api.Type);
+  checkType(o['y'] as api.Type);
 }
 
 core.Map<core.String, core.Object> buildUnnamed1581() {
@@ -2555,8 +2555,8 @@
 
 void checkUnnamed1584(core.List<api.Field> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkField(o[0]);
-  checkField(o[1]);
+  checkField(o[0] as api.Field);
+  checkField(o[1] as api.Field);
 }
 
 core.int buildCounterStructType = 0;
@@ -2679,9 +2679,9 @@
 void checkTransactionOptions(api.TransactionOptions o) {
   buildCounterTransactionOptions++;
   if (buildCounterTransactionOptions < 3) {
-    checkPartitionedDml(o.partitionedDml);
-    checkReadOnly(o.readOnly);
-    checkReadWrite(o.readWrite);
+    checkPartitionedDml(o.partitionedDml as api.PartitionedDml);
+    checkReadOnly(o.readOnly as api.ReadOnly);
+    checkReadWrite(o.readWrite as api.ReadWrite);
   }
   buildCounterTransactionOptions--;
 }
@@ -2702,9 +2702,9 @@
 void checkTransactionSelector(api.TransactionSelector o) {
   buildCounterTransactionSelector++;
   if (buildCounterTransactionSelector < 3) {
-    checkTransactionOptions(o.begin);
+    checkTransactionOptions(o.begin as api.TransactionOptions);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkTransactionOptions(o.singleUse);
+    checkTransactionOptions(o.singleUse as api.TransactionOptions);
   }
   buildCounterTransactionSelector--;
 }
@@ -2725,9 +2725,9 @@
 void checkType(api.Type o) {
   buildCounterType++;
   if (buildCounterType < 3) {
-    checkType(o.arrayElementType);
+    checkType(o.arrayElementType as api.Type);
     unittest.expect(o.code, unittest.equals('foo'));
-    checkStructType(o.structType);
+    checkStructType(o.structType as api.StructType);
   }
   buildCounterType--;
 }
@@ -2834,7 +2834,7 @@
   if (buildCounterUpdateInstanceMetadata < 3) {
     unittest.expect(o.cancelTime, unittest.equals('foo'));
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkInstance(o.instance);
+    checkInstance(o.instance as api.Instance);
     unittest.expect(o.startTime, unittest.equals('foo'));
   }
   buildCounterUpdateInstanceMetadata--;
@@ -2856,7 +2856,7 @@
   buildCounterUpdateInstanceRequest++;
   if (buildCounterUpdateInstanceRequest < 3) {
     unittest.expect(o.fieldMask, unittest.equals('foo'));
-    checkInstance(o.instance);
+    checkInstance(o.instance as api.Instance);
   }
   buildCounterUpdateInstanceRequest--;
 }
@@ -2944,7 +2944,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackup();
       var od = api.Backup.fromJson(o.toJson());
-      checkBackup(od);
+      checkBackup(od as api.Backup);
     });
   });
 
@@ -2952,7 +2952,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBackupInfo();
       var od = api.BackupInfo.fromJson(o.toJson());
-      checkBackupInfo(od);
+      checkBackupInfo(od as api.BackupInfo);
     });
   });
 
@@ -2960,7 +2960,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchCreateSessionsRequest();
       var od = api.BatchCreateSessionsRequest.fromJson(o.toJson());
-      checkBatchCreateSessionsRequest(od);
+      checkBatchCreateSessionsRequest(od as api.BatchCreateSessionsRequest);
     });
   });
 
@@ -2968,7 +2968,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchCreateSessionsResponse();
       var od = api.BatchCreateSessionsResponse.fromJson(o.toJson());
-      checkBatchCreateSessionsResponse(od);
+      checkBatchCreateSessionsResponse(od as api.BatchCreateSessionsResponse);
     });
   });
 
@@ -2976,7 +2976,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBeginTransactionRequest();
       var od = api.BeginTransactionRequest.fromJson(o.toJson());
-      checkBeginTransactionRequest(od);
+      checkBeginTransactionRequest(od as api.BeginTransactionRequest);
     });
   });
 
@@ -2984,7 +2984,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBinding();
       var od = api.Binding.fromJson(o.toJson());
-      checkBinding(od);
+      checkBinding(od as api.Binding);
     });
   });
 
@@ -2992,7 +2992,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChildLink();
       var od = api.ChildLink.fromJson(o.toJson());
-      checkChildLink(od);
+      checkChildLink(od as api.ChildLink);
     });
   });
 
@@ -3000,7 +3000,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitRequest();
       var od = api.CommitRequest.fromJson(o.toJson());
-      checkCommitRequest(od);
+      checkCommitRequest(od as api.CommitRequest);
     });
   });
 
@@ -3008,7 +3008,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommitResponse();
       var od = api.CommitResponse.fromJson(o.toJson());
-      checkCommitResponse(od);
+      checkCommitResponse(od as api.CommitResponse);
     });
   });
 
@@ -3016,7 +3016,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateBackupMetadata();
       var od = api.CreateBackupMetadata.fromJson(o.toJson());
-      checkCreateBackupMetadata(od);
+      checkCreateBackupMetadata(od as api.CreateBackupMetadata);
     });
   });
 
@@ -3024,7 +3024,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateDatabaseMetadata();
       var od = api.CreateDatabaseMetadata.fromJson(o.toJson());
-      checkCreateDatabaseMetadata(od);
+      checkCreateDatabaseMetadata(od as api.CreateDatabaseMetadata);
     });
   });
 
@@ -3032,7 +3032,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateDatabaseRequest();
       var od = api.CreateDatabaseRequest.fromJson(o.toJson());
-      checkCreateDatabaseRequest(od);
+      checkCreateDatabaseRequest(od as api.CreateDatabaseRequest);
     });
   });
 
@@ -3040,7 +3040,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateInstanceMetadata();
       var od = api.CreateInstanceMetadata.fromJson(o.toJson());
-      checkCreateInstanceMetadata(od);
+      checkCreateInstanceMetadata(od as api.CreateInstanceMetadata);
     });
   });
 
@@ -3048,7 +3048,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateInstanceRequest();
       var od = api.CreateInstanceRequest.fromJson(o.toJson());
-      checkCreateInstanceRequest(od);
+      checkCreateInstanceRequest(od as api.CreateInstanceRequest);
     });
   });
 
@@ -3056,7 +3056,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateSessionRequest();
       var od = api.CreateSessionRequest.fromJson(o.toJson());
-      checkCreateSessionRequest(od);
+      checkCreateSessionRequest(od as api.CreateSessionRequest);
     });
   });
 
@@ -3064,7 +3064,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDatabase();
       var od = api.Database.fromJson(o.toJson());
-      checkDatabase(od);
+      checkDatabase(od as api.Database);
     });
   });
 
@@ -3072,7 +3072,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDelete();
       var od = api.Delete.fromJson(o.toJson());
-      checkDelete(od);
+      checkDelete(od as api.Delete);
     });
   });
 
@@ -3080,7 +3080,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -3088,7 +3088,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecuteBatchDmlRequest();
       var od = api.ExecuteBatchDmlRequest.fromJson(o.toJson());
-      checkExecuteBatchDmlRequest(od);
+      checkExecuteBatchDmlRequest(od as api.ExecuteBatchDmlRequest);
     });
   });
 
@@ -3096,7 +3096,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecuteBatchDmlResponse();
       var od = api.ExecuteBatchDmlResponse.fromJson(o.toJson());
-      checkExecuteBatchDmlResponse(od);
+      checkExecuteBatchDmlResponse(od as api.ExecuteBatchDmlResponse);
     });
   });
 
@@ -3104,7 +3104,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExecuteSqlRequest();
       var od = api.ExecuteSqlRequest.fromJson(o.toJson());
-      checkExecuteSqlRequest(od);
+      checkExecuteSqlRequest(od as api.ExecuteSqlRequest);
     });
   });
 
@@ -3112,7 +3112,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -3120,7 +3120,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildField();
       var od = api.Field.fromJson(o.toJson());
-      checkField(od);
+      checkField(od as api.Field);
     });
   });
 
@@ -3128,7 +3128,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetDatabaseDdlResponse();
       var od = api.GetDatabaseDdlResponse.fromJson(o.toJson());
-      checkGetDatabaseDdlResponse(od);
+      checkGetDatabaseDdlResponse(od as api.GetDatabaseDdlResponse);
     });
   });
 
@@ -3136,7 +3136,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetIamPolicyRequest();
       var od = api.GetIamPolicyRequest.fromJson(o.toJson());
-      checkGetIamPolicyRequest(od);
+      checkGetIamPolicyRequest(od as api.GetIamPolicyRequest);
     });
   });
 
@@ -3144,7 +3144,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetPolicyOptions();
       var od = api.GetPolicyOptions.fromJson(o.toJson());
-      checkGetPolicyOptions(od);
+      checkGetPolicyOptions(od as api.GetPolicyOptions);
     });
   });
 
@@ -3152,7 +3152,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstance();
       var od = api.Instance.fromJson(o.toJson());
-      checkInstance(od);
+      checkInstance(od as api.Instance);
     });
   });
 
@@ -3160,7 +3160,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInstanceConfig();
       var od = api.InstanceConfig.fromJson(o.toJson());
-      checkInstanceConfig(od);
+      checkInstanceConfig(od as api.InstanceConfig);
     });
   });
 
@@ -3168,7 +3168,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyRange();
       var od = api.KeyRange.fromJson(o.toJson());
-      checkKeyRange(od);
+      checkKeyRange(od as api.KeyRange);
     });
   });
 
@@ -3176,7 +3176,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeySet();
       var od = api.KeySet.fromJson(o.toJson());
-      checkKeySet(od);
+      checkKeySet(od as api.KeySet);
     });
   });
 
@@ -3184,7 +3184,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBackupOperationsResponse();
       var od = api.ListBackupOperationsResponse.fromJson(o.toJson());
-      checkListBackupOperationsResponse(od);
+      checkListBackupOperationsResponse(od as api.ListBackupOperationsResponse);
     });
   });
 
@@ -3192,7 +3192,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListBackupsResponse();
       var od = api.ListBackupsResponse.fromJson(o.toJson());
-      checkListBackupsResponse(od);
+      checkListBackupsResponse(od as api.ListBackupsResponse);
     });
   });
 
@@ -3200,7 +3200,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDatabaseOperationsResponse();
       var od = api.ListDatabaseOperationsResponse.fromJson(o.toJson());
-      checkListDatabaseOperationsResponse(od);
+      checkListDatabaseOperationsResponse(
+          od as api.ListDatabaseOperationsResponse);
     });
   });
 
@@ -3208,7 +3209,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListDatabasesResponse();
       var od = api.ListDatabasesResponse.fromJson(o.toJson());
-      checkListDatabasesResponse(od);
+      checkListDatabasesResponse(od as api.ListDatabasesResponse);
     });
   });
 
@@ -3216,7 +3217,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInstanceConfigsResponse();
       var od = api.ListInstanceConfigsResponse.fromJson(o.toJson());
-      checkListInstanceConfigsResponse(od);
+      checkListInstanceConfigsResponse(od as api.ListInstanceConfigsResponse);
     });
   });
 
@@ -3224,7 +3225,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListInstancesResponse();
       var od = api.ListInstancesResponse.fromJson(o.toJson());
-      checkListInstancesResponse(od);
+      checkListInstancesResponse(od as api.ListInstancesResponse);
     });
   });
 
@@ -3232,7 +3233,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -3240,7 +3241,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSessionsResponse();
       var od = api.ListSessionsResponse.fromJson(o.toJson());
-      checkListSessionsResponse(od);
+      checkListSessionsResponse(od as api.ListSessionsResponse);
     });
   });
 
@@ -3248,7 +3249,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMutation();
       var od = api.Mutation.fromJson(o.toJson());
-      checkMutation(od);
+      checkMutation(od as api.Mutation);
     });
   });
 
@@ -3256,7 +3257,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -3264,7 +3265,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationProgress();
       var od = api.OperationProgress.fromJson(o.toJson());
-      checkOperationProgress(od);
+      checkOperationProgress(od as api.OperationProgress);
     });
   });
 
@@ -3272,7 +3273,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildOptimizeRestoredDatabaseMetadata();
       var od = api.OptimizeRestoredDatabaseMetadata.fromJson(o.toJson());
-      checkOptimizeRestoredDatabaseMetadata(od);
+      checkOptimizeRestoredDatabaseMetadata(
+          od as api.OptimizeRestoredDatabaseMetadata);
     });
   });
 
@@ -3280,7 +3282,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartialResultSet();
       var od = api.PartialResultSet.fromJson(o.toJson());
-      checkPartialResultSet(od);
+      checkPartialResultSet(od as api.PartialResultSet);
     });
   });
 
@@ -3288,7 +3290,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartition();
       var od = api.Partition.fromJson(o.toJson());
-      checkPartition(od);
+      checkPartition(od as api.Partition);
     });
   });
 
@@ -3296,7 +3298,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionOptions();
       var od = api.PartitionOptions.fromJson(o.toJson());
-      checkPartitionOptions(od);
+      checkPartitionOptions(od as api.PartitionOptions);
     });
   });
 
@@ -3304,7 +3306,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionQueryRequest();
       var od = api.PartitionQueryRequest.fromJson(o.toJson());
-      checkPartitionQueryRequest(od);
+      checkPartitionQueryRequest(od as api.PartitionQueryRequest);
     });
   });
 
@@ -3312,7 +3314,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionReadRequest();
       var od = api.PartitionReadRequest.fromJson(o.toJson());
-      checkPartitionReadRequest(od);
+      checkPartitionReadRequest(od as api.PartitionReadRequest);
     });
   });
 
@@ -3320,7 +3322,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionResponse();
       var od = api.PartitionResponse.fromJson(o.toJson());
-      checkPartitionResponse(od);
+      checkPartitionResponse(od as api.PartitionResponse);
     });
   });
 
@@ -3328,7 +3330,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPartitionedDml();
       var od = api.PartitionedDml.fromJson(o.toJson());
-      checkPartitionedDml(od);
+      checkPartitionedDml(od as api.PartitionedDml);
     });
   });
 
@@ -3336,7 +3338,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlanNode();
       var od = api.PlanNode.fromJson(o.toJson());
-      checkPlanNode(od);
+      checkPlanNode(od as api.PlanNode);
     });
   });
 
@@ -3344,7 +3346,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -3352,7 +3354,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryOptions();
       var od = api.QueryOptions.fromJson(o.toJson());
-      checkQueryOptions(od);
+      checkQueryOptions(od as api.QueryOptions);
     });
   });
 
@@ -3360,7 +3362,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryPlan();
       var od = api.QueryPlan.fromJson(o.toJson());
-      checkQueryPlan(od);
+      checkQueryPlan(od as api.QueryPlan);
     });
   });
 
@@ -3368,7 +3370,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadOnly();
       var od = api.ReadOnly.fromJson(o.toJson());
-      checkReadOnly(od);
+      checkReadOnly(od as api.ReadOnly);
     });
   });
 
@@ -3376,7 +3378,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadRequest();
       var od = api.ReadRequest.fromJson(o.toJson());
-      checkReadRequest(od);
+      checkReadRequest(od as api.ReadRequest);
     });
   });
 
@@ -3384,7 +3386,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReadWrite();
       var od = api.ReadWrite.fromJson(o.toJson());
-      checkReadWrite(od);
+      checkReadWrite(od as api.ReadWrite);
     });
   });
 
@@ -3392,7 +3394,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReplicaInfo();
       var od = api.ReplicaInfo.fromJson(o.toJson());
-      checkReplicaInfo(od);
+      checkReplicaInfo(od as api.ReplicaInfo);
     });
   });
 
@@ -3400,7 +3402,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreDatabaseMetadata();
       var od = api.RestoreDatabaseMetadata.fromJson(o.toJson());
-      checkRestoreDatabaseMetadata(od);
+      checkRestoreDatabaseMetadata(od as api.RestoreDatabaseMetadata);
     });
   });
 
@@ -3408,7 +3410,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreDatabaseRequest();
       var od = api.RestoreDatabaseRequest.fromJson(o.toJson());
-      checkRestoreDatabaseRequest(od);
+      checkRestoreDatabaseRequest(od as api.RestoreDatabaseRequest);
     });
   });
 
@@ -3416,7 +3418,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRestoreInfo();
       var od = api.RestoreInfo.fromJson(o.toJson());
-      checkRestoreInfo(od);
+      checkRestoreInfo(od as api.RestoreInfo);
     });
   });
 
@@ -3424,7 +3426,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultSet();
       var od = api.ResultSet.fromJson(o.toJson());
-      checkResultSet(od);
+      checkResultSet(od as api.ResultSet);
     });
   });
 
@@ -3432,7 +3434,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultSetMetadata();
       var od = api.ResultSetMetadata.fromJson(o.toJson());
-      checkResultSetMetadata(od);
+      checkResultSetMetadata(od as api.ResultSetMetadata);
     });
   });
 
@@ -3440,7 +3442,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultSetStats();
       var od = api.ResultSetStats.fromJson(o.toJson());
-      checkResultSetStats(od);
+      checkResultSetStats(od as api.ResultSetStats);
     });
   });
 
@@ -3448,7 +3450,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRollbackRequest();
       var od = api.RollbackRequest.fromJson(o.toJson());
-      checkRollbackRequest(od);
+      checkRollbackRequest(od as api.RollbackRequest);
     });
   });
 
@@ -3456,7 +3458,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSession();
       var od = api.Session.fromJson(o.toJson());
-      checkSession(od);
+      checkSession(od as api.Session);
     });
   });
 
@@ -3464,7 +3466,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetIamPolicyRequest();
       var od = api.SetIamPolicyRequest.fromJson(o.toJson());
-      checkSetIamPolicyRequest(od);
+      checkSetIamPolicyRequest(od as api.SetIamPolicyRequest);
     });
   });
 
@@ -3472,7 +3474,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShortRepresentation();
       var od = api.ShortRepresentation.fromJson(o.toJson());
-      checkShortRepresentation(od);
+      checkShortRepresentation(od as api.ShortRepresentation);
     });
   });
 
@@ -3480,7 +3482,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatement();
       var od = api.Statement.fromJson(o.toJson());
-      checkStatement(od);
+      checkStatement(od as api.Statement);
     });
   });
 
@@ -3488,7 +3490,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -3496,7 +3498,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStructType();
       var od = api.StructType.fromJson(o.toJson());
-      checkStructType(od);
+      checkStructType(od as api.StructType);
     });
   });
 
@@ -3504,7 +3506,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsRequest();
       var od = api.TestIamPermissionsRequest.fromJson(o.toJson());
-      checkTestIamPermissionsRequest(od);
+      checkTestIamPermissionsRequest(od as api.TestIamPermissionsRequest);
     });
   });
 
@@ -3512,7 +3514,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -3520,7 +3522,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransaction();
       var od = api.Transaction.fromJson(o.toJson());
-      checkTransaction(od);
+      checkTransaction(od as api.Transaction);
     });
   });
 
@@ -3528,7 +3530,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransactionOptions();
       var od = api.TransactionOptions.fromJson(o.toJson());
-      checkTransactionOptions(od);
+      checkTransactionOptions(od as api.TransactionOptions);
     });
   });
 
@@ -3536,7 +3538,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransactionSelector();
       var od = api.TransactionSelector.fromJson(o.toJson());
-      checkTransactionSelector(od);
+      checkTransactionSelector(od as api.TransactionSelector);
     });
   });
 
@@ -3544,7 +3546,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildType();
       var od = api.Type.fromJson(o.toJson());
-      checkType(od);
+      checkType(od as api.Type);
     });
   });
 
@@ -3552,7 +3554,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDatabaseDdlMetadata();
       var od = api.UpdateDatabaseDdlMetadata.fromJson(o.toJson());
-      checkUpdateDatabaseDdlMetadata(od);
+      checkUpdateDatabaseDdlMetadata(od as api.UpdateDatabaseDdlMetadata);
     });
   });
 
@@ -3560,7 +3562,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateDatabaseDdlRequest();
       var od = api.UpdateDatabaseDdlRequest.fromJson(o.toJson());
-      checkUpdateDatabaseDdlRequest(od);
+      checkUpdateDatabaseDdlRequest(od as api.UpdateDatabaseDdlRequest);
     });
   });
 
@@ -3568,7 +3570,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateInstanceMetadata();
       var od = api.UpdateInstanceMetadata.fromJson(o.toJson());
-      checkUpdateInstanceMetadata(od);
+      checkUpdateInstanceMetadata(od as api.UpdateInstanceMetadata);
     });
   });
 
@@ -3576,7 +3578,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateInstanceRequest();
       var od = api.UpdateInstanceRequest.fromJson(o.toJson());
-      checkUpdateInstanceRequest(od);
+      checkUpdateInstanceRequest(od as api.UpdateInstanceRequest);
     });
   });
 
@@ -3584,7 +3586,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWrite();
       var od = api.Write.fromJson(o.toJson());
-      checkWrite(od);
+      checkWrite(od as api.Write);
     });
   });
 
@@ -3633,7 +3635,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstanceConfig(response);
+        checkInstanceConfig(response as api.InstanceConfig);
       })));
     });
 
@@ -3690,7 +3692,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInstanceConfigsResponse(response);
+        checkListInstanceConfigsResponse(
+            response as api.ListInstanceConfigsResponse);
       })));
     });
   });
@@ -3703,8 +3706,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateInstanceRequest.fromJson(json);
-        checkCreateInstanceRequest(obj);
+        var obj = api.CreateInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateInstanceRequest(obj as api.CreateInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3744,7 +3748,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -3792,7 +3796,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3843,7 +3847,7 @@
       res
           .get(arg_name, fieldMask: arg_fieldMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkInstance(response);
+        checkInstance(response as api.Instance);
       })));
     });
 
@@ -3854,8 +3858,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3895,7 +3900,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3955,7 +3960,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListInstancesResponse(response);
+        checkListInstancesResponse(response as api.ListInstancesResponse);
       })));
     });
 
@@ -3966,8 +3971,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateInstanceRequest.fromJson(json);
-        checkUpdateInstanceRequest(obj);
+        var obj = api.UpdateInstanceRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateInstanceRequest(obj as api.UpdateInstanceRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4007,7 +4013,7 @@
       res
           .patch(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4018,8 +4024,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4059,7 +4066,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4070,8 +4077,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4111,7 +4119,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -4173,7 +4182,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBackupOperationsResponse(response);
+        checkListBackupOperationsResponse(
+            response as api.ListBackupOperationsResponse);
       })));
     });
   });
@@ -4187,8 +4197,9 @@
       var arg_backupId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Backup.fromJson(json);
-        checkBackup(obj);
+        var obj =
+            api.Backup.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBackup(obj as api.Backup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4231,7 +4242,7 @@
           .create(arg_request, arg_parent,
               backupId: arg_backupId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4279,7 +4290,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4327,7 +4338,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackup(response);
+        checkBackup(response as api.Backup);
       })));
     });
 
@@ -4338,8 +4349,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4379,7 +4391,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4439,7 +4451,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListBackupsResponse(response);
+        checkListBackupsResponse(response as api.ListBackupsResponse);
       })));
     });
 
@@ -4451,8 +4463,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Backup.fromJson(json);
-        checkBackup(obj);
+        var obj =
+            api.Backup.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBackup(obj as api.Backup);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4495,7 +4508,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBackup(response);
+        checkBackup(response as api.Backup);
       })));
     });
 
@@ -4506,8 +4519,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4547,7 +4561,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4558,8 +4572,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4599,7 +4614,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
   });
@@ -4649,7 +4665,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4697,7 +4713,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -4745,7 +4761,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4805,7 +4821,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -4867,7 +4883,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDatabaseOperationsResponse(response);
+        checkListDatabaseOperationsResponse(
+            response as api.ListDatabaseOperationsResponse);
       })));
     });
   });
@@ -4880,8 +4897,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateDatabaseRequest.fromJson(json);
-        checkCreateDatabaseRequest(obj);
+        var obj = api.CreateDatabaseRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateDatabaseRequest(obj as api.CreateDatabaseRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4921,7 +4939,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -4969,7 +4987,7 @@
       res
           .dropDatabase(arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5017,7 +5035,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDatabase(response);
+        checkDatabase(response as api.Database);
       })));
     });
 
@@ -5065,7 +5083,7 @@
       res
           .getDdl(arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetDatabaseDdlResponse(response);
+        checkGetDatabaseDdlResponse(response as api.GetDatabaseDdlResponse);
       })));
     });
 
@@ -5076,8 +5094,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GetIamPolicyRequest.fromJson(json);
-        checkGetIamPolicyRequest(obj);
+        var obj = api.GetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGetIamPolicyRequest(obj as api.GetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5117,7 +5136,7 @@
       res
           .getIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5174,7 +5193,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListDatabasesResponse(response);
+        checkListDatabasesResponse(response as api.ListDatabasesResponse);
       })));
     });
 
@@ -5185,8 +5204,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RestoreDatabaseRequest.fromJson(json);
-        checkRestoreDatabaseRequest(obj);
+        var obj = api.RestoreDatabaseRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRestoreDatabaseRequest(obj as api.RestoreDatabaseRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5226,7 +5246,7 @@
       res
           .restore(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5237,8 +5257,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SetIamPolicyRequest.fromJson(json);
-        checkSetIamPolicyRequest(obj);
+        var obj = api.SetIamPolicyRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSetIamPolicyRequest(obj as api.SetIamPolicyRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5278,7 +5299,7 @@
       res
           .setIamPolicy(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5289,8 +5310,9 @@
       var arg_resource = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestIamPermissionsRequest.fromJson(json);
-        checkTestIamPermissionsRequest(obj);
+        var obj = api.TestIamPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestIamPermissionsRequest(obj as api.TestIamPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5330,7 +5352,8 @@
       res
           .testIamPermissions(arg_request, arg_resource, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -5341,8 +5364,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateDatabaseDdlRequest.fromJson(json);
-        checkUpdateDatabaseDdlRequest(obj);
+        var obj = api.UpdateDatabaseDdlRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateDatabaseDdlRequest(obj as api.UpdateDatabaseDdlRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5382,7 +5406,7 @@
       res
           .updateDdl(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -5433,7 +5457,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5481,7 +5505,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5529,7 +5553,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -5589,7 +5613,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -5602,8 +5626,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchCreateSessionsRequest.fromJson(json);
-        checkBatchCreateSessionsRequest(obj);
+        var obj = api.BatchCreateSessionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchCreateSessionsRequest(obj as api.BatchCreateSessionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5643,7 +5668,8 @@
       res
           .batchCreate(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchCreateSessionsResponse(response);
+        checkBatchCreateSessionsResponse(
+            response as api.BatchCreateSessionsResponse);
       })));
     });
 
@@ -5654,8 +5680,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BeginTransactionRequest.fromJson(json);
-        checkBeginTransactionRequest(obj);
+        var obj = api.BeginTransactionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBeginTransactionRequest(obj as api.BeginTransactionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5695,7 +5722,7 @@
       res
           .beginTransaction(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransaction(response);
+        checkTransaction(response as api.Transaction);
       })));
     });
 
@@ -5706,8 +5733,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommitRequest.fromJson(json);
-        checkCommitRequest(obj);
+        var obj = api.CommitRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommitRequest(obj as api.CommitRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5747,7 +5775,7 @@
       res
           .commit(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommitResponse(response);
+        checkCommitResponse(response as api.CommitResponse);
       })));
     });
 
@@ -5758,8 +5786,9 @@
       var arg_database = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CreateSessionRequest.fromJson(json);
-        checkCreateSessionRequest(obj);
+        var obj = api.CreateSessionRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateSessionRequest(obj as api.CreateSessionRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5799,7 +5828,7 @@
       res
           .create(arg_request, arg_database, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSession(response);
+        checkSession(response as api.Session);
       })));
     });
 
@@ -5847,7 +5876,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -5858,8 +5887,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExecuteBatchDmlRequest.fromJson(json);
-        checkExecuteBatchDmlRequest(obj);
+        var obj = api.ExecuteBatchDmlRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExecuteBatchDmlRequest(obj as api.ExecuteBatchDmlRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5899,7 +5929,7 @@
       res
           .executeBatchDml(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExecuteBatchDmlResponse(response);
+        checkExecuteBatchDmlResponse(response as api.ExecuteBatchDmlResponse);
       })));
     });
 
@@ -5910,8 +5940,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExecuteSqlRequest.fromJson(json);
-        checkExecuteSqlRequest(obj);
+        var obj = api.ExecuteSqlRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExecuteSqlRequest(obj as api.ExecuteSqlRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5951,7 +5982,7 @@
       res
           .executeSql(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResultSet(response);
+        checkResultSet(response as api.ResultSet);
       })));
     });
 
@@ -5962,8 +5993,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ExecuteSqlRequest.fromJson(json);
-        checkExecuteSqlRequest(obj);
+        var obj = api.ExecuteSqlRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkExecuteSqlRequest(obj as api.ExecuteSqlRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6003,7 +6035,7 @@
       res
           .executeStreamingSql(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPartialResultSet(response);
+        checkPartialResultSet(response as api.PartialResultSet);
       })));
     });
 
@@ -6051,7 +6083,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSession(response);
+        checkSession(response as api.Session);
       })));
     });
 
@@ -6111,7 +6143,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSessionsResponse(response);
+        checkListSessionsResponse(response as api.ListSessionsResponse);
       })));
     });
 
@@ -6122,8 +6154,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PartitionQueryRequest.fromJson(json);
-        checkPartitionQueryRequest(obj);
+        var obj = api.PartitionQueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPartitionQueryRequest(obj as api.PartitionQueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6163,7 +6196,7 @@
       res
           .partitionQuery(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPartitionResponse(response);
+        checkPartitionResponse(response as api.PartitionResponse);
       })));
     });
 
@@ -6174,8 +6207,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PartitionReadRequest.fromJson(json);
-        checkPartitionReadRequest(obj);
+        var obj = api.PartitionReadRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPartitionReadRequest(obj as api.PartitionReadRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6215,7 +6249,7 @@
       res
           .partitionRead(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPartitionResponse(response);
+        checkPartitionResponse(response as api.PartitionResponse);
       })));
     });
 
@@ -6226,8 +6260,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReadRequest.fromJson(json);
-        checkReadRequest(obj);
+        var obj = api.ReadRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReadRequest(obj as api.ReadRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6267,7 +6302,7 @@
       res
           .read(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkResultSet(response);
+        checkResultSet(response as api.ResultSet);
       })));
     });
 
@@ -6278,8 +6313,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RollbackRequest.fromJson(json);
-        checkRollbackRequest(obj);
+        var obj = api.RollbackRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRollbackRequest(obj as api.RollbackRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6319,7 +6355,7 @@
       res
           .rollback(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6330,8 +6366,9 @@
       var arg_session = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReadRequest.fromJson(json);
-        checkReadRequest(obj);
+        var obj = api.ReadRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReadRequest(obj as api.ReadRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6371,7 +6408,7 @@
       res
           .streamingRead(arg_request, arg_session, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPartialResultSet(response);
+        checkPartialResultSet(response as api.PartialResultSet);
       })));
     });
   });
@@ -6421,7 +6458,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6469,7 +6506,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -6517,7 +6554,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -6577,7 +6614,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/speech/v1_test.dart b/generated/googleapis/test/speech/v1_test.dart
index 9e56ddb..b81a999 100644
--- a/generated/googleapis/test/speech/v1_test.dart
+++ b/generated/googleapis/test/speech/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed4697(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -148,8 +148,8 @@
 void checkLongRunningRecognizeRequest(api.LongRunningRecognizeRequest o) {
   buildCounterLongRunningRecognizeRequest++;
   if (buildCounterLongRunningRecognizeRequest < 3) {
-    checkRecognitionAudio(o.audio);
-    checkRecognitionConfig(o.config);
+    checkRecognitionAudio(o.audio as api.RecognitionAudio);
+    checkRecognitionConfig(o.config as api.RecognitionConfig);
   }
   buildCounterLongRunningRecognizeRequest--;
 }
@@ -163,8 +163,8 @@
 
 void checkUnnamed4698(core.List<api.SpeechRecognitionResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSpeechRecognitionResult(o[0]);
-  checkSpeechRecognitionResult(o[1]);
+  checkSpeechRecognitionResult(o[0] as api.SpeechRecognitionResult);
+  checkSpeechRecognitionResult(o[1] as api.SpeechRecognitionResult);
 }
 
 core.int buildCounterLongRunningRecognizeResponse = 0;
@@ -263,7 +263,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed4699(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed4700(o.response);
@@ -301,8 +301,8 @@
 
 void checkUnnamed4701(core.List<api.SpeechContext> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSpeechContext(o[0]);
-  checkSpeechContext(o[1]);
+  checkSpeechContext(o[0] as api.SpeechContext);
+  checkSpeechContext(o[1] as api.SpeechContext);
 }
 
 core.int buildCounterRecognitionConfig = 0;
@@ -333,14 +333,15 @@
   buildCounterRecognitionConfig++;
   if (buildCounterRecognitionConfig < 3) {
     unittest.expect(o.audioChannelCount, unittest.equals(42));
-    checkSpeakerDiarizationConfig(o.diarizationConfig);
+    checkSpeakerDiarizationConfig(
+        o.diarizationConfig as api.SpeakerDiarizationConfig);
     unittest.expect(o.enableAutomaticPunctuation, unittest.isTrue);
     unittest.expect(o.enableSeparateRecognitionPerChannel, unittest.isTrue);
     unittest.expect(o.enableWordTimeOffsets, unittest.isTrue);
     unittest.expect(o.encoding, unittest.equals('foo'));
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.maxAlternatives, unittest.equals(42));
-    checkRecognitionMetadata(o.metadata);
+    checkRecognitionMetadata(o.metadata as api.RecognitionMetadata);
     unittest.expect(o.model, unittest.equals('foo'));
     unittest.expect(o.profanityFilter, unittest.isTrue);
     unittest.expect(o.sampleRateHertz, unittest.equals(42));
@@ -398,8 +399,8 @@
 void checkRecognizeRequest(api.RecognizeRequest o) {
   buildCounterRecognizeRequest++;
   if (buildCounterRecognizeRequest < 3) {
-    checkRecognitionAudio(o.audio);
-    checkRecognitionConfig(o.config);
+    checkRecognitionAudio(o.audio as api.RecognitionAudio);
+    checkRecognitionConfig(o.config as api.RecognitionConfig);
   }
   buildCounterRecognizeRequest--;
 }
@@ -413,8 +414,8 @@
 
 void checkUnnamed4702(core.List<api.SpeechRecognitionResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSpeechRecognitionResult(o[0]);
-  checkSpeechRecognitionResult(o[1]);
+  checkSpeechRecognitionResult(o[0] as api.SpeechRecognitionResult);
+  checkSpeechRecognitionResult(o[1] as api.SpeechRecognitionResult);
 }
 
 core.int buildCounterRecognizeResponse = 0;
@@ -502,8 +503,8 @@
 
 void checkUnnamed4704(core.List<api.WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWordInfo(o[0]);
-  checkWordInfo(o[1]);
+  checkWordInfo(o[0] as api.WordInfo);
+  checkWordInfo(o[1] as api.WordInfo);
 }
 
 core.int buildCounterSpeechRecognitionAlternative = 0;
@@ -538,8 +539,8 @@
 
 void checkUnnamed4705(core.List<api.SpeechRecognitionAlternative> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSpeechRecognitionAlternative(o[0]);
-  checkSpeechRecognitionAlternative(o[1]);
+  checkSpeechRecognitionAlternative(o[0] as api.SpeechRecognitionAlternative);
+  checkSpeechRecognitionAlternative(o[1] as api.SpeechRecognitionAlternative);
 }
 
 core.int buildCounterSpeechRecognitionResult = 0;
@@ -658,7 +659,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -666,7 +667,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLongRunningRecognizeMetadata();
       var od = api.LongRunningRecognizeMetadata.fromJson(o.toJson());
-      checkLongRunningRecognizeMetadata(od);
+      checkLongRunningRecognizeMetadata(od as api.LongRunningRecognizeMetadata);
     });
   });
 
@@ -674,7 +675,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLongRunningRecognizeRequest();
       var od = api.LongRunningRecognizeRequest.fromJson(o.toJson());
-      checkLongRunningRecognizeRequest(od);
+      checkLongRunningRecognizeRequest(od as api.LongRunningRecognizeRequest);
     });
   });
 
@@ -682,7 +683,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLongRunningRecognizeResponse();
       var od = api.LongRunningRecognizeResponse.fromJson(o.toJson());
-      checkLongRunningRecognizeResponse(od);
+      checkLongRunningRecognizeResponse(od as api.LongRunningRecognizeResponse);
     });
   });
 
@@ -690,7 +691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -698,7 +699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecognitionAudio();
       var od = api.RecognitionAudio.fromJson(o.toJson());
-      checkRecognitionAudio(od);
+      checkRecognitionAudio(od as api.RecognitionAudio);
     });
   });
 
@@ -706,7 +707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecognitionConfig();
       var od = api.RecognitionConfig.fromJson(o.toJson());
-      checkRecognitionConfig(od);
+      checkRecognitionConfig(od as api.RecognitionConfig);
     });
   });
 
@@ -714,7 +715,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecognitionMetadata();
       var od = api.RecognitionMetadata.fromJson(o.toJson());
-      checkRecognitionMetadata(od);
+      checkRecognitionMetadata(od as api.RecognitionMetadata);
     });
   });
 
@@ -722,7 +723,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecognizeRequest();
       var od = api.RecognizeRequest.fromJson(o.toJson());
-      checkRecognizeRequest(od);
+      checkRecognizeRequest(od as api.RecognizeRequest);
     });
   });
 
@@ -730,7 +731,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRecognizeResponse();
       var od = api.RecognizeResponse.fromJson(o.toJson());
-      checkRecognizeResponse(od);
+      checkRecognizeResponse(od as api.RecognizeResponse);
     });
   });
 
@@ -738,7 +739,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpeakerDiarizationConfig();
       var od = api.SpeakerDiarizationConfig.fromJson(o.toJson());
-      checkSpeakerDiarizationConfig(od);
+      checkSpeakerDiarizationConfig(od as api.SpeakerDiarizationConfig);
     });
   });
 
@@ -746,7 +747,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpeechContext();
       var od = api.SpeechContext.fromJson(o.toJson());
-      checkSpeechContext(od);
+      checkSpeechContext(od as api.SpeechContext);
     });
   });
 
@@ -754,7 +755,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpeechRecognitionAlternative();
       var od = api.SpeechRecognitionAlternative.fromJson(o.toJson());
-      checkSpeechRecognitionAlternative(od);
+      checkSpeechRecognitionAlternative(od as api.SpeechRecognitionAlternative);
     });
   });
 
@@ -762,7 +763,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSpeechRecognitionResult();
       var od = api.SpeechRecognitionResult.fromJson(o.toJson());
-      checkSpeechRecognitionResult(od);
+      checkSpeechRecognitionResult(od as api.SpeechRecognitionResult);
     });
   });
 
@@ -770,7 +771,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -778,7 +779,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWordInfo();
       var od = api.WordInfo.fromJson(o.toJson());
-      checkWordInfo(od);
+      checkWordInfo(od as api.WordInfo);
     });
   });
 
@@ -827,7 +828,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -888,7 +889,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -938,7 +939,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -998,7 +999,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -1010,8 +1011,10 @@
       var arg_request = buildLongRunningRecognizeRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LongRunningRecognizeRequest.fromJson(json);
-        checkLongRunningRecognizeRequest(obj);
+        var obj = api.LongRunningRecognizeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLongRunningRecognizeRequest(
+            obj as api.LongRunningRecognizeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1050,7 +1053,7 @@
       res
           .longrunningrecognize(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1060,8 +1063,9 @@
       var arg_request = buildRecognizeRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RecognizeRequest.fromJson(json);
-        checkRecognizeRequest(obj);
+        var obj = api.RecognizeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRecognizeRequest(obj as api.RecognizeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1100,7 +1104,7 @@
       res
           .recognize(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRecognizeResponse(response);
+        checkRecognizeResponse(response as api.RecognizeResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/storage/v1_test.dart b/generated/googleapis/test/storage/v1_test.dart
index 803dd29..562a731 100644
--- a/generated/googleapis/test/storage/v1_test.dart
+++ b/generated/googleapis/test/storage/v1_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed3965(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucketAccessControl(o[0]);
-  checkBucketAccessControl(o[1]);
+  checkBucketAccessControl(o[0] as api.BucketAccessControl);
+  checkBucketAccessControl(o[1] as api.BucketAccessControl);
 }
 
 core.int buildCounterBucketBilling = 0;
@@ -179,8 +179,8 @@
 
 void checkUnnamed3969(core.List<api.BucketCors> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucketCors(o[0]);
-  checkBucketCors(o[1]);
+  checkBucketCors(o[0] as api.BucketCors);
+  checkBucketCors(o[1] as api.BucketCors);
 }
 
 core.List<api.ObjectAccessControl> buildUnnamed3970() {
@@ -192,8 +192,8 @@
 
 void checkUnnamed3970(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkObjectAccessControl(o[0]);
-  checkObjectAccessControl(o[1]);
+  checkObjectAccessControl(o[0] as api.ObjectAccessControl);
+  checkObjectAccessControl(o[1] as api.ObjectAccessControl);
 }
 
 core.int buildCounterBucketEncryption = 0;
@@ -279,9 +279,11 @@
 void checkBucketIamConfiguration(api.BucketIamConfiguration o) {
   buildCounterBucketIamConfiguration++;
   if (buildCounterBucketIamConfiguration < 3) {
-    checkBucketIamConfigurationBucketPolicyOnly(o.bucketPolicyOnly);
+    checkBucketIamConfigurationBucketPolicyOnly(
+        o.bucketPolicyOnly as api.BucketIamConfigurationBucketPolicyOnly);
     checkBucketIamConfigurationUniformBucketLevelAccess(
-        o.uniformBucketLevelAccess);
+        o.uniformBucketLevelAccess
+            as api.BucketIamConfigurationUniformBucketLevelAccess);
   }
   buildCounterBucketIamConfiguration--;
 }
@@ -388,8 +390,9 @@
 void checkBucketLifecycleRule(api.BucketLifecycleRule o) {
   buildCounterBucketLifecycleRule++;
   if (buildCounterBucketLifecycleRule < 3) {
-    checkBucketLifecycleRuleAction(o.action);
-    checkBucketLifecycleRuleCondition(o.condition);
+    checkBucketLifecycleRuleAction(o.action as api.BucketLifecycleRuleAction);
+    checkBucketLifecycleRuleCondition(
+        o.condition as api.BucketLifecycleRuleCondition);
   }
   buildCounterBucketLifecycleRule--;
 }
@@ -403,8 +406,8 @@
 
 void checkUnnamed3973(core.List<api.BucketLifecycleRule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucketLifecycleRule(o[0]);
-  checkBucketLifecycleRule(o[1]);
+  checkBucketLifecycleRule(o[0] as api.BucketLifecycleRule);
+  checkBucketLifecycleRule(o[1] as api.BucketLifecycleRule);
 }
 
 core.int buildCounterBucketLifecycle = 0;
@@ -586,33 +589,34 @@
   buildCounterBucket++;
   if (buildCounterBucket < 3) {
     checkUnnamed3965(o.acl);
-    checkBucketBilling(o.billing);
+    checkBucketBilling(o.billing as api.BucketBilling);
     checkUnnamed3969(o.cors);
     unittest.expect(o.defaultEventBasedHold, unittest.isTrue);
     checkUnnamed3970(o.defaultObjectAcl);
-    checkBucketEncryption(o.encryption);
+    checkBucketEncryption(o.encryption as api.BucketEncryption);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkBucketIamConfiguration(o.iamConfiguration);
+    checkBucketIamConfiguration(
+        o.iamConfiguration as api.BucketIamConfiguration);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3971(o.labels);
-    checkBucketLifecycle(o.lifecycle);
+    checkBucketLifecycle(o.lifecycle as api.BucketLifecycle);
     unittest.expect(o.location, unittest.equals('foo'));
     unittest.expect(o.locationType, unittest.equals('foo'));
-    checkBucketLogging(o.logging);
+    checkBucketLogging(o.logging as api.BucketLogging);
     unittest.expect(o.metageneration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkBucketOwner(o.owner);
+    checkBucketOwner(o.owner as api.BucketOwner);
     unittest.expect(o.projectNumber, unittest.equals('foo'));
-    checkBucketRetentionPolicy(o.retentionPolicy);
+    checkBucketRetentionPolicy(o.retentionPolicy as api.BucketRetentionPolicy);
     unittest.expect(o.selfLink, unittest.equals('foo'));
     unittest.expect(o.storageClass, unittest.equals('foo'));
     unittest.expect(o.timeCreated,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(
         o.updated, unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkBucketVersioning(o.versioning);
-    checkBucketWebsite(o.website);
+    checkBucketVersioning(o.versioning as api.BucketVersioning);
+    checkBucketWebsite(o.website as api.BucketWebsite);
     checkUnnamed3974(o.zoneAffinity);
   }
   buildCounterBucket--;
@@ -671,7 +675,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkBucketAccessControlProjectTeam(o.projectTeam);
+    checkBucketAccessControlProjectTeam(
+        o.projectTeam as api.BucketAccessControlProjectTeam);
     unittest.expect(o.role, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -687,8 +692,8 @@
 
 void checkUnnamed3975(core.List<api.BucketAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucketAccessControl(o[0]);
-  checkBucketAccessControl(o[1]);
+  checkBucketAccessControl(o[0] as api.BucketAccessControl);
+  checkBucketAccessControl(o[1] as api.BucketAccessControl);
 }
 
 core.int buildCounterBucketAccessControls = 0;
@@ -721,8 +726,8 @@
 
 void checkUnnamed3976(core.List<api.Bucket> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBucket(o[0]);
-  checkBucket(o[1]);
+  checkBucket(o[0] as api.Bucket);
+  checkBucket(o[1] as api.Bucket);
 }
 
 core.int buildCounterBuckets = 0;
@@ -838,7 +843,8 @@
   if (buildCounterComposeRequestSourceObjects < 3) {
     unittest.expect(o.generation, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkComposeRequestSourceObjectsObjectPreconditions(o.objectPreconditions);
+    checkComposeRequestSourceObjectsObjectPreconditions(o.objectPreconditions
+        as api.ComposeRequestSourceObjectsObjectPreconditions);
   }
   buildCounterComposeRequestSourceObjects--;
 }
@@ -852,8 +858,8 @@
 
 void checkUnnamed3978(core.List<api.ComposeRequestSourceObjects> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComposeRequestSourceObjects(o[0]);
-  checkComposeRequestSourceObjects(o[1]);
+  checkComposeRequestSourceObjects(o[0] as api.ComposeRequestSourceObjects);
+  checkComposeRequestSourceObjects(o[1] as api.ComposeRequestSourceObjects);
 }
 
 core.int buildCounterComposeRequest = 0;
@@ -872,7 +878,7 @@
 void checkComposeRequest(api.ComposeRequest o) {
   buildCounterComposeRequest++;
   if (buildCounterComposeRequest < 3) {
-    checkObject(o.destination);
+    checkObject(o.destination as api.Object);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed3978(o.sourceObjects);
   }
@@ -921,7 +927,7 @@
   buildCounterHmacKey++;
   if (buildCounterHmacKey < 3) {
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkHmacKeyMetadata(o.metadata);
+    checkHmacKeyMetadata(o.metadata as api.HmacKeyMetadata);
     unittest.expect(o.secret, unittest.equals('foo'));
   }
   buildCounterHmacKey--;
@@ -975,8 +981,8 @@
 
 void checkUnnamed3979(core.List<api.HmacKeyMetadata> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHmacKeyMetadata(o[0]);
-  checkHmacKeyMetadata(o[1]);
+  checkHmacKeyMetadata(o[0] as api.HmacKeyMetadata);
+  checkHmacKeyMetadata(o[1] as api.HmacKeyMetadata);
 }
 
 core.int buildCounterHmacKeysMetadata = 0;
@@ -1072,8 +1078,8 @@
 
 void checkUnnamed3982(core.List<api.Notification> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNotification(o[0]);
-  checkNotification(o[1]);
+  checkNotification(o[0] as api.Notification);
+  checkNotification(o[1] as api.Notification);
 }
 
 core.int buildCounterNotifications = 0;
@@ -1106,8 +1112,8 @@
 
 void checkUnnamed3983(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkObjectAccessControl(o[0]);
-  checkObjectAccessControl(o[1]);
+  checkObjectAccessControl(o[0] as api.ObjectAccessControl);
+  checkObjectAccessControl(o[1] as api.ObjectAccessControl);
 }
 
 core.int buildCounterObjectCustomerEncryption = 0;
@@ -1221,7 +1227,8 @@
     unittest.expect(o.crc32c, unittest.equals('foo'));
     unittest.expect(o.customTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
-    checkObjectCustomerEncryption(o.customerEncryption);
+    checkObjectCustomerEncryption(
+        o.customerEncryption as api.ObjectCustomerEncryption);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.eventBasedHold, unittest.isTrue);
     unittest.expect(o.generation, unittest.equals('foo'));
@@ -1233,7 +1240,7 @@
     checkUnnamed3984(o.metadata);
     unittest.expect(o.metageneration, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkObjectOwner(o.owner);
+    checkObjectOwner(o.owner as api.ObjectOwner);
     unittest.expect(o.retentionExpirationTime,
         unittest.equals(core.DateTime.parse("2002-02-27T14:01:02")));
     unittest.expect(o.selfLink, unittest.equals('foo'));
@@ -1309,7 +1316,8 @@
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.object, unittest.equals('foo'));
-    checkObjectAccessControlProjectTeam(o.projectTeam);
+    checkObjectAccessControlProjectTeam(
+        o.projectTeam as api.ObjectAccessControlProjectTeam);
     unittest.expect(o.role, unittest.equals('foo'));
     unittest.expect(o.selfLink, unittest.equals('foo'));
   }
@@ -1325,8 +1333,8 @@
 
 void checkUnnamed3985(core.List<api.ObjectAccessControl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkObjectAccessControl(o[0]);
-  checkObjectAccessControl(o[1]);
+  checkObjectAccessControl(o[0] as api.ObjectAccessControl);
+  checkObjectAccessControl(o[1] as api.ObjectAccessControl);
 }
 
 core.int buildCounterObjectAccessControls = 0;
@@ -1359,8 +1367,8 @@
 
 void checkUnnamed3986(core.List<api.Object> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkObject(o[0]);
-  checkObject(o[1]);
+  checkObject(o[0] as api.Object);
+  checkObject(o[1] as api.Object);
 }
 
 core.List<core.String> buildUnnamed3987() {
@@ -1430,7 +1438,7 @@
 void checkPolicyBindings(api.PolicyBindings o) {
   buildCounterPolicyBindings++;
   if (buildCounterPolicyBindings < 3) {
-    checkExpr(o.condition);
+    checkExpr(o.condition as api.Expr);
     checkUnnamed3988(o.members);
     unittest.expect(o.role, unittest.equals('foo'));
   }
@@ -1446,8 +1454,8 @@
 
 void checkUnnamed3989(core.List<api.PolicyBindings> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPolicyBindings(o[0]);
-  checkPolicyBindings(o[1]);
+  checkPolicyBindings(o[0] as api.PolicyBindings);
+  checkPolicyBindings(o[1] as api.PolicyBindings);
 }
 
 core.int buildCounterPolicy = 0;
@@ -1499,7 +1507,7 @@
     unittest.expect(o.done, unittest.isTrue);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.objectSize, unittest.equals('foo'));
-    checkObject(o.resource);
+    checkObject(o.resource as api.Object);
     unittest.expect(o.rewriteToken, unittest.equals('foo'));
     unittest.expect(o.totalBytesRewritten, unittest.equals('foo'));
   }
@@ -1592,7 +1600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketBilling();
       var od = api.BucketBilling.fromJson(o.toJson());
-      checkBucketBilling(od);
+      checkBucketBilling(od as api.BucketBilling);
     });
   });
 
@@ -1600,7 +1608,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketCors();
       var od = api.BucketCors.fromJson(o.toJson());
-      checkBucketCors(od);
+      checkBucketCors(od as api.BucketCors);
     });
   });
 
@@ -1608,7 +1616,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketEncryption();
       var od = api.BucketEncryption.fromJson(o.toJson());
-      checkBucketEncryption(od);
+      checkBucketEncryption(od as api.BucketEncryption);
     });
   });
 
@@ -1616,7 +1624,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketIamConfigurationBucketPolicyOnly();
       var od = api.BucketIamConfigurationBucketPolicyOnly.fromJson(o.toJson());
-      checkBucketIamConfigurationBucketPolicyOnly(od);
+      checkBucketIamConfigurationBucketPolicyOnly(
+          od as api.BucketIamConfigurationBucketPolicyOnly);
     });
   });
 
@@ -1626,7 +1635,8 @@
       var o = buildBucketIamConfigurationUniformBucketLevelAccess();
       var od = api.BucketIamConfigurationUniformBucketLevelAccess.fromJson(
           o.toJson());
-      checkBucketIamConfigurationUniformBucketLevelAccess(od);
+      checkBucketIamConfigurationUniformBucketLevelAccess(
+          od as api.BucketIamConfigurationUniformBucketLevelAccess);
     });
   });
 
@@ -1634,7 +1644,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketIamConfiguration();
       var od = api.BucketIamConfiguration.fromJson(o.toJson());
-      checkBucketIamConfiguration(od);
+      checkBucketIamConfiguration(od as api.BucketIamConfiguration);
     });
   });
 
@@ -1642,7 +1652,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketLifecycleRuleAction();
       var od = api.BucketLifecycleRuleAction.fromJson(o.toJson());
-      checkBucketLifecycleRuleAction(od);
+      checkBucketLifecycleRuleAction(od as api.BucketLifecycleRuleAction);
     });
   });
 
@@ -1650,7 +1660,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketLifecycleRuleCondition();
       var od = api.BucketLifecycleRuleCondition.fromJson(o.toJson());
-      checkBucketLifecycleRuleCondition(od);
+      checkBucketLifecycleRuleCondition(od as api.BucketLifecycleRuleCondition);
     });
   });
 
@@ -1658,7 +1668,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketLifecycleRule();
       var od = api.BucketLifecycleRule.fromJson(o.toJson());
-      checkBucketLifecycleRule(od);
+      checkBucketLifecycleRule(od as api.BucketLifecycleRule);
     });
   });
 
@@ -1666,7 +1676,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketLifecycle();
       var od = api.BucketLifecycle.fromJson(o.toJson());
-      checkBucketLifecycle(od);
+      checkBucketLifecycle(od as api.BucketLifecycle);
     });
   });
 
@@ -1674,7 +1684,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketLogging();
       var od = api.BucketLogging.fromJson(o.toJson());
-      checkBucketLogging(od);
+      checkBucketLogging(od as api.BucketLogging);
     });
   });
 
@@ -1682,7 +1692,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketOwner();
       var od = api.BucketOwner.fromJson(o.toJson());
-      checkBucketOwner(od);
+      checkBucketOwner(od as api.BucketOwner);
     });
   });
 
@@ -1690,7 +1700,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketRetentionPolicy();
       var od = api.BucketRetentionPolicy.fromJson(o.toJson());
-      checkBucketRetentionPolicy(od);
+      checkBucketRetentionPolicy(od as api.BucketRetentionPolicy);
     });
   });
 
@@ -1698,7 +1708,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketVersioning();
       var od = api.BucketVersioning.fromJson(o.toJson());
-      checkBucketVersioning(od);
+      checkBucketVersioning(od as api.BucketVersioning);
     });
   });
 
@@ -1706,7 +1716,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketWebsite();
       var od = api.BucketWebsite.fromJson(o.toJson());
-      checkBucketWebsite(od);
+      checkBucketWebsite(od as api.BucketWebsite);
     });
   });
 
@@ -1714,7 +1724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucket();
       var od = api.Bucket.fromJson(o.toJson());
-      checkBucket(od);
+      checkBucket(od as api.Bucket);
     });
   });
 
@@ -1722,7 +1732,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketAccessControlProjectTeam();
       var od = api.BucketAccessControlProjectTeam.fromJson(o.toJson());
-      checkBucketAccessControlProjectTeam(od);
+      checkBucketAccessControlProjectTeam(
+          od as api.BucketAccessControlProjectTeam);
     });
   });
 
@@ -1730,7 +1741,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketAccessControl();
       var od = api.BucketAccessControl.fromJson(o.toJson());
-      checkBucketAccessControl(od);
+      checkBucketAccessControl(od as api.BucketAccessControl);
     });
   });
 
@@ -1738,7 +1749,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBucketAccessControls();
       var od = api.BucketAccessControls.fromJson(o.toJson());
-      checkBucketAccessControls(od);
+      checkBucketAccessControls(od as api.BucketAccessControls);
     });
   });
 
@@ -1746,7 +1757,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuckets();
       var od = api.Buckets.fromJson(o.toJson());
-      checkBuckets(od);
+      checkBuckets(od as api.Buckets);
     });
   });
 
@@ -1754,7 +1765,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -1764,7 +1775,8 @@
       var o = buildComposeRequestSourceObjectsObjectPreconditions();
       var od = api.ComposeRequestSourceObjectsObjectPreconditions.fromJson(
           o.toJson());
-      checkComposeRequestSourceObjectsObjectPreconditions(od);
+      checkComposeRequestSourceObjectsObjectPreconditions(
+          od as api.ComposeRequestSourceObjectsObjectPreconditions);
     });
   });
 
@@ -1772,7 +1784,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComposeRequestSourceObjects();
       var od = api.ComposeRequestSourceObjects.fromJson(o.toJson());
-      checkComposeRequestSourceObjects(od);
+      checkComposeRequestSourceObjects(od as api.ComposeRequestSourceObjects);
     });
   });
 
@@ -1780,7 +1792,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComposeRequest();
       var od = api.ComposeRequest.fromJson(o.toJson());
-      checkComposeRequest(od);
+      checkComposeRequest(od as api.ComposeRequest);
     });
   });
 
@@ -1788,7 +1800,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExpr();
       var od = api.Expr.fromJson(o.toJson());
-      checkExpr(od);
+      checkExpr(od as api.Expr);
     });
   });
 
@@ -1796,7 +1808,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHmacKey();
       var od = api.HmacKey.fromJson(o.toJson());
-      checkHmacKey(od);
+      checkHmacKey(od as api.HmacKey);
     });
   });
 
@@ -1804,7 +1816,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHmacKeyMetadata();
       var od = api.HmacKeyMetadata.fromJson(o.toJson());
-      checkHmacKeyMetadata(od);
+      checkHmacKeyMetadata(od as api.HmacKeyMetadata);
     });
   });
 
@@ -1812,7 +1824,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHmacKeysMetadata();
       var od = api.HmacKeysMetadata.fromJson(o.toJson());
-      checkHmacKeysMetadata(od);
+      checkHmacKeysMetadata(od as api.HmacKeysMetadata);
     });
   });
 
@@ -1820,7 +1832,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotification();
       var od = api.Notification.fromJson(o.toJson());
-      checkNotification(od);
+      checkNotification(od as api.Notification);
     });
   });
 
@@ -1828,7 +1840,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotifications();
       var od = api.Notifications.fromJson(o.toJson());
-      checkNotifications(od);
+      checkNotifications(od as api.Notifications);
     });
   });
 
@@ -1836,7 +1848,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectCustomerEncryption();
       var od = api.ObjectCustomerEncryption.fromJson(o.toJson());
-      checkObjectCustomerEncryption(od);
+      checkObjectCustomerEncryption(od as api.ObjectCustomerEncryption);
     });
   });
 
@@ -1844,7 +1856,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectOwner();
       var od = api.ObjectOwner.fromJson(o.toJson());
-      checkObjectOwner(od);
+      checkObjectOwner(od as api.ObjectOwner);
     });
   });
 
@@ -1852,7 +1864,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObject();
       var od = api.Object.fromJson(o.toJson());
-      checkObject(od);
+      checkObject(od as api.Object);
     });
   });
 
@@ -1860,7 +1872,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectAccessControlProjectTeam();
       var od = api.ObjectAccessControlProjectTeam.fromJson(o.toJson());
-      checkObjectAccessControlProjectTeam(od);
+      checkObjectAccessControlProjectTeam(
+          od as api.ObjectAccessControlProjectTeam);
     });
   });
 
@@ -1868,7 +1881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectAccessControl();
       var od = api.ObjectAccessControl.fromJson(o.toJson());
-      checkObjectAccessControl(od);
+      checkObjectAccessControl(od as api.ObjectAccessControl);
     });
   });
 
@@ -1876,7 +1889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectAccessControls();
       var od = api.ObjectAccessControls.fromJson(o.toJson());
-      checkObjectAccessControls(od);
+      checkObjectAccessControls(od as api.ObjectAccessControls);
     });
   });
 
@@ -1884,7 +1897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjects();
       var od = api.Objects.fromJson(o.toJson());
-      checkObjects(od);
+      checkObjects(od as api.Objects);
     });
   });
 
@@ -1892,7 +1905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicyBindings();
       var od = api.PolicyBindings.fromJson(o.toJson());
-      checkPolicyBindings(od);
+      checkPolicyBindings(od as api.PolicyBindings);
     });
   });
 
@@ -1900,7 +1913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPolicy();
       var od = api.Policy.fromJson(o.toJson());
-      checkPolicy(od);
+      checkPolicy(od as api.Policy);
     });
   });
 
@@ -1908,7 +1921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRewriteResponse();
       var od = api.RewriteResponse.fromJson(o.toJson());
-      checkRewriteResponse(od);
+      checkRewriteResponse(od as api.RewriteResponse);
     });
   });
 
@@ -1916,7 +1929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildServiceAccount();
       var od = api.ServiceAccount.fromJson(o.toJson());
-      checkServiceAccount(od);
+      checkServiceAccount(od as api.ServiceAccount);
     });
   });
 
@@ -1924,7 +1937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestIamPermissionsResponse();
       var od = api.TestIamPermissionsResponse.fromJson(o.toJson());
-      checkTestIamPermissionsResponse(od);
+      checkTestIamPermissionsResponse(od as api.TestIamPermissionsResponse);
     });
   });
 
@@ -2067,7 +2080,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucketAccessControl(response);
+        checkBucketAccessControl(response as api.BucketAccessControl);
       })));
     });
 
@@ -2080,8 +2093,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BucketAccessControl.fromJson(json);
-        checkBucketAccessControl(obj);
+        var obj = api.BucketAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBucketAccessControl(obj as api.BucketAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2139,7 +2153,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucketAccessControl(response);
+        checkBucketAccessControl(response as api.BucketAccessControl);
       })));
     });
 
@@ -2207,7 +2221,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucketAccessControls(response);
+        checkBucketAccessControls(response as api.BucketAccessControls);
       })));
     });
 
@@ -2221,8 +2235,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BucketAccessControl.fromJson(json);
-        checkBucketAccessControl(obj);
+        var obj = api.BucketAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBucketAccessControl(obj as api.BucketAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2283,7 +2298,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucketAccessControl(response);
+        checkBucketAccessControl(response as api.BucketAccessControl);
       })));
     });
 
@@ -2297,8 +2312,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BucketAccessControl.fromJson(json);
-        checkBucketAccessControl(obj);
+        var obj = api.BucketAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBucketAccessControl(obj as api.BucketAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2359,7 +2375,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucketAccessControl(response);
+        checkBucketAccessControl(response as api.BucketAccessControl);
       })));
     });
   });
@@ -2503,7 +2519,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucket(response);
+        checkBucket(response as api.Bucket);
       })));
     });
 
@@ -2576,7 +2592,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -2592,8 +2608,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Bucket.fromJson(json);
-        checkBucket(obj);
+        var obj =
+            api.Bucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBucket(obj as api.Bucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2653,7 +2670,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucket(response);
+        checkBucket(response as api.Bucket);
       })));
     });
 
@@ -2729,7 +2746,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBuckets(response);
+        checkBuckets(response as api.Buckets);
       })));
     });
 
@@ -2800,7 +2817,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucket(response);
+        checkBucket(response as api.Bucket);
       })));
     });
 
@@ -2818,8 +2835,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Bucket.fromJson(json);
-        checkBucket(obj);
+        var obj =
+            api.Bucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBucket(obj as api.Bucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2886,7 +2904,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucket(response);
+        checkBucket(response as api.Bucket);
       })));
     });
 
@@ -2899,8 +2917,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Policy.fromJson(json);
-        checkPolicy(obj);
+        var obj =
+            api.Policy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPolicy(obj as api.Policy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2958,7 +2977,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -3029,7 +3048,8 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -3047,8 +3067,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Bucket.fromJson(json);
-        checkBucket(obj);
+        var obj =
+            api.Bucket.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkBucket(obj as api.Bucket);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3115,7 +3136,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBucket(response);
+        checkBucket(response as api.Bucket);
       })));
     });
   });
@@ -3127,8 +3148,9 @@
       var arg_request = buildChannel();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3312,7 +3334,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
 
@@ -3325,8 +3347,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ObjectAccessControl.fromJson(json);
-        checkObjectAccessControl(obj);
+        var obj = api.ObjectAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkObjectAccessControl(obj as api.ObjectAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3384,7 +3407,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
 
@@ -3460,7 +3483,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControls(response);
+        checkObjectAccessControls(response as api.ObjectAccessControls);
       })));
     });
 
@@ -3474,8 +3497,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ObjectAccessControl.fromJson(json);
-        checkObjectAccessControl(obj);
+        var obj = api.ObjectAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkObjectAccessControl(obj as api.ObjectAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3536,7 +3560,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
 
@@ -3550,8 +3574,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ObjectAccessControl.fromJson(json);
-        checkObjectAccessControl(obj);
+        var obj = api.ObjectAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkObjectAccessControl(obj as api.ObjectAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3612,7 +3637,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
   });
@@ -3756,7 +3781,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotification(response);
+        checkNotification(response as api.Notification);
       })));
     });
 
@@ -3769,8 +3794,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Notification.fromJson(json);
-        checkNotification(obj);
+        var obj = api.Notification.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkNotification(obj as api.Notification);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3828,7 +3854,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotification(response);
+        checkNotification(response as api.Notification);
       })));
     });
 
@@ -3896,7 +3922,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNotifications(response);
+        checkNotifications(response as api.Notifications);
       })));
     });
   });
@@ -4068,7 +4094,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
 
@@ -4083,8 +4109,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ObjectAccessControl.fromJson(json);
-        checkObjectAccessControl(obj);
+        var obj = api.ObjectAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkObjectAccessControl(obj as api.ObjectAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4154,7 +4181,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
 
@@ -4236,7 +4263,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControls(response);
+        checkObjectAccessControls(response as api.ObjectAccessControls);
       })));
     });
 
@@ -4252,8 +4279,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ObjectAccessControl.fromJson(json);
-        checkObjectAccessControl(obj);
+        var obj = api.ObjectAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkObjectAccessControl(obj as api.ObjectAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4326,7 +4354,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
 
@@ -4342,8 +4370,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ObjectAccessControl.fromJson(json);
-        checkObjectAccessControl(obj);
+        var obj = api.ObjectAccessControl.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkObjectAccessControl(obj as api.ObjectAccessControl);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4416,7 +4445,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjectAccessControl(response);
+        checkObjectAccessControl(response as api.ObjectAccessControl);
       })));
     });
   });
@@ -4436,8 +4465,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ComposeRequest.fromJson(json);
-        checkComposeRequest(obj);
+        var obj = api.ComposeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkComposeRequest(obj as api.ComposeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4516,7 +4546,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObject(response);
+        checkObject(response as api.Object);
       })));
     });
 
@@ -4544,8 +4574,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Object.fromJson(json);
-        checkObject(obj);
+        var obj =
+            api.Object.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkObject(obj as api.Object);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4662,7 +4693,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObject(response);
+        checkObject(response as api.Object);
       })));
     });
 
@@ -4851,7 +4882,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObject(response);
+        checkObject(response as api.Object);
       })));
     });
 
@@ -4933,7 +4964,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -4958,8 +4989,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Object.fromJson(json);
-        checkObject(obj);
+        var obj =
+            api.Object.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkObject(obj as api.Object);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5043,7 +5075,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObject(response);
+        checkObject(response as api.Object);
       })));
     });
 
@@ -5146,7 +5178,7 @@
               versions: arg_versions,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObjects(response);
+        checkObjects(response as api.Objects);
       })));
     });
 
@@ -5167,8 +5199,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Object.fromJson(json);
-        checkObject(obj);
+        var obj =
+            api.Object.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkObject(obj as api.Object);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5250,7 +5283,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObject(response);
+        checkObject(response as api.Object);
       })));
     });
 
@@ -5280,8 +5313,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Object.fromJson(json);
-        checkObject(obj);
+        var obj =
+            api.Object.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkObject(obj as api.Object);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5404,7 +5438,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRewriteResponse(response);
+        checkRewriteResponse(response as api.RewriteResponse);
       })));
     });
 
@@ -5419,8 +5453,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Policy.fromJson(json);
-        checkPolicy(obj);
+        var obj =
+            api.Policy.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPolicy(obj as api.Policy);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5490,7 +5525,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPolicy(response);
+        checkPolicy(response as api.Policy);
       })));
     });
 
@@ -5575,7 +5610,8 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestIamPermissionsResponse(response);
+        checkTestIamPermissionsResponse(
+            response as api.TestIamPermissionsResponse);
       })));
     });
 
@@ -5596,8 +5632,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Object.fromJson(json);
-        checkObject(obj);
+        var obj =
+            api.Object.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkObject(obj as api.Object);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5679,7 +5716,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkObject(response);
+        checkObject(response as api.Object);
       })));
     });
 
@@ -5701,8 +5738,9 @@
       var arg_versions = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5786,7 +5824,7 @@
               versions: arg_versions,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -5854,7 +5892,7 @@
           .create(arg_projectId, arg_serviceAccountEmail,
               userProject: arg_userProject, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHmacKey(response);
+        checkHmacKey(response as api.HmacKey);
       })));
     });
 
@@ -5986,7 +6024,7 @@
           .get(arg_projectId, arg_accessId,
               userProject: arg_userProject, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHmacKeyMetadata(response);
+        checkHmacKeyMetadata(response as api.HmacKeyMetadata);
       })));
     });
 
@@ -6066,7 +6104,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHmacKeysMetadata(response);
+        checkHmacKeysMetadata(response as api.HmacKeysMetadata);
       })));
     });
 
@@ -6079,8 +6117,9 @@
       var arg_userProject = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HmacKeyMetadata.fromJson(json);
-        checkHmacKeyMetadata(obj);
+        var obj = api.HmacKeyMetadata.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHmacKeyMetadata(obj as api.HmacKeyMetadata);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6137,7 +6176,7 @@
           .update(arg_request, arg_projectId, arg_accessId,
               userProject: arg_userProject, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHmacKeyMetadata(response);
+        checkHmacKeyMetadata(response as api.HmacKeyMetadata);
       })));
     });
   });
@@ -6207,7 +6246,7 @@
               userProject: arg_userProject,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkServiceAccount(response);
+        checkServiceAccount(response as api.ServiceAccount);
       })));
     });
   });
diff --git a/generated/googleapis/test/storagetransfer/v1_test.dart b/generated/googleapis/test/storagetransfer/v1_test.dart
index cf99626..dd20b99 100644
--- a/generated/googleapis/test/storagetransfer/v1_test.dart
+++ b/generated/googleapis/test/storagetransfer/v1_test.dart
@@ -110,7 +110,7 @@
 void checkAwsS3Data(api.AwsS3Data o) {
   buildCounterAwsS3Data++;
   if (buildCounterAwsS3Data < 3) {
-    checkAwsAccessKey(o.awsAccessKey);
+    checkAwsAccessKey(o.awsAccessKey as api.AwsAccessKey);
     unittest.expect(o.bucketName, unittest.equals('foo'));
   }
   buildCounterAwsS3Data--;
@@ -132,7 +132,7 @@
 void checkAzureBlobStorageData(api.AzureBlobStorageData o) {
   buildCounterAzureBlobStorageData++;
   if (buildCounterAzureBlobStorageData < 3) {
-    checkAzureCredentials(o.azureCredentials);
+    checkAzureCredentials(o.azureCredentials as api.AzureCredentials);
     unittest.expect(o.container, unittest.equals('foo'));
     unittest.expect(o.storageAccount, unittest.equals('foo'));
   }
@@ -254,8 +254,8 @@
 
 void checkUnnamed1397(core.List<api.ErrorLogEntry> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorLogEntry(o[0]);
-  checkErrorLogEntry(o[1]);
+  checkErrorLogEntry(o[0] as api.ErrorLogEntry);
+  checkErrorLogEntry(o[1] as api.ErrorLogEntry);
 }
 
 core.int buildCounterErrorSummary = 0;
@@ -347,8 +347,8 @@
 
 void checkUnnamed1398(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -381,8 +381,8 @@
 
 void checkUnnamed1399(core.List<api.TransferJob> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTransferJob(o[0]);
-  checkTransferJob(o[1]);
+  checkTransferJob(o[0] as api.TransferJob);
+  checkTransferJob(o[1] as api.TransferJob);
 }
 
 core.int buildCounterListTransferJobsResponse = 0;
@@ -576,7 +576,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed1403(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1404(o.response);
@@ -630,9 +630,9 @@
 void checkSchedule(api.Schedule o) {
   buildCounterSchedule++;
   if (buildCounterSchedule < 3) {
-    checkDate(o.scheduleEndDate);
-    checkDate(o.scheduleStartDate);
-    checkTimeOfDay(o.startTimeOfDay);
+    checkDate(o.scheduleEndDate as api.Date);
+    checkDate(o.scheduleStartDate as api.Date);
+    checkTimeOfDay(o.startTimeOfDay as api.TimeOfDay);
   }
   buildCounterSchedule--;
 }
@@ -804,11 +804,11 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.lastModificationTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNotificationConfig(o.notificationConfig);
+    checkNotificationConfig(o.notificationConfig as api.NotificationConfig);
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkSchedule(o.schedule);
+    checkSchedule(o.schedule as api.Schedule);
     unittest.expect(o.status, unittest.equals('foo'));
-    checkTransferSpec(o.transferSpec);
+    checkTransferSpec(o.transferSpec as api.TransferSpec);
   }
   buildCounterTransferJob--;
 }
@@ -822,8 +822,8 @@
 
 void checkUnnamed1407(core.List<api.ErrorSummary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorSummary(o[0]);
-  checkErrorSummary(o[1]);
+  checkErrorSummary(o[0] as api.ErrorSummary);
+  checkErrorSummary(o[1] as api.ErrorSummary);
 }
 
 core.int buildCounterTransferOperation = 0;
@@ -849,16 +849,16 @@
 void checkTransferOperation(api.TransferOperation o) {
   buildCounterTransferOperation++;
   if (buildCounterTransferOperation < 3) {
-    checkTransferCounters(o.counters);
+    checkTransferCounters(o.counters as api.TransferCounters);
     unittest.expect(o.endTime, unittest.equals('foo'));
     checkUnnamed1407(o.errorBreakdowns);
     unittest.expect(o.name, unittest.equals('foo'));
-    checkNotificationConfig(o.notificationConfig);
+    checkNotificationConfig(o.notificationConfig as api.NotificationConfig);
     unittest.expect(o.projectId, unittest.equals('foo'));
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.status, unittest.equals('foo'));
     unittest.expect(o.transferJobName, unittest.equals('foo'));
-    checkTransferSpec(o.transferSpec);
+    checkTransferSpec(o.transferSpec as api.TransferSpec);
   }
   buildCounterTransferOperation--;
 }
@@ -906,13 +906,14 @@
 void checkTransferSpec(api.TransferSpec o) {
   buildCounterTransferSpec++;
   if (buildCounterTransferSpec < 3) {
-    checkAwsS3Data(o.awsS3DataSource);
-    checkAzureBlobStorageData(o.azureBlobStorageDataSource);
-    checkGcsData(o.gcsDataSink);
-    checkGcsData(o.gcsDataSource);
-    checkHttpData(o.httpDataSource);
-    checkObjectConditions(o.objectConditions);
-    checkTransferOptions(o.transferOptions);
+    checkAwsS3Data(o.awsS3DataSource as api.AwsS3Data);
+    checkAzureBlobStorageData(
+        o.azureBlobStorageDataSource as api.AzureBlobStorageData);
+    checkGcsData(o.gcsDataSink as api.GcsData);
+    checkGcsData(o.gcsDataSource as api.GcsData);
+    checkHttpData(o.httpDataSource as api.HttpData);
+    checkObjectConditions(o.objectConditions as api.ObjectConditions);
+    checkTransferOptions(o.transferOptions as api.TransferOptions);
   }
   buildCounterTransferSpec--;
 }
@@ -934,7 +935,7 @@
   buildCounterUpdateTransferJobRequest++;
   if (buildCounterUpdateTransferJobRequest < 3) {
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkTransferJob(o.transferJob);
+    checkTransferJob(o.transferJob as api.TransferJob);
     unittest.expect(o.updateTransferJobFieldMask, unittest.equals('foo'));
   }
   buildCounterUpdateTransferJobRequest--;
@@ -945,7 +946,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAwsAccessKey();
       var od = api.AwsAccessKey.fromJson(o.toJson());
-      checkAwsAccessKey(od);
+      checkAwsAccessKey(od as api.AwsAccessKey);
     });
   });
 
@@ -953,7 +954,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAwsS3Data();
       var od = api.AwsS3Data.fromJson(o.toJson());
-      checkAwsS3Data(od);
+      checkAwsS3Data(od as api.AwsS3Data);
     });
   });
 
@@ -961,7 +962,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAzureBlobStorageData();
       var od = api.AzureBlobStorageData.fromJson(o.toJson());
-      checkAzureBlobStorageData(od);
+      checkAzureBlobStorageData(od as api.AzureBlobStorageData);
     });
   });
 
@@ -969,7 +970,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAzureCredentials();
       var od = api.AzureCredentials.fromJson(o.toJson());
-      checkAzureCredentials(od);
+      checkAzureCredentials(od as api.AzureCredentials);
     });
   });
 
@@ -977,7 +978,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -985,7 +986,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -993,7 +994,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1001,7 +1002,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorLogEntry();
       var od = api.ErrorLogEntry.fromJson(o.toJson());
-      checkErrorLogEntry(od);
+      checkErrorLogEntry(od as api.ErrorLogEntry);
     });
   });
 
@@ -1009,7 +1010,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorSummary();
       var od = api.ErrorSummary.fromJson(o.toJson());
-      checkErrorSummary(od);
+      checkErrorSummary(od as api.ErrorSummary);
     });
   });
 
@@ -1017,7 +1018,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsData();
       var od = api.GcsData.fromJson(o.toJson());
-      checkGcsData(od);
+      checkGcsData(od as api.GcsData);
     });
   });
 
@@ -1025,7 +1026,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleServiceAccount();
       var od = api.GoogleServiceAccount.fromJson(o.toJson());
-      checkGoogleServiceAccount(od);
+      checkGoogleServiceAccount(od as api.GoogleServiceAccount);
     });
   });
 
@@ -1033,7 +1034,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHttpData();
       var od = api.HttpData.fromJson(o.toJson());
-      checkHttpData(od);
+      checkHttpData(od as api.HttpData);
     });
   });
 
@@ -1041,7 +1042,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1049,7 +1050,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTransferJobsResponse();
       var od = api.ListTransferJobsResponse.fromJson(o.toJson());
-      checkListTransferJobsResponse(od);
+      checkListTransferJobsResponse(od as api.ListTransferJobsResponse);
     });
   });
 
@@ -1057,7 +1058,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNotificationConfig();
       var od = api.NotificationConfig.fromJson(o.toJson());
-      checkNotificationConfig(od);
+      checkNotificationConfig(od as api.NotificationConfig);
     });
   });
 
@@ -1065,7 +1066,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectConditions();
       var od = api.ObjectConditions.fromJson(o.toJson());
-      checkObjectConditions(od);
+      checkObjectConditions(od as api.ObjectConditions);
     });
   });
 
@@ -1073,7 +1074,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1081,7 +1082,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPauseTransferOperationRequest();
       var od = api.PauseTransferOperationRequest.fromJson(o.toJson());
-      checkPauseTransferOperationRequest(od);
+      checkPauseTransferOperationRequest(
+          od as api.PauseTransferOperationRequest);
     });
   });
 
@@ -1089,7 +1091,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildResumeTransferOperationRequest();
       var od = api.ResumeTransferOperationRequest.fromJson(o.toJson());
-      checkResumeTransferOperationRequest(od);
+      checkResumeTransferOperationRequest(
+          od as api.ResumeTransferOperationRequest);
     });
   });
 
@@ -1097,7 +1100,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchedule();
       var od = api.Schedule.fromJson(o.toJson());
-      checkSchedule(od);
+      checkSchedule(od as api.Schedule);
     });
   });
 
@@ -1105,7 +1108,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1113,7 +1116,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTimeOfDay();
       var od = api.TimeOfDay.fromJson(o.toJson());
-      checkTimeOfDay(od);
+      checkTimeOfDay(od as api.TimeOfDay);
     });
   });
 
@@ -1121,7 +1124,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferCounters();
       var od = api.TransferCounters.fromJson(o.toJson());
-      checkTransferCounters(od);
+      checkTransferCounters(od as api.TransferCounters);
     });
   });
 
@@ -1129,7 +1132,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferJob();
       var od = api.TransferJob.fromJson(o.toJson());
-      checkTransferJob(od);
+      checkTransferJob(od as api.TransferJob);
     });
   });
 
@@ -1137,7 +1140,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferOperation();
       var od = api.TransferOperation.fromJson(o.toJson());
-      checkTransferOperation(od);
+      checkTransferOperation(od as api.TransferOperation);
     });
   });
 
@@ -1145,7 +1148,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferOptions();
       var od = api.TransferOptions.fromJson(o.toJson());
-      checkTransferOptions(od);
+      checkTransferOptions(od as api.TransferOptions);
     });
   });
 
@@ -1153,7 +1156,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTransferSpec();
       var od = api.TransferSpec.fromJson(o.toJson());
-      checkTransferSpec(od);
+      checkTransferSpec(od as api.TransferSpec);
     });
   });
 
@@ -1161,7 +1164,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdateTransferJobRequest();
       var od = api.UpdateTransferJobRequest.fromJson(o.toJson());
-      checkUpdateTransferJobRequest(od);
+      checkUpdateTransferJobRequest(od as api.UpdateTransferJobRequest);
     });
   });
 
@@ -1212,7 +1215,7 @@
       res
           .get(arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleServiceAccount(response);
+        checkGoogleServiceAccount(response as api.GoogleServiceAccount);
       })));
     });
   });
@@ -1224,8 +1227,9 @@
       var arg_request = buildTransferJob();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TransferJob.fromJson(json);
-        checkTransferJob(obj);
+        var obj = api.TransferJob.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTransferJob(obj as api.TransferJob);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1264,7 +1268,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferJob(response);
+        checkTransferJob(response as api.TransferJob);
       })));
     });
 
@@ -1315,7 +1319,7 @@
       res
           .get(arg_jobName, projectId: arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferJob(response);
+        checkTransferJob(response as api.TransferJob);
       })));
     });
 
@@ -1373,7 +1377,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTransferJobsResponse(response);
+        checkListTransferJobsResponse(response as api.ListTransferJobsResponse);
       })));
     });
 
@@ -1384,8 +1388,9 @@
       var arg_jobName = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UpdateTransferJobRequest.fromJson(json);
-        checkUpdateTransferJobRequest(obj);
+        var obj = api.UpdateTransferJobRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUpdateTransferJobRequest(obj as api.UpdateTransferJobRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1425,7 +1430,7 @@
       res
           .patch(arg_request, arg_jobName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTransferJob(response);
+        checkTransferJob(response as api.TransferJob);
       })));
     });
   });
@@ -1438,8 +1443,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1479,7 +1485,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1527,7 +1533,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1587,7 +1593,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
 
@@ -1598,8 +1604,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PauseTransferOperationRequest.fromJson(json);
-        checkPauseTransferOperationRequest(obj);
+        var obj = api.PauseTransferOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPauseTransferOperationRequest(
+            obj as api.PauseTransferOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1639,7 +1647,7 @@
       res
           .pause(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1650,8 +1658,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ResumeTransferOperationRequest.fromJson(json);
-        checkResumeTransferOperationRequest(obj);
+        var obj = api.ResumeTransferOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkResumeTransferOperationRequest(
+            obj as api.ResumeTransferOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1691,7 +1701,7 @@
       res
           .resume(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
diff --git a/generated/googleapis/test/streetviewpublish/v1_test.dart b/generated/googleapis/test/streetviewpublish/v1_test.dart
index cadf8d0..a881cac 100644
--- a/generated/googleapis/test/streetviewpublish/v1_test.dart
+++ b/generated/googleapis/test/streetviewpublish/v1_test.dart
@@ -115,8 +115,8 @@
 
 void checkUnnamed5720(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.int buildCounterBatchDeletePhotosResponse = 0;
@@ -147,8 +147,8 @@
 
 void checkUnnamed5721(core.List<api.PhotoResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPhotoResponse(o[0]);
-  checkPhotoResponse(o[1]);
+  checkPhotoResponse(o[0] as api.PhotoResponse);
+  checkPhotoResponse(o[1] as api.PhotoResponse);
 }
 
 core.int buildCounterBatchGetPhotosResponse = 0;
@@ -179,8 +179,8 @@
 
 void checkUnnamed5722(core.List<api.UpdatePhotoRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUpdatePhotoRequest(o[0]);
-  checkUpdatePhotoRequest(o[1]);
+  checkUpdatePhotoRequest(o[0] as api.UpdatePhotoRequest);
+  checkUpdatePhotoRequest(o[1] as api.UpdatePhotoRequest);
 }
 
 core.int buildCounterBatchUpdatePhotosRequest = 0;
@@ -211,8 +211,8 @@
 
 void checkUnnamed5723(core.List<api.PhotoResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPhotoResponse(o[0]);
-  checkPhotoResponse(o[1]);
+  checkPhotoResponse(o[0] as api.PhotoResponse);
+  checkPhotoResponse(o[1] as api.PhotoResponse);
 }
 
 core.int buildCounterBatchUpdatePhotosResponse = 0;
@@ -248,7 +248,7 @@
 void checkConnection(api.Connection o) {
   buildCounterConnection++;
   if (buildCounterConnection < 3) {
-    checkPhotoId(o.target);
+    checkPhotoId(o.target as api.PhotoId);
   }
   buildCounterConnection--;
 }
@@ -319,8 +319,8 @@
 
 void checkUnnamed5724(core.List<api.Photo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPhoto(o[0]);
-  checkPhoto(o[1]);
+  checkPhoto(o[0] as api.Photo);
+  checkPhoto(o[1] as api.Photo);
 }
 
 core.int buildCounterListPhotosResponse = 0;
@@ -421,7 +421,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5725(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5726(o.response);
@@ -438,8 +438,8 @@
 
 void checkUnnamed5727(core.List<api.Connection> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkConnection(o[0]);
-  checkConnection(o[1]);
+  checkConnection(o[0] as api.Connection);
+  checkConnection(o[1] as api.Connection);
 }
 
 core.List<api.Place> buildUnnamed5728() {
@@ -451,8 +451,8 @@
 
 void checkUnnamed5728(core.List<api.Place> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlace(o[0]);
-  checkPlace(o[1]);
+  checkPlace(o[0] as api.Place);
+  checkPlace(o[1] as api.Place);
 }
 
 core.int buildCounterPhoto = 0;
@@ -484,13 +484,13 @@
     checkUnnamed5727(o.connections);
     unittest.expect(o.downloadUrl, unittest.equals('foo'));
     unittest.expect(o.mapsPublishStatus, unittest.equals('foo'));
-    checkPhotoId(o.photoId);
+    checkPhotoId(o.photoId as api.PhotoId);
     checkUnnamed5728(o.places);
-    checkPose(o.pose);
+    checkPose(o.pose as api.Pose);
     unittest.expect(o.shareLink, unittest.equals('foo'));
     unittest.expect(o.thumbnailUrl, unittest.equals('foo'));
     unittest.expect(o.transferStatus, unittest.equals('foo'));
-    checkUploadRef(o.uploadReference);
+    checkUploadRef(o.uploadReference as api.UploadRef);
     unittest.expect(o.viewCount, unittest.equals('foo'));
   }
   buildCounterPhoto--;
@@ -530,8 +530,8 @@
 void checkPhotoResponse(api.PhotoResponse o) {
   buildCounterPhotoResponse++;
   if (buildCounterPhotoResponse < 3) {
-    checkPhoto(o.photo);
-    checkStatus(o.status);
+    checkPhoto(o.photo as api.Photo);
+    checkStatus(o.status as api.Status);
   }
   buildCounterPhotoResponse--;
 }
@@ -582,8 +582,8 @@
     unittest.expect(o.accuracyMeters, unittest.equals(42.0));
     unittest.expect(o.altitude, unittest.equals(42.0));
     unittest.expect(o.heading, unittest.equals(42.0));
-    checkLatLng(o.latLngPair);
-    checkLevel(o.level);
+    checkLatLng(o.latLngPair as api.LatLng);
+    checkLevel(o.level as api.Level);
     unittest.expect(o.pitch, unittest.equals(42.0));
     unittest.expect(o.roll, unittest.equals(42.0));
   }
@@ -670,7 +670,7 @@
 void checkUpdatePhotoRequest(api.UpdatePhotoRequest o) {
   buildCounterUpdatePhotoRequest++;
   if (buildCounterUpdatePhotoRequest < 3) {
-    checkPhoto(o.photo);
+    checkPhoto(o.photo as api.Photo);
     unittest.expect(o.updateMask, unittest.equals('foo'));
   }
   buildCounterUpdatePhotoRequest--;
@@ -713,7 +713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchDeletePhotosRequest();
       var od = api.BatchDeletePhotosRequest.fromJson(o.toJson());
-      checkBatchDeletePhotosRequest(od);
+      checkBatchDeletePhotosRequest(od as api.BatchDeletePhotosRequest);
     });
   });
 
@@ -721,7 +721,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchDeletePhotosResponse();
       var od = api.BatchDeletePhotosResponse.fromJson(o.toJson());
-      checkBatchDeletePhotosResponse(od);
+      checkBatchDeletePhotosResponse(od as api.BatchDeletePhotosResponse);
     });
   });
 
@@ -729,7 +729,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchGetPhotosResponse();
       var od = api.BatchGetPhotosResponse.fromJson(o.toJson());
-      checkBatchGetPhotosResponse(od);
+      checkBatchGetPhotosResponse(od as api.BatchGetPhotosResponse);
     });
   });
 
@@ -737,7 +737,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdatePhotosRequest();
       var od = api.BatchUpdatePhotosRequest.fromJson(o.toJson());
-      checkBatchUpdatePhotosRequest(od);
+      checkBatchUpdatePhotosRequest(od as api.BatchUpdatePhotosRequest);
     });
   });
 
@@ -745,7 +745,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchUpdatePhotosResponse();
       var od = api.BatchUpdatePhotosResponse.fromJson(o.toJson());
-      checkBatchUpdatePhotosResponse(od);
+      checkBatchUpdatePhotosResponse(od as api.BatchUpdatePhotosResponse);
     });
   });
 
@@ -753,7 +753,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildConnection();
       var od = api.Connection.fromJson(o.toJson());
-      checkConnection(od);
+      checkConnection(od as api.Connection);
     });
   });
 
@@ -761,7 +761,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -769,7 +769,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatLng();
       var od = api.LatLng.fromJson(o.toJson());
-      checkLatLng(od);
+      checkLatLng(od as api.LatLng);
     });
   });
 
@@ -777,7 +777,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLevel();
       var od = api.Level.fromJson(o.toJson());
-      checkLevel(od);
+      checkLevel(od as api.Level);
     });
   });
 
@@ -785,7 +785,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListPhotosResponse();
       var od = api.ListPhotosResponse.fromJson(o.toJson());
-      checkListPhotosResponse(od);
+      checkListPhotosResponse(od as api.ListPhotosResponse);
     });
   });
 
@@ -793,7 +793,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -801,7 +801,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPhoto();
       var od = api.Photo.fromJson(o.toJson());
-      checkPhoto(od);
+      checkPhoto(od as api.Photo);
     });
   });
 
@@ -809,7 +809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPhotoId();
       var od = api.PhotoId.fromJson(o.toJson());
-      checkPhotoId(od);
+      checkPhotoId(od as api.PhotoId);
     });
   });
 
@@ -817,7 +817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPhotoResponse();
       var od = api.PhotoResponse.fromJson(o.toJson());
-      checkPhotoResponse(od);
+      checkPhotoResponse(od as api.PhotoResponse);
     });
   });
 
@@ -825,7 +825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlace();
       var od = api.Place.fromJson(o.toJson());
-      checkPlace(od);
+      checkPlace(od as api.Place);
     });
   });
 
@@ -833,7 +833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPose();
       var od = api.Pose.fromJson(o.toJson());
-      checkPose(od);
+      checkPose(od as api.Pose);
     });
   });
 
@@ -841,7 +841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -849,7 +849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUpdatePhotoRequest();
       var od = api.UpdatePhotoRequest.fromJson(o.toJson());
-      checkUpdatePhotoRequest(od);
+      checkUpdatePhotoRequest(od as api.UpdatePhotoRequest);
     });
   });
 
@@ -857,7 +857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUploadRef();
       var od = api.UploadRef.fromJson(o.toJson());
-      checkUploadRef(od);
+      checkUploadRef(od as api.UploadRef);
     });
   });
 
@@ -868,8 +868,9 @@
       var arg_request = buildPhoto();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Photo.fromJson(json);
-        checkPhoto(obj);
+        var obj =
+            api.Photo.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPhoto(obj as api.Photo);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -908,7 +909,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPhoto(response);
+        checkPhoto(response as api.Photo);
       })));
     });
 
@@ -958,7 +959,7 @@
       res
           .delete(arg_photoId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1016,7 +1017,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPhoto(response);
+        checkPhoto(response as api.Photo);
       })));
     });
 
@@ -1026,8 +1027,9 @@
       var arg_request = buildEmpty();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Empty.fromJson(json);
-        checkEmpty(obj);
+        var obj =
+            api.Empty.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEmpty(obj as api.Empty);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1066,7 +1068,7 @@
       res
           .startUpload(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUploadRef(response);
+        checkUploadRef(response as api.UploadRef);
       })));
     });
 
@@ -1078,8 +1080,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Photo.fromJson(json);
-        checkPhoto(obj);
+        var obj =
+            api.Photo.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPhoto(obj as api.Photo);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1124,7 +1127,7 @@
           .update(arg_request, arg_id,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPhoto(response);
+        checkPhoto(response as api.Photo);
       })));
     });
   });
@@ -1136,8 +1139,9 @@
       var arg_request = buildBatchDeletePhotosRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchDeletePhotosRequest.fromJson(json);
-        checkBatchDeletePhotosRequest(obj);
+        var obj = api.BatchDeletePhotosRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchDeletePhotosRequest(obj as api.BatchDeletePhotosRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1176,7 +1180,8 @@
       res
           .batchDelete(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchDeletePhotosResponse(response);
+        checkBatchDeletePhotosResponse(
+            response as api.BatchDeletePhotosResponse);
       })));
     });
 
@@ -1233,7 +1238,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchGetPhotosResponse(response);
+        checkBatchGetPhotosResponse(response as api.BatchGetPhotosResponse);
       })));
     });
 
@@ -1243,8 +1248,9 @@
       var arg_request = buildBatchUpdatePhotosRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchUpdatePhotosRequest.fromJson(json);
-        checkBatchUpdatePhotosRequest(obj);
+        var obj = api.BatchUpdatePhotosRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchUpdatePhotosRequest(obj as api.BatchUpdatePhotosRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1283,7 +1289,8 @@
       res
           .batchUpdate(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchUpdatePhotosResponse(response);
+        checkBatchUpdatePhotosResponse(
+            response as api.BatchUpdatePhotosResponse);
       })));
     });
 
@@ -1348,7 +1355,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListPhotosResponse(response);
+        checkListPhotosResponse(response as api.ListPhotosResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/tagmanager/v1_test.dart b/generated/googleapis/test/tagmanager/v1_test.dart
index 96b3177..c229723 100644
--- a/generated/googleapis/test/tagmanager/v1_test.dart
+++ b/generated/googleapis/test/tagmanager/v1_test.dart
@@ -140,8 +140,8 @@
 
 void checkUnnamed1853(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterCondition = 0;
@@ -286,8 +286,8 @@
 
 void checkUnnamed1858(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFolder(o[0]);
-  checkFolder(o[1]);
+  checkFolder(o[0] as api.Folder);
+  checkFolder(o[1] as api.Folder);
 }
 
 core.List<api.Macro> buildUnnamed1859() {
@@ -299,8 +299,8 @@
 
 void checkUnnamed1859(core.List<api.Macro> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMacro(o[0]);
-  checkMacro(o[1]);
+  checkMacro(o[0] as api.Macro);
+  checkMacro(o[1] as api.Macro);
 }
 
 core.List<api.Rule> buildUnnamed1860() {
@@ -312,8 +312,8 @@
 
 void checkUnnamed1860(core.List<api.Rule> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRule(o[0]);
-  checkRule(o[1]);
+  checkRule(o[0] as api.Rule);
+  checkRule(o[1] as api.Rule);
 }
 
 core.List<api.Tag> buildUnnamed1861() {
@@ -325,8 +325,8 @@
 
 void checkUnnamed1861(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTag(o[0]);
-  checkTag(o[1]);
+  checkTag(o[0] as api.Tag);
+  checkTag(o[1] as api.Tag);
 }
 
 core.List<api.Trigger> buildUnnamed1862() {
@@ -338,8 +338,8 @@
 
 void checkUnnamed1862(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrigger(o[0]);
-  checkTrigger(o[1]);
+  checkTrigger(o[0] as api.Trigger);
+  checkTrigger(o[1] as api.Trigger);
 }
 
 core.List<api.Variable> buildUnnamed1863() {
@@ -351,8 +351,8 @@
 
 void checkUnnamed1863(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterContainerVersion = 0;
@@ -383,7 +383,7 @@
   buildCounterContainerVersion++;
   if (buildCounterContainerVersion < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkContainer(o.container);
+    checkContainer(o.container as api.Container);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.containerVersionId, unittest.equals('foo'));
     unittest.expect(o.deleted, unittest.isTrue);
@@ -478,7 +478,7 @@
   buildCounterCreateContainerVersionResponse++;
   if (buildCounterCreateContainerVersionResponse < 3) {
     unittest.expect(o.compilerError, unittest.isTrue);
-    checkContainerVersion(o.containerVersion);
+    checkContainerVersion(o.containerVersion as api.ContainerVersion);
   }
   buildCounterCreateContainerVersionResponse--;
 }
@@ -560,8 +560,8 @@
 
 void checkUnnamed1864(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTag(o[0]);
-  checkTag(o[1]);
+  checkTag(o[0] as api.Tag);
+  checkTag(o[1] as api.Tag);
 }
 
 core.List<api.Trigger> buildUnnamed1865() {
@@ -573,8 +573,8 @@
 
 void checkUnnamed1865(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrigger(o[0]);
-  checkTrigger(o[1]);
+  checkTrigger(o[0] as api.Trigger);
+  checkTrigger(o[1] as api.Trigger);
 }
 
 core.List<api.Variable> buildUnnamed1866() {
@@ -586,8 +586,8 @@
 
 void checkUnnamed1866(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterFolderEntities = 0;
@@ -622,8 +622,8 @@
 
 void checkUnnamed1867(core.List<api.UserAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserAccess(o[0]);
-  checkUserAccess(o[1]);
+  checkUserAccess(o[0] as api.UserAccess);
+  checkUserAccess(o[1] as api.UserAccess);
 }
 
 core.int buildCounterListAccountUsersResponse = 0;
@@ -654,8 +654,8 @@
 
 void checkUnnamed1868(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterListAccountsResponse = 0;
@@ -686,8 +686,8 @@
 
 void checkUnnamed1869(core.List<api.ContainerVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainerVersion(o[0]);
-  checkContainerVersion(o[1]);
+  checkContainerVersion(o[0] as api.ContainerVersion);
+  checkContainerVersion(o[1] as api.ContainerVersion);
 }
 
 core.List<api.ContainerVersionHeader> buildUnnamed1870() {
@@ -699,8 +699,8 @@
 
 void checkUnnamed1870(core.List<api.ContainerVersionHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainerVersionHeader(o[0]);
-  checkContainerVersionHeader(o[1]);
+  checkContainerVersionHeader(o[0] as api.ContainerVersionHeader);
+  checkContainerVersionHeader(o[1] as api.ContainerVersionHeader);
 }
 
 core.int buildCounterListContainerVersionsResponse = 0;
@@ -733,8 +733,8 @@
 
 void checkUnnamed1871(core.List<api.Container> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainer(o[0]);
-  checkContainer(o[1]);
+  checkContainer(o[0] as api.Container);
+  checkContainer(o[1] as api.Container);
 }
 
 core.int buildCounterListContainersResponse = 0;
@@ -765,8 +765,8 @@
 
 void checkUnnamed1872(core.List<api.Environment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnvironment(o[0]);
-  checkEnvironment(o[1]);
+  checkEnvironment(o[0] as api.Environment);
+  checkEnvironment(o[1] as api.Environment);
 }
 
 core.int buildCounterListEnvironmentsResponse = 0;
@@ -797,8 +797,8 @@
 
 void checkUnnamed1873(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFolder(o[0]);
-  checkFolder(o[1]);
+  checkFolder(o[0] as api.Folder);
+  checkFolder(o[1] as api.Folder);
 }
 
 core.int buildCounterListFoldersResponse = 0;
@@ -829,8 +829,8 @@
 
 void checkUnnamed1874(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTag(o[0]);
-  checkTag(o[1]);
+  checkTag(o[0] as api.Tag);
+  checkTag(o[1] as api.Tag);
 }
 
 core.int buildCounterListTagsResponse = 0;
@@ -861,8 +861,8 @@
 
 void checkUnnamed1875(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrigger(o[0]);
-  checkTrigger(o[1]);
+  checkTrigger(o[0] as api.Trigger);
+  checkTrigger(o[1] as api.Trigger);
 }
 
 core.int buildCounterListTriggersResponse = 0;
@@ -893,8 +893,8 @@
 
 void checkUnnamed1876(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterListVariablesResponse = 0;
@@ -951,8 +951,8 @@
 
 void checkUnnamed1879(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterMacro = 0;
@@ -1007,8 +1007,8 @@
 
 void checkUnnamed1880(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.List<api.Parameter> buildUnnamed1881() {
@@ -1020,8 +1020,8 @@
 
 void checkUnnamed1881(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterParameter = 0;
@@ -1068,7 +1068,7 @@
   buildCounterPublishContainerVersionResponse++;
   if (buildCounterPublishContainerVersionResponse < 3) {
     unittest.expect(o.compilerError, unittest.isTrue);
-    checkContainerVersion(o.containerVersion);
+    checkContainerVersion(o.containerVersion as api.ContainerVersion);
   }
   buildCounterPublishContainerVersionResponse--;
 }
@@ -1082,8 +1082,8 @@
 
 void checkUnnamed1882(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.int buildCounterRule = 0;
@@ -1199,8 +1199,8 @@
 
 void checkUnnamed1887(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.List<api.SetupTag> buildUnnamed1888() {
@@ -1212,8 +1212,8 @@
 
 void checkUnnamed1888(core.List<api.SetupTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSetupTag(o[0]);
-  checkSetupTag(o[1]);
+  checkSetupTag(o[0] as api.SetupTag);
+  checkSetupTag(o[1] as api.SetupTag);
 }
 
 core.List<api.TeardownTag> buildUnnamed1889() {
@@ -1225,8 +1225,8 @@
 
 void checkUnnamed1889(core.List<api.TeardownTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTeardownTag(o[0]);
-  checkTeardownTag(o[1]);
+  checkTeardownTag(o[0] as api.TeardownTag);
+  checkTeardownTag(o[1] as api.TeardownTag);
 }
 
 core.int buildCounterTag = 0;
@@ -1276,7 +1276,7 @@
     checkUnnamed1887(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.paused, unittest.isTrue);
-    checkParameter(o.priority);
+    checkParameter(o.priority as api.Parameter);
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
     checkUnnamed1888(o.setupTag);
@@ -1318,8 +1318,8 @@
 
 void checkUnnamed1890(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<api.Condition> buildUnnamed1891() {
@@ -1331,8 +1331,8 @@
 
 void checkUnnamed1891(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<api.Condition> buildUnnamed1892() {
@@ -1344,8 +1344,8 @@
 
 void checkUnnamed1892(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<api.Parameter> buildUnnamed1893() {
@@ -1357,8 +1357,8 @@
 
 void checkUnnamed1893(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterTrigger = 0;
@@ -1404,32 +1404,32 @@
   if (buildCounterTrigger < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkUnnamed1890(o.autoEventFilter);
-    checkParameter(o.checkValidation);
+    checkParameter(o.checkValidation as api.Parameter);
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkParameter(o.continuousTimeMinMilliseconds);
+    checkParameter(o.continuousTimeMinMilliseconds as api.Parameter);
     checkUnnamed1891(o.customEventFilter);
-    checkParameter(o.eventName);
+    checkParameter(o.eventName as api.Parameter);
     checkUnnamed1892(o.filter);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkParameter(o.horizontalScrollPercentageList);
-    checkParameter(o.interval);
-    checkParameter(o.intervalSeconds);
-    checkParameter(o.limit);
-    checkParameter(o.maxTimerLengthSeconds);
+    checkParameter(o.horizontalScrollPercentageList as api.Parameter);
+    checkParameter(o.interval as api.Parameter);
+    checkParameter(o.intervalSeconds as api.Parameter);
+    checkParameter(o.limit as api.Parameter);
+    checkParameter(o.maxTimerLengthSeconds as api.Parameter);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed1893(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
-    checkParameter(o.selector);
-    checkParameter(o.totalTimeMinMilliseconds);
+    checkParameter(o.selector as api.Parameter);
+    checkParameter(o.totalTimeMinMilliseconds as api.Parameter);
     unittest.expect(o.triggerId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkParameter(o.uniqueTriggerId);
-    checkParameter(o.verticalScrollPercentageList);
-    checkParameter(o.visibilitySelector);
-    checkParameter(o.visiblePercentageMax);
-    checkParameter(o.visiblePercentageMin);
-    checkParameter(o.waitForTags);
-    checkParameter(o.waitForTagsTimeout);
+    checkParameter(o.uniqueTriggerId as api.Parameter);
+    checkParameter(o.verticalScrollPercentageList as api.Parameter);
+    checkParameter(o.visibilitySelector as api.Parameter);
+    checkParameter(o.visiblePercentageMax as api.Parameter);
+    checkParameter(o.visiblePercentageMin as api.Parameter);
+    checkParameter(o.waitForTags as api.Parameter);
+    checkParameter(o.waitForTagsTimeout as api.Parameter);
   }
   buildCounterTrigger--;
 }
@@ -1443,8 +1443,8 @@
 
 void checkUnnamed1894(core.List<api.ContainerAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainerAccess(o[0]);
-  checkContainerAccess(o[1]);
+  checkContainerAccess(o[0] as api.ContainerAccess);
+  checkContainerAccess(o[1] as api.ContainerAccess);
 }
 
 core.int buildCounterUserAccess = 0;
@@ -1465,7 +1465,7 @@
 void checkUserAccess(api.UserAccess o) {
   buildCounterUserAccess++;
   if (buildCounterUserAccess < 3) {
-    checkAccountAccess(o.accountAccess);
+    checkAccountAccess(o.accountAccess as api.AccountAccess);
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkUnnamed1894(o.containerAccess);
     unittest.expect(o.emailAddress, unittest.equals('foo'));
@@ -1509,8 +1509,8 @@
 
 void checkUnnamed1897(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterVariable = 0;
@@ -1600,7 +1600,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -1608,7 +1608,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountAccess();
       var od = api.AccountAccess.fromJson(o.toJson());
-      checkAccountAccess(od);
+      checkAccountAccess(od as api.AccountAccess);
     });
   });
 
@@ -1616,7 +1616,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCondition();
       var od = api.Condition.fromJson(o.toJson());
-      checkCondition(od);
+      checkCondition(od as api.Condition);
     });
   });
 
@@ -1624,7 +1624,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainer();
       var od = api.Container.fromJson(o.toJson());
-      checkContainer(od);
+      checkContainer(od as api.Container);
     });
   });
 
@@ -1632,7 +1632,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerAccess();
       var od = api.ContainerAccess.fromJson(o.toJson());
-      checkContainerAccess(od);
+      checkContainerAccess(od as api.ContainerAccess);
     });
   });
 
@@ -1640,7 +1640,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerVersion();
       var od = api.ContainerVersion.fromJson(o.toJson());
-      checkContainerVersion(od);
+      checkContainerVersion(od as api.ContainerVersion);
     });
   });
 
@@ -1648,7 +1648,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerVersionHeader();
       var od = api.ContainerVersionHeader.fromJson(o.toJson());
-      checkContainerVersionHeader(od);
+      checkContainerVersionHeader(od as api.ContainerVersionHeader);
     });
   });
 
@@ -1657,7 +1657,8 @@
       var o = buildCreateContainerVersionRequestVersionOptions();
       var od =
           api.CreateContainerVersionRequestVersionOptions.fromJson(o.toJson());
-      checkCreateContainerVersionRequestVersionOptions(od);
+      checkCreateContainerVersionRequestVersionOptions(
+          od as api.CreateContainerVersionRequestVersionOptions);
     });
   });
 
@@ -1665,7 +1666,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateContainerVersionResponse();
       var od = api.CreateContainerVersionResponse.fromJson(o.toJson());
-      checkCreateContainerVersionResponse(od);
+      checkCreateContainerVersionResponse(
+          od as api.CreateContainerVersionResponse);
     });
   });
 
@@ -1673,7 +1675,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironment();
       var od = api.Environment.fromJson(o.toJson());
-      checkEnvironment(od);
+      checkEnvironment(od as api.Environment);
     });
   });
 
@@ -1681,7 +1683,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolder();
       var od = api.Folder.fromJson(o.toJson());
-      checkFolder(od);
+      checkFolder(od as api.Folder);
     });
   });
 
@@ -1689,7 +1691,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolderEntities();
       var od = api.FolderEntities.fromJson(o.toJson());
-      checkFolderEntities(od);
+      checkFolderEntities(od as api.FolderEntities);
     });
   });
 
@@ -1697,7 +1699,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAccountUsersResponse();
       var od = api.ListAccountUsersResponse.fromJson(o.toJson());
-      checkListAccountUsersResponse(od);
+      checkListAccountUsersResponse(od as api.ListAccountUsersResponse);
     });
   });
 
@@ -1705,7 +1707,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAccountsResponse();
       var od = api.ListAccountsResponse.fromJson(o.toJson());
-      checkListAccountsResponse(od);
+      checkListAccountsResponse(od as api.ListAccountsResponse);
     });
   });
 
@@ -1713,7 +1715,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListContainerVersionsResponse();
       var od = api.ListContainerVersionsResponse.fromJson(o.toJson());
-      checkListContainerVersionsResponse(od);
+      checkListContainerVersionsResponse(
+          od as api.ListContainerVersionsResponse);
     });
   });
 
@@ -1721,7 +1724,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListContainersResponse();
       var od = api.ListContainersResponse.fromJson(o.toJson());
-      checkListContainersResponse(od);
+      checkListContainersResponse(od as api.ListContainersResponse);
     });
   });
 
@@ -1729,7 +1732,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListEnvironmentsResponse();
       var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
-      checkListEnvironmentsResponse(od);
+      checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
 
@@ -1737,7 +1740,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFoldersResponse();
       var od = api.ListFoldersResponse.fromJson(o.toJson());
-      checkListFoldersResponse(od);
+      checkListFoldersResponse(od as api.ListFoldersResponse);
     });
   });
 
@@ -1745,7 +1748,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTagsResponse();
       var od = api.ListTagsResponse.fromJson(o.toJson());
-      checkListTagsResponse(od);
+      checkListTagsResponse(od as api.ListTagsResponse);
     });
   });
 
@@ -1753,7 +1756,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTriggersResponse();
       var od = api.ListTriggersResponse.fromJson(o.toJson());
-      checkListTriggersResponse(od);
+      checkListTriggersResponse(od as api.ListTriggersResponse);
     });
   });
 
@@ -1761,7 +1764,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListVariablesResponse();
       var od = api.ListVariablesResponse.fromJson(o.toJson());
-      checkListVariablesResponse(od);
+      checkListVariablesResponse(od as api.ListVariablesResponse);
     });
   });
 
@@ -1769,7 +1772,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMacro();
       var od = api.Macro.fromJson(o.toJson());
-      checkMacro(od);
+      checkMacro(od as api.Macro);
     });
   });
 
@@ -1777,7 +1780,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParameter();
       var od = api.Parameter.fromJson(o.toJson());
-      checkParameter(od);
+      checkParameter(od as api.Parameter);
     });
   });
 
@@ -1785,7 +1788,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublishContainerVersionResponse();
       var od = api.PublishContainerVersionResponse.fromJson(o.toJson());
-      checkPublishContainerVersionResponse(od);
+      checkPublishContainerVersionResponse(
+          od as api.PublishContainerVersionResponse);
     });
   });
 
@@ -1793,7 +1797,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRule();
       var od = api.Rule.fromJson(o.toJson());
-      checkRule(od);
+      checkRule(od as api.Rule);
     });
   });
 
@@ -1801,7 +1805,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetupTag();
       var od = api.SetupTag.fromJson(o.toJson());
-      checkSetupTag(od);
+      checkSetupTag(od as api.SetupTag);
     });
   });
 
@@ -1809,7 +1813,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTag();
       var od = api.Tag.fromJson(o.toJson());
-      checkTag(od);
+      checkTag(od as api.Tag);
     });
   });
 
@@ -1817,7 +1821,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeardownTag();
       var od = api.TeardownTag.fromJson(o.toJson());
-      checkTeardownTag(od);
+      checkTeardownTag(od as api.TeardownTag);
     });
   });
 
@@ -1825,7 +1829,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrigger();
       var od = api.Trigger.fromJson(o.toJson());
-      checkTrigger(od);
+      checkTrigger(od as api.Trigger);
     });
   });
 
@@ -1833,7 +1837,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserAccess();
       var od = api.UserAccess.fromJson(o.toJson());
-      checkUserAccess(od);
+      checkUserAccess(od as api.UserAccess);
     });
   });
 
@@ -1841,7 +1845,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVariable();
       var od = api.Variable.fromJson(o.toJson());
-      checkVariable(od);
+      checkVariable(od as api.Variable);
     });
   });
 
@@ -1892,7 +1896,7 @@
       res
           .get(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -1936,7 +1940,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkListAccountsResponse(response);
+        checkListAccountsResponse(response as api.ListAccountsResponse);
       })));
     });
 
@@ -1948,8 +1952,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1994,7 +1999,7 @@
           .update(arg_request, arg_accountId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
   });
@@ -2007,8 +2012,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Container.fromJson(json);
-        checkContainer(obj);
+        var obj =
+            api.Container.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkContainer(obj as api.Container);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2056,7 +2062,7 @@
       res
           .create(arg_request, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainer(response);
+        checkContainer(response as api.Container);
       })));
     });
 
@@ -2174,7 +2180,7 @@
       res
           .get(arg_accountId, arg_containerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainer(response);
+        checkContainer(response as api.Container);
       })));
     });
 
@@ -2230,7 +2236,7 @@
       res
           .list(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListContainersResponse(response);
+        checkListContainersResponse(response as api.ListContainersResponse);
       })));
     });
 
@@ -2243,8 +2249,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Container.fromJson(json);
-        checkContainer(obj);
+        var obj =
+            api.Container.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkContainer(obj as api.Container);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2298,7 +2305,7 @@
           .update(arg_request, arg_accountId, arg_containerId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainer(response);
+        checkContainer(response as api.Container);
       })));
     });
   });
@@ -2312,8 +2319,9 @@
       var arg_containerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2371,7 +2379,7 @@
           .create(arg_request, arg_accountId, arg_containerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
 
@@ -2511,7 +2519,7 @@
           .get(arg_accountId, arg_containerId, arg_environmentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
 
@@ -2577,7 +2585,7 @@
       res
           .list(arg_accountId, arg_containerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListEnvironmentsResponse(response);
+        checkListEnvironmentsResponse(response as api.ListEnvironmentsResponse);
       })));
     });
 
@@ -2591,8 +2599,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2656,7 +2665,7 @@
               arg_request, arg_accountId, arg_containerId, arg_environmentId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
   });
@@ -2670,8 +2679,9 @@
       var arg_containerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2729,7 +2739,7 @@
           .create(arg_request, arg_accountId, arg_containerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
 
@@ -2869,7 +2879,7 @@
           .get(arg_accountId, arg_containerId, arg_folderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
 
@@ -2935,7 +2945,7 @@
       res
           .list(arg_accountId, arg_containerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFoldersResponse(response);
+        checkListFoldersResponse(response as api.ListFoldersResponse);
       })));
     });
 
@@ -2949,8 +2959,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3013,7 +3024,7 @@
           .update(arg_request, arg_accountId, arg_containerId, arg_folderId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
   });
@@ -3092,7 +3103,7 @@
           .list(arg_accountId, arg_containerId, arg_folderId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolderEntities(response);
+        checkFolderEntities(response as api.FolderEntities);
       })));
     });
   });
@@ -3110,8 +3121,9 @@
       var arg_variableId = buildUnnamed1900();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3194,8 +3206,9 @@
       var arg_environmentId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3257,7 +3270,7 @@
               arg_request, arg_accountId, arg_containerId, arg_environmentId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
   });
@@ -3271,8 +3284,8 @@
       var arg_containerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Tag.fromJson(json);
-        checkTag(obj);
+        var obj = api.Tag.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTag(obj as api.Tag);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3330,7 +3343,7 @@
           .create(arg_request, arg_accountId, arg_containerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTag(response);
+        checkTag(response as api.Tag);
       })));
     });
 
@@ -3469,7 +3482,7 @@
       res
           .get(arg_accountId, arg_containerId, arg_tagId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTag(response);
+        checkTag(response as api.Tag);
       })));
     });
 
@@ -3535,7 +3548,7 @@
       res
           .list(arg_accountId, arg_containerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTagsResponse(response);
+        checkListTagsResponse(response as api.ListTagsResponse);
       })));
     });
 
@@ -3549,8 +3562,8 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Tag.fromJson(json);
-        checkTag(obj);
+        var obj = api.Tag.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTag(obj as api.Tag);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3613,7 +3626,7 @@
           .update(arg_request, arg_accountId, arg_containerId, arg_tagId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTag(response);
+        checkTag(response as api.Tag);
       })));
     });
   });
@@ -3627,8 +3640,9 @@
       var arg_containerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Trigger.fromJson(json);
-        checkTrigger(obj);
+        var obj =
+            api.Trigger.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTrigger(obj as api.Trigger);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3686,7 +3700,7 @@
           .create(arg_request, arg_accountId, arg_containerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrigger(response);
+        checkTrigger(response as api.Trigger);
       })));
     });
 
@@ -3826,7 +3840,7 @@
           .get(arg_accountId, arg_containerId, arg_triggerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrigger(response);
+        checkTrigger(response as api.Trigger);
       })));
     });
 
@@ -3892,7 +3906,7 @@
       res
           .list(arg_accountId, arg_containerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTriggersResponse(response);
+        checkListTriggersResponse(response as api.ListTriggersResponse);
       })));
     });
 
@@ -3906,8 +3920,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Trigger.fromJson(json);
-        checkTrigger(obj);
+        var obj =
+            api.Trigger.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTrigger(obj as api.Trigger);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3970,7 +3985,7 @@
           .update(arg_request, arg_accountId, arg_containerId, arg_triggerId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrigger(response);
+        checkTrigger(response as api.Trigger);
       })));
     });
   });
@@ -3984,8 +3999,9 @@
       var arg_containerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Variable.fromJson(json);
-        checkVariable(obj);
+        var obj =
+            api.Variable.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVariable(obj as api.Variable);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4043,7 +4059,7 @@
           .create(arg_request, arg_accountId, arg_containerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariable(response);
+        checkVariable(response as api.Variable);
       })));
     });
 
@@ -4183,7 +4199,7 @@
           .get(arg_accountId, arg_containerId, arg_variableId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariable(response);
+        checkVariable(response as api.Variable);
       })));
     });
 
@@ -4249,7 +4265,7 @@
       res
           .list(arg_accountId, arg_containerId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListVariablesResponse(response);
+        checkListVariablesResponse(response as api.ListVariablesResponse);
       })));
     });
 
@@ -4263,8 +4279,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Variable.fromJson(json);
-        checkVariable(obj);
+        var obj =
+            api.Variable.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVariable(obj as api.Variable);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4327,7 +4344,7 @@
           .update(arg_request, arg_accountId, arg_containerId, arg_variableId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariable(response);
+        checkVariable(response as api.Variable);
       })));
     });
   });
@@ -4341,9 +4358,10 @@
       var arg_containerId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.CreateContainerVersionRequestVersionOptions.fromJson(json);
-        checkCreateContainerVersionRequestVersionOptions(obj);
+        var obj = api.CreateContainerVersionRequestVersionOptions.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateContainerVersionRequestVersionOptions(
+            obj as api.CreateContainerVersionRequestVersionOptions);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4401,7 +4419,8 @@
           .create(arg_request, arg_accountId, arg_containerId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateContainerVersionResponse(response);
+        checkCreateContainerVersionResponse(
+            response as api.CreateContainerVersionResponse);
       })));
     });
 
@@ -4541,7 +4560,7 @@
           .get(arg_accountId, arg_containerId, arg_containerVersionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
 
@@ -4616,7 +4635,8 @@
               includeDeleted: arg_includeDeleted,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListContainerVersionsResponse(response);
+        checkListContainerVersionsResponse(
+            response as api.ListContainerVersionsResponse);
       })));
     });
 
@@ -4696,7 +4716,8 @@
           .publish(arg_accountId, arg_containerId, arg_containerVersionId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPublishContainerVersionResponse(response);
+        checkPublishContainerVersionResponse(
+            response as api.PublishContainerVersionResponse);
       })));
     });
 
@@ -4773,7 +4794,7 @@
           .restore(arg_accountId, arg_containerId, arg_containerVersionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
 
@@ -4850,7 +4871,7 @@
           .undelete(arg_accountId, arg_containerId, arg_containerVersionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
 
@@ -4864,8 +4885,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ContainerVersion.fromJson(json);
-        checkContainerVersion(obj);
+        var obj = api.ContainerVersion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkContainerVersion(obj as api.ContainerVersion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4929,7 +4951,7 @@
               arg_containerVersionId,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
   });
@@ -4942,8 +4964,9 @@
       var arg_accountId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserAccess.fromJson(json);
-        checkUserAccess(obj);
+        var obj = api.UserAccess.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUserAccess(obj as api.UserAccess);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4991,7 +5014,7 @@
       res
           .create(arg_request, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserAccess(response);
+        checkUserAccess(response as api.UserAccess);
       })));
     });
 
@@ -5109,7 +5132,7 @@
       res
           .get(arg_accountId, arg_permissionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserAccess(response);
+        checkUserAccess(response as api.UserAccess);
       })));
     });
 
@@ -5165,7 +5188,7 @@
       res
           .list(arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAccountUsersResponse(response);
+        checkListAccountUsersResponse(response as api.ListAccountUsersResponse);
       })));
     });
 
@@ -5177,8 +5200,9 @@
       var arg_permissionId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserAccess.fromJson(json);
-        checkUserAccess(obj);
+        var obj = api.UserAccess.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUserAccess(obj as api.UserAccess);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5230,7 +5254,7 @@
           .update(arg_request, arg_accountId, arg_permissionId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserAccess(response);
+        checkUserAccess(response as api.UserAccess);
       })));
     });
   });
diff --git a/generated/googleapis/test/tagmanager/v2_test.dart b/generated/googleapis/test/tagmanager/v2_test.dart
index 276c875..e3d6bbb 100644
--- a/generated/googleapis/test/tagmanager/v2_test.dart
+++ b/generated/googleapis/test/tagmanager/v2_test.dart
@@ -160,8 +160,8 @@
 
 void checkUnnamed4424(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterClient = 0;
@@ -214,8 +214,8 @@
 
 void checkUnnamed4425(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterCondition = 0;
@@ -332,8 +332,8 @@
 
 void checkUnnamed4428(core.List<api.BuiltInVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuiltInVariable(o[0]);
-  checkBuiltInVariable(o[1]);
+  checkBuiltInVariable(o[0] as api.BuiltInVariable);
+  checkBuiltInVariable(o[1] as api.BuiltInVariable);
 }
 
 core.List<api.Client> buildUnnamed4429() {
@@ -345,8 +345,8 @@
 
 void checkUnnamed4429(core.List<api.Client> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClient(o[0]);
-  checkClient(o[1]);
+  checkClient(o[0] as api.Client);
+  checkClient(o[1] as api.Client);
 }
 
 core.List<api.CustomTemplate> buildUnnamed4430() {
@@ -358,8 +358,8 @@
 
 void checkUnnamed4430(core.List<api.CustomTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomTemplate(o[0]);
-  checkCustomTemplate(o[1]);
+  checkCustomTemplate(o[0] as api.CustomTemplate);
+  checkCustomTemplate(o[1] as api.CustomTemplate);
 }
 
 core.List<api.Folder> buildUnnamed4431() {
@@ -371,8 +371,8 @@
 
 void checkUnnamed4431(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFolder(o[0]);
-  checkFolder(o[1]);
+  checkFolder(o[0] as api.Folder);
+  checkFolder(o[1] as api.Folder);
 }
 
 core.List<api.Tag> buildUnnamed4432() {
@@ -384,8 +384,8 @@
 
 void checkUnnamed4432(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTag(o[0]);
-  checkTag(o[1]);
+  checkTag(o[0] as api.Tag);
+  checkTag(o[1] as api.Tag);
 }
 
 core.List<api.Trigger> buildUnnamed4433() {
@@ -397,8 +397,8 @@
 
 void checkUnnamed4433(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrigger(o[0]);
-  checkTrigger(o[1]);
+  checkTrigger(o[0] as api.Trigger);
+  checkTrigger(o[1] as api.Trigger);
 }
 
 core.List<api.Variable> buildUnnamed4434() {
@@ -410,8 +410,8 @@
 
 void checkUnnamed4434(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.List<api.Zone> buildUnnamed4435() {
@@ -423,8 +423,8 @@
 
 void checkUnnamed4435(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkZone(o[0]);
-  checkZone(o[1]);
+  checkZone(o[0] as api.Zone);
+  checkZone(o[1] as api.Zone);
 }
 
 core.int buildCounterContainerVersion = 0;
@@ -461,7 +461,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkUnnamed4428(o.builtInVariable);
     checkUnnamed4429(o.client);
-    checkContainer(o.container);
+    checkContainer(o.container as api.Container);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.containerVersionId, unittest.equals('foo'));
     checkUnnamed4430(o.customTemplate);
@@ -532,8 +532,8 @@
 
 void checkUnnamed4436(core.List<api.BuiltInVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuiltInVariable(o[0]);
-  checkBuiltInVariable(o[1]);
+  checkBuiltInVariable(o[0] as api.BuiltInVariable);
+  checkBuiltInVariable(o[1] as api.BuiltInVariable);
 }
 
 core.int buildCounterCreateBuiltInVariableResponse = 0;
@@ -596,9 +596,9 @@
   buildCounterCreateContainerVersionResponse++;
   if (buildCounterCreateContainerVersionResponse < 3) {
     unittest.expect(o.compilerError, unittest.isTrue);
-    checkContainerVersion(o.containerVersion);
+    checkContainerVersion(o.containerVersion as api.ContainerVersion);
     unittest.expect(o.newWorkspacePath, unittest.equals('foo'));
-    checkSyncStatus(o.syncStatus);
+    checkSyncStatus(o.syncStatus as api.SyncStatus);
   }
   buildCounterCreateContainerVersionResponse--;
 }
@@ -629,7 +629,7 @@
     unittest.expect(o.accountId, unittest.equals('foo'));
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkGalleryReference(o.galleryReference);
+    checkGalleryReference(o.galleryReference as api.GalleryReference);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.tagManagerUrl, unittest.equals('foo'));
@@ -659,10 +659,10 @@
   buildCounterEntity++;
   if (buildCounterEntity < 3) {
     unittest.expect(o.changeStatus, unittest.equals('foo'));
-    checkFolder(o.folder);
-    checkTag(o.tag);
-    checkTrigger(o.trigger);
-    checkVariable(o.variable);
+    checkFolder(o.folder as api.Folder);
+    checkTag(o.tag as api.Tag);
+    checkTrigger(o.trigger as api.Trigger);
+    checkVariable(o.variable as api.Variable);
   }
   buildCounterEntity--;
 }
@@ -758,8 +758,8 @@
 
 void checkUnnamed4437(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTag(o[0]);
-  checkTag(o[1]);
+  checkTag(o[0] as api.Tag);
+  checkTag(o[1] as api.Tag);
 }
 
 core.List<api.Trigger> buildUnnamed4438() {
@@ -771,8 +771,8 @@
 
 void checkUnnamed4438(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrigger(o[0]);
-  checkTrigger(o[1]);
+  checkTrigger(o[0] as api.Trigger);
+  checkTrigger(o[1] as api.Trigger);
 }
 
 core.List<api.Variable> buildUnnamed4439() {
@@ -784,8 +784,8 @@
 
 void checkUnnamed4439(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterFolderEntities = 0;
@@ -851,8 +851,8 @@
 
 void checkUnnamed4440(core.List<api.MergeConflict> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMergeConflict(o[0]);
-  checkMergeConflict(o[1]);
+  checkMergeConflict(o[0] as api.MergeConflict);
+  checkMergeConflict(o[1] as api.MergeConflict);
 }
 
 core.List<api.Entity> buildUnnamed4441() {
@@ -864,8 +864,8 @@
 
 void checkUnnamed4441(core.List<api.Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntity(o[0]);
-  checkEntity(o[1]);
+  checkEntity(o[0] as api.Entity);
+  checkEntity(o[1] as api.Entity);
 }
 
 core.int buildCounterGetWorkspaceStatusResponse = 0;
@@ -898,8 +898,8 @@
 
 void checkUnnamed4442(core.List<api.Account> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAccount(o[0]);
-  checkAccount(o[1]);
+  checkAccount(o[0] as api.Account);
+  checkAccount(o[1] as api.Account);
 }
 
 core.int buildCounterListAccountsResponse = 0;
@@ -932,8 +932,8 @@
 
 void checkUnnamed4443(core.List<api.ContainerVersionHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainerVersionHeader(o[0]);
-  checkContainerVersionHeader(o[1]);
+  checkContainerVersionHeader(o[0] as api.ContainerVersionHeader);
+  checkContainerVersionHeader(o[1] as api.ContainerVersionHeader);
 }
 
 core.int buildCounterListContainerVersionsResponse = 0;
@@ -966,8 +966,8 @@
 
 void checkUnnamed4444(core.List<api.Container> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainer(o[0]);
-  checkContainer(o[1]);
+  checkContainer(o[0] as api.Container);
+  checkContainer(o[1] as api.Container);
 }
 
 core.int buildCounterListContainersResponse = 0;
@@ -1000,8 +1000,8 @@
 
 void checkUnnamed4445(core.List<api.BuiltInVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBuiltInVariable(o[0]);
-  checkBuiltInVariable(o[1]);
+  checkBuiltInVariable(o[0] as api.BuiltInVariable);
+  checkBuiltInVariable(o[1] as api.BuiltInVariable);
 }
 
 core.int buildCounterListEnabledBuiltInVariablesResponse = 0;
@@ -1036,8 +1036,8 @@
 
 void checkUnnamed4446(core.List<api.Environment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnvironment(o[0]);
-  checkEnvironment(o[1]);
+  checkEnvironment(o[0] as api.Environment);
+  checkEnvironment(o[1] as api.Environment);
 }
 
 core.int buildCounterListEnvironmentsResponse = 0;
@@ -1070,8 +1070,8 @@
 
 void checkUnnamed4447(core.List<api.Folder> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFolder(o[0]);
-  checkFolder(o[1]);
+  checkFolder(o[0] as api.Folder);
+  checkFolder(o[1] as api.Folder);
 }
 
 core.int buildCounterListFoldersResponse = 0;
@@ -1104,8 +1104,8 @@
 
 void checkUnnamed4448(core.List<api.Tag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTag(o[0]);
-  checkTag(o[1]);
+  checkTag(o[0] as api.Tag);
+  checkTag(o[1] as api.Tag);
 }
 
 core.int buildCounterListTagsResponse = 0;
@@ -1138,8 +1138,8 @@
 
 void checkUnnamed4449(core.List<api.CustomTemplate> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCustomTemplate(o[0]);
-  checkCustomTemplate(o[1]);
+  checkCustomTemplate(o[0] as api.CustomTemplate);
+  checkCustomTemplate(o[1] as api.CustomTemplate);
 }
 
 core.int buildCounterListTemplatesResponse = 0;
@@ -1172,8 +1172,8 @@
 
 void checkUnnamed4450(core.List<api.Trigger> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTrigger(o[0]);
-  checkTrigger(o[1]);
+  checkTrigger(o[0] as api.Trigger);
+  checkTrigger(o[1] as api.Trigger);
 }
 
 core.int buildCounterListTriggersResponse = 0;
@@ -1206,8 +1206,8 @@
 
 void checkUnnamed4451(core.List<api.UserPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkUserPermission(o[0]);
-  checkUserPermission(o[1]);
+  checkUserPermission(o[0] as api.UserPermission);
+  checkUserPermission(o[1] as api.UserPermission);
 }
 
 core.int buildCounterListUserPermissionsResponse = 0;
@@ -1240,8 +1240,8 @@
 
 void checkUnnamed4452(core.List<api.Variable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVariable(o[0]);
-  checkVariable(o[1]);
+  checkVariable(o[0] as api.Variable);
+  checkVariable(o[1] as api.Variable);
 }
 
 core.int buildCounterListVariablesResponse = 0;
@@ -1274,8 +1274,8 @@
 
 void checkUnnamed4453(core.List<api.Workspace> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWorkspace(o[0]);
-  checkWorkspace(o[1]);
+  checkWorkspace(o[0] as api.Workspace);
+  checkWorkspace(o[1] as api.Workspace);
 }
 
 core.int buildCounterListWorkspacesResponse = 0;
@@ -1308,8 +1308,8 @@
 
 void checkUnnamed4454(core.List<api.Zone> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkZone(o[0]);
-  checkZone(o[1]);
+  checkZone(o[0] as api.Zone);
+  checkZone(o[1] as api.Zone);
 }
 
 core.int buildCounterListZonesResponse = 0;
@@ -1348,8 +1348,8 @@
 void checkMergeConflict(api.MergeConflict o) {
   buildCounterMergeConflict++;
   if (buildCounterMergeConflict < 3) {
-    checkEntity(o.entityInBaseVersion);
-    checkEntity(o.entityInWorkspace);
+    checkEntity(o.entityInBaseVersion as api.Entity);
+    checkEntity(o.entityInWorkspace as api.Entity);
   }
   buildCounterMergeConflict--;
 }
@@ -1363,8 +1363,8 @@
 
 void checkUnnamed4455(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.List<api.Parameter> buildUnnamed4456() {
@@ -1376,8 +1376,8 @@
 
 void checkUnnamed4456(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterParameter = 0;
@@ -1424,7 +1424,7 @@
   buildCounterPublishContainerVersionResponse++;
   if (buildCounterPublishContainerVersionResponse < 3) {
     unittest.expect(o.compilerError, unittest.isTrue);
-    checkContainerVersion(o.containerVersion);
+    checkContainerVersion(o.containerVersion as api.ContainerVersion);
   }
   buildCounterPublishContainerVersionResponse--;
 }
@@ -1446,8 +1446,8 @@
   buildCounterQuickPreviewResponse++;
   if (buildCounterQuickPreviewResponse < 3) {
     unittest.expect(o.compilerError, unittest.isTrue);
-    checkContainerVersion(o.containerVersion);
-    checkSyncStatus(o.syncStatus);
+    checkContainerVersion(o.containerVersion as api.ContainerVersion);
+    checkSyncStatus(o.syncStatus as api.SyncStatus);
   }
   buildCounterQuickPreviewResponse--;
 }
@@ -1485,7 +1485,7 @@
 void checkRevertFolderResponse(api.RevertFolderResponse o) {
   buildCounterRevertFolderResponse++;
   if (buildCounterRevertFolderResponse < 3) {
-    checkFolder(o.folder);
+    checkFolder(o.folder as api.Folder);
   }
   buildCounterRevertFolderResponse--;
 }
@@ -1504,7 +1504,7 @@
 void checkRevertTagResponse(api.RevertTagResponse o) {
   buildCounterRevertTagResponse++;
   if (buildCounterRevertTagResponse < 3) {
-    checkTag(o.tag);
+    checkTag(o.tag as api.Tag);
   }
   buildCounterRevertTagResponse--;
 }
@@ -1523,7 +1523,7 @@
 void checkRevertTemplateResponse(api.RevertTemplateResponse o) {
   buildCounterRevertTemplateResponse++;
   if (buildCounterRevertTemplateResponse < 3) {
-    checkCustomTemplate(o.template);
+    checkCustomTemplate(o.template as api.CustomTemplate);
   }
   buildCounterRevertTemplateResponse--;
 }
@@ -1542,7 +1542,7 @@
 void checkRevertTriggerResponse(api.RevertTriggerResponse o) {
   buildCounterRevertTriggerResponse++;
   if (buildCounterRevertTriggerResponse < 3) {
-    checkTrigger(o.trigger);
+    checkTrigger(o.trigger as api.Trigger);
   }
   buildCounterRevertTriggerResponse--;
 }
@@ -1561,7 +1561,7 @@
 void checkRevertVariableResponse(api.RevertVariableResponse o) {
   buildCounterRevertVariableResponse++;
   if (buildCounterRevertVariableResponse < 3) {
-    checkVariable(o.variable);
+    checkVariable(o.variable as api.Variable);
   }
   buildCounterRevertVariableResponse--;
 }
@@ -1580,7 +1580,7 @@
 void checkRevertZoneResponse(api.RevertZoneResponse o) {
   buildCounterRevertZoneResponse++;
   if (buildCounterRevertZoneResponse < 3) {
-    checkZone(o.zone);
+    checkZone(o.zone as api.Zone);
   }
   buildCounterRevertZoneResponse--;
 }
@@ -1636,8 +1636,8 @@
 
 void checkUnnamed4457(core.List<api.MergeConflict> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMergeConflict(o[0]);
-  checkMergeConflict(o[1]);
+  checkMergeConflict(o[0] as api.MergeConflict);
+  checkMergeConflict(o[1] as api.MergeConflict);
 }
 
 core.int buildCounterSyncWorkspaceResponse = 0;
@@ -1656,7 +1656,7 @@
   buildCounterSyncWorkspaceResponse++;
   if (buildCounterSyncWorkspaceResponse < 3) {
     checkUnnamed4457(o.mergeConflict);
-    checkSyncStatus(o.syncStatus);
+    checkSyncStatus(o.syncStatus as api.SyncStatus);
   }
   buildCounterSyncWorkspaceResponse--;
 }
@@ -1722,8 +1722,8 @@
 
 void checkUnnamed4462(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.List<api.SetupTag> buildUnnamed4463() {
@@ -1735,8 +1735,8 @@
 
 void checkUnnamed4463(core.List<api.SetupTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSetupTag(o[0]);
-  checkSetupTag(o[1]);
+  checkSetupTag(o[0] as api.SetupTag);
+  checkSetupTag(o[1] as api.SetupTag);
 }
 
 core.List<api.TeardownTag> buildUnnamed4464() {
@@ -1748,8 +1748,8 @@
 
 void checkUnnamed4464(core.List<api.TeardownTag> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTeardownTag(o[0]);
-  checkTeardownTag(o[1]);
+  checkTeardownTag(o[0] as api.TeardownTag);
+  checkTeardownTag(o[1] as api.TeardownTag);
 }
 
 core.int buildCounterTag = 0;
@@ -1799,7 +1799,7 @@
     checkUnnamed4460(o.firingRuleId);
     checkUnnamed4461(o.firingTriggerId);
     unittest.expect(o.liveOnly, unittest.isTrue);
-    checkParameter(o.monitoringMetadata);
+    checkParameter(o.monitoringMetadata as api.Parameter);
     unittest.expect(o.monitoringMetadataTagNameKey, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
@@ -1807,7 +1807,7 @@
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.paused, unittest.isTrue);
-    checkParameter(o.priority);
+    checkParameter(o.priority as api.Parameter);
     unittest.expect(o.scheduleEndMs, unittest.equals('foo'));
     unittest.expect(o.scheduleStartMs, unittest.equals('foo'));
     checkUnnamed4463(o.setupTag);
@@ -1851,8 +1851,8 @@
 
 void checkUnnamed4465(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<api.Condition> buildUnnamed4466() {
@@ -1864,8 +1864,8 @@
 
 void checkUnnamed4466(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<api.Condition> buildUnnamed4467() {
@@ -1877,8 +1877,8 @@
 
 void checkUnnamed4467(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<api.Parameter> buildUnnamed4468() {
@@ -1890,8 +1890,8 @@
 
 void checkUnnamed4468(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterTrigger = 0;
@@ -1941,35 +1941,35 @@
   if (buildCounterTrigger < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkUnnamed4465(o.autoEventFilter);
-    checkParameter(o.checkValidation);
+    checkParameter(o.checkValidation as api.Parameter);
     unittest.expect(o.containerId, unittest.equals('foo'));
-    checkParameter(o.continuousTimeMinMilliseconds);
+    checkParameter(o.continuousTimeMinMilliseconds as api.Parameter);
     checkUnnamed4466(o.customEventFilter);
-    checkParameter(o.eventName);
+    checkParameter(o.eventName as api.Parameter);
     checkUnnamed4467(o.filter);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkParameter(o.horizontalScrollPercentageList);
-    checkParameter(o.interval);
-    checkParameter(o.intervalSeconds);
-    checkParameter(o.limit);
-    checkParameter(o.maxTimerLengthSeconds);
+    checkParameter(o.horizontalScrollPercentageList as api.Parameter);
+    checkParameter(o.interval as api.Parameter);
+    checkParameter(o.intervalSeconds as api.Parameter);
+    checkParameter(o.limit as api.Parameter);
+    checkParameter(o.maxTimerLengthSeconds as api.Parameter);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     checkUnnamed4468(o.parameter);
     unittest.expect(o.parentFolderId, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
-    checkParameter(o.selector);
+    checkParameter(o.selector as api.Parameter);
     unittest.expect(o.tagManagerUrl, unittest.equals('foo'));
-    checkParameter(o.totalTimeMinMilliseconds);
+    checkParameter(o.totalTimeMinMilliseconds as api.Parameter);
     unittest.expect(o.triggerId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
-    checkParameter(o.uniqueTriggerId);
-    checkParameter(o.verticalScrollPercentageList);
-    checkParameter(o.visibilitySelector);
-    checkParameter(o.visiblePercentageMax);
-    checkParameter(o.visiblePercentageMin);
-    checkParameter(o.waitForTags);
-    checkParameter(o.waitForTagsTimeout);
+    checkParameter(o.uniqueTriggerId as api.Parameter);
+    checkParameter(o.verticalScrollPercentageList as api.Parameter);
+    checkParameter(o.visibilitySelector as api.Parameter);
+    checkParameter(o.visiblePercentageMax as api.Parameter);
+    checkParameter(o.visiblePercentageMin as api.Parameter);
+    checkParameter(o.waitForTags as api.Parameter);
+    checkParameter(o.waitForTagsTimeout as api.Parameter);
     unittest.expect(o.workspaceId, unittest.equals('foo'));
   }
   buildCounterTrigger--;
@@ -1984,8 +1984,8 @@
 
 void checkUnnamed4469(core.List<api.ContainerAccess> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkContainerAccess(o[0]);
-  checkContainerAccess(o[1]);
+  checkContainerAccess(o[0] as api.ContainerAccess);
+  checkContainerAccess(o[1] as api.ContainerAccess);
 }
 
 core.int buildCounterUserPermission = 0;
@@ -2006,7 +2006,7 @@
 void checkUserPermission(api.UserPermission o) {
   buildCounterUserPermission++;
   if (buildCounterUserPermission < 3) {
-    checkAccountAccess(o.accountAccess);
+    checkAccountAccess(o.accountAccess as api.AccountAccess);
     unittest.expect(o.accountId, unittest.equals('foo'));
     checkUnnamed4469(o.containerAccess);
     unittest.expect(o.emailAddress, unittest.equals('foo'));
@@ -2050,8 +2050,8 @@
 
 void checkUnnamed4472(core.List<api.Parameter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParameter(o[0]);
-  checkParameter(o[1]);
+  checkParameter(o[0] as api.Parameter);
+  checkParameter(o[1] as api.Parameter);
 }
 
 core.int buildCounterVariable = 0;
@@ -2089,7 +2089,7 @@
     checkUnnamed4470(o.disablingTriggerId);
     checkUnnamed4471(o.enablingTriggerId);
     unittest.expect(o.fingerprint, unittest.equals('foo'));
-    checkVariableFormatValue(o.formatValue);
+    checkVariableFormatValue(o.formatValue as api.VariableFormatValue);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.notes, unittest.equals('foo'));
     checkUnnamed4472(o.parameter);
@@ -2124,10 +2124,10 @@
   buildCounterVariableFormatValue++;
   if (buildCounterVariableFormatValue < 3) {
     unittest.expect(o.caseConversionType, unittest.equals('foo'));
-    checkParameter(o.convertFalseToValue);
-    checkParameter(o.convertNullToValue);
-    checkParameter(o.convertTrueToValue);
-    checkParameter(o.convertUndefinedToValue);
+    checkParameter(o.convertFalseToValue as api.Parameter);
+    checkParameter(o.convertNullToValue as api.Parameter);
+    checkParameter(o.convertTrueToValue as api.Parameter);
+    checkParameter(o.convertUndefinedToValue as api.Parameter);
   }
   buildCounterVariableFormatValue--;
 }
@@ -2174,8 +2174,8 @@
 
 void checkUnnamed4473(core.List<api.ZoneChildContainer> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkZoneChildContainer(o[0]);
-  checkZoneChildContainer(o[1]);
+  checkZoneChildContainer(o[0] as api.ZoneChildContainer);
+  checkZoneChildContainer(o[1] as api.ZoneChildContainer);
 }
 
 core.int buildCounterZone = 0;
@@ -2204,7 +2204,7 @@
   buildCounterZone++;
   if (buildCounterZone < 3) {
     unittest.expect(o.accountId, unittest.equals('foo'));
-    checkZoneBoundary(o.boundary);
+    checkZoneBoundary(o.boundary as api.ZoneBoundary);
     checkUnnamed4473(o.childContainer);
     unittest.expect(o.containerId, unittest.equals('foo'));
     unittest.expect(o.fingerprint, unittest.equals('foo'));
@@ -2212,7 +2212,7 @@
     unittest.expect(o.notes, unittest.equals('foo'));
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.tagManagerUrl, unittest.equals('foo'));
-    checkZoneTypeRestriction(o.typeRestriction);
+    checkZoneTypeRestriction(o.typeRestriction as api.ZoneTypeRestriction);
     unittest.expect(o.workspaceId, unittest.equals('foo'));
     unittest.expect(o.zoneId, unittest.equals('foo'));
   }
@@ -2228,8 +2228,8 @@
 
 void checkUnnamed4474(core.List<api.Condition> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCondition(o[0]);
-  checkCondition(o[1]);
+  checkCondition(o[0] as api.Condition);
+  checkCondition(o[1] as api.Condition);
 }
 
 core.List<core.String> buildUnnamed4475() {
@@ -2391,7 +2391,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -2399,7 +2399,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountAccess();
       var od = api.AccountAccess.fromJson(o.toJson());
-      checkAccountAccess(od);
+      checkAccountAccess(od as api.AccountAccess);
     });
   });
 
@@ -2407,7 +2407,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBuiltInVariable();
       var od = api.BuiltInVariable.fromJson(o.toJson());
-      checkBuiltInVariable(od);
+      checkBuiltInVariable(od as api.BuiltInVariable);
     });
   });
 
@@ -2415,7 +2415,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClient();
       var od = api.Client.fromJson(o.toJson());
-      checkClient(od);
+      checkClient(od as api.Client);
     });
   });
 
@@ -2423,7 +2423,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCondition();
       var od = api.Condition.fromJson(o.toJson());
-      checkCondition(od);
+      checkCondition(od as api.Condition);
     });
   });
 
@@ -2431,7 +2431,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainer();
       var od = api.Container.fromJson(o.toJson());
-      checkContainer(od);
+      checkContainer(od as api.Container);
     });
   });
 
@@ -2439,7 +2439,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerAccess();
       var od = api.ContainerAccess.fromJson(o.toJson());
-      checkContainerAccess(od);
+      checkContainerAccess(od as api.ContainerAccess);
     });
   });
 
@@ -2447,7 +2447,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerVersion();
       var od = api.ContainerVersion.fromJson(o.toJson());
-      checkContainerVersion(od);
+      checkContainerVersion(od as api.ContainerVersion);
     });
   });
 
@@ -2455,7 +2455,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContainerVersionHeader();
       var od = api.ContainerVersionHeader.fromJson(o.toJson());
-      checkContainerVersionHeader(od);
+      checkContainerVersionHeader(od as api.ContainerVersionHeader);
     });
   });
 
@@ -2463,7 +2463,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateBuiltInVariableResponse();
       var od = api.CreateBuiltInVariableResponse.fromJson(o.toJson());
-      checkCreateBuiltInVariableResponse(od);
+      checkCreateBuiltInVariableResponse(
+          od as api.CreateBuiltInVariableResponse);
     });
   });
 
@@ -2472,7 +2473,8 @@
       var o = buildCreateContainerVersionRequestVersionOptions();
       var od =
           api.CreateContainerVersionRequestVersionOptions.fromJson(o.toJson());
-      checkCreateContainerVersionRequestVersionOptions(od);
+      checkCreateContainerVersionRequestVersionOptions(
+          od as api.CreateContainerVersionRequestVersionOptions);
     });
   });
 
@@ -2480,7 +2482,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCreateContainerVersionResponse();
       var od = api.CreateContainerVersionResponse.fromJson(o.toJson());
-      checkCreateContainerVersionResponse(od);
+      checkCreateContainerVersionResponse(
+          od as api.CreateContainerVersionResponse);
     });
   });
 
@@ -2488,7 +2491,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomTemplate();
       var od = api.CustomTemplate.fromJson(o.toJson());
-      checkCustomTemplate(od);
+      checkCustomTemplate(od as api.CustomTemplate);
     });
   });
 
@@ -2496,7 +2499,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntity();
       var od = api.Entity.fromJson(o.toJson());
-      checkEntity(od);
+      checkEntity(od as api.Entity);
     });
   });
 
@@ -2504,7 +2507,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironment();
       var od = api.Environment.fromJson(o.toJson());
-      checkEnvironment(od);
+      checkEnvironment(od as api.Environment);
     });
   });
 
@@ -2512,7 +2515,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolder();
       var od = api.Folder.fromJson(o.toJson());
-      checkFolder(od);
+      checkFolder(od as api.Folder);
     });
   });
 
@@ -2520,7 +2523,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFolderEntities();
       var od = api.FolderEntities.fromJson(o.toJson());
-      checkFolderEntities(od);
+      checkFolderEntities(od as api.FolderEntities);
     });
   });
 
@@ -2528,7 +2531,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGalleryReference();
       var od = api.GalleryReference.fromJson(o.toJson());
-      checkGalleryReference(od);
+      checkGalleryReference(od as api.GalleryReference);
     });
   });
 
@@ -2536,7 +2539,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetWorkspaceStatusResponse();
       var od = api.GetWorkspaceStatusResponse.fromJson(o.toJson());
-      checkGetWorkspaceStatusResponse(od);
+      checkGetWorkspaceStatusResponse(od as api.GetWorkspaceStatusResponse);
     });
   });
 
@@ -2544,7 +2547,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAccountsResponse();
       var od = api.ListAccountsResponse.fromJson(o.toJson());
-      checkListAccountsResponse(od);
+      checkListAccountsResponse(od as api.ListAccountsResponse);
     });
   });
 
@@ -2552,7 +2555,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListContainerVersionsResponse();
       var od = api.ListContainerVersionsResponse.fromJson(o.toJson());
-      checkListContainerVersionsResponse(od);
+      checkListContainerVersionsResponse(
+          od as api.ListContainerVersionsResponse);
     });
   });
 
@@ -2560,7 +2564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListContainersResponse();
       var od = api.ListContainersResponse.fromJson(o.toJson());
-      checkListContainersResponse(od);
+      checkListContainersResponse(od as api.ListContainersResponse);
     });
   });
 
@@ -2568,7 +2572,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListEnabledBuiltInVariablesResponse();
       var od = api.ListEnabledBuiltInVariablesResponse.fromJson(o.toJson());
-      checkListEnabledBuiltInVariablesResponse(od);
+      checkListEnabledBuiltInVariablesResponse(
+          od as api.ListEnabledBuiltInVariablesResponse);
     });
   });
 
@@ -2576,7 +2581,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListEnvironmentsResponse();
       var od = api.ListEnvironmentsResponse.fromJson(o.toJson());
-      checkListEnvironmentsResponse(od);
+      checkListEnvironmentsResponse(od as api.ListEnvironmentsResponse);
     });
   });
 
@@ -2584,7 +2589,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFoldersResponse();
       var od = api.ListFoldersResponse.fromJson(o.toJson());
-      checkListFoldersResponse(od);
+      checkListFoldersResponse(od as api.ListFoldersResponse);
     });
   });
 
@@ -2592,7 +2597,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTagsResponse();
       var od = api.ListTagsResponse.fromJson(o.toJson());
-      checkListTagsResponse(od);
+      checkListTagsResponse(od as api.ListTagsResponse);
     });
   });
 
@@ -2600,7 +2605,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTemplatesResponse();
       var od = api.ListTemplatesResponse.fromJson(o.toJson());
-      checkListTemplatesResponse(od);
+      checkListTemplatesResponse(od as api.ListTemplatesResponse);
     });
   });
 
@@ -2608,7 +2613,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTriggersResponse();
       var od = api.ListTriggersResponse.fromJson(o.toJson());
-      checkListTriggersResponse(od);
+      checkListTriggersResponse(od as api.ListTriggersResponse);
     });
   });
 
@@ -2616,7 +2621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListUserPermissionsResponse();
       var od = api.ListUserPermissionsResponse.fromJson(o.toJson());
-      checkListUserPermissionsResponse(od);
+      checkListUserPermissionsResponse(od as api.ListUserPermissionsResponse);
     });
   });
 
@@ -2624,7 +2629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListVariablesResponse();
       var od = api.ListVariablesResponse.fromJson(o.toJson());
-      checkListVariablesResponse(od);
+      checkListVariablesResponse(od as api.ListVariablesResponse);
     });
   });
 
@@ -2632,7 +2637,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListWorkspacesResponse();
       var od = api.ListWorkspacesResponse.fromJson(o.toJson());
-      checkListWorkspacesResponse(od);
+      checkListWorkspacesResponse(od as api.ListWorkspacesResponse);
     });
   });
 
@@ -2640,7 +2645,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListZonesResponse();
       var od = api.ListZonesResponse.fromJson(o.toJson());
-      checkListZonesResponse(od);
+      checkListZonesResponse(od as api.ListZonesResponse);
     });
   });
 
@@ -2648,7 +2653,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMergeConflict();
       var od = api.MergeConflict.fromJson(o.toJson());
-      checkMergeConflict(od);
+      checkMergeConflict(od as api.MergeConflict);
     });
   });
 
@@ -2656,7 +2661,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParameter();
       var od = api.Parameter.fromJson(o.toJson());
-      checkParameter(od);
+      checkParameter(od as api.Parameter);
     });
   });
 
@@ -2664,7 +2669,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildPublishContainerVersionResponse();
       var od = api.PublishContainerVersionResponse.fromJson(o.toJson());
-      checkPublishContainerVersionResponse(od);
+      checkPublishContainerVersionResponse(
+          od as api.PublishContainerVersionResponse);
     });
   });
 
@@ -2672,7 +2678,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuickPreviewResponse();
       var od = api.QuickPreviewResponse.fromJson(o.toJson());
-      checkQuickPreviewResponse(od);
+      checkQuickPreviewResponse(od as api.QuickPreviewResponse);
     });
   });
 
@@ -2680,7 +2686,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevertBuiltInVariableResponse();
       var od = api.RevertBuiltInVariableResponse.fromJson(o.toJson());
-      checkRevertBuiltInVariableResponse(od);
+      checkRevertBuiltInVariableResponse(
+          od as api.RevertBuiltInVariableResponse);
     });
   });
 
@@ -2688,7 +2695,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevertFolderResponse();
       var od = api.RevertFolderResponse.fromJson(o.toJson());
-      checkRevertFolderResponse(od);
+      checkRevertFolderResponse(od as api.RevertFolderResponse);
     });
   });
 
@@ -2696,7 +2703,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevertTagResponse();
       var od = api.RevertTagResponse.fromJson(o.toJson());
-      checkRevertTagResponse(od);
+      checkRevertTagResponse(od as api.RevertTagResponse);
     });
   });
 
@@ -2704,7 +2711,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevertTemplateResponse();
       var od = api.RevertTemplateResponse.fromJson(o.toJson());
-      checkRevertTemplateResponse(od);
+      checkRevertTemplateResponse(od as api.RevertTemplateResponse);
     });
   });
 
@@ -2712,7 +2719,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevertTriggerResponse();
       var od = api.RevertTriggerResponse.fromJson(o.toJson());
-      checkRevertTriggerResponse(od);
+      checkRevertTriggerResponse(od as api.RevertTriggerResponse);
     });
   });
 
@@ -2720,7 +2727,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevertVariableResponse();
       var od = api.RevertVariableResponse.fromJson(o.toJson());
-      checkRevertVariableResponse(od);
+      checkRevertVariableResponse(od as api.RevertVariableResponse);
     });
   });
 
@@ -2728,7 +2735,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRevertZoneResponse();
       var od = api.RevertZoneResponse.fromJson(o.toJson());
-      checkRevertZoneResponse(od);
+      checkRevertZoneResponse(od as api.RevertZoneResponse);
     });
   });
 
@@ -2736,7 +2743,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSetupTag();
       var od = api.SetupTag.fromJson(o.toJson());
-      checkSetupTag(od);
+      checkSetupTag(od as api.SetupTag);
     });
   });
 
@@ -2744,7 +2751,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSyncStatus();
       var od = api.SyncStatus.fromJson(o.toJson());
-      checkSyncStatus(od);
+      checkSyncStatus(od as api.SyncStatus);
     });
   });
 
@@ -2752,7 +2759,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSyncWorkspaceResponse();
       var od = api.SyncWorkspaceResponse.fromJson(o.toJson());
-      checkSyncWorkspaceResponse(od);
+      checkSyncWorkspaceResponse(od as api.SyncWorkspaceResponse);
     });
   });
 
@@ -2760,7 +2767,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTag();
       var od = api.Tag.fromJson(o.toJson());
-      checkTag(od);
+      checkTag(od as api.Tag);
     });
   });
 
@@ -2768,7 +2775,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeardownTag();
       var od = api.TeardownTag.fromJson(o.toJson());
-      checkTeardownTag(od);
+      checkTeardownTag(od as api.TeardownTag);
     });
   });
 
@@ -2776,7 +2783,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrigger();
       var od = api.Trigger.fromJson(o.toJson());
-      checkTrigger(od);
+      checkTrigger(od as api.Trigger);
     });
   });
 
@@ -2784,7 +2791,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserPermission();
       var od = api.UserPermission.fromJson(o.toJson());
-      checkUserPermission(od);
+      checkUserPermission(od as api.UserPermission);
     });
   });
 
@@ -2792,7 +2799,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVariable();
       var od = api.Variable.fromJson(o.toJson());
-      checkVariable(od);
+      checkVariable(od as api.Variable);
     });
   });
 
@@ -2800,7 +2807,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVariableFormatValue();
       var od = api.VariableFormatValue.fromJson(o.toJson());
-      checkVariableFormatValue(od);
+      checkVariableFormatValue(od as api.VariableFormatValue);
     });
   });
 
@@ -2808,7 +2815,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWorkspace();
       var od = api.Workspace.fromJson(o.toJson());
-      checkWorkspace(od);
+      checkWorkspace(od as api.Workspace);
     });
   });
 
@@ -2816,7 +2823,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZone();
       var od = api.Zone.fromJson(o.toJson());
-      checkZone(od);
+      checkZone(od as api.Zone);
     });
   });
 
@@ -2824,7 +2831,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneBoundary();
       var od = api.ZoneBoundary.fromJson(o.toJson());
-      checkZoneBoundary(od);
+      checkZoneBoundary(od as api.ZoneBoundary);
     });
   });
 
@@ -2832,7 +2839,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneChildContainer();
       var od = api.ZoneChildContainer.fromJson(o.toJson());
-      checkZoneChildContainer(od);
+      checkZoneChildContainer(od as api.ZoneChildContainer);
     });
   });
 
@@ -2840,7 +2847,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildZoneTypeRestriction();
       var od = api.ZoneTypeRestriction.fromJson(o.toJson());
-      checkZoneTypeRestriction(od);
+      checkZoneTypeRestriction(od as api.ZoneTypeRestriction);
     });
   });
 
@@ -2889,7 +2896,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
 
@@ -2938,7 +2945,7 @@
       res
           .list(pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAccountsResponse(response);
+        checkListAccountsResponse(response as api.ListAccountsResponse);
       })));
     });
 
@@ -2950,8 +2957,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Account.fromJson(json);
-        checkAccount(obj);
+        var obj =
+            api.Account.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkAccount(obj as api.Account);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2994,7 +3002,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAccount(response);
+        checkAccount(response as api.Account);
       })));
     });
   });
@@ -3007,8 +3015,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Container.fromJson(json);
-        checkContainer(obj);
+        var obj =
+            api.Container.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkContainer(obj as api.Container);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3048,7 +3057,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainer(response);
+        checkContainer(response as api.Container);
       })));
     });
 
@@ -3142,7 +3151,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainer(response);
+        checkContainer(response as api.Container);
       })));
     });
 
@@ -3193,7 +3202,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListContainersResponse(response);
+        checkListContainersResponse(response as api.ListContainersResponse);
       })));
     });
 
@@ -3205,8 +3214,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Container.fromJson(json);
-        checkContainer(obj);
+        var obj =
+            api.Container.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkContainer(obj as api.Container);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3249,7 +3259,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainer(response);
+        checkContainer(response as api.Container);
       })));
     });
   });
@@ -3262,8 +3272,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3303,7 +3314,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
 
@@ -3397,7 +3408,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
 
@@ -3448,7 +3459,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListEnvironmentsResponse(response);
+        checkListEnvironmentsResponse(response as api.ListEnvironmentsResponse);
       })));
     });
 
@@ -3459,8 +3470,9 @@
       var arg_path = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3500,7 +3512,7 @@
       res
           .reauthorize(arg_request, arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
 
@@ -3512,8 +3524,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Environment.fromJson(json);
-        checkEnvironment(obj);
+        var obj = api.Environment.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkEnvironment(obj as api.Environment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3556,7 +3569,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEnvironment(response);
+        checkEnvironment(response as api.Environment);
       })));
     });
   });
@@ -3606,7 +3619,7 @@
       res
           .latest(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersionHeader(response);
+        checkContainerVersionHeader(response as api.ContainerVersionHeader);
       })));
     });
 
@@ -3663,7 +3676,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListContainerVersionsResponse(response);
+        checkListContainerVersionsResponse(
+            response as api.ListContainerVersionsResponse);
       })));
     });
   });
@@ -3763,7 +3777,7 @@
           .get(arg_path,
               containerVersionId: arg_containerVersionId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
 
@@ -3811,7 +3825,7 @@
       res
           .live(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
 
@@ -3862,7 +3876,8 @@
       res
           .publish(arg_path, fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPublishContainerVersionResponse(response);
+        checkPublishContainerVersionResponse(
+            response as api.PublishContainerVersionResponse);
       })));
     });
 
@@ -3910,7 +3925,7 @@
       res
           .setLatest(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
 
@@ -3958,7 +3973,7 @@
       res
           .undelete(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
 
@@ -3970,8 +3985,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ContainerVersion.fromJson(json);
-        checkContainerVersion(obj);
+        var obj = api.ContainerVersion.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkContainerVersion(obj as api.ContainerVersion);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4014,7 +4030,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkContainerVersion(response);
+        checkContainerVersion(response as api.ContainerVersion);
       })));
     });
   });
@@ -4027,8 +4043,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Workspace.fromJson(json);
-        checkWorkspace(obj);
+        var obj =
+            api.Workspace.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkWorkspace(obj as api.Workspace);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4068,7 +4085,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkspace(response);
+        checkWorkspace(response as api.Workspace);
       })));
     });
 
@@ -4079,9 +4096,10 @@
       var arg_path = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj =
-            api.CreateContainerVersionRequestVersionOptions.fromJson(json);
-        checkCreateContainerVersionRequestVersionOptions(obj);
+        var obj = api.CreateContainerVersionRequestVersionOptions.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCreateContainerVersionRequestVersionOptions(
+            obj as api.CreateContainerVersionRequestVersionOptions);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4121,7 +4139,8 @@
       res
           .createVersion(arg_request, arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateContainerVersionResponse(response);
+        checkCreateContainerVersionResponse(
+            response as api.CreateContainerVersionResponse);
       })));
     });
 
@@ -4215,7 +4234,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkspace(response);
+        checkWorkspace(response as api.Workspace);
       })));
     });
 
@@ -4263,7 +4282,8 @@
       res
           .getStatus(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetWorkspaceStatusResponse(response);
+        checkGetWorkspaceStatusResponse(
+            response as api.GetWorkspaceStatusResponse);
       })));
     });
 
@@ -4314,7 +4334,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListWorkspacesResponse(response);
+        checkListWorkspacesResponse(response as api.ListWorkspacesResponse);
       })));
     });
 
@@ -4362,7 +4382,7 @@
       res
           .quickPreview(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQuickPreviewResponse(response);
+        checkQuickPreviewResponse(response as api.QuickPreviewResponse);
       })));
     });
 
@@ -4374,8 +4394,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Entity.fromJson(json);
-        checkEntity(obj);
+        var obj =
+            api.Entity.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEntity(obj as api.Entity);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4464,7 +4485,7 @@
       res
           .sync(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSyncWorkspaceResponse(response);
+        checkSyncWorkspaceResponse(response as api.SyncWorkspaceResponse);
       })));
     });
 
@@ -4476,8 +4497,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Workspace.fromJson(json);
-        checkWorkspace(obj);
+        var obj =
+            api.Workspace.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkWorkspace(obj as api.Workspace);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4520,7 +4542,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWorkspace(response);
+        checkWorkspace(response as api.Workspace);
       })));
     });
   });
@@ -4577,7 +4599,8 @@
       res
           .create(arg_parent, type: arg_type, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCreateBuiltInVariableResponse(response);
+        checkCreateBuiltInVariableResponse(
+            response as api.CreateBuiltInVariableResponse);
       })));
     });
 
@@ -4685,7 +4708,8 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListEnabledBuiltInVariablesResponse(response);
+        checkListEnabledBuiltInVariablesResponse(
+            response as api.ListEnabledBuiltInVariablesResponse);
       })));
     });
 
@@ -4739,7 +4763,8 @@
       res
           .revert(arg_path, type: arg_type, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevertBuiltInVariableResponse(response);
+        checkRevertBuiltInVariableResponse(
+            response as api.RevertBuiltInVariableResponse);
       })));
     });
   });
@@ -4752,8 +4777,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -4793,7 +4819,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
 
@@ -4890,7 +4916,7 @@
       res
           .entities(arg_path, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolderEntities(response);
+        checkFolderEntities(response as api.FolderEntities);
       })));
     });
 
@@ -4938,7 +4964,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
 
@@ -4989,7 +5015,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFoldersResponse(response);
+        checkListFoldersResponse(response as api.ListFoldersResponse);
       })));
     });
 
@@ -5003,8 +5029,9 @@
       var arg_variableId = buildUnnamed4481();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5101,7 +5128,7 @@
       res
           .revert(arg_path, fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevertFolderResponse(response);
+        checkRevertFolderResponse(response as api.RevertFolderResponse);
       })));
     });
 
@@ -5113,8 +5140,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Folder.fromJson(json);
-        checkFolder(obj);
+        var obj =
+            api.Folder.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkFolder(obj as api.Folder);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5157,7 +5185,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFolder(response);
+        checkFolder(response as api.Folder);
       })));
     });
   });
@@ -5170,8 +5198,8 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Tag.fromJson(json);
-        checkTag(obj);
+        var obj = api.Tag.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTag(obj as api.Tag);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5211,7 +5239,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTag(response);
+        checkTag(response as api.Tag);
       })));
     });
 
@@ -5305,7 +5333,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTag(response);
+        checkTag(response as api.Tag);
       })));
     });
 
@@ -5356,7 +5384,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTagsResponse(response);
+        checkListTagsResponse(response as api.ListTagsResponse);
       })));
     });
 
@@ -5407,7 +5435,7 @@
       res
           .revert(arg_path, fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevertTagResponse(response);
+        checkRevertTagResponse(response as api.RevertTagResponse);
       })));
     });
 
@@ -5419,8 +5447,8 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Tag.fromJson(json);
-        checkTag(obj);
+        var obj = api.Tag.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTag(obj as api.Tag);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5463,7 +5491,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTag(response);
+        checkTag(response as api.Tag);
       })));
     });
   });
@@ -5478,8 +5506,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomTemplate.fromJson(json);
-        checkCustomTemplate(obj);
+        var obj = api.CustomTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomTemplate(obj as api.CustomTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5519,7 +5548,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomTemplate(response);
+        checkCustomTemplate(response as api.CustomTemplate);
       })));
     });
 
@@ -5615,7 +5644,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomTemplate(response);
+        checkCustomTemplate(response as api.CustomTemplate);
       })));
     });
 
@@ -5667,7 +5696,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTemplatesResponse(response);
+        checkListTemplatesResponse(response as api.ListTemplatesResponse);
       })));
     });
 
@@ -5719,7 +5748,7 @@
       res
           .revert(arg_path, fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevertTemplateResponse(response);
+        checkRevertTemplateResponse(response as api.RevertTemplateResponse);
       })));
     });
 
@@ -5732,8 +5761,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CustomTemplate.fromJson(json);
-        checkCustomTemplate(obj);
+        var obj = api.CustomTemplate.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCustomTemplate(obj as api.CustomTemplate);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5776,7 +5806,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCustomTemplate(response);
+        checkCustomTemplate(response as api.CustomTemplate);
       })));
     });
   });
@@ -5790,8 +5820,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Trigger.fromJson(json);
-        checkTrigger(obj);
+        var obj =
+            api.Trigger.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTrigger(obj as api.Trigger);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -5831,7 +5862,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrigger(response);
+        checkTrigger(response as api.Trigger);
       })));
     });
 
@@ -5925,7 +5956,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrigger(response);
+        checkTrigger(response as api.Trigger);
       })));
     });
 
@@ -5976,7 +6007,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTriggersResponse(response);
+        checkListTriggersResponse(response as api.ListTriggersResponse);
       })));
     });
 
@@ -6027,7 +6058,7 @@
       res
           .revert(arg_path, fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevertTriggerResponse(response);
+        checkRevertTriggerResponse(response as api.RevertTriggerResponse);
       })));
     });
 
@@ -6039,8 +6070,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Trigger.fromJson(json);
-        checkTrigger(obj);
+        var obj =
+            api.Trigger.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTrigger(obj as api.Trigger);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6083,7 +6115,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTrigger(response);
+        checkTrigger(response as api.Trigger);
       })));
     });
   });
@@ -6098,8 +6130,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Variable.fromJson(json);
-        checkVariable(obj);
+        var obj =
+            api.Variable.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVariable(obj as api.Variable);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6139,7 +6172,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariable(response);
+        checkVariable(response as api.Variable);
       })));
     });
 
@@ -6235,7 +6268,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariable(response);
+        checkVariable(response as api.Variable);
       })));
     });
 
@@ -6287,7 +6320,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListVariablesResponse(response);
+        checkListVariablesResponse(response as api.ListVariablesResponse);
       })));
     });
 
@@ -6339,7 +6372,7 @@
       res
           .revert(arg_path, fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevertVariableResponse(response);
+        checkRevertVariableResponse(response as api.RevertVariableResponse);
       })));
     });
 
@@ -6352,8 +6385,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Variable.fromJson(json);
-        checkVariable(obj);
+        var obj =
+            api.Variable.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVariable(obj as api.Variable);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6396,7 +6430,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVariable(response);
+        checkVariable(response as api.Variable);
       })));
     });
   });
@@ -6409,8 +6443,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Zone.fromJson(json);
-        checkZone(obj);
+        var obj =
+            api.Zone.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkZone(obj as api.Zone);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6450,7 +6485,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkZone(response);
+        checkZone(response as api.Zone);
       })));
     });
 
@@ -6544,7 +6579,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkZone(response);
+        checkZone(response as api.Zone);
       })));
     });
 
@@ -6595,7 +6630,7 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListZonesResponse(response);
+        checkListZonesResponse(response as api.ListZonesResponse);
       })));
     });
 
@@ -6646,7 +6681,7 @@
       res
           .revert(arg_path, fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRevertZoneResponse(response);
+        checkRevertZoneResponse(response as api.RevertZoneResponse);
       })));
     });
 
@@ -6658,8 +6693,9 @@
       var arg_fingerprint = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Zone.fromJson(json);
-        checkZone(obj);
+        var obj =
+            api.Zone.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkZone(obj as api.Zone);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6702,7 +6738,7 @@
           .update(arg_request, arg_path,
               fingerprint: arg_fingerprint, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkZone(response);
+        checkZone(response as api.Zone);
       })));
     });
   });
@@ -6715,8 +6751,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserPermission.fromJson(json);
-        checkUserPermission(obj);
+        var obj = api.UserPermission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUserPermission(obj as api.UserPermission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6756,7 +6793,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserPermission(response);
+        checkUserPermission(response as api.UserPermission);
       })));
     });
 
@@ -6850,7 +6887,7 @@
       res
           .get(arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserPermission(response);
+        checkUserPermission(response as api.UserPermission);
       })));
     });
 
@@ -6901,7 +6938,8 @@
       res
           .list(arg_parent, pageToken: arg_pageToken, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListUserPermissionsResponse(response);
+        checkListUserPermissionsResponse(
+            response as api.ListUserPermissionsResponse);
       })));
     });
 
@@ -6912,8 +6950,9 @@
       var arg_path = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UserPermission.fromJson(json);
-        checkUserPermission(obj);
+        var obj = api.UserPermission.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUserPermission(obj as api.UserPermission);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -6953,7 +6992,7 @@
       res
           .update(arg_request, arg_path, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkUserPermission(response);
+        checkUserPermission(response as api.UserPermission);
       })));
     });
   });
diff --git a/generated/googleapis/test/tasks/v1_test.dart b/generated/googleapis/test/tasks/v1_test.dart
index dd66238..7bd059c 100644
--- a/generated/googleapis/test/tasks/v1_test.dart
+++ b/generated/googleapis/test/tasks/v1_test.dart
@@ -106,8 +106,8 @@
 
 void checkUnnamed5840(core.List<api.TaskLinks> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTaskLinks(o[0]);
-  checkTaskLinks(o[1]);
+  checkTaskLinks(o[0] as api.TaskLinks);
+  checkTaskLinks(o[1] as api.TaskLinks);
 }
 
 core.int buildCounterTask = 0;
@@ -195,8 +195,8 @@
 
 void checkUnnamed5841(core.List<api.TaskList> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTaskList(o[0]);
-  checkTaskList(o[1]);
+  checkTaskList(o[0] as api.TaskList);
+  checkTaskList(o[1] as api.TaskList);
 }
 
 core.int buildCounterTaskLists = 0;
@@ -233,8 +233,8 @@
 
 void checkUnnamed5842(core.List<api.Task> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTask(o[0]);
-  checkTask(o[1]);
+  checkTask(o[0] as api.Task);
+  checkTask(o[1] as api.Task);
 }
 
 core.int buildCounterTasks = 0;
@@ -267,7 +267,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTaskLinks();
       var od = api.TaskLinks.fromJson(o.toJson());
-      checkTaskLinks(od);
+      checkTaskLinks(od as api.TaskLinks);
     });
   });
 
@@ -275,7 +275,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTask();
       var od = api.Task.fromJson(o.toJson());
-      checkTask(od);
+      checkTask(od as api.Task);
     });
   });
 
@@ -283,7 +283,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTaskList();
       var od = api.TaskList.fromJson(o.toJson());
-      checkTaskList(od);
+      checkTaskList(od as api.TaskList);
     });
   });
 
@@ -291,7 +291,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTaskLists();
       var od = api.TaskLists.fromJson(o.toJson());
-      checkTaskLists(od);
+      checkTaskLists(od as api.TaskLists);
     });
   });
 
@@ -299,7 +299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTasks();
       var od = api.Tasks.fromJson(o.toJson());
-      checkTasks(od);
+      checkTasks(od as api.Tasks);
     });
   });
 
@@ -398,7 +398,7 @@
       res
           .get(arg_tasklist, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTaskList(response);
+        checkTaskList(response as api.TaskList);
       })));
     });
 
@@ -408,8 +408,9 @@
       var arg_request = buildTaskList();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TaskList.fromJson(json);
-        checkTaskList(obj);
+        var obj =
+            api.TaskList.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTaskList(obj as api.TaskList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -448,7 +449,7 @@
       res
           .insert(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTaskList(response);
+        checkTaskList(response as api.TaskList);
       })));
     });
 
@@ -503,7 +504,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTaskLists(response);
+        checkTaskLists(response as api.TaskLists);
       })));
     });
 
@@ -514,8 +515,9 @@
       var arg_tasklist = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TaskList.fromJson(json);
-        checkTaskList(obj);
+        var obj =
+            api.TaskList.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTaskList(obj as api.TaskList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -557,7 +559,7 @@
       res
           .patch(arg_request, arg_tasklist, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTaskList(response);
+        checkTaskList(response as api.TaskList);
       })));
     });
 
@@ -568,8 +570,9 @@
       var arg_tasklist = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TaskList.fromJson(json);
-        checkTaskList(obj);
+        var obj =
+            api.TaskList.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTaskList(obj as api.TaskList);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -611,7 +614,7 @@
       res
           .update(arg_request, arg_tasklist, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTaskList(response);
+        checkTaskList(response as api.TaskList);
       })));
     });
   });
@@ -785,7 +788,7 @@
       res
           .get(arg_tasklist, arg_task, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
 
@@ -798,8 +801,9 @@
       var arg_previous = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Task.fromJson(json);
-        checkTask(obj);
+        var obj =
+            api.Task.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTask(obj as api.Task);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -851,7 +855,7 @@
           .insert(arg_request, arg_tasklist,
               parent: arg_parent, previous: arg_previous, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
 
@@ -946,7 +950,7 @@
               updatedMin: arg_updatedMin,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTasks(response);
+        checkTasks(response as api.Tasks);
       })));
     });
 
@@ -1018,7 +1022,7 @@
           .move(arg_tasklist, arg_task,
               parent: arg_parent, previous: arg_previous, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
 
@@ -1030,8 +1034,9 @@
       var arg_task = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Task.fromJson(json);
-        checkTask(obj);
+        var obj =
+            api.Task.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTask(obj as api.Task);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1082,7 +1087,7 @@
       res
           .patch(arg_request, arg_tasklist, arg_task, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
 
@@ -1094,8 +1099,9 @@
       var arg_task = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Task.fromJson(json);
-        checkTask(obj);
+        var obj =
+            api.Task.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTask(obj as api.Task);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1146,7 +1152,7 @@
       res
           .update(arg_request, arg_tasklist, arg_task, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTask(response);
+        checkTask(response as api.Task);
       })));
     });
   });
diff --git a/generated/googleapis/test/testing/v1_test.dart b/generated/googleapis/test/testing/v1_test.dart
index e93aef5..fa2699e 100644
--- a/generated/googleapis/test/testing/v1_test.dart
+++ b/generated/googleapis/test/testing/v1_test.dart
@@ -88,7 +88,7 @@
 void checkAccount(api.Account o) {
   buildCounterAccount++;
   if (buildCounterAccount < 3) {
-    checkGoogleAuto(o.googleAuto);
+    checkGoogleAuto(o.googleAuto as api.GoogleAuto);
   }
   buildCounterAccount--;
 }
@@ -127,8 +127,8 @@
 
 void checkUnnamed83(core.List<api.AndroidModel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAndroidModel(o[0]);
-  checkAndroidModel(o[1]);
+  checkAndroidModel(o[0] as api.AndroidModel);
+  checkAndroidModel(o[1] as api.AndroidModel);
 }
 
 core.List<api.AndroidVersion> buildUnnamed84() {
@@ -140,8 +140,8 @@
 
 void checkUnnamed84(core.List<api.AndroidVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAndroidVersion(o[0]);
-  checkAndroidVersion(o[1]);
+  checkAndroidVersion(o[0] as api.AndroidVersion);
+  checkAndroidVersion(o[1] as api.AndroidVersion);
 }
 
 core.int buildCounterAndroidDeviceCatalog = 0;
@@ -161,7 +161,8 @@
   buildCounterAndroidDeviceCatalog++;
   if (buildCounterAndroidDeviceCatalog < 3) {
     checkUnnamed83(o.models);
-    checkAndroidRuntimeConfiguration(o.runtimeConfiguration);
+    checkAndroidRuntimeConfiguration(
+        o.runtimeConfiguration as api.AndroidRuntimeConfiguration);
     checkUnnamed84(o.versions);
   }
   buildCounterAndroidDeviceCatalog--;
@@ -176,8 +177,8 @@
 
 void checkUnnamed85(core.List<api.AndroidDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAndroidDevice(o[0]);
-  checkAndroidDevice(o[1]);
+  checkAndroidDevice(o[0] as api.AndroidDevice);
+  checkAndroidDevice(o[1] as api.AndroidDevice);
 }
 
 core.int buildCounterAndroidDeviceList = 0;
@@ -234,12 +235,12 @@
 void checkAndroidInstrumentationTest(api.AndroidInstrumentationTest o) {
   buildCounterAndroidInstrumentationTest++;
   if (buildCounterAndroidInstrumentationTest < 3) {
-    checkFileReference(o.appApk);
-    checkAppBundle(o.appBundle);
+    checkFileReference(o.appApk as api.FileReference);
+    checkAppBundle(o.appBundle as api.AppBundle);
     unittest.expect(o.appPackageId, unittest.equals('foo'));
     unittest.expect(o.orchestratorOption, unittest.equals('foo'));
-    checkShardingOption(o.shardingOption);
-    checkFileReference(o.testApk);
+    checkShardingOption(o.shardingOption as api.ShardingOption);
+    checkFileReference(o.testApk as api.FileReference);
     unittest.expect(o.testPackageId, unittest.equals('foo'));
     unittest.expect(o.testRunnerClass, unittest.equals('foo'));
     checkUnnamed86(o.testTargets);
@@ -419,8 +420,8 @@
 
 void checkUnnamed94(core.List<api.RoboDirective> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoboDirective(o[0]);
-  checkRoboDirective(o[1]);
+  checkRoboDirective(o[0] as api.RoboDirective);
+  checkRoboDirective(o[1] as api.RoboDirective);
 }
 
 core.List<api.RoboStartingIntent> buildUnnamed95() {
@@ -432,8 +433,8 @@
 
 void checkUnnamed95(core.List<api.RoboStartingIntent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRoboStartingIntent(o[0]);
-  checkRoboStartingIntent(o[1]);
+  checkRoboStartingIntent(o[0] as api.RoboStartingIntent);
+  checkRoboStartingIntent(o[1] as api.RoboStartingIntent);
 }
 
 core.int buildCounterAndroidRoboTest = 0;
@@ -458,14 +459,14 @@
 void checkAndroidRoboTest(api.AndroidRoboTest o) {
   buildCounterAndroidRoboTest++;
   if (buildCounterAndroidRoboTest < 3) {
-    checkFileReference(o.appApk);
-    checkAppBundle(o.appBundle);
+    checkFileReference(o.appApk as api.FileReference);
+    checkAppBundle(o.appBundle as api.AppBundle);
     unittest.expect(o.appInitialActivity, unittest.equals('foo'));
     unittest.expect(o.appPackageId, unittest.equals('foo'));
     unittest.expect(o.maxDepth, unittest.equals(42));
     unittest.expect(o.maxSteps, unittest.equals(42));
     checkUnnamed94(o.roboDirectives);
-    checkFileReference(o.roboScript);
+    checkFileReference(o.roboScript as api.FileReference);
     checkUnnamed95(o.startingIntents);
   }
   buildCounterAndroidRoboTest--;
@@ -480,8 +481,8 @@
 
 void checkUnnamed96(core.List<api.Locale> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocale(o[0]);
-  checkLocale(o[1]);
+  checkLocale(o[0] as api.Locale);
+  checkLocale(o[1] as api.Locale);
 }
 
 core.List<api.Orientation> buildUnnamed97() {
@@ -493,8 +494,8 @@
 
 void checkUnnamed97(core.List<api.Orientation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrientation(o[0]);
-  checkOrientation(o[1]);
+  checkOrientation(o[0] as api.Orientation);
+  checkOrientation(o[1] as api.Orientation);
 }
 
 core.int buildCounterAndroidRuntimeConfiguration = 0;
@@ -562,8 +563,8 @@
 void checkAndroidTestLoop(api.AndroidTestLoop o) {
   buildCounterAndroidTestLoop++;
   if (buildCounterAndroidTestLoop < 3) {
-    checkFileReference(o.appApk);
-    checkAppBundle(o.appBundle);
+    checkFileReference(o.appApk as api.FileReference);
+    checkAppBundle(o.appBundle as api.AppBundle);
     unittest.expect(o.appPackageId, unittest.equals('foo'));
     checkUnnamed98(o.scenarioLabels);
     checkUnnamed99(o.scenarios);
@@ -606,9 +607,9 @@
   if (buildCounterAndroidVersion < 3) {
     unittest.expect(o.apiLevel, unittest.equals(42));
     unittest.expect(o.codeName, unittest.equals('foo'));
-    checkDistribution(o.distribution);
+    checkDistribution(o.distribution as api.Distribution);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkDate(o.releaseDate);
+    checkDate(o.releaseDate as api.Date);
     checkUnnamed100(o.tags);
     unittest.expect(o.versionString, unittest.equals('foo'));
   }
@@ -630,7 +631,7 @@
 void checkApk(api.Apk o) {
   buildCounterApk++;
   if (buildCounterApk < 3) {
-    checkFileReference(o.location);
+    checkFileReference(o.location as api.FileReference);
     unittest.expect(o.packageName, unittest.equals('foo'));
   }
   buildCounterApk--;
@@ -650,7 +651,7 @@
 void checkApkDetail(api.ApkDetail o) {
   buildCounterApkDetail++;
   if (buildCounterApkDetail < 3) {
-    checkApkManifest(o.apkManifest);
+    checkApkManifest(o.apkManifest as api.ApkManifest);
   }
   buildCounterApkDetail--;
 }
@@ -664,8 +665,8 @@
 
 void checkUnnamed101(core.List<api.IntentFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIntentFilter(o[0]);
-  checkIntentFilter(o[1]);
+  checkIntentFilter(o[0] as api.IntentFilter);
+  checkIntentFilter(o[1] as api.IntentFilter);
 }
 
 core.int buildCounterApkManifest = 0;
@@ -711,7 +712,7 @@
 void checkAppBundle(api.AppBundle o) {
   buildCounterAppBundle++;
   if (buildCounterAppBundle < 3) {
-    checkFileReference(o.bundleLocation);
+    checkFileReference(o.bundleLocation as api.FileReference);
   }
   buildCounterAppBundle--;
 }
@@ -744,8 +745,8 @@
 
 void checkUnnamed102(core.List<api.ClientInfoDetail> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkClientInfoDetail(o[0]);
-  checkClientInfoDetail(o[1]);
+  checkClientInfoDetail(o[0] as api.ClientInfoDetail);
+  checkClientInfoDetail(o[1] as api.ClientInfoDetail);
 }
 
 core.int buildCounterClientInfo = 0;
@@ -828,8 +829,8 @@
 void checkDeviceFile(api.DeviceFile o) {
   buildCounterDeviceFile++;
   if (buildCounterDeviceFile < 3) {
-    checkObbFile(o.obbFile);
-    checkRegularFile(o.regularFile);
+    checkObbFile(o.obbFile as api.ObbFile);
+    checkRegularFile(o.regularFile as api.RegularFile);
   }
   buildCounterDeviceFile--;
 }
@@ -850,7 +851,7 @@
 void checkDeviceIpBlock(api.DeviceIpBlock o) {
   buildCounterDeviceIpBlock++;
   if (buildCounterDeviceIpBlock < 3) {
-    checkDate(o.addedDate);
+    checkDate(o.addedDate as api.Date);
     unittest.expect(o.block, unittest.equals('foo'));
     unittest.expect(o.form, unittest.equals('foo'));
   }
@@ -866,8 +867,8 @@
 
 void checkUnnamed103(core.List<api.DeviceIpBlock> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeviceIpBlock(o[0]);
-  checkDeviceIpBlock(o[1]);
+  checkDeviceIpBlock(o[0] as api.DeviceIpBlock);
+  checkDeviceIpBlock(o[1] as api.DeviceIpBlock);
 }
 
 core.int buildCounterDeviceIpBlockCatalog = 0;
@@ -925,8 +926,8 @@
 void checkEnvironment(api.Environment o) {
   buildCounterEnvironment++;
   if (buildCounterEnvironment < 3) {
-    checkAndroidDevice(o.androidDevice);
-    checkIosDevice(o.iosDevice);
+    checkAndroidDevice(o.androidDevice as api.AndroidDevice);
+    checkIosDevice(o.iosDevice as api.IosDevice);
   }
   buildCounterEnvironment--;
 }
@@ -947,9 +948,9 @@
 void checkEnvironmentMatrix(api.EnvironmentMatrix o) {
   buildCounterEnvironmentMatrix++;
   if (buildCounterEnvironmentMatrix < 3) {
-    checkAndroidDeviceList(o.androidDeviceList);
-    checkAndroidMatrix(o.androidMatrix);
-    checkIosDeviceList(o.iosDeviceList);
+    checkAndroidDeviceList(o.androidDeviceList as api.AndroidDeviceList);
+    checkAndroidMatrix(o.androidMatrix as api.AndroidMatrix);
+    checkIosDeviceList(o.iosDeviceList as api.IosDeviceList);
   }
   buildCounterEnvironmentMatrix--;
 }
@@ -1008,7 +1009,7 @@
 void checkGetApkDetailsResponse(api.GetApkDetailsResponse o) {
   buildCounterGetApkDetailsResponse++;
   if (buildCounterGetApkDetailsResponse < 3) {
-    checkApkDetail(o.apkDetail);
+    checkApkDetail(o.apkDetail as api.ApkDetail);
   }
   buildCounterGetApkDetailsResponse--;
 }
@@ -1130,8 +1131,8 @@
 
 void checkUnnamed106(core.List<api.IosModel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIosModel(o[0]);
-  checkIosModel(o[1]);
+  checkIosModel(o[0] as api.IosModel);
+  checkIosModel(o[1] as api.IosModel);
 }
 
 core.List<api.IosVersion> buildUnnamed107() {
@@ -1143,8 +1144,8 @@
 
 void checkUnnamed107(core.List<api.IosVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIosVersion(o[0]);
-  checkIosVersion(o[1]);
+  checkIosVersion(o[0] as api.IosVersion);
+  checkIosVersion(o[1] as api.IosVersion);
 }
 
 core.List<api.XcodeVersion> buildUnnamed108() {
@@ -1156,8 +1157,8 @@
 
 void checkUnnamed108(core.List<api.XcodeVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkXcodeVersion(o[0]);
-  checkXcodeVersion(o[1]);
+  checkXcodeVersion(o[0] as api.XcodeVersion);
+  checkXcodeVersion(o[1] as api.XcodeVersion);
 }
 
 core.int buildCounterIosDeviceCatalog = 0;
@@ -1178,7 +1179,8 @@
   buildCounterIosDeviceCatalog++;
   if (buildCounterIosDeviceCatalog < 3) {
     checkUnnamed106(o.models);
-    checkIosRuntimeConfiguration(o.runtimeConfiguration);
+    checkIosRuntimeConfiguration(
+        o.runtimeConfiguration as api.IosRuntimeConfiguration);
     checkUnnamed107(o.versions);
     checkUnnamed108(o.xcodeVersions);
   }
@@ -1202,7 +1204,7 @@
   buildCounterIosDeviceFile++;
   if (buildCounterIosDeviceFile < 3) {
     unittest.expect(o.bundleId, unittest.equals('foo'));
-    checkFileReference(o.content);
+    checkFileReference(o.content as api.FileReference);
     unittest.expect(o.devicePath, unittest.equals('foo'));
   }
   buildCounterIosDeviceFile--;
@@ -1217,8 +1219,8 @@
 
 void checkUnnamed109(core.List<api.IosDevice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIosDevice(o[0]);
-  checkIosDevice(o[1]);
+  checkIosDevice(o[0] as api.IosDevice);
+  checkIosDevice(o[1] as api.IosDevice);
 }
 
 core.int buildCounterIosDeviceList = 0;
@@ -1323,8 +1325,8 @@
 
 void checkUnnamed113(core.List<api.Locale> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocale(o[0]);
-  checkLocale(o[1]);
+  checkLocale(o[0] as api.Locale);
+  checkLocale(o[1] as api.Locale);
 }
 
 core.List<api.Orientation> buildUnnamed114() {
@@ -1336,8 +1338,8 @@
 
 void checkUnnamed114(core.List<api.Orientation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOrientation(o[0]);
-  checkOrientation(o[1]);
+  checkOrientation(o[0] as api.Orientation);
+  checkOrientation(o[1] as api.Orientation);
 }
 
 core.int buildCounterIosRuntimeConfiguration = 0;
@@ -1391,7 +1393,7 @@
   buildCounterIosTestLoop++;
   if (buildCounterIosTestLoop < 3) {
     unittest.expect(o.appBundleId, unittest.equals('foo'));
-    checkFileReference(o.appIpa);
+    checkFileReference(o.appIpa as api.FileReference);
     checkUnnamed115(o.scenarios);
   }
   buildCounterIosTestLoop--;
@@ -1406,8 +1408,8 @@
 
 void checkUnnamed116(core.List<api.FileReference> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFileReference(o[0]);
-  checkFileReference(o[1]);
+  checkFileReference(o[0] as api.FileReference);
+  checkFileReference(o[1] as api.FileReference);
 }
 
 core.List<api.IosDeviceFile> buildUnnamed117() {
@@ -1419,8 +1421,8 @@
 
 void checkUnnamed117(core.List<api.IosDeviceFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIosDeviceFile(o[0]);
-  checkIosDeviceFile(o[1]);
+  checkIosDeviceFile(o[0] as api.IosDeviceFile);
+  checkIosDeviceFile(o[1] as api.IosDeviceFile);
 }
 
 core.List<api.IosDeviceFile> buildUnnamed118() {
@@ -1432,8 +1434,8 @@
 
 void checkUnnamed118(core.List<api.IosDeviceFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkIosDeviceFile(o[0]);
-  checkIosDeviceFile(o[1]);
+  checkIosDeviceFile(o[0] as api.IosDeviceFile);
+  checkIosDeviceFile(o[1] as api.IosDeviceFile);
 }
 
 core.int buildCounterIosTestSetup = 0;
@@ -1534,9 +1536,9 @@
   if (buildCounterIosXcTest < 3) {
     unittest.expect(o.appBundleId, unittest.equals('foo'));
     unittest.expect(o.testSpecialEntitlements, unittest.isTrue);
-    checkFileReference(o.testsZip);
+    checkFileReference(o.testsZip as api.FileReference);
     unittest.expect(o.xcodeVersion, unittest.equals('foo'));
-    checkFileReference(o.xctestrun);
+    checkFileReference(o.xctestrun as api.FileReference);
   }
   buildCounterIosXcTest--;
 }
@@ -1603,8 +1605,8 @@
 
 void checkUnnamed122(core.List<api.TestTargetsForShard> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTestTargetsForShard(o[0]);
-  checkTestTargetsForShard(o[1]);
+  checkTestTargetsForShard(o[0] as api.TestTargetsForShard);
+  checkTestTargetsForShard(o[1] as api.TestTargetsForShard);
 }
 
 core.int buildCounterManualSharding = 0;
@@ -1642,9 +1644,9 @@
 void checkNetworkConfiguration(api.NetworkConfiguration o) {
   buildCounterNetworkConfiguration++;
   if (buildCounterNetworkConfiguration < 3) {
-    checkTrafficRule(o.downRule);
+    checkTrafficRule(o.downRule as api.TrafficRule);
     unittest.expect(o.id, unittest.equals('foo'));
-    checkTrafficRule(o.upRule);
+    checkTrafficRule(o.upRule as api.TrafficRule);
   }
   buildCounterNetworkConfiguration--;
 }
@@ -1658,8 +1660,8 @@
 
 void checkUnnamed123(core.List<api.NetworkConfiguration> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkConfiguration(o[0]);
-  checkNetworkConfiguration(o[1]);
+  checkNetworkConfiguration(o[0] as api.NetworkConfiguration);
+  checkNetworkConfiguration(o[1] as api.NetworkConfiguration);
 }
 
 core.int buildCounterNetworkConfigurationCatalog = 0;
@@ -1696,7 +1698,7 @@
 void checkObbFile(api.ObbFile o) {
   buildCounterObbFile++;
   if (buildCounterObbFile < 3) {
-    checkFileReference(o.obb);
+    checkFileReference(o.obb as api.FileReference);
     unittest.expect(o.obbFileName, unittest.equals('foo'));
   }
   buildCounterObbFile--;
@@ -1772,7 +1774,7 @@
 void checkRegularFile(api.RegularFile o) {
   buildCounterRegularFile++;
   if (buildCounterRegularFile < 3) {
-    checkFileReference(o.content);
+    checkFileReference(o.content as api.FileReference);
     unittest.expect(o.devicePath, unittest.equals('foo'));
   }
   buildCounterRegularFile--;
@@ -1795,10 +1797,11 @@
 void checkResultStorage(api.ResultStorage o) {
   buildCounterResultStorage++;
   if (buildCounterResultStorage < 3) {
-    checkGoogleCloudStorage(o.googleCloudStorage);
+    checkGoogleCloudStorage(o.googleCloudStorage as api.GoogleCloudStorage);
     unittest.expect(o.resultsUrl, unittest.equals('foo'));
-    checkToolResultsExecution(o.toolResultsExecution);
-    checkToolResultsHistory(o.toolResultsHistory);
+    checkToolResultsExecution(
+        o.toolResultsExecution as api.ToolResultsExecution);
+    checkToolResultsHistory(o.toolResultsHistory as api.ToolResultsHistory);
   }
   buildCounterResultStorage--;
 }
@@ -1842,8 +1845,9 @@
 void checkRoboStartingIntent(api.RoboStartingIntent o) {
   buildCounterRoboStartingIntent++;
   if (buildCounterRoboStartingIntent < 3) {
-    checkLauncherActivityIntent(o.launcherActivity);
-    checkStartActivityIntent(o.startActivity);
+    checkLauncherActivityIntent(
+        o.launcherActivity as api.LauncherActivityIntent);
+    checkStartActivityIntent(o.startActivity as api.StartActivityIntent);
     unittest.expect(o.timeout, unittest.equals('foo'));
   }
   buildCounterRoboStartingIntent--;
@@ -1867,7 +1871,7 @@
   if (buildCounterShard < 3) {
     unittest.expect(o.numShards, unittest.equals(42));
     unittest.expect(o.shardIndex, unittest.equals(42));
-    checkTestTargetsForShard(o.testTargetsForShard);
+    checkTestTargetsForShard(o.testTargetsForShard as api.TestTargetsForShard);
   }
   buildCounterShard--;
 }
@@ -1887,8 +1891,8 @@
 void checkShardingOption(api.ShardingOption o) {
   buildCounterShardingOption++;
   if (buildCounterShardingOption < 3) {
-    checkManualSharding(o.manualSharding);
-    checkUniformSharding(o.uniformSharding);
+    checkManualSharding(o.manualSharding as api.ManualSharding);
+    checkUniformSharding(o.uniformSharding as api.UniformSharding);
   }
   buildCounterShardingOption--;
 }
@@ -2000,11 +2004,15 @@
 void checkTestEnvironmentCatalog(api.TestEnvironmentCatalog o) {
   buildCounterTestEnvironmentCatalog++;
   if (buildCounterTestEnvironmentCatalog < 3) {
-    checkAndroidDeviceCatalog(o.androidDeviceCatalog);
-    checkDeviceIpBlockCatalog(o.deviceIpBlockCatalog);
-    checkIosDeviceCatalog(o.iosDeviceCatalog);
-    checkNetworkConfigurationCatalog(o.networkConfigurationCatalog);
-    checkProvidedSoftwareCatalog(o.softwareCatalog);
+    checkAndroidDeviceCatalog(
+        o.androidDeviceCatalog as api.AndroidDeviceCatalog);
+    checkDeviceIpBlockCatalog(
+        o.deviceIpBlockCatalog as api.DeviceIpBlockCatalog);
+    checkIosDeviceCatalog(o.iosDeviceCatalog as api.IosDeviceCatalog);
+    checkNetworkConfigurationCatalog(
+        o.networkConfigurationCatalog as api.NetworkConfigurationCatalog);
+    checkProvidedSoftwareCatalog(
+        o.softwareCatalog as api.ProvidedSoftwareCatalog);
   }
   buildCounterTestEnvironmentCatalog--;
 }
@@ -2032,16 +2040,16 @@
 void checkTestExecution(api.TestExecution o) {
   buildCounterTestExecution++;
   if (buildCounterTestExecution < 3) {
-    checkEnvironment(o.environment);
+    checkEnvironment(o.environment as api.Environment);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.matrixId, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkShard(o.shard);
+    checkShard(o.shard as api.Shard);
     unittest.expect(o.state, unittest.equals('foo'));
-    checkTestDetails(o.testDetails);
-    checkTestSpecification(o.testSpecification);
+    checkTestDetails(o.testDetails as api.TestDetails);
+    checkTestSpecification(o.testSpecification as api.TestSpecification);
     unittest.expect(o.timestamp, unittest.equals('foo'));
-    checkToolResultsStep(o.toolResultsStep);
+    checkToolResultsStep(o.toolResultsStep as api.ToolResultsStep);
   }
   buildCounterTestExecution--;
 }
@@ -2055,8 +2063,8 @@
 
 void checkUnnamed127(core.List<api.TestExecution> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTestExecution(o[0]);
-  checkTestExecution(o[1]);
+  checkTestExecution(o[0] as api.TestExecution);
+  checkTestExecution(o[1] as api.TestExecution);
 }
 
 core.int buildCounterTestMatrix = 0;
@@ -2084,17 +2092,17 @@
 void checkTestMatrix(api.TestMatrix o) {
   buildCounterTestMatrix++;
   if (buildCounterTestMatrix < 3) {
-    checkClientInfo(o.clientInfo);
-    checkEnvironmentMatrix(o.environmentMatrix);
+    checkClientInfo(o.clientInfo as api.ClientInfo);
+    checkEnvironmentMatrix(o.environmentMatrix as api.EnvironmentMatrix);
     unittest.expect(o.flakyTestAttempts, unittest.equals(42));
     unittest.expect(o.invalidMatrixDetails, unittest.equals('foo'));
     unittest.expect(o.outcomeSummary, unittest.equals('foo'));
     unittest.expect(o.projectId, unittest.equals('foo'));
-    checkResultStorage(o.resultStorage);
+    checkResultStorage(o.resultStorage as api.ResultStorage);
     unittest.expect(o.state, unittest.equals('foo'));
     checkUnnamed127(o.testExecutions);
     unittest.expect(o.testMatrixId, unittest.equals('foo'));
-    checkTestSpecification(o.testSpecification);
+    checkTestSpecification(o.testSpecification as api.TestSpecification);
     unittest.expect(o.timestamp, unittest.equals('foo'));
   }
   buildCounterTestMatrix--;
@@ -2109,8 +2117,8 @@
 
 void checkUnnamed128(core.List<api.Apk> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApk(o[0]);
-  checkApk(o[1]);
+  checkApk(o[0] as api.Apk);
+  checkApk(o[1] as api.Apk);
 }
 
 core.List<core.String> buildUnnamed129() {
@@ -2135,8 +2143,8 @@
 
 void checkUnnamed130(core.List<api.EnvironmentVariable> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEnvironmentVariable(o[0]);
-  checkEnvironmentVariable(o[1]);
+  checkEnvironmentVariable(o[0] as api.EnvironmentVariable);
+  checkEnvironmentVariable(o[1] as api.EnvironmentVariable);
 }
 
 core.List<api.DeviceFile> buildUnnamed131() {
@@ -2148,8 +2156,8 @@
 
 void checkUnnamed131(core.List<api.DeviceFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDeviceFile(o[0]);
-  checkDeviceFile(o[1]);
+  checkDeviceFile(o[0] as api.DeviceFile);
+  checkDeviceFile(o[1] as api.DeviceFile);
 }
 
 core.int buildCounterTestSetup = 0;
@@ -2173,14 +2181,14 @@
 void checkTestSetup(api.TestSetup o) {
   buildCounterTestSetup++;
   if (buildCounterTestSetup < 3) {
-    checkAccount(o.account);
+    checkAccount(o.account as api.Account);
     checkUnnamed128(o.additionalApks);
     checkUnnamed129(o.directoriesToPull);
     unittest.expect(o.dontAutograntPermissions, unittest.isTrue);
     checkUnnamed130(o.environmentVariables);
     checkUnnamed131(o.filesToPush);
     unittest.expect(o.networkProfile, unittest.equals('foo'));
-    checkSystraceSetup(o.systrace);
+    checkSystraceSetup(o.systrace as api.SystraceSetup);
   }
   buildCounterTestSetup--;
 }
@@ -2208,15 +2216,16 @@
 void checkTestSpecification(api.TestSpecification o) {
   buildCounterTestSpecification++;
   if (buildCounterTestSpecification < 3) {
-    checkAndroidInstrumentationTest(o.androidInstrumentationTest);
-    checkAndroidRoboTest(o.androidRoboTest);
-    checkAndroidTestLoop(o.androidTestLoop);
+    checkAndroidInstrumentationTest(
+        o.androidInstrumentationTest as api.AndroidInstrumentationTest);
+    checkAndroidRoboTest(o.androidRoboTest as api.AndroidRoboTest);
+    checkAndroidTestLoop(o.androidTestLoop as api.AndroidTestLoop);
     unittest.expect(o.disablePerformanceMetrics, unittest.isTrue);
     unittest.expect(o.disableVideoRecording, unittest.isTrue);
-    checkIosTestLoop(o.iosTestLoop);
-    checkIosTestSetup(o.iosTestSetup);
-    checkIosXcTest(o.iosXcTest);
-    checkTestSetup(o.testSetup);
+    checkIosTestLoop(o.iosTestLoop as api.IosTestLoop);
+    checkIosTestSetup(o.iosTestSetup as api.IosTestSetup);
+    checkIosXcTest(o.iosXcTest as api.IosXcTest);
+    checkTestSetup(o.testSetup as api.TestSetup);
     unittest.expect(o.testTimeout, unittest.equals('foo'));
   }
   buildCounterTestSpecification--;
@@ -2408,7 +2417,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccount();
       var od = api.Account.fromJson(o.toJson());
-      checkAccount(od);
+      checkAccount(od as api.Account);
     });
   });
 
@@ -2416,7 +2425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidDevice();
       var od = api.AndroidDevice.fromJson(o.toJson());
-      checkAndroidDevice(od);
+      checkAndroidDevice(od as api.AndroidDevice);
     });
   });
 
@@ -2424,7 +2433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidDeviceCatalog();
       var od = api.AndroidDeviceCatalog.fromJson(o.toJson());
-      checkAndroidDeviceCatalog(od);
+      checkAndroidDeviceCatalog(od as api.AndroidDeviceCatalog);
     });
   });
 
@@ -2432,7 +2441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidDeviceList();
       var od = api.AndroidDeviceList.fromJson(o.toJson());
-      checkAndroidDeviceList(od);
+      checkAndroidDeviceList(od as api.AndroidDeviceList);
     });
   });
 
@@ -2440,7 +2449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidInstrumentationTest();
       var od = api.AndroidInstrumentationTest.fromJson(o.toJson());
-      checkAndroidInstrumentationTest(od);
+      checkAndroidInstrumentationTest(od as api.AndroidInstrumentationTest);
     });
   });
 
@@ -2448,7 +2457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidMatrix();
       var od = api.AndroidMatrix.fromJson(o.toJson());
-      checkAndroidMatrix(od);
+      checkAndroidMatrix(od as api.AndroidMatrix);
     });
   });
 
@@ -2456,7 +2465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidModel();
       var od = api.AndroidModel.fromJson(o.toJson());
-      checkAndroidModel(od);
+      checkAndroidModel(od as api.AndroidModel);
     });
   });
 
@@ -2464,7 +2473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidRoboTest();
       var od = api.AndroidRoboTest.fromJson(o.toJson());
-      checkAndroidRoboTest(od);
+      checkAndroidRoboTest(od as api.AndroidRoboTest);
     });
   });
 
@@ -2472,7 +2481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidRuntimeConfiguration();
       var od = api.AndroidRuntimeConfiguration.fromJson(o.toJson());
-      checkAndroidRuntimeConfiguration(od);
+      checkAndroidRuntimeConfiguration(od as api.AndroidRuntimeConfiguration);
     });
   });
 
@@ -2480,7 +2489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidTestLoop();
       var od = api.AndroidTestLoop.fromJson(o.toJson());
-      checkAndroidTestLoop(od);
+      checkAndroidTestLoop(od as api.AndroidTestLoop);
     });
   });
 
@@ -2488,7 +2497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAndroidVersion();
       var od = api.AndroidVersion.fromJson(o.toJson());
-      checkAndroidVersion(od);
+      checkAndroidVersion(od as api.AndroidVersion);
     });
   });
 
@@ -2496,7 +2505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApk();
       var od = api.Apk.fromJson(o.toJson());
-      checkApk(od);
+      checkApk(od as api.Apk);
     });
   });
 
@@ -2504,7 +2513,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApkDetail();
       var od = api.ApkDetail.fromJson(o.toJson());
-      checkApkDetail(od);
+      checkApkDetail(od as api.ApkDetail);
     });
   });
 
@@ -2512,7 +2521,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApkManifest();
       var od = api.ApkManifest.fromJson(o.toJson());
-      checkApkManifest(od);
+      checkApkManifest(od as api.ApkManifest);
     });
   });
 
@@ -2520,7 +2529,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAppBundle();
       var od = api.AppBundle.fromJson(o.toJson());
-      checkAppBundle(od);
+      checkAppBundle(od as api.AppBundle);
     });
   });
 
@@ -2528,7 +2537,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelTestMatrixResponse();
       var od = api.CancelTestMatrixResponse.fromJson(o.toJson());
-      checkCancelTestMatrixResponse(od);
+      checkCancelTestMatrixResponse(od as api.CancelTestMatrixResponse);
     });
   });
 
@@ -2536,7 +2545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClientInfo();
       var od = api.ClientInfo.fromJson(o.toJson());
-      checkClientInfo(od);
+      checkClientInfo(od as api.ClientInfo);
     });
   });
 
@@ -2544,7 +2553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildClientInfoDetail();
       var od = api.ClientInfoDetail.fromJson(o.toJson());
-      checkClientInfoDetail(od);
+      checkClientInfoDetail(od as api.ClientInfoDetail);
     });
   });
 
@@ -2552,7 +2561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDate();
       var od = api.Date.fromJson(o.toJson());
-      checkDate(od);
+      checkDate(od as api.Date);
     });
   });
 
@@ -2560,7 +2569,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceFile();
       var od = api.DeviceFile.fromJson(o.toJson());
-      checkDeviceFile(od);
+      checkDeviceFile(od as api.DeviceFile);
     });
   });
 
@@ -2568,7 +2577,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceIpBlock();
       var od = api.DeviceIpBlock.fromJson(o.toJson());
-      checkDeviceIpBlock(od);
+      checkDeviceIpBlock(od as api.DeviceIpBlock);
     });
   });
 
@@ -2576,7 +2585,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDeviceIpBlockCatalog();
       var od = api.DeviceIpBlockCatalog.fromJson(o.toJson());
-      checkDeviceIpBlockCatalog(od);
+      checkDeviceIpBlockCatalog(od as api.DeviceIpBlockCatalog);
     });
   });
 
@@ -2584,7 +2593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDistribution();
       var od = api.Distribution.fromJson(o.toJson());
-      checkDistribution(od);
+      checkDistribution(od as api.Distribution);
     });
   });
 
@@ -2592,7 +2601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironment();
       var od = api.Environment.fromJson(o.toJson());
-      checkEnvironment(od);
+      checkEnvironment(od as api.Environment);
     });
   });
 
@@ -2600,7 +2609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironmentMatrix();
       var od = api.EnvironmentMatrix.fromJson(o.toJson());
-      checkEnvironmentMatrix(od);
+      checkEnvironmentMatrix(od as api.EnvironmentMatrix);
     });
   });
 
@@ -2608,7 +2617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEnvironmentVariable();
       var od = api.EnvironmentVariable.fromJson(o.toJson());
-      checkEnvironmentVariable(od);
+      checkEnvironmentVariable(od as api.EnvironmentVariable);
     });
   });
 
@@ -2616,7 +2625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFileReference();
       var od = api.FileReference.fromJson(o.toJson());
-      checkFileReference(od);
+      checkFileReference(od as api.FileReference);
     });
   });
 
@@ -2624,7 +2633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGetApkDetailsResponse();
       var od = api.GetApkDetailsResponse.fromJson(o.toJson());
-      checkGetApkDetailsResponse(od);
+      checkGetApkDetailsResponse(od as api.GetApkDetailsResponse);
     });
   });
 
@@ -2632,7 +2641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAuto();
       var od = api.GoogleAuto.fromJson(o.toJson());
-      checkGoogleAuto(od);
+      checkGoogleAuto(od as api.GoogleAuto);
     });
   });
 
@@ -2640,7 +2649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudStorage();
       var od = api.GoogleCloudStorage.fromJson(o.toJson());
-      checkGoogleCloudStorage(od);
+      checkGoogleCloudStorage(od as api.GoogleCloudStorage);
     });
   });
 
@@ -2648,7 +2657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIntentFilter();
       var od = api.IntentFilter.fromJson(o.toJson());
-      checkIntentFilter(od);
+      checkIntentFilter(od as api.IntentFilter);
     });
   });
 
@@ -2656,7 +2665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosDevice();
       var od = api.IosDevice.fromJson(o.toJson());
-      checkIosDevice(od);
+      checkIosDevice(od as api.IosDevice);
     });
   });
 
@@ -2664,7 +2673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosDeviceCatalog();
       var od = api.IosDeviceCatalog.fromJson(o.toJson());
-      checkIosDeviceCatalog(od);
+      checkIosDeviceCatalog(od as api.IosDeviceCatalog);
     });
   });
 
@@ -2672,7 +2681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosDeviceFile();
       var od = api.IosDeviceFile.fromJson(o.toJson());
-      checkIosDeviceFile(od);
+      checkIosDeviceFile(od as api.IosDeviceFile);
     });
   });
 
@@ -2680,7 +2689,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosDeviceList();
       var od = api.IosDeviceList.fromJson(o.toJson());
-      checkIosDeviceList(od);
+      checkIosDeviceList(od as api.IosDeviceList);
     });
   });
 
@@ -2688,7 +2697,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosModel();
       var od = api.IosModel.fromJson(o.toJson());
-      checkIosModel(od);
+      checkIosModel(od as api.IosModel);
     });
   });
 
@@ -2696,7 +2705,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosRuntimeConfiguration();
       var od = api.IosRuntimeConfiguration.fromJson(o.toJson());
-      checkIosRuntimeConfiguration(od);
+      checkIosRuntimeConfiguration(od as api.IosRuntimeConfiguration);
     });
   });
 
@@ -2704,7 +2713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosTestLoop();
       var od = api.IosTestLoop.fromJson(o.toJson());
-      checkIosTestLoop(od);
+      checkIosTestLoop(od as api.IosTestLoop);
     });
   });
 
@@ -2712,7 +2721,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosTestSetup();
       var od = api.IosTestSetup.fromJson(o.toJson());
-      checkIosTestSetup(od);
+      checkIosTestSetup(od as api.IosTestSetup);
     });
   });
 
@@ -2720,7 +2729,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosVersion();
       var od = api.IosVersion.fromJson(o.toJson());
-      checkIosVersion(od);
+      checkIosVersion(od as api.IosVersion);
     });
   });
 
@@ -2728,7 +2737,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIosXcTest();
       var od = api.IosXcTest.fromJson(o.toJson());
-      checkIosXcTest(od);
+      checkIosXcTest(od as api.IosXcTest);
     });
   });
 
@@ -2736,7 +2745,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLauncherActivityIntent();
       var od = api.LauncherActivityIntent.fromJson(o.toJson());
-      checkLauncherActivityIntent(od);
+      checkLauncherActivityIntent(od as api.LauncherActivityIntent);
     });
   });
 
@@ -2744,7 +2753,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocale();
       var od = api.Locale.fromJson(o.toJson());
-      checkLocale(od);
+      checkLocale(od as api.Locale);
     });
   });
 
@@ -2752,7 +2761,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildManualSharding();
       var od = api.ManualSharding.fromJson(o.toJson());
-      checkManualSharding(od);
+      checkManualSharding(od as api.ManualSharding);
     });
   });
 
@@ -2760,7 +2769,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkConfiguration();
       var od = api.NetworkConfiguration.fromJson(o.toJson());
-      checkNetworkConfiguration(od);
+      checkNetworkConfiguration(od as api.NetworkConfiguration);
     });
   });
 
@@ -2768,7 +2777,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkConfigurationCatalog();
       var od = api.NetworkConfigurationCatalog.fromJson(o.toJson());
-      checkNetworkConfigurationCatalog(od);
+      checkNetworkConfigurationCatalog(od as api.NetworkConfigurationCatalog);
     });
   });
 
@@ -2776,7 +2785,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObbFile();
       var od = api.ObbFile.fromJson(o.toJson());
-      checkObbFile(od);
+      checkObbFile(od as api.ObbFile);
     });
   });
 
@@ -2784,7 +2793,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrientation();
       var od = api.Orientation.fromJson(o.toJson());
-      checkOrientation(od);
+      checkOrientation(od as api.Orientation);
     });
   });
 
@@ -2792,7 +2801,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProvidedSoftwareCatalog();
       var od = api.ProvidedSoftwareCatalog.fromJson(o.toJson());
-      checkProvidedSoftwareCatalog(od);
+      checkProvidedSoftwareCatalog(od as api.ProvidedSoftwareCatalog);
     });
   });
 
@@ -2800,7 +2809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRegularFile();
       var od = api.RegularFile.fromJson(o.toJson());
-      checkRegularFile(od);
+      checkRegularFile(od as api.RegularFile);
     });
   });
 
@@ -2808,7 +2817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultStorage();
       var od = api.ResultStorage.fromJson(o.toJson());
-      checkResultStorage(od);
+      checkResultStorage(od as api.ResultStorage);
     });
   });
 
@@ -2816,7 +2825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoboDirective();
       var od = api.RoboDirective.fromJson(o.toJson());
-      checkRoboDirective(od);
+      checkRoboDirective(od as api.RoboDirective);
     });
   });
 
@@ -2824,7 +2833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRoboStartingIntent();
       var od = api.RoboStartingIntent.fromJson(o.toJson());
-      checkRoboStartingIntent(od);
+      checkRoboStartingIntent(od as api.RoboStartingIntent);
     });
   });
 
@@ -2832,7 +2841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShard();
       var od = api.Shard.fromJson(o.toJson());
-      checkShard(od);
+      checkShard(od as api.Shard);
     });
   });
 
@@ -2840,7 +2849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildShardingOption();
       var od = api.ShardingOption.fromJson(o.toJson());
-      checkShardingOption(od);
+      checkShardingOption(od as api.ShardingOption);
     });
   });
 
@@ -2848,7 +2857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartActivityIntent();
       var od = api.StartActivityIntent.fromJson(o.toJson());
-      checkStartActivityIntent(od);
+      checkStartActivityIntent(od as api.StartActivityIntent);
     });
   });
 
@@ -2856,7 +2865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSystraceSetup();
       var od = api.SystraceSetup.fromJson(o.toJson());
-      checkSystraceSetup(od);
+      checkSystraceSetup(od as api.SystraceSetup);
     });
   });
 
@@ -2864,7 +2873,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestDetails();
       var od = api.TestDetails.fromJson(o.toJson());
-      checkTestDetails(od);
+      checkTestDetails(od as api.TestDetails);
     });
   });
 
@@ -2872,7 +2881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestEnvironmentCatalog();
       var od = api.TestEnvironmentCatalog.fromJson(o.toJson());
-      checkTestEnvironmentCatalog(od);
+      checkTestEnvironmentCatalog(od as api.TestEnvironmentCatalog);
     });
   });
 
@@ -2880,7 +2889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestExecution();
       var od = api.TestExecution.fromJson(o.toJson());
-      checkTestExecution(od);
+      checkTestExecution(od as api.TestExecution);
     });
   });
 
@@ -2888,7 +2897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestMatrix();
       var od = api.TestMatrix.fromJson(o.toJson());
-      checkTestMatrix(od);
+      checkTestMatrix(od as api.TestMatrix);
     });
   });
 
@@ -2896,7 +2905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestSetup();
       var od = api.TestSetup.fromJson(o.toJson());
-      checkTestSetup(od);
+      checkTestSetup(od as api.TestSetup);
     });
   });
 
@@ -2904,7 +2913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestSpecification();
       var od = api.TestSpecification.fromJson(o.toJson());
-      checkTestSpecification(od);
+      checkTestSpecification(od as api.TestSpecification);
     });
   });
 
@@ -2912,7 +2921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestTargetsForShard();
       var od = api.TestTargetsForShard.fromJson(o.toJson());
-      checkTestTargetsForShard(od);
+      checkTestTargetsForShard(od as api.TestTargetsForShard);
     });
   });
 
@@ -2920,7 +2929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildToolResultsExecution();
       var od = api.ToolResultsExecution.fromJson(o.toJson());
-      checkToolResultsExecution(od);
+      checkToolResultsExecution(od as api.ToolResultsExecution);
     });
   });
 
@@ -2928,7 +2937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildToolResultsHistory();
       var od = api.ToolResultsHistory.fromJson(o.toJson());
-      checkToolResultsHistory(od);
+      checkToolResultsHistory(od as api.ToolResultsHistory);
     });
   });
 
@@ -2936,7 +2945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildToolResultsStep();
       var od = api.ToolResultsStep.fromJson(o.toJson());
-      checkToolResultsStep(od);
+      checkToolResultsStep(od as api.ToolResultsStep);
     });
   });
 
@@ -2944,7 +2953,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTrafficRule();
       var od = api.TrafficRule.fromJson(o.toJson());
-      checkTrafficRule(od);
+      checkTrafficRule(od as api.TrafficRule);
     });
   });
 
@@ -2952,7 +2961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUniformSharding();
       var od = api.UniformSharding.fromJson(o.toJson());
-      checkUniformSharding(od);
+      checkUniformSharding(od as api.UniformSharding);
     });
   });
 
@@ -2960,7 +2969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildXcodeVersion();
       var od = api.XcodeVersion.fromJson(o.toJson());
-      checkXcodeVersion(od);
+      checkXcodeVersion(od as api.XcodeVersion);
     });
   });
 
@@ -2971,8 +2980,9 @@
       var arg_request = buildFileReference();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.FileReference.fromJson(json);
-        checkFileReference(obj);
+        var obj = api.FileReference.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkFileReference(obj as api.FileReference);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3011,7 +3021,7 @@
       res
           .getApkDetails(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGetApkDetailsResponse(response);
+        checkGetApkDetailsResponse(response as api.GetApkDetailsResponse);
       })));
     });
   });
@@ -3079,7 +3089,7 @@
       res
           .cancel(arg_projectId, arg_testMatrixId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCancelTestMatrixResponse(response);
+        checkCancelTestMatrixResponse(response as api.CancelTestMatrixResponse);
       })));
     });
 
@@ -3091,8 +3101,9 @@
       var arg_requestId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestMatrix.fromJson(json);
-        checkTestMatrix(obj);
+        var obj = api.TestMatrix.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTestMatrix(obj as api.TestMatrix);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3143,7 +3154,7 @@
           .create(arg_request, arg_projectId,
               requestId: arg_requestId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestMatrix(response);
+        checkTestMatrix(response as api.TestMatrix);
       })));
     });
 
@@ -3203,7 +3214,7 @@
       res
           .get(arg_projectId, arg_testMatrixId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestMatrix(response);
+        checkTestMatrix(response as api.TestMatrix);
       })));
     });
   });
@@ -3259,7 +3270,7 @@
           .get(arg_environmentType,
               projectId: arg_projectId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestEnvironmentCatalog(response);
+        checkTestEnvironmentCatalog(response as api.TestEnvironmentCatalog);
       })));
     });
   });
diff --git a/generated/googleapis/test/texttospeech/v1_test.dart b/generated/googleapis/test/texttospeech/v1_test.dart
index 40536fc..b9e3021 100644
--- a/generated/googleapis/test/texttospeech/v1_test.dart
+++ b/generated/googleapis/test/texttospeech/v1_test.dart
@@ -125,8 +125,8 @@
 
 void checkUnnamed4543(core.List<api.Voice> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVoice(o[0]);
-  checkVoice(o[1]);
+  checkVoice(o[0] as api.Voice);
+  checkVoice(o[1] as api.Voice);
 }
 
 core.int buildCounterListVoicesResponse = 0;
@@ -185,9 +185,9 @@
 void checkSynthesizeSpeechRequest(api.SynthesizeSpeechRequest o) {
   buildCounterSynthesizeSpeechRequest++;
   if (buildCounterSynthesizeSpeechRequest < 3) {
-    checkAudioConfig(o.audioConfig);
-    checkSynthesisInput(o.input);
-    checkVoiceSelectionParams(o.voice);
+    checkAudioConfig(o.audioConfig as api.AudioConfig);
+    checkSynthesisInput(o.input as api.SynthesisInput);
+    checkVoiceSelectionParams(o.voice as api.VoiceSelectionParams);
   }
   buildCounterSynthesizeSpeechRequest--;
 }
@@ -277,7 +277,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAudioConfig();
       var od = api.AudioConfig.fromJson(o.toJson());
-      checkAudioConfig(od);
+      checkAudioConfig(od as api.AudioConfig);
     });
   });
 
@@ -285,7 +285,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListVoicesResponse();
       var od = api.ListVoicesResponse.fromJson(o.toJson());
-      checkListVoicesResponse(od);
+      checkListVoicesResponse(od as api.ListVoicesResponse);
     });
   });
 
@@ -293,7 +293,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSynthesisInput();
       var od = api.SynthesisInput.fromJson(o.toJson());
-      checkSynthesisInput(od);
+      checkSynthesisInput(od as api.SynthesisInput);
     });
   });
 
@@ -301,7 +301,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSynthesizeSpeechRequest();
       var od = api.SynthesizeSpeechRequest.fromJson(o.toJson());
-      checkSynthesizeSpeechRequest(od);
+      checkSynthesizeSpeechRequest(od as api.SynthesizeSpeechRequest);
     });
   });
 
@@ -309,7 +309,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSynthesizeSpeechResponse();
       var od = api.SynthesizeSpeechResponse.fromJson(o.toJson());
-      checkSynthesizeSpeechResponse(od);
+      checkSynthesizeSpeechResponse(od as api.SynthesizeSpeechResponse);
     });
   });
 
@@ -317,7 +317,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVoice();
       var od = api.Voice.fromJson(o.toJson());
-      checkVoice(od);
+      checkVoice(od as api.Voice);
     });
   });
 
@@ -325,7 +325,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVoiceSelectionParams();
       var od = api.VoiceSelectionParams.fromJson(o.toJson());
-      checkVoiceSelectionParams(od);
+      checkVoiceSelectionParams(od as api.VoiceSelectionParams);
     });
   });
 
@@ -336,8 +336,9 @@
       var arg_request = buildSynthesizeSpeechRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SynthesizeSpeechRequest.fromJson(json);
-        checkSynthesizeSpeechRequest(obj);
+        var obj = api.SynthesizeSpeechRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSynthesizeSpeechRequest(obj as api.SynthesizeSpeechRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -376,7 +377,7 @@
       res
           .synthesize(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSynthesizeSpeechResponse(response);
+        checkSynthesizeSpeechResponse(response as api.SynthesizeSpeechResponse);
       })));
     });
   });
@@ -427,7 +428,7 @@
       res
           .list(languageCode: arg_languageCode, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListVoicesResponse(response);
+        checkListVoicesResponse(response as api.ListVoicesResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/tpu/v1_test.dart b/generated/googleapis/test/tpu/v1_test.dart
index 5119937..3a2e4dc 100644
--- a/generated/googleapis/test/tpu/v1_test.dart
+++ b/generated/googleapis/test/tpu/v1_test.dart
@@ -119,8 +119,8 @@
 
 void checkUnnamed5424(core.List<api.AcceleratorType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAcceleratorType(o[0]);
-  checkAcceleratorType(o[1]);
+  checkAcceleratorType(o[0] as api.AcceleratorType);
+  checkAcceleratorType(o[1] as api.AcceleratorType);
 }
 
 core.List<core.String> buildUnnamed5425() {
@@ -168,8 +168,8 @@
 
 void checkUnnamed5426(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -202,8 +202,8 @@
 
 void checkUnnamed5427(core.List<api.Node> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNode(o[0]);
-  checkNode(o[1]);
+  checkNode(o[0] as api.Node);
+  checkNode(o[1] as api.Node);
 }
 
 core.List<core.String> buildUnnamed5428() {
@@ -251,8 +251,8 @@
 
 void checkUnnamed5429(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -285,8 +285,8 @@
 
 void checkUnnamed5430(core.List<api.TensorFlowVersion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTensorFlowVersion(o[0]);
-  checkTensorFlowVersion(o[1]);
+  checkTensorFlowVersion(o[0] as api.TensorFlowVersion);
+  checkTensorFlowVersion(o[1] as api.TensorFlowVersion);
 }
 
 core.List<core.String> buildUnnamed5431() {
@@ -437,8 +437,8 @@
 
 void checkUnnamed5435(core.List<api.NetworkEndpoint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNetworkEndpoint(o[0]);
-  checkNetworkEndpoint(o[1]);
+  checkNetworkEndpoint(o[0] as api.NetworkEndpoint);
+  checkNetworkEndpoint(o[1] as api.NetworkEndpoint);
 }
 
 core.List<api.Symptom> buildUnnamed5436() {
@@ -450,8 +450,8 @@
 
 void checkUnnamed5436(core.List<api.Symptom> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSymptom(o[0]);
-  checkSymptom(o[1]);
+  checkSymptom(o[0] as api.Symptom);
+  checkSymptom(o[1] as api.Symptom);
 }
 
 core.int buildCounterNode = 0;
@@ -497,7 +497,7 @@
     unittest.expect(o.network, unittest.equals('foo'));
     checkUnnamed5435(o.networkEndpoints);
     unittest.expect(o.port, unittest.equals('foo'));
-    checkSchedulingConfig(o.schedulingConfig);
+    checkSchedulingConfig(o.schedulingConfig as api.SchedulingConfig);
     unittest.expect(o.serviceAccount, unittest.equals('foo'));
     unittest.expect(o.state, unittest.equals('foo'));
     checkUnnamed5436(o.symptoms);
@@ -584,7 +584,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5437(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5438(o.response);
@@ -809,7 +809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAcceleratorType();
       var od = api.AcceleratorType.fromJson(o.toJson());
-      checkAcceleratorType(od);
+      checkAcceleratorType(od as api.AcceleratorType);
     });
   });
 
@@ -817,7 +817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -825,7 +825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListAcceleratorTypesResponse();
       var od = api.ListAcceleratorTypesResponse.fromJson(o.toJson());
-      checkListAcceleratorTypesResponse(od);
+      checkListAcceleratorTypesResponse(od as api.ListAcceleratorTypesResponse);
     });
   });
 
@@ -833,7 +833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -841,7 +841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListNodesResponse();
       var od = api.ListNodesResponse.fromJson(o.toJson());
-      checkListNodesResponse(od);
+      checkListNodesResponse(od as api.ListNodesResponse);
     });
   });
 
@@ -849,7 +849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -857,7 +857,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListTensorFlowVersionsResponse();
       var od = api.ListTensorFlowVersionsResponse.fromJson(o.toJson());
-      checkListTensorFlowVersionsResponse(od);
+      checkListTensorFlowVersionsResponse(
+          od as api.ListTensorFlowVersionsResponse);
     });
   });
 
@@ -865,7 +866,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -873,7 +874,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNetworkEndpoint();
       var od = api.NetworkEndpoint.fromJson(o.toJson());
-      checkNetworkEndpoint(od);
+      checkNetworkEndpoint(od as api.NetworkEndpoint);
     });
   });
 
@@ -881,7 +882,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNode();
       var od = api.Node.fromJson(o.toJson());
-      checkNode(od);
+      checkNode(od as api.Node);
     });
   });
 
@@ -889,7 +890,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -897,7 +898,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -905,7 +906,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReimageNodeRequest();
       var od = api.ReimageNodeRequest.fromJson(o.toJson());
-      checkReimageNodeRequest(od);
+      checkReimageNodeRequest(od as api.ReimageNodeRequest);
     });
   });
 
@@ -913,7 +914,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchedulingConfig();
       var od = api.SchedulingConfig.fromJson(o.toJson());
-      checkSchedulingConfig(od);
+      checkSchedulingConfig(od as api.SchedulingConfig);
     });
   });
 
@@ -921,7 +922,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartNodeRequest();
       var od = api.StartNodeRequest.fromJson(o.toJson());
-      checkStartNodeRequest(od);
+      checkStartNodeRequest(od as api.StartNodeRequest);
     });
   });
 
@@ -929,7 +930,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -937,7 +938,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStopNodeRequest();
       var od = api.StopNodeRequest.fromJson(o.toJson());
-      checkStopNodeRequest(od);
+      checkStopNodeRequest(od as api.StopNodeRequest);
     });
   });
 
@@ -945,7 +946,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSymptom();
       var od = api.Symptom.fromJson(o.toJson());
-      checkSymptom(od);
+      checkSymptom(od as api.Symptom);
     });
   });
 
@@ -953,7 +954,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTensorFlowVersion();
       var od = api.TensorFlowVersion.fromJson(o.toJson());
-      checkTensorFlowVersion(od);
+      checkTensorFlowVersion(od as api.TensorFlowVersion);
     });
   });
 
@@ -1002,7 +1003,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1062,7 +1063,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
   });
@@ -1112,7 +1113,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAcceleratorType(response);
+        checkAcceleratorType(response as api.AcceleratorType);
       })));
     });
 
@@ -1176,7 +1177,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListAcceleratorTypesResponse(response);
+        checkListAcceleratorTypesResponse(
+            response as api.ListAcceleratorTypesResponse);
       })));
     });
   });
@@ -1190,8 +1192,9 @@
       var arg_nodeId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Node.fromJson(json);
-        checkNode(obj);
+        var obj =
+            api.Node.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkNode(obj as api.Node);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1233,7 +1236,7 @@
           .create(arg_request, arg_parent,
               nodeId: arg_nodeId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1281,7 +1284,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1329,7 +1332,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkNode(response);
+        checkNode(response as api.Node);
       })));
     });
 
@@ -1386,7 +1389,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListNodesResponse(response);
+        checkListNodesResponse(response as api.ListNodesResponse);
       })));
     });
 
@@ -1397,8 +1400,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReimageNodeRequest.fromJson(json);
-        checkReimageNodeRequest(obj);
+        var obj = api.ReimageNodeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReimageNodeRequest(obj as api.ReimageNodeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1438,7 +1442,7 @@
       res
           .reimage(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1449,8 +1453,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartNodeRequest.fromJson(json);
-        checkStartNodeRequest(obj);
+        var obj = api.StartNodeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartNodeRequest(obj as api.StartNodeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1490,7 +1495,7 @@
       res
           .start(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1501,8 +1506,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StopNodeRequest.fromJson(json);
-        checkStopNodeRequest(obj);
+        var obj = api.StopNodeRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStopNodeRequest(obj as api.StopNodeRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1542,7 +1548,7 @@
       res
           .stop(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -1592,7 +1598,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1640,7 +1646,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1688,7 +1694,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1748,7 +1754,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -1798,7 +1804,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTensorFlowVersion(response);
+        checkTensorFlowVersion(response as api.TensorFlowVersion);
       })));
     });
 
@@ -1862,7 +1868,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListTensorFlowVersionsResponse(response);
+        checkListTensorFlowVersionsResponse(
+            response as api.ListTensorFlowVersionsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/translate/v3_test.dart b/generated/googleapis/test/translate/v3_test.dart
index 3de1be0..c1007bc 100644
--- a/generated/googleapis/test/translate/v3_test.dart
+++ b/generated/googleapis/test/translate/v3_test.dart
@@ -84,8 +84,8 @@
 void checkUnnamed5103(
     core.Map<core.String, api.TranslateTextGlossaryConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTranslateTextGlossaryConfig(o['x']);
-  checkTranslateTextGlossaryConfig(o['y']);
+  checkTranslateTextGlossaryConfig(o['x'] as api.TranslateTextGlossaryConfig);
+  checkTranslateTextGlossaryConfig(o['y'] as api.TranslateTextGlossaryConfig);
 }
 
 core.List<api.InputConfig> buildUnnamed5104() {
@@ -97,8 +97,8 @@
 
 void checkUnnamed5104(core.List<api.InputConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkInputConfig(o[0]);
-  checkInputConfig(o[1]);
+  checkInputConfig(o[0] as api.InputConfig);
+  checkInputConfig(o[1] as api.InputConfig);
 }
 
 core.Map<core.String, core.String> buildUnnamed5105() {
@@ -164,7 +164,7 @@
     checkUnnamed5104(o.inputConfigs);
     checkUnnamed5105(o.labels);
     checkUnnamed5106(o.models);
-    checkOutputConfig(o.outputConfig);
+    checkOutputConfig(o.outputConfig as api.OutputConfig);
     unittest.expect(o.sourceLanguageCode, unittest.equals('foo'));
     checkUnnamed5107(o.targetLanguageCodes);
   }
@@ -233,8 +233,8 @@
 
 void checkUnnamed5109(core.List<api.DetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDetectedLanguage(o[0]);
-  checkDetectedLanguage(o[1]);
+  checkDetectedLanguage(o[0] as api.DetectedLanguage);
+  checkDetectedLanguage(o[1] as api.DetectedLanguage);
 }
 
 core.int buildCounterDetectLanguageResponse = 0;
@@ -352,9 +352,9 @@
   if (buildCounterGlossary < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
     unittest.expect(o.entryCount, unittest.equals(42));
-    checkGlossaryInputConfig(o.inputConfig);
-    checkLanguageCodesSet(o.languageCodesSet);
-    checkLanguageCodePair(o.languagePair);
+    checkGlossaryInputConfig(o.inputConfig as api.GlossaryInputConfig);
+    checkLanguageCodesSet(o.languageCodesSet as api.LanguageCodesSet);
+    checkLanguageCodePair(o.languagePair as api.LanguageCodePair);
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.submitTime, unittest.equals('foo'));
   }
@@ -375,7 +375,7 @@
 void checkGlossaryInputConfig(api.GlossaryInputConfig o) {
   buildCounterGlossaryInputConfig++;
   if (buildCounterGlossaryInputConfig < 3) {
-    checkGcsSource(o.gcsSource);
+    checkGcsSource(o.gcsSource as api.GcsSource);
   }
   buildCounterGlossaryInputConfig--;
 }
@@ -395,7 +395,7 @@
 void checkInputConfig(api.InputConfig o) {
   buildCounterInputConfig++;
   if (buildCounterInputConfig < 3) {
-    checkGcsSource(o.gcsSource);
+    checkGcsSource(o.gcsSource as api.GcsSource);
     unittest.expect(o.mimeType, unittest.equals('foo'));
   }
   buildCounterInputConfig--;
@@ -463,8 +463,8 @@
 
 void checkUnnamed5111(core.List<api.Glossary> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGlossary(o[0]);
-  checkGlossary(o[1]);
+  checkGlossary(o[0] as api.Glossary);
+  checkGlossary(o[1] as api.Glossary);
 }
 
 core.int buildCounterListGlossariesResponse = 0;
@@ -497,8 +497,8 @@
 
 void checkUnnamed5112(core.List<api.Location> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocation(o[0]);
-  checkLocation(o[1]);
+  checkLocation(o[0] as api.Location);
+  checkLocation(o[1] as api.Location);
 }
 
 core.int buildCounterListLocationsResponse = 0;
@@ -531,8 +531,8 @@
 
 void checkUnnamed5113(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -702,7 +702,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed5116(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed5117(o.response);
@@ -724,7 +724,7 @@
 void checkOutputConfig(api.OutputConfig o) {
   buildCounterOutputConfig++;
   if (buildCounterOutputConfig < 3) {
-    checkGcsDestination(o.gcsDestination);
+    checkGcsDestination(o.gcsDestination as api.GcsDestination);
   }
   buildCounterOutputConfig--;
 }
@@ -828,8 +828,8 @@
 
 void checkUnnamed5120(core.List<api.SupportedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSupportedLanguage(o[0]);
-  checkSupportedLanguage(o[1]);
+  checkSupportedLanguage(o[0] as api.SupportedLanguage);
+  checkSupportedLanguage(o[1] as api.SupportedLanguage);
 }
 
 core.int buildCounterSupportedLanguages = 0;
@@ -919,7 +919,8 @@
   buildCounterTranslateTextRequest++;
   if (buildCounterTranslateTextRequest < 3) {
     checkUnnamed5121(o.contents);
-    checkTranslateTextGlossaryConfig(o.glossaryConfig);
+    checkTranslateTextGlossaryConfig(
+        o.glossaryConfig as api.TranslateTextGlossaryConfig);
     checkUnnamed5122(o.labels);
     unittest.expect(o.mimeType, unittest.equals('foo'));
     unittest.expect(o.model, unittest.equals('foo'));
@@ -938,8 +939,8 @@
 
 void checkUnnamed5123(core.List<api.Translation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTranslation(o[0]);
-  checkTranslation(o[1]);
+  checkTranslation(o[0] as api.Translation);
+  checkTranslation(o[1] as api.Translation);
 }
 
 core.List<api.Translation> buildUnnamed5124() {
@@ -951,8 +952,8 @@
 
 void checkUnnamed5124(core.List<api.Translation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkTranslation(o[0]);
-  checkTranslation(o[1]);
+  checkTranslation(o[0] as api.Translation);
+  checkTranslation(o[1] as api.Translation);
 }
 
 core.int buildCounterTranslateTextResponse = 0;
@@ -994,7 +995,8 @@
   buildCounterTranslation++;
   if (buildCounterTranslation < 3) {
     unittest.expect(o.detectedLanguageCode, unittest.equals('foo'));
-    checkTranslateTextGlossaryConfig(o.glossaryConfig);
+    checkTranslateTextGlossaryConfig(
+        o.glossaryConfig as api.TranslateTextGlossaryConfig);
     unittest.expect(o.model, unittest.equals('foo'));
     unittest.expect(o.translatedText, unittest.equals('foo'));
   }
@@ -1025,7 +1027,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchTranslateTextRequest();
       var od = api.BatchTranslateTextRequest.fromJson(o.toJson());
-      checkBatchTranslateTextRequest(od);
+      checkBatchTranslateTextRequest(od as api.BatchTranslateTextRequest);
     });
   });
 
@@ -1033,7 +1035,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -1041,7 +1043,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDetectLanguageRequest();
       var od = api.DetectLanguageRequest.fromJson(o.toJson());
-      checkDetectLanguageRequest(od);
+      checkDetectLanguageRequest(od as api.DetectLanguageRequest);
     });
   });
 
@@ -1049,7 +1051,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDetectLanguageResponse();
       var od = api.DetectLanguageResponse.fromJson(o.toJson());
-      checkDetectLanguageResponse(od);
+      checkDetectLanguageResponse(od as api.DetectLanguageResponse);
     });
   });
 
@@ -1057,7 +1059,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDetectedLanguage();
       var od = api.DetectedLanguage.fromJson(o.toJson());
-      checkDetectedLanguage(od);
+      checkDetectedLanguage(od as api.DetectedLanguage);
     });
   });
 
@@ -1065,7 +1067,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1073,7 +1075,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsDestination();
       var od = api.GcsDestination.fromJson(o.toJson());
-      checkGcsDestination(od);
+      checkGcsDestination(od as api.GcsDestination);
     });
   });
 
@@ -1081,7 +1083,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsSource();
       var od = api.GcsSource.fromJson(o.toJson());
-      checkGcsSource(od);
+      checkGcsSource(od as api.GcsSource);
     });
   });
 
@@ -1089,7 +1091,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGlossary();
       var od = api.Glossary.fromJson(o.toJson());
-      checkGlossary(od);
+      checkGlossary(od as api.Glossary);
     });
   });
 
@@ -1097,7 +1099,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGlossaryInputConfig();
       var od = api.GlossaryInputConfig.fromJson(o.toJson());
-      checkGlossaryInputConfig(od);
+      checkGlossaryInputConfig(od as api.GlossaryInputConfig);
     });
   });
 
@@ -1105,7 +1107,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInputConfig();
       var od = api.InputConfig.fromJson(o.toJson());
-      checkInputConfig(od);
+      checkInputConfig(od as api.InputConfig);
     });
   });
 
@@ -1113,7 +1115,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguageCodePair();
       var od = api.LanguageCodePair.fromJson(o.toJson());
-      checkLanguageCodePair(od);
+      checkLanguageCodePair(od as api.LanguageCodePair);
     });
   });
 
@@ -1121,7 +1123,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguageCodesSet();
       var od = api.LanguageCodesSet.fromJson(o.toJson());
-      checkLanguageCodesSet(od);
+      checkLanguageCodesSet(od as api.LanguageCodesSet);
     });
   });
 
@@ -1129,7 +1131,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGlossariesResponse();
       var od = api.ListGlossariesResponse.fromJson(o.toJson());
-      checkListGlossariesResponse(od);
+      checkListGlossariesResponse(od as api.ListGlossariesResponse);
     });
   });
 
@@ -1137,7 +1139,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListLocationsResponse();
       var od = api.ListLocationsResponse.fromJson(o.toJson());
-      checkListLocationsResponse(od);
+      checkListLocationsResponse(od as api.ListLocationsResponse);
     });
   });
 
@@ -1145,7 +1147,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -1153,7 +1155,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocation();
       var od = api.Location.fromJson(o.toJson());
-      checkLocation(od);
+      checkLocation(od as api.Location);
     });
   });
 
@@ -1161,7 +1163,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -1169,7 +1171,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutputConfig();
       var od = api.OutputConfig.fromJson(o.toJson());
-      checkOutputConfig(od);
+      checkOutputConfig(od as api.OutputConfig);
     });
   });
 
@@ -1177,7 +1179,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1185,7 +1187,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSupportedLanguage();
       var od = api.SupportedLanguage.fromJson(o.toJson());
-      checkSupportedLanguage(od);
+      checkSupportedLanguage(od as api.SupportedLanguage);
     });
   });
 
@@ -1193,7 +1195,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSupportedLanguages();
       var od = api.SupportedLanguages.fromJson(o.toJson());
-      checkSupportedLanguages(od);
+      checkSupportedLanguages(od as api.SupportedLanguages);
     });
   });
 
@@ -1201,7 +1203,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTranslateTextGlossaryConfig();
       var od = api.TranslateTextGlossaryConfig.fromJson(o.toJson());
-      checkTranslateTextGlossaryConfig(od);
+      checkTranslateTextGlossaryConfig(od as api.TranslateTextGlossaryConfig);
     });
   });
 
@@ -1209,7 +1211,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTranslateTextRequest();
       var od = api.TranslateTextRequest.fromJson(o.toJson());
-      checkTranslateTextRequest(od);
+      checkTranslateTextRequest(od as api.TranslateTextRequest);
     });
   });
 
@@ -1217,7 +1219,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTranslateTextResponse();
       var od = api.TranslateTextResponse.fromJson(o.toJson());
-      checkTranslateTextResponse(od);
+      checkTranslateTextResponse(od as api.TranslateTextResponse);
     });
   });
 
@@ -1225,7 +1227,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTranslation();
       var od = api.Translation.fromJson(o.toJson());
-      checkTranslation(od);
+      checkTranslation(od as api.Translation);
     });
   });
 
@@ -1233,7 +1235,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWaitOperationRequest();
       var od = api.WaitOperationRequest.fromJson(o.toJson());
-      checkWaitOperationRequest(od);
+      checkWaitOperationRequest(od as api.WaitOperationRequest);
     });
   });
 
@@ -1245,8 +1247,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DetectLanguageRequest.fromJson(json);
-        checkDetectLanguageRequest(obj);
+        var obj = api.DetectLanguageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDetectLanguageRequest(obj as api.DetectLanguageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1286,7 +1289,7 @@
       res
           .detectLanguage(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDetectLanguageResponse(response);
+        checkDetectLanguageResponse(response as api.DetectLanguageResponse);
       })));
     });
 
@@ -1342,7 +1345,7 @@
               model: arg_model,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSupportedLanguages(response);
+        checkSupportedLanguages(response as api.SupportedLanguages);
       })));
     });
 
@@ -1353,8 +1356,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TranslateTextRequest.fromJson(json);
-        checkTranslateTextRequest(obj);
+        var obj = api.TranslateTextRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTranslateTextRequest(obj as api.TranslateTextRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1394,7 +1398,7 @@
       res
           .translateText(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTranslateTextResponse(response);
+        checkTranslateTextResponse(response as api.TranslateTextResponse);
       })));
     });
   });
@@ -1407,8 +1411,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchTranslateTextRequest.fromJson(json);
-        checkBatchTranslateTextRequest(obj);
+        var obj = api.BatchTranslateTextRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchTranslateTextRequest(obj as api.BatchTranslateTextRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1448,7 +1453,7 @@
       res
           .batchTranslateText(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1459,8 +1464,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.DetectLanguageRequest.fromJson(json);
-        checkDetectLanguageRequest(obj);
+        var obj = api.DetectLanguageRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkDetectLanguageRequest(obj as api.DetectLanguageRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1500,7 +1506,7 @@
       res
           .detectLanguage(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkDetectLanguageResponse(response);
+        checkDetectLanguageResponse(response as api.DetectLanguageResponse);
       })));
     });
 
@@ -1548,7 +1554,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLocation(response);
+        checkLocation(response as api.Location);
       })));
     });
 
@@ -1604,7 +1610,7 @@
               model: arg_model,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSupportedLanguages(response);
+        checkSupportedLanguages(response as api.SupportedLanguages);
       })));
     });
 
@@ -1664,7 +1670,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListLocationsResponse(response);
+        checkListLocationsResponse(response as api.ListLocationsResponse);
       })));
     });
 
@@ -1675,8 +1681,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TranslateTextRequest.fromJson(json);
-        checkTranslateTextRequest(obj);
+        var obj = api.TranslateTextRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkTranslateTextRequest(obj as api.TranslateTextRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1716,7 +1723,7 @@
       res
           .translateText(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTranslateTextResponse(response);
+        checkTranslateTextResponse(response as api.TranslateTextResponse);
       })));
     });
   });
@@ -1729,8 +1736,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Glossary.fromJson(json);
-        checkGlossary(obj);
+        var obj =
+            api.Glossary.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGlossary(obj as api.Glossary);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1770,7 +1778,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1818,7 +1826,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -1866,7 +1874,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGlossary(response);
+        checkGlossary(response as api.Glossary);
       })));
     });
 
@@ -1926,7 +1934,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGlossariesResponse(response);
+        checkListGlossariesResponse(response as api.ListGlossariesResponse);
       })));
     });
   });
@@ -1939,8 +1947,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1980,7 +1989,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2028,7 +2037,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2076,7 +2085,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -2136,7 +2145,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
 
@@ -2147,8 +2156,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.WaitOperationRequest.fromJson(json);
-        checkWaitOperationRequest(obj);
+        var obj = api.WaitOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkWaitOperationRequest(obj as api.WaitOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2188,7 +2198,7 @@
       res
           .wait(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/vault/v1_test.dart b/generated/googleapis/test/vault/v1_test.dart
index 7394778..0d994b9 100644
--- a/generated/googleapis/test/vault/v1_test.dart
+++ b/generated/googleapis/test/vault/v1_test.dart
@@ -121,8 +121,8 @@
 void checkAddHeldAccountResult(api.AddHeldAccountResult o) {
   buildCounterAddHeldAccountResult++;
   if (buildCounterAddHeldAccountResult < 3) {
-    checkHeldAccount(o.account);
-    checkStatus(o.status);
+    checkHeldAccount(o.account as api.HeldAccount);
+    checkStatus(o.status as api.Status);
   }
   buildCounterAddHeldAccountResult--;
 }
@@ -183,8 +183,8 @@
 
 void checkUnnamed4820(core.List<api.AddHeldAccountResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAddHeldAccountResult(o[0]);
-  checkAddHeldAccountResult(o[1]);
+  checkAddHeldAccountResult(o[0] as api.AddHeldAccountResult);
+  checkAddHeldAccountResult(o[1] as api.AddHeldAccountResult);
 }
 
 core.int buildCounterAddHeldAccountsResponse = 0;
@@ -223,7 +223,7 @@
   buildCounterAddMatterPermissionsRequest++;
   if (buildCounterAddMatterPermissionsRequest < 3) {
     unittest.expect(o.ccMe, unittest.isTrue);
-    checkMatterPermission(o.matterPermission);
+    checkMatterPermission(o.matterPermission as api.MatterPermission);
     unittest.expect(o.sendEmails, unittest.isTrue);
   }
   buildCounterAddMatterPermissionsRequest--;
@@ -258,7 +258,7 @@
 void checkCloseMatterResponse(api.CloseMatterResponse o) {
   buildCounterCloseMatterResponse++;
   if (buildCounterCloseMatterResponse < 3) {
-    checkMatter(o.matter);
+    checkMatter(o.matter as api.Matter);
   }
   buildCounterCloseMatterResponse--;
 }
@@ -297,8 +297,8 @@
 
 void checkUnnamed4821(core.List<api.CloudStorageFile> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCloudStorageFile(o[0]);
-  checkCloudStorageFile(o[1]);
+  checkCloudStorageFile(o[0] as api.CloudStorageFile);
+  checkCloudStorageFile(o[1] as api.CloudStorageFile);
 }
 
 core.int buildCounterCloudStorageSink = 0;
@@ -337,10 +337,11 @@
 void checkCorpusQuery(api.CorpusQuery o) {
   buildCounterCorpusQuery++;
   if (buildCounterCorpusQuery < 3) {
-    checkHeldDriveQuery(o.driveQuery);
-    checkHeldGroupsQuery(o.groupsQuery);
-    checkHeldHangoutsChatQuery(o.hangoutsChatQuery);
-    checkHeldMailQuery(o.mailQuery);
+    checkHeldDriveQuery(o.driveQuery as api.HeldDriveQuery);
+    checkHeldGroupsQuery(o.groupsQuery as api.HeldGroupsQuery);
+    checkHeldHangoutsChatQuery(
+        o.hangoutsChatQuery as api.HeldHangoutsChatQuery);
+    checkHeldMailQuery(o.mailQuery as api.HeldMailQuery);
   }
   buildCounterCorpusQuery--;
 }
@@ -425,15 +426,15 @@
 void checkExport(api.Export o) {
   buildCounterExport++;
   if (buildCounterExport < 3) {
-    checkCloudStorageSink(o.cloudStorageSink);
+    checkCloudStorageSink(o.cloudStorageSink as api.CloudStorageSink);
     unittest.expect(o.createTime, unittest.equals('foo'));
-    checkExportOptions(o.exportOptions);
+    checkExportOptions(o.exportOptions as api.ExportOptions);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.matterId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkQuery(o.query);
-    checkUserInfo(o.requester);
-    checkExportStats(o.stats);
+    checkQuery(o.query as api.Query);
+    checkUserInfo(o.requester as api.UserInfo);
+    checkExportStats(o.stats as api.ExportStats);
     unittest.expect(o.status, unittest.equals('foo'));
   }
   buildCounterExport--;
@@ -457,10 +458,11 @@
 void checkExportOptions(api.ExportOptions o) {
   buildCounterExportOptions++;
   if (buildCounterExportOptions < 3) {
-    checkDriveExportOptions(o.driveOptions);
-    checkGroupsExportOptions(o.groupsOptions);
-    checkHangoutsChatExportOptions(o.hangoutsChatOptions);
-    checkMailExportOptions(o.mailOptions);
+    checkDriveExportOptions(o.driveOptions as api.DriveExportOptions);
+    checkGroupsExportOptions(o.groupsOptions as api.GroupsExportOptions);
+    checkHangoutsChatExportOptions(
+        o.hangoutsChatOptions as api.HangoutsChatExportOptions);
+    checkMailExportOptions(o.mailOptions as api.MailExportOptions);
     unittest.expect(o.region, unittest.equals('foo'));
   }
   buildCounterExportOptions--;
@@ -721,8 +723,8 @@
 
 void checkUnnamed4823(core.List<api.HeldAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHeldAccount(o[0]);
-  checkHeldAccount(o[1]);
+  checkHeldAccount(o[0] as api.HeldAccount);
+  checkHeldAccount(o[1] as api.HeldAccount);
 }
 
 core.int buildCounterHold = 0;
@@ -749,8 +751,8 @@
     unittest.expect(o.corpus, unittest.equals('foo'));
     unittest.expect(o.holdId, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkHeldOrgUnit(o.orgUnit);
-    checkCorpusQuery(o.query);
+    checkHeldOrgUnit(o.orgUnit as api.HeldOrgUnit);
+    checkCorpusQuery(o.query as api.CorpusQuery);
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
   buildCounterHold--;
@@ -765,8 +767,8 @@
 
 void checkUnnamed4824(core.List<api.Export> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkExport(o[0]);
-  checkExport(o[1]);
+  checkExport(o[0] as api.Export);
+  checkExport(o[1] as api.Export);
 }
 
 core.int buildCounterListExportsResponse = 0;
@@ -799,8 +801,8 @@
 
 void checkUnnamed4825(core.List<api.HeldAccount> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHeldAccount(o[0]);
-  checkHeldAccount(o[1]);
+  checkHeldAccount(o[0] as api.HeldAccount);
+  checkHeldAccount(o[1] as api.HeldAccount);
 }
 
 core.int buildCounterListHeldAccountsResponse = 0;
@@ -831,8 +833,8 @@
 
 void checkUnnamed4826(core.List<api.Hold> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHold(o[0]);
-  checkHold(o[1]);
+  checkHold(o[0] as api.Hold);
+  checkHold(o[1] as api.Hold);
 }
 
 core.int buildCounterListHoldsResponse = 0;
@@ -865,8 +867,8 @@
 
 void checkUnnamed4827(core.List<api.Matter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMatter(o[0]);
-  checkMatter(o[1]);
+  checkMatter(o[0] as api.Matter);
+  checkMatter(o[1] as api.Matter);
 }
 
 core.int buildCounterListMattersResponse = 0;
@@ -899,8 +901,8 @@
 
 void checkUnnamed4828(core.List<api.SavedQuery> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSavedQuery(o[0]);
-  checkSavedQuery(o[1]);
+  checkSavedQuery(o[0] as api.SavedQuery);
+  checkSavedQuery(o[1] as api.SavedQuery);
 }
 
 core.int buildCounterListSavedQueriesResponse = 0;
@@ -973,8 +975,8 @@
 
 void checkUnnamed4829(core.List<api.MatterPermission> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMatterPermission(o[0]);
-  checkMatterPermission(o[1]);
+  checkMatterPermission(o[0] as api.MatterPermission);
+  checkMatterPermission(o[1] as api.MatterPermission);
 }
 
 core.int buildCounterMatter = 0;
@@ -1073,20 +1075,20 @@
 void checkQuery(api.Query o) {
   buildCounterQuery++;
   if (buildCounterQuery < 3) {
-    checkAccountInfo(o.accountInfo);
+    checkAccountInfo(o.accountInfo as api.AccountInfo);
     unittest.expect(o.corpus, unittest.equals('foo'));
     unittest.expect(o.dataScope, unittest.equals('foo'));
-    checkDriveOptions(o.driveOptions);
+    checkDriveOptions(o.driveOptions as api.DriveOptions);
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkHangoutsChatInfo(o.hangoutsChatInfo);
-    checkHangoutsChatOptions(o.hangoutsChatOptions);
-    checkMailOptions(o.mailOptions);
+    checkHangoutsChatInfo(o.hangoutsChatInfo as api.HangoutsChatInfo);
+    checkHangoutsChatOptions(o.hangoutsChatOptions as api.HangoutsChatOptions);
+    checkMailOptions(o.mailOptions as api.MailOptions);
     unittest.expect(o.method, unittest.equals('foo'));
-    checkOrgUnitInfo(o.orgUnitInfo);
+    checkOrgUnitInfo(o.orgUnitInfo as api.OrgUnitInfo);
     unittest.expect(o.searchMethod, unittest.equals('foo'));
-    checkSharedDriveInfo(o.sharedDriveInfo);
+    checkSharedDriveInfo(o.sharedDriveInfo as api.SharedDriveInfo);
     unittest.expect(o.startTime, unittest.equals('foo'));
-    checkTeamDriveInfo(o.teamDriveInfo);
+    checkTeamDriveInfo(o.teamDriveInfo as api.TeamDriveInfo);
     unittest.expect(o.terms, unittest.equals('foo'));
     unittest.expect(o.timeZone, unittest.equals('foo'));
   }
@@ -1134,8 +1136,8 @@
 
 void checkUnnamed4831(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.int buildCounterRemoveHeldAccountsResponse = 0;
@@ -1205,7 +1207,7 @@
 void checkReopenMatterResponse(api.ReopenMatterResponse o) {
   buildCounterReopenMatterResponse++;
   if (buildCounterReopenMatterResponse < 3) {
-    checkMatter(o.matter);
+    checkMatter(o.matter as api.Matter);
   }
   buildCounterReopenMatterResponse--;
 }
@@ -1231,7 +1233,7 @@
     unittest.expect(o.createTime, unittest.equals('foo'));
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.matterId, unittest.equals('foo'));
-    checkQuery(o.query);
+    checkQuery(o.query as api.Query);
     unittest.expect(o.savedQueryId, unittest.equals('foo'));
   }
   buildCounterSavedQuery--;
@@ -1407,7 +1409,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccountInfo();
       var od = api.AccountInfo.fromJson(o.toJson());
-      checkAccountInfo(od);
+      checkAccountInfo(od as api.AccountInfo);
     });
   });
 
@@ -1415,7 +1417,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddHeldAccountResult();
       var od = api.AddHeldAccountResult.fromJson(o.toJson());
-      checkAddHeldAccountResult(od);
+      checkAddHeldAccountResult(od as api.AddHeldAccountResult);
     });
   });
 
@@ -1423,7 +1425,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddHeldAccountsRequest();
       var od = api.AddHeldAccountsRequest.fromJson(o.toJson());
-      checkAddHeldAccountsRequest(od);
+      checkAddHeldAccountsRequest(od as api.AddHeldAccountsRequest);
     });
   });
 
@@ -1431,7 +1433,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddHeldAccountsResponse();
       var od = api.AddHeldAccountsResponse.fromJson(o.toJson());
-      checkAddHeldAccountsResponse(od);
+      checkAddHeldAccountsResponse(od as api.AddHeldAccountsResponse);
     });
   });
 
@@ -1439,7 +1441,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddMatterPermissionsRequest();
       var od = api.AddMatterPermissionsRequest.fromJson(o.toJson());
-      checkAddMatterPermissionsRequest(od);
+      checkAddMatterPermissionsRequest(od as api.AddMatterPermissionsRequest);
     });
   });
 
@@ -1447,7 +1449,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloseMatterRequest();
       var od = api.CloseMatterRequest.fromJson(o.toJson());
-      checkCloseMatterRequest(od);
+      checkCloseMatterRequest(od as api.CloseMatterRequest);
     });
   });
 
@@ -1455,7 +1457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloseMatterResponse();
       var od = api.CloseMatterResponse.fromJson(o.toJson());
-      checkCloseMatterResponse(od);
+      checkCloseMatterResponse(od as api.CloseMatterResponse);
     });
   });
 
@@ -1463,7 +1465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudStorageFile();
       var od = api.CloudStorageFile.fromJson(o.toJson());
-      checkCloudStorageFile(od);
+      checkCloudStorageFile(od as api.CloudStorageFile);
     });
   });
 
@@ -1471,7 +1473,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCloudStorageSink();
       var od = api.CloudStorageSink.fromJson(o.toJson());
-      checkCloudStorageSink(od);
+      checkCloudStorageSink(od as api.CloudStorageSink);
     });
   });
 
@@ -1479,7 +1481,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCorpusQuery();
       var od = api.CorpusQuery.fromJson(o.toJson());
-      checkCorpusQuery(od);
+      checkCorpusQuery(od as api.CorpusQuery);
     });
   });
 
@@ -1487,7 +1489,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveExportOptions();
       var od = api.DriveExportOptions.fromJson(o.toJson());
-      checkDriveExportOptions(od);
+      checkDriveExportOptions(od as api.DriveExportOptions);
     });
   });
 
@@ -1495,7 +1497,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDriveOptions();
       var od = api.DriveOptions.fromJson(o.toJson());
-      checkDriveOptions(od);
+      checkDriveOptions(od as api.DriveOptions);
     });
   });
 
@@ -1503,7 +1505,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -1511,7 +1513,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExport();
       var od = api.Export.fromJson(o.toJson());
-      checkExport(od);
+      checkExport(od as api.Export);
     });
   });
 
@@ -1519,7 +1521,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportOptions();
       var od = api.ExportOptions.fromJson(o.toJson());
-      checkExportOptions(od);
+      checkExportOptions(od as api.ExportOptions);
     });
   });
 
@@ -1527,7 +1529,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildExportStats();
       var od = api.ExportStats.fromJson(o.toJson());
-      checkExportStats(od);
+      checkExportStats(od as api.ExportStats);
     });
   });
 
@@ -1535,7 +1537,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupsExportOptions();
       var od = api.GroupsExportOptions.fromJson(o.toJson());
-      checkGroupsExportOptions(od);
+      checkGroupsExportOptions(od as api.GroupsExportOptions);
     });
   });
 
@@ -1543,7 +1545,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHangoutsChatExportOptions();
       var od = api.HangoutsChatExportOptions.fromJson(o.toJson());
-      checkHangoutsChatExportOptions(od);
+      checkHangoutsChatExportOptions(od as api.HangoutsChatExportOptions);
     });
   });
 
@@ -1551,7 +1553,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHangoutsChatInfo();
       var od = api.HangoutsChatInfo.fromJson(o.toJson());
-      checkHangoutsChatInfo(od);
+      checkHangoutsChatInfo(od as api.HangoutsChatInfo);
     });
   });
 
@@ -1559,7 +1561,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHangoutsChatOptions();
       var od = api.HangoutsChatOptions.fromJson(o.toJson());
-      checkHangoutsChatOptions(od);
+      checkHangoutsChatOptions(od as api.HangoutsChatOptions);
     });
   });
 
@@ -1567,7 +1569,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeldAccount();
       var od = api.HeldAccount.fromJson(o.toJson());
-      checkHeldAccount(od);
+      checkHeldAccount(od as api.HeldAccount);
     });
   });
 
@@ -1575,7 +1577,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeldDriveQuery();
       var od = api.HeldDriveQuery.fromJson(o.toJson());
-      checkHeldDriveQuery(od);
+      checkHeldDriveQuery(od as api.HeldDriveQuery);
     });
   });
 
@@ -1583,7 +1585,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeldGroupsQuery();
       var od = api.HeldGroupsQuery.fromJson(o.toJson());
-      checkHeldGroupsQuery(od);
+      checkHeldGroupsQuery(od as api.HeldGroupsQuery);
     });
   });
 
@@ -1591,7 +1593,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeldHangoutsChatQuery();
       var od = api.HeldHangoutsChatQuery.fromJson(o.toJson());
-      checkHeldHangoutsChatQuery(od);
+      checkHeldHangoutsChatQuery(od as api.HeldHangoutsChatQuery);
     });
   });
 
@@ -1599,7 +1601,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeldMailQuery();
       var od = api.HeldMailQuery.fromJson(o.toJson());
-      checkHeldMailQuery(od);
+      checkHeldMailQuery(od as api.HeldMailQuery);
     });
   });
 
@@ -1607,7 +1609,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeldOrgUnit();
       var od = api.HeldOrgUnit.fromJson(o.toJson());
-      checkHeldOrgUnit(od);
+      checkHeldOrgUnit(od as api.HeldOrgUnit);
     });
   });
 
@@ -1615,7 +1617,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHold();
       var od = api.Hold.fromJson(o.toJson());
-      checkHold(od);
+      checkHold(od as api.Hold);
     });
   });
 
@@ -1623,7 +1625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListExportsResponse();
       var od = api.ListExportsResponse.fromJson(o.toJson());
-      checkListExportsResponse(od);
+      checkListExportsResponse(od as api.ListExportsResponse);
     });
   });
 
@@ -1631,7 +1633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListHeldAccountsResponse();
       var od = api.ListHeldAccountsResponse.fromJson(o.toJson());
-      checkListHeldAccountsResponse(od);
+      checkListHeldAccountsResponse(od as api.ListHeldAccountsResponse);
     });
   });
 
@@ -1639,7 +1641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListHoldsResponse();
       var od = api.ListHoldsResponse.fromJson(o.toJson());
-      checkListHoldsResponse(od);
+      checkListHoldsResponse(od as api.ListHoldsResponse);
     });
   });
 
@@ -1647,7 +1649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListMattersResponse();
       var od = api.ListMattersResponse.fromJson(o.toJson());
-      checkListMattersResponse(od);
+      checkListMattersResponse(od as api.ListMattersResponse);
     });
   });
 
@@ -1655,7 +1657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListSavedQueriesResponse();
       var od = api.ListSavedQueriesResponse.fromJson(o.toJson());
-      checkListSavedQueriesResponse(od);
+      checkListSavedQueriesResponse(od as api.ListSavedQueriesResponse);
     });
   });
 
@@ -1663,7 +1665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMailExportOptions();
       var od = api.MailExportOptions.fromJson(o.toJson());
-      checkMailExportOptions(od);
+      checkMailExportOptions(od as api.MailExportOptions);
     });
   });
 
@@ -1671,7 +1673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMailOptions();
       var od = api.MailOptions.fromJson(o.toJson());
-      checkMailOptions(od);
+      checkMailOptions(od as api.MailOptions);
     });
   });
 
@@ -1679,7 +1681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMatter();
       var od = api.Matter.fromJson(o.toJson());
-      checkMatter(od);
+      checkMatter(od as api.Matter);
     });
   });
 
@@ -1687,7 +1689,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMatterPermission();
       var od = api.MatterPermission.fromJson(o.toJson());
-      checkMatterPermission(od);
+      checkMatterPermission(od as api.MatterPermission);
     });
   });
 
@@ -1695,7 +1697,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOrgUnitInfo();
       var od = api.OrgUnitInfo.fromJson(o.toJson());
-      checkOrgUnitInfo(od);
+      checkOrgUnitInfo(od as api.OrgUnitInfo);
     });
   });
 
@@ -1703,7 +1705,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQuery();
       var od = api.Query.fromJson(o.toJson());
-      checkQuery(od);
+      checkQuery(od as api.Query);
     });
   });
 
@@ -1711,7 +1713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveHeldAccountsRequest();
       var od = api.RemoveHeldAccountsRequest.fromJson(o.toJson());
-      checkRemoveHeldAccountsRequest(od);
+      checkRemoveHeldAccountsRequest(od as api.RemoveHeldAccountsRequest);
     });
   });
 
@@ -1719,7 +1721,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveHeldAccountsResponse();
       var od = api.RemoveHeldAccountsResponse.fromJson(o.toJson());
-      checkRemoveHeldAccountsResponse(od);
+      checkRemoveHeldAccountsResponse(od as api.RemoveHeldAccountsResponse);
     });
   });
 
@@ -1727,7 +1729,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveMatterPermissionsRequest();
       var od = api.RemoveMatterPermissionsRequest.fromJson(o.toJson());
-      checkRemoveMatterPermissionsRequest(od);
+      checkRemoveMatterPermissionsRequest(
+          od as api.RemoveMatterPermissionsRequest);
     });
   });
 
@@ -1735,7 +1738,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReopenMatterRequest();
       var od = api.ReopenMatterRequest.fromJson(o.toJson());
-      checkReopenMatterRequest(od);
+      checkReopenMatterRequest(od as api.ReopenMatterRequest);
     });
   });
 
@@ -1743,7 +1746,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReopenMatterResponse();
       var od = api.ReopenMatterResponse.fromJson(o.toJson());
-      checkReopenMatterResponse(od);
+      checkReopenMatterResponse(od as api.ReopenMatterResponse);
     });
   });
 
@@ -1751,7 +1754,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSavedQuery();
       var od = api.SavedQuery.fromJson(o.toJson());
-      checkSavedQuery(od);
+      checkSavedQuery(od as api.SavedQuery);
     });
   });
 
@@ -1759,7 +1762,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSharedDriveInfo();
       var od = api.SharedDriveInfo.fromJson(o.toJson());
-      checkSharedDriveInfo(od);
+      checkSharedDriveInfo(od as api.SharedDriveInfo);
     });
   });
 
@@ -1767,7 +1770,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -1775,7 +1778,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTeamDriveInfo();
       var od = api.TeamDriveInfo.fromJson(o.toJson());
-      checkTeamDriveInfo(od);
+      checkTeamDriveInfo(od as api.TeamDriveInfo);
     });
   });
 
@@ -1783,7 +1786,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUndeleteMatterRequest();
       var od = api.UndeleteMatterRequest.fromJson(o.toJson());
-      checkUndeleteMatterRequest(od);
+      checkUndeleteMatterRequest(od as api.UndeleteMatterRequest);
     });
   });
 
@@ -1791,7 +1794,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildUserInfo();
       var od = api.UserInfo.fromJson(o.toJson());
-      checkUserInfo(od);
+      checkUserInfo(od as api.UserInfo);
     });
   });
 
@@ -1803,8 +1806,10 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddMatterPermissionsRequest.fromJson(json);
-        checkAddMatterPermissionsRequest(obj);
+        var obj = api.AddMatterPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddMatterPermissionsRequest(
+            obj as api.AddMatterPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1852,7 +1857,7 @@
       res
           .addPermissions(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMatterPermission(response);
+        checkMatterPermission(response as api.MatterPermission);
       })));
     });
 
@@ -1863,8 +1868,9 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CloseMatterRequest.fromJson(json);
-        checkCloseMatterRequest(obj);
+        var obj = api.CloseMatterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCloseMatterRequest(obj as api.CloseMatterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1912,7 +1918,7 @@
       res
           .close(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCloseMatterResponse(response);
+        checkCloseMatterResponse(response as api.CloseMatterResponse);
       })));
     });
 
@@ -1922,8 +1928,9 @@
       var arg_request = buildMatter();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Matter.fromJson(json);
-        checkMatter(obj);
+        var obj =
+            api.Matter.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMatter(obj as api.Matter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1962,7 +1969,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMatter(response);
+        checkMatter(response as api.Matter);
       })));
     });
 
@@ -2012,7 +2019,7 @@
       res
           .delete(arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMatter(response);
+        checkMatter(response as api.Matter);
       })));
     });
 
@@ -2064,7 +2071,7 @@
       res
           .get(arg_matterId, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMatter(response);
+        checkMatter(response as api.Matter);
       })));
     });
 
@@ -2125,7 +2132,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListMattersResponse(response);
+        checkListMattersResponse(response as api.ListMattersResponse);
       })));
     });
 
@@ -2136,8 +2143,10 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemoveMatterPermissionsRequest.fromJson(json);
-        checkRemoveMatterPermissionsRequest(obj);
+        var obj = api.RemoveMatterPermissionsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemoveMatterPermissionsRequest(
+            obj as api.RemoveMatterPermissionsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2185,7 +2194,7 @@
       res
           .removePermissions(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2196,8 +2205,9 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReopenMatterRequest.fromJson(json);
-        checkReopenMatterRequest(obj);
+        var obj = api.ReopenMatterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReopenMatterRequest(obj as api.ReopenMatterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2245,7 +2255,7 @@
       res
           .reopen(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReopenMatterResponse(response);
+        checkReopenMatterResponse(response as api.ReopenMatterResponse);
       })));
     });
 
@@ -2256,8 +2266,9 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.UndeleteMatterRequest.fromJson(json);
-        checkUndeleteMatterRequest(obj);
+        var obj = api.UndeleteMatterRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkUndeleteMatterRequest(obj as api.UndeleteMatterRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2305,7 +2316,7 @@
       res
           .undelete(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMatter(response);
+        checkMatter(response as api.Matter);
       })));
     });
 
@@ -2316,8 +2327,9 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Matter.fromJson(json);
-        checkMatter(obj);
+        var obj =
+            api.Matter.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkMatter(obj as api.Matter);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2359,7 +2371,7 @@
       res
           .update(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMatter(response);
+        checkMatter(response as api.Matter);
       })));
     });
   });
@@ -2372,8 +2384,9 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Export.fromJson(json);
-        checkExport(obj);
+        var obj =
+            api.Export.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkExport(obj as api.Export);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2421,7 +2434,7 @@
       res
           .create(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExport(response);
+        checkExport(response as api.Export);
       })));
     });
 
@@ -2481,7 +2494,7 @@
       res
           .delete(arg_matterId, arg_exportId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2541,7 +2554,7 @@
       res
           .get(arg_matterId, arg_exportId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkExport(response);
+        checkExport(response as api.Export);
       })));
     });
 
@@ -2606,7 +2619,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListExportsResponse(response);
+        checkListExportsResponse(response as api.ListExportsResponse);
       })));
     });
   });
@@ -2620,8 +2633,9 @@
       var arg_holdId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddHeldAccountsRequest.fromJson(json);
-        checkAddHeldAccountsRequest(obj);
+        var obj = api.AddHeldAccountsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddHeldAccountsRequest(obj as api.AddHeldAccountsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2679,7 +2693,7 @@
           .addHeldAccounts(arg_request, arg_matterId, arg_holdId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAddHeldAccountsResponse(response);
+        checkAddHeldAccountsResponse(response as api.AddHeldAccountsResponse);
       })));
     });
 
@@ -2690,8 +2704,9 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Hold.fromJson(json);
-        checkHold(obj);
+        var obj =
+            api.Hold.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHold(obj as api.Hold);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -2739,7 +2754,7 @@
       res
           .create(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHold(response);
+        checkHold(response as api.Hold);
       })));
     });
 
@@ -2799,7 +2814,7 @@
       res
           .delete(arg_matterId, arg_holdId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -2861,7 +2876,7 @@
       res
           .get(arg_matterId, arg_holdId, view: arg_view, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHold(response);
+        checkHold(response as api.Hold);
       })));
     });
 
@@ -2929,7 +2944,7 @@
               view: arg_view,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListHoldsResponse(response);
+        checkListHoldsResponse(response as api.ListHoldsResponse);
       })));
     });
 
@@ -2941,8 +2956,9 @@
       var arg_holdId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemoveHeldAccountsRequest.fromJson(json);
-        checkRemoveHeldAccountsRequest(obj);
+        var obj = api.RemoveHeldAccountsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemoveHeldAccountsRequest(obj as api.RemoveHeldAccountsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3000,7 +3016,8 @@
           .removeHeldAccounts(arg_request, arg_matterId, arg_holdId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkRemoveHeldAccountsResponse(response);
+        checkRemoveHeldAccountsResponse(
+            response as api.RemoveHeldAccountsResponse);
       })));
     });
 
@@ -3012,8 +3029,9 @@
       var arg_holdId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Hold.fromJson(json);
-        checkHold(obj);
+        var obj =
+            api.Hold.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkHold(obj as api.Hold);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3064,7 +3082,7 @@
       res
           .update(arg_request, arg_matterId, arg_holdId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHold(response);
+        checkHold(response as api.Hold);
       })));
     });
   });
@@ -3078,8 +3096,9 @@
       var arg_holdId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.HeldAccount.fromJson(json);
-        checkHeldAccount(obj);
+        var obj = api.HeldAccount.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkHeldAccount(obj as api.HeldAccount);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3136,7 +3155,7 @@
       res
           .create(arg_request, arg_matterId, arg_holdId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkHeldAccount(response);
+        checkHeldAccount(response as api.HeldAccount);
       })));
     });
 
@@ -3206,7 +3225,7 @@
       res
           .delete(arg_matterId, arg_holdId, arg_accountId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3272,7 +3291,7 @@
       res
           .list(arg_matterId, arg_holdId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListHeldAccountsResponse(response);
+        checkListHeldAccountsResponse(response as api.ListHeldAccountsResponse);
       })));
     });
   });
@@ -3285,8 +3304,9 @@
       var arg_matterId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SavedQuery.fromJson(json);
-        checkSavedQuery(obj);
+        var obj = api.SavedQuery.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSavedQuery(obj as api.SavedQuery);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -3334,7 +3354,7 @@
       res
           .create(arg_request, arg_matterId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedQuery(response);
+        checkSavedQuery(response as api.SavedQuery);
       })));
     });
 
@@ -3394,7 +3414,7 @@
       res
           .delete(arg_matterId, arg_savedQueryId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -3454,7 +3474,7 @@
       res
           .get(arg_matterId, arg_savedQueryId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSavedQuery(response);
+        checkSavedQuery(response as api.SavedQuery);
       })));
     });
 
@@ -3519,7 +3539,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListSavedQueriesResponse(response);
+        checkListSavedQueriesResponse(response as api.ListSavedQueriesResponse);
       })));
     });
   });
@@ -3569,7 +3589,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
diff --git a/generated/googleapis/test/verifiedaccess/v1_test.dart b/generated/googleapis/test/verifiedaccess/v1_test.dart
index e53552b..eaeaa2c 100644
--- a/generated/googleapis/test/verifiedaccess/v1_test.dart
+++ b/generated/googleapis/test/verifiedaccess/v1_test.dart
@@ -89,8 +89,8 @@
 void checkChallenge(api.Challenge o) {
   buildCounterChallenge++;
   if (buildCounterChallenge < 3) {
-    checkSignedData(o.alternativeChallenge);
-    checkSignedData(o.challenge);
+    checkSignedData(o.alternativeChallenge as api.SignedData);
+    checkSignedData(o.challenge as api.SignedData);
   }
   buildCounterChallenge--;
 }
@@ -146,7 +146,7 @@
 void checkVerifyChallengeResponseRequest(api.VerifyChallengeResponseRequest o) {
   buildCounterVerifyChallengeResponseRequest++;
   if (buildCounterVerifyChallengeResponseRequest < 3) {
-    checkSignedData(o.challengeResponse);
+    checkSignedData(o.challengeResponse as api.SignedData);
     unittest.expect(o.expectedIdentity, unittest.equals('foo'));
   }
   buildCounterVerifyChallengeResponseRequest--;
@@ -182,7 +182,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChallenge();
       var od = api.Challenge.fromJson(o.toJson());
-      checkChallenge(od);
+      checkChallenge(od as api.Challenge);
     });
   });
 
@@ -190,7 +190,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -198,7 +198,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSignedData();
       var od = api.SignedData.fromJson(o.toJson());
-      checkSignedData(od);
+      checkSignedData(od as api.SignedData);
     });
   });
 
@@ -206,7 +206,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerifyChallengeResponseRequest();
       var od = api.VerifyChallengeResponseRequest.fromJson(o.toJson());
-      checkVerifyChallengeResponseRequest(od);
+      checkVerifyChallengeResponseRequest(
+          od as api.VerifyChallengeResponseRequest);
     });
   });
 
@@ -214,7 +215,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVerifyChallengeResponseResult();
       var od = api.VerifyChallengeResponseResult.fromJson(o.toJson());
-      checkVerifyChallengeResponseResult(od);
+      checkVerifyChallengeResponseResult(
+          od as api.VerifyChallengeResponseResult);
     });
   });
 
@@ -225,8 +227,9 @@
       var arg_request = buildEmpty();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Empty.fromJson(json);
-        checkEmpty(obj);
+        var obj =
+            api.Empty.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkEmpty(obj as api.Empty);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -265,7 +268,7 @@
       res
           .create(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChallenge(response);
+        checkChallenge(response as api.Challenge);
       })));
     });
 
@@ -275,8 +278,10 @@
       var arg_request = buildVerifyChallengeResponseRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.VerifyChallengeResponseRequest.fromJson(json);
-        checkVerifyChallengeResponseRequest(obj);
+        var obj = api.VerifyChallengeResponseRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkVerifyChallengeResponseRequest(
+            obj as api.VerifyChallengeResponseRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -315,7 +320,8 @@
       res
           .verify(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVerifyChallengeResponseResult(response);
+        checkVerifyChallengeResponseResult(
+            response as api.VerifyChallengeResponseResult);
       })));
     });
   });
diff --git a/generated/googleapis/test/videointelligence/v1_test.dart b/generated/googleapis/test/videointelligence/v1_test.dart
index 89ea078..bfd0401 100644
--- a/generated/googleapis/test/videointelligence/v1_test.dart
+++ b/generated/googleapis/test/videointelligence/v1_test.dart
@@ -85,8 +85,10 @@
 void checkUnnamed249(
     core.List<api.GoogleCloudVideointelligenceV1VideoAnnotationProgress> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1VideoAnnotationProgress(o[0]);
-  checkGoogleCloudVideointelligenceV1VideoAnnotationProgress(o[1]);
+  checkGoogleCloudVideointelligenceV1VideoAnnotationProgress(
+      o[0] as api.GoogleCloudVideointelligenceV1VideoAnnotationProgress);
+  checkGoogleCloudVideointelligenceV1VideoAnnotationProgress(
+      o[1] as api.GoogleCloudVideointelligenceV1VideoAnnotationProgress);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1AnnotateVideoProgress = 0;
@@ -149,7 +151,8 @@
     unittest.expect(o.inputUri, unittest.equals('foo'));
     unittest.expect(o.locationId, unittest.equals('foo'));
     unittest.expect(o.outputUri, unittest.equals('foo'));
-    checkGoogleCloudVideointelligenceV1VideoContext(o.videoContext);
+    checkGoogleCloudVideointelligenceV1VideoContext(
+        o.videoContext as api.GoogleCloudVideointelligenceV1VideoContext);
   }
   buildCounterGoogleCloudVideointelligenceV1AnnotateVideoRequest--;
 }
@@ -165,8 +168,10 @@
 void checkUnnamed251(
     core.List<api.GoogleCloudVideointelligenceV1VideoAnnotationResults> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1VideoAnnotationResults(o[0]);
-  checkGoogleCloudVideointelligenceV1VideoAnnotationResults(o[1]);
+  checkGoogleCloudVideointelligenceV1VideoAnnotationResults(
+      o[0] as api.GoogleCloudVideointelligenceV1VideoAnnotationResults);
+  checkGoogleCloudVideointelligenceV1VideoAnnotationResults(
+      o[1] as api.GoogleCloudVideointelligenceV1VideoAnnotationResults);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1AnnotateVideoResponse = 0;
@@ -235,7 +240,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1DetectedLandmark < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudVideointelligenceV1NormalizedVertex(o.point);
+    checkGoogleCloudVideointelligenceV1NormalizedVertex(
+        o.point as api.GoogleCloudVideointelligenceV1NormalizedVertex);
   }
   buildCounterGoogleCloudVideointelligenceV1DetectedLandmark--;
 }
@@ -276,8 +282,10 @@
 void checkUnnamed252(
     core.List<api.GoogleCloudVideointelligenceV1ExplicitContentFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1ExplicitContentFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1ExplicitContentFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1ExplicitContentFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1ExplicitContentFrame);
+  checkGoogleCloudVideointelligenceV1ExplicitContentFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1ExplicitContentFrame);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1ExplicitContentAnnotation =
@@ -361,8 +369,10 @@
 
 void checkUnnamed253(core.List<api.GoogleCloudVideointelligenceV1Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1Entity(o[0]);
-  checkGoogleCloudVideointelligenceV1Entity(o[1]);
+  checkGoogleCloudVideointelligenceV1Entity(
+      o[0] as api.GoogleCloudVideointelligenceV1Entity);
+  checkGoogleCloudVideointelligenceV1Entity(
+      o[1] as api.GoogleCloudVideointelligenceV1Entity);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1LabelFrame> buildUnnamed254() {
@@ -375,8 +385,10 @@
 void checkUnnamed254(
     core.List<api.GoogleCloudVideointelligenceV1LabelFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LabelFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1LabelFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1LabelFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1LabelFrame);
+  checkGoogleCloudVideointelligenceV1LabelFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1LabelFrame);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1LabelSegment> buildUnnamed255() {
@@ -389,8 +401,10 @@
 void checkUnnamed255(
     core.List<api.GoogleCloudVideointelligenceV1LabelSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LabelSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1LabelSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1LabelSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1LabelSegment);
+  checkGoogleCloudVideointelligenceV1LabelSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1LabelSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1LabelAnnotation = 0;
@@ -414,7 +428,8 @@
   buildCounterGoogleCloudVideointelligenceV1LabelAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1LabelAnnotation < 3) {
     checkUnnamed253(o.categoryEntities);
-    checkGoogleCloudVideointelligenceV1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1Entity);
     checkUnnamed254(o.frames);
     checkUnnamed255(o.segments);
     unittest.expect(o.version, unittest.equals('foo'));
@@ -492,7 +507,8 @@
   buildCounterGoogleCloudVideointelligenceV1LabelSegment++;
   if (buildCounterGoogleCloudVideointelligenceV1LabelSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1LabelSegment--;
 }
@@ -507,8 +523,10 @@
 void checkUnnamed256(
     core.List<api.GoogleCloudVideointelligenceV1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1VideoSegment);
+  checkGoogleCloudVideointelligenceV1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1Track> buildUnnamed257() {
@@ -520,8 +538,10 @@
 
 void checkUnnamed257(core.List<api.GoogleCloudVideointelligenceV1Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1Track(o[0]);
-  checkGoogleCloudVideointelligenceV1Track(o[1]);
+  checkGoogleCloudVideointelligenceV1Track(
+      o[0] as api.GoogleCloudVideointelligenceV1Track);
+  checkGoogleCloudVideointelligenceV1Track(
+      o[1] as api.GoogleCloudVideointelligenceV1Track);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1LogoRecognitionAnnotation =
@@ -543,7 +563,8 @@
     api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation o) {
   buildCounterGoogleCloudVideointelligenceV1LogoRecognitionAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1LogoRecognitionAnnotation < 3) {
-    checkGoogleCloudVideointelligenceV1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1Entity);
     checkUnnamed256(o.segments);
     checkUnnamed257(o.tracks);
   }
@@ -588,8 +609,10 @@
 void checkUnnamed258(
     core.List<api.GoogleCloudVideointelligenceV1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1NormalizedVertex(o[0]);
-  checkGoogleCloudVideointelligenceV1NormalizedVertex(o[1]);
+  checkGoogleCloudVideointelligenceV1NormalizedVertex(
+      o[0] as api.GoogleCloudVideointelligenceV1NormalizedVertex);
+  checkGoogleCloudVideointelligenceV1NormalizedVertex(
+      o[1] as api.GoogleCloudVideointelligenceV1NormalizedVertex);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1NormalizedBoundingPoly = 0;
@@ -647,8 +670,10 @@
 void checkUnnamed259(
     core.List<api.GoogleCloudVideointelligenceV1ObjectTrackingFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1ObjectTrackingFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1ObjectTrackingFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1ObjectTrackingFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1ObjectTrackingFrame);
+  checkGoogleCloudVideointelligenceV1ObjectTrackingFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1ObjectTrackingFrame);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1ObjectTrackingAnnotation = 0;
@@ -673,9 +698,11 @@
   buildCounterGoogleCloudVideointelligenceV1ObjectTrackingAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1ObjectTrackingAnnotation < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1Entity);
     checkUnnamed259(o.frames);
-    checkGoogleCloudVideointelligenceV1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1VideoSegment);
     unittest.expect(o.trackId, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -722,7 +749,8 @@
   buildCounterGoogleCloudVideointelligenceV1ObjectTrackingFrame++;
   if (buildCounterGoogleCloudVideointelligenceV1ObjectTrackingFrame < 3) {
     checkGoogleCloudVideointelligenceV1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1ObjectTrackingFrame--;
@@ -793,8 +821,10 @@
 
 void checkUnnamed261(core.List<api.GoogleCloudVideointelligenceV1WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1WordInfo(o[0]);
-  checkGoogleCloudVideointelligenceV1WordInfo(o[1]);
+  checkGoogleCloudVideointelligenceV1WordInfo(
+      o[0] as api.GoogleCloudVideointelligenceV1WordInfo);
+  checkGoogleCloudVideointelligenceV1WordInfo(
+      o[1] as api.GoogleCloudVideointelligenceV1WordInfo);
 }
 
 core.int
@@ -837,8 +867,10 @@
     core.List<api.GoogleCloudVideointelligenceV1SpeechRecognitionAlternative>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1SpeechRecognitionAlternative(o[0]);
-  checkGoogleCloudVideointelligenceV1SpeechRecognitionAlternative(o[1]);
+  checkGoogleCloudVideointelligenceV1SpeechRecognitionAlternative(
+      o[0] as api.GoogleCloudVideointelligenceV1SpeechRecognitionAlternative);
+  checkGoogleCloudVideointelligenceV1SpeechRecognitionAlternative(
+      o[1] as api.GoogleCloudVideointelligenceV1SpeechRecognitionAlternative);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1SpeechTranscription = 0;
@@ -887,8 +919,10 @@
 void checkUnnamed264(
     core.List<api.GoogleCloudVideointelligenceV1SpeechContext> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1SpeechContext(o[0]);
-  checkGoogleCloudVideointelligenceV1SpeechContext(o[1]);
+  checkGoogleCloudVideointelligenceV1SpeechContext(
+      o[0] as api.GoogleCloudVideointelligenceV1SpeechContext);
+  checkGoogleCloudVideointelligenceV1SpeechContext(
+      o[1] as api.GoogleCloudVideointelligenceV1SpeechContext);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1SpeechTranscriptionConfig =
@@ -939,8 +973,10 @@
 void checkUnnamed265(
     core.List<api.GoogleCloudVideointelligenceV1TextSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1TextSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1TextSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1TextSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1TextSegment);
+  checkGoogleCloudVideointelligenceV1TextSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1TextSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1TextAnnotation = 0;
@@ -1023,7 +1059,8 @@
   buildCounterGoogleCloudVideointelligenceV1TextFrame++;
   if (buildCounterGoogleCloudVideointelligenceV1TextFrame < 3) {
     checkGoogleCloudVideointelligenceV1NormalizedBoundingPoly(
-        o.rotatedBoundingBox);
+        o.rotatedBoundingBox
+            as api.GoogleCloudVideointelligenceV1NormalizedBoundingPoly);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1TextFrame--;
@@ -1038,8 +1075,10 @@
 
 void checkUnnamed267(core.List<api.GoogleCloudVideointelligenceV1TextFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1TextFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1TextFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1TextFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1TextFrame);
+  checkGoogleCloudVideointelligenceV1TextFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1TextFrame);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1TextSegment = 0;
@@ -1062,7 +1101,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1TextSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed267(o.frames);
-    checkGoogleCloudVideointelligenceV1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1TextSegment--;
 }
@@ -1078,8 +1118,10 @@
 void checkUnnamed268(
     core.List<api.GoogleCloudVideointelligenceV1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1DetectedLandmark>
@@ -1093,8 +1135,10 @@
 void checkUnnamed269(
     core.List<api.GoogleCloudVideointelligenceV1DetectedLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1DetectedLandmark(o[0]);
-  checkGoogleCloudVideointelligenceV1DetectedLandmark(o[1]);
+  checkGoogleCloudVideointelligenceV1DetectedLandmark(
+      o[0] as api.GoogleCloudVideointelligenceV1DetectedLandmark);
+  checkGoogleCloudVideointelligenceV1DetectedLandmark(
+      o[1] as api.GoogleCloudVideointelligenceV1DetectedLandmark);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1TimestampedObject = 0;
@@ -1120,7 +1164,8 @@
     checkUnnamed268(o.attributes);
     checkUnnamed269(o.landmarks);
     checkGoogleCloudVideointelligenceV1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1TimestampedObject--;
@@ -1137,8 +1182,10 @@
 void checkUnnamed270(
     core.List<api.GoogleCloudVideointelligenceV1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1TimestampedObject>
@@ -1152,8 +1199,10 @@
 void checkUnnamed271(
     core.List<api.GoogleCloudVideointelligenceV1TimestampedObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1TimestampedObject(o[0]);
-  checkGoogleCloudVideointelligenceV1TimestampedObject(o[1]);
+  checkGoogleCloudVideointelligenceV1TimestampedObject(
+      o[0] as api.GoogleCloudVideointelligenceV1TimestampedObject);
+  checkGoogleCloudVideointelligenceV1TimestampedObject(
+      o[1] as api.GoogleCloudVideointelligenceV1TimestampedObject);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1Track = 0;
@@ -1177,7 +1226,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1Track < 3) {
     checkUnnamed270(o.attributes);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1VideoSegment);
     checkUnnamed271(o.timestampedObjects);
   }
   buildCounterGoogleCloudVideointelligenceV1Track--;
@@ -1207,7 +1257,8 @@
     unittest.expect(o.feature, unittest.equals('foo'));
     unittest.expect(o.inputUri, unittest.equals('foo'));
     unittest.expect(o.progressPercent, unittest.equals(42));
-    checkGoogleCloudVideointelligenceV1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1VideoSegment);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -1224,8 +1275,10 @@
 void checkUnnamed272(
     core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation>
@@ -1239,8 +1292,10 @@
 void checkUnnamed273(
     core.List<api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LogoRecognitionAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1LogoRecognitionAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1LogoRecognitionAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation);
+  checkGoogleCloudVideointelligenceV1LogoRecognitionAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation>
@@ -1254,8 +1309,10 @@
 void checkUnnamed274(
     core.List<api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1ObjectTrackingAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1ObjectTrackingAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1ObjectTrackingAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation);
+  checkGoogleCloudVideointelligenceV1ObjectTrackingAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> buildUnnamed275() {
@@ -1268,8 +1325,10 @@
 void checkUnnamed275(
     core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> buildUnnamed276() {
@@ -1282,8 +1341,10 @@
 void checkUnnamed276(
     core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1VideoSegment> buildUnnamed277() {
@@ -1296,8 +1357,10 @@
 void checkUnnamed277(
     core.List<api.GoogleCloudVideointelligenceV1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1VideoSegment);
+  checkGoogleCloudVideointelligenceV1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> buildUnnamed278() {
@@ -1310,8 +1373,10 @@
 void checkUnnamed278(
     core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> buildUnnamed279() {
@@ -1324,8 +1389,10 @@
 void checkUnnamed279(
     core.List<api.GoogleCloudVideointelligenceV1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1SpeechTranscription>
@@ -1339,8 +1406,10 @@
 void checkUnnamed280(
     core.List<api.GoogleCloudVideointelligenceV1SpeechTranscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1SpeechTranscription(o[0]);
-  checkGoogleCloudVideointelligenceV1SpeechTranscription(o[1]);
+  checkGoogleCloudVideointelligenceV1SpeechTranscription(
+      o[0] as api.GoogleCloudVideointelligenceV1SpeechTranscription);
+  checkGoogleCloudVideointelligenceV1SpeechTranscription(
+      o[1] as api.GoogleCloudVideointelligenceV1SpeechTranscription);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1TextAnnotation> buildUnnamed281() {
@@ -1353,8 +1422,10 @@
 void checkUnnamed281(
     core.List<api.GoogleCloudVideointelligenceV1TextAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1TextAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1TextAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1TextAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1TextAnnotation);
+  checkGoogleCloudVideointelligenceV1TextAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1TextAnnotation);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1VideoAnnotationResults = 0;
@@ -1387,14 +1458,16 @@
     api.GoogleCloudVideointelligenceV1VideoAnnotationResults o) {
   buildCounterGoogleCloudVideointelligenceV1VideoAnnotationResults++;
   if (buildCounterGoogleCloudVideointelligenceV1VideoAnnotationResults < 3) {
-    checkGoogleRpcStatus(o.error);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
     checkGoogleCloudVideointelligenceV1ExplicitContentAnnotation(
-        o.explicitAnnotation);
+        o.explicitAnnotation
+            as api.GoogleCloudVideointelligenceV1ExplicitContentAnnotation);
     checkUnnamed272(o.frameLabelAnnotations);
     unittest.expect(o.inputUri, unittest.equals('foo'));
     checkUnnamed273(o.logoRecognitionAnnotations);
     checkUnnamed274(o.objectAnnotations);
-    checkGoogleCloudVideointelligenceV1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1VideoSegment);
     checkUnnamed275(o.segmentLabelAnnotations);
     checkUnnamed276(o.segmentPresenceLabelAnnotations);
     checkUnnamed277(o.shotAnnotations);
@@ -1416,8 +1489,10 @@
 void checkUnnamed282(
     core.List<api.GoogleCloudVideointelligenceV1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1VideoSegment);
+  checkGoogleCloudVideointelligenceV1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1VideoSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1VideoContext = 0;
@@ -1448,19 +1523,24 @@
     api.GoogleCloudVideointelligenceV1VideoContext o) {
   buildCounterGoogleCloudVideointelligenceV1VideoContext++;
   if (buildCounterGoogleCloudVideointelligenceV1VideoContext < 3) {
-    checkGoogleCloudVideointelligenceV1ExplicitContentDetectionConfig(
-        o.explicitContentDetectionConfig);
+    checkGoogleCloudVideointelligenceV1ExplicitContentDetectionConfig(o
+            .explicitContentDetectionConfig
+        as api.GoogleCloudVideointelligenceV1ExplicitContentDetectionConfig);
     checkGoogleCloudVideointelligenceV1LabelDetectionConfig(
-        o.labelDetectionConfig);
+        o.labelDetectionConfig
+            as api.GoogleCloudVideointelligenceV1LabelDetectionConfig);
     checkGoogleCloudVideointelligenceV1ObjectTrackingConfig(
-        o.objectTrackingConfig);
+        o.objectTrackingConfig
+            as api.GoogleCloudVideointelligenceV1ObjectTrackingConfig);
     checkUnnamed282(o.segments);
     checkGoogleCloudVideointelligenceV1ShotChangeDetectionConfig(
-        o.shotChangeDetectionConfig);
+        o.shotChangeDetectionConfig
+            as api.GoogleCloudVideointelligenceV1ShotChangeDetectionConfig);
     checkGoogleCloudVideointelligenceV1SpeechTranscriptionConfig(
-        o.speechTranscriptionConfig);
-    checkGoogleCloudVideointelligenceV1TextDetectionConfig(
-        o.textDetectionConfig);
+        o.speechTranscriptionConfig
+            as api.GoogleCloudVideointelligenceV1SpeechTranscriptionConfig);
+    checkGoogleCloudVideointelligenceV1TextDetectionConfig(o.textDetectionConfig
+        as api.GoogleCloudVideointelligenceV1TextDetectionConfig);
   }
   buildCounterGoogleCloudVideointelligenceV1VideoContext--;
 }
@@ -1529,8 +1609,10 @@
     core.List<api.GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress);
+  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2AnnotateVideoProgress =
@@ -1569,8 +1651,10 @@
     core.List<api.GoogleCloudVideointelligenceV1beta2VideoAnnotationResults>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationResults(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationResults(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationResults(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationResults);
+  checkGoogleCloudVideointelligenceV1beta2VideoAnnotationResults(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationResults);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2AnnotateVideoResponse =
@@ -1642,7 +1726,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1beta2DetectedLandmark < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(o.point);
+    checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(
+        o.point as api.GoogleCloudVideointelligenceV1beta2NormalizedVertex);
   }
   buildCounterGoogleCloudVideointelligenceV1beta2DetectedLandmark--;
 }
@@ -1683,8 +1768,10 @@
 void checkUnnamed285(
     core.List<api.GoogleCloudVideointelligenceV1beta2ExplicitContentFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2ExplicitContentFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2ExplicitContentFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2ExplicitContentFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2ExplicitContentFrame);
+  checkGoogleCloudVideointelligenceV1beta2ExplicitContentFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2ExplicitContentFrame);
 }
 
 core.int
@@ -1748,8 +1835,10 @@
 void checkUnnamed286(
     core.List<api.GoogleCloudVideointelligenceV1beta2Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2Entity(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2Entity(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2Entity(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2Entity);
+  checkGoogleCloudVideointelligenceV1beta2Entity(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2Entity);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2LabelFrame> buildUnnamed287() {
@@ -1762,8 +1851,10 @@
 void checkUnnamed287(
     core.List<api.GoogleCloudVideointelligenceV1beta2LabelFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LabelFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LabelFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LabelFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LabelFrame);
+  checkGoogleCloudVideointelligenceV1beta2LabelFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LabelFrame);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2LabelSegment>
@@ -1777,8 +1868,10 @@
 void checkUnnamed288(
     core.List<api.GoogleCloudVideointelligenceV1beta2LabelSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LabelSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LabelSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LabelSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LabelSegment);
+  checkGoogleCloudVideointelligenceV1beta2LabelSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LabelSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2LabelAnnotation = 0;
@@ -1802,7 +1895,8 @@
   buildCounterGoogleCloudVideointelligenceV1beta2LabelAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1beta2LabelAnnotation < 3) {
     checkUnnamed286(o.categoryEntities);
-    checkGoogleCloudVideointelligenceV1beta2Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1beta2Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1beta2Entity);
     checkUnnamed287(o.frames);
     checkUnnamed288(o.segments);
     unittest.expect(o.version, unittest.equals('foo'));
@@ -1851,7 +1945,8 @@
   buildCounterGoogleCloudVideointelligenceV1beta2LabelSegment++;
   if (buildCounterGoogleCloudVideointelligenceV1beta2LabelSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1beta2VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1beta2LabelSegment--;
 }
@@ -1867,8 +1962,10 @@
 void checkUnnamed289(
     core.List<api.GoogleCloudVideointelligenceV1beta2VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
+  checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2Track> buildUnnamed290() {
@@ -1881,8 +1978,10 @@
 void checkUnnamed290(
     core.List<api.GoogleCloudVideointelligenceV1beta2Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2Track(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2Track(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2Track(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2Track);
+  checkGoogleCloudVideointelligenceV1beta2Track(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2Track);
 }
 
 core.int
@@ -1907,7 +2006,8 @@
   buildCounterGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation <
       3) {
-    checkGoogleCloudVideointelligenceV1beta2Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1beta2Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1beta2Entity);
     checkUnnamed289(o.segments);
     checkUnnamed290(o.tracks);
   }
@@ -1955,8 +2055,10 @@
 void checkUnnamed291(
     core.List<api.GoogleCloudVideointelligenceV1beta2NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2NormalizedVertex);
+  checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2NormalizedVertex);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly =
@@ -2017,8 +2119,10 @@
 void checkUnnamed292(
     core.List<api.GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame);
+  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame);
 }
 
 core.int
@@ -2046,9 +2150,11 @@
   if (buildCounterGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation <
       3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1beta2Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1beta2Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1beta2Entity);
     checkUnnamed292(o.frames);
-    checkGoogleCloudVideointelligenceV1beta2VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
     unittest.expect(o.trackId, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -2074,7 +2180,8 @@
   buildCounterGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame++;
   if (buildCounterGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame < 3) {
     checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame--;
@@ -2090,8 +2197,10 @@
 void checkUnnamed293(
     core.List<api.GoogleCloudVideointelligenceV1beta2WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2WordInfo(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2WordInfo(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2WordInfo(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2WordInfo);
+  checkGoogleCloudVideointelligenceV1beta2WordInfo(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2WordInfo);
 }
 
 core.int
@@ -2137,8 +2246,10 @@
             api.GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative(o[0]
+      as api.GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative);
+  checkGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative(o[1]
+      as api.GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2SpeechTranscription = 0;
@@ -2175,8 +2286,10 @@
 void checkUnnamed295(
     core.List<api.GoogleCloudVideointelligenceV1beta2TextSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2TextSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2TextSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2TextSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2TextSegment);
+  checkGoogleCloudVideointelligenceV1beta2TextSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2TextSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2TextAnnotation = 0;
@@ -2223,7 +2336,8 @@
   buildCounterGoogleCloudVideointelligenceV1beta2TextFrame++;
   if (buildCounterGoogleCloudVideointelligenceV1beta2TextFrame < 3) {
     checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly(
-        o.rotatedBoundingBox);
+        o.rotatedBoundingBox
+            as api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1beta2TextFrame--;
@@ -2239,8 +2353,10 @@
 void checkUnnamed296(
     core.List<api.GoogleCloudVideointelligenceV1beta2TextFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2TextFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2TextFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2TextFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2TextFrame);
+  checkGoogleCloudVideointelligenceV1beta2TextFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2TextFrame);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2TextSegment = 0;
@@ -2263,7 +2379,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1beta2TextSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed296(o.frames);
-    checkGoogleCloudVideointelligenceV1beta2VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1beta2TextSegment--;
 }
@@ -2279,8 +2396,10 @@
 void checkUnnamed297(
     core.List<api.GoogleCloudVideointelligenceV1beta2DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2DetectedLandmark>
@@ -2294,8 +2413,10 @@
 void checkUnnamed298(
     core.List<api.GoogleCloudVideointelligenceV1beta2DetectedLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2DetectedLandmark(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2DetectedLandmark(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2DetectedLandmark(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2DetectedLandmark);
+  checkGoogleCloudVideointelligenceV1beta2DetectedLandmark(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2DetectedLandmark);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2TimestampedObject = 0;
@@ -2321,7 +2442,8 @@
     checkUnnamed297(o.attributes);
     checkUnnamed298(o.landmarks);
     checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1beta2TimestampedObject--;
@@ -2338,8 +2460,10 @@
 void checkUnnamed299(
     core.List<api.GoogleCloudVideointelligenceV1beta2DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2TimestampedObject>
@@ -2353,8 +2477,10 @@
 void checkUnnamed300(
     core.List<api.GoogleCloudVideointelligenceV1beta2TimestampedObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2TimestampedObject(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2TimestampedObject(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2TimestampedObject(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2TimestampedObject);
+  checkGoogleCloudVideointelligenceV1beta2TimestampedObject(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2TimestampedObject);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2Track = 0;
@@ -2378,7 +2504,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1beta2Track < 3) {
     checkUnnamed299(o.attributes);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1beta2VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
     checkUnnamed300(o.timestampedObjects);
   }
   buildCounterGoogleCloudVideointelligenceV1beta2Track--;
@@ -2411,7 +2538,8 @@
     unittest.expect(o.feature, unittest.equals('foo'));
     unittest.expect(o.inputUri, unittest.equals('foo'));
     unittest.expect(o.progressPercent, unittest.equals(42));
-    checkGoogleCloudVideointelligenceV1beta2VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -2429,8 +2557,10 @@
 void checkUnnamed301(
     core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation>
@@ -2445,8 +2575,10 @@
     core.List<api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation>
@@ -2461,8 +2593,10 @@
     core.List<api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation>
@@ -2476,8 +2610,10 @@
 void checkUnnamed304(
     core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation>
@@ -2491,8 +2627,10 @@
 void checkUnnamed305(
     core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2VideoSegment>
@@ -2506,8 +2644,10 @@
 void checkUnnamed306(
     core.List<api.GoogleCloudVideointelligenceV1beta2VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
+  checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation>
@@ -2521,8 +2661,10 @@
 void checkUnnamed307(
     core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation>
@@ -2536,8 +2678,10 @@
 void checkUnnamed308(
     core.List<api.GoogleCloudVideointelligenceV1beta2LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2SpeechTranscription>
@@ -2551,8 +2695,10 @@
 void checkUnnamed309(
     core.List<api.GoogleCloudVideointelligenceV1beta2SpeechTranscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2SpeechTranscription(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2SpeechTranscription(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2SpeechTranscription(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2SpeechTranscription);
+  checkGoogleCloudVideointelligenceV1beta2SpeechTranscription(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2SpeechTranscription);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1beta2TextAnnotation>
@@ -2566,8 +2712,10 @@
 void checkUnnamed310(
     core.List<api.GoogleCloudVideointelligenceV1beta2TextAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1beta2TextAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1beta2TextAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1beta2TextAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1beta2TextAnnotation);
+  checkGoogleCloudVideointelligenceV1beta2TextAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1beta2TextAnnotation);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1beta2VideoAnnotationResults =
@@ -2603,14 +2751,16 @@
   buildCounterGoogleCloudVideointelligenceV1beta2VideoAnnotationResults++;
   if (buildCounterGoogleCloudVideointelligenceV1beta2VideoAnnotationResults <
       3) {
-    checkGoogleRpcStatus(o.error);
-    checkGoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation(
-        o.explicitAnnotation);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
+    checkGoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation(o
+            .explicitAnnotation
+        as api.GoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation);
     checkUnnamed301(o.frameLabelAnnotations);
     unittest.expect(o.inputUri, unittest.equals('foo'));
     checkUnnamed302(o.logoRecognitionAnnotations);
     checkUnnamed303(o.objectAnnotations);
-    checkGoogleCloudVideointelligenceV1beta2VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
     checkUnnamed304(o.segmentLabelAnnotations);
     checkUnnamed305(o.segmentPresenceLabelAnnotations);
     checkUnnamed306(o.shotAnnotations);
@@ -2686,8 +2836,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress);
 }
 
 core.int
@@ -2726,8 +2878,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults);
 }
 
 core.int
@@ -2799,7 +2953,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1DetectedLandmark < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(o.point);
+    checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(
+        o.point as api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex);
   }
   buildCounterGoogleCloudVideointelligenceV1p1beta1DetectedLandmark--;
 }
@@ -2841,8 +2996,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame);
+  checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame);
 }
 
 core.int
@@ -2908,8 +3065,10 @@
 void checkUnnamed314(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1Entity(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1Entity(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1Entity(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1Entity);
+  checkGoogleCloudVideointelligenceV1p1beta1Entity(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1Entity);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelFrame>
@@ -2923,8 +3082,10 @@
 void checkUnnamed315(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LabelFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LabelFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1LabelFrame);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1LabelFrame);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelSegment>
@@ -2938,8 +3099,10 @@
 void checkUnnamed316(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LabelSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LabelSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1LabelSegment);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1LabelSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p1beta1LabelAnnotation = 0;
@@ -2963,7 +3126,8 @@
   buildCounterGoogleCloudVideointelligenceV1p1beta1LabelAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1LabelAnnotation < 3) {
     checkUnnamed314(o.categoryEntities);
-    checkGoogleCloudVideointelligenceV1p1beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p1beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p1beta1Entity);
     checkUnnamed315(o.frames);
     checkUnnamed316(o.segments);
     unittest.expect(o.version, unittest.equals('foo'));
@@ -3012,7 +3176,8 @@
   buildCounterGoogleCloudVideointelligenceV1p1beta1LabelSegment++;
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1LabelSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1p1beta1LabelSegment--;
 }
@@ -3028,8 +3193,10 @@
 void checkUnnamed317(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1Track> buildUnnamed318() {
@@ -3042,8 +3209,10 @@
 void checkUnnamed318(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1Track(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1Track(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1Track(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1Track);
+  checkGoogleCloudVideointelligenceV1p1beta1Track(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1Track);
 }
 
 core.int
@@ -3068,7 +3237,8 @@
   buildCounterGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation <
       3) {
-    checkGoogleCloudVideointelligenceV1p1beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p1beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p1beta1Entity);
     checkUnnamed317(o.segments);
     checkUnnamed318(o.tracks);
   }
@@ -3116,8 +3286,10 @@
 void checkUnnamed319(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex);
+  checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex);
 }
 
 core.int
@@ -3178,8 +3350,10 @@
 void checkUnnamed320(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame);
+  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame);
 }
 
 core.int
@@ -3208,9 +3382,11 @@
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation <
       3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p1beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p1beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p1beta1Entity);
     checkUnnamed320(o.frames);
-    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
     unittest.expect(o.trackId, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -3239,7 +3415,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame <
       3) {
     checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame--;
@@ -3255,8 +3432,10 @@
 void checkUnnamed321(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1WordInfo(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1WordInfo(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1WordInfo(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1WordInfo);
+  checkGoogleCloudVideointelligenceV1p1beta1WordInfo(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1WordInfo);
 }
 
 core.int
@@ -3305,8 +3484,10 @@
             api.GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative(o[0]
+      as api.GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative);
+  checkGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative(o[1]
+      as api.GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p1beta1SpeechTranscription =
@@ -3346,8 +3527,10 @@
 void checkUnnamed323(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1TextSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1TextSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1TextSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1TextSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1TextSegment);
+  checkGoogleCloudVideointelligenceV1p1beta1TextSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1TextSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p1beta1TextAnnotation = 0;
@@ -3394,7 +3577,8 @@
   buildCounterGoogleCloudVideointelligenceV1p1beta1TextFrame++;
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1TextFrame < 3) {
     checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly(
-        o.rotatedBoundingBox);
+        o.rotatedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p1beta1TextFrame--;
@@ -3411,8 +3595,10 @@
 void checkUnnamed324(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1TextFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1TextFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1TextFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1TextFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1TextFrame);
+  checkGoogleCloudVideointelligenceV1p1beta1TextFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1TextFrame);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p1beta1TextSegment = 0;
@@ -3435,7 +3621,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1TextSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed324(o.frames);
-    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1p1beta1TextSegment--;
 }
@@ -3451,8 +3638,10 @@
 void checkUnnamed325(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark>
@@ -3466,8 +3655,10 @@
 void checkUnnamed326(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1DetectedLandmark(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1DetectedLandmark(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1DetectedLandmark(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark);
+  checkGoogleCloudVideointelligenceV1p1beta1DetectedLandmark(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p1beta1TimestampedObject = 0;
@@ -3493,7 +3684,8 @@
     checkUnnamed325(o.attributes);
     checkUnnamed326(o.landmarks);
     checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p1beta1TimestampedObject--;
@@ -3510,8 +3702,10 @@
 void checkUnnamed327(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject>
@@ -3525,8 +3719,10 @@
 void checkUnnamed328(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1TimestampedObject(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1TimestampedObject(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1TimestampedObject(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject);
+  checkGoogleCloudVideointelligenceV1p1beta1TimestampedObject(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p1beta1Track = 0;
@@ -3550,7 +3746,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1Track < 3) {
     checkUnnamed327(o.attributes);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
     checkUnnamed328(o.timestampedObjects);
   }
   buildCounterGoogleCloudVideointelligenceV1p1beta1Track--;
@@ -3584,7 +3781,8 @@
     unittest.expect(o.feature, unittest.equals('foo'));
     unittest.expect(o.inputUri, unittest.equals('foo'));
     unittest.expect(o.progressPercent, unittest.equals(42));
-    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -3602,8 +3800,10 @@
 void checkUnnamed329(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation>
@@ -3620,8 +3820,10 @@
             api.GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation>
@@ -3636,8 +3838,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>
@@ -3651,8 +3855,10 @@
 void checkUnnamed332(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>
@@ -3666,8 +3872,10 @@
 void checkUnnamed333(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1VideoSegment>
@@ -3681,8 +3889,10 @@
 void checkUnnamed334(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
+  checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>
@@ -3696,8 +3906,10 @@
 void checkUnnamed335(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation>
@@ -3711,8 +3923,10 @@
 void checkUnnamed336(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription>
@@ -3726,8 +3940,10 @@
 void checkUnnamed337(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1SpeechTranscription(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1SpeechTranscription(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1SpeechTranscription(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription);
+  checkGoogleCloudVideointelligenceV1p1beta1SpeechTranscription(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation>
@@ -3741,8 +3957,10 @@
 void checkUnnamed338(
     core.List<api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p1beta1TextAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p1beta1TextAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p1beta1TextAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation);
+  checkGoogleCloudVideointelligenceV1p1beta1TextAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation);
 }
 
 core.int
@@ -3778,14 +3996,16 @@
   buildCounterGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults++;
   if (buildCounterGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults <
       3) {
-    checkGoogleRpcStatus(o.error);
-    checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation(
-        o.explicitAnnotation);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
+    checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation(o
+            .explicitAnnotation
+        as api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation);
     checkUnnamed329(o.frameLabelAnnotations);
     unittest.expect(o.inputUri, unittest.equals('foo'));
     checkUnnamed330(o.logoRecognitionAnnotations);
     checkUnnamed331(o.objectAnnotations);
-    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
     checkUnnamed332(o.segmentLabelAnnotations);
     checkUnnamed333(o.segmentPresenceLabelAnnotations);
     checkUnnamed334(o.shotAnnotations);
@@ -3861,8 +4081,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress);
 }
 
 core.int
@@ -3901,8 +4123,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults);
 }
 
 core.int
@@ -3974,7 +4198,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1DetectedLandmark < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(o.point);
+    checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(
+        o.point as api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex);
   }
   buildCounterGoogleCloudVideointelligenceV1p2beta1DetectedLandmark--;
 }
@@ -4016,8 +4241,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame);
+  checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame);
 }
 
 core.int
@@ -4083,8 +4310,10 @@
 void checkUnnamed342(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1Entity(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1Entity(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1Entity(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1Entity);
+  checkGoogleCloudVideointelligenceV1p2beta1Entity(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1Entity);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelFrame>
@@ -4098,8 +4327,10 @@
 void checkUnnamed343(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LabelFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LabelFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1LabelFrame);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1LabelFrame);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelSegment>
@@ -4113,8 +4344,10 @@
 void checkUnnamed344(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LabelSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LabelSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1LabelSegment);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1LabelSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p2beta1LabelAnnotation = 0;
@@ -4138,7 +4371,8 @@
   buildCounterGoogleCloudVideointelligenceV1p2beta1LabelAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1LabelAnnotation < 3) {
     checkUnnamed342(o.categoryEntities);
-    checkGoogleCloudVideointelligenceV1p2beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p2beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p2beta1Entity);
     checkUnnamed343(o.frames);
     checkUnnamed344(o.segments);
     unittest.expect(o.version, unittest.equals('foo'));
@@ -4187,7 +4421,8 @@
   buildCounterGoogleCloudVideointelligenceV1p2beta1LabelSegment++;
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1LabelSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1p2beta1LabelSegment--;
 }
@@ -4203,8 +4438,10 @@
 void checkUnnamed345(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1Track> buildUnnamed346() {
@@ -4217,8 +4454,10 @@
 void checkUnnamed346(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1Track(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1Track(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1Track(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1Track);
+  checkGoogleCloudVideointelligenceV1p2beta1Track(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1Track);
 }
 
 core.int
@@ -4243,7 +4482,8 @@
   buildCounterGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation <
       3) {
-    checkGoogleCloudVideointelligenceV1p2beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p2beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p2beta1Entity);
     checkUnnamed345(o.segments);
     checkUnnamed346(o.tracks);
   }
@@ -4291,8 +4531,10 @@
 void checkUnnamed347(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex);
+  checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex);
 }
 
 core.int
@@ -4353,8 +4595,10 @@
 void checkUnnamed348(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame);
+  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame);
 }
 
 core.int
@@ -4383,9 +4627,11 @@
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation <
       3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p2beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p2beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p2beta1Entity);
     checkUnnamed348(o.frames);
-    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
     unittest.expect(o.trackId, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -4414,7 +4660,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame <
       3) {
     checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame--;
@@ -4430,8 +4677,10 @@
 void checkUnnamed349(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1WordInfo(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1WordInfo(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1WordInfo(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1WordInfo);
+  checkGoogleCloudVideointelligenceV1p2beta1WordInfo(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1WordInfo);
 }
 
 core.int
@@ -4480,8 +4729,10 @@
             api.GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative(o[0]
+      as api.GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative);
+  checkGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative(o[1]
+      as api.GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p2beta1SpeechTranscription =
@@ -4521,8 +4772,10 @@
 void checkUnnamed351(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1TextSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1TextSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1TextSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1TextSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1TextSegment);
+  checkGoogleCloudVideointelligenceV1p2beta1TextSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1TextSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p2beta1TextAnnotation = 0;
@@ -4569,7 +4822,8 @@
   buildCounterGoogleCloudVideointelligenceV1p2beta1TextFrame++;
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1TextFrame < 3) {
     checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly(
-        o.rotatedBoundingBox);
+        o.rotatedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p2beta1TextFrame--;
@@ -4586,8 +4840,10 @@
 void checkUnnamed352(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1TextFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1TextFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1TextFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1TextFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1TextFrame);
+  checkGoogleCloudVideointelligenceV1p2beta1TextFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1TextFrame);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p2beta1TextSegment = 0;
@@ -4610,7 +4866,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1TextSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed352(o.frames);
-    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1p2beta1TextSegment--;
 }
@@ -4626,8 +4883,10 @@
 void checkUnnamed353(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark>
@@ -4641,8 +4900,10 @@
 void checkUnnamed354(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1DetectedLandmark(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1DetectedLandmark(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1DetectedLandmark(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark);
+  checkGoogleCloudVideointelligenceV1p2beta1DetectedLandmark(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p2beta1TimestampedObject = 0;
@@ -4668,7 +4929,8 @@
     checkUnnamed353(o.attributes);
     checkUnnamed354(o.landmarks);
     checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p2beta1TimestampedObject--;
@@ -4685,8 +4947,10 @@
 void checkUnnamed355(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject>
@@ -4700,8 +4964,10 @@
 void checkUnnamed356(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1TimestampedObject(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1TimestampedObject(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1TimestampedObject(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject);
+  checkGoogleCloudVideointelligenceV1p2beta1TimestampedObject(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p2beta1Track = 0;
@@ -4725,7 +4991,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1Track < 3) {
     checkUnnamed355(o.attributes);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
     checkUnnamed356(o.timestampedObjects);
   }
   buildCounterGoogleCloudVideointelligenceV1p2beta1Track--;
@@ -4759,7 +5026,8 @@
     unittest.expect(o.feature, unittest.equals('foo'));
     unittest.expect(o.inputUri, unittest.equals('foo'));
     unittest.expect(o.progressPercent, unittest.equals(42));
-    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -4777,8 +5045,10 @@
 void checkUnnamed357(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation>
@@ -4795,8 +5065,10 @@
             api.GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation>
@@ -4811,8 +5083,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>
@@ -4826,8 +5100,10 @@
 void checkUnnamed360(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>
@@ -4841,8 +5117,10 @@
 void checkUnnamed361(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1VideoSegment>
@@ -4856,8 +5134,10 @@
 void checkUnnamed362(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
+  checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>
@@ -4871,8 +5151,10 @@
 void checkUnnamed363(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation>
@@ -4886,8 +5168,10 @@
 void checkUnnamed364(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription>
@@ -4901,8 +5185,10 @@
 void checkUnnamed365(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1SpeechTranscription(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1SpeechTranscription(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1SpeechTranscription(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription);
+  checkGoogleCloudVideointelligenceV1p2beta1SpeechTranscription(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation>
@@ -4916,8 +5202,10 @@
 void checkUnnamed366(
     core.List<api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p2beta1TextAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p2beta1TextAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p2beta1TextAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation);
+  checkGoogleCloudVideointelligenceV1p2beta1TextAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation);
 }
 
 core.int
@@ -4953,14 +5241,16 @@
   buildCounterGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults++;
   if (buildCounterGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults <
       3) {
-    checkGoogleRpcStatus(o.error);
-    checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation(
-        o.explicitAnnotation);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
+    checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation(o
+            .explicitAnnotation
+        as api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation);
     checkUnnamed357(o.frameLabelAnnotations);
     unittest.expect(o.inputUri, unittest.equals('foo'));
     checkUnnamed358(o.logoRecognitionAnnotations);
     checkUnnamed359(o.objectAnnotations);
-    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
     checkUnnamed360(o.segmentLabelAnnotations);
     checkUnnamed361(o.segmentPresenceLabelAnnotations);
     checkUnnamed362(o.shotAnnotations);
@@ -5036,8 +5326,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress);
 }
 
 core.int
@@ -5076,8 +5368,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults);
 }
 
 core.int
@@ -5140,8 +5434,10 @@
 void checkUnnamed369(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1CelebrityTrack> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1CelebrityTrack(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1CelebrityTrack(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1CelebrityTrack(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1CelebrityTrack);
+  checkGoogleCloudVideointelligenceV1p3beta1CelebrityTrack(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1CelebrityTrack);
 }
 
 core.int
@@ -5183,8 +5479,10 @@
 void checkUnnamed370(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity);
+  checkGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p3beta1CelebrityTrack = 0;
@@ -5205,7 +5503,8 @@
   buildCounterGoogleCloudVideointelligenceV1p3beta1CelebrityTrack++;
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1CelebrityTrack < 3) {
     checkUnnamed370(o.celebrities);
-    checkGoogleCloudVideointelligenceV1p3beta1Track(o.faceTrack);
+    checkGoogleCloudVideointelligenceV1p3beta1Track(
+        o.faceTrack as api.GoogleCloudVideointelligenceV1p3beta1Track);
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1CelebrityTrack--;
 }
@@ -5255,7 +5554,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1DetectedLandmark < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(o.point);
+    checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(
+        o.point as api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex);
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1DetectedLandmark--;
 }
@@ -5297,8 +5597,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame);
+  checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame);
 }
 
 core.int
@@ -5364,8 +5666,10 @@
 void checkUnnamed372(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1Track(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1Track(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1Track(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1Track);
+  checkGoogleCloudVideointelligenceV1p3beta1Track(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1Track);
 }
 
 core.int
@@ -5407,8 +5711,10 @@
 void checkUnnamed373(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1Entity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1Entity(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1Entity(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1Entity(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1Entity);
+  checkGoogleCloudVideointelligenceV1p3beta1Entity(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1Entity);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelFrame>
@@ -5422,8 +5728,10 @@
 void checkUnnamed374(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelFrame);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelFrame);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelSegment>
@@ -5437,8 +5745,10 @@
 void checkUnnamed375(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelSegment);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p3beta1LabelAnnotation = 0;
@@ -5462,7 +5772,8 @@
   buildCounterGoogleCloudVideointelligenceV1p3beta1LabelAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1LabelAnnotation < 3) {
     checkUnnamed373(o.categoryEntities);
-    checkGoogleCloudVideointelligenceV1p3beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p3beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p3beta1Entity);
     checkUnnamed374(o.frames);
     checkUnnamed375(o.segments);
     unittest.expect(o.version, unittest.equals('foo'));
@@ -5511,7 +5822,8 @@
   buildCounterGoogleCloudVideointelligenceV1p3beta1LabelSegment++;
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1LabelSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1LabelSegment--;
 }
@@ -5527,8 +5839,10 @@
 void checkUnnamed376(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1Track> buildUnnamed377() {
@@ -5541,8 +5855,10 @@
 void checkUnnamed377(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1Track(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1Track(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1Track(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1Track);
+  checkGoogleCloudVideointelligenceV1p3beta1Track(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1Track);
 }
 
 core.int
@@ -5567,7 +5883,8 @@
   buildCounterGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation++;
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation <
       3) {
-    checkGoogleCloudVideointelligenceV1p3beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p3beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p3beta1Entity);
     checkUnnamed376(o.segments);
     checkUnnamed377(o.tracks);
   }
@@ -5615,8 +5932,10 @@
 void checkUnnamed378(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex);
+  checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex);
 }
 
 core.int
@@ -5677,8 +5996,10 @@
 void checkUnnamed379(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame);
+  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame);
 }
 
 core.int
@@ -5707,9 +6028,11 @@
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation <
       3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p3beta1Entity(o.entity);
+    checkGoogleCloudVideointelligenceV1p3beta1Entity(
+        o.entity as api.GoogleCloudVideointelligenceV1p3beta1Entity);
     checkUnnamed379(o.frames);
-    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
     unittest.expect(o.trackId, unittest.equals('foo'));
     unittest.expect(o.version, unittest.equals('foo'));
   }
@@ -5738,7 +6061,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame <
       3) {
     checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame--;
@@ -5754,8 +6078,10 @@
 void checkUnnamed380(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1Track> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1Track(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1Track(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1Track(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1Track);
+  checkGoogleCloudVideointelligenceV1p3beta1Track(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1Track);
 }
 
 core.int
@@ -5805,7 +6131,8 @@
   buildCounterGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity++;
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity <
       3) {
-    checkGoogleCloudVideointelligenceV1p3beta1Celebrity(o.celebrity);
+    checkGoogleCloudVideointelligenceV1p3beta1Celebrity(
+        o.celebrity as api.GoogleCloudVideointelligenceV1p3beta1Celebrity);
     unittest.expect(o.confidence, unittest.equals(42.0));
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity--;
@@ -5821,8 +6148,10 @@
 void checkUnnamed381(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1WordInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1WordInfo(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1WordInfo(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1WordInfo(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1WordInfo);
+  checkGoogleCloudVideointelligenceV1p3beta1WordInfo(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1WordInfo);
 }
 
 core.int
@@ -5871,8 +6200,10 @@
             api.GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative(o[0]
+      as api.GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative);
+  checkGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative(o[1]
+      as api.GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p3beta1SpeechTranscription =
@@ -5926,9 +6257,10 @@
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse <
       3) {
     checkGoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults(
-        o.annotationResults);
+        o.annotationResults as api
+            .GoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults);
     unittest.expect(o.annotationResultsUri, unittest.equals('foo'));
-    checkGoogleRpcStatus(o.error);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse--;
 }
@@ -5944,8 +6276,10 @@
 void checkUnnamed383(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation>
@@ -5960,8 +6294,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1VideoSegment>
@@ -5975,8 +6311,10 @@
 void checkUnnamed385(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
 }
 
 core.int
@@ -6005,8 +6343,9 @@
   buildCounterGoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults++;
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults <
       3) {
-    checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation(
-        o.explicitAnnotation);
+    checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation(o
+            .explicitAnnotation
+        as api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation);
     checkUnnamed383(o.labelAnnotations);
     checkUnnamed384(o.objectAnnotations);
     checkUnnamed385(o.shotAnnotations);
@@ -6025,8 +6364,10 @@
 void checkUnnamed386(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1TextSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1TextSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1TextSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1TextSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1TextSegment);
+  checkGoogleCloudVideointelligenceV1p3beta1TextSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1TextSegment);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p3beta1TextAnnotation = 0;
@@ -6073,7 +6414,8 @@
   buildCounterGoogleCloudVideointelligenceV1p3beta1TextFrame++;
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1TextFrame < 3) {
     checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly(
-        o.rotatedBoundingBox);
+        o.rotatedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1TextFrame--;
@@ -6090,8 +6432,10 @@
 void checkUnnamed387(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1TextFrame> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1TextFrame(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1TextFrame(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1TextFrame(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1TextFrame);
+  checkGoogleCloudVideointelligenceV1p3beta1TextFrame(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1TextFrame);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p3beta1TextSegment = 0;
@@ -6114,7 +6458,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1TextSegment < 3) {
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed387(o.frames);
-    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1TextSegment--;
 }
@@ -6130,8 +6475,10 @@
 void checkUnnamed388(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark>
@@ -6145,8 +6492,10 @@
 void checkUnnamed389(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1DetectedLandmark(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1DetectedLandmark(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1DetectedLandmark(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark);
+  checkGoogleCloudVideointelligenceV1p3beta1DetectedLandmark(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p3beta1TimestampedObject = 0;
@@ -6172,7 +6521,8 @@
     checkUnnamed388(o.attributes);
     checkUnnamed389(o.landmarks);
     checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox(
-        o.normalizedBoundingBox);
+        o.normalizedBoundingBox
+            as api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox);
     unittest.expect(o.timeOffset, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1TimestampedObject--;
@@ -6189,8 +6539,10 @@
 void checkUnnamed390(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute);
+  checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject>
@@ -6204,8 +6556,10 @@
 void checkUnnamed391(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1TimestampedObject(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1TimestampedObject(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1TimestampedObject(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject);
+  checkGoogleCloudVideointelligenceV1p3beta1TimestampedObject(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject);
 }
 
 core.int buildCounterGoogleCloudVideointelligenceV1p3beta1Track = 0;
@@ -6229,7 +6583,8 @@
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1Track < 3) {
     checkUnnamed390(o.attributes);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
     checkUnnamed391(o.timestampedObjects);
   }
   buildCounterGoogleCloudVideointelligenceV1p3beta1Track--;
@@ -6263,7 +6618,8 @@
     unittest.expect(o.feature, unittest.equals('foo'));
     unittest.expect(o.inputUri, unittest.equals('foo'));
     unittest.expect(o.progressPercent, unittest.equals(42));
-    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
     unittest.expect(o.startTime, unittest.equals('foo'));
     unittest.expect(o.updateTime, unittest.equals('foo'));
   }
@@ -6282,8 +6638,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>
@@ -6297,8 +6655,10 @@
 void checkUnnamed393(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation>
@@ -6315,8 +6675,10 @@
             api.GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation>
@@ -6331,8 +6693,10 @@
     core.List<api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation>
@@ -6349,8 +6713,10 @@
             api.GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation(o[0]
+      as api.GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation(o[1]
+      as api.GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>
@@ -6364,8 +6730,10 @@
 void checkUnnamed397(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>
@@ -6379,8 +6747,10 @@
 void checkUnnamed398(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1VideoSegment>
@@ -6394,8 +6764,10 @@
 void checkUnnamed399(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1VideoSegment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
+  checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>
@@ -6409,8 +6781,10 @@
 void checkUnnamed400(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation>
@@ -6424,8 +6798,10 @@
 void checkUnnamed401(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription>
@@ -6439,8 +6815,10 @@
 void checkUnnamed402(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1SpeechTranscription(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1SpeechTranscription(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1SpeechTranscription(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription);
+  checkGoogleCloudVideointelligenceV1p3beta1SpeechTranscription(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription);
 }
 
 core.List<api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation>
@@ -6454,8 +6832,10 @@
 void checkUnnamed403(
     core.List<api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVideointelligenceV1p3beta1TextAnnotation(o[0]);
-  checkGoogleCloudVideointelligenceV1p3beta1TextAnnotation(o[1]);
+  checkGoogleCloudVideointelligenceV1p3beta1TextAnnotation(
+      o[0] as api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation);
+  checkGoogleCloudVideointelligenceV1p3beta1TextAnnotation(
+      o[1] as api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation);
 }
 
 core.int
@@ -6496,17 +6876,20 @@
   if (buildCounterGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults <
       3) {
     checkGoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation(
-        o.celebrityRecognitionAnnotations);
-    checkGoogleRpcStatus(o.error);
-    checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation(
-        o.explicitAnnotation);
+        o.celebrityRecognitionAnnotations as api
+            .GoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
+    checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation(o
+            .explicitAnnotation
+        as api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation);
     checkUnnamed392(o.faceDetectionAnnotations);
     checkUnnamed393(o.frameLabelAnnotations);
     unittest.expect(o.inputUri, unittest.equals('foo'));
     checkUnnamed394(o.logoRecognitionAnnotations);
     checkUnnamed395(o.objectAnnotations);
     checkUnnamed396(o.personDetectionAnnotations);
-    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(o.segment);
+    checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+        o.segment as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
     checkUnnamed397(o.segmentLabelAnnotations);
     checkUnnamed398(o.segmentPresenceLabelAnnotations);
     checkUnnamed399(o.shotAnnotations);
@@ -6596,8 +6979,8 @@
 
 void checkUnnamed404(core.List<api.GoogleLongrunningOperation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleLongrunningOperation(o[0]);
-  checkGoogleLongrunningOperation(o[1]);
+  checkGoogleLongrunningOperation(o[0] as api.GoogleLongrunningOperation);
+  checkGoogleLongrunningOperation(o[1] as api.GoogleLongrunningOperation);
 }
 
 core.int buildCounterGoogleLongrunningListOperationsResponse = 0;
@@ -6700,7 +7083,7 @@
   buildCounterGoogleLongrunningOperation++;
   if (buildCounterGoogleLongrunningOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkGoogleRpcStatus(o.error);
+    checkGoogleRpcStatus(o.error as api.GoogleRpcStatus);
     checkUnnamed405(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed406(o.response);
@@ -6795,7 +7178,8 @@
       var o = buildGoogleCloudVideointelligenceV1AnnotateVideoProgress();
       var od = api.GoogleCloudVideointelligenceV1AnnotateVideoProgress.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1AnnotateVideoProgress(od);
+      checkGoogleCloudVideointelligenceV1AnnotateVideoProgress(
+          od as api.GoogleCloudVideointelligenceV1AnnotateVideoProgress);
     });
   });
 
@@ -6805,7 +7189,8 @@
       var o = buildGoogleCloudVideointelligenceV1AnnotateVideoRequest();
       var od = api.GoogleCloudVideointelligenceV1AnnotateVideoRequest.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1AnnotateVideoRequest(od);
+      checkGoogleCloudVideointelligenceV1AnnotateVideoRequest(
+          od as api.GoogleCloudVideointelligenceV1AnnotateVideoRequest);
     });
   });
 
@@ -6815,7 +7200,8 @@
       var o = buildGoogleCloudVideointelligenceV1AnnotateVideoResponse();
       var od = api.GoogleCloudVideointelligenceV1AnnotateVideoResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1AnnotateVideoResponse(od);
+      checkGoogleCloudVideointelligenceV1AnnotateVideoResponse(
+          od as api.GoogleCloudVideointelligenceV1AnnotateVideoResponse);
     });
   });
 
@@ -6825,7 +7211,8 @@
       var o = buildGoogleCloudVideointelligenceV1DetectedAttribute();
       var od = api.GoogleCloudVideointelligenceV1DetectedAttribute.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1DetectedAttribute(od);
+      checkGoogleCloudVideointelligenceV1DetectedAttribute(
+          od as api.GoogleCloudVideointelligenceV1DetectedAttribute);
     });
   });
 
@@ -6835,7 +7222,8 @@
       var o = buildGoogleCloudVideointelligenceV1DetectedLandmark();
       var od = api.GoogleCloudVideointelligenceV1DetectedLandmark.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1DetectedLandmark(od);
+      checkGoogleCloudVideointelligenceV1DetectedLandmark(
+          od as api.GoogleCloudVideointelligenceV1DetectedLandmark);
     });
   });
 
@@ -6843,7 +7231,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVideointelligenceV1Entity();
       var od = api.GoogleCloudVideointelligenceV1Entity.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1Entity(od);
+      checkGoogleCloudVideointelligenceV1Entity(
+          od as api.GoogleCloudVideointelligenceV1Entity);
     });
   });
 
@@ -6854,7 +7243,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1ExplicitContentAnnotation.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1ExplicitContentAnnotation(od);
+      checkGoogleCloudVideointelligenceV1ExplicitContentAnnotation(
+          od as api.GoogleCloudVideointelligenceV1ExplicitContentAnnotation);
     });
   });
 
@@ -6866,7 +7256,8 @@
           buildGoogleCloudVideointelligenceV1ExplicitContentDetectionConfig();
       var od = api.GoogleCloudVideointelligenceV1ExplicitContentDetectionConfig
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1ExplicitContentDetectionConfig(od);
+      checkGoogleCloudVideointelligenceV1ExplicitContentDetectionConfig(od
+          as api.GoogleCloudVideointelligenceV1ExplicitContentDetectionConfig);
     });
   });
 
@@ -6876,7 +7267,8 @@
       var o = buildGoogleCloudVideointelligenceV1ExplicitContentFrame();
       var od = api.GoogleCloudVideointelligenceV1ExplicitContentFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1ExplicitContentFrame(od);
+      checkGoogleCloudVideointelligenceV1ExplicitContentFrame(
+          od as api.GoogleCloudVideointelligenceV1ExplicitContentFrame);
     });
   });
 
@@ -6886,7 +7278,8 @@
       var o = buildGoogleCloudVideointelligenceV1LabelAnnotation();
       var od = api.GoogleCloudVideointelligenceV1LabelAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1LabelAnnotation(od);
+      checkGoogleCloudVideointelligenceV1LabelAnnotation(
+          od as api.GoogleCloudVideointelligenceV1LabelAnnotation);
     });
   });
 
@@ -6896,7 +7289,8 @@
       var o = buildGoogleCloudVideointelligenceV1LabelDetectionConfig();
       var od = api.GoogleCloudVideointelligenceV1LabelDetectionConfig.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1LabelDetectionConfig(od);
+      checkGoogleCloudVideointelligenceV1LabelDetectionConfig(
+          od as api.GoogleCloudVideointelligenceV1LabelDetectionConfig);
     });
   });
 
@@ -6905,7 +7299,8 @@
       var o = buildGoogleCloudVideointelligenceV1LabelFrame();
       var od =
           api.GoogleCloudVideointelligenceV1LabelFrame.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1LabelFrame(od);
+      checkGoogleCloudVideointelligenceV1LabelFrame(
+          od as api.GoogleCloudVideointelligenceV1LabelFrame);
     });
   });
 
@@ -6914,7 +7309,8 @@
       var o = buildGoogleCloudVideointelligenceV1LabelSegment();
       var od =
           api.GoogleCloudVideointelligenceV1LabelSegment.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1LabelSegment(od);
+      checkGoogleCloudVideointelligenceV1LabelSegment(
+          od as api.GoogleCloudVideointelligenceV1LabelSegment);
     });
   });
 
@@ -6925,7 +7321,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1LogoRecognitionAnnotation(od);
+      checkGoogleCloudVideointelligenceV1LogoRecognitionAnnotation(
+          od as api.GoogleCloudVideointelligenceV1LogoRecognitionAnnotation);
     });
   });
 
@@ -6935,7 +7332,8 @@
       var o = buildGoogleCloudVideointelligenceV1NormalizedBoundingBox();
       var od = api.GoogleCloudVideointelligenceV1NormalizedBoundingBox.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1NormalizedBoundingBox(od);
+      checkGoogleCloudVideointelligenceV1NormalizedBoundingBox(
+          od as api.GoogleCloudVideointelligenceV1NormalizedBoundingBox);
     });
   });
 
@@ -6946,7 +7344,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1NormalizedBoundingPoly.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1NormalizedBoundingPoly(od);
+      checkGoogleCloudVideointelligenceV1NormalizedBoundingPoly(
+          od as api.GoogleCloudVideointelligenceV1NormalizedBoundingPoly);
     });
   });
 
@@ -6956,7 +7355,8 @@
       var o = buildGoogleCloudVideointelligenceV1NormalizedVertex();
       var od = api.GoogleCloudVideointelligenceV1NormalizedVertex.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1NormalizedVertex(od);
+      checkGoogleCloudVideointelligenceV1NormalizedVertex(
+          od as api.GoogleCloudVideointelligenceV1NormalizedVertex);
     });
   });
 
@@ -6967,7 +7367,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1ObjectTrackingAnnotation(od);
+      checkGoogleCloudVideointelligenceV1ObjectTrackingAnnotation(
+          od as api.GoogleCloudVideointelligenceV1ObjectTrackingAnnotation);
     });
   });
 
@@ -6977,7 +7378,8 @@
       var o = buildGoogleCloudVideointelligenceV1ObjectTrackingConfig();
       var od = api.GoogleCloudVideointelligenceV1ObjectTrackingConfig.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1ObjectTrackingConfig(od);
+      checkGoogleCloudVideointelligenceV1ObjectTrackingConfig(
+          od as api.GoogleCloudVideointelligenceV1ObjectTrackingConfig);
     });
   });
 
@@ -6987,7 +7389,8 @@
       var o = buildGoogleCloudVideointelligenceV1ObjectTrackingFrame();
       var od = api.GoogleCloudVideointelligenceV1ObjectTrackingFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1ObjectTrackingFrame(od);
+      checkGoogleCloudVideointelligenceV1ObjectTrackingFrame(
+          od as api.GoogleCloudVideointelligenceV1ObjectTrackingFrame);
     });
   });
 
@@ -6998,7 +7401,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1ShotChangeDetectionConfig.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1ShotChangeDetectionConfig(od);
+      checkGoogleCloudVideointelligenceV1ShotChangeDetectionConfig(
+          od as api.GoogleCloudVideointelligenceV1ShotChangeDetectionConfig);
     });
   });
 
@@ -7007,7 +7411,8 @@
       var o = buildGoogleCloudVideointelligenceV1SpeechContext();
       var od =
           api.GoogleCloudVideointelligenceV1SpeechContext.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1SpeechContext(od);
+      checkGoogleCloudVideointelligenceV1SpeechContext(
+          od as api.GoogleCloudVideointelligenceV1SpeechContext);
     });
   });
 
@@ -7018,7 +7423,8 @@
       var o = buildGoogleCloudVideointelligenceV1SpeechRecognitionAlternative();
       var od = api.GoogleCloudVideointelligenceV1SpeechRecognitionAlternative
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1SpeechRecognitionAlternative(od);
+      checkGoogleCloudVideointelligenceV1SpeechRecognitionAlternative(
+          od as api.GoogleCloudVideointelligenceV1SpeechRecognitionAlternative);
     });
   });
 
@@ -7028,7 +7434,8 @@
       var o = buildGoogleCloudVideointelligenceV1SpeechTranscription();
       var od = api.GoogleCloudVideointelligenceV1SpeechTranscription.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1SpeechTranscription(od);
+      checkGoogleCloudVideointelligenceV1SpeechTranscription(
+          od as api.GoogleCloudVideointelligenceV1SpeechTranscription);
     });
   });
 
@@ -7039,7 +7446,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1SpeechTranscriptionConfig.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1SpeechTranscriptionConfig(od);
+      checkGoogleCloudVideointelligenceV1SpeechTranscriptionConfig(
+          od as api.GoogleCloudVideointelligenceV1SpeechTranscriptionConfig);
     });
   });
 
@@ -7048,7 +7456,8 @@
       var o = buildGoogleCloudVideointelligenceV1TextAnnotation();
       var od =
           api.GoogleCloudVideointelligenceV1TextAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1TextAnnotation(od);
+      checkGoogleCloudVideointelligenceV1TextAnnotation(
+          od as api.GoogleCloudVideointelligenceV1TextAnnotation);
     });
   });
 
@@ -7058,7 +7467,8 @@
       var o = buildGoogleCloudVideointelligenceV1TextDetectionConfig();
       var od = api.GoogleCloudVideointelligenceV1TextDetectionConfig.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1TextDetectionConfig(od);
+      checkGoogleCloudVideointelligenceV1TextDetectionConfig(
+          od as api.GoogleCloudVideointelligenceV1TextDetectionConfig);
     });
   });
 
@@ -7066,7 +7476,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVideointelligenceV1TextFrame();
       var od = api.GoogleCloudVideointelligenceV1TextFrame.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1TextFrame(od);
+      checkGoogleCloudVideointelligenceV1TextFrame(
+          od as api.GoogleCloudVideointelligenceV1TextFrame);
     });
   });
 
@@ -7075,7 +7486,8 @@
       var o = buildGoogleCloudVideointelligenceV1TextSegment();
       var od =
           api.GoogleCloudVideointelligenceV1TextSegment.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1TextSegment(od);
+      checkGoogleCloudVideointelligenceV1TextSegment(
+          od as api.GoogleCloudVideointelligenceV1TextSegment);
     });
   });
 
@@ -7085,7 +7497,8 @@
       var o = buildGoogleCloudVideointelligenceV1TimestampedObject();
       var od = api.GoogleCloudVideointelligenceV1TimestampedObject.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1TimestampedObject(od);
+      checkGoogleCloudVideointelligenceV1TimestampedObject(
+          od as api.GoogleCloudVideointelligenceV1TimestampedObject);
     });
   });
 
@@ -7093,7 +7506,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVideointelligenceV1Track();
       var od = api.GoogleCloudVideointelligenceV1Track.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1Track(od);
+      checkGoogleCloudVideointelligenceV1Track(
+          od as api.GoogleCloudVideointelligenceV1Track);
     });
   });
 
@@ -7104,7 +7518,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1VideoAnnotationProgress.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1VideoAnnotationProgress(od);
+      checkGoogleCloudVideointelligenceV1VideoAnnotationProgress(
+          od as api.GoogleCloudVideointelligenceV1VideoAnnotationProgress);
     });
   });
 
@@ -7115,7 +7530,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1VideoAnnotationResults.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1VideoAnnotationResults(od);
+      checkGoogleCloudVideointelligenceV1VideoAnnotationResults(
+          od as api.GoogleCloudVideointelligenceV1VideoAnnotationResults);
     });
   });
 
@@ -7124,7 +7540,8 @@
       var o = buildGoogleCloudVideointelligenceV1VideoContext();
       var od =
           api.GoogleCloudVideointelligenceV1VideoContext.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1VideoContext(od);
+      checkGoogleCloudVideointelligenceV1VideoContext(
+          od as api.GoogleCloudVideointelligenceV1VideoContext);
     });
   });
 
@@ -7133,7 +7550,8 @@
       var o = buildGoogleCloudVideointelligenceV1VideoSegment();
       var od =
           api.GoogleCloudVideointelligenceV1VideoSegment.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1VideoSegment(od);
+      checkGoogleCloudVideointelligenceV1VideoSegment(
+          od as api.GoogleCloudVideointelligenceV1VideoSegment);
     });
   });
 
@@ -7141,7 +7559,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVideointelligenceV1WordInfo();
       var od = api.GoogleCloudVideointelligenceV1WordInfo.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1WordInfo(od);
+      checkGoogleCloudVideointelligenceV1WordInfo(
+          od as api.GoogleCloudVideointelligenceV1WordInfo);
     });
   });
 
@@ -7153,7 +7572,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2AnnotateVideoProgress.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2AnnotateVideoProgress(od);
+      checkGoogleCloudVideointelligenceV1beta2AnnotateVideoProgress(
+          od as api.GoogleCloudVideointelligenceV1beta2AnnotateVideoProgress);
     });
   });
 
@@ -7165,7 +7585,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2AnnotateVideoResponse.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2AnnotateVideoResponse(od);
+      checkGoogleCloudVideointelligenceV1beta2AnnotateVideoResponse(
+          od as api.GoogleCloudVideointelligenceV1beta2AnnotateVideoResponse);
     });
   });
 
@@ -7176,7 +7597,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2DetectedAttribute.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(od);
+      checkGoogleCloudVideointelligenceV1beta2DetectedAttribute(
+          od as api.GoogleCloudVideointelligenceV1beta2DetectedAttribute);
     });
   });
 
@@ -7186,7 +7608,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2DetectedLandmark();
       var od = api.GoogleCloudVideointelligenceV1beta2DetectedLandmark.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2DetectedLandmark(od);
+      checkGoogleCloudVideointelligenceV1beta2DetectedLandmark(
+          od as api.GoogleCloudVideointelligenceV1beta2DetectedLandmark);
     });
   });
 
@@ -7195,7 +7618,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2Entity();
       var od =
           api.GoogleCloudVideointelligenceV1beta2Entity.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2Entity(od);
+      checkGoogleCloudVideointelligenceV1beta2Entity(
+          od as api.GoogleCloudVideointelligenceV1beta2Entity);
     });
   });
 
@@ -7207,7 +7631,8 @@
           buildGoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation();
       var od = api.GoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation(od);
+      checkGoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation(od
+          as api.GoogleCloudVideointelligenceV1beta2ExplicitContentAnnotation);
     });
   });
 
@@ -7218,7 +7643,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2ExplicitContentFrame.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2ExplicitContentFrame(od);
+      checkGoogleCloudVideointelligenceV1beta2ExplicitContentFrame(
+          od as api.GoogleCloudVideointelligenceV1beta2ExplicitContentFrame);
     });
   });
 
@@ -7228,7 +7654,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2LabelAnnotation();
       var od = api.GoogleCloudVideointelligenceV1beta2LabelAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(od);
+      checkGoogleCloudVideointelligenceV1beta2LabelAnnotation(
+          od as api.GoogleCloudVideointelligenceV1beta2LabelAnnotation);
     });
   });
 
@@ -7238,7 +7665,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2LabelFrame();
       var od = api.GoogleCloudVideointelligenceV1beta2LabelFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2LabelFrame(od);
+      checkGoogleCloudVideointelligenceV1beta2LabelFrame(
+          od as api.GoogleCloudVideointelligenceV1beta2LabelFrame);
     });
   });
 
@@ -7248,7 +7676,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2LabelSegment();
       var od = api.GoogleCloudVideointelligenceV1beta2LabelSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2LabelSegment(od);
+      checkGoogleCloudVideointelligenceV1beta2LabelSegment(
+          od as api.GoogleCloudVideointelligenceV1beta2LabelSegment);
     });
   });
 
@@ -7260,7 +7689,8 @@
           buildGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation();
       var od = api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation(od);
+      checkGoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation(od
+          as api.GoogleCloudVideointelligenceV1beta2LogoRecognitionAnnotation);
     });
   });
 
@@ -7272,7 +7702,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingBox(od);
+      checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingBox(
+          od as api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingBox);
     });
   });
 
@@ -7283,7 +7714,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly();
       var od = api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly(od);
+      checkGoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly(
+          od as api.GoogleCloudVideointelligenceV1beta2NormalizedBoundingPoly);
     });
   });
 
@@ -7293,7 +7725,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2NormalizedVertex();
       var od = api.GoogleCloudVideointelligenceV1beta2NormalizedVertex.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(od);
+      checkGoogleCloudVideointelligenceV1beta2NormalizedVertex(
+          od as api.GoogleCloudVideointelligenceV1beta2NormalizedVertex);
     });
   });
 
@@ -7305,7 +7738,8 @@
           buildGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation();
       var od = api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation(od);
+      checkGoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation(od
+          as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingAnnotation);
     });
   });
 
@@ -7316,7 +7750,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame(od);
+      checkGoogleCloudVideointelligenceV1beta2ObjectTrackingFrame(
+          od as api.GoogleCloudVideointelligenceV1beta2ObjectTrackingFrame);
     });
   });
 
@@ -7329,7 +7764,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative(od);
+      checkGoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative(od
+          as api
+              .GoogleCloudVideointelligenceV1beta2SpeechRecognitionAlternative);
     });
   });
 
@@ -7340,7 +7777,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2SpeechTranscription.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2SpeechTranscription(od);
+      checkGoogleCloudVideointelligenceV1beta2SpeechTranscription(
+          od as api.GoogleCloudVideointelligenceV1beta2SpeechTranscription);
     });
   });
 
@@ -7350,7 +7788,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2TextAnnotation();
       var od = api.GoogleCloudVideointelligenceV1beta2TextAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2TextAnnotation(od);
+      checkGoogleCloudVideointelligenceV1beta2TextAnnotation(
+          od as api.GoogleCloudVideointelligenceV1beta2TextAnnotation);
     });
   });
 
@@ -7359,7 +7798,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2TextFrame();
       var od =
           api.GoogleCloudVideointelligenceV1beta2TextFrame.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2TextFrame(od);
+      checkGoogleCloudVideointelligenceV1beta2TextFrame(
+          od as api.GoogleCloudVideointelligenceV1beta2TextFrame);
     });
   });
 
@@ -7369,7 +7809,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2TextSegment();
       var od = api.GoogleCloudVideointelligenceV1beta2TextSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2TextSegment(od);
+      checkGoogleCloudVideointelligenceV1beta2TextSegment(
+          od as api.GoogleCloudVideointelligenceV1beta2TextSegment);
     });
   });
 
@@ -7380,7 +7821,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1beta2TimestampedObject.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2TimestampedObject(od);
+      checkGoogleCloudVideointelligenceV1beta2TimestampedObject(
+          od as api.GoogleCloudVideointelligenceV1beta2TimestampedObject);
     });
   });
 
@@ -7389,7 +7831,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2Track();
       var od =
           api.GoogleCloudVideointelligenceV1beta2Track.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2Track(od);
+      checkGoogleCloudVideointelligenceV1beta2Track(
+          od as api.GoogleCloudVideointelligenceV1beta2Track);
     });
   });
 
@@ -7400,7 +7843,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress();
       var od = api.GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress(od);
+      checkGoogleCloudVideointelligenceV1beta2VideoAnnotationProgress(
+          od as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationProgress);
     });
   });
 
@@ -7411,7 +7855,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2VideoAnnotationResults();
       var od = api.GoogleCloudVideointelligenceV1beta2VideoAnnotationResults
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2VideoAnnotationResults(od);
+      checkGoogleCloudVideointelligenceV1beta2VideoAnnotationResults(
+          od as api.GoogleCloudVideointelligenceV1beta2VideoAnnotationResults);
     });
   });
 
@@ -7421,7 +7866,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2VideoSegment();
       var od = api.GoogleCloudVideointelligenceV1beta2VideoSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2VideoSegment(od);
+      checkGoogleCloudVideointelligenceV1beta2VideoSegment(
+          od as api.GoogleCloudVideointelligenceV1beta2VideoSegment);
     });
   });
 
@@ -7430,7 +7876,8 @@
       var o = buildGoogleCloudVideointelligenceV1beta2WordInfo();
       var od =
           api.GoogleCloudVideointelligenceV1beta2WordInfo.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1beta2WordInfo(od);
+      checkGoogleCloudVideointelligenceV1beta2WordInfo(
+          od as api.GoogleCloudVideointelligenceV1beta2WordInfo);
     });
   });
 
@@ -7441,7 +7888,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress();
       var od = api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress(od);
+      checkGoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress(
+          od as api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoProgress);
     });
   });
 
@@ -7452,7 +7900,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse();
       var od = api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse(od);
+      checkGoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse(
+          od as api.GoogleCloudVideointelligenceV1p1beta1AnnotateVideoResponse);
     });
   });
 
@@ -7463,7 +7912,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(od);
+      checkGoogleCloudVideointelligenceV1p1beta1DetectedAttribute(
+          od as api.GoogleCloudVideointelligenceV1p1beta1DetectedAttribute);
     });
   });
 
@@ -7474,7 +7924,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1DetectedLandmark(od);
+      checkGoogleCloudVideointelligenceV1p1beta1DetectedLandmark(
+          od as api.GoogleCloudVideointelligenceV1p1beta1DetectedLandmark);
     });
   });
 
@@ -7483,7 +7934,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1Entity();
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1Entity.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1Entity(od);
+      checkGoogleCloudVideointelligenceV1p1beta1Entity(
+          od as api.GoogleCloudVideointelligenceV1p1beta1Entity);
     });
   });
 
@@ -7496,7 +7948,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation(od
+          as api
+              .GoogleCloudVideointelligenceV1p1beta1ExplicitContentAnnotation);
     });
   });
 
@@ -7507,7 +7961,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame();
       var od = api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame(od);
+      checkGoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame(
+          od as api.GoogleCloudVideointelligenceV1p1beta1ExplicitContentFrame);
     });
   });
 
@@ -7518,7 +7973,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p1beta1LabelAnnotation(
+          od as api.GoogleCloudVideointelligenceV1p1beta1LabelAnnotation);
     });
   });
 
@@ -7528,7 +7984,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1LabelFrame();
       var od = api.GoogleCloudVideointelligenceV1p1beta1LabelFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1LabelFrame(od);
+      checkGoogleCloudVideointelligenceV1p1beta1LabelFrame(
+          od as api.GoogleCloudVideointelligenceV1p1beta1LabelFrame);
     });
   });
 
@@ -7538,7 +7995,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1LabelSegment();
       var od = api.GoogleCloudVideointelligenceV1p1beta1LabelSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1LabelSegment(od);
+      checkGoogleCloudVideointelligenceV1p1beta1LabelSegment(
+          od as api.GoogleCloudVideointelligenceV1p1beta1LabelSegment);
     });
   });
 
@@ -7551,7 +8009,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation(od
+          as api
+              .GoogleCloudVideointelligenceV1p1beta1LogoRecognitionAnnotation);
     });
   });
 
@@ -7562,7 +8022,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox();
       var od = api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox(od);
+      checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox(
+          od as api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingBox);
     });
   });
 
@@ -7574,7 +8035,8 @@
           buildGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly();
       var od = api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly(od);
+      checkGoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly(od
+          as api.GoogleCloudVideointelligenceV1p1beta1NormalizedBoundingPoly);
     });
   });
 
@@ -7585,7 +8047,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(od);
+      checkGoogleCloudVideointelligenceV1p1beta1NormalizedVertex(
+          od as api.GoogleCloudVideointelligenceV1p1beta1NormalizedVertex);
     });
   });
 
@@ -7597,7 +8060,8 @@
           buildGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation();
       var od = api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation(od
+          as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingAnnotation);
     });
   });
 
@@ -7609,7 +8073,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame(od);
+      checkGoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame(
+          od as api.GoogleCloudVideointelligenceV1p1beta1ObjectTrackingFrame);
     });
   });
 
@@ -7622,8 +8087,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative(
-          od);
+      checkGoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative(od
+          as api
+              .GoogleCloudVideointelligenceV1p1beta1SpeechRecognitionAlternative);
     });
   });
 
@@ -7635,7 +8101,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1SpeechTranscription(od);
+      checkGoogleCloudVideointelligenceV1p1beta1SpeechTranscription(
+          od as api.GoogleCloudVideointelligenceV1p1beta1SpeechTranscription);
     });
   });
 
@@ -7645,7 +8112,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1TextAnnotation();
       var od = api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1TextAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p1beta1TextAnnotation(
+          od as api.GoogleCloudVideointelligenceV1p1beta1TextAnnotation);
     });
   });
 
@@ -7655,7 +8123,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1TextFrame();
       var od = api.GoogleCloudVideointelligenceV1p1beta1TextFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1TextFrame(od);
+      checkGoogleCloudVideointelligenceV1p1beta1TextFrame(
+          od as api.GoogleCloudVideointelligenceV1p1beta1TextFrame);
     });
   });
 
@@ -7665,7 +8134,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1TextSegment();
       var od = api.GoogleCloudVideointelligenceV1p1beta1TextSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1TextSegment(od);
+      checkGoogleCloudVideointelligenceV1p1beta1TextSegment(
+          od as api.GoogleCloudVideointelligenceV1p1beta1TextSegment);
     });
   });
 
@@ -7676,7 +8146,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1TimestampedObject(od);
+      checkGoogleCloudVideointelligenceV1p1beta1TimestampedObject(
+          od as api.GoogleCloudVideointelligenceV1p1beta1TimestampedObject);
     });
   });
 
@@ -7685,7 +8156,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1Track();
       var od =
           api.GoogleCloudVideointelligenceV1p1beta1Track.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1Track(od);
+      checkGoogleCloudVideointelligenceV1p1beta1Track(
+          od as api.GoogleCloudVideointelligenceV1p1beta1Track);
     });
   });
 
@@ -7697,7 +8169,8 @@
           buildGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress();
       var od = api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress(od);
+      checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress(od
+          as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationProgress);
     });
   });
 
@@ -7709,7 +8182,8 @@
           buildGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults();
       var od = api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults(od);
+      checkGoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults(od
+          as api.GoogleCloudVideointelligenceV1p1beta1VideoAnnotationResults);
     });
   });
 
@@ -7719,7 +8193,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1VideoSegment();
       var od = api.GoogleCloudVideointelligenceV1p1beta1VideoSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(od);
+      checkGoogleCloudVideointelligenceV1p1beta1VideoSegment(
+          od as api.GoogleCloudVideointelligenceV1p1beta1VideoSegment);
     });
   });
 
@@ -7729,7 +8204,8 @@
       var o = buildGoogleCloudVideointelligenceV1p1beta1WordInfo();
       var od = api.GoogleCloudVideointelligenceV1p1beta1WordInfo.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p1beta1WordInfo(od);
+      checkGoogleCloudVideointelligenceV1p1beta1WordInfo(
+          od as api.GoogleCloudVideointelligenceV1p1beta1WordInfo);
     });
   });
 
@@ -7740,7 +8216,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress();
       var od = api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress(od);
+      checkGoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress(
+          od as api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoProgress);
     });
   });
 
@@ -7751,7 +8228,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse();
       var od = api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse(od);
+      checkGoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse(
+          od as api.GoogleCloudVideointelligenceV1p2beta1AnnotateVideoResponse);
     });
   });
 
@@ -7762,7 +8240,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(od);
+      checkGoogleCloudVideointelligenceV1p2beta1DetectedAttribute(
+          od as api.GoogleCloudVideointelligenceV1p2beta1DetectedAttribute);
     });
   });
 
@@ -7773,7 +8252,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1DetectedLandmark(od);
+      checkGoogleCloudVideointelligenceV1p2beta1DetectedLandmark(
+          od as api.GoogleCloudVideointelligenceV1p2beta1DetectedLandmark);
     });
   });
 
@@ -7782,7 +8262,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1Entity();
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1Entity.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1Entity(od);
+      checkGoogleCloudVideointelligenceV1p2beta1Entity(
+          od as api.GoogleCloudVideointelligenceV1p2beta1Entity);
     });
   });
 
@@ -7795,7 +8276,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation(od
+          as api
+              .GoogleCloudVideointelligenceV1p2beta1ExplicitContentAnnotation);
     });
   });
 
@@ -7806,7 +8289,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame();
       var od = api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame(od);
+      checkGoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame(
+          od as api.GoogleCloudVideointelligenceV1p2beta1ExplicitContentFrame);
     });
   });
 
@@ -7817,7 +8301,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p2beta1LabelAnnotation(
+          od as api.GoogleCloudVideointelligenceV1p2beta1LabelAnnotation);
     });
   });
 
@@ -7827,7 +8312,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1LabelFrame();
       var od = api.GoogleCloudVideointelligenceV1p2beta1LabelFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1LabelFrame(od);
+      checkGoogleCloudVideointelligenceV1p2beta1LabelFrame(
+          od as api.GoogleCloudVideointelligenceV1p2beta1LabelFrame);
     });
   });
 
@@ -7837,7 +8323,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1LabelSegment();
       var od = api.GoogleCloudVideointelligenceV1p2beta1LabelSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1LabelSegment(od);
+      checkGoogleCloudVideointelligenceV1p2beta1LabelSegment(
+          od as api.GoogleCloudVideointelligenceV1p2beta1LabelSegment);
     });
   });
 
@@ -7850,7 +8337,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation(od
+          as api
+              .GoogleCloudVideointelligenceV1p2beta1LogoRecognitionAnnotation);
     });
   });
 
@@ -7861,7 +8350,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox();
       var od = api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox(od);
+      checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox(
+          od as api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingBox);
     });
   });
 
@@ -7873,7 +8363,8 @@
           buildGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly();
       var od = api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly(od);
+      checkGoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly(od
+          as api.GoogleCloudVideointelligenceV1p2beta1NormalizedBoundingPoly);
     });
   });
 
@@ -7884,7 +8375,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(od);
+      checkGoogleCloudVideointelligenceV1p2beta1NormalizedVertex(
+          od as api.GoogleCloudVideointelligenceV1p2beta1NormalizedVertex);
     });
   });
 
@@ -7896,7 +8388,8 @@
           buildGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation();
       var od = api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation(od
+          as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingAnnotation);
     });
   });
 
@@ -7908,7 +8401,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame(od);
+      checkGoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame(
+          od as api.GoogleCloudVideointelligenceV1p2beta1ObjectTrackingFrame);
     });
   });
 
@@ -7921,8 +8415,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative(
-          od);
+      checkGoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative(od
+          as api
+              .GoogleCloudVideointelligenceV1p2beta1SpeechRecognitionAlternative);
     });
   });
 
@@ -7934,7 +8429,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1SpeechTranscription(od);
+      checkGoogleCloudVideointelligenceV1p2beta1SpeechTranscription(
+          od as api.GoogleCloudVideointelligenceV1p2beta1SpeechTranscription);
     });
   });
 
@@ -7944,7 +8440,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1TextAnnotation();
       var od = api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1TextAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p2beta1TextAnnotation(
+          od as api.GoogleCloudVideointelligenceV1p2beta1TextAnnotation);
     });
   });
 
@@ -7954,7 +8451,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1TextFrame();
       var od = api.GoogleCloudVideointelligenceV1p2beta1TextFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1TextFrame(od);
+      checkGoogleCloudVideointelligenceV1p2beta1TextFrame(
+          od as api.GoogleCloudVideointelligenceV1p2beta1TextFrame);
     });
   });
 
@@ -7964,7 +8462,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1TextSegment();
       var od = api.GoogleCloudVideointelligenceV1p2beta1TextSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1TextSegment(od);
+      checkGoogleCloudVideointelligenceV1p2beta1TextSegment(
+          od as api.GoogleCloudVideointelligenceV1p2beta1TextSegment);
     });
   });
 
@@ -7975,7 +8474,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1TimestampedObject(od);
+      checkGoogleCloudVideointelligenceV1p2beta1TimestampedObject(
+          od as api.GoogleCloudVideointelligenceV1p2beta1TimestampedObject);
     });
   });
 
@@ -7984,7 +8484,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1Track();
       var od =
           api.GoogleCloudVideointelligenceV1p2beta1Track.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1Track(od);
+      checkGoogleCloudVideointelligenceV1p2beta1Track(
+          od as api.GoogleCloudVideointelligenceV1p2beta1Track);
     });
   });
 
@@ -7996,7 +8497,8 @@
           buildGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress();
       var od = api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress(od);
+      checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress(od
+          as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationProgress);
     });
   });
 
@@ -8008,7 +8510,8 @@
           buildGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults();
       var od = api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults(od);
+      checkGoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults(od
+          as api.GoogleCloudVideointelligenceV1p2beta1VideoAnnotationResults);
     });
   });
 
@@ -8018,7 +8521,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1VideoSegment();
       var od = api.GoogleCloudVideointelligenceV1p2beta1VideoSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(od);
+      checkGoogleCloudVideointelligenceV1p2beta1VideoSegment(
+          od as api.GoogleCloudVideointelligenceV1p2beta1VideoSegment);
     });
   });
 
@@ -8028,7 +8532,8 @@
       var o = buildGoogleCloudVideointelligenceV1p2beta1WordInfo();
       var od = api.GoogleCloudVideointelligenceV1p2beta1WordInfo.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p2beta1WordInfo(od);
+      checkGoogleCloudVideointelligenceV1p2beta1WordInfo(
+          od as api.GoogleCloudVideointelligenceV1p2beta1WordInfo);
     });
   });
 
@@ -8039,7 +8544,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress();
       var od = api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress(od);
+      checkGoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress(
+          od as api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoProgress);
     });
   });
 
@@ -8050,7 +8556,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse();
       var od = api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse(od);
+      checkGoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse(
+          od as api.GoogleCloudVideointelligenceV1p3beta1AnnotateVideoResponse);
     });
   });
 
@@ -8060,7 +8567,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1Celebrity();
       var od = api.GoogleCloudVideointelligenceV1p3beta1Celebrity.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1Celebrity(od);
+      checkGoogleCloudVideointelligenceV1p3beta1Celebrity(
+          od as api.GoogleCloudVideointelligenceV1p3beta1Celebrity);
     });
   });
 
@@ -8074,7 +8582,8 @@
           api.GoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation
               .fromJson(o.toJson());
       checkGoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation(
-          od);
+          od as api
+              .GoogleCloudVideointelligenceV1p3beta1CelebrityRecognitionAnnotation);
     });
   });
 
@@ -8084,7 +8593,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1CelebrityTrack();
       var od = api.GoogleCloudVideointelligenceV1p3beta1CelebrityTrack.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1CelebrityTrack(od);
+      checkGoogleCloudVideointelligenceV1p3beta1CelebrityTrack(
+          od as api.GoogleCloudVideointelligenceV1p3beta1CelebrityTrack);
     });
   });
 
@@ -8095,7 +8605,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(od);
+      checkGoogleCloudVideointelligenceV1p3beta1DetectedAttribute(
+          od as api.GoogleCloudVideointelligenceV1p3beta1DetectedAttribute);
     });
   });
 
@@ -8106,7 +8617,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1DetectedLandmark(od);
+      checkGoogleCloudVideointelligenceV1p3beta1DetectedLandmark(
+          od as api.GoogleCloudVideointelligenceV1p3beta1DetectedLandmark);
     });
   });
 
@@ -8115,7 +8627,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1Entity();
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1Entity.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1Entity(od);
+      checkGoogleCloudVideointelligenceV1p3beta1Entity(
+          od as api.GoogleCloudVideointelligenceV1p3beta1Entity);
     });
   });
 
@@ -8128,7 +8641,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation(od
+          as api
+              .GoogleCloudVideointelligenceV1p3beta1ExplicitContentAnnotation);
     });
   });
 
@@ -8139,7 +8654,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame();
       var od = api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame(od);
+      checkGoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame(
+          od as api.GoogleCloudVideointelligenceV1p3beta1ExplicitContentFrame);
     });
   });
 
@@ -8151,7 +8667,8 @@
           buildGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation();
       var od = api.GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation(od
+          as api.GoogleCloudVideointelligenceV1p3beta1FaceDetectionAnnotation);
     });
   });
 
@@ -8162,7 +8679,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p3beta1LabelAnnotation(
+          od as api.GoogleCloudVideointelligenceV1p3beta1LabelAnnotation);
     });
   });
 
@@ -8172,7 +8690,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1LabelFrame();
       var od = api.GoogleCloudVideointelligenceV1p3beta1LabelFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1LabelFrame(od);
+      checkGoogleCloudVideointelligenceV1p3beta1LabelFrame(
+          od as api.GoogleCloudVideointelligenceV1p3beta1LabelFrame);
     });
   });
 
@@ -8182,7 +8701,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1LabelSegment();
       var od = api.GoogleCloudVideointelligenceV1p3beta1LabelSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1LabelSegment(od);
+      checkGoogleCloudVideointelligenceV1p3beta1LabelSegment(
+          od as api.GoogleCloudVideointelligenceV1p3beta1LabelSegment);
     });
   });
 
@@ -8195,7 +8715,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation(od
+          as api
+              .GoogleCloudVideointelligenceV1p3beta1LogoRecognitionAnnotation);
     });
   });
 
@@ -8206,7 +8728,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox();
       var od = api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox(od);
+      checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox(
+          od as api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingBox);
     });
   });
 
@@ -8218,7 +8741,8 @@
           buildGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly();
       var od = api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly(od);
+      checkGoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly(od
+          as api.GoogleCloudVideointelligenceV1p3beta1NormalizedBoundingPoly);
     });
   });
 
@@ -8229,7 +8753,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(od);
+      checkGoogleCloudVideointelligenceV1p3beta1NormalizedVertex(
+          od as api.GoogleCloudVideointelligenceV1p3beta1NormalizedVertex);
     });
   });
 
@@ -8241,7 +8766,8 @@
           buildGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation();
       var od = api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation(od
+          as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingAnnotation);
     });
   });
 
@@ -8253,7 +8779,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame(od);
+      checkGoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame(
+          od as api.GoogleCloudVideointelligenceV1p3beta1ObjectTrackingFrame);
     });
   });
 
@@ -8266,7 +8793,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation(od
+          as api
+              .GoogleCloudVideointelligenceV1p3beta1PersonDetectionAnnotation);
     });
   });
 
@@ -8278,7 +8807,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity(od);
+      checkGoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity(
+          od as api.GoogleCloudVideointelligenceV1p3beta1RecognizedCelebrity);
     });
   });
 
@@ -8291,8 +8821,9 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative
               .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative(
-          od);
+      checkGoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative(od
+          as api
+              .GoogleCloudVideointelligenceV1p3beta1SpeechRecognitionAlternative);
     });
   });
 
@@ -8304,7 +8835,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1SpeechTranscription(od);
+      checkGoogleCloudVideointelligenceV1p3beta1SpeechTranscription(
+          od as api.GoogleCloudVideointelligenceV1p3beta1SpeechTranscription);
     });
   });
 
@@ -8318,7 +8850,8 @@
           api.GoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse
               .fromJson(o.toJson());
       checkGoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse(
-          od);
+          od as api
+              .GoogleCloudVideointelligenceV1p3beta1StreamingAnnotateVideoResponse);
     });
   });
 
@@ -8332,7 +8865,8 @@
           api.GoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults
               .fromJson(o.toJson());
       checkGoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults(
-          od);
+          od as api
+              .GoogleCloudVideointelligenceV1p3beta1StreamingVideoAnnotationResults);
     });
   });
 
@@ -8342,7 +8876,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1TextAnnotation();
       var od = api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1TextAnnotation(od);
+      checkGoogleCloudVideointelligenceV1p3beta1TextAnnotation(
+          od as api.GoogleCloudVideointelligenceV1p3beta1TextAnnotation);
     });
   });
 
@@ -8352,7 +8887,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1TextFrame();
       var od = api.GoogleCloudVideointelligenceV1p3beta1TextFrame.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1TextFrame(od);
+      checkGoogleCloudVideointelligenceV1p3beta1TextFrame(
+          od as api.GoogleCloudVideointelligenceV1p3beta1TextFrame);
     });
   });
 
@@ -8362,7 +8898,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1TextSegment();
       var od = api.GoogleCloudVideointelligenceV1p3beta1TextSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1TextSegment(od);
+      checkGoogleCloudVideointelligenceV1p3beta1TextSegment(
+          od as api.GoogleCloudVideointelligenceV1p3beta1TextSegment);
     });
   });
 
@@ -8373,7 +8910,8 @@
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject.fromJson(
               o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1TimestampedObject(od);
+      checkGoogleCloudVideointelligenceV1p3beta1TimestampedObject(
+          od as api.GoogleCloudVideointelligenceV1p3beta1TimestampedObject);
     });
   });
 
@@ -8382,7 +8920,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1Track();
       var od =
           api.GoogleCloudVideointelligenceV1p3beta1Track.fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1Track(od);
+      checkGoogleCloudVideointelligenceV1p3beta1Track(
+          od as api.GoogleCloudVideointelligenceV1p3beta1Track);
     });
   });
 
@@ -8394,7 +8933,8 @@
           buildGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress();
       var od = api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress(od);
+      checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress(od
+          as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationProgress);
     });
   });
 
@@ -8406,7 +8946,8 @@
           buildGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults();
       var od = api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults
           .fromJson(o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults(od);
+      checkGoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults(od
+          as api.GoogleCloudVideointelligenceV1p3beta1VideoAnnotationResults);
     });
   });
 
@@ -8416,7 +8957,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1VideoSegment();
       var od = api.GoogleCloudVideointelligenceV1p3beta1VideoSegment.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(od);
+      checkGoogleCloudVideointelligenceV1p3beta1VideoSegment(
+          od as api.GoogleCloudVideointelligenceV1p3beta1VideoSegment);
     });
   });
 
@@ -8426,7 +8968,8 @@
       var o = buildGoogleCloudVideointelligenceV1p3beta1WordInfo();
       var od = api.GoogleCloudVideointelligenceV1p3beta1WordInfo.fromJson(
           o.toJson());
-      checkGoogleCloudVideointelligenceV1p3beta1WordInfo(od);
+      checkGoogleCloudVideointelligenceV1p3beta1WordInfo(
+          od as api.GoogleCloudVideointelligenceV1p3beta1WordInfo);
     });
   });
 
@@ -8434,7 +8977,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningCancelOperationRequest();
       var od = api.GoogleLongrunningCancelOperationRequest.fromJson(o.toJson());
-      checkGoogleLongrunningCancelOperationRequest(od);
+      checkGoogleLongrunningCancelOperationRequest(
+          od as api.GoogleLongrunningCancelOperationRequest);
     });
   });
 
@@ -8442,7 +8986,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningListOperationsResponse();
       var od = api.GoogleLongrunningListOperationsResponse.fromJson(o.toJson());
-      checkGoogleLongrunningListOperationsResponse(od);
+      checkGoogleLongrunningListOperationsResponse(
+          od as api.GoogleLongrunningListOperationsResponse);
     });
   });
 
@@ -8450,7 +8995,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleLongrunningOperation();
       var od = api.GoogleLongrunningOperation.fromJson(o.toJson());
-      checkGoogleLongrunningOperation(od);
+      checkGoogleLongrunningOperation(od as api.GoogleLongrunningOperation);
     });
   });
 
@@ -8458,7 +9003,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleProtobufEmpty();
       var od = api.GoogleProtobufEmpty.fromJson(o.toJson());
-      checkGoogleProtobufEmpty(od);
+      checkGoogleProtobufEmpty(od as api.GoogleProtobufEmpty);
     });
   });
 
@@ -8466,7 +9011,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleRpcStatus();
       var od = api.GoogleRpcStatus.fromJson(o.toJson());
-      checkGoogleRpcStatus(od);
+      checkGoogleRpcStatus(od as api.GoogleRpcStatus);
     });
   });
 
@@ -8520,7 +9065,7 @@
       res
           .cancel(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8572,7 +9117,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8624,7 +9169,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -8675,7 +9221,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -8726,7 +9273,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
@@ -8739,8 +9287,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GoogleLongrunningCancelOperationRequest.fromJson(json);
-        checkGoogleLongrunningCancelOperationRequest(obj);
+        var obj = api.GoogleLongrunningCancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkGoogleLongrunningCancelOperationRequest(
+            obj as api.GoogleLongrunningCancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8780,7 +9330,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8828,7 +9378,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleProtobufEmpty(response);
+        checkGoogleProtobufEmpty(response as api.GoogleProtobufEmpty);
       })));
     });
 
@@ -8876,7 +9426,8 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
 
@@ -8937,7 +9488,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningListOperationsResponse(response);
+        checkGoogleLongrunningListOperationsResponse(
+            response as api.GoogleLongrunningListOperationsResponse);
       })));
     });
   });
@@ -8952,8 +9504,9 @@
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
         var obj =
             api.GoogleCloudVideointelligenceV1AnnotateVideoRequest.fromJson(
-                json);
-        checkGoogleCloudVideointelligenceV1AnnotateVideoRequest(obj);
+                json as core.Map<core.String, core.dynamic>);
+        checkGoogleCloudVideointelligenceV1AnnotateVideoRequest(
+            obj as api.GoogleCloudVideointelligenceV1AnnotateVideoRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8992,7 +9545,8 @@
       res
           .annotate(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGoogleLongrunningOperation(response);
+        checkGoogleLongrunningOperation(
+            response as api.GoogleLongrunningOperation);
       })));
     });
   });
diff --git a/generated/googleapis/test/vision/v1_test.dart b/generated/googleapis/test/vision/v1_test.dart
index 3c13bf2..c825fe4 100644
--- a/generated/googleapis/test/vision/v1_test.dart
+++ b/generated/googleapis/test/vision/v1_test.dart
@@ -102,8 +102,8 @@
 
 void checkUnnamed2970(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFeature(o[0]);
-  checkFeature(o[1]);
+  checkFeature(o[0] as api.Feature);
+  checkFeature(o[1] as api.Feature);
 }
 
 core.List<core.int> buildUnnamed2971() {
@@ -137,8 +137,8 @@
   buildCounterAnnotateFileRequest++;
   if (buildCounterAnnotateFileRequest < 3) {
     checkUnnamed2970(o.features);
-    checkImageContext(o.imageContext);
-    checkInputConfig(o.inputConfig);
+    checkImageContext(o.imageContext as api.ImageContext);
+    checkInputConfig(o.inputConfig as api.InputConfig);
     checkUnnamed2971(o.pages);
   }
   buildCounterAnnotateFileRequest--;
@@ -153,8 +153,8 @@
 
 void checkUnnamed2972(core.List<api.AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotateImageResponse(o[0]);
-  checkAnnotateImageResponse(o[1]);
+  checkAnnotateImageResponse(o[0] as api.AnnotateImageResponse);
+  checkAnnotateImageResponse(o[1] as api.AnnotateImageResponse);
 }
 
 core.int buildCounterAnnotateFileResponse = 0;
@@ -174,8 +174,8 @@
 void checkAnnotateFileResponse(api.AnnotateFileResponse o) {
   buildCounterAnnotateFileResponse++;
   if (buildCounterAnnotateFileResponse < 3) {
-    checkStatus(o.error);
-    checkInputConfig(o.inputConfig);
+    checkStatus(o.error as api.Status);
+    checkInputConfig(o.inputConfig as api.InputConfig);
     checkUnnamed2972(o.responses);
     unittest.expect(o.totalPages, unittest.equals(42));
   }
@@ -191,8 +191,8 @@
 
 void checkUnnamed2973(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFeature(o[0]);
-  checkFeature(o[1]);
+  checkFeature(o[0] as api.Feature);
+  checkFeature(o[1] as api.Feature);
 }
 
 core.int buildCounterAnnotateImageRequest = 0;
@@ -212,8 +212,8 @@
   buildCounterAnnotateImageRequest++;
   if (buildCounterAnnotateImageRequest < 3) {
     checkUnnamed2973(o.features);
-    checkImage(o.image);
-    checkImageContext(o.imageContext);
+    checkImage(o.image as api.Image);
+    checkImageContext(o.imageContext as api.ImageContext);
   }
   buildCounterAnnotateImageRequest--;
 }
@@ -227,8 +227,8 @@
 
 void checkUnnamed2974(core.List<api.FaceAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFaceAnnotation(o[0]);
-  checkFaceAnnotation(o[1]);
+  checkFaceAnnotation(o[0] as api.FaceAnnotation);
+  checkFaceAnnotation(o[1] as api.FaceAnnotation);
 }
 
 core.List<api.EntityAnnotation> buildUnnamed2975() {
@@ -240,8 +240,8 @@
 
 void checkUnnamed2975(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityAnnotation(o[0]);
-  checkEntityAnnotation(o[1]);
+  checkEntityAnnotation(o[0] as api.EntityAnnotation);
+  checkEntityAnnotation(o[1] as api.EntityAnnotation);
 }
 
 core.List<api.EntityAnnotation> buildUnnamed2976() {
@@ -253,8 +253,8 @@
 
 void checkUnnamed2976(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityAnnotation(o[0]);
-  checkEntityAnnotation(o[1]);
+  checkEntityAnnotation(o[0] as api.EntityAnnotation);
+  checkEntityAnnotation(o[1] as api.EntityAnnotation);
 }
 
 core.List<api.LocalizedObjectAnnotation> buildUnnamed2977() {
@@ -266,8 +266,8 @@
 
 void checkUnnamed2977(core.List<api.LocalizedObjectAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalizedObjectAnnotation(o[0]);
-  checkLocalizedObjectAnnotation(o[1]);
+  checkLocalizedObjectAnnotation(o[0] as api.LocalizedObjectAnnotation);
+  checkLocalizedObjectAnnotation(o[1] as api.LocalizedObjectAnnotation);
 }
 
 core.List<api.EntityAnnotation> buildUnnamed2978() {
@@ -279,8 +279,8 @@
 
 void checkUnnamed2978(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityAnnotation(o[0]);
-  checkEntityAnnotation(o[1]);
+  checkEntityAnnotation(o[0] as api.EntityAnnotation);
+  checkEntityAnnotation(o[1] as api.EntityAnnotation);
 }
 
 core.List<api.EntityAnnotation> buildUnnamed2979() {
@@ -292,8 +292,8 @@
 
 void checkUnnamed2979(core.List<api.EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkEntityAnnotation(o[0]);
-  checkEntityAnnotation(o[1]);
+  checkEntityAnnotation(o[0] as api.EntityAnnotation);
+  checkEntityAnnotation(o[1] as api.EntityAnnotation);
 }
 
 core.int buildCounterAnnotateImageResponse = 0;
@@ -323,20 +323,22 @@
 void checkAnnotateImageResponse(api.AnnotateImageResponse o) {
   buildCounterAnnotateImageResponse++;
   if (buildCounterAnnotateImageResponse < 3) {
-    checkImageAnnotationContext(o.context);
-    checkCropHintsAnnotation(o.cropHintsAnnotation);
-    checkStatus(o.error);
+    checkImageAnnotationContext(o.context as api.ImageAnnotationContext);
+    checkCropHintsAnnotation(o.cropHintsAnnotation as api.CropHintsAnnotation);
+    checkStatus(o.error as api.Status);
     checkUnnamed2974(o.faceAnnotations);
-    checkTextAnnotation(o.fullTextAnnotation);
-    checkImageProperties(o.imagePropertiesAnnotation);
+    checkTextAnnotation(o.fullTextAnnotation as api.TextAnnotation);
+    checkImageProperties(o.imagePropertiesAnnotation as api.ImageProperties);
     checkUnnamed2975(o.labelAnnotations);
     checkUnnamed2976(o.landmarkAnnotations);
     checkUnnamed2977(o.localizedObjectAnnotations);
     checkUnnamed2978(o.logoAnnotations);
-    checkProductSearchResults(o.productSearchResults);
-    checkSafeSearchAnnotation(o.safeSearchAnnotation);
+    checkProductSearchResults(
+        o.productSearchResults as api.ProductSearchResults);
+    checkSafeSearchAnnotation(
+        o.safeSearchAnnotation as api.SafeSearchAnnotation);
     checkUnnamed2979(o.textAnnotations);
-    checkWebDetection(o.webDetection);
+    checkWebDetection(o.webDetection as api.WebDetection);
   }
   buildCounterAnnotateImageResponse--;
 }
@@ -350,8 +352,8 @@
 
 void checkUnnamed2980(core.List<api.Feature> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFeature(o[0]);
-  checkFeature(o[1]);
+  checkFeature(o[0] as api.Feature);
+  checkFeature(o[1] as api.Feature);
 }
 
 core.int buildCounterAsyncAnnotateFileRequest = 0;
@@ -372,9 +374,9 @@
   buildCounterAsyncAnnotateFileRequest++;
   if (buildCounterAsyncAnnotateFileRequest < 3) {
     checkUnnamed2980(o.features);
-    checkImageContext(o.imageContext);
-    checkInputConfig(o.inputConfig);
-    checkOutputConfig(o.outputConfig);
+    checkImageContext(o.imageContext as api.ImageContext);
+    checkInputConfig(o.inputConfig as api.InputConfig);
+    checkOutputConfig(o.outputConfig as api.OutputConfig);
   }
   buildCounterAsyncAnnotateFileRequest--;
 }
@@ -393,7 +395,7 @@
 void checkAsyncAnnotateFileResponse(api.AsyncAnnotateFileResponse o) {
   buildCounterAsyncAnnotateFileResponse++;
   if (buildCounterAsyncAnnotateFileResponse < 3) {
-    checkOutputConfig(o.outputConfig);
+    checkOutputConfig(o.outputConfig as api.OutputConfig);
   }
   buildCounterAsyncAnnotateFileResponse--;
 }
@@ -407,8 +409,8 @@
 
 void checkUnnamed2981(core.List<api.AsyncAnnotateFileRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAsyncAnnotateFileRequest(o[0]);
-  checkAsyncAnnotateFileRequest(o[1]);
+  checkAsyncAnnotateFileRequest(o[0] as api.AsyncAnnotateFileRequest);
+  checkAsyncAnnotateFileRequest(o[1] as api.AsyncAnnotateFileRequest);
 }
 
 core.int buildCounterAsyncBatchAnnotateFilesRequest = 0;
@@ -441,8 +443,8 @@
 
 void checkUnnamed2982(core.List<api.AsyncAnnotateFileResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAsyncAnnotateFileResponse(o[0]);
-  checkAsyncAnnotateFileResponse(o[1]);
+  checkAsyncAnnotateFileResponse(o[0] as api.AsyncAnnotateFileResponse);
+  checkAsyncAnnotateFileResponse(o[1] as api.AsyncAnnotateFileResponse);
 }
 
 core.int buildCounterAsyncBatchAnnotateFilesResponse = 0;
@@ -474,8 +476,8 @@
 
 void checkUnnamed2983(core.List<api.AnnotateImageRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotateImageRequest(o[0]);
-  checkAnnotateImageRequest(o[1]);
+  checkAnnotateImageRequest(o[0] as api.AnnotateImageRequest);
+  checkAnnotateImageRequest(o[1] as api.AnnotateImageRequest);
 }
 
 core.int buildCounterAsyncBatchAnnotateImagesRequest = 0;
@@ -495,7 +497,7 @@
     api.AsyncBatchAnnotateImagesRequest o) {
   buildCounterAsyncBatchAnnotateImagesRequest++;
   if (buildCounterAsyncBatchAnnotateImagesRequest < 3) {
-    checkOutputConfig(o.outputConfig);
+    checkOutputConfig(o.outputConfig as api.OutputConfig);
     unittest.expect(o.parent, unittest.equals('foo'));
     checkUnnamed2983(o.requests);
   }
@@ -517,7 +519,7 @@
     api.AsyncBatchAnnotateImagesResponse o) {
   buildCounterAsyncBatchAnnotateImagesResponse++;
   if (buildCounterAsyncBatchAnnotateImagesResponse < 3) {
-    checkOutputConfig(o.outputConfig);
+    checkOutputConfig(o.outputConfig as api.OutputConfig);
   }
   buildCounterAsyncBatchAnnotateImagesResponse--;
 }
@@ -531,8 +533,8 @@
 
 void checkUnnamed2984(core.List<api.AnnotateFileRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotateFileRequest(o[0]);
-  checkAnnotateFileRequest(o[1]);
+  checkAnnotateFileRequest(o[0] as api.AnnotateFileRequest);
+  checkAnnotateFileRequest(o[1] as api.AnnotateFileRequest);
 }
 
 core.int buildCounterBatchAnnotateFilesRequest = 0;
@@ -565,8 +567,8 @@
 
 void checkUnnamed2985(core.List<api.AnnotateFileResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotateFileResponse(o[0]);
-  checkAnnotateFileResponse(o[1]);
+  checkAnnotateFileResponse(o[0] as api.AnnotateFileResponse);
+  checkAnnotateFileResponse(o[1] as api.AnnotateFileResponse);
 }
 
 core.int buildCounterBatchAnnotateFilesResponse = 0;
@@ -597,8 +599,8 @@
 
 void checkUnnamed2986(core.List<api.AnnotateImageRequest> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotateImageRequest(o[0]);
-  checkAnnotateImageRequest(o[1]);
+  checkAnnotateImageRequest(o[0] as api.AnnotateImageRequest);
+  checkAnnotateImageRequest(o[1] as api.AnnotateImageRequest);
 }
 
 core.int buildCounterBatchAnnotateImagesRequest = 0;
@@ -631,8 +633,8 @@
 
 void checkUnnamed2987(core.List<api.AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAnnotateImageResponse(o[0]);
-  checkAnnotateImageResponse(o[1]);
+  checkAnnotateImageResponse(o[0] as api.AnnotateImageResponse);
+  checkAnnotateImageResponse(o[1] as api.AnnotateImageResponse);
 }
 
 core.int buildCounterBatchAnnotateImagesResponse = 0;
@@ -686,8 +688,8 @@
 
 void checkUnnamed2988(core.List<api.Paragraph> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkParagraph(o[0]);
-  checkParagraph(o[1]);
+  checkParagraph(o[0] as api.Paragraph);
+  checkParagraph(o[1] as api.Paragraph);
 }
 
 core.int buildCounterBlock = 0;
@@ -709,10 +711,10 @@
   buildCounterBlock++;
   if (buildCounterBlock < 3) {
     unittest.expect(o.blockType, unittest.equals('foo'));
-    checkBoundingPoly(o.boundingBox);
+    checkBoundingPoly(o.boundingBox as api.BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed2988(o.paragraphs);
-    checkTextProperty(o.property);
+    checkTextProperty(o.property as api.TextProperty);
   }
   buildCounterBlock--;
 }
@@ -726,8 +728,8 @@
 
 void checkUnnamed2989(core.List<api.NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkNormalizedVertex(o[0]);
-  checkNormalizedVertex(o[1]);
+  checkNormalizedVertex(o[0] as api.NormalizedVertex);
+  checkNormalizedVertex(o[1] as api.NormalizedVertex);
 }
 
 core.List<api.Vertex> buildUnnamed2990() {
@@ -739,8 +741,8 @@
 
 void checkUnnamed2990(core.List<api.Vertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVertex(o[0]);
-  checkVertex(o[1]);
+  checkVertex(o[0] as api.Vertex);
+  checkVertex(o[1] as api.Vertex);
 }
 
 core.int buildCounterBoundingPoly = 0;
@@ -820,7 +822,7 @@
 void checkColorInfo(api.ColorInfo o) {
   buildCounterColorInfo++;
   if (buildCounterColorInfo < 3) {
-    checkColor(o.color);
+    checkColor(o.color as api.Color);
     unittest.expect(o.pixelFraction, unittest.equals(42.0));
     unittest.expect(o.score, unittest.equals(42.0));
   }
@@ -843,7 +845,7 @@
 void checkCropHint(api.CropHint o) {
   buildCounterCropHint++;
   if (buildCounterCropHint < 3) {
-    checkBoundingPoly(o.boundingPoly);
+    checkBoundingPoly(o.boundingPoly as api.BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.importanceFraction, unittest.equals(42.0));
   }
@@ -859,8 +861,8 @@
 
 void checkUnnamed2991(core.List<api.CropHint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCropHint(o[0]);
-  checkCropHint(o[1]);
+  checkCropHint(o[0] as api.CropHint);
+  checkCropHint(o[1] as api.CropHint);
 }
 
 core.int buildCounterCropHintsAnnotation = 0;
@@ -965,8 +967,8 @@
 
 void checkUnnamed2993(core.List<api.ColorInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkColorInfo(o[0]);
-  checkColorInfo(o[1]);
+  checkColorInfo(o[0] as api.ColorInfo);
+  checkColorInfo(o[1] as api.ColorInfo);
 }
 
 core.int buildCounterDominantColorsAnnotation = 0;
@@ -1012,8 +1014,8 @@
 
 void checkUnnamed2994(core.List<api.LocationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocationInfo(o[0]);
-  checkLocationInfo(o[1]);
+  checkLocationInfo(o[0] as api.LocationInfo);
+  checkLocationInfo(o[1] as api.LocationInfo);
 }
 
 core.List<api.Property> buildUnnamed2995() {
@@ -1025,8 +1027,8 @@
 
 void checkUnnamed2995(core.List<api.Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProperty(o[0]);
-  checkProperty(o[1]);
+  checkProperty(o[0] as api.Property);
+  checkProperty(o[1] as api.Property);
 }
 
 core.int buildCounterEntityAnnotation = 0;
@@ -1051,7 +1053,7 @@
 void checkEntityAnnotation(api.EntityAnnotation o) {
   buildCounterEntityAnnotation++;
   if (buildCounterEntityAnnotation < 3) {
-    checkBoundingPoly(o.boundingPoly);
+    checkBoundingPoly(o.boundingPoly as api.BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
@@ -1073,8 +1075,8 @@
 
 void checkUnnamed2996(core.List<api.Landmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLandmark(o[0]);
-  checkLandmark(o[1]);
+  checkLandmark(o[0] as api.Landmark);
+  checkLandmark(o[1] as api.Landmark);
 }
 
 core.int buildCounterFaceAnnotation = 0;
@@ -1107,9 +1109,9 @@
   if (buildCounterFaceAnnotation < 3) {
     unittest.expect(o.angerLikelihood, unittest.equals('foo'));
     unittest.expect(o.blurredLikelihood, unittest.equals('foo'));
-    checkBoundingPoly(o.boundingPoly);
+    checkBoundingPoly(o.boundingPoly as api.BoundingPoly);
     unittest.expect(o.detectionConfidence, unittest.equals(42.0));
-    checkBoundingPoly(o.fdBoundingPoly);
+    checkBoundingPoly(o.fdBoundingPoly as api.BoundingPoly);
     unittest.expect(o.headwearLikelihood, unittest.equals('foo'));
     unittest.expect(o.joyLikelihood, unittest.equals('foo'));
     unittest.expect(o.landmarkingConfidence, unittest.equals(42.0));
@@ -1196,8 +1198,10 @@
 void checkUnnamed2997(
     core.List<api.GoogleCloudVisionV1p1beta1AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1AnnotateImageResponse(o[0]);
-  checkGoogleCloudVisionV1p1beta1AnnotateImageResponse(o[1]);
+  checkGoogleCloudVisionV1p1beta1AnnotateImageResponse(
+      o[0] as api.GoogleCloudVisionV1p1beta1AnnotateImageResponse);
+  checkGoogleCloudVisionV1p1beta1AnnotateImageResponse(
+      o[1] as api.GoogleCloudVisionV1p1beta1AnnotateImageResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1AnnotateFileResponse = 0;
@@ -1219,8 +1223,9 @@
     api.GoogleCloudVisionV1p1beta1AnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p1beta1AnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p1beta1AnnotateFileResponse < 3) {
-    checkStatus(o.error);
-    checkGoogleCloudVisionV1p1beta1InputConfig(o.inputConfig);
+    checkStatus(o.error as api.Status);
+    checkGoogleCloudVisionV1p1beta1InputConfig(
+        o.inputConfig as api.GoogleCloudVisionV1p1beta1InputConfig);
     checkUnnamed2997(o.responses);
     unittest.expect(o.totalPages, unittest.equals(42));
   }
@@ -1237,8 +1242,10 @@
 void checkUnnamed2998(
     core.List<api.GoogleCloudVisionV1p1beta1FaceAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1FaceAnnotation(o[0]);
-  checkGoogleCloudVisionV1p1beta1FaceAnnotation(o[1]);
+  checkGoogleCloudVisionV1p1beta1FaceAnnotation(
+      o[0] as api.GoogleCloudVisionV1p1beta1FaceAnnotation);
+  checkGoogleCloudVisionV1p1beta1FaceAnnotation(
+      o[1] as api.GoogleCloudVisionV1p1beta1FaceAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> buildUnnamed2999() {
@@ -1251,8 +1258,10 @@
 void checkUnnamed2999(
     core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> buildUnnamed3000() {
@@ -1265,8 +1274,10 @@
 void checkUnnamed3000(
     core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation>
@@ -1280,8 +1291,10 @@
 void checkUnnamed3001(
     core.List<api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation(
+      o[0] as api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation);
+  checkGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation(
+      o[1] as api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> buildUnnamed3002() {
@@ -1294,8 +1307,10 @@
 void checkUnnamed3002(
     core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> buildUnnamed3003() {
@@ -1308,8 +1323,10 @@
 void checkUnnamed3003(
     core.List<api.GoogleCloudVisionV1p1beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p1beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1AnnotateImageResponse = 0;
@@ -1345,20 +1362,27 @@
     api.GoogleCloudVisionV1p1beta1AnnotateImageResponse o) {
   buildCounterGoogleCloudVisionV1p1beta1AnnotateImageResponse++;
   if (buildCounterGoogleCloudVisionV1p1beta1AnnotateImageResponse < 3) {
-    checkGoogleCloudVisionV1p1beta1ImageAnnotationContext(o.context);
-    checkGoogleCloudVisionV1p1beta1CropHintsAnnotation(o.cropHintsAnnotation);
-    checkStatus(o.error);
+    checkGoogleCloudVisionV1p1beta1ImageAnnotationContext(
+        o.context as api.GoogleCloudVisionV1p1beta1ImageAnnotationContext);
+    checkGoogleCloudVisionV1p1beta1CropHintsAnnotation(o.cropHintsAnnotation
+        as api.GoogleCloudVisionV1p1beta1CropHintsAnnotation);
+    checkStatus(o.error as api.Status);
     checkUnnamed2998(o.faceAnnotations);
-    checkGoogleCloudVisionV1p1beta1TextAnnotation(o.fullTextAnnotation);
-    checkGoogleCloudVisionV1p1beta1ImageProperties(o.imagePropertiesAnnotation);
+    checkGoogleCloudVisionV1p1beta1TextAnnotation(
+        o.fullTextAnnotation as api.GoogleCloudVisionV1p1beta1TextAnnotation);
+    checkGoogleCloudVisionV1p1beta1ImageProperties(o.imagePropertiesAnnotation
+        as api.GoogleCloudVisionV1p1beta1ImageProperties);
     checkUnnamed2999(o.labelAnnotations);
     checkUnnamed3000(o.landmarkAnnotations);
     checkUnnamed3001(o.localizedObjectAnnotations);
     checkUnnamed3002(o.logoAnnotations);
-    checkGoogleCloudVisionV1p1beta1ProductSearchResults(o.productSearchResults);
-    checkGoogleCloudVisionV1p1beta1SafeSearchAnnotation(o.safeSearchAnnotation);
+    checkGoogleCloudVisionV1p1beta1ProductSearchResults(o.productSearchResults
+        as api.GoogleCloudVisionV1p1beta1ProductSearchResults);
+    checkGoogleCloudVisionV1p1beta1SafeSearchAnnotation(o.safeSearchAnnotation
+        as api.GoogleCloudVisionV1p1beta1SafeSearchAnnotation);
     checkUnnamed3003(o.textAnnotations);
-    checkGoogleCloudVisionV1p1beta1WebDetection(o.webDetection);
+    checkGoogleCloudVisionV1p1beta1WebDetection(
+        o.webDetection as api.GoogleCloudVisionV1p1beta1WebDetection);
   }
   buildCounterGoogleCloudVisionV1p1beta1AnnotateImageResponse--;
 }
@@ -1379,7 +1403,8 @@
     api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse < 3) {
-    checkGoogleCloudVisionV1p1beta1OutputConfig(o.outputConfig);
+    checkGoogleCloudVisionV1p1beta1OutputConfig(
+        o.outputConfig as api.GoogleCloudVisionV1p1beta1OutputConfig);
   }
   buildCounterGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse--;
 }
@@ -1395,8 +1420,10 @@
 void checkUnnamed3004(
     core.List<api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse(o[0]);
-  checkGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse(o[1]);
+  checkGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse(
+      o[0] as api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse);
+  checkGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse(
+      o[1] as api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse =
@@ -1432,8 +1459,10 @@
 
 void checkUnnamed3005(core.List<api.GoogleCloudVisionV1p1beta1Paragraph> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1Paragraph(o[0]);
-  checkGoogleCloudVisionV1p1beta1Paragraph(o[1]);
+  checkGoogleCloudVisionV1p1beta1Paragraph(
+      o[0] as api.GoogleCloudVisionV1p1beta1Paragraph);
+  checkGoogleCloudVisionV1p1beta1Paragraph(
+      o[1] as api.GoogleCloudVisionV1p1beta1Paragraph);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1Block = 0;
@@ -1456,10 +1485,12 @@
   buildCounterGoogleCloudVisionV1p1beta1Block++;
   if (buildCounterGoogleCloudVisionV1p1beta1Block < 3) {
     unittest.expect(o.blockType, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed3005(o.paragraphs);
-    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty);
   }
   buildCounterGoogleCloudVisionV1p1beta1Block--;
 }
@@ -1474,8 +1505,10 @@
 void checkUnnamed3006(
     core.List<api.GoogleCloudVisionV1p1beta1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1NormalizedVertex(o[0]);
-  checkGoogleCloudVisionV1p1beta1NormalizedVertex(o[1]);
+  checkGoogleCloudVisionV1p1beta1NormalizedVertex(
+      o[0] as api.GoogleCloudVisionV1p1beta1NormalizedVertex);
+  checkGoogleCloudVisionV1p1beta1NormalizedVertex(
+      o[1] as api.GoogleCloudVisionV1p1beta1NormalizedVertex);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1Vertex> buildUnnamed3007() {
@@ -1487,8 +1520,10 @@
 
 void checkUnnamed3007(core.List<api.GoogleCloudVisionV1p1beta1Vertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1Vertex(o[0]);
-  checkGoogleCloudVisionV1p1beta1Vertex(o[1]);
+  checkGoogleCloudVisionV1p1beta1Vertex(
+      o[0] as api.GoogleCloudVisionV1p1beta1Vertex);
+  checkGoogleCloudVisionV1p1beta1Vertex(
+      o[1] as api.GoogleCloudVisionV1p1beta1Vertex);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1BoundingPoly = 0;
@@ -1532,7 +1567,7 @@
     api.GoogleCloudVisionV1p1beta1ColorInfo o) {
   buildCounterGoogleCloudVisionV1p1beta1ColorInfo++;
   if (buildCounterGoogleCloudVisionV1p1beta1ColorInfo < 3) {
-    checkColor(o.color);
+    checkColor(o.color as api.Color);
     unittest.expect(o.pixelFraction, unittest.equals(42.0));
     unittest.expect(o.score, unittest.equals(42.0));
   }
@@ -1557,7 +1592,8 @@
     api.GoogleCloudVisionV1p1beta1CropHint o) {
   buildCounterGoogleCloudVisionV1p1beta1CropHint++;
   if (buildCounterGoogleCloudVisionV1p1beta1CropHint < 3) {
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.importanceFraction, unittest.equals(42.0));
   }
@@ -1573,8 +1609,10 @@
 
 void checkUnnamed3008(core.List<api.GoogleCloudVisionV1p1beta1CropHint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1CropHint(o[0]);
-  checkGoogleCloudVisionV1p1beta1CropHint(o[1]);
+  checkGoogleCloudVisionV1p1beta1CropHint(
+      o[0] as api.GoogleCloudVisionV1p1beta1CropHint);
+  checkGoogleCloudVisionV1p1beta1CropHint(
+      o[1] as api.GoogleCloudVisionV1p1beta1CropHint);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1CropHintsAnnotation = 0;
@@ -1607,8 +1645,10 @@
 
 void checkUnnamed3009(core.List<api.GoogleCloudVisionV1p1beta1ColorInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1ColorInfo(o[0]);
-  checkGoogleCloudVisionV1p1beta1ColorInfo(o[1]);
+  checkGoogleCloudVisionV1p1beta1ColorInfo(
+      o[0] as api.GoogleCloudVisionV1p1beta1ColorInfo);
+  checkGoogleCloudVisionV1p1beta1ColorInfo(
+      o[1] as api.GoogleCloudVisionV1p1beta1ColorInfo);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1DominantColorsAnnotation = 0;
@@ -1641,8 +1681,10 @@
 
 void checkUnnamed3010(core.List<api.GoogleCloudVisionV1p1beta1LocationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1LocationInfo(o[0]);
-  checkGoogleCloudVisionV1p1beta1LocationInfo(o[1]);
+  checkGoogleCloudVisionV1p1beta1LocationInfo(
+      o[0] as api.GoogleCloudVisionV1p1beta1LocationInfo);
+  checkGoogleCloudVisionV1p1beta1LocationInfo(
+      o[1] as api.GoogleCloudVisionV1p1beta1LocationInfo);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1Property> buildUnnamed3011() {
@@ -1654,8 +1696,10 @@
 
 void checkUnnamed3011(core.List<api.GoogleCloudVisionV1p1beta1Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1Property(o[0]);
-  checkGoogleCloudVisionV1p1beta1Property(o[1]);
+  checkGoogleCloudVisionV1p1beta1Property(
+      o[0] as api.GoogleCloudVisionV1p1beta1Property);
+  checkGoogleCloudVisionV1p1beta1Property(
+      o[1] as api.GoogleCloudVisionV1p1beta1Property);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1EntityAnnotation = 0;
@@ -1682,7 +1726,8 @@
     api.GoogleCloudVisionV1p1beta1EntityAnnotation o) {
   buildCounterGoogleCloudVisionV1p1beta1EntityAnnotation++;
   if (buildCounterGoogleCloudVisionV1p1beta1EntityAnnotation < 3) {
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
@@ -1706,8 +1751,10 @@
 void checkUnnamed3012(
     core.List<api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1FaceAnnotationLandmark(o[0]);
-  checkGoogleCloudVisionV1p1beta1FaceAnnotationLandmark(o[1]);
+  checkGoogleCloudVisionV1p1beta1FaceAnnotationLandmark(
+      o[0] as api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark);
+  checkGoogleCloudVisionV1p1beta1FaceAnnotationLandmark(
+      o[1] as api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1FaceAnnotation = 0;
@@ -1742,9 +1789,11 @@
   if (buildCounterGoogleCloudVisionV1p1beta1FaceAnnotation < 3) {
     unittest.expect(o.angerLikelihood, unittest.equals('foo'));
     unittest.expect(o.blurredLikelihood, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.detectionConfidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.fdBoundingPoly);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.fdBoundingPoly as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.headwearLikelihood, unittest.equals('foo'));
     unittest.expect(o.joyLikelihood, unittest.equals('foo'));
     unittest.expect(o.landmarkingConfidence, unittest.equals(42.0));
@@ -1776,7 +1825,8 @@
     api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark o) {
   buildCounterGoogleCloudVisionV1p1beta1FaceAnnotationLandmark++;
   if (buildCounterGoogleCloudVisionV1p1beta1FaceAnnotationLandmark < 3) {
-    checkGoogleCloudVisionV1p1beta1Position(o.position);
+    checkGoogleCloudVisionV1p1beta1Position(
+        o.position as api.GoogleCloudVisionV1p1beta1Position);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p1beta1FaceAnnotationLandmark--;
@@ -1864,7 +1914,8 @@
     api.GoogleCloudVisionV1p1beta1ImageProperties o) {
   buildCounterGoogleCloudVisionV1p1beta1ImageProperties++;
   if (buildCounterGoogleCloudVisionV1p1beta1ImageProperties < 3) {
-    checkGoogleCloudVisionV1p1beta1DominantColorsAnnotation(o.dominantColors);
+    checkGoogleCloudVisionV1p1beta1DominantColorsAnnotation(o.dominantColors
+        as api.GoogleCloudVisionV1p1beta1DominantColorsAnnotation);
   }
   buildCounterGoogleCloudVisionV1p1beta1ImageProperties--;
 }
@@ -1888,7 +1939,8 @@
   buildCounterGoogleCloudVisionV1p1beta1InputConfig++;
   if (buildCounterGoogleCloudVisionV1p1beta1InputConfig < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p1beta1GcsSource(o.gcsSource);
+    checkGoogleCloudVisionV1p1beta1GcsSource(
+        o.gcsSource as api.GoogleCloudVisionV1p1beta1GcsSource);
     unittest.expect(o.mimeType, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p1beta1InputConfig--;
@@ -1914,7 +1966,8 @@
     api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation o) {
   buildCounterGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation++;
   if (buildCounterGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation < 3) {
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.mid, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -1939,7 +1992,7 @@
     api.GoogleCloudVisionV1p1beta1LocationInfo o) {
   buildCounterGoogleCloudVisionV1p1beta1LocationInfo++;
   if (buildCounterGoogleCloudVisionV1p1beta1LocationInfo < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
   }
   buildCounterGoogleCloudVisionV1p1beta1LocationInfo--;
 }
@@ -2010,7 +2063,8 @@
   buildCounterGoogleCloudVisionV1p1beta1OutputConfig++;
   if (buildCounterGoogleCloudVisionV1p1beta1OutputConfig < 3) {
     unittest.expect(o.batchSize, unittest.equals(42));
-    checkGoogleCloudVisionV1p1beta1GcsDestination(o.gcsDestination);
+    checkGoogleCloudVisionV1p1beta1GcsDestination(
+        o.gcsDestination as api.GoogleCloudVisionV1p1beta1GcsDestination);
   }
   buildCounterGoogleCloudVisionV1p1beta1OutputConfig--;
 }
@@ -2024,8 +2078,10 @@
 
 void checkUnnamed3013(core.List<api.GoogleCloudVisionV1p1beta1Block> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1Block(o[0]);
-  checkGoogleCloudVisionV1p1beta1Block(o[1]);
+  checkGoogleCloudVisionV1p1beta1Block(
+      o[0] as api.GoogleCloudVisionV1p1beta1Block);
+  checkGoogleCloudVisionV1p1beta1Block(
+      o[1] as api.GoogleCloudVisionV1p1beta1Block);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1Page = 0;
@@ -2049,7 +2105,8 @@
     checkUnnamed3013(o.blocks);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.height, unittest.equals(42));
-    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty);
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterGoogleCloudVisionV1p1beta1Page--;
@@ -2064,8 +2121,10 @@
 
 void checkUnnamed3014(core.List<api.GoogleCloudVisionV1p1beta1Word> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1Word(o[0]);
-  checkGoogleCloudVisionV1p1beta1Word(o[1]);
+  checkGoogleCloudVisionV1p1beta1Word(
+      o[0] as api.GoogleCloudVisionV1p1beta1Word);
+  checkGoogleCloudVisionV1p1beta1Word(
+      o[1] as api.GoogleCloudVisionV1p1beta1Word);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1Paragraph = 0;
@@ -2087,9 +2146,11 @@
     api.GoogleCloudVisionV1p1beta1Paragraph o) {
   buildCounterGoogleCloudVisionV1p1beta1Paragraph++;
   if (buildCounterGoogleCloudVisionV1p1beta1Paragraph < 3) {
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty);
     checkUnnamed3014(o.words);
   }
   buildCounterGoogleCloudVisionV1p1beta1Paragraph--;
@@ -2130,8 +2191,10 @@
 void checkUnnamed3015(
     core.List<api.GoogleCloudVisionV1p1beta1ProductKeyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1ProductKeyValue(o[0]);
-  checkGoogleCloudVisionV1p1beta1ProductKeyValue(o[1]);
+  checkGoogleCloudVisionV1p1beta1ProductKeyValue(
+      o[0] as api.GoogleCloudVisionV1p1beta1ProductKeyValue);
+  checkGoogleCloudVisionV1p1beta1ProductKeyValue(
+      o[1] as api.GoogleCloudVisionV1p1beta1ProductKeyValue);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1Product = 0;
@@ -2197,8 +2260,10 @@
     core.List<api.GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult(o[0]);
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult(o[1]);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult(
+      o[0] as api.GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult(
+      o[1] as api.GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult>
@@ -2212,8 +2277,10 @@
 void checkUnnamed3017(
     core.List<api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1ProductSearchResults = 0;
@@ -2255,8 +2322,10 @@
             api.GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation(o[0]
+      as api.GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation(o[1]
+      as api.GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult>
@@ -2270,8 +2339,10 @@
 void checkUnnamed3019(
     core.List<api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult);
 }
 
 core.int
@@ -2295,7 +2366,8 @@
   buildCounterGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult++;
   if (buildCounterGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult <
       3) {
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     checkUnnamed3018(o.objectAnnotations);
     checkUnnamed3019(o.results);
   }
@@ -2352,7 +2424,8 @@
   buildCounterGoogleCloudVisionV1p1beta1ProductSearchResultsResult++;
   if (buildCounterGoogleCloudVisionV1p1beta1ProductSearchResultsResult < 3) {
     unittest.expect(o.image, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p1beta1Product(o.product);
+    checkGoogleCloudVisionV1p1beta1Product(
+        o.product as api.GoogleCloudVisionV1p1beta1Product);
     unittest.expect(o.score, unittest.equals(42.0));
   }
   buildCounterGoogleCloudVisionV1p1beta1ProductSearchResultsResult--;
@@ -2430,9 +2503,11 @@
     api.GoogleCloudVisionV1p1beta1Symbol o) {
   buildCounterGoogleCloudVisionV1p1beta1Symbol++;
   if (buildCounterGoogleCloudVisionV1p1beta1Symbol < 3) {
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p1beta1Symbol--;
@@ -2447,8 +2522,10 @@
 
 void checkUnnamed3020(core.List<api.GoogleCloudVisionV1p1beta1Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1Page(o[0]);
-  checkGoogleCloudVisionV1p1beta1Page(o[1]);
+  checkGoogleCloudVisionV1p1beta1Page(
+      o[0] as api.GoogleCloudVisionV1p1beta1Page);
+  checkGoogleCloudVisionV1p1beta1Page(
+      o[1] as api.GoogleCloudVisionV1p1beta1Page);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1TextAnnotation = 0;
@@ -2534,8 +2611,10 @@
 void checkUnnamed3021(
     core.List<api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage(o[0]);
-  checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage(o[1]);
+  checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage(
+      o[0] as api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage);
+  checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage(
+      o[1] as api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1TextAnnotationTextProperty = 0;
@@ -2556,7 +2635,8 @@
     api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty o) {
   buildCounterGoogleCloudVisionV1p1beta1TextAnnotationTextProperty++;
   if (buildCounterGoogleCloudVisionV1p1beta1TextAnnotationTextProperty < 3) {
-    checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak(o.detectedBreak);
+    checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak(o.detectedBreak
+        as api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak);
     checkUnnamed3021(o.detectedLanguages);
   }
   buildCounterGoogleCloudVisionV1p1beta1TextAnnotationTextProperty--;
@@ -2595,8 +2675,10 @@
 void checkUnnamed3022(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebLabel(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebLabel(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebLabel(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebLabel);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebLabel(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebLabel);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage>
@@ -2610,8 +2692,10 @@
 void checkUnnamed3023(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebPage>
@@ -2625,8 +2709,10 @@
 void checkUnnamed3024(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebPage(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebPage(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebPage(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebPage);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebPage(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebPage);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage>
@@ -2640,8 +2726,10 @@
 void checkUnnamed3025(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage>
@@ -2655,8 +2743,10 @@
 void checkUnnamed3026(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity>
@@ -2670,8 +2760,10 @@
 void checkUnnamed3027(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebEntity(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebEntity(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebEntity(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebEntity(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1WebDetection = 0;
@@ -2787,8 +2879,10 @@
 void checkUnnamed3028(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage>
@@ -2802,8 +2896,10 @@
 void checkUnnamed3029(
     core.List<api.GoogleCloudVisionV1p1beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1WebDetectionWebPage = 0;
@@ -2844,8 +2940,10 @@
 
 void checkUnnamed3030(core.List<api.GoogleCloudVisionV1p1beta1Symbol> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p1beta1Symbol(o[0]);
-  checkGoogleCloudVisionV1p1beta1Symbol(o[1]);
+  checkGoogleCloudVisionV1p1beta1Symbol(
+      o[0] as api.GoogleCloudVisionV1p1beta1Symbol);
+  checkGoogleCloudVisionV1p1beta1Symbol(
+      o[1] as api.GoogleCloudVisionV1p1beta1Symbol);
 }
 
 core.int buildCounterGoogleCloudVisionV1p1beta1Word = 0;
@@ -2865,9 +2963,11 @@
 void checkGoogleCloudVisionV1p1beta1Word(api.GoogleCloudVisionV1p1beta1Word o) {
   buildCounterGoogleCloudVisionV1p1beta1Word++;
   if (buildCounterGoogleCloudVisionV1p1beta1Word < 3) {
-    checkGoogleCloudVisionV1p1beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p1beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty);
     checkUnnamed3030(o.symbols);
   }
   buildCounterGoogleCloudVisionV1p1beta1Word--;
@@ -2884,8 +2984,10 @@
 void checkUnnamed3031(
     core.List<api.GoogleCloudVisionV1p2beta1AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1AnnotateImageResponse(o[0]);
-  checkGoogleCloudVisionV1p2beta1AnnotateImageResponse(o[1]);
+  checkGoogleCloudVisionV1p2beta1AnnotateImageResponse(
+      o[0] as api.GoogleCloudVisionV1p2beta1AnnotateImageResponse);
+  checkGoogleCloudVisionV1p2beta1AnnotateImageResponse(
+      o[1] as api.GoogleCloudVisionV1p2beta1AnnotateImageResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1AnnotateFileResponse = 0;
@@ -2907,8 +3009,9 @@
     api.GoogleCloudVisionV1p2beta1AnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p2beta1AnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p2beta1AnnotateFileResponse < 3) {
-    checkStatus(o.error);
-    checkGoogleCloudVisionV1p2beta1InputConfig(o.inputConfig);
+    checkStatus(o.error as api.Status);
+    checkGoogleCloudVisionV1p2beta1InputConfig(
+        o.inputConfig as api.GoogleCloudVisionV1p2beta1InputConfig);
     checkUnnamed3031(o.responses);
     unittest.expect(o.totalPages, unittest.equals(42));
   }
@@ -2925,8 +3028,10 @@
 void checkUnnamed3032(
     core.List<api.GoogleCloudVisionV1p2beta1FaceAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1FaceAnnotation(o[0]);
-  checkGoogleCloudVisionV1p2beta1FaceAnnotation(o[1]);
+  checkGoogleCloudVisionV1p2beta1FaceAnnotation(
+      o[0] as api.GoogleCloudVisionV1p2beta1FaceAnnotation);
+  checkGoogleCloudVisionV1p2beta1FaceAnnotation(
+      o[1] as api.GoogleCloudVisionV1p2beta1FaceAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> buildUnnamed3033() {
@@ -2939,8 +3044,10 @@
 void checkUnnamed3033(
     core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> buildUnnamed3034() {
@@ -2953,8 +3060,10 @@
 void checkUnnamed3034(
     core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation>
@@ -2968,8 +3077,10 @@
 void checkUnnamed3035(
     core.List<api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation(
+      o[0] as api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation);
+  checkGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation(
+      o[1] as api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> buildUnnamed3036() {
@@ -2982,8 +3093,10 @@
 void checkUnnamed3036(
     core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> buildUnnamed3037() {
@@ -2996,8 +3109,10 @@
 void checkUnnamed3037(
     core.List<api.GoogleCloudVisionV1p2beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p2beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1AnnotateImageResponse = 0;
@@ -3033,20 +3148,27 @@
     api.GoogleCloudVisionV1p2beta1AnnotateImageResponse o) {
   buildCounterGoogleCloudVisionV1p2beta1AnnotateImageResponse++;
   if (buildCounterGoogleCloudVisionV1p2beta1AnnotateImageResponse < 3) {
-    checkGoogleCloudVisionV1p2beta1ImageAnnotationContext(o.context);
-    checkGoogleCloudVisionV1p2beta1CropHintsAnnotation(o.cropHintsAnnotation);
-    checkStatus(o.error);
+    checkGoogleCloudVisionV1p2beta1ImageAnnotationContext(
+        o.context as api.GoogleCloudVisionV1p2beta1ImageAnnotationContext);
+    checkGoogleCloudVisionV1p2beta1CropHintsAnnotation(o.cropHintsAnnotation
+        as api.GoogleCloudVisionV1p2beta1CropHintsAnnotation);
+    checkStatus(o.error as api.Status);
     checkUnnamed3032(o.faceAnnotations);
-    checkGoogleCloudVisionV1p2beta1TextAnnotation(o.fullTextAnnotation);
-    checkGoogleCloudVisionV1p2beta1ImageProperties(o.imagePropertiesAnnotation);
+    checkGoogleCloudVisionV1p2beta1TextAnnotation(
+        o.fullTextAnnotation as api.GoogleCloudVisionV1p2beta1TextAnnotation);
+    checkGoogleCloudVisionV1p2beta1ImageProperties(o.imagePropertiesAnnotation
+        as api.GoogleCloudVisionV1p2beta1ImageProperties);
     checkUnnamed3033(o.labelAnnotations);
     checkUnnamed3034(o.landmarkAnnotations);
     checkUnnamed3035(o.localizedObjectAnnotations);
     checkUnnamed3036(o.logoAnnotations);
-    checkGoogleCloudVisionV1p2beta1ProductSearchResults(o.productSearchResults);
-    checkGoogleCloudVisionV1p2beta1SafeSearchAnnotation(o.safeSearchAnnotation);
+    checkGoogleCloudVisionV1p2beta1ProductSearchResults(o.productSearchResults
+        as api.GoogleCloudVisionV1p2beta1ProductSearchResults);
+    checkGoogleCloudVisionV1p2beta1SafeSearchAnnotation(o.safeSearchAnnotation
+        as api.GoogleCloudVisionV1p2beta1SafeSearchAnnotation);
     checkUnnamed3037(o.textAnnotations);
-    checkGoogleCloudVisionV1p2beta1WebDetection(o.webDetection);
+    checkGoogleCloudVisionV1p2beta1WebDetection(
+        o.webDetection as api.GoogleCloudVisionV1p2beta1WebDetection);
   }
   buildCounterGoogleCloudVisionV1p2beta1AnnotateImageResponse--;
 }
@@ -3067,7 +3189,8 @@
     api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse < 3) {
-    checkGoogleCloudVisionV1p2beta1OutputConfig(o.outputConfig);
+    checkGoogleCloudVisionV1p2beta1OutputConfig(
+        o.outputConfig as api.GoogleCloudVisionV1p2beta1OutputConfig);
   }
   buildCounterGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse--;
 }
@@ -3083,8 +3206,10 @@
 void checkUnnamed3038(
     core.List<api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse(o[0]);
-  checkGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse(o[1]);
+  checkGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse(
+      o[0] as api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse);
+  checkGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse(
+      o[1] as api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse =
@@ -3120,8 +3245,10 @@
 
 void checkUnnamed3039(core.List<api.GoogleCloudVisionV1p2beta1Paragraph> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1Paragraph(o[0]);
-  checkGoogleCloudVisionV1p2beta1Paragraph(o[1]);
+  checkGoogleCloudVisionV1p2beta1Paragraph(
+      o[0] as api.GoogleCloudVisionV1p2beta1Paragraph);
+  checkGoogleCloudVisionV1p2beta1Paragraph(
+      o[1] as api.GoogleCloudVisionV1p2beta1Paragraph);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1Block = 0;
@@ -3144,10 +3271,12 @@
   buildCounterGoogleCloudVisionV1p2beta1Block++;
   if (buildCounterGoogleCloudVisionV1p2beta1Block < 3) {
     unittest.expect(o.blockType, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed3039(o.paragraphs);
-    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty);
   }
   buildCounterGoogleCloudVisionV1p2beta1Block--;
 }
@@ -3162,8 +3291,10 @@
 void checkUnnamed3040(
     core.List<api.GoogleCloudVisionV1p2beta1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1NormalizedVertex(o[0]);
-  checkGoogleCloudVisionV1p2beta1NormalizedVertex(o[1]);
+  checkGoogleCloudVisionV1p2beta1NormalizedVertex(
+      o[0] as api.GoogleCloudVisionV1p2beta1NormalizedVertex);
+  checkGoogleCloudVisionV1p2beta1NormalizedVertex(
+      o[1] as api.GoogleCloudVisionV1p2beta1NormalizedVertex);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1Vertex> buildUnnamed3041() {
@@ -3175,8 +3306,10 @@
 
 void checkUnnamed3041(core.List<api.GoogleCloudVisionV1p2beta1Vertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1Vertex(o[0]);
-  checkGoogleCloudVisionV1p2beta1Vertex(o[1]);
+  checkGoogleCloudVisionV1p2beta1Vertex(
+      o[0] as api.GoogleCloudVisionV1p2beta1Vertex);
+  checkGoogleCloudVisionV1p2beta1Vertex(
+      o[1] as api.GoogleCloudVisionV1p2beta1Vertex);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1BoundingPoly = 0;
@@ -3220,7 +3353,7 @@
     api.GoogleCloudVisionV1p2beta1ColorInfo o) {
   buildCounterGoogleCloudVisionV1p2beta1ColorInfo++;
   if (buildCounterGoogleCloudVisionV1p2beta1ColorInfo < 3) {
-    checkColor(o.color);
+    checkColor(o.color as api.Color);
     unittest.expect(o.pixelFraction, unittest.equals(42.0));
     unittest.expect(o.score, unittest.equals(42.0));
   }
@@ -3245,7 +3378,8 @@
     api.GoogleCloudVisionV1p2beta1CropHint o) {
   buildCounterGoogleCloudVisionV1p2beta1CropHint++;
   if (buildCounterGoogleCloudVisionV1p2beta1CropHint < 3) {
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.importanceFraction, unittest.equals(42.0));
   }
@@ -3261,8 +3395,10 @@
 
 void checkUnnamed3042(core.List<api.GoogleCloudVisionV1p2beta1CropHint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1CropHint(o[0]);
-  checkGoogleCloudVisionV1p2beta1CropHint(o[1]);
+  checkGoogleCloudVisionV1p2beta1CropHint(
+      o[0] as api.GoogleCloudVisionV1p2beta1CropHint);
+  checkGoogleCloudVisionV1p2beta1CropHint(
+      o[1] as api.GoogleCloudVisionV1p2beta1CropHint);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1CropHintsAnnotation = 0;
@@ -3295,8 +3431,10 @@
 
 void checkUnnamed3043(core.List<api.GoogleCloudVisionV1p2beta1ColorInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1ColorInfo(o[0]);
-  checkGoogleCloudVisionV1p2beta1ColorInfo(o[1]);
+  checkGoogleCloudVisionV1p2beta1ColorInfo(
+      o[0] as api.GoogleCloudVisionV1p2beta1ColorInfo);
+  checkGoogleCloudVisionV1p2beta1ColorInfo(
+      o[1] as api.GoogleCloudVisionV1p2beta1ColorInfo);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1DominantColorsAnnotation = 0;
@@ -3329,8 +3467,10 @@
 
 void checkUnnamed3044(core.List<api.GoogleCloudVisionV1p2beta1LocationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1LocationInfo(o[0]);
-  checkGoogleCloudVisionV1p2beta1LocationInfo(o[1]);
+  checkGoogleCloudVisionV1p2beta1LocationInfo(
+      o[0] as api.GoogleCloudVisionV1p2beta1LocationInfo);
+  checkGoogleCloudVisionV1p2beta1LocationInfo(
+      o[1] as api.GoogleCloudVisionV1p2beta1LocationInfo);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1Property> buildUnnamed3045() {
@@ -3342,8 +3482,10 @@
 
 void checkUnnamed3045(core.List<api.GoogleCloudVisionV1p2beta1Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1Property(o[0]);
-  checkGoogleCloudVisionV1p2beta1Property(o[1]);
+  checkGoogleCloudVisionV1p2beta1Property(
+      o[0] as api.GoogleCloudVisionV1p2beta1Property);
+  checkGoogleCloudVisionV1p2beta1Property(
+      o[1] as api.GoogleCloudVisionV1p2beta1Property);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1EntityAnnotation = 0;
@@ -3370,7 +3512,8 @@
     api.GoogleCloudVisionV1p2beta1EntityAnnotation o) {
   buildCounterGoogleCloudVisionV1p2beta1EntityAnnotation++;
   if (buildCounterGoogleCloudVisionV1p2beta1EntityAnnotation < 3) {
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
@@ -3394,8 +3537,10 @@
 void checkUnnamed3046(
     core.List<api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1FaceAnnotationLandmark(o[0]);
-  checkGoogleCloudVisionV1p2beta1FaceAnnotationLandmark(o[1]);
+  checkGoogleCloudVisionV1p2beta1FaceAnnotationLandmark(
+      o[0] as api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark);
+  checkGoogleCloudVisionV1p2beta1FaceAnnotationLandmark(
+      o[1] as api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1FaceAnnotation = 0;
@@ -3430,9 +3575,11 @@
   if (buildCounterGoogleCloudVisionV1p2beta1FaceAnnotation < 3) {
     unittest.expect(o.angerLikelihood, unittest.equals('foo'));
     unittest.expect(o.blurredLikelihood, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.detectionConfidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.fdBoundingPoly);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.fdBoundingPoly as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.headwearLikelihood, unittest.equals('foo'));
     unittest.expect(o.joyLikelihood, unittest.equals('foo'));
     unittest.expect(o.landmarkingConfidence, unittest.equals(42.0));
@@ -3464,7 +3611,8 @@
     api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark o) {
   buildCounterGoogleCloudVisionV1p2beta1FaceAnnotationLandmark++;
   if (buildCounterGoogleCloudVisionV1p2beta1FaceAnnotationLandmark < 3) {
-    checkGoogleCloudVisionV1p2beta1Position(o.position);
+    checkGoogleCloudVisionV1p2beta1Position(
+        o.position as api.GoogleCloudVisionV1p2beta1Position);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p2beta1FaceAnnotationLandmark--;
@@ -3552,7 +3700,8 @@
     api.GoogleCloudVisionV1p2beta1ImageProperties o) {
   buildCounterGoogleCloudVisionV1p2beta1ImageProperties++;
   if (buildCounterGoogleCloudVisionV1p2beta1ImageProperties < 3) {
-    checkGoogleCloudVisionV1p2beta1DominantColorsAnnotation(o.dominantColors);
+    checkGoogleCloudVisionV1p2beta1DominantColorsAnnotation(o.dominantColors
+        as api.GoogleCloudVisionV1p2beta1DominantColorsAnnotation);
   }
   buildCounterGoogleCloudVisionV1p2beta1ImageProperties--;
 }
@@ -3576,7 +3725,8 @@
   buildCounterGoogleCloudVisionV1p2beta1InputConfig++;
   if (buildCounterGoogleCloudVisionV1p2beta1InputConfig < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p2beta1GcsSource(o.gcsSource);
+    checkGoogleCloudVisionV1p2beta1GcsSource(
+        o.gcsSource as api.GoogleCloudVisionV1p2beta1GcsSource);
     unittest.expect(o.mimeType, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p2beta1InputConfig--;
@@ -3602,7 +3752,8 @@
     api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation o) {
   buildCounterGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation++;
   if (buildCounterGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation < 3) {
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.mid, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -3627,7 +3778,7 @@
     api.GoogleCloudVisionV1p2beta1LocationInfo o) {
   buildCounterGoogleCloudVisionV1p2beta1LocationInfo++;
   if (buildCounterGoogleCloudVisionV1p2beta1LocationInfo < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
   }
   buildCounterGoogleCloudVisionV1p2beta1LocationInfo--;
 }
@@ -3698,7 +3849,8 @@
   buildCounterGoogleCloudVisionV1p2beta1OutputConfig++;
   if (buildCounterGoogleCloudVisionV1p2beta1OutputConfig < 3) {
     unittest.expect(o.batchSize, unittest.equals(42));
-    checkGoogleCloudVisionV1p2beta1GcsDestination(o.gcsDestination);
+    checkGoogleCloudVisionV1p2beta1GcsDestination(
+        o.gcsDestination as api.GoogleCloudVisionV1p2beta1GcsDestination);
   }
   buildCounterGoogleCloudVisionV1p2beta1OutputConfig--;
 }
@@ -3712,8 +3864,10 @@
 
 void checkUnnamed3047(core.List<api.GoogleCloudVisionV1p2beta1Block> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1Block(o[0]);
-  checkGoogleCloudVisionV1p2beta1Block(o[1]);
+  checkGoogleCloudVisionV1p2beta1Block(
+      o[0] as api.GoogleCloudVisionV1p2beta1Block);
+  checkGoogleCloudVisionV1p2beta1Block(
+      o[1] as api.GoogleCloudVisionV1p2beta1Block);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1Page = 0;
@@ -3737,7 +3891,8 @@
     checkUnnamed3047(o.blocks);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.height, unittest.equals(42));
-    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty);
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterGoogleCloudVisionV1p2beta1Page--;
@@ -3752,8 +3907,10 @@
 
 void checkUnnamed3048(core.List<api.GoogleCloudVisionV1p2beta1Word> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1Word(o[0]);
-  checkGoogleCloudVisionV1p2beta1Word(o[1]);
+  checkGoogleCloudVisionV1p2beta1Word(
+      o[0] as api.GoogleCloudVisionV1p2beta1Word);
+  checkGoogleCloudVisionV1p2beta1Word(
+      o[1] as api.GoogleCloudVisionV1p2beta1Word);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1Paragraph = 0;
@@ -3775,9 +3932,11 @@
     api.GoogleCloudVisionV1p2beta1Paragraph o) {
   buildCounterGoogleCloudVisionV1p2beta1Paragraph++;
   if (buildCounterGoogleCloudVisionV1p2beta1Paragraph < 3) {
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty);
     checkUnnamed3048(o.words);
   }
   buildCounterGoogleCloudVisionV1p2beta1Paragraph--;
@@ -3818,8 +3977,10 @@
 void checkUnnamed3049(
     core.List<api.GoogleCloudVisionV1p2beta1ProductKeyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1ProductKeyValue(o[0]);
-  checkGoogleCloudVisionV1p2beta1ProductKeyValue(o[1]);
+  checkGoogleCloudVisionV1p2beta1ProductKeyValue(
+      o[0] as api.GoogleCloudVisionV1p2beta1ProductKeyValue);
+  checkGoogleCloudVisionV1p2beta1ProductKeyValue(
+      o[1] as api.GoogleCloudVisionV1p2beta1ProductKeyValue);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1Product = 0;
@@ -3885,8 +4046,10 @@
     core.List<api.GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult(o[0]);
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult(o[1]);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult(
+      o[0] as api.GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult(
+      o[1] as api.GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult>
@@ -3900,8 +4063,10 @@
 void checkUnnamed3051(
     core.List<api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1ProductSearchResults = 0;
@@ -3943,8 +4108,10 @@
             api.GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation(o[0]
+      as api.GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation(o[1]
+      as api.GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult>
@@ -3958,8 +4125,10 @@
 void checkUnnamed3053(
     core.List<api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult);
 }
 
 core.int
@@ -3983,7 +4152,8 @@
   buildCounterGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult++;
   if (buildCounterGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult <
       3) {
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     checkUnnamed3052(o.objectAnnotations);
     checkUnnamed3053(o.results);
   }
@@ -4040,7 +4210,8 @@
   buildCounterGoogleCloudVisionV1p2beta1ProductSearchResultsResult++;
   if (buildCounterGoogleCloudVisionV1p2beta1ProductSearchResultsResult < 3) {
     unittest.expect(o.image, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p2beta1Product(o.product);
+    checkGoogleCloudVisionV1p2beta1Product(
+        o.product as api.GoogleCloudVisionV1p2beta1Product);
     unittest.expect(o.score, unittest.equals(42.0));
   }
   buildCounterGoogleCloudVisionV1p2beta1ProductSearchResultsResult--;
@@ -4118,9 +4289,11 @@
     api.GoogleCloudVisionV1p2beta1Symbol o) {
   buildCounterGoogleCloudVisionV1p2beta1Symbol++;
   if (buildCounterGoogleCloudVisionV1p2beta1Symbol < 3) {
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p2beta1Symbol--;
@@ -4135,8 +4308,10 @@
 
 void checkUnnamed3054(core.List<api.GoogleCloudVisionV1p2beta1Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1Page(o[0]);
-  checkGoogleCloudVisionV1p2beta1Page(o[1]);
+  checkGoogleCloudVisionV1p2beta1Page(
+      o[0] as api.GoogleCloudVisionV1p2beta1Page);
+  checkGoogleCloudVisionV1p2beta1Page(
+      o[1] as api.GoogleCloudVisionV1p2beta1Page);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1TextAnnotation = 0;
@@ -4222,8 +4397,10 @@
 void checkUnnamed3055(
     core.List<api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage(o[0]);
-  checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage(o[1]);
+  checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage(
+      o[0] as api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage);
+  checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage(
+      o[1] as api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1TextAnnotationTextProperty = 0;
@@ -4244,7 +4421,8 @@
     api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty o) {
   buildCounterGoogleCloudVisionV1p2beta1TextAnnotationTextProperty++;
   if (buildCounterGoogleCloudVisionV1p2beta1TextAnnotationTextProperty < 3) {
-    checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak(o.detectedBreak);
+    checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak(o.detectedBreak
+        as api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak);
     checkUnnamed3055(o.detectedLanguages);
   }
   buildCounterGoogleCloudVisionV1p2beta1TextAnnotationTextProperty--;
@@ -4283,8 +4461,10 @@
 void checkUnnamed3056(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebLabel(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebLabel(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebLabel(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebLabel);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebLabel(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebLabel);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage>
@@ -4298,8 +4478,10 @@
 void checkUnnamed3057(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebPage>
@@ -4313,8 +4495,10 @@
 void checkUnnamed3058(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebPage(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebPage(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebPage(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebPage);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebPage(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebPage);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage>
@@ -4328,8 +4512,10 @@
 void checkUnnamed3059(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage>
@@ -4343,8 +4529,10 @@
 void checkUnnamed3060(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity>
@@ -4358,8 +4546,10 @@
 void checkUnnamed3061(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebEntity(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebEntity(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebEntity(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebEntity(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1WebDetection = 0;
@@ -4475,8 +4665,10 @@
 void checkUnnamed3062(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage>
@@ -4490,8 +4682,10 @@
 void checkUnnamed3063(
     core.List<api.GoogleCloudVisionV1p2beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1WebDetectionWebPage = 0;
@@ -4532,8 +4726,10 @@
 
 void checkUnnamed3064(core.List<api.GoogleCloudVisionV1p2beta1Symbol> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p2beta1Symbol(o[0]);
-  checkGoogleCloudVisionV1p2beta1Symbol(o[1]);
+  checkGoogleCloudVisionV1p2beta1Symbol(
+      o[0] as api.GoogleCloudVisionV1p2beta1Symbol);
+  checkGoogleCloudVisionV1p2beta1Symbol(
+      o[1] as api.GoogleCloudVisionV1p2beta1Symbol);
 }
 
 core.int buildCounterGoogleCloudVisionV1p2beta1Word = 0;
@@ -4553,9 +4749,11 @@
 void checkGoogleCloudVisionV1p2beta1Word(api.GoogleCloudVisionV1p2beta1Word o) {
   buildCounterGoogleCloudVisionV1p2beta1Word++;
   if (buildCounterGoogleCloudVisionV1p2beta1Word < 3) {
-    checkGoogleCloudVisionV1p2beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p2beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty);
     checkUnnamed3064(o.symbols);
   }
   buildCounterGoogleCloudVisionV1p2beta1Word--;
@@ -4572,8 +4770,10 @@
 void checkUnnamed3065(
     core.List<api.GoogleCloudVisionV1p3beta1AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1AnnotateImageResponse(o[0]);
-  checkGoogleCloudVisionV1p3beta1AnnotateImageResponse(o[1]);
+  checkGoogleCloudVisionV1p3beta1AnnotateImageResponse(
+      o[0] as api.GoogleCloudVisionV1p3beta1AnnotateImageResponse);
+  checkGoogleCloudVisionV1p3beta1AnnotateImageResponse(
+      o[1] as api.GoogleCloudVisionV1p3beta1AnnotateImageResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1AnnotateFileResponse = 0;
@@ -4595,8 +4795,9 @@
     api.GoogleCloudVisionV1p3beta1AnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p3beta1AnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p3beta1AnnotateFileResponse < 3) {
-    checkStatus(o.error);
-    checkGoogleCloudVisionV1p3beta1InputConfig(o.inputConfig);
+    checkStatus(o.error as api.Status);
+    checkGoogleCloudVisionV1p3beta1InputConfig(
+        o.inputConfig as api.GoogleCloudVisionV1p3beta1InputConfig);
     checkUnnamed3065(o.responses);
     unittest.expect(o.totalPages, unittest.equals(42));
   }
@@ -4613,8 +4814,10 @@
 void checkUnnamed3066(
     core.List<api.GoogleCloudVisionV1p3beta1FaceAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1FaceAnnotation(o[0]);
-  checkGoogleCloudVisionV1p3beta1FaceAnnotation(o[1]);
+  checkGoogleCloudVisionV1p3beta1FaceAnnotation(
+      o[0] as api.GoogleCloudVisionV1p3beta1FaceAnnotation);
+  checkGoogleCloudVisionV1p3beta1FaceAnnotation(
+      o[1] as api.GoogleCloudVisionV1p3beta1FaceAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> buildUnnamed3067() {
@@ -4627,8 +4830,10 @@
 void checkUnnamed3067(
     core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> buildUnnamed3068() {
@@ -4641,8 +4846,10 @@
 void checkUnnamed3068(
     core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation>
@@ -4656,8 +4863,10 @@
 void checkUnnamed3069(
     core.List<api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation(
+      o[0] as api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation);
+  checkGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation(
+      o[1] as api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> buildUnnamed3070() {
@@ -4670,8 +4879,10 @@
 void checkUnnamed3070(
     core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> buildUnnamed3071() {
@@ -4684,8 +4895,10 @@
 void checkUnnamed3071(
     core.List<api.GoogleCloudVisionV1p3beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p3beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1AnnotateImageResponse = 0;
@@ -4721,20 +4934,27 @@
     api.GoogleCloudVisionV1p3beta1AnnotateImageResponse o) {
   buildCounterGoogleCloudVisionV1p3beta1AnnotateImageResponse++;
   if (buildCounterGoogleCloudVisionV1p3beta1AnnotateImageResponse < 3) {
-    checkGoogleCloudVisionV1p3beta1ImageAnnotationContext(o.context);
-    checkGoogleCloudVisionV1p3beta1CropHintsAnnotation(o.cropHintsAnnotation);
-    checkStatus(o.error);
+    checkGoogleCloudVisionV1p3beta1ImageAnnotationContext(
+        o.context as api.GoogleCloudVisionV1p3beta1ImageAnnotationContext);
+    checkGoogleCloudVisionV1p3beta1CropHintsAnnotation(o.cropHintsAnnotation
+        as api.GoogleCloudVisionV1p3beta1CropHintsAnnotation);
+    checkStatus(o.error as api.Status);
     checkUnnamed3066(o.faceAnnotations);
-    checkGoogleCloudVisionV1p3beta1TextAnnotation(o.fullTextAnnotation);
-    checkGoogleCloudVisionV1p3beta1ImageProperties(o.imagePropertiesAnnotation);
+    checkGoogleCloudVisionV1p3beta1TextAnnotation(
+        o.fullTextAnnotation as api.GoogleCloudVisionV1p3beta1TextAnnotation);
+    checkGoogleCloudVisionV1p3beta1ImageProperties(o.imagePropertiesAnnotation
+        as api.GoogleCloudVisionV1p3beta1ImageProperties);
     checkUnnamed3067(o.labelAnnotations);
     checkUnnamed3068(o.landmarkAnnotations);
     checkUnnamed3069(o.localizedObjectAnnotations);
     checkUnnamed3070(o.logoAnnotations);
-    checkGoogleCloudVisionV1p3beta1ProductSearchResults(o.productSearchResults);
-    checkGoogleCloudVisionV1p3beta1SafeSearchAnnotation(o.safeSearchAnnotation);
+    checkGoogleCloudVisionV1p3beta1ProductSearchResults(o.productSearchResults
+        as api.GoogleCloudVisionV1p3beta1ProductSearchResults);
+    checkGoogleCloudVisionV1p3beta1SafeSearchAnnotation(o.safeSearchAnnotation
+        as api.GoogleCloudVisionV1p3beta1SafeSearchAnnotation);
     checkUnnamed3071(o.textAnnotations);
-    checkGoogleCloudVisionV1p3beta1WebDetection(o.webDetection);
+    checkGoogleCloudVisionV1p3beta1WebDetection(
+        o.webDetection as api.GoogleCloudVisionV1p3beta1WebDetection);
   }
   buildCounterGoogleCloudVisionV1p3beta1AnnotateImageResponse--;
 }
@@ -4755,7 +4975,8 @@
     api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse < 3) {
-    checkGoogleCloudVisionV1p3beta1OutputConfig(o.outputConfig);
+    checkGoogleCloudVisionV1p3beta1OutputConfig(
+        o.outputConfig as api.GoogleCloudVisionV1p3beta1OutputConfig);
   }
   buildCounterGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse--;
 }
@@ -4771,8 +4992,10 @@
 void checkUnnamed3072(
     core.List<api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse(o[0]);
-  checkGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse(o[1]);
+  checkGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse(
+      o[0] as api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse);
+  checkGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse(
+      o[1] as api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse =
@@ -4833,8 +5056,10 @@
 
 void checkUnnamed3073(core.List<api.GoogleCloudVisionV1p3beta1Paragraph> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1Paragraph(o[0]);
-  checkGoogleCloudVisionV1p3beta1Paragraph(o[1]);
+  checkGoogleCloudVisionV1p3beta1Paragraph(
+      o[0] as api.GoogleCloudVisionV1p3beta1Paragraph);
+  checkGoogleCloudVisionV1p3beta1Paragraph(
+      o[1] as api.GoogleCloudVisionV1p3beta1Paragraph);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1Block = 0;
@@ -4857,10 +5082,12 @@
   buildCounterGoogleCloudVisionV1p3beta1Block++;
   if (buildCounterGoogleCloudVisionV1p3beta1Block < 3) {
     unittest.expect(o.blockType, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed3073(o.paragraphs);
-    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty);
   }
   buildCounterGoogleCloudVisionV1p3beta1Block--;
 }
@@ -4875,8 +5102,10 @@
 void checkUnnamed3074(
     core.List<api.GoogleCloudVisionV1p3beta1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1NormalizedVertex(o[0]);
-  checkGoogleCloudVisionV1p3beta1NormalizedVertex(o[1]);
+  checkGoogleCloudVisionV1p3beta1NormalizedVertex(
+      o[0] as api.GoogleCloudVisionV1p3beta1NormalizedVertex);
+  checkGoogleCloudVisionV1p3beta1NormalizedVertex(
+      o[1] as api.GoogleCloudVisionV1p3beta1NormalizedVertex);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1Vertex> buildUnnamed3075() {
@@ -4888,8 +5117,10 @@
 
 void checkUnnamed3075(core.List<api.GoogleCloudVisionV1p3beta1Vertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1Vertex(o[0]);
-  checkGoogleCloudVisionV1p3beta1Vertex(o[1]);
+  checkGoogleCloudVisionV1p3beta1Vertex(
+      o[0] as api.GoogleCloudVisionV1p3beta1Vertex);
+  checkGoogleCloudVisionV1p3beta1Vertex(
+      o[1] as api.GoogleCloudVisionV1p3beta1Vertex);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1BoundingPoly = 0;
@@ -4933,7 +5164,7 @@
     api.GoogleCloudVisionV1p3beta1ColorInfo o) {
   buildCounterGoogleCloudVisionV1p3beta1ColorInfo++;
   if (buildCounterGoogleCloudVisionV1p3beta1ColorInfo < 3) {
-    checkColor(o.color);
+    checkColor(o.color as api.Color);
     unittest.expect(o.pixelFraction, unittest.equals(42.0));
     unittest.expect(o.score, unittest.equals(42.0));
   }
@@ -4958,7 +5189,8 @@
     api.GoogleCloudVisionV1p3beta1CropHint o) {
   buildCounterGoogleCloudVisionV1p3beta1CropHint++;
   if (buildCounterGoogleCloudVisionV1p3beta1CropHint < 3) {
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.importanceFraction, unittest.equals(42.0));
   }
@@ -4974,8 +5206,10 @@
 
 void checkUnnamed3076(core.List<api.GoogleCloudVisionV1p3beta1CropHint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1CropHint(o[0]);
-  checkGoogleCloudVisionV1p3beta1CropHint(o[1]);
+  checkGoogleCloudVisionV1p3beta1CropHint(
+      o[0] as api.GoogleCloudVisionV1p3beta1CropHint);
+  checkGoogleCloudVisionV1p3beta1CropHint(
+      o[1] as api.GoogleCloudVisionV1p3beta1CropHint);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1CropHintsAnnotation = 0;
@@ -5008,8 +5242,10 @@
 
 void checkUnnamed3077(core.List<api.GoogleCloudVisionV1p3beta1ColorInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1ColorInfo(o[0]);
-  checkGoogleCloudVisionV1p3beta1ColorInfo(o[1]);
+  checkGoogleCloudVisionV1p3beta1ColorInfo(
+      o[0] as api.GoogleCloudVisionV1p3beta1ColorInfo);
+  checkGoogleCloudVisionV1p3beta1ColorInfo(
+      o[1] as api.GoogleCloudVisionV1p3beta1ColorInfo);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1DominantColorsAnnotation = 0;
@@ -5042,8 +5278,10 @@
 
 void checkUnnamed3078(core.List<api.GoogleCloudVisionV1p3beta1LocationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1LocationInfo(o[0]);
-  checkGoogleCloudVisionV1p3beta1LocationInfo(o[1]);
+  checkGoogleCloudVisionV1p3beta1LocationInfo(
+      o[0] as api.GoogleCloudVisionV1p3beta1LocationInfo);
+  checkGoogleCloudVisionV1p3beta1LocationInfo(
+      o[1] as api.GoogleCloudVisionV1p3beta1LocationInfo);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1Property> buildUnnamed3079() {
@@ -5055,8 +5293,10 @@
 
 void checkUnnamed3079(core.List<api.GoogleCloudVisionV1p3beta1Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1Property(o[0]);
-  checkGoogleCloudVisionV1p3beta1Property(o[1]);
+  checkGoogleCloudVisionV1p3beta1Property(
+      o[0] as api.GoogleCloudVisionV1p3beta1Property);
+  checkGoogleCloudVisionV1p3beta1Property(
+      o[1] as api.GoogleCloudVisionV1p3beta1Property);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1EntityAnnotation = 0;
@@ -5083,7 +5323,8 @@
     api.GoogleCloudVisionV1p3beta1EntityAnnotation o) {
   buildCounterGoogleCloudVisionV1p3beta1EntityAnnotation++;
   if (buildCounterGoogleCloudVisionV1p3beta1EntityAnnotation < 3) {
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
@@ -5107,8 +5348,10 @@
 void checkUnnamed3080(
     core.List<api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1FaceAnnotationLandmark(o[0]);
-  checkGoogleCloudVisionV1p3beta1FaceAnnotationLandmark(o[1]);
+  checkGoogleCloudVisionV1p3beta1FaceAnnotationLandmark(
+      o[0] as api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark);
+  checkGoogleCloudVisionV1p3beta1FaceAnnotationLandmark(
+      o[1] as api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1FaceAnnotation = 0;
@@ -5143,9 +5386,11 @@
   if (buildCounterGoogleCloudVisionV1p3beta1FaceAnnotation < 3) {
     unittest.expect(o.angerLikelihood, unittest.equals('foo'));
     unittest.expect(o.blurredLikelihood, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.detectionConfidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.fdBoundingPoly);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.fdBoundingPoly as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.headwearLikelihood, unittest.equals('foo'));
     unittest.expect(o.joyLikelihood, unittest.equals('foo'));
     unittest.expect(o.landmarkingConfidence, unittest.equals(42.0));
@@ -5177,7 +5422,8 @@
     api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark o) {
   buildCounterGoogleCloudVisionV1p3beta1FaceAnnotationLandmark++;
   if (buildCounterGoogleCloudVisionV1p3beta1FaceAnnotationLandmark < 3) {
-    checkGoogleCloudVisionV1p3beta1Position(o.position);
+    checkGoogleCloudVisionV1p3beta1Position(
+        o.position as api.GoogleCloudVisionV1p3beta1Position);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p3beta1FaceAnnotationLandmark--;
@@ -5265,7 +5511,8 @@
     api.GoogleCloudVisionV1p3beta1ImageProperties o) {
   buildCounterGoogleCloudVisionV1p3beta1ImageProperties++;
   if (buildCounterGoogleCloudVisionV1p3beta1ImageProperties < 3) {
-    checkGoogleCloudVisionV1p3beta1DominantColorsAnnotation(o.dominantColors);
+    checkGoogleCloudVisionV1p3beta1DominantColorsAnnotation(o.dominantColors
+        as api.GoogleCloudVisionV1p3beta1DominantColorsAnnotation);
   }
   buildCounterGoogleCloudVisionV1p3beta1ImageProperties--;
 }
@@ -5280,8 +5527,10 @@
 void checkUnnamed3081(
     core.List<api.GoogleCloudVisionV1p3beta1ReferenceImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1ReferenceImage(o[0]);
-  checkGoogleCloudVisionV1p3beta1ReferenceImage(o[1]);
+  checkGoogleCloudVisionV1p3beta1ReferenceImage(
+      o[0] as api.GoogleCloudVisionV1p3beta1ReferenceImage);
+  checkGoogleCloudVisionV1p3beta1ReferenceImage(
+      o[1] as api.GoogleCloudVisionV1p3beta1ReferenceImage);
 }
 
 core.List<api.Status> buildUnnamed3082() {
@@ -5293,8 +5542,8 @@
 
 void checkUnnamed3082(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1ImportProductSetsResponse = 0;
@@ -5339,7 +5588,8 @@
   buildCounterGoogleCloudVisionV1p3beta1InputConfig++;
   if (buildCounterGoogleCloudVisionV1p3beta1InputConfig < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p3beta1GcsSource(o.gcsSource);
+    checkGoogleCloudVisionV1p3beta1GcsSource(
+        o.gcsSource as api.GoogleCloudVisionV1p3beta1GcsSource);
     unittest.expect(o.mimeType, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p3beta1InputConfig--;
@@ -5365,7 +5615,8 @@
     api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation o) {
   buildCounterGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation++;
   if (buildCounterGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation < 3) {
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.mid, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -5390,7 +5641,7 @@
     api.GoogleCloudVisionV1p3beta1LocationInfo o) {
   buildCounterGoogleCloudVisionV1p3beta1LocationInfo++;
   if (buildCounterGoogleCloudVisionV1p3beta1LocationInfo < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
   }
   buildCounterGoogleCloudVisionV1p3beta1LocationInfo--;
 }
@@ -5461,7 +5712,8 @@
   buildCounterGoogleCloudVisionV1p3beta1OutputConfig++;
   if (buildCounterGoogleCloudVisionV1p3beta1OutputConfig < 3) {
     unittest.expect(o.batchSize, unittest.equals(42));
-    checkGoogleCloudVisionV1p3beta1GcsDestination(o.gcsDestination);
+    checkGoogleCloudVisionV1p3beta1GcsDestination(
+        o.gcsDestination as api.GoogleCloudVisionV1p3beta1GcsDestination);
   }
   buildCounterGoogleCloudVisionV1p3beta1OutputConfig--;
 }
@@ -5475,8 +5727,10 @@
 
 void checkUnnamed3083(core.List<api.GoogleCloudVisionV1p3beta1Block> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1Block(o[0]);
-  checkGoogleCloudVisionV1p3beta1Block(o[1]);
+  checkGoogleCloudVisionV1p3beta1Block(
+      o[0] as api.GoogleCloudVisionV1p3beta1Block);
+  checkGoogleCloudVisionV1p3beta1Block(
+      o[1] as api.GoogleCloudVisionV1p3beta1Block);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1Page = 0;
@@ -5500,7 +5754,8 @@
     checkUnnamed3083(o.blocks);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.height, unittest.equals(42));
-    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty);
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterGoogleCloudVisionV1p3beta1Page--;
@@ -5515,8 +5770,10 @@
 
 void checkUnnamed3084(core.List<api.GoogleCloudVisionV1p3beta1Word> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1Word(o[0]);
-  checkGoogleCloudVisionV1p3beta1Word(o[1]);
+  checkGoogleCloudVisionV1p3beta1Word(
+      o[0] as api.GoogleCloudVisionV1p3beta1Word);
+  checkGoogleCloudVisionV1p3beta1Word(
+      o[1] as api.GoogleCloudVisionV1p3beta1Word);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1Paragraph = 0;
@@ -5538,9 +5795,11 @@
     api.GoogleCloudVisionV1p3beta1Paragraph o) {
   buildCounterGoogleCloudVisionV1p3beta1Paragraph++;
   if (buildCounterGoogleCloudVisionV1p3beta1Paragraph < 3) {
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty);
     checkUnnamed3084(o.words);
   }
   buildCounterGoogleCloudVisionV1p3beta1Paragraph--;
@@ -5581,8 +5840,10 @@
 void checkUnnamed3085(
     core.List<api.GoogleCloudVisionV1p3beta1ProductKeyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1ProductKeyValue(o[0]);
-  checkGoogleCloudVisionV1p3beta1ProductKeyValue(o[1]);
+  checkGoogleCloudVisionV1p3beta1ProductKeyValue(
+      o[0] as api.GoogleCloudVisionV1p3beta1ProductKeyValue);
+  checkGoogleCloudVisionV1p3beta1ProductKeyValue(
+      o[1] as api.GoogleCloudVisionV1p3beta1ProductKeyValue);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1Product = 0;
@@ -5648,8 +5909,10 @@
     core.List<api.GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult(o[0]);
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult(o[1]);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult(
+      o[0] as api.GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult(
+      o[1] as api.GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult>
@@ -5663,8 +5926,10 @@
 void checkUnnamed3087(
     core.List<api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1ProductSearchResults = 0;
@@ -5706,8 +5971,10 @@
             api.GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation(o[0]
+      as api.GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation(o[1]
+      as api.GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult>
@@ -5721,8 +5988,10 @@
 void checkUnnamed3089(
     core.List<api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult);
 }
 
 core.int
@@ -5746,7 +6015,8 @@
   buildCounterGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult++;
   if (buildCounterGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult <
       3) {
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     checkUnnamed3088(o.objectAnnotations);
     checkUnnamed3089(o.results);
   }
@@ -5803,7 +6073,8 @@
   buildCounterGoogleCloudVisionV1p3beta1ProductSearchResultsResult++;
   if (buildCounterGoogleCloudVisionV1p3beta1ProductSearchResultsResult < 3) {
     unittest.expect(o.image, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p3beta1Product(o.product);
+    checkGoogleCloudVisionV1p3beta1Product(
+        o.product as api.GoogleCloudVisionV1p3beta1Product);
     unittest.expect(o.score, unittest.equals(42.0));
   }
   buildCounterGoogleCloudVisionV1p3beta1ProductSearchResultsResult--;
@@ -5843,8 +6114,10 @@
 
 void checkUnnamed3090(core.List<api.GoogleCloudVisionV1p3beta1BoundingPoly> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1BoundingPoly(o[0]);
-  checkGoogleCloudVisionV1p3beta1BoundingPoly(o[1]);
+  checkGoogleCloudVisionV1p3beta1BoundingPoly(
+      o[0] as api.GoogleCloudVisionV1p3beta1BoundingPoly);
+  checkGoogleCloudVisionV1p3beta1BoundingPoly(
+      o[1] as api.GoogleCloudVisionV1p3beta1BoundingPoly);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1ReferenceImage = 0;
@@ -5919,9 +6192,11 @@
     api.GoogleCloudVisionV1p3beta1Symbol o) {
   buildCounterGoogleCloudVisionV1p3beta1Symbol++;
   if (buildCounterGoogleCloudVisionV1p3beta1Symbol < 3) {
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p3beta1Symbol--;
@@ -5936,8 +6211,10 @@
 
 void checkUnnamed3091(core.List<api.GoogleCloudVisionV1p3beta1Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1Page(o[0]);
-  checkGoogleCloudVisionV1p3beta1Page(o[1]);
+  checkGoogleCloudVisionV1p3beta1Page(
+      o[0] as api.GoogleCloudVisionV1p3beta1Page);
+  checkGoogleCloudVisionV1p3beta1Page(
+      o[1] as api.GoogleCloudVisionV1p3beta1Page);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1TextAnnotation = 0;
@@ -6023,8 +6300,10 @@
 void checkUnnamed3092(
     core.List<api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage(o[0]);
-  checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage(o[1]);
+  checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage(
+      o[0] as api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage);
+  checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage(
+      o[1] as api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1TextAnnotationTextProperty = 0;
@@ -6045,7 +6324,8 @@
     api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty o) {
   buildCounterGoogleCloudVisionV1p3beta1TextAnnotationTextProperty++;
   if (buildCounterGoogleCloudVisionV1p3beta1TextAnnotationTextProperty < 3) {
-    checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak(o.detectedBreak);
+    checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak(o.detectedBreak
+        as api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak);
     checkUnnamed3092(o.detectedLanguages);
   }
   buildCounterGoogleCloudVisionV1p3beta1TextAnnotationTextProperty--;
@@ -6084,8 +6364,10 @@
 void checkUnnamed3093(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebLabel(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebLabel(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebLabel(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebLabel);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebLabel(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebLabel);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage>
@@ -6099,8 +6381,10 @@
 void checkUnnamed3094(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebPage>
@@ -6114,8 +6398,10 @@
 void checkUnnamed3095(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebPage(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebPage(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebPage(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebPage);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebPage(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebPage);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage>
@@ -6129,8 +6415,10 @@
 void checkUnnamed3096(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage>
@@ -6144,8 +6432,10 @@
 void checkUnnamed3097(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity>
@@ -6159,8 +6449,10 @@
 void checkUnnamed3098(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebEntity(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebEntity(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebEntity(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebEntity(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1WebDetection = 0;
@@ -6276,8 +6568,10 @@
 void checkUnnamed3099(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage>
@@ -6291,8 +6585,10 @@
 void checkUnnamed3100(
     core.List<api.GoogleCloudVisionV1p3beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1WebDetectionWebPage = 0;
@@ -6333,8 +6629,10 @@
 
 void checkUnnamed3101(core.List<api.GoogleCloudVisionV1p3beta1Symbol> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p3beta1Symbol(o[0]);
-  checkGoogleCloudVisionV1p3beta1Symbol(o[1]);
+  checkGoogleCloudVisionV1p3beta1Symbol(
+      o[0] as api.GoogleCloudVisionV1p3beta1Symbol);
+  checkGoogleCloudVisionV1p3beta1Symbol(
+      o[1] as api.GoogleCloudVisionV1p3beta1Symbol);
 }
 
 core.int buildCounterGoogleCloudVisionV1p3beta1Word = 0;
@@ -6354,9 +6652,11 @@
 void checkGoogleCloudVisionV1p3beta1Word(api.GoogleCloudVisionV1p3beta1Word o) {
   buildCounterGoogleCloudVisionV1p3beta1Word++;
   if (buildCounterGoogleCloudVisionV1p3beta1Word < 3) {
-    checkGoogleCloudVisionV1p3beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p3beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty);
     checkUnnamed3101(o.symbols);
   }
   buildCounterGoogleCloudVisionV1p3beta1Word--;
@@ -6373,8 +6673,10 @@
 void checkUnnamed3102(
     core.List<api.GoogleCloudVisionV1p4beta1AnnotateImageResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1AnnotateImageResponse(o[0]);
-  checkGoogleCloudVisionV1p4beta1AnnotateImageResponse(o[1]);
+  checkGoogleCloudVisionV1p4beta1AnnotateImageResponse(
+      o[0] as api.GoogleCloudVisionV1p4beta1AnnotateImageResponse);
+  checkGoogleCloudVisionV1p4beta1AnnotateImageResponse(
+      o[1] as api.GoogleCloudVisionV1p4beta1AnnotateImageResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1AnnotateFileResponse = 0;
@@ -6396,8 +6698,9 @@
     api.GoogleCloudVisionV1p4beta1AnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p4beta1AnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p4beta1AnnotateFileResponse < 3) {
-    checkStatus(o.error);
-    checkGoogleCloudVisionV1p4beta1InputConfig(o.inputConfig);
+    checkStatus(o.error as api.Status);
+    checkGoogleCloudVisionV1p4beta1InputConfig(
+        o.inputConfig as api.GoogleCloudVisionV1p4beta1InputConfig);
     checkUnnamed3102(o.responses);
     unittest.expect(o.totalPages, unittest.equals(42));
   }
@@ -6414,8 +6717,10 @@
 void checkUnnamed3103(
     core.List<api.GoogleCloudVisionV1p4beta1FaceAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1FaceAnnotation(o[0]);
-  checkGoogleCloudVisionV1p4beta1FaceAnnotation(o[1]);
+  checkGoogleCloudVisionV1p4beta1FaceAnnotation(
+      o[0] as api.GoogleCloudVisionV1p4beta1FaceAnnotation);
+  checkGoogleCloudVisionV1p4beta1FaceAnnotation(
+      o[1] as api.GoogleCloudVisionV1p4beta1FaceAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> buildUnnamed3104() {
@@ -6428,8 +6733,10 @@
 void checkUnnamed3104(
     core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> buildUnnamed3105() {
@@ -6442,8 +6749,10 @@
 void checkUnnamed3105(
     core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation>
@@ -6457,8 +6766,10 @@
 void checkUnnamed3106(
     core.List<api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation(
+      o[0] as api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation);
+  checkGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation(
+      o[1] as api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> buildUnnamed3107() {
@@ -6471,8 +6782,10 @@
 void checkUnnamed3107(
     core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> buildUnnamed3108() {
@@ -6485,8 +6798,10 @@
 void checkUnnamed3108(
     core.List<api.GoogleCloudVisionV1p4beta1EntityAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[0]);
-  checkGoogleCloudVisionV1p4beta1EntityAnnotation(o[1]);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[0] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
+  checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+      o[1] as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1AnnotateImageResponse = 0;
@@ -6522,20 +6837,27 @@
     api.GoogleCloudVisionV1p4beta1AnnotateImageResponse o) {
   buildCounterGoogleCloudVisionV1p4beta1AnnotateImageResponse++;
   if (buildCounterGoogleCloudVisionV1p4beta1AnnotateImageResponse < 3) {
-    checkGoogleCloudVisionV1p4beta1ImageAnnotationContext(o.context);
-    checkGoogleCloudVisionV1p4beta1CropHintsAnnotation(o.cropHintsAnnotation);
-    checkStatus(o.error);
+    checkGoogleCloudVisionV1p4beta1ImageAnnotationContext(
+        o.context as api.GoogleCloudVisionV1p4beta1ImageAnnotationContext);
+    checkGoogleCloudVisionV1p4beta1CropHintsAnnotation(o.cropHintsAnnotation
+        as api.GoogleCloudVisionV1p4beta1CropHintsAnnotation);
+    checkStatus(o.error as api.Status);
     checkUnnamed3103(o.faceAnnotations);
-    checkGoogleCloudVisionV1p4beta1TextAnnotation(o.fullTextAnnotation);
-    checkGoogleCloudVisionV1p4beta1ImageProperties(o.imagePropertiesAnnotation);
+    checkGoogleCloudVisionV1p4beta1TextAnnotation(
+        o.fullTextAnnotation as api.GoogleCloudVisionV1p4beta1TextAnnotation);
+    checkGoogleCloudVisionV1p4beta1ImageProperties(o.imagePropertiesAnnotation
+        as api.GoogleCloudVisionV1p4beta1ImageProperties);
     checkUnnamed3104(o.labelAnnotations);
     checkUnnamed3105(o.landmarkAnnotations);
     checkUnnamed3106(o.localizedObjectAnnotations);
     checkUnnamed3107(o.logoAnnotations);
-    checkGoogleCloudVisionV1p4beta1ProductSearchResults(o.productSearchResults);
-    checkGoogleCloudVisionV1p4beta1SafeSearchAnnotation(o.safeSearchAnnotation);
+    checkGoogleCloudVisionV1p4beta1ProductSearchResults(o.productSearchResults
+        as api.GoogleCloudVisionV1p4beta1ProductSearchResults);
+    checkGoogleCloudVisionV1p4beta1SafeSearchAnnotation(o.safeSearchAnnotation
+        as api.GoogleCloudVisionV1p4beta1SafeSearchAnnotation);
     checkUnnamed3108(o.textAnnotations);
-    checkGoogleCloudVisionV1p4beta1WebDetection(o.webDetection);
+    checkGoogleCloudVisionV1p4beta1WebDetection(
+        o.webDetection as api.GoogleCloudVisionV1p4beta1WebDetection);
   }
   buildCounterGoogleCloudVisionV1p4beta1AnnotateImageResponse--;
 }
@@ -6556,7 +6878,8 @@
     api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse o) {
   buildCounterGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse++;
   if (buildCounterGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse < 3) {
-    checkGoogleCloudVisionV1p4beta1OutputConfig(o.outputConfig);
+    checkGoogleCloudVisionV1p4beta1OutputConfig(
+        o.outputConfig as api.GoogleCloudVisionV1p4beta1OutputConfig);
   }
   buildCounterGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse--;
 }
@@ -6572,8 +6895,10 @@
 void checkUnnamed3109(
     core.List<api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse(o[0]);
-  checkGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse(o[1]);
+  checkGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse(
+      o[0] as api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse);
+  checkGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse(
+      o[1] as api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse =
@@ -6619,7 +6944,8 @@
   buildCounterGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse++;
   if (buildCounterGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse <
       3) {
-    checkGoogleCloudVisionV1p4beta1OutputConfig(o.outputConfig);
+    checkGoogleCloudVisionV1p4beta1OutputConfig(
+        o.outputConfig as api.GoogleCloudVisionV1p4beta1OutputConfig);
   }
   buildCounterGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse--;
 }
@@ -6635,8 +6961,10 @@
 void checkUnnamed3110(
     core.List<api.GoogleCloudVisionV1p4beta1AnnotateFileResponse> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1AnnotateFileResponse(o[0]);
-  checkGoogleCloudVisionV1p4beta1AnnotateFileResponse(o[1]);
+  checkGoogleCloudVisionV1p4beta1AnnotateFileResponse(
+      o[0] as api.GoogleCloudVisionV1p4beta1AnnotateFileResponse);
+  checkGoogleCloudVisionV1p4beta1AnnotateFileResponse(
+      o[1] as api.GoogleCloudVisionV1p4beta1AnnotateFileResponse);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse = 0;
@@ -6694,8 +7022,10 @@
 
 void checkUnnamed3111(core.List<api.GoogleCloudVisionV1p4beta1Paragraph> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1Paragraph(o[0]);
-  checkGoogleCloudVisionV1p4beta1Paragraph(o[1]);
+  checkGoogleCloudVisionV1p4beta1Paragraph(
+      o[0] as api.GoogleCloudVisionV1p4beta1Paragraph);
+  checkGoogleCloudVisionV1p4beta1Paragraph(
+      o[1] as api.GoogleCloudVisionV1p4beta1Paragraph);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1Block = 0;
@@ -6718,10 +7048,12 @@
   buildCounterGoogleCloudVisionV1p4beta1Block++;
   if (buildCounterGoogleCloudVisionV1p4beta1Block < 3) {
     unittest.expect(o.blockType, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     checkUnnamed3111(o.paragraphs);
-    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty);
   }
   buildCounterGoogleCloudVisionV1p4beta1Block--;
 }
@@ -6736,8 +7068,10 @@
 void checkUnnamed3112(
     core.List<api.GoogleCloudVisionV1p4beta1NormalizedVertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1NormalizedVertex(o[0]);
-  checkGoogleCloudVisionV1p4beta1NormalizedVertex(o[1]);
+  checkGoogleCloudVisionV1p4beta1NormalizedVertex(
+      o[0] as api.GoogleCloudVisionV1p4beta1NormalizedVertex);
+  checkGoogleCloudVisionV1p4beta1NormalizedVertex(
+      o[1] as api.GoogleCloudVisionV1p4beta1NormalizedVertex);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1Vertex> buildUnnamed3113() {
@@ -6749,8 +7083,10 @@
 
 void checkUnnamed3113(core.List<api.GoogleCloudVisionV1p4beta1Vertex> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1Vertex(o[0]);
-  checkGoogleCloudVisionV1p4beta1Vertex(o[1]);
+  checkGoogleCloudVisionV1p4beta1Vertex(
+      o[0] as api.GoogleCloudVisionV1p4beta1Vertex);
+  checkGoogleCloudVisionV1p4beta1Vertex(
+      o[1] as api.GoogleCloudVisionV1p4beta1Vertex);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1BoundingPoly = 0;
@@ -6819,7 +7155,7 @@
     api.GoogleCloudVisionV1p4beta1ColorInfo o) {
   buildCounterGoogleCloudVisionV1p4beta1ColorInfo++;
   if (buildCounterGoogleCloudVisionV1p4beta1ColorInfo < 3) {
-    checkColor(o.color);
+    checkColor(o.color as api.Color);
     unittest.expect(o.pixelFraction, unittest.equals(42.0));
     unittest.expect(o.score, unittest.equals(42.0));
   }
@@ -6844,7 +7180,8 @@
     api.GoogleCloudVisionV1p4beta1CropHint o) {
   buildCounterGoogleCloudVisionV1p4beta1CropHint++;
   if (buildCounterGoogleCloudVisionV1p4beta1CropHint < 3) {
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.importanceFraction, unittest.equals(42.0));
   }
@@ -6860,8 +7197,10 @@
 
 void checkUnnamed3114(core.List<api.GoogleCloudVisionV1p4beta1CropHint> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1CropHint(o[0]);
-  checkGoogleCloudVisionV1p4beta1CropHint(o[1]);
+  checkGoogleCloudVisionV1p4beta1CropHint(
+      o[0] as api.GoogleCloudVisionV1p4beta1CropHint);
+  checkGoogleCloudVisionV1p4beta1CropHint(
+      o[1] as api.GoogleCloudVisionV1p4beta1CropHint);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1CropHintsAnnotation = 0;
@@ -6894,8 +7233,10 @@
 
 void checkUnnamed3115(core.List<api.GoogleCloudVisionV1p4beta1ColorInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1ColorInfo(o[0]);
-  checkGoogleCloudVisionV1p4beta1ColorInfo(o[1]);
+  checkGoogleCloudVisionV1p4beta1ColorInfo(
+      o[0] as api.GoogleCloudVisionV1p4beta1ColorInfo);
+  checkGoogleCloudVisionV1p4beta1ColorInfo(
+      o[1] as api.GoogleCloudVisionV1p4beta1ColorInfo);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1DominantColorsAnnotation = 0;
@@ -6928,8 +7269,10 @@
 
 void checkUnnamed3116(core.List<api.GoogleCloudVisionV1p4beta1LocationInfo> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1LocationInfo(o[0]);
-  checkGoogleCloudVisionV1p4beta1LocationInfo(o[1]);
+  checkGoogleCloudVisionV1p4beta1LocationInfo(
+      o[0] as api.GoogleCloudVisionV1p4beta1LocationInfo);
+  checkGoogleCloudVisionV1p4beta1LocationInfo(
+      o[1] as api.GoogleCloudVisionV1p4beta1LocationInfo);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1Property> buildUnnamed3117() {
@@ -6941,8 +7284,10 @@
 
 void checkUnnamed3117(core.List<api.GoogleCloudVisionV1p4beta1Property> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1Property(o[0]);
-  checkGoogleCloudVisionV1p4beta1Property(o[1]);
+  checkGoogleCloudVisionV1p4beta1Property(
+      o[0] as api.GoogleCloudVisionV1p4beta1Property);
+  checkGoogleCloudVisionV1p4beta1Property(
+      o[1] as api.GoogleCloudVisionV1p4beta1Property);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1EntityAnnotation = 0;
@@ -6969,7 +7314,8 @@
     api.GoogleCloudVisionV1p4beta1EntityAnnotation o) {
   buildCounterGoogleCloudVisionV1p4beta1EntityAnnotation++;
   if (buildCounterGoogleCloudVisionV1p4beta1EntityAnnotation < 3) {
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.locale, unittest.equals('foo'));
@@ -6993,8 +7339,10 @@
 void checkUnnamed3118(
     core.List<api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1FaceAnnotationLandmark(o[0]);
-  checkGoogleCloudVisionV1p4beta1FaceAnnotationLandmark(o[1]);
+  checkGoogleCloudVisionV1p4beta1FaceAnnotationLandmark(
+      o[0] as api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark);
+  checkGoogleCloudVisionV1p4beta1FaceAnnotationLandmark(
+      o[1] as api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1FaceRecognitionResult>
@@ -7008,8 +7356,10 @@
 void checkUnnamed3119(
     core.List<api.GoogleCloudVisionV1p4beta1FaceRecognitionResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1FaceRecognitionResult(o[0]);
-  checkGoogleCloudVisionV1p4beta1FaceRecognitionResult(o[1]);
+  checkGoogleCloudVisionV1p4beta1FaceRecognitionResult(
+      o[0] as api.GoogleCloudVisionV1p4beta1FaceRecognitionResult);
+  checkGoogleCloudVisionV1p4beta1FaceRecognitionResult(
+      o[1] as api.GoogleCloudVisionV1p4beta1FaceRecognitionResult);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1FaceAnnotation = 0;
@@ -7045,9 +7395,11 @@
   if (buildCounterGoogleCloudVisionV1p4beta1FaceAnnotation < 3) {
     unittest.expect(o.angerLikelihood, unittest.equals('foo'));
     unittest.expect(o.blurredLikelihood, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.detectionConfidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.fdBoundingPoly);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.fdBoundingPoly as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.headwearLikelihood, unittest.equals('foo'));
     unittest.expect(o.joyLikelihood, unittest.equals('foo'));
     unittest.expect(o.landmarkingConfidence, unittest.equals(42.0));
@@ -7080,7 +7432,8 @@
     api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark o) {
   buildCounterGoogleCloudVisionV1p4beta1FaceAnnotationLandmark++;
   if (buildCounterGoogleCloudVisionV1p4beta1FaceAnnotationLandmark < 3) {
-    checkGoogleCloudVisionV1p4beta1Position(o.position);
+    checkGoogleCloudVisionV1p4beta1Position(
+        o.position as api.GoogleCloudVisionV1p4beta1Position);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p4beta1FaceAnnotationLandmark--;
@@ -7103,7 +7456,8 @@
     api.GoogleCloudVisionV1p4beta1FaceRecognitionResult o) {
   buildCounterGoogleCloudVisionV1p4beta1FaceRecognitionResult++;
   if (buildCounterGoogleCloudVisionV1p4beta1FaceRecognitionResult < 3) {
-    checkGoogleCloudVisionV1p4beta1Celebrity(o.celebrity);
+    checkGoogleCloudVisionV1p4beta1Celebrity(
+        o.celebrity as api.GoogleCloudVisionV1p4beta1Celebrity);
     unittest.expect(o.confidence, unittest.equals(42.0));
   }
   buildCounterGoogleCloudVisionV1p4beta1FaceRecognitionResult--;
@@ -7191,7 +7545,8 @@
     api.GoogleCloudVisionV1p4beta1ImageProperties o) {
   buildCounterGoogleCloudVisionV1p4beta1ImageProperties++;
   if (buildCounterGoogleCloudVisionV1p4beta1ImageProperties < 3) {
-    checkGoogleCloudVisionV1p4beta1DominantColorsAnnotation(o.dominantColors);
+    checkGoogleCloudVisionV1p4beta1DominantColorsAnnotation(o.dominantColors
+        as api.GoogleCloudVisionV1p4beta1DominantColorsAnnotation);
   }
   buildCounterGoogleCloudVisionV1p4beta1ImageProperties--;
 }
@@ -7206,8 +7561,10 @@
 void checkUnnamed3120(
     core.List<api.GoogleCloudVisionV1p4beta1ReferenceImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1ReferenceImage(o[0]);
-  checkGoogleCloudVisionV1p4beta1ReferenceImage(o[1]);
+  checkGoogleCloudVisionV1p4beta1ReferenceImage(
+      o[0] as api.GoogleCloudVisionV1p4beta1ReferenceImage);
+  checkGoogleCloudVisionV1p4beta1ReferenceImage(
+      o[1] as api.GoogleCloudVisionV1p4beta1ReferenceImage);
 }
 
 core.List<api.Status> buildUnnamed3121() {
@@ -7219,8 +7576,8 @@
 
 void checkUnnamed3121(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1ImportProductSetsResponse = 0;
@@ -7265,7 +7622,8 @@
   buildCounterGoogleCloudVisionV1p4beta1InputConfig++;
   if (buildCounterGoogleCloudVisionV1p4beta1InputConfig < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p4beta1GcsSource(o.gcsSource);
+    checkGoogleCloudVisionV1p4beta1GcsSource(
+        o.gcsSource as api.GoogleCloudVisionV1p4beta1GcsSource);
     unittest.expect(o.mimeType, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p4beta1InputConfig--;
@@ -7291,7 +7649,8 @@
     api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation o) {
   buildCounterGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation++;
   if (buildCounterGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation < 3) {
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.mid, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -7316,7 +7675,7 @@
     api.GoogleCloudVisionV1p4beta1LocationInfo o) {
   buildCounterGoogleCloudVisionV1p4beta1LocationInfo++;
   if (buildCounterGoogleCloudVisionV1p4beta1LocationInfo < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
   }
   buildCounterGoogleCloudVisionV1p4beta1LocationInfo--;
 }
@@ -7387,7 +7746,8 @@
   buildCounterGoogleCloudVisionV1p4beta1OutputConfig++;
   if (buildCounterGoogleCloudVisionV1p4beta1OutputConfig < 3) {
     unittest.expect(o.batchSize, unittest.equals(42));
-    checkGoogleCloudVisionV1p4beta1GcsDestination(o.gcsDestination);
+    checkGoogleCloudVisionV1p4beta1GcsDestination(
+        o.gcsDestination as api.GoogleCloudVisionV1p4beta1GcsDestination);
   }
   buildCounterGoogleCloudVisionV1p4beta1OutputConfig--;
 }
@@ -7401,8 +7761,10 @@
 
 void checkUnnamed3122(core.List<api.GoogleCloudVisionV1p4beta1Block> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1Block(o[0]);
-  checkGoogleCloudVisionV1p4beta1Block(o[1]);
+  checkGoogleCloudVisionV1p4beta1Block(
+      o[0] as api.GoogleCloudVisionV1p4beta1Block);
+  checkGoogleCloudVisionV1p4beta1Block(
+      o[1] as api.GoogleCloudVisionV1p4beta1Block);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1Page = 0;
@@ -7426,7 +7788,8 @@
     checkUnnamed3122(o.blocks);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.height, unittest.equals(42));
-    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty);
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterGoogleCloudVisionV1p4beta1Page--;
@@ -7441,8 +7804,10 @@
 
 void checkUnnamed3123(core.List<api.GoogleCloudVisionV1p4beta1Word> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1Word(o[0]);
-  checkGoogleCloudVisionV1p4beta1Word(o[1]);
+  checkGoogleCloudVisionV1p4beta1Word(
+      o[0] as api.GoogleCloudVisionV1p4beta1Word);
+  checkGoogleCloudVisionV1p4beta1Word(
+      o[1] as api.GoogleCloudVisionV1p4beta1Word);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1Paragraph = 0;
@@ -7464,9 +7829,11 @@
     api.GoogleCloudVisionV1p4beta1Paragraph o) {
   buildCounterGoogleCloudVisionV1p4beta1Paragraph++;
   if (buildCounterGoogleCloudVisionV1p4beta1Paragraph < 3) {
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty);
     checkUnnamed3123(o.words);
   }
   buildCounterGoogleCloudVisionV1p4beta1Paragraph--;
@@ -7507,8 +7874,10 @@
 void checkUnnamed3124(
     core.List<api.GoogleCloudVisionV1p4beta1ProductKeyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1ProductKeyValue(o[0]);
-  checkGoogleCloudVisionV1p4beta1ProductKeyValue(o[1]);
+  checkGoogleCloudVisionV1p4beta1ProductKeyValue(
+      o[0] as api.GoogleCloudVisionV1p4beta1ProductKeyValue);
+  checkGoogleCloudVisionV1p4beta1ProductKeyValue(
+      o[1] as api.GoogleCloudVisionV1p4beta1ProductKeyValue);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1Product = 0;
@@ -7574,8 +7943,10 @@
     core.List<api.GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult(o[0]);
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult(o[1]);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult(
+      o[0] as api.GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult(
+      o[1] as api.GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult>
@@ -7589,8 +7960,10 @@
 void checkUnnamed3126(
     core.List<api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1ProductSearchResults = 0;
@@ -7632,8 +8005,10 @@
             api.GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation>
         o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation(o[0]);
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation(o[1]);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation(o[0]
+      as api.GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation(o[1]
+      as api.GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult>
@@ -7647,8 +8022,10 @@
 void checkUnnamed3128(
     core.List<api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(o[0]);
-  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(o[1]);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(
+      o[0] as api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult);
+  checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(
+      o[1] as api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult);
 }
 
 core.int
@@ -7672,7 +8049,8 @@
   buildCounterGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult++;
   if (buildCounterGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult <
       3) {
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingPoly);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingPoly as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     checkUnnamed3127(o.objectAnnotations);
     checkUnnamed3128(o.results);
   }
@@ -7729,7 +8107,8 @@
   buildCounterGoogleCloudVisionV1p4beta1ProductSearchResultsResult++;
   if (buildCounterGoogleCloudVisionV1p4beta1ProductSearchResultsResult < 3) {
     unittest.expect(o.image, unittest.equals('foo'));
-    checkGoogleCloudVisionV1p4beta1Product(o.product);
+    checkGoogleCloudVisionV1p4beta1Product(
+        o.product as api.GoogleCloudVisionV1p4beta1Product);
     unittest.expect(o.score, unittest.equals(42.0));
   }
   buildCounterGoogleCloudVisionV1p4beta1ProductSearchResultsResult--;
@@ -7769,8 +8148,10 @@
 
 void checkUnnamed3129(core.List<api.GoogleCloudVisionV1p4beta1BoundingPoly> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1BoundingPoly(o[0]);
-  checkGoogleCloudVisionV1p4beta1BoundingPoly(o[1]);
+  checkGoogleCloudVisionV1p4beta1BoundingPoly(
+      o[0] as api.GoogleCloudVisionV1p4beta1BoundingPoly);
+  checkGoogleCloudVisionV1p4beta1BoundingPoly(
+      o[1] as api.GoogleCloudVisionV1p4beta1BoundingPoly);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1ReferenceImage = 0;
@@ -7845,9 +8226,11 @@
     api.GoogleCloudVisionV1p4beta1Symbol o) {
   buildCounterGoogleCloudVisionV1p4beta1Symbol++;
   if (buildCounterGoogleCloudVisionV1p4beta1Symbol < 3) {
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterGoogleCloudVisionV1p4beta1Symbol--;
@@ -7862,8 +8245,10 @@
 
 void checkUnnamed3130(core.List<api.GoogleCloudVisionV1p4beta1Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1Page(o[0]);
-  checkGoogleCloudVisionV1p4beta1Page(o[1]);
+  checkGoogleCloudVisionV1p4beta1Page(
+      o[0] as api.GoogleCloudVisionV1p4beta1Page);
+  checkGoogleCloudVisionV1p4beta1Page(
+      o[1] as api.GoogleCloudVisionV1p4beta1Page);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1TextAnnotation = 0;
@@ -7949,8 +8334,10 @@
 void checkUnnamed3131(
     core.List<api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage(o[0]);
-  checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage(o[1]);
+  checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage(
+      o[0] as api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage);
+  checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage(
+      o[1] as api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1TextAnnotationTextProperty = 0;
@@ -7971,7 +8358,8 @@
     api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty o) {
   buildCounterGoogleCloudVisionV1p4beta1TextAnnotationTextProperty++;
   if (buildCounterGoogleCloudVisionV1p4beta1TextAnnotationTextProperty < 3) {
-    checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak(o.detectedBreak);
+    checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak(o.detectedBreak
+        as api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak);
     checkUnnamed3131(o.detectedLanguages);
   }
   buildCounterGoogleCloudVisionV1p4beta1TextAnnotationTextProperty--;
@@ -8010,8 +8398,10 @@
 void checkUnnamed3132(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebLabel(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebLabel(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebLabel(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebLabel);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebLabel(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebLabel);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage>
@@ -8025,8 +8415,10 @@
 void checkUnnamed3133(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebPage>
@@ -8040,8 +8432,10 @@
 void checkUnnamed3134(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebPage(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebPage(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebPage(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebPage);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebPage(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebPage);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage>
@@ -8055,8 +8449,10 @@
 void checkUnnamed3135(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage>
@@ -8070,8 +8466,10 @@
 void checkUnnamed3136(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity>
@@ -8085,8 +8483,10 @@
 void checkUnnamed3137(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebEntity(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebEntity(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebEntity(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebEntity(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1WebDetection = 0;
@@ -8202,8 +8602,10 @@
 void checkUnnamed3138(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
 }
 
 core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage>
@@ -8217,8 +8619,10 @@
 void checkUnnamed3139(
     core.List<api.GoogleCloudVisionV1p4beta1WebDetectionWebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[0]);
-  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(o[1]);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[0] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
+  checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+      o[1] as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1WebDetectionWebPage = 0;
@@ -8259,8 +8663,10 @@
 
 void checkUnnamed3140(core.List<api.GoogleCloudVisionV1p4beta1Symbol> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGoogleCloudVisionV1p4beta1Symbol(o[0]);
-  checkGoogleCloudVisionV1p4beta1Symbol(o[1]);
+  checkGoogleCloudVisionV1p4beta1Symbol(
+      o[0] as api.GoogleCloudVisionV1p4beta1Symbol);
+  checkGoogleCloudVisionV1p4beta1Symbol(
+      o[1] as api.GoogleCloudVisionV1p4beta1Symbol);
 }
 
 core.int buildCounterGoogleCloudVisionV1p4beta1Word = 0;
@@ -8280,9 +8686,11 @@
 void checkGoogleCloudVisionV1p4beta1Word(api.GoogleCloudVisionV1p4beta1Word o) {
   buildCounterGoogleCloudVisionV1p4beta1Word++;
   if (buildCounterGoogleCloudVisionV1p4beta1Word < 3) {
-    checkGoogleCloudVisionV1p4beta1BoundingPoly(o.boundingBox);
+    checkGoogleCloudVisionV1p4beta1BoundingPoly(
+        o.boundingBox as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(o.property);
+    checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(
+        o.property as api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty);
     checkUnnamed3140(o.symbols);
   }
   buildCounterGoogleCloudVisionV1p4beta1Word--;
@@ -8297,8 +8705,8 @@
 
 void checkUnnamed3141(core.List<api.ObjectAnnotation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkObjectAnnotation(o[0]);
-  checkObjectAnnotation(o[1]);
+  checkObjectAnnotation(o[0] as api.ObjectAnnotation);
+  checkObjectAnnotation(o[1] as api.ObjectAnnotation);
 }
 
 core.List<api.Result> buildUnnamed3142() {
@@ -8310,8 +8718,8 @@
 
 void checkUnnamed3142(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResult(o[0]);
-  checkResult(o[1]);
+  checkResult(o[0] as api.Result);
+  checkResult(o[1] as api.Result);
 }
 
 core.int buildCounterGroupedResult = 0;
@@ -8330,7 +8738,7 @@
 void checkGroupedResult(api.GroupedResult o) {
   buildCounterGroupedResult++;
   if (buildCounterGroupedResult < 3) {
-    checkBoundingPoly(o.boundingPoly);
+    checkBoundingPoly(o.boundingPoly as api.BoundingPoly);
     checkUnnamed3141(o.objectAnnotations);
     checkUnnamed3142(o.results);
   }
@@ -8353,7 +8761,7 @@
   buildCounterImage++;
   if (buildCounterImage < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkImageSource(o.source);
+    checkImageSource(o.source as api.ImageSource);
   }
   buildCounterImage--;
 }
@@ -8410,11 +8818,11 @@
 void checkImageContext(api.ImageContext o) {
   buildCounterImageContext++;
   if (buildCounterImageContext < 3) {
-    checkCropHintsParams(o.cropHintsParams);
+    checkCropHintsParams(o.cropHintsParams as api.CropHintsParams);
     checkUnnamed3143(o.languageHints);
-    checkLatLongRect(o.latLongRect);
-    checkProductSearchParams(o.productSearchParams);
-    checkWebDetectionParams(o.webDetectionParams);
+    checkLatLongRect(o.latLongRect as api.LatLongRect);
+    checkProductSearchParams(o.productSearchParams as api.ProductSearchParams);
+    checkWebDetectionParams(o.webDetectionParams as api.WebDetectionParams);
   }
   buildCounterImageContext--;
 }
@@ -8433,7 +8841,8 @@
 void checkImageProperties(api.ImageProperties o) {
   buildCounterImageProperties++;
   if (buildCounterImageProperties < 3) {
-    checkDominantColorsAnnotation(o.dominantColors);
+    checkDominantColorsAnnotation(
+        o.dominantColors as api.DominantColorsAnnotation);
   }
   buildCounterImageProperties--;
 }
@@ -8492,7 +8901,8 @@
 void checkImportProductSetsInputConfig(api.ImportProductSetsInputConfig o) {
   buildCounterImportProductSetsInputConfig++;
   if (buildCounterImportProductSetsInputConfig < 3) {
-    checkImportProductSetsGcsSource(o.gcsSource);
+    checkImportProductSetsGcsSource(
+        o.gcsSource as api.ImportProductSetsGcsSource);
   }
   buildCounterImportProductSetsInputConfig--;
 }
@@ -8511,7 +8921,8 @@
 void checkImportProductSetsRequest(api.ImportProductSetsRequest o) {
   buildCounterImportProductSetsRequest++;
   if (buildCounterImportProductSetsRequest < 3) {
-    checkImportProductSetsInputConfig(o.inputConfig);
+    checkImportProductSetsInputConfig(
+        o.inputConfig as api.ImportProductSetsInputConfig);
   }
   buildCounterImportProductSetsRequest--;
 }
@@ -8525,8 +8936,8 @@
 
 void checkUnnamed3144(core.List<api.ReferenceImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReferenceImage(o[0]);
-  checkReferenceImage(o[1]);
+  checkReferenceImage(o[0] as api.ReferenceImage);
+  checkReferenceImage(o[1] as api.ReferenceImage);
 }
 
 core.List<api.Status> buildUnnamed3145() {
@@ -8538,8 +8949,8 @@
 
 void checkUnnamed3145(core.List<api.Status> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkStatus(o[0]);
-  checkStatus(o[1]);
+  checkStatus(o[0] as api.Status);
+  checkStatus(o[1] as api.Status);
 }
 
 core.int buildCounterImportProductSetsResponse = 0;
@@ -8580,7 +8991,7 @@
   buildCounterInputConfig++;
   if (buildCounterInputConfig < 3) {
     unittest.expect(o.content, unittest.equals('foo'));
-    checkGcsSource(o.gcsSource);
+    checkGcsSource(o.gcsSource as api.GcsSource);
     unittest.expect(o.mimeType, unittest.equals('foo'));
   }
   buildCounterInputConfig--;
@@ -8622,7 +9033,7 @@
 void checkLandmark(api.Landmark o) {
   buildCounterLandmark++;
   if (buildCounterLandmark < 3) {
-    checkPosition(o.position);
+    checkPosition(o.position as api.Position);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterLandmark--;
@@ -8664,8 +9075,8 @@
 void checkLatLongRect(api.LatLongRect o) {
   buildCounterLatLongRect++;
   if (buildCounterLatLongRect < 3) {
-    checkLatLng(o.maxLatLng);
-    checkLatLng(o.minLatLng);
+    checkLatLng(o.maxLatLng as api.LatLng);
+    checkLatLng(o.minLatLng as api.LatLng);
   }
   buildCounterLatLongRect--;
 }
@@ -8679,8 +9090,8 @@
 
 void checkUnnamed3146(core.List<api.Operation> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkOperation(o[0]);
-  checkOperation(o[1]);
+  checkOperation(o[0] as api.Operation);
+  checkOperation(o[1] as api.Operation);
 }
 
 core.int buildCounterListOperationsResponse = 0;
@@ -8713,8 +9124,8 @@
 
 void checkUnnamed3147(core.List<api.ProductSet> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProductSet(o[0]);
-  checkProductSet(o[1]);
+  checkProductSet(o[0] as api.ProductSet);
+  checkProductSet(o[1] as api.ProductSet);
 }
 
 core.int buildCounterListProductSetsResponse = 0;
@@ -8747,8 +9158,8 @@
 
 void checkUnnamed3148(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProduct(o[0]);
-  checkProduct(o[1]);
+  checkProduct(o[0] as api.Product);
+  checkProduct(o[1] as api.Product);
 }
 
 core.int buildCounterListProductsInProductSetResponse = 0;
@@ -8782,8 +9193,8 @@
 
 void checkUnnamed3149(core.List<api.Product> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkProduct(o[0]);
-  checkProduct(o[1]);
+  checkProduct(o[0] as api.Product);
+  checkProduct(o[1] as api.Product);
 }
 
 core.int buildCounterListProductsResponse = 0;
@@ -8816,8 +9227,8 @@
 
 void checkUnnamed3150(core.List<api.ReferenceImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReferenceImage(o[0]);
-  checkReferenceImage(o[1]);
+  checkReferenceImage(o[0] as api.ReferenceImage);
+  checkReferenceImage(o[1] as api.ReferenceImage);
 }
 
 core.int buildCounterListReferenceImagesResponse = 0;
@@ -8861,7 +9272,7 @@
 void checkLocalizedObjectAnnotation(api.LocalizedObjectAnnotation o) {
   buildCounterLocalizedObjectAnnotation++;
   if (buildCounterLocalizedObjectAnnotation < 3) {
-    checkBoundingPoly(o.boundingPoly);
+    checkBoundingPoly(o.boundingPoly as api.BoundingPoly);
     unittest.expect(o.languageCode, unittest.equals('foo'));
     unittest.expect(o.mid, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
@@ -8884,7 +9295,7 @@
 void checkLocationInfo(api.LocationInfo o) {
   buildCounterLocationInfo++;
   if (buildCounterLocationInfo < 3) {
-    checkLatLng(o.latLng);
+    checkLatLng(o.latLng as api.LatLng);
   }
   buildCounterLocationInfo--;
 }
@@ -9012,7 +9423,7 @@
   buildCounterOperation++;
   if (buildCounterOperation < 3) {
     unittest.expect(o.done, unittest.isTrue);
-    checkStatus(o.error);
+    checkStatus(o.error as api.Status);
     checkUnnamed3151(o.metadata);
     unittest.expect(o.name, unittest.equals('foo'));
     checkUnnamed3152(o.response);
@@ -9059,7 +9470,7 @@
   buildCounterOutputConfig++;
   if (buildCounterOutputConfig < 3) {
     unittest.expect(o.batchSize, unittest.equals(42));
-    checkGcsDestination(o.gcsDestination);
+    checkGcsDestination(o.gcsDestination as api.GcsDestination);
   }
   buildCounterOutputConfig--;
 }
@@ -9073,8 +9484,8 @@
 
 void checkUnnamed3153(core.List<api.Block> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBlock(o[0]);
-  checkBlock(o[1]);
+  checkBlock(o[0] as api.Block);
+  checkBlock(o[1] as api.Block);
 }
 
 core.int buildCounterPage = 0;
@@ -9098,7 +9509,7 @@
     checkUnnamed3153(o.blocks);
     unittest.expect(o.confidence, unittest.equals(42.0));
     unittest.expect(o.height, unittest.equals(42));
-    checkTextProperty(o.property);
+    checkTextProperty(o.property as api.TextProperty);
     unittest.expect(o.width, unittest.equals(42));
   }
   buildCounterPage--;
@@ -9113,8 +9524,8 @@
 
 void checkUnnamed3154(core.List<api.Word> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWord(o[0]);
-  checkWord(o[1]);
+  checkWord(o[0] as api.Word);
+  checkWord(o[1] as api.Word);
 }
 
 core.int buildCounterParagraph = 0;
@@ -9134,9 +9545,9 @@
 void checkParagraph(api.Paragraph o) {
   buildCounterParagraph++;
   if (buildCounterParagraph < 3) {
-    checkBoundingPoly(o.boundingBox);
+    checkBoundingPoly(o.boundingBox as api.BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkTextProperty(o.property);
+    checkTextProperty(o.property as api.TextProperty);
     checkUnnamed3154(o.words);
   }
   buildCounterParagraph--;
@@ -9174,8 +9585,8 @@
 
 void checkUnnamed3155(core.List<api.KeyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkKeyValue(o[0]);
-  checkKeyValue(o[1]);
+  checkKeyValue(o[0] as api.KeyValue);
+  checkKeyValue(o[1] as api.KeyValue);
 }
 
 core.int buildCounterProduct = 0;
@@ -9235,7 +9646,7 @@
 void checkProductSearchParams(api.ProductSearchParams o) {
   buildCounterProductSearchParams++;
   if (buildCounterProductSearchParams < 3) {
-    checkBoundingPoly(o.boundingPoly);
+    checkBoundingPoly(o.boundingPoly as api.BoundingPoly);
     unittest.expect(o.filter, unittest.equals('foo'));
     checkUnnamed3156(o.productCategories);
     unittest.expect(o.productSet, unittest.equals('foo'));
@@ -9252,8 +9663,8 @@
 
 void checkUnnamed3157(core.List<api.GroupedResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroupedResult(o[0]);
-  checkGroupedResult(o[1]);
+  checkGroupedResult(o[0] as api.GroupedResult);
+  checkGroupedResult(o[1] as api.GroupedResult);
 }
 
 core.List<api.Result> buildUnnamed3158() {
@@ -9265,8 +9676,8 @@
 
 void checkUnnamed3158(core.List<api.Result> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResult(o[0]);
-  checkResult(o[1]);
+  checkResult(o[0] as api.Result);
+  checkResult(o[1] as api.Result);
 }
 
 core.int buildCounterProductSearchResults = 0;
@@ -9310,7 +9721,7 @@
   buildCounterProductSet++;
   if (buildCounterProductSet < 3) {
     unittest.expect(o.displayName, unittest.equals('foo'));
-    checkStatus(o.indexError);
+    checkStatus(o.indexError as api.Status);
     unittest.expect(o.indexTime, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
   }
@@ -9377,7 +9788,8 @@
   if (buildCounterPurgeProductsRequest < 3) {
     unittest.expect(o.deleteOrphanProducts, unittest.isTrue);
     unittest.expect(o.force, unittest.isTrue);
-    checkProductSetPurgeConfig(o.productSetPurgeConfig);
+    checkProductSetPurgeConfig(
+        o.productSetPurgeConfig as api.ProductSetPurgeConfig);
   }
   buildCounterPurgeProductsRequest--;
 }
@@ -9391,8 +9803,8 @@
 
 void checkUnnamed3159(core.List<api.BoundingPoly> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkBoundingPoly(o[0]);
-  checkBoundingPoly(o[1]);
+  checkBoundingPoly(o[0] as api.BoundingPoly);
+  checkBoundingPoly(o[1] as api.BoundingPoly);
 }
 
 core.int buildCounterReferenceImage = 0;
@@ -9456,7 +9868,7 @@
   buildCounterResult++;
   if (buildCounterResult < 3) {
     unittest.expect(o.image, unittest.equals('foo'));
-    checkProduct(o.product);
+    checkProduct(o.product as api.Product);
     unittest.expect(o.score, unittest.equals(42.0));
   }
   buildCounterResult--;
@@ -9571,9 +9983,9 @@
 void checkSymbol(api.Symbol o) {
   buildCounterSymbol++;
   if (buildCounterSymbol < 3) {
-    checkBoundingPoly(o.boundingBox);
+    checkBoundingPoly(o.boundingBox as api.BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkTextProperty(o.property);
+    checkTextProperty(o.property as api.TextProperty);
     unittest.expect(o.text, unittest.equals('foo'));
   }
   buildCounterSymbol--;
@@ -9588,8 +10000,8 @@
 
 void checkUnnamed3162(core.List<api.Page> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPage(o[0]);
-  checkPage(o[1]);
+  checkPage(o[0] as api.Page);
+  checkPage(o[1] as api.Page);
 }
 
 core.int buildCounterTextAnnotation = 0;
@@ -9622,8 +10034,8 @@
 
 void checkUnnamed3163(core.List<api.DetectedLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkDetectedLanguage(o[0]);
-  checkDetectedLanguage(o[1]);
+  checkDetectedLanguage(o[0] as api.DetectedLanguage);
+  checkDetectedLanguage(o[1] as api.DetectedLanguage);
 }
 
 core.int buildCounterTextProperty = 0;
@@ -9641,7 +10053,7 @@
 void checkTextProperty(api.TextProperty o) {
   buildCounterTextProperty++;
   if (buildCounterTextProperty < 3) {
-    checkDetectedBreak(o.detectedBreak);
+    checkDetectedBreak(o.detectedBreak as api.DetectedBreak);
     checkUnnamed3163(o.detectedLanguages);
   }
   buildCounterTextProperty--;
@@ -9677,8 +10089,8 @@
 
 void checkUnnamed3164(core.List<api.WebLabel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebLabel(o[0]);
-  checkWebLabel(o[1]);
+  checkWebLabel(o[0] as api.WebLabel);
+  checkWebLabel(o[1] as api.WebLabel);
 }
 
 core.List<api.WebImage> buildUnnamed3165() {
@@ -9690,8 +10102,8 @@
 
 void checkUnnamed3165(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebImage(o[0]);
-  checkWebImage(o[1]);
+  checkWebImage(o[0] as api.WebImage);
+  checkWebImage(o[1] as api.WebImage);
 }
 
 core.List<api.WebPage> buildUnnamed3166() {
@@ -9703,8 +10115,8 @@
 
 void checkUnnamed3166(core.List<api.WebPage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebPage(o[0]);
-  checkWebPage(o[1]);
+  checkWebPage(o[0] as api.WebPage);
+  checkWebPage(o[1] as api.WebPage);
 }
 
 core.List<api.WebImage> buildUnnamed3167() {
@@ -9716,8 +10128,8 @@
 
 void checkUnnamed3167(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebImage(o[0]);
-  checkWebImage(o[1]);
+  checkWebImage(o[0] as api.WebImage);
+  checkWebImage(o[1] as api.WebImage);
 }
 
 core.List<api.WebImage> buildUnnamed3168() {
@@ -9729,8 +10141,8 @@
 
 void checkUnnamed3168(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebImage(o[0]);
-  checkWebImage(o[1]);
+  checkWebImage(o[0] as api.WebImage);
+  checkWebImage(o[1] as api.WebImage);
 }
 
 core.List<api.WebEntity> buildUnnamed3169() {
@@ -9742,8 +10154,8 @@
 
 void checkUnnamed3169(core.List<api.WebEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebEntity(o[0]);
-  checkWebEntity(o[1]);
+  checkWebEntity(o[0] as api.WebEntity);
+  checkWebEntity(o[1] as api.WebEntity);
 }
 
 core.int buildCounterWebDetection = 0;
@@ -9868,8 +10280,8 @@
 
 void checkUnnamed3170(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebImage(o[0]);
-  checkWebImage(o[1]);
+  checkWebImage(o[0] as api.WebImage);
+  checkWebImage(o[1] as api.WebImage);
 }
 
 core.List<api.WebImage> buildUnnamed3171() {
@@ -9881,8 +10293,8 @@
 
 void checkUnnamed3171(core.List<api.WebImage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebImage(o[0]);
-  checkWebImage(o[1]);
+  checkWebImage(o[0] as api.WebImage);
+  checkWebImage(o[1] as api.WebImage);
 }
 
 core.int buildCounterWebPage = 0;
@@ -9921,8 +10333,8 @@
 
 void checkUnnamed3172(core.List<api.Symbol> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSymbol(o[0]);
-  checkSymbol(o[1]);
+  checkSymbol(o[0] as api.Symbol);
+  checkSymbol(o[1] as api.Symbol);
 }
 
 core.int buildCounterWord = 0;
@@ -9942,9 +10354,9 @@
 void checkWord(api.Word o) {
   buildCounterWord++;
   if (buildCounterWord < 3) {
-    checkBoundingPoly(o.boundingBox);
+    checkBoundingPoly(o.boundingBox as api.BoundingPoly);
     unittest.expect(o.confidence, unittest.equals(42.0));
-    checkTextProperty(o.property);
+    checkTextProperty(o.property as api.TextProperty);
     checkUnnamed3172(o.symbols);
   }
   buildCounterWord--;
@@ -9955,7 +10367,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAddProductToProductSetRequest();
       var od = api.AddProductToProductSetRequest.fromJson(o.toJson());
-      checkAddProductToProductSetRequest(od);
+      checkAddProductToProductSetRequest(
+          od as api.AddProductToProductSetRequest);
     });
   });
 
@@ -9963,7 +10376,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotateFileRequest();
       var od = api.AnnotateFileRequest.fromJson(o.toJson());
-      checkAnnotateFileRequest(od);
+      checkAnnotateFileRequest(od as api.AnnotateFileRequest);
     });
   });
 
@@ -9971,7 +10384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotateFileResponse();
       var od = api.AnnotateFileResponse.fromJson(o.toJson());
-      checkAnnotateFileResponse(od);
+      checkAnnotateFileResponse(od as api.AnnotateFileResponse);
     });
   });
 
@@ -9979,7 +10392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotateImageRequest();
       var od = api.AnnotateImageRequest.fromJson(o.toJson());
-      checkAnnotateImageRequest(od);
+      checkAnnotateImageRequest(od as api.AnnotateImageRequest);
     });
   });
 
@@ -9987,7 +10400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAnnotateImageResponse();
       var od = api.AnnotateImageResponse.fromJson(o.toJson());
-      checkAnnotateImageResponse(od);
+      checkAnnotateImageResponse(od as api.AnnotateImageResponse);
     });
   });
 
@@ -9995,7 +10408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsyncAnnotateFileRequest();
       var od = api.AsyncAnnotateFileRequest.fromJson(o.toJson());
-      checkAsyncAnnotateFileRequest(od);
+      checkAsyncAnnotateFileRequest(od as api.AsyncAnnotateFileRequest);
     });
   });
 
@@ -10003,7 +10416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsyncAnnotateFileResponse();
       var od = api.AsyncAnnotateFileResponse.fromJson(o.toJson());
-      checkAsyncAnnotateFileResponse(od);
+      checkAsyncAnnotateFileResponse(od as api.AsyncAnnotateFileResponse);
     });
   });
 
@@ -10011,7 +10424,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsyncBatchAnnotateFilesRequest();
       var od = api.AsyncBatchAnnotateFilesRequest.fromJson(o.toJson());
-      checkAsyncBatchAnnotateFilesRequest(od);
+      checkAsyncBatchAnnotateFilesRequest(
+          od as api.AsyncBatchAnnotateFilesRequest);
     });
   });
 
@@ -10019,7 +10433,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsyncBatchAnnotateFilesResponse();
       var od = api.AsyncBatchAnnotateFilesResponse.fromJson(o.toJson());
-      checkAsyncBatchAnnotateFilesResponse(od);
+      checkAsyncBatchAnnotateFilesResponse(
+          od as api.AsyncBatchAnnotateFilesResponse);
     });
   });
 
@@ -10027,7 +10442,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsyncBatchAnnotateImagesRequest();
       var od = api.AsyncBatchAnnotateImagesRequest.fromJson(o.toJson());
-      checkAsyncBatchAnnotateImagesRequest(od);
+      checkAsyncBatchAnnotateImagesRequest(
+          od as api.AsyncBatchAnnotateImagesRequest);
     });
   });
 
@@ -10035,7 +10451,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildAsyncBatchAnnotateImagesResponse();
       var od = api.AsyncBatchAnnotateImagesResponse.fromJson(o.toJson());
-      checkAsyncBatchAnnotateImagesResponse(od);
+      checkAsyncBatchAnnotateImagesResponse(
+          od as api.AsyncBatchAnnotateImagesResponse);
     });
   });
 
@@ -10043,7 +10460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchAnnotateFilesRequest();
       var od = api.BatchAnnotateFilesRequest.fromJson(o.toJson());
-      checkBatchAnnotateFilesRequest(od);
+      checkBatchAnnotateFilesRequest(od as api.BatchAnnotateFilesRequest);
     });
   });
 
@@ -10051,7 +10468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchAnnotateFilesResponse();
       var od = api.BatchAnnotateFilesResponse.fromJson(o.toJson());
-      checkBatchAnnotateFilesResponse(od);
+      checkBatchAnnotateFilesResponse(od as api.BatchAnnotateFilesResponse);
     });
   });
 
@@ -10059,7 +10476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchAnnotateImagesRequest();
       var od = api.BatchAnnotateImagesRequest.fromJson(o.toJson());
-      checkBatchAnnotateImagesRequest(od);
+      checkBatchAnnotateImagesRequest(od as api.BatchAnnotateImagesRequest);
     });
   });
 
@@ -10067,7 +10484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchAnnotateImagesResponse();
       var od = api.BatchAnnotateImagesResponse.fromJson(o.toJson());
-      checkBatchAnnotateImagesResponse(od);
+      checkBatchAnnotateImagesResponse(od as api.BatchAnnotateImagesResponse);
     });
   });
 
@@ -10075,7 +10492,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBatchOperationMetadata();
       var od = api.BatchOperationMetadata.fromJson(o.toJson());
-      checkBatchOperationMetadata(od);
+      checkBatchOperationMetadata(od as api.BatchOperationMetadata);
     });
   });
 
@@ -10083,7 +10500,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBlock();
       var od = api.Block.fromJson(o.toJson());
-      checkBlock(od);
+      checkBlock(od as api.Block);
     });
   });
 
@@ -10091,7 +10508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildBoundingPoly();
       var od = api.BoundingPoly.fromJson(o.toJson());
-      checkBoundingPoly(od);
+      checkBoundingPoly(od as api.BoundingPoly);
     });
   });
 
@@ -10099,7 +10516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCancelOperationRequest();
       var od = api.CancelOperationRequest.fromJson(o.toJson());
-      checkCancelOperationRequest(od);
+      checkCancelOperationRequest(od as api.CancelOperationRequest);
     });
   });
 
@@ -10107,7 +10524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColor();
       var od = api.Color.fromJson(o.toJson());
-      checkColor(od);
+      checkColor(od as api.Color);
     });
   });
 
@@ -10115,7 +10532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildColorInfo();
       var od = api.ColorInfo.fromJson(o.toJson());
-      checkColorInfo(od);
+      checkColorInfo(od as api.ColorInfo);
     });
   });
 
@@ -10123,7 +10540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCropHint();
       var od = api.CropHint.fromJson(o.toJson());
-      checkCropHint(od);
+      checkCropHint(od as api.CropHint);
     });
   });
 
@@ -10131,7 +10548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCropHintsAnnotation();
       var od = api.CropHintsAnnotation.fromJson(o.toJson());
-      checkCropHintsAnnotation(od);
+      checkCropHintsAnnotation(od as api.CropHintsAnnotation);
     });
   });
 
@@ -10139,7 +10556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCropHintsParams();
       var od = api.CropHintsParams.fromJson(o.toJson());
-      checkCropHintsParams(od);
+      checkCropHintsParams(od as api.CropHintsParams);
     });
   });
 
@@ -10147,7 +10564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDetectedBreak();
       var od = api.DetectedBreak.fromJson(o.toJson());
-      checkDetectedBreak(od);
+      checkDetectedBreak(od as api.DetectedBreak);
     });
   });
 
@@ -10155,7 +10572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDetectedLanguage();
       var od = api.DetectedLanguage.fromJson(o.toJson());
-      checkDetectedLanguage(od);
+      checkDetectedLanguage(od as api.DetectedLanguage);
     });
   });
 
@@ -10163,7 +10580,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildDominantColorsAnnotation();
       var od = api.DominantColorsAnnotation.fromJson(o.toJson());
-      checkDominantColorsAnnotation(od);
+      checkDominantColorsAnnotation(od as api.DominantColorsAnnotation);
     });
   });
 
@@ -10171,7 +10588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -10179,7 +10596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntityAnnotation();
       var od = api.EntityAnnotation.fromJson(o.toJson());
-      checkEntityAnnotation(od);
+      checkEntityAnnotation(od as api.EntityAnnotation);
     });
   });
 
@@ -10187,7 +10604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFaceAnnotation();
       var od = api.FaceAnnotation.fromJson(o.toJson());
-      checkFaceAnnotation(od);
+      checkFaceAnnotation(od as api.FaceAnnotation);
     });
   });
 
@@ -10195,7 +10612,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFeature();
       var od = api.Feature.fromJson(o.toJson());
-      checkFeature(od);
+      checkFeature(od as api.Feature);
     });
   });
 
@@ -10203,7 +10620,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsDestination();
       var od = api.GcsDestination.fromJson(o.toJson());
-      checkGcsDestination(od);
+      checkGcsDestination(od as api.GcsDestination);
     });
   });
 
@@ -10211,7 +10628,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGcsSource();
       var od = api.GcsSource.fromJson(o.toJson());
-      checkGcsSource(od);
+      checkGcsSource(od as api.GcsSource);
     });
   });
 
@@ -10221,7 +10638,8 @@
       var o = buildGoogleCloudVisionV1p1beta1AnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p1beta1AnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1AnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p1beta1AnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p1beta1AnnotateFileResponse);
     });
   });
 
@@ -10231,7 +10649,8 @@
       var o = buildGoogleCloudVisionV1p1beta1AnnotateImageResponse();
       var od = api.GoogleCloudVisionV1p1beta1AnnotateImageResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1AnnotateImageResponse(od);
+      checkGoogleCloudVisionV1p1beta1AnnotateImageResponse(
+          od as api.GoogleCloudVisionV1p1beta1AnnotateImageResponse);
     });
   });
 
@@ -10241,7 +10660,8 @@
       var o = buildGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p1beta1AsyncAnnotateFileResponse);
     });
   });
 
@@ -10252,7 +10672,8 @@
       var o = buildGoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse();
       var od = api.GoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse(od);
+      checkGoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse(
+          od as api.GoogleCloudVisionV1p1beta1AsyncBatchAnnotateFilesResponse);
     });
   });
 
@@ -10260,7 +10681,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Block();
       var od = api.GoogleCloudVisionV1p1beta1Block.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Block(od);
+      checkGoogleCloudVisionV1p1beta1Block(
+          od as api.GoogleCloudVisionV1p1beta1Block);
     });
   });
 
@@ -10268,7 +10690,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1BoundingPoly();
       var od = api.GoogleCloudVisionV1p1beta1BoundingPoly.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1BoundingPoly(od);
+      checkGoogleCloudVisionV1p1beta1BoundingPoly(
+          od as api.GoogleCloudVisionV1p1beta1BoundingPoly);
     });
   });
 
@@ -10276,7 +10699,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1ColorInfo();
       var od = api.GoogleCloudVisionV1p1beta1ColorInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1ColorInfo(od);
+      checkGoogleCloudVisionV1p1beta1ColorInfo(
+          od as api.GoogleCloudVisionV1p1beta1ColorInfo);
     });
   });
 
@@ -10284,7 +10708,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1CropHint();
       var od = api.GoogleCloudVisionV1p1beta1CropHint.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1CropHint(od);
+      checkGoogleCloudVisionV1p1beta1CropHint(
+          od as api.GoogleCloudVisionV1p1beta1CropHint);
     });
   });
 
@@ -10294,7 +10719,8 @@
       var o = buildGoogleCloudVisionV1p1beta1CropHintsAnnotation();
       var od = api.GoogleCloudVisionV1p1beta1CropHintsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1CropHintsAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1CropHintsAnnotation(
+          od as api.GoogleCloudVisionV1p1beta1CropHintsAnnotation);
     });
   });
 
@@ -10304,7 +10730,8 @@
       var o = buildGoogleCloudVisionV1p1beta1DominantColorsAnnotation();
       var od = api.GoogleCloudVisionV1p1beta1DominantColorsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1DominantColorsAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1DominantColorsAnnotation(
+          od as api.GoogleCloudVisionV1p1beta1DominantColorsAnnotation);
     });
   });
 
@@ -10313,7 +10740,8 @@
       var o = buildGoogleCloudVisionV1p1beta1EntityAnnotation();
       var od =
           api.GoogleCloudVisionV1p1beta1EntityAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1EntityAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1EntityAnnotation(
+          od as api.GoogleCloudVisionV1p1beta1EntityAnnotation);
     });
   });
 
@@ -10322,7 +10750,8 @@
       var o = buildGoogleCloudVisionV1p1beta1FaceAnnotation();
       var od =
           api.GoogleCloudVisionV1p1beta1FaceAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1FaceAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1FaceAnnotation(
+          od as api.GoogleCloudVisionV1p1beta1FaceAnnotation);
     });
   });
 
@@ -10332,7 +10761,8 @@
       var o = buildGoogleCloudVisionV1p1beta1FaceAnnotationLandmark();
       var od = api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1FaceAnnotationLandmark(od);
+      checkGoogleCloudVisionV1p1beta1FaceAnnotationLandmark(
+          od as api.GoogleCloudVisionV1p1beta1FaceAnnotationLandmark);
     });
   });
 
@@ -10341,7 +10771,8 @@
       var o = buildGoogleCloudVisionV1p1beta1GcsDestination();
       var od =
           api.GoogleCloudVisionV1p1beta1GcsDestination.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1GcsDestination(od);
+      checkGoogleCloudVisionV1p1beta1GcsDestination(
+          od as api.GoogleCloudVisionV1p1beta1GcsDestination);
     });
   });
 
@@ -10349,7 +10780,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1GcsSource();
       var od = api.GoogleCloudVisionV1p1beta1GcsSource.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1GcsSource(od);
+      checkGoogleCloudVisionV1p1beta1GcsSource(
+          od as api.GoogleCloudVisionV1p1beta1GcsSource);
     });
   });
 
@@ -10359,7 +10791,8 @@
       var o = buildGoogleCloudVisionV1p1beta1ImageAnnotationContext();
       var od = api.GoogleCloudVisionV1p1beta1ImageAnnotationContext.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1ImageAnnotationContext(od);
+      checkGoogleCloudVisionV1p1beta1ImageAnnotationContext(
+          od as api.GoogleCloudVisionV1p1beta1ImageAnnotationContext);
     });
   });
 
@@ -10368,7 +10801,8 @@
       var o = buildGoogleCloudVisionV1p1beta1ImageProperties();
       var od =
           api.GoogleCloudVisionV1p1beta1ImageProperties.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1ImageProperties(od);
+      checkGoogleCloudVisionV1p1beta1ImageProperties(
+          od as api.GoogleCloudVisionV1p1beta1ImageProperties);
     });
   });
 
@@ -10376,7 +10810,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1InputConfig();
       var od = api.GoogleCloudVisionV1p1beta1InputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1InputConfig(od);
+      checkGoogleCloudVisionV1p1beta1InputConfig(
+          od as api.GoogleCloudVisionV1p1beta1InputConfig);
     });
   });
 
@@ -10386,7 +10821,8 @@
       var o = buildGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation();
       var od = api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1LocalizedObjectAnnotation(
+          od as api.GoogleCloudVisionV1p1beta1LocalizedObjectAnnotation);
     });
   });
 
@@ -10394,7 +10830,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1LocationInfo();
       var od = api.GoogleCloudVisionV1p1beta1LocationInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1LocationInfo(od);
+      checkGoogleCloudVisionV1p1beta1LocationInfo(
+          od as api.GoogleCloudVisionV1p1beta1LocationInfo);
     });
   });
 
@@ -10403,7 +10840,8 @@
       var o = buildGoogleCloudVisionV1p1beta1NormalizedVertex();
       var od =
           api.GoogleCloudVisionV1p1beta1NormalizedVertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1NormalizedVertex(od);
+      checkGoogleCloudVisionV1p1beta1NormalizedVertex(
+          od as api.GoogleCloudVisionV1p1beta1NormalizedVertex);
     });
   });
 
@@ -10412,7 +10850,8 @@
       var o = buildGoogleCloudVisionV1p1beta1OperationMetadata();
       var od =
           api.GoogleCloudVisionV1p1beta1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1OperationMetadata(od);
+      checkGoogleCloudVisionV1p1beta1OperationMetadata(
+          od as api.GoogleCloudVisionV1p1beta1OperationMetadata);
     });
   });
 
@@ -10420,7 +10859,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1OutputConfig();
       var od = api.GoogleCloudVisionV1p1beta1OutputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1OutputConfig(od);
+      checkGoogleCloudVisionV1p1beta1OutputConfig(
+          od as api.GoogleCloudVisionV1p1beta1OutputConfig);
     });
   });
 
@@ -10428,7 +10868,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Page();
       var od = api.GoogleCloudVisionV1p1beta1Page.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Page(od);
+      checkGoogleCloudVisionV1p1beta1Page(
+          od as api.GoogleCloudVisionV1p1beta1Page);
     });
   });
 
@@ -10436,7 +10877,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Paragraph();
       var od = api.GoogleCloudVisionV1p1beta1Paragraph.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Paragraph(od);
+      checkGoogleCloudVisionV1p1beta1Paragraph(
+          od as api.GoogleCloudVisionV1p1beta1Paragraph);
     });
   });
 
@@ -10444,7 +10886,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Position();
       var od = api.GoogleCloudVisionV1p1beta1Position.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Position(od);
+      checkGoogleCloudVisionV1p1beta1Position(
+          od as api.GoogleCloudVisionV1p1beta1Position);
     });
   });
 
@@ -10452,7 +10895,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Product();
       var od = api.GoogleCloudVisionV1p1beta1Product.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Product(od);
+      checkGoogleCloudVisionV1p1beta1Product(
+          od as api.GoogleCloudVisionV1p1beta1Product);
     });
   });
 
@@ -10461,7 +10905,8 @@
       var o = buildGoogleCloudVisionV1p1beta1ProductKeyValue();
       var od =
           api.GoogleCloudVisionV1p1beta1ProductKeyValue.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1ProductKeyValue(od);
+      checkGoogleCloudVisionV1p1beta1ProductKeyValue(
+          od as api.GoogleCloudVisionV1p1beta1ProductKeyValue);
     });
   });
 
@@ -10471,7 +10916,8 @@
       var o = buildGoogleCloudVisionV1p1beta1ProductSearchResults();
       var od = api.GoogleCloudVisionV1p1beta1ProductSearchResults.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1ProductSearchResults(od);
+      checkGoogleCloudVisionV1p1beta1ProductSearchResults(
+          od as api.GoogleCloudVisionV1p1beta1ProductSearchResults);
     });
   });
 
@@ -10483,7 +10929,8 @@
           buildGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult();
       var od = api.GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult(od);
+      checkGoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult(od
+          as api.GoogleCloudVisionV1p1beta1ProductSearchResultsGroupedResult);
     });
   });
 
@@ -10496,7 +10943,9 @@
       var od =
           api.GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation(od
+          as api
+              .GoogleCloudVisionV1p1beta1ProductSearchResultsObjectAnnotation);
     });
   });
 
@@ -10507,7 +10956,8 @@
       var od =
           api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(od);
+      checkGoogleCloudVisionV1p1beta1ProductSearchResultsResult(
+          od as api.GoogleCloudVisionV1p1beta1ProductSearchResultsResult);
     });
   });
 
@@ -10515,7 +10965,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Property();
       var od = api.GoogleCloudVisionV1p1beta1Property.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Property(od);
+      checkGoogleCloudVisionV1p1beta1Property(
+          od as api.GoogleCloudVisionV1p1beta1Property);
     });
   });
 
@@ -10525,7 +10976,8 @@
       var o = buildGoogleCloudVisionV1p1beta1SafeSearchAnnotation();
       var od = api.GoogleCloudVisionV1p1beta1SafeSearchAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1SafeSearchAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1SafeSearchAnnotation(
+          od as api.GoogleCloudVisionV1p1beta1SafeSearchAnnotation);
     });
   });
 
@@ -10533,7 +10985,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Symbol();
       var od = api.GoogleCloudVisionV1p1beta1Symbol.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Symbol(od);
+      checkGoogleCloudVisionV1p1beta1Symbol(
+          od as api.GoogleCloudVisionV1p1beta1Symbol);
     });
   });
 
@@ -10542,7 +10995,8 @@
       var o = buildGoogleCloudVisionV1p1beta1TextAnnotation();
       var od =
           api.GoogleCloudVisionV1p1beta1TextAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1TextAnnotation(od);
+      checkGoogleCloudVisionV1p1beta1TextAnnotation(
+          od as api.GoogleCloudVisionV1p1beta1TextAnnotation);
     });
   });
 
@@ -10553,7 +11007,8 @@
       var od =
           api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak(od);
+      checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak(
+          od as api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedBreak);
     });
   });
 
@@ -10565,7 +11020,8 @@
       var od =
           api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage(od);
+      checkGoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage(
+          od as api.GoogleCloudVisionV1p1beta1TextAnnotationDetectedLanguage);
     });
   });
 
@@ -10576,7 +11032,8 @@
       var od =
           api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(od);
+      checkGoogleCloudVisionV1p1beta1TextAnnotationTextProperty(
+          od as api.GoogleCloudVisionV1p1beta1TextAnnotationTextProperty);
     });
   });
 
@@ -10584,7 +11041,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Vertex();
       var od = api.GoogleCloudVisionV1p1beta1Vertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Vertex(od);
+      checkGoogleCloudVisionV1p1beta1Vertex(
+          od as api.GoogleCloudVisionV1p1beta1Vertex);
     });
   });
 
@@ -10592,7 +11050,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1WebDetection();
       var od = api.GoogleCloudVisionV1p1beta1WebDetection.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1WebDetection(od);
+      checkGoogleCloudVisionV1p1beta1WebDetection(
+          od as api.GoogleCloudVisionV1p1beta1WebDetection);
     });
   });
 
@@ -10602,7 +11061,8 @@
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebEntity();
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1WebDetectionWebEntity(od);
+      checkGoogleCloudVisionV1p1beta1WebDetectionWebEntity(
+          od as api.GoogleCloudVisionV1p1beta1WebDetectionWebEntity);
     });
   });
 
@@ -10612,7 +11072,8 @@
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebImage();
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebImage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(od);
+      checkGoogleCloudVisionV1p1beta1WebDetectionWebImage(
+          od as api.GoogleCloudVisionV1p1beta1WebDetectionWebImage);
     });
   });
 
@@ -10622,7 +11083,8 @@
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebLabel();
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebLabel.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1WebDetectionWebLabel(od);
+      checkGoogleCloudVisionV1p1beta1WebDetectionWebLabel(
+          od as api.GoogleCloudVisionV1p1beta1WebDetectionWebLabel);
     });
   });
 
@@ -10632,7 +11094,8 @@
       var o = buildGoogleCloudVisionV1p1beta1WebDetectionWebPage();
       var od = api.GoogleCloudVisionV1p1beta1WebDetectionWebPage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p1beta1WebDetectionWebPage(od);
+      checkGoogleCloudVisionV1p1beta1WebDetectionWebPage(
+          od as api.GoogleCloudVisionV1p1beta1WebDetectionWebPage);
     });
   });
 
@@ -10640,7 +11103,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p1beta1Word();
       var od = api.GoogleCloudVisionV1p1beta1Word.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p1beta1Word(od);
+      checkGoogleCloudVisionV1p1beta1Word(
+          od as api.GoogleCloudVisionV1p1beta1Word);
     });
   });
 
@@ -10650,7 +11114,8 @@
       var o = buildGoogleCloudVisionV1p2beta1AnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p2beta1AnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1AnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p2beta1AnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p2beta1AnnotateFileResponse);
     });
   });
 
@@ -10660,7 +11125,8 @@
       var o = buildGoogleCloudVisionV1p2beta1AnnotateImageResponse();
       var od = api.GoogleCloudVisionV1p2beta1AnnotateImageResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1AnnotateImageResponse(od);
+      checkGoogleCloudVisionV1p2beta1AnnotateImageResponse(
+          od as api.GoogleCloudVisionV1p2beta1AnnotateImageResponse);
     });
   });
 
@@ -10670,7 +11136,8 @@
       var o = buildGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p2beta1AsyncAnnotateFileResponse);
     });
   });
 
@@ -10681,7 +11148,8 @@
       var o = buildGoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse();
       var od = api.GoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse(od);
+      checkGoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse(
+          od as api.GoogleCloudVisionV1p2beta1AsyncBatchAnnotateFilesResponse);
     });
   });
 
@@ -10689,7 +11157,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Block();
       var od = api.GoogleCloudVisionV1p2beta1Block.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Block(od);
+      checkGoogleCloudVisionV1p2beta1Block(
+          od as api.GoogleCloudVisionV1p2beta1Block);
     });
   });
 
@@ -10697,7 +11166,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1BoundingPoly();
       var od = api.GoogleCloudVisionV1p2beta1BoundingPoly.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1BoundingPoly(od);
+      checkGoogleCloudVisionV1p2beta1BoundingPoly(
+          od as api.GoogleCloudVisionV1p2beta1BoundingPoly);
     });
   });
 
@@ -10705,7 +11175,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1ColorInfo();
       var od = api.GoogleCloudVisionV1p2beta1ColorInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1ColorInfo(od);
+      checkGoogleCloudVisionV1p2beta1ColorInfo(
+          od as api.GoogleCloudVisionV1p2beta1ColorInfo);
     });
   });
 
@@ -10713,7 +11184,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1CropHint();
       var od = api.GoogleCloudVisionV1p2beta1CropHint.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1CropHint(od);
+      checkGoogleCloudVisionV1p2beta1CropHint(
+          od as api.GoogleCloudVisionV1p2beta1CropHint);
     });
   });
 
@@ -10723,7 +11195,8 @@
       var o = buildGoogleCloudVisionV1p2beta1CropHintsAnnotation();
       var od = api.GoogleCloudVisionV1p2beta1CropHintsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1CropHintsAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1CropHintsAnnotation(
+          od as api.GoogleCloudVisionV1p2beta1CropHintsAnnotation);
     });
   });
 
@@ -10733,7 +11206,8 @@
       var o = buildGoogleCloudVisionV1p2beta1DominantColorsAnnotation();
       var od = api.GoogleCloudVisionV1p2beta1DominantColorsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1DominantColorsAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1DominantColorsAnnotation(
+          od as api.GoogleCloudVisionV1p2beta1DominantColorsAnnotation);
     });
   });
 
@@ -10742,7 +11216,8 @@
       var o = buildGoogleCloudVisionV1p2beta1EntityAnnotation();
       var od =
           api.GoogleCloudVisionV1p2beta1EntityAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1EntityAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1EntityAnnotation(
+          od as api.GoogleCloudVisionV1p2beta1EntityAnnotation);
     });
   });
 
@@ -10751,7 +11226,8 @@
       var o = buildGoogleCloudVisionV1p2beta1FaceAnnotation();
       var od =
           api.GoogleCloudVisionV1p2beta1FaceAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1FaceAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1FaceAnnotation(
+          od as api.GoogleCloudVisionV1p2beta1FaceAnnotation);
     });
   });
 
@@ -10761,7 +11237,8 @@
       var o = buildGoogleCloudVisionV1p2beta1FaceAnnotationLandmark();
       var od = api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1FaceAnnotationLandmark(od);
+      checkGoogleCloudVisionV1p2beta1FaceAnnotationLandmark(
+          od as api.GoogleCloudVisionV1p2beta1FaceAnnotationLandmark);
     });
   });
 
@@ -10770,7 +11247,8 @@
       var o = buildGoogleCloudVisionV1p2beta1GcsDestination();
       var od =
           api.GoogleCloudVisionV1p2beta1GcsDestination.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1GcsDestination(od);
+      checkGoogleCloudVisionV1p2beta1GcsDestination(
+          od as api.GoogleCloudVisionV1p2beta1GcsDestination);
     });
   });
 
@@ -10778,7 +11256,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1GcsSource();
       var od = api.GoogleCloudVisionV1p2beta1GcsSource.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1GcsSource(od);
+      checkGoogleCloudVisionV1p2beta1GcsSource(
+          od as api.GoogleCloudVisionV1p2beta1GcsSource);
     });
   });
 
@@ -10788,7 +11267,8 @@
       var o = buildGoogleCloudVisionV1p2beta1ImageAnnotationContext();
       var od = api.GoogleCloudVisionV1p2beta1ImageAnnotationContext.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1ImageAnnotationContext(od);
+      checkGoogleCloudVisionV1p2beta1ImageAnnotationContext(
+          od as api.GoogleCloudVisionV1p2beta1ImageAnnotationContext);
     });
   });
 
@@ -10797,7 +11277,8 @@
       var o = buildGoogleCloudVisionV1p2beta1ImageProperties();
       var od =
           api.GoogleCloudVisionV1p2beta1ImageProperties.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1ImageProperties(od);
+      checkGoogleCloudVisionV1p2beta1ImageProperties(
+          od as api.GoogleCloudVisionV1p2beta1ImageProperties);
     });
   });
 
@@ -10805,7 +11286,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1InputConfig();
       var od = api.GoogleCloudVisionV1p2beta1InputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1InputConfig(od);
+      checkGoogleCloudVisionV1p2beta1InputConfig(
+          od as api.GoogleCloudVisionV1p2beta1InputConfig);
     });
   });
 
@@ -10815,7 +11297,8 @@
       var o = buildGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation();
       var od = api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1LocalizedObjectAnnotation(
+          od as api.GoogleCloudVisionV1p2beta1LocalizedObjectAnnotation);
     });
   });
 
@@ -10823,7 +11306,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1LocationInfo();
       var od = api.GoogleCloudVisionV1p2beta1LocationInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1LocationInfo(od);
+      checkGoogleCloudVisionV1p2beta1LocationInfo(
+          od as api.GoogleCloudVisionV1p2beta1LocationInfo);
     });
   });
 
@@ -10832,7 +11316,8 @@
       var o = buildGoogleCloudVisionV1p2beta1NormalizedVertex();
       var od =
           api.GoogleCloudVisionV1p2beta1NormalizedVertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1NormalizedVertex(od);
+      checkGoogleCloudVisionV1p2beta1NormalizedVertex(
+          od as api.GoogleCloudVisionV1p2beta1NormalizedVertex);
     });
   });
 
@@ -10841,7 +11326,8 @@
       var o = buildGoogleCloudVisionV1p2beta1OperationMetadata();
       var od =
           api.GoogleCloudVisionV1p2beta1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1OperationMetadata(od);
+      checkGoogleCloudVisionV1p2beta1OperationMetadata(
+          od as api.GoogleCloudVisionV1p2beta1OperationMetadata);
     });
   });
 
@@ -10849,7 +11335,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1OutputConfig();
       var od = api.GoogleCloudVisionV1p2beta1OutputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1OutputConfig(od);
+      checkGoogleCloudVisionV1p2beta1OutputConfig(
+          od as api.GoogleCloudVisionV1p2beta1OutputConfig);
     });
   });
 
@@ -10857,7 +11344,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Page();
       var od = api.GoogleCloudVisionV1p2beta1Page.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Page(od);
+      checkGoogleCloudVisionV1p2beta1Page(
+          od as api.GoogleCloudVisionV1p2beta1Page);
     });
   });
 
@@ -10865,7 +11353,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Paragraph();
       var od = api.GoogleCloudVisionV1p2beta1Paragraph.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Paragraph(od);
+      checkGoogleCloudVisionV1p2beta1Paragraph(
+          od as api.GoogleCloudVisionV1p2beta1Paragraph);
     });
   });
 
@@ -10873,7 +11362,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Position();
       var od = api.GoogleCloudVisionV1p2beta1Position.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Position(od);
+      checkGoogleCloudVisionV1p2beta1Position(
+          od as api.GoogleCloudVisionV1p2beta1Position);
     });
   });
 
@@ -10881,7 +11371,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Product();
       var od = api.GoogleCloudVisionV1p2beta1Product.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Product(od);
+      checkGoogleCloudVisionV1p2beta1Product(
+          od as api.GoogleCloudVisionV1p2beta1Product);
     });
   });
 
@@ -10890,7 +11381,8 @@
       var o = buildGoogleCloudVisionV1p2beta1ProductKeyValue();
       var od =
           api.GoogleCloudVisionV1p2beta1ProductKeyValue.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1ProductKeyValue(od);
+      checkGoogleCloudVisionV1p2beta1ProductKeyValue(
+          od as api.GoogleCloudVisionV1p2beta1ProductKeyValue);
     });
   });
 
@@ -10900,7 +11392,8 @@
       var o = buildGoogleCloudVisionV1p2beta1ProductSearchResults();
       var od = api.GoogleCloudVisionV1p2beta1ProductSearchResults.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1ProductSearchResults(od);
+      checkGoogleCloudVisionV1p2beta1ProductSearchResults(
+          od as api.GoogleCloudVisionV1p2beta1ProductSearchResults);
     });
   });
 
@@ -10912,7 +11405,8 @@
           buildGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult();
       var od = api.GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult(od);
+      checkGoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult(od
+          as api.GoogleCloudVisionV1p2beta1ProductSearchResultsGroupedResult);
     });
   });
 
@@ -10925,7 +11419,9 @@
       var od =
           api.GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation(od
+          as api
+              .GoogleCloudVisionV1p2beta1ProductSearchResultsObjectAnnotation);
     });
   });
 
@@ -10936,7 +11432,8 @@
       var od =
           api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(od);
+      checkGoogleCloudVisionV1p2beta1ProductSearchResultsResult(
+          od as api.GoogleCloudVisionV1p2beta1ProductSearchResultsResult);
     });
   });
 
@@ -10944,7 +11441,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Property();
       var od = api.GoogleCloudVisionV1p2beta1Property.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Property(od);
+      checkGoogleCloudVisionV1p2beta1Property(
+          od as api.GoogleCloudVisionV1p2beta1Property);
     });
   });
 
@@ -10954,7 +11452,8 @@
       var o = buildGoogleCloudVisionV1p2beta1SafeSearchAnnotation();
       var od = api.GoogleCloudVisionV1p2beta1SafeSearchAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1SafeSearchAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1SafeSearchAnnotation(
+          od as api.GoogleCloudVisionV1p2beta1SafeSearchAnnotation);
     });
   });
 
@@ -10962,7 +11461,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Symbol();
       var od = api.GoogleCloudVisionV1p2beta1Symbol.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Symbol(od);
+      checkGoogleCloudVisionV1p2beta1Symbol(
+          od as api.GoogleCloudVisionV1p2beta1Symbol);
     });
   });
 
@@ -10971,7 +11471,8 @@
       var o = buildGoogleCloudVisionV1p2beta1TextAnnotation();
       var od =
           api.GoogleCloudVisionV1p2beta1TextAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1TextAnnotation(od);
+      checkGoogleCloudVisionV1p2beta1TextAnnotation(
+          od as api.GoogleCloudVisionV1p2beta1TextAnnotation);
     });
   });
 
@@ -10982,7 +11483,8 @@
       var od =
           api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak(od);
+      checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak(
+          od as api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedBreak);
     });
   });
 
@@ -10994,7 +11496,8 @@
       var od =
           api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage(od);
+      checkGoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage(
+          od as api.GoogleCloudVisionV1p2beta1TextAnnotationDetectedLanguage);
     });
   });
 
@@ -11005,7 +11508,8 @@
       var od =
           api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(od);
+      checkGoogleCloudVisionV1p2beta1TextAnnotationTextProperty(
+          od as api.GoogleCloudVisionV1p2beta1TextAnnotationTextProperty);
     });
   });
 
@@ -11013,7 +11517,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Vertex();
       var od = api.GoogleCloudVisionV1p2beta1Vertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Vertex(od);
+      checkGoogleCloudVisionV1p2beta1Vertex(
+          od as api.GoogleCloudVisionV1p2beta1Vertex);
     });
   });
 
@@ -11021,7 +11526,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1WebDetection();
       var od = api.GoogleCloudVisionV1p2beta1WebDetection.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1WebDetection(od);
+      checkGoogleCloudVisionV1p2beta1WebDetection(
+          od as api.GoogleCloudVisionV1p2beta1WebDetection);
     });
   });
 
@@ -11031,7 +11537,8 @@
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebEntity();
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1WebDetectionWebEntity(od);
+      checkGoogleCloudVisionV1p2beta1WebDetectionWebEntity(
+          od as api.GoogleCloudVisionV1p2beta1WebDetectionWebEntity);
     });
   });
 
@@ -11041,7 +11548,8 @@
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebImage();
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebImage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(od);
+      checkGoogleCloudVisionV1p2beta1WebDetectionWebImage(
+          od as api.GoogleCloudVisionV1p2beta1WebDetectionWebImage);
     });
   });
 
@@ -11051,7 +11559,8 @@
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebLabel();
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebLabel.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1WebDetectionWebLabel(od);
+      checkGoogleCloudVisionV1p2beta1WebDetectionWebLabel(
+          od as api.GoogleCloudVisionV1p2beta1WebDetectionWebLabel);
     });
   });
 
@@ -11061,7 +11570,8 @@
       var o = buildGoogleCloudVisionV1p2beta1WebDetectionWebPage();
       var od = api.GoogleCloudVisionV1p2beta1WebDetectionWebPage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p2beta1WebDetectionWebPage(od);
+      checkGoogleCloudVisionV1p2beta1WebDetectionWebPage(
+          od as api.GoogleCloudVisionV1p2beta1WebDetectionWebPage);
     });
   });
 
@@ -11069,7 +11579,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p2beta1Word();
       var od = api.GoogleCloudVisionV1p2beta1Word.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p2beta1Word(od);
+      checkGoogleCloudVisionV1p2beta1Word(
+          od as api.GoogleCloudVisionV1p2beta1Word);
     });
   });
 
@@ -11079,7 +11590,8 @@
       var o = buildGoogleCloudVisionV1p3beta1AnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p3beta1AnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1AnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p3beta1AnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p3beta1AnnotateFileResponse);
     });
   });
 
@@ -11089,7 +11601,8 @@
       var o = buildGoogleCloudVisionV1p3beta1AnnotateImageResponse();
       var od = api.GoogleCloudVisionV1p3beta1AnnotateImageResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1AnnotateImageResponse(od);
+      checkGoogleCloudVisionV1p3beta1AnnotateImageResponse(
+          od as api.GoogleCloudVisionV1p3beta1AnnotateImageResponse);
     });
   });
 
@@ -11099,7 +11612,8 @@
       var o = buildGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p3beta1AsyncAnnotateFileResponse);
     });
   });
 
@@ -11110,7 +11624,8 @@
       var o = buildGoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse();
       var od = api.GoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse(od);
+      checkGoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse(
+          od as api.GoogleCloudVisionV1p3beta1AsyncBatchAnnotateFilesResponse);
     });
   });
 
@@ -11120,7 +11635,8 @@
       var o = buildGoogleCloudVisionV1p3beta1BatchOperationMetadata();
       var od = api.GoogleCloudVisionV1p3beta1BatchOperationMetadata.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1BatchOperationMetadata(od);
+      checkGoogleCloudVisionV1p3beta1BatchOperationMetadata(
+          od as api.GoogleCloudVisionV1p3beta1BatchOperationMetadata);
     });
   });
 
@@ -11128,7 +11644,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Block();
       var od = api.GoogleCloudVisionV1p3beta1Block.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Block(od);
+      checkGoogleCloudVisionV1p3beta1Block(
+          od as api.GoogleCloudVisionV1p3beta1Block);
     });
   });
 
@@ -11136,7 +11653,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1BoundingPoly();
       var od = api.GoogleCloudVisionV1p3beta1BoundingPoly.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1BoundingPoly(od);
+      checkGoogleCloudVisionV1p3beta1BoundingPoly(
+          od as api.GoogleCloudVisionV1p3beta1BoundingPoly);
     });
   });
 
@@ -11144,7 +11662,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1ColorInfo();
       var od = api.GoogleCloudVisionV1p3beta1ColorInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1ColorInfo(od);
+      checkGoogleCloudVisionV1p3beta1ColorInfo(
+          od as api.GoogleCloudVisionV1p3beta1ColorInfo);
     });
   });
 
@@ -11152,7 +11671,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1CropHint();
       var od = api.GoogleCloudVisionV1p3beta1CropHint.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1CropHint(od);
+      checkGoogleCloudVisionV1p3beta1CropHint(
+          od as api.GoogleCloudVisionV1p3beta1CropHint);
     });
   });
 
@@ -11162,7 +11682,8 @@
       var o = buildGoogleCloudVisionV1p3beta1CropHintsAnnotation();
       var od = api.GoogleCloudVisionV1p3beta1CropHintsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1CropHintsAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1CropHintsAnnotation(
+          od as api.GoogleCloudVisionV1p3beta1CropHintsAnnotation);
     });
   });
 
@@ -11172,7 +11693,8 @@
       var o = buildGoogleCloudVisionV1p3beta1DominantColorsAnnotation();
       var od = api.GoogleCloudVisionV1p3beta1DominantColorsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1DominantColorsAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1DominantColorsAnnotation(
+          od as api.GoogleCloudVisionV1p3beta1DominantColorsAnnotation);
     });
   });
 
@@ -11181,7 +11703,8 @@
       var o = buildGoogleCloudVisionV1p3beta1EntityAnnotation();
       var od =
           api.GoogleCloudVisionV1p3beta1EntityAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1EntityAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1EntityAnnotation(
+          od as api.GoogleCloudVisionV1p3beta1EntityAnnotation);
     });
   });
 
@@ -11190,7 +11713,8 @@
       var o = buildGoogleCloudVisionV1p3beta1FaceAnnotation();
       var od =
           api.GoogleCloudVisionV1p3beta1FaceAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1FaceAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1FaceAnnotation(
+          od as api.GoogleCloudVisionV1p3beta1FaceAnnotation);
     });
   });
 
@@ -11200,7 +11724,8 @@
       var o = buildGoogleCloudVisionV1p3beta1FaceAnnotationLandmark();
       var od = api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1FaceAnnotationLandmark(od);
+      checkGoogleCloudVisionV1p3beta1FaceAnnotationLandmark(
+          od as api.GoogleCloudVisionV1p3beta1FaceAnnotationLandmark);
     });
   });
 
@@ -11209,7 +11734,8 @@
       var o = buildGoogleCloudVisionV1p3beta1GcsDestination();
       var od =
           api.GoogleCloudVisionV1p3beta1GcsDestination.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1GcsDestination(od);
+      checkGoogleCloudVisionV1p3beta1GcsDestination(
+          od as api.GoogleCloudVisionV1p3beta1GcsDestination);
     });
   });
 
@@ -11217,7 +11743,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1GcsSource();
       var od = api.GoogleCloudVisionV1p3beta1GcsSource.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1GcsSource(od);
+      checkGoogleCloudVisionV1p3beta1GcsSource(
+          od as api.GoogleCloudVisionV1p3beta1GcsSource);
     });
   });
 
@@ -11227,7 +11754,8 @@
       var o = buildGoogleCloudVisionV1p3beta1ImageAnnotationContext();
       var od = api.GoogleCloudVisionV1p3beta1ImageAnnotationContext.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1ImageAnnotationContext(od);
+      checkGoogleCloudVisionV1p3beta1ImageAnnotationContext(
+          od as api.GoogleCloudVisionV1p3beta1ImageAnnotationContext);
     });
   });
 
@@ -11236,7 +11764,8 @@
       var o = buildGoogleCloudVisionV1p3beta1ImageProperties();
       var od =
           api.GoogleCloudVisionV1p3beta1ImageProperties.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1ImageProperties(od);
+      checkGoogleCloudVisionV1p3beta1ImageProperties(
+          od as api.GoogleCloudVisionV1p3beta1ImageProperties);
     });
   });
 
@@ -11246,7 +11775,8 @@
       var o = buildGoogleCloudVisionV1p3beta1ImportProductSetsResponse();
       var od = api.GoogleCloudVisionV1p3beta1ImportProductSetsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1ImportProductSetsResponse(od);
+      checkGoogleCloudVisionV1p3beta1ImportProductSetsResponse(
+          od as api.GoogleCloudVisionV1p3beta1ImportProductSetsResponse);
     });
   });
 
@@ -11254,7 +11784,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1InputConfig();
       var od = api.GoogleCloudVisionV1p3beta1InputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1InputConfig(od);
+      checkGoogleCloudVisionV1p3beta1InputConfig(
+          od as api.GoogleCloudVisionV1p3beta1InputConfig);
     });
   });
 
@@ -11264,7 +11795,8 @@
       var o = buildGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation();
       var od = api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1LocalizedObjectAnnotation(
+          od as api.GoogleCloudVisionV1p3beta1LocalizedObjectAnnotation);
     });
   });
 
@@ -11272,7 +11804,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1LocationInfo();
       var od = api.GoogleCloudVisionV1p3beta1LocationInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1LocationInfo(od);
+      checkGoogleCloudVisionV1p3beta1LocationInfo(
+          od as api.GoogleCloudVisionV1p3beta1LocationInfo);
     });
   });
 
@@ -11281,7 +11814,8 @@
       var o = buildGoogleCloudVisionV1p3beta1NormalizedVertex();
       var od =
           api.GoogleCloudVisionV1p3beta1NormalizedVertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1NormalizedVertex(od);
+      checkGoogleCloudVisionV1p3beta1NormalizedVertex(
+          od as api.GoogleCloudVisionV1p3beta1NormalizedVertex);
     });
   });
 
@@ -11290,7 +11824,8 @@
       var o = buildGoogleCloudVisionV1p3beta1OperationMetadata();
       var od =
           api.GoogleCloudVisionV1p3beta1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1OperationMetadata(od);
+      checkGoogleCloudVisionV1p3beta1OperationMetadata(
+          od as api.GoogleCloudVisionV1p3beta1OperationMetadata);
     });
   });
 
@@ -11298,7 +11833,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1OutputConfig();
       var od = api.GoogleCloudVisionV1p3beta1OutputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1OutputConfig(od);
+      checkGoogleCloudVisionV1p3beta1OutputConfig(
+          od as api.GoogleCloudVisionV1p3beta1OutputConfig);
     });
   });
 
@@ -11306,7 +11842,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Page();
       var od = api.GoogleCloudVisionV1p3beta1Page.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Page(od);
+      checkGoogleCloudVisionV1p3beta1Page(
+          od as api.GoogleCloudVisionV1p3beta1Page);
     });
   });
 
@@ -11314,7 +11851,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Paragraph();
       var od = api.GoogleCloudVisionV1p3beta1Paragraph.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Paragraph(od);
+      checkGoogleCloudVisionV1p3beta1Paragraph(
+          od as api.GoogleCloudVisionV1p3beta1Paragraph);
     });
   });
 
@@ -11322,7 +11860,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Position();
       var od = api.GoogleCloudVisionV1p3beta1Position.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Position(od);
+      checkGoogleCloudVisionV1p3beta1Position(
+          od as api.GoogleCloudVisionV1p3beta1Position);
     });
   });
 
@@ -11330,7 +11869,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Product();
       var od = api.GoogleCloudVisionV1p3beta1Product.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Product(od);
+      checkGoogleCloudVisionV1p3beta1Product(
+          od as api.GoogleCloudVisionV1p3beta1Product);
     });
   });
 
@@ -11339,7 +11879,8 @@
       var o = buildGoogleCloudVisionV1p3beta1ProductKeyValue();
       var od =
           api.GoogleCloudVisionV1p3beta1ProductKeyValue.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1ProductKeyValue(od);
+      checkGoogleCloudVisionV1p3beta1ProductKeyValue(
+          od as api.GoogleCloudVisionV1p3beta1ProductKeyValue);
     });
   });
 
@@ -11349,7 +11890,8 @@
       var o = buildGoogleCloudVisionV1p3beta1ProductSearchResults();
       var od = api.GoogleCloudVisionV1p3beta1ProductSearchResults.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1ProductSearchResults(od);
+      checkGoogleCloudVisionV1p3beta1ProductSearchResults(
+          od as api.GoogleCloudVisionV1p3beta1ProductSearchResults);
     });
   });
 
@@ -11361,7 +11903,8 @@
           buildGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult();
       var od = api.GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult(od);
+      checkGoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult(od
+          as api.GoogleCloudVisionV1p3beta1ProductSearchResultsGroupedResult);
     });
   });
 
@@ -11374,7 +11917,9 @@
       var od =
           api.GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation(od
+          as api
+              .GoogleCloudVisionV1p3beta1ProductSearchResultsObjectAnnotation);
     });
   });
 
@@ -11385,7 +11930,8 @@
       var od =
           api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(od);
+      checkGoogleCloudVisionV1p3beta1ProductSearchResultsResult(
+          od as api.GoogleCloudVisionV1p3beta1ProductSearchResultsResult);
     });
   });
 
@@ -11393,7 +11939,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Property();
       var od = api.GoogleCloudVisionV1p3beta1Property.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Property(od);
+      checkGoogleCloudVisionV1p3beta1Property(
+          od as api.GoogleCloudVisionV1p3beta1Property);
     });
   });
 
@@ -11402,7 +11949,8 @@
       var o = buildGoogleCloudVisionV1p3beta1ReferenceImage();
       var od =
           api.GoogleCloudVisionV1p3beta1ReferenceImage.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1ReferenceImage(od);
+      checkGoogleCloudVisionV1p3beta1ReferenceImage(
+          od as api.GoogleCloudVisionV1p3beta1ReferenceImage);
     });
   });
 
@@ -11412,7 +11960,8 @@
       var o = buildGoogleCloudVisionV1p3beta1SafeSearchAnnotation();
       var od = api.GoogleCloudVisionV1p3beta1SafeSearchAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1SafeSearchAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1SafeSearchAnnotation(
+          od as api.GoogleCloudVisionV1p3beta1SafeSearchAnnotation);
     });
   });
 
@@ -11420,7 +11969,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Symbol();
       var od = api.GoogleCloudVisionV1p3beta1Symbol.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Symbol(od);
+      checkGoogleCloudVisionV1p3beta1Symbol(
+          od as api.GoogleCloudVisionV1p3beta1Symbol);
     });
   });
 
@@ -11429,7 +11979,8 @@
       var o = buildGoogleCloudVisionV1p3beta1TextAnnotation();
       var od =
           api.GoogleCloudVisionV1p3beta1TextAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1TextAnnotation(od);
+      checkGoogleCloudVisionV1p3beta1TextAnnotation(
+          od as api.GoogleCloudVisionV1p3beta1TextAnnotation);
     });
   });
 
@@ -11440,7 +11991,8 @@
       var od =
           api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak(od);
+      checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak(
+          od as api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedBreak);
     });
   });
 
@@ -11452,7 +12004,8 @@
       var od =
           api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage(od);
+      checkGoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage(
+          od as api.GoogleCloudVisionV1p3beta1TextAnnotationDetectedLanguage);
     });
   });
 
@@ -11463,7 +12016,8 @@
       var od =
           api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(od);
+      checkGoogleCloudVisionV1p3beta1TextAnnotationTextProperty(
+          od as api.GoogleCloudVisionV1p3beta1TextAnnotationTextProperty);
     });
   });
 
@@ -11471,7 +12025,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Vertex();
       var od = api.GoogleCloudVisionV1p3beta1Vertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Vertex(od);
+      checkGoogleCloudVisionV1p3beta1Vertex(
+          od as api.GoogleCloudVisionV1p3beta1Vertex);
     });
   });
 
@@ -11479,7 +12034,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1WebDetection();
       var od = api.GoogleCloudVisionV1p3beta1WebDetection.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1WebDetection(od);
+      checkGoogleCloudVisionV1p3beta1WebDetection(
+          od as api.GoogleCloudVisionV1p3beta1WebDetection);
     });
   });
 
@@ -11489,7 +12045,8 @@
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebEntity();
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1WebDetectionWebEntity(od);
+      checkGoogleCloudVisionV1p3beta1WebDetectionWebEntity(
+          od as api.GoogleCloudVisionV1p3beta1WebDetectionWebEntity);
     });
   });
 
@@ -11499,7 +12056,8 @@
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebImage();
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebImage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(od);
+      checkGoogleCloudVisionV1p3beta1WebDetectionWebImage(
+          od as api.GoogleCloudVisionV1p3beta1WebDetectionWebImage);
     });
   });
 
@@ -11509,7 +12067,8 @@
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebLabel();
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebLabel.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1WebDetectionWebLabel(od);
+      checkGoogleCloudVisionV1p3beta1WebDetectionWebLabel(
+          od as api.GoogleCloudVisionV1p3beta1WebDetectionWebLabel);
     });
   });
 
@@ -11519,7 +12078,8 @@
       var o = buildGoogleCloudVisionV1p3beta1WebDetectionWebPage();
       var od = api.GoogleCloudVisionV1p3beta1WebDetectionWebPage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p3beta1WebDetectionWebPage(od);
+      checkGoogleCloudVisionV1p3beta1WebDetectionWebPage(
+          od as api.GoogleCloudVisionV1p3beta1WebDetectionWebPage);
     });
   });
 
@@ -11527,7 +12087,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p3beta1Word();
       var od = api.GoogleCloudVisionV1p3beta1Word.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p3beta1Word(od);
+      checkGoogleCloudVisionV1p3beta1Word(
+          od as api.GoogleCloudVisionV1p3beta1Word);
     });
   });
 
@@ -11537,7 +12098,8 @@
       var o = buildGoogleCloudVisionV1p4beta1AnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p4beta1AnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1AnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p4beta1AnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p4beta1AnnotateFileResponse);
     });
   });
 
@@ -11547,7 +12109,8 @@
       var o = buildGoogleCloudVisionV1p4beta1AnnotateImageResponse();
       var od = api.GoogleCloudVisionV1p4beta1AnnotateImageResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1AnnotateImageResponse(od);
+      checkGoogleCloudVisionV1p4beta1AnnotateImageResponse(
+          od as api.GoogleCloudVisionV1p4beta1AnnotateImageResponse);
     });
   });
 
@@ -11557,7 +12120,8 @@
       var o = buildGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse();
       var od = api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse(od);
+      checkGoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse(
+          od as api.GoogleCloudVisionV1p4beta1AsyncAnnotateFileResponse);
     });
   });
 
@@ -11568,7 +12132,8 @@
       var o = buildGoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse();
       var od = api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse(od);
+      checkGoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse(
+          od as api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateFilesResponse);
     });
   });
 
@@ -11579,7 +12144,8 @@
       var o = buildGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse();
       var od = api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse(od);
+      checkGoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse(
+          od as api.GoogleCloudVisionV1p4beta1AsyncBatchAnnotateImagesResponse);
     });
   });
 
@@ -11590,7 +12156,8 @@
       var od =
           api.GoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse(od);
+      checkGoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse(
+          od as api.GoogleCloudVisionV1p4beta1BatchAnnotateFilesResponse);
     });
   });
 
@@ -11600,7 +12167,8 @@
       var o = buildGoogleCloudVisionV1p4beta1BatchOperationMetadata();
       var od = api.GoogleCloudVisionV1p4beta1BatchOperationMetadata.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1BatchOperationMetadata(od);
+      checkGoogleCloudVisionV1p4beta1BatchOperationMetadata(
+          od as api.GoogleCloudVisionV1p4beta1BatchOperationMetadata);
     });
   });
 
@@ -11608,7 +12176,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Block();
       var od = api.GoogleCloudVisionV1p4beta1Block.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Block(od);
+      checkGoogleCloudVisionV1p4beta1Block(
+          od as api.GoogleCloudVisionV1p4beta1Block);
     });
   });
 
@@ -11616,7 +12185,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1BoundingPoly();
       var od = api.GoogleCloudVisionV1p4beta1BoundingPoly.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1BoundingPoly(od);
+      checkGoogleCloudVisionV1p4beta1BoundingPoly(
+          od as api.GoogleCloudVisionV1p4beta1BoundingPoly);
     });
   });
 
@@ -11624,7 +12194,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Celebrity();
       var od = api.GoogleCloudVisionV1p4beta1Celebrity.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Celebrity(od);
+      checkGoogleCloudVisionV1p4beta1Celebrity(
+          od as api.GoogleCloudVisionV1p4beta1Celebrity);
     });
   });
 
@@ -11632,7 +12203,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1ColorInfo();
       var od = api.GoogleCloudVisionV1p4beta1ColorInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1ColorInfo(od);
+      checkGoogleCloudVisionV1p4beta1ColorInfo(
+          od as api.GoogleCloudVisionV1p4beta1ColorInfo);
     });
   });
 
@@ -11640,7 +12212,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1CropHint();
       var od = api.GoogleCloudVisionV1p4beta1CropHint.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1CropHint(od);
+      checkGoogleCloudVisionV1p4beta1CropHint(
+          od as api.GoogleCloudVisionV1p4beta1CropHint);
     });
   });
 
@@ -11650,7 +12223,8 @@
       var o = buildGoogleCloudVisionV1p4beta1CropHintsAnnotation();
       var od = api.GoogleCloudVisionV1p4beta1CropHintsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1CropHintsAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1CropHintsAnnotation(
+          od as api.GoogleCloudVisionV1p4beta1CropHintsAnnotation);
     });
   });
 
@@ -11660,7 +12234,8 @@
       var o = buildGoogleCloudVisionV1p4beta1DominantColorsAnnotation();
       var od = api.GoogleCloudVisionV1p4beta1DominantColorsAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1DominantColorsAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1DominantColorsAnnotation(
+          od as api.GoogleCloudVisionV1p4beta1DominantColorsAnnotation);
     });
   });
 
@@ -11669,7 +12244,8 @@
       var o = buildGoogleCloudVisionV1p4beta1EntityAnnotation();
       var od =
           api.GoogleCloudVisionV1p4beta1EntityAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1EntityAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1EntityAnnotation(
+          od as api.GoogleCloudVisionV1p4beta1EntityAnnotation);
     });
   });
 
@@ -11678,7 +12254,8 @@
       var o = buildGoogleCloudVisionV1p4beta1FaceAnnotation();
       var od =
           api.GoogleCloudVisionV1p4beta1FaceAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1FaceAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1FaceAnnotation(
+          od as api.GoogleCloudVisionV1p4beta1FaceAnnotation);
     });
   });
 
@@ -11688,7 +12265,8 @@
       var o = buildGoogleCloudVisionV1p4beta1FaceAnnotationLandmark();
       var od = api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1FaceAnnotationLandmark(od);
+      checkGoogleCloudVisionV1p4beta1FaceAnnotationLandmark(
+          od as api.GoogleCloudVisionV1p4beta1FaceAnnotationLandmark);
     });
   });
 
@@ -11698,7 +12276,8 @@
       var o = buildGoogleCloudVisionV1p4beta1FaceRecognitionResult();
       var od = api.GoogleCloudVisionV1p4beta1FaceRecognitionResult.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1FaceRecognitionResult(od);
+      checkGoogleCloudVisionV1p4beta1FaceRecognitionResult(
+          od as api.GoogleCloudVisionV1p4beta1FaceRecognitionResult);
     });
   });
 
@@ -11707,7 +12286,8 @@
       var o = buildGoogleCloudVisionV1p4beta1GcsDestination();
       var od =
           api.GoogleCloudVisionV1p4beta1GcsDestination.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1GcsDestination(od);
+      checkGoogleCloudVisionV1p4beta1GcsDestination(
+          od as api.GoogleCloudVisionV1p4beta1GcsDestination);
     });
   });
 
@@ -11715,7 +12295,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1GcsSource();
       var od = api.GoogleCloudVisionV1p4beta1GcsSource.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1GcsSource(od);
+      checkGoogleCloudVisionV1p4beta1GcsSource(
+          od as api.GoogleCloudVisionV1p4beta1GcsSource);
     });
   });
 
@@ -11725,7 +12306,8 @@
       var o = buildGoogleCloudVisionV1p4beta1ImageAnnotationContext();
       var od = api.GoogleCloudVisionV1p4beta1ImageAnnotationContext.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1ImageAnnotationContext(od);
+      checkGoogleCloudVisionV1p4beta1ImageAnnotationContext(
+          od as api.GoogleCloudVisionV1p4beta1ImageAnnotationContext);
     });
   });
 
@@ -11734,7 +12316,8 @@
       var o = buildGoogleCloudVisionV1p4beta1ImageProperties();
       var od =
           api.GoogleCloudVisionV1p4beta1ImageProperties.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1ImageProperties(od);
+      checkGoogleCloudVisionV1p4beta1ImageProperties(
+          od as api.GoogleCloudVisionV1p4beta1ImageProperties);
     });
   });
 
@@ -11744,7 +12327,8 @@
       var o = buildGoogleCloudVisionV1p4beta1ImportProductSetsResponse();
       var od = api.GoogleCloudVisionV1p4beta1ImportProductSetsResponse.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1ImportProductSetsResponse(od);
+      checkGoogleCloudVisionV1p4beta1ImportProductSetsResponse(
+          od as api.GoogleCloudVisionV1p4beta1ImportProductSetsResponse);
     });
   });
 
@@ -11752,7 +12336,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1InputConfig();
       var od = api.GoogleCloudVisionV1p4beta1InputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1InputConfig(od);
+      checkGoogleCloudVisionV1p4beta1InputConfig(
+          od as api.GoogleCloudVisionV1p4beta1InputConfig);
     });
   });
 
@@ -11762,7 +12347,8 @@
       var o = buildGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation();
       var od = api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1LocalizedObjectAnnotation(
+          od as api.GoogleCloudVisionV1p4beta1LocalizedObjectAnnotation);
     });
   });
 
@@ -11770,7 +12356,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1LocationInfo();
       var od = api.GoogleCloudVisionV1p4beta1LocationInfo.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1LocationInfo(od);
+      checkGoogleCloudVisionV1p4beta1LocationInfo(
+          od as api.GoogleCloudVisionV1p4beta1LocationInfo);
     });
   });
 
@@ -11779,7 +12366,8 @@
       var o = buildGoogleCloudVisionV1p4beta1NormalizedVertex();
       var od =
           api.GoogleCloudVisionV1p4beta1NormalizedVertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1NormalizedVertex(od);
+      checkGoogleCloudVisionV1p4beta1NormalizedVertex(
+          od as api.GoogleCloudVisionV1p4beta1NormalizedVertex);
     });
   });
 
@@ -11788,7 +12376,8 @@
       var o = buildGoogleCloudVisionV1p4beta1OperationMetadata();
       var od =
           api.GoogleCloudVisionV1p4beta1OperationMetadata.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1OperationMetadata(od);
+      checkGoogleCloudVisionV1p4beta1OperationMetadata(
+          od as api.GoogleCloudVisionV1p4beta1OperationMetadata);
     });
   });
 
@@ -11796,7 +12385,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1OutputConfig();
       var od = api.GoogleCloudVisionV1p4beta1OutputConfig.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1OutputConfig(od);
+      checkGoogleCloudVisionV1p4beta1OutputConfig(
+          od as api.GoogleCloudVisionV1p4beta1OutputConfig);
     });
   });
 
@@ -11804,7 +12394,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Page();
       var od = api.GoogleCloudVisionV1p4beta1Page.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Page(od);
+      checkGoogleCloudVisionV1p4beta1Page(
+          od as api.GoogleCloudVisionV1p4beta1Page);
     });
   });
 
@@ -11812,7 +12403,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Paragraph();
       var od = api.GoogleCloudVisionV1p4beta1Paragraph.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Paragraph(od);
+      checkGoogleCloudVisionV1p4beta1Paragraph(
+          od as api.GoogleCloudVisionV1p4beta1Paragraph);
     });
   });
 
@@ -11820,7 +12412,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Position();
       var od = api.GoogleCloudVisionV1p4beta1Position.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Position(od);
+      checkGoogleCloudVisionV1p4beta1Position(
+          od as api.GoogleCloudVisionV1p4beta1Position);
     });
   });
 
@@ -11828,7 +12421,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Product();
       var od = api.GoogleCloudVisionV1p4beta1Product.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Product(od);
+      checkGoogleCloudVisionV1p4beta1Product(
+          od as api.GoogleCloudVisionV1p4beta1Product);
     });
   });
 
@@ -11837,7 +12431,8 @@
       var o = buildGoogleCloudVisionV1p4beta1ProductKeyValue();
       var od =
           api.GoogleCloudVisionV1p4beta1ProductKeyValue.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1ProductKeyValue(od);
+      checkGoogleCloudVisionV1p4beta1ProductKeyValue(
+          od as api.GoogleCloudVisionV1p4beta1ProductKeyValue);
     });
   });
 
@@ -11847,7 +12442,8 @@
       var o = buildGoogleCloudVisionV1p4beta1ProductSearchResults();
       var od = api.GoogleCloudVisionV1p4beta1ProductSearchResults.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1ProductSearchResults(od);
+      checkGoogleCloudVisionV1p4beta1ProductSearchResults(
+          od as api.GoogleCloudVisionV1p4beta1ProductSearchResults);
     });
   });
 
@@ -11859,7 +12455,8 @@
           buildGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult();
       var od = api.GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult
           .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult(od);
+      checkGoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult(od
+          as api.GoogleCloudVisionV1p4beta1ProductSearchResultsGroupedResult);
     });
   });
 
@@ -11872,7 +12469,9 @@
       var od =
           api.GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation
               .fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation(od
+          as api
+              .GoogleCloudVisionV1p4beta1ProductSearchResultsObjectAnnotation);
     });
   });
 
@@ -11883,7 +12482,8 @@
       var od =
           api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(od);
+      checkGoogleCloudVisionV1p4beta1ProductSearchResultsResult(
+          od as api.GoogleCloudVisionV1p4beta1ProductSearchResultsResult);
     });
   });
 
@@ -11891,7 +12491,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Property();
       var od = api.GoogleCloudVisionV1p4beta1Property.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Property(od);
+      checkGoogleCloudVisionV1p4beta1Property(
+          od as api.GoogleCloudVisionV1p4beta1Property);
     });
   });
 
@@ -11900,7 +12501,8 @@
       var o = buildGoogleCloudVisionV1p4beta1ReferenceImage();
       var od =
           api.GoogleCloudVisionV1p4beta1ReferenceImage.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1ReferenceImage(od);
+      checkGoogleCloudVisionV1p4beta1ReferenceImage(
+          od as api.GoogleCloudVisionV1p4beta1ReferenceImage);
     });
   });
 
@@ -11910,7 +12512,8 @@
       var o = buildGoogleCloudVisionV1p4beta1SafeSearchAnnotation();
       var od = api.GoogleCloudVisionV1p4beta1SafeSearchAnnotation.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1SafeSearchAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1SafeSearchAnnotation(
+          od as api.GoogleCloudVisionV1p4beta1SafeSearchAnnotation);
     });
   });
 
@@ -11918,7 +12521,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Symbol();
       var od = api.GoogleCloudVisionV1p4beta1Symbol.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Symbol(od);
+      checkGoogleCloudVisionV1p4beta1Symbol(
+          od as api.GoogleCloudVisionV1p4beta1Symbol);
     });
   });
 
@@ -11927,7 +12531,8 @@
       var o = buildGoogleCloudVisionV1p4beta1TextAnnotation();
       var od =
           api.GoogleCloudVisionV1p4beta1TextAnnotation.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1TextAnnotation(od);
+      checkGoogleCloudVisionV1p4beta1TextAnnotation(
+          od as api.GoogleCloudVisionV1p4beta1TextAnnotation);
     });
   });
 
@@ -11938,7 +12543,8 @@
       var od =
           api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak(od);
+      checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak(
+          od as api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedBreak);
     });
   });
 
@@ -11950,7 +12556,8 @@
       var od =
           api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage(od);
+      checkGoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage(
+          od as api.GoogleCloudVisionV1p4beta1TextAnnotationDetectedLanguage);
     });
   });
 
@@ -11961,7 +12568,8 @@
       var od =
           api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty.fromJson(
               o.toJson());
-      checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(od);
+      checkGoogleCloudVisionV1p4beta1TextAnnotationTextProperty(
+          od as api.GoogleCloudVisionV1p4beta1TextAnnotationTextProperty);
     });
   });
 
@@ -11969,7 +12577,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Vertex();
       var od = api.GoogleCloudVisionV1p4beta1Vertex.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Vertex(od);
+      checkGoogleCloudVisionV1p4beta1Vertex(
+          od as api.GoogleCloudVisionV1p4beta1Vertex);
     });
   });
 
@@ -11977,7 +12586,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1WebDetection();
       var od = api.GoogleCloudVisionV1p4beta1WebDetection.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1WebDetection(od);
+      checkGoogleCloudVisionV1p4beta1WebDetection(
+          od as api.GoogleCloudVisionV1p4beta1WebDetection);
     });
   });
 
@@ -11987,7 +12597,8 @@
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebEntity();
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1WebDetectionWebEntity(od);
+      checkGoogleCloudVisionV1p4beta1WebDetectionWebEntity(
+          od as api.GoogleCloudVisionV1p4beta1WebDetectionWebEntity);
     });
   });
 
@@ -11997,7 +12608,8 @@
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebImage();
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebImage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(od);
+      checkGoogleCloudVisionV1p4beta1WebDetectionWebImage(
+          od as api.GoogleCloudVisionV1p4beta1WebDetectionWebImage);
     });
   });
 
@@ -12007,7 +12619,8 @@
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebLabel();
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebLabel.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1WebDetectionWebLabel(od);
+      checkGoogleCloudVisionV1p4beta1WebDetectionWebLabel(
+          od as api.GoogleCloudVisionV1p4beta1WebDetectionWebLabel);
     });
   });
 
@@ -12017,7 +12630,8 @@
       var o = buildGoogleCloudVisionV1p4beta1WebDetectionWebPage();
       var od = api.GoogleCloudVisionV1p4beta1WebDetectionWebPage.fromJson(
           o.toJson());
-      checkGoogleCloudVisionV1p4beta1WebDetectionWebPage(od);
+      checkGoogleCloudVisionV1p4beta1WebDetectionWebPage(
+          od as api.GoogleCloudVisionV1p4beta1WebDetectionWebPage);
     });
   });
 
@@ -12025,7 +12639,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleCloudVisionV1p4beta1Word();
       var od = api.GoogleCloudVisionV1p4beta1Word.fromJson(o.toJson());
-      checkGoogleCloudVisionV1p4beta1Word(od);
+      checkGoogleCloudVisionV1p4beta1Word(
+          od as api.GoogleCloudVisionV1p4beta1Word);
     });
   });
 
@@ -12033,7 +12648,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupedResult();
       var od = api.GroupedResult.fromJson(o.toJson());
-      checkGroupedResult(od);
+      checkGroupedResult(od as api.GroupedResult);
     });
   });
 
@@ -12041,7 +12656,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImage();
       var od = api.Image.fromJson(o.toJson());
-      checkImage(od);
+      checkImage(od as api.Image);
     });
   });
 
@@ -12049,7 +12664,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageAnnotationContext();
       var od = api.ImageAnnotationContext.fromJson(o.toJson());
-      checkImageAnnotationContext(od);
+      checkImageAnnotationContext(od as api.ImageAnnotationContext);
     });
   });
 
@@ -12057,7 +12672,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageContext();
       var od = api.ImageContext.fromJson(o.toJson());
-      checkImageContext(od);
+      checkImageContext(od as api.ImageContext);
     });
   });
 
@@ -12065,7 +12680,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageProperties();
       var od = api.ImageProperties.fromJson(o.toJson());
-      checkImageProperties(od);
+      checkImageProperties(od as api.ImageProperties);
     });
   });
 
@@ -12073,7 +12688,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageSource();
       var od = api.ImageSource.fromJson(o.toJson());
-      checkImageSource(od);
+      checkImageSource(od as api.ImageSource);
     });
   });
 
@@ -12081,7 +12696,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportProductSetsGcsSource();
       var od = api.ImportProductSetsGcsSource.fromJson(o.toJson());
-      checkImportProductSetsGcsSource(od);
+      checkImportProductSetsGcsSource(od as api.ImportProductSetsGcsSource);
     });
   });
 
@@ -12089,7 +12704,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportProductSetsInputConfig();
       var od = api.ImportProductSetsInputConfig.fromJson(o.toJson());
-      checkImportProductSetsInputConfig(od);
+      checkImportProductSetsInputConfig(od as api.ImportProductSetsInputConfig);
     });
   });
 
@@ -12097,7 +12712,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportProductSetsRequest();
       var od = api.ImportProductSetsRequest.fromJson(o.toJson());
-      checkImportProductSetsRequest(od);
+      checkImportProductSetsRequest(od as api.ImportProductSetsRequest);
     });
   });
 
@@ -12105,7 +12720,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImportProductSetsResponse();
       var od = api.ImportProductSetsResponse.fromJson(o.toJson());
-      checkImportProductSetsResponse(od);
+      checkImportProductSetsResponse(od as api.ImportProductSetsResponse);
     });
   });
 
@@ -12113,7 +12728,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInputConfig();
       var od = api.InputConfig.fromJson(o.toJson());
-      checkInputConfig(od);
+      checkInputConfig(od as api.InputConfig);
     });
   });
 
@@ -12121,7 +12736,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildKeyValue();
       var od = api.KeyValue.fromJson(o.toJson());
-      checkKeyValue(od);
+      checkKeyValue(od as api.KeyValue);
     });
   });
 
@@ -12129,7 +12744,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLandmark();
       var od = api.Landmark.fromJson(o.toJson());
-      checkLandmark(od);
+      checkLandmark(od as api.Landmark);
     });
   });
 
@@ -12137,7 +12752,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatLng();
       var od = api.LatLng.fromJson(o.toJson());
-      checkLatLng(od);
+      checkLatLng(od as api.LatLng);
     });
   });
 
@@ -12145,7 +12760,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLatLongRect();
       var od = api.LatLongRect.fromJson(o.toJson());
-      checkLatLongRect(od);
+      checkLatLongRect(od as api.LatLongRect);
     });
   });
 
@@ -12153,7 +12768,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListOperationsResponse();
       var od = api.ListOperationsResponse.fromJson(o.toJson());
-      checkListOperationsResponse(od);
+      checkListOperationsResponse(od as api.ListOperationsResponse);
     });
   });
 
@@ -12161,7 +12776,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListProductSetsResponse();
       var od = api.ListProductSetsResponse.fromJson(o.toJson());
-      checkListProductSetsResponse(od);
+      checkListProductSetsResponse(od as api.ListProductSetsResponse);
     });
   });
 
@@ -12169,7 +12784,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildListProductsInProductSetResponse();
       var od = api.ListProductsInProductSetResponse.fromJson(o.toJson());
-      checkListProductsInProductSetResponse(od);
+      checkListProductsInProductSetResponse(
+          od as api.ListProductsInProductSetResponse);
     });
   });
 
@@ -12177,7 +12793,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListProductsResponse();
       var od = api.ListProductsResponse.fromJson(o.toJson());
-      checkListProductsResponse(od);
+      checkListProductsResponse(od as api.ListProductsResponse);
     });
   });
 
@@ -12185,7 +12801,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListReferenceImagesResponse();
       var od = api.ListReferenceImagesResponse.fromJson(o.toJson());
-      checkListReferenceImagesResponse(od);
+      checkListReferenceImagesResponse(od as api.ListReferenceImagesResponse);
     });
   });
 
@@ -12193,7 +12809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizedObjectAnnotation();
       var od = api.LocalizedObjectAnnotation.fromJson(o.toJson());
-      checkLocalizedObjectAnnotation(od);
+      checkLocalizedObjectAnnotation(od as api.LocalizedObjectAnnotation);
     });
   });
 
@@ -12201,7 +12817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocationInfo();
       var od = api.LocationInfo.fromJson(o.toJson());
-      checkLocationInfo(od);
+      checkLocationInfo(od as api.LocationInfo);
     });
   });
 
@@ -12209,7 +12825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildNormalizedVertex();
       var od = api.NormalizedVertex.fromJson(o.toJson());
-      checkNormalizedVertex(od);
+      checkNormalizedVertex(od as api.NormalizedVertex);
     });
   });
 
@@ -12217,7 +12833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildObjectAnnotation();
       var od = api.ObjectAnnotation.fromJson(o.toJson());
-      checkObjectAnnotation(od);
+      checkObjectAnnotation(od as api.ObjectAnnotation);
     });
   });
 
@@ -12225,7 +12841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperation();
       var od = api.Operation.fromJson(o.toJson());
-      checkOperation(od);
+      checkOperation(od as api.Operation);
     });
   });
 
@@ -12233,7 +12849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOperationMetadata();
       var od = api.OperationMetadata.fromJson(o.toJson());
-      checkOperationMetadata(od);
+      checkOperationMetadata(od as api.OperationMetadata);
     });
   });
 
@@ -12241,7 +12857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutputConfig();
       var od = api.OutputConfig.fromJson(o.toJson());
-      checkOutputConfig(od);
+      checkOutputConfig(od as api.OutputConfig);
     });
   });
 
@@ -12249,7 +12865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPage();
       var od = api.Page.fromJson(o.toJson());
-      checkPage(od);
+      checkPage(od as api.Page);
     });
   });
 
@@ -12257,7 +12873,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildParagraph();
       var od = api.Paragraph.fromJson(o.toJson());
-      checkParagraph(od);
+      checkParagraph(od as api.Paragraph);
     });
   });
 
@@ -12265,7 +12881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPosition();
       var od = api.Position.fromJson(o.toJson());
-      checkPosition(od);
+      checkPosition(od as api.Position);
     });
   });
 
@@ -12273,7 +12889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProduct();
       var od = api.Product.fromJson(o.toJson());
-      checkProduct(od);
+      checkProduct(od as api.Product);
     });
   });
 
@@ -12281,7 +12897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductSearchParams();
       var od = api.ProductSearchParams.fromJson(o.toJson());
-      checkProductSearchParams(od);
+      checkProductSearchParams(od as api.ProductSearchParams);
     });
   });
 
@@ -12289,7 +12905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductSearchResults();
       var od = api.ProductSearchResults.fromJson(o.toJson());
-      checkProductSearchResults(od);
+      checkProductSearchResults(od as api.ProductSearchResults);
     });
   });
 
@@ -12297,7 +12913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductSet();
       var od = api.ProductSet.fromJson(o.toJson());
-      checkProductSet(od);
+      checkProductSet(od as api.ProductSet);
     });
   });
 
@@ -12305,7 +12921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProductSetPurgeConfig();
       var od = api.ProductSetPurgeConfig.fromJson(o.toJson());
-      checkProductSetPurgeConfig(od);
+      checkProductSetPurgeConfig(od as api.ProductSetPurgeConfig);
     });
   });
 
@@ -12313,7 +12929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildProperty();
       var od = api.Property.fromJson(o.toJson());
-      checkProperty(od);
+      checkProperty(od as api.Property);
     });
   });
 
@@ -12321,7 +12937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPurgeProductsRequest();
       var od = api.PurgeProductsRequest.fromJson(o.toJson());
-      checkPurgeProductsRequest(od);
+      checkPurgeProductsRequest(od as api.PurgeProductsRequest);
     });
   });
 
@@ -12329,7 +12945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReferenceImage();
       var od = api.ReferenceImage.fromJson(o.toJson());
-      checkReferenceImage(od);
+      checkReferenceImage(od as api.ReferenceImage);
     });
   });
 
@@ -12337,7 +12953,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildRemoveProductFromProductSetRequest();
       var od = api.RemoveProductFromProductSetRequest.fromJson(o.toJson());
-      checkRemoveProductFromProductSetRequest(od);
+      checkRemoveProductFromProductSetRequest(
+          od as api.RemoveProductFromProductSetRequest);
     });
   });
 
@@ -12345,7 +12962,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResult();
       var od = api.Result.fromJson(o.toJson());
-      checkResult(od);
+      checkResult(od as api.Result);
     });
   });
 
@@ -12353,7 +12970,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSafeSearchAnnotation();
       var od = api.SafeSearchAnnotation.fromJson(o.toJson());
-      checkSafeSearchAnnotation(od);
+      checkSafeSearchAnnotation(od as api.SafeSearchAnnotation);
     });
   });
 
@@ -12361,7 +12978,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStatus();
       var od = api.Status.fromJson(o.toJson());
-      checkStatus(od);
+      checkStatus(od as api.Status);
     });
   });
 
@@ -12369,7 +12986,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSymbol();
       var od = api.Symbol.fromJson(o.toJson());
-      checkSymbol(od);
+      checkSymbol(od as api.Symbol);
     });
   });
 
@@ -12377,7 +12994,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextAnnotation();
       var od = api.TextAnnotation.fromJson(o.toJson());
-      checkTextAnnotation(od);
+      checkTextAnnotation(od as api.TextAnnotation);
     });
   });
 
@@ -12385,7 +13002,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTextProperty();
       var od = api.TextProperty.fromJson(o.toJson());
-      checkTextProperty(od);
+      checkTextProperty(od as api.TextProperty);
     });
   });
 
@@ -12393,7 +13010,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVertex();
       var od = api.Vertex.fromJson(o.toJson());
-      checkVertex(od);
+      checkVertex(od as api.Vertex);
     });
   });
 
@@ -12401,7 +13018,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebDetection();
       var od = api.WebDetection.fromJson(o.toJson());
-      checkWebDetection(od);
+      checkWebDetection(od as api.WebDetection);
     });
   });
 
@@ -12409,7 +13026,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebDetectionParams();
       var od = api.WebDetectionParams.fromJson(o.toJson());
-      checkWebDetectionParams(od);
+      checkWebDetectionParams(od as api.WebDetectionParams);
     });
   });
 
@@ -12417,7 +13034,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebEntity();
       var od = api.WebEntity.fromJson(o.toJson());
-      checkWebEntity(od);
+      checkWebEntity(od as api.WebEntity);
     });
   });
 
@@ -12425,7 +13042,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebImage();
       var od = api.WebImage.fromJson(o.toJson());
-      checkWebImage(od);
+      checkWebImage(od as api.WebImage);
     });
   });
 
@@ -12433,7 +13050,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebLabel();
       var od = api.WebLabel.fromJson(o.toJson());
-      checkWebLabel(od);
+      checkWebLabel(od as api.WebLabel);
     });
   });
 
@@ -12441,7 +13058,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebPage();
       var od = api.WebPage.fromJson(o.toJson());
-      checkWebPage(od);
+      checkWebPage(od as api.WebPage);
     });
   });
 
@@ -12449,7 +13066,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWord();
       var od = api.Word.fromJson(o.toJson());
-      checkWord(od);
+      checkWord(od as api.Word);
     });
   });
 
@@ -12460,8 +13077,9 @@
       var arg_request = buildBatchAnnotateFilesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchAnnotateFilesRequest.fromJson(json);
-        checkBatchAnnotateFilesRequest(obj);
+        var obj = api.BatchAnnotateFilesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchAnnotateFilesRequest(obj as api.BatchAnnotateFilesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12500,7 +13118,8 @@
       res
           .annotate(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchAnnotateFilesResponse(response);
+        checkBatchAnnotateFilesResponse(
+            response as api.BatchAnnotateFilesResponse);
       })));
     });
 
@@ -12510,8 +13129,10 @@
       var arg_request = buildAsyncBatchAnnotateFilesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsyncBatchAnnotateFilesRequest.fromJson(json);
-        checkAsyncBatchAnnotateFilesRequest(obj);
+        var obj = api.AsyncBatchAnnotateFilesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsyncBatchAnnotateFilesRequest(
+            obj as api.AsyncBatchAnnotateFilesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12550,7 +13171,7 @@
       res
           .asyncBatchAnnotate(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -12562,8 +13183,9 @@
       var arg_request = buildBatchAnnotateImagesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchAnnotateImagesRequest.fromJson(json);
-        checkBatchAnnotateImagesRequest(obj);
+        var obj = api.BatchAnnotateImagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchAnnotateImagesRequest(obj as api.BatchAnnotateImagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12602,7 +13224,8 @@
       res
           .annotate(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchAnnotateImagesResponse(response);
+        checkBatchAnnotateImagesResponse(
+            response as api.BatchAnnotateImagesResponse);
       })));
     });
 
@@ -12612,8 +13235,10 @@
       var arg_request = buildAsyncBatchAnnotateImagesRequest();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsyncBatchAnnotateImagesRequest.fromJson(json);
-        checkAsyncBatchAnnotateImagesRequest(obj);
+        var obj = api.AsyncBatchAnnotateImagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsyncBatchAnnotateImagesRequest(
+            obj as api.AsyncBatchAnnotateImagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12652,7 +13277,7 @@
       res
           .asyncBatchAnnotate(arg_request, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -12702,7 +13327,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -12715,8 +13340,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CancelOperationRequest.fromJson(json);
-        checkCancelOperationRequest(obj);
+        var obj = api.CancelOperationRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCancelOperationRequest(obj as api.CancelOperationRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12756,7 +13382,7 @@
       res
           .cancel(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -12804,7 +13430,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -12852,7 +13478,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -12912,7 +13538,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListOperationsResponse(response);
+        checkListOperationsResponse(response as api.ListOperationsResponse);
       })));
     });
   });
@@ -12925,8 +13551,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchAnnotateFilesRequest.fromJson(json);
-        checkBatchAnnotateFilesRequest(obj);
+        var obj = api.BatchAnnotateFilesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchAnnotateFilesRequest(obj as api.BatchAnnotateFilesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12966,7 +13593,8 @@
       res
           .annotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchAnnotateFilesResponse(response);
+        checkBatchAnnotateFilesResponse(
+            response as api.BatchAnnotateFilesResponse);
       })));
     });
 
@@ -12977,8 +13605,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsyncBatchAnnotateFilesRequest.fromJson(json);
-        checkAsyncBatchAnnotateFilesRequest(obj);
+        var obj = api.AsyncBatchAnnotateFilesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsyncBatchAnnotateFilesRequest(
+            obj as api.AsyncBatchAnnotateFilesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13018,7 +13648,7 @@
       res
           .asyncBatchAnnotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -13031,8 +13661,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchAnnotateImagesRequest.fromJson(json);
-        checkBatchAnnotateImagesRequest(obj);
+        var obj = api.BatchAnnotateImagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchAnnotateImagesRequest(obj as api.BatchAnnotateImagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13072,7 +13703,8 @@
       res
           .annotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchAnnotateImagesResponse(response);
+        checkBatchAnnotateImagesResponse(
+            response as api.BatchAnnotateImagesResponse);
       })));
     });
 
@@ -13083,8 +13715,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsyncBatchAnnotateImagesRequest.fromJson(json);
-        checkAsyncBatchAnnotateImagesRequest(obj);
+        var obj = api.AsyncBatchAnnotateImagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsyncBatchAnnotateImagesRequest(
+            obj as api.AsyncBatchAnnotateImagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13124,7 +13758,7 @@
       res
           .asyncBatchAnnotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -13137,8 +13771,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchAnnotateFilesRequest.fromJson(json);
-        checkBatchAnnotateFilesRequest(obj);
+        var obj = api.BatchAnnotateFilesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchAnnotateFilesRequest(obj as api.BatchAnnotateFilesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13178,7 +13813,8 @@
       res
           .annotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchAnnotateFilesResponse(response);
+        checkBatchAnnotateFilesResponse(
+            response as api.BatchAnnotateFilesResponse);
       })));
     });
 
@@ -13189,8 +13825,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsyncBatchAnnotateFilesRequest.fromJson(json);
-        checkAsyncBatchAnnotateFilesRequest(obj);
+        var obj = api.AsyncBatchAnnotateFilesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsyncBatchAnnotateFilesRequest(
+            obj as api.AsyncBatchAnnotateFilesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13230,7 +13868,7 @@
       res
           .asyncBatchAnnotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -13243,8 +13881,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.BatchAnnotateImagesRequest.fromJson(json);
-        checkBatchAnnotateImagesRequest(obj);
+        var obj = api.BatchAnnotateImagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkBatchAnnotateImagesRequest(obj as api.BatchAnnotateImagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13284,7 +13923,8 @@
       res
           .annotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkBatchAnnotateImagesResponse(response);
+        checkBatchAnnotateImagesResponse(
+            response as api.BatchAnnotateImagesResponse);
       })));
     });
 
@@ -13295,8 +13935,10 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AsyncBatchAnnotateImagesRequest.fromJson(json);
-        checkAsyncBatchAnnotateImagesRequest(obj);
+        var obj = api.AsyncBatchAnnotateImagesRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAsyncBatchAnnotateImagesRequest(
+            obj as api.AsyncBatchAnnotateImagesRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13336,7 +13978,7 @@
       res
           .asyncBatchAnnotate(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -13386,7 +14028,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -13399,8 +14041,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AddProductToProductSetRequest.fromJson(json);
-        checkAddProductToProductSetRequest(obj);
+        var obj = api.AddProductToProductSetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAddProductToProductSetRequest(
+            obj as api.AddProductToProductSetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13440,7 +14084,7 @@
       res
           .addProduct(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -13452,8 +14096,9 @@
       var arg_productSetId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProductSet.fromJson(json);
-        checkProductSet(obj);
+        var obj = api.ProductSet.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProductSet(obj as api.ProductSet);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13496,7 +14141,7 @@
           .create(arg_request, arg_parent,
               productSetId: arg_productSetId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductSet(response);
+        checkProductSet(response as api.ProductSet);
       })));
     });
 
@@ -13544,7 +14189,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -13592,7 +14237,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductSet(response);
+        checkProductSet(response as api.ProductSet);
       })));
     });
 
@@ -13603,8 +14248,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ImportProductSetsRequest.fromJson(json);
-        checkImportProductSetsRequest(obj);
+        var obj = api.ImportProductSetsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkImportProductSetsRequest(obj as api.ImportProductSetsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13644,7 +14290,7 @@
       res
           .import(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
 
@@ -13701,7 +14347,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListProductSetsResponse(response);
+        checkListProductSetsResponse(response as api.ListProductSetsResponse);
       })));
     });
 
@@ -13713,8 +14359,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ProductSet.fromJson(json);
-        checkProductSet(obj);
+        var obj = api.ProductSet.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkProductSet(obj as api.ProductSet);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13757,7 +14404,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProductSet(response);
+        checkProductSet(response as api.ProductSet);
       })));
     });
 
@@ -13768,8 +14415,10 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.RemoveProductFromProductSetRequest.fromJson(json);
-        checkRemoveProductFromProductSetRequest(obj);
+        var obj = api.RemoveProductFromProductSetRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkRemoveProductFromProductSetRequest(
+            obj as api.RemoveProductFromProductSetRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13809,7 +14458,7 @@
       res
           .removeProduct(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
   });
@@ -13869,7 +14518,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListProductsInProductSetResponse(response);
+        checkListProductsInProductSetResponse(
+            response as api.ListProductsInProductSetResponse);
       })));
     });
   });
@@ -13883,8 +14533,9 @@
       var arg_productId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Product.fromJson(json);
-        checkProduct(obj);
+        var obj =
+            api.Product.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProduct(obj as api.Product);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13927,7 +14578,7 @@
           .create(arg_request, arg_parent,
               productId: arg_productId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -13975,7 +14626,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -14023,7 +14674,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -14080,7 +14731,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListProductsResponse(response);
+        checkListProductsResponse(response as api.ListProductsResponse);
       })));
     });
 
@@ -14092,8 +14743,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Product.fromJson(json);
-        checkProduct(obj);
+        var obj =
+            api.Product.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkProduct(obj as api.Product);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14136,7 +14788,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkProduct(response);
+        checkProduct(response as api.Product);
       })));
     });
 
@@ -14147,8 +14799,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PurgeProductsRequest.fromJson(json);
-        checkPurgeProductsRequest(obj);
+        var obj = api.PurgeProductsRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPurgeProductsRequest(obj as api.PurgeProductsRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14188,7 +14841,7 @@
       res
           .purge(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
@@ -14203,8 +14856,9 @@
       var arg_referenceImageId = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ReferenceImage.fromJson(json);
-        checkReferenceImage(obj);
+        var obj = api.ReferenceImage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkReferenceImage(obj as api.ReferenceImage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -14247,7 +14901,7 @@
           .create(arg_request, arg_parent,
               referenceImageId: arg_referenceImageId, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReferenceImage(response);
+        checkReferenceImage(response as api.ReferenceImage);
       })));
     });
 
@@ -14295,7 +14949,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -14343,7 +14997,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReferenceImage(response);
+        checkReferenceImage(response as api.ReferenceImage);
       })));
     });
 
@@ -14400,7 +15054,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListReferenceImagesResponse(response);
+        checkListReferenceImagesResponse(
+            response as api.ListReferenceImagesResponse);
       })));
     });
   });
@@ -14450,7 +15105,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkOperation(response);
+        checkOperation(response as api.Operation);
       })));
     });
   });
diff --git a/generated/googleapis/test/webfonts/v1_test.dart b/generated/googleapis/test/webfonts/v1_test.dart
index 71cc888..0c86489 100644
--- a/generated/googleapis/test/webfonts/v1_test.dart
+++ b/generated/googleapis/test/webfonts/v1_test.dart
@@ -155,8 +155,8 @@
 
 void checkUnnamed1373(core.List<api.Webfont> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWebfont(o[0]);
-  checkWebfont(o[1]);
+  checkWebfont(o[0] as api.Webfont);
+  checkWebfont(o[1] as api.Webfont);
 }
 
 core.int buildCounterWebfontList = 0;
@@ -185,7 +185,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebfont();
       var od = api.Webfont.fromJson(o.toJson());
-      checkWebfont(od);
+      checkWebfont(od as api.Webfont);
     });
   });
 
@@ -193,7 +193,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWebfontList();
       var od = api.WebfontList.fromJson(o.toJson());
-      checkWebfontList(od);
+      checkWebfontList(od as api.WebfontList);
     });
   });
 
@@ -242,7 +242,7 @@
       res
           .list(sort: arg_sort, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWebfontList(response);
+        checkWebfontList(response as api.WebfontList);
       })));
     });
   });
diff --git a/generated/googleapis/test/webmasters/v3_test.dart b/generated/googleapis/test/webmasters/v3_test.dart
index c8ad0ce..62f491d 100644
--- a/generated/googleapis/test/webmasters/v3_test.dart
+++ b/generated/googleapis/test/webmasters/v3_test.dart
@@ -146,8 +146,8 @@
 
 void checkUnnamed2742(core.List<api.ApiDimensionFilter> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApiDimensionFilter(o[0]);
-  checkApiDimensionFilter(o[1]);
+  checkApiDimensionFilter(o[0] as api.ApiDimensionFilter);
+  checkApiDimensionFilter(o[1] as api.ApiDimensionFilter);
 }
 
 core.int buildCounterApiDimensionFilterGroup = 0;
@@ -180,8 +180,8 @@
 
 void checkUnnamed2743(core.List<api.ApiDimensionFilterGroup> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApiDimensionFilterGroup(o[0]);
-  checkApiDimensionFilterGroup(o[1]);
+  checkApiDimensionFilterGroup(o[0] as api.ApiDimensionFilterGroup);
+  checkApiDimensionFilterGroup(o[1] as api.ApiDimensionFilterGroup);
 }
 
 core.List<core.String> buildUnnamed2744() {
@@ -239,8 +239,8 @@
 
 void checkUnnamed2745(core.List<api.ApiDataRow> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkApiDataRow(o[0]);
-  checkApiDataRow(o[1]);
+  checkApiDataRow(o[0] as api.ApiDataRow);
+  checkApiDataRow(o[1] as api.ApiDataRow);
 }
 
 core.int buildCounterSearchAnalyticsQueryResponse = 0;
@@ -273,8 +273,8 @@
 
 void checkUnnamed2746(core.List<api.WmxSitemap> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWmxSitemap(o[0]);
-  checkWmxSitemap(o[1]);
+  checkWmxSitemap(o[0] as api.WmxSitemap);
+  checkWmxSitemap(o[1] as api.WmxSitemap);
 }
 
 core.int buildCounterSitemapsListResponse = 0;
@@ -305,8 +305,8 @@
 
 void checkUnnamed2747(core.List<api.WmxSite> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWmxSite(o[0]);
-  checkWmxSite(o[1]);
+  checkWmxSite(o[0] as api.WmxSite);
+  checkWmxSite(o[1] as api.WmxSite);
 }
 
 core.int buildCounterSitesListResponse = 0;
@@ -358,8 +358,8 @@
 
 void checkUnnamed2748(core.List<api.WmxSitemapContent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkWmxSitemapContent(o[0]);
-  checkWmxSitemapContent(o[1]);
+  checkWmxSitemapContent(o[0] as api.WmxSitemapContent);
+  checkWmxSitemapContent(o[1] as api.WmxSitemapContent);
 }
 
 core.int buildCounterWmxSitemap = 0;
@@ -427,7 +427,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiDataRow();
       var od = api.ApiDataRow.fromJson(o.toJson());
-      checkApiDataRow(od);
+      checkApiDataRow(od as api.ApiDataRow);
     });
   });
 
@@ -435,7 +435,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiDimensionFilter();
       var od = api.ApiDimensionFilter.fromJson(o.toJson());
-      checkApiDimensionFilter(od);
+      checkApiDimensionFilter(od as api.ApiDimensionFilter);
     });
   });
 
@@ -443,7 +443,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildApiDimensionFilterGroup();
       var od = api.ApiDimensionFilterGroup.fromJson(o.toJson());
-      checkApiDimensionFilterGroup(od);
+      checkApiDimensionFilterGroup(od as api.ApiDimensionFilterGroup);
     });
   });
 
@@ -451,7 +451,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAnalyticsQueryRequest();
       var od = api.SearchAnalyticsQueryRequest.fromJson(o.toJson());
-      checkSearchAnalyticsQueryRequest(od);
+      checkSearchAnalyticsQueryRequest(od as api.SearchAnalyticsQueryRequest);
     });
   });
 
@@ -459,7 +459,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchAnalyticsQueryResponse();
       var od = api.SearchAnalyticsQueryResponse.fromJson(o.toJson());
-      checkSearchAnalyticsQueryResponse(od);
+      checkSearchAnalyticsQueryResponse(od as api.SearchAnalyticsQueryResponse);
     });
   });
 
@@ -467,7 +467,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSitemapsListResponse();
       var od = api.SitemapsListResponse.fromJson(o.toJson());
-      checkSitemapsListResponse(od);
+      checkSitemapsListResponse(od as api.SitemapsListResponse);
     });
   });
 
@@ -475,7 +475,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSitesListResponse();
       var od = api.SitesListResponse.fromJson(o.toJson());
-      checkSitesListResponse(od);
+      checkSitesListResponse(od as api.SitesListResponse);
     });
   });
 
@@ -483,7 +483,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWmxSite();
       var od = api.WmxSite.fromJson(o.toJson());
-      checkWmxSite(od);
+      checkWmxSite(od as api.WmxSite);
     });
   });
 
@@ -491,7 +491,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWmxSitemap();
       var od = api.WmxSitemap.fromJson(o.toJson());
-      checkWmxSitemap(od);
+      checkWmxSitemap(od as api.WmxSitemap);
     });
   });
 
@@ -499,7 +499,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWmxSitemapContent();
       var od = api.WmxSitemapContent.fromJson(o.toJson());
-      checkWmxSitemapContent(od);
+      checkWmxSitemapContent(od as api.WmxSitemapContent);
     });
   });
 
@@ -511,8 +511,10 @@
       var arg_siteUrl = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.SearchAnalyticsQueryRequest.fromJson(json);
-        checkSearchAnalyticsQueryRequest(obj);
+        var obj = api.SearchAnalyticsQueryRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSearchAnalyticsQueryRequest(
+            obj as api.SearchAnalyticsQueryRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -563,7 +565,8 @@
       res
           .query(arg_request, arg_siteUrl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchAnalyticsQueryResponse(response);
+        checkSearchAnalyticsQueryResponse(
+            response as api.SearchAnalyticsQueryResponse);
       })));
     });
   });
@@ -689,7 +692,7 @@
       res
           .get(arg_siteUrl, arg_feedpath, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWmxSitemap(response);
+        checkWmxSitemap(response as api.WmxSitemap);
       })));
     });
 
@@ -752,7 +755,7 @@
           .list(arg_siteUrl,
               sitemapIndex: arg_sitemapIndex, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSitemapsListResponse(response);
+        checkSitemapsListResponse(response as api.SitemapsListResponse);
       })));
     });
 
@@ -970,7 +973,7 @@
       res
           .get(arg_siteUrl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkWmxSite(response);
+        checkWmxSite(response as api.WmxSite);
       })));
     });
 
@@ -1017,7 +1020,7 @@
         return async.Future.value(stringResponse(200, h, resp));
       }), true);
       res.list($fields: arg_$fields).then(unittest.expectAsync1(((response) {
-        checkSitesListResponse(response);
+        checkSitesListResponse(response as api.SitesListResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/websecurityscanner/v1_test.dart b/generated/googleapis/test/websecurityscanner/v1_test.dart
index 198db36..740c836 100644
--- a/generated/googleapis/test/websecurityscanner/v1_test.dart
+++ b/generated/googleapis/test/websecurityscanner/v1_test.dart
@@ -90,9 +90,9 @@
 void checkAuthentication(api.Authentication o) {
   buildCounterAuthentication++;
   if (buildCounterAuthentication < 3) {
-    checkCustomAccount(o.customAccount);
-    checkGoogleAccount(o.googleAccount);
-    checkIapCredential(o.iapCredential);
+    checkCustomAccount(o.customAccount as api.CustomAccount);
+    checkGoogleAccount(o.googleAccount as api.GoogleAccount);
+    checkIapCredential(o.iapCredential as api.IapCredential);
   }
   buildCounterAuthentication--;
 }
@@ -192,19 +192,20 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.finalUrl, unittest.equals('foo'));
     unittest.expect(o.findingType, unittest.equals('foo'));
-    checkForm(o.form);
+    checkForm(o.form as api.Form);
     unittest.expect(o.frameUrl, unittest.equals('foo'));
     unittest.expect(o.fuzzedUrl, unittest.equals('foo'));
     unittest.expect(o.httpMethod, unittest.equals('foo'));
     unittest.expect(o.name, unittest.equals('foo'));
-    checkOutdatedLibrary(o.outdatedLibrary);
+    checkOutdatedLibrary(o.outdatedLibrary as api.OutdatedLibrary);
     unittest.expect(o.reproductionUrl, unittest.equals('foo'));
     unittest.expect(o.severity, unittest.equals('foo'));
     unittest.expect(o.trackingId, unittest.equals('foo'));
-    checkViolatingResource(o.violatingResource);
-    checkVulnerableHeaders(o.vulnerableHeaders);
-    checkVulnerableParameters(o.vulnerableParameters);
-    checkXss(o.xss);
+    checkViolatingResource(o.violatingResource as api.ViolatingResource);
+    checkVulnerableHeaders(o.vulnerableHeaders as api.VulnerableHeaders);
+    checkVulnerableParameters(
+        o.vulnerableParameters as api.VulnerableParameters);
+    checkXss(o.xss as api.Xss);
   }
   buildCounterFinding--;
 }
@@ -320,7 +321,8 @@
 void checkIapCredential(api.IapCredential o) {
   buildCounterIapCredential++;
   if (buildCounterIapCredential < 3) {
-    checkIapTestServiceAccountInfo(o.iapTestServiceAccountInfo);
+    checkIapTestServiceAccountInfo(
+        o.iapTestServiceAccountInfo as api.IapTestServiceAccountInfo);
   }
   buildCounterIapCredential--;
 }
@@ -353,8 +355,8 @@
 
 void checkUnnamed135(core.List<api.CrawledUrl> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCrawledUrl(o[0]);
-  checkCrawledUrl(o[1]);
+  checkCrawledUrl(o[0] as api.CrawledUrl);
+  checkCrawledUrl(o[1] as api.CrawledUrl);
 }
 
 core.int buildCounterListCrawledUrlsResponse = 0;
@@ -387,8 +389,8 @@
 
 void checkUnnamed136(core.List<api.FindingTypeStats> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFindingTypeStats(o[0]);
-  checkFindingTypeStats(o[1]);
+  checkFindingTypeStats(o[0] as api.FindingTypeStats);
+  checkFindingTypeStats(o[1] as api.FindingTypeStats);
 }
 
 core.int buildCounterListFindingTypeStatsResponse = 0;
@@ -419,8 +421,8 @@
 
 void checkUnnamed137(core.List<api.Finding> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkFinding(o[0]);
-  checkFinding(o[1]);
+  checkFinding(o[0] as api.Finding);
+  checkFinding(o[1] as api.Finding);
 }
 
 core.int buildCounterListFindingsResponse = 0;
@@ -453,8 +455,8 @@
 
 void checkUnnamed138(core.List<api.ScanConfig> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkScanConfig(o[0]);
-  checkScanConfig(o[1]);
+  checkScanConfig(o[0] as api.ScanConfig);
+  checkScanConfig(o[1] as api.ScanConfig);
 }
 
 core.int buildCounterListScanConfigsResponse = 0;
@@ -487,8 +489,8 @@
 
 void checkUnnamed139(core.List<api.ScanRun> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkScanRun(o[0]);
-  checkScanRun(o[1]);
+  checkScanRun(o[0] as api.ScanRun);
+  checkScanRun(o[1] as api.ScanRun);
 }
 
 core.int buildCounterListScanRunsResponse = 0;
@@ -599,7 +601,7 @@
 void checkScanConfig(api.ScanConfig o) {
   buildCounterScanConfig++;
   if (buildCounterScanConfig < 3) {
-    checkAuthentication(o.authentication);
+    checkAuthentication(o.authentication as api.Authentication);
     checkUnnamed141(o.blacklistPatterns);
     unittest.expect(o.displayName, unittest.equals('foo'));
     unittest.expect(o.exportToSecurityCommandCenter, unittest.equals('foo'));
@@ -607,7 +609,7 @@
     unittest.expect(o.maxQps, unittest.equals(42));
     unittest.expect(o.name, unittest.equals('foo'));
     unittest.expect(o.riskLevel, unittest.equals('foo'));
-    checkSchedule(o.schedule);
+    checkSchedule(o.schedule as api.Schedule);
     checkUnnamed142(o.startingUrls);
     unittest.expect(o.staticIpScan, unittest.isTrue);
     unittest.expect(o.userAgent, unittest.equals('foo'));
@@ -645,8 +647,8 @@
 
 void checkUnnamed143(core.List<api.ScanRunWarningTrace> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkScanRunWarningTrace(o[0]);
-  checkScanRunWarningTrace(o[1]);
+  checkScanRunWarningTrace(o[0] as api.ScanRunWarningTrace);
+  checkScanRunWarningTrace(o[1] as api.ScanRunWarningTrace);
 }
 
 core.int buildCounterScanRun = 0;
@@ -674,7 +676,7 @@
   buildCounterScanRun++;
   if (buildCounterScanRun < 3) {
     unittest.expect(o.endTime, unittest.equals('foo'));
-    checkScanRunErrorTrace(o.errorTrace);
+    checkScanRunErrorTrace(o.errorTrace as api.ScanRunErrorTrace);
     unittest.expect(o.executionState, unittest.equals('foo'));
     unittest.expect(o.hasVulnerabilities, unittest.isTrue);
     unittest.expect(o.name, unittest.equals('foo'));
@@ -706,7 +708,7 @@
   if (buildCounterScanRunErrorTrace < 3) {
     unittest.expect(o.code, unittest.equals('foo'));
     unittest.expect(o.mostCommonHttpErrorCode, unittest.equals(42));
-    checkScanConfigError(o.scanConfigError);
+    checkScanConfigError(o.scanConfigError as api.ScanConfigError);
   }
   buildCounterScanRunErrorTrace--;
 }
@@ -811,8 +813,8 @@
 
 void checkUnnamed144(core.List<api.Header> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHeader(o[0]);
-  checkHeader(o[1]);
+  checkHeader(o[0] as api.Header);
+  checkHeader(o[1] as api.Header);
 }
 
 core.List<api.Header> buildUnnamed145() {
@@ -824,8 +826,8 @@
 
 void checkUnnamed145(core.List<api.Header> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkHeader(o[0]);
-  checkHeader(o[1]);
+  checkHeader(o[0] as api.Header);
+  checkHeader(o[1] as api.Header);
 }
 
 core.int buildCounterVulnerableHeaders = 0;
@@ -924,7 +926,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAuthentication();
       var od = api.Authentication.fromJson(o.toJson());
-      checkAuthentication(od);
+      checkAuthentication(od as api.Authentication);
     });
   });
 
@@ -932,7 +934,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCrawledUrl();
       var od = api.CrawledUrl.fromJson(o.toJson());
-      checkCrawledUrl(od);
+      checkCrawledUrl(od as api.CrawledUrl);
     });
   });
 
@@ -940,7 +942,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCustomAccount();
       var od = api.CustomAccount.fromJson(o.toJson());
-      checkCustomAccount(od);
+      checkCustomAccount(od as api.CustomAccount);
     });
   });
 
@@ -948,7 +950,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -956,7 +958,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFinding();
       var od = api.Finding.fromJson(o.toJson());
-      checkFinding(od);
+      checkFinding(od as api.Finding);
     });
   });
 
@@ -964,7 +966,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildFindingTypeStats();
       var od = api.FindingTypeStats.fromJson(o.toJson());
-      checkFindingTypeStats(od);
+      checkFindingTypeStats(od as api.FindingTypeStats);
     });
   });
 
@@ -972,7 +974,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildForm();
       var od = api.Form.fromJson(o.toJson());
-      checkForm(od);
+      checkForm(od as api.Form);
     });
   });
 
@@ -980,7 +982,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGoogleAccount();
       var od = api.GoogleAccount.fromJson(o.toJson());
-      checkGoogleAccount(od);
+      checkGoogleAccount(od as api.GoogleAccount);
     });
   });
 
@@ -988,7 +990,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildHeader();
       var od = api.Header.fromJson(o.toJson());
-      checkHeader(od);
+      checkHeader(od as api.Header);
     });
   });
 
@@ -996,7 +998,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIapCredential();
       var od = api.IapCredential.fromJson(o.toJson());
-      checkIapCredential(od);
+      checkIapCredential(od as api.IapCredential);
     });
   });
 
@@ -1004,7 +1006,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIapTestServiceAccountInfo();
       var od = api.IapTestServiceAccountInfo.fromJson(o.toJson());
-      checkIapTestServiceAccountInfo(od);
+      checkIapTestServiceAccountInfo(od as api.IapTestServiceAccountInfo);
     });
   });
 
@@ -1012,7 +1014,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListCrawledUrlsResponse();
       var od = api.ListCrawledUrlsResponse.fromJson(o.toJson());
-      checkListCrawledUrlsResponse(od);
+      checkListCrawledUrlsResponse(od as api.ListCrawledUrlsResponse);
     });
   });
 
@@ -1020,7 +1022,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFindingTypeStatsResponse();
       var od = api.ListFindingTypeStatsResponse.fromJson(o.toJson());
-      checkListFindingTypeStatsResponse(od);
+      checkListFindingTypeStatsResponse(od as api.ListFindingTypeStatsResponse);
     });
   });
 
@@ -1028,7 +1030,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListFindingsResponse();
       var od = api.ListFindingsResponse.fromJson(o.toJson());
-      checkListFindingsResponse(od);
+      checkListFindingsResponse(od as api.ListFindingsResponse);
     });
   });
 
@@ -1036,7 +1038,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListScanConfigsResponse();
       var od = api.ListScanConfigsResponse.fromJson(o.toJson());
-      checkListScanConfigsResponse(od);
+      checkListScanConfigsResponse(od as api.ListScanConfigsResponse);
     });
   });
 
@@ -1044,7 +1046,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListScanRunsResponse();
       var od = api.ListScanRunsResponse.fromJson(o.toJson());
-      checkListScanRunsResponse(od);
+      checkListScanRunsResponse(od as api.ListScanRunsResponse);
     });
   });
 
@@ -1052,7 +1054,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildOutdatedLibrary();
       var od = api.OutdatedLibrary.fromJson(o.toJson());
-      checkOutdatedLibrary(od);
+      checkOutdatedLibrary(od as api.OutdatedLibrary);
     });
   });
 
@@ -1060,7 +1062,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScanConfig();
       var od = api.ScanConfig.fromJson(o.toJson());
-      checkScanConfig(od);
+      checkScanConfig(od as api.ScanConfig);
     });
   });
 
@@ -1068,7 +1070,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScanConfigError();
       var od = api.ScanConfigError.fromJson(o.toJson());
-      checkScanConfigError(od);
+      checkScanConfigError(od as api.ScanConfigError);
     });
   });
 
@@ -1076,7 +1078,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScanRun();
       var od = api.ScanRun.fromJson(o.toJson());
-      checkScanRun(od);
+      checkScanRun(od as api.ScanRun);
     });
   });
 
@@ -1084,7 +1086,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScanRunErrorTrace();
       var od = api.ScanRunErrorTrace.fromJson(o.toJson());
-      checkScanRunErrorTrace(od);
+      checkScanRunErrorTrace(od as api.ScanRunErrorTrace);
     });
   });
 
@@ -1092,7 +1094,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildScanRunWarningTrace();
       var od = api.ScanRunWarningTrace.fromJson(o.toJson());
-      checkScanRunWarningTrace(od);
+      checkScanRunWarningTrace(od as api.ScanRunWarningTrace);
     });
   });
 
@@ -1100,7 +1102,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSchedule();
       var od = api.Schedule.fromJson(o.toJson());
-      checkSchedule(od);
+      checkSchedule(od as api.Schedule);
     });
   });
 
@@ -1108,7 +1110,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStartScanRunRequest();
       var od = api.StartScanRunRequest.fromJson(o.toJson());
-      checkStartScanRunRequest(od);
+      checkStartScanRunRequest(od as api.StartScanRunRequest);
     });
   });
 
@@ -1116,7 +1118,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildStopScanRunRequest();
       var od = api.StopScanRunRequest.fromJson(o.toJson());
-      checkStopScanRunRequest(od);
+      checkStopScanRunRequest(od as api.StopScanRunRequest);
     });
   });
 
@@ -1124,7 +1126,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildViolatingResource();
       var od = api.ViolatingResource.fromJson(o.toJson());
-      checkViolatingResource(od);
+      checkViolatingResource(od as api.ViolatingResource);
     });
   });
 
@@ -1132,7 +1134,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVulnerableHeaders();
       var od = api.VulnerableHeaders.fromJson(o.toJson());
-      checkVulnerableHeaders(od);
+      checkVulnerableHeaders(od as api.VulnerableHeaders);
     });
   });
 
@@ -1140,7 +1142,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVulnerableParameters();
       var od = api.VulnerableParameters.fromJson(o.toJson());
-      checkVulnerableParameters(od);
+      checkVulnerableParameters(od as api.VulnerableParameters);
     });
   });
 
@@ -1148,7 +1150,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildXss();
       var od = api.Xss.fromJson(o.toJson());
-      checkXss(od);
+      checkXss(od as api.Xss);
     });
   });
 
@@ -1160,8 +1162,9 @@
       var arg_parent = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ScanConfig.fromJson(json);
-        checkScanConfig(obj);
+        var obj = api.ScanConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkScanConfig(obj as api.ScanConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1201,7 +1204,7 @@
       res
           .create(arg_request, arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScanConfig(response);
+        checkScanConfig(response as api.ScanConfig);
       })));
     });
 
@@ -1249,7 +1252,7 @@
       res
           .delete(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -1297,7 +1300,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScanConfig(response);
+        checkScanConfig(response as api.ScanConfig);
       })));
     });
 
@@ -1354,7 +1357,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListScanConfigsResponse(response);
+        checkListScanConfigsResponse(response as api.ListScanConfigsResponse);
       })));
     });
 
@@ -1366,8 +1369,9 @@
       var arg_updateMask = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ScanConfig.fromJson(json);
-        checkScanConfig(obj);
+        var obj = api.ScanConfig.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkScanConfig(obj as api.ScanConfig);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1410,7 +1414,7 @@
           .patch(arg_request, arg_name,
               updateMask: arg_updateMask, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScanConfig(response);
+        checkScanConfig(response as api.ScanConfig);
       })));
     });
 
@@ -1421,8 +1425,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StartScanRunRequest.fromJson(json);
-        checkStartScanRunRequest(obj);
+        var obj = api.StartScanRunRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStartScanRunRequest(obj as api.StartScanRunRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1462,7 +1467,7 @@
       res
           .start(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScanRun(response);
+        checkScanRun(response as api.ScanRun);
       })));
     });
   });
@@ -1512,7 +1517,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScanRun(response);
+        checkScanRun(response as api.ScanRun);
       })));
     });
 
@@ -1569,7 +1574,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListScanRunsResponse(response);
+        checkListScanRunsResponse(response as api.ListScanRunsResponse);
       })));
     });
 
@@ -1580,8 +1585,9 @@
       var arg_name = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.StopScanRunRequest.fromJson(json);
-        checkStopScanRunRequest(obj);
+        var obj = api.StopScanRunRequest.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkStopScanRunRequest(obj as api.StopScanRunRequest);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -1621,7 +1627,7 @@
       res
           .stop(arg_request, arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkScanRun(response);
+        checkScanRun(response as api.ScanRun);
       })));
     });
   });
@@ -1685,7 +1691,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListCrawledUrlsResponse(response);
+        checkListCrawledUrlsResponse(response as api.ListCrawledUrlsResponse);
       })));
     });
   });
@@ -1740,7 +1746,8 @@
       res
           .list(arg_parent, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFindingTypeStatsResponse(response);
+        checkListFindingTypeStatsResponse(
+            response as api.ListFindingTypeStatsResponse);
       })));
     });
   });
@@ -1794,7 +1801,7 @@
       res
           .get(arg_name, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkFinding(response);
+        checkFinding(response as api.Finding);
       })));
     });
 
@@ -1858,7 +1865,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListFindingsResponse(response);
+        checkListFindingsResponse(response as api.ListFindingsResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/youtube/v3_test.dart b/generated/googleapis/test/youtube/v3_test.dart
index 1bc9116..3ce4014 100644
--- a/generated/googleapis/test/youtube/v3_test.dart
+++ b/generated/googleapis/test/youtube/v3_test.dart
@@ -83,8 +83,8 @@
 
 void checkUnnamed2330(core.List<api.AbuseType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkAbuseType(o[0]);
-  checkAbuseType(o[1]);
+  checkAbuseType(o[0] as api.AbuseType);
+  checkAbuseType(o[1] as api.AbuseType);
 }
 
 core.List<api.RelatedEntity> buildUnnamed2331() {
@@ -96,8 +96,8 @@
 
 void checkUnnamed2331(core.List<api.RelatedEntity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkRelatedEntity(o[0]);
-  checkRelatedEntity(o[1]);
+  checkRelatedEntity(o[0] as api.RelatedEntity);
+  checkRelatedEntity(o[1] as api.RelatedEntity);
 }
 
 core.int buildCounterAbuseReport = 0;
@@ -120,7 +120,7 @@
     checkUnnamed2330(o.abuseTypes);
     unittest.expect(o.description, unittest.equals('foo'));
     checkUnnamed2331(o.relatedEntities);
-    checkEntity(o.subject);
+    checkEntity(o.subject as api.Entity);
   }
   buildCounterAbuseReport--;
 }
@@ -196,11 +196,11 @@
 void checkActivity(api.Activity o) {
   buildCounterActivity++;
   if (buildCounterActivity < 3) {
-    checkActivityContentDetails(o.contentDetails);
+    checkActivityContentDetails(o.contentDetails as api.ActivityContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkActivitySnippet(o.snippet);
+    checkActivitySnippet(o.snippet as api.ActivitySnippet);
   }
   buildCounterActivity--;
 }
@@ -229,17 +229,27 @@
 void checkActivityContentDetails(api.ActivityContentDetails o) {
   buildCounterActivityContentDetails++;
   if (buildCounterActivityContentDetails < 3) {
-    checkActivityContentDetailsBulletin(o.bulletin);
-    checkActivityContentDetailsChannelItem(o.channelItem);
-    checkActivityContentDetailsComment(o.comment);
-    checkActivityContentDetailsFavorite(o.favorite);
-    checkActivityContentDetailsLike(o.like);
-    checkActivityContentDetailsPlaylistItem(o.playlistItem);
-    checkActivityContentDetailsPromotedItem(o.promotedItem);
-    checkActivityContentDetailsRecommendation(o.recommendation);
-    checkActivityContentDetailsSocial(o.social);
-    checkActivityContentDetailsSubscription(o.subscription);
-    checkActivityContentDetailsUpload(o.upload);
+    checkActivityContentDetailsBulletin(
+        o.bulletin as api.ActivityContentDetailsBulletin);
+    checkActivityContentDetailsChannelItem(
+        o.channelItem as api.ActivityContentDetailsChannelItem);
+    checkActivityContentDetailsComment(
+        o.comment as api.ActivityContentDetailsComment);
+    checkActivityContentDetailsFavorite(
+        o.favorite as api.ActivityContentDetailsFavorite);
+    checkActivityContentDetailsLike(o.like as api.ActivityContentDetailsLike);
+    checkActivityContentDetailsPlaylistItem(
+        o.playlistItem as api.ActivityContentDetailsPlaylistItem);
+    checkActivityContentDetailsPromotedItem(
+        o.promotedItem as api.ActivityContentDetailsPromotedItem);
+    checkActivityContentDetailsRecommendation(
+        o.recommendation as api.ActivityContentDetailsRecommendation);
+    checkActivityContentDetailsSocial(
+        o.social as api.ActivityContentDetailsSocial);
+    checkActivityContentDetailsSubscription(
+        o.subscription as api.ActivityContentDetailsSubscription);
+    checkActivityContentDetailsUpload(
+        o.upload as api.ActivityContentDetailsUpload);
   }
   buildCounterActivityContentDetails--;
 }
@@ -258,7 +268,7 @@
 void checkActivityContentDetailsBulletin(api.ActivityContentDetailsBulletin o) {
   buildCounterActivityContentDetailsBulletin++;
   if (buildCounterActivityContentDetailsBulletin < 3) {
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsBulletin--;
 }
@@ -278,7 +288,7 @@
     api.ActivityContentDetailsChannelItem o) {
   buildCounterActivityContentDetailsChannelItem++;
   if (buildCounterActivityContentDetailsChannelItem < 3) {
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsChannelItem--;
 }
@@ -297,7 +307,7 @@
 void checkActivityContentDetailsComment(api.ActivityContentDetailsComment o) {
   buildCounterActivityContentDetailsComment++;
   if (buildCounterActivityContentDetailsComment < 3) {
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsComment--;
 }
@@ -316,7 +326,7 @@
 void checkActivityContentDetailsFavorite(api.ActivityContentDetailsFavorite o) {
   buildCounterActivityContentDetailsFavorite++;
   if (buildCounterActivityContentDetailsFavorite < 3) {
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsFavorite--;
 }
@@ -335,7 +345,7 @@
 void checkActivityContentDetailsLike(api.ActivityContentDetailsLike o) {
   buildCounterActivityContentDetailsLike++;
   if (buildCounterActivityContentDetailsLike < 3) {
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsLike--;
 }
@@ -360,7 +370,7 @@
   if (buildCounterActivityContentDetailsPlaylistItem < 3) {
     unittest.expect(o.playlistId, unittest.equals('foo'));
     unittest.expect(o.playlistItemId, unittest.equals('foo'));
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsPlaylistItem--;
 }
@@ -449,8 +459,8 @@
   buildCounterActivityContentDetailsRecommendation++;
   if (buildCounterActivityContentDetailsRecommendation < 3) {
     unittest.expect(o.reason, unittest.equals('foo'));
-    checkResourceId(o.resourceId);
-    checkResourceId(o.seedResourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
+    checkResourceId(o.seedResourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsRecommendation--;
 }
@@ -476,7 +486,7 @@
     unittest.expect(o.author, unittest.equals('foo'));
     unittest.expect(o.imageUrl, unittest.equals('foo'));
     unittest.expect(o.referenceUrl, unittest.equals('foo'));
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterActivityContentDetailsSocial--;
@@ -498,7 +508,7 @@
     api.ActivityContentDetailsSubscription o) {
   buildCounterActivityContentDetailsSubscription++;
   if (buildCounterActivityContentDetailsSubscription < 3) {
-    checkResourceId(o.resourceId);
+    checkResourceId(o.resourceId as api.ResourceId);
   }
   buildCounterActivityContentDetailsSubscription--;
 }
@@ -531,8 +541,8 @@
 
 void checkUnnamed2335(core.List<api.Activity> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkActivity(o[0]);
-  checkActivity(o[1]);
+  checkActivity(o[0] as api.Activity);
+  checkActivity(o[1] as api.Activity);
 }
 
 core.int buildCounterActivityListResponse = 0;
@@ -562,9 +572,9 @@
     checkUnnamed2335(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterActivityListResponse--;
@@ -596,7 +606,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.groupId, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals('foo'));
-    checkThumbnailDetails(o.thumbnails);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -623,7 +633,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkCaptionSnippet(o.snippet);
+    checkCaptionSnippet(o.snippet as api.CaptionSnippet);
   }
   buildCounterCaption--;
 }
@@ -637,8 +647,8 @@
 
 void checkUnnamed2336(core.List<api.Caption> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCaption(o[0]);
-  checkCaption(o[1]);
+  checkCaption(o[0] as api.Caption);
+  checkCaption(o[1] as api.Caption);
 }
 
 core.int buildCounterCaptionListResponse = 0;
@@ -731,7 +741,7 @@
   if (buildCounterCdnSettings < 3) {
     unittest.expect(o.format, unittest.equals('foo'));
     unittest.expect(o.frameRate, unittest.equals('foo'));
-    checkIngestionInfo(o.ingestionInfo);
+    checkIngestionInfo(o.ingestionInfo as api.IngestionInfo);
     unittest.expect(o.ingestionType, unittest.equals('foo'));
     unittest.expect(o.resolution, unittest.equals('foo'));
   }
@@ -747,8 +757,8 @@
 
 void checkUnnamed2337(core.Map<core.String, api.ChannelLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannelLocalization(o['x']);
-  checkChannelLocalization(o['y']);
+  checkChannelLocalization(o['x'] as api.ChannelLocalization);
+  checkChannelLocalization(o['y'] as api.ChannelLocalization);
 }
 
 core.int buildCounterChannel = 0;
@@ -777,19 +787,22 @@
 void checkChannel(api.Channel o) {
   buildCounterChannel++;
   if (buildCounterChannel < 3) {
-    checkChannelAuditDetails(o.auditDetails);
-    checkChannelBrandingSettings(o.brandingSettings);
-    checkChannelContentDetails(o.contentDetails);
-    checkChannelContentOwnerDetails(o.contentOwnerDetails);
-    checkChannelConversionPings(o.conversionPings);
+    checkChannelAuditDetails(o.auditDetails as api.ChannelAuditDetails);
+    checkChannelBrandingSettings(
+        o.brandingSettings as api.ChannelBrandingSettings);
+    checkChannelContentDetails(o.contentDetails as api.ChannelContentDetails);
+    checkChannelContentOwnerDetails(
+        o.contentOwnerDetails as api.ChannelContentOwnerDetails);
+    checkChannelConversionPings(
+        o.conversionPings as api.ChannelConversionPings);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed2337(o.localizations);
-    checkChannelSnippet(o.snippet);
-    checkChannelStatistics(o.statistics);
-    checkChannelStatus(o.status);
-    checkChannelTopicDetails(o.topicDetails);
+    checkChannelSnippet(o.snippet as api.ChannelSnippet);
+    checkChannelStatistics(o.statistics as api.ChannelStatistics);
+    checkChannelStatus(o.status as api.ChannelStatus);
+    checkChannelTopicDetails(o.topicDetails as api.ChannelTopicDetails);
   }
   buildCounterChannel--;
 }
@@ -849,8 +862,8 @@
 
 void checkUnnamed2338(core.List<api.PropertyValue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPropertyValue(o[0]);
-  checkPropertyValue(o[1]);
+  checkPropertyValue(o[0] as api.PropertyValue);
+  checkPropertyValue(o[1] as api.PropertyValue);
 }
 
 core.int buildCounterChannelBrandingSettings = 0;
@@ -870,10 +883,10 @@
 void checkChannelBrandingSettings(api.ChannelBrandingSettings o) {
   buildCounterChannelBrandingSettings++;
   if (buildCounterChannelBrandingSettings < 3) {
-    checkChannelSettings(o.channel);
+    checkChannelSettings(o.channel as api.ChannelSettings);
     checkUnnamed2338(o.hints);
-    checkImageSettings(o.image);
-    checkWatchSettings(o.watch);
+    checkImageSettings(o.image as api.ImageSettings);
+    checkWatchSettings(o.watch as api.WatchSettings);
   }
   buildCounterChannelBrandingSettings--;
 }
@@ -921,7 +934,8 @@
 void checkChannelContentDetails(api.ChannelContentDetails o) {
   buildCounterChannelContentDetails++;
   if (buildCounterChannelContentDetails < 3) {
-    checkChannelContentDetailsRelatedPlaylists(o.relatedPlaylists);
+    checkChannelContentDetailsRelatedPlaylists(
+        o.relatedPlaylists as api.ChannelContentDetailsRelatedPlaylists);
   }
   buildCounterChannelContentDetails--;
 }
@@ -977,8 +991,8 @@
 
 void checkUnnamed2339(core.List<api.ChannelConversionPing> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannelConversionPing(o[0]);
-  checkChannelConversionPing(o[1]);
+  checkChannelConversionPing(o[0] as api.ChannelConversionPing);
+  checkChannelConversionPing(o[1] as api.ChannelConversionPing);
 }
 
 core.int buildCounterChannelConversionPings = 0;
@@ -1009,8 +1023,8 @@
 
 void checkUnnamed2340(core.List<api.Channel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannel(o[0]);
-  checkChannel(o[1]);
+  checkChannel(o[0] as api.Channel);
+  checkChannel(o[1] as api.Channel);
 }
 
 core.int buildCounterChannelListResponse = 0;
@@ -1040,9 +1054,9 @@
     checkUnnamed2340(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterChannelListResponse--;
@@ -1103,8 +1117,8 @@
 
 void checkUnnamed2341(core.Map<core.String, api.ChannelSectionLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannelSectionLocalization(o['x']);
-  checkChannelSectionLocalization(o['y']);
+  checkChannelSectionLocalization(o['x'] as api.ChannelSectionLocalization);
+  checkChannelSectionLocalization(o['y'] as api.ChannelSectionLocalization);
 }
 
 core.int buildCounterChannelSection = 0;
@@ -1127,13 +1141,14 @@
 void checkChannelSection(api.ChannelSection o) {
   buildCounterChannelSection++;
   if (buildCounterChannelSection < 3) {
-    checkChannelSectionContentDetails(o.contentDetails);
+    checkChannelSectionContentDetails(
+        o.contentDetails as api.ChannelSectionContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed2341(o.localizations);
-    checkChannelSectionSnippet(o.snippet);
-    checkChannelSectionTargeting(o.targeting);
+    checkChannelSectionSnippet(o.snippet as api.ChannelSectionSnippet);
+    checkChannelSectionTargeting(o.targeting as api.ChannelSectionTargeting);
   }
   buildCounterChannelSection--;
 }
@@ -1194,8 +1209,8 @@
 
 void checkUnnamed2344(core.List<api.ChannelSection> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkChannelSection(o[0]);
-  checkChannelSection(o[1]);
+  checkChannelSection(o[0] as api.ChannelSection);
+  checkChannelSection(o[1] as api.ChannelSection);
 }
 
 core.int buildCounterChannelSectionListResponse = 0;
@@ -1266,7 +1281,8 @@
   if (buildCounterChannelSectionSnippet < 3) {
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
-    checkChannelSectionLocalization(o.localized);
+    checkChannelSectionLocalization(
+        o.localized as api.ChannelSectionLocalization);
     unittest.expect(o.position, unittest.equals(42));
     unittest.expect(o.style, unittest.equals('foo'));
     unittest.expect(o.title, unittest.equals('foo'));
@@ -1420,9 +1436,9 @@
     unittest.expect(o.customUrl, unittest.equals('foo'));
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkChannelLocalization(o.localized);
+    checkChannelLocalization(o.localized as api.ChannelLocalization);
     unittest.expect(o.publishedAt, unittest.equals('foo'));
-    checkThumbnailDetails(o.thumbnails);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterChannelSnippet--;
@@ -1570,7 +1586,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkCommentSnippet(o.snippet);
+    checkCommentSnippet(o.snippet as api.CommentSnippet);
   }
   buildCounterComment--;
 }
@@ -1584,8 +1600,8 @@
 
 void checkUnnamed2351(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComment(o[0]);
-  checkComment(o[1]);
+  checkComment(o[0] as api.Comment);
+  checkComment(o[1] as api.Comment);
 }
 
 core.int buildCounterCommentListResponse = 0;
@@ -1614,8 +1630,8 @@
     checkUnnamed2351(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
-    checkTokenPagination(o.tokenPagination);
+    checkPageInfo(o.pageInfo as api.PageInfo);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterCommentListResponse--;
@@ -1649,7 +1665,8 @@
 void checkCommentSnippet(api.CommentSnippet o) {
   buildCounterCommentSnippet++;
   if (buildCounterCommentSnippet < 3) {
-    checkCommentSnippetAuthorChannelId(o.authorChannelId);
+    checkCommentSnippetAuthorChannelId(
+        o.authorChannelId as api.CommentSnippetAuthorChannelId);
     unittest.expect(o.authorChannelUrl, unittest.equals('foo'));
     unittest.expect(o.authorDisplayName, unittest.equals('foo'));
     unittest.expect(o.authorProfileImageUrl, unittest.equals('foo'));
@@ -1708,8 +1725,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkCommentThreadReplies(o.replies);
-    checkCommentThreadSnippet(o.snippet);
+    checkCommentThreadReplies(o.replies as api.CommentThreadReplies);
+    checkCommentThreadSnippet(o.snippet as api.CommentThreadSnippet);
   }
   buildCounterCommentThread--;
 }
@@ -1723,8 +1740,8 @@
 
 void checkUnnamed2352(core.List<api.CommentThread> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkCommentThread(o[0]);
-  checkCommentThread(o[1]);
+  checkCommentThread(o[0] as api.CommentThread);
+  checkCommentThread(o[1] as api.CommentThread);
 }
 
 core.int buildCounterCommentThreadListResponse = 0;
@@ -1753,8 +1770,8 @@
     checkUnnamed2352(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
-    checkTokenPagination(o.tokenPagination);
+    checkPageInfo(o.pageInfo as api.PageInfo);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterCommentThreadListResponse--;
@@ -1769,8 +1786,8 @@
 
 void checkUnnamed2353(core.List<api.Comment> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkComment(o[0]);
-  checkComment(o[1]);
+  checkComment(o[0] as api.Comment);
+  checkComment(o[1] as api.Comment);
 }
 
 core.int buildCounterCommentThreadReplies = 0;
@@ -1814,7 +1831,7 @@
     unittest.expect(o.canReply, unittest.isTrue);
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.isPublic, unittest.isTrue);
-    checkComment(o.topLevelComment);
+    checkComment(o.topLevelComment as api.Comment);
     unittest.expect(o.totalReplyCount, unittest.equals(42));
     unittest.expect(o.videoId, unittest.equals('foo'));
   }
@@ -2072,7 +2089,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkI18nLanguageSnippet(o.snippet);
+    checkI18nLanguageSnippet(o.snippet as api.I18nLanguageSnippet);
   }
   buildCounterI18nLanguage--;
 }
@@ -2086,8 +2103,8 @@
 
 void checkUnnamed2356(core.List<api.I18nLanguage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkI18nLanguage(o[0]);
-  checkI18nLanguage(o[1]);
+  checkI18nLanguage(o[0] as api.I18nLanguage);
+  checkI18nLanguage(o[1] as api.I18nLanguage);
 }
 
 core.int buildCounterI18nLanguageListResponse = 0;
@@ -2158,7 +2175,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkI18nRegionSnippet(o.snippet);
+    checkI18nRegionSnippet(o.snippet as api.I18nRegionSnippet);
   }
   buildCounterI18nRegion--;
 }
@@ -2172,8 +2189,8 @@
 
 void checkUnnamed2357(core.List<api.I18nRegion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkI18nRegion(o[0]);
-  checkI18nRegion(o[1]);
+  checkI18nRegion(o[0] as api.I18nRegion);
+  checkI18nRegion(o[1] as api.I18nRegion);
 }
 
 core.int buildCounterI18nRegionListResponse = 0;
@@ -2259,7 +2276,7 @@
 void checkImageSettings(api.ImageSettings o) {
   buildCounterImageSettings++;
   if (buildCounterImageSettings < 3) {
-    checkLocalizedProperty(o.backgroundImageUrl);
+    checkLocalizedProperty(o.backgroundImageUrl as api.LocalizedProperty);
     unittest.expect(o.bannerExternalUrl, unittest.equals('foo'));
     unittest.expect(o.bannerImageUrl, unittest.equals('foo'));
     unittest.expect(o.bannerMobileExtraHdImageUrl, unittest.equals('foo'));
@@ -2275,10 +2292,14 @@
     unittest.expect(o.bannerTvImageUrl, unittest.equals('foo'));
     unittest.expect(o.bannerTvLowImageUrl, unittest.equals('foo'));
     unittest.expect(o.bannerTvMediumImageUrl, unittest.equals('foo'));
-    checkLocalizedProperty(o.largeBrandedBannerImageImapScript);
-    checkLocalizedProperty(o.largeBrandedBannerImageUrl);
-    checkLocalizedProperty(o.smallBrandedBannerImageImapScript);
-    checkLocalizedProperty(o.smallBrandedBannerImageUrl);
+    checkLocalizedProperty(
+        o.largeBrandedBannerImageImapScript as api.LocalizedProperty);
+    checkLocalizedProperty(
+        o.largeBrandedBannerImageUrl as api.LocalizedProperty);
+    checkLocalizedProperty(
+        o.smallBrandedBannerImageImapScript as api.LocalizedProperty);
+    checkLocalizedProperty(
+        o.smallBrandedBannerImageUrl as api.LocalizedProperty);
     unittest.expect(o.trackingImageUrl, unittest.equals('foo'));
     unittest.expect(o.watchIconImageUrl, unittest.equals('foo'));
   }
@@ -2332,9 +2353,9 @@
   if (buildCounterInvideoBranding < 3) {
     unittest.expect(o.imageBytes, unittest.equals('foo'));
     unittest.expect(o.imageUrl, unittest.equals('foo'));
-    checkInvideoPosition(o.position);
+    checkInvideoPosition(o.position as api.InvideoPosition);
     unittest.expect(o.targetChannelId, unittest.equals('foo'));
-    checkInvideoTiming(o.timing);
+    checkInvideoTiming(o.timing as api.InvideoTiming);
   }
   buildCounterInvideoBranding--;
 }
@@ -2441,13 +2462,14 @@
 void checkLiveBroadcast(api.LiveBroadcast o) {
   buildCounterLiveBroadcast++;
   if (buildCounterLiveBroadcast < 3) {
-    checkLiveBroadcastContentDetails(o.contentDetails);
+    checkLiveBroadcastContentDetails(
+        o.contentDetails as api.LiveBroadcastContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLiveBroadcastSnippet(o.snippet);
-    checkLiveBroadcastStatistics(o.statistics);
-    checkLiveBroadcastStatus(o.status);
+    checkLiveBroadcastSnippet(o.snippet as api.LiveBroadcastSnippet);
+    checkLiveBroadcastStatistics(o.statistics as api.LiveBroadcastStatistics);
+    checkLiveBroadcastStatus(o.status as api.LiveBroadcastStatus);
   }
   buildCounterLiveBroadcast--;
 }
@@ -2493,7 +2515,7 @@
     unittest.expect(o.enableLowLatency, unittest.isTrue);
     unittest.expect(o.latencyPreference, unittest.equals('foo'));
     unittest.expect(o.mesh, unittest.equals('foo'));
-    checkMonitorStreamInfo(o.monitorStream);
+    checkMonitorStreamInfo(o.monitorStream as api.MonitorStreamInfo);
     unittest.expect(o.projection, unittest.equals('foo'));
     unittest.expect(o.recordFromStart, unittest.isTrue);
     unittest.expect(o.startWithSlate, unittest.isTrue);
@@ -2510,8 +2532,8 @@
 
 void checkUnnamed2358(core.List<api.LiveBroadcast> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiveBroadcast(o[0]);
-  checkLiveBroadcast(o[1]);
+  checkLiveBroadcast(o[0] as api.LiveBroadcast);
+  checkLiveBroadcast(o[1] as api.LiveBroadcast);
 }
 
 core.int buildCounterLiveBroadcastListResponse = 0;
@@ -2541,9 +2563,9 @@
     checkUnnamed2358(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterLiveBroadcastListResponse--;
@@ -2582,7 +2604,7 @@
     unittest.expect(o.publishedAt, unittest.equals('foo'));
     unittest.expect(o.scheduledEndTime, unittest.equals('foo'));
     unittest.expect(o.scheduledStartTime, unittest.equals('foo'));
-    checkThumbnailDetails(o.thumbnails);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterLiveBroadcastSnippet--;
@@ -2656,7 +2678,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLiveChatBanSnippet(o.snippet);
+    checkLiveChatBanSnippet(o.snippet as api.LiveChatBanSnippet);
   }
   buildCounterLiveChatBan--;
 }
@@ -2679,7 +2701,8 @@
   buildCounterLiveChatBanSnippet++;
   if (buildCounterLiveChatBanSnippet < 3) {
     unittest.expect(o.banDurationSeconds, unittest.equals('foo'));
-    checkChannelProfileDetails(o.bannedUserDetails);
+    checkChannelProfileDetails(
+        o.bannedUserDetails as api.ChannelProfileDetails);
     unittest.expect(o.liveChatId, unittest.equals('foo'));
     unittest.expect(o.type, unittest.equals('foo'));
   }
@@ -2729,11 +2752,12 @@
 void checkLiveChatMessage(api.LiveChatMessage o) {
   buildCounterLiveChatMessage++;
   if (buildCounterLiveChatMessage < 3) {
-    checkLiveChatMessageAuthorDetails(o.authorDetails);
+    checkLiveChatMessageAuthorDetails(
+        o.authorDetails as api.LiveChatMessageAuthorDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLiveChatMessageSnippet(o.snippet);
+    checkLiveChatMessageSnippet(o.snippet as api.LiveChatMessageSnippet);
   }
   buildCounterLiveChatMessage--;
 }
@@ -2799,8 +2823,8 @@
 
 void checkUnnamed2359(core.List<api.LiveChatMessage> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiveChatMessage(o[0]);
-  checkLiveChatMessage(o[1]);
+  checkLiveChatMessage(o[0] as api.LiveChatMessage);
+  checkLiveChatMessage(o[1] as api.LiveChatMessage);
 }
 
 core.int buildCounterLiveChatMessageListResponse = 0;
@@ -2832,9 +2856,9 @@
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
     unittest.expect(o.offlineAt, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.pollingIntervalMillis, unittest.equals(42));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterLiveChatMessageListResponse--;
@@ -2888,17 +2912,24 @@
   if (buildCounterLiveChatMessageSnippet < 3) {
     unittest.expect(o.authorChannelId, unittest.equals('foo'));
     unittest.expect(o.displayMessage, unittest.equals('foo'));
-    checkLiveChatFanFundingEventDetails(o.fanFundingEventDetails);
+    checkLiveChatFanFundingEventDetails(
+        o.fanFundingEventDetails as api.LiveChatFanFundingEventDetails);
     unittest.expect(o.hasDisplayContent, unittest.isTrue);
     unittest.expect(o.liveChatId, unittest.equals('foo'));
-    checkLiveChatMessageDeletedDetails(o.messageDeletedDetails);
-    checkLiveChatMessageRetractedDetails(o.messageRetractedDetails);
+    checkLiveChatMessageDeletedDetails(
+        o.messageDeletedDetails as api.LiveChatMessageDeletedDetails);
+    checkLiveChatMessageRetractedDetails(
+        o.messageRetractedDetails as api.LiveChatMessageRetractedDetails);
     unittest.expect(o.publishedAt, unittest.equals('foo'));
-    checkLiveChatSuperChatDetails(o.superChatDetails);
-    checkLiveChatSuperStickerDetails(o.superStickerDetails);
-    checkLiveChatTextMessageDetails(o.textMessageDetails);
+    checkLiveChatSuperChatDetails(
+        o.superChatDetails as api.LiveChatSuperChatDetails);
+    checkLiveChatSuperStickerDetails(
+        o.superStickerDetails as api.LiveChatSuperStickerDetails);
+    checkLiveChatTextMessageDetails(
+        o.textMessageDetails as api.LiveChatTextMessageDetails);
     unittest.expect(o.type, unittest.equals('foo'));
-    checkLiveChatUserBannedMessageDetails(o.userBannedDetails);
+    checkLiveChatUserBannedMessageDetails(
+        o.userBannedDetails as api.LiveChatUserBannedMessageDetails);
   }
   buildCounterLiveChatMessageSnippet--;
 }
@@ -2923,7 +2954,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLiveChatModeratorSnippet(o.snippet);
+    checkLiveChatModeratorSnippet(o.snippet as api.LiveChatModeratorSnippet);
   }
   buildCounterLiveChatModerator--;
 }
@@ -2937,8 +2968,8 @@
 
 void checkUnnamed2360(core.List<api.LiveChatModerator> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiveChatModerator(o[0]);
-  checkLiveChatModerator(o[1]);
+  checkLiveChatModerator(o[0] as api.LiveChatModerator);
+  checkLiveChatModerator(o[1] as api.LiveChatModerator);
 }
 
 core.int buildCounterLiveChatModeratorListResponse = 0;
@@ -2968,9 +2999,9 @@
     checkUnnamed2360(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterLiveChatModeratorListResponse--;
@@ -2992,7 +3023,7 @@
   buildCounterLiveChatModeratorSnippet++;
   if (buildCounterLiveChatModeratorSnippet < 3) {
     unittest.expect(o.liveChatId, unittest.equals('foo'));
-    checkChannelProfileDetails(o.moderatorDetails);
+    checkChannelProfileDetails(o.moderatorDetails as api.ChannelProfileDetails);
   }
   buildCounterLiveChatModeratorSnippet--;
 }
@@ -3045,7 +3076,8 @@
     unittest.expect(o.amountDisplayString, unittest.equals('foo'));
     unittest.expect(o.amountMicros, unittest.equals('foo'));
     unittest.expect(o.currency, unittest.equals('foo'));
-    checkSuperStickerMetadata(o.superStickerMetadata);
+    checkSuperStickerMetadata(
+        o.superStickerMetadata as api.SuperStickerMetadata);
     unittest.expect(o.tier, unittest.equals(42));
   }
   buildCounterLiveChatSuperStickerDetails--;
@@ -3089,7 +3121,8 @@
   if (buildCounterLiveChatUserBannedMessageDetails < 3) {
     unittest.expect(o.banDurationSeconds, unittest.equals('foo'));
     unittest.expect(o.banType, unittest.equals('foo'));
-    checkChannelProfileDetails(o.bannedUserDetails);
+    checkChannelProfileDetails(
+        o.bannedUserDetails as api.ChannelProfileDetails);
   }
   buildCounterLiveChatUserBannedMessageDetails--;
 }
@@ -3114,13 +3147,14 @@
 void checkLiveStream(api.LiveStream o) {
   buildCounterLiveStream++;
   if (buildCounterLiveStream < 3) {
-    checkCdnSettings(o.cdn);
-    checkLiveStreamContentDetails(o.contentDetails);
+    checkCdnSettings(o.cdn as api.CdnSettings);
+    checkLiveStreamContentDetails(
+        o.contentDetails as api.LiveStreamContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkLiveStreamSnippet(o.snippet);
-    checkLiveStreamStatus(o.status);
+    checkLiveStreamSnippet(o.snippet as api.LiveStreamSnippet);
+    checkLiveStreamStatus(o.status as api.LiveStreamStatus);
   }
   buildCounterLiveStream--;
 }
@@ -3180,8 +3214,8 @@
 
 void checkUnnamed2361(core.List<api.LiveStreamConfigurationIssue> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiveStreamConfigurationIssue(o[0]);
-  checkLiveStreamConfigurationIssue(o[1]);
+  checkLiveStreamConfigurationIssue(o[0] as api.LiveStreamConfigurationIssue);
+  checkLiveStreamConfigurationIssue(o[1] as api.LiveStreamConfigurationIssue);
 }
 
 core.int buildCounterLiveStreamHealthStatus = 0;
@@ -3216,8 +3250,8 @@
 
 void checkUnnamed2362(core.List<api.LiveStream> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLiveStream(o[0]);
-  checkLiveStream(o[1]);
+  checkLiveStream(o[0] as api.LiveStream);
+  checkLiveStream(o[1] as api.LiveStream);
 }
 
 core.int buildCounterLiveStreamListResponse = 0;
@@ -3247,9 +3281,9 @@
     checkUnnamed2362(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterLiveStreamListResponse--;
@@ -3297,7 +3331,7 @@
 void checkLiveStreamStatus(api.LiveStreamStatus o) {
   buildCounterLiveStreamStatus++;
   if (buildCounterLiveStreamStatus < 3) {
-    checkLiveStreamHealthStatus(o.healthStatus);
+    checkLiveStreamHealthStatus(o.healthStatus as api.LiveStreamHealthStatus);
     unittest.expect(o.streamStatus, unittest.equals('foo'));
   }
   buildCounterLiveStreamStatus--;
@@ -3312,8 +3346,8 @@
 
 void checkUnnamed2363(core.List<api.LocalizedString> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkLocalizedString(o[0]);
-  checkLocalizedString(o[1]);
+  checkLocalizedString(o[0] as api.LocalizedString);
+  checkLocalizedString(o[1] as api.LocalizedString);
 }
 
 core.int buildCounterLocalizedProperty = 0;
@@ -3333,7 +3367,7 @@
   buildCounterLocalizedProperty++;
   if (buildCounterLocalizedProperty < 3) {
     unittest.expect(o.default_, unittest.equals('foo'));
-    checkLanguageTag(o.defaultLanguage);
+    checkLanguageTag(o.defaultLanguage as api.LanguageTag);
     checkUnnamed2363(o.localized);
   }
   buildCounterLocalizedProperty--;
@@ -3378,7 +3412,7 @@
   if (buildCounterMember < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkMemberSnippet(o.snippet);
+    checkMemberSnippet(o.snippet as api.MemberSnippet);
   }
   buildCounterMember--;
 }
@@ -3392,8 +3426,8 @@
 
 void checkUnnamed2364(core.List<api.Member> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMember(o[0]);
-  checkMember(o[1]);
+  checkMember(o[0] as api.Member);
+  checkMember(o[1] as api.Member);
 }
 
 core.int buildCounterMemberListResponse = 0;
@@ -3422,8 +3456,8 @@
     checkUnnamed2364(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
-    checkTokenPagination(o.tokenPagination);
+    checkPageInfo(o.pageInfo as api.PageInfo);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterMemberListResponse--;
@@ -3446,8 +3480,8 @@
   buildCounterMemberSnippet++;
   if (buildCounterMemberSnippet < 3) {
     unittest.expect(o.creatorChannelId, unittest.equals('foo'));
-    checkChannelProfileDetails(o.memberDetails);
-    checkMembershipsDetails(o.membershipsDetails);
+    checkChannelProfileDetails(o.memberDetails as api.ChannelProfileDetails);
+    checkMembershipsDetails(o.membershipsDetails as api.MembershipsDetails);
   }
   buildCounterMemberSnippet--;
 }
@@ -3474,8 +3508,8 @@
 
 void checkUnnamed2366(core.List<api.MembershipsDurationAtLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMembershipsDurationAtLevel(o[0]);
-  checkMembershipsDurationAtLevel(o[1]);
+  checkMembershipsDurationAtLevel(o[0] as api.MembershipsDurationAtLevel);
+  checkMembershipsDurationAtLevel(o[1] as api.MembershipsDurationAtLevel);
 }
 
 core.int buildCounterMembershipsDetails = 0;
@@ -3500,7 +3534,7 @@
     unittest.expect(o.highestAccessibleLevel, unittest.equals('foo'));
     unittest.expect(
         o.highestAccessibleLevelDisplayName, unittest.equals('foo'));
-    checkMembershipsDuration(o.membershipsDuration);
+    checkMembershipsDuration(o.membershipsDuration as api.MembershipsDuration);
     checkUnnamed2366(o.membershipsDurationAtLevels);
   }
   buildCounterMembershipsDetails--;
@@ -3570,7 +3604,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkMembershipsLevelSnippet(o.snippet);
+    checkMembershipsLevelSnippet(o.snippet as api.MembershipsLevelSnippet);
   }
   buildCounterMembershipsLevel--;
 }
@@ -3584,8 +3618,8 @@
 
 void checkUnnamed2367(core.List<api.MembershipsLevel> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkMembershipsLevel(o[0]);
-  checkMembershipsLevel(o[1]);
+  checkMembershipsLevel(o[0] as api.MembershipsLevel);
+  checkMembershipsLevel(o[1] as api.MembershipsLevel);
 }
 
 core.int buildCounterMembershipsLevelListResponse = 0;
@@ -3631,7 +3665,7 @@
   buildCounterMembershipsLevelSnippet++;
   if (buildCounterMembershipsLevelSnippet < 3) {
     unittest.expect(o.creatorChannelId, unittest.equals('foo'));
-    checkLevelDetails(o.levelDetails);
+    checkLevelDetails(o.levelDetails as api.LevelDetails);
   }
   buildCounterMembershipsLevelSnippet--;
 }
@@ -3689,8 +3723,8 @@
 
 void checkUnnamed2368(core.Map<core.String, api.PlaylistLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlaylistLocalization(o['x']);
-  checkPlaylistLocalization(o['y']);
+  checkPlaylistLocalization(o['x'] as api.PlaylistLocalization);
+  checkPlaylistLocalization(o['y'] as api.PlaylistLocalization);
 }
 
 core.int buildCounterPlaylist = 0;
@@ -3714,14 +3748,14 @@
 void checkPlaylist(api.Playlist o) {
   buildCounterPlaylist++;
   if (buildCounterPlaylist < 3) {
-    checkPlaylistContentDetails(o.contentDetails);
+    checkPlaylistContentDetails(o.contentDetails as api.PlaylistContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed2368(o.localizations);
-    checkPlaylistPlayer(o.player);
-    checkPlaylistSnippet(o.snippet);
-    checkPlaylistStatus(o.status);
+    checkPlaylistPlayer(o.player as api.PlaylistPlayer);
+    checkPlaylistSnippet(o.snippet as api.PlaylistSnippet);
+    checkPlaylistStatus(o.status as api.PlaylistStatus);
   }
   buildCounterPlaylist--;
 }
@@ -3764,12 +3798,13 @@
 void checkPlaylistItem(api.PlaylistItem o) {
   buildCounterPlaylistItem++;
   if (buildCounterPlaylistItem < 3) {
-    checkPlaylistItemContentDetails(o.contentDetails);
+    checkPlaylistItemContentDetails(
+        o.contentDetails as api.PlaylistItemContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkPlaylistItemSnippet(o.snippet);
-    checkPlaylistItemStatus(o.status);
+    checkPlaylistItemSnippet(o.snippet as api.PlaylistItemSnippet);
+    checkPlaylistItemStatus(o.status as api.PlaylistItemStatus);
   }
   buildCounterPlaylistItem--;
 }
@@ -3810,8 +3845,8 @@
 
 void checkUnnamed2369(core.List<api.PlaylistItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlaylistItem(o[0]);
-  checkPlaylistItem(o[1]);
+  checkPlaylistItem(o[0] as api.PlaylistItem);
+  checkPlaylistItem(o[1] as api.PlaylistItem);
 }
 
 core.int buildCounterPlaylistItemListResponse = 0;
@@ -3841,9 +3876,9 @@
     checkUnnamed2369(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterPlaylistItemListResponse--;
@@ -3877,8 +3912,8 @@
     unittest.expect(o.playlistId, unittest.equals('foo'));
     unittest.expect(o.position, unittest.equals(42));
     unittest.expect(o.publishedAt, unittest.equals('foo'));
-    checkResourceId(o.resourceId);
-    checkThumbnailDetails(o.thumbnails);
+    checkResourceId(o.resourceId as api.ResourceId);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterPlaylistItemSnippet--;
@@ -3912,8 +3947,8 @@
 
 void checkUnnamed2370(core.List<api.Playlist> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkPlaylist(o[0]);
-  checkPlaylist(o[1]);
+  checkPlaylist(o[0] as api.Playlist);
+  checkPlaylist(o[1] as api.Playlist);
 }
 
 core.int buildCounterPlaylistListResponse = 0;
@@ -3943,9 +3978,9 @@
     checkUnnamed2370(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterPlaylistListResponse--;
@@ -4030,10 +4065,10 @@
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkPlaylistLocalization(o.localized);
+    checkPlaylistLocalization(o.localized as api.PlaylistLocalization);
     unittest.expect(o.publishedAt, unittest.equals('foo'));
     checkUnnamed2371(o.tags);
-    checkThumbnailDetails(o.thumbnails);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterPlaylistSnippet--;
@@ -4093,7 +4128,7 @@
 void checkRelatedEntity(api.RelatedEntity o) {
   buildCounterRelatedEntity++;
   if (buildCounterRelatedEntity < 3) {
-    checkEntity(o.entity);
+    checkEntity(o.entity as api.Entity);
   }
   buildCounterRelatedEntity--;
 }
@@ -4132,8 +4167,8 @@
 
 void checkUnnamed2372(core.List<api.SearchResult> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSearchResult(o[0]);
-  checkSearchResult(o[1]);
+  checkSearchResult(o[0] as api.SearchResult);
+  checkSearchResult(o[1] as api.SearchResult);
 }
 
 core.int buildCounterSearchListResponse = 0;
@@ -4164,10 +4199,10 @@
     checkUnnamed2372(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
     unittest.expect(o.regionCode, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterSearchListResponse--;
@@ -4191,9 +4226,9 @@
   buildCounterSearchResult++;
   if (buildCounterSearchResult < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkResourceId(o.id);
+    checkResourceId(o.id as api.ResourceId);
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSearchResultSnippet(o.snippet);
+    checkSearchResultSnippet(o.snippet as api.SearchResultSnippet);
   }
   buildCounterSearchResult--;
 }
@@ -4223,7 +4258,7 @@
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.liveBroadcastContent, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals('foo'));
-    checkThumbnailDetails(o.thumbnails);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterSearchResultSnippet--;
@@ -4247,7 +4282,7 @@
   if (buildCounterSponsor < 3) {
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSponsorSnippet(o.snippet);
+    checkSponsorSnippet(o.snippet as api.SponsorSnippet);
   }
   buildCounterSponsor--;
 }
@@ -4261,8 +4296,8 @@
 
 void checkUnnamed2373(core.List<api.Sponsor> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSponsor(o[0]);
-  checkSponsor(o[1]);
+  checkSponsor(o[0] as api.Sponsor);
+  checkSponsor(o[1] as api.Sponsor);
 }
 
 core.int buildCounterSponsorListResponse = 0;
@@ -4291,8 +4326,8 @@
     checkUnnamed2373(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
-    checkTokenPagination(o.tokenPagination);
+    checkPageInfo(o.pageInfo as api.PageInfo);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterSponsorListResponse--;
@@ -4317,7 +4352,7 @@
   if (buildCounterSponsorSnippet < 3) {
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.cumulativeDurationMonths, unittest.equals(42));
-    checkChannelProfileDetails(o.sponsorDetails);
+    checkChannelProfileDetails(o.sponsorDetails as api.ChannelProfileDetails);
     unittest.expect(o.sponsorSince, unittest.equals('foo'));
   }
   buildCounterSponsorSnippet--;
@@ -4342,12 +4377,14 @@
 void checkSubscription(api.Subscription o) {
   buildCounterSubscription++;
   if (buildCounterSubscription < 3) {
-    checkSubscriptionContentDetails(o.contentDetails);
+    checkSubscriptionContentDetails(
+        o.contentDetails as api.SubscriptionContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSubscriptionSnippet(o.snippet);
-    checkSubscriptionSubscriberSnippet(o.subscriberSnippet);
+    checkSubscriptionSnippet(o.snippet as api.SubscriptionSnippet);
+    checkSubscriptionSubscriberSnippet(
+        o.subscriberSnippet as api.SubscriptionSubscriberSnippet);
   }
   buildCounterSubscription--;
 }
@@ -4384,8 +4421,8 @@
 
 void checkUnnamed2374(core.List<api.Subscription> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSubscription(o[0]);
-  checkSubscription(o[1]);
+  checkSubscription(o[0] as api.Subscription);
+  checkSubscription(o[1] as api.Subscription);
 }
 
 core.int buildCounterSubscriptionListResponse = 0;
@@ -4415,9 +4452,9 @@
     checkUnnamed2374(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterSubscriptionListResponse--;
@@ -4447,8 +4484,8 @@
     unittest.expect(o.channelTitle, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.publishedAt, unittest.equals('foo'));
-    checkResourceId(o.resourceId);
-    checkThumbnailDetails(o.thumbnails);
+    checkResourceId(o.resourceId as api.ResourceId);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterSubscriptionSnippet--;
@@ -4473,7 +4510,7 @@
   if (buildCounterSubscriptionSubscriberSnippet < 3) {
     unittest.expect(o.channelId, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
-    checkThumbnailDetails(o.thumbnails);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterSubscriptionSubscriberSnippet--;
@@ -4499,7 +4536,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkSuperChatEventSnippet(o.snippet);
+    checkSuperChatEventSnippet(o.snippet as api.SuperChatEventSnippet);
   }
   buildCounterSuperChatEvent--;
 }
@@ -4513,8 +4550,8 @@
 
 void checkUnnamed2375(core.List<api.SuperChatEvent> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkSuperChatEvent(o[0]);
-  checkSuperChatEvent(o[1]);
+  checkSuperChatEvent(o[0] as api.SuperChatEvent);
+  checkSuperChatEvent(o[1] as api.SuperChatEvent);
 }
 
 core.int buildCounterSuperChatEventListResponse = 0;
@@ -4543,8 +4580,8 @@
     checkUnnamed2375(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
-    checkTokenPagination(o.tokenPagination);
+    checkPageInfo(o.pageInfo as api.PageInfo);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterSuperChatEventListResponse--;
@@ -4581,8 +4618,9 @@
     unittest.expect(o.displayString, unittest.equals('foo'));
     unittest.expect(o.isSuperStickerEvent, unittest.isTrue);
     unittest.expect(o.messageType, unittest.equals(42));
-    checkSuperStickerMetadata(o.superStickerMetadata);
-    checkChannelProfileDetails(o.supporterDetails);
+    checkSuperStickerMetadata(
+        o.superStickerMetadata as api.SuperStickerMetadata);
+    checkChannelProfileDetails(o.supporterDetails as api.ChannelProfileDetails);
   }
   buildCounterSuperChatEventSnippet--;
 }
@@ -4628,7 +4666,7 @@
   if (buildCounterTestItem < 3) {
     unittest.expect(o.gaia, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
-    checkTestItemTestItemSnippet(o.snippet);
+    checkTestItemTestItemSnippet(o.snippet as api.TestItemTestItemSnippet);
   }
   buildCounterTestItem--;
 }
@@ -4669,8 +4707,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.linkingToken, unittest.equals('foo'));
-    checkThirdPartyLinkSnippet(o.snippet);
-    checkThirdPartyLinkStatus(o.status);
+    checkThirdPartyLinkSnippet(o.snippet as api.ThirdPartyLinkSnippet);
+    checkThirdPartyLinkStatus(o.status as api.ThirdPartyLinkStatus);
   }
   buildCounterThirdPartyLink--;
 }
@@ -4690,7 +4728,8 @@
 void checkThirdPartyLinkSnippet(api.ThirdPartyLinkSnippet o) {
   buildCounterThirdPartyLinkSnippet++;
   if (buildCounterThirdPartyLinkSnippet < 3) {
-    checkChannelToStoreLinkDetails(o.channelToStoreLink);
+    checkChannelToStoreLinkDetails(
+        o.channelToStoreLink as api.ChannelToStoreLinkDetails);
     unittest.expect(o.type, unittest.equals('foo'));
   }
   buildCounterThirdPartyLinkSnippet--;
@@ -4756,11 +4795,11 @@
 void checkThumbnailDetails(api.ThumbnailDetails o) {
   buildCounterThumbnailDetails++;
   if (buildCounterThumbnailDetails < 3) {
-    checkThumbnail(o.default_);
-    checkThumbnail(o.high);
-    checkThumbnail(o.maxres);
-    checkThumbnail(o.medium);
-    checkThumbnail(o.standard);
+    checkThumbnail(o.default_ as api.Thumbnail);
+    checkThumbnail(o.high as api.Thumbnail);
+    checkThumbnail(o.maxres as api.Thumbnail);
+    checkThumbnail(o.medium as api.Thumbnail);
+    checkThumbnail(o.standard as api.Thumbnail);
   }
   buildCounterThumbnailDetails--;
 }
@@ -4774,8 +4813,8 @@
 
 void checkUnnamed2376(core.List<api.ThumbnailDetails> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkThumbnailDetails(o[0]);
-  checkThumbnailDetails(o[1]);
+  checkThumbnailDetails(o[0] as api.ThumbnailDetails);
+  checkThumbnailDetails(o[1] as api.ThumbnailDetails);
 }
 
 core.int buildCounterThumbnailSetResponse = 0;
@@ -4829,8 +4868,8 @@
 
 void checkUnnamed2377(core.Map<core.String, api.VideoLocalization> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoLocalization(o['x']);
-  checkVideoLocalization(o['y']);
+  checkVideoLocalization(o['x'] as api.VideoLocalization);
+  checkVideoLocalization(o['y'] as api.VideoLocalization);
 }
 
 core.int buildCounterVideo = 0;
@@ -4864,24 +4903,27 @@
 void checkVideo(api.Video o) {
   buildCounterVideo++;
   if (buildCounterVideo < 3) {
-    checkVideoAgeGating(o.ageGating);
-    checkVideoContentDetails(o.contentDetails);
+    checkVideoAgeGating(o.ageGating as api.VideoAgeGating);
+    checkVideoContentDetails(o.contentDetails as api.VideoContentDetails);
     unittest.expect(o.etag, unittest.equals('foo'));
-    checkVideoFileDetails(o.fileDetails);
+    checkVideoFileDetails(o.fileDetails as api.VideoFileDetails);
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkVideoLiveStreamingDetails(o.liveStreamingDetails);
+    checkVideoLiveStreamingDetails(
+        o.liveStreamingDetails as api.VideoLiveStreamingDetails);
     checkUnnamed2377(o.localizations);
-    checkVideoMonetizationDetails(o.monetizationDetails);
-    checkVideoPlayer(o.player);
-    checkVideoProcessingDetails(o.processingDetails);
-    checkVideoProjectDetails(o.projectDetails);
-    checkVideoRecordingDetails(o.recordingDetails);
-    checkVideoSnippet(o.snippet);
-    checkVideoStatistics(o.statistics);
-    checkVideoStatus(o.status);
-    checkVideoSuggestions(o.suggestions);
-    checkVideoTopicDetails(o.topicDetails);
+    checkVideoMonetizationDetails(
+        o.monetizationDetails as api.VideoMonetizationDetails);
+    checkVideoPlayer(o.player as api.VideoPlayer);
+    checkVideoProcessingDetails(
+        o.processingDetails as api.VideoProcessingDetails);
+    checkVideoProjectDetails(o.projectDetails as api.VideoProjectDetails);
+    checkVideoRecordingDetails(o.recordingDetails as api.VideoRecordingDetails);
+    checkVideoSnippet(o.snippet as api.VideoSnippet);
+    checkVideoStatistics(o.statistics as api.VideoStatistics);
+    checkVideoStatus(o.status as api.VideoStatus);
+    checkVideoSuggestions(o.suggestions as api.VideoSuggestions);
+    checkVideoTopicDetails(o.topicDetails as api.VideoTopicDetails);
   }
   buildCounterVideo--;
 }
@@ -4933,7 +4975,8 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkVideoAbuseReportReasonSnippet(o.snippet);
+    checkVideoAbuseReportReasonSnippet(
+        o.snippet as api.VideoAbuseReportReasonSnippet);
   }
   buildCounterVideoAbuseReportReason--;
 }
@@ -4947,8 +4990,8 @@
 
 void checkUnnamed2378(core.List<api.VideoAbuseReportReason> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoAbuseReportReason(o[0]);
-  checkVideoAbuseReportReason(o[1]);
+  checkVideoAbuseReportReason(o[0] as api.VideoAbuseReportReason);
+  checkVideoAbuseReportReason(o[1] as api.VideoAbuseReportReason);
 }
 
 core.int buildCounterVideoAbuseReportReasonListResponse = 0;
@@ -4989,8 +5032,10 @@
 
 void checkUnnamed2379(core.List<api.VideoAbuseReportSecondaryReason> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoAbuseReportSecondaryReason(o[0]);
-  checkVideoAbuseReportSecondaryReason(o[1]);
+  checkVideoAbuseReportSecondaryReason(
+      o[0] as api.VideoAbuseReportSecondaryReason);
+  checkVideoAbuseReportSecondaryReason(
+      o[1] as api.VideoAbuseReportSecondaryReason);
 }
 
 core.int buildCounterVideoAbuseReportReasonSnippet = 0;
@@ -5079,7 +5124,7 @@
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkVideoCategorySnippet(o.snippet);
+    checkVideoCategorySnippet(o.snippet as api.VideoCategorySnippet);
   }
   buildCounterVideoCategory--;
 }
@@ -5093,8 +5138,8 @@
 
 void checkUnnamed2380(core.List<api.VideoCategory> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoCategory(o[0]);
-  checkVideoCategory(o[1]);
+  checkVideoCategory(o[0] as api.VideoCategory);
+  checkVideoCategory(o[1] as api.VideoCategory);
 }
 
 core.int buildCounterVideoCategoryListResponse = 0;
@@ -5124,9 +5169,9 @@
     checkUnnamed2380(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterVideoCategoryListResponse--;
@@ -5179,15 +5224,16 @@
   buildCounterVideoContentDetails++;
   if (buildCounterVideoContentDetails < 3) {
     unittest.expect(o.caption, unittest.equals('foo'));
-    checkContentRating(o.contentRating);
-    checkAccessPolicy(o.countryRestriction);
+    checkContentRating(o.contentRating as api.ContentRating);
+    checkAccessPolicy(o.countryRestriction as api.AccessPolicy);
     unittest.expect(o.definition, unittest.equals('foo'));
     unittest.expect(o.dimension, unittest.equals('foo'));
     unittest.expect(o.duration, unittest.equals('foo'));
     unittest.expect(o.hasCustomThumbnail, unittest.isTrue);
     unittest.expect(o.licensedContent, unittest.isTrue);
     unittest.expect(o.projection, unittest.equals('foo'));
-    checkVideoContentDetailsRegionRestriction(o.regionRestriction);
+    checkVideoContentDetailsRegionRestriction(
+        o.regionRestriction as api.VideoContentDetailsRegionRestriction);
   }
   buildCounterVideoContentDetails--;
 }
@@ -5250,8 +5296,8 @@
 
 void checkUnnamed2383(core.List<api.VideoFileDetailsAudioStream> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoFileDetailsAudioStream(o[0]);
-  checkVideoFileDetailsAudioStream(o[1]);
+  checkVideoFileDetailsAudioStream(o[0] as api.VideoFileDetailsAudioStream);
+  checkVideoFileDetailsAudioStream(o[1] as api.VideoFileDetailsAudioStream);
 }
 
 core.List<api.VideoFileDetailsVideoStream> buildUnnamed2384() {
@@ -5263,8 +5309,8 @@
 
 void checkUnnamed2384(core.List<api.VideoFileDetailsVideoStream> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoFileDetailsVideoStream(o[0]);
-  checkVideoFileDetailsVideoStream(o[1]);
+  checkVideoFileDetailsVideoStream(o[0] as api.VideoFileDetailsVideoStream);
+  checkVideoFileDetailsVideoStream(o[1] as api.VideoFileDetailsVideoStream);
 }
 
 core.int buildCounterVideoFileDetails = 0;
@@ -5369,8 +5415,8 @@
 
 void checkUnnamed2385(core.List<api.Video> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideo(o[0]);
-  checkVideo(o[1]);
+  checkVideo(o[0] as api.Video);
+  checkVideo(o[1] as api.Video);
 }
 
 core.int buildCounterVideoListResponse = 0;
@@ -5400,9 +5446,9 @@
     checkUnnamed2385(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
     unittest.expect(o.nextPageToken, unittest.equals('foo'));
-    checkPageInfo(o.pageInfo);
+    checkPageInfo(o.pageInfo as api.PageInfo);
     unittest.expect(o.prevPageToken, unittest.equals('foo'));
-    checkTokenPagination(o.tokenPagination);
+    checkTokenPagination(o.tokenPagination as api.TokenPagination);
     unittest.expect(o.visitorId, unittest.equals('foo'));
   }
   buildCounterVideoListResponse--;
@@ -5472,7 +5518,7 @@
 void checkVideoMonetizationDetails(api.VideoMonetizationDetails o) {
   buildCounterVideoMonetizationDetails++;
   if (buildCounterVideoMonetizationDetails < 3) {
-    checkAccessPolicy(o.access);
+    checkAccessPolicy(o.access as api.AccessPolicy);
   }
   buildCounterVideoMonetizationDetails--;
 }
@@ -5525,7 +5571,8 @@
     unittest.expect(o.fileDetailsAvailability, unittest.equals('foo'));
     unittest.expect(o.processingFailureReason, unittest.equals('foo'));
     unittest.expect(o.processingIssuesAvailability, unittest.equals('foo'));
-    checkVideoProcessingDetailsProcessingProgress(o.processingProgress);
+    checkVideoProcessingDetailsProcessingProgress(
+        o.processingProgress as api.VideoProcessingDetailsProcessingProgress);
     unittest.expect(o.processingStatus, unittest.equals('foo'));
     unittest.expect(o.tagSuggestionsAvailability, unittest.equals('foo'));
     unittest.expect(o.thumbnailsAvailability, unittest.equals('foo'));
@@ -5620,8 +5667,8 @@
 
 void checkUnnamed2387(core.List<api.VideoRating> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoRating(o[0]);
-  checkVideoRating(o[1]);
+  checkVideoRating(o[0] as api.VideoRating);
+  checkVideoRating(o[1] as api.VideoRating);
 }
 
 core.int buildCounterVideoRatingListResponse = 0;
@@ -5667,7 +5714,7 @@
 void checkVideoRecordingDetails(api.VideoRecordingDetails o) {
   buildCounterVideoRecordingDetails++;
   if (buildCounterVideoRecordingDetails < 3) {
-    checkGeoPoint(o.location);
+    checkGeoPoint(o.location as api.GeoPoint);
     unittest.expect(o.locationDescription, unittest.equals('foo'));
     unittest.expect(o.recordingDate, unittest.equals('foo'));
   }
@@ -5719,10 +5766,10 @@
     unittest.expect(o.defaultLanguage, unittest.equals('foo'));
     unittest.expect(o.description, unittest.equals('foo'));
     unittest.expect(o.liveBroadcastContent, unittest.equals('foo'));
-    checkVideoLocalization(o.localized);
+    checkVideoLocalization(o.localized as api.VideoLocalization);
     unittest.expect(o.publishedAt, unittest.equals('foo'));
     checkUnnamed2388(o.tags);
-    checkThumbnailDetails(o.thumbnails);
+    checkThumbnailDetails(o.thumbnails as api.ThumbnailDetails);
     unittest.expect(o.title, unittest.equals('foo'));
   }
   buildCounterVideoSnippet--;
@@ -5853,8 +5900,8 @@
 
 void checkUnnamed2393(core.List<api.VideoSuggestionsTagSuggestion> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkVideoSuggestionsTagSuggestion(o[0]);
-  checkVideoSuggestionsTagSuggestion(o[1]);
+  checkVideoSuggestionsTagSuggestion(o[0] as api.VideoSuggestionsTagSuggestion);
+  checkVideoSuggestionsTagSuggestion(o[1] as api.VideoSuggestionsTagSuggestion);
 }
 
 core.int buildCounterVideoSuggestions = 0;
@@ -6931,7 +6978,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAbuseReport();
       var od = api.AbuseReport.fromJson(o.toJson());
-      checkAbuseReport(od);
+      checkAbuseReport(od as api.AbuseReport);
     });
   });
 
@@ -6939,7 +6986,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAbuseType();
       var od = api.AbuseType.fromJson(o.toJson());
-      checkAbuseType(od);
+      checkAbuseType(od as api.AbuseType);
     });
   });
 
@@ -6947,7 +6994,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildAccessPolicy();
       var od = api.AccessPolicy.fromJson(o.toJson());
-      checkAccessPolicy(od);
+      checkAccessPolicy(od as api.AccessPolicy);
     });
   });
 
@@ -6955,7 +7002,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivity();
       var od = api.Activity.fromJson(o.toJson());
-      checkActivity(od);
+      checkActivity(od as api.Activity);
     });
   });
 
@@ -6963,7 +7010,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetails();
       var od = api.ActivityContentDetails.fromJson(o.toJson());
-      checkActivityContentDetails(od);
+      checkActivityContentDetails(od as api.ActivityContentDetails);
     });
   });
 
@@ -6971,7 +7018,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsBulletin();
       var od = api.ActivityContentDetailsBulletin.fromJson(o.toJson());
-      checkActivityContentDetailsBulletin(od);
+      checkActivityContentDetailsBulletin(
+          od as api.ActivityContentDetailsBulletin);
     });
   });
 
@@ -6979,7 +7027,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsChannelItem();
       var od = api.ActivityContentDetailsChannelItem.fromJson(o.toJson());
-      checkActivityContentDetailsChannelItem(od);
+      checkActivityContentDetailsChannelItem(
+          od as api.ActivityContentDetailsChannelItem);
     });
   });
 
@@ -6987,7 +7036,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsComment();
       var od = api.ActivityContentDetailsComment.fromJson(o.toJson());
-      checkActivityContentDetailsComment(od);
+      checkActivityContentDetailsComment(
+          od as api.ActivityContentDetailsComment);
     });
   });
 
@@ -6995,7 +7045,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsFavorite();
       var od = api.ActivityContentDetailsFavorite.fromJson(o.toJson());
-      checkActivityContentDetailsFavorite(od);
+      checkActivityContentDetailsFavorite(
+          od as api.ActivityContentDetailsFavorite);
     });
   });
 
@@ -7003,7 +7054,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsLike();
       var od = api.ActivityContentDetailsLike.fromJson(o.toJson());
-      checkActivityContentDetailsLike(od);
+      checkActivityContentDetailsLike(od as api.ActivityContentDetailsLike);
     });
   });
 
@@ -7011,7 +7062,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsPlaylistItem();
       var od = api.ActivityContentDetailsPlaylistItem.fromJson(o.toJson());
-      checkActivityContentDetailsPlaylistItem(od);
+      checkActivityContentDetailsPlaylistItem(
+          od as api.ActivityContentDetailsPlaylistItem);
     });
   });
 
@@ -7019,7 +7071,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsPromotedItem();
       var od = api.ActivityContentDetailsPromotedItem.fromJson(o.toJson());
-      checkActivityContentDetailsPromotedItem(od);
+      checkActivityContentDetailsPromotedItem(
+          od as api.ActivityContentDetailsPromotedItem);
     });
   });
 
@@ -7027,7 +7080,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsRecommendation();
       var od = api.ActivityContentDetailsRecommendation.fromJson(o.toJson());
-      checkActivityContentDetailsRecommendation(od);
+      checkActivityContentDetailsRecommendation(
+          od as api.ActivityContentDetailsRecommendation);
     });
   });
 
@@ -7035,7 +7089,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsSocial();
       var od = api.ActivityContentDetailsSocial.fromJson(o.toJson());
-      checkActivityContentDetailsSocial(od);
+      checkActivityContentDetailsSocial(od as api.ActivityContentDetailsSocial);
     });
   });
 
@@ -7043,7 +7097,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsSubscription();
       var od = api.ActivityContentDetailsSubscription.fromJson(o.toJson());
-      checkActivityContentDetailsSubscription(od);
+      checkActivityContentDetailsSubscription(
+          od as api.ActivityContentDetailsSubscription);
     });
   });
 
@@ -7051,7 +7106,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityContentDetailsUpload();
       var od = api.ActivityContentDetailsUpload.fromJson(o.toJson());
-      checkActivityContentDetailsUpload(od);
+      checkActivityContentDetailsUpload(od as api.ActivityContentDetailsUpload);
     });
   });
 
@@ -7059,7 +7114,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivityListResponse();
       var od = api.ActivityListResponse.fromJson(o.toJson());
-      checkActivityListResponse(od);
+      checkActivityListResponse(od as api.ActivityListResponse);
     });
   });
 
@@ -7067,7 +7122,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildActivitySnippet();
       var od = api.ActivitySnippet.fromJson(o.toJson());
-      checkActivitySnippet(od);
+      checkActivitySnippet(od as api.ActivitySnippet);
     });
   });
 
@@ -7075,7 +7130,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCaption();
       var od = api.Caption.fromJson(o.toJson());
-      checkCaption(od);
+      checkCaption(od as api.Caption);
     });
   });
 
@@ -7083,7 +7138,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCaptionListResponse();
       var od = api.CaptionListResponse.fromJson(o.toJson());
-      checkCaptionListResponse(od);
+      checkCaptionListResponse(od as api.CaptionListResponse);
     });
   });
 
@@ -7091,7 +7146,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCaptionSnippet();
       var od = api.CaptionSnippet.fromJson(o.toJson());
-      checkCaptionSnippet(od);
+      checkCaptionSnippet(od as api.CaptionSnippet);
     });
   });
 
@@ -7099,7 +7154,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCdnSettings();
       var od = api.CdnSettings.fromJson(o.toJson());
-      checkCdnSettings(od);
+      checkCdnSettings(od as api.CdnSettings);
     });
   });
 
@@ -7107,7 +7162,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannel();
       var od = api.Channel.fromJson(o.toJson());
-      checkChannel(od);
+      checkChannel(od as api.Channel);
     });
   });
 
@@ -7115,7 +7170,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelAuditDetails();
       var od = api.ChannelAuditDetails.fromJson(o.toJson());
-      checkChannelAuditDetails(od);
+      checkChannelAuditDetails(od as api.ChannelAuditDetails);
     });
   });
 
@@ -7123,7 +7178,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelBannerResource();
       var od = api.ChannelBannerResource.fromJson(o.toJson());
-      checkChannelBannerResource(od);
+      checkChannelBannerResource(od as api.ChannelBannerResource);
     });
   });
 
@@ -7131,7 +7186,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelBrandingSettings();
       var od = api.ChannelBrandingSettings.fromJson(o.toJson());
-      checkChannelBrandingSettings(od);
+      checkChannelBrandingSettings(od as api.ChannelBrandingSettings);
     });
   });
 
@@ -7139,7 +7194,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelContentDetailsRelatedPlaylists();
       var od = api.ChannelContentDetailsRelatedPlaylists.fromJson(o.toJson());
-      checkChannelContentDetailsRelatedPlaylists(od);
+      checkChannelContentDetailsRelatedPlaylists(
+          od as api.ChannelContentDetailsRelatedPlaylists);
     });
   });
 
@@ -7147,7 +7203,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelContentDetails();
       var od = api.ChannelContentDetails.fromJson(o.toJson());
-      checkChannelContentDetails(od);
+      checkChannelContentDetails(od as api.ChannelContentDetails);
     });
   });
 
@@ -7155,7 +7211,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelContentOwnerDetails();
       var od = api.ChannelContentOwnerDetails.fromJson(o.toJson());
-      checkChannelContentOwnerDetails(od);
+      checkChannelContentOwnerDetails(od as api.ChannelContentOwnerDetails);
     });
   });
 
@@ -7163,7 +7219,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelConversionPing();
       var od = api.ChannelConversionPing.fromJson(o.toJson());
-      checkChannelConversionPing(od);
+      checkChannelConversionPing(od as api.ChannelConversionPing);
     });
   });
 
@@ -7171,7 +7227,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelConversionPings();
       var od = api.ChannelConversionPings.fromJson(o.toJson());
-      checkChannelConversionPings(od);
+      checkChannelConversionPings(od as api.ChannelConversionPings);
     });
   });
 
@@ -7179,7 +7235,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelListResponse();
       var od = api.ChannelListResponse.fromJson(o.toJson());
-      checkChannelListResponse(od);
+      checkChannelListResponse(od as api.ChannelListResponse);
     });
   });
 
@@ -7187,7 +7243,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelLocalization();
       var od = api.ChannelLocalization.fromJson(o.toJson());
-      checkChannelLocalization(od);
+      checkChannelLocalization(od as api.ChannelLocalization);
     });
   });
 
@@ -7195,7 +7251,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelProfileDetails();
       var od = api.ChannelProfileDetails.fromJson(o.toJson());
-      checkChannelProfileDetails(od);
+      checkChannelProfileDetails(od as api.ChannelProfileDetails);
     });
   });
 
@@ -7203,7 +7259,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSection();
       var od = api.ChannelSection.fromJson(o.toJson());
-      checkChannelSection(od);
+      checkChannelSection(od as api.ChannelSection);
     });
   });
 
@@ -7211,7 +7267,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSectionContentDetails();
       var od = api.ChannelSectionContentDetails.fromJson(o.toJson());
-      checkChannelSectionContentDetails(od);
+      checkChannelSectionContentDetails(od as api.ChannelSectionContentDetails);
     });
   });
 
@@ -7219,7 +7275,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSectionListResponse();
       var od = api.ChannelSectionListResponse.fromJson(o.toJson());
-      checkChannelSectionListResponse(od);
+      checkChannelSectionListResponse(od as api.ChannelSectionListResponse);
     });
   });
 
@@ -7227,7 +7283,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSectionLocalization();
       var od = api.ChannelSectionLocalization.fromJson(o.toJson());
-      checkChannelSectionLocalization(od);
+      checkChannelSectionLocalization(od as api.ChannelSectionLocalization);
     });
   });
 
@@ -7235,7 +7291,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSectionSnippet();
       var od = api.ChannelSectionSnippet.fromJson(o.toJson());
-      checkChannelSectionSnippet(od);
+      checkChannelSectionSnippet(od as api.ChannelSectionSnippet);
     });
   });
 
@@ -7243,7 +7299,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSectionTargeting();
       var od = api.ChannelSectionTargeting.fromJson(o.toJson());
-      checkChannelSectionTargeting(od);
+      checkChannelSectionTargeting(od as api.ChannelSectionTargeting);
     });
   });
 
@@ -7251,7 +7307,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSettings();
       var od = api.ChannelSettings.fromJson(o.toJson());
-      checkChannelSettings(od);
+      checkChannelSettings(od as api.ChannelSettings);
     });
   });
 
@@ -7259,7 +7315,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelSnippet();
       var od = api.ChannelSnippet.fromJson(o.toJson());
-      checkChannelSnippet(od);
+      checkChannelSnippet(od as api.ChannelSnippet);
     });
   });
 
@@ -7267,7 +7323,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelStatistics();
       var od = api.ChannelStatistics.fromJson(o.toJson());
-      checkChannelStatistics(od);
+      checkChannelStatistics(od as api.ChannelStatistics);
     });
   });
 
@@ -7275,7 +7331,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelStatus();
       var od = api.ChannelStatus.fromJson(o.toJson());
-      checkChannelStatus(od);
+      checkChannelStatus(od as api.ChannelStatus);
     });
   });
 
@@ -7283,7 +7339,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelToStoreLinkDetails();
       var od = api.ChannelToStoreLinkDetails.fromJson(o.toJson());
-      checkChannelToStoreLinkDetails(od);
+      checkChannelToStoreLinkDetails(od as api.ChannelToStoreLinkDetails);
     });
   });
 
@@ -7291,7 +7347,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildChannelTopicDetails();
       var od = api.ChannelTopicDetails.fromJson(o.toJson());
-      checkChannelTopicDetails(od);
+      checkChannelTopicDetails(od as api.ChannelTopicDetails);
     });
   });
 
@@ -7299,7 +7355,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildComment();
       var od = api.Comment.fromJson(o.toJson());
-      checkComment(od);
+      checkComment(od as api.Comment);
     });
   });
 
@@ -7307,7 +7363,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentListResponse();
       var od = api.CommentListResponse.fromJson(o.toJson());
-      checkCommentListResponse(od);
+      checkCommentListResponse(od as api.CommentListResponse);
     });
   });
 
@@ -7315,7 +7371,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentSnippet();
       var od = api.CommentSnippet.fromJson(o.toJson());
-      checkCommentSnippet(od);
+      checkCommentSnippet(od as api.CommentSnippet);
     });
   });
 
@@ -7323,7 +7379,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentSnippetAuthorChannelId();
       var od = api.CommentSnippetAuthorChannelId.fromJson(o.toJson());
-      checkCommentSnippetAuthorChannelId(od);
+      checkCommentSnippetAuthorChannelId(
+          od as api.CommentSnippetAuthorChannelId);
     });
   });
 
@@ -7331,7 +7388,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentThread();
       var od = api.CommentThread.fromJson(o.toJson());
-      checkCommentThread(od);
+      checkCommentThread(od as api.CommentThread);
     });
   });
 
@@ -7339,7 +7396,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentThreadListResponse();
       var od = api.CommentThreadListResponse.fromJson(o.toJson());
-      checkCommentThreadListResponse(od);
+      checkCommentThreadListResponse(od as api.CommentThreadListResponse);
     });
   });
 
@@ -7347,7 +7404,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentThreadReplies();
       var od = api.CommentThreadReplies.fromJson(o.toJson());
-      checkCommentThreadReplies(od);
+      checkCommentThreadReplies(od as api.CommentThreadReplies);
     });
   });
 
@@ -7355,7 +7412,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildCommentThreadSnippet();
       var od = api.CommentThreadSnippet.fromJson(o.toJson());
-      checkCommentThreadSnippet(od);
+      checkCommentThreadSnippet(od as api.CommentThreadSnippet);
     });
   });
 
@@ -7363,7 +7420,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildContentRating();
       var od = api.ContentRating.fromJson(o.toJson());
-      checkContentRating(od);
+      checkContentRating(od as api.ContentRating);
     });
   });
 
@@ -7371,7 +7428,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEntity();
       var od = api.Entity.fromJson(o.toJson());
-      checkEntity(od);
+      checkEntity(od as api.Entity);
     });
   });
 
@@ -7379,7 +7436,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGeoPoint();
       var od = api.GeoPoint.fromJson(o.toJson());
-      checkGeoPoint(od);
+      checkGeoPoint(od as api.GeoPoint);
     });
   });
 
@@ -7387,7 +7444,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildI18nLanguage();
       var od = api.I18nLanguage.fromJson(o.toJson());
-      checkI18nLanguage(od);
+      checkI18nLanguage(od as api.I18nLanguage);
     });
   });
 
@@ -7395,7 +7452,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildI18nLanguageListResponse();
       var od = api.I18nLanguageListResponse.fromJson(o.toJson());
-      checkI18nLanguageListResponse(od);
+      checkI18nLanguageListResponse(od as api.I18nLanguageListResponse);
     });
   });
 
@@ -7403,7 +7460,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildI18nLanguageSnippet();
       var od = api.I18nLanguageSnippet.fromJson(o.toJson());
-      checkI18nLanguageSnippet(od);
+      checkI18nLanguageSnippet(od as api.I18nLanguageSnippet);
     });
   });
 
@@ -7411,7 +7468,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildI18nRegion();
       var od = api.I18nRegion.fromJson(o.toJson());
-      checkI18nRegion(od);
+      checkI18nRegion(od as api.I18nRegion);
     });
   });
 
@@ -7419,7 +7476,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildI18nRegionListResponse();
       var od = api.I18nRegionListResponse.fromJson(o.toJson());
-      checkI18nRegionListResponse(od);
+      checkI18nRegionListResponse(od as api.I18nRegionListResponse);
     });
   });
 
@@ -7427,7 +7484,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildI18nRegionSnippet();
       var od = api.I18nRegionSnippet.fromJson(o.toJson());
-      checkI18nRegionSnippet(od);
+      checkI18nRegionSnippet(od as api.I18nRegionSnippet);
     });
   });
 
@@ -7435,7 +7492,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildImageSettings();
       var od = api.ImageSettings.fromJson(o.toJson());
-      checkImageSettings(od);
+      checkImageSettings(od as api.ImageSettings);
     });
   });
 
@@ -7443,7 +7500,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildIngestionInfo();
       var od = api.IngestionInfo.fromJson(o.toJson());
-      checkIngestionInfo(od);
+      checkIngestionInfo(od as api.IngestionInfo);
     });
   });
 
@@ -7451,7 +7508,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInvideoBranding();
       var od = api.InvideoBranding.fromJson(o.toJson());
-      checkInvideoBranding(od);
+      checkInvideoBranding(od as api.InvideoBranding);
     });
   });
 
@@ -7459,7 +7516,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInvideoPosition();
       var od = api.InvideoPosition.fromJson(o.toJson());
-      checkInvideoPosition(od);
+      checkInvideoPosition(od as api.InvideoPosition);
     });
   });
 
@@ -7467,7 +7524,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildInvideoTiming();
       var od = api.InvideoTiming.fromJson(o.toJson());
-      checkInvideoTiming(od);
+      checkInvideoTiming(od as api.InvideoTiming);
     });
   });
 
@@ -7475,7 +7532,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLanguageTag();
       var od = api.LanguageTag.fromJson(o.toJson());
-      checkLanguageTag(od);
+      checkLanguageTag(od as api.LanguageTag);
     });
   });
 
@@ -7483,7 +7540,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLevelDetails();
       var od = api.LevelDetails.fromJson(o.toJson());
-      checkLevelDetails(od);
+      checkLevelDetails(od as api.LevelDetails);
     });
   });
 
@@ -7491,7 +7548,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveBroadcast();
       var od = api.LiveBroadcast.fromJson(o.toJson());
-      checkLiveBroadcast(od);
+      checkLiveBroadcast(od as api.LiveBroadcast);
     });
   });
 
@@ -7499,7 +7556,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveBroadcastContentDetails();
       var od = api.LiveBroadcastContentDetails.fromJson(o.toJson());
-      checkLiveBroadcastContentDetails(od);
+      checkLiveBroadcastContentDetails(od as api.LiveBroadcastContentDetails);
     });
   });
 
@@ -7507,7 +7564,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveBroadcastListResponse();
       var od = api.LiveBroadcastListResponse.fromJson(o.toJson());
-      checkLiveBroadcastListResponse(od);
+      checkLiveBroadcastListResponse(od as api.LiveBroadcastListResponse);
     });
   });
 
@@ -7515,7 +7572,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveBroadcastSnippet();
       var od = api.LiveBroadcastSnippet.fromJson(o.toJson());
-      checkLiveBroadcastSnippet(od);
+      checkLiveBroadcastSnippet(od as api.LiveBroadcastSnippet);
     });
   });
 
@@ -7523,7 +7580,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveBroadcastStatistics();
       var od = api.LiveBroadcastStatistics.fromJson(o.toJson());
-      checkLiveBroadcastStatistics(od);
+      checkLiveBroadcastStatistics(od as api.LiveBroadcastStatistics);
     });
   });
 
@@ -7531,7 +7588,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveBroadcastStatus();
       var od = api.LiveBroadcastStatus.fromJson(o.toJson());
-      checkLiveBroadcastStatus(od);
+      checkLiveBroadcastStatus(od as api.LiveBroadcastStatus);
     });
   });
 
@@ -7539,7 +7596,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatBan();
       var od = api.LiveChatBan.fromJson(o.toJson());
-      checkLiveChatBan(od);
+      checkLiveChatBan(od as api.LiveChatBan);
     });
   });
 
@@ -7547,7 +7604,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatBanSnippet();
       var od = api.LiveChatBanSnippet.fromJson(o.toJson());
-      checkLiveChatBanSnippet(od);
+      checkLiveChatBanSnippet(od as api.LiveChatBanSnippet);
     });
   });
 
@@ -7555,7 +7612,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatFanFundingEventDetails();
       var od = api.LiveChatFanFundingEventDetails.fromJson(o.toJson());
-      checkLiveChatFanFundingEventDetails(od);
+      checkLiveChatFanFundingEventDetails(
+          od as api.LiveChatFanFundingEventDetails);
     });
   });
 
@@ -7563,7 +7621,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatMessage();
       var od = api.LiveChatMessage.fromJson(o.toJson());
-      checkLiveChatMessage(od);
+      checkLiveChatMessage(od as api.LiveChatMessage);
     });
   });
 
@@ -7571,7 +7629,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatMessageAuthorDetails();
       var od = api.LiveChatMessageAuthorDetails.fromJson(o.toJson());
-      checkLiveChatMessageAuthorDetails(od);
+      checkLiveChatMessageAuthorDetails(od as api.LiveChatMessageAuthorDetails);
     });
   });
 
@@ -7579,7 +7637,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatMessageDeletedDetails();
       var od = api.LiveChatMessageDeletedDetails.fromJson(o.toJson());
-      checkLiveChatMessageDeletedDetails(od);
+      checkLiveChatMessageDeletedDetails(
+          od as api.LiveChatMessageDeletedDetails);
     });
   });
 
@@ -7587,7 +7646,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatMessageListResponse();
       var od = api.LiveChatMessageListResponse.fromJson(o.toJson());
-      checkLiveChatMessageListResponse(od);
+      checkLiveChatMessageListResponse(od as api.LiveChatMessageListResponse);
     });
   });
 
@@ -7595,7 +7654,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatMessageRetractedDetails();
       var od = api.LiveChatMessageRetractedDetails.fromJson(o.toJson());
-      checkLiveChatMessageRetractedDetails(od);
+      checkLiveChatMessageRetractedDetails(
+          od as api.LiveChatMessageRetractedDetails);
     });
   });
 
@@ -7603,7 +7663,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatMessageSnippet();
       var od = api.LiveChatMessageSnippet.fromJson(o.toJson());
-      checkLiveChatMessageSnippet(od);
+      checkLiveChatMessageSnippet(od as api.LiveChatMessageSnippet);
     });
   });
 
@@ -7611,7 +7671,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatModerator();
       var od = api.LiveChatModerator.fromJson(o.toJson());
-      checkLiveChatModerator(od);
+      checkLiveChatModerator(od as api.LiveChatModerator);
     });
   });
 
@@ -7619,7 +7679,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatModeratorListResponse();
       var od = api.LiveChatModeratorListResponse.fromJson(o.toJson());
-      checkLiveChatModeratorListResponse(od);
+      checkLiveChatModeratorListResponse(
+          od as api.LiveChatModeratorListResponse);
     });
   });
 
@@ -7627,7 +7688,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatModeratorSnippet();
       var od = api.LiveChatModeratorSnippet.fromJson(o.toJson());
-      checkLiveChatModeratorSnippet(od);
+      checkLiveChatModeratorSnippet(od as api.LiveChatModeratorSnippet);
     });
   });
 
@@ -7635,7 +7696,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatSuperChatDetails();
       var od = api.LiveChatSuperChatDetails.fromJson(o.toJson());
-      checkLiveChatSuperChatDetails(od);
+      checkLiveChatSuperChatDetails(od as api.LiveChatSuperChatDetails);
     });
   });
 
@@ -7643,7 +7704,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatSuperStickerDetails();
       var od = api.LiveChatSuperStickerDetails.fromJson(o.toJson());
-      checkLiveChatSuperStickerDetails(od);
+      checkLiveChatSuperStickerDetails(od as api.LiveChatSuperStickerDetails);
     });
   });
 
@@ -7651,7 +7712,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatTextMessageDetails();
       var od = api.LiveChatTextMessageDetails.fromJson(o.toJson());
-      checkLiveChatTextMessageDetails(od);
+      checkLiveChatTextMessageDetails(od as api.LiveChatTextMessageDetails);
     });
   });
 
@@ -7659,7 +7720,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveChatUserBannedMessageDetails();
       var od = api.LiveChatUserBannedMessageDetails.fromJson(o.toJson());
-      checkLiveChatUserBannedMessageDetails(od);
+      checkLiveChatUserBannedMessageDetails(
+          od as api.LiveChatUserBannedMessageDetails);
     });
   });
 
@@ -7667,7 +7729,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveStream();
       var od = api.LiveStream.fromJson(o.toJson());
-      checkLiveStream(od);
+      checkLiveStream(od as api.LiveStream);
     });
   });
 
@@ -7675,7 +7737,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveStreamConfigurationIssue();
       var od = api.LiveStreamConfigurationIssue.fromJson(o.toJson());
-      checkLiveStreamConfigurationIssue(od);
+      checkLiveStreamConfigurationIssue(od as api.LiveStreamConfigurationIssue);
     });
   });
 
@@ -7683,7 +7745,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveStreamContentDetails();
       var od = api.LiveStreamContentDetails.fromJson(o.toJson());
-      checkLiveStreamContentDetails(od);
+      checkLiveStreamContentDetails(od as api.LiveStreamContentDetails);
     });
   });
 
@@ -7691,7 +7753,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveStreamHealthStatus();
       var od = api.LiveStreamHealthStatus.fromJson(o.toJson());
-      checkLiveStreamHealthStatus(od);
+      checkLiveStreamHealthStatus(od as api.LiveStreamHealthStatus);
     });
   });
 
@@ -7699,7 +7761,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveStreamListResponse();
       var od = api.LiveStreamListResponse.fromJson(o.toJson());
-      checkLiveStreamListResponse(od);
+      checkLiveStreamListResponse(od as api.LiveStreamListResponse);
     });
   });
 
@@ -7707,7 +7769,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveStreamSnippet();
       var od = api.LiveStreamSnippet.fromJson(o.toJson());
-      checkLiveStreamSnippet(od);
+      checkLiveStreamSnippet(od as api.LiveStreamSnippet);
     });
   });
 
@@ -7715,7 +7777,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLiveStreamStatus();
       var od = api.LiveStreamStatus.fromJson(o.toJson());
-      checkLiveStreamStatus(od);
+      checkLiveStreamStatus(od as api.LiveStreamStatus);
     });
   });
 
@@ -7723,7 +7785,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizedProperty();
       var od = api.LocalizedProperty.fromJson(o.toJson());
-      checkLocalizedProperty(od);
+      checkLocalizedProperty(od as api.LocalizedProperty);
     });
   });
 
@@ -7731,7 +7793,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildLocalizedString();
       var od = api.LocalizedString.fromJson(o.toJson());
-      checkLocalizedString(od);
+      checkLocalizedString(od as api.LocalizedString);
     });
   });
 
@@ -7739,7 +7801,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMember();
       var od = api.Member.fromJson(o.toJson());
-      checkMember(od);
+      checkMember(od as api.Member);
     });
   });
 
@@ -7747,7 +7809,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMemberListResponse();
       var od = api.MemberListResponse.fromJson(o.toJson());
-      checkMemberListResponse(od);
+      checkMemberListResponse(od as api.MemberListResponse);
     });
   });
 
@@ -7755,7 +7817,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMemberSnippet();
       var od = api.MemberSnippet.fromJson(o.toJson());
-      checkMemberSnippet(od);
+      checkMemberSnippet(od as api.MemberSnippet);
     });
   });
 
@@ -7763,7 +7825,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembershipsDetails();
       var od = api.MembershipsDetails.fromJson(o.toJson());
-      checkMembershipsDetails(od);
+      checkMembershipsDetails(od as api.MembershipsDetails);
     });
   });
 
@@ -7771,7 +7833,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembershipsDuration();
       var od = api.MembershipsDuration.fromJson(o.toJson());
-      checkMembershipsDuration(od);
+      checkMembershipsDuration(od as api.MembershipsDuration);
     });
   });
 
@@ -7779,7 +7841,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembershipsDurationAtLevel();
       var od = api.MembershipsDurationAtLevel.fromJson(o.toJson());
-      checkMembershipsDurationAtLevel(od);
+      checkMembershipsDurationAtLevel(od as api.MembershipsDurationAtLevel);
     });
   });
 
@@ -7787,7 +7849,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembershipsLevel();
       var od = api.MembershipsLevel.fromJson(o.toJson());
-      checkMembershipsLevel(od);
+      checkMembershipsLevel(od as api.MembershipsLevel);
     });
   });
 
@@ -7795,7 +7857,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembershipsLevelListResponse();
       var od = api.MembershipsLevelListResponse.fromJson(o.toJson());
-      checkMembershipsLevelListResponse(od);
+      checkMembershipsLevelListResponse(od as api.MembershipsLevelListResponse);
     });
   });
 
@@ -7803,7 +7865,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMembershipsLevelSnippet();
       var od = api.MembershipsLevelSnippet.fromJson(o.toJson());
-      checkMembershipsLevelSnippet(od);
+      checkMembershipsLevelSnippet(od as api.MembershipsLevelSnippet);
     });
   });
 
@@ -7811,7 +7873,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildMonitorStreamInfo();
       var od = api.MonitorStreamInfo.fromJson(o.toJson());
-      checkMonitorStreamInfo(od);
+      checkMonitorStreamInfo(od as api.MonitorStreamInfo);
     });
   });
 
@@ -7819,7 +7881,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPageInfo();
       var od = api.PageInfo.fromJson(o.toJson());
-      checkPageInfo(od);
+      checkPageInfo(od as api.PageInfo);
     });
   });
 
@@ -7827,7 +7889,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylist();
       var od = api.Playlist.fromJson(o.toJson());
-      checkPlaylist(od);
+      checkPlaylist(od as api.Playlist);
     });
   });
 
@@ -7835,7 +7897,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistContentDetails();
       var od = api.PlaylistContentDetails.fromJson(o.toJson());
-      checkPlaylistContentDetails(od);
+      checkPlaylistContentDetails(od as api.PlaylistContentDetails);
     });
   });
 
@@ -7843,7 +7905,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistItem();
       var od = api.PlaylistItem.fromJson(o.toJson());
-      checkPlaylistItem(od);
+      checkPlaylistItem(od as api.PlaylistItem);
     });
   });
 
@@ -7851,7 +7913,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistItemContentDetails();
       var od = api.PlaylistItemContentDetails.fromJson(o.toJson());
-      checkPlaylistItemContentDetails(od);
+      checkPlaylistItemContentDetails(od as api.PlaylistItemContentDetails);
     });
   });
 
@@ -7859,7 +7921,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistItemListResponse();
       var od = api.PlaylistItemListResponse.fromJson(o.toJson());
-      checkPlaylistItemListResponse(od);
+      checkPlaylistItemListResponse(od as api.PlaylistItemListResponse);
     });
   });
 
@@ -7867,7 +7929,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistItemSnippet();
       var od = api.PlaylistItemSnippet.fromJson(o.toJson());
-      checkPlaylistItemSnippet(od);
+      checkPlaylistItemSnippet(od as api.PlaylistItemSnippet);
     });
   });
 
@@ -7875,7 +7937,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistItemStatus();
       var od = api.PlaylistItemStatus.fromJson(o.toJson());
-      checkPlaylistItemStatus(od);
+      checkPlaylistItemStatus(od as api.PlaylistItemStatus);
     });
   });
 
@@ -7883,7 +7945,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistListResponse();
       var od = api.PlaylistListResponse.fromJson(o.toJson());
-      checkPlaylistListResponse(od);
+      checkPlaylistListResponse(od as api.PlaylistListResponse);
     });
   });
 
@@ -7891,7 +7953,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistLocalization();
       var od = api.PlaylistLocalization.fromJson(o.toJson());
-      checkPlaylistLocalization(od);
+      checkPlaylistLocalization(od as api.PlaylistLocalization);
     });
   });
 
@@ -7899,7 +7961,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistPlayer();
       var od = api.PlaylistPlayer.fromJson(o.toJson());
-      checkPlaylistPlayer(od);
+      checkPlaylistPlayer(od as api.PlaylistPlayer);
     });
   });
 
@@ -7907,7 +7969,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistSnippet();
       var od = api.PlaylistSnippet.fromJson(o.toJson());
-      checkPlaylistSnippet(od);
+      checkPlaylistSnippet(od as api.PlaylistSnippet);
     });
   });
 
@@ -7915,7 +7977,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPlaylistStatus();
       var od = api.PlaylistStatus.fromJson(o.toJson());
-      checkPlaylistStatus(od);
+      checkPlaylistStatus(od as api.PlaylistStatus);
     });
   });
 
@@ -7923,7 +7985,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildPropertyValue();
       var od = api.PropertyValue.fromJson(o.toJson());
-      checkPropertyValue(od);
+      checkPropertyValue(od as api.PropertyValue);
     });
   });
 
@@ -7931,7 +7993,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildRelatedEntity();
       var od = api.RelatedEntity.fromJson(o.toJson());
-      checkRelatedEntity(od);
+      checkRelatedEntity(od as api.RelatedEntity);
     });
   });
 
@@ -7939,7 +8001,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResourceId();
       var od = api.ResourceId.fromJson(o.toJson());
-      checkResourceId(od);
+      checkResourceId(od as api.ResourceId);
     });
   });
 
@@ -7947,7 +8009,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchListResponse();
       var od = api.SearchListResponse.fromJson(o.toJson());
-      checkSearchListResponse(od);
+      checkSearchListResponse(od as api.SearchListResponse);
     });
   });
 
@@ -7955,7 +8017,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchResult();
       var od = api.SearchResult.fromJson(o.toJson());
-      checkSearchResult(od);
+      checkSearchResult(od as api.SearchResult);
     });
   });
 
@@ -7963,7 +8025,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSearchResultSnippet();
       var od = api.SearchResultSnippet.fromJson(o.toJson());
-      checkSearchResultSnippet(od);
+      checkSearchResultSnippet(od as api.SearchResultSnippet);
     });
   });
 
@@ -7971,7 +8033,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSponsor();
       var od = api.Sponsor.fromJson(o.toJson());
-      checkSponsor(od);
+      checkSponsor(od as api.Sponsor);
     });
   });
 
@@ -7979,7 +8041,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSponsorListResponse();
       var od = api.SponsorListResponse.fromJson(o.toJson());
-      checkSponsorListResponse(od);
+      checkSponsorListResponse(od as api.SponsorListResponse);
     });
   });
 
@@ -7987,7 +8049,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSponsorSnippet();
       var od = api.SponsorSnippet.fromJson(o.toJson());
-      checkSponsorSnippet(od);
+      checkSponsorSnippet(od as api.SponsorSnippet);
     });
   });
 
@@ -7995,7 +8057,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscription();
       var od = api.Subscription.fromJson(o.toJson());
-      checkSubscription(od);
+      checkSubscription(od as api.Subscription);
     });
   });
 
@@ -8003,7 +8065,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionContentDetails();
       var od = api.SubscriptionContentDetails.fromJson(o.toJson());
-      checkSubscriptionContentDetails(od);
+      checkSubscriptionContentDetails(od as api.SubscriptionContentDetails);
     });
   });
 
@@ -8011,7 +8073,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionListResponse();
       var od = api.SubscriptionListResponse.fromJson(o.toJson());
-      checkSubscriptionListResponse(od);
+      checkSubscriptionListResponse(od as api.SubscriptionListResponse);
     });
   });
 
@@ -8019,7 +8081,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionSnippet();
       var od = api.SubscriptionSnippet.fromJson(o.toJson());
-      checkSubscriptionSnippet(od);
+      checkSubscriptionSnippet(od as api.SubscriptionSnippet);
     });
   });
 
@@ -8027,7 +8089,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildSubscriptionSubscriberSnippet();
       var od = api.SubscriptionSubscriberSnippet.fromJson(o.toJson());
-      checkSubscriptionSubscriberSnippet(od);
+      checkSubscriptionSubscriberSnippet(
+          od as api.SubscriptionSubscriberSnippet);
     });
   });
 
@@ -8035,7 +8098,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuperChatEvent();
       var od = api.SuperChatEvent.fromJson(o.toJson());
-      checkSuperChatEvent(od);
+      checkSuperChatEvent(od as api.SuperChatEvent);
     });
   });
 
@@ -8043,7 +8106,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuperChatEventListResponse();
       var od = api.SuperChatEventListResponse.fromJson(o.toJson());
-      checkSuperChatEventListResponse(od);
+      checkSuperChatEventListResponse(od as api.SuperChatEventListResponse);
     });
   });
 
@@ -8051,7 +8114,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuperChatEventSnippet();
       var od = api.SuperChatEventSnippet.fromJson(o.toJson());
-      checkSuperChatEventSnippet(od);
+      checkSuperChatEventSnippet(od as api.SuperChatEventSnippet);
     });
   });
 
@@ -8059,7 +8122,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildSuperStickerMetadata();
       var od = api.SuperStickerMetadata.fromJson(o.toJson());
-      checkSuperStickerMetadata(od);
+      checkSuperStickerMetadata(od as api.SuperStickerMetadata);
     });
   });
 
@@ -8067,7 +8130,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestItem();
       var od = api.TestItem.fromJson(o.toJson());
-      checkTestItem(od);
+      checkTestItem(od as api.TestItem);
     });
   });
 
@@ -8075,7 +8138,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTestItemTestItemSnippet();
       var od = api.TestItemTestItemSnippet.fromJson(o.toJson());
-      checkTestItemTestItemSnippet(od);
+      checkTestItemTestItemSnippet(od as api.TestItemTestItemSnippet);
     });
   });
 
@@ -8083,7 +8146,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyLink();
       var od = api.ThirdPartyLink.fromJson(o.toJson());
-      checkThirdPartyLink(od);
+      checkThirdPartyLink(od as api.ThirdPartyLink);
     });
   });
 
@@ -8091,7 +8154,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyLinkSnippet();
       var od = api.ThirdPartyLinkSnippet.fromJson(o.toJson());
-      checkThirdPartyLinkSnippet(od);
+      checkThirdPartyLinkSnippet(od as api.ThirdPartyLinkSnippet);
     });
   });
 
@@ -8099,7 +8162,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThirdPartyLinkStatus();
       var od = api.ThirdPartyLinkStatus.fromJson(o.toJson());
-      checkThirdPartyLinkStatus(od);
+      checkThirdPartyLinkStatus(od as api.ThirdPartyLinkStatus);
     });
   });
 
@@ -8107,7 +8170,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThumbnail();
       var od = api.Thumbnail.fromJson(o.toJson());
-      checkThumbnail(od);
+      checkThumbnail(od as api.Thumbnail);
     });
   });
 
@@ -8115,7 +8178,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThumbnailDetails();
       var od = api.ThumbnailDetails.fromJson(o.toJson());
-      checkThumbnailDetails(od);
+      checkThumbnailDetails(od as api.ThumbnailDetails);
     });
   });
 
@@ -8123,7 +8186,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildThumbnailSetResponse();
       var od = api.ThumbnailSetResponse.fromJson(o.toJson());
-      checkThumbnailSetResponse(od);
+      checkThumbnailSetResponse(od as api.ThumbnailSetResponse);
     });
   });
 
@@ -8131,7 +8194,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildTokenPagination();
       var od = api.TokenPagination.fromJson(o.toJson());
-      checkTokenPagination(od);
+      checkTokenPagination(od as api.TokenPagination);
     });
   });
 
@@ -8139,7 +8202,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideo();
       var od = api.Video.fromJson(o.toJson());
-      checkVideo(od);
+      checkVideo(od as api.Video);
     });
   });
 
@@ -8147,7 +8210,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoAbuseReport();
       var od = api.VideoAbuseReport.fromJson(o.toJson());
-      checkVideoAbuseReport(od);
+      checkVideoAbuseReport(od as api.VideoAbuseReport);
     });
   });
 
@@ -8155,7 +8218,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoAbuseReportReason();
       var od = api.VideoAbuseReportReason.fromJson(o.toJson());
-      checkVideoAbuseReportReason(od);
+      checkVideoAbuseReportReason(od as api.VideoAbuseReportReason);
     });
   });
 
@@ -8163,7 +8226,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoAbuseReportReasonListResponse();
       var od = api.VideoAbuseReportReasonListResponse.fromJson(o.toJson());
-      checkVideoAbuseReportReasonListResponse(od);
+      checkVideoAbuseReportReasonListResponse(
+          od as api.VideoAbuseReportReasonListResponse);
     });
   });
 
@@ -8171,7 +8235,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoAbuseReportReasonSnippet();
       var od = api.VideoAbuseReportReasonSnippet.fromJson(o.toJson());
-      checkVideoAbuseReportReasonSnippet(od);
+      checkVideoAbuseReportReasonSnippet(
+          od as api.VideoAbuseReportReasonSnippet);
     });
   });
 
@@ -8179,7 +8244,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoAbuseReportSecondaryReason();
       var od = api.VideoAbuseReportSecondaryReason.fromJson(o.toJson());
-      checkVideoAbuseReportSecondaryReason(od);
+      checkVideoAbuseReportSecondaryReason(
+          od as api.VideoAbuseReportSecondaryReason);
     });
   });
 
@@ -8187,7 +8253,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoAgeGating();
       var od = api.VideoAgeGating.fromJson(o.toJson());
-      checkVideoAgeGating(od);
+      checkVideoAgeGating(od as api.VideoAgeGating);
     });
   });
 
@@ -8195,7 +8261,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoCategory();
       var od = api.VideoCategory.fromJson(o.toJson());
-      checkVideoCategory(od);
+      checkVideoCategory(od as api.VideoCategory);
     });
   });
 
@@ -8203,7 +8269,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoCategoryListResponse();
       var od = api.VideoCategoryListResponse.fromJson(o.toJson());
-      checkVideoCategoryListResponse(od);
+      checkVideoCategoryListResponse(od as api.VideoCategoryListResponse);
     });
   });
 
@@ -8211,7 +8277,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoCategorySnippet();
       var od = api.VideoCategorySnippet.fromJson(o.toJson());
-      checkVideoCategorySnippet(od);
+      checkVideoCategorySnippet(od as api.VideoCategorySnippet);
     });
   });
 
@@ -8219,7 +8285,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoContentDetails();
       var od = api.VideoContentDetails.fromJson(o.toJson());
-      checkVideoContentDetails(od);
+      checkVideoContentDetails(od as api.VideoContentDetails);
     });
   });
 
@@ -8227,7 +8293,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoContentDetailsRegionRestriction();
       var od = api.VideoContentDetailsRegionRestriction.fromJson(o.toJson());
-      checkVideoContentDetailsRegionRestriction(od);
+      checkVideoContentDetailsRegionRestriction(
+          od as api.VideoContentDetailsRegionRestriction);
     });
   });
 
@@ -8235,7 +8302,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoFileDetails();
       var od = api.VideoFileDetails.fromJson(o.toJson());
-      checkVideoFileDetails(od);
+      checkVideoFileDetails(od as api.VideoFileDetails);
     });
   });
 
@@ -8243,7 +8310,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoFileDetailsAudioStream();
       var od = api.VideoFileDetailsAudioStream.fromJson(o.toJson());
-      checkVideoFileDetailsAudioStream(od);
+      checkVideoFileDetailsAudioStream(od as api.VideoFileDetailsAudioStream);
     });
   });
 
@@ -8251,7 +8318,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoFileDetailsVideoStream();
       var od = api.VideoFileDetailsVideoStream.fromJson(o.toJson());
-      checkVideoFileDetailsVideoStream(od);
+      checkVideoFileDetailsVideoStream(od as api.VideoFileDetailsVideoStream);
     });
   });
 
@@ -8259,7 +8326,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoListResponse();
       var od = api.VideoListResponse.fromJson(o.toJson());
-      checkVideoListResponse(od);
+      checkVideoListResponse(od as api.VideoListResponse);
     });
   });
 
@@ -8267,7 +8334,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoLiveStreamingDetails();
       var od = api.VideoLiveStreamingDetails.fromJson(o.toJson());
-      checkVideoLiveStreamingDetails(od);
+      checkVideoLiveStreamingDetails(od as api.VideoLiveStreamingDetails);
     });
   });
 
@@ -8275,7 +8342,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoLocalization();
       var od = api.VideoLocalization.fromJson(o.toJson());
-      checkVideoLocalization(od);
+      checkVideoLocalization(od as api.VideoLocalization);
     });
   });
 
@@ -8283,7 +8350,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoMonetizationDetails();
       var od = api.VideoMonetizationDetails.fromJson(o.toJson());
-      checkVideoMonetizationDetails(od);
+      checkVideoMonetizationDetails(od as api.VideoMonetizationDetails);
     });
   });
 
@@ -8291,7 +8358,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoPlayer();
       var od = api.VideoPlayer.fromJson(o.toJson());
-      checkVideoPlayer(od);
+      checkVideoPlayer(od as api.VideoPlayer);
     });
   });
 
@@ -8299,7 +8366,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoProcessingDetails();
       var od = api.VideoProcessingDetails.fromJson(o.toJson());
-      checkVideoProcessingDetails(od);
+      checkVideoProcessingDetails(od as api.VideoProcessingDetails);
     });
   });
 
@@ -8308,7 +8375,8 @@
       var o = buildVideoProcessingDetailsProcessingProgress();
       var od =
           api.VideoProcessingDetailsProcessingProgress.fromJson(o.toJson());
-      checkVideoProcessingDetailsProcessingProgress(od);
+      checkVideoProcessingDetailsProcessingProgress(
+          od as api.VideoProcessingDetailsProcessingProgress);
     });
   });
 
@@ -8316,7 +8384,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoProjectDetails();
       var od = api.VideoProjectDetails.fromJson(o.toJson());
-      checkVideoProjectDetails(od);
+      checkVideoProjectDetails(od as api.VideoProjectDetails);
     });
   });
 
@@ -8324,7 +8392,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoRating();
       var od = api.VideoRating.fromJson(o.toJson());
-      checkVideoRating(od);
+      checkVideoRating(od as api.VideoRating);
     });
   });
 
@@ -8332,7 +8400,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoRatingListResponse();
       var od = api.VideoRatingListResponse.fromJson(o.toJson());
-      checkVideoRatingListResponse(od);
+      checkVideoRatingListResponse(od as api.VideoRatingListResponse);
     });
   });
 
@@ -8340,7 +8408,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoRecordingDetails();
       var od = api.VideoRecordingDetails.fromJson(o.toJson());
-      checkVideoRecordingDetails(od);
+      checkVideoRecordingDetails(od as api.VideoRecordingDetails);
     });
   });
 
@@ -8348,7 +8416,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoSnippet();
       var od = api.VideoSnippet.fromJson(o.toJson());
-      checkVideoSnippet(od);
+      checkVideoSnippet(od as api.VideoSnippet);
     });
   });
 
@@ -8356,7 +8424,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoStatistics();
       var od = api.VideoStatistics.fromJson(o.toJson());
-      checkVideoStatistics(od);
+      checkVideoStatistics(od as api.VideoStatistics);
     });
   });
 
@@ -8364,7 +8432,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoStatus();
       var od = api.VideoStatus.fromJson(o.toJson());
-      checkVideoStatus(od);
+      checkVideoStatus(od as api.VideoStatus);
     });
   });
 
@@ -8372,7 +8440,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoSuggestions();
       var od = api.VideoSuggestions.fromJson(o.toJson());
-      checkVideoSuggestions(od);
+      checkVideoSuggestions(od as api.VideoSuggestions);
     });
   });
 
@@ -8380,7 +8448,8 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoSuggestionsTagSuggestion();
       var od = api.VideoSuggestionsTagSuggestion.fromJson(o.toJson());
-      checkVideoSuggestionsTagSuggestion(od);
+      checkVideoSuggestionsTagSuggestion(
+          od as api.VideoSuggestionsTagSuggestion);
     });
   });
 
@@ -8388,7 +8457,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildVideoTopicDetails();
       var od = api.VideoTopicDetails.fromJson(o.toJson());
-      checkVideoTopicDetails(od);
+      checkVideoTopicDetails(od as api.VideoTopicDetails);
     });
   });
 
@@ -8396,7 +8465,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildWatchSettings();
       var od = api.WatchSettings.fromJson(o.toJson());
-      checkWatchSettings(od);
+      checkWatchSettings(od as api.WatchSettings);
     });
   });
 
@@ -8408,8 +8477,9 @@
       var arg_part = buildUnnamed2398();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.AbuseReport.fromJson(json);
-        checkAbuseReport(obj);
+        var obj = api.AbuseReport.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkAbuseReport(obj as api.AbuseReport);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8449,7 +8519,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkAbuseReport(response);
+        checkAbuseReport(response as api.AbuseReport);
       })));
     });
   });
@@ -8530,7 +8600,7 @@
               regionCode: arg_regionCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkActivityListResponse(response);
+        checkActivityListResponse(response as api.ActivityListResponse);
       })));
     });
   });
@@ -8670,8 +8740,9 @@
       var arg_sync = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Caption.fromJson(json);
-        checkCaption(obj);
+        var obj =
+            api.Caption.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCaption(obj as api.Caption);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8720,7 +8791,7 @@
               sync: arg_sync,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCaption(response);
+        checkCaption(response as api.Caption);
       })));
     });
 
@@ -8783,7 +8854,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCaptionListResponse(response);
+        checkCaptionListResponse(response as api.CaptionListResponse);
       })));
     });
 
@@ -8800,8 +8871,9 @@
       var arg_sync = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Caption.fromJson(json);
-        checkCaption(obj);
+        var obj =
+            api.Caption.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkCaption(obj as api.Caption);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8850,7 +8922,7 @@
               sync: arg_sync,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCaption(response);
+        checkCaption(response as api.Caption);
       })));
     });
   });
@@ -8868,8 +8940,9 @@
       var arg_onBehalfOfContentOwnerChannel = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChannelBannerResource.fromJson(json);
-        checkChannelBannerResource(obj);
+        var obj = api.ChannelBannerResource.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChannelBannerResource(obj as api.ChannelBannerResource);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -8918,7 +8991,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannelBannerResource(response);
+        checkChannelBannerResource(response as api.ChannelBannerResource);
       })));
     });
   });
@@ -8984,8 +9057,9 @@
       var arg_onBehalfOfContentOwnerChannel = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChannelSection.fromJson(json);
-        checkChannelSection(obj);
+        var obj = api.ChannelSection.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChannelSection(obj as api.ChannelSection);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9032,7 +9106,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannelSection(response);
+        checkChannelSection(response as api.ChannelSection);
       })));
     });
 
@@ -9098,7 +9172,8 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannelSectionListResponse(response);
+        checkChannelSectionListResponse(
+            response as api.ChannelSectionListResponse);
       })));
     });
 
@@ -9110,8 +9185,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ChannelSection.fromJson(json);
-        checkChannelSection(obj);
+        var obj = api.ChannelSection.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkChannelSection(obj as api.ChannelSection);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9155,7 +9231,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannelSection(response);
+        checkChannelSection(response as api.ChannelSection);
       })));
     });
   });
@@ -9243,7 +9319,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannelListResponse(response);
+        checkChannelListResponse(response as api.ChannelListResponse);
       })));
     });
 
@@ -9255,8 +9331,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Channel.fromJson(json);
-        checkChannel(obj);
+        var obj =
+            api.Channel.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkChannel(obj as api.Channel);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9300,7 +9377,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkChannel(response);
+        checkChannel(response as api.Channel);
       })));
     });
   });
@@ -9313,8 +9390,9 @@
       var arg_part = buildUnnamed2411();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommentThread.fromJson(json);
-        checkCommentThread(obj);
+        var obj = api.CommentThread.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommentThread(obj as api.CommentThread);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9354,7 +9432,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentThread(response);
+        checkCommentThread(response as api.CommentThread);
       })));
     });
 
@@ -9441,7 +9519,8 @@
               videoId: arg_videoId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentThreadListResponse(response);
+        checkCommentThreadListResponse(
+            response as api.CommentThreadListResponse);
       })));
     });
 
@@ -9452,8 +9531,9 @@
       var arg_part = buildUnnamed2414();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.CommentThread.fromJson(json);
-        checkCommentThread(obj);
+        var obj = api.CommentThread.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkCommentThread(obj as api.CommentThread);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9493,7 +9573,7 @@
       res
           .update(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentThread(response);
+        checkCommentThread(response as api.CommentThread);
       })));
     });
   });
@@ -9552,8 +9632,9 @@
       var arg_part = buildUnnamed2415();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Comment.fromJson(json);
-        checkComment(obj);
+        var obj =
+            api.Comment.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkComment(obj as api.Comment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9593,7 +9674,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
 
@@ -9661,7 +9742,7 @@
               textFormat: arg_textFormat,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkCommentListResponse(response);
+        checkCommentListResponse(response as api.CommentListResponse);
       })));
     });
 
@@ -9771,8 +9852,9 @@
       var arg_part = buildUnnamed2420();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Comment.fromJson(json);
-        checkComment(obj);
+        var obj =
+            api.Comment.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkComment(obj as api.Comment);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -9812,7 +9894,7 @@
       res
           .update(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkComment(response);
+        checkComment(response as api.Comment);
       })));
     });
   });
@@ -9864,7 +9946,7 @@
       res
           .list(arg_part, hl: arg_hl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkI18nLanguageListResponse(response);
+        checkI18nLanguageListResponse(response as api.I18nLanguageListResponse);
       })));
     });
   });
@@ -9916,7 +9998,7 @@
       res
           .list(arg_part, hl: arg_hl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkI18nRegionListResponse(response);
+        checkI18nRegionListResponse(response as api.I18nRegionListResponse);
       })));
     });
   });
@@ -9981,7 +10063,7 @@
               streamId: arg_streamId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveBroadcast(response);
+        checkLiveBroadcast(response as api.LiveBroadcast);
       })));
     });
 
@@ -10052,7 +10134,7 @@
               walltime: arg_walltime,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveBroadcast(response);
+        checkLiveBroadcast(response as api.LiveBroadcast);
       })));
     });
 
@@ -10120,8 +10202,9 @@
       var arg_onBehalfOfContentOwnerChannel = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiveBroadcast.fromJson(json);
-        checkLiveBroadcast(obj);
+        var obj = api.LiveBroadcast.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiveBroadcast(obj as api.LiveBroadcast);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10168,7 +10251,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveBroadcast(response);
+        checkLiveBroadcast(response as api.LiveBroadcast);
       })));
     });
 
@@ -10247,7 +10330,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveBroadcastListResponse(response);
+        checkLiveBroadcastListResponse(
+            response as api.LiveBroadcastListResponse);
       })));
     });
 
@@ -10309,7 +10393,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveBroadcast(response);
+        checkLiveBroadcast(response as api.LiveBroadcast);
       })));
     });
 
@@ -10322,8 +10406,9 @@
       var arg_onBehalfOfContentOwnerChannel = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiveBroadcast.fromJson(json);
-        checkLiveBroadcast(obj);
+        var obj = api.LiveBroadcast.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiveBroadcast(obj as api.LiveBroadcast);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10370,7 +10455,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveBroadcast(response);
+        checkLiveBroadcast(response as api.LiveBroadcast);
       })));
     });
   });
@@ -10429,8 +10514,9 @@
       var arg_part = buildUnnamed2430();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiveChatBan.fromJson(json);
-        checkLiveChatBan(obj);
+        var obj = api.LiveChatBan.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiveChatBan(obj as api.LiveChatBan);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10470,7 +10556,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveChatBan(response);
+        checkLiveChatBan(response as api.LiveChatBan);
       })));
     });
   });
@@ -10529,8 +10615,9 @@
       var arg_part = buildUnnamed2431();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiveChatMessage.fromJson(json);
-        checkLiveChatMessage(obj);
+        var obj = api.LiveChatMessage.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiveChatMessage(obj as api.LiveChatMessage);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10570,7 +10657,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveChatMessage(response);
+        checkLiveChatMessage(response as api.LiveChatMessage);
       })));
     });
 
@@ -10637,7 +10724,8 @@
               profileImageSize: arg_profileImageSize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveChatMessageListResponse(response);
+        checkLiveChatMessageListResponse(
+            response as api.LiveChatMessageListResponse);
       })));
     });
   });
@@ -10696,8 +10784,9 @@
       var arg_part = buildUnnamed2433();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiveChatModerator.fromJson(json);
-        checkLiveChatModerator(obj);
+        var obj = api.LiveChatModerator.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiveChatModerator(obj as api.LiveChatModerator);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10737,7 +10826,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveChatModerator(response);
+        checkLiveChatModerator(response as api.LiveChatModerator);
       })));
     });
 
@@ -10797,7 +10886,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveChatModeratorListResponse(response);
+        checkLiveChatModeratorListResponse(
+            response as api.LiveChatModeratorListResponse);
       })));
     });
   });
@@ -10867,8 +10957,9 @@
       var arg_onBehalfOfContentOwnerChannel = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiveStream.fromJson(json);
-        checkLiveStream(obj);
+        var obj = api.LiveStream.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiveStream(obj as api.LiveStream);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -10915,7 +11006,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveStream(response);
+        checkLiveStream(response as api.LiveStream);
       })));
     });
 
@@ -10986,7 +11077,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveStreamListResponse(response);
+        checkLiveStreamListResponse(response as api.LiveStreamListResponse);
       })));
     });
 
@@ -10999,8 +11090,9 @@
       var arg_onBehalfOfContentOwnerChannel = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.LiveStream.fromJson(json);
-        checkLiveStream(obj);
+        var obj = api.LiveStream.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkLiveStream(obj as api.LiveStream);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11047,7 +11139,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkLiveStream(response);
+        checkLiveStream(response as api.LiveStream);
       })));
     });
   });
@@ -11117,7 +11209,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMemberListResponse(response);
+        checkMemberListResponse(response as api.MemberListResponse);
       })));
     });
   });
@@ -11167,7 +11259,8 @@
       res
           .list(arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkMembershipsLevelListResponse(response);
+        checkMembershipsLevelListResponse(
+            response as api.MembershipsLevelListResponse);
       })));
     });
   });
@@ -11232,8 +11325,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlaylistItem.fromJson(json);
-        checkPlaylistItem(obj);
+        var obj = api.PlaylistItem.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlaylistItem(obj as api.PlaylistItem);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11277,7 +11371,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlaylistItem(response);
+        checkPlaylistItem(response as api.PlaylistItem);
       })));
     });
 
@@ -11349,7 +11443,7 @@
               videoId: arg_videoId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlaylistItemListResponse(response);
+        checkPlaylistItemListResponse(response as api.PlaylistItemListResponse);
       })));
     });
 
@@ -11361,8 +11455,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.PlaylistItem.fromJson(json);
-        checkPlaylistItem(obj);
+        var obj = api.PlaylistItem.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkPlaylistItem(obj as api.PlaylistItem);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11406,7 +11501,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlaylistItem(response);
+        checkPlaylistItem(response as api.PlaylistItem);
       })));
     });
   });
@@ -11472,8 +11567,9 @@
       var arg_onBehalfOfContentOwnerChannel = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Playlist.fromJson(json);
-        checkPlaylist(obj);
+        var obj =
+            api.Playlist.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPlaylist(obj as api.Playlist);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11520,7 +11616,7 @@
               onBehalfOfContentOwnerChannel: arg_onBehalfOfContentOwnerChannel,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlaylist(response);
+        checkPlaylist(response as api.Playlist);
       })));
     });
 
@@ -11598,7 +11694,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlaylistListResponse(response);
+        checkPlaylistListResponse(response as api.PlaylistListResponse);
       })));
     });
 
@@ -11610,8 +11706,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Playlist.fromJson(json);
-        checkPlaylist(obj);
+        var obj =
+            api.Playlist.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkPlaylist(obj as api.Playlist);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11655,7 +11752,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkPlaylist(response);
+        checkPlaylist(response as api.Playlist);
       })));
     });
   });
@@ -11823,7 +11920,7 @@
               videoType: arg_videoType,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSearchListResponse(response);
+        checkSearchListResponse(response as api.SearchListResponse);
       })));
     });
   });
@@ -11885,7 +11982,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSponsorListResponse(response);
+        checkSponsorListResponse(response as api.SponsorListResponse);
       })));
     });
   });
@@ -11944,8 +12041,9 @@
       var arg_part = buildUnnamed2452();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Subscription.fromJson(json);
-        checkSubscription(obj);
+        var obj = api.Subscription.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkSubscription(obj as api.Subscription);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -11985,7 +12083,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscription(response);
+        checkSubscription(response as api.Subscription);
       })));
     });
 
@@ -12075,7 +12173,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSubscriptionListResponse(response);
+        checkSubscriptionListResponse(response as api.SubscriptionListResponse);
       })));
     });
   });
@@ -12137,7 +12235,8 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkSuperChatEventListResponse(response);
+        checkSuperChatEventListResponse(
+            response as api.SuperChatEventListResponse);
       })));
     });
   });
@@ -12150,8 +12249,9 @@
       var arg_part = buildUnnamed2456();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.TestItem.fromJson(json);
-        checkTestItem(obj);
+        var obj =
+            api.TestItem.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkTestItem(obj as api.TestItem);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12191,7 +12291,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkTestItem(response);
+        checkTestItem(response as api.TestItem);
       })));
     });
   });
@@ -12256,8 +12356,9 @@
       var arg_part = buildUnnamed2458();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ThirdPartyLink.fromJson(json);
-        checkThirdPartyLink(obj);
+        var obj = api.ThirdPartyLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkThirdPartyLink(obj as api.ThirdPartyLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12297,7 +12398,7 @@
       res
           .insert(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThirdPartyLink(response);
+        checkThirdPartyLink(response as api.ThirdPartyLink);
       })));
     });
 
@@ -12353,7 +12454,7 @@
               type: arg_type,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThirdPartyLink(response);
+        checkThirdPartyLink(response as api.ThirdPartyLink);
       })));
     });
 
@@ -12364,8 +12465,9 @@
       var arg_part = buildUnnamed2460();
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.ThirdPartyLink.fromJson(json);
-        checkThirdPartyLink(obj);
+        var obj = api.ThirdPartyLink.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkThirdPartyLink(obj as api.ThirdPartyLink);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12405,7 +12507,7 @@
       res
           .update(arg_request, arg_part, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThirdPartyLink(response);
+        checkThirdPartyLink(response as api.ThirdPartyLink);
       })));
     });
   });
@@ -12464,7 +12566,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkThumbnailSetResponse(response);
+        checkThumbnailSetResponse(response as api.ThumbnailSetResponse);
       })));
     });
   });
@@ -12517,7 +12619,8 @@
       res
           .list(arg_part, hl: arg_hl, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideoAbuseReportReasonListResponse(response);
+        checkVideoAbuseReportReasonListResponse(
+            response as api.VideoAbuseReportReasonListResponse);
       })));
     });
   });
@@ -12578,7 +12681,8 @@
               regionCode: arg_regionCode,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideoCategoryListResponse(response);
+        checkVideoCategoryListResponse(
+            response as api.VideoCategoryListResponse);
       })));
     });
   });
@@ -12684,7 +12788,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideoRatingListResponse(response);
+        checkVideoRatingListResponse(response as api.VideoRatingListResponse);
       })));
     });
 
@@ -12703,8 +12807,9 @@
       var arg_stabilize = true;
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Video.fromJson(json);
-        checkVideo(obj);
+        var obj =
+            api.Video.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVideo(obj as api.Video);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12760,7 +12865,7 @@
               stabilize: arg_stabilize,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideo(response);
+        checkVideo(response as api.Video);
       })));
     });
 
@@ -12853,7 +12958,7 @@
               videoCategoryId: arg_videoCategoryId,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideoListResponse(response);
+        checkVideoListResponse(response as api.VideoListResponse);
       })));
     });
 
@@ -12912,8 +13017,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.VideoAbuseReport.fromJson(json);
-        checkVideoAbuseReport(obj);
+        var obj = api.VideoAbuseReport.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkVideoAbuseReport(obj as api.VideoAbuseReport);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -12966,8 +13072,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Video.fromJson(json);
-        checkVideo(obj);
+        var obj =
+            api.Video.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkVideo(obj as api.Video);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -13011,7 +13118,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkVideo(response);
+        checkVideo(response as api.Video);
       })));
     });
   });
@@ -13028,8 +13135,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.InvideoBranding.fromJson(json);
-        checkInvideoBranding(obj);
+        var obj = api.InvideoBranding.fromJson(
+            json as core.Map<core.String, core.dynamic>);
+        checkInvideoBranding(obj as api.InvideoBranding);
 
         var path = (req.url).path;
         var pathOffset = 0;
diff --git a/generated/googleapis/test/youtubeanalytics/v2_test.dart b/generated/googleapis/test/youtubeanalytics/v2_test.dart
index 1fee8c4..85db2ee 100644
--- a/generated/googleapis/test/youtubeanalytics/v2_test.dart
+++ b/generated/googleapis/test/youtubeanalytics/v2_test.dart
@@ -88,7 +88,7 @@
 void checkEmptyResponse(api.EmptyResponse o) {
   buildCounterEmptyResponse++;
   if (buildCounterEmptyResponse < 3) {
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
   }
   buildCounterEmptyResponse--;
 }
@@ -146,8 +146,8 @@
 
 void checkUnnamed4837(core.List<api.ErrorProto> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkErrorProto(o[0]);
-  checkErrorProto(o[1]);
+  checkErrorProto(o[0] as api.ErrorProto);
+  checkErrorProto(o[1] as api.ErrorProto);
 }
 
 core.int buildCounterErrors = 0;
@@ -192,12 +192,12 @@
 void checkGroup(api.Group o) {
   buildCounterGroup++;
   if (buildCounterGroup < 3) {
-    checkGroupContentDetails(o.contentDetails);
-    checkErrors(o.errors);
+    checkGroupContentDetails(o.contentDetails as api.GroupContentDetails);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkGroupSnippet(o.snippet);
+    checkGroupSnippet(o.snippet as api.GroupSnippet);
   }
   buildCounterGroup--;
 }
@@ -242,12 +242,12 @@
 void checkGroupItem(api.GroupItem o) {
   buildCounterGroupItem++;
   if (buildCounterGroupItem < 3) {
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.etag, unittest.equals('foo'));
     unittest.expect(o.groupId, unittest.equals('foo'));
     unittest.expect(o.id, unittest.equals('foo'));
     unittest.expect(o.kind, unittest.equals('foo'));
-    checkGroupItemResource(o.resource);
+    checkGroupItemResource(o.resource as api.GroupItemResource);
   }
   buildCounterGroupItem--;
 }
@@ -303,8 +303,8 @@
 
 void checkUnnamed4838(core.List<api.GroupItem> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroupItem(o[0]);
-  checkGroupItem(o[1]);
+  checkGroupItem(o[0] as api.GroupItem);
+  checkGroupItem(o[1] as api.GroupItem);
 }
 
 core.int buildCounterListGroupItemsResponse = 0;
@@ -324,7 +324,7 @@
 void checkListGroupItemsResponse(api.ListGroupItemsResponse o) {
   buildCounterListGroupItemsResponse++;
   if (buildCounterListGroupItemsResponse < 3) {
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.etag, unittest.equals('foo'));
     checkUnnamed4838(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -341,8 +341,8 @@
 
 void checkUnnamed4839(core.List<api.Group> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGroup(o[0]);
-  checkGroup(o[1]);
+  checkGroup(o[0] as api.Group);
+  checkGroup(o[1] as api.Group);
 }
 
 core.int buildCounterListGroupsResponse = 0;
@@ -363,7 +363,7 @@
 void checkListGroupsResponse(api.ListGroupsResponse o) {
   buildCounterListGroupsResponse++;
   if (buildCounterListGroupsResponse < 3) {
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.etag, unittest.equals('foo'));
     checkUnnamed4839(o.items);
     unittest.expect(o.kind, unittest.equals('foo'));
@@ -381,8 +381,8 @@
 
 void checkUnnamed4840(core.List<api.ResultTableColumnHeader> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkResultTableColumnHeader(o[0]);
-  checkResultTableColumnHeader(o[1]);
+  checkResultTableColumnHeader(o[0] as api.ResultTableColumnHeader);
+  checkResultTableColumnHeader(o[1] as api.ResultTableColumnHeader);
 }
 
 core.List<core.Object> buildUnnamed4841() {
@@ -445,7 +445,7 @@
   buildCounterQueryResponse++;
   if (buildCounterQueryResponse < 3) {
     checkUnnamed4840(o.columnHeaders);
-    checkErrors(o.errors);
+    checkErrors(o.errors as api.Errors);
     unittest.expect(o.kind, unittest.equals('foo'));
     checkUnnamed4842(o.rows);
   }
@@ -480,7 +480,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmptyResponse();
       var od = api.EmptyResponse.fromJson(o.toJson());
-      checkEmptyResponse(od);
+      checkEmptyResponse(od as api.EmptyResponse);
     });
   });
 
@@ -488,7 +488,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrorProto();
       var od = api.ErrorProto.fromJson(o.toJson());
-      checkErrorProto(od);
+      checkErrorProto(od as api.ErrorProto);
     });
   });
 
@@ -496,7 +496,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildErrors();
       var od = api.Errors.fromJson(o.toJson());
-      checkErrors(od);
+      checkErrors(od as api.Errors);
     });
   });
 
@@ -504,7 +504,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroup();
       var od = api.Group.fromJson(o.toJson());
-      checkGroup(od);
+      checkGroup(od as api.Group);
     });
   });
 
@@ -512,7 +512,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupContentDetails();
       var od = api.GroupContentDetails.fromJson(o.toJson());
-      checkGroupContentDetails(od);
+      checkGroupContentDetails(od as api.GroupContentDetails);
     });
   });
 
@@ -520,7 +520,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupItem();
       var od = api.GroupItem.fromJson(o.toJson());
-      checkGroupItem(od);
+      checkGroupItem(od as api.GroupItem);
     });
   });
 
@@ -528,7 +528,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupItemResource();
       var od = api.GroupItemResource.fromJson(o.toJson());
-      checkGroupItemResource(od);
+      checkGroupItemResource(od as api.GroupItemResource);
     });
   });
 
@@ -536,7 +536,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGroupSnippet();
       var od = api.GroupSnippet.fromJson(o.toJson());
-      checkGroupSnippet(od);
+      checkGroupSnippet(od as api.GroupSnippet);
     });
   });
 
@@ -544,7 +544,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGroupItemsResponse();
       var od = api.ListGroupItemsResponse.fromJson(o.toJson());
-      checkListGroupItemsResponse(od);
+      checkListGroupItemsResponse(od as api.ListGroupItemsResponse);
     });
   });
 
@@ -552,7 +552,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListGroupsResponse();
       var od = api.ListGroupsResponse.fromJson(o.toJson());
-      checkListGroupsResponse(od);
+      checkListGroupsResponse(od as api.ListGroupsResponse);
     });
   });
 
@@ -560,7 +560,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildQueryResponse();
       var od = api.QueryResponse.fromJson(o.toJson());
-      checkQueryResponse(od);
+      checkQueryResponse(od as api.QueryResponse);
     });
   });
 
@@ -568,7 +568,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildResultTableColumnHeader();
       var od = api.ResultTableColumnHeader.fromJson(o.toJson());
-      checkResultTableColumnHeader(od);
+      checkResultTableColumnHeader(od as api.ResultTableColumnHeader);
     });
   });
 
@@ -623,7 +623,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmptyResponse(response);
+        checkEmptyResponse(response as api.EmptyResponse);
       })));
     });
 
@@ -634,8 +634,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.GroupItem.fromJson(json);
-        checkGroupItem(obj);
+        var obj =
+            api.GroupItem.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroupItem(obj as api.GroupItem);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -678,7 +679,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroupItem(response);
+        checkGroupItem(response as api.GroupItem);
       })));
     });
 
@@ -733,7 +734,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGroupItemsResponse(response);
+        checkListGroupItemsResponse(response as api.ListGroupItemsResponse);
       })));
     });
   });
@@ -789,7 +790,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmptyResponse(response);
+        checkEmptyResponse(response as api.EmptyResponse);
       })));
     });
 
@@ -800,8 +801,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -844,7 +846,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
 
@@ -905,7 +907,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListGroupsResponse(response);
+        checkListGroupsResponse(response as api.ListGroupsResponse);
       })));
     });
 
@@ -916,8 +918,9 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Group.fromJson(json);
-        checkGroup(obj);
+        var obj =
+            api.Group.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkGroup(obj as api.Group);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -960,7 +963,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGroup(response);
+        checkGroup(response as api.Group);
       })));
     });
   });
@@ -1051,7 +1054,7 @@
               startIndex: arg_startIndex,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkQueryResponse(response);
+        checkQueryResponse(response as api.QueryResponse);
       })));
     });
   });
diff --git a/generated/googleapis/test/youtubereporting/v1_test.dart b/generated/googleapis/test/youtubereporting/v1_test.dart
index dec1cb8..b6fedc4 100644
--- a/generated/googleapis/test/youtubereporting/v1_test.dart
+++ b/generated/googleapis/test/youtubereporting/v1_test.dart
@@ -141,13 +141,13 @@
   buildCounterGdataCompositeMedia++;
   if (buildCounterGdataCompositeMedia < 3) {
     unittest.expect(o.blobRef, unittest.equals('foo'));
-    checkGdataBlobstore2Info(o.blobstore2Info);
+    checkGdataBlobstore2Info(o.blobstore2Info as api.GdataBlobstore2Info);
     unittest.expect(o.cosmoBinaryReference, unittest.equals('foo'));
     unittest.expect(o.crc32cHash, unittest.equals(42));
     unittest.expect(o.inline, unittest.equals('foo'));
     unittest.expect(o.length, unittest.equals('foo'));
     unittest.expect(o.md5Hash, unittest.equals('foo'));
-    checkGdataObjectId(o.objectId);
+    checkGdataObjectId(o.objectId as api.GdataObjectId);
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.referenceType, unittest.equals('foo'));
     unittest.expect(o.sha1Hash, unittest.equals('foo'));
@@ -200,9 +200,9 @@
 void checkGdataDiffChecksumsResponse(api.GdataDiffChecksumsResponse o) {
   buildCounterGdataDiffChecksumsResponse++;
   if (buildCounterGdataDiffChecksumsResponse < 3) {
-    checkGdataCompositeMedia(o.checksumsLocation);
+    checkGdataCompositeMedia(o.checksumsLocation as api.GdataCompositeMedia);
     unittest.expect(o.chunkSizeBytes, unittest.equals('foo'));
-    checkGdataCompositeMedia(o.objectLocation);
+    checkGdataCompositeMedia(o.objectLocation as api.GdataCompositeMedia);
     unittest.expect(o.objectSizeBytes, unittest.equals('foo'));
     unittest.expect(o.objectVersion, unittest.equals('foo'));
   }
@@ -223,7 +223,7 @@
 void checkGdataDiffDownloadResponse(api.GdataDiffDownloadResponse o) {
   buildCounterGdataDiffDownloadResponse++;
   if (buildCounterGdataDiffDownloadResponse < 3) {
-    checkGdataCompositeMedia(o.objectLocation);
+    checkGdataCompositeMedia(o.objectLocation as api.GdataCompositeMedia);
   }
   buildCounterGdataDiffDownloadResponse--;
 }
@@ -244,8 +244,8 @@
 void checkGdataDiffUploadRequest(api.GdataDiffUploadRequest o) {
   buildCounterGdataDiffUploadRequest++;
   if (buildCounterGdataDiffUploadRequest < 3) {
-    checkGdataCompositeMedia(o.checksumsInfo);
-    checkGdataCompositeMedia(o.objectInfo);
+    checkGdataCompositeMedia(o.checksumsInfo as api.GdataCompositeMedia);
+    checkGdataCompositeMedia(o.objectInfo as api.GdataCompositeMedia);
     unittest.expect(o.objectVersion, unittest.equals('foo'));
   }
   buildCounterGdataDiffUploadRequest--;
@@ -267,7 +267,7 @@
   buildCounterGdataDiffUploadResponse++;
   if (buildCounterGdataDiffUploadResponse < 3) {
     unittest.expect(o.objectVersion, unittest.equals('foo'));
-    checkGdataCompositeMedia(o.originalObject);
+    checkGdataCompositeMedia(o.originalObject as api.GdataCompositeMedia);
   }
   buildCounterGdataDiffUploadResponse--;
 }
@@ -323,8 +323,8 @@
 
 void checkUnnamed3232(core.List<api.GdataCompositeMedia> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkGdataCompositeMedia(o[0]);
-  checkGdataCompositeMedia(o[1]);
+  checkGdataCompositeMedia(o[0] as api.GdataCompositeMedia);
+  checkGdataCompositeMedia(o[1] as api.GdataCompositeMedia);
 }
 
 core.int buildCounterGdataMedia = 0;
@@ -373,18 +373,24 @@
     unittest.expect(o.algorithm, unittest.equals('foo'));
     unittest.expect(o.bigstoreObjectRef, unittest.equals('foo'));
     unittest.expect(o.blobRef, unittest.equals('foo'));
-    checkGdataBlobstore2Info(o.blobstore2Info);
+    checkGdataBlobstore2Info(o.blobstore2Info as api.GdataBlobstore2Info);
     checkUnnamed3232(o.compositeMedia);
     unittest.expect(o.contentType, unittest.equals('foo'));
-    checkGdataContentTypeInfo(o.contentTypeInfo);
+    checkGdataContentTypeInfo(o.contentTypeInfo as api.GdataContentTypeInfo);
     unittest.expect(o.cosmoBinaryReference, unittest.equals('foo'));
     unittest.expect(o.crc32cHash, unittest.equals(42));
-    checkGdataDiffChecksumsResponse(o.diffChecksumsResponse);
-    checkGdataDiffDownloadResponse(o.diffDownloadResponse);
-    checkGdataDiffUploadRequest(o.diffUploadRequest);
-    checkGdataDiffUploadResponse(o.diffUploadResponse);
-    checkGdataDiffVersionResponse(o.diffVersionResponse);
-    checkGdataDownloadParameters(o.downloadParameters);
+    checkGdataDiffChecksumsResponse(
+        o.diffChecksumsResponse as api.GdataDiffChecksumsResponse);
+    checkGdataDiffDownloadResponse(
+        o.diffDownloadResponse as api.GdataDiffDownloadResponse);
+    checkGdataDiffUploadRequest(
+        o.diffUploadRequest as api.GdataDiffUploadRequest);
+    checkGdataDiffUploadResponse(
+        o.diffUploadResponse as api.GdataDiffUploadResponse);
+    checkGdataDiffVersionResponse(
+        o.diffVersionResponse as api.GdataDiffVersionResponse);
+    checkGdataDownloadParameters(
+        o.downloadParameters as api.GdataDownloadParameters);
     unittest.expect(o.filename, unittest.equals('foo'));
     unittest.expect(o.hash, unittest.equals('foo'));
     unittest.expect(o.hashVerified, unittest.isTrue);
@@ -393,7 +399,7 @@
     unittest.expect(o.length, unittest.equals('foo'));
     unittest.expect(o.md5Hash, unittest.equals('foo'));
     unittest.expect(o.mediaId, unittest.equals('foo'));
-    checkGdataObjectId(o.objectId);
+    checkGdataObjectId(o.objectId as api.GdataObjectId);
     unittest.expect(o.path, unittest.equals('foo'));
     unittest.expect(o.referenceType, unittest.equals('foo'));
     unittest.expect(o.sha1Hash, unittest.equals('foo'));
@@ -465,8 +471,8 @@
 
 void checkUnnamed3233(core.List<api.Job> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkJob(o[0]);
-  checkJob(o[1]);
+  checkJob(o[0] as api.Job);
+  checkJob(o[1] as api.Job);
 }
 
 core.int buildCounterListJobsResponse = 0;
@@ -499,8 +505,8 @@
 
 void checkUnnamed3234(core.List<api.ReportType> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReportType(o[0]);
-  checkReportType(o[1]);
+  checkReportType(o[0] as api.ReportType);
+  checkReportType(o[1] as api.ReportType);
 }
 
 core.int buildCounterListReportTypesResponse = 0;
@@ -533,8 +539,8 @@
 
 void checkUnnamed3235(core.List<api.Report> o) {
   unittest.expect(o, unittest.hasLength(2));
-  checkReport(o[0]);
-  checkReport(o[1]);
+  checkReport(o[0] as api.Report);
+  checkReport(o[1] as api.Report);
 }
 
 core.int buildCounterListReportsResponse = 0;
@@ -619,7 +625,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildEmpty();
       var od = api.Empty.fromJson(o.toJson());
-      checkEmpty(od);
+      checkEmpty(od as api.Empty);
     });
   });
 
@@ -627,7 +633,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataBlobstore2Info();
       var od = api.GdataBlobstore2Info.fromJson(o.toJson());
-      checkGdataBlobstore2Info(od);
+      checkGdataBlobstore2Info(od as api.GdataBlobstore2Info);
     });
   });
 
@@ -635,7 +641,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataCompositeMedia();
       var od = api.GdataCompositeMedia.fromJson(o.toJson());
-      checkGdataCompositeMedia(od);
+      checkGdataCompositeMedia(od as api.GdataCompositeMedia);
     });
   });
 
@@ -643,7 +649,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataContentTypeInfo();
       var od = api.GdataContentTypeInfo.fromJson(o.toJson());
-      checkGdataContentTypeInfo(od);
+      checkGdataContentTypeInfo(od as api.GdataContentTypeInfo);
     });
   });
 
@@ -651,7 +657,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataDiffChecksumsResponse();
       var od = api.GdataDiffChecksumsResponse.fromJson(o.toJson());
-      checkGdataDiffChecksumsResponse(od);
+      checkGdataDiffChecksumsResponse(od as api.GdataDiffChecksumsResponse);
     });
   });
 
@@ -659,7 +665,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataDiffDownloadResponse();
       var od = api.GdataDiffDownloadResponse.fromJson(o.toJson());
-      checkGdataDiffDownloadResponse(od);
+      checkGdataDiffDownloadResponse(od as api.GdataDiffDownloadResponse);
     });
   });
 
@@ -667,7 +673,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataDiffUploadRequest();
       var od = api.GdataDiffUploadRequest.fromJson(o.toJson());
-      checkGdataDiffUploadRequest(od);
+      checkGdataDiffUploadRequest(od as api.GdataDiffUploadRequest);
     });
   });
 
@@ -675,7 +681,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataDiffUploadResponse();
       var od = api.GdataDiffUploadResponse.fromJson(o.toJson());
-      checkGdataDiffUploadResponse(od);
+      checkGdataDiffUploadResponse(od as api.GdataDiffUploadResponse);
     });
   });
 
@@ -683,7 +689,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataDiffVersionResponse();
       var od = api.GdataDiffVersionResponse.fromJson(o.toJson());
-      checkGdataDiffVersionResponse(od);
+      checkGdataDiffVersionResponse(od as api.GdataDiffVersionResponse);
     });
   });
 
@@ -691,7 +697,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataDownloadParameters();
       var od = api.GdataDownloadParameters.fromJson(o.toJson());
-      checkGdataDownloadParameters(od);
+      checkGdataDownloadParameters(od as api.GdataDownloadParameters);
     });
   });
 
@@ -699,7 +705,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataMedia();
       var od = api.GdataMedia.fromJson(o.toJson());
-      checkGdataMedia(od);
+      checkGdataMedia(od as api.GdataMedia);
     });
   });
 
@@ -707,7 +713,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildGdataObjectId();
       var od = api.GdataObjectId.fromJson(o.toJson());
-      checkGdataObjectId(od);
+      checkGdataObjectId(od as api.GdataObjectId);
     });
   });
 
@@ -715,7 +721,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildJob();
       var od = api.Job.fromJson(o.toJson());
-      checkJob(od);
+      checkJob(od as api.Job);
     });
   });
 
@@ -723,7 +729,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListJobsResponse();
       var od = api.ListJobsResponse.fromJson(o.toJson());
-      checkListJobsResponse(od);
+      checkListJobsResponse(od as api.ListJobsResponse);
     });
   });
 
@@ -731,7 +737,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListReportTypesResponse();
       var od = api.ListReportTypesResponse.fromJson(o.toJson());
-      checkListReportTypesResponse(od);
+      checkListReportTypesResponse(od as api.ListReportTypesResponse);
     });
   });
 
@@ -739,7 +745,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildListReportsResponse();
       var od = api.ListReportsResponse.fromJson(o.toJson());
-      checkListReportsResponse(od);
+      checkListReportsResponse(od as api.ListReportsResponse);
     });
   });
 
@@ -747,7 +753,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReport();
       var od = api.Report.fromJson(o.toJson());
-      checkReport(od);
+      checkReport(od as api.Report);
     });
   });
 
@@ -755,7 +761,7 @@
     unittest.test('to-json--from-json', () {
       var o = buildReportType();
       var od = api.ReportType.fromJson(o.toJson());
-      checkReportType(od);
+      checkReportType(od as api.ReportType);
     });
   });
 
@@ -767,8 +773,8 @@
       var arg_onBehalfOfContentOwner = 'foo';
       var arg_$fields = 'foo';
       mock.register(unittest.expectAsync2((http.BaseRequest req, json) {
-        var obj = api.Job.fromJson(json);
-        checkJob(obj);
+        var obj = api.Job.fromJson(json as core.Map<core.String, core.dynamic>);
+        checkJob(obj as api.Job);
 
         var path = (req.url).path;
         var pathOffset = 0;
@@ -811,7 +817,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -866,7 +872,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkEmpty(response);
+        checkEmpty(response as api.Empty);
       })));
     });
 
@@ -921,7 +927,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkJob(response);
+        checkJob(response as api.Job);
       })));
     });
 
@@ -984,7 +990,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListJobsResponse(response);
+        checkListJobsResponse(response as api.ListJobsResponse);
       })));
     });
   });
@@ -1051,7 +1057,7 @@
               onBehalfOfContentOwner: arg_onBehalfOfContentOwner,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkReport(response);
+        checkReport(response as api.Report);
       })));
     });
 
@@ -1132,7 +1138,7 @@
               startTimeBefore: arg_startTimeBefore,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListReportsResponse(response);
+        checkListReportsResponse(response as api.ListReportsResponse);
       })));
     });
   });
@@ -1185,7 +1191,7 @@
       res
           .download(arg_resourceName, $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkGdataMedia(response);
+        checkGdataMedia(response as api.GdataMedia);
       })));
     });
   });
@@ -1250,7 +1256,7 @@
               pageToken: arg_pageToken,
               $fields: arg_$fields)
           .then(unittest.expectAsync1(((response) {
-        checkListReportTypesResponse(response);
+        checkListReportTypesResponse(response as api.ListReportTypesResponse);
       })));
     });
   });
